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体积;创建账户


相关文章
|
存储 算法
TreadLocal源码分析
TreadLocal源码分析
|
存储 缓存 监控
线程池原理初探以及源码分析(详解)
线程池原理初探以及源码分析(详解)
99 0
vivid源码分析
vivid源码分析
114 0
|
存储 Java 应用服务中间件
SpringMVC源码分析 RequestContextHolder使用与源码分析
SpringMVC源码分析 RequestContextHolder使用与源码分析
SpringMVC源码分析 RequestContextHolder使用与源码分析
|
存储 分布式计算 监控
【源码解读】|SparkEnv源码解读
【源码解读】|SparkEnv源码解读
139 0
|
存储 安全 Java
《从面试题来看源码》-LinkedBlockingQueue 源码分析
《从面试题来看源码》-LinkedBlockingQueue 源码分析
《从面试题来看源码》-LinkedBlockingQueue 源码分析
|
存储 算法
源码分析RateLimiter SmoothWarmingUp 实现原理(文末附流程图)
源码分析RateLimiter SmoothWarmingUp 实现原理(文末附流程图)
源码分析RateLimiter SmoothWarmingUp 实现原理(文末附流程图)
|
存储 算法 测试技术
源码分析 RateLimiter SmoothBursty 实现原理(文末附流程图)
源码分析 RateLimiter SmoothBursty 实现原理(文末附流程图)
源码分析 RateLimiter SmoothBursty 实现原理(文末附流程图)
|
存储 安全 Java
HashMap实现原理及源码分析
在java中,HashMap是很常用的一种数据结构,最近重新温习了一下,这里以源码层面来分析总结一下HashMap,如有不合理或疑问的地方,欢迎沟通交流。
HashMap实现原理及源码分析
|
存储 Java 数据库
Java集合源码分析之开篇
初衷 Java集合是我们使用最频繁的工具,也是面试的热点,但我们对它的理解仅限于使用上,而且大多数情况没有考虑过其使用规范。本系列文章将跟随源码的思路,分析实现的每个细节,以期在使用时避免各种不规范的坑。在这里,我们会惊艳于开发者优秀的设计,也会感激先辈们付出的艰辛努力,更重要的是知其所以然,少犯错误,写出优秀的代码。 许多人对集合类的理解是暴力的,当需要保存对象时就使用ArrayList,当需要保存键值对时就使用HashMap,当需要不可重复时就使用HashSet,等等。而且使用方式也比较单一:
212 0