Documentation
¶
Index ¶
- Variables
- type PbftConsensus
- func (this *PbftConsensus) ReceiveCommited(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)
- func (this *PbftConsensus) ReceiveConsensus(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)
- func (this *PbftConsensus) ReceivePrepared(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)
- func (this *PbftConsensus) ReceivePreprepared(chainMessage *entity3.ChainMessage) (*entity3.ChainMessage, error)
Constants ¶
This section is empty.
Variables ¶
View Source
var MemCache = cache.NewMemCache("pbft", 0, 0)
Functions ¶
This section is empty.
Types ¶
type PbftConsensus ¶
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)
Click to show internal directories.
Click to hide internal directories.