From 4c00b07ccebf0ebdbe6692d17ec3e595b1ed1d98 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 5 May 2023 17:15:47 -0700 Subject: [PATCH] Remove snarkos-node-ledger --- .circleci/config.yml | 10 - .integration/Cargo.toml | 3 - .integration/src/lib.rs | 3 +- Cargo.lock | 147 ++++--- Cargo.toml | 6 +- cli/src/commands/developer/execute.rs | 2 +- node/Cargo.toml | 5 +- node/cdn/Cargo.toml | 3 - node/cdn/src/blocks.rs | 12 +- node/consensus/Cargo.toml | 3 - node/consensus/src/lib.rs | 28 +- node/consensus/src/tests.rs | 13 +- node/ledger/Cargo.toml | 52 --- node/ledger/LICENSE.md | 596 -------------------------- node/ledger/README.md | 7 - node/ledger/src/contains.rs | 107 ----- node/ledger/src/find.rs | 149 ------- node/ledger/src/get.rs | 214 --------- node/ledger/src/iterators.rs | 100 ----- node/ledger/src/lib.rs | 331 -------------- node/ledger/src/tests.rs | 110 ----- node/rest/Cargo.toml | 3 - node/rest/src/lib.rs | 3 +- node/src/beacon/mod.rs | 3 +- node/src/helpers.rs | 3 +- node/src/validator/mod.rs | 3 +- 26 files changed, 112 insertions(+), 1804 deletions(-) delete mode 100644 node/ledger/Cargo.toml delete mode 100644 node/ledger/LICENSE.md delete mode 100644 node/ledger/README.md delete mode 100644 node/ledger/src/contains.rs delete mode 100644 node/ledger/src/find.rs delete mode 100644 node/ledger/src/get.rs delete mode 100644 node/ledger/src/iterators.rs delete mode 100644 node/ledger/src/lib.rs delete mode 100644 node/ledger/src/tests.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index e5a2a18f98..9b3bf0735d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -226,15 +226,6 @@ jobs: workspace_member: node/consensus cache_key: snarkos-node-consensus-cache - node-ledger: - docker: - - image: cimg/rust:1.65 - resource_class: 2xlarge - steps: - - run_serial: - workspace_member: node/ledger - cache_key: snarkos-node-ledger-cache - node-messages: docker: - image: cimg/rust:1.65 @@ -329,7 +320,6 @@ workflows: - node - node-cdn - node-consensus - - node-ledger - node-messages - node-rest - node-router diff --git a/.integration/Cargo.toml b/.integration/Cargo.toml index b185c6a181..1e477ceb54 100644 --- a/.integration/Cargo.toml +++ b/.integration/Cargo.toml @@ -19,9 +19,6 @@ edition = "2021" [dev-dependencies.snarkos-node-cdn] path = "../node/cdn" -[dev-dependencies.snarkos-node-ledger] -path = "../node/ledger" - [dev-dependencies.snarkvm] workspace = true features = ["synthesizer"] diff --git a/.integration/src/lib.rs b/.integration/src/lib.rs index 447acffb20..3eac9012da 100644 --- a/.integration/src/lib.rs +++ b/.integration/src/lib.rs @@ -19,9 +19,8 @@ #[cfg(test)] mod tests { use snarkos_node_cdn::sync_ledger_with_cdn; - use snarkos_node_ledger::Ledger; use snarkvm::{ - prelude::{Block, FromBytes, Network, Testnet3}, + prelude::{Block, FromBytes, Ledger, Network, Testnet3}, synthesizer::store::helpers::memory::ConsensusMemory, }; diff --git a/Cargo.lock b/Cargo.lock index 2603c9b1cd..721ece46ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2682,7 +2682,6 @@ dependencies = [ "snarkos-node", "snarkos-node-cdn", "snarkos-node-consensus", - "snarkos-node-ledger", "snarkos-node-messages", "snarkos-node-rest", "snarkos-node-router", @@ -2748,7 +2747,6 @@ name = "snarkos-integration" version = "2.0.2" dependencies = [ "snarkos-node-cdn", - "snarkos-node-ledger", "snarkvm", "tokio", "tracing", @@ -2776,7 +2774,6 @@ dependencies = [ "snarkos-account", "snarkos-node-cdn", "snarkos-node-consensus", - "snarkos-node-ledger", "snarkos-node-messages", "snarkos-node-rest", "snarkos-node-router", @@ -2803,7 +2800,6 @@ dependencies = [ "reqwest", "serde", "serde_json", - "snarkos-node-ledger", "snarkvm", "tokio", "tokio-test", @@ -2821,28 +2817,12 @@ dependencies = [ "parking_lot", "rand", "rayon", - "snarkos-node-ledger", "snarkvm", "time", "tracing", "tracing-test 0.2.4", ] -[[package]] -name = "snarkos-node-ledger" -version = "2.0.2" -dependencies = [ - "aleo-std", - "anyhow", - "indexmap", - "once_cell", - "parking_lot", - "rand", - "rayon", - "snarkvm", - "tracing", -] - [[package]] name = "snarkos-node-messages" version = "2.0.2" @@ -2885,7 +2865,6 @@ dependencies = [ "rayon", "serde", "snarkos-node-consensus", - "snarkos-node-ledger", "snarkos-node-messages", "snarkos-node-router", "snarkvm", @@ -2947,7 +2926,7 @@ dependencies = [ [[package]] name = "snarkvm" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "anyhow", "clap", @@ -2962,9 +2941,10 @@ dependencies = [ "serde_json", "snarkvm-circuit", "snarkvm-console", + "snarkvm-ledger", "snarkvm-parameters", "snarkvm-synthesizer", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", "ureq", "walkdir", @@ -2973,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "aleo-std", "anyhow", @@ -2993,14 +2973,14 @@ dependencies = [ "snarkvm-fields", "snarkvm-parameters", "snarkvm-r1cs", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", ] [[package]] name = "snarkvm-circuit" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -3014,7 +2994,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-network", @@ -3025,7 +3005,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-types", "snarkvm-console-algorithms", @@ -3035,7 +3015,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-types", @@ -3045,7 +3025,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "indexmap", "itertools", @@ -3057,18 +3037,18 @@ dependencies = [ "snarkvm-curves", "snarkvm-fields", "snarkvm-r1cs", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", ] [[package]] name = "snarkvm-circuit-environment-witness" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" [[package]] name = "snarkvm-circuit-network" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -3079,20 +3059,20 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-collections", "snarkvm-circuit-network", "snarkvm-circuit-types", "snarkvm-console-program", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", ] [[package]] name = "snarkvm-circuit-types" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -3107,7 +3087,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -3120,7 +3100,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-console-types-boolean", @@ -3129,7 +3109,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -3139,7 +3119,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -3151,7 +3131,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -3162,7 +3142,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -3173,7 +3153,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -3185,7 +3165,7 @@ dependencies = [ [[package]] name = "snarkvm-console" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -3198,7 +3178,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "bs58", "snarkvm-console-network", @@ -3208,19 +3188,19 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "blake2s_simd", "smallvec", "snarkvm-console-types", "snarkvm-fields", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", ] [[package]] name = "snarkvm-console-collections" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "aleo-std", "rayon", @@ -3231,7 +3211,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "anyhow", "indexmap", @@ -3248,13 +3228,13 @@ dependencies = [ "snarkvm-curves", "snarkvm-fields", "snarkvm-parameters", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", ] [[package]] name = "snarkvm-console-network-environment" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "anyhow", "bech32", @@ -3265,13 +3245,13 @@ dependencies = [ "serde", "snarkvm-curves", "snarkvm-fields", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", ] [[package]] name = "snarkvm-console-program" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "enum_index", "enum_index_derive", @@ -3284,13 +3264,13 @@ dependencies = [ "snarkvm-console-collections", "snarkvm-console-network", "snarkvm-console-types", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", ] [[package]] name = "snarkvm-console-types" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -3305,7 +3285,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -3316,7 +3296,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", ] @@ -3324,7 +3304,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -3333,7 +3313,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -3344,7 +3324,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -3354,7 +3334,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -3364,7 +3344,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -3375,21 +3355,21 @@ dependencies = [ [[package]] name = "snarkvm-curves" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "rand", "rayon", "rustc_version", "serde", "snarkvm-fields", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", ] [[package]] name = "snarkvm-fields" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "aleo-std", "anyhow", @@ -3399,14 +3379,31 @@ dependencies = [ "rand", "rayon", "serde", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", ] +[[package]] +name = "snarkvm-ledger" +version = "0.10.3" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" +dependencies = [ + "aleo-std", + "anyhow", + "indexmap", + "once_cell", + "parking_lot", + "rand", + "rayon", + "snarkvm-console", + "snarkvm-synthesizer", + "tracing", +] + [[package]] name = "snarkvm-parameters" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "aleo-std", "anyhow", @@ -3424,14 +3421,14 @@ dependencies = [ "serde_json", "sha2", "snarkvm-curves", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", ] [[package]] name = "snarkvm-r1cs" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "anyhow", "cfg-if", @@ -3440,14 +3437,14 @@ dependencies = [ "itertools", "snarkvm-curves", "snarkvm-fields", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", ] [[package]] name = "snarkvm-synthesizer" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "aleo-std", "anyhow", @@ -3469,7 +3466,7 @@ dependencies = [ "snarkvm-console", "snarkvm-curves", "snarkvm-fields", - "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "tracing", "ureq", ] @@ -3497,7 +3494,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "aleo-std", "anyhow", @@ -3509,7 +3506,7 @@ dependencies = [ "rayon", "serde", "serde_json", - "snarkvm-utilities-derives 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d)", + "snarkvm-utilities-derives 0.10.3 (git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d)", "thiserror", ] @@ -3527,7 +3524,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" version = "0.10.3" -source = "git+https://github.com/AleoHQ/snarkVM.git?rev=1779e8d#1779e8d77d76ebde751d9d019d81145457c72eea" +source = "git+https://github.com/AleoHQ/snarkVM.git?rev=d7bac9d#d7bac9d3c6ec2679d7775fcbd8619c1f7b7f7dc9" dependencies = [ "proc-macro2 1.0.56", "quote 1.0.26", diff --git a/Cargo.toml b/Cargo.toml index 70efe14470..f1e9c33e2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,6 @@ members = [ "node", "node/cdn", "node/consensus", - "node/ledger", "node/messages", "node/metrics", "node/rest", @@ -40,7 +39,7 @@ path = "snarkos/main.rs" [workspace.dependencies.snarkvm] #path = "../snarkVM" git = "https://github.com/AleoHQ/snarkVM.git" -rev = "1779e8d" +rev = "d7bac9d" #version = "=0.10.3" features = ["circuit", "console", "rocks"] @@ -69,9 +68,6 @@ path = "./node/cdn" [dependencies.snarkos-node-consensus] path = "./node/consensus" -[dependencies.snarkos-node-ledger] -path = "./node/ledger" - [dependencies.snarkos-node-messages] path = "./node/messages" diff --git a/cli/src/commands/developer/execute.rs b/cli/src/commands/developer/execute.rs index 4f08d2dd1d..8c8043eac7 100644 --- a/cli/src/commands/developer/execute.rs +++ b/cli/src/commands/developer/execute.rs @@ -102,7 +102,7 @@ impl Execute { let credits = ProgramID::::try_from("credits.aleo")?; if program.id() != &credits { let deployment = vm.deploy(&program, rng)?; - vm.process().write().finalize_deployment(vm.finalize_store(), &deployment)?; + vm.process().write().load_deployment(&deployment)?; } // Prepare the fees. diff --git a/node/Cargo.toml b/node/Cargo.toml index 0d8326cf8a..baef3ccf5b 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -19,7 +19,7 @@ edition = "2021" [features] default = [ "parallel" ] parallel = [ "rayon" ] -timer = [ "aleo-std/timer", "snarkos-node-ledger/timer" ] +timer = [ "aleo-std/timer" ] [dependencies.aleo-std] version = "0.1.15" @@ -67,9 +67,6 @@ path = "./cdn" [dependencies.snarkos-node-consensus] path = "./consensus" -[dependencies.snarkos-node-ledger] -path = "./ledger" - [dependencies.snarkos-node-messages] path = "./messages" diff --git a/node/cdn/Cargo.toml b/node/cdn/Cargo.toml index cb57866018..5abce2ee84 100644 --- a/node/cdn/Cargo.toml +++ b/node/cdn/Cargo.toml @@ -52,9 +52,6 @@ version = "1" [dependencies.serde_json] version = "1" -[dependencies.snarkos-node-ledger] -path = "../ledger" - [dependencies.snarkvm] workspace = true features = ["synthesizer"] diff --git a/node/cdn/src/blocks.rs b/node/cdn/src/blocks.rs index 894a03ee14..eaffc00817 100644 --- a/node/cdn/src/blocks.rs +++ b/node/cdn/src/blocks.rs @@ -14,8 +14,16 @@ // You should have received a copy of the GNU General Public License // along with the snarkOS library. If not, see . -use snarkos_node_ledger::Ledger; -use snarkvm::prelude::{cow_to_copied, Block, ConsensusStorage, Deserialize, DeserializeOwned, Network, Serialize}; +use snarkvm::prelude::{ + cow_to_copied, + Block, + ConsensusStorage, + Deserialize, + DeserializeOwned, + Ledger, + Network, + Serialize, +}; use anyhow::{anyhow, bail, Result}; use colored::Colorize; diff --git a/node/consensus/Cargo.toml b/node/consensus/Cargo.toml index 135f14bfaa..6d32fa4877 100644 --- a/node/consensus/Cargo.toml +++ b/node/consensus/Cargo.toml @@ -40,9 +40,6 @@ version = "0.8" version = "1" optional = true -[dependencies.snarkos-node-ledger] -path = "../ledger" - [dependencies.snarkvm] workspace = true diff --git a/node/consensus/src/lib.rs b/node/consensus/src/lib.rs index d812c1d94a..b307a86d84 100644 --- a/node/consensus/src/lib.rs +++ b/node/consensus/src/lib.rs @@ -28,7 +28,6 @@ pub use memory_pool::*; #[cfg(test)] mod tests; -use snarkos_node_ledger::Ledger; use snarkvm::prelude::*; use ::time::OffsetDateTime; @@ -176,8 +175,8 @@ impl> Consensus { let latest_height = latest_block.height(); // Retrieve the latest total supply in microcredits. let latest_total_supply_in_microcredits = latest_block.total_supply_in_microcredits(); - // Retrieve the latest cumulative proof target. - let latest_cumulative_proof_target = latest_block.cumulative_proof_target(); + // Retrieve the latest cumulative weight. + let latest_cumulative_weight = latest_block.cumulative_weight(); // Retrieve the latest proof target. let latest_proof_target = latest_block.proof_target(); // Retrieve the latest coinbase target. @@ -310,8 +309,8 @@ impl> Consensus { None => (latest_block.last_coinbase_target(), latest_block.last_coinbase_timestamp()), }; - // Construct the new cumulative proof target. - let cumulative_proof_target = latest_cumulative_proof_target.saturating_add(block_cumulative_proof_target); + // Construct the new cumulative weight. + let cumulative_weight = latest_cumulative_weight.saturating_add(block_cumulative_proof_target); // Construct the metadata. let metadata = Metadata::new( @@ -319,7 +318,7 @@ impl> Consensus { next_round, next_height, new_total_supply_in_microcredits, - cumulative_proof_target, + cumulative_weight, next_coinbase_target, next_proof_target, next_last_coinbase_target, @@ -521,14 +520,11 @@ impl> Consensus { if block.last_coinbase_timestamp() != block.timestamp() { bail!("The last coinbase timestamp does not match the block timestamp") } - // Ensure that the cumulative proof target matches the block cumulative proof target. - if block.cumulative_proof_target() - != self - .ledger - .latest_cumulative_proof_target() - .saturating_add(coinbase.to_cumulative_proof_target()?) + // Ensure that the cumulative weight includes the next block's cumulative proof target. + if block.cumulative_weight() + != self.ledger.latest_cumulative_weight().saturating_add(coinbase.to_cumulative_proof_target()?) { - bail!("The cumulative proof target does not match the block cumulative proof target") + bail!("The cumulative weight does not include the block cumulative proof target") } } None => { @@ -540,9 +536,9 @@ impl> Consensus { if block.last_coinbase_timestamp() != self.ledger.last_coinbase_timestamp() { bail!("The last coinbase timestamp does not match the previous block's last coinbase timestamp") } - // Ensure that the cumulative proof target is the same as the previous block. - if block.cumulative_proof_target() != self.ledger.latest_cumulative_proof_target() { - bail!("The cumulative proof target does not match the previous block's cumulative proof target") + // Ensure that the cumulative weight is the same as the previous block. + if block.cumulative_weight() != self.ledger.latest_cumulative_weight() { + bail!("The cumulative weight does not match the previous block's cumulative weight") } } } diff --git a/node/consensus/src/tests.rs b/node/consensus/src/tests.rs index 81eac5d8a0..8d10b26aaf 100644 --- a/node/consensus/src/tests.rs +++ b/node/consensus/src/tests.rs @@ -14,19 +14,18 @@ // You should have received a copy of the GNU General Public License // along with the snarkOS library. If not, see . -use snarkos_node_ledger::{Ledger, RecordsFilter}; use snarkvm::{ console::{ account::{Address, PrivateKey, ViewKey}, network::{prelude::*, Testnet3}, program::{Entry, Identifier, Literal, Plaintext, Value}, }, - prelude::TestRng, + prelude::{Ledger, RecordsFilter, TestRng}, synthesizer::{ block::{Block, Transaction, Transactions}, program::Program, store::ConsensusStore, - vm::VM, + vm::{FinalizeMode, VM}, }, }; @@ -314,7 +313,13 @@ fn test_ledger_deploy() { assert!(consensus.ledger.contains_input_id(transaction.input_ids().next().unwrap()).unwrap()); // Ensure that the VM can't re-deploy the same program. - assert!(consensus.ledger.vm().finalize(&Transactions::from(&[transaction.clone()]), None).is_err()); + assert!( + consensus + .ledger + .vm() + .finalize::<{ FinalizeMode::RealRun.to_u8() }>(&Transactions::from(&[transaction.clone()])) + .is_err() + ); // Ensure that the ledger deems the same transaction invalid. assert!(consensus.check_transaction_basic(&transaction).is_err()); // Ensure that the ledger cannot add the same transaction. diff --git a/node/ledger/Cargo.toml b/node/ledger/Cargo.toml deleted file mode 100644 index 6326034732..0000000000 --- a/node/ledger/Cargo.toml +++ /dev/null @@ -1,52 +0,0 @@ -[package] -name = "snarkos-node-ledger" -version = "2.0.2" -authors = [ "The Aleo Team " ] -description = "A node ledger for a decentralized operating system" -homepage = "https://aleo.org" -repository = "https://github.com/AleoHQ/snarkOS" -keywords = [ - "aleo", - "cryptography", - "blockchain", - "decentralized", - "zero-knowledge" -] -categories = [ "cryptography", "operating-systems" ] -license = "GPL-3.0" -edition = "2021" - -[features] -default = [ "parallel" ] -parallel = [ "rayon" ] -timer = [ "aleo-std/timer" ] - -[dependencies.aleo-std] -version = "0.1.15" -default-features = false - -[dependencies.anyhow] -version = "1.0.70" - -[dependencies.indexmap] -version = "1.9" -features = [ "rayon" ] - -[dependencies.once_cell] -version = "1.13" - -[dependencies.parking_lot] -version = "0.12" - -[dependencies.rand] -version = "0.8" - -[dependencies.rayon] -version = "1" -optional = true - -[dependencies.snarkvm] -workspace = true - -[dependencies.tracing] -version = "0.1" diff --git a/node/ledger/LICENSE.md b/node/ledger/LICENSE.md deleted file mode 100644 index b95c626e2a..0000000000 --- a/node/ledger/LICENSE.md +++ /dev/null @@ -1,596 +0,0 @@ -GNU General Public License -========================== - -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. <> - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - -## Preamble - -The GNU General Public License is a free, copyleft license for software and other -kinds of works. - -The licenses for most software and other practical works are designed to take away -your freedom to share and change the works. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change all versions of a -program--to make sure it remains free software for all its users. We, the Free -Software Foundation, use the GNU General Public License for most of our software; it -applies also to any other work released this way by its authors. You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General -Public Licenses are designed to make sure that you have the freedom to distribute -copies of free software (and charge for them if you wish), that you receive source -code or can get it if you want it, that you can change the software or use pieces of -it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or -asking you to surrender the rights. Therefore, you have certain responsibilities if -you distribute copies of the software, or if you modify it: responsibilities to -respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, -you must pass on to the recipients the same freedoms that you received. You must make -sure that they, too, receive or can get the source code. And you must show them these -terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: **(1)** assert -copyright on the software, and **(2)** offer you this License giving you legal permission -to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is -no warranty for this free software. For both users' and authors' sake, the GPL -requires that modified versions be marked as changed, so that their problems will not -be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of -the software inside them, although the manufacturer can do so. This is fundamentally -incompatible with the aim of protecting users' freedom to change the software. The -systematic pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we have designed -this version of the GPL to prohibit the practice for those products. If such problems -arise substantially in other domains, we stand ready to extend this provision to -those domains in future versions of the GPL, as needed to protect the freedom of -users. - -Finally, every program is threatened constantly by software patents. States should -not allow patents to restrict development and use of software on general-purpose -computers, but in those that do, we wish to avoid the special danger that patents -applied to a free program could make it effectively proprietary. To prevent this, the -GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -## TERMS AND CONDITIONS - -### 0. Definitions - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this -License. Each licensee is addressed as “you”. “Licensees” and -“recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in -a fashion requiring copyright permission, other than the making of an exact copy. The -resulting work is called a “modified version” of the earlier work or a -work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on -the Program. - -To “propagate” a work means to do anything with it that, without -permission, would make you directly or secondarily liable for infringement under -applicable copyright law, except executing it on a computer or modifying a private -copy. Propagation includes copying, distribution (with or without modification), -making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through a computer -network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the -extent that it includes a convenient and prominently visible feature that **(1)** -displays an appropriate copyright notice, and **(2)** tells the user that there is no -warranty for the work (except to the extent that warranties are provided), that -licensees may convey the work under this License, and how to view a copy of this -License. If the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -### 1. Source Code - -The “source code” for a work means the preferred form of the work for -making modifications to it. “Object code” means any non-source form of a -work. - -A “Standard Interface” means an interface that either is an official -standard defined by a recognized standards body, or, in the case of interfaces -specified for a particular programming language, one that is widely used among -developers working in that language. - -The “System Libraries” of an executable work include anything, other than -the work as a whole, that **(a)** is included in the normal form of packaging a Major -Component, but which is not part of that Major Component, and **(b)** serves only to -enable use of the work with that Major Component, or to implement a Standard -Interface for which an implementation is available to the public in source code form. -A “Major Component”, in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system (if any) on which -the executable work runs, or a compiler used to produce the work, or an object code -interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the -source code needed to generate, install, and (for an executable work) run the object -code and to modify the work, including scripts to control those activities. However, -it does not include the work's System Libraries, or general-purpose tools or -generally available free programs which are used unmodified in performing those -activities but which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for the work, and -the source code for shared libraries and dynamically linked subprograms that the work -is specifically designed to require, such as by intimate data communication or -control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate -automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -### 2. Basic Permissions - -All rights granted under this License are granted for the term of copyright on the -Program, and are irrevocable provided the stated conditions are met. This License -explicitly affirms your unlimited permission to run the unmodified Program. The -output from running a covered work is covered by this License only if the output, -given its content, constitutes a covered work. This License acknowledges your rights -of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without -conditions so long as your license otherwise remains in force. You may convey covered -works to others for the sole purpose of having them make modifications exclusively -for you, or provide you with facilities for running those works, provided that you -comply with the terms of this License in conveying all material for which you do not -control copyright. Those thus making or running the covered works for you must do so -exclusively on your behalf, under your direction and control, on terms that prohibit -them from making any copies of your copyrighted material outside their relationship -with you. - -Conveying under any other circumstances is permitted solely under the conditions -stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -### 3. Protecting Users' Legal Rights From Anti-Circumvention Law - -No covered work shall be deemed part of an effective technological measure under any -applicable law fulfilling obligations under article 11 of the WIPO copyright treaty -adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention -of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of -technological measures to the extent such circumvention is effected by exercising -rights under this License with respect to the covered work, and you disclaim any -intention to limit operation or modification of the work as a means of enforcing, -against the work's users, your or third parties' legal rights to forbid circumvention -of technological measures. - -### 4. Conveying Verbatim Copies - -You may convey verbatim copies of the Program's source code as you receive it, in any -medium, provided that you conspicuously and appropriately publish on each copy an -appropriate copyright notice; keep intact all notices stating that this License and -any non-permissive terms added in accord with section 7 apply to the code; keep -intact all notices of the absence of any warranty; and give all recipients a copy of -this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer -support or warranty protection for a fee. - -### 5. Conveying Modified Source Versions - -You may convey a work based on the Program, or the modifications to produce it from -the Program, in the form of source code under the terms of section 4, provided that -you also meet all of these conditions: - -* **a)** The work must carry prominent notices stating that you modified it, and giving a -relevant date. -* **b)** The work must carry prominent notices stating that it is released under this -License and any conditions added under section 7. This requirement modifies the -requirement in section 4 to “keep intact all notices”. -* **c)** You must license the entire work, as a whole, under this License to anyone who -comes into possession of a copy. This License will therefore apply, along with any -applicable section 7 additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no permission to license the -work in any other way, but it does not invalidate such permission if you have -separately received it. -* **d)** If the work has interactive user interfaces, each must display Appropriate Legal -Notices; however, if the Program has interactive interfaces that do not display -Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are -not by their nature extensions of the covered work, and which are not combined with -it such as to form a larger program, in or on a volume of a storage or distribution -medium, is called an “aggregate” if the compilation and its resulting -copyright are not used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work in an aggregate -does not cause this License to apply to the other parts of the aggregate. - -### 6. Conveying Non-Source Forms - -You may convey a covered work in object code form under the terms of sections 4 and -5, provided that you also convey the machine-readable Corresponding Source under the -terms of this License, in one of these ways: - -* **a)** Convey the object code in, or embodied in, a physical product (including a -physical distribution medium), accompanied by the Corresponding Source fixed on a -durable physical medium customarily used for software interchange. -* **b)** Convey the object code in, or embodied in, a physical product (including a -physical distribution medium), accompanied by a written offer, valid for at least -three years and valid for as long as you offer spare parts or customer support for -that product model, to give anyone who possesses the object code either **(1)** a copy of -the Corresponding Source for all the software in the product that is covered by this -License, on a durable physical medium customarily used for software interchange, for -a price no more than your reasonable cost of physically performing this conveying of -source, or **(2)** access to copy the Corresponding Source from a network server at no -charge. -* **c)** Convey individual copies of the object code with a copy of the written offer to -provide the Corresponding Source. This alternative is allowed only occasionally and -noncommercially, and only if you received the object code with such an offer, in -accord with subsection 6b. -* **d)** Convey the object code by offering access from a designated place (gratis or for -a charge), and offer equivalent access to the Corresponding Source in the same way -through the same place at no further charge. You need not require recipients to copy -the Corresponding Source along with the object code. If the place to copy the object -code is a network server, the Corresponding Source may be on a different server -(operated by you or a third party) that supports equivalent copying facilities, -provided you maintain clear directions next to the object code saying where to find -the Corresponding Source. Regardless of what server hosts the Corresponding Source, -you remain obligated to ensure that it is available for as long as needed to satisfy -these requirements. -* **e)** Convey the object code using peer-to-peer transmission, provided you inform -other peers where the object code and Corresponding Source of the work are being -offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the -Corresponding Source as a System Library, need not be included in conveying the -object code work. - -A “User Product” is either **(1)** a “consumer product”, which -means any tangible personal property which is normally used for personal, family, or -household purposes, or **(2)** anything designed or sold for incorporation into a -dwelling. In determining whether a product is a consumer product, doubtful cases -shall be resolved in favor of coverage. For a particular product received by a -particular user, “normally used” refers to a typical or common use of -that class of product, regardless of the status of the particular user or of the way -in which the particular user actually uses, or expects or is expected to use, the -product. A product is a consumer product regardless of whether the product has -substantial commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, -procedures, authorization keys, or other information required to install and execute -modified versions of a covered work in that User Product from a modified version of -its Corresponding Source. The information must suffice to ensure that the continued -functioning of the modified object code is in no case prevented or interfered with -solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for -use in, a User Product, and the conveying occurs as part of a transaction in which -the right of possession and use of the User Product is transferred to the recipient -in perpetuity or for a fixed term (regardless of how the transaction is -characterized), the Corresponding Source conveyed under this section must be -accompanied by the Installation Information. But this requirement does not apply if -neither you nor any third party retains the ability to install modified object code -on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to -continue to provide support service, warranty, or updates for a work that has been -modified or installed by the recipient, or for the User Product in which it has been -modified or installed. Access to a network may be denied when the modification itself -materially and adversely affects the operation of the network or violates the rules -and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with -this section must be in a format that is publicly documented (and with an -implementation available to the public in source code form), and must require no -special password or key for unpacking, reading or copying. - -### 7. Additional Terms - -“Additional permissions” are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. Additional -permissions that are applicable to the entire Program shall be treated as though they -were included in this License, to the extent that they are valid under applicable -law. If additional permissions apply only to part of the Program, that part may be -used separately under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any -additional permissions from that copy, or from any part of it. (Additional -permissions may be written to require their own removal in certain cases when you -modify the work.) You may place additional permissions on material, added by you to a -covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a -covered work, you may (if authorized by the copyright holders of that material) -supplement the terms of this License with terms: - -* **a)** Disclaiming warranty or limiting liability differently from the terms of -sections 15 and 16 of this License; or -* **b)** Requiring preservation of specified reasonable legal notices or author -attributions in that material or in the Appropriate Legal Notices displayed by works -containing it; or -* **c)** Prohibiting misrepresentation of the origin of that material, or requiring that -modified versions of such material be marked in reasonable ways as different from the -original version; or -* **d)** Limiting the use for publicity purposes of names of licensors or authors of the -material; or -* **e)** Declining to grant rights under trademark law for use of some trade names, -trademarks, or service marks; or -* **f)** Requiring indemnification of licensors and authors of that material by anyone -who conveys the material (or modified versions of it) with contractual assumptions of -liability to the recipient, for any liability that these contractual assumptions -directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further -restrictions” within the meaning of section 10. If the Program as you received -it, or any part of it, contains a notice stating that it is governed by this License -along with a term that is a further restriction, you may remove that term. If a -license document contains a further restriction but permits relicensing or conveying -under this License, you may add to a covered work material governed by the terms of -that license document, provided that the further restriction does not survive such -relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in -the relevant source files, a statement of the additional terms that apply to those -files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a -separately written license, or stated as exceptions; the above requirements apply -either way. - -### 8. Termination - -You may not propagate or modify a covered work except as expressly provided under -this License. Any attempt otherwise to propagate or modify it is void, and will -automatically terminate your rights under this License (including any patent licenses -granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a -particular copyright holder is reinstated **(a)** provisionally, unless and until the -copyright holder explicitly and finally terminates your license, and **(b)** permanently, -if the copyright holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently -if the copyright holder notifies you of the violation by some reasonable means, this -is the first time you have received notice of violation of this License (for any -work) from that copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of -parties who have received copies or rights from you under this License. If your -rights have been terminated and not permanently reinstated, you do not qualify to -receive new licenses for the same material under section 10. - -### 9. Acceptance Not Required for Having Copies - -You are not required to accept this License in order to receive or run a copy of the -Program. Ancillary propagation of a covered work occurring solely as a consequence of -using peer-to-peer transmission to receive a copy likewise does not require -acceptance. However, nothing other than this License grants you permission to -propagate or modify any covered work. These actions infringe copyright if you do not -accept this License. Therefore, by modifying or propagating a covered work, you -indicate your acceptance of this License to do so. - -### 10. Automatic Licensing of Downstream Recipients - -Each time you convey a covered work, the recipient automatically receives a license -from the original licensors, to run, modify and propagate that work, subject to this -License. You are not responsible for enforcing compliance by third parties with this -License. - -An “entity transaction” is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an organization, or -merging organizations. If propagation of a covered work results from an entity -transaction, each party to that transaction who receives a copy of the work also -receives whatever licenses to the work the party's predecessor in interest had or -could give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if the predecessor -has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or -affirmed under this License. For example, you may not impose a license fee, royalty, -or other charge for exercise of rights granted under this License, and you may not -initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging -that any patent claim is infringed by making, using, selling, offering for sale, or -importing the Program or any portion of it. - -### 11. Patents - -A “contributor” is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The work thus -licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or -controlled by the contributor, whether already acquired or hereafter acquired, that -would be infringed by some manner, permitted by this License, of making, using, or -selling its contributor version, but do not include claims that would be infringed -only as a consequence of further modification of the contributor version. For -purposes of this definition, “control” includes the right to grant patent -sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license -under the contributor's essential patent claims, to make, use, sell, offer for sale, -import and otherwise run, modify and propagate the contents of its contributor -version. - -In the following three paragraphs, a “patent license” is any express -agreement or commitment, however denominated, not to enforce a patent (such as an -express permission to practice a patent or covenant not to sue for patent -infringement). To “grant” such a patent license to a party means to make -such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the -Corresponding Source of the work is not available for anyone to copy, free of charge -and under the terms of this License, through a publicly available network server or -other readily accessible means, then you must either **(1)** cause the Corresponding -Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the -patent license for this particular work, or **(3)** arrange, in a manner consistent with -the requirements of this License, to extend the patent license to downstream -recipients. “Knowingly relying” means you have actual knowledge that, but -for the patent license, your conveying the covered work in a country, or your -recipient's use of the covered work in a country, would infringe one or more -identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you -convey, or propagate by procuring conveyance of, a covered work, and grant a patent -license to some of the parties receiving the covered work authorizing them to use, -propagate, modify or convey a specific copy of the covered work, then the patent -license you grant is automatically extended to all recipients of the covered work and -works based on it. - -A patent license is “discriminatory” if it does not include within the -scope of its coverage, prohibits the exercise of, or is conditioned on the -non-exercise of one or more of the rights that are specifically granted under this -License. You may not convey a covered work if you are a party to an arrangement with -a third party that is in the business of distributing software, under which you make -payment to the third party based on the extent of your activity of conveying the -work, and under which the third party grants, to any of the parties who would receive -the covered work from you, a discriminatory patent license **(a)** in connection with -copies of the covered work conveyed by you (or copies made from those copies), or **(b)** -primarily for and in connection with specific products or compilations that contain -the covered work, unless you entered into that arrangement, or that patent license -was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied -license or other defenses to infringement that may otherwise be available to you -under applicable patent law. - -### 12. No Surrender of Others' Freedom - -If conditions are imposed on you (whether by court order, agreement or otherwise) -that contradict the conditions of this License, they do not excuse you from the -conditions of this License. If you cannot convey a covered work so as to satisfy -simultaneously your obligations under this License and any other pertinent -obligations, then as a consequence you may not convey it at all. For example, if you -agree to terms that obligate you to collect a royalty for further conveying from -those to whom you convey the Program, the only way you could satisfy both those terms -and this License would be to refrain entirely from conveying the Program. - -### 13. Use with the GNU Affero General Public License - -Notwithstanding any other provision of this License, you have permission to link or -combine any covered work with a work licensed under version 3 of the GNU Affero -General Public License into a single combined work, and to convey the resulting work. -The terms of this License will continue to apply to the part which is the covered -work, but the special requirements of the GNU Affero General Public License, section -13, concerning interaction through a network will apply to the combination as such. - -### 14. Revised Versions of this License - -The Free Software Foundation may publish revised and/or new versions of the GNU -General Public License from time to time. Such new versions will be similar in spirit -to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that -a certain numbered version of the GNU General Public License “or any later -version” applies to it, you have the option of following the terms and -conditions either of that numbered version or of any later version published by the -Free Software Foundation. If the Program does not specify a version number of the GNU -General Public License, you may choose any version ever published by the Free -Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU -General Public License can be used, that proxy's public statement of acceptance of a -version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no -additional obligations are imposed on any author or copyright holder as a result of -your choosing to follow a later version. - -### 15. Disclaimer of Warranty - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE -QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -### 16. Limitation of Liability - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY -COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS -PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE -OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE -WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -### 17. Interpretation of Sections 15 and 16 - -If the disclaimer of warranty and limitation of liability provided above cannot be -given local legal effect according to their terms, reviewing courts shall apply local -law that most closely approximates an absolute waiver of all civil liability in -connection with the Program, unless a warranty or assumption of liability accompanies -a copy of the Program in return for a fee. - -_END OF TERMS AND CONDITIONS_ - -## How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to -the public, the best way to achieve this is to make it free software which everyone -can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them -to the start of each source file to most effectively state the exclusion of warranty; -and each file should have at least the “copyright” line and a pointer to -where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this -when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands `show w` and `show c` should show the appropriate parts of -the General Public License. Of course, your program's commands might be different; -for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to -sign a “copyright disclaimer” for the program, if necessary. For more -information on this, and how to apply and follow the GNU GPL, see -<>. - -The GNU General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may consider it -more useful to permit linking proprietary applications with the library. If this is -what you want to do, use the GNU Lesser General Public License instead of this -License. But first, please read -<>. diff --git a/node/ledger/README.md b/node/ledger/README.md deleted file mode 100644 index 235598314c..0000000000 --- a/node/ledger/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# snarkos-node-ledger - -[![Crates.io](https://img.shields.io/crates/v/snarkos-node-ledger.svg?color=neon)](https://crates.io/crates/snarkos-node-ledger) -[![Authors](https://img.shields.io/badge/authors-Aleo-orange.svg)](https://aleo.org) -[![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](./LICENSE.md) - -The `snarkos-node-ledger` crate provides the ledger and API interface for the Aleo blockchain. diff --git a/node/ledger/src/contains.rs b/node/ledger/src/contains.rs deleted file mode 100644 index 72b6b672f1..0000000000 --- a/node/ledger/src/contains.rs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkOS library. - -// The snarkOS library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The snarkOS library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the snarkOS library. If not, see . - -use super::*; - -impl> Ledger { - /// Returns `true` if the given state root exists. - pub fn contains_state_root(&self, state_root: &N::StateRoot) -> Result { - self.vm.block_store().contains_state_root(state_root) - } - - /// Returns `true` if the given block height exists. - pub fn contains_block_height(&self, height: u32) -> Result { - self.vm.block_store().contains_block_height(height) - } - - /// Returns `true` if the given block hash exists. - pub fn contains_block_hash(&self, block_hash: &N::BlockHash) -> Result { - self.vm.block_store().contains_block_hash(block_hash) - } - - /// Returns `true` if the given puzzle commitment exists. - pub fn contains_puzzle_commitment(&self, puzzle_commitment: &PuzzleCommitment) -> Result { - self.vm.block_store().contains_puzzle_commitment(puzzle_commitment) - } - - /// Returns `true` if the given program ID exists. - pub fn contains_program_id(&self, program_id: &ProgramID) -> Result { - self.vm.transaction_store().contains_program_id(program_id) - } - - /// Returns `true` if the given transaction ID exists. - pub fn contains_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { - self.vm.transaction_store().contains_transaction_id(transaction_id) - } - - /* Transition */ - - /// Returns `true` if the given transition ID exists. - pub fn contains_transition_id(&self, transition_id: &N::TransitionID) -> Result { - self.vm.transition_store().contains_transition_id(transition_id) - } - - /* Input */ - - /// Returns `true` if the given input ID exists. - pub fn contains_input_id(&self, input_id: &Field) -> Result { - self.vm.transition_store().contains_input_id(input_id) - } - - /// Returns `true` if the given serial number exists. - pub fn contains_serial_number(&self, serial_number: &Field) -> Result { - self.vm.transition_store().contains_serial_number(serial_number) - } - - /// Returns `true` if the given tag exists. - pub fn contains_tag(&self, tag: &Field) -> Result { - self.vm.transition_store().contains_tag(tag) - } - - /* Output */ - - /// Returns `true` if the given output ID exists. - pub fn contains_output_id(&self, output_id: &Field) -> Result { - self.vm.transition_store().contains_output_id(output_id) - } - - /// Returns `true` if the given commitment exists. - pub fn contains_commitment(&self, commitment: &Field) -> Result { - self.vm.transition_store().contains_commitment(commitment) - } - - /// Returns `true` if the given checksum exists. - pub fn contains_checksum(&self, checksum: &Field) -> bool { - self.vm.transition_store().contains_checksum(checksum) - } - - /// Returns `true` if the given nonce exists. - pub fn contains_nonce(&self, nonce: &Group) -> Result { - self.vm.transition_store().contains_nonce(nonce) - } - - /* Metadata */ - - /// Returns `true` if the given transition public key exists. - pub fn contains_tpk(&self, tpk: &Group) -> Result { - self.vm.transition_store().contains_tpk(tpk) - } - - /// Returns `true` if the given transition commitment exists. - pub fn contains_tcm(&self, tcm: &Field) -> Result { - self.vm.transition_store().contains_tcm(tcm) - } -} diff --git a/node/ledger/src/find.rs b/node/ledger/src/find.rs deleted file mode 100644 index da79eecf8d..0000000000 --- a/node/ledger/src/find.rs +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkOS library. - -// The snarkOS library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The snarkOS library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the snarkOS library. If not, see . - -use super::*; - -use crate::PuzzleCommitment; -use std::borrow::Cow; - -impl> Ledger { - /// Returns the block height that contains the given `state root`. - pub fn find_block_height_from_state_root(&self, state_root: N::StateRoot) -> Result> { - self.vm.block_store().find_block_height_from_state_root(state_root) - } - - /// Returns the block hash that contains the given `transaction ID`. - pub fn find_block_hash(&self, transaction_id: &N::TransactionID) -> Result> { - self.vm.block_store().find_block_hash(transaction_id) - } - - /// Returns the block hash that contains the given `puzzle commitment`. - pub fn find_block_hash_from_puzzle_commitment( - &self, - puzzle_commitment: &PuzzleCommitment, - ) -> Result> { - self.vm.block_store().find_block_hash_from_puzzle_commitment(puzzle_commitment) - } - - /// Returns the transaction ID that contains the given `program ID`. - pub fn find_transaction_id_from_program_id(&self, program_id: &ProgramID) -> Result> { - self.vm.transaction_store().find_transaction_id_from_program_id(program_id) - } - - /// Returns the transaction ID that contains the given `transition ID`. - pub fn find_transaction_id_from_transition_id( - &self, - transition_id: &N::TransitionID, - ) -> Result> { - self.vm.transaction_store().find_transaction_id_from_transition_id(transition_id) - } - - /// Returns the transition ID that contains the given `input ID` or `output ID`. - pub fn find_transition_id(&self, id: &Field) -> Result { - self.vm.transition_store().find_transition_id(id) - } - - /// Returns the record ciphertexts that belong to the given view key. - pub fn find_record_ciphertexts<'a>( - &'a self, - view_key: &'a ViewKey, - filter: RecordsFilter, - ) -> Result, Cow<'_, Record>>)>> { - // Derive the x-coordinate of the address corresponding to the given view key. - let address_x_coordinate = view_key.to_address().to_x_coordinate(); - // Derive the `sk_tag` from the graph key. - let sk_tag = match GraphKey::try_from(view_key) { - Ok(graph_key) => graph_key.sk_tag(), - Err(e) => bail!("Failed to derive the graph key from the view key: {e}"), - }; - - Ok(self.records().flat_map(move |cow| { - // Retrieve the commitment and record. - let (commitment, record) = match cow { - (Cow::Borrowed(commitment), record) => (*commitment, record), - (Cow::Owned(commitment), record) => (commitment, record), - }; - - // Determine whether to decrypt this record (or not), based on the filter. - let commitment = match filter { - RecordsFilter::All => Ok(Some(commitment)), - RecordsFilter::Spent => Record::>::tag(sk_tag, commitment).and_then(|tag| { - // Determine if the record is spent. - self.contains_tag(&tag).map(|is_spent| match is_spent { - true => Some(commitment), - false => None, - }) - }), - RecordsFilter::Unspent => Record::>::tag(sk_tag, commitment).and_then(|tag| { - // Determine if the record is spent. - self.contains_tag(&tag).map(|is_spent| match is_spent { - true => None, - false => Some(commitment), - }) - }), - RecordsFilter::SlowSpent(private_key) => { - Record::>::serial_number(private_key, commitment).and_then(|serial_number| { - // Determine if the record is spent. - self.contains_serial_number(&serial_number).map(|is_spent| match is_spent { - true => Some(commitment), - false => None, - }) - }) - } - RecordsFilter::SlowUnspent(private_key) => { - Record::>::serial_number(private_key, commitment).and_then(|serial_number| { - // Determine if the record is spent. - self.contains_serial_number(&serial_number).map(|is_spent| match is_spent { - true => None, - false => Some(commitment), - }) - }) - } - }; - - match commitment { - Ok(Some(commitment)) => { - match record.is_owner_with_address_x_coordinate(view_key, &address_x_coordinate) { - true => Some((commitment, record)), - false => None, - } - } - Ok(None) => None, - Err(e) => { - warn!("Failed to process 'find_record_ciphertexts({:?})': {e}", filter); - None - } - } - })) - } - - /// Returns the records that belong to the given view key. - pub fn find_records<'a>( - &'a self, - view_key: &'a ViewKey, - filter: RecordsFilter, - ) -> Result, Record>)>> { - self.find_record_ciphertexts(view_key, filter).map(|iter| { - iter.flat_map(|(commitment, record)| match record.decrypt(view_key) { - Ok(record) => Some((commitment, record)), - Err(e) => { - warn!("Failed to decrypt the record: {e}"); - None - } - }) - }) - } -} diff --git a/node/ledger/src/get.rs b/node/ledger/src/get.rs deleted file mode 100644 index 3d82ee75a1..0000000000 --- a/node/ledger/src/get.rs +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkOS library. - -// The snarkOS library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The snarkOS library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the snarkOS library. If not, see . - -use super::*; - -impl> Ledger { - /// Returns the state root that contains the given `block height`. - pub fn get_state_root(&self, block_height: u32) -> Result> { - self.vm.block_store().get_state_root(block_height) - } - - /// Returns a state path for the given commitment. - pub fn get_state_path_for_commitment(&self, commitment: &Field) -> Result> { - self.vm.block_store().get_state_path_for_commitment(commitment) - } - - /// Returns the epoch challenge for the given block height. - pub fn get_epoch_challenge(&self, block_height: u32) -> Result> { - // Compute the epoch number from the current block height. - let epoch_number = block_height / N::NUM_BLOCKS_PER_EPOCH; - // Compute the epoch starting height (a multiple of `NUM_BLOCKS_PER_EPOCH`). - let epoch_starting_height = epoch_number * N::NUM_BLOCKS_PER_EPOCH; - // Retrieve the epoch block hash, defined as the 'previous block hash' from the epoch starting height. - let epoch_block_hash = self.get_previous_hash(epoch_starting_height)?; - // Construct the epoch challenge. - EpochChallenge::new(epoch_number, epoch_block_hash, N::COINBASE_PUZZLE_DEGREE) - } - - /// Returns the block for the given block height. - pub fn get_block(&self, height: u32) -> Result> { - // If the height is 0, return the genesis block. - if height == 0 { - return Ok(self.genesis.clone()); - } - // Retrieve the block hash. - let block_hash = match self.vm.block_store().get_block_hash(height)? { - Some(block_hash) => block_hash, - None => bail!("Block {height} does not exist in storage"), - }; - // Retrieve the block. - match self.vm.block_store().get_block(&block_hash)? { - Some(block) => Ok(block), - None => bail!("Block {height} ('{block_hash}') does not exist in storage"), - } - } - - /// Returns the blocks in the given block range. - /// The range is inclusive of the start and exclusive of the end. - pub fn get_blocks(&self, heights: Range) -> Result>> { - cfg_into_iter!(heights).map(|height| self.get_block(height)).collect() - } - - /// Returns the block for the given block hash. - pub fn get_block_by_hash(&self, block_hash: &N::BlockHash) -> Result> { - // Retrieve the block. - match self.vm.block_store().get_block(block_hash)? { - Some(block) => Ok(block), - None => bail!("Block '{block_hash}' does not exist in storage"), - } - } - - /// Returns the block height for the given block hash. - pub fn get_height(&self, block_hash: &N::BlockHash) -> Result { - match self.vm.block_store().get_block_height(block_hash)? { - Some(height) => Ok(height), - None => bail!("Missing block height for block '{block_hash}'"), - } - } - - /// Returns the block hash for the given block height. - pub fn get_hash(&self, height: u32) -> Result { - // If the height is 0, return the genesis block hash. - if height == 0 { - return Ok(self.genesis.hash()); - } - match self.vm.block_store().get_block_hash(height)? { - Some(block_hash) => Ok(block_hash), - None => bail!("Missing block hash for block {height}"), - } - } - - /// Returns the previous block hash for the given block height. - pub fn get_previous_hash(&self, height: u32) -> Result { - // If the height is 0, return the default block hash. - if height == 0 { - return Ok(N::BlockHash::default()); - } - match self.vm.block_store().get_previous_block_hash(height)? { - Some(previous_hash) => Ok(previous_hash), - None => bail!("Missing previous block hash for block {height}"), - } - } - - /// Returns the block header for the given block height. - pub fn get_header(&self, height: u32) -> Result> { - // If the height is 0, return the genesis block header. - if height == 0 { - return Ok(*self.genesis.header()); - } - // Retrieve the block hash. - let block_hash = match self.vm.block_store().get_block_hash(height)? { - Some(block_hash) => block_hash, - None => bail!("Block {height} does not exist in storage"), - }; - // Retrieve the block header. - match self.vm.block_store().get_block_header(&block_hash)? { - Some(header) => Ok(header), - None => bail!("Missing block header for block {height}"), - } - } - - /// Returns the block transactions for the given block height. - pub fn get_transactions(&self, height: u32) -> Result> { - // If the height is 0, return the genesis block transactions. - if height == 0 { - return Ok(self.genesis.transactions().clone()); - } - // Retrieve the block hash. - let block_hash = match self.vm.block_store().get_block_hash(height)? { - Some(block_hash) => block_hash, - None => bail!("Block {height} does not exist in storage"), - }; - // Retrieve the block transaction. - match self.vm.block_store().get_block_transactions(&block_hash)? { - Some(transactions) => Ok(transactions), - None => bail!("Missing block transactions for block {height}"), - } - } - - /// Returns the transaction for the given transaction ID. - pub fn get_transaction(&self, transaction_id: N::TransactionID) -> Result> { - // Retrieve the transaction. - match self.vm.transaction_store().get_transaction(&transaction_id)? { - Some(transaction) => Ok(transaction), - None => bail!("Missing transaction for ID {transaction_id}"), - } - } - - /// Returns the program for the given program ID. - pub fn get_program(&self, program_id: ProgramID) -> Result> { - match self.vm.transaction_store().get_program(&program_id)? { - Some(program) => Ok(program), - None => bail!("Missing program for ID {program_id}"), - } - } - - /// Returns the block coinbase solution for the given block height. - pub fn get_coinbase(&self, height: u32) -> Result>> { - // If the height is 0, return the genesis block coinbase. - if height == 0 { - return Ok(self.genesis.coinbase().cloned()); - } - // Retrieve the block hash. - let block_hash = match self.vm.block_store().get_block_hash(height)? { - Some(block_hash) => block_hash, - None => bail!("Block {height} does not exist in storage"), - }; - // Retrieve the block coinbase solution. - self.vm.block_store().get_block_coinbase(&block_hash) - } - - /// Returns the block signature for the given block height. - pub fn get_signature(&self, height: u32) -> Result> { - // If the height is 0, return the genesis block signature. - if height == 0 { - return Ok(*self.genesis.signature()); - } - // Retrieve the block hash. - let block_hash = match self.vm.block_store().get_block_hash(height)? { - Some(block_hash) => block_hash, - None => bail!("Block {height} does not exist in storage"), - }; - // Retrieve the block signature. - match self.vm.block_store().get_block_signature(&block_hash)? { - Some(signature) => Ok(signature), - None => bail!("Missing signature for block {height}"), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::tests::test_helpers::CurrentLedger; - use snarkvm::console::network::Testnet3; - - type CurrentNetwork = Testnet3; - - #[test] - fn test_get_block() { - // Load the genesis block. - let genesis = Block::from_bytes_le(CurrentNetwork::genesis_bytes()).unwrap(); - - // Initialize a new ledger. - let ledger = CurrentLedger::load(genesis.clone(), None).unwrap(); - // Retrieve the genesis block. - let candidate = ledger.get_block(0).unwrap(); - // Ensure the genesis block matches. - assert_eq!(genesis, candidate); - } -} diff --git a/node/ledger/src/iterators.rs b/node/ledger/src/iterators.rs deleted file mode 100644 index 4419cf43d6..0000000000 --- a/node/ledger/src/iterators.rs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkOS library. - -// The snarkOS library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The snarkOS library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the snarkOS library. If not, see . - -use super::*; -use crate::PuzzleCommitment; - -impl> Ledger { - /// Returns an iterator over the state roots, for all blocks in `self`. - pub fn state_roots(&self) -> impl '_ + Iterator> { - self.vm.block_store().state_roots() - } - - /// Returns an iterator over the puzzle commitments, for all blocks in `self`. - pub fn puzzle_commitments(&self) -> impl '_ + Iterator>> { - self.vm.block_store().puzzle_commitments() - } - - /* Transaction */ - - /// Returns an iterator over the program IDs, for all transactions in `self`. - pub fn program_ids(&self) -> impl '_ + Iterator>> { - self.vm.transaction_store().program_ids() - } - - /// Returns an iterator over the programs, for all transactions in `self`. - pub fn programs(&self) -> impl '_ + Iterator>> { - self.vm.transaction_store().programs() - } - - /// Returns an iterator over the transaction IDs, for all transactions in `self`. - pub fn transaction_ids(&self) -> impl '_ + Iterator> { - self.vm.transaction_store().transaction_ids() - } - - /* Transition */ - - /// Returns an iterator over the transition IDs, for all transitions. - pub fn transition_ids(&self) -> impl '_ + Iterator> { - self.vm.transition_store().transition_ids() - } - - /* Input */ - - /// Returns an iterator over the input IDs, for all transition inputs. - pub fn input_ids(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().input_ids() - } - - /// Returns an iterator over the serial numbers, for all transition inputs that are records. - pub fn serial_numbers(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().serial_numbers() - } - - /// Returns an iterator over the tags, for all transition inputs that are records. - pub fn tags(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().tags() - } - - /* Output */ - - /// Returns an iterator over the output IDs, for all transition outputs that are records. - pub fn output_ids(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().output_ids() - } - - /// Returns an iterator over the commitments, for all transition outputs that are records. - pub fn commitments(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().commitments() - } - - /// Returns an iterator over the nonces, for all transition outputs that are records. - pub fn nonces(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().nonces() - } - - /// Returns an iterator over the `(commitment, record)` pairs, for all transition outputs that are records. - pub fn records(&self) -> impl '_ + Iterator>, Cow<'_, Record>>)> { - self.vm.transition_store().records() - } - - /* Metadata */ - - /// Returns an iterator over the transition public keys, for all transactions. - pub fn transition_public_keys(&self) -> impl '_ + Iterator>> { - self.vm.transition_store().tpks() - } -} diff --git a/node/ledger/src/lib.rs b/node/ledger/src/lib.rs deleted file mode 100644 index 7a705230f6..0000000000 --- a/node/ledger/src/lib.rs +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkOS library. - -// The snarkOS library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The snarkOS library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the snarkOS library. If not, see . - -#![forbid(unsafe_code)] - -#[macro_use] -extern crate tracing; - -mod contains; -mod find; -mod get; -mod iterators; - -#[cfg(test)] -mod tests; - -use snarkvm::{ - console::{ - account::{Address, GraphKey, PrivateKey, Signature, ViewKey}, - network::prelude::*, - program::{Ciphertext, Entry, Identifier, Literal, Plaintext, ProgramID, Record, StatePath, Value}, - types::{Field, Group}, - }, - synthesizer::{ - block::{Block, Header, Transaction, Transactions}, - coinbase_puzzle::{CoinbaseSolution, EpochChallenge, PuzzleCommitment}, - program::Program, - store::{ConsensusStorage, ConsensusStore}, - vm::VM, - }, -}; - -use aleo_std::prelude::{finish, lap, timer}; -use anyhow::Result; -use core::ops::Range; -use indexmap::IndexMap; -use parking_lot::RwLock; -use rand::{prelude::IteratorRandom, rngs::OsRng}; -use std::{borrow::Cow, sync::Arc}; - -#[cfg(feature = "parallel")] -use rayon::prelude::*; - -pub type RecordMap = IndexMap, Record>>; - -#[derive(Copy, Clone, Debug)] -pub enum RecordsFilter { - /// Returns all records associated with the account. - All, - /// Returns only records associated with the account that are **spent** with the graph key. - Spent, - /// Returns only records associated with the account that are **not spent** with the graph key. - Unspent, - /// Returns all records associated with the account that are **spent** with the given private key. - SlowSpent(PrivateKey), - /// Returns all records associated with the account that are **not spent** with the given private key. - SlowUnspent(PrivateKey), -} - -#[derive(Clone)] -pub struct Ledger> { - /// The VM state. - vm: VM, - /// The genesis block. - genesis: Block, - /// The current block. - current_block: Arc>>, - /// The current epoch challenge. - current_epoch_challenge: Arc>>>, -} - -impl> Ledger { - /// Loads the ledger from storage. - pub fn load(genesis: Block, dev: Option) -> Result { - let timer = timer!("Ledger::load"); - - // Retrieve the genesis hash. - let genesis_hash = genesis.hash(); - // Initialize the ledger. - let ledger = Self::load_unchecked(genesis, dev)?; - - // Ensure the ledger contains the correct genesis block. - if !ledger.contains_block_hash(&genesis_hash)? { - bail!("Incorrect genesis block (run 'snarkos clean' and try again)") - } - - // Retrieve the latest height. - let latest_height = - *ledger.vm.block_store().heights().max().ok_or_else(|| anyhow!("Failed to load blocks from the ledger"))?; - - // Safety check the existence of `NUM_BLOCKS` random blocks. - const NUM_BLOCKS: usize = 1000; - let block_heights: Vec = (0..=latest_height) - .choose_multiple(&mut OsRng::default(), core::cmp::min(NUM_BLOCKS, latest_height as usize)); - cfg_into_iter!(block_heights).try_for_each(|height| { - ledger.get_block(height)?; - Ok::<_, Error>(()) - })?; - lap!(timer, "Check existence of {NUM_BLOCKS} random blocks"); - - finish!(timer); - Ok(ledger) - } - - /// Loads the ledger from storage, without performing integrity checks. - pub fn load_unchecked(genesis: Block, dev: Option) -> Result { - let timer = timer!("Ledger::load_unchecked"); - - // Initialize the consensus store. - let store = match ConsensusStore::::open(dev) { - Ok(store) => store, - _ => bail!("Failed to load ledger (run 'snarkos clean' and try again)"), - }; - lap!(timer, "Load consensus store"); - - // Initialize a new VM. - let vm = VM::from(store)?; - lap!(timer, "Initialize a new VM"); - - // Initialize the ledger. - let mut ledger = Self { - vm, - genesis: genesis.clone(), - current_block: Arc::new(RwLock::new(genesis.clone())), - current_epoch_challenge: Default::default(), - }; - - // If the block store is empty, initialize the genesis block. - if ledger.vm.block_store().heights().max().is_none() { - // Add the genesis block. - ledger.add_next_block(&genesis)?; - } - lap!(timer, "Initialize genesis"); - - // Retrieve the latest height. - let latest_height = - *ledger.vm.block_store().heights().max().ok_or_else(|| anyhow!("Failed to load blocks from the ledger"))?; - // Fetch the latest block. - let block = ledger - .get_block(latest_height) - .map_err(|_| anyhow!("Failed to load block {latest_height} from the ledger"))?; - - // Set the current block. - ledger.current_block = Arc::new(RwLock::new(block)); - // Set the current epoch challenge. - ledger.current_epoch_challenge = Arc::new(RwLock::new(Some(ledger.get_epoch_challenge(latest_height)?))); - lap!(timer, "Initialize ledger"); - - finish!(timer); - Ok(ledger) - } - - /// Returns the VM. - pub fn vm(&self) -> &VM { - &self.vm - } - - /// Returns the latest state root. - pub fn latest_state_root(&self) -> N::StateRoot { - self.vm.block_store().current_state_root() - } - - /// Returns the latest block. - pub fn latest_block(&self) -> Block { - self.current_block.read().clone() - } - - /// Returns the latest round number. - pub fn latest_round(&self) -> u64 { - self.current_block.read().round() - } - - /// Returns the latest block height. - pub fn latest_height(&self) -> u32 { - self.current_block.read().height() - } - - /// Returns the latest block hash. - pub fn latest_hash(&self) -> N::BlockHash { - self.current_block.read().hash() - } - - /// Returns the latest block header. - pub fn latest_header(&self) -> Header { - *self.current_block.read().header() - } - - /// Returns the latest total supply in microcredits. - pub fn latest_total_supply_in_microcredits(&self) -> u64 { - self.current_block.read().header().total_supply_in_microcredits() - } - - /// Returns the latest latest cumulative proof target. - pub fn latest_cumulative_proof_target(&self) -> u128 { - self.current_block.read().cumulative_proof_target() - } - - /// Returns the latest block coinbase accumulator point. - pub fn latest_coinbase_accumulator_point(&self) -> Field { - self.current_block.read().header().coinbase_accumulator_point() - } - - /// Returns the latest block coinbase target. - pub fn latest_coinbase_target(&self) -> u64 { - self.current_block.read().coinbase_target() - } - - /// Returns the latest block proof target. - pub fn latest_proof_target(&self) -> u64 { - self.current_block.read().proof_target() - } - - /// Returns the last coinbase target. - pub fn last_coinbase_target(&self) -> u64 { - self.current_block.read().last_coinbase_target() - } - - /// Returns the last coinbase timestamp. - pub fn last_coinbase_timestamp(&self) -> i64 { - self.current_block.read().last_coinbase_timestamp() - } - - /// Returns the latest block timestamp. - pub fn latest_timestamp(&self) -> i64 { - self.current_block.read().timestamp() - } - - /// Returns the latest block transactions. - pub fn latest_transactions(&self) -> Transactions { - self.current_block.read().transactions().clone() - } - - /// Returns the latest epoch number. - pub fn latest_epoch_number(&self) -> u32 { - self.current_block.read().height() / N::NUM_BLOCKS_PER_EPOCH - } - - /// Returns the latest epoch challenge. - pub fn latest_epoch_challenge(&self) -> Result> { - match self.current_epoch_challenge.read().as_ref() { - Some(challenge) => Ok(challenge.clone()), - None => self.get_epoch_challenge(self.latest_height()), - } - } - - /// Adds the given block as the next block in the chain. - pub fn add_next_block(&self, block: &Block) -> Result<()> { - // Acquire the write lock on the current block. - let mut current_block = self.current_block.write(); - // Update the VM. - self.vm.add_next_block(block, None)?; - // Update the current block. - *current_block = block.clone(); - // Drop the write lock on the current block. - drop(current_block); - - // If the block is the start of a new epoch, or the epoch challenge has not been set, update the current epoch challenge. - if block.height() % N::NUM_BLOCKS_PER_EPOCH == 0 || self.current_epoch_challenge.read().is_none() { - // Update the current epoch challenge. - self.current_epoch_challenge.write().clone_from(&self.get_epoch_challenge(block.height()).ok()); - } - - Ok(()) - } - - /// Returns the unspent records. - pub fn find_unspent_records(&self, view_key: &ViewKey) -> Result> { - let microcredits = Identifier::from_str("microcredits")?; - Ok(self - .find_records(view_key, RecordsFilter::Unspent)? - .filter(|(_, record)| { - // TODO (raychu86): Find cleaner approach and check that the record is associated with the `credits.aleo` program - match record.data().get(µcredits) { - Some(Entry::Private(Plaintext::Literal(Literal::U64(amount), _))) => !amount.is_zero(), - _ => false, - } - }) - .collect::>()) - } - - /// Creates a transfer transaction. - pub fn create_transfer( - &self, - private_key: &PrivateKey, - to: Address, - amount: u64, - fee_amount: u64, - ) -> Result> { - // Fetch the unspent records. - let records = self.find_unspent_records(&ViewKey::try_from(private_key)?)?; - ensure!(!records.len().is_zero(), "The Aleo account has no records to spend."); - - // Initialize an RNG. - let rng = &mut rand::thread_rng(); - - // Prepare the inputs. - let mut records = records.values(); - let inputs = [ - Value::Record(records.next().unwrap().clone()), - Value::from_str(&format!("{to}"))?, - Value::from_str(&format!("{amount}u64"))?, - ]; - - // Prepare the fee record. - let fee_record = records.next().unwrap().clone(); - - // Create a new transaction. - Transaction::execute( - &self.vm, - private_key, - ("credits.aleo", "transfer"), - inputs.iter(), - Some((fee_record, fee_amount)), - None, - rng, - ) - } -} diff --git a/node/ledger/src/tests.rs b/node/ledger/src/tests.rs deleted file mode 100644 index 0a2a49decf..0000000000 --- a/node/ledger/src/tests.rs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkOS library. - -// The snarkOS library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The snarkOS library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the snarkOS library. If not, see . - -use crate::{tests::test_helpers::CurrentLedger, Ledger}; -use snarkvm::{ - console::network::{prelude::*, Testnet3}, - prelude::TestRng, - synthesizer::{ - block::Block, - store::{helpers::memory::ConsensusMemory, ConsensusStore}, - vm::VM, - }, -}; - -type CurrentNetwork = Testnet3; - -#[cfg(test)] -pub(crate) mod test_helpers { - use super::*; - use snarkvm::{ - console::{account::PrivateKey, network::Testnet3}, - prelude::TestRng, - }; - - use once_cell::sync::OnceCell; - - type CurrentNetwork = Testnet3; - pub(crate) type CurrentLedger = Ledger>; - - pub(crate) fn sample_genesis_private_key(rng: &mut TestRng) -> PrivateKey { - static INSTANCE: OnceCell> = OnceCell::new(); - *INSTANCE.get_or_init(|| { - // Initialize a new caller. - PrivateKey::::new(rng).unwrap() - }) - } -} - -fn sample_genesis_block() -> Block { - Block::::from_bytes_le(CurrentNetwork::genesis_bytes()).unwrap() -} - -#[test] -fn test_load() { - let rng = &mut TestRng::default(); - - // Sample the genesis private key. - let private_key = crate::tests::test_helpers::sample_genesis_private_key(rng); - // Initialize the store. - let store = ConsensusStore::<_, ConsensusMemory<_>>::open(None).unwrap(); - // Create a genesis block. - let genesis = Block::genesis(&VM::from(store).unwrap(), &private_key, rng).unwrap(); - - // Initialize the ledger with the genesis block. - let ledger = CurrentLedger::load(genesis.clone(), None).unwrap(); - assert_eq!(ledger.latest_hash(), genesis.hash()); - assert_eq!(ledger.latest_height(), genesis.height()); - assert_eq!(ledger.latest_round(), genesis.round()); - assert_eq!(ledger.latest_block(), genesis); -} - -#[test] -fn test_load_unchecked() { - // Load the genesis block. - let genesis = sample_genesis_block(); - - // Initialize the ledger without checks. - let ledger = CurrentLedger::load_unchecked(genesis.clone(), None).unwrap(); - assert_eq!(ledger.latest_hash(), genesis.hash()); - assert_eq!(ledger.latest_height(), genesis.height()); - assert_eq!(ledger.latest_round(), genesis.round()); - assert_eq!(ledger.latest_block(), genesis); - - // Initialize the ledger with the genesis block. - let ledger = CurrentLedger::load(genesis.clone(), None).unwrap(); - assert_eq!(ledger.latest_hash(), genesis.hash()); - assert_eq!(ledger.latest_height(), genesis.height()); - assert_eq!(ledger.latest_round(), genesis.round()); - assert_eq!(ledger.latest_block(), genesis); -} - -#[test] -fn test_state_path() { - // Load the genesis block. - let genesis = sample_genesis_block(); - // Initialize the ledger with the genesis block. - let ledger = CurrentLedger::load(genesis.clone(), None).unwrap(); - // Retrieve the genesis block. - let block = ledger.get_block(0).unwrap(); - assert_eq!(genesis, block); - - // Construct the state path. - let commitments = block.transactions().commitments().collect::>(); - let commitment = commitments[0]; - - let _state_path = ledger.get_state_path_for_commitment(commitment).unwrap(); -} diff --git a/node/rest/Cargo.toml b/node/rest/Cargo.toml index 22f3519845..eb20eca8a7 100644 --- a/node/rest/Cargo.toml +++ b/node/rest/Cargo.toml @@ -50,9 +50,6 @@ features = [ "derive" ] [dependencies.snarkos-node-consensus] path = "../consensus" -[dependencies.snarkos-node-ledger] -path = "../ledger" - [dependencies.snarkos-node-messages] path = "../messages" diff --git a/node/rest/src/lib.rs b/node/rest/src/lib.rs index 1a388d55c5..28d9d0cb8b 100644 --- a/node/rest/src/lib.rs +++ b/node/rest/src/lib.rs @@ -25,12 +25,11 @@ pub use helpers::*; mod routes; use snarkos_node_consensus::Consensus; -use snarkos_node_ledger::Ledger; use snarkos_node_messages::{Data, Message, UnconfirmedTransaction}; use snarkos_node_router::Routing; use snarkvm::{ console::{account::Address, program::ProgramID, types::Field}, - prelude::{cfg_into_iter, Network}, + prelude::{cfg_into_iter, Ledger, Network}, synthesizer::{ConsensusStorage, Program}, }; diff --git a/node/src/beacon/mod.rs b/node/src/beacon/mod.rs index 260430385d..a90c35889c 100644 --- a/node/src/beacon/mod.rs +++ b/node/src/beacon/mod.rs @@ -19,7 +19,6 @@ mod router; use crate::traits::NodeInterface; use snarkos_account::Account; use snarkos_node_consensus::Consensus; -use snarkos_node_ledger::{Ledger, RecordMap}; use snarkos_node_messages::{ BeaconPropose, Data, @@ -40,10 +39,12 @@ use snarkvm::prelude::{ ConsensusStorage, Entry, Identifier, + Ledger, Literal, Network, Plaintext, ProverSolution, + RecordMap, Transaction, Value, Zero, diff --git a/node/src/helpers.rs b/node/src/helpers.rs index f0a414936e..14fed19e06 100644 --- a/node/src/helpers.rs +++ b/node/src/helpers.rs @@ -14,9 +14,8 @@ // You should have received a copy of the GNU General Public License // along with the snarkOS library. If not, see . -use snarkos_node_ledger::Ledger; use snarkos_node_messages::{BlockLocators, CHECKPOINT_INTERVAL, NUM_RECENTS}; -use snarkvm::prelude::{ConsensusStorage, Network}; +use snarkvm::prelude::{ConsensusStorage, Ledger, Network}; use anyhow::Result; use indexmap::IndexMap; diff --git a/node/src/validator/mod.rs b/node/src/validator/mod.rs index e866df6740..07e0603270 100644 --- a/node/src/validator/mod.rs +++ b/node/src/validator/mod.rs @@ -19,7 +19,6 @@ mod router; use crate::traits::NodeInterface; use snarkos_account::Account; use snarkos_node_consensus::Consensus; -use snarkos_node_ledger::Ledger; use snarkos_node_messages::{BlockRequest, Message, NodeType, PuzzleResponse, UnconfirmedSolution}; use snarkos_node_rest::Rest; use snarkos_node_router::{Heartbeat, Inbound, Outbound, Router, Routing}; @@ -27,7 +26,7 @@ use snarkos_node_tcp::{ protocols::{Disconnect, Handshake, OnConnect, Reading, Writing}, P2P, }; -use snarkvm::prelude::{Block, ConsensusStorage, Header, Network, ProverSolution}; +use snarkvm::prelude::{Block, ConsensusStorage, Header, Ledger, Network, ProverSolution}; use anyhow::Result; use parking_lot::Mutex;