diff --git a/common/src/transaction.rs b/common/src/transaction.rs index 3f2dcb2..9509a7c 100644 --- a/common/src/transaction.rs +++ b/common/src/transaction.rs @@ -1,5 +1,5 @@ use log::info; -use secp256k1_zkp::{PedersenCommitment, Tweak}; +use secp256k1_zkp::{PedersenCommitment, PublicKey, Scalar, Tweak}; use serde::{Deserialize, Serialize}; use sha2::{digest::FixedOutput, Digest}; @@ -57,6 +57,25 @@ pub struct Transaction { pub state_changes: (serde_json::Value, usize), } +#[derive(Serialize, Deserialize)] +struct TransactionSignature {} + +/// A transaction with a signature. +/// Meant to be sent through the network to the sequencer +#[derive(Serialize, Deserialize)] +pub struct UnverifiedSignedTransaction { + transaction: Transaction, + signature: TransactionSignature +} + +/// A transaction with a valid signature over its hash. +/// Can only be constructed from an `UnverifiedSignedTransaction` +/// if the signature is valid +pub struct VerifiedSignedTransaction { + transaction: Transaction, + signature: TransactionSignature +} + #[derive(Debug, Serialize, Deserialize)] pub struct MintMoneyPublicTx { pub acc: [u8; 32], @@ -150,6 +169,9 @@ impl ActionData { } } +type SignaturePrivateKey = Scalar; +type SignaturePublicKey = PublicKey; + impl Transaction { /// Computes and returns the SHA-256 hash of the JSON-serialized representation of `self`. pub fn hash(&self) -> TreeHashType { @@ -162,6 +184,13 @@ impl Transaction { TreeHashType::from(hasher.finalize_fixed()) } + pub fn sign(self, _private_key: SignaturePrivateKey) -> UnverifiedSignedTransaction { + let _hash = self.hash(); + // Implement actual signature over `hash` + let signature = TransactionSignature {}; + UnverifiedSignedTransaction { transaction: self, signature } + } + pub fn log(&self) { info!("Transaction hash is {:?}", hex::encode(self.hash())); info!("Transaction tx_kind is {:?}", self.tx_kind); @@ -214,6 +243,14 @@ impl Transaction { } } +impl UnverifiedSignedTransaction { + pub fn into_verified(self) -> VerifiedSignedTransaction { + let hash = self.transaction.hash(); + // Check signature over hash + todo!() + } +} + #[cfg(test)] mod tests { use secp256k1_zkp::{constants::SECRET_KEY_SIZE, Tweak};