mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
Problem: Upsert validator not migrated to Tendermint 0.19.0 (#2252)
* Problem: Upsert validator not migrated to Tendermint 0.19.0 Solution: Migrate the same to Tendermint 0.19.0 * Problem: There are no tests for public key encoding/decoding Solution: Add necessary tests
This commit is contained in:
parent
fd48abebae
commit
920d69b0c4
@ -21,7 +21,7 @@ from bigchaindb.commands.utils import (
|
|||||||
configure_bigchaindb, start_logging_process, input_on_stderr)
|
configure_bigchaindb, start_logging_process, input_on_stderr)
|
||||||
from bigchaindb.backend.query import VALIDATOR_UPDATE_ID, PRE_COMMIT_ID
|
from bigchaindb.backend.query import VALIDATOR_UPDATE_ID, PRE_COMMIT_ID
|
||||||
from bigchaindb.tendermint.lib import BigchainDB
|
from bigchaindb.tendermint.lib import BigchainDB
|
||||||
|
from bigchaindb.tendermint.utils import public_key_from_base64
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -100,8 +100,9 @@ def run_upsert_validator(args):
|
|||||||
"""Store validators which should be synced with Tendermint"""
|
"""Store validators which should be synced with Tendermint"""
|
||||||
|
|
||||||
b = bigchaindb.Bigchain()
|
b = bigchaindb.Bigchain()
|
||||||
|
public_key = public_key_from_base64(args.public_key)
|
||||||
validator = {'pub_key': {'type': 'ed25519',
|
validator = {'pub_key': {'type': 'ed25519',
|
||||||
'data': args.public_key},
|
'data': public_key},
|
||||||
'power': args.power}
|
'power': args.power}
|
||||||
validator_update = {'validator': validator,
|
validator_update = {'validator': validator,
|
||||||
'update_id': VALIDATOR_UPDATE_ID}
|
'update_id': VALIDATOR_UPDATE_ID}
|
||||||
|
@ -6,7 +6,9 @@ from abci.application import BaseApplication, Result
|
|||||||
from abci.types_pb2 import ResponseEndBlock, ResponseInfo, Validator
|
from abci.types_pb2 import ResponseEndBlock, ResponseInfo, Validator
|
||||||
|
|
||||||
from bigchaindb.tendermint import BigchainDB
|
from bigchaindb.tendermint import BigchainDB
|
||||||
from bigchaindb.tendermint.utils import decode_transaction, calculate_hash
|
from bigchaindb.tendermint.utils import (decode_transaction,
|
||||||
|
calculate_hash,
|
||||||
|
amino_encoded_public_key)
|
||||||
from bigchaindb.tendermint.lib import Block, PreCommitState
|
from bigchaindb.tendermint.lib import Block, PreCommitState
|
||||||
from bigchaindb.backend.query import PRE_COMMIT_ID
|
from bigchaindb.backend.query import PRE_COMMIT_ID
|
||||||
|
|
||||||
@ -148,9 +150,8 @@ class App(BaseApplication):
|
|||||||
|
|
||||||
|
|
||||||
def encode_validator(v):
|
def encode_validator(v):
|
||||||
pub_key = v['pub_key']['data']
|
ed25519_public_key = v['pub_key']['data']
|
||||||
# NOTE: tendermint expects public to be encoded in go-wire format
|
# NOTE: tendermint expects public to be encoded in go-amino format
|
||||||
# so `01` has to be appended
|
pub_key = amino_encoded_public_key(ed25519_public_key)
|
||||||
pub_key = bytes.fromhex('01{}'.format(pub_key))
|
|
||||||
return Validator(pub_key=pub_key,
|
return Validator(pub_key=pub_key,
|
||||||
power=v['power'])
|
power=v['power'])
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import base64
|
import base64
|
||||||
|
import hashlib
|
||||||
import json
|
import json
|
||||||
from binascii import hexlify
|
from binascii import hexlify
|
||||||
|
|
||||||
@ -65,3 +66,23 @@ def merkleroot(hashes):
|
|||||||
for i in range(0, len(hashes)-1, 2)
|
for i in range(0, len(hashes)-1, 2)
|
||||||
]
|
]
|
||||||
return merkleroot(parent_hashes)
|
return merkleroot(parent_hashes)
|
||||||
|
|
||||||
|
|
||||||
|
def public_key64_to_address(base64_public_key):
|
||||||
|
"""Note this only compatibile with Tendermint 0.19.0 """
|
||||||
|
ed25519_public_key = public_key_from_base64(base64_public_key)
|
||||||
|
encoded_public_key = amino_encoded_public_key(ed25519_public_key)
|
||||||
|
return hashlib.new('ripemd160', encoded_public_key).hexdigest().upper()
|
||||||
|
|
||||||
|
|
||||||
|
def public_key_from_base64(base64_public_key):
|
||||||
|
return base64.b64decode(base64_public_key).hex().upper()
|
||||||
|
|
||||||
|
|
||||||
|
def public_key_to_base64(ed25519_public_key):
|
||||||
|
ed25519_public_key = bytes.fromhex(ed25519_public_key)
|
||||||
|
return base64.b64encode(ed25519_public_key).decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
def amino_encoded_public_key(ed25519_public_key):
|
||||||
|
return bytes.fromhex('1624DE6220{}'.format(ed25519_public_key))
|
||||||
|
@ -346,7 +346,8 @@ class MockResponse():
|
|||||||
def test_upsert_validator(mock_autoconfigure, mock_store_validator_update):
|
def test_upsert_validator(mock_autoconfigure, mock_store_validator_update):
|
||||||
from bigchaindb.commands.bigchaindb import run_upsert_validator
|
from bigchaindb.commands.bigchaindb import run_upsert_validator
|
||||||
|
|
||||||
args = Namespace(public_key='BOB_PUBLIC_KEY', power='10', config={})
|
args = Namespace(public_key='CJxdItf4lz2PwEf4SmYNAu/c/VpmX39JEgC5YpH7fxg=',
|
||||||
|
power='10', config={})
|
||||||
run_upsert_validator(args)
|
run_upsert_validator(args)
|
||||||
|
|
||||||
assert mock_store_validator_update.called
|
assert mock_store_validator_update.called
|
||||||
|
@ -99,17 +99,19 @@ def test_app(tb):
|
|||||||
assert block0['app_hash'] == new_block_hash
|
assert block0['app_hash'] == new_block_hash
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip(reason='Not working with Tendermint 0.19.0')
|
|
||||||
@pytest.mark.abci
|
@pytest.mark.abci
|
||||||
def test_upsert_validator(b, alice):
|
def test_upsert_validator(b, alice):
|
||||||
from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
|
from bigchaindb.backend.query import VALIDATOR_UPDATE_ID
|
||||||
from bigchaindb.backend import query, connect
|
from bigchaindb.backend import query, connect
|
||||||
from bigchaindb.models import Transaction
|
from bigchaindb.models import Transaction
|
||||||
|
from bigchaindb.tendermint.utils import public_key_to_base64
|
||||||
|
import time
|
||||||
|
|
||||||
conn = connect()
|
conn = connect()
|
||||||
public_key = '1718D2DBFF00158A0852A17A01C78F4DCF3BA8E4FB7B8586807FAC182A535034'
|
public_key = '1718D2DBFF00158A0852A17A01C78F4DCF3BA8E4FB7B8586807FAC182A535034'
|
||||||
power = 1
|
power = 1
|
||||||
validator = {'pub_key': {'type': 'ed25519',
|
|
||||||
|
validator = {'pub_key': {'type': 'AC26791624DE60',
|
||||||
'data': public_key},
|
'data': public_key},
|
||||||
'power': power}
|
'power': power}
|
||||||
validator_update = {'validator': validator,
|
validator_update = {'validator': validator,
|
||||||
@ -124,11 +126,13 @@ def test_upsert_validator(b, alice):
|
|||||||
|
|
||||||
code, message = b.write_transaction(tx, 'broadcast_tx_commit')
|
code, message = b.write_transaction(tx, 'broadcast_tx_commit')
|
||||||
assert code == 202
|
assert code == 202
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
validators = b.get_validators()
|
validators = b.get_validators()
|
||||||
validators = [(v['pub_key']['data'], v['voting_power']) for v in validators]
|
validators = [(v['pub_key']['value'], v['voting_power']) for v in validators]
|
||||||
|
|
||||||
assert ((public_key, power) in validators)
|
public_key64 = public_key_to_base64(public_key)
|
||||||
|
assert ((public_key64, power) in validators)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.abci
|
@pytest.mark.abci
|
||||||
|
@ -42,3 +42,29 @@ def test_merkleroot():
|
|||||||
hashes = [sha3_256(i.encode()).digest() for i in 'abc']
|
hashes = [sha3_256(i.encode()).digest() for i in 'abc']
|
||||||
assert merkleroot(hashes) == (
|
assert merkleroot(hashes) == (
|
||||||
'78c7c394d3158c218916b7ae0ebdea502e0f4e85c08e3b371e3dfd824d389fa3')
|
'78c7c394d3158c218916b7ae0ebdea502e0f4e85c08e3b371e3dfd824d389fa3')
|
||||||
|
|
||||||
|
|
||||||
|
SAMPLE_PUBLIC_KEY = {
|
||||||
|
"address": "53DC09497A6ED73B342C78AB1E916076A03A8B95",
|
||||||
|
"pub_key": {
|
||||||
|
"type": "AC26791624DE60",
|
||||||
|
"value": "7S+T/do70jvneAq0M1so2X3M1iWTSuwtuSAr3nVpfEw="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_convert_base64_public_key_to_address():
|
||||||
|
from bigchaindb.tendermint.utils import public_key64_to_address
|
||||||
|
|
||||||
|
address = public_key64_to_address(SAMPLE_PUBLIC_KEY['pub_key']['value'])
|
||||||
|
assert address == SAMPLE_PUBLIC_KEY['address']
|
||||||
|
|
||||||
|
|
||||||
|
def test_public_key_encoding_decoding():
|
||||||
|
from bigchaindb.tendermint.utils import (public_key_from_base64,
|
||||||
|
public_key_to_base64)
|
||||||
|
|
||||||
|
public_key = public_key_from_base64(SAMPLE_PUBLIC_KEY['pub_key']['value'])
|
||||||
|
base64_public_key = public_key_to_base64(public_key)
|
||||||
|
|
||||||
|
assert base64_public_key == SAMPLE_PUBLIC_KEY['pub_key']['value']
|
||||||
|
Loading…
x
Reference in New Issue
Block a user