Add Orchard merkle tree anchor tests.

This commit is contained in:
Kris Nuttycombe 2021-06-22 17:20:39 -06:00
parent 9569bfc291
commit 13fd4c9a1c
4 changed files with 5630 additions and 25 deletions

View File

@ -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);
}
}

View File

@ -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

View File

@ -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;