Skip to content

Commit 8f17630

Browse files
committed
Dedupe signatures in build_and_sign
Users can sometimes pass same signing keys, which leads to duplicated signatures, resulting the actual fee to be greater than estimated fee. This commit will remove deplicated signatures and therefore eliminate this type of issue.
1 parent fe977af commit 8f17630

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

pycardano/key.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ def __eq__(self, other):
148148
def __repr__(self) -> str:
149149
return self.to_json()
150150

151+
def __hash__(self):
152+
return hash(self.payload)
153+
151154

152155
class SigningKey(Key):
153156
def sign(self, data: bytes) -> bytes:

pycardano/txbuilder.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ def build_and_sign(
12561256
witness_set = self.build_witness_set()
12571257
witness_set.vkey_witnesses = []
12581258

1259-
for signing_key in signing_keys:
1259+
for signing_key in set(signing_keys):
12601260
signature = signing_key.sign(tx_body.hash())
12611261
witness_set.vkey_witnesses.append(
12621262
VerificationKeyWitness(signing_key.to_verification_key(), signature)

test/pycardano/test_key.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,18 @@ def test_key_save():
9797
SK.save(f.name)
9898
sk = PaymentSigningKey.load(f.name)
9999
assert SK == sk
100+
101+
102+
def test_key_hash():
103+
sk = PaymentSigningKey.generate()
104+
vk = PaymentVerificationKey.from_signing_key(sk)
105+
106+
sk_set = set()
107+
vk_set = set()
108+
109+
for _ in range(2):
110+
sk_set.add(sk)
111+
vk_set.add(vk)
112+
113+
assert len(sk_set) == 1
114+
assert len(vk_set) == 1

0 commit comments

Comments
 (0)