From 7f512474dc0887b2bf3064a0a16aee2fc8ef0d27 Mon Sep 17 00:00:00 2001 From: Oleksandr Pravdyvyi Date: Mon, 17 Mar 2025 13:18:44 +0200 Subject: [PATCH] fix: adding core primitives crate --- Cargo.lock | 16 ++++++ Cargo.toml | 1 + core_primitives/Cargo.toml | 20 +++++++ core_primitives/src/commitment.rs | 16 ++++++ core_primitives/src/lib.rs | 5 ++ core_primitives/src/merkle_tree_public.rs | 2 + core_primitives/src/nullifier.rs | 18 ++++++ core_primitives/src/transaction.rs | 67 +++++++++++++++++++++++ core_primitives/src/utxo.rs | 29 ++++++++++ 9 files changed, 174 insertions(+) create mode 100644 core_primitives/Cargo.toml create mode 100644 core_primitives/src/commitment.rs create mode 100644 core_primitives/src/lib.rs create mode 100644 core_primitives/src/merkle_tree_public.rs create mode 100644 core_primitives/src/nullifier.rs create mode 100644 core_primitives/src/transaction.rs create mode 100644 core_primitives/src/utxo.rs diff --git a/Cargo.lock b/Cargo.lock index ef85b85..d4f4361 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1202,6 +1202,22 @@ dependencies = [ "libc", ] +[[package]] +name = "core_primitives" +version = "0.1.0" +dependencies = [ + "anyhow", + "elliptic-curve", + "env_logger", + "log", + "monotree", + "sequencer_core", + "serde", + "serde_json", + "sha2 0.10.8", + "storage", +] + [[package]] name = "cpp_demangle" version = "0.4.4" diff --git a/Cargo.toml b/Cargo.toml index 70e89f9..54e3059 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ members = [ "rpc_primitives", "common", "sc_core", + "core_primitives", ] [workspace.dependencies] diff --git a/core_primitives/Cargo.toml b/core_primitives/Cargo.toml new file mode 100644 index 0000000..c3a6f72 --- /dev/null +++ b/core_primitives/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "core_primitives" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow.workspace = true +serde_json.workspace = true +env_logger.workspace = true +log.workspace = true +serde.workspace = true +sha2.workspace = true +elliptic-curve.workspace = true +monotree.workspace = true + +[dependencies.storage] +path = "../storage" + +[dependencies.sequencer_core] +path = "../sequencer_core" diff --git a/core_primitives/src/commitment.rs b/core_primitives/src/commitment.rs new file mode 100644 index 0000000..6ac22bb --- /dev/null +++ b/core_primitives/src/commitment.rs @@ -0,0 +1,16 @@ +use crate::merkle_tree_public::CommitmentHashType; +use monotree::database::MemoryDB; +use monotree::hasher::Blake3; +use monotree::{Hasher, Monotree, Proof}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq)] +pub struct Commitment { + pub commitment_hash: CommitmentHashType, +} + +pub struct CommitmentsSparseMerkleTree { + pub curr_root: Option, + pub tree: Monotree, + pub hasher: Blake3, +} diff --git a/core_primitives/src/lib.rs b/core_primitives/src/lib.rs new file mode 100644 index 0000000..08f4269 --- /dev/null +++ b/core_primitives/src/lib.rs @@ -0,0 +1,5 @@ +pub mod commitment; +pub mod merkle_tree_public; +pub mod nullifier; +pub mod transaction; +pub mod utxo; diff --git a/core_primitives/src/merkle_tree_public.rs b/core_primitives/src/merkle_tree_public.rs new file mode 100644 index 0000000..b13d4ba --- /dev/null +++ b/core_primitives/src/merkle_tree_public.rs @@ -0,0 +1,2 @@ +pub type TreeHashType = [u8; 32]; +pub type CommitmentHashType = Vec; diff --git a/core_primitives/src/nullifier.rs b/core_primitives/src/nullifier.rs new file mode 100644 index 0000000..c395e4f --- /dev/null +++ b/core_primitives/src/nullifier.rs @@ -0,0 +1,18 @@ +use crate::merkle_tree_public::TreeHashType; +use monotree::database::MemoryDB; +use monotree::hasher::Blake3; +use monotree::{Hasher, Monotree, Proof}; +use serde::{Deserialize, Serialize}; + +//ToDo: Update Nullifier model, when it is clear +#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq)] +///General nullifier object +pub struct UTXONullifier { + pub utxo_hash: TreeHashType, +} + +pub struct NullifierSparseMerkleTree { + pub curr_root: Option, + pub tree: Monotree, + pub hasher: Blake3, +} diff --git a/core_primitives/src/transaction.rs b/core_primitives/src/transaction.rs new file mode 100644 index 0000000..90203cb --- /dev/null +++ b/core_primitives/src/transaction.rs @@ -0,0 +1,67 @@ +use log::info; +use serde::{Deserialize, Serialize}; +use sha2::{digest::FixedOutput, Digest}; + +use crate::merkle_tree_public::TreeHashType; + +use elliptic_curve::{ + consts::{B0, B1}, + generic_array::GenericArray, +}; +use sha2::digest::typenum::{UInt, UTerm}; + +pub type CipherText = Vec; +pub type Nonce = GenericArray, B1>, B0>, B0>>; + +#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +pub enum TxKind { + Public, + Private, + Shielded, + Deshielded, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +///General transaction object +pub struct Transaction { + pub hash: TreeHashType, + pub tx_kind: TxKind, + ///Tx input data (public part) + pub execution_input: Vec, + ///Tx output data (public_part) + pub execution_output: Vec, + ///Tx input utxo commitments + pub utxo_commitments_spent_hashes: Vec, + ///Tx output utxo commitments + pub utxo_commitments_created_hashes: Vec, + ///Tx output nullifiers + pub nullifier_created_hashes: Vec, + ///Execution proof (private part) + pub execution_proof_private: String, + ///Encoded blobs of data + pub encoded_data: Vec<(CipherText, Vec)>, + ///Transaction senders ephemeral pub key + pub ephemeral_pub_key: Vec, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +///General transaction object +pub struct TransactionPayload { + pub tx_kind: TxKind, + ///Tx input data (public part) + pub execution_input: Vec, + ///Tx output data (public_part) + pub execution_output: Vec, + ///Tx input utxo commitments + pub utxo_commitments_spent_hashes: Vec, + ///Tx output utxo commitments + pub utxo_commitments_created_hashes: Vec, + ///Tx output nullifiers + pub nullifier_created_hashes: Vec, + ///Execution proof (private part) + pub execution_proof_private: String, + ///Encoded blobs of data + pub encoded_data: Vec<(CipherText, Vec)>, + ///Transaction senders ephemeral pub key + pub ephemeral_pub_key: Vec, +} diff --git a/core_primitives/src/utxo.rs b/core_primitives/src/utxo.rs new file mode 100644 index 0000000..b4062d5 --- /dev/null +++ b/core_primitives/src/utxo.rs @@ -0,0 +1,29 @@ +use anyhow::Result; +use log::info; +use serde::{Deserialize, Serialize}; +use sha2::{digest::FixedOutput, Digest}; +use storage::{merkle_tree_public::TreeHashType, nullifier::UTXONullifier, AccountId}; + +///Raw asset data +pub type Asset = Vec; + +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +///Container for raw utxo payload +pub struct UTXO { + pub hash: TreeHashType, + pub owner: AccountId, + pub nullifier: Option, + pub asset: Asset, + // TODO: change to u256 + pub amount: u128, + pub privacy_flag: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct UTXOPayload { + pub owner: AccountId, + pub asset: Asset, + // TODO: change to u256 + pub amount: u128, + pub privacy_flag: bool, +}