Skip to content

Hyperledger fabric PBFT consensus #2

wanzhiguo edited this page Sep 27, 2017 · 5 revisions

VP节点命名规则

Fabric采用了viper工具进行系统配置,viper可以读取配置文件,环境参数,以及命令行参数,对系统节点等对象进行配置。 Fabric的主要配置文件为peer/core.yaml,该文件配置了VP节点的ID,consensus算法等参数。

在PBFT算法中,每个节点有一个ValidatorID,该ID来自于core.yaml配置的ID,比如core.yaml中设置的ID为vp0, 则PBFT中该节点的ID为0,以此类推。具体可见pbft.go文件中的下列函数:

// Returns the uint64 ID corresponding to a peer handle
func getValidatorID(handle *pb.PeerID) (id uint64, err error) {
	// as requested here: https://github.com/hyperledger/fabric/issues/462#issuecomment-170785410
	if startsWith := strings.HasPrefix(handle.Name, "vp"); startsWith {
		id, err = strconv.ParseUint(handle.Name[2:], 10, 64)
		if err != nil {
			return id, fmt.Errorf("Error extracting ID from \"%s\" handle: %v", handle.Name, err)
		}
		return
	}

	err = fmt.Errorf(`For MVP, set the VP's peer.id to vpX,
		where X is a unique integer between 0 and N-1
		(N being the maximum number of VPs in the network`)
	return
}

其中注明了“For MVP, set the VP's peer.id to vpX, where X is a unique integer between 0 and N-1”。

PBFT Request and Message

  • PBFT中,每一个request中包涵一个tx,使用txToRequest将tx封装成Request;
  • RequestBatch包涵多个Requests, obcBatch中的BatchStore也是多个Request组成;
  • Request发送到primary node,由primary node发起PBFT共识过程。

ProtocolBuffer

  • PBFT 中使用ProtocolBuffer对发送的消息进行定义,定义在message.proto文件,然后使用proton进行编译,得到message.pb.go文件。