From 9ffa7e8a2bcdadc375af9704c73c495c824aa4ba Mon Sep 17 00:00:00 2001 From: Sam Kleinman Date: Thu, 24 Jun 2021 12:18:19 -0400 Subject: [PATCH 1/3] types: move NodeInfo from p2p (#6618) --- CHANGELOG_PENDING.md | 1 + internal/blockchain/v2/reactor_test.go | 4 +- internal/p2p/mock/peer.go | 4 +- internal/p2p/mocks/connection.go | 14 +++--- internal/p2p/mocks/peer.go | 19 ++++--- internal/p2p/p2p_test.go | 4 +- internal/p2p/p2ptest/network.go | 4 +- internal/p2p/peer.go | 8 +-- internal/p2p/peer_set_test.go | 2 +- internal/p2p/peer_test.go | 4 +- internal/p2p/router.go | 6 +-- internal/p2p/router_init_test.go | 11 ++-- internal/p2p/router_test.go | 12 ++--- internal/p2p/switch.go | 17 ++++--- internal/p2p/test_util.go | 10 ++-- internal/p2p/transport.go | 11 +++- internal/p2p/transport_mconn.go | 29 +++++------ internal/p2p/transport_memory.go | 16 +++--- internal/p2p/transport_test.go | 32 ++++++------ node/node.go | 4 +- node/setup.go | 38 +++++++------- proto/tendermint/p2p/types.pb.go | 13 ++--- rpc/core/env.go | 2 +- rpc/core/types/responses.go | 8 +-- rpc/core/types/responses_test.go | 15 +++--- test/fuzz/p2p/pex/reactor_receive.go | 14 +++--- {internal/p2p => types}/node_info.go | 33 +++--------- {internal/p2p => types}/node_info_test.go | 61 +++++++++++++++++++---- 28 files changed, 219 insertions(+), 177 deletions(-) rename {internal/p2p => types}/node_info.go (88%) rename {internal/p2p => types}/node_info_test.go (74%) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 2f39bf4cf6f4..ae75eadd27a1 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -32,6 +32,7 @@ Friendly reminder: We have a [bug bounty program](https://hackerone.com/tendermi - P2P Protocol - Go API + - [p2p] \#6618 Move `p2p.NodeInfo` into `types` to support use of the SDK. (@tychoish) - [p2p] \#6583 Make `p2p.NodeID` and `p2p.NetAddress` exported types to support their use in the RPC layer. (@tychoish) - [node] \#6540 Reduce surface area of the `node` package by making most of the implementation details private. (@tychoish) - [p2p] \#6547 Move the entire `p2p` package and all reactor implementations into `internal`. (@tychoish) diff --git a/internal/blockchain/v2/reactor_test.go b/internal/blockchain/v2/reactor_test.go index 86e266cc980e..f4ded22da56c 100644 --- a/internal/blockchain/v2/reactor_test.go +++ b/internal/blockchain/v2/reactor_test.go @@ -45,8 +45,8 @@ func (mp mockPeer) IsOutbound() bool { return true } func (mp mockPeer) IsPersistent() bool { return true } func (mp mockPeer) CloseConn() error { return nil } -func (mp mockPeer) NodeInfo() p2p.NodeInfo { - return p2p.NodeInfo{ +func (mp mockPeer) NodeInfo() types.NodeInfo { + return types.NodeInfo{ NodeID: "", ListenAddr: "", } diff --git a/internal/p2p/mock/peer.go b/internal/p2p/mock/peer.go index 7804f0d24944..b47e58662a26 100644 --- a/internal/p2p/mock/peer.go +++ b/internal/p2p/mock/peer.go @@ -45,8 +45,8 @@ func NewPeer(ip net.IP) *Peer { func (mp *Peer) FlushStop() { mp.Stop() } //nolint:errcheck //ignore error func (mp *Peer) TrySend(chID byte, msgBytes []byte) bool { return true } func (mp *Peer) Send(chID byte, msgBytes []byte) bool { return true } -func (mp *Peer) NodeInfo() p2p.NodeInfo { - return p2p.NodeInfo{ +func (mp *Peer) NodeInfo() types.NodeInfo { + return types.NodeInfo{ NodeID: mp.addr.ID, ListenAddr: mp.addr.DialString(), } diff --git a/internal/p2p/mocks/connection.go b/internal/p2p/mocks/connection.go index 5d03c0c983a5..ee1f011a0ebb 100644 --- a/internal/p2p/mocks/connection.go +++ b/internal/p2p/mocks/connection.go @@ -12,6 +12,8 @@ import ( mock "github.com/stretchr/testify/mock" p2p "github.com/tendermint/tendermint/internal/p2p" + + types "github.com/tendermint/tendermint/types" ) // Connection is an autogenerated mock type for the Connection type @@ -48,18 +50,18 @@ func (_m *Connection) FlushClose() error { } // Handshake provides a mock function with given fields: _a0, _a1, _a2 -func (_m *Connection) Handshake(_a0 context.Context, _a1 p2p.NodeInfo, _a2 crypto.PrivKey) (p2p.NodeInfo, crypto.PubKey, error) { +func (_m *Connection) Handshake(_a0 context.Context, _a1 types.NodeInfo, _a2 crypto.PrivKey) (types.NodeInfo, crypto.PubKey, error) { ret := _m.Called(_a0, _a1, _a2) - var r0 p2p.NodeInfo - if rf, ok := ret.Get(0).(func(context.Context, p2p.NodeInfo, crypto.PrivKey) p2p.NodeInfo); ok { + var r0 types.NodeInfo + if rf, ok := ret.Get(0).(func(context.Context, types.NodeInfo, crypto.PrivKey) types.NodeInfo); ok { r0 = rf(_a0, _a1, _a2) } else { - r0 = ret.Get(0).(p2p.NodeInfo) + r0 = ret.Get(0).(types.NodeInfo) } var r1 crypto.PubKey - if rf, ok := ret.Get(1).(func(context.Context, p2p.NodeInfo, crypto.PrivKey) crypto.PubKey); ok { + if rf, ok := ret.Get(1).(func(context.Context, types.NodeInfo, crypto.PrivKey) crypto.PubKey); ok { r1 = rf(_a0, _a1, _a2) } else { if ret.Get(1) != nil { @@ -68,7 +70,7 @@ func (_m *Connection) Handshake(_a0 context.Context, _a1 p2p.NodeInfo, _a2 crypt } var r2 error - if rf, ok := ret.Get(2).(func(context.Context, p2p.NodeInfo, crypto.PrivKey) error); ok { + if rf, ok := ret.Get(2).(func(context.Context, types.NodeInfo, crypto.PrivKey) error); ok { r2 = rf(_a0, _a1, _a2) } else { r2 = ret.Error(2) diff --git a/internal/p2p/mocks/peer.go b/internal/p2p/mocks/peer.go index 03175abd4d9a..d76b5bedb778 100644 --- a/internal/p2p/mocks/peer.go +++ b/internal/p2p/mocks/peer.go @@ -5,13 +5,12 @@ package mocks import ( conn "github.com/tendermint/tendermint/internal/p2p/conn" log "github.com/tendermint/tendermint/libs/log" - "github.com/tendermint/tendermint/types" mock "github.com/stretchr/testify/mock" net "net" - p2p "github.com/tendermint/tendermint/internal/p2p" + types "github.com/tendermint/tendermint/types" ) // Peer is an autogenerated mock type for the Peer type @@ -111,14 +110,14 @@ func (_m *Peer) IsRunning() bool { } // NodeInfo provides a mock function with given fields: -func (_m *Peer) NodeInfo() p2p.NodeInfo { +func (_m *Peer) NodeInfo() types.NodeInfo { ret := _m.Called() - var r0 p2p.NodeInfo - if rf, ok := ret.Get(0).(func() p2p.NodeInfo); ok { + var r0 types.NodeInfo + if rf, ok := ret.Get(0).(func() types.NodeInfo); ok { r0 = rf() } else { - r0 = ret.Get(0).(p2p.NodeInfo) + r0 = ret.Get(0).(types.NodeInfo) } return r0 @@ -244,15 +243,15 @@ func (_m *Peer) SetLogger(_a0 log.Logger) { } // SocketAddr provides a mock function with given fields: -func (_m *Peer) SocketAddr() *p2p.NetAddress { +func (_m *Peer) SocketAddr() *types.NetAddress { ret := _m.Called() - var r0 *p2p.NetAddress - if rf, ok := ret.Get(0).(func() *p2p.NetAddress); ok { + var r0 *types.NetAddress + if rf, ok := ret.Get(0).(func() *types.NetAddress); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*p2p.NetAddress) + r0 = ret.Get(0).(*types.NetAddress) } } diff --git a/internal/p2p/p2p_test.go b/internal/p2p/p2p_test.go index a6a28001b615..20d1576683cb 100644 --- a/internal/p2p/p2p_test.go +++ b/internal/p2p/p2p_test.go @@ -24,7 +24,7 @@ var ( selfKey crypto.PrivKey = ed25519.GenPrivKeyFromSecret([]byte{0xf9, 0x1b, 0x08, 0xaa, 0x38, 0xee, 0x34, 0xdd}) selfID = types.NodeIDFromPubKey(selfKey.PubKey()) - selfInfo = p2p.NodeInfo{ + selfInfo = types.NodeInfo{ NodeID: selfID, ListenAddr: "0.0.0.0:0", Network: "test", @@ -33,7 +33,7 @@ var ( peerKey crypto.PrivKey = ed25519.GenPrivKeyFromSecret([]byte{0x84, 0xd7, 0x01, 0xbf, 0x83, 0x20, 0x1c, 0xfe}) peerID = types.NodeIDFromPubKey(peerKey.PubKey()) - peerInfo = p2p.NodeInfo{ + peerInfo = types.NodeInfo{ NodeID: peerID, ListenAddr: "0.0.0.0:0", Network: "test", diff --git a/internal/p2p/p2ptest/network.go b/internal/p2p/p2ptest/network.go index 316f74448fcd..258d218f1eb3 100644 --- a/internal/p2p/p2ptest/network.go +++ b/internal/p2p/p2ptest/network.go @@ -215,7 +215,7 @@ func (n *Network) Remove(t *testing.T, id types.NodeID) { // Node is a node in a Network, with a Router and a PeerManager. type Node struct { NodeID types.NodeID - NodeInfo p2p.NodeInfo + NodeInfo types.NodeInfo NodeAddress p2p.NodeAddress PrivKey crypto.PrivKey Router *p2p.Router @@ -229,7 +229,7 @@ type Node struct { func (n *Network) MakeNode(t *testing.T, opts NodeOptions) *Node { privKey := ed25519.GenPrivKey() nodeID := types.NodeIDFromPubKey(privKey.PubKey()) - nodeInfo := p2p.NodeInfo{ + nodeInfo := types.NodeInfo{ NodeID: nodeID, ListenAddr: "0.0.0.0:0", // FIXME: We have to fake this for now. Moniker: string(nodeID), diff --git a/internal/p2p/peer.go b/internal/p2p/peer.go index d9b51e7671e0..7042518eba64 100644 --- a/internal/p2p/peer.go +++ b/internal/p2p/peer.go @@ -32,7 +32,7 @@ type Peer interface { CloseConn() error // close original connection - NodeInfo() NodeInfo // peer's info + NodeInfo() types.NodeInfo // peer's info Status() tmconn.ConnectionStatus SocketAddr() *NetAddress // actual address of the socket @@ -81,7 +81,7 @@ type peer struct { // peer's node info and the channel it knows about // channels = nodeInfo.Channels // cached to avoid copying nodeInfo in hasChannel - nodeInfo NodeInfo + nodeInfo types.NodeInfo channels []byte reactors map[byte]Reactor onPeerError func(Peer, interface{}) @@ -96,7 +96,7 @@ type peer struct { type PeerOption func(*peer) func newPeer( - nodeInfo NodeInfo, + nodeInfo types.NodeInfo, pc peerConn, reactorsByCh map[byte]Reactor, onPeerError func(Peer, interface{}), @@ -218,7 +218,7 @@ func (p *peer) IsPersistent() bool { } // NodeInfo returns a copy of the peer's NodeInfo. -func (p *peer) NodeInfo() NodeInfo { +func (p *peer) NodeInfo() types.NodeInfo { return p.nodeInfo } diff --git a/internal/p2p/peer_set_test.go b/internal/p2p/peer_set_test.go index 64541a1eeb61..96e6ebd5a53d 100644 --- a/internal/p2p/peer_set_test.go +++ b/internal/p2p/peer_set_test.go @@ -21,7 +21,7 @@ type mockPeer struct { func (mp *mockPeer) FlushStop() { mp.Stop() } //nolint:errcheck // ignore error func (mp *mockPeer) TrySend(chID byte, msgBytes []byte) bool { return true } func (mp *mockPeer) Send(chID byte, msgBytes []byte) bool { return true } -func (mp *mockPeer) NodeInfo() NodeInfo { return NodeInfo{} } +func (mp *mockPeer) NodeInfo() types.NodeInfo { return types.NodeInfo{} } func (mp *mockPeer) Status() ConnectionStatus { return ConnectionStatus{} } func (mp *mockPeer) ID() types.NodeID { return mp.id } func (mp *mockPeer) IsOutbound() bool { return false } diff --git a/internal/p2p/peer_test.go b/internal/p2p/peer_test.go index 438ab546d5e8..bfc3e32b4a53 100644 --- a/internal/p2p/peer_test.go +++ b/internal/p2p/peer_test.go @@ -221,8 +221,8 @@ func (rp *remotePeer) accept() { } } -func (rp *remotePeer) nodeInfo() NodeInfo { - return NodeInfo{ +func (rp *remotePeer) nodeInfo() types.NodeInfo { + return types.NodeInfo{ ProtocolVersion: defaultProtocolVersion, NodeID: rp.Addr().ID, ListenAddr: rp.listener.Addr().String(), diff --git a/internal/p2p/router.go b/internal/p2p/router.go index 6f8378efc68a..9666794bc17f 100644 --- a/internal/p2p/router.go +++ b/internal/p2p/router.go @@ -248,7 +248,7 @@ type Router struct { logger log.Logger metrics *Metrics options RouterOptions - nodeInfo NodeInfo + nodeInfo types.NodeInfo privKey crypto.PrivKey peerManager *PeerManager chDescs []ChannelDescriptor @@ -275,7 +275,7 @@ type Router struct { func NewRouter( logger log.Logger, metrics *Metrics, - nodeInfo NodeInfo, + nodeInfo types.NodeInfo, privKey crypto.PrivKey, peerManager *PeerManager, transports []Transport, @@ -787,7 +787,7 @@ func (r *Router) handshakePeer( ctx context.Context, conn Connection, expectID types.NodeID, -) (NodeInfo, crypto.PubKey, error) { +) (types.NodeInfo, crypto.PubKey, error) { if r.options.HandshakeTimeout > 0 { var cancel context.CancelFunc diff --git a/internal/p2p/router_init_test.go b/internal/p2p/router_init_test.go index 6a8a88f38826..3622c0cc12be 100644 --- a/internal/p2p/router_init_test.go +++ b/internal/p2p/router_init_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" + "github.com/tendermint/tendermint/types" ) func TestRouter_ConstructQueueFactory(t *testing.T) { @@ -17,21 +18,21 @@ func TestRouter_ConstructQueueFactory(t *testing.T) { t.Run("Default", func(t *testing.T) { require.Zero(t, os.Getenv("TM_P2P_QUEUE")) opts := RouterOptions{} - r, err := NewRouter(log.NewNopLogger(), nil, NodeInfo{}, nil, nil, nil, opts) + r, err := NewRouter(log.NewNopLogger(), nil, types.NodeInfo{}, nil, nil, nil, opts) require.NoError(t, err) _, ok := r.queueFactory(1).(*fifoQueue) require.True(t, ok) }) t.Run("Fifo", func(t *testing.T) { opts := RouterOptions{QueueType: queueTypeFifo} - r, err := NewRouter(log.NewNopLogger(), nil, NodeInfo{}, nil, nil, nil, opts) + r, err := NewRouter(log.NewNopLogger(), nil, types.NodeInfo{}, nil, nil, nil, opts) require.NoError(t, err) _, ok := r.queueFactory(1).(*fifoQueue) require.True(t, ok) }) t.Run("Priority", func(t *testing.T) { opts := RouterOptions{QueueType: queueTypePriority} - r, err := NewRouter(log.NewNopLogger(), nil, NodeInfo{}, nil, nil, nil, opts) + r, err := NewRouter(log.NewNopLogger(), nil, types.NodeInfo{}, nil, nil, nil, opts) require.NoError(t, err) q, ok := r.queueFactory(1).(*pqScheduler) require.True(t, ok) @@ -39,7 +40,7 @@ func TestRouter_ConstructQueueFactory(t *testing.T) { }) t.Run("WDRR", func(t *testing.T) { opts := RouterOptions{QueueType: queueTypeWDRR} - r, err := NewRouter(log.NewNopLogger(), nil, NodeInfo{}, nil, nil, nil, opts) + r, err := NewRouter(log.NewNopLogger(), nil, types.NodeInfo{}, nil, nil, nil, opts) require.NoError(t, err) q, ok := r.queueFactory(1).(*wdrrScheduler) require.True(t, ok) @@ -47,7 +48,7 @@ func TestRouter_ConstructQueueFactory(t *testing.T) { }) t.Run("NonExistant", func(t *testing.T) { opts := RouterOptions{QueueType: "fast"} - _, err := NewRouter(log.NewNopLogger(), nil, NodeInfo{}, nil, nil, nil, opts) + _, err := NewRouter(log.NewNopLogger(), nil, types.NodeInfo{}, nil, nil, nil, opts) require.Error(t, err) require.Contains(t, err.Error(), "fast") }) diff --git a/internal/p2p/router_test.go b/internal/p2p/router_test.go index 6e74436d41f9..5a1518168fb7 100644 --- a/internal/p2p/router_test.go +++ b/internal/p2p/router_test.go @@ -319,12 +319,12 @@ func TestRouter_Channel_Error(t *testing.T) { func TestRouter_AcceptPeers(t *testing.T) { testcases := map[string]struct { - peerInfo p2p.NodeInfo + peerInfo types.NodeInfo peerKey crypto.PubKey ok bool }{ "valid handshake": {peerInfo, peerKey.PubKey(), true}, - "empty handshake": {p2p.NodeInfo{}, nil, false}, + "empty handshake": {types.NodeInfo{}, nil, false}, "invalid key": {peerInfo, selfKey.PubKey(), false}, "self handshake": {selfInfo, selfKey.PubKey(), false}, } @@ -478,7 +478,7 @@ func TestRouter_AcceptPeers_HeadOfLineBlocking(t *testing.T) { mockConnection := &mocks.Connection{} mockConnection.On("String").Maybe().Return("mock") mockConnection.On("Handshake", mock.Anything, selfInfo, selfKey). - WaitUntil(closeCh).Return(p2p.NodeInfo{}, nil, io.EOF) + WaitUntil(closeCh).Return(types.NodeInfo{}, nil, io.EOF) mockConnection.On("Close").Return(nil) mockConnection.On("RemoteEndpoint").Return(p2p.Endpoint{}) @@ -522,13 +522,13 @@ func TestRouter_AcceptPeers_HeadOfLineBlocking(t *testing.T) { func TestRouter_DialPeers(t *testing.T) { testcases := map[string]struct { dialID types.NodeID - peerInfo p2p.NodeInfo + peerInfo types.NodeInfo peerKey crypto.PubKey dialErr error ok bool }{ "valid dial": {peerInfo.NodeID, peerInfo, peerKey.PubKey(), nil, true}, - "empty handshake": {peerInfo.NodeID, p2p.NodeInfo{}, nil, nil, false}, + "empty handshake": {peerInfo.NodeID, types.NodeInfo{}, nil, nil, false}, "invalid key": {peerInfo.NodeID, peerInfo, selfKey.PubKey(), nil, false}, "unexpected node ID": {peerInfo.NodeID, selfInfo, selfKey.PubKey(), nil, false}, "dial error": {peerInfo.NodeID, peerInfo, peerKey.PubKey(), errors.New("boom"), false}, @@ -634,7 +634,7 @@ func TestRouter_DialPeers_Parallel(t *testing.T) { mockConnection := &mocks.Connection{} mockConnection.On("String").Maybe().Return("mock") mockConnection.On("Handshake", mock.Anything, selfInfo, selfKey). - WaitUntil(closeCh).Return(p2p.NodeInfo{}, nil, io.EOF) + WaitUntil(closeCh).Return(types.NodeInfo{}, nil, io.EOF) mockConnection.On("Close").Return(nil) mockTransport := &mocks.Transport{} diff --git a/internal/p2p/switch.go b/internal/p2p/switch.go index ddf4b27bac5a..fa8338834c4a 100644 --- a/internal/p2p/switch.go +++ b/internal/p2p/switch.go @@ -103,8 +103,8 @@ type Switch struct { peers *PeerSet dialing *cmap.CMap reconnecting *cmap.CMap - nodeInfo NodeInfo // our node info - nodeKey NodeKey // our node privkey + nodeInfo types.NodeInfo // our node info + nodeKey NodeKey // our node privkey addrBook AddrBook // peers addresses with whom we'll maintain constant connection persistentPeersAddrs []*NetAddress @@ -242,13 +242,13 @@ func (sw *Switch) Reactor(name string) Reactor { // SetNodeInfo sets the switch's NodeInfo for checking compatibility and handshaking with other nodes. // NOTE: Not goroutine safe. -func (sw *Switch) SetNodeInfo(nodeInfo NodeInfo) { +func (sw *Switch) SetNodeInfo(nodeInfo types.NodeInfo) { sw.nodeInfo = nodeInfo } // NodeInfo returns the switch's NodeInfo. // NOTE: Not goroutine safe. -func (sw *Switch) NodeInfo() NodeInfo { +func (sw *Switch) NodeInfo() types.NodeInfo { return sw.nodeInfo } @@ -669,7 +669,7 @@ func (sw *Switch) IsPeerPersistent(na *NetAddress) bool { func (sw *Switch) acceptRoutine() { for { - var peerNodeInfo NodeInfo + var peerNodeInfo types.NodeInfo c, err := sw.transport.Accept() if err == nil { // NOTE: The legacy MConn transport did handshaking in Accept(), @@ -800,7 +800,7 @@ func (sw *Switch) addOutboundPeerWithConfig( ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - var peerNodeInfo NodeInfo + var peerNodeInfo types.NodeInfo c, err := sw.transport.Dial(ctx, Endpoint{ Protocol: MConnProtocol, IP: addr.IP, @@ -856,7 +856,10 @@ func (sw *Switch) addOutboundPeerWithConfig( return nil } -func (sw *Switch) handshakePeer(c Connection, expectPeerID types.NodeID) (NodeInfo, crypto.PubKey, error) { +func (sw *Switch) handshakePeer( + c Connection, + expectPeerID types.NodeID, +) (types.NodeInfo, crypto.PubKey, error) { // Moved from transport and hardcoded until legacy P2P stack removal. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() diff --git a/internal/p2p/test_util.go b/internal/p2p/test_util.go index cbb4338ae0f0..18b8c8d70d3c 100644 --- a/internal/p2p/test_util.go +++ b/internal/p2p/test_util.go @@ -27,7 +27,7 @@ func CreateRandomPeer(outbound bool) Peer { addr, netAddr := CreateRoutableAddr() p := &peer{ peerConn: peerConn{outbound: outbound}, - nodeInfo: NodeInfo{ + nodeInfo: types.NodeInfo{ NodeID: netAddr.ID, ListenAddr: netAddr.DialString(), }, @@ -227,12 +227,12 @@ func testPeerConn( //---------------------------------------------------------------- // rand node info -func testNodeInfo(id types.NodeID, name string) NodeInfo { +func testNodeInfo(id types.NodeID, name string) types.NodeInfo { return testNodeInfoWithNetwork(id, name, "testing") } -func testNodeInfoWithNetwork(id types.NodeID, name, network string) NodeInfo { - return NodeInfo{ +func testNodeInfoWithNetwork(id types.NodeID, name, network string) types.NodeInfo { + return types.NodeInfo{ ProtocolVersion: defaultProtocolVersion, NodeID: id, ListenAddr: fmt.Sprintf("127.0.0.1:%d", getFreePort()), @@ -240,7 +240,7 @@ func testNodeInfoWithNetwork(id types.NodeID, name, network string) NodeInfo { Version: "1.2.3-rc0-deadbeef", Channels: []byte{testCh}, Moniker: name, - Other: NodeInfoOther{ + Other: types.NodeInfoOther{ TxIndex: "on", RPCAddress: fmt.Sprintf("127.0.0.1:%d", getFreePort()), }, diff --git a/internal/p2p/transport.go b/internal/p2p/transport.go index 4e5d5f017cd7..320b30012691 100644 --- a/internal/p2p/transport.go +++ b/internal/p2p/transport.go @@ -9,6 +9,7 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/internal/p2p/conn" "github.com/tendermint/tendermint/types" + "github.com/tendermint/tendermint/version" ) //go:generate mockery --case underscore --name Transport|Connection @@ -19,6 +20,14 @@ const ( defaultProtocol Protocol = MConnProtocol ) +// defaultProtocolVersion populates the Block and P2P versions using +// the global values, but not the App. +var defaultProtocolVersion = types.ProtocolVersion{ + P2P: version.P2PProtocol, + Block: version.BlockProtocol, + App: 0, +} + // Protocol identifies a transport protocol. type Protocol string @@ -75,7 +84,7 @@ type Connection interface { // FIXME: The handshake should really be the Router's responsibility, but // that requires the connection interface to be byte-oriented rather than // message-oriented (see comment above). - Handshake(context.Context, NodeInfo, crypto.PrivKey) (NodeInfo, crypto.PubKey, error) + Handshake(context.Context, types.NodeInfo, crypto.PrivKey) (types.NodeInfo, crypto.PubKey, error) // ReceiveMessage returns the next message received on the connection, // blocking until one is available. Returns io.EOF if closed. diff --git a/internal/p2p/transport_mconn.go b/internal/p2p/transport_mconn.go index 7837a4faa15b..eca261476ca8 100644 --- a/internal/p2p/transport_mconn.go +++ b/internal/p2p/transport_mconn.go @@ -17,6 +17,7 @@ import ( "github.com/tendermint/tendermint/internal/p2p/conn" "github.com/tendermint/tendermint/libs/log" p2pproto "github.com/tendermint/tendermint/proto/tendermint/p2p" + "github.com/tendermint/tendermint/types" ) const ( @@ -254,12 +255,12 @@ func newMConnConnection( // Handshake implements Connection. func (c *mConnConnection) Handshake( ctx context.Context, - nodeInfo NodeInfo, + nodeInfo types.NodeInfo, privKey crypto.PrivKey, -) (NodeInfo, crypto.PubKey, error) { +) (types.NodeInfo, crypto.PubKey, error) { var ( mconn *conn.MConnection - peerInfo NodeInfo + peerInfo types.NodeInfo peerKey crypto.PubKey errCh = make(chan error, 1) ) @@ -282,16 +283,16 @@ func (c *mConnConnection) Handshake( select { case <-ctx.Done(): _ = c.Close() - return NodeInfo{}, nil, ctx.Err() + return types.NodeInfo{}, nil, ctx.Err() case err := <-errCh: if err != nil { - return NodeInfo{}, nil, err + return types.NodeInfo{}, nil, err } c.mconn = mconn c.logger = mconn.Logger if err = c.mconn.Start(); err != nil { - return NodeInfo{}, nil, err + return types.NodeInfo{}, nil, err } return peerInfo, peerKey, nil } @@ -302,16 +303,16 @@ func (c *mConnConnection) Handshake( // unstarted but handshaked MConnection, to avoid concurrent field writes. func (c *mConnConnection) handshake( ctx context.Context, - nodeInfo NodeInfo, + nodeInfo types.NodeInfo, privKey crypto.PrivKey, -) (*conn.MConnection, NodeInfo, crypto.PubKey, error) { +) (*conn.MConnection, types.NodeInfo, crypto.PubKey, error) { if c.mconn != nil { - return nil, NodeInfo{}, nil, errors.New("connection is already handshaked") + return nil, types.NodeInfo{}, nil, errors.New("connection is already handshaked") } secretConn, err := conn.MakeSecretConnection(c.conn, privKey) if err != nil { - return nil, NodeInfo{}, nil, err + return nil, types.NodeInfo{}, nil, err } var pbPeerInfo p2pproto.NodeInfo @@ -321,17 +322,17 @@ func (c *mConnConnection) handshake( errCh <- err }() go func() { - _, err := protoio.NewDelimitedReader(secretConn, MaxNodeInfoSize()).ReadMsg(&pbPeerInfo) + _, err := protoio.NewDelimitedReader(secretConn, types.MaxNodeInfoSize()).ReadMsg(&pbPeerInfo) errCh <- err }() for i := 0; i < cap(errCh); i++ { if err = <-errCh; err != nil { - return nil, NodeInfo{}, nil, err + return nil, types.NodeInfo{}, nil, err } } - peerInfo, err := NodeInfoFromProto(&pbPeerInfo) + peerInfo, err := types.NodeInfoFromProto(&pbPeerInfo) if err != nil { - return nil, NodeInfo{}, nil, err + return nil, types.NodeInfo{}, nil, err } mconn := conn.NewMConnectionWithConfig( diff --git a/internal/p2p/transport_memory.go b/internal/p2p/transport_memory.go index 11979f03034c..09a3872548c5 100644 --- a/internal/p2p/transport_memory.go +++ b/internal/p2p/transport_memory.go @@ -218,7 +218,7 @@ type memoryMessage struct { message []byte // For handshakes. - nodeInfo *NodeInfo + nodeInfo *types.NodeInfo pubKey crypto.PubKey } @@ -270,29 +270,29 @@ func (c *MemoryConnection) Status() conn.ConnectionStatus { // Handshake implements Connection. func (c *MemoryConnection) Handshake( ctx context.Context, - nodeInfo NodeInfo, + nodeInfo types.NodeInfo, privKey crypto.PrivKey, -) (NodeInfo, crypto.PubKey, error) { +) (types.NodeInfo, crypto.PubKey, error) { select { case c.sendCh <- memoryMessage{nodeInfo: &nodeInfo, pubKey: privKey.PubKey()}: c.logger.Debug("sent handshake", "nodeInfo", nodeInfo) case <-c.closer.Done(): - return NodeInfo{}, nil, io.EOF + return types.NodeInfo{}, nil, io.EOF case <-ctx.Done(): - return NodeInfo{}, nil, ctx.Err() + return types.NodeInfo{}, nil, ctx.Err() } select { case msg := <-c.receiveCh: if msg.nodeInfo == nil { - return NodeInfo{}, nil, errors.New("no NodeInfo in handshake") + return types.NodeInfo{}, nil, errors.New("no NodeInfo in handshake") } c.logger.Debug("received handshake", "peerInfo", msg.nodeInfo) return *msg.nodeInfo, msg.pubKey, nil case <-c.closer.Done(): - return NodeInfo{}, nil, io.EOF + return types.NodeInfo{}, nil, io.EOF case <-ctx.Done(): - return NodeInfo{}, nil, ctx.Err() + return types.NodeInfo{}, nil, ctx.Err() } } diff --git a/internal/p2p/transport_test.go b/internal/p2p/transport_test.go index c868a57ce3d3..2d9d9f9f3d35 100644 --- a/internal/p2p/transport_test.go +++ b/internal/p2p/transport_test.go @@ -242,21 +242,25 @@ func TestConnection_Handshake(t *testing.T) { // A handshake should pass the given keys and NodeInfo. aKey := ed25519.GenPrivKey() - aInfo := p2p.NodeInfo{ - NodeID: types.NodeIDFromPubKey(aKey.PubKey()), - ProtocolVersion: p2p.NewProtocolVersion(1, 2, 3), - ListenAddr: "listenaddr", - Network: "network", - Version: "1.2.3", - Channels: bytes.HexBytes([]byte{0xf0, 0x0f}), - Moniker: "moniker", - Other: p2p.NodeInfoOther{ + aInfo := types.NodeInfo{ + NodeID: types.NodeIDFromPubKey(aKey.PubKey()), + ProtocolVersion: types.ProtocolVersion{ + P2P: 1, + Block: 2, + App: 3, + }, + ListenAddr: "listenaddr", + Network: "network", + Version: "1.2.3", + Channels: bytes.HexBytes([]byte{0xf0, 0x0f}), + Moniker: "moniker", + Other: types.NodeInfoOther{ TxIndex: "txindex", RPCAddress: "rpc.domain.com", }, } bKey := ed25519.GenPrivKey() - bInfo := p2p.NodeInfo{NodeID: types.NodeIDFromPubKey(bKey.PubKey())} + bInfo := types.NodeInfo{NodeID: types.NodeIDFromPubKey(bKey.PubKey())} errCh := make(chan error, 1) go func() { @@ -287,7 +291,7 @@ func TestConnection_HandshakeCancel(t *testing.T) { ab, ba := dialAccept(t, a, b) timeoutCtx, cancel := context.WithTimeout(ctx, 1*time.Minute) cancel() - _, _, err := ab.Handshake(timeoutCtx, p2p.NodeInfo{}, ed25519.GenPrivKey()) + _, _, err := ab.Handshake(timeoutCtx, types.NodeInfo{}, ed25519.GenPrivKey()) require.Error(t, err) require.Equal(t, context.Canceled, err) _ = ab.Close() @@ -297,7 +301,7 @@ func TestConnection_HandshakeCancel(t *testing.T) { ab, ba = dialAccept(t, a, b) timeoutCtx, cancel = context.WithTimeout(ctx, 200*time.Millisecond) defer cancel() - _, _, err = ab.Handshake(timeoutCtx, p2p.NodeInfo{}, ed25519.GenPrivKey()) + _, _, err = ab.Handshake(timeoutCtx, types.NodeInfo{}, ed25519.GenPrivKey()) require.Error(t, err) require.Equal(t, context.DeadlineExceeded, err) _ = ab.Close() @@ -619,13 +623,13 @@ func dialAcceptHandshake(t *testing.T, a, b p2p.Transport) (p2p.Connection, p2p. errCh := make(chan error, 1) go func() { privKey := ed25519.GenPrivKey() - nodeInfo := p2p.NodeInfo{NodeID: types.NodeIDFromPubKey(privKey.PubKey())} + nodeInfo := types.NodeInfo{NodeID: types.NodeIDFromPubKey(privKey.PubKey())} _, _, err := ba.Handshake(ctx, nodeInfo, privKey) errCh <- err }() privKey := ed25519.GenPrivKey() - nodeInfo := p2p.NodeInfo{NodeID: types.NodeIDFromPubKey(privKey.PubKey())} + nodeInfo := types.NodeInfo{NodeID: types.NodeIDFromPubKey(privKey.PubKey())} _, _, err := ab.Handshake(ctx, nodeInfo, privKey) require.NoError(t, err) diff --git a/node/node.go b/node/node.go index 2bd668a5986b..662f60a07309 100644 --- a/node/node.go +++ b/node/node.go @@ -58,7 +58,7 @@ type nodeImpl struct { peerManager *p2p.PeerManager router *p2p.Router addrBook pex.AddrBook // known peers - nodeInfo p2p.NodeInfo + nodeInfo types.NodeInfo nodeKey p2p.NodeKey // our node privkey isListening bool @@ -1022,7 +1022,7 @@ func (n *nodeImpl) IsListening() bool { } // NodeInfo returns the Node's Info from the Switch. -func (n *nodeImpl) NodeInfo() p2p.NodeInfo { +func (n *nodeImpl) NodeInfo() types.NodeInfo { return n.nodeInfo } diff --git a/node/setup.go b/node/setup.go index 64f2f549d2ce..763713095e6c 100644 --- a/node/setup.go +++ b/node/setup.go @@ -537,7 +537,7 @@ func createPeerManager( func createRouter( p2pLogger log.Logger, p2pMetrics *p2p.Metrics, - nodeInfo p2p.NodeInfo, + nodeInfo types.NodeInfo, privKey crypto.PrivKey, peerManager *p2p.PeerManager, transport p2p.Transport, @@ -565,7 +565,7 @@ func createSwitch( consensusReactor *p2p.ReactorShim, evidenceReactor *p2p.ReactorShim, proxyApp proxy.AppConns, - nodeInfo p2p.NodeInfo, + nodeInfo types.NodeInfo, nodeKey p2p.NodeKey, p2pLogger log.Logger, ) *p2p.Switch { @@ -713,7 +713,7 @@ func makeNodeInfo( eventSinks []indexer.EventSink, genDoc *types.GenesisDoc, state sm.State, -) (p2p.NodeInfo, error) { +) (types.NodeInfo, error) { txIndexerStatus := "off" if indexer.IndexingEnabled(eventSinks) { @@ -729,15 +729,15 @@ func makeNodeInfo( bcChannel = bcv2.BlockchainChannel default: - return p2p.NodeInfo{}, fmt.Errorf("unknown fastsync version %s", config.FastSync.Version) + return types.NodeInfo{}, fmt.Errorf("unknown fastsync version %s", config.FastSync.Version) } - nodeInfo := p2p.NodeInfo{ - ProtocolVersion: p2p.NewProtocolVersion( - version.P2PProtocol, // global - state.Version.Consensus.Block, - state.Version.Consensus.App, - ), + nodeInfo := types.NodeInfo{ + ProtocolVersion: types.ProtocolVersion{ + P2P: version.P2PProtocol, // global + Block: state.Version.Consensus.Block, + App: state.Version.Consensus.App, + }, NodeID: nodeKey.ID, Network: genDoc.ChainID, Version: version.TMVersion, @@ -754,7 +754,7 @@ func makeNodeInfo( byte(statesync.LightBlockChannel), }, Moniker: config.Moniker, - Other: p2p.NodeInfoOther{ + Other: types.NodeInfoOther{ TxIndex: txIndexerStatus, RPCAddress: config.RPC.ListenAddress, }, @@ -781,19 +781,19 @@ func makeSeedNodeInfo( nodeKey p2p.NodeKey, genDoc *types.GenesisDoc, state sm.State, -) (p2p.NodeInfo, error) { - nodeInfo := p2p.NodeInfo{ - ProtocolVersion: p2p.NewProtocolVersion( - version.P2PProtocol, // global - state.Version.Consensus.Block, - state.Version.Consensus.App, - ), +) (types.NodeInfo, error) { + nodeInfo := types.NodeInfo{ + ProtocolVersion: types.ProtocolVersion{ + P2P: version.P2PProtocol, // global + Block: state.Version.Consensus.Block, + App: state.Version.Consensus.App, + }, NodeID: nodeKey.ID, Network: genDoc.ChainID, Version: version.TMVersion, Channels: []byte{}, Moniker: config.Moniker, - Other: p2p.NodeInfoOther{ + Other: types.NodeInfoOther{ TxIndex: "off", RPCAddress: config.RPC.ListenAddress, }, diff --git a/proto/tendermint/p2p/types.pb.go b/proto/tendermint/p2p/types.pb.go index bffa6884fe5a..4e63e7dd01ef 100644 --- a/proto/tendermint/p2p/types.pb.go +++ b/proto/tendermint/p2p/types.pb.go @@ -5,14 +5,15 @@ package p2p import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" time "time" + + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" ) // Reference imports to suppress errors if they are not otherwise used. @@ -369,8 +370,8 @@ func (m *PeerAddressInfo) GetDialFailures() uint32 { func init() { proto.RegisterType((*ProtocolVersion)(nil), "tendermint.p2p.ProtocolVersion") - proto.RegisterType((*NodeInfo)(nil), "tendermint.p2p.NodeInfo") - proto.RegisterType((*NodeInfoOther)(nil), "tendermint.p2p.NodeInfoOther") + proto.RegisterType((*NodeInfo)(nil), "tendermint.types.NodeInfo") + proto.RegisterType((*NodeInfoOther)(nil), "tendermint.types.NodeInfoOther") proto.RegisterType((*PeerInfo)(nil), "tendermint.p2p.PeerInfo") proto.RegisterType((*PeerAddressInfo)(nil), "tendermint.p2p.PeerAddressInfo") } diff --git a/rpc/core/env.go b/rpc/core/env.go index ff4ccbdc8ba9..c18e84b51b7b 100644 --- a/rpc/core/env.go +++ b/rpc/core/env.go @@ -47,7 +47,7 @@ type Consensus interface { type transport interface { Listeners() []string IsListening() bool - NodeInfo() p2p.NodeInfo + NodeInfo() types.NodeInfo } type peers interface { diff --git a/rpc/core/types/responses.go b/rpc/core/types/responses.go index 8a2b1a899e04..b8eb5bd48ba8 100644 --- a/rpc/core/types/responses.go +++ b/rpc/core/types/responses.go @@ -108,9 +108,9 @@ type ValidatorInfo struct { // Node Status type ResultStatus struct { - NodeInfo p2p.NodeInfo `json:"node_info"` - SyncInfo SyncInfo `json:"sync_info"` - ValidatorInfo ValidatorInfo `json:"validator_info"` + NodeInfo types.NodeInfo `json:"node_info"` + SyncInfo SyncInfo `json:"sync_info"` + ValidatorInfo ValidatorInfo `json:"validator_info"` } // Is TxIndexing enabled @@ -141,7 +141,7 @@ type ResultDialPeers struct { // A peer type Peer struct { - NodeInfo p2p.NodeInfo `json:"node_info"` + NodeInfo types.NodeInfo `json:"node_info"` IsOutbound bool `json:"is_outbound"` ConnectionStatus p2p.ConnectionStatus `json:"connection_status"` RemoteIP string `json:"remote_ip"` diff --git a/rpc/core/types/responses_test.go b/rpc/core/types/responses_test.go index 77ede62f3bcf..a85f3f7775be 100644 --- a/rpc/core/types/responses_test.go +++ b/rpc/core/types/responses_test.go @@ -4,8 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - - "github.com/tendermint/tendermint/internal/p2p" + "github.com/tendermint/tendermint/types" ) func TestStatusIndexer(t *testing.T) { @@ -15,17 +14,17 @@ func TestStatusIndexer(t *testing.T) { status = &ResultStatus{} assert.False(t, status.TxIndexEnabled()) - status.NodeInfo = p2p.NodeInfo{} + status.NodeInfo = types.NodeInfo{} assert.False(t, status.TxIndexEnabled()) cases := []struct { expected bool - other p2p.NodeInfoOther + other types.NodeInfoOther }{ - {false, p2p.NodeInfoOther{}}, - {false, p2p.NodeInfoOther{TxIndex: "aa"}}, - {false, p2p.NodeInfoOther{TxIndex: "off"}}, - {true, p2p.NodeInfoOther{TxIndex: "on"}}, + {false, types.NodeInfoOther{}}, + {false, types.NodeInfoOther{TxIndex: "aa"}}, + {false, types.NodeInfoOther{TxIndex: "off"}}, + {true, types.NodeInfoOther{TxIndex: "on"}}, } for _, tc := range cases { diff --git a/test/fuzz/p2p/pex/reactor_receive.go b/test/fuzz/p2p/pex/reactor_receive.go index a76751582486..388361a4e21a 100644 --- a/test/fuzz/p2p/pex/reactor_receive.go +++ b/test/fuzz/p2p/pex/reactor_receive.go @@ -64,12 +64,12 @@ func newFuzzPeer() *fuzzPeer { var privKey = ed25519.GenPrivKey() var nodeID = types.NodeIDFromPubKey(privKey.PubKey()) -var defaultNodeInfo = p2p.NodeInfo{ - ProtocolVersion: p2p.NewProtocolVersion( - version.P2PProtocol, - version.BlockProtocol, - 0, - ), +var defaultNodeInfo = types.NodeInfo{ + ProtocolVersion: types.ProtocolVersion{ + P2P: version.P2PProtocol, + Block: version.BlockProtocol, + App: 0, + }, NodeID: nodeID, ListenAddr: "127.0.0.1:0", Moniker: "foo1", @@ -84,7 +84,7 @@ func (fp *fuzzPeer) RemoteAddr() net.Addr { func (fp *fuzzPeer) IsOutbound() bool { return false } func (fp *fuzzPeer) IsPersistent() bool { return false } func (fp *fuzzPeer) CloseConn() error { return nil } -func (fp *fuzzPeer) NodeInfo() p2p.NodeInfo { return defaultNodeInfo } +func (fp *fuzzPeer) NodeInfo() types.NodeInfo { return defaultNodeInfo } func (fp *fuzzPeer) Status() p2p.ConnectionStatus { var cs p2p.ConnectionStatus; return cs } func (fp *fuzzPeer) SocketAddr() *p2p.NetAddress { return types.NewNetAddress(fp.ID(), fp.RemoteAddr()) diff --git a/internal/p2p/node_info.go b/types/node_info.go similarity index 88% rename from internal/p2p/node_info.go rename to types/node_info.go index 86a7a4ba1a76..226558eecb05 100644 --- a/internal/p2p/node_info.go +++ b/types/node_info.go @@ -1,4 +1,4 @@ -package p2p +package types import ( "errors" @@ -7,8 +7,6 @@ import ( "github.com/tendermint/tendermint/libs/bytes" tmstrings "github.com/tendermint/tendermint/libs/strings" tmp2p "github.com/tendermint/tendermint/proto/tendermint/p2p" - "github.com/tendermint/tendermint/types" - "github.com/tendermint/tendermint/version" ) const ( @@ -28,23 +26,6 @@ type ProtocolVersion struct { App uint64 `json:"app"` } -// defaultProtocolVersion populates the Block and P2P versions using -// the global values, but not the App. -var defaultProtocolVersion = NewProtocolVersion( - version.P2PProtocol, - version.BlockProtocol, - 0, -) - -// NewProtocolVersion returns a fully populated ProtocolVersion. -func NewProtocolVersion(p2p, block, app uint64) ProtocolVersion { - return ProtocolVersion{ - P2P: p2p, - Block: block, - App: app, - } -} - //------------------------------------------------------------- // NodeInfo is the basic node information exchanged @@ -53,8 +34,8 @@ type NodeInfo struct { ProtocolVersion ProtocolVersion `json:"protocol_version"` // Authenticate - NodeID types.NodeID `json:"id"` // authenticated identifier - ListenAddr string `json:"listen_addr"` // accepting incoming + NodeID NodeID `json:"id"` // authenticated identifier + ListenAddr string `json:"listen_addr"` // accepting incoming // Check compatibility. // Channels are HexBytes so easier to read as JSON @@ -74,7 +55,7 @@ type NodeInfoOther struct { } // ID returns the node's peer ID. -func (info NodeInfo) ID() types.NodeID { +func (info NodeInfo) ID() NodeID { return info.NodeID } @@ -96,7 +77,7 @@ func (info NodeInfo) Validate() error { // ID is already validated. // Validate ListenAddr. - _, err := types.NewNetAddressString(info.ID().AddressString(info.ListenAddr)) + _, err := NewNetAddressString(info.ID().AddressString(info.ListenAddr)) if err != nil { return err } @@ -187,7 +168,7 @@ OUTER_LOOP: // may not match that address actually dialed if its an outbound peer. func (info NodeInfo) NetAddress() (*NetAddress, error) { idAddr := info.ID().AddressString(info.ListenAddr) - return types.NewNetAddressString(idAddr) + return NewNetAddressString(idAddr) } func (info NodeInfo) ToProto() *tmp2p.NodeInfo { @@ -223,7 +204,7 @@ func NodeInfoFromProto(pb *tmp2p.NodeInfo) (NodeInfo, error) { Block: pb.ProtocolVersion.Block, App: pb.ProtocolVersion.App, }, - NodeID: types.NodeID(pb.NodeID), + NodeID: NodeID(pb.NodeID), ListenAddr: pb.ListenAddr, Network: pb.Network, Version: pb.Version, diff --git a/internal/p2p/node_info_test.go b/types/node_info_test.go similarity index 74% rename from internal/p2p/node_info_test.go rename to types/node_info_test.go index 3f51005f0874..f2663558b735 100644 --- a/internal/p2p/node_info_test.go +++ b/types/node_info_test.go @@ -1,11 +1,17 @@ -package p2p +package types import ( + "fmt" "testing" "github.com/stretchr/testify/assert" + "github.com/tendermint/tendermint/crypto/ed25519" + tmnet "github.com/tendermint/tendermint/libs/net" + "github.com/tendermint/tendermint/version" ) +const testCh = 0x01 + func TestNodeInfoValidate(t *testing.T) { // empty fails @@ -64,16 +70,16 @@ func TestNodeInfoValidate(t *testing.T) { {"Good RPCAddress", func(ni *NodeInfo) { ni.Other.RPCAddress = "0.0.0.0:26657" }, false}, } - nodeKey := GenNodeKey() + nodeKeyID := testNodeID() name := "testing" // test case passes - ni = testNodeInfo(nodeKey.ID, name) + ni = testNodeInfo(nodeKeyID, name) ni.Channels = channels assert.NoError(t, ni.Validate()) for _, tc := range testCases { - ni := testNodeInfo(nodeKey.ID, name) + ni := testNodeInfo(nodeKeyID, name) ni.Channels = channels tc.malleateNodeInfo(&ni) err := ni.Validate() @@ -86,17 +92,52 @@ func TestNodeInfoValidate(t *testing.T) { } -func TestNodeInfoCompatible(t *testing.T) { +func testNodeID() NodeID { + return NodeIDFromPubKey(ed25519.GenPrivKey().PubKey()) +} + +func testNodeInfo(id NodeID, name string) NodeInfo { + return testNodeInfoWithNetwork(id, name, "testing") +} + +func testNodeInfoWithNetwork(id NodeID, name, network string) NodeInfo { + return NodeInfo{ + ProtocolVersion: ProtocolVersion{ + P2P: version.P2PProtocol, + Block: version.BlockProtocol, + App: 0, + }, + NodeID: id, + ListenAddr: fmt.Sprintf("127.0.0.1:%d", getFreePort()), + Network: network, + Version: "1.2.3-rc0-deadbeef", + Channels: []byte{testCh}, + Moniker: name, + Other: NodeInfoOther{ + TxIndex: "on", + RPCAddress: fmt.Sprintf("127.0.0.1:%d", getFreePort()), + }, + } +} - nodeKey1 := GenNodeKey() - nodeKey2 := GenNodeKey() +func getFreePort() int { + port, err := tmnet.GetFreePort() + if err != nil { + panic(err) + } + return port +} + +func TestNodeInfoCompatible(t *testing.T) { + nodeKey1ID := testNodeID() + nodeKey2ID := testNodeID() name := "testing" var newTestChannel byte = 0x2 // test NodeInfo is compatible - ni1 := testNodeInfo(nodeKey1.ID, name) - ni2 := testNodeInfo(nodeKey2.ID, name) + ni1 := testNodeInfo(nodeKey1ID, name) + ni2 := testNodeInfo(nodeKey2ID, name) assert.NoError(t, ni1.CompatibleWith(ni2)) // add another channel; still compatible @@ -113,7 +154,7 @@ func TestNodeInfoCompatible(t *testing.T) { } for _, tc := range testCases { - ni := testNodeInfo(nodeKey2.ID, name) + ni := testNodeInfo(nodeKey2ID, name) tc.malleateNodeInfo(&ni) assert.Error(t, ni1.CompatibleWith(ni)) } From 10d174adcc619225cf982962510b49fc72189a1c Mon Sep 17 00:00:00 2001 From: crypto-facs <84574577+crypto-facs@users.noreply.github.com> Date: Thu, 24 Jun 2021 13:47:41 -0400 Subject: [PATCH 2/3] rpc: Add `TotalGasUsed` to `block_results` response (#6615) Closes #6551 Simple PR to add the total gas used in the block by adding the gas used in all the transactions. This adds a `TotalGasUsed` field to `coretypes.ResultBlockResults`. Its my first PR to the repo so let me know if there is anything I am missing! @fedekunze In case you want to take a look --- CHANGELOG_PENDING.md | 3 ++- rpc/core/blocks.go | 6 ++++++ rpc/core/blocks_test.go | 7 ++++--- rpc/core/types/responses.go | 1 + rpc/openapi/openapi.yaml | 3 +++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index ae75eadd27a1..fc1c38169d3c 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -126,6 +126,7 @@ Friendly reminder: We have a [bug bounty program](https://hackerone.com/tendermi - [p2p/pex] \#6509 Improve addrBook.hash performance (@cuonglm) - [consensus/metrics] \#6549 Change block_size gauge to a histogram for better observability over time (@marbar3778) - [statesync] \#6587 Increase chunk priority and re-request chunks that don't arrive (@cmwaters) +- [rpc] \#6615 Add TotalGasUsed to block_results response (@crypto-facs) ### BUG FIXES @@ -134,5 +135,5 @@ Friendly reminder: We have a [bug bounty program](https://hackerone.com/tendermi - [blockchain/v1] \#5711 Fix deadlock (@melekes) - [evidence] \#6375 Fix bug with inconsistent LightClientAttackEvidence hashing (cmwaters) - [rpc] \#6507 fix RPC client doesn't handle url's without ports (@JayT106) -- [statesync] \#6463 Adds Reverse Sync feature to fetch historical light blocks after state sync in order to verify any evidence (@cmwaters) +- [statesync] \#6463 Adds Reverse Sync feature to fetch historical light blocks after state sync in order to verify any evidence (@cmwaters) - [fastsync] \#6590 Update the metrics during fast-sync (@JayT106) diff --git a/rpc/core/blocks.go b/rpc/core/blocks.go index f36a4e3de1f4..6e92a8805792 100644 --- a/rpc/core/blocks.go +++ b/rpc/core/blocks.go @@ -161,9 +161,15 @@ func (env *Environment) BlockResults(ctx *rpctypes.Context, heightPtr *int64) (* return nil, err } + var totalGasUsed int64 + for _, tx := range results.GetDeliverTxs() { + totalGasUsed += tx.GetGasUsed() + } + return &ctypes.ResultBlockResults{ Height: height, TxsResults: results.DeliverTxs, + TotalGasUsed: totalGasUsed, BeginBlockEvents: results.BeginBlock.Events, EndBlockEvents: results.EndBlock.Events, ValidatorUpdates: results.EndBlock.ValidatorUpdates, diff --git a/rpc/core/blocks_test.go b/rpc/core/blocks_test.go index 5e7d85934867..70bd4c723293 100644 --- a/rpc/core/blocks_test.go +++ b/rpc/core/blocks_test.go @@ -72,9 +72,9 @@ func TestBlockchainInfo(t *testing.T) { func TestBlockResults(t *testing.T) { results := &tmstate.ABCIResponses{ DeliverTxs: []*abci.ResponseDeliverTx{ - {Code: 0, Data: []byte{0x01}, Log: "ok"}, - {Code: 0, Data: []byte{0x02}, Log: "ok"}, - {Code: 1, Log: "not ok"}, + {Code: 0, Data: []byte{0x01}, Log: "ok", GasUsed: 10}, + {Code: 0, Data: []byte{0x02}, Log: "ok", GasUsed: 5}, + {Code: 1, Log: "not ok", GasUsed: 0}, }, EndBlock: &abci.ResponseEndBlock{}, BeginBlock: &abci.ResponseBeginBlock{}, @@ -97,6 +97,7 @@ func TestBlockResults(t *testing.T) { {100, false, &ctypes.ResultBlockResults{ Height: 100, TxsResults: results.DeliverTxs, + TotalGasUsed: 15, BeginBlockEvents: results.BeginBlock.Events, EndBlockEvents: results.EndBlock.Events, ValidatorUpdates: results.EndBlock.ValidatorUpdates, diff --git a/rpc/core/types/responses.go b/rpc/core/types/responses.go index b8eb5bd48ba8..d6d4b0983813 100644 --- a/rpc/core/types/responses.go +++ b/rpc/core/types/responses.go @@ -62,6 +62,7 @@ type ResultCommit struct { type ResultBlockResults struct { Height int64 `json:"height"` TxsResults []*abci.ResponseDeliverTx `json:"txs_results"` + TotalGasUsed int64 `json:"total_gas_used"` BeginBlockEvents []abci.Event `json:"begin_block_events"` EndBlockEvents []abci.Event `json:"end_block_events"` ValidatorUpdates []abci.ValidatorUpdate `json:"validator_updates"` diff --git a/rpc/openapi/openapi.yaml b/rpc/openapi/openapi.yaml index 9e1200bc6397..6a2c16d1924d 100644 --- a/rpc/openapi/openapi.yaml +++ b/rpc/openapi/openapi.yaml @@ -1666,6 +1666,9 @@ components: codespace: type: string example: "ibc" + total_gas_used: + type: string + example: "100" begin_block_events: type: array nullable: true From 917180dfd2e0180eae90c0fe2d14e64b99226a22 Mon Sep 17 00:00:00 2001 From: Sam Kleinman Date: Thu, 24 Jun 2021 16:38:35 -0400 Subject: [PATCH 3/3] p2p: reduce buffering on channels (#6609) Having smaller buffers in each reactor/channel will mean that there will be fewer stale messages. --- internal/blockchain/v0/reactor.go | 5 ++--- internal/blockchain/v2/reactor.go | 2 +- internal/consensus/reactor.go | 35 ++++++++++++++----------------- internal/evidence/reactor.go | 4 ++-- internal/mempool/v0/reactor.go | 4 ++-- internal/mempool/v1/reactor.go | 4 ++-- internal/p2p/pex/reactor.go | 5 +++-- internal/p2p/router.go | 6 +----- internal/statesync/reactor.go | 12 +++++------ node/setup.go | 2 +- 10 files changed, 36 insertions(+), 43 deletions(-) diff --git a/internal/blockchain/v0/reactor.go b/internal/blockchain/v0/reactor.go index 859b0fe97249..444dfff56ce4 100644 --- a/internal/blockchain/v0/reactor.go +++ b/internal/blockchain/v0/reactor.go @@ -33,10 +33,9 @@ var ( ID: byte(BlockchainChannel), Priority: 5, SendQueueCapacity: 1000, - RecvBufferCapacity: 50 * 4096, + RecvBufferCapacity: 1024, RecvMessageCapacity: bc.MaxMsgSize, - - MaxSendBytes: 100, + MaxSendBytes: 100, }, }, } diff --git a/internal/blockchain/v2/reactor.go b/internal/blockchain/v2/reactor.go index 861b3033dbff..7e15d9675248 100644 --- a/internal/blockchain/v2/reactor.go +++ b/internal/blockchain/v2/reactor.go @@ -585,7 +585,7 @@ func (r *BlockchainReactor) GetChannels() []*p2p.ChannelDescriptor { ID: BlockchainChannel, Priority: 5, SendQueueCapacity: 2000, - RecvBufferCapacity: 50 * 4096, + RecvBufferCapacity: 1024, RecvMessageCapacity: bc.MaxMsgSize, }, } diff --git a/internal/consensus/reactor.go b/internal/consensus/reactor.go index eb2868f7efa3..612b83efdb35 100644 --- a/internal/consensus/reactor.go +++ b/internal/consensus/reactor.go @@ -33,11 +33,11 @@ var ( MsgType: new(tmcons.Message), Descriptor: &p2p.ChannelDescriptor{ ID: byte(StateChannel), - Priority: 6, - SendQueueCapacity: 100, + Priority: 8, + SendQueueCapacity: 64, RecvMessageCapacity: maxMsgSize, - - MaxSendBytes: 12000, + RecvBufferCapacity: 128, + MaxSendBytes: 12000, }, }, DataChannel: { @@ -47,36 +47,33 @@ var ( // stuff. Once we gossip the whole block there is nothing left to send // until next height or round. ID: byte(DataChannel), - Priority: 10, - SendQueueCapacity: 100, - RecvBufferCapacity: 50 * 4096, + Priority: 12, + SendQueueCapacity: 64, + RecvBufferCapacity: 512, RecvMessageCapacity: maxMsgSize, - - MaxSendBytes: 40000, + MaxSendBytes: 40000, }, }, VoteChannel: { MsgType: new(tmcons.Message), Descriptor: &p2p.ChannelDescriptor{ ID: byte(VoteChannel), - Priority: 7, - SendQueueCapacity: 100, - RecvBufferCapacity: 100 * 100, + Priority: 10, + SendQueueCapacity: 64, + RecvBufferCapacity: 128, RecvMessageCapacity: maxMsgSize, - - MaxSendBytes: 150, + MaxSendBytes: 150, }, }, VoteSetBitsChannel: { MsgType: new(tmcons.Message), Descriptor: &p2p.ChannelDescriptor{ ID: byte(VoteSetBitsChannel), - Priority: 1, - SendQueueCapacity: 2, - RecvBufferCapacity: 1024, + Priority: 5, + SendQueueCapacity: 8, + RecvBufferCapacity: 128, RecvMessageCapacity: maxMsgSize, - - MaxSendBytes: 50, + MaxSendBytes: 50, }, }, } diff --git a/internal/evidence/reactor.go b/internal/evidence/reactor.go index eca078f44be3..57202d5e8280 100644 --- a/internal/evidence/reactor.go +++ b/internal/evidence/reactor.go @@ -31,8 +31,8 @@ var ( ID: byte(EvidenceChannel), Priority: 6, RecvMessageCapacity: maxMsgSize, - - MaxSendBytes: 400, + RecvBufferCapacity: 32, + MaxSendBytes: 400, }, }, } diff --git a/internal/mempool/v0/reactor.go b/internal/mempool/v0/reactor.go index 1b39b0b6bb6b..5bfff0efedc8 100644 --- a/internal/mempool/v0/reactor.go +++ b/internal/mempool/v0/reactor.go @@ -104,8 +104,8 @@ func GetChannelShims(config *cfg.MempoolConfig) map[p2p.ChannelID]*p2p.ChannelDe ID: byte(mempool.MempoolChannel), Priority: 5, RecvMessageCapacity: batchMsg.Size(), - - MaxSendBytes: 5000, + RecvBufferCapacity: 128, + MaxSendBytes: 5000, }, }, } diff --git a/internal/mempool/v1/reactor.go b/internal/mempool/v1/reactor.go index 5bb2bbcbb051..6fdfe2d06e7a 100644 --- a/internal/mempool/v1/reactor.go +++ b/internal/mempool/v1/reactor.go @@ -103,8 +103,8 @@ func GetChannelShims(config *cfg.MempoolConfig) map[p2p.ChannelID]*p2p.ChannelDe ID: byte(mempool.MempoolChannel), Priority: 5, RecvMessageCapacity: batchMsg.Size(), - - MaxSendBytes: 5000, + RecvBufferCapacity: 128, + MaxSendBytes: 5000, }, }, } diff --git a/internal/p2p/pex/reactor.go b/internal/p2p/pex/reactor.go index 7ff6e35ef814..4a8738fd8622 100644 --- a/internal/p2p/pex/reactor.go +++ b/internal/p2p/pex/reactor.go @@ -51,8 +51,8 @@ func ChannelDescriptor() conn.ChannelDescriptor { Priority: 1, SendQueueCapacity: 10, RecvMessageCapacity: maxMsgSize, - - MaxSendBytes: 200, + RecvBufferCapacity: 32, + MaxSendBytes: 200, } } @@ -417,6 +417,7 @@ func (r *ReactorV2) sendRequestForPeers() { // no peers are available r.Logger.Debug("no available peers to send request to, waiting...") r.nextRequestTime = time.Now().Add(noAvailablePeersWaitPeriod) + return } var peerID types.NodeID diff --git a/internal/p2p/router.go b/internal/p2p/router.go index 9666794bc17f..ff4a34ccd0bc 100644 --- a/internal/p2p/router.go +++ b/internal/p2p/router.go @@ -19,7 +19,7 @@ import ( "github.com/tendermint/tendermint/types" ) -const queueBufferDefault = 4096 +const queueBufferDefault = 32 // ChannelID is an arbitrary channel ID. type ChannelID uint16 @@ -365,10 +365,6 @@ func (r *Router) createQueueFactory() (func(int) queue, error) { // wrapper message. The caller may provide a size to make the channel buffered, // which internally makes the inbound, outbound, and error channel buffered. func (r *Router) OpenChannel(chDesc ChannelDescriptor, messageType proto.Message, size int) (*Channel, error) { - if size == 0 { - size = queueBufferDefault - } - r.channelMtx.Lock() defer r.channelMtx.Unlock() diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go index 513000c1de1f..1e35c1c3a4aa 100644 --- a/internal/statesync/reactor.go +++ b/internal/statesync/reactor.go @@ -41,8 +41,8 @@ var ( Priority: 6, SendQueueCapacity: 10, RecvMessageCapacity: snapshotMsgSize, - - MaxSendBytes: 400, + RecvBufferCapacity: 128, + MaxSendBytes: 400, }, }, ChunkChannel: { @@ -52,8 +52,8 @@ var ( Priority: 3, SendQueueCapacity: 4, RecvMessageCapacity: chunkMsgSize, - - MaxSendBytes: 400, + RecvBufferCapacity: 128, + MaxSendBytes: 400, }, }, LightBlockChannel: { @@ -63,8 +63,8 @@ var ( Priority: 2, SendQueueCapacity: 10, RecvMessageCapacity: lightBlockMsgSize, - - MaxSendBytes: 400, + RecvBufferCapacity: 128, + MaxSendBytes: 400, }, }, } diff --git a/node/setup.go b/node/setup.go index 763713095e6c..ac48353e39f4 100644 --- a/node/setup.go +++ b/node/setup.go @@ -698,7 +698,7 @@ func createPEXReactorV2( router *p2p.Router, ) (*pex.ReactorV2, error) { - channel, err := router.OpenChannel(pex.ChannelDescriptor(), &protop2p.PexMessage{}, 4096) + channel, err := router.OpenChannel(pex.ChannelDescriptor(), &protop2p.PexMessage{}, 128) if err != nil { return nil, err }