def test_add_longer_side_chain(): """" Local: L0, L1, L2 Remote: R0, R1, R2, R3 """ k, v, k2, v2 = accounts() # Remote: mine one block blk = mkquickgenesis({v: utils.denoms.ether * 1}) store_block(blk) remote_blocks = [blk] for i in range(3): tx = get_transaction(nonce=i) blk = mine_next_block(remote_blocks[-1], transactions=[tx]) store_block(blk) remote_blocks.append(blk) # Local: mine two blocks L0 = mkquickgenesis({v: utils.denoms.ether * 1}) cm = get_chainmanager(db=L0.db, genesis=L0) tx0 = get_transaction(nonce=0) L1 = mine_next_block(L0, transactions=[tx0]) cm.add_block(L1) tx1 = get_transaction(nonce=1) L2 = mine_next_block(L1, transactions=[tx1]) cm.add_block(L2) # receive serialized remote blocks, newest first transient_blocks = [ blocks.TransientBlock(b.serialize()) for b in remote_blocks ] cm.receive_chain(transient_blocks=transient_blocks) assert cm.head == remote_blocks[-1]
def test_reward_uncles(): """ B0 B1 B2 B0 Uncle We raise the block's coinbase account by Rb, the block reward, and also add uncle and nephew rewards """ k, v, k2, v2 = accounts() blk0 = mkquickgenesis() local_coinbase = '1' * 40 uncle_coinbase = '2' * 40 cm = get_chainmanager(db=blk0.db, genesis=blk0) blk1 = mine_next_block(blk0, coinbase=local_coinbase) cm.add_block(blk1) assert blk1.get_balance(local_coinbase) == 1 * blocks.BLOCK_REWARD uncle = mine_next_block(blk0, coinbase=uncle_coinbase) cm.add_block(uncle) assert uncle.hash in cm assert cm.head.get_balance(local_coinbase) == 1 * blocks.BLOCK_REWARD assert cm.head.get_balance(uncle_coinbase) == 0 # next block should reward uncles blk2 = mine_next_block(blk1, uncles=[uncle], coinbase=local_coinbase) cm.add_block(blk2) assert blk2.get_parent().prevhash == uncle.prevhash assert blk2 == cm.head assert cm.head.get_balance(local_coinbase) == \ 2 * blocks.BLOCK_REWARD + blocks.NEPHEW_REWARD assert cm.head.get_balance(uncle_coinbase) == blocks.UNCLE_REWARD
def test_add_side_chain(): """" Local: L0, L1, L2 add Remote: R0, R1 """ k, v, k2, v2 = accounts() # Remote: mine one block R0 = mkquickgenesis({v: utils.denoms.ether * 1}) store_block(R0) tx0 = get_transaction(nonce=0) R1 = mine_next_block(R0, transactions=[tx0]) store_block(R1) assert tx0 in R1.get_transactions() # Local: mine two blocks L0 = mkquickgenesis({v: utils.denoms.ether * 1}) cm = get_chainmanager(db=L0.db, genesis=L0) tx0 = get_transaction(nonce=0) L1 = mine_next_block(L0, transactions=[tx0]) cm.add_block(L1) tx1 = get_transaction(nonce=1) L2 = mine_next_block(L1, transactions=[tx1]) cm.add_block(L2) # receive serialized remote blocks, newest first transient_blocks = [ blocks.TransientBlock(R0.serialize()), blocks.TransientBlock(R1.serialize()) ] cm.receive_chain(transient_blocks=transient_blocks) assert L2.hash in cm