[eos30]nodeos-插件
https://developers.eos.io/manuals/eos/latest/nodeos/plugins/index
1, 概述
nodeos是模块化设计,可以通过添加插件具备某功能。有些插件是必须的,例如chain_plugin,net_plugin和producer_plugin。其他插件是可选的。不像运行时插件,nodeos插件是在编译期构建的。(不是很理解啥叫编译期构建?)
另外,插件之间是有依赖关系的,例如chain_api_plugin依赖chain_plugin和http_plugin。
2, 插件
2.1 chain api plugin
通过由http plugin管理的RPC API接口暴露chain plugin的功能。
2.2 chain plugin
核心必须插件,用于处理,整合链上数据。
2.3 http client plugin
依赖producer plugin,是一个内部公用插件,向producer plugin提供安全使用外部keosd实例作为块签名者的能力。
就是通过这个插件,producer plugin就可以通过keosd使用块签名的能力。
2.4 http plugin
同时被nodeos和keosd支持的核心插件。被任何需要对外提供RPC API功能的插件所依赖,如各种xxx_api_plugin。
2.5 login plugin
允许nodeos验证某个账户是否满足特定的权限要求,只有满足才能登陆并操作。
2.6 net api plugin
通过以上可知,依赖http plugin,暴露net plugin的功能。
2.7 net plugin
net plugin在之前学习网络协议时提到过,参考:https://www.jianshu.com/p/bef00e1d98fc
提供授权的p2p协议,来持续在节点之间同步数据。
The net_plugin provides an authenticated p2p protocol to persistently synchronize nodes.
2.8 producer api plugin
依赖http plugin,暴露producer plugin功能
2.9 producer plugin
顾名思义,用于生产区块。
见第3章节
2.10 state history plugin
用于获取关于区块链状态的历史数据。从对等节点接收数据,并缓存到文件中。
插件监听socket以获取应用程序连接,并根据启动nodeos时指定的插件选项将区块链数据发回。
3, 块生产相关说明
根据不同的块生成相关参数,会有不同的通信结果。
基本概念:
m = max_block_cpu_usage
t = block-time
e = last-block-cpu-effort-percent
w = block_time_interval = 500ms
a = produce-block-early-amount = (w - w*e/100) ms
p = produce-block-time; p = t - a
c = billed_cpu_in_block = minimum(m, w - a)
n = network tcp/ip latency
假定场景:
BP-A will send block at p and,
BP-B needs block at time t or otherwise will drop it.
If BP-Ais producing 12 blocks as follows b(lock) at t(ime) 1, bt 1.5, bt 2, bt 2.5, bt 3, bt 3.5, bt 4, bt 4.5, bt 5, bt 5.5, bt 6, bt 6.5 then BP-B needs bt 6.5 by time 6.5 so it has .5 to produce bt 7.
Please notice that the time of bt 7 minus .5 equals the time of bt 6.5 therefore time t is the last block time of BP-A and when BP-B needs to start its first block.
例子1:
BP-A has 50% e, m = 200ms, c = 200ms, n = 0ms, a = 250ms: BP-A sends at (t-250ms) <-> BP-A-Peer processes for 200ms and sends at (t - 50ms) <-> BP-B-Peer processes for 200ms and sends at (t + 150ms) <-> arrive at BP-B 150ms too late.
大概意思就是,A在t-250ms的时间将bt 6.5块发送出去,A-Peer处理耗费了200ms,时间变成t-50ms,B-Peer处理耗费200ms,时间变成t+150ms, 然后到达B
A提前250ms将bt 6.5发送出去。