diff --git a/Cargo.lock b/Cargo.lock index 847c77cb4..b2f6669c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -892,7 +892,7 @@ dependencies = [ "async-trait", "bdk", "bitcoin", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "futures", @@ -1017,16 +1017,16 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.8" +version = "3.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c" +checksum = "6aad2534fad53df1cc12519c5cda696dd3e20e6118a027e24054aea14a0bdcbe" dependencies = [ "atty", "bitflags", "clap_derive", + "clap_lex", "indexmap", "lazy_static", - "os_str_bytes", "strsim 0.10.0", "termcolor", "textwrap 0.15.0", @@ -1045,6 +1045,15 @@ dependencies = [ "syn 1.0.91", ] +[[package]] +name = "clap_lex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -1576,7 +1585,7 @@ dependencies = [ "async-executor", "async-std", "async-trait", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "futures", @@ -1624,7 +1633,7 @@ dependencies = [ "bs58", "bytes", "chrono", - "clap 3.1.8", + "clap 3.1.9", "crypto_api_chachapoly", "darkfi-derive", "darkfi-derive-internal", @@ -1642,6 +1651,7 @@ dependencies = [ "incrementalmerkletree", "indexmap", "itertools", + "lazy-init", "lazy_static", "libc", "libsqlite3-sys", @@ -1703,7 +1713,7 @@ dependencies = [ "async-executor", "async-std", "async-trait", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "fxhash", @@ -2005,7 +2015,7 @@ version = "0.3.0" dependencies = [ "async-channel", "async-std", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "fxhash", @@ -2032,7 +2042,7 @@ name = "drk" version = "0.3.0" dependencies = [ "async-std", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "log", "prettytable-rs", @@ -2323,13 +2333,16 @@ dependencies = [ "async-executor", "async-std", "async-trait", + "blake3", "chrono", "ctrlc-async", "darkfi", "easy-parallel", "futures-lite", + "hex", "lazy-init", "log", + "num-bigint", "rand 0.8.5", "serde", "serde_derive", @@ -2360,9 +2373,9 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if 1.0.0", "libc", @@ -2647,7 +2660,7 @@ dependencies = [ "async-channel", "async-executor", "async-std", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "log", @@ -3055,9 +3068,9 @@ dependencies = [ [[package]] name = "incrementalmerkletree" -version = "0.2.0" +version = "0.3.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186fd3ab92aeac865d4b80b410de9a7b341d31ba8281373caed0b6d17b2b5e96" +checksum = "5812f2cfa06a7694b842402e9a100529d80fdc3022ead65ad98ce0af0bcd3311" dependencies = [ "serde", ] @@ -3134,7 +3147,7 @@ dependencies = [ "async-executor", "async-std", "async-trait", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "futures", @@ -3798,9 +3811,6 @@ name = "os_str_bytes" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr", -] [[package]] name = "ouroboros" @@ -6091,9 +6101,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2be6e4d8b60285763c7a0c17f57839d5f1e864d948fe7ff26eaf38f04db95fc" +checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" dependencies = [ "sqlx-core", "sqlx-macros", @@ -6101,9 +6111,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5728d5a4de38574e1a43139cf1d0124e978af8c19ea795d1d61c287785924cf2" +checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" dependencies = [ "ahash 0.7.6", "atoi", @@ -6142,9 +6152,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce1fd7df05de96f76eb0d452e5ce8b106607933ac3c9a8f5c65c1ecc5955f5" +checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" dependencies = [ "dotenv", "either", @@ -6161,9 +6171,9 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2cc78368bdd33ba6ad1c300f2b9ff4a844f9d7db140c34bc61ef304e1fc160" +checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" dependencies = [ "async-native-tls 0.3.3", "async-std", @@ -6350,7 +6360,7 @@ dependencies = [ "async-std", "async-trait", "chrono", - "clap 3.1.8", + "clap 3.1.9", "darkfi", "easy-parallel", "futures", @@ -6373,7 +6383,7 @@ dependencies = [ "async-std", "async-trait", "chrono", - "clap 3.1.8", + "clap 3.1.9", "ctrlc-async", "darkfi", "easy-parallel", @@ -6877,7 +6887,7 @@ name = "vanityaddr" version = "0.3.0" dependencies = [ "bs58", - "clap 3.1.8", + "clap 3.1.9", "ctrlc", "darkfi", "indicatif 0.17.0-rc.10", @@ -7541,7 +7551,7 @@ dependencies = [ name = "zkas" version = "0.3.0" dependencies = [ - "clap 3.1.8", + "clap 3.1.9", "darkfi", ] diff --git a/Cargo.toml b/Cargo.toml index edad1775c..2cc9c25b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,6 +75,7 @@ url = {version = "2.2.2", features = ["serde"], optional = true} dirs = {version = "4.0.0", optional = true} subtle = {version = "2.4.1", optional = true} lazy_static = {version = "1.4.0", optional = true} +lazy-init = {version = "0.5.0", optional = true} fxhash = {version = "0.2.1", optional = true} indexmap = {version = "1.8.1", optional = true} itertools = {version = "0.10.3", optional = true} @@ -104,7 +105,7 @@ arrayvec = {version = "0.7.2", optional = true} blake2b_simd = {version = "1.0.0", optional = true} pasta_curves = {version = "0.3.0", optional = true} crypto_api_chachapoly = {version = "0.5.0", optional = true} -incrementalmerkletree = {version = "0.2.0", optional = true} +incrementalmerkletree = {version = "0.3.0-beta.2", optional = true} halo2_proofs = {version = "0.1.0-beta.4", features = ["dev-graph", "gadget-traces", "sanity-checks"], optional = true} halo2_gadgets = {version = "0.1.0-beta.3", features = ["dev-graph", "test-dependencies"], optional = true} @@ -193,25 +194,13 @@ rpc = [ ] blockchain = [ - "rocksdb", - "sled", - "chrono", - "rand", - - "async-runtime", - "util", - "crypto", - "net", - "blockchain2", -] - -blockchain2 = [ "blake3", "chrono", "indexmap", "sled", "crypto", + "tx", "net", "util", ] @@ -293,6 +282,7 @@ node = [ "zeromq", "signal-hook", "signal-hook-async-std", + "lazy-init", "async-runtime", "blockchain", @@ -319,6 +309,11 @@ raft = [ "rpc", ] +tx = [ + "crypto", + "util", +] + [[example]] name = "net" path = "example/net.rs" diff --git a/bin/faucetd/Cargo.toml b/bin/faucetd/Cargo.toml index 11d3fef44..2e2ee4849 100644 --- a/bin/faucetd/Cargo.toml +++ b/bin/faucetd/Cargo.toml @@ -16,7 +16,7 @@ async-trait = "0.1.53" blake3 = "1.3.1" chrono = "0.4.19" ctrlc-async = {version = "3.2.2", default-features = false, features = ["async-std", "termination"]} -darkfi = {path = "../../", features = ["blockchain2", "wallet", "rpc", "net", "node"]} +darkfi = {path = "../../", features = ["blockchain", "wallet", "rpc", "net", "node"]} easy-parallel = "3.2.0" futures-lite = "1.12.0" hex = "0.4.3" diff --git a/bin/faucetd/src/main.rs b/bin/faucetd/src/main.rs index 9aa8c2bff..3ae7b3b3a 100644 --- a/bin/faucetd/src/main.rs +++ b/bin/faucetd/src/main.rs @@ -19,7 +19,7 @@ use url::Url; use darkfi::{ async_daemonize, - blockchain2::{NullifierStore, RootStore}, + blockchain::{NullifierStore, RootStore}, cli_desc, consensus2::{ Timestamp, ValidatorState, MAINNET_GENESIS_HASH_BYTES, TESTNET_GENESIS_HASH_BYTES, diff --git a/src/blockchain2/blockstore.rs b/src/blockchain/blockstore.rs similarity index 100% rename from src/blockchain2/blockstore.rs rename to src/blockchain/blockstore.rs diff --git a/src/blockchain2/metadatastore.rs b/src/blockchain/metadatastore.rs similarity index 100% rename from src/blockchain2/metadatastore.rs rename to src/blockchain/metadatastore.rs diff --git a/src/blockchain/mod.rs b/src/blockchain/mod.rs index afb35e3e2..d4151fc0d 100644 --- a/src/blockchain/mod.rs +++ b/src/blockchain/mod.rs @@ -1,7 +1,98 @@ -pub mod rocks; -pub mod slab; -pub mod slabstore; +use std::io; -pub use rocks::{Rocks, RocksColumn}; -pub use slab::Slab; -pub use slabstore::SlabStore; +use crate::{ + consensus2::{block::BlockProposal, util::Timestamp, Block}, + impl_vec, + util::serial::{Decodable, Encodable, ReadExt, VarInt, WriteExt}, + Result, +}; + +pub mod blockstore; +pub use blockstore::{BlockOrderStore, BlockStore}; + +pub mod metadatastore; +pub use metadatastore::StreamletMetadataStore; + +pub mod nfstore; +pub use nfstore::NullifierStore; + +pub mod rootstore; +pub use rootstore::RootStore; + +pub mod txstore; +pub use txstore::TxStore; + +pub struct Blockchain { + /// Blocks sled tree + pub blocks: BlockStore, + /// Block order sled tree + pub order: BlockOrderStore, + /// Transactions sled tree + pub transactions: TxStore, + /// Streamlet metadata sled tree + pub streamlet_metadata: StreamletMetadataStore, + /// Nullifiers sled tree + pub nullifiers: NullifierStore, + /// Merkle roots sled tree + pub merkle_roots: RootStore, +} + +impl Blockchain { + pub fn new(db: &sled::Db, genesis_ts: Timestamp, genesis_data: blake3::Hash) -> Result { + let blocks = BlockStore::new(db, genesis_ts, genesis_data)?; + let order = BlockOrderStore::new(db, genesis_ts, genesis_data)?; + let transactions = TxStore::new(db)?; + let streamlet_metadata = StreamletMetadataStore::new(db)?; + let nullifiers = NullifierStore::new(db)?; + let merkle_roots = RootStore::new(db)?; + + Ok(Self { blocks, order, transactions, streamlet_metadata, nullifiers, merkle_roots }) + } + + /// Batch insert [`BlockProposal`]s. + pub fn add(&mut self, proposals: &[BlockProposal]) -> Result> { + // TODO: Engineer this function in a better way. + let mut ret = Vec::with_capacity(proposals.len()); + + for prop in proposals { + // Store transactions + let tx_hashes = self.transactions.insert(&prop.txs)?; + + // Store block + let block = + Block { st: prop.st, sl: prop.sl, txs: tx_hashes, metadata: prop.metadata.clone() }; + let blockhash = self.blocks.insert(&[block.clone()])?; + ret.push(blockhash[0]); + + // Store block order + self.order.insert(&[block.sl], &[blockhash[0]])?; + + // Store streamlet metadata + self.streamlet_metadata.insert(&[blockhash[0]], &[prop.sm.clone()])?; + } + + Ok(ret) + } + + /// Retrieve the last block slot and hash + pub fn last(&self) -> Result> { + self.order.get_last() + } +} + +impl Encodable for blake3::Hash { + fn encode(&self, mut s: S) -> Result { + s.write_slice(self.as_bytes())?; + Ok(32) + } +} + +impl Decodable for blake3::Hash { + fn decode(mut d: D) -> Result { + let mut bytes = [0u8; 32]; + d.read_slice(&mut bytes)?; + Ok(bytes.into()) + } +} + +impl_vec!(blake3::Hash); diff --git a/src/blockchain2/nfstore.rs b/src/blockchain/nfstore.rs similarity index 100% rename from src/blockchain2/nfstore.rs rename to src/blockchain/nfstore.rs diff --git a/src/blockchain/rocks.rs b/src/blockchain/rocks.rs deleted file mode 100644 index 2dedc98a8..000000000 --- a/src/blockchain/rocks.rs +++ /dev/null @@ -1,158 +0,0 @@ -use std::{marker::PhantomData, path::Path}; - -use async_std::sync::Arc; -use rocksdb::{ColumnFamily, ColumnFamilyDescriptor, Options, DB}; - -use crate::{ - util::serial::{deserialize, serialize, Decodable, Encodable}, - Error, Result, -}; - -pub enum IteratorMode { - Start, - End, -} - -pub trait Column { - const NAME: &'static str; -} - -pub mod columns { - pub struct Slabs; - pub struct Nullifiers; - pub struct MerkleRoots; -} - -impl Column for columns::Slabs { - const NAME: &'static str = "slabs"; -} - -impl Column for columns::Nullifiers { - const NAME: &'static str = "nullifiers"; -} - -impl Column for columns::MerkleRoots { - const NAME: &'static str = "merkleroots"; -} - -pub struct Rocks { - db: DB, -} - -impl Rocks { - pub fn new(path: &Path) -> Result> { - // column family options - let cf_opts = Options::default(); - - // default column family - let default_cf = - ColumnFamilyDescriptor::new(rocksdb::DEFAULT_COLUMN_FAMILY_NAME, cf_opts.clone()); - // slabs column family - let slab_cf = ColumnFamilyDescriptor::new(columns::Slabs::NAME, cf_opts.clone()); - // nullifiers column family - let nullifiers_cf = ColumnFamilyDescriptor::new(columns::Nullifiers::NAME, cf_opts.clone()); - // merkleroots column family - let merkleroots_cf = ColumnFamilyDescriptor::new(columns::MerkleRoots::NAME, cf_opts); - - // column families - let cfs = vec![default_cf, slab_cf, nullifiers_cf, merkleroots_cf]; - - // database options - let mut opt = Options::default(); - opt.create_if_missing(true); - opt.create_missing_column_families(true); - - // open database with following options and cf - let db = DB::open_cf_descriptors(&opt, path, cfs)?; - - Ok(Arc::new(Self { db })) - } - - pub fn cf_handle(&self) -> Result<&ColumnFamily> - where - C: Column, - { - self.db.cf_handle(C::NAME).ok_or_else(|| Error::RocksdbError("unknown column".to_string())) - } - - pub fn put_cf(&self, cf: &ColumnFamily, key: Vec, value: Vec) -> Result<()> { - self.db.put_cf(cf, key, value)?; - Ok(()) - } - - pub fn get_cf(&self, cf: &ColumnFamily, key: Vec) -> Result>> { - let val = self.db.get_cf(cf, key)?; - Ok(val) - } - - pub fn key_exist_cf(&self, cf: &ColumnFamily, key: Vec) -> Result { - let val = self.db.get_cf(cf, key)?; - Ok(val.is_some()) - } - - pub fn iterator(&self, cf: &ColumnFamily, iterator_mode: IteratorMode) -> rocksdb::DBIterator { - let iterator_mode = match iterator_mode { - IteratorMode::Start => rocksdb::IteratorMode::Start, - IteratorMode::End => rocksdb::IteratorMode::End, - }; - self.db.iterator_cf(cf, iterator_mode) - } - - pub fn destroy(path: &Path) -> Result<()> { - DB::destroy(&Options::default(), path)?; - Ok(()) - } -} - -pub struct RocksColumn { - rocks: Arc, - column: PhantomData, -} - -impl RocksColumn { - pub fn new(rocks: Arc) -> RocksColumn { - RocksColumn { rocks, column: PhantomData } - } - fn cf_handle(&self) -> Result<&ColumnFamily> { - self.rocks.cf_handle::() - } - - pub fn put(&self, key: impl Encodable, value: impl Encodable) -> Result<()> { - let key = serialize(&key); - let value = serialize(&value); - let cf = self.cf_handle()?; - self.rocks.put_cf(cf, key, value)?; - Ok(()) - } - - pub fn get(&self, key: impl Encodable) -> Result>> { - let key = serialize(&key); - let cf = self.cf_handle()?; - let val = self.rocks.get_cf(cf, key)?; - Ok(val) - } - - pub fn get_value_deserialized(&self, key: Vec) -> Result> { - let value = self.get(key)?; - match value { - Some(v) => { - let v: D = deserialize(&v)?; - Ok(Some(v)) - } - None => Ok(None), - } - } - - pub fn key_exist(&self, key: impl Encodable) -> Result { - let key = serialize(&key); - let cf = self.cf_handle()?; - let val = self.rocks.key_exist_cf(cf, key)?; - Ok(val) - } - - pub fn iterator(&self, iterator_mode: IteratorMode) -> Result { - let cf = self.cf_handle()?; - let iter = self.rocks.iterator(cf, iterator_mode); - Ok(iter) - } -} diff --git a/src/blockchain2/rootstore.rs b/src/blockchain/rootstore.rs similarity index 100% rename from src/blockchain2/rootstore.rs rename to src/blockchain/rootstore.rs diff --git a/src/blockchain/slab.rs b/src/blockchain/slab.rs deleted file mode 100644 index 3ffcfa160..000000000 --- a/src/blockchain/slab.rs +++ /dev/null @@ -1,44 +0,0 @@ -use crate::{ - util::serial::{Decodable, Encodable}, - Result, -}; - -#[derive(Clone, Debug)] -pub struct Slab { - index: u64, - payload: Vec, -} - -impl Slab { - pub fn new(payload: Vec) -> Self { - let index = 0; - Slab { index, payload } - } - - pub fn set_index(&mut self, index: u64) { - self.index = index; - } - - pub fn get_index(&self) -> u64 { - self.index - } - - pub fn get_payload(&self) -> Vec { - self.payload.clone() - } -} - -impl Encodable for Slab { - fn encode(&self, mut s: S) -> Result { - let mut len = 0; - len += self.index.encode(&mut s)?; - len += self.payload.encode(&mut s)?; - Ok(len) - } -} - -impl Decodable for Slab { - fn decode(mut d: D) -> Result { - Ok(Self { index: Decodable::decode(&mut d)?, payload: Decodable::decode(&mut d)? }) - } -} diff --git a/src/blockchain/slabstore.rs b/src/blockchain/slabstore.rs deleted file mode 100644 index cc5b65188..000000000 --- a/src/blockchain/slabstore.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::sync::Arc; - -use log::debug; - -use super::{ - rocks::{columns, IteratorMode, RocksColumn}, - slab::Slab, -}; -use crate::{ - util::serial::{deserialize, serialize}, - Result, -}; - -pub struct SlabStore { - rocks: RocksColumn, -} - -impl SlabStore { - pub fn new(rocks: RocksColumn) -> Result> { - Ok(Arc::new(SlabStore { rocks })) - } - - pub fn get(&self, key: Vec) -> Result>> { - debug!(target: "SLABSTORE", "get value"); - let key: u64 = deserialize(&key)?; - let value = self.rocks.get(key)?; - Ok(value) - } - - pub fn put(&self, slab: Slab) -> Result> { - debug!(target: "SLABSTORE", "Put slab"); - let last_index = self.get_last_index()?; - let key = last_index + 1; - - if slab.get_index() == key { - self.rocks.put(key, slab)?; - Ok(Some(key)) - } else { - Ok(None) - } - } - - pub fn get_value_deserialized(&self, key: Vec) -> Result> { - self.rocks.get_value_deserialized::(key) - } - - pub fn get_last_index(&self) -> Result { - debug!(target: "SLABSTORE", "Get last index"); - let last_index = self.rocks.iterator(IteratorMode::End)?.next(); - match last_index { - Some((index, _)) => Ok(deserialize(&index)?), - None => Ok(0), - } - } - - pub fn get_last_index_as_bytes(&self) -> Result> { - debug!(target: "SLABSTORE", "Get last index as bytes"); - let last_index = self.rocks.iterator(IteratorMode::End)?.next(); - match last_index { - Some((index, _)) => Ok(index.to_vec()), - None => Ok(serialize::(&0)), - } - } -} diff --git a/src/blockchain2/txstore.rs b/src/blockchain/txstore.rs similarity index 100% rename from src/blockchain2/txstore.rs rename to src/blockchain/txstore.rs diff --git a/src/blockchain2/mod.rs b/src/blockchain2/mod.rs deleted file mode 100644 index d4151fc0d..000000000 --- a/src/blockchain2/mod.rs +++ /dev/null @@ -1,98 +0,0 @@ -use std::io; - -use crate::{ - consensus2::{block::BlockProposal, util::Timestamp, Block}, - impl_vec, - util::serial::{Decodable, Encodable, ReadExt, VarInt, WriteExt}, - Result, -}; - -pub mod blockstore; -pub use blockstore::{BlockOrderStore, BlockStore}; - -pub mod metadatastore; -pub use metadatastore::StreamletMetadataStore; - -pub mod nfstore; -pub use nfstore::NullifierStore; - -pub mod rootstore; -pub use rootstore::RootStore; - -pub mod txstore; -pub use txstore::TxStore; - -pub struct Blockchain { - /// Blocks sled tree - pub blocks: BlockStore, - /// Block order sled tree - pub order: BlockOrderStore, - /// Transactions sled tree - pub transactions: TxStore, - /// Streamlet metadata sled tree - pub streamlet_metadata: StreamletMetadataStore, - /// Nullifiers sled tree - pub nullifiers: NullifierStore, - /// Merkle roots sled tree - pub merkle_roots: RootStore, -} - -impl Blockchain { - pub fn new(db: &sled::Db, genesis_ts: Timestamp, genesis_data: blake3::Hash) -> Result { - let blocks = BlockStore::new(db, genesis_ts, genesis_data)?; - let order = BlockOrderStore::new(db, genesis_ts, genesis_data)?; - let transactions = TxStore::new(db)?; - let streamlet_metadata = StreamletMetadataStore::new(db)?; - let nullifiers = NullifierStore::new(db)?; - let merkle_roots = RootStore::new(db)?; - - Ok(Self { blocks, order, transactions, streamlet_metadata, nullifiers, merkle_roots }) - } - - /// Batch insert [`BlockProposal`]s. - pub fn add(&mut self, proposals: &[BlockProposal]) -> Result> { - // TODO: Engineer this function in a better way. - let mut ret = Vec::with_capacity(proposals.len()); - - for prop in proposals { - // Store transactions - let tx_hashes = self.transactions.insert(&prop.txs)?; - - // Store block - let block = - Block { st: prop.st, sl: prop.sl, txs: tx_hashes, metadata: prop.metadata.clone() }; - let blockhash = self.blocks.insert(&[block.clone()])?; - ret.push(blockhash[0]); - - // Store block order - self.order.insert(&[block.sl], &[blockhash[0]])?; - - // Store streamlet metadata - self.streamlet_metadata.insert(&[blockhash[0]], &[prop.sm.clone()])?; - } - - Ok(ret) - } - - /// Retrieve the last block slot and hash - pub fn last(&self) -> Result> { - self.order.get_last() - } -} - -impl Encodable for blake3::Hash { - fn encode(&self, mut s: S) -> Result { - s.write_slice(self.as_bytes())?; - Ok(32) - } -} - -impl Decodable for blake3::Hash { - fn decode(mut d: D) -> Result { - let mut bytes = [0u8; 32]; - d.read_slice(&mut bytes)?; - Ok(bytes.into()) - } -} - -impl_vec!(blake3::Hash); diff --git a/src/consensus2/state.rs b/src/consensus2/state.rs index d71868c32..935d85249 100644 --- a/src/consensus2/state.rs +++ b/src/consensus2/state.rs @@ -14,7 +14,7 @@ use super::{ Vote, }; use crate::{ - blockchain2::Blockchain, + blockchain::Blockchain, crypto::{ keypair::{PublicKey, SecretKey}, schnorr::{SchnorrPublic, SchnorrSecret}, @@ -84,7 +84,7 @@ impl ValidatorState { // TODO: Clock sync // TODO: ID shouldn't be done like this pub fn new( - db: &sled::Db, // <-- TODO: Avoid this with some wrapping, sled should only be in blockchain2 + db: &sled::Db, // <-- TODO: Avoid this with some wrapping, sled should only be in blockchain id: u64, genesis_ts: Timestamp, genesis_data: blake3::Hash, diff --git a/src/lib.rs b/src/lib.rs index 7f7458894..ee84aede0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,12 +5,9 @@ pub use error::{ClientFailed, ClientResult, Error, Result, VerifyFailed, VerifyR pub mod blockchain; #[cfg(feature = "blockchain2")] -pub mod blockchain2; - -#[cfg(feature = "blockchain")] pub mod consensus; -#[cfg(feature = "blockchain2")] +#[cfg(feature = "blockchain")] pub mod consensus2; #[cfg(feature = "crypto")] diff --git a/src/node/state.rs b/src/node/state.rs index 4c8a1c33d..2c4bedb48 100644 --- a/src/node/state.rs +++ b/src/node/state.rs @@ -3,7 +3,7 @@ use lazy_init::Lazy; use log::{debug, error}; use crate::{ - blockchain2::{nfstore::NullifierStore, rootstore::RootStore}, + blockchain::{nfstore::NullifierStore, rootstore::RootStore}, crypto::{ coin::Coin, keypair::{PublicKey, SecretKey},