黄子涵

1.6 区块链和以太坊架构

区块链是一种包含多个组件的体系结构,区块链独特的地方在于这些组件的功能和相互作用。重要的组件包括:EVM(Ethereum Virtual Machine 以太坊虚拟机)、矿工、区块、交易、共识算法、账户、智能合约、挖矿、以太币和 gas。

一个区块链网络是由大量的节点构成的,其中一部分是属于矿工的挖矿节点,另一部分节点不挖矿但会帮助执行智能合约和交易。这些节点统称为 EVM。网络上的各个节点之间互相连接,节点之间通过 P2P 协议进行通信,默认情况下使用 30303 端口。

每个节点都维护着一个账本的实例(副本),包含链上的全部区块。由于网络上存在大量矿工节点,为了避免节点之间的区块数据存在差异,这些节点会持续同步区块,确保账本数据一致。

智能合约也运行在 EVM 上 。智能合约通过编写个性化的业务功能扩展以太坊的能力。智能合约执行的时候,是作为交易的一部分按照前面提到的挖矿流程进行的。

在网络上有账户的用户可以发送信息来完成账户之间的以太币交易,或者发送消息来调用合约中的一个函数 。对以太坊来说,这两种方式实质上都是交易。在交易确认和更改账户余额时,账户所有人必须用私钥对交易进行数字签名,这样才能确定发送者的身份。以太坊的结构如下图所示。

image

1.6.1 区块如何互相连接

在区块链和以太坊中,每个区块都连接着另外一个区块。两个区块之间是一对父子的关系,并且是一对一的关系,这样首尾相接就组成了一个链条。在接下来这张图中,我们用 3 个区块(区块 1、区块 2、区块 3)来示意。区块 1 是区块 2 的父区块,区块 2 是区块 3 的父区块。在每个区块的头部都存储了父区块的散列值,这样就建立了父子关系。

image

区块 2 在头部存储了区块 1 的散列值,区块 3 在头部存储了区块 2 的散列值,那么,问题来了,第一个区块的父区块是谁?以太坊有个创世区块的概念,它就是第一个区块。这个区块是在链初次发起时自动创建的。你也可以这样认为,整个链条是由创世区块(通过>的概念,它就是第一个区块。这个区块是在链初次发起时自动创建的。你也可以这样认为,整个链条是由创世区块(通过 genesis.json 文件来生成)作为第一个区块而开始启动的,如下图所示。

1.6.2 交易和区块如何互相连接

既然我们知道区块是互相连接在一起的,你可能想知道交易是如何与区块绑定在一起的。在以太坊中,交易是存储在区块里面的,交易在执行时需要消耗一定数量的 gas,由于每个区块都有一个 gas 上限,待执行的交易消耗的 gas 总数不能超过上限,这样可以避免将所有交易存储在一个区块里面。当达到 gas 上限时,其他交易就不能再写入这个区块,此时,节点开始挖矿。

一个交易在产生散列值之后,就被存储到区块中,接着,挖矿程序会选取两个交易的散列值进行再次散列,再产生一个新的散列值。很显然,区块里面的所有交易最终会产生一个唯一的散列值,它就是 Merkle 根散列值,保存在区块头上。如果区块里面的任何一个交易发生了改变,这个交易的散列值也会随之变化,最终会导致根交易散列值发生变化。当区块的散列值发生变化后,由于子区块保存了父区块的散列值,因此,它的子区块的散列值也需要随之变化,这样会引发连锁反应,使得整个区块链都要变化才行,因此,区块链的不可篡改才成为可能。原理如下图所示:

image

posted @ 2022-06-13 11:34  黄子涵  阅读(426)  评论(0编辑  收藏  举报