2017.10.12 viewchange中的sign和verify - Agzs/geth-pbft-study GitHub Wiki

注释采用//=> --Agzs,所以在vscode中搜索Agzs//=>可以查看我的修改, //=>TODO可搜索待完成操作。

[2017/10/12]

1、consensus/pbft/pbft-core.go

  • 注释internalLock sync.Mutex,在fabric中没有任何使用情况。

  • 在pbftCore结构体中添加PBFT中的signersignerFnlock三个变量,用于保存签名函数(用于viewChange)。

  • 修改PrePrepare中的BatchDigest -> BlockHashRequestBatch -> Block

2、consensus/pbft/pbft.go

  • 改写sigHash()函数,添加types.ViewChange参数,使其可以根据nil同时处理types.Headertypes.ViewChange

  • Authorize()函数中,添加对pbftCore.signerpbftCore.signerFn的赋值,同样用于后期viewChange.gosign()函数对于viewChange签名。

  • 增加ecrecoverFromSignature(viewchange)函数,用于从viewchange.Signature中恢复signer

  • 增加pbftCore方法verifyViewChangeSig(viewchange),用于验证viewchange的签名,比较viewchange.Signer和调用ecrecoverFromSignature(viewchange)获取的signer是否相同。

3、eth/backend.go

StratMining()中仿照clique添加PBFT分支操作

4、eth/downloader/downloader.go

若提示错误如下:

file: 'file:///home/zhiguo/go/src/github.com/yeongchingtarn/geth-pbft/eth/downloader/downloader.go'
severity: 'Error'
message: 'cannot use headerInMeter (type "github.com/ethereum/go-ethereum/vendor/github.com/rcrowley/go-metrics".Meter) as type "github.com/rcrowley/go-metrics".Meter in argument to d.deliver:
	"github.com/ethereum/go-ethereum/vendor/github.com/rcrowley/go-metrics".Meter does not implement "github.com/rcrowley/go-metrics".Meter (wrong type for Snapshot method)
		have Snapshot() "github.com/ethereum/go-ethereum/vendor/github.com/rcrowley/go-metrics".Meter
		want Snapshot() "github.com/rcrowley/go-metrics".Meter'
at: '1471,2'
source: ''

解决方法:找到github.com/ethereum/go-ethereum/vendor,删除vendor文件即可

5、eth/handler.go

pm.peers更改为pm.peerSet.peers,因为在pm中存在peers成员变量,而pm.peers中也存在peers成员变量,若=>p表示包含关系,则peer=>peers=>peerSet=>pm,SendMsg(msg)peer的方法,不是peerSet的方法。

6、consensus/pbft/viewchange.go

  • 修改processNewView2()中存在的一些已知错误,可通过vscode查找=>查看

  • 改写所有的instance.sign(vc)instance.verify(vc)的调用,可参考代码中的注释

7、core/types/pbft_messages.go

  • ViewChange结构体中添加Signer成员变量和其相应的方法,保存viewchange的签名者,用于后期验证签名时进行比较。

summary

  • 根据vscode提示的一些已知错误,进行修改。

  • 重写viewchange中用到的sign和verify

大体思路:参照clique中的signverify函数进行仿写,由于clique中的sign只有授权节点可调用,并且作为clique的成员变量signerFn保存起来,而在pbft中,viewchange的涉及这两个函数的调用发生在pbftCore的方法中,所以目前将pbftpbftCore中都增加signersignerFn成员变量;由于后期需要验证签名,clique是通过恢复signer,验证signer来验证签名的,但是涉及到snapshot(该机制尚未深究),目前验证签名的方法是:在viewchange中增加signer成员变量,在signer签名之前将signer保存到viewchange中,将其作为一部分进行签名,后期通过具体的签名恢复signer,比较这两个signer是否相同来验证签名。注:具体的签名恢复signer算法直接调用了clique中的方法,尚未验证和测试。