Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,6 @@ matrix:
- python: 3.5
env: TOXENV=docsserver
include:
- python: 3.5
env:
- BIGCHAINDB_DATABASE_BACKEND=localmongodb
- BIGCHAINDB_DATABASE_SSL=
- python: 3.6
env:
- BIGCHAINDB_DATABASE_BACKEND=localmongodb
Expand Down
11 changes: 5 additions & 6 deletions bigchaindb/tendermint/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
with Tendermint."""
import logging

from abci import BaseApplication, Result
from abci.application import BaseApplication, Result
from abci.types_pb2 import ResponseEndBlock, ResponseInfo, Validator

from bigchaindb.tendermint import BigchainDB
Expand Down Expand Up @@ -86,7 +86,6 @@ def deliver_tx(self, raw_transaction):
return Result.error(log='Invalid transaction')
else:
logger.debug('storing tx')
# self.bigchaindb.store_transaction(transaction)
self.block_txn_ids.append(transaction.id)
self.block_transactions.append(transaction)
return Result.ok()
Expand Down Expand Up @@ -124,7 +123,7 @@ def end_block(self, height):
# version of py-abci i.e. the validator updates should be return
# as follows:
# ResponseEndBlock(validator_updates=validator_updates)
return ResponseEndBlock(diffs=validator_updates)
return ResponseEndBlock(validator_updates=validator_updates)

def commit(self):
"""Store the new height and along with block hash."""
Expand All @@ -141,13 +140,13 @@ def commit(self):
# this effects crash recovery. Refer BEP#8 for details
self.bigchaindb.store_block(block._asdict())

return Result.ok(data=data)
return data


def encode_validator(v):
pub_key = v['pub_key']['data']
# NOTE: tendermint expects public to be encoded in go-wire format
# so `01` has to be appended
pubKey = bytes.fromhex('01{}'.format(pub_key))
return Validator(pubKey=pubKey,
pub_key = bytes.fromhex('01{}'.format(pub_key))
return Validator(pub_key=pub_key,
power=v['power'])
6 changes: 3 additions & 3 deletions bigchaindb/tendermint/event_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ def process_event(event_queue, event, stream_id):
event_stream_id = stream_id + '#event'
event = json.loads(event)

if (event['id'] == event_stream_id and event['result']['name'] == 'NewBlock'):
block = event['result']['data']['data']['block']
if (event['id'] == event_stream_id and event['result']['query'] == 'tm.event=\'NewBlock\''):
block = event['result']['data']['value']['block']
block_id = block['header']['height']
block_txs = block['data']['txs']

Expand All @@ -60,7 +60,7 @@ def subscribe_events(ws, stream_id):
payload = {
'method': 'subscribe',
'jsonrpc': '2.0',
'params': ['NewBlock'],
'params': ['tm.event=\'NewBlock\''],
'id': stream_id
}
yield from ws.send_str(json.dumps(payload))
Expand Down
33 changes: 17 additions & 16 deletions bigchaindb/tendermint/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,23 @@ def _process_post_response(self, response, mode):
if response.get('error') is not None:
return (500, 'Internal error')

result = response['result']
if mode == MODE_LIST[2]:
return self._process_commit_mode_response(result)
else:
status_code = result['code']
return self._process_status_code(status_code,
'Error while processing transaction')

def _process_commit_mode_response(self, result):
check_tx_status_code = result['check_tx']['code']
if check_tx_status_code == 0:
deliver_tx_status_code = result['deliver_tx']['code']
return self._process_status_code(deliver_tx_status_code,
'Error while commiting the transaction')
else:
return (500, 'Error while validating the transaction')
return (202, '')
# result = response['result']
# if mode == MODE_LIST[2]:
# return self._process_commit_mode_response(result)
# else:
# status_code = result['code']
# return self._process_status_code(status_code,
# 'Error while processing transaction')

# def _process_commit_mode_response(self, result):
# check_tx_status_code = result['check_tx']['code']
# if check_tx_status_code == 0:
# deliver_tx_status_code = result['deliver_tx']['code']
# return self._process_status_code(deliver_tx_status_code,
# 'Error while commiting the transaction')
# else:
# return (500, 'Error while validating the transaction')

def _process_status_code(self, status_code, failure_msg):
return (202, '') if status_code == 0 else (500, failure_msg)
Expand Down
8 changes: 4 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ services:
retries: 3
entrypoint: '.ci/entrypoint.sh'
tendermint:
image: tendermint/tendermint:0.12
volumes:
- ./tmdata/config.toml:/tendermint/config.toml
image: tendermint/tendermint:0.19.0
# volumes:
# - ./tmdata:/tendermint
entrypoint: ''
ports:
- "46656"
- "46657"
command: bash -c "tendermint init && tendermint node"
command: sh -c "tendermint init && tendermint node --proxy_app=tcp://bigchaindb:46658"
bdb:
image: busybox
depends_on:
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def check_setuptools_features():
'pyyaml~=3.12',
'aiohttp~=2.3',
'python-rapidjson-schema==0.1.1',
'abci~=0.3.0',
'abci~=0.4.1',
'setproctitle~=1.1.0',
]

Expand Down
2 changes: 1 addition & 1 deletion tests/tendermint/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ def test_end_block_return_validator_updates(b):
query.store_validator_update(b.connection, validator_update)

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

updates = b.get_validator_update()
assert updates == []
Expand Down
70 changes: 39 additions & 31 deletions tests/tendermint/test_event_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,32 @@
def test_process_event_new_block():
from bigchaindb.tendermint.event_stream import process_event

event = '{"id": "test_stream_id#event", "jsonrpc": "2.0", "result":'\
' {"data": {"data": {"block": {"data": {"txs": ["eyJpbnB1dHMiOiBb'\
'eyJvd25lcnNfYmVmb3JlIjogWyJCWnZLQmNSUmgyd0tOOGZuTENlZUczSGhFaWF4'\
'TWdyWmlib0gyeUZvYzVwTCJdLCAiZnVsZmlsbHMiOiBudWxsLCAiZnVsZmlsbG1l'\
'bnQiOiAicEdTQUlKMER2S2JBeXkyQ2hqT212ZWVCc0FxWktTS0k3VDNWZGhtUkI2'\
'V2dhdzdoZ1VDUHluUnFuQW9RWDh2UlNXeXNwYk5uYWVBaVpOU19lQ3V6ejhDZWtJ'\
'OHBIejJnekExeDJkOF93NTUzWFVOUGJFbnpBUzhncURqeDFkaE1JeDM1ZnpVTCJ9'\
'XSwgIm91dHB1dHMiOiBbeyJwdWJsaWNfa2V5cyI6IFsiQlp2S0JjUlJoMndLTjhm'\
'bkxDZWVHM0hoRWlheE1nclppYm9IMnlGb2M1cEwiXSwgImNvbmRpdGlvbiI6IHsi'\
'ZGV0YWlscyI6IHsidHlwZSI6ICJlZDI1NTE5LXNoYS0yNTYiLCAicHVibGljX2tl'\
'eSI6ICJCWnZLQmNSUmgyd0tOOGZuTENlZUczSGhFaWF4TWdyWmlib0gyeUZvYzVw'\
'TCJ9LCAidXJpIjogIm5pOi8vL3NoYS0yNTY7eHVFX1ZPNjd6aHc0LTRjN0k1YUtm'\
'WGtzX1Q1MjUwMnBuOC1mcVJQQkloRT9mcHQ9ZWQyNTUxOS1zaGEtMjU2JmNvc3Q9'\
'MTMxMDcyIn0sICJhbW91bnQiOiAiMSJ9XSwgIm9wZXJhdGlvbiI6ICJDUkVBVEUi'\
'LCAibWV0YWRhdGEiOiB7InNob3J0IjogImxpdHRsZSJ9LCAiYXNzZXQiOiB7ImRh'\
'dGEiOiB7ImJpY3ljbGUiOiB7InNlcmlhbF9udW1iZXIiOiAiYWJjZDEyMzQiLCAi'\
'bWFudWZhY3R1cmVyIjogImJrZmFiIn19fSwgInZlcnNpb24iOiAiMS4wIiwgImlk'\
'IjogIjE4NzM3Yzc0OWQxZGE2Yzc5YjFmYWZiZjkwOTkwNzEwMDA1ZWM4MTYxNGQ5'\
'YWFiNDkyZTgwYTkzNWRkYThjMzAifQ=="]}, "header": {"height": 1}}},'\
' "type": "new_block"}, "name": "NewBlock"}}'
event = '{"jsonrpc": "2.0", "id": "test_stream_id#event", "result": {'\
'"query": "tm.event=\'NewBlock\'", "data": { "type": "CF18EA939D3240",'\
'"value": { "block": { "header": { "chain_id": "test-chain-ipQIAa",'\
'"height": 1, "time": "2018-04-23T14:49:30.509920098Z", "num_txs": 1,'\
'"last_block_id": { "hash": "", "parts": { "total": 0, "hash": "" }},'\
'"total_txs": 1, "last_commit_hash": "", "data_hash": "38792142CE6D7F6F46F71777CB53F94CD9497B23",'\
'"validators_hash": "BF0D0EC2E13C76E69FA572516B6D93E64F3C58EF",'\
'"consensus_hash": "F66EF1DF8BA6DAC7A1ECCE40CC84E54A1CEBC6A5", "app_hash": "",'\
'"last_results_hash": "", "evidence_hash": "" }, "data": {"txs": ['\
'"eyJpbnB1dHMiOiBbeyJvd25lcnNfYmVmb3JlIjogWyJFb2Z0Z0FNd2hKQXM0cW81b'\
'0dhOU1GWXF5dFp5WEdaNmVmZFVYc1dXTDdmZSJdLCAiZnVsZmlsbHMiOiBudWxsLCA'\
'iZnVsZmlsbG1lbnQiOiAicEdTQUlNMGNueFFGeTZrSE1PcGxBbzh1ZncwNDlsZ2VxN'\
'HBOeDFNdksya0pjRjBCZ1VETjN2RTlsWmhaT21jMWZHbFpLUFZmZDdCTi1RVTdBa0N'\
'TZ1NKWVRPYzB3YVlmQ1RXc1FQS1VmOE5fODFKd21YOUJxcnlLejYyTmVubHg0dGszN'\
'GtVRCJ9XSwgIm91dHB1dHMiOiBbeyJwdWJsaWNfa2V5cyI6IFsiRW9mdGdBTXdoSkF'\
'zNHFvNW9HYTlNRllxeXRaeVhHWjZlZmRVWHNXV0w3ZmUiXSwgImNvbmRpdGlvbiI6I'\
'HsiZGV0YWlscyI6IHsidHlwZSI6ICJlZDI1NTE5LXNoYS0yNTYiLCAicHVibGljX2t'\
'leSI6ICJFb2Z0Z0FNd2hKQXM0cW81b0dhOU1GWXF5dFp5WEdaNmVmZFVYc1dXTDdmZ'\
'SJ9LCAidXJpIjogIm5pOi8vL3NoYS0yNTY7cFJZWTJQQUE0S3dHd0dUNVQtUXRCQUY'\
'0VWY1WG5JcVkxWmExVER0N0hMQT9mcHQ9ZWQyNTUxOS1zaGEtMjU2JmNvc3Q9MTMxM'\
'DcyIn0sICJhbW91bnQiOiAiMSJ9XSwgIm9wZXJhdGlvbiI6ICJDUkVBVEUiLCAibWV'\
'0YWRhdGEiOiBudWxsLCAiYXNzZXQiOiB7ImRhdGEiOiBudWxsfSwgInZlcnNpb24iO'\
'iAiMi4wIiwgImlkIjogImUwMmM0ZWM3MmExYzUzMmJkNjUyNWZkNGMxODU3ZDhmN2E'\
'wYWVkYTgyNGVjY2NhZGY4NTlmNzc0Zjc3ZTgwZGUifQ=="]}, "evidence": {'\
'"evidence": null}, "last_commit": { "blockID": { "hash": "", "parts":'\
'{"total": 0, "hash": ""} }, "precommits": null } } } } } }'

event_queue = Queue()
process_event(event_queue, event, 'test_stream_id')
Expand All @@ -42,15 +48,17 @@ def test_process_event_new_block():
def test_process_event_empty_block():
from bigchaindb.tendermint.event_stream import process_event

event = '{"jsonrpc": "2.0", "id": "test_stream_id#event",'\
'"result": {"name": "NewBlock", "data": {"type": "new_block",'\
' "data": {"block": {"header": {"chain_id": "test-chain-cbVRwC",'\
' "height": 1, "time": "2017-12-04T22:42:54.33+05:30", "num_txs": 0,'\
' "last_block_id": {"hash": "", "parts": {"total": 0, "hash": ""}},'\
' "last_commit_hash": "", "data_hash": "",'\
' "validators_hash": "ACF23A690EB72D051931E878E8F3D6E01A17A81C",'\
' "app_hash": ""}, "data": {"txs": []}, "last_commit": {"blockID": '\
' {"hash": "", "parts": {"total": 0, "hash": ""}}, "precommits": []}}}}}}'
event = '{"jsonrpc": "2.0", "id": "bigchaindb_stream_1524555674#event",'\
'"result": {"query": "tm.event=\'NewBlock\'", "data": {"type": '\
'"CF18EA939D3240", "value": {"block": {"header": {"chain_id": '\
'"test-chain-ipQIAa", "height": 1, "time": "2018-04-24T07:41:16.838038877Z",'\
'"num_txs": 0, "last_block_id": {"hash": "", "parts": {"total": 0, "hash": ""}},'\
'"total_txs": 0, "last_commit_hash": "", "data_hash": "", "validators_hash":'\
'"BF0D0EC2E13C76E69FA572516B6D93E64F3C58EF", "consensus_hash": '\
'"F66EF1DF8BA6DAC7A1ECCE40CC84E54A1CEBC6A5", "app_hash": "", '\
'"last_results_hash": "", "evidence_hash": ""}, "data": {"txs": null},'\
'"evidence": {"evidence": null}, "last_commit": {"blockID": {"hash": "", '\
'"parts": {"total": 0, "hash": ""}}, "precommits": null}}}}}}'

event_queue = Queue()
process_event(event_queue, event, 'test_stream_id')
Expand All @@ -62,7 +70,7 @@ def test_process_unknown_event():
from bigchaindb.tendermint.event_stream import process_event

event = '{"jsonrpc": "2.0", "id": "test_stream_id#event",'\
' "result": {"name": "UnknownEvent"}}'
' "result": { "query": "tm.event=\'UnknownEvent\'" }}'

event_queue = Queue()
process_event(event_queue, event, 'test_stream_id')
Expand Down Expand Up @@ -96,7 +104,7 @@ async def test_subscribe_events(tendermint_ws_url, b):
b.post_transaction(tx, 'broadcast_tx_async')
msg = await ws.receive()
msg_data_dict = json.loads(msg.data)
raw_txn = msg_data_dict['result']['data']['data']['block']['data']['txs'][0]
raw_txn = msg_data_dict['result']['data']['value']['block']['data']['txs'][0]
transaction = json.loads(base64.b64decode(raw_txn).decode('utf8'))

assert transaction == tx.to_dict()
40 changes: 37 additions & 3 deletions tests/tendermint/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from abci.server import ProtocolHandler
from io import BytesIO
import abci.types_pb2 as types
from abci.wire import read_message
from abci.encoding import read_message
from abci.messages import to_request_deliver_tx, to_request_check_tx


Expand Down Expand Up @@ -70,8 +70,6 @@ def test_app(tb):

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

Expand All @@ -90,6 +88,7 @@ def test_app(tb):
p.process('end_block', r)

data = p.process('commit', None)
res, err = read_message(BytesIO(data), types.Response)
assert res.commit.data == new_block_hash.encode('utf-8')

block0 = b.get_latest_block()
Expand All @@ -100,6 +99,7 @@ def test_app(tb):
assert block0['app_hash'] == new_block_hash


@pytest.mark.skip(reason='Not working with Tendermint 0.19.0')
@pytest.mark.abci
def test_upsert_validator(b, alice):
from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
Expand Down Expand Up @@ -129,3 +129,37 @@ def test_upsert_validator(b, alice):
validators = [(v['pub_key']['data'], v['voting_power']) for v in validators]

assert ((public_key, power) in validators)


@pytest.mark.abci
def test_post_transaction_responses(tendermint_ws_url, b):
from bigchaindb.common.crypto import generate_key_pair
from bigchaindb.models import Transaction

alice = generate_key_pair()
bob = generate_key_pair()
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

tx_transfer = Transaction.transfer(tx.to_inputs(),
[([bob.public_key], 1)],
asset_id=tx.id)\
.sign([alice.private_key])

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

# NOTE: DOESN'T WORK (double spend)
# Tendermint crashes with error: Unexpected result type
# carly = generate_key_pair()
# double_spend = Transaction.transfer(tx.to_inputs(),
# [([carly.public_key], 1)],
# asset_id=tx.id)\
# .sign([alice.private_key])
# code, message = b.write_transaction(double_spend, 'broadcast_tx_commit')
# assert code == 500
35 changes: 0 additions & 35 deletions tests/tendermint/test_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,38 +350,3 @@ def test_get_utxoset_merkle_root(b, utxoset):
'86d311c03115bf4d287f8449ca5828505432d69b82762d47077b1c00fe426eac')
merkle_root = b.get_utxoset_merkle_root()
assert merkle_root == expected_merkle_root


@pytest.mark.abci
def test_post_transaction_responses(tendermint_ws_url, b):
from bigchaindb.common.crypto import generate_key_pair
from bigchaindb.models import Transaction

alice = generate_key_pair()
bob = generate_key_pair()

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

tx_transfer = Transaction.transfer(tx.to_inputs(),
[([bob.public_key], 1)],
asset_id=tx.id)\
.sign([alice.private_key])

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

# NOTE: DOESN'T WORK (double spend)
# Tendermint crashes with error: Unexpected result type
# carly = generate_key_pair()
# double_spend = Transaction.transfer(tx.to_inputs(),
# [([carly.public_key], 1)],
# asset_id=tx.id)\
# .sign([alice.private_key])
# code, message = b.write_transaction(double_spend, 'broadcast_tx_commit')
# assert code == 500