def test_check_tx__unsigned_create_is_error(b): from bigchaindb.tendermint import App from bigchaindb.models import Transaction from bigchaindb.common.crypto import generate_key_pair alice = generate_key_pair() bob = generate_key_pair() tx = Transaction.create([alice.public_key], [([bob.public_key], 1)]) app = App(b) result = app.check_tx(encode_tx_to_bytes(tx)) assert result.is_error()
def test_end_block_return_validator_updates(b): from bigchaindb.tendermint import App from bigchaindb.backend import query from bigchaindb.tendermint.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(99) assert resp.validator_updates[0] == encode_validator(validator) updates = b.get_validator_update() assert updates == []
def test_deliver_transfer_tx__double_spend_fails(b): from bigchaindb.tendermint import App from bigchaindb.models import Transaction from bigchaindb.common.crypto import generate_key_pair app = App(b) app.init_chain(['ignore']) begin_block = RequestBeginBlock() app.begin_block(begin_block) alice = generate_key_pair() bob = generate_key_pair() carly = generate_key_pair() asset = {'msg': 'live long and prosper'} tx = Transaction.create([alice.public_key], [([alice.public_key], 1)], asset=asset)\ .sign([alice.private_key]) result = app.deliver_tx(encode_tx_to_bytes(tx)) assert result.is_ok() tx_transfer = Transaction.transfer(tx.to_inputs(), [([bob.public_key], 1)], asset_id=tx.id)\ .sign([alice.private_key]) result = app.deliver_tx(encode_tx_to_bytes(tx_transfer)) assert result.is_ok() double_spend = Transaction.transfer(tx.to_inputs(), [([carly.public_key], 1)], asset_id=tx.id)\ .sign([alice.private_key]) result = app.deliver_tx(encode_tx_to_bytes(double_spend)) assert result.is_error()
def test_app(tb): from bigchaindb.tendermint import App from bigchaindb.tendermint.utils import calculate_hash from bigchaindb.common.crypto import generate_key_pair from bigchaindb.models import Transaction b = tb app = App(b) p = ProtocolHandler(app) data = p.process('info', None) res, err = read_message(BytesIO(data), types.Response) assert res assert res.info.last_block_app_hash == b'' assert res.info.last_block_height == 0 assert not b.get_latest_block() p.process('init_chain', None) block0 = b.get_latest_block() assert block0 assert block0['height'] == 0 assert block0['app_hash'] == '' alice = generate_key_pair() bob = generate_key_pair() tx = Transaction.create([alice.public_key], [([bob.public_key], 1)])\ .sign([alice.private_key]) etxn = json.dumps(tx.to_dict()).encode('utf8') r = to_request_check_tx(etxn) data = p.process('check_tx', r) res, err = read_message(BytesIO(data), types.Response) assert res assert res.check_tx.code == 0 r = types.Request() r.begin_block.hash = b'' p.process('begin_block', r) r = to_request_deliver_tx(etxn) data = p.process('deliver_tx', r) res, err = read_message(BytesIO(data), types.Response) assert res assert res.deliver_tx.code == 0 new_block_txn_hash = calculate_hash([tx.id]) r = types.Request() r.end_block.height = 1 data = p.process('end_block', r) res, err = read_message(BytesIO(data), types.Response) assert res assert 'end_block' == res.WhichOneof('value') new_block_hash = calculate_hash([block0['app_hash'], new_block_txn_hash]) data = p.process('commit', None) res, err = read_message(BytesIO(data), types.Response) assert res assert res.commit.code == 0 assert res.commit.data == new_block_hash.encode('utf-8') assert b.get_transaction(tx.id).id == tx.id block0 = b.get_latest_block() assert block0 assert block0['height'] == 1 assert block0['app_hash'] == new_block_hash # empty block should not update height r = types.Request() r.begin_block.hash = new_block_hash.encode('utf-8') p.process('begin_block', r) r = types.Request() r.end_block.height = 2 p.process('end_block', r) data = p.process('commit', None) assert res.commit.data == new_block_hash.encode('utf-8') block0 = b.get_latest_block() assert block0 assert block0['height'] == 1 # when empty block is generated hash of previous block should be returned assert block0['app_hash'] == new_block_hash
def test_deliver_tx__double_spend_fails(b): from bigchaindb.tendermint import App from bigchaindb.models import Transaction from bigchaindb.common.crypto import generate_key_pair alice = generate_key_pair() bob = generate_key_pair() tx = Transaction.create([alice.public_key], [([bob.public_key], 1)])\ .sign([alice.private_key]) app = App(b) app.init_chain(['ignore']) begin_block = RequestBeginBlock() app.begin_block(begin_block) result = app.deliver_tx(encode_tx_to_bytes(tx)) assert result.is_ok() app.end_block(99) app.commit() assert b.get_transaction(tx.id).id == tx.id result = app.deliver_tx(encode_tx_to_bytes(tx)) assert result.is_error()
def test_store_pre_commit_state_in_end_block(b, alice): from bigchaindb.tendermint import App from bigchaindb.backend import query from bigchaindb.models import Transaction from bigchaindb.backend.query import PRE_COMMIT_ID tx = Transaction.create([alice.public_key], [([alice.public_key], 1)], asset={'msg': 'live long and prosper'})\ .sign([alice.private_key]) app = App(b) app.init_chain(['ignore']) begin_block = RequestBeginBlock() app.begin_block(begin_block) app.deliver_tx(encode_tx_to_bytes(tx)) app.end_block(99) resp = query.get_pre_commit_state(b.connection, PRE_COMMIT_ID) assert resp['commit_id'] == PRE_COMMIT_ID assert resp['height'] == 99 assert resp['transactions'] == [tx.id] app.begin_block(begin_block) app.deliver_tx(encode_tx_to_bytes(tx)) app.end_block(100) resp = query.get_pre_commit_state(b.connection, PRE_COMMIT_ID) assert resp['commit_id'] == PRE_COMMIT_ID assert resp['height'] == 100 assert resp['transactions'] == [tx.id]
def test_deliver_tx__valid_create_updates_db(b): from bigchaindb.tendermint import App from bigchaindb.models import Transaction from bigchaindb.common.crypto import generate_key_pair alice = generate_key_pair() bob = generate_key_pair() tx = Transaction.create([alice.public_key], [([bob.public_key], 1)])\ .sign([alice.private_key]) app = App(b) begin_block = RequestBeginBlock() app.init_chain(['ignore']) app.begin_block(begin_block) result = app.deliver_tx(encode_tx_to_bytes(tx)) assert result.code == CodeTypeOk app.end_block(RequestEndBlock(height=99)) app.commit() assert b.get_transaction(tx.id).id == tx.id