FISCO-BCOS源码分析(一)-阿里云开发者社区

开发者社区> 数据库> 正文

FISCO-BCOS源码分析(一)

简介: 本篇包含 FISCO-BCOS/libethereum 中的 Block、Account、State 与 FISCO_BCOS/libethcore 中的 BlockHeader
博主水平有限,如有谬误还请高人赐教。

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.封包:

提交信息,运算triehash,填充区块头;封包;封包确认;获取当前块完整数据

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

单个以太坊账户的模型。

可以创建账户(包括死账户、普通账户和合约账户),杀死账户,确定账户死活,检查用户是否有过改变,是否为空,查账户noncenonce++、指定nonce,查trie根(baseRoot),查询余额,查代码hash、查代码、设置代码。

存储账户余额、nonce、代码(及其hash)、死活、storage rootstorage 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体积;创建账户


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章