pbft

package
v0.1.28 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 22, 2025 License: AGPL-3.0 Imports: 13 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var MemCache = cache.NewMemCache("pbft", 0, 0)

Functions

This section is empty.

Types

type PbftConsensus

type PbftConsensus struct {
	consensus.Consensus
}

func GetPbftConsensus

func GetPbftConsensus() *PbftConsensus

func (*PbftConsensus) ReceiveCommited

func (this *PbftConsensus) ReceiveCommited(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)

*

  • 节点接收其他节点的commit消息,消息的payload为PbftConsensusLogEO *
  • 节点会收到节点发的commit消息,等于commitNumber即可 *
  • 计算commit的节点数目,满足以上条件,表示可以commit,直接向客户端发送提交成功消息 *
  • 主节点和副本节点收到COMMIT消息,需要进行以下交验: *
  • a. 副本节点COMMIT消息签名是否正确。 *
  • b. 当前副本节点是否已经收到了同一视图v下的n。 *
  • c. d与m的摘要是否一致。 *
  • d. n是否在区间[h, H]内。 *
  • 非法请求丢弃。如果副本节点i收到了2f+1个验证通过的COMMIT消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作o,并返回<REPLY,
  • v, t, c, i,
  • r>给客户端,r:是请求操作结果,客户端如果收到f+1个相同的REPLY消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的COMMIT消息到log中。

func (*PbftConsensus) ReceiveConsensus

func (this *PbftConsensus) ReceiveConsensus(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)

*

  • 只有主节点才能收到客户端的共识请求,这个请求一般是交易请求,消息payload为BlockEO * *
  • Block包含交易列表和参与者的秘钥,交易列表的负载时加密过的String, *
  • 参与者列表的第一条记录就是客户端的记录 *
  • 交易列表包含客户端的签名 *
  • 加密的秘钥是客户端和交易参与者的公钥加密共享临时秘钥 *
  • 本方法是Pbft共识算法的起点,传来的交易消息被转换成共识日志信息 * *
  • 客户端c向主节点p发送<REQUEST, o, t, c>请求。o: 请求的具体操作,t: 请求时客户端追加的时间戳,c:客户端标识。REQUEST:
  • 包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名 *
  • a. 客户端请求消息签名是否正确。非法请求丢弃。正确请求,分配一个编号n,编号n主要用于对客户端的请求进行排序。 *
  • 然后广播一条<<PRE-PREPARE, v, n, d>, m>消息给其他副本节点。v:视图编号,d客户端消息摘要,m消息内容。 *
  • <PRE-PREPARE, v, n, d>进行主节点签名。n是要在某一个范围区间内的[h, H],具体原因参见垃圾回收章节。 *
  • @param chainMessage
  • @return

func (*PbftConsensus) ReceivePrepared

func (this *PbftConsensus) ReceivePrepared(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)

*

  • 节点接收其他节点的prepared消息,消息的payload为PbftConsensusLogEO *
  • 主节点会收到副节点发的prepared消息,等于commitNumber即可 *
  • 副节点只会收到副节点的prepared消息,等于commitNumber-1即可 *
  • 计算准备好的节点数目,满足以上条件,表示准备好,向其他节点发送提交消息 *
  • 主节点和副本节点收到PREPARE消息,需要进行以下交验: *
  • a. 副本节点PREPARE消息签名是否正确。 *
  • b. 当前副本节点是否已经收到了同一视图v下的n。 *
  • c. n是否在区间[h, H]内。 *
  • d. d是否和当前已收到PRE-PPREPARE中的d相同 *
  • 非法请求丢弃。如果副本节点i收到了2f+1个验证通过的PREPARE消息,则向其他节点包括主节点发送一条<COMMIT, v, n, d, i>消息,v,
  • n, d, i与上述PREPARE消息内容相同。<COMMIT, v, n, d, i>进行副本节点i的签名。记录COMMIT消息到日志中,用于View
  • Change过程中恢复未完成的请求操作。记录其他副本节点发送的PREPARE消息到log中。

func (*PbftConsensus) ReceivePreprepared

func (this *PbftConsensus) ReceivePreprepared(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL