Skip to content

Latest commit

 

History

History
66 lines (50 loc) · 4.97 KB

readme.md

File metadata and controls

66 lines (50 loc) · 4.97 KB

Ethereum Virtual Machine Opcodes

以太坊存储模型

以太坊存储 以太坊是一个基于交易的“状态”机器. 三棵树: 交易树,状态树和收据树。

账户余额等数据并不直接存储在以太坊区块链的区块中。只有交易树、状态树和收据树的根节点哈希直接存储在区块链中。 存储树(保存所有智能合约数据)的根节点哈希实际上指向状态树,而状态树又指向区块链。 **永久存储和临时存储** 永久数据和临时数据。永久数据的一个例子是交易。一旦交易被完全确认,它就会被记录在交易树中;它永远不会改变。临时数据的一个例子是特定以太坊账户地址的余额。帐户地址的余额存储在状态树中,并在针对该特定帐户的交易发生时更改。永久数据(如挖掘交易)和临时数据(如账户余额)应该分开存储是有道理的。以太坊使用 trie 数据结构来管理数据。

状态树

  1. 在以太坊中只有一个全局状态树。这个全局状态树会不断更新。 状态树包含存在于以太坊网络上的每个帐户的键值对。key是160位地址。 value是账户信息(使用递归RLP编码)
  • nonce
  • balance
  • storageRoot
  • codeHash
  1. 状态树的根节点(给定时间点整个状态树的散列)用作状态树的安全唯一标识符;状态树的根节点在密码学上依赖于所有内部状态树数据。

存储树 -- 合约数据所在位置

每个以太坊账户都有自己的存储树。存储树根节点的 256 位散列作为 storageRoot 值存储在全局状态树中. 每个以太坊账户都有自己的存储树。存储树根节点的 256 位散列作为 storageRoot 值存储在全局状态树中

交易树 -- 每个区块一个

每个以太坊区块都有自己独立的交易树。一个区块包含许多交易。开采的区块永远不会更新;交易在区块中的位置永远不会改变。

SPV

数据库选型

以太坊的 Rust 客户端 Parity 使用 Rocksdb。而以太坊的 Go、C++ 和 Python 客户端都使用 leveldb。 ethereumjs可以查看leveldb.

Solidity Bytecode and Opcode Basics

简单了解 bytecode 和 opcode。

Solidity Bytecode and Opcode Basics https://medium.com/@blockchain101/solidity-bytecode-and-opcode-basics-672e9b1a88c2

Deconstructing a Solidity Contract

Openzeppelin blog 的系列文章,非常棒的科普文。学习笔记参见 👉 DeconstructingSolidityContract.md

参考链接