Add Orchard merkle tree anchor tests.
This commit is contained in:
parent
9569bfc291
commit
13fd4c9a1c
|
@ -5,6 +5,7 @@
|
|||
#include "test/data/merkle_witness_serialization.json.h"
|
||||
#include "test/data/merkle_path.json.h"
|
||||
#include "test/data/merkle_commitments.json.h"
|
||||
#include "test/data/merkle_roots_orchard.h"
|
||||
|
||||
#include "test/data/merkle_roots_sapling.json.h"
|
||||
#include "test/data/merkle_serialization_sapling.json.h"
|
||||
|
@ -294,3 +295,20 @@ TEST(orchardMerkleTree, emptyroot) {
|
|||
|
||||
ASSERT_EQ(OrchardMerkleTree::empty_root(), expected);
|
||||
}
|
||||
|
||||
TEST(orchardMerkleTree, appendBundle) {
|
||||
OrchardMerkleTree newTree;
|
||||
|
||||
ASSERT_EQ(newTree.root(), OrchardMerkleTree::empty_root());
|
||||
|
||||
for (int i = 0; i < 1; i++) {
|
||||
CDataStream ssBundleData(merkle_roots_orchard[i].bundle, SER_NETWORK, PROTOCOL_VERSION);
|
||||
OrchardBundle b;
|
||||
ssBundleData >> b;
|
||||
newTree.AppendBundle(b);
|
||||
|
||||
uint256 anchor(merkle_roots_orchard[i].anchor);
|
||||
|
||||
ASSERT_EQ(newTree.root(), anchor);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,21 +11,23 @@ use zcash_primitives::transaction::components::Amount;
|
|||
|
||||
use crate::orchard_ffi::{error, CppStreamReader, CppStreamWriter, ReadCb, StreamObj, WriteCb};
|
||||
|
||||
pub const MERKLE_DEPTH: u8 = 32;
|
||||
|
||||
//
|
||||
// Operations on Merkle frontiers.
|
||||
//
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_empty(
|
||||
) -> *mut bridgetree::Frontier<OrchardIncrementalTreeDigest> {
|
||||
let empty_tree = bridgetree::Frontier::new(32);
|
||||
) -> *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH> {
|
||||
let empty_tree = bridgetree::Frontier::<OrchardIncrementalTreeDigest, MERKLE_DEPTH>::new();
|
||||
Box::into_raw(Box::new(empty_tree))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_clone(
|
||||
tree: *const bridgetree::Frontier<OrchardIncrementalTreeDigest>,
|
||||
) -> *mut bridgetree::Frontier<OrchardIncrementalTreeDigest> {
|
||||
tree: *const bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) -> *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH> {
|
||||
unsafe { tree.as_ref() }
|
||||
.map(|tree| Box::into_raw(Box::new(tree.clone())))
|
||||
.unwrap_or(std::ptr::null_mut())
|
||||
|
@ -33,7 +35,7 @@ pub extern "C" fn orchard_merkle_frontier_clone(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_free(
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) {
|
||||
if !tree.is_null() {
|
||||
drop(unsafe { Box::from_raw(tree) });
|
||||
|
@ -44,7 +46,7 @@ pub extern "C" fn orchard_merkle_frontier_free(
|
|||
pub extern "C" fn orchard_merkle_frontier_parse(
|
||||
stream: Option<StreamObj>,
|
||||
read_cb: Option<ReadCb>,
|
||||
) -> *mut bridgetree::Frontier<OrchardIncrementalTreeDigest> {
|
||||
) -> *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH> {
|
||||
let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap());
|
||||
|
||||
match bincode::deserialize_from(reader) {
|
||||
|
@ -58,7 +60,7 @@ pub extern "C" fn orchard_merkle_frontier_parse(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_serialize(
|
||||
tree: *const bridgetree::Frontier<OrchardIncrementalTreeDigest>,
|
||||
tree: *const bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
stream: Option<StreamObj>,
|
||||
write_cb: Option<WriteCb>,
|
||||
) -> bool {
|
||||
|
@ -79,7 +81,7 @@ pub extern "C" fn orchard_merkle_frontier_serialize(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_append_bundle(
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
bundle: *const orchard::Bundle<Authorized, Amount>,
|
||||
) -> bool {
|
||||
let tree = unsafe {
|
||||
|
@ -102,7 +104,7 @@ pub extern "C" fn orchard_merkle_frontier_append_bundle(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_root(
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
root_ret: *mut [u8; 32],
|
||||
) -> bool {
|
||||
let root_ret = unsafe {
|
||||
|
@ -124,7 +126,7 @@ pub extern "C" fn orchard_merkle_frontier_root(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn orchard_merkle_frontier_num_leaves(
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut bridgetree::Frontier<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) -> usize {
|
||||
unsafe { tree.as_ref() }
|
||||
.and_then(|t| t.position())
|
||||
|
@ -138,15 +140,15 @@ pub extern "C" fn orchard_merkle_frontier_num_leaves(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_empty(
|
||||
) -> *mut BridgeTree<OrchardIncrementalTreeDigest> {
|
||||
let empty_tree = BridgeTree::new(32, 100);
|
||||
) -> *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH> {
|
||||
let empty_tree = BridgeTree::<OrchardIncrementalTreeDigest, MERKLE_DEPTH>::new(100);
|
||||
Box::into_raw(Box::new(empty_tree))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_clone(
|
||||
tree: *const BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
) -> *mut BridgeTree<OrchardIncrementalTreeDigest> {
|
||||
tree: *const BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) -> *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH> {
|
||||
unsafe { tree.as_ref() }
|
||||
.map(|tree| Box::into_raw(Box::new(tree.clone())))
|
||||
.unwrap_or(std::ptr::null_mut())
|
||||
|
@ -154,7 +156,7 @@ pub extern "C" fn incremental_sinsemilla_tree_clone(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_free(
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) {
|
||||
if !tree.is_null() {
|
||||
drop(unsafe { Box::from_raw(tree) });
|
||||
|
@ -165,7 +167,7 @@ pub extern "C" fn incremental_sinsemilla_tree_free(
|
|||
pub extern "C" fn incremental_sinsemilla_tree_parse(
|
||||
stream: Option<StreamObj>,
|
||||
read_cb: Option<ReadCb>,
|
||||
) -> *mut BridgeTree<OrchardIncrementalTreeDigest> {
|
||||
) -> *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH> {
|
||||
let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap());
|
||||
|
||||
match bincode::deserialize_from(reader) {
|
||||
|
@ -179,7 +181,7 @@ pub extern "C" fn incremental_sinsemilla_tree_parse(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_serialize(
|
||||
tree: *const BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
tree: *const BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
stream: Option<StreamObj>,
|
||||
write_cb: Option<WriteCb>,
|
||||
) -> bool {
|
||||
|
@ -200,7 +202,7 @@ pub extern "C" fn incremental_sinsemilla_tree_serialize(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_append_bundle(
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
bundle: *const orchard::Bundle<Authorized, Amount>,
|
||||
) -> bool {
|
||||
let tree = unsafe {
|
||||
|
@ -223,7 +225,7 @@ pub extern "C" fn incremental_sinsemilla_tree_append_bundle(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_checkpoint(
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) {
|
||||
let tree = unsafe {
|
||||
tree.as_mut()
|
||||
|
@ -235,7 +237,7 @@ pub extern "C" fn incremental_sinsemilla_tree_checkpoint(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_rewind(
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
) -> bool {
|
||||
let tree = unsafe {
|
||||
tree.as_mut()
|
||||
|
@ -247,7 +249,7 @@ pub extern "C" fn incremental_sinsemilla_tree_rewind(
|
|||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn incremental_sinsemilla_tree_root(
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest>,
|
||||
tree: *mut BridgeTree<OrchardIncrementalTreeDigest, MERKLE_DEPTH>,
|
||||
root_ret: *mut [u8; 32],
|
||||
) -> bool {
|
||||
let root_ret = unsafe {
|
||||
|
@ -275,7 +277,7 @@ pub extern "C" fn incremental_sinsemilla_tree_empty_root(depth: usize, root_ret:
|
|||
.expect("Cannot return to the null pointer.")
|
||||
};
|
||||
|
||||
let altitude = Altitude::from(depth as u32);
|
||||
let altitude = Altitude::from(depth as u8);
|
||||
|
||||
let digest = OrchardIncrementalTreeDigest::empty_root(altitude)
|
||||
.to_bytes()
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -256,9 +256,6 @@ typedef libzcash::IncrementalWitness<INCREMENTAL_MERKLE_TREE_DEPTH_TESTING, libz
|
|||
typedef libzcash::IncrementalMerkleTree<SAPLING_INCREMENTAL_MERKLE_TREE_DEPTH, libzcash::PedersenHash> SaplingMerkleTree;
|
||||
typedef libzcash::IncrementalMerkleTree<INCREMENTAL_MERKLE_TREE_DEPTH_TESTING, libzcash::PedersenHash> SaplingTestingMerkleTree;
|
||||
|
||||
//typedef libzcash::IncrementalMerkleTree<ORCHARD_INCREMENTAL_MERKLE_TREE_DEPTH, libzcash::PedersenHash> OrchardMerkleTree;
|
||||
//typedef libzcash::IncrementalMerkleTree<INCREMENTAL_MERKLE_TREE_DEPTH_TESTING, libzcash::PedersenHash> OrchardTestingMerkleTree;
|
||||
|
||||
typedef libzcash::IncrementalWitness<SAPLING_INCREMENTAL_MERKLE_TREE_DEPTH, libzcash::PedersenHash> SaplingWitness;
|
||||
typedef libzcash::IncrementalWitness<INCREMENTAL_MERKLE_TREE_DEPTH_TESTING, libzcash::PedersenHash> SaplingTestingWitness;
|
||||
|
||||
|
|
Loading…
Reference in New Issue