Use manual serialization for Merkle frontiers rather than bincode.

This commit is contained in:
Kris Nuttycombe 2021-07-12 16:11:09 -06:00
parent 4e93c62368
commit a61318ec85
3 changed files with 112 additions and 48 deletions

111
Cargo.lock generated
View File

@ -10,7 +10,19 @@ checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561"
dependencies = [ dependencies = [
"aes-soft", "aes-soft",
"aesni", "aesni",
"cipher", "cipher 0.2.5",
]
[[package]]
name = "aes"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "495ee669413bfbe9e8cace80f4d3d78e6d8c8d99579f97fb93bde351b185f2d4"
dependencies = [
"cfg-if 1.0.0",
"cipher 0.3.0",
"cpufeatures",
"opaque-debug",
] ]
[[package]] [[package]]
@ -19,7 +31,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072"
dependencies = [ dependencies = [
"cipher", "cipher 0.2.5",
"opaque-debug", "opaque-debug",
] ]
@ -29,7 +41,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce"
dependencies = [ dependencies = [
"cipher", "cipher 0.2.5",
"opaque-debug", "opaque-debug",
] ]
@ -137,15 +149,6 @@ dependencies = [
"crunchy", "crunchy",
] ]
[[package]]
name = "bincode"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "bip0039" name = "bip0039"
version = "0.8.0" version = "0.8.0"
@ -216,7 +219,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0"
dependencies = [ dependencies = [
"block-padding", "block-padding",
"cipher", "cipher 0.2.5",
]
[[package]]
name = "block-modes"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e"
dependencies = [
"block-padding",
"cipher 0.3.0",
] ]
[[package]] [[package]]
@ -293,6 +306,15 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "cipher"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
dependencies = [
"generic-array",
]
[[package]] [[package]]
name = "constant_time_eq" name = "constant_time_eq"
version = "0.1.5" version = "0.1.5"
@ -546,7 +568,7 @@ checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
[[package]] [[package]]
name = "equihash" name = "equihash"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05"
dependencies = [ dependencies = [
"blake2b_simd", "blake2b_simd",
"byteorder", "byteorder",
@ -575,9 +597,23 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a25080721bbcd2cd4d765b7d607ea350425fa087ce53cd3e31afcacdab850352" checksum = "a25080721bbcd2cd4d765b7d607ea350425fa087ce53cd3e31afcacdab850352"
dependencies = [ dependencies = [
"aes", "aes 0.6.0",
"block-modes", "block-modes 0.7.0",
"num-bigint", "num-bigint 0.3.2",
"num-integer",
"num-traits",
]
[[package]]
name = "fpe"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf3e40fc9accc7218e082db8a75aeea244b8f5db73e591774ef93b4276365e6"
dependencies = [
"block-modes 0.8.1",
"cipher 0.3.0",
"libm",
"num-bigint 0.4.0",
"num-integer", "num-integer",
"num-traits", "num-traits",
] ]
@ -789,7 +825,7 @@ dependencies = [
[[package]] [[package]]
name = "incrementalmerkletree" name = "incrementalmerkletree"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zcash/incrementalmerkletree?rev=8b59049f1746827ffa3763efa8af948f680491d0#8b59049f1746827ffa3763efa8af948f680491d0" source = "git+https://github.com/zcash/incrementalmerkletree?rev=b7bd6246122a6e9ace8edb51553fbf5228906cbb#b7bd6246122a6e9ace8edb51553fbf5228906cbb"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -850,12 +886,17 @@ version = "0.2.98"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
[[package]]
name = "libm"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
[[package]] [[package]]
name = "librustzcash" name = "librustzcash"
version = "0.2.0" version = "0.2.0"
dependencies = [ dependencies = [
"bellman", "bellman",
"bincode",
"blake2b_simd", "blake2b_simd",
"blake2s_simd", "blake2s_simd",
"bls12_381", "bls12_381",
@ -1073,6 +1114,17 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "num-bigint"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.44" version = "0.1.44"
@ -1117,15 +1169,15 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]] [[package]]
name = "orchard" name = "orchard"
version = "0.0.0" version = "0.0.0"
source = "git+https://github.com/zcash/orchard.git?rev=8454f86d423edbf0b53a1d5d32df1c691f8b7188#8454f86d423edbf0b53a1d5d32df1c691f8b7188" source = "git+https://github.com/zcash/orchard.git?rev=d0baa18fc6105df4a7847de2b6dc50c5919b3123#d0baa18fc6105df4a7847de2b6dc50c5919b3123"
dependencies = [ dependencies = [
"aes", "aes 0.6.0",
"arrayvec 0.7.1", "arrayvec 0.7.1",
"bigint", "bigint",
"bitvec", "bitvec",
"blake2b_simd", "blake2b_simd",
"ff", "ff",
"fpe", "fpe 0.4.0",
"group", "group",
"halo2", "halo2",
"incrementalmerkletree", "incrementalmerkletree",
@ -1802,7 +1854,7 @@ dependencies = [
[[package]] [[package]]
name = "zcash_address" name = "zcash_address"
version = "0.0.0" version = "0.0.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05"
dependencies = [ dependencies = [
"bech32", "bech32",
"blake2b_simd", "blake2b_simd",
@ -1812,7 +1864,7 @@ dependencies = [
[[package]] [[package]]
name = "zcash_history" name = "zcash_history"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05"
dependencies = [ dependencies = [
"bigint", "bigint",
"blake2b_simd", "blake2b_simd",
@ -1822,7 +1874,7 @@ dependencies = [
[[package]] [[package]]
name = "zcash_note_encryption" name = "zcash_note_encryption"
version = "0.0.0" version = "0.0.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05"
dependencies = [ dependencies = [
"blake2b_simd", "blake2b_simd",
"byteorder", "byteorder",
@ -1836,9 +1888,9 @@ dependencies = [
[[package]] [[package]]
name = "zcash_primitives" name = "zcash_primitives"
version = "0.5.0" version = "0.5.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05"
dependencies = [ dependencies = [
"aes", "aes 0.7.4",
"bip0039", "bip0039",
"bitvec", "bitvec",
"blake2b_simd", "blake2b_simd",
@ -1848,9 +1900,10 @@ dependencies = [
"crypto_api_chachapoly", "crypto_api_chachapoly",
"equihash", "equihash",
"ff", "ff",
"fpe", "fpe 0.5.0",
"group", "group",
"hex", "hex",
"incrementalmerkletree",
"jubjub", "jubjub",
"lazy_static", "lazy_static",
"log", "log",
@ -1867,7 +1920,7 @@ dependencies = [
[[package]] [[package]]
name = "zcash_proofs" name = "zcash_proofs"
version = "0.5.0" version = "0.5.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05"
dependencies = [ dependencies = [
"bellman", "bellman",
"blake2b_simd", "blake2b_simd",

View File

@ -21,7 +21,6 @@ crate-type = ["staticlib"]
[dependencies] [dependencies]
bellman = "0.10" bellman = "0.10"
bincode = "1.3"
blake2b_simd = "0.5" blake2b_simd = "0.5"
blake2s_simd = "0.5" blake2s_simd = "0.5"
bls12_381 = "0.5" bls12_381 = "0.5"
@ -65,11 +64,11 @@ codegen-units = 1
[patch.crates-io] [patch.crates-io]
ed25519-zebra = { git = "https://github.com/ZcashFoundation/ed25519-zebra.git", rev = "d3512400227a362d08367088ffaa9bd4142a69c7" } ed25519-zebra = { git = "https://github.com/ZcashFoundation/ed25519-zebra.git", rev = "d3512400227a362d08367088ffaa9bd4142a69c7" }
halo2 = { git = "https://github.com/zcash/halo2.git", rev = "27c4187673a9c6ade13fbdbd4f20955530c22d7f" } halo2 = { git = "https://github.com/zcash/halo2.git", rev = "27c4187673a9c6ade13fbdbd4f20955530c22d7f" }
incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree", rev = "8b59049f1746827ffa3763efa8af948f680491d0" } incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree", rev = "b7bd6246122a6e9ace8edb51553fbf5228906cbb" }
jubjub = { git = "https://github.com/zkcrypto/jubjub.git", rev = "96ab4162b83303378eae32a326b54d88b75bffc2" } jubjub = { git = "https://github.com/zkcrypto/jubjub.git", rev = "96ab4162b83303378eae32a326b54d88b75bffc2" }
orchard = { git = "https://github.com/zcash/orchard.git", rev = "8454f86d423edbf0b53a1d5d32df1c691f8b7188" } orchard = { git = "https://github.com/zcash/orchard.git", rev = "d0baa18fc6105df4a7847de2b6dc50c5919b3123" }
zcash_address = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } zcash_address = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" }
zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" }
zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" }
zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" }
zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" }

View File

@ -1,14 +1,18 @@
use bincode;
use incrementalmerkletree::{ use incrementalmerkletree::{
bridgetree::{self, BridgeTree}, bridgetree::{self, BridgeTree},
Altitude, Frontier, Hashable, Tree, Altitude, Frontier, Hashable, Tree,
}; };
use std::convert::TryFrom;
use std::io;
use std::mem::size_of_val; use std::mem::size_of_val;
use std::ptr; use std::ptr;
use orchard::{bundle::Authorized, tree::MerkleCrhOrchardOutput}; use orchard::{bundle::Authorized, tree::MerkleCrhOrchardOutput};
use zcash_primitives::transaction::components::Amount; use zcash_primitives::{
merkle_tree::incremental::{read_frontier_v1, read_tree, write_frontier_v1, write_tree},
transaction::components::Amount,
};
use crate::orchard_ffi::{error, CppStreamReader, CppStreamWriter, ReadCb, StreamObj, WriteCb}; use crate::orchard_ffi::{error, CppStreamReader, CppStreamWriter, ReadCb, StreamObj, WriteCb};
@ -22,7 +26,7 @@ pub const MAX_CHECKPOINTS: usize = 100;
#[no_mangle] #[no_mangle]
pub extern "C" fn orchard_merkle_frontier_empty( pub extern "C" fn orchard_merkle_frontier_empty(
) -> *mut bridgetree::Frontier<MerkleCrhOrchardOutput, MERKLE_DEPTH> { ) -> *mut bridgetree::Frontier<MerkleCrhOrchardOutput, MERKLE_DEPTH> {
let empty_tree = bridgetree::Frontier::<MerkleCrhOrchardOutput, MERKLE_DEPTH>::new(); let empty_tree = bridgetree::Frontier::<MerkleCrhOrchardOutput, MERKLE_DEPTH>::empty();
Box::into_raw(Box::new(empty_tree)) Box::into_raw(Box::new(empty_tree))
} }
@ -51,7 +55,14 @@ pub extern "C" fn orchard_merkle_frontier_parse(
) -> *mut bridgetree::Frontier<MerkleCrhOrchardOutput, MERKLE_DEPTH> { ) -> *mut bridgetree::Frontier<MerkleCrhOrchardOutput, MERKLE_DEPTH> {
let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap()); let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap());
match bincode::deserialize_from(reader) { match read_frontier_v1(reader).and_then(|nf| {
bridgetree::Frontier::try_from(nf).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("Parsing resulted in an invalid Merkle frontier: {:?}", e),
)
})
}) {
Ok(parsed) => Box::into_raw(Box::new(parsed)), Ok(parsed) => Box::into_raw(Box::new(parsed)),
Err(e) => { Err(e) => {
error!("Failed to parse Orchard bundle: {}", e); error!("Failed to parse Orchard bundle: {}", e);
@ -62,17 +73,18 @@ pub extern "C" fn orchard_merkle_frontier_parse(
#[no_mangle] #[no_mangle]
pub extern "C" fn orchard_merkle_frontier_serialize( pub extern "C" fn orchard_merkle_frontier_serialize(
tree: *const bridgetree::Frontier<MerkleCrhOrchardOutput, MERKLE_DEPTH>, frontier: *const bridgetree::Frontier<MerkleCrhOrchardOutput, MERKLE_DEPTH>,
stream: Option<StreamObj>, stream: Option<StreamObj>,
write_cb: Option<WriteCb>, write_cb: Option<WriteCb>,
) -> bool { ) -> bool {
let tree = unsafe { let frontier = unsafe {
tree.as_ref() frontier
.as_ref()
.expect("Orchard note commitment tree pointer may not be null.") .expect("Orchard note commitment tree pointer may not be null.")
}; };
let writer = CppStreamWriter::from_raw_parts(stream, write_cb.unwrap()); let writer = CppStreamWriter::from_raw_parts(stream, write_cb.unwrap());
match bincode::serialize_into(writer, tree) { match write_frontier_v1(writer, frontier) {
Ok(()) => true, Ok(()) => true,
Err(e) => { Err(e) => {
error!("{}", e); error!("{}", e);
@ -130,7 +142,7 @@ pub extern "C" fn orchard_merkle_frontier_num_leaves(
.expect("Orchard note commitment tree pointer may not be null.") .expect("Orchard note commitment tree pointer may not be null.")
}; };
tree.position().map_or(0, |p| <usize>::from(p) + 1) tree.position().map_or(0, |p| (<u64>::from(p) + 1) as usize)
} }
#[no_mangle] #[no_mangle]
@ -182,7 +194,7 @@ pub extern "C" fn incremental_sinsemilla_tree_parse(
) -> *mut BridgeTree<MerkleCrhOrchardOutput, MERKLE_DEPTH> { ) -> *mut BridgeTree<MerkleCrhOrchardOutput, MERKLE_DEPTH> {
let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap()); let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap());
match bincode::deserialize_from(reader) { match read_tree(reader) {
Ok(parsed) => Box::into_raw(Box::new(parsed)), Ok(parsed) => Box::into_raw(Box::new(parsed)),
Err(e) => { Err(e) => {
error!("Failed to parse Orchard bundle: {}", e); error!("Failed to parse Orchard bundle: {}", e);
@ -203,7 +215,7 @@ pub extern "C" fn incremental_sinsemilla_tree_serialize(
}; };
let writer = CppStreamWriter::from_raw_parts(stream, write_cb.unwrap()); let writer = CppStreamWriter::from_raw_parts(stream, write_cb.unwrap());
match bincode::serialize_into(writer, tree) { match write_tree(writer, tree) {
Ok(()) => true, Ok(()) => true,
Err(e) => { Err(e) => {
error!("{}", e); error!("{}", e);