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 }