Esempio n. 1
0
def test_end_block_return_validator_updates(b):
    from bigchaindb import App
    from bigchaindb.backend import query
    from bigchaindb.core import encode_validator
    from bigchaindb.backend.query import VALIDATOR_UPDATE_ID

    app = App(b)
    app.init_chain(['ignore'])

    begin_block = RequestBeginBlock()
    app.begin_block(begin_block)

    validator = {
        'pub_key': {
            'type':
            'ed25519',
            'data':
            'B0E42D2589A455EAD339A035D6CE1C8C3E25863F268120AA0162AD7D003A4014'
        },
        'power': 10
    }
    validator_update = {
        'validator': validator,
        'update_id': VALIDATOR_UPDATE_ID
    }
    query.store_validator_update(b.connection, validator_update)

    resp = app.end_block(RequestEndBlock(height=99))
    assert resp.validator_updates[0] == encode_validator(validator)

    updates = b.get_validator_update()
    assert updates == []
Esempio n. 2
0
def test_upsert_validator(b, alice):
    from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
    from bigchaindb.backend import query, connect
    from bigchaindb.models import Transaction

    conn = connect()
    public_key = '1718D2DBFF00158A0852A17A01C78F4DCF3BA8E4FB7B8586807FAC182A535034'
    power = 1
    validator = {
        'pub_key': {
            'type': 'ed25519',
            'data': public_key
        },
        'power': power
    }
    validator_update = {
        'validator': validator,
        'update_id': VALIDATOR_UPDATE_ID
    }

    query.store_validator_update(conn, deepcopy(validator_update))

    tx = Transaction.create([alice.public_key],
                            [([alice.public_key], 1)],
                            asset=None)\
                    .sign([alice.private_key])

    code, message = b.write_transaction(tx, 'broadcast_tx_commit')
    assert code == 202

    validators = b.get_validators()
    validators = [(v['pub_key']['data'], v['voting_power'])
                  for v in validators]

    assert ((public_key, power) in validators)
Esempio n. 3
0
def run_upsert_validator(args):
    """Store validators which should be synced with Tendermint"""

    b = bigchaindb.Bigchain()
    validator = {'pub_key': {'type': 'ed25519',
                             'data': args.public_key},
                 'power': args.power}
    validator_update = {'validator': validator,
                        'update_id': VALIDATOR_UPDATE_ID}
    try:
        query.store_validator_update(b.connection, validator_update)
    except MultipleValidatorOperationError:
        logger.error('A validator update is pending to be applied. '
                     'Please re-try after the current update has '
                     'been processed.')
Esempio n. 4
0
def test_validator_updates(b, validator_pub_key):
    from bigchaindb.backend import query
    from bigchaindb.backend.query import VALIDATOR_UPDATE_ID

    # create a validator update object
    validator = {'pub_key': {'type': 'ed25519',
                             'data': validator_pub_key},
                 'power': 10}
    validator_update = {'validator': validator,
                        'update_id': VALIDATOR_UPDATE_ID}
    query.store_validator_update(b.connection, validator_update)

    updates = b.get_validator_update()
    assert updates == [validator_update['validator']]

    b.delete_validator_update()
    assert b.get_validator_update() == []
Esempio n. 5
0
def test_store_validator_update():
    from bigchaindb.backend import connect, query
    from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
    from bigchaindb.common.exceptions import MultipleValidatorOperationError

    conn = connect()

    validator_update = {'validator': {'key': 'value'},
                        'update_id': VALIDATOR_UPDATE_ID}
    query.store_validator_update(conn, deepcopy(validator_update))

    with pytest.raises(MultipleValidatorOperationError):
        query.store_validator_update(conn, deepcopy(validator_update))

    resp = query.get_validator_update(conn, VALIDATOR_UPDATE_ID)

    assert resp == validator_update
    assert query.delete_validator_update(conn, VALIDATOR_UPDATE_ID)
    assert not query.get_validator_update(conn, VALIDATOR_UPDATE_ID)
Esempio n. 6
0
def test_upsert_validator(b, alice):
    from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
    from bigchaindb.backend import query, connect
    from bigchaindb.models import Transaction
    from bigchaindb.tendermint_utils import public_key_to_base64
    import time

    conn = connect()
    power = 1
    public_key = '9B3119650DF82B9A5D8A12E38953EA47475C09F0C48A4E6A0ECE182944B24403'

    validator = {
        'pub_key': {
            'type': 'AC26791624DE60',
            'data': public_key
        },
        'power': power
    }
    validator_update = {
        'validator': validator,
        'update_id': VALIDATOR_UPDATE_ID
    }

    query.store_validator_update(conn, deepcopy(validator_update))

    tx = Transaction.create([alice.public_key],
                            [([alice.public_key], 1)],
                            asset=None)\
                    .sign([alice.private_key])

    code, message = b.write_transaction(tx, 'broadcast_tx_commit')
    assert code == 202
    time.sleep(5)

    validators = b.get_validators()
    validators = [(v['pub_key']['value'], v['voting_power'])
                  for v in validators]

    public_key64 = public_key_to_base64(public_key)
    assert ((public_key64, str(power)) in validators)