Ethereum设计理念Design Rationale学习心得

本文为Ethereum设计理念官方文档Design Rationale的阅读理解,并非完整的中文翻译,可参考中文翻译。而这个官方文档阐述的是Ethereum演进过程中区别于传统加密货币之处,包含优点,一些有争议性的话题,以及各自的风险。

基本准则

  1. 三文治式的复杂度模型
  • 尽量简单的底层结构(如核心共识算法)以及易于使用理解的接口层(developers and users)。复杂度在中间层(serialization and deserialization scripts, storage data structure models, the leveldb storage interface and the wire protocol, etc)。也就是,底层基本的核心思想维持稳定和简单,将易变的可替换的具体实现放在中间层。
  • 尽可能的包含底层概念,使得可以任意方式去组合。同时当剥离不必要的功能也能使底层运行得更有效率。
  • 核心层拒绝内嵌高层应用特性,而鼓励以合约的方式来模拟实现高层应用协议。
  1. 自由度
    保持”net neutrality”网络中性。对contracts or transactions没有先天的偏好性。通过设置费用引入激励。这里涉及到gas的概念,基本理念就是对需要计算和存储的操作需要付出代价。对计算,对存储的字节数等计算一个gas值,而每个发送方指定一个gas值所等值的Ether(即gas fee),相乘得出为当前的交易费用。交易费用高的当然优先被确认。这就是所谓的将自由度交还给交易发起方,而Ethereum本身保持中性无偏好。引入计算和存储费用,也可以防止DOS攻击。

  2. 高风险承受力
    可以接受高收益带来的高风险(例如出块速度提升50倍,共识效率等),意味着协议演进过程可能会变动较大

使用Account模型而非UTXO

unspent transaction outputs (UTXOs)在数字货币内广泛使用,即所有者关联着多笔UTXO,其和为所有者对账户余额,每次交易以单笔或者多笔UTXO为输入,输出也为UTXO。主要符合三个约束:

  1. 输入的UTXO有效,并且未被消费
  2. 交易者能证实UTXO的所有权(签名)
  3. 输入UTXO等于或者超过输出UTXO(消费,转账等)

UTXO的好处在于:

  1. 高隐私度 - 每次交易都使用新地址,则这些账户很难被关联起来。但是dapp反而通常需要关联用户状态。
  2. 潜在的高扩展度 - 用户自身保管UTXO,全网丢失只会影响当前用户。而账户模型下,是记录在merkle tree内的,如果全网丢失该账户记录,则永久影响该账户。

(实际上,UTXO模型还有以下特点)

  1. 账户数据库会不断膨胀,因为账户不会被删除,而UTXO数据库体积会小很多。
  2. 由于只有未花费的输出会被保留,所以每一个比特币用户可以拥有几乎无限多的地址,提高了匿名性。
  3. UTXO为高并发的交易带来可能,试想传统的账户模型,每个人的账户交易必须是线性的,无法并发。而现在每个人可能拥有多个UTXO,可同时发起多笔交易,实现了并发。

而Account模型好处在于:

  1. 节约存储空间 - 多个UTXO的存储合并成一个Account
  2. 可以判断来源,从而建立红黑名单
  3. 理解和编程模型简单,而且light client可以直接跟踪特定的account,而不用跟踪每笔交易带来的影响

Account的问题在于重放攻击,因此可以每个交易添加nonce,每次交易nonce递增加1。同时,交易包含区块号,定期的修剪删除不再使用的账户。

Gas and Fee

Bitcoin等数字货币操作比较简单和单一的交易转账行为,而Ethereum则是图灵完备,具有很高的合约自由度。引入费用防止合约执行无限循环的DOS,实际上就是引入作恶成本。

  1. 发起调用合约会预缴startGas * gasPrice(即一个gas等价于的Ether),途中每个交易操作会相应扣除gas,合约结束后剩余的gas退还到发起账户,消耗的gas奖励给miner。如果中途gas已消耗完,则该次交易内之前已执行的操作回滚,交易失败,gas奖励给miner。合约间调用也需要消耗gas,由发起合约设置值。
  2. 按照计算复杂度(opcode),数据的字节数,存储的字节数等计算gas值。此外还有基础gas,用以支付计算椭圆曲线从签名确认身份等。也即是按消耗付款。
  3. 删除存储的空间的操作有gas refund奖励,鼓励减少存储空间。
  4. gasPrice的设置则变成经济供求关系,自由竞争最终达到动态平衡。出价高收益大的交易会被优先执行和确认。

RLP

RLP (“recursive length prefix”) encoding is the main serialization format used in Ethereum。例如,Account等数据从内存写入持久化存储时会将Hex16进制转换成RLP持久化(结合MPT树,将Extension node, Leaf node, Branch node等数据结构进行RLP编码),紧凑节省空间。相比protocol buffer和BSON等现存的序列化方案,从新开发RLP序列化方案的目的是,1)实现简单。目的就是要高度简化,存储嵌套的字节序列,由上层应用决定这些字节序列的含义。2)保证字节级的绝对一致性(Key/value maps的有序性,浮点数的精度问题等)。RLP将 1)字符串(字节序列)作为item,2)item列表也看作一个item,针对这些item使用其定义的序列化编解码方式。

EVM虚拟机

设计理念:

  1. 简单 尽量少的数据类型,尽量少的操作指令。尽量节省的空间。结合起gas消费模型,也从根本上保证安全不被无限制利用。
  2. 定制化 针对以太坊常见应用,对20字节地址,32字节对加密算法,加密算法中的数学运算,读取存储区块及交易信息等,作虚拟机层面的定制化的优化

具体的设计:

  1. 存储模型 EVM是基于栈的计算模型。stack(32字节,运行堆栈,所有运算在栈上执行,算子和执行中间结果都从栈存储和读取),memory(byte数组,存储函数调用的参数,本地变量,返回值等),storage(KV持久化存储,256-bit words to 256-bit words)
  2. 合约间调用内存隔离,区分临时存储和持久化存储,递归调用每次都使用独立的实例,拥有独立的内存地址空间。具体实例参看原文。
  3. 32字节的位宽 加密算法使用32字节,因此32字节位宽不需要分开存储,也不至于浪费空间。
  4. 1024层的栈调用深度,并且单个操作码最多只能操作栈顶的16个元素
  5. 定制化VM 没有使用JVM等原因在于:1)EVM相对简单,避免复杂带来的安全性等风险;2)可以针对性定制化设计;3)不存在部署的外部依赖;4)不需要改造其他VM时带来的安全性审核工作

EVM详解 : 详细的ppt版本
A Deep Dive into the Ethereum Virtual Machine (EVM) - part 2: Memory and Storage : 包含EVM的操作指令opcodes