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中的signer、signerFn、lock三个变量,用于保存签名函数(用于viewChange)。 -
修改PrePrepare中的
BatchDigest -> BlockHash和RequestBatch -> Block
2、consensus/pbft/pbft.go
-
改写
sigHash()函数,添加types.ViewChange参数,使其可以根据nil同时处理types.Header和types.ViewChange -
在
Authorize()函数中,添加对pbftCore.signer和pbftCore.signerFn的赋值,同样用于后期viewChange.go中sign()函数对于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中的sign和verify函数进行仿写,由于clique中的sign只有授权节点可调用,并且作为clique的成员变量signerFn保存起来,而在pbft中,viewchange的涉及这两个函数的调用发生在pbftCore的方法中,所以目前将pbft和pbftCore中都增加signer和signerFn成员变量;由于后期需要验证签名,clique是通过恢复signer,验证signer来验证签名的,但是涉及到snapshot(该机制尚未深究),目前验证签名的方法是:在viewchange中增加signer成员变量,在signer签名之前将signer保存到viewchange中,将其作为一部分进行签名,后期通过具体的签名恢复signer,比较这两个signer是否相同来验证签名。注:具体的签名恢复signer算法直接调用了clique中的方法,尚未验证和测试。