Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc_p2p_fullblocktest.py
Show First 20 Lines • Show All 170 Lines • ▼ Show 20 Lines | def next_block(self, number, spend=None, | ||||
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 | ||||
def run_test(self): | def run_test(self): | ||||
node = self.nodes[0] | node = self.nodes[0] | ||||
node.add_p2p_connection(P2PDataStore()) | peer = node.add_p2p_connection(P2PDataStore()) | ||||
self.genesis_hash = int(node.getbestblockhash(), 16) | self.genesis_hash = int(node.getbestblockhash(), 16) | ||||
self.block_heights[self.genesis_hash] = 0 | self.block_heights[self.genesis_hash] = 0 | ||||
spendable_outputs = [] | spendable_outputs = [] | ||||
# 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(): | def save_spendable_output(): | ||||
spendable_outputs.append(self.tip) | spendable_outputs.append(self.tip) | ||||
Show All 20 Lines | def run_test(self): | ||||
return block | return block | ||||
# shorthand for functions | # shorthand for functions | ||||
block = self.next_block | block = self.next_block | ||||
# Create a new block | # Create a new block | ||||
block(0) | block(0) | ||||
save_spendable_output() | save_spendable_output() | ||||
node.p2p.send_blocks_and_test([self.tip], node) | peer.send_blocks_and_test([self.tip], node) | ||||
# Now we need that block to mature so we can spend the coinbase. | # Now we need that block to mature so we can spend the coinbase. | ||||
maturity_blocks = [] | maturity_blocks = [] | ||||
for i in range(99): | for i in range(99): | ||||
block(5000 + i) | block(5000 + i) | ||||
maturity_blocks.append(self.tip) | maturity_blocks.append(self.tip) | ||||
save_spendable_output() | save_spendable_output() | ||||
node.p2p.send_blocks_and_test(maturity_blocks, node) | peer.send_blocks_and_test(maturity_blocks, node) | ||||
# collect spendable outputs now to avoid cluttering the code later on | # collect spendable outputs now to avoid cluttering the code later on | ||||
out = [] | out = [] | ||||
for i in range(100): | for i in range(100): | ||||
out.append(get_spendable_output()) | out.append(get_spendable_output()) | ||||
# Let's build some blocks and test them. | # Let's build some blocks and test them. | ||||
for i in range(16): | for i in range(16): | ||||
n = i + 1 | n = i + 1 | ||||
block(n, spend=out[i], block_size=n * ONE_MEGABYTE) | block(n, spend=out[i], block_size=n * ONE_MEGABYTE) | ||||
node.p2p.send_blocks_and_test([self.tip], node) | peer.send_blocks_and_test([self.tip], node) | ||||
# block of maximal size | # block of maximal size | ||||
block(17, spend=out[16], block_size=self.excessive_block_size) | block(17, spend=out[16], block_size=self.excessive_block_size) | ||||
node.p2p.send_blocks_and_test([self.tip], node) | peer.send_blocks_and_test([self.tip], node) | ||||
# Reject oversized blocks with bad-blk-length error | # Reject oversized blocks with bad-blk-length error | ||||
block(18, spend=out[17], block_size=self.excessive_block_size + 1) | block(18, spend=out[17], block_size=self.excessive_block_size + 1) | ||||
node.p2p.send_blocks_and_test( | peer.send_blocks_and_test( | ||||
[self.tip], node, success=False, reject_reason='bad-blk-length') | [self.tip], node, success=False, reject_reason='bad-blk-length') | ||||
# Rewind bad block. | # Rewind bad block. | ||||
self.tip = self.blocks[17] | self.tip = self.blocks[17] | ||||
# Submit a very large block via RPC | # Submit a very large block via RPC | ||||
large_block = block( | large_block = block( | ||||
33, spend=out[17], block_size=self.excessive_block_size) | 33, spend=out[17], block_size=self.excessive_block_size) | ||||
assert_equal(node.submitblock(ToHex(large_block)), None) | assert_equal(node.submitblock(ToHex(large_block)), None) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
FullBlockTest().main() | FullBlockTest().main() |