Changeset View
Changeset View
Standalone View
Standalone View
test/functional/p2p_invalid_block.py
Show All 11 Lines | |||||
""" | """ | ||||
import copy | import copy | ||||
from test_framework.blocktools import ( | from test_framework.blocktools import ( | ||||
create_block, | create_block, | ||||
create_coinbase, | create_coinbase, | ||||
create_tx_with_script, | create_tx_with_script, | ||||
make_conform_to_ctor, | |||||
) | ) | ||||
from test_framework.messages import COIN | from test_framework.messages import COIN | ||||
from test_framework.mininode import P2PDataStore | from test_framework.mininode import P2PDataStore | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import assert_equal | from test_framework.util import assert_equal | ||||
class InvalidBlockRequestTest(BitcoinTestFramework): | class InvalidBlockRequestTest(BitcoinTestFramework): | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
assert block2_orig.vtx != block2.vtx | assert block2_orig.vtx != block2.vtx | ||||
node.p2p.send_blocks_and_test( | node.p2p.send_blocks_and_test( | ||||
[block2], node, success=False, reject_reason='bad-txns-duplicate') | [block2], node, success=False, reject_reason='bad-txns-duplicate') | ||||
# Check transactions for duplicate inputs (CVE-2018-17144) | # Check transactions for duplicate inputs (CVE-2018-17144) | ||||
self.log.info("Test duplicate input block.") | self.log.info("Test duplicate input block.") | ||||
block2_orig.vtx[2].vin.append(block2_orig.vtx[2].vin[0]) | block2_dup = copy.deepcopy(block2_orig) | ||||
block2.vtx = [block2.vtx[0]] + \ | block2_dup.vtx[2].vin.append(block2_dup.vtx[2].vin[0]) | ||||
sorted(block2.vtx[1:], key=lambda tx: tx.get_id()) | block2_dup.vtx[2].rehash() | ||||
block2_orig.vtx[2].rehash() | make_conform_to_ctor(block2_dup) | ||||
block2_orig.hashMerkleRoot = block2_orig.calc_merkle_root() | block2_dup.hashMerkleRoot = block2_dup.calc_merkle_root() | ||||
block2_orig.rehash() | block2_dup.rehash() | ||||
block2_orig.solve() | block2_dup.solve() | ||||
node.p2p.send_blocks_and_test( | node.p2p.send_blocks_and_test( | ||||
[block2_orig], node, success=False, reject_reason='bad-txns-inputs-duplicate') | [block2_dup], node, success=False, | ||||
reject_reason='bad-txns-inputs-duplicate') | |||||
self.log.info("Test very broken block.") | self.log.info("Test very broken block.") | ||||
block3 = create_block(tip, create_coinbase(height), block_time) | block3 = create_block(tip, create_coinbase(height), block_time) | ||||
block_time += 1 | block_time += 1 | ||||
block3.vtx[0].vout[0].nValue = 100 * COIN # Too high! | block3.vtx[0].vout[0].nValue = 100 * COIN # Too high! | ||||
block3.vtx[0].sha256 = None | block3.vtx[0].sha256 = None | ||||
block3.vtx[0].calc_sha256() | block3.vtx[0].calc_sha256() | ||||
block3.hashMerkleRoot = block3.calc_merkle_root() | block3.hashMerkleRoot = block3.calc_merkle_root() | ||||
block3.rehash() | block3.rehash() | ||||
block3.solve() | block3.solve() | ||||
node.p2p.send_blocks_and_test( | node.p2p.send_blocks_and_test( | ||||
[block3], node, success=False, reject_reason='bad-cb-amount') | [block3], node, success=False, reject_reason='bad-cb-amount') | ||||
# Complete testing of CVE-2012-2459 by sending the original block. | |||||
# It should be accepted even though it has the same hash as the mutated | |||||
# one. | |||||
self.log.info("Test accepting original block after rejecting its" | |||||
" mutated version.") | |||||
node.p2p.send_blocks_and_test([block2_orig], node, success=True, | |||||
timeout=5) | |||||
# Update tip info | |||||
height += 1 | |||||
block_time += 1 | |||||
tip = int(block2_orig.hash, 16) | |||||
# Complete testing of CVE-2018-17144, by checking for the inflation bug. | |||||
# Create a block that spends the output of a tx in a previous block. | |||||
block4 = create_block(tip, create_coinbase(height), block_time) | |||||
tx3 = create_tx_with_script(tx2, 0, script_sig=b'\x51', | |||||
amount=50 * COIN) | |||||
# Duplicates input | |||||
tx3.vin.append(tx3.vin[0]) | |||||
tx3.rehash() | |||||
block4.vtx.append(tx3) | |||||
make_conform_to_ctor(block4) | |||||
block4.hashMerkleRoot = block4.calc_merkle_root() | |||||
block4.rehash() | |||||
block4.solve() | |||||
self.log.info("Test inflation by duplicating input") | |||||
node.p2p.send_blocks_and_test([block4], node, success=False, | |||||
reject_reason='bad-txns-inputs-duplicate') | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
InvalidBlockRequestTest().main() | InvalidBlockRequestTest().main() |