Skip to content

Commit d677d82

Browse files
authored
refactor: keccak hashing & fixture adjustments (#151)
1 parent 4d84a1c commit d677d82

30 files changed

+348
-521
lines changed

crypto/identity/private_key.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
from binascii import hexlify
22
from hashlib import sha256
33
from coincurve import PrivateKey as PvtKey
4+
from Cryptodome.Hash import keccak
45

56
from crypto.enums.constants import Constants
67

8+
def keccak256(data: bytes) -> bytes:
9+
"""Keccak256 hash function"""
10+
11+
return bytes.fromhex(keccak.new(data=data, digest_bits=256).hexdigest())
12+
713
class PrivateKey(object):
814
def __init__(self, private_key: str):
915
self.private_key = PvtKey.from_hex(private_key)
@@ -31,7 +37,7 @@ def sign_compact(self, message: bytes) -> bytes:
3137
Returns:
3238
bytes: signature of the signed message
3339
"""
34-
der = self.private_key.sign_recoverable(message)
40+
der = self.private_key.sign_recoverable(message, hasher=keccak256)
3541

3642
return bytes([der[64] + Constants.ETHEREUM_RECOVERY_ID_OFFSET.value]) + der[0:64]
3743

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from crypto.transactions.builder.base import AbstractTransactionBuilder
22
from crypto.transactions.types.evm_call import EvmCall
3+
from crypto.utils.transaction_utils import TransactionUtils
34

45
class EvmCallBuilder(AbstractTransactionBuilder):
56
def payload(self, payload: str):
6-
payload = payload.lstrip('0x') # Remove '0x' prefix if present
7+
payload = TransactionUtils.parse_hex_from_str(payload) # Remove '0x' prefix if present
8+
79
self.transaction.data['data'] = payload
10+
811
return self
912

1013
def get_transaction_instance(self, data: dict):
11-
return EvmCall(data)
14+
return EvmCall(data)

crypto/transactions/deserializer.py

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import re
21
from binascii import unhexlify
32
from typing import Optional
43
from crypto.enums.constants import Constants
4+
from crypto.enums.contract_abi_type import ContractAbiType
55
from crypto.transactions.types.abstract_transaction import AbstractTransaction
66
from crypto.transactions.types.transfer import Transfer
77
from crypto.transactions.types.evm_call import EvmCall
8+
from crypto.transactions.types.username_registration import UsernameRegistration
9+
from crypto.transactions.types.username_resignation import UsernameResignation
810
from crypto.transactions.types.vote import Vote
911
from crypto.transactions.types.unvote import Unvote
1012
from crypto.transactions.types.validator_registration import ValidatorRegistration
@@ -13,6 +15,7 @@
1315
from crypto.enums.abi_function import AbiFunction
1416
from crypto.utils.abi_decoder import AbiDecoder
1517
from crypto.utils.rlp_decoder import RlpDecoder
18+
from crypto.utils.transaction_utils import TransactionUtils
1619

1720
class Deserializer:
1821
SIGNATURE_SIZE = 64
@@ -59,30 +62,40 @@ def guess_transaction_from_data(self, data: dict) -> AbstractTransaction:
5962
if data['value'] != '0':
6063
return Transfer(data)
6164

62-
payload_data = self.decode_payload(data)
65+
consensus_payload_data = self.decode_payload(data)
66+
if consensus_payload_data is not None:
67+
function_name = consensus_payload_data.get('functionName')
68+
if function_name == AbiFunction.VOTE.value:
69+
return Vote(data)
6370

64-
if payload_data is None:
65-
return EvmCall(data)
71+
if function_name == AbiFunction.UNVOTE.value:
72+
return Unvote(data)
6673

67-
function_name = payload_data.get('functionName')
68-
if function_name == AbiFunction.VOTE.value:
69-
return Vote(data)
70-
elif function_name == AbiFunction.UNVOTE.value:
71-
return Unvote(data)
72-
elif function_name == AbiFunction.VALIDATOR_REGISTRATION.value:
73-
return ValidatorRegistration(data)
74-
elif function_name == AbiFunction.VALIDATOR_RESIGNATION.value:
75-
return ValidatorResignation(data)
76-
else:
77-
return EvmCall(data)
74+
if function_name == AbiFunction.VALIDATOR_REGISTRATION.value:
75+
return ValidatorRegistration(data)
7876

79-
def decode_payload(self, data: dict) -> Optional[dict]:
77+
if function_name == AbiFunction.VALIDATOR_RESIGNATION.value:
78+
return ValidatorResignation(data)
79+
80+
username_payload_data = self.decode_payload(data, ContractAbiType.USERNAMES)
81+
if username_payload_data is not None:
82+
function_name = username_payload_data.get('functionName')
83+
if function_name == AbiFunction.USERNAME_REGISTRATION.value:
84+
return UsernameRegistration(data)
85+
86+
if function_name == AbiFunction.USERNAME_RESIGNATION.value:
87+
return UsernameResignation(data)
88+
89+
return EvmCall(data)
90+
91+
@staticmethod
92+
def decode_payload(data: dict, abi_type: ContractAbiType = ContractAbiType.CONSENSUS) -> Optional[dict]:
8093
payload = data.get('data', '')
8194

8295
if payload == '':
8396
return None
8497

85-
decoder = AbiDecoder()
98+
decoder = AbiDecoder(abi_type)
8699
try:
87100
return decoder.decode_function_data(payload)
88101
except Exception as e:
@@ -100,7 +113,7 @@ def parse_big_number(value: str) -> str:
100113

101114
@staticmethod
102115
def parse_hex(value: str) -> str:
103-
return re.sub(r'^0x', '', value)
116+
return TransactionUtils.parse_hex_from_str(value)
104117

105118
@staticmethod
106119
def parse_address(value: str) -> Optional[str]:

crypto/transactions/transaction.py

Lines changed: 0 additions & 234 deletions
This file was deleted.

0 commit comments

Comments
 (0)