tendermint/test/p2p
Ethan Buchman 9293ae76bf p2p: introduce peerConn to simplify peer creation (#1226)
* expose AuthEnc in the P2P config

if AuthEnc is true, dialed peers must have a node ID in the address and
it must match the persistent pubkey from the secret handshake.

Refs #1157

* fixes after my own review

* fix docs

* fix build failure

```
p2p/pex/pex_reactor_test.go:288:88: cannot use seed.NodeInfo().NetAddress() (type *p2p.NetAddress) as type string in array or slice literal
```

* p2p: introduce peerConn to simplify peer creation

* Introduce `peerConn` containing the known fields of `peer`
* `peer` only created in `sw.addPeer` once handshake is complete and NodeInfo is checked
* Eliminates some mutable variables and makes the code flow better
* Simplifies the `newXxxPeer` funcs
* Use ID instead of PubKey where possible.
        * SetPubKeyFilter -> SetIDFilter
        * nodeInfo.Validate takes ID
        * remove peer.PubKey()

* persistent node ids

* fixes from review

* test: use ip_plus_id.sh more

* fix invalid memory panic during fast_sync test

```
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: panic: runtime error: invalid memory address or nil pointer dereference
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: [signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x98dd3e]
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]:
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: goroutine 3432 [running]:
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.newOutboundPeerConn(0xc423fd1380, 0xc420933e00, 0x1, 0x1239a60, 0
xc420128c40, 0x2, 0x42caf6, 0xc42001f300, 0xc422831d98, 0xc4227951c0, ...)
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/peer.go:123 +0x31e
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).addOutboundPeerWithConfig(0xc4200ad040, 0xc423fd1380, 0
xc420933e00, 0xc423f48801, 0x28, 0x2)
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:455 +0x12b
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).DialPeerWithAddress(0xc4200ad040, 0xc423fd1380, 0x1, 0x
0, 0x0)
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:371 +0xdc
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: github.com/tendermint/tendermint/p2p.(*Switch).reconnectToPeer(0xc4200ad040, 0x123e000, 0xc42007bb00)
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:290 +0x25f
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: created by github.com/tendermint/tendermint/p2p.(*Switch).StopPeerForError
2018-02-21T06:30:05Z box887.localdomain docker/local_testnet_4[14907]: #011/go/src/github.com/tendermint/tendermint/p2p/switch.go:256 +0x1b7
```
2018-02-27 15:54:40 +04:00
..
atomic_broadcast test/p2p/atomic_broadcast: wait for node heights before checking app hash 2017-11-28 05:51:32 +00:00
basic test/p2p: add some timeouts 2017-12-29 11:02:47 -05:00
data p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00
fast_sync p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00
kill_all test/p2p/kill_all: longer timeout 2017-12-16 13:36:52 -05:00
pex p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00
README.md rename manual peers to persistent peers 2018-01-09 16:18:05 -06:00
clean.sh test: refactor bash; test fastsync (failing) 2016-08-27 14:50:07 -04:00
client.sh test/p2p: shellcheck 2017-03-06 03:49:48 -05:00
ip.sh p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00
ip_plus_id.sh p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00
local_testnet_start.sh rename manual peers to persistent peers 2018-01-09 16:18:05 -06:00
local_testnet_stop.sh test/p2p: shellcheck 2017-03-06 03:49:48 -05:00
peer.sh unescape $NODE_FLAGS (see comment) 2017-11-14 20:56:39 -06:00
persistent_peers.sh p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00
test.sh p2p: introduce peerConn to simplify peer creation (#1226) 2018-02-27 15:54:40 +04:00

README.md

Tendermint P2P Tests

These scripts facilitate setting up and testing a local testnet using docker containers.

Setup your own local testnet as follows.

For consistency, we assume all commands are run from the Tendermint repository root (ie. $GOPATH/src/github.com/tendermint/tendermint).

First, build the docker image:

docker build -t tendermint_tester -f ./test/docker/Dockerfile .

Now create the docker network:

docker network create --driver bridge --subnet 172.57.0.0/16 my_testnet

This gives us a new network with IP addresses in the rage 172.57.0.0 - 172.57.255.255. Peers on the network can have any IP address in this range. For our four node network, let's pick 172.57.0.101 - 172.57.0.104. Since we use Tendermint's default listening port of 46656, our list of seed nodes will look like:

172.57.0.101:46656,172.57.0.102:46656,172.57.0.103:46656,172.57.0.104:46656

Now we can start up the peers. We already have config files setup in test/p2p/data/. Let's use a for-loop to start our peers:

for i in $(seq 1 4); do
	docker run -d \
	  --net=my_testnet\
	  --ip="172.57.0.$((100 + $i))" \
	  --name local_testnet_$i \
	  --entrypoint tendermint \
	  -e TMHOME=/go/src/github.com/tendermint/tendermint/test/p2p/data/mach$i/core \
	  tendermint_tester node --p2p.persistent_peers 172.57.0.101:46656,172.57.0.102:46656,172.57.0.103:46656,172.57.0.104:46656 --proxy_app=dummy
done

If you now run docker ps, you'll see your containers!

We can confirm they are making blocks by checking the /status message using curl and jq to pretty print the output json:

curl 172.57.0.101:46657/status | jq .