Changeset View
Changeset View
Standalone View
Standalone View
test/functional/feature_block.py
Show First 20 Lines • Show All 489 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
self.tip = b46 | self.tip = b46 | ||||
assert 46 not in self.blocks | assert 46 not in self.blocks | ||||
self.blocks[46] = b46 | self.blocks[46] = b46 | ||||
self.send_blocks([b46], success=False, | self.send_blocks([b46], success=False, | ||||
reject_reason='bad-cb-missing', reconnect=True) | reject_reason='bad-cb-missing', reconnect=True) | ||||
self.log.info("Reject a block with invalid work") | self.log.info("Reject a block with invalid work") | ||||
self.move_tip(44) | self.move_tip(44) | ||||
b47 = self.next_block(47, solve=False) | b47 = self.next_block(47) | ||||
target = uint256_from_compact(b47.nBits) | target = uint256_from_compact(b47.nBits) | ||||
while b47.sha256 <= target: | while b47.sha256 <= target: | ||||
# Rehash nonces until an invalid too-high-hash block is found. | |||||
b47.nNonce += 1 | b47.nNonce += 1 | ||||
b47.rehash() | b47.rehash() | ||||
self.send_blocks( | self.send_blocks( | ||||
[b47], | [b47], | ||||
False, | False, | ||||
force_send=True, | force_send=True, | ||||
reject_reason='high-hash', | reject_reason='high-hash', | ||||
reconnect=True) | reconnect=True) | ||||
self.log.info("Reject a block with a timestamp >2 hours in the future") | self.log.info("Reject a block with a timestamp >2 hours in the future") | ||||
self.move_tip(44) | self.move_tip(44) | ||||
b48 = self.next_block(48, solve=False) | b48 = self.next_block(48) | ||||
b48.nTime = int(time.time()) + 60 * 60 * 3 | b48.nTime = int(time.time()) + 60 * 60 * 3 | ||||
# Header timestamp has changed. Re-solve the block. | |||||
b48.solve() | b48.solve() | ||||
self.send_blocks([b48], False, force_send=True, | self.send_blocks([b48], False, force_send=True, | ||||
reject_reason='time-too-new') | reject_reason='time-too-new') | ||||
self.log.info("Reject a block with invalid merkle hash") | self.log.info("Reject a block with invalid merkle hash") | ||||
self.move_tip(44) | self.move_tip(44) | ||||
b49 = self.next_block(49) | b49 = self.next_block(49) | ||||
b49.hashMerkleRoot += 1 | b49.hashMerkleRoot += 1 | ||||
▲ Show 20 Lines • Show All 666 Lines • ▼ Show 20 Lines | |||||
def create_and_sign_transaction( | def create_and_sign_transaction( | ||||
self, spend_tx, value, script=CScript([OP_TRUE])): | self, spend_tx, value, script=CScript([OP_TRUE])): | ||||
tx = self.create_tx(spend_tx, 0, value, script) | tx = self.create_tx(spend_tx, 0, value, script) | ||||
self.sign_tx(tx, spend_tx) | self.sign_tx(tx, spend_tx) | ||||
tx.rehash() | tx.rehash() | ||||
return tx | return tx | ||||
def next_block(self, number, spend=None, additional_coinbase_value=0, | def next_block(self, number, spend=None, additional_coinbase_value=0, | ||||
script=CScript([OP_TRUE]), solve=True, *, version=1): | script=CScript([OP_TRUE]), *, version=1): | ||||
if self.tip is None: | if self.tip is None: | ||||
base_block_hash = self.genesis_hash | base_block_hash = self.genesis_hash | ||||
block_time = int(time.time()) + 1 | block_time = int(time.time()) + 1 | ||||
else: | else: | ||||
base_block_hash = self.tip.sha256 | base_block_hash = self.tip.sha256 | ||||
block_time = self.tip.nTime + 1 | block_time = self.tip.nTime + 1 | ||||
# First create the coinbase | # First create the coinbase | ||||
height = self.block_heights[base_block_hash] + 1 | height = self.block_heights[base_block_hash] + 1 | ||||
Show All 15 Lines | def next_block(self, number, spend=None, additional_coinbase_value=0, | ||||
coinbase, | coinbase, | ||||
block_time, | block_time, | ||||
version=version) | version=version) | ||||
# spend 1 satoshi | # spend 1 satoshi | ||||
tx = self.create_tx(spend, 0, 1, script) | tx = self.create_tx(spend, 0, 1, script) | ||||
self.sign_tx(tx, spend) | self.sign_tx(tx, spend) | ||||
self.add_transactions_to_block(block, [tx]) | self.add_transactions_to_block(block, [tx]) | ||||
block.hashMerkleRoot = block.calc_merkle_root() | block.hashMerkleRoot = block.calc_merkle_root() | ||||
if solve: | # Block is created. Find a valid nonce. | ||||
block.solve() | block.solve() | ||||
else: | |||||
block.rehash() | |||||
self.tip = block | self.tip = block | ||||
self.block_heights[block.sha256] = height | self.block_heights[block.sha256] = height | ||||
assert number not in self.blocks | assert number not in self.blocks | ||||
self.blocks[number] = block | self.blocks[number] = block | ||||
return block | return block | ||||
# save the current tip so it can be spent by a later block | # save the current tip so it can be spent by a later block | ||||
def save_spendable_output(self): | def save_spendable_output(self): | ||||
▲ Show 20 Lines • Show All 65 Lines • Show Last 20 Lines |