以太坊虚拟机(EVM)

“State”(状态)是指在任何时间点有关系统的信息。在以太坊中,状态指的是特定时刻存在的地址、账户余额和智能合约代码。每个事务都会导致以太坊的状态发生变化(状态转换),这种变化会反映在整个网络中。

以太坊虚拟机是如何工作的?

Opcodes(机器码)

EVM使用一系列称为”操作码”的指令来执行不同的任务。EVM中有140多个操作码可以执行不同的进程,因此以太坊将其描述为图灵完成。

我们需要操作码,因为EVM无法解释用Solidity编写的指令,Solidity是用于编写智能合约的语言。因此,智能合约代码被转换为操作码,因此它们可以在EVM环境中执行。

例如,可以使用create操作码创建智能合约,也可以使用STOP操作码暂停正在运行的合约。您可以在这里查看以太坊操作码的详细概述。

Gas(燃料)

Gas是在EVM环境中执行代码的资源,以”gwei”(以太单位)为单位。就像你在现实生活中需要汽油来驱动汽车一样,EVM也需要汽油来执行操作。

前面,我们提到了”操作码”——可以用来在EVM中执行不同操作的特定指令。Gas只是执行特定操作所需的计算资源量。

每次代码执行都会产生一笔Gas费,这取决于许多因素,比如操作的复杂性和网络范围的需求。汽油费激励个人将计算能力借给以太坊。如果没有Gas费,EVM就不能像一台分散的计算机一样工作。

Gas还有另一个用途:防止执行恶意操作,如分布式拒绝服务(DDoS)攻击。虽然EVM几乎可以运行任何计算,但很难预测每个操作的运行时间。

精心设计的恶意操作可以无限运行,导致网络失去稀缺的计算能力,最终崩溃。Gas燃料费用通过迫使恶意参与者为计算过程中执行的每一步付费来防止这一问题。

在开始一个操作之前,你必须指定一个”燃料极限”:你愿意在计算上花费的最大Gas量。一旦超过Gas极限,计算立即停止。这再次阻止任何人部署可能威胁以太坊健康的”无限循环”计算。

智能合约

智能合约是在满足预定义参数集后执行的代码片段。智能合约使用条件编程(如果是y,那么是x)来执行操作。

智能合约是不变的、自治的和透明的。这些特性结合在一起,使得智能合约特别有吸引力,尽管它们并非没有缺陷。

“不变性”意味着一旦部署到区块链上,智能合约的代码就无法更改。智能合约是自主的,因为它们可以在没有外部控制的情况下自行执行。它们是透明的,因为管理其性能的规则是用公开的代码编写的。

一些智能合约用于在区块链上创建和交换代币。例如,ERC-20代币有一个智能合约,定义了它们的命名、创建、交换、总供应和其他属性。

交易

一笔交易是来自以太坊帐户的指令。一个示例交易是将以太从钱包发送到一个地址。在这里,您指示EVM将价值从您的钱包转移到区块链上的另一个位置。

并非以太坊上的每笔交易都涉及价值转移;有些可能会传输任意数据。交易的结果还取决于接收者。

一个普通的外部所有账户(EOA)只需接收发送的信息。然而,一旦交易成功,合同账户可能会执行代码。如前所述,事务会导致”状态转换函数”,即以太坊状态的变化。

以太坊虚拟机的特点

确定性

在编程中,确定性是指程序在每个实例中为特定输入生成相同输出的能力。确定性确保开发人员可以独立地设计程序来执行特定的操作并产生所需的结果。

EVM是确定性的,因此无论执行多少次计算,操作码都会提供相同的结果。这一点很重要,因为以太坊的智能合约驱动的DAPP能够处理高价值的交易,并且必须可靠地执行。否则,用户就不会有信心在使用它们时不出现预期的故障。

单独性

EVM是单独的,这意味着代码无法访问计算机上的进程。您可以在EVM中安全地部署程序,同时保护您的硬件/软件免受潜在问题的影响。

此外,智能合约在EVM内的隔离环境中运行。因此,影响特定智能合约的bug或黑客不会损害底层协议。

可终止的

EVM是图灵完备的,因此理论上,如果它有正确的资源和指令,它可以用来执行任何计算。然而,每次计算都依赖于分配给它的气体。如果Gas耗尽,则操作停止。

