neoneo-go/pkg/network
Roman Khimov 7fc153ed2a network: only ask mempool for intersections with received Inv
Most of the time on healthy network we see new transactions appearing that are
not present in the mempool. Once they get into mempool we don't ask for them
again when some other peer sends an Inv with them. Then these transactions are
usually added into block, removed from mempool and no one actually sends them
again to us. Some stale nodes can do that, but it's not very likely to
happen.

At the receiving end at the same time it's quite expensive to do full chain
HasTransaction() query, so if we can avoid doing that it's always good. Here
it technically allows resending old transaction that will be re-requested and
an attempt to add it to mempool will be made. But it'll inevitably fail
because the same HasTransaction() check is done there too. One can try to
maliciously flood the node with stale transactions but it doesn't differ from
flooding it with any other invalid transactions, so there is no new attack
vector added.

Baseline, 4 nodes with 10 workers:

RPS    6902.296 6465.662 6856.044 6785.515 6157.024 ≈ 6633   ± 4.26%
TPS    6468.431 6218.867 6610.565 6288.596 5790.556 ≈ 6275   ± 4.44%
CPU %    50.231   42.925   49.481   48.396   42.662 ≈   46.7 ± 7.01%
Mem MB 2856.841 2684.103 2756.195 2733.485 2422.787 ≈ 2691   ± 5.40%

Patched:

RPS    7176.784 7014.511 6139.663 7191.280 7080.852 ≈ 6921   ± 5.72% ↑ 4.34%
TPS    6945.409 6562.756 5927.050 6681.187 6821.794 ≈ 6588   ± 5.38% ↑ 4.99%
CPU %    44.400   43.842   40.418   49.211   49.370 ≈   45.4 ± 7.53% ↓ 2.78%
Mem MB 2693.414 2640.602 2472.007 2731.482 2707.879 ≈ 2649   ± 3.53% ↓ 1.56%
2021-08-06 20:53:02 +03:00
..
capability *: enable godot linter and fix all its warnings 2021-05-12 23:17:03 +03:00
extpool *: increase GAS for verification 2021-07-14 10:27:09 +03:00
metrics cli,pkg: use zap.Logger 2020-01-10 11:14:27 +03:00
payload rpc: allow to track notary requests via Notification subsystem 2021-06-01 16:29:04 +03:00
blockqueue.go network: restrict block queue size 2020-09-02 17:04:49 +03:00
blockqueue_test.go block: replace Base with Header 2021-03-10 13:38:44 +03:00
compress.go network: handle length mismatch in decompression routine 2020-08-03 22:38:55 +03:00
discovery.go *: enable godot linter and fix all its warnings 2021-05-12 23:17:03 +03:00
discovery_test.go network: optimize waiting in test 2021-07-08 11:14:35 +03:00
helper_test.go *: drop unused structure fields 2021-05-12 19:41:23 +03:00
message.go network: use optimized decoder for transactions 2021-08-04 23:49:07 +03:00
message_string.go network: replace ConsensusType with ExtensibleType 2021-01-22 10:38:33 +03:00
message_test.go network: drop Network from Message 2021-03-26 13:45:18 +03:00
notary_feer.go core: introduce mempool notifications 2021-02-02 22:01:32 +03:00
peer.go network: support non-blocking broadcast 2020-12-25 14:36:52 +03:00
prometheus.go monitoring: add prometheus monitoring 2019-10-29 20:51:17 +03:00
server.go network: only ask mempool for intersections with received Inv 2021-08-06 20:53:02 +03:00
server_config.go network: limit message number from the same sender 2021-05-12 10:52:11 +03:00
server_test.go network: only ask mempool for intersections with received Inv 2021-08-06 20:53:02 +03:00
tcp_peer.go network: handle incoming message in a separate goroutine 2021-08-06 19:37:37 +03:00
tcp_peer_test.go protocol: add capabilities to version payload 2020-05-27 19:01:14 +03:00
tcp_transport.go network: don't log transport errors on exit 2021-07-08 10:40:54 +03:00
transport.go protocol: add capabilities to version payload 2020-05-27 19:01:14 +03:00