Skip to content

Commit f8b8363

Browse files
committed
fix: prevent duplicate signatures in _signature_map
Signed-off-by: Mohit Yadav <ymohit799057@gmail.com>
1 parent ce4713d commit f8b8363

2 files changed

Lines changed: 51 additions & 2 deletions

File tree

src/hiero_sdk_python/transaction/transaction.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,12 @@ def sign(self, private_key: PrivateKey) -> Transaction:
192192
# We initialize the signature map for this body_bytes if it doesn't exist yet
193193
self._signature_map.setdefault(body_bytes, basic_types_pb2.SignatureMap())
194194

195-
# Append the signature pair to the signature map for this transaction body
196-
self._signature_map[body_bytes].sigPair.append(sig_pair)
195+
# deduplication check
196+
already_signed = any(sp.pubKeyPrefix == public_key_bytes for sp in self._signature_map[body_bytes].sigPair)
197+
198+
# append only if not already signed
199+
if not already_signed:
200+
self._signature_map[body_bytes].sigPair.append(sig_pair)
197201

198202
return self
199203

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from __future__ import annotations
2+
3+
from hiero_sdk_python.account.account_id import AccountId
4+
from hiero_sdk_python.crypto.private_key import PrivateKey
5+
from hiero_sdk_python.tokens.token_mint_transaction import TokenMintTransaction
6+
from hiero_sdk_python.transaction.transaction_id import TransactionId
7+
8+
9+
def test_duplicate_signature_not_added():
10+
tx = TokenMintTransaction()
11+
12+
tx.set_transaction_id(TransactionId.generate(AccountId(0, 0, 1234)))
13+
tx.set_node_account_id(AccountId(0, 0, 3))
14+
15+
key = PrivateKey.generate_ed25519()
16+
17+
tx.freeze()
18+
19+
tx.sign(key)
20+
tx.sign(key)
21+
22+
body_bytes = next(iter(tx._signature_map.keys()))
23+
sig_pairs = tx._signature_map[body_bytes].sigPair
24+
25+
assert len(sig_pairs) == 1, "Expected 1 signature for duplicate key"
26+
27+
28+
def test_multiple_keys_still_work():
29+
tx = TokenMintTransaction()
30+
31+
tx.set_transaction_id(TransactionId.generate(AccountId(0, 0, 1234)))
32+
tx.set_node_account_id(AccountId(0, 0, 3))
33+
34+
key1 = PrivateKey.generate_ed25519()
35+
key2 = PrivateKey.generate_ed25519()
36+
37+
tx.freeze()
38+
39+
tx.sign(key1)
40+
tx.sign(key2)
41+
42+
body_bytes = next(iter(tx._signature_map.keys()))
43+
sig_pairs = tx._signature_map[body_bytes].sigPair
44+
45+
assert len(sig_pairs) == 2, "Expected 2 signatures for different keys"

0 commit comments

Comments
 (0)