serialize signed transaction

This commit is contained in:
Mark Spanbroek 2024-12-16 10:16:00 +01:00
parent 1c538eb74f
commit 8bb117cd40
4 changed files with 45 additions and 0 deletions

View File

@ -1,7 +1,9 @@
import ./signatures/identity
import ./signatures/signing
import ./signatures/signed
import ./signatures/serialization
export identity
export signing
export signed
export serialization

View File

@ -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

View File

@ -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))

View File

@ -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()