智能合约相关设计
1.运行环境
以太坊采用以太坊虚拟机作为智能合约的运行环境。以太坊虚拟机是一个隔离的轻量级虚拟机环境,运行在其中的智能合约代码无法访问本地网络、文件系统或其他进程。
对同一个智能合约(查看什么是智能合约)来说,往往需要在多个以太坊虚拟机中同时运行多份,以确保整个区块链数据的一致性和高度的容错性。但另一方面,这也限制了整个网络的容量。
2.开发语言
以太坊为编写智能合约设计了图灵完备的高级编程语言,降低了智能合约开发的难度。目前,Solidity是最常用的以太坊合约编写语言之一。
智能合约编写完毕后,用编译器编译为以太坊虚拟机专用的二进制格式(EVM bytecode),由客户端上传到区块链当中,之后在矿工的以太坊虚拟机中执行。
7.3.2 交易模型
出于智能合约的便利考虑,以太坊采用了账户的模型,状态可以实时地保存到账户里,而无需像比特币的UXTO模型那样去回溯整个历史。UXTO模型和账户模型的对比如表7-1所示。
7.3.3 共识
以太坊目前采用了基于成熟的PoW共识的变种算法Ethash协议作为共识机制。
为了防止ASIC矿机矿池的算力攻击,跟原始PoW的计算密集型Hash运算不同,Ethash在执行时候需要消耗大量内存,反而跟计算效率关系不大。这意味着很难制造出专门针对Ethash的芯片,即通用机器可能更加有效。
虽然,Ethash对原始的PoW进行了改进,但仍然需要进行大量无效的运算,这也为人们所诟病。
社区已经有计划在未来采用更高效的Proof-of-Stake(PoS)作为共识机制。相对于PoW机制来讲,PoS机制无需消耗大量无用的Hash计算,但其共识过程的复杂度要更高一些,还有待进一步的检验。
7.3.4 降低攻击
由于以太坊网络中的交易更加多样化,也就更容易受到攻击。
以太坊网络在降低攻击方面的核心设计思想仍然是通过经济激励机制防止少数人作恶:
·所有交易都要提供交易费用,避免DDoS攻击;
·程序运行指令数通过Gas来限制,所消耗的费用超过设定上限时就会被取消,避免出现恶意合约。
这就确保了攻击者试图消耗网络中虚拟机的计算资源时,需要付出经济代价(支付大量的以太币);同时难以通过构造恶意的循环或不稳定合约代码来对网络造成破坏。
7.3.5 提高扩展性
可扩展性是以太坊网络承接更多业务量的最大制约。以太坊项目未来希望通过分片(sharding)机制来提高整个网络的扩展性。分片是一组维护和执行同一批智能合约的节点组成的子网络,是整个网络的子集。
支持分片功能之前,以太坊整个网络中的每个节点都需要处理所有的智能合约,这就造成了网络的最大处理能力会受限于单个节点的处理能力。
分片后,同一片内的合约处理是同步的,彼此达成共识,不同分片之间则可以是异步的,可以提高网络整体的可扩展性。