github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/consensus/tendermint/node_view.go (about)

     1  package tendermint
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/hyperledger/burrow/crypto"
     7  	"github.com/hyperledger/burrow/txs"
     8  	"github.com/streadway/simpleuuid"
     9  	"github.com/tendermint/tendermint/consensus"
    10  	ctypes "github.com/tendermint/tendermint/consensus/types"
    11  	"github.com/tendermint/tendermint/p2p"
    12  	"github.com/tendermint/tendermint/state"
    13  	"github.com/tendermint/tendermint/types"
    14  )
    15  
    16  type NodeView struct {
    17  	tmNode    *Node
    18  	publicKey *crypto.PublicKey
    19  	txDecoder txs.Decoder
    20  	runID     simpleuuid.UUID
    21  }
    22  
    23  func NewNodeView(tmNode *Node, txDecoder txs.Decoder, runID simpleuuid.UUID) (*NodeView, error) {
    24  	pk, err := tmNode.PrivValidator().GetPubKey()
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  	publicKey, err := crypto.PublicKeyFromTendermintPubKey(pk)
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  	tmNode.BlockStore()
    33  	return &NodeView{
    34  		tmNode:    tmNode,
    35  		publicKey: publicKey,
    36  		txDecoder: txDecoder,
    37  		runID:     runID,
    38  	}, nil
    39  }
    40  
    41  func (nv *NodeView) ValidatorPublicKey() *crypto.PublicKey {
    42  	if nv == nil {
    43  		return nil
    44  	}
    45  	return nv.publicKey
    46  }
    47  
    48  func (nv *NodeView) ValidatorAddress() crypto.Address {
    49  	if nv == nil {
    50  		return crypto.Address{}
    51  	}
    52  	return nv.publicKey.GetAddress()
    53  }
    54  
    55  func (nv *NodeView) NodeInfo() *NodeInfo {
    56  	if nv == nil {
    57  		return nil
    58  	}
    59  	ni, ok := nv.tmNode.NodeInfo().(p2p.DefaultNodeInfo)
    60  	if ok {
    61  		return NewNodeInfo(ni)
    62  	}
    63  	return &NodeInfo{}
    64  }
    65  
    66  func (nv *NodeView) IsSyncing() bool {
    67  	if nv == nil {
    68  		return true
    69  	}
    70  	return nv.tmNode.ConsensusReactor().WaitSync()
    71  }
    72  
    73  func (nv *NodeView) Peers() p2p.IPeerSet {
    74  	return nv.tmNode.Switch().Peers()
    75  }
    76  
    77  func (nv *NodeView) BlockStore() state.BlockStore {
    78  	return nv.tmNode.BlockStore()
    79  }
    80  
    81  func (nv *NodeView) RunID() simpleuuid.UUID {
    82  	if nv == nil {
    83  		return []byte("00000000-0000-0000-0000-000000000000")
    84  	}
    85  	return nv.runID
    86  }
    87  
    88  // Pass -1 to get all available transactions
    89  func (nv *NodeView) MempoolTransactions(maxTxs int) ([]*txs.Envelope, error) {
    90  	var transactions []*txs.Envelope
    91  	for _, txBytes := range nv.tmNode.Mempool().ReapMaxTxs(maxTxs) {
    92  		txEnv, err := nv.txDecoder.DecodeTx(txBytes)
    93  		if err != nil {
    94  			return nil, err
    95  		}
    96  		transactions = append(transactions, txEnv)
    97  	}
    98  	return transactions, nil
    99  }
   100  
   101  func (nv *NodeView) RoundState() *ctypes.RoundState {
   102  	return nv.tmNode.ConsensusState().GetRoundState()
   103  }
   104  
   105  func (nv *NodeView) RoundStateJSON() ([]byte, error) {
   106  	return nv.tmNode.ConsensusState().GetRoundStateJSON()
   107  }
   108  
   109  func (nv *NodeView) PeerRoundStates() ([]*ctypes.PeerRoundState, error) {
   110  	peers := nv.tmNode.Switch().Peers().List()
   111  	peerRoundStates := make([]*ctypes.PeerRoundState, len(peers))
   112  	for i, peer := range peers {
   113  		peerState, ok := peer.Get(types.PeerStateKey).(*consensus.PeerState)
   114  		if !ok {
   115  			return nil, fmt.Errorf("could not get PeerState for peer: %s", peer)
   116  		}
   117  		peerRoundStates[i] = peerState.GetRoundState()
   118  	}
   119  	return peerRoundStates, nil
   120  }