geth共识替换方法

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 up
	if 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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以太坊是一个平台,它上面提供各种模块让用户来搭建应用,如果将搭建应用比作造房子,那么以太坊就提供了墙面、屋顶、地板等模块,用户只需像搭积木一样把房子搭起来,因此在以太坊上建立应用的成本和速度都大大改善。具体来说,以太坊通过一套图灵完备的脚本语言(Ethereum Virtual Machinecode,简称EVM语言)来建立应用,它类似于汇编语言。我们知道,直接用汇编语言编程是非常痛苦的,但以太坊里的编程并不需要直接使用EVM语言,而是类似C语言、Python、Lisp等高级语言,再通过编译器转成EVM语言。上面所说的平台之上的应用,其实就是合约,这是以太坊的核心。合约是一个活在以太坊系统里的自动代理人,他有一个自己的以太币地址,当用户向合约的地址里发送一笔交易后,该合约就被激活,然后根据交易中的额外信息,合约会运行自身的代码,最后返回一个结果,这个结果可能是从合约的地址发出另外一笔交易。需要指出的是,以太坊中的交易,不单只是发送以太币而已,它还可以嵌入相当多的额外信息。如果一笔交易是发送给合约的,那么这些信息就非常重要,因为合约将根据这些信息来完成自身的业务逻辑。合约所能提供的业务,几乎是无穷无尽的,它的边界就是你的想象力,因为图灵完备的语言提供了完整的自由度,让用户搭建各种应用。白皮书举了几个例子,如储蓄账户、用户自定义的子货币等。 2013年年末,以太坊创始人Vitalik Buterin发布了以太坊初版白皮书,启动了项目。2014年7月24日起,以太坊进行了为期42天的以太币预售。2016年初,以太坊的技术得到市场认可,价格开始暴涨,吸引了大量开发者以外的人进入以太坊的世界。中国三大比特币交易所之二的火币网及OKCoin币行都于2017年5月31日正式上线以太坊。 [1] 自从进入2016年以来,那些密切关注数字货币产业的人都急切地观察着第二代加密货币平台以太坊的发展动向。作为一种比较新的利用比特币技术的开发项目,以太坊致力于实施全球去中心化且无所有权的的数字技术计算机来执行点对点合约。简单来说就是,以太坊是一个你无法关闭的世界计算机。加密架构与图灵完整性的创新型结合可以促进大量的新产业的出现。反过来,传统行业的创新压力越来越大,甚至面临淘汰的风险。比特币网络事实上是一套分布式的数据库,而以太坊则更进一步,她可以看作是一台分布式的计算机:区块链是计算机的ROM,合约是程序,而以太坊的矿工们则负责计算,担任CPU的角色。这台计算机不是、也不可能是免费使用的,不然任何人都可以往里面存储各种垃圾信息和执行各种鸡毛蒜皮的计算,使用它至少需要支付计算费和存储费,当然还有其它一些费用。最为知名的是2017年初以摩根大通、芝加哥交易所集团、纽约梅隆银行、汤森路透、微软、英特尔、埃森哲等20多家全球top金融机构和科技公司成立的企业以太坊联盟。而以太坊催生的加密货币以太币近期又成了继比特币之后受追捧的资产。  智能合约的潜在应用很多。彭博社商业周刊称它是“所有人共享但无法篡改的软件”。更高级的软件有可能用以太坊创建网络商店。区块链程序以太坊可以用来创建去中心化的程序、自治组织和智能合约,据纽约时报的报导,在2016年5月已经有数十个可用的程序。预期的应用目标涵盖金融、物联网、农田到餐桌(farm-to-table)、智能电网、体育,菠菜等。去中心化自治组织有潜力让许多原本无法运行或成本过高的营运模型成为可能。较知名的应用有:去中心化创业投资:The DAO用以太币资金创立,目标是为商企业和非营利机构创建新的去中心化营业模式、The Rudimental让独立艺术家在区块链上进行群众募资。社会经济平台:Backfeed。去中心化预测市场:Augur。物联网:Ethcore(一间以太坊公司)研发的客户端、Chronicled(一间区块链公司)发表了以太坊区块链的实物资产验证平台;芯片公司、物理IP创建者和生产者可以用植入的蓝牙或近场通信进行验证。Slock.It开发的智能锁可以在付费后自动打开,让用户在付费后可以帮电动车充电、或是打开租屋的房门。虚拟宝物交易平台:FreeMyVunk。版权授权:Ujo Music平台让创作人用智能合约发布音乐,消费者可以直接付费给创作人。伊莫珍·希普用此平台发布了一首单曲。智能电网:TransActive Grid让用户可以和邻居买卖能源。去中心化期权市场:Etheropt。钉住汇率的代币:DigixDAO提供与黄金挂钩的代币,在2016年四月正式营运。Decentralized Capital提供和各种货币挂钩的代币。移动支付:Everex让外劳汇款回家乡。客户端软件以太坊的两个主要的客户端软件是Geth和Parity。企业软件企业软件公司也正测试用以太坊作为各种用途。已知有兴趣的公司包括微软、IBM、摩根大通。德勤和ConsenSys在2016年

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值