10.25. push汇总 - Agzs/geth-pbft-study GitHub Wiki
pbft.go
1、删除之前自定义的moveStore()函数,采用fabric自带的moveWaterMark()。
2、pbft的New()函数的参数从四个改为三个,删除的configV从loadConfig()中加载,pbftCore的newPbftCore保持不变。
3、主节点账户签名问题,使用判断语句,不是主节点无法进行Sign()。
4、将PBFT的函数入口改为recvRequestBlock(),在该函数中先进行一系列检查,合法后调用sendPrePrepare()
c.pbft.recvRequestBlock(newBlock)
//=> c.pbft.sendPrePrepare(newBlock)
5、将lastExec暂时用共识成功的区块号赋值,即在收到finshedChan中有数据时,将newBlock的number赋值给lastExec
6、新建一些函数,用于修改pbft的成员变量,以解决protocolManager初始化。
func (c *PBFT) SetBlockChainHelper(bc *core.BlockChain) { c.pbft.helper.blockchainHelper = bc }
func (c *PBFT) GetCommChan() chan *types.PbftMessage { return c.commChan }
func (c *PBFT) GetManager() events.Manager { return c.manager }
pbft-core.go
1、恢复一些结构体,如checkpointMessage、stateUpdateTarget,这些结构体的使用待完善。。。
2、在pbftCore中添加helper成员变量,类型为Helper,定义在新添加的helper.go中,处理database、blockchain、manager,
该成员变量的初始化比较特殊:其成员变量manager在pbft.go的New()中初始化, helper.manager == pbft.manager == protocolManager.pbftManager,blockchainHelper在eth/backend.go的New()中初始化以获得当前blockchain
3、恢复pbftCore中其他成员变量,及这些成员变量所涉及的函数,恢复的函数全部标记为//=>TODO. --Agzs,部分成员变量尚存在逻辑错误。
4、在processEvent()中恢复case stateUpdatedEvent:,及其涉及的函数,逻辑过程尚存在逻辑错误
5、恢复recvRequestBlock(),将其作为PBFT共识的入口,该函数间接调用sendPrePrepare()
pbft/util.go
将hash()注释,其他文件中所有涉及hash(block)的操作,全部替换为block.Hash().Str()
viewchange.go
恢复viewchange中所涉及的其他函数,若其原先为instance.consumer.XXX(),现以全部更换为instance.helper.XXX(),这些函数都定义在helper.go中
blockchain.go
在该文件中自定义了两个函数GetBlockchainInfo()、getBlockchainInfoForBlock(),将blockchain中的currentBlock看作lastBlock,以获取BlockchainInfo类型数据。
方法的调用通过之前blockchainHelper进行调用
pbft_messages.go
恢复了PbftMessage_FetchBlockMsg结构体及其相关函数,该结构体的使用尚未深究,待完善。。。
backend.go
eth.engine由CreateConsensusEngine()初始化,原先该函数需要protocolManager这个参数,而protocolManager需要在初始化engine之后才能被初始化,两者相互矛盾。
解决方法:保持CreateConsensusEngine()参数不变,将pbft中commnChan和manager赋值给protocolManager的操作放到NewProtocolManager()中;在NewProtocolManager()中,通过判断engine是否为PBFT进行赋值:
if pb, ok := engine.(*pbft.PBFT); ok {
manager.commChan = pb.GetCommChan()
manager.pbftmanager = pb.GetManager()
}
此外,blockchainHelper的初始化操作也发生在backend.go的New()函数中:
if pb, ok := eth.engine.(*pbft.PBFT); ok {
pb.SetBlockChainHelper(eth.blockchain) //=> add for get blockchain
}
handler.go
修改了一些存在的语法错误
其他
修改包的导入,将部分hyperledger或ethereum的包更换为geth-pbft的包,以解决import cycle not allowed 报错