geth共识替换方法

本文档基于geth v1.9.25 stable。目前内容基于代码阅读,还没有实际应用来检验。未来可能会进行修补。

创世块

在创世块中,config中的一个字段指示了链所用的共识算法,以及该算法所需的参数:

{"config": {"chainId": 114514,"clique": {"period": 5,"epoch": 30000},
...

创世块的config字段会被解析为在params/config.go中定义的ChainConfig

为了支持在创世块中配置新的共识算法,需要在该类中增加属性,并通过标签指示和JSON字段的对应关系,如:

MyBft         *MyBFTConfig         `json:"mybft,omitempty"`

在上面的例子中,MyBFTConfig为一个我们自己定义的类,其中包含我们要实现的共识所需的属性

共识算法判断

在读取创世块配置后,一个指向params.ChainConfig的指针会被传到eth/backend.go中的CreateConsensusEngine方法

// CreateConsensusEngine creates the required type of consensus engine instance for an Ethereum service
func CreateConsensusEngine(stack *node.Node, chainConfig *params.ChainConfig, config *ethash.Config, notify []string, noverify bool, db ethdb.Database) consensus.Engine {// If proof-of-authority is requested, set it upif chainConfig.Clique != nil {return clique.New(chainConfig.Clique, db)}// Otherwise assume proof-of-work...

该方法需要根据传入的链配置,返回一个实现了consensus.Engine接口的对象。我们在其中增加一个if,构造自己实现的对象即可。关于该接口的细节详见下文

consensus.Engine

共识的核心接口,包含了有关提出区块、验证区块等的各种方法。新的共识算法需要实现下面的全部方法。

对于实现接口的包如何组织文件,并没有要求

提出本地区块

Prepare

在向新区块中添加交易前,会被调用,来向Header中填充交易无关的已知字段

FinalizeAndAssemble

区块塞满交易后会被调用。若区块中的交易除了本身的转账和合约运行外,还通过其他方式(比如blockDAG中的区块奖励)对状态有影响,应该在这里更新状态数据库。在此之后,将不完整的区块头和区块交易列表等组装为待Seal的区块并返回

如果我们并不需要额外更新状态,用types.NewBlock(header, txs, uncles, receipts, new(trie.Trie))就可以完成组装

Seal

组装好的区块发布前要做的工作。该方法异步返回,在完全准备好区块后才通过channel将区块交给上层

若我们要实现BFT共识中,需要进行额外的节点通信来获得多签。注意到event/event.go中,Post方法可以用于广播数据

验证外来区块

VerifySeal

验证一个区块头是否满足共识中的密码学要求(如PoW中哈希是否符合难度限制,以及PoA中验证签名)

之所以将密码学验证从区块中验证中提取出来,是因为geth支持Ultra Light Client (ULC)模式,该模式需要尽可能避免复杂计算

VerifyHeader

大多数情况下,该方法检查从外界收到的区块头是否合法(考虑共识、时间戳、分叉等因素)

该方法有一个bool类型的参数seal,当seal为false时,最好避免运行VerifySeal中的密码学检查

VerifyHeaders

一次性验证一批区块头,允许并发(当然也可以不并发)

在Quorum的IBFT中,以及原生的Clique中,都没有进行并发验证,原因未知。为了保险我们最好也不要并发了

verifyUncles

ethash中的BlockDAG有关

我们不需要考虑,直接通过就好

Finalize

若外来区块中的交易除了本身的转账和合约运行外,还通过其他方式(比如blockDAG中的区块奖励)对状态有影响,应该在这里更新状态数据库

我们应该不需要在这里做任何事

其他

Author

输入块头,返回一个地址:在PoW中为块的Coinbase受益者,在PoA中可以自定义为其他地址,如共识中的某个签名者。

作为块的上下文,智能合约可能会使用该属性,因此需要保证一个块打包后,在不同节点上能得到相同的Author

APIs

返回共识特有的RPC-API,用于注册到RPC服务器

这里参考consensus/ethash/api.goconsensus/ethash/ethash.go写就行

CalcDifficulty

因为types.block.goHeader类中,将Difficulty写死在了区块头数据结构里,所以我们必须给每个区块设定一个难度值

在非PoW的共识中,可以像QuorumIBFT一样直接返回0,也可以活用这一块空间放点东西,比如Clique就用它来表示是否"in turn"

SealHash

输入一个未签名区块头,返回它的哈希

注意传入的区块头可能是带签名的,此时要主动去掉签名部分

geth共识替换方法相关推荐

  1. python replace函数用法_Python实现的从右到左字符串替换方法示例

    本文实例讲述了Python实现的从右到左字符串替换方法.分享给大家供大家参考,具体如下: 一 . 前言 需要用到,但是发现python没有从右边开始替换的内置方法,默认的replace只是从左边开始, ...

  2. Python基础入门:正则re.sub使用自定义替换方法

    在使用正则替换时,有时候需要将匹配的结果做对应处理,便可以使用自定义替换方法. re.sub的用法为: re.sub('匹配表达式',替换字符或替换函数,替换次数,其他参数) 例如,加入将字符串中的$ ...

  3. python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析

    本文实例讲述了Python字符串拼接.截取及替换方法.分享给大家供大家参考,具体如下: python字符串连接 python字符串连接有几种方法,我开始用的第一个方法效率是最低的,后来看了书以后就用了 ...

  4. 其中一个页签慢_Word中如何快速定位到页、行、表格、公式,查找与替换方法...

    如果一个文档有几百页甚至上千页,要通过拖动滑块定位到某页将是十分不易的事,拉多了又过了,拉少了又离得太远.如果用 Word 2016 提供的定位功能,定位到某页将变得十分容易的事,并且速度相当快,瞬间 ...

  5. WebMvcConfigurerAdapter过时的替换方法

    WebMvcConfigurerAdapter过时的替换方法 Spring 5.0后,WebMvcConfigurerAdapter被废弃,取代的方法有两种: ①implements WebMvcCo ...

  6. Python3.x字符串替换方法replace()、maketrans()和translate()

    Python中replace()函数,类似于"查找与替换"功能 语法格式如下: str.replace(old, new[, max]) 其方法把字符串中的 old(旧字符串),替 ...

  7. jQuery学习(十)—替换方法

    jQuery学习(十)-替换方法 一. replaceAll方法 作用:用jQuery对象替换掉所有的元素 格式:元素1.replaceAll(元素2); 注意:元素2可以是jQuery对象或者选择器 ...

  8. 恺撒密码是古罗马恺撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:

    题目: 恺撒密码是古罗马恺撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下: 原文:A B C D ...

  9. Cesium近景蓝色晴空万里天空盒子替换方法源码及图片资源-实测可用

    最近看着Cesium默认的近景天空就觉得心情有点灰暗和压抑,看到有的平台的天空是蓝天白云非常的养眼,就尝试这更改下,原来Cesium提供的天空盒子是远景的,近景的话,就是蓝白色的天空 测试的版本:Ce ...

最新文章

  1. 用.NET创建Windows服务
  2. 用eclipse在windows下搭建cocos2d-x开发环境
  3. Spring OXM-XStream转换器
  4. django language_Python+Django— 入门通关(三)| admin:后台管理界面
  5. java中如何getchar_是否有与getchar等效的Java?
  6. 江西冶金职业技术学院计算机,计算机基础知识江西冶金职业技术学院.ppt
  7. angular源码分析之platformBrowserDynamic
  8. redis list放入对象_Redis从入门到入土:详细讲解内存模型以及常用命令
  9. C语言Ip获取mac,C语言怎么实现Windows下获取IP和MAC地址?
  10. 增强学习 | AlphaGo背后的秘密
  11. NCRE | 四级网络工程师错题
  12. 计算机文化基础(高职高专版 第十一版)第二章答案
  13. 恒流LED升压驱动芯片2.5V~24V输入【待机功耗低 电流精度高3%】惠海半导体H6911方案分析
  14. Bumped! 2017 ICPC North American Qualifier Contest (分层建图+dijstra)
  15. scipy中的imread,imresize怎么用
  16. 网站服务器迁移耗时,网站迁移,整体服务器网站迁移步骤方案
  17. 【PCB设计】Mac系统Autodesk EAGLE PCB使用入门教程
  18. 淘宝商品评价api接口,淘宝评论视频API接口,淘宝评论API接口(app、h5端)
  19. swank: (too proud or confident) 炫耀;卖弄 to behave in way that is too proud or confident
  20. Centos7下下载git

热门文章

  1. html横打和竖打如何设置,打印机的横打和竖打设置
  2. 从月薪 7.5K 再到拿到字节跳动 20K*14 薪那天,我泪目了,没人知道我付出了多少
  3. AxureRP8实战手册-案例27(字符串函数:手机号码验证①)
  4. js上传视频并获取视频帧做为封面
  5. Windows server 2016安装OpenSSH Server
  6. 创业投资——证券分析
  7. dbus PHP,没有$DISPLAY的X11,Dbus PHP无法启动dbus-daemon
  8. linux kde桌面 配置,自定义kde桌面配置并发布
  9. https配置问题:当前网站证书不可信且证书长度为1,可能是服务器没有配置完整的证书链
  10. 计算机学院元旦晚会主持词,元旦晚会主持词_2017最新【开场白|节目串词】-太平洋电脑网...