在这种情况下,您可以将以太坊视为”准图灵完成”或”可终止”,因为代码执行可以在特定时间终止。但是,此功能对于确保程序不会永远(意外或恶意)运行并导致网络停滞非常重要。

Original: https://www.cnblogs.com/peteremperor/p/16166442.html
Author: Mr.peter
Title: 以太坊虚拟机(EVM)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/544275/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • springBoot踩坑记录——持续更新ing

    以下都是springboot的默认配置,如果修改过springboot的配置文件则有可能不起作用。 springboot的resources下的目录作用 resources/tem…

    Java 2023年6月5日
    096
  • JavaScript&Bootstrap

    JS介绍 JS诞生主要是完成页面的数据验证。因此它运行在客户端,需要浏览器来执行JS代码 JS最早取名LiveScript;为了吸引更多的Java程序员,更名JavaScript …

    Java 2023年6月6日
    078
  • java技术整理1

    一、基本 1.hashmap: 1.1 转红黑树条件:a.数组长度大于等于64(默认16,要经过2次扩容–当达到16*默认扩容因子0.75=12就扩容)b.链表长度大于…

    Java 2023年6月13日
    0132
  • Node版本更新及切换

    Node版本升级 清除npm缓存 npm cache clean -f n&#x6A…

    Java 2023年6月8日
    095
  • Java连载155-IO总结(二)

    一、四种方式分别举例 1.FileInputStream   InputStream is =&#x…

    Java 2023年6月13日
    084
  • java- 接口笔记

    接口 interface 接口就是一组规范(就像我们法律一样),所有实现类都要遵守。 面向对象的精髓,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(…

    Java 2023年6月15日
    0108
  • [Java] 封装zip内文件处理的函数,演示修改zip内的txt追加文本

    作者: zyl910 一、缘由 上一篇文章演示了无需解压的替换zip内文件的技术原理。本文准备编写一个实际的例子——演示修改zip内的txt文件,在后面追加文本。 二、封装zip内…

    Java 2023年5月29日
    0117
  • 2021年末总结

    一眨眼,距离上次写作已经两月有余。自己偷懒+繁忙,一直停滞下来,没有行动。这次得抓住年末的小尾巴,来一篇总结性的文章,对2021年的生活、工作画上一个完满的句号。 一、2021 去…

    Java 2023年6月15日
    0103
  • 我觉得 MQ 无用的理由

    不喜欢用 MQ。 如果是同一个系统内的不同模块,可以用数据库表,来传递消息;如果是不同系统间数据接口,可以用 webservice(同步,现在好像是 gRPC 有点热)、SFTP/…

    Java 2023年6月9日
    064
  • Linux命令拾遗-查看系统信息

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 作为一名程序员,有时需要关注自己的进程运行在什么样的软硬件环境里,比如几核cpu、固态硬盘还是…

    Java 2023年6月7日
    093
  • JUC由简入深学习

    JUC学习 1.什么是JUC java.util 工具包、包、分类 业务:普通的线程代码 Thread Runnable 没有返回值、效率相比入 Callable 相对较低! 2….

    Java 2023年6月9日
    058
  • [学习笔记] Java接口

    接口是Java中的一种抽象类型,是抽象方法的集合; 接口使用 interface关键字声明; 接口不是类,它们属于不同的概念,类描述对象的属性和方法,接口则包含要实现的方法; 一个…

    Java 2023年6月5日
    082
  • 常用设计模式

    化零为整,把零碎的功能拼成一个整体,对外提供一个统一接口,用来访问子系统中的多个接口。 解耦,不需要一个个对接,使用简单。 单例模式 负责创建对象,同时确保只有单个对象被创建。 线…

    Java 2023年6月7日
    078
  • 【刷题】面筋-JAVA-hashmap和hashtable

    底层都是数组+链表实现 hashMap HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增…

    Java 2023年5月29日
    089
  • spring中反射工具类

    安扫提示field.setAccessible(true)漏洞问题(java Spring) 采用 org.springframework.util.ReflectionUtils…

    Java 2023年5月30日
    084
  • Debouncer防抖代码

    Debouncer类 import java.util.concurrent.*; public class Debouncer { private final Scheduled…

    Java 2023年6月6日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球