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
Beispiel #2
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
Beispiel #3
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)
Beispiel #4
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)