From 8bb117cd40a824026562cbc020c259da07a0b3f4 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Mon, 16 Dec 2024 10:16:00 +0100 Subject: [PATCH] serialize signed transaction --- codexvalidator/signatures.nim | 2 ++ codexvalidator/signatures/serialization.nim | 13 +++++++++++++ codexvalidator/transaction/serialization.nim | 19 +++++++++++++++++++ .../transaction/testSerialization.nim | 11 +++++++++++ 4 files changed, 45 insertions(+) create mode 100644 codexvalidator/signatures/serialization.nim diff --git a/codexvalidator/signatures.nim b/codexvalidator/signatures.nim index 1a4d786..c8d637f 100644 --- a/codexvalidator/signatures.nim +++ b/codexvalidator/signatures.nim @@ -1,7 +1,9 @@ import ./signatures/identity import ./signatures/signing import ./signatures/signed +import ./signatures/serialization export identity export signing export signed +export serialization diff --git a/codexvalidator/signatures/serialization.nim b/codexvalidator/signatures/serialization.nim new file mode 100644 index 0000000..5c4a2cc --- /dev/null +++ b/codexvalidator/signatures/serialization.nim @@ -0,0 +1,13 @@ +import pkg/blscurve +import ./identity +import ./signing + +func toBytes*(identifier: Identifier): seq[byte] = + var bytes: array[48, byte] + doAssert blscurve.serialize(bytes, identifier) + @bytes + +func toBytes*(signature: Signature): seq[byte] = + var bytes: array[96, byte] + doAssert blscurve.serialize(bytes, signature) + @bytes diff --git a/codexvalidator/transaction/serialization.nim b/codexvalidator/transaction/serialization.nim index 3eb23f4..6b82dba 100644 --- a/codexvalidator/transaction/serialization.nim +++ b/codexvalidator/transaction/serialization.nim @@ -1,5 +1,6 @@ import pkg/protobuf_serialization import ../basics +import ../signatures import ./transaction export protobuf_serialization @@ -63,3 +64,21 @@ func init*(_: type TransactionMessage, transaction: Transaction): TransactionMes func toBytes*(transaction: Transaction): seq[byte] = ProtoBuf.encode(TransactionMessage.init(transaction)) + +type SignedTransactionMessage* {.proto3.} = object + transaction* {.fieldNumber: 1.}: TransactionMessage + signer* {.fieldNumber: 2.}: seq[byte] + signature* {.fieldNumber: 3.}: seq[byte] + +func init*( + _: type SignedTransactionMessage, + signed: Signed[Transaction] +): SignedTransactionMessage = + SignedTransactionMessage( + transaction: TransactionMessage.init(signed.value), + signer: signed.signer.toBytes(), + signature: signed.signature.toBytes() + ) + +func toBytes*(signed: Signed[Transaction]): seq[byte] = + Protobuf.encode(SignedTransactionMessage.init(signed)) diff --git a/tests/codexvalidator/transaction/testSerialization.nim b/tests/codexvalidator/transaction/testSerialization.nim index cd15e9f..7881f06 100644 --- a/tests/codexvalidator/transaction/testSerialization.nim +++ b/tests/codexvalidator/transaction/testSerialization.nim @@ -1,6 +1,7 @@ import ../basics import codexvalidator/transaction import codexvalidator/transaction/serialization +import codexvalidator/signatures suite "Transaction serialization": @@ -40,3 +41,13 @@ suite "Transaction serialization": check protobuf.proof.b.y.imag == transaction.proof.b.y.imag.toBytesBE() check protobuf.proof.c.x == transaction.proof.c.x.toBytesBE() check protobuf.proof.c.y == transaction.proof.c.y.toBytesBE() + + test "serializes a signed transaction with protobuf": + let transaction = Transaction.example + let identity = Identity.example + let signed = Signed.sign(identity, transaction) + let serialized = signed.toBytes() + let protobuf = Protobuf.decode(serialized, SignedTransactionMessage) + check protobuf.transaction == TransactionMessage.init(transaction) + check protobuf.signer == signed.signer.toBytes() + check protobuf.signature == signed.signature.toBytes()