diff --git a/examples/example_transfer_transaction_bls.py b/examples/example_transfer_transaction_bls.py index f03d86f..e590ee7 100644 --- a/examples/example_transfer_transaction_bls.py +++ b/examples/example_transfer_transaction_bls.py @@ -18,11 +18,16 @@ def main() -> None: sec = PrivateKey.from_string( "TSECRET1PZF33H72N9PHXZATY5URH5SS4M33VVDFAWYVESL5JTLT9A00TNWKQYNGM6Z" ) + pub = sec.public_key() tx = Transaction.create_transfer_tx(lock_time, sender, receiver, amount, fee, memo) - signed_tx = tx.sign(sec) + signed_data = tx.sign(sec) - print(f"Signed transaction hex: {signed_tx.hex()}") + if not pub.verify(bytes(tx.sign_bytes()), tx.signature): + print("Signature verification failed") + exit(1) + + print(f"Signed transaction hex: {signed_data.hex()}") if __name__ == "__main__": diff --git a/examples/example_transfer_transaction_ed25519.py b/examples/example_transfer_transaction_ed25519.py index f1c9d5a..f2b190b 100644 --- a/examples/example_transfer_transaction_ed25519.py +++ b/examples/example_transfer_transaction_ed25519.py @@ -18,10 +18,15 @@ def main() -> None: sec = PrivateKey.from_string( "TSECRET1RGLSGPYLQRVET27AZUVS9TSP8MPGF9LH4U4RKKARMCATFK9L0KUCS7DCC09" ) + pub = sec.public_key() tx = Transaction.create_transfer_tx(lock_time, sender, receiver, amount, fee, memo) signed_tx = tx.sign(sec) + if not pub.verify(bytes(tx.sign_bytes()), tx.signature): + print("Signature verification failed") + exit(1) + print(f"Signed transaction hex: {signed_tx.hex()}") diff --git a/pactus/amount.py b/pactus/amount.py index d7f492d..def8a40 100644 --- a/pactus/amount.py +++ b/pactus/amount.py @@ -26,6 +26,9 @@ def __eq__(self, other: "Amount") -> bool: return False + def __hash__(self) -> int: + return hash(self.value) + @classmethod def from_nano_pac(cls, a: int) -> "Amount": """Store the value as NanoPAC in the Amount instance.""" diff --git a/pactus/transaction/transaction.py b/pactus/transaction/transaction.py index 55e82fe..fba2459 100644 --- a/pactus/transaction/transaction.py +++ b/pactus/transaction/transaction.py @@ -1,6 +1,8 @@ from pactus.amount import Amount from pactus.crypto.address import Address from pactus.crypto.private_key import PrivateKey +from pactus.crypto.public_key import PublicKey +from pactus.crypto.signature import Signature from pactus.encoding import encoding from ._payload import ( @@ -11,6 +13,9 @@ WithdrawPayload, ) +FLAG_STRIPPED_PUBLIC_KEY = 0x01 +FLAG_NOT_SIGNED = 0x02 + class Transaction: def __init__( @@ -26,6 +31,8 @@ def __init__( self.version = 1 self.fee = fee self.payload = payload + self.public_key: PublicKey = None + self.signature: Signature = None @classmethod def create_transfer_tx( @@ -129,4 +136,8 @@ def sign(self, private_key: PrivateKey) -> bytes: encoding.append_fixed_bytes(buf, sig.raw_bytes()) encoding.append_fixed_bytes(buf, pub.raw_bytes()) + self.public_key = pub + self.signature = sig + self.flags |= FLAG_NOT_SIGNED + return buf diff --git a/ruff.toml b/ruff.toml index a0c12b8..f1755b6 100644 --- a/ruff.toml +++ b/ruff.toml @@ -51,6 +51,7 @@ ignore = [ "D107", "D203", "D212", + "TC001", "COM812", "ISC001", "D205",