以太坊系统

以太坊区块链系统架构

以太坊区块链系统依然是P2P体系结构,即对等网络结构

以太坊系统每个节点都可以存储完整的区块链与账本数据,每个节点都可以发起和监听以太坊网络上的交易信息,验证每个交易和区块的合法性;

每个节点都可以交易的形式发布智能合约,智能合约将存储于区块链中,加载到每个节点上的以太坊虚拟机EVM中执行

虽然每个以太坊系统节点上都安装了对等的以太坊系统软件,但是每个节点可以自由选择启动以太坊系统的不同功能,从而属于不同的节点类型,在区块链网络中扮演不同的角色。目前,以太坊系统的节点总体上可以分为“全节点”、“轻节点”、“存档节点”等类型,其中发挥核心作用的是全节点。

【1】

系统逻辑架构

【2】

以太坊系统的存储层主要采用文件系统和LevelDB Key-Value数据库,为以太坊系统相关的区块链、分布式账本、智能合约、X.509数字证书、日志、配置文件等数据提供高效、可靠持久化存储服务。

以太坊系统的数据层是系统核心功能层级之一,对以太坊系统核心的区块、区块链、交易、账本、账户、地址、状态树、交易树、收据树等关键数据结构进行定义和处理,负责将交易打包进区块,由区块组成区块链,并构建了状态树、交易树、收据树等数据结构。同时以太坊系统采用了传统的账户/余额模型构建账本数据,更加易于理解,并基于底层的存储服务提供对以太坊区块链数据的安全读写访问管理。

以太坊系统的网络层是系统核心功能层级之一,主要采用结构化P2P网络,基于Kademlia分布式哈希表协议,实现网络节点快速发现与连接,以及区块、交易数据的分发与同步,为以太坊系统各网络节点之间提供节点发现与安全连接通信机制,为交易、区块信息在区块链网络所有节点之间提供高效传播与有效性验证机制。

以太坊系统的共识层是系统核心功能层级之一,系统前期版本采用与比特币系统类似的PoW工作量证明共识机制,但是对PoW共识算法进行了改进优化,没有采用比特币系统单纯依赖算力的双SHA-256哈希计算,而是使用了同时依赖于算力和内存容量的ETHash算法,系统后期版本计划支持算力无关的PoS权益证明共识机制。

以太坊系统的激励层在共识层的功能基础上,采用无总量限制的以太币发行机制,与比特币系统的激励机制不同,除了出块激励外,还增加了叔块激励和交易服务费等激励机制。

以太坊系统的合约层首次定义并提供了强大的智能合约功能,智能合约可以基于Solidity等多种图灵完备的编程语言开发实现,并提供了专用的以太坊虚拟机EVM作为智能合约的安全隔离运行环境。

以太坊系统的接口层提供了基于JSON RPC、Web3.js的SDK接口和命令行接口。

以太坊系统的应用层基于接口层提供的SDK接口,可以基于以太坊区块链实现面向多种应用场景和业务逻辑的公有链或DApp去中心化应用。

以太坊系统数据层

区块与区块链

以太坊区块的区块体除了包含交易列表外,还包含一个特殊的叔区块(Uncle Block)头部分。

【4】

【3】

账本数据

  • 以太坊的分布式账本采用了传统记账系统的账户模型,即每个用户对应一个直接记录余额的账户,交易中附带有参与交易的账户的信息。以太坊用账户来记录系统状态,包括每个账户存储余额信息、智能合约代码和内部数据存储等。

  • 相比于比特币的UTXO模型,以太坊所采用的传统账户/余额模型显然更易于理解和进行智能合约的编程。

  • 以太坊的每一个账户都由公钥密码机制生成的一对公私钥进行定义,账户地址是采用一种SHA-3(Keccak-256)哈希算法对公钥数据进行哈希计算的32字节结果的后20字节数据的40位十六进制字符表示。

    【5】

以太坊系统有两类账户:

(1) 外部账户EOA(Externally Owned Account)**

外部账户是给以太币拥有者分配的账户,拥有该账户的用户可以通过账户对应的私钥创建和签署交易,发送消息至其他外部账户或合约账户。

(2) 合约账户COA(Contract Account)

合约账户是一种特殊用途的账户,用于存储执行的智能合约代码,只能被外部账户触发从而执行其对应的合约代码,从而执行各种预先定义好的操作。

交易数据

状态数据

在以太坊系统中,所有账户(外部账户与合约账户)的状态共同构成了以太坊系统的状态。以太坊系统用一棵采用默克尔帕特里夏MPT树型数据结构定义的“全局状态树”来保存每个区块产生时系统的状态,并在当时的区块中保存了状态树的根哈希。

  • 状态树中的每个叶子节点都表示一个账户状态,当新区块被产生时,状态树的根哈希值将被写入区块中,期间只会有小部分的账户状态会发生改变,状态树中只有部分节点状态会改变。

  • 为了节省存储空间,并不是每个区块都独立构建一棵状态树,而是共享状态树的节点数据,针对发生改变的节点状态,会新建一些分支,而不是更新原节点的状态数据,历史状态数据都将被保留。

