mirror of
https://github.com/planetmint/planetmint.git
synced 2025-10-14 00:59:17 +00:00

* added another dispatcher to server block changes Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed missing variable definition Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * made the definition of POINON_PILL unique Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * changed some fixtures for web tests, fixed linter errors, updated aiohttp version Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> * added block hash to the block notification Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed misspelling issue Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed previous merge issues Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed websocket startup issues Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed queuing issue and disabled one tests Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * increased version number Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed docs req deps Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed linting issues Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed linting warnings Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com> * fixed aiohttp.web.run_app call Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com> Co-authored-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
75 lines
2.3 KiB
Python
75 lines
2.3 KiB
Python
import base64
|
|
import binascii
|
|
import codecs
|
|
|
|
from tendermint.abci import types_pb2
|
|
from tendermint.crypto import keys_pb2
|
|
from planetmint.transactions.common.exceptions import InvalidPublicKey
|
|
|
|
|
|
def encode_validator(v):
|
|
ed25519_public_key = v['public_key']['value']
|
|
pub_key = keys_pb2.PublicKey(ed25519=bytes.fromhex(ed25519_public_key))
|
|
|
|
return types_pb2.ValidatorUpdate(pub_key=pub_key, power=v['power'])
|
|
|
|
|
|
def decode_validator(v):
|
|
return {'public_key': {'type': 'ed25519-base64',
|
|
'value': codecs.encode(v.pub_key.ed25519, 'base64').decode().rstrip('\n')},
|
|
'voting_power': v.power}
|
|
|
|
|
|
def new_validator_set(validators, updates):
|
|
validators_dict = {}
|
|
for v in validators:
|
|
validators_dict[v['public_key']['value']] = v
|
|
|
|
updates_dict = {}
|
|
for u in updates:
|
|
decoder = get_public_key_decoder(u['public_key'])
|
|
public_key64 = base64.b64encode(decoder(u['public_key']['value'])).decode('utf-8')
|
|
updates_dict[public_key64] = {'public_key': {'type': 'ed25519-base64',
|
|
'value': public_key64},
|
|
'voting_power': u['power']}
|
|
|
|
new_validators_dict = {**validators_dict, **updates_dict}
|
|
return list(new_validators_dict.values())
|
|
|
|
|
|
def encode_pk_to_base16(validator):
|
|
pk = validator['public_key']
|
|
decoder = get_public_key_decoder(pk)
|
|
public_key16 = base64.b16encode(decoder(pk['value'])).decode('utf-8')
|
|
|
|
validator['public_key']['value'] = public_key16
|
|
return validator
|
|
|
|
|
|
def validate_asset_public_key(pk):
|
|
pk_binary = pk['value'].encode('utf-8')
|
|
decoder = get_public_key_decoder(pk)
|
|
try:
|
|
pk_decoded = decoder(pk_binary)
|
|
if len(pk_decoded) != 32:
|
|
raise InvalidPublicKey('Public key should be of size 32 bytes')
|
|
|
|
except binascii.Error:
|
|
raise InvalidPublicKey('Invalid `type` specified for public key `value`')
|
|
|
|
|
|
def get_public_key_decoder(pk):
|
|
encoding = pk['type']
|
|
decoder = base64.b64decode
|
|
|
|
if encoding == 'ed25519-base16':
|
|
decoder = base64.b16decode
|
|
elif encoding == 'ed25519-base32':
|
|
decoder = base64.b32decode
|
|
elif encoding == 'ed25519-base64':
|
|
decoder = base64.b64decode
|
|
else:
|
|
raise InvalidPublicKey('Invalid `type` specified for public key `value`')
|
|
|
|
return decoder
|