以太坊简介

目录

以太坊文档:https://ethereum.org/zh/developers/docs/intro-to-ethereum/

EVM

数学家阿兰图灵提出一种抽象计算模型,包含:

  • 无限长纸带。(存储)
  • 读写头。(读写数据)
  • 状态寄存器。(记录当前状态)
  • 一套规则。(如何移动和修改数据) 这样的计算机就是图灵机。图灵机可以执行任何算法,只要问题本身是可计算的。

如果一个系统可以模拟图灵机所有的功能,它就是图灵完备的(图灵完备 = 能模拟通用图灵机 = 可以计算任何可计算问题)。EVM就是图灵完备的。

以太坊虚拟机EVM是智能合约的运行环境,合约以字节码的格式(EVM bytecode)存在区块链上。合约通常以高级语言编写(Solidity)然后EVM编译器编译为字节码,由客户端部署到区块链网络中。

参与区块链网络的每个节点都会运行一个EVM,它们会检查正在验证的块中列出的交易,并运行由EVM中的交易触发的代码。EVM是沙盒封装,完全隔离的,也就是说EVM中运行代码无法访问网络,文件系统以及其它进程,就连智能合约之间的访问也是受限的。

EVM和账户

以太坊中有两类账户:外部账户和合约账户,它们共用EVM中同一个地址空间。无论账户是否存储代码,它们对于EVM来说处理方式完全一样。

每个账户在EVM中都有一个键值对形式的持久化存储,其中key和value的长度都是256位,称之为存储空间(storage)。

EVM和交易

交易可以看作是从一个账户向另一个账户发送消息,消息可以包括二进制数据和以太币。

如果目标账户有代码,此代码会在EVM中执行,并以payload作为入参(函数签名+参数的编码),这就是合约调用。

如果目标账户是零账户(地址为0),此交易将会创建一个新合约,这个用来创建合约的交易的payload会被转换为EVM字节码并执行,执行的输出作为合约代码永久存储。

EVM和GAS

关键字:预付,按量消耗,out-of-gas

选自以太坊虚拟机图解

为什么需要gas?节点EVM执行指令本来就需要消耗成本,就像汽车需要燃油才能跑。然后,gas机制可以保证区块链的安全,防止垃圾信息,无限循环攻击。

用户发起交易时,会预付gas费,如果交易完成gas费还有剩余,则退回给我用户;如果gas费不足以完成交易,则当前调用帧(call frame)所作所有操作都会被回滚,抛出异常out-of-gas。

举一个例子,用户Alice向Bob发起一笔1ETH的转账交易。

  1. Alice提交的交易将会包含以下信息:
    • from - 发送者Alice的地址。
    • to - 接收者Bob的地址。
    • signature - Alice私钥签署交易生成的签名。
    • nonce - 一个有序递增计数器,表示账户交易数量。
    • value - Alice向Bob发送的以太币数量(1ETH)。
    • input data - 可包括任意数据的可选字段
    • gasLimit - 交易可以消耗的最大数量的燃料费用。
    • maxPriorityFeePerGas - 小费的最高价格。
    • maxFeePerGas - 愿意支付每单位燃料的最高价格(包括基础费+小费)。
  2. 基础费,每个区块都有一个基础费作为底价,如果想要交易被打包,燃料费必须至少等于基础费。基础费独立于当前区块计算,是由当前区块之前的区块决定的(12.5%指数增长)。
  3. 优先费(小费),小费是对验证者将交易添加到区块的最小激励。 在相同区块中,对于要优先于其他交易执行的交易,可以添加更高的小费来尝试使出价高于竞争性交易。
  4. 最高费用:要在网络上执行交易,用户可以为他们愿意支付的交易执行费用指定最高限额。此可选参数称为 maxFeePerGas。 为了执行交易,最高费用必须超过基础费和小费的总和。 交易完成后,会将最高费用与基础费和小费总和之间的差额退还给交易发送人。
  5. 假如当前基础费10 gwei,2 gwei小费,所以这笔转账总共需要支付:1ETH + (10gwei + 2gwei) * 21000 = 1ETH + 252000 gwei(0.000252 个以太币)

其他注意点:

  1. 每个指令的执行都有特定的消耗,比如转账操作,需要21000单位的gas。
  2. 燃料限额是指你愿意在交易中消耗的最大燃料数量。 涉及智能合约的更复杂交易需要进行更多的计算工作,因此相比简单的支付,它们需要更高的燃料限额。 标准以太币转账要求燃料限额为 21,000 单位燃料。例如,如果你对简单的以太币转账设置 50,000 单位燃料限额,以太坊虚拟机将消耗 21,000 单位,你将收到剩余的 29,000 单位。 然而,如果你设置的燃料太少,比如说,对于简单的以太币转账,设置燃料限额为 20,000 单位,以太坊虚拟机将消耗 20,000 单位燃料并尝试执行交易,但最后不会完成。 然后,以太坊虚拟机回滚所有变化,但由于验证者已经完成了价值 20k 单位燃料的工作,这些燃料就被消耗了。

EVM数据存储

Storage

  • 每个账户都有一块持久化的存储空间,称为storage,这是一个将256位字映射到256位字的key-value存储区,可以理解为合约数据库。无法遍历key
  • 永久存储在区块链中,由于会永久保存合约状态变量,所以读写gas开销最大。

Memory

  • 每次消息调用,合约会临获得一块干净的内存空间。
  • 生命周期仅为方法执行期间,函数调用后回收,因为仅保存临时变量,gas开销小。

Stack

  • EVM不是基于寄存器,而是基于栈,因此所有的计算都在一个被称为栈的区域执行。
  • 存放部分局部值类型变量,几乎免费使用的内存,但是数量限制。

EVM指令集

  1. 所有指令都是针对“256位的字(word)”这个基本的数据类型来进行操作。
  2. 合约可以访问当前区块的相关属性,比如块高度和时间戳。

委托调用(Delegatecall)

  • 目标地址的代码将在发起调用合约的上下文中执行,并且msg.sender和msg.value不变。
  • 可以实现“库(library)”。

合约的创建和自毁

  • create calls,合约内部通过new创建其他合约。
  • selfdestruct。