3. 核心数据结构¶
标签:数据结构
编码
注解
FISCO BCOS 3.x数据和编码协议的实现位于 bcos-tars-protocol
FISCO BCOS 3.x默认采用tars编码协议,本章主要介绍FISCO BCOS 3.x基础数据结构的编码协议。
1. 区块头数据结构¶
区块头的tars定义可参考这里。
1.1 BlockHeaderData¶
区块头中需要计算哈希的字段:
字段 | 类型 | 说明 |
---|---|---|
version | int | 区块头版本号 |
parentInfo | vector |
父区块信息,包括父区块的块高和哈希 |
txsRoot | vector |
区块内所有交易MerkleRoot的哈希 |
receiptRoot | vector |
区块内所有回执MerkleRoot的哈希 |
stateRoot | vector |
区块内所有交易状态变化对应的根哈希 |
blockNumber | long | 区块高度 |
gasUsed | string | 区块内所有交易消耗的gas总和 |
timestamp | long | 区块头时间戳 |
sealer | long | 产生该区块头的共识节点的ID |
sealerList | vector |
产生该区块头时,系统所有共识节点列表 |
extraData | vector |
扩展字段, FISCO BCOS目前只用于在第0块中记录群组genesis文件信息 |
consensusWeights | vector |
所有共识节点的权重信息 |
1.2 BlockHeader¶
区块头所有字段的定义:
字段 | 类型 | 说明 |
---|---|---|
data | BlockHeaderData | 区块头用于计算哈希的所有字段编码后对应的数据 |
dataHash | 区块内所有交易状态变化对应的根哈希 | |
signatureList | vector |
区块头共识成功后,产生的签名列表 |
2. 区块数据结构¶
区块的tars定义可参考这里,区块中既可以包括完整的区块头、交易、回执信息,也可以作为共识模块的Proposal仅包括交易的元数据信息,具体如下:
字段 | 类型 | 说明 |
---|---|---|
version | int | 可选字段,区块版本号 |
type | int | 可选字段,区块类型 |
blockHeader | BlockHeader | 可选字段,区块头数据 |
transactions | vector |
可选字段,交易列表 |
receipts | vector |
可选字段,交易回执列表 |
transactionsMetaData | vector |
可选字段,交易元数据信息 |
receiptsHash | vector |
交易回执的哈希列表 |
nonceList | vector |
所有交易的nonce列表,在区块同步的场景下,作为区块的payload,向交易池推送所有交易的nonce并触发nonce更新逻辑 |
3. 交易数据结构¶
交易的tars定义可参考这里,类似于区块头,交易的数据协议字段也划分为用于计算哈希的字段和不参与哈希计算的字段两部分。
3.1 TransactionData¶
定义了交易中用于计算哈希的所有字段,具体如下
字段 | 类型 | 说明 |
---|---|---|
version | int | require,交易版本号 |
chainID | string | require,交易对应的链ID |
groupID | string | require,交易对应的群组ID |
blockLimit | long | require,交易的blockLimit,用于防止交易重复 |
nonce | string | require,消息发送方提供的随机数,用于唯一标识交易,也用于防止交易重复 |
to | string | optional,交易接收方地址 |
input | vector |
require,与交易相关的数据,包含了交易调用的函数、参数等信息 |
hashWith字段(也称交易hash/交易唯一标识)的生成流程如下:
3.2 Transaction¶
交易所有字段的定义:
字段 | 类型 | 说明 |
---|---|---|
data | TransactionData | optional,交易用于计算哈希的字段编码后的数据 |
dataHash | vector |
optional,交易哈希 |
signature | vector |
optional,交易的签名 |
sender | vector |
optional,发送交易的账户地址 |
importTime | long | optional,交易发送到节点的时间戳 |
attribute | int | optional,交易的属性,用于标记交易的类型、交易的并行冲突域等 |
source | string | optional,交易接收方地址,用于DMC调度 |
3.3 TransactionMetaData¶
共识打包的proposal中仅包括交易元数据信息,交易元数据信息字段定义如下:
字段 | 类型 | 说明 |
---|---|---|
hash | vector |
optional,交易哈希 |
to | string | optional,交易接收方地址 |
source | string | optional,交易接收方地址,用于DMC调度 |
attribute | unsigned int | optional,交易的属性,用于标记交易的类型、交易的并行冲突域等 |
4. 交易回执数据结构¶
交易回执的tars定义可参考这里,类似于区块头和交易,交易回执的数据协议字段也划分为用于计算哈希的字段和不参与哈希计算的字段两部分。
4.1 LogEntry¶
定义event log,具体如下:
字段 | 类型 | 说明 |
---|---|---|
address | string | 事件对应的合约地址 |
topic | vector |
事件topic |
data | vector |
eventlog对应的数据 |
4.2 TransactionReceiptData¶
交易回执中用于计算哈希的字段:
字段 | 类型 | 说明 |
---|---|---|
version | int | require,交易回执版本号 |
gasUsed | string | require,回执对应的交易消耗的Gas |
contractAddress | string | optional,交易回执对应的合约地址 |
status | int | require,交易执行状态 |
output | vector |
optional,交易执行结果输出 |
logEntries | vector |
optional,交易执行过程中产生的eventlogs |
blockNumber | long | require,交易回执所在的区块高度 |
4.3 TransactionReceipt¶
交易回执的数据结构定义如下:
字段 | 类型 | 说明 |
---|---|---|
data | TransactionReceiptData | 交易回执中所有用于计算哈希的字段编码数据 |
dataHash | vector |
交易回执编码 |
区块与交易相关数据结构的设计保证FISCO BCOS具备校验数据完整性功能。区块hash、交易默克尔树根、收据默克尔树根、状态默克尔树根、父块信息等字段,可以有效的验证区块的有效性与完整性,防止数据被篡改。 并且,用户可通过在控制台调用相关接口获取区块信息,校验数据一致性。
4.4 原生交易¶
FISCO BCOS实现了基于solidity合约与预编译版的smallBank合约。smallBank源于blockBench,被业界与学术界公认为区块链系统基础测试之一,FISCO BCOS将smallBank实现了账户间实现转账的交易定义为原生交易。 通过部署合约smallBank,最终与EVM中执行。smallBank也提供预编译合约方式,通过调用smallBank预编译合约地址即可实现。