Merge bitcoin/bitcoin#14604: tests: Add test and refactor feature_block.py

55311197c483477b79883da5da09f2bc71acc7cf Added new test for future blocks reacceptance (sanket1729)
511a5af4622915c236cfb11df5234232c2983e45 Fixed inconsistencies between code and comments (sanket1729)

Pull request description:

  This Commit does 3 things:
  1) Adds a test case for checking reacceptance a previously rejected block which
  was too far in the future.
  ~~2) clean up uses of rehash or calc_sha256 where it was not needed~~
  3) While constructing block 44, this commit makes the code consistent with the expected figure in
  the comment just above it by adding a transaction to the block.
  4) Fix comment describing `sign_tx()` function

ACKs for top commit:
  duncandean:
    reACK 5531119
  brunoerg:
    reACK 55311197c483477b79883da5da09f2bc71acc7cf

Tree-SHA512: d40c72fcdbb0b2a0715adc58441eeea08147ee2ec5e371a4ccc824ebfdc6450698bd40aaeecb7ea7bfdb3cd1b264dd821b890276fff8b8d89b7225cdd9d6b546
This commit is contained in:
MarcoFalke 2021-06-18 18:08:44 +02:00 committed by PastaPastaPasta
parent d667e57dc6
commit 7fbc0f359c

View File

@ -5,6 +5,7 @@
"""Test block processing.""" """Test block processing."""
import copy import copy
import struct import struct
import time
from test_framework.blocktools import ( from test_framework.blocktools import (
create_block, create_block,
@ -600,6 +601,8 @@ class FullBlockTest(BitcoinTestFramework):
b44.hashPrevBlock = self.tip.sha256 b44.hashPrevBlock = self.tip.sha256
b44.nBits = 0x207fffff b44.nBits = 0x207fffff
b44.vtx.append(coinbase) b44.vtx.append(coinbase)
tx = self.create_and_sign_transaction(out[14], 1)
b44.vtx.append(tx)
b44.hashMerkleRoot = b44.calc_merkle_root() b44.hashMerkleRoot = b44.calc_merkle_root()
b44.solve() b44.solve()
self.tip = b44 self.tip = b44
@ -687,7 +690,7 @@ class FullBlockTest(BitcoinTestFramework):
# Test block timestamps # Test block timestamps
# -> b31 (8) -> b33 (9) -> b35 (10) -> b39 (11) -> b42 (12) -> b43 (13) -> b53 (14) -> b55 (15) # -> b31 (8) -> b33 (9) -> b35 (10) -> b39 (11) -> b42 (12) -> b43 (13) -> b53 (14) -> b55 (15)
# \-> b54 (15) # \-> b54 (15)
# # -> b44 (14)\-> b48 ()
self.move_tip(43) self.move_tip(43)
b53 = self.next_block(53, spend=out[14]) b53 = self.next_block(53, spend=out[14])
self.send_blocks([b53], False) self.send_blocks([b53], False)
@ -707,6 +710,21 @@ class FullBlockTest(BitcoinTestFramework):
self.send_blocks([b55], True) self.send_blocks([b55], True)
self.save_spendable_output() self.save_spendable_output()
# The block which was previously rejected because of being "too far(3 hours)" must be accepted 2 hours later.
# The new block is only 1 hour into future now and we must reorg onto to the new longer chain.
# The new bestblock b48p is invalidated manually.
# -> b31 (8) -> b33 (9) -> b35 (10) -> b39 (11) -> b42 (12) -> b43 (13) -> b53 (14) -> b55 (15)
# \-> b54 (15)
# -> b44 (14)\-> b48 () -> b48p ()
self.log.info("Accept a previously rejected future block at a later time")
node.setmocktime(int(time.time()) + 2*60*60)
self.move_tip(48)
self.block_heights[b48.sha256] = self.block_heights[b44.sha256] + 1 # b48 is a parent of b44
b48p = self.next_block("48p")
self.send_blocks([b48, b48p], success=True) # Reorg to the longer chain
node.invalidateblock(b48p.hash) # mark b48p as invalid
node.setmocktime(0)
# Test Merkle tree malleability # Test Merkle tree malleability
# #
# -> b42 (12) -> b43 (13) -> b53 (14) -> b55 (15) -> b57p2 (16) # -> b42 (12) -> b43 (13) -> b53 (14) -> b55 (15) -> b57p2 (16)
@ -1317,7 +1335,7 @@ class FullBlockTest(BitcoinTestFramework):
return create_tx_with_script(spend_tx, n, amount=value, script_pub_key=script) return create_tx_with_script(spend_tx, n, amount=value, script_pub_key=script)
# sign a transaction, using the key we know about # sign a transaction, using the key we know about
# this signs input 0 in tx, which is assumed to be spending output n in spend_tx # this signs input 0 in tx, which is assumed to be spending output 0 in spend_tx
def sign_tx(self, tx, spend_tx): def sign_tx(self, tx, spend_tx):
scriptPubKey = bytearray(spend_tx.vout[0].scriptPubKey) scriptPubKey = bytearray(spend_tx.vout[0].scriptPubKey)
if (scriptPubKey[0] == OP_TRUE): # an anyone-can-spend if (scriptPubKey[0] == OP_TRUE): # an anyone-can-spend