Skip to content

Commit 0a0f2ef

Browse files
authored
fix: multi sign signatures & fees (#143)
1 parent 63e828a commit 0a0f2ef

File tree

5 files changed

+87
-8
lines changed

5 files changed

+87
-8
lines changed

crypto/transactions/builder/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ def multi_sign(self, passphrase, index):
7373

7474
msg = self.transaction.to_bytes()
7575
secret = unhexlify(PrivateKey.from_passphrase(passphrase).to_hex())
76-
signature = hexlify(Signature.sign(msg, secret).encode())
76+
signature = Signature.sign(msg, secret)
7777

7878
index_formatted = hex(index).replace('x', '')
79-
self.transaction.signatures.append(index_formatted + signature.decode())
79+
self.transaction.signatures.append(index_formatted + signature)
8080

8181
def serialize(self, skip_signature=False, skip_second_signature=False, skip_multi_signature=False):
8282
"""Perform AIP11 compliant serialization.

crypto/transactions/builder/multi_signature_registration.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,8 @@ def set_min(self, minimum_participants):
3131

3232
def set_public_keys(self, public_keys):
3333
self.transaction.asset['multiSignature']['publicKeys'] = public_keys
34-
self.transaction.fee = (len(public_keys) + 1) * self.transaction.fee
3534

3635
def add_participant(self, public_key: str):
3736
self.transaction.asset['multiSignature']['publicKeys'].append(public_key)
3837

39-
public_key_count = (len(self.transaction.asset['multiSignature']['publicKeys']) + 1)
40-
transaction_fee = get_fee(TRANSACTION_MULTI_SIGNATURE_REGISTRATION)
41-
42-
self.transaction.fee = public_key_count * transaction_fee
38+
self.transaction.fee = get_fee(TRANSACTION_MULTI_SIGNATURE_REGISTRATION)

tests/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import pytest
22

33

4+
@pytest.fixture
5+
def passphrase():
6+
"""Passphrase used for tests"""
7+
8+
return 'my super secret passphrase'
9+
410
@pytest.fixture
511
def transaction_type_0():
612
"""Transaction of type "transfer"

tests/transactions/builder/test_multi_signature_registration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def test_multi_signature_registration_transaction(passphrase):
3131

3232
assert transaction_dict['nonce'] == 1
3333
assert transaction_dict['version'] == 1
34-
assert transaction_dict['fee'] == 2000000000
34+
assert transaction_dict['fee'] == 500000000
3535
assert transaction_dict['signature']
3636
assert transaction_dict['type'] is TRANSACTION_MULTI_SIGNATURE_REGISTRATION
3737
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value

tests/transactions/deserializers/test_multi_signature_registration.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
from crypto.constants import TRANSACTION_FEES
2+
from crypto.identity.public_key import PublicKey
3+
from crypto.transactions.builder.multi_signature_registration import MultiSignatureRegistration
14
from crypto.transactions.deserializer import Deserializer
5+
from crypto.transactions.serializer import Serializer
26

37

48
def test_multi_signature_registration_deserializer(transaction_type_4):
@@ -21,3 +25,76 @@ def test_multi_signature_registration_deserializer(transaction_type_4):
2125
assert actual.signatures == transaction_type_4['signatures']
2226

2327
actual.verify_multisig_schnorr()
28+
29+
30+
def test_multi_signature_registration_deserializer_from_serialized(transaction_type_4):
31+
result = Serializer(transaction_type_4).serialize(False, True, False)
32+
33+
deserializer = Deserializer(result)
34+
actual = deserializer.deserialize()
35+
36+
assert actual.version == transaction_type_4['version']
37+
assert actual.network == transaction_type_4['network']
38+
assert actual.typeGroup == transaction_type_4['typeGroup']
39+
assert actual.type == transaction_type_4['type']
40+
assert actual.nonce == transaction_type_4['nonce']
41+
assert actual.senderPublicKey == transaction_type_4['senderPublicKey']
42+
assert actual.fee == transaction_type_4['fee']
43+
assert actual.amount == transaction_type_4['amount']
44+
assert actual.signature == transaction_type_4['signature']
45+
assert actual.id == transaction_type_4['id']
46+
47+
assert actual.asset['multiSignature']['min'] == transaction_type_4['asset']['multiSignature']['min']
48+
assert actual.asset['multiSignature']['publicKeys'] == transaction_type_4['asset']['multiSignature']['publicKeys']
49+
assert actual.signatures == transaction_type_4['signatures']
50+
51+
actual.verify_multisig_schnorr()
52+
53+
def test_with_methods(passphrase):
54+
transaction = MultiSignatureRegistration()
55+
56+
passphrase_2 = f'{passphrase} 2'
57+
passphrase_3 = f'{passphrase} 3'
58+
59+
sender_public_key = PublicKey.from_passphrase(passphrase)
60+
participant_2 = PublicKey.from_passphrase(passphrase_2)
61+
participant_3 = PublicKey.from_passphrase(passphrase_3)
62+
63+
transaction.set_sender_public_key(sender_public_key)
64+
transaction.set_nonce(15)
65+
transaction.set_min(2)
66+
transaction.add_participant(sender_public_key)
67+
transaction.add_participant(participant_2)
68+
transaction.add_participant(participant_3)
69+
70+
transaction.multi_sign(passphrase, 0)
71+
transaction.multi_sign(passphrase_2, 1)
72+
transaction.multi_sign(passphrase_3, 2)
73+
74+
transaction.sign(passphrase)
75+
76+
result = Serializer(transaction.to_dict()).serialize(False, True, False)
77+
78+
deserializer = Deserializer(result)
79+
actual = deserializer.deserialize()
80+
81+
assert actual.version == 1
82+
assert actual.network == 30
83+
assert actual.typeGroup == 1
84+
assert actual.type == 4
85+
assert actual.nonce == 15
86+
assert actual.senderPublicKey == sender_public_key
87+
assert actual.fee == TRANSACTION_FEES[4]
88+
assert actual.amount == 0
89+
assert actual.signature == transaction.transaction.signature
90+
assert actual.id == transaction.transaction.id
91+
92+
assert actual.asset['multiSignature']['min'] == 2
93+
assert actual.asset['multiSignature']['publicKeys'][0] == sender_public_key
94+
assert actual.asset['multiSignature']['publicKeys'][1] == participant_2
95+
assert actual.asset['multiSignature']['publicKeys'][2] == participant_3
96+
97+
assert actual.signatures == transaction.transaction.signatures
98+
assert len(actual.signatures) == 3
99+
100+
actual.verify_multisig_schnorr()

0 commit comments

Comments
 (0)