前言,下篇相对上篇主要就以太坊的区块链架构进行总结,同时会结合同比特币架构的差异性进行比对分析。
一、以太坊区块链架构及要素
以太坊的架构基于比特币,但同时是将区块链作为了一个可编程的分布式信用基础设施,并支持智能合约应用,与仅作为虚拟货币支撑的比特币区块链有明显优化改进,基本架构及要素参见下图所示:
而相对比特币的改进主要体现在以下几方面
1.前端部分
包括去中心化应用、智能合约开发工具以及JS框架的引入,主要为解决相对比特币更为复杂应用场景或全新的领域开发,重点是对智能合约的支持。这部分会在后续关于智能合约开发的文章中讲解,此处不展开说明。
这里仅简单讲一下DApp,DApp是由只能合约和客户端代码构成,架构上类似于传统Web应用,但是这里智能逻辑部分是运行在区块链上,客户端代码运行在特殊浏览器Mist中。相对于传统钱包的简单支付业务,为复杂的去中心化应用的设计引入。
2.账户
以太坊引入了账户概念,可划分为两种类型:1)外部所有账户(EOA),即一般意义上的用户账户;2)合约账户(Contract),是一种特殊的可编程账户,是代码和数据的集合,受代码控制并由EOA账户激活。
如何理解外部所有账户和合约账户的基本区别?
一个EOA账户可以创建和使用自有私钥对交易进行签名,发送消息给另一个EOA账户或合约账户。两个外部所有账户之间传送的消息类似于比特币的简单支付交易仅为价值的转移。但EOA账户到合约账户的消息会激活合约账户的代码。
而合约账户可以执行图灵完备的计算任务,并可以在合约账户之间传递消息。调用时,EOA账户需要提供一些参数:EOA地址、合约的地址以及数据,数据部分则包括需要调用合约里的方法以及传递的参数。
不同于EOA账户,合约账户不可以自己发起一个交易。相反,合约账户只有在接收到一个交易之后(从一个EOA账户或另一个合约账户处),为了响应此交易而触发一个交易。
直观表示如下图
3.区块链管理及结构
比特币的区块链组织是采用Merkle数将交易的哈希值按一定的算法组成二叉树结构,顶层节点哈希值相当于整个交易清单的指纹用于验证交易清单。因为以太坊引入了对象状态管理(即上述账户)概念,除了交易清单还需要保存最新的状态,进而带来了复杂的校验和查询需求:
(1)以太坊的状态包含一个键值表,即(地址-账户声明对的变量),变量包括余额、随机数、代码和账户的存储,账户的状态可以经常改变,其余额、随机数也经常变。
(2)新的账户可以被插入,健在存储里也可以被插入和删除。
(3)基于上述两点,需要引入一种可以在插入、更新和删除操作后快速计算新的树根哈希值,并不需要重新计算整棵树的数据结构。并需要具备:树的深度是受限的以防止拒绝服务攻击;树的根哈希只是与树的数据有关,而与更新的顺序无关。
满足上述要求的实现即为Patricia树
而在区块链的区块报头中,以太坊实现上则是存放了3个根哈希:1)交易的merkle根哈希值;2)状态的根哈希值;3)收据的根哈希值(收据的作用会在后续部分讲到)
直观表示如下图
还有一个和比特币不一样的地方,以太坊的区块链中每个区块保存区块链号和区块难度(引出一个问题:作用是什么?)
在区块链的构建上,以太坊也采用了一个不同于比特币的算法——GHOST算法,中文直译为“贪婪最重观察子树”,该算法使得以太坊的区块链组织不是一个链条,而更像一棵树。
4.工作量证明及收益
按照比特币的挖矿设计难度,整个网络产生新区块的速度被动态控制在10分钟左右,并且工作量证明仅是依靠CPU的计算难度来决定。而以太坊的pow(工作量证明)算法经过优化相比较比特币的工作量证明相对简单且更为灵活。首先,新区块的产生被控制在每次15s左右,同时以太坊的工作量证明机制加入了内存难度,该特点具有抵抗针对单哈希优化的ASIC挖矿机属性,避免了算力局部集中化的风险。
而在矿工的收益方面,以太坊的奖励制度也要复杂一些。类似比特币以太坊在产生一个新的区块时会获取一定的静态收益(5个以太币),矿工还可以依靠交易用户支付的“燃料”来获取收益,此外还会获得一个产生“叔区块”包含入链的额外奖励。
这里有必要对“燃料”和“叔区块”做一下解释:
“燃料”——以太坊具有图灵完备属性,在此基础上存在对无限循环和跳转指令恶意使用的使用的可能,为了防止针对系统的恶意攻击,规定需要每个交易给出最大的计算步骤,同时交易人需要支付一定的交易费用给与矿工将交易加入区块,该费用即为“燃料”。“燃料”决定了交易能否有效执行,如果交易中的实际运行超过了最大计算步骤则燃料耗尽,交易终止同时交易费用归属挖到块区的矿工所有。
“叔区块”——也称为“废块”,是指符合以太坊难度条件产生的区块,但是该区块里的交易未被确认而失效,这种情况通常发生在A、B矿工同时产生符合条件的区块,之后因为网络延迟确认及区块重组导致一方区块无效时出现。“叔区块”的引入一方面完善了因为以太坊网络每15s一次更新可能产生大量非区块的算力浪费的经济补偿,另一方面增强了整个区块量的安全性,使攻击者不易模拟带有废块的区块链主链。
5.图灵完备、EVM(以太坊虚拟机)和高级语言
以太坊相比比特币的创新即引入图灵完备,进而使智能合约的应用成为可能。同时,还具备一个基础计算环境——以太坊虚拟机,合约代码的执行均在EVM上进行。
同时,以太坊提供高级语言便于编写智能合约,最终高级语言会被编译成为EVM中执行的EVM字节码,并部署在以太网区块链上。目前有提供三种编程语言:
1)Solidity,类似JavaScript语言
2)Serpent,类似Python语言,整合了低级语言的效率及易用性
3)LLL(Lisp like language),是一个像Lisp的语言,设计简约有些象汇编语言
6.合约执行及事件
以太坊上的合约执行是在区块验证时被交易触发的,通常是接收到外部账户消息所激活,其执行过程是异步的,即没有返回值无法直接获知结果。因此合约与外部的通信是通过日志事件实现的,该日志事件是交易执行时产生的收据一部分。
而以太坊中的事件是一个日志和事件监测协议的抽象,日志的记录中提供合约的地址、一组最多4个议题和一些任意长度的二进制数据。事件可以利用现有ABI(Application Binary Interface)功能解析日志记录。
总结:比特币、以太坊的架构分析是建立在对系统构成要素及基本概念、相互之间作用的基础之上,其中涉及诸多的工作原理、流程等内容都未深入展开及说明,后续文章中会针对各主要流程及原理进行阐述。
附参考文章:
以太坊的工作原理