def test_blocks(): peer, proto, chain, cb_data, cb = setup() genesis_signing_lockset(chain.blocks[0], privkeys[0]) # test blocks chain.mine(n=2) assert len(chain.blocks) == 3 proposals = [create_proposal(b) for b in chain.blocks[1:]] payload = [rlp.encode(p) for p in proposals] proto.send_blockproposals(*payload) packet = peer.packets.pop() assert len(rlp.decode(packet.payload)) == 2 def list_cb(proto, blocks): cb_data.append((proto, blocks)) proto.receive_blockproposals_callbacks.append(list_cb) proto._receive_blockproposals(packet) _p, proposals = cb_data.pop() assert isinstance(proposals, tuple) for proposal in proposals: assert isinstance(proposal, BlockProposal) assert proposal.height == proposal.block.header.number assert isinstance(proposal.block, TransientBlock) assert isinstance(proposal.block.transaction_list, tuple) assert isinstance(proposal.block.uncles, tuple) # assert that transactions and uncles have not been decoded assert len(proposal.block.transaction_list) == 0 assert len(proposal.block.uncles) == 0
def test_blocks(): peer, proto, chain, cb_data, cb = setup() gls = genesis_signing_lockset(chain.blocks[0], privkeys[0]) # test blocks chain.mine(n=2) assert len(chain.blocks) == 3 proposals = [create_proposal(b) for b in chain.blocks[1:]] payload = [rlp.encode(p) for p in proposals] proto.send_blockproposals(*payload) packet = peer.packets.pop() assert len(rlp.decode(packet.payload)) == 2 def list_cb(proto, blocks): cb_data.append((proto, blocks)) proto.receive_blockproposals_callbacks.append(list_cb) proto._receive_blockproposals(packet) _p, proposals = cb_data.pop() assert isinstance(proposals, tuple) for proposal in proposals: assert isinstance(proposal, BlockProposal) assert proposal.height == proposal.block.header.number assert isinstance(proposal.block, TransientBlock) assert isinstance(proposal.block.transaction_list, tuple) assert isinstance(proposal.block.uncles, tuple) # assert that transactions and uncles have not been decoded assert len(proposal.block.transaction_list) == 0 assert len(proposal.block.uncles) == 0
def test_blockproposal(): s = tester.state() # block 1 s.mine(n=1) genesis = s.blocks[0] assert genesis.header.number == 0 blk1 = s.blocks[1] assert blk1.header.number == 1 gls = genesis_signing_lockset(genesis, privkeys[0]) bp = BlockProposal(height=1, round=0, block=blk1, signing_lockset=gls, round_lockset=None) assert bp.lockset == gls assert isinstance(bp, Proposal) bp.sign(tester.k0) with pytest.raises(InvalidProposalError): # round >0 needs round_lockset bp = BlockProposal(height=1, round=1, block=blk1, signing_lockset=gls, round_lockset=None) bp.validate_votes(validators, validators[:1]) # block 2 s.mine(n=1) blk2 = s.blocks[2] assert blk2.header.number == 2 ls = LockSet(len(validators)) for privkey in privkeys: v = VoteBlock(height=1, round=0, blockhash=blk1.hash) v.sign(privkey) ls.add(v) bp = BlockProposal(height=2, round=0, block=blk2, signing_lockset=ls, round_lockset=None) assert bp.lockset == ls with pytest.raises(InvalidProposalError): # signature missing bp.validate_votes(validators, validators) with pytest.raises(InvalidProposalError): bp.sign(privkeys[0]) # privkey doesnt match coinbase bp.validate_votes(validators, validators) with pytest.raises(InvalidSignature): # already signed bp.sign(tester.k0) bp.v = 0 # reset sigcheck hack bp.sign(tester.k0) bp.validate_votes(validators, validators) with pytest.raises(InvalidProposalError): # round >0 needs round_lockset bp = BlockProposal(height=2, round=1, block=blk2, signing_lockset=gls, round_lockset=None) # block 2 round 1, timeout in round=0 rls = LockSet(len(validators)) for privkey in privkeys: v = VoteNil(height=2, round=0) v.sign(privkey) rls.add(v) bp = BlockProposal(height=2, round=1, block=blk2, signing_lockset=ls, round_lockset=rls) assert bp.lockset == rls bp.sign(tester.k0) bp.validate_votes(validators, validators) # serialize s = rlp.encode(bp) dbp = rlp.decode(s, BlockProposal) assert dbp.block == blk2 dbp.validate_votes(validators, validators) # check quorumpossible lockset failure rls = LockSet(len(validators)) for i, privkey in enumerate(privkeys): if i < 4: v = VoteBlock(height=2, round=0, blockhash="0" * 32) else: v = VoteNil(height=2, round=0) v.sign(privkey) rls.add(v) assert not rls.has_noquorum assert rls.has_quorum_possible with pytest.raises(InvalidProposalError): # NoQuorum necessary R0 bp = BlockProposal(height=2, round=1, block=blk2, signing_lockset=ls, round_lockset=rls)
def test_blockproposal(): s = tester.state() # block 1 s.mine(n=1) genesis = s.blocks[0] assert genesis.header.number == 0 blk1 = s.blocks[1] assert blk1.header.number == 1 gls = genesis_signing_lockset(genesis, privkeys[0]) bp = BlockProposal(height=1, round=0, block=blk1, signing_lockset=gls, round_lockset=None) assert bp.lockset == gls assert isinstance(bp, Proposal) bp.sign(tester.k0) with pytest.raises(InvalidProposalError): # round >0 needs round_lockset bp = BlockProposal(height=1, round=1, block=blk1, signing_lockset=gls, round_lockset=None) bp.validate_votes(validators, validators[:1]) # block 2 s.mine(n=1) blk2 = s.blocks[2] assert blk2.header.number == 2 ls = LockSet(len(validators)) for privkey in privkeys: v = VoteBlock(height=1, round=0, blockhash=blk1.hash) v.sign(privkey) ls.add(v) bp = BlockProposal(height=2, round=0, block=blk2, signing_lockset=ls, round_lockset=None) assert bp.lockset == ls with pytest.raises(InvalidProposalError): # signature missing bp.validate_votes(validators, validators) with pytest.raises(InvalidProposalError): bp.sign(privkeys[0]) # privkey doesnt match coinbase bp.validate_votes(validators, validators) with pytest.raises(InvalidSignature): # already signed bp.sign(tester.k0) bp.v = 0 # reset sigcheck hack bp.sign(tester.k0) bp.validate_votes(validators, validators) with pytest.raises(InvalidProposalError): # round >0 needs round_lockset bp = BlockProposal(height=2, round=1, block=blk2, signing_lockset=gls, round_lockset=None) # block 2 round 1, timeout in round=0 rls = LockSet(len(validators)) for privkey in privkeys: v = VoteNil(height=2, round=0) v.sign(privkey) rls.add(v) bp = BlockProposal(height=2, round=1, block=blk2, signing_lockset=ls, round_lockset=rls) assert bp.lockset == rls bp.sign(tester.k0) bp.validate_votes(validators, validators) # serialize s = rlp.encode(bp) dbp = rlp.decode(s, BlockProposal) assert dbp.block == blk2 dbp.validate_votes(validators, validators) # check quorumpossible lockset failure rls = LockSet(len(validators)) for i, privkey in enumerate(privkeys): if i < 4: v = VoteBlock(height=2, round=0, blockhash='0' * 32) else: v = VoteNil(height=2, round=0) v.sign(privkey) rls.add(v) assert not rls.has_noquorum assert rls.has_quorum_possible with pytest.raises(InvalidProposalError): # NoQuorum necessary R0 bp = BlockProposal(height=2, round=1, block=blk2, signing_lockset=ls, round_lockset=rls)