最近在研究学习区块链虚拟机方面的技术。这自然绕不开最为经典的以太坊EVM的设计与实现,所以很有必要重新研读一下以太坊的黄皮书。本文即黄皮书学习记录的第一篇[1]。
1. 引言
都是一些基本概念。略。
2. 区块链范式(The Blockchain Pradigm)
这一章节主要是以公式形式从high level的层面来描述以太坊如何设计的。具体的,可分为从交易层面、从区块层面2个方面来描述。
首先,以太坊可看作是基于交易的状态机:
- 由一个初始(genesis)状态开始,通过交易来增量的变换到其他状态确定性状态
- 状态可包括任何计算机可允许的内容,例如:账户余额、
- 交易可视为2个状态之间的1个有效连接
其中,
- 表示世界状态(world-state)
- 表示状态转移函数
区块链是将交易打包进区块里;区块增长即矿工挖矿的过程,可用下面的表达式来描述:
其中,
- 为区块确定化(block-finalisation)的状态转移函数,用来奖励一个特定方
- 为区块层面上的状态转移函数(表达式2:新的状态为当前状态与新的区块通过区块的状态转移函数处理得到)
- 为区块,里面包含了许多交易(表达式3)
另外,表达式4描述了Π的具体定义:当前状态σ通过T0、T1……等所有在B区块里的交易集合T中交易,逐个状态转换并给予矿工激励
按照黄皮书的说法,这个模型描述了包括以太坊在内的所有基于共识的去中心化交易系统
2.1. 值
本节主要讲的是换算关系,例如:1 ETH = 10^18 Wei。ETH也可写做中古英语字母Ð。Ð发音为"th"[2]。
2.2. 如何确定历史
因为是分布式的结构,从创世区块开始每个节点对于下一个区块是什么都可以有自己的意见,也就是会产生分叉。所以黄皮书这里描述了区块树(tree of blocks)的概念。
而达成“共识”的过程就是所有的节点都公认唯一一条从树根(创世区块)到叶子(最新区块)的路径,以此形成“区块链”。
以太坊使用了简化版的GHOST协议,作为产生共识的机制。
GHOST是Sompolinsky和Zohar在2013年提出的一个协议,全称为Greedy Heaviest Observed Sub-Tree[3],用将比特币的最长链(longest chain)策略改为拥有最多难度的子树(heaviest sub-tree)策略。
虽然黄皮书上这么说,但也有人指出以太坊并没有使用GHOST协议,因为叔区块并不计算在总的难度值内[4]。以太坊用的是修改后的包容性协议(Inclusive Protocol[5])。
Inclusive协议的主要内容是:
- 新的区块会引用多个前者
- 主链以外的区块中如果有不冲突的交易,也会被纳入到账本中
- 矿工也会收到交易费用,以及一部分新区块的挖矿奖励
所以这么看,以太坊用的是修改版的Inclusive协议:
- 新的区块会有1个父区块和0到多个叔区块
- 叔区块的矿工会得到一部分挖矿奖励
- 但叔区块中的交易不会被纳入到账本中,也不会收到交易费用
具体以太坊目前的实现,以及与GHOST协议和Inclusive还需要进一步学习核实
3. 命名约定
黄皮书在本章主要讲了后面会将大量出现的变量是按什么规则命名的
状态集合
状态集合是坠高层级的变量:
- 表示世界状态(world-state)
- 表示机器状态(machine-state)
函数
操作高级别状态的函数,用大写希腊字母来表示。例如:是状态转移函数
对大多数函数,也用大写字母来描述。例如:
- 产生花费的函数用大写字母,具体的操作用下标来说明。例如表示的就是SSTORE操作的花费函数
- KEC表示Keccak-256哈希函数;KEC512表示Keccak 512哈希函数
- 元组通常用大写字母来表示。例如表示交易。另外,用下标来说明元组中的特定内容,例如表示交易的nonce
序列相关内容
- 标量和固定大小的序列/数组,使用小写字母来表示,例如刚才提到的表示nonce。如果是有特殊含义的,会用希腊小写字母表示,例如表示特定操作在栈中所需的内容数量
- 变长序列/数组使用粗体的小写字母。例如表示一个信息调用(message call)的输出数据序列。
- 黄皮书中假定,所有的标量都是属于集合的非负整数。所有的字节序列集合为。具体的集合中元素的属性用下标来表示,例如32位长度字节序列的集合为,2进制内256位数字的非负整数集合为
- 方括号用来表示序列中的索引位置
其他一些规则
- 假设(PS:这不是乱码,可用markdown里的\square打出来)是一个未被修改的值;修改后的值为;中间变量为等
- 但如果是函数时,表示与类似的、按元素进行的函数映射
- 黄皮书中还“内置”来一些函数。一个很常见的是,即获取一个序列中的最后一个元素。