10.25. push汇总 - Agzs/geth-pbft-study GitHub Wiki

pbft.go

1、删除之前自定义的moveStore()函数,采用fabric自带的moveWaterMark()

2、pbft的New()函数的参数从四个改为三个,删除的configVloadConfig()中加载,pbftCore的newPbftCore保持不变。

3、主节点账户签名问题,使用判断语句,不是主节点无法进行Sign()

4、将PBFT的函数入口改为recvRequestBlock(),在该函数中先进行一系列检查,合法后调用sendPrePrepare()

c.pbft.recvRequestBlock(newBlock)
//=> c.pbft.sendPrePrepare(newBlock)

5、将lastExec暂时用共识成功的区块号赋值,即在收到finshedChan中有数据时,将newBlocknumber赋值给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、恢复一些结构体,如checkpointMessagestateUpdateTarget,这些结构体的使用待完善。。。

2、在pbftCore中添加helper成员变量,类型为Helper,定义在新添加的helper.go中,处理databaseblockchainmanager, 该成员变量的初始化比较特殊:其成员变量manager在pbft.go的New()中初始化, helper.manager == pbft.manager == protocolManager.pbftManagerblockchainHelper在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.engineCreateConsensusEngine()初始化,原先该函数需要protocolManager这个参数,而protocolManager需要在初始化engine之后才能被初始化,两者相互矛盾。

解决方法:保持CreateConsensusEngine()参数不变,将pbftcommnChanmanager赋值给protocolManager的操作放到NewProtocolManager()中;在NewProtocolManager()中,通过判断engine是否为PBFT进行赋值:

    if pb, ok := engine.(*pbft.PBFT); ok {
	manager.commChan = pb.GetCommChan()  
	manager.pbftmanager = pb.GetManager() 
    }

此外,blockchainHelper的初始化操作也发生在backend.goNew()函数中:

    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 报错