390 Commits

Author SHA1 Message Date
jangko
63add129b8
replace two bootnodes
see https://github.com/ethereum/go-ethereum/pull/24432/files
and https://github.com/status-im/nimbus-eth1/issues/978
2022-02-27 10:17:56 +07:00
Zahary Karadjov
f947827c70
Debug logs providing info for the initial discoveryv5 configuration 2022-02-18 17:42:37 +02:00
Kim De Mey
05ef9a8e00
More --styleCheck fixes for discoveryv5 and eth/common (#473) 2022-02-03 15:51:08 +01:00
Kim De Mey
41edd4a3f2
Add DiscoveryConfig to tune routing table ip limits and bitPerHops (#471) 2022-02-02 15:29:45 +01:00
KonradStaniec
9a7b1afe9b
Add custom talkreq implementation (#464)
* Add custom talkreq implementation to utp over discv5
2022-01-24 11:58:35 +01:00
Kim De Mey
42e257796f
Add discoveryv5 session metrics (#454) 2021-12-21 15:09:46 +01:00
Kim De Mey
8b7d41f596
Don't use exceptions for enr get call (#453)
The ENR code used to be solely exception based, and these
exceptions where a left-over of that. They are useless as later
calls use Result anyhow.

Additionally, they cause quite the performance loss because they
are used in the "common path" for the toTypedRecord call, e.g.
when reading the fields of ip6, tcp6 and udp6.
2021-12-21 15:09:32 +01:00
Kim De Mey
2c236f6495
Style fixes according to --styleCheck:usages (#452)
Currently only setting `--styleCheck:hint` as there are some
dependency fixes required and the compiler seems to trip over the
findnode MessageKind, findnode Message field and the findNode
proc. Also over protocol.Protocol usage.
2021-12-20 13:14:50 +01:00
Etan Kissling
5655bd035c
Merge pull request #450 from etan-status/reject-whoareyou-len
reject WHOAREYOU packets with non-empty message
2021-12-14 16:22:25 +01:00
Ștefan Talpalaru
2088d7568d
CI: test with multiple Nim version (#429)
* CI: test with multiple Nim version

* clean up the testing tree a little

* replace "unittest" with "unittest2"
2021-12-11 19:12:55 +01:00
Etan Kissling
45387ad4d2
reject WHOAREYOU packets with non-empty message
This changes the `discv5` parser to reject malformed WHOAREYOU packets
that have a non-0 message length. The extra data used to be ignored.
The `message` part of WHOAREYOU packets is always empty.
See https://github.com/ethereum/devp2p/blob/master/discv5/discv5-wire.md
2021-12-11 15:55:14 +01:00
Etan Kissling
fb7ea69eb4
Merge pull request #449 from etan-status/encryptgcm-type
more specific type check in `encryptGCM`
2021-12-11 14:50:35 +01:00
Etan Kissling
172dad7968
more specific type check in encryptGCM
Narrowed the type of `encryptGCM`'s `key` parameter from
`openarray[byte]` to `AesKey`, same as already used for `decryptGCM`.
2021-12-11 12:41:18 +01:00
Kim De Mey
ae0920d40d
Remove hashData usage on objects (#441)
* Remove hashData usage on objects

* Add hash func for NodeId to avoid using the one of stint
2021-12-06 15:24:07 +01:00
Kim De Mey
6e21b32f0d
Allow a node to self resolve (#439) 2021-12-02 11:10:26 +01:00
Jamie Lokier
6a8d49e4c0 Security/RLPx: Fix crash when peer sends out of bounds message id
Closes [nimbus-eth1#767](https://github.com/status-im/nimbus-eth1/issues/767).

Crashes occur when certain invalid RLPx messages are received from a peer.
Specifically, `msgId` out of range.  Because any peer can easily trigger this
crash, we'd consider it a DOS vulnerability if Nimbus-eth1 was in general use.

We noticed when syncing to Goerli, there were some rare crashes with this
exception.  It turned out one peer with custom code, perhaps malfunctioning,
was sending these messages if we were unlucky enough to connect to it.

`invokeThunk` is called from `dispatchMessages` and checks the range of
`msgId`.  It correctly recognise that it's out of range, raises and exception
and produces a message.  Job done.

Except the code in `dispatchMessage` treats all that as a warning instead of
error, and continues to process the message.  A bit lower down, `msgId` is used
again without a range check.

The trivial fix is to check array bounds before access.

--

ps. Here's the stack trace ("reraised" sections hidden):

```
WRN 2021-11-08 21:29:33.238+00:00 Error while handling RLPx message          topics="rlpx" tid=2003472 file=rlpx.nim:607 peer=Node[<IP>:45456] msg=45 err="RLPx message with an invalid id 45 on a connection supporting eth,snap"
/home/jamie/Status/nimbus-eth1/nimbus/p2p/chain/chain_desc.nim(437) main
/home/jamie/Status/nimbus-eth1/nimbus/p2p/chain/chain_desc.nim(430) NimMain
/home/jamie/Status/nimbus-eth1/nimbus/nimbus.nim(258) process
/home/jamie/Status/nimbus-eth1/vendor/nim-chronos/chronos/asyncloop.nim(279) poll
/home/jamie/Status/nimbus-eth1/vendor/nim-chronos/chronos/asyncmacro2.nim(74) colonanonymous
/home/jamie/Status/nimbus-eth1/vendor/nim-eth/eth/p2p/rlpx.nim(1218) rlpxAccept
/home/jamie/Status/nimbus-eth1/vendor/nim-chronos/chronos/asyncmacro2.nim(101) postHelloSteps
/home/jamie/Status/nimbus-eth1/vendor/nim-chronos/chronos/asyncmacro2.nim(74) colonanonymous
/home/jamie/Status/nimbus-eth1/vendor/nim-eth/eth/p2p/rlpx.nim(985) postHelloSteps
/home/jamie/Status/nimbus-eth1/vendor/nim-chronos/chronos/asyncmacro2.nim(101) dispatchMessages
/home/jamie/Status/nimbus-eth1/vendor/nim-chronos/chronos/asyncmacro2.nim(77) colonanonymous
/home/jamie/Status/nimbus-eth1/vendor/nim-eth/eth/p2p/rlpx.nim(614) dispatchMessages
/home/jamie/Status/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/chcks.nim(23) raiseIndexError2
/home/jamie/Status/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/fatal.nim(49) sysFatal
[[reraised from: ... ]]
[[reraised from: ... ]]
[[reraised from: ... ]]
[[reraised from: ... ]]
Error: unhandled exception: index 45 not in 0 .. 40 [IndexError]
```

Signed-off-by: Jamie Lokier <jamie@shareable.org>
2021-11-30 20:03:01 +02:00
Kim De Mey
ae0574fe61
Adjust logging when node is not reachable but enrAutoUpdate is on (#436)
Separate the logging when the node is not reachable and
enrAutoUpdate is on or off to avoid confusion whether or not the
node might still become reachable.
2021-11-29 22:13:08 +01:00
Kim De Mey
84f755d792
Revert the useless async change for queryRandom (#432) 2021-11-22 23:14:37 +01:00
Kim De Mey
086162183c
Make queryRandom async and add exports (#431)
queryRandom was currently only async for the `enrField` version.
However the basic queryRandom is also exported and thus gets
changed so it can be properly used as async proc.

Also added exports for the modules of which objects are used in
the discovery public API.
2021-11-22 19:45:38 +01:00
Kim De Mey
e606d8c79e
Export discovery routing table and its buckets nodes (#430) 2021-11-22 18:53:52 +01:00
Kim De Mey
22757db83b
Fix logDistance for BE arch and remove toBytes for NodeId (#427)
toBytes for NodeId wasn't selected by compiler byt if it does
get selected, it will fail on the test cases due to the
countdown that is done in logDistance.
Set to toBytesBE properly now and do countup, that should make
it correct also for BE architecture.

Removed toBytes to avoid confusion and avoid this one being
selected ever. The only place toBytes for NodeId was used is in
sessions.nim makeKey func and there also the stint one
(thus native endianness) was selected in Nim 1.2.x.
Native endianness is fine there as it is only an internal
representation.
2021-11-17 22:55:19 +01:00
Kim De Mey
9a1bb5e125
Make ENR $ call print the IP address prettier (#409) 2021-10-19 14:13:09 +02:00
Kim De Mey
f101c83626
Enr rlp lists (#408)
* Don't fail ENR decoding when value is an RLP list

* Store RLP raw list in the ENR field pair instead

* Add ENR kList FieldKind so lists can be treated differently

Treated differently now when printing out the ENR, mentioning
that it is a raw RLP list
2021-10-19 09:26:14 +02:00
Kim De Mey
5125a438db
Make the custom distances call somewhat more accessible (#404)
And make the naming more consistent
2021-10-07 16:03:12 +02:00
Kim De Mey
1babe38226
Allow for tcp/udp ports to always be configured (#402)
* Allow for tcp/udp ports to always be configured

- Allow for an ENR to be build with tcp and udp ports also when
no IP address is provided
- In the address set-up always provide best efforttcp and udp ports
also when configuration of external ip (and/or ports) fails.
2021-09-29 18:50:23 +02:00
Zahary Karadjov
5327565f95
Add accessor for the discv5 listening address (Protocol.bindAddress) 2021-09-29 01:43:00 +03:00
KonradStaniec
a95b205cf7
Modify nodes verification (#398)
* Modify nodes verification

* Move nodes verification to separate module

By moving verification to separate module it can be re-used
in different contexts not only in discoveryv5.
2021-09-13 14:20:26 +02:00
KonradStaniec
e219547d64
Fix lookupDistances function and make it public (#399) 2021-09-10 17:26:22 +02:00
Kim De Mey
df6020832b
Build fuzzing tests in CI and fix current fuzzing tests (#396)
* Build fuzzing tests in CI and fix current fuzzing tests

* Build fuzzing tests separately (fix Windows CI)
2021-09-07 16:00:01 +02:00
Kim De Mey
bea1f1c6a1
Clean-up routing table object constructions (#395) 2021-09-07 11:56:16 +02:00
KonradStaniec
c078f85e48
Expose id and address of talkreq sender (#393) 2021-09-07 10:49:18 +02:00
KonradStaniec
bfadcfbfaf
Make Routing table distance function configurable (#392) 2021-09-02 14:00:36 +02:00
Jamie Lokier
9a28ed7ef5 RLPx: Protocol names have never been limited to 3 characters
Don't treat 3 characters as special in `cmp`.  `cmp` for `ProtocolInfo` was
wrong because it ignored all characters after the first 3.

In the wild we have seen protocol names longer than 3 characters.  `snap`,
`hive`, `istanbul`, `bzzeth`, `bzz-stream`, `bzz-retrieve`, `dbix`, `opera`,
`pchain`, `pchain_child_0`, `sero`, `smilobft`, `spock`.

There was never a 3 character limit in the [specification]
(https://github.com/ethereum/devp2p/blob/master/rlpx.md).

It always said "short ASCII name", until recently on 2021-02-25 it was changed
to an 8 characters limit.

Also `pi.nameStr` can be removed.  Nothing uses it, and it has the same actual
effect as just copying the string `pi.name`.

Signed-off-by: Jamie Lokier <jamie@shareable.org>
2021-08-10 14:08:35 +03:00
Jamie Lokier
5234e30f8b Remove {.rlpInline.} which was never really implemented
For a long time this caused invalid RLP parsing of `NewBlock` messages in the
`eth` protocol.

The `rlpInline` pragma was accepted but had no effect.  We could implemented
it, but it doesn't seem worth doing, with tests etc, as there's only one user
which has been fixed another way.

With `NewBlock`, whenever a peer sent us `NewBlock`, we'd get an RLP decoding
error, and disconnected the peer thinking it was the peer's error.

These messages are sent often by good peers, so whenever we connected to a
really good peer, we'd end up disconnecting within a minute due to this.  This
went unnoticed for years, as we stayed connected to old peers which have no new
blocks, and we weren't looking at peer quality, disconnect reasons or real-time
blockchain updates anyway.

Signed-off-by: Jamie Lokier <jamie@shareable.org>
2021-08-10 14:08:35 +03:00
Kim De Mey
9bc4fa366a
Let talkreq directly return the seq[byte] for easier API (#384) 2021-07-30 16:04:14 +02:00
Kim De Mey
dd02d1be23
Remove unused lastUpdated from buckets (#382) 2021-07-29 21:58:10 +02:00
Kim De Mey
a8d11dd30b
Add top level push raises Defect to p2p code (#374) 2021-07-16 21:44:30 +02:00
Kim De Mey
2557fd35c6
Use aesKeySize const for aes key instead if ivSize (same values) (#375) 2021-07-16 14:55:52 +02:00
Kim De Mey
eb0908e33f
Push raises Defect to rlpx and accompanying changes (#373) 2021-07-14 10:35:35 +02:00
Kim De Mey
79911ed5d8
Log distance to uint16 and add public neighbours calls (#371)
* Use uint16 instead of uint32 for discv5 log distance

* Make neighboursAtDistances and neighbours calls available
2021-07-13 10:05:46 +02:00
Kim De Mey
41127eaee8
Remove portal wire code which was moved to nimbus-eth1 repo (#370) 2021-07-09 22:14:31 +02:00
kdeme
1c400e3f0e
Improve Portal message tracing 2021-06-09 14:57:35 +02:00
kdeme
880b753ad2
Add Portal wire readme doc 2021-06-09 14:57:35 +02:00
kdeme
e2e30247bf
Add implementation of Portal wire protocol 2021-06-09 14:57:30 +02:00
Kim De Mey
d18ebaa570
Slightly improved logging traces for error on message responses (#364) 2021-06-09 14:55:00 +02:00
Kim De Mey
8abe6b7144
Add support for discv5 talk protocols (#357) 2021-05-20 09:49:46 +02:00
Kim De Mey
d05cb5d3bd
Fix raw Exceptions in hexary caused by forward declarations (#349)
* Fix raw Exceptions in hexary caused by forward declarations

* Fix raw Exceptions in trie/db caused by forward declarations

* And now we can remove those db Proc CatchableError raises
2021-05-11 17:32:47 +02:00
kdeme
00a45a7b91
Remove inline pragmas 2021-05-11 09:59:58 +02:00
kdeme
81f0a56ebd
Add/update bunch of license headers 2021-05-11 09:37:33 +02:00
kdeme
755729c6a1
Fix several compiler warnings
Mostly replacing deprecated calls
2021-05-11 09:24:23 +02:00