github.com/tri-stone/burrow@v0.25.0/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 publicKey, err := crypto.PublicKeyFromTendermintPubKey(tmNode.PrivValidator().GetPubKey()) 25 if err != nil { 26 return nil, err 27 } 28 tmNode.BlockStore() 29 return &NodeView{ 30 tmNode: tmNode, 31 publicKey: publicKey, 32 txDecoder: txDecoder, 33 runID: runID, 34 }, nil 35 } 36 37 func (nv *NodeView) ValidatorPublicKey() crypto.PublicKey { 38 if nv == nil { 39 return crypto.PublicKey{} 40 } 41 return nv.publicKey 42 } 43 44 func (nv *NodeView) ValidatorAddress() crypto.Address { 45 if nv == nil { 46 return crypto.Address{} 47 } 48 return nv.publicKey.GetAddress() 49 } 50 51 func (nv *NodeView) NodeInfo() *NodeInfo { 52 if nv == nil { 53 return nil 54 } 55 ni, ok := nv.tmNode.NodeInfo().(p2p.DefaultNodeInfo) 56 if ok { 57 return NewNodeInfo(ni) 58 } 59 return &NodeInfo{} 60 } 61 62 func (nv *NodeView) IsFastSyncing() bool { 63 if nv == nil { 64 return true 65 } 66 return nv.tmNode.ConsensusReactor().FastSync() 67 } 68 69 func (nv *NodeView) Peers() p2p.IPeerSet { 70 return nv.tmNode.Switch().Peers() 71 } 72 73 func (nv *NodeView) BlockStore() state.BlockStoreRPC { 74 return nv.tmNode.BlockStore() 75 } 76 77 func (nv *NodeView) RunID() simpleuuid.UUID { 78 if nv == nil { 79 return []byte("00000000-0000-0000-0000-000000000000") 80 } 81 return nv.runID 82 } 83 84 // Pass -1 to get all available transactions 85 func (nv *NodeView) MempoolTransactions(maxTxs int) ([]*txs.Envelope, error) { 86 var transactions []*txs.Envelope 87 for _, txBytes := range nv.tmNode.MempoolReactor().Mempool.ReapMaxTxs(maxTxs) { 88 txEnv, err := nv.txDecoder.DecodeTx(txBytes) 89 if err != nil { 90 return nil, err 91 } 92 transactions = append(transactions, txEnv) 93 } 94 return transactions, nil 95 } 96 97 func (nv *NodeView) RoundState() *ctypes.RoundState { 98 return nv.tmNode.ConsensusState().GetRoundState() 99 } 100 101 func (nv *NodeView) RoundStateJSON() ([]byte, error) { 102 return nv.tmNode.ConsensusState().GetRoundStateJSON() 103 } 104 105 func (nv *NodeView) PeerRoundStates() ([]*ctypes.PeerRoundState, error) { 106 peers := nv.tmNode.Switch().Peers().List() 107 peerRoundStates := make([]*ctypes.PeerRoundState, len(peers)) 108 for i, peer := range peers { 109 peerState, ok := peer.Get(types.PeerStateKey).(*consensus.PeerState) 110 if !ok { 111 return nil, fmt.Errorf("could not get PeerState for peer: %s", peer) 112 } 113 peerRoundStates[i] = peerState.GetRoundState() 114 } 115 return peerRoundStates, nil 116 }