相关阅读
纯干货|深度解析以太坊(1):以太坊模型
以太坊的全球“共享状态”是由许多能够通过消息传递框架相互作用的小型对象(账户)组成的。每个帐户都有一个相关的状态和一个20字节的地址。以太坊的地址是一个160位的标识符,用于识别任何帐户。
有两种类型的帐户:
1.外部拥有的帐户,由私钥控制,并且没有与之相关的代码。
2.合约帐户,由合约代码控制,并有与之相关的代码。
1 外部拥有账户与合约账户
了解外部账户和合约账户之间的根本区别很重要。外部拥有的帐户可以通过使用其私钥创建和签署交易,将消息发送到其他外部拥有的帐户或其他合约帐户。两个外部拥有账户之间的消息只是一个价值转移。但是从外部拥有账户到合约账户的消息会激活合约账户的代码,允许它执行各种操作(例如转移Token,写入内部存储,创建新的Token,执行一些计算,创建新的合约等)。
与外部拥有的账户不同,合约账户不能自行发起新的交易。相反,合约帐户只能触发交易以响应其他交易(从外部拥有的帐户或其他合约帐户)。我们将在“ 交易和消息 ”部分中详细了解合约到合约的通信。
因此,以太坊区块链上发生的任何操作都始终由外部受控帐户触发的交易处理。
2 账户状态
不管账户的类型如何,账户状态由四个部分组成:
nonce:如果账户是一个外部拥有账户,nonce代表从此账户地址发送的交易序号。如果账户是一个合约账户,nonce代表此账户创建的合约序号
balance: 此地址拥有Wei的数量。1Ether=10^18Wei
storageRoot: Merkle Patricia树的根节点Hash值(我们后面在解释Merkle tree)。Merkle tree会将此账户存储内容的Hash值进行编码,默认是空值
codeHash:此账户EVM(以太坊虚拟机,后面细说)代码的hash值。对于合约账户,就是被Hash的代码并作为codeHash保存。对于外部拥有账户,codeHash域是一个空字符串的Hash值
3 全局状态
我们知道以太坊的全局状态由帐户地址和帐户状态之间的映射组成。这个映射存储在一个称为Merkle Patricia树的数据结构中。
Merkle Tree(或者也被称为“Merkle trie”)是由一组节点组成一种二叉树,这些节点包括:
包含底层数据的树底部的大量叶子节点;
一组中间节点,其中每个节点是其两个子节点的散列;
单个根节点,也是由其两个子节点的Hash形成的,代表树的顶部;
树底部的数据是通过将我们想要存储的数据分成chunks块来生成的,然后将chunks分成buckets,然后取每个buckets的hash值并重复相同的过程,直到剩余的hash总数变为只有一个:根hash。
树需要有一个存储在里面的每个值的键(key)。从树的根节点开始,关键字应该告诉你哪个子节点要获取相应的值,该值存储在叶节点中。在以太坊的情况下,状态树的键/值映射位于地址及其相关帐户之间,包括每个帐户的balance,nonce,codeHash和storageRoot(其中storageRoot本身就是树)。
同样的树结构也用来存储交易和收据。更具体的说,每个块都有一个头(header),保存了三个不同Merkle trie结构的根节点的Hash,包括:
状态树
交易树
收据树
在Merkle tries中有效地存储所有信息的能力在以太坊我们称之为“轻客户端”或“轻节点”。请记住,区块链由一堆节点维护。一般来说,有两种类型的节点:全节点和轻节点。
全节点通过下载整条链来进行同步,从创世纪块到当前块,执行包含在其中的所有交易。通常情况下,矿工存储全节点,因为他们在挖矿过程中需要全节点。也可以在不执行每个交易的情况下下载全节点。无论如何,一个全节点都包含整个链。
但是,除非一个节点需要执行每个交易或者轻松查询历史数据,否则实际上不需要存储整个链。这是轻节点概念的来源。轻型节点不是下载并存储完整链并执行所有交易,而是仅从起始块到当前块的头,而不执行任何交易或检索任何关联的状态。由于轻节点可以访问块的头,而头中包含了3个tries的Hash,所有轻节点依然可以很容易生成和接收关于交易、事件、余额等可验证的答案。
这样做的原因是因为Merkle tree中的hash向上传播 - 如果恶意用户试图将假交易交换到Merkle tree的底部,这种更改将导致上面节点的散列发生变化,这将改变以上的节点的散列,等等,直到它最终改变树的根。
任何想要验证数据的节点都可以使用“Merkle证明”来实现。Merkle证明包括:
1.要验证的数据块和散列
2.树的根hash
3.一个“分支”(从 chunk到根这个路径上所有的hash值)
任何读取证明的人都可以验证该分支的hash在树中一直保持一致,因此给定的块实际上是在树中的那个位置。
总之,使用Merkle Patricia树的好处是,这个结构的根节点在密码上依赖于存储在树中的数据,所以根节点的散列可以用作这个数据的安全身份。由于块头包含状态,交易和收据树的根hash,所以任何节点都可以验证以太坊状态的一小部分,而不需要存储整个状态,这个状态的大小可能是无限的。
布尼区块链
拥抱区块链未来
打造最有价值的区块链学习&交流社群
网友评论