merkle_node.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. use bitvec::{order::Lsb0, view::AsBits};
  2. use ff::PrimeField;
  3. use group::Curve;
  4. use lazy_static::lazy_static;
  5. use std::io;
  6. use super::{coin::Coin, merkle::Hashable};
  7. use crate::{
  8. error::Result,
  9. serial::{Decodable, Encodable},
  10. };
  11. pub const SAPLING_COMMITMENT_TREE_DEPTH: usize = 6;
  12. /// Compute a parent node in the Sapling commitment tree given its two children.
  13. pub fn merkle_hash(depth: usize, lhs: &[u8; 32], rhs: &[u8; 32]) -> bls12_381::Scalar {
  14. // This thing is nasty lol
  15. let lhs = {
  16. let mut tmp = [false; 256];
  17. for (a, b) in tmp.iter_mut().zip(lhs.as_bits::<Lsb0>()) {
  18. *a = *b;
  19. }
  20. tmp
  21. };
  22. let rhs = {
  23. let mut tmp = [false; 256];
  24. for (a, b) in tmp.iter_mut().zip(rhs.as_bits::<Lsb0>()) {
  25. *a = *b;
  26. }
  27. tmp
  28. };
  29. jubjub::ExtendedPoint::from(zcash_primitives::pedersen_hash::pedersen_hash(
  30. zcash_primitives::pedersen_hash::Personalization::MerkleTree(depth),
  31. lhs.iter()
  32. .copied()
  33. .take(bls12_381::Scalar::NUM_BITS as usize)
  34. .chain(
  35. rhs.iter()
  36. .copied()
  37. .take(bls12_381::Scalar::NUM_BITS as usize),
  38. ),
  39. ))
  40. .to_affine()
  41. .get_u()
  42. }
  43. pub fn hash_coin(coin: &[u8; 32]) -> bls12_381::Scalar {
  44. let rhs = {
  45. let mut tmp = [false; 256];
  46. for (a, b) in tmp.iter_mut().zip(coin.as_bits::<Lsb0>()) {
  47. *a = *b;
  48. }
  49. tmp
  50. };
  51. jubjub::ExtendedPoint::from(zcash_primitives::pedersen_hash::pedersen_hash(
  52. zcash_primitives::pedersen_hash::Personalization::NoteCommitment,
  53. rhs.iter().copied(),
  54. ))
  55. .to_affine()
  56. .get_u()
  57. }
  58. /// A node within the Sapling commitment tree.
  59. #[derive(Clone, Copy, Debug, PartialEq)]
  60. pub struct MerkleNode {
  61. pub repr: [u8; 32],
  62. }
  63. impl MerkleNode {
  64. pub fn new(repr: [u8; 32]) -> Self {
  65. Self { repr }
  66. }
  67. pub fn from_coin(coin: &Coin) -> Self {
  68. Self {
  69. repr: hash_coin(&coin.repr).to_repr(),
  70. }
  71. }
  72. }
  73. impl Hashable for MerkleNode {
  74. fn read<R: io::Read>(mut reader: R) -> io::Result<Self> {
  75. let mut repr = [0u8; 32];
  76. reader.read_exact(&mut repr)?;
  77. Ok(Self::new(repr))
  78. }
  79. fn write<W: io::Write>(&self, mut writer: W) -> io::Result<()> {
  80. writer.write_all(self.repr.as_ref())
  81. }
  82. fn combine(depth: usize, lhs: &Self, rhs: &Self) -> Self {
  83. Self {
  84. repr: merkle_hash(depth, &lhs.repr, &rhs.repr).to_repr(),
  85. }
  86. }
  87. fn blank() -> Self {
  88. // The smallest u-coordinate that is not on the curve
  89. // is one.
  90. let uncommitted_note = bls12_381::Scalar::one();
  91. Self {
  92. repr: uncommitted_note.to_repr(),
  93. }
  94. }
  95. fn empty_root(depth: usize) -> Self {
  96. EMPTY_ROOTS[depth]
  97. }
  98. }
  99. impl From<MerkleNode> for bls12_381::Scalar {
  100. fn from(node: MerkleNode) -> Self {
  101. bls12_381::Scalar::from_repr(node.repr).expect("Tree nodes should be in the prime field")
  102. }
  103. }
  104. impl Encodable for MerkleNode {
  105. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  106. Ok(self.repr.encode(s)?)
  107. }
  108. }
  109. impl Decodable for MerkleNode {
  110. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  111. Ok(Self {
  112. repr: Decodable::decode(d)?,
  113. })
  114. }
  115. }
  116. lazy_static! {
  117. static ref EMPTY_ROOTS: Vec<MerkleNode> = {
  118. let mut v = vec![MerkleNode::blank()];
  119. for d in 0..SAPLING_COMMITMENT_TREE_DEPTH {
  120. let next = MerkleNode::combine(d, &v[d], &v[d]);
  121. v.push(next);
  122. }
  123. v
  124. };
  125. }