以太坊系统网络层

P2P网络结构与节点

以太坊系统网络层位于数据层之上、共识层之下,是系统的核心功能层次之一,主要提供以下网络管理功能:

(1) 区块链P2P网络的组网管理

(2) 各网络节点的节点发现、连接与通信管理

(3) 新区块或交易数据广播管理

(4) 各网络节点之间区块链数据同步管理

(1)全节点

以太坊系统的网络全节点需要保存全链数据,全节点所需的储存空间也在不断增长。

以太坊系统网络全节点的主要工作包括:

​ • 将系统所有区块链与状态数据存储在节点本地,建立全链数据副本,可以根据请求为网络提供任何公开数据。

​ • 接收并验证新区块数据,若新区块通过验证,就保存在本地的区块链中,并向其它邻近节点广播区块数据。

​ • 接收并验证其他帐户或去中心化应用DApp发出的交易数据,若新交易通过验证,就保存在本地的交易池中,并向其它邻近节点广播交易数据。

• 通过求解指定的PoW工作量证明计算难题来竞争新区块的出块权,从而获得以太币激励,并把多条交易记录打包写入新区块。

• 对存储在区块链中的智能合约进行部署与执行。

(2) 轻节点

​ 以太坊系统网络轻节点不需储存和维护完整的区块链数据副本,只存储所有的区块头数据,可以通过检验区块头中包含的状态树根哈希,并按需向全节点请求相关区块链信息,从而验证数据的有效性。轻节点一般用于发送或传递交易信息,对节点的CPU计算性能、内存容量、磁盘容量、运行稳定性都要求较低。

(3) 存档节点

​ 存档节点存储了所有全节点保存的内容,同时创建了历史状态的档案,存档节点不参与竞争出块权的共识计算,一般只提供状态查询服务,例如,如果要查询一个账户在以太坊区块高度1000000时的以太币余额,就要查询一个存档节点。

节点发现管理

节点连接管理

以太坊网络的节点连接涉及到Peer(对等节点)、Session(会话)、Capability(能力)等基本概念。

(1) Peer:在以太坊系统的P2P网络中,Peer与节点(Node)是不同层次的对象,节点更底层,在NodeTable中进行管理,Peer是建立TCP连接会话的对象。

(2) Session:在以太坊系统的P2P网络中,Session是节点连接管理中最重要的结构,Session表示Peer之间真正建立了连接后的逻辑关系。

(3) Capability:指节点能支持的功能,表示以太坊系统在P2P网络通信层之上的业务能力,P2P网络只提供节点之间的连接通道,具体要传输什么数据,由节点支持的Capability决定,此外,由于以太坊系统经过多次升级,不同节点上安装运行的以太坊系统版本可能不同,为了实现系统向后兼容,节点连接时需要确定都可以支持的Capability集合。

交易广播

在以太坊系统的P2P网络中,交易的广播过程如下:

(1) 每个节点会针对每个邻近节点维护一个待发送交易列表TxsA和已知交易列表TxsB;

(2) 当节点接收到一个新交易Tx时,会先查询哪些邻近节点没有该交易信息,并将交易Tx加入邻近节点对应的待发送交易列表TxsA中;

(3) 节点向每个待发送交易列表TxsA不为空的节点异步发送交易;

(4) 交易发送成功后,会将被发出的交易加入对应邻近节点的已知交易列表TxsB。

交易池

以太坊系统也有交易池机制,交易池中的交易信息来源主要包括:

(1)本地提交:通过第三方应用调用以太坊网络节点本地的RPC服务提交的交易。

(2)广播同步:通过交易广播与同步,将其它节点的交易数据同步到该节点交易池。

注意:当节点在竞争计算出块权时,会从交易池中获取并验证数条交易信息打包到区块中,如果节点成功获得出块权,新区块会被广播,此时新区块中包含的交易信息不会马上从交易池中删除,直到新区块被以太坊系统区块链确认,新区块中包含的交易才会从交易池中删除。如果以太坊系统的区块链发生了分叉,写进分叉的区块中包含的交易也不会从交易池中删除,而是继续在交易池中等待重新打包。

区块广播与同步

(1) 节点A假如连接了n个节点,从相邻节点中选出sqrt(n)个节点广播包含完整区块信息的消息,向剩余的sqrt(n)个节点只广播区块哈希的消息;

(2) 收到到节点A广播的完整区块信息的节点,会将收到的区块加入等待验证的区块队列;

(3) 收到节点A广播的区块哈希的节点,根据需要可以从发送给它消息的节点A那里获取对应的完整区块,获取区块后再加入到等待验证的区块队列;

(4) 等待验证的区块队列中的区块经过验证确认后,最终插入节点本地区块链,节点再将新区块哈希广播给与它相连但还不知道该新区块的节点。

以太坊系统共识层

PoW工作量证明共识机制

