在以太坊中,使用了“幽灵协议”(GHOST protocol)这个机制,来确定哪条路径是有效的, 而且能避免多条链的出现。
幽灵协议:Greedy Heaviest Observed Subtree
简单来说,幽灵协议是指我们必须选择的路径是一条拥有最多计算量的路径。一种确定方式是选择区块块号最大一个区块。这个区块块号代表了当前路径下所有区块的数量(不包括创世区块)。区块的块号越大,那么这条路径上矿工在挖矿中付出的计算量就越大。使用这种方式,就可以对当前状态的版本达成一致。
现在你已经对区块链是什么有了一个大致的概览,让我们来深入了解一下以太坊区块链的主要组成部分:
- 账户(accounts)
- 状态(state)
- gas 和 gas fee
- 交易(transactions)
- 区块(blocks)
- 交易执行(transaction execution)
- 挖矿
- 工作证明
账户
以太坊的全球“共享状态”,是由许多能够通过消息传递框架相互交互的对象(“账户”)组成。每个帐户都有一个与之关联的状态,和一个20字节的地址。也就是说,以太坊中的地址是采用了160位的标识符来标识账户地址(1字节 = 8位)。
在以太坊中,有两种类型的账户:
- 外部账户:私钥控制,没有与之关联的代码。
- 合约账户:合约代码控制,有与之关联的代码。
外部账户 vs 合约账户
理清外部账户和合约账户的区别是非常重要的。外部帐户可以通过使用自己的私钥创建和签署交易,以此向其他外部拥有的帐户或其他合约帐户发送消息。两个外部拥有的账户之间的消息只能是以太币转移的数值。但是从外部账户到合约账户的消息会激活合约账户的代码,允许执行各种操作(例如转移代币、写入内部存储、铸造新代币、执行计算、创建新合约等)。
与外部账户不同,合约账户不能自行发起新交易。相反,合约账户只能响应它们收到的其他交易(来自外部账户或来自另一个合约账户)。我们将在“交易和消息”部分了解有关合约和合约调用的更多信息。
因此,在以太坊区块链上发生的任何行动,都总是由外部账户发起的交易。
账户状态(Accout State)
账户状态由四个部分组成,无论是外部账户或者合约账户都有这四个部分:
- nonce: 如果账户是外部账户,这个数字代表从账户地址发送的交易数量。如果账户是合约账户,nonce就是该账户创建的合约数量。
- balance: 账户地址所拥有的以太币的数量,这里使用wei做单位的,1Ether等于1e 18wei。
- storageRoot:梅克尔帕特里夏树(Merkle Patricia tree)的根节点的hash(我们将会在后面解释什么是梅克尔帕特里夏树)。这棵树编码了账户存储数据的哈希值,默认是空的。
- codeHash:此帐户的 EVM(以太坊虚拟机 — 稍后会详细介绍)代码的哈希值。 对于合约账户,这是经过哈希处理并存储为codeHash的代码。对于外部账户,codeHash字段的哈希值是空字符串。