chain_plugin插件的实现细节上篇

上几篇文章我们已经对EOS所采用的DPOS+BFT共识算法进行了详细介绍,相信各位朋友已经有了一个详细的认识,接下来我们将对EOS项目源码中第一个关键模块——插件模块,进行详细的分析与介绍,这篇文章,我们将分两篇介绍节点运行时默认开启的四大插件中第一个关键插件——chain_plugin。(本篇主要罗列所有函数与数据结构,下篇选择关键函数重点介绍代码逻辑)

1、chain_plugin插件总览

我们已经介绍过nodeos节点运行时,会默认开启四个插件:chain_plugin、http_plugin、net_plugin和produce_plugin。这四个插件实现了EOS节点运行中关键功能,其中chain_plugin是处理和聚合EOSIO节点上的链数据所需的核心插件。首先对chain_plugin代码进行剖析,主要可分为三个部分:

关键数据结构:定义了一些关键的链上数据结构,如权限、账户等;

read_only:只读函数,主要用于读取EOS区块链上信息,如账户详情、出块节点身份等;

read_write:读写函数,主要用于push交易信息上链;

下面详细展开介绍这四部分。

2、关键数据结构

首先我们介绍一下该插件中定义的关键数据结构:

【权限结构】:该结构保存返回某账户的权限结构,包括待查询账户名(perm_name)、父账户名(parent)、该账户权限等级(required_auth)。

【区块链基本信息结构】:该结构用于返回当前节点运行的区块链基本信息,包括版本号、链id、区块高度、最新不可逆区块高度与ID、区块id、区块时间戳、区块的生产者、区块CPU和NET消耗。

【区块生产者信息结构】:该结构用于返回出块节点基本信息,其中name定义位于contracts/eoslib/types.hpp文件中。

【账户基本信息结构】:该结构用于返回某账户的基本信息,其中包括账户名、该节点上一个生产的区块高度以及出块时间、该节点上次部署合约时间、该账户ram、net和cpu余额、该账户权限分配情况、该账户余额值、该账户投票情况。

【智能合约信息结构】:该结构用于返回某智能合约的基本信息,包括账户名、该合约wast格式文件、该合约wasm格式文件、该合约hash值、该合约abi文件,以及一些指定格式的返回结果,如json格式、合约action详情。

【交易被签署的公钥结构】:该结构用于存储指定交易的签名公钥。

【数据表结构】:该结构用于存储某数据表中的基本信息,包括数据表名称、智能合约账户、表作用域、升降序情况等。

【账户余额结构】:该结构用于存储某代币的基本信息,包括某账户拥有的某代币余额、某种代币的发行总量、最大供应量等信息。

【出块节点基本结构】:该结构用于存储当前区块链中出块节点的基本信息,包括出块节点的得票情况、当前出块节点账户名等。

3、read_only只读函数

这部分函数主要用于读取区块链上数据,并要求不能对链上数据有任何修改,主要包括:

get_info():根据参数返回相关基本信息;

get_table_index_name():根据参数返回表数据,其中可以指定参数的key类型;

get_currency_balance():检索指定账户的代币数量;

get_currency_stats():检索指定代币的发行情况;

get_producers():检索指定出块节点基本信息,如投票情况等;

get_producer_schedule():检索当前网络出块节点列表;

get_block_header_state():返回指定区块状态;

get_scheduled_transactions():返回指定交易信息;

get_block():返回指定区块基本信息;

4、read_write读写函数

这部分函数主要用于对区块链上数据进行提交与修改,要求对链上数据有修改,主要包括:

push_block():向区块链网络提交区块,主要包括自生产的区块以及验证过的区块;

push_transaction():向区块链网络提交交易数据,主要包括自发起的交易信息以及验证过的交易信息;

push_recurse():递归的向区块链网络提交交易数据,重复执行push_transaction()函数。

EOS源码框架剖析系列于每周一定期推出,本篇我们对chain_plugin插件的基本框架进行了详细罗列,下一篇,我们将选择chain_plugin插件中的关键函数进行详细剖析,帮助大家理解该插件代码的实现逻辑,关注获得更多价值文章!

加入EOS开发者社区

微信扫码加群秘进群

更多有价值的悄悄话,欢迎加入知识星球

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180813G1D50E00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券