Block:
构建了操作区块链中一个区块的模型。可追踪特定区块的所有交易、收据和状态,能够应用所有需要的状态变化。另包含封包所需逻辑。
Block类中,数据包含:
State tree, transactions list, receipts, transactionsSethashes, 获取奖励前的State, 前一区块头信息(是一个BlockHeader对象), 当前区块头信息(BlockHeader对象), 当前区块的序列化, 是不是自己挖的(boolean), RLP编码的transactions块, RLP编码的叔区块, author地址,封包引擎信息
功能:
0.花样实例化自己
1.各种获取,检查:
复制区块;获取author地址;设置author地址(会导致当前区块完全重置);标记区块;
2.所有在最后状态上的操作:
获取某个账户的余额;获取特定地址的交易数量(用于 nonce);检查地址在不在使用;检查地址是否包含代码;获取账户的根、存储量、存储、代码、代码hash;
3.State总信息:
获取支持State对象;打开数据库;获取 State 树的根hash; 获取所有在使用的以太坊地址集合;
4.为改变账户的:
获取支持当前区块的可变State对象
5.与正进行的交易相关的信息:
获取剩余gas限制;获取未确认交易及hash值列表、区块内所有日志的bloom过滤器、特定交易的bloom过滤器、在给定数量的未决交易应用后立即获取状态;
6.State改变操作:
从区块链任一点构造状态对象;执行给定交易;同步交易;和区块链同步自己的State;在给定区块内execute(数据库中的执行)所有transaction(数据库中的事务);完成playback后回滚到最初的State;回滚区块State,可选改时间戳。
7.封包:
提交信息,运算trie、hash,填充区块头;封包;封包确认;获取当前块完整数据
8.获取当前区块头信息
另有私有函数:
撤销上传State改变;检索给定地址所有信息;执行给定区块;确定区块;获取至今消耗的gas量;实施强行修改(硬分叉);为调试提供标准VM trace。
BlockHeader:
包含一个区块头的所有数据
可以生成、解析、用给出的区块序列化数据填充区块头。可以手动对填充数据进行验证。
也可以以父区块的区块头对象为模板生成。
可以在没有nonce的情况下确定头hash以进行封包
其中信息包含:
parentHash, sha3Uncles, author, stateRoot,transactionsRoot, receiptsRoot, logBloom, difficulity, number, gasLimit,gasUsed, timestamp, extraData, gen_idx, node_list
其中,gen_idx是“挖矿者索引”,node_list是参与共识的公钥列表。(EOA账户由地址作索引,地址为公钥的后20位)
此外,还有额外的RLP编码header域(private)
Account:
单个以太坊账户的模型。
可以创建账户(包括死账户、普通账户和合约账户),杀死账户,确定账户死活,检查用户是否有过改变,是否为空,查账户nonce、nonce++、指定nonce,查trie根(baseRoot),查询余额,查代码hash、查代码、设置代码。
存储账户余额、nonce、代码(及其hash)、死活、storage root、storage overlay等
State:
State 基本上是 trie 的总览
State 包含账户状态查询、创建、修改的功能。State 內建了用于存储状态数据的缓存。对任何账户的任何原子操作都会被 State Changelog记录,并可在需要时基于changelog 中的记录来撤销操作
状态由键值表(key-value map)表示,其中键是地址,值是账户声明中的变量
除花样构造自己,还有:
复制State 对象;打开db;从给出的AccountMap中载入State;获取包含当前以太坊中所有地址的集合;执行一个给定交易;检查给定地址是否在使用中;检查State中的账户是否存在并非空;检查包含可执行代码的账户;获取账户余额;为指定账户加余额;从某账户减去某量余额;在两个账户间传递余额;获取给定账户存储root;获取给定账户存储位置的值;设置给定账户的存储位置的值;在指定位置创建合约;设置账户的代码;删除账户;获取账户存储(高开销);获取给定账户的代码/代码hash/byte-size代码;增加账户nonce;获取账户nonce(此值等于这个账户已发出交易的数量);获取这个State tree的根hash;提交所有在地址内的等待中的变化的缓存到数据库中;重置缓存中任何未提交的改变;获取账户起始nonce;创建状态更新的保存点;回滚改变到给定的保存点
Private:
移除所有空账户;获取给定地址的账户;通过干掉未改变条目来缩小m_cache体积;创建账户