以太坊采用了Ethash算法作为其工作量证明算法。Ethash算法具有与算力大小和内存容量均相关的特性。

PoS共识机制

每一轮记账权由当时具有最高权益值的节点获得,最高权益值的计算并不仅仅依赖于节点算力的高低

以太坊系统激励层

(1) 加密货币总量无限制:以太坊系统并没有规定以太币的供应上限。

(2) 出块激励:以太坊系统没有出块奖励减半机制,以太坊系统上线之初每个新区块的出块奖励为5个以太币。在以太坊系统第三个阶段(大都会阶段),出块奖励调整过两次:2017年10月的拜占庭升级,出块奖励由5个以太币降为3个;2019年3月的君士坦丁堡升级,出块奖励由3个以太币降为2个;未来以太坊的出块奖励可能还会继续调整。

(3) 叔块激励:为了提高系统的交易性能,以太坊系统把出块时间缩短到平均10秒左右,更短的出块时间意味着在同一时刻,可能出现多个节点都求解出难题获得了新区块的记账权,但是在这些新区块中,只有一个将成为最长链上的区块,而其它区块,如果能被后续区块引用,将被称为叔块。

(4) 交易激励:在以太坊系统中,每一次交易的执行都需要消耗一定的费用,这个费用被命名为“燃料(Gas)”,Gas的值并不直接使用以太币ETH表示,而是使用GWei作为单位,

例如:8 GWei = 0.000000008 ETH

在以太坊系统的交易数据中有Gas的单价(Price)与需要消耗的Gas数量(GasLimit)属性,交易费用的计算公式如下:

交易费 = Gas的单价 × 消耗的Gas数量

在以太坊系统中,交易可分为转账类型与智能合约相关类型,每一笔转账类型的交易,无论转账数额大小,系统规定最少消耗21000个 Gas数量,如果要在交易中额外添加备注信息,需要消耗额外的 Gas数量。

l叔块机制

以太坊系统合约层

智能合约机制

以太坊智能合约是一种采用Solidity语言开发的程序,经过编译的合约程序,只能通过以太坊合约账户以交易的形式发布到区块链上,交易信息中将附带合约程序的全部二进制字节码数据,并被打包保存到区块中,因此利用区块链的特性,智能合约一旦发布,合约的签订方就不可能被篡改或抵赖。

以太坊系统合约层提供对智能合约的全生命周期管理,包括合约的创建、合约的部署运行、合约的调用执行、合约的作废。

课后

(一)填空题

1. 在以太坊系统中,每个区块由 、 和 三部分组成。

2. 以太币的标准单位是 ,最小单位是 ,1个标准单位的以太币等于 个最小单位的以太币。

3. 以太坊网络中存在 、 、 等不同类型的节点,其中 节点所需的存储空间最大。

4. 在以太坊系统中,账户分为 和 两类。

5. 在以太坊系统中,创建智能合约类型交易的交易接收方地址值为 。

6. 以太坊智能合约的全生命周期包括 、 、 和合约的作废。

(二)选择题

1. 在以太坊系统区块链的每个区块中不包含( )的哈希值。

A. 父区块 B. 交易树根 C. 子区块 D. 收据树根

2. 以太坊系统采用( )模型构建分布式账本,即每个用户都有直接的余额信息。

A. UTXO B. 账户 C. 数据库 D. 会计

3. 以太坊系统是使用( )作为账户的唯一索引标识。

A. 地址 B. 伪随机数 C. 账户编号 D. 随机数

4. 在以太坊系统中,用于保存用户拥有的以太币余额的账户是( )。

A. 合约账户 B. 外部账户 C. 普通账户 D. 交易账户

5. 在以太坊系统中,交易可以分为多种类型,下面不属于以太坊交易类型的是( )。

A. 转账支付 B. 创建合约 C. 创建账户 D. 调用合约

6. 以太坊系统采用的共识机制主要依赖节点的( )进行出块权的竞争计算。**

A. 算力 B. 内存容量 C. 算力+内存容量 D. 网络带宽

7. 以太坊系统智能合约采用的系统默认开发语言是( )。

A. Java B. Go C. Solidity D. JavaScript

8. 在以太坊系统中,一个创建合约类型的交易的接收方地址(Recipient)字段值应为( )。

A.节点地址 B.空 C.外部账户地址 D.合约账户地址

9. 以太坊系统除了正在使用的PoW共识机制外,计划在后续版本中支持( )共识机制。

A. Paxos B. PoS C. DPoS D. PBFT

(三)简答题(任选3道)

1. 请简述以太坊系统的区块链中各个区块是怎么链接的?

2. 请简述以太坊系统的账户地址是怎样生成的?

3. 请简单分析以太坊系统PoW共识机制节点竞争计算生成新区块的过程?

4. 请简述为什么以太坊系统要引入叔区块(UncleBlock)机制?

5. 请简单分析以太坊系统的账户与与传统的中心化系统的账户具有的不同之处?

6. 请简述以太坊系统PoW共识机制采用的Ethash算法的主要计算过程?