源代码解读 [EOS 源码分析] 21 - EOS 区块的数据结构 (下)

Admin · 2019年12月21日 · 110 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

接上篇,EOS区块的数据结构(上)

EOS区块的数据结构

block_header

继续看EOS区块的基类block_header的源码(eos/libraries/chain/include/eosio/chain/block_header.hpp):

img

block_header中除了定义了EOS区块结构的基本属性外,还定义了一些成员函数:

block_header() = default;

digest_type       digest()const;
block_id_type     id() const;
uint32_t          block_num() const { return num_from_id(previous) + 1; }
static uint32_t   num_from_id(const block_id_type& id);

vector<block_header_extensions> validate_and_extract_header_extensions()const;

这些成员函数实现在eos/libraries/chain/block_header.cpp中:

1、digest(获取摘要)

摘要就是对区块本身进行哈希运算得到的哈希值,digest函数源码如下:

img

直接返回了this指针的哈希值。

digest_type是一个类型别名,本质上是fc::sha256类型:

using digest_type         = checksum_type;    
using checksum_type       = fc::sha256;

2、num_from_id(从区块ID获取区块号)

num_from_id函数定义如下:

img

EOS区块号是通过区块ID的哈希值的一部分计算得出的。

3、block_num(获取当前区块的区块号)

在block_header.hpp中就实现了此成员函数:

uint32_t block_num() const { 
  return num_from_id(previous) + 1;
}

4、id(获取当前区块的ID)

实现算法如下:

img

5、validate_and_extract_header_extensions(验证和提取区块头的扩展数据)

实现代码如下:

img

signed_block_header

signed_block_header(签名的区块头)是block_header的子类,扩展了一个成员变量:

img

producer_signature是区块生产者对该区块的签名,signature_type是一个类型别名:

using signature_type   = fc::crypto::signature;

fc::crypto::signature是EOSIO定义的签名类,是比较底层的内容,后续再介绍。

signed_block

signed_block(签名的区块)是signed_block_header的子类,定义如下:

img

声明了一系列构造函数和拷贝赋值函数,还扩展了两个成员变量:

1、transactions(交易列表)

这里的交易列表是一个transaction_receipt对象的集合,transaction_receipt可以理解为是transaction经过多层包装后形成的数据。

关于transaction和transaction_receipt,放到单独的文章中进行介绍。

2、block_extensions(区块的扩展数据)

类型和区块头扩展数据的类型一样,都是extensions_type。

更多内容

币圈信息站开发目录

####EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 17:49
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册