pbft

package module
v0.0.0-...-28a0c76 Latest Latest
Warning

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

Go to latest
Published: Jan 1, 2022 License: Apache-2.0 Imports: 25 Imported by: 1

README

chain5j-pbft

简介

chain5j-pbft chain5j链pbft共识。

功能

一致性的确保主要分为这三个阶段:

预准备(pre-prepare):
准备(prepare):
确认(commit):
1. Request:请求端C发送请求到任意一节点,这里是0
2. Pre-Prepare:服务端0收到C的请求后进行广播,扩散至123
3. Prepare:123,收到后记录并再次广播,1->023,2->013,3因为宕机无法广播
4. Commit:0123节点在Prepare阶段,若收到超过一定数量的相同请求,则进入Commit阶段,广播Commit请求
5. Reply:0123节点在Commit阶段,若收到超过一定数量的相同请求,则对C进行反馈

Consensus通用部分

New
  1. nodeKey中获取节点的ID
  2. config中获取链配置
  3. 判断链配置中共识配置是否符合要求,并将共识配置信息从map中解析到对象上
  4. 创建 core.NewEngine 创建pbft的核心逻辑

Start

  1. 启动pbft核心逻辑
  2. 调用pbft核心函数,NewChainHead,创建新的链头

Begin

  1. 调用pbft核心函数,NewChainHead,创建新的链头

Prepare

  1. 预处理header,从blockReader中读取父区块header
  2. snapshot中获取父区块的快照
  3. voteManager中获取managerVotevalidatorVote的数据
  4. 设置header.Consensusheader.Timestamp的值

VerifyHeader(header已经被签名)

  1. 验证header.Height是否为创世高度,如果是创世高度,那么就返回错误
  2. 判断header.Timestamp是否超过可容忍的时间范围。此操作避免服务器之间时间不同步
  3. header.Consensus转换为共识所需的参数ConsensusData
  4. 验证header中的其他字段
    1. 如果是创世区块,直接返回nil
    2. 判断父区块parentHeader.Height ?= header.Height-1,判断parentHeader.Hash ?= header.ParentHash
    3. 判断父区块和当前区块的时间戳是否相隔太近
    4. 验证header签名是否正确,并获取签名者
    5. 判断签名者是否是validator

Finalize

  1. 根据headertxs进行block的最终组装
  2. 如果涉及挖矿激励也在此方法中进行

Seal

  1. snapshot 中获取父区块的快照
  2. 判断当前节点是否为快照中的验证者
  3. blockReader中获取父区块header
  4. 更新区块时间戳和区块签名
  5. 锁定提案Hash,需要加锁处理
  6. 使用pbft.core进行request请求
  7. 线程处理结果
    1. 清空commit通道
    2. 等待pbft.corecommit通知
    3. 判断通知结果和提案区块hash是否一致性
    4. 如果hash一致,那么会将提案block通过chan返回给上一层,做入库处理
    5. 如果hash不一致,那么反馈给上层为nil
    6. 将提案区块hash设置为空,并释放锁

PBFT.Core

New
  1. 通过broadcaster订阅P2P的共识消息
  2. 获取当前节点的peerId
Start
  1. 调用StartNewRound开启新的轮换
    1. 获取最新的提案
    2. 判断共识时间戳
    3. 判断是否进行轮询切换
    4. 创建新的view视图
    5. 清除无效轮换信息
    6. 创建新的轮换快照
    7. 根据最新的提案集轮询次数计算出最新的提案者
    8. 设置可接收请求状态
    9. 如果当前节点是proposer,那么将会发起pre-prepare
  2. 启动协程,监听通道数据
    1. 监听requestCh
      1. HandleRequest处理请求的数据
        1. 验证请求数据的正确性
        2. 判断当前状态,如果是StateAcceptRequest,那么将请求作为pendingRequest
        3. 如果当前状态是StateAcceptRequest,并且不处于等待轮换状态,那么将SendPrePrepare
      2. 如果处理没有错误,那么保存请求数据
    2. 监听localMsgCh
      1. decodeMsg解析数据
      2. handleMsg处理
    3. 监听backlogCh
      1. handleMsg处理
    4. 监听finalCommitCh
      1. HandleFinalCommitted处理
    5. 监听p2pMsgCh
      1. decodeMsg解析数据
      2. 获取p2pMsg.DataHash
      3. 标记消息来源
      4. handleMsg处理
      5. 广播p2pMsg.Data
    6. 监听timeoutCh
      1. handleTimeoutMsg处理

证书

chain5j-pbft 的源码允许用户在遵循 Apache 2.0 开源证书 规则的前提下使用。

版权

Copyright@2022 chain5j

chain5j

Documentation

Overview

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Package pbft

@author: xwc1125

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewConsensus

func NewConsensus(rootCtx context.Context, opts ...option) (protocol.Consensus, error)

NewConsensus 创建pbft

func WithBlockReader

func WithBlockReader(blockReader protocol.BlockReader) option

func WithBroadcaster

func WithBroadcaster(broadcaster protocol.Broadcaster) option

func WithConfig

func WithConfig(config protocol.Config) option

func WithDatabaseReader

func WithDatabaseReader(dbReader protocol.DatabaseReader) option

func WithKVDB

func WithKVDB(db kvstore.Database) option

func WithNodeKey

func WithNodeKey(nodeKey protocol.NodeKey) option

Types

type API

type API struct {
	// contains filtered or unexported fields
}

API api对象

func (*API) GetSnapshot

func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error)

func (*API) ProposeManager

func (api *API) ProposeManager(address types.Address, auth bool, deadline *hexutil.Big, sig hexutil.Bytes) error

ProposeManager 投票添加或者删除管理员

func (*API) ProposeValidator

func (api *API) ProposeValidator(id string, auth bool, deadline *hexutil.Big, sig hexutil.Bytes) error

ProposeValidator 投票添加或者删除共识节点

type ConsensusData

type ConsensusData struct {
	CommittedSeal []*signature.SignResult

	Managers   []types.Address // 管理员地址
	Validators []string        // 验证者地址

	MVote *ManagementVote `rlp:"nil"`
	VVote *ValidatorVote  `rlp:"nil"`
}

ConsensusData 区块头中的共识数据 [注意]在创世文件中,初始化的managers和Validators放在hashmap中, 需要解析创世的内容

func (*ConsensusData) Deserialize

func (c *ConsensusData) Deserialize(d []byte) error

func (*ConsensusData) FromConsensus

func (c *ConsensusData) FromConsensus(consensus *models.Consensus) error

func (*ConsensusData) Serialize

func (c *ConsensusData) Serialize() ([]byte, error)

func (ConsensusData) ToConsensus

func (c ConsensusData) ToConsensus() (*models.Consensus, error)

type ManagementVote

type ManagementVote struct {
	Manager        types.Address `json:"manager"`   // 此次投票的授权validator
	Candidate      types.Address `json:"candidate"` // 需被投票的候选人地址
	Authorize      bool          `json:"authorize"` // 是否投票候选人
	DeadlineHeight *big.Int      `json:"deadline"`  // 截止到某个区块前投票有效
	Signature      []byte        `json:"signature"` // 签名数据
}

ManagementVote 管理员添加删除投票

type Snapshot

type Snapshot struct {
	Epoch  uint64     // 需要检测和重新投票的区块个数
	Height uint64     // 创建快照的块高
	Hash   types.Hash // 创建快照的块hash

	ValSet pbftProtocol.ValidatorSet // 快照对应的验证者集合
	// contains filtered or unexported fields
}

Snapshot 快照

func (*Snapshot) Apply

func (s *Snapshot) Apply(headers []*models.Header) (*Snapshot, error)

Apply 通过给定的headers创建新快照

func (*Snapshot) MarshalJSON

func (s *Snapshot) MarshalJSON() ([]byte, error)

MarshalJSON 序列化

func (*Snapshot) Store

func (s *Snapshot) Store(db kvstore.Database) error

Store 保存快照

func (*Snapshot) UnmarshalJSON

func (s *Snapshot) UnmarshalJSON(b []byte) error

UnmarshalJSON 反序列化

type Tally

type Tally struct {
	Authorize bool `json:"authorize"` // 是授权还是剔除的投票
	Votes     int  `json:"votes"`     // 投赞成票数
}

Tally 简单的计票方法 保存当前的投票分数。 反对该提案的选票不予统计,这等于不投票。

type ValidatorVote

type ValidatorVote struct {
	Manager        types.Address `json:"manager"`   // 此次投票的授权validator
	Validator      string        `json:"validator"` // 需被投票的验证者地址
	Authorize      bool          `json:"authorize"` // 是否投票验证者
	DeadlineHeight *big.Int      `json:"deadline"`  // 截止到某个区块前投票有效
	Signature      []byte        `json:"signature"` // 签名数据
}

ValidatorVote 节点验证者添加删除投票

Directories

Path Synopsis
Package core
Package core
Package protocol
Package protocol
mockpbft
Package mockpbft is a generated GoMock package.
Package mockpbft is a generated GoMock package.
Package validator
Package validator

Jump to

Keyboard shortcuts

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