Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_blocksonly.py
Show First 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
assert_equal(self.nodes[0].getpeerinfo()[0]['relaytxes'], True) | assert_equal(self.nodes[0].getpeerinfo()[0]['relaytxes'], True) | ||||
txid = self.nodes[0].testmempoolaccept([sigtx])[0]['txid'] | txid = self.nodes[0].testmempoolaccept([sigtx])[0]['txid'] | ||||
with self.nodes[0].assert_debug_log(['received getdata for: tx {} peer=1'.format(txid)]): | with self.nodes[0].assert_debug_log(['received getdata for: tx {} peer=1'.format(txid)]): | ||||
self.nodes[0].sendrawtransaction(sigtx) | self.nodes[0].sendrawtransaction(sigtx) | ||||
self.nodes[0].p2p.wait_for_tx(txid) | self.nodes[0].p2p.wait_for_tx(txid) | ||||
assert_equal(self.nodes[0].getmempoolinfo()['size'], 1) | assert_equal(self.nodes[0].getmempoolinfo()['size'], 1) | ||||
self.log.info( | self.log.info( | ||||
'Check that txs from forcelay peers are not rejected and relayed to others') | 'Check that txs from peers with relay-permission are not rejected' | ||||
self.log.info( | ' and relayed to others') | ||||
"Restarting node 0 with forcerelay permission and blocksonly") | self.log.info("Restarting node 0 with relay permission and blocksonly") | ||||
self.restart_node(0, | self.restart_node(0, | ||||
["-persistmempool=0", | ["-persistmempool=0", | ||||
"-whitelist=127.0.0.1", | "-whitelist=relay@127.0.0.1", | ||||
"-whitelistforcerelay", | |||||
"-blocksonly"]) | "-blocksonly"]) | ||||
assert_equal(self.nodes[0].getrawmempool(), []) | assert_equal(self.nodes[0].getrawmempool(), []) | ||||
first_peer = self.nodes[0].add_p2p_connection(P2PInterface()) | first_peer = self.nodes[0].add_p2p_connection(P2PInterface()) | ||||
second_peer = self.nodes[0].add_p2p_connection(P2PInterface()) | second_peer = self.nodes[0].add_p2p_connection(P2PInterface()) | ||||
peer_1_info = self.nodes[0].getpeerinfo()[0] | peer_1_info = self.nodes[0].getpeerinfo()[0] | ||||
assert_equal(peer_1_info['whitelisted'], True) | assert_equal(peer_1_info['permissions'], ['relay']) | ||||
assert_equal( | |||||
peer_1_info['permissions'], [ | |||||
'noban', 'forcerelay', 'relay', 'mempool', 'download']) | |||||
peer_2_info = self.nodes[0].getpeerinfo()[1] | peer_2_info = self.nodes[0].getpeerinfo()[1] | ||||
assert_equal(peer_2_info['whitelisted'], True) | assert_equal(peer_2_info['permissions'], ['relay']) | ||||
assert_equal( | |||||
peer_2_info['permissions'], [ | |||||
'noban', 'forcerelay', 'relay', 'mempool', 'download']) | |||||
assert_equal( | assert_equal( | ||||
self.nodes[0].testmempoolaccept( | self.nodes[0].testmempoolaccept( | ||||
[sigtx])[0]['allowed'], True) | [sigtx])[0]['allowed'], True) | ||||
txid = self.nodes[0].testmempoolaccept([sigtx])[0]['txid'] | txid = self.nodes[0].testmempoolaccept([sigtx])[0]['txid'] | ||||
self.log.info( | self.log.info( | ||||
'Check that the tx from forcerelay first_peer is relayed to others (ie.second_peer)') | 'Check that the tx from first_peer with relay-permission is ' | ||||
'relayed to others (ie.second_peer)') | |||||
with self.nodes[0].assert_debug_log(["received getdata"]): | with self.nodes[0].assert_debug_log(["received getdata"]): | ||||
# Note that normally, first_peer would never send us transactions | |||||
# since we're a blocksonly node. By activating blocksonly, we | |||||
# explicitly tell our peers that they should not send us | |||||
# transactions, and Bitcoin ABC respects that choice and will not | |||||
# send transactions. | |||||
# But if, for some reason, first_peer decides to relay transactions | |||||
# to us anyway, we should relay them to second_peer since we gave | |||||
# relay permission to first_peer. | |||||
# See https://github.com/bitcoin/bitcoin/issues/19943 for details. | |||||
first_peer.send_message(msg_tx(FromHex(CTransaction(), sigtx))) | first_peer.send_message(msg_tx(FromHex(CTransaction(), sigtx))) | ||||
self.log.info( | self.log.info( | ||||
'Check that the forcerelay peer is still connected after sending the transaction') | 'Check that the peer with relay-permission is still connected' | ||||
' after sending the transaction') | |||||
assert_equal(first_peer.is_connected, True) | assert_equal(first_peer.is_connected, True) | ||||
second_peer.wait_for_tx(txid) | second_peer.wait_for_tx(txid) | ||||
assert_equal(self.nodes[0].getmempoolinfo()['size'], 1) | assert_equal(self.nodes[0].getmempoolinfo()['size'], 1) | ||||
self.log.info("Forcerelay peer's transaction is accepted and relayed") | self.log.info( | ||||
"Relay-permission peer's transaction is accepted and relayed") | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
P2PBlocksOnly().main() | P2PBlocksOnly().main() |