|
|
@ -764,6 +764,54 @@ class CompactBlocksTest(BitcoinTestFramework): |
|
|
|
msg.announce = True |
|
|
|
msg.announce = True |
|
|
|
peer.send_and_ping(msg) |
|
|
|
peer.send_and_ping(msg) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_compactblock_reconstruction_multiple_peers(self, node, stalling_peer, delivery_peer): |
|
|
|
|
|
|
|
assert(len(self.utxos)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def announce_cmpct_block(node, peer): |
|
|
|
|
|
|
|
utxo = self.utxos.pop(0) |
|
|
|
|
|
|
|
block = self.build_block_with_transactions(node, utxo, 5) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmpct_block = HeaderAndShortIDs() |
|
|
|
|
|
|
|
cmpct_block.initialize_from_block(block) |
|
|
|
|
|
|
|
msg = msg_cmpctblock(cmpct_block.to_p2p()) |
|
|
|
|
|
|
|
peer.send_and_ping(msg) |
|
|
|
|
|
|
|
with mininode_lock: |
|
|
|
|
|
|
|
assert(peer.last_getblocktxn is not None) |
|
|
|
|
|
|
|
return block, cmpct_block |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
block, cmpct_block = announce_cmpct_block(node, stalling_peer) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for tx in block.vtx[1:]: |
|
|
|
|
|
|
|
delivery_peer.send_message(msg_tx(tx)) |
|
|
|
|
|
|
|
delivery_peer.sync_with_ping() |
|
|
|
|
|
|
|
mempool = node.getrawmempool() |
|
|
|
|
|
|
|
for tx in block.vtx[1:]: |
|
|
|
|
|
|
|
assert(tx.hash in mempool) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
delivery_peer.send_and_ping(msg_cmpctblock(cmpct_block.to_p2p())) |
|
|
|
|
|
|
|
assert_equal(int(node.getbestblockhash(), 16), block.sha256) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.utxos.append([block.vtx[-1].sha256, 0, block.vtx[-1].vout[0].nValue]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Now test that delivering an invalid compact block won't break relay |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
block, cmpct_block = announce_cmpct_block(node, stalling_peer) |
|
|
|
|
|
|
|
for tx in block.vtx[1:]: |
|
|
|
|
|
|
|
delivery_peer.send_message(msg_tx(tx)) |
|
|
|
|
|
|
|
delivery_peer.sync_with_ping() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmpct_block.prefilled_txn[0].tx.wit.vtxinwit = [ CTxInWitness() ] |
|
|
|
|
|
|
|
cmpct_block.prefilled_txn[0].tx.wit.vtxinwit[0].scriptWitness.stack = [ser_uint256(0)] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmpct_block.use_witness = True |
|
|
|
|
|
|
|
delivery_peer.send_and_ping(msg_cmpctblock(cmpct_block.to_p2p())) |
|
|
|
|
|
|
|
assert(int(node.getbestblockhash(), 16) != block.sha256) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
msg = msg_blocktxn() |
|
|
|
|
|
|
|
msg.block_transactions.blockhash = block.sha256 |
|
|
|
|
|
|
|
msg.block_transactions.transactions = block.vtx[1:] |
|
|
|
|
|
|
|
stalling_peer.send_and_ping(msg) |
|
|
|
|
|
|
|
assert_equal(int(node.getbestblockhash(), 16), block.sha256) |
|
|
|
|
|
|
|
|
|
|
|
def run_test(self): |
|
|
|
def run_test(self): |
|
|
|
# Setup the p2p connections and start up the network thread. |
|
|
|
# Setup the p2p connections and start up the network thread. |
|
|
@ -848,6 +896,10 @@ class CompactBlocksTest(BitcoinTestFramework): |
|
|
|
self.test_invalid_tx_in_compactblock(self.nodes[1], self.segwit_node, False) |
|
|
|
self.test_invalid_tx_in_compactblock(self.nodes[1], self.segwit_node, False) |
|
|
|
self.test_invalid_tx_in_compactblock(self.nodes[1], self.old_node, False) |
|
|
|
self.test_invalid_tx_in_compactblock(self.nodes[1], self.old_node, False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("\tTesting reconstructing compact blocks from all peers...") |
|
|
|
|
|
|
|
self.test_compactblock_reconstruction_multiple_peers(self.nodes[1], self.segwit_node, self.old_node) |
|
|
|
|
|
|
|
sync_blocks(self.nodes) |
|
|
|
|
|
|
|
|
|
|
|
# Advance to segwit activation |
|
|
|
# Advance to segwit activation |
|
|
|
print ("\nAdvancing to segwit activation\n") |
|
|
|
print ("\nAdvancing to segwit activation\n") |
|
|
|
self.activate_segwit(self.nodes[1]) |
|
|
|
self.activate_segwit(self.nodes[1]) |
|
|
|