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


相关文章
|
9月前
|
存储 算法
TreadLocal源码分析
TreadLocal源码分析
|
9月前
vivid源码分析
vivid源码分析
41 0
|
存储 分布式计算 监控
【源码解读】|SparkEnv源码解读
【源码解读】|SparkEnv源码解读
104 0
|
缓存 分布式计算 监控
【源码解读】| LiveListenerBus源码解读(上)
【源码解读】| LiveListenerBus源码解读
133 0
【源码解读】| LiveListenerBus源码解读(上)
|
存储 SQL 分布式计算
【源码解读】| LiveListenerBus源码解读(下)
【源码解读】| LiveListenerBus源码解读
129 0
【源码解读】| LiveListenerBus源码解读(下)
|
存储 Java 应用服务中间件
SpringMVC源码分析 RequestContextHolder使用与源码分析
SpringMVC源码分析 RequestContextHolder使用与源码分析
SpringMVC源码分析 RequestContextHolder使用与源码分析
|
iOS开发
fishhook源码分析
最早了解到[fishhook](https://github.com/facebook/fishhook)是看了下面两篇文章之后,顿时让我觉得这是一个非常好的东西。总共210行代码,收获了1500+个star,神作啊。 1. [iOS Lazy Binding](http://www.atatech.org/articles/68014),使用fishhook拦截NSSetUncaughtE
2394 0
|
移动开发 Java 开发者
Stresstester源码分析
stresstester-1.0.jar是早期淘宝的一个压力测试工具,很方便开发人员进行本地代码的压力测试,其他专门压力测试工具也有很多,如:jmeter loadrunner 等等,本篇文章主要讲一下stresstester的源码设计
10582 0
|
大数据 DataX 分布式计算
gobblin 源码分析
最近,开始搞些大数据相关的内容,遇到的第一个问题,就是数据入库,小白刚入手,又不想写太多代码,于是从网上找,入库手段很多: DataX,Sqoop,以及Flume 等以及直接使用 Spark 进行入库,想了下当下的场景(不是简单的倒库,要从kafka拉...
1380 0
|
区块链 数据安全/隐私保护 索引
FISCO-BCOS源码分析(四)——libethcore
libethcore是区块链核心数据结构目录。如ABI、密钥管理、区块头、预编译、交易结构等等

热门文章

最新文章