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  }