具体如下: 1 头部信息和随机数结合在一起。以太坊区块报文头中存放了3个根哈希值:一个是交易的Merkle根哈希值(比特币只存这一个)。用户和以太坊区块链的交互需要通过对账户的交易来实现。
导语:本课堂用通俗易懂的系列内容为大家呈现区块链与密码学领域相关知识。这里有知识也有故事,从感兴趣到有乐趣,全民课堂等你来学。
这个系列中的课程内容首先从比特币着手进行入门介绍,再延伸至区块链的相关技术原理与发展趋势,然后深入浅出地依次介绍在区块链中应用的各类密码学技术。欢迎大家订阅本公众号,持续进行学习。
【本课堂内容全部选编自PlatON首席密码学家、武汉大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】
3.3
区块链2.0:可编程区块链
上一期我们“拆解”了区块链1.0的代表,比特币。这一期我们继续拆解之旅,对象是区块链2.0——可编程区块链的代表,以太坊。
比特币的区块链架构主要围绕支持密码货币的实现,虽然它有一定的灵活性,但用来支撑密码货币以外的应用场景还显得非常局限。
区块链2.0的核心理念是把区块链作为一个可编程的分布式信用基础设施,支撑智能合约应用,对金融领域更广泛的场景和流程进行优化的应用,与过去比特币区块链作为一个虚拟货币支撑平台区别开来。
在比特币后,出现很多被称为区块链2.0的平台,其中最具代表性的是以太坊平台。
以太坊系统结构图
以下讨论以太坊和比特币架构不同的几个主要方面。
账户设计
比特币没有账户的概念。每个用户的余额都是从他们在区块链上的UTXO计算出来的。以太坊的设计是将区块链作为一个通用的管理对象状态转换的去中心化平台,账户就是有状态的对象。以太坊则有两种类型的账户:一种是外部所有账户(EOA),另一种是合约账户。
外部所有账户就是我们一般意义上的用户账户,它由私钥控制。
合约账户是一种特殊的可编程账户,合约存在以太坊区块链上,它是代码(功能)和数据(状态)的集合。合约受代码控制并由外部所有账户激活。
外部所有账户的状态就是余额,而合约账户的状态可以是余额、代码执行情况,以及合约的存储。
以太坊网络的状态就是所有账户的状态,该状态由每个区块的交易来更新,同时需在全网形成共识。用户和以太坊区块链的交互需要通过对账户的交易来实现。
区块链设计
比特币采用Merkle树来将交易的哈希值组成二叉树,顶层节点的哈希值相当于整个交易清单的指纹,可以用来校验交易清单。以太坊的区块链的每个区块不但保存着交易清单,还保存最新的状态。以太坊的状态包含一个键值表,其中键是地址,值是账户里声明的变量。
以太坊区块报文头中存放了3个根哈希值:一个是交易的Merkle根哈希值(比特币只存这一个),另外一个是状态的根哈希值,还有一个是收据的根哈希值。
另外一个和比特币的不同是,以太坊的区块链中的每个区块保存区块链号和区块难度。
账户的状态经常被改变,新的账户也经常被插入,键在存储里也被经常插入和删除。还要求树的根哈希只是与树的数据有关,与更新的顺序无关。Patricia(帕特里夏)树是符合这些要求的数据结构,以太坊采用的Merkle Patricia树存储数据。
Patricia树,或称压缩前缀树,是一种更节省空间的前缀树。对于基数树的每个节点,如果该节点是唯一的儿子的话,就和父节点合并。
Patricia树示意图
PoW机制
以太坊吸取了比特币的教训,专门设计了非常不利于计算的模型,它采用了I/O密集的模型,I/O慢,计算再快也没用,对专用集成电路则不是那么有效。以太坊的PoW(工作量证明)算法叫Ethash算法(是一个经过修改的Dagger-Hashimoto算法)。
该算法对GPU友好。一是考虑如果只支持CPU,担心易被木马攻击;二是现在的显存都很大。
轻型客户端的算法不适于挖矿,但易于验证。
快速启动算法中,主要依赖于Keccake256。
数据源除了传统的Block头部,还引入了随机数阵列DAG(Directed Acyclic Graph,有向无环图)(Vitalik提出)
一个世代(Epoch),含有30000Blocks,一个世代里使用相同的随机数阵列。
随机数阵列分为三个层次:种子值、缓存值和数据,种子值很小。根据种子值生成缓存值,缓存层的初始值为16M,每个世代增加128K。在缓存层之下是矿工使用的数据值,数据层的初始值是1G,每个世代增加8M。
过程中使用了Keccak-512算法,结果为64Bytes。
核心部分使用的数据单位是128Bytes,数据层面每一个元素都依赖于缓存层的256个元素。
ETHASH框架主要分为两个部分,一是DAG的生成,二是用Hashimoto来计算最终的结果。
ETHASH的框架
DAG主要流程
DAG分为三个层次:种子层、缓存层、数据层。三个层次是逐渐增大的。
种子层很小,依赖上个世代的种子层。
缓存层的第一个数据是根据种子层生成的,后面的根据前面的一个来生成,它是一个串行化的过程。其初始大小是16M,每个世代增加128K.每个元素64字节。
数据层就是要用到的数据,其初始大小1G,现在约2G,每个元素128字节。数据层的元素依赖缓存层的256个元素
缓存层计算流程示意图
数据层计算流程示意图
Hashimoto主要流程
Hashimoto的整个流程是内存密集型,具体如下:
1
头部信息和随机数结合在一起,做一个Keccak-512运算,获得初始的单向散列值Mix[0],128字节。
2
通过另外一个函数(Fetch DAG),映射到DAG上,获取一个值,与Mix[0]混合得到Mix[1],循环64次后得到Mix[64],128字节。
3
经过后处理过程,得到 mix final 值,32字节。再经过计算,得出结果。
4
把它和目标值相比较,小于则挖矿成功。难度值大,目标值小,就越难(前面需要的 0 越多)。
注:为防止矿机,mix function函数也有更新过。
Hashimoto主要流程示意图
验证流程
当矿工广播区块到网络中后,如何才能校验区块来完成一定工作量呢?
校验方案是采用 hashimotoLight 计算出在指定Nonce下的执行结果 result 和 digest。根据本地计算结果应该和区块的MixDigest值一致,且result低于给定的目标值 target,则说明Seal校验通过,表明该区块来完成一定量的工作量。
回到 hashimotoLight 方法,此方法是直接利用缓存实时计算出数据线来参与校验,和 hashimotoFull 类似。因为数据集也是通过缓存生成,如果没有数据集可以直接使用缓存计算。这样对于普通节点,只需要利用 16MB 的缓存便可以轻松完成 PoW 校验,按需生成所需要的数据集的数据项。
计算与图灵完备
以太坊作为通用的区块链平台,需要提供比比特币更强大的计算能力,选择了图灵完备的计算环境——以太坊虚拟机( Environment Virtual Machine ,EVM)。这就意味着在EVM上可以做所有的能想得到的计算、包括无限循环。以太坊采用经济的方法来保证以太坊平台的安全:
以太坊要求每个交易要给出最大的计算步骤,交易的发起人要提供Gas作为交易费以供矿工把交易加进区块。
如果实际运行超过了该最大计算步骤,计算将被终止,而交易费会归挖到区块的矿工所有。
以太坊网络的每个节点都运行EVM并执行合约代码。
EVM高级语言
比特币不提供高级语言的支持,以太坊则提供高级语言让用户编写智能合约。以太坊的高级语言最后会编译成在EVM中执行的EVM字节码(bytecode),部署在以太坊区块链上。以太坊提供3种编程语言:Solidity、Serpent和LLL。
以太坊P2P网络
RLPx协议
以太坊节点间采用RPLx编码及认证的通信传输协议来传输消息包。节点可以自由地在任何TCP端口发布和接受连接,默认的端口是30303。
目前正式版的RLPx实现了以下功能:单一协议的UDP节点发现,ECDSA签名的UDP,加密握手/认证,节点持久性,加密/认证TCP,TCP帧处理。
Whisper协议
Whisper协议是DApp间通信的通信协议。Whisper结合了DHT (Distributed Hash Table)和数据包消息系统(如UDP),因此同时具有以上两种协议的特性。Whisper提供多索引,非单一的记录,也就是说同一记录可以有多个键,有些键可能和别的记录一样。使用场景有以下几种:
DApp需要把少量的信息发布出去,而这些发布的信息要保留相当一段时间。例如一个外汇交易所将一个货币的挂牌卖价发布出去,这个卖价可能需要保留几分钟或几天时间。
DApp需要发信号给其他DApp,希望它们参与对某个交易的协同。
DApp之间需要提供非实时的提示或通常的通信,例如聊天室应用等。
DApp需要提供暗通信,也就是通信的双方除了知道对方的哈希值外,不知道对方更多的底细。
事件
以太坊中的事件是一个以太坊日志和事件监测协议的抽象。日志的记录中提供合约的地址,一组最多4个议题和一些任意长度的二进制数据。事件利用现有的应用程序二进制接口(ABI)功能来解析日志记录。
根据一个事件名和一些列的事件参数,可以分为两个系列:建立了索引的和没有索引的。建了索引的(最多有3个)是用来和事件的Keccak哈希签名一起作为议题的日志记录;没有建立索引的用来组成事件的字节数组。
以太坊的拆解就讲到这里,以太坊开创了智能合约时代,将区块链从1.0时代大跨地带入到2.0时代,下一期我们将进入区块链3.0时代:价值互联网。如果区块链可以链接全球将会是什么样子呢?敬请期待~
同学们可以关注PlatON公众号,持续学习哦。我们下节课见啦。
本文来源:PlatON原文标题:区块链与密码学全民课堂第3-4讲:硬核“拆解”以太坊