2024-12-25 09:50:54 +02:00
|
|
|
use std::{collections::HashMap, path::Path};
|
2024-12-03 09:32:35 +02:00
|
|
|
|
|
|
|
|
use accounts::account_core::{Account, AccountAddress};
|
|
|
|
|
use accounts_store::NodeAccountsStore;
|
2024-12-05 13:05:58 +02:00
|
|
|
use anyhow::Result;
|
2024-12-03 09:32:35 +02:00
|
|
|
use block_store::NodeBlockStore;
|
2024-12-25 09:50:54 +02:00
|
|
|
use elliptic_curve::group::GroupEncoding;
|
|
|
|
|
use k256::AffinePoint;
|
2024-12-03 09:32:35 +02:00
|
|
|
use storage::{
|
2024-12-05 13:05:58 +02:00
|
|
|
block::Block,
|
2024-12-20 11:02:12 +02:00
|
|
|
merkle_tree_public::{
|
|
|
|
|
merkle_tree::{PublicTransactionMerkleTree, UTXOCommitmentsMerkleTree},
|
|
|
|
|
TreeHashType,
|
|
|
|
|
},
|
2024-12-05 13:05:58 +02:00
|
|
|
nullifier::UTXONullifier,
|
2024-12-03 09:32:35 +02:00
|
|
|
nullifier_sparse_merkle_tree::NullifierSparseMerkleTree,
|
2024-12-20 11:02:12 +02:00
|
|
|
transaction::Transaction,
|
2024-12-05 13:05:58 +02:00
|
|
|
utxo_commitment::UTXOCommitment,
|
2024-12-03 09:32:35 +02:00
|
|
|
};
|
2024-12-25 09:50:54 +02:00
|
|
|
use utxo::utxo_core::UTXO;
|
2024-12-03 09:32:35 +02:00
|
|
|
|
|
|
|
|
pub mod accounts_store;
|
|
|
|
|
pub mod block_store;
|
|
|
|
|
|
|
|
|
|
pub struct NodeChainStore {
|
2024-12-25 09:50:54 +02:00
|
|
|
pub acc_map: HashMap<AccountAddress, Account>,
|
2024-12-03 09:32:35 +02:00
|
|
|
pub block_store: NodeBlockStore,
|
|
|
|
|
pub nullifier_store: NullifierSparseMerkleTree,
|
|
|
|
|
pub utxo_commitments_store: UTXOCommitmentsMerkleTree,
|
|
|
|
|
pub pub_tx_store: PublicTransactionMerkleTree,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl NodeChainStore {
|
2024-12-05 13:05:58 +02:00
|
|
|
pub fn new_with_genesis(home_dir: &Path, genesis_block: Block) -> Self {
|
2024-12-25 09:50:54 +02:00
|
|
|
let acc_map = HashMap::new();
|
2024-12-03 09:32:35 +02:00
|
|
|
let nullifier_store = NullifierSparseMerkleTree::default();
|
|
|
|
|
let utxo_commitments_store = UTXOCommitmentsMerkleTree::new(vec![]);
|
|
|
|
|
let pub_tx_store = PublicTransactionMerkleTree::new(vec![]);
|
|
|
|
|
|
|
|
|
|
//Sequencer should panic if unable to open db,
|
|
|
|
|
//as fixing this issue may require actions non-native to program scope
|
|
|
|
|
let block_store =
|
|
|
|
|
NodeBlockStore::open_db_with_genesis(&home_dir.join("rocksdb"), Some(genesis_block))
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
|
|
Self {
|
2024-12-25 09:50:54 +02:00
|
|
|
acc_map,
|
2024-12-03 09:32:35 +02:00
|
|
|
block_store,
|
|
|
|
|
nullifier_store,
|
|
|
|
|
utxo_commitments_store,
|
|
|
|
|
pub_tx_store,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-05 13:05:58 +02:00
|
|
|
pub fn dissect_insert_block(&mut self, block: Block) -> Result<()> {
|
|
|
|
|
for tx in &block.transactions {
|
2024-12-30 07:43:27 +02:00
|
|
|
// let public_action = serde_json::from_slice(tx.execution_output);
|
|
|
|
|
|
2024-12-05 13:05:58 +02:00
|
|
|
self.utxo_commitments_store.add_tx_multiple(
|
|
|
|
|
tx.utxo_commitments_created_hashes
|
|
|
|
|
.clone()
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|hash| UTXOCommitment { hash })
|
|
|
|
|
.collect(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
self.nullifier_store.insert_items(
|
|
|
|
|
tx.nullifier_created_hashes
|
|
|
|
|
.clone()
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|hash| UTXONullifier { utxo_hash: hash })
|
|
|
|
|
.collect(),
|
|
|
|
|
)?;
|
|
|
|
|
|
2024-12-26 11:38:00 +02:00
|
|
|
let slice_try: Result<[u8; 33], _> = tx.ephemeral_pub_key.clone().try_into();
|
|
|
|
|
let eph_key_compressed =
|
|
|
|
|
slice_try.and_then(|inner| Ok(<AffinePoint as GroupEncoding>::Repr::from(inner)));
|
2024-12-25 09:50:54 +02:00
|
|
|
|
|
|
|
|
if let Ok(eph_key_compressed) = eph_key_compressed {
|
|
|
|
|
let ephemeral_public_key_sender = AffinePoint::from_bytes(&eph_key_compressed);
|
|
|
|
|
|
|
|
|
|
if ephemeral_public_key_sender.is_some().into() {
|
|
|
|
|
let ephemeral_public_key_sender = ephemeral_public_key_sender.unwrap();
|
|
|
|
|
|
|
|
|
|
for (ciphertext, nonce) in tx.encoded_data.clone() {
|
2024-12-26 11:38:00 +02:00
|
|
|
let slice = nonce.as_slice();
|
|
|
|
|
let nonce =
|
|
|
|
|
accounts::key_management::constants_types::Nonce::clone_from_slice(
|
|
|
|
|
slice,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
for (acc_id, acc) in self.acc_map.iter_mut() {
|
|
|
|
|
let decoded_data_curr_acc = acc.decrypt_data(
|
|
|
|
|
ephemeral_public_key_sender,
|
|
|
|
|
ciphertext.clone(),
|
|
|
|
|
nonce,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let decoded_utxo_try =
|
|
|
|
|
serde_json::from_slice::<UTXO>(&decoded_data_curr_acc);
|
|
|
|
|
|
|
|
|
|
if let Ok(utxo) = decoded_utxo_try {
|
|
|
|
|
if &utxo.owner == acc_id {
|
|
|
|
|
acc.utxo_tree.insert_item(utxo)?;
|
2024-12-25 09:50:54 +02:00
|
|
|
}
|
|
|
|
|
}
|
2024-12-26 11:38:00 +02:00
|
|
|
}
|
2024-12-25 09:50:54 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-05 13:05:58 +02:00
|
|
|
self.pub_tx_store.add_tx(tx.clone());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.block_store.put_block_at_id(block)?;
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
2024-12-03 09:32:35 +02:00
|
|
|
}
|