merkle_node.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. use std::{io, iter};
  2. use halo2_gadgets::primitives::sinsemilla::HashDomain;
  3. use incrementalmerkletree::{Altitude, Hashable};
  4. use lazy_static::lazy_static;
  5. use pasta_curves::{
  6. arithmetic::FieldExt,
  7. group::ff::{PrimeField, PrimeFieldBits},
  8. pallas,
  9. };
  10. use serde::{
  11. de::{Deserializer, Error},
  12. ser::Serializer,
  13. Deserialize, Serialize,
  14. };
  15. use subtle::{ConstantTimeEq, CtOption};
  16. use crate::{
  17. crypto::constants::{
  18. sinsemilla::{i2lebsp_k, MERKLE_CRH_PERSONALIZATION},
  19. L_ORCHARD_MERKLE, MERKLE_DEPTH_ORCHARD,
  20. },
  21. error::Result,
  22. serial::{Decodable, Encodable},
  23. };
  24. lazy_static! {
  25. static ref UNCOMMITTED_ORCHARD: pallas::Base = pallas::Base::from_u64(2);
  26. static ref EMPTY_ROOTS: Vec<MerkleNode> = {
  27. iter::empty()
  28. .chain(Some(MerkleNode::empty_leaf()))
  29. .chain((0..MERKLE_DEPTH_ORCHARD).scan(MerkleNode::empty_leaf(), |state, l| {
  30. let l = l as u8;
  31. *state = MerkleNode::combine(l.into(), state, state);
  32. Some(state.clone())
  33. }))
  34. .collect()
  35. };
  36. }
  37. #[derive(Debug, Clone, Eq)]
  38. pub struct MerkleNode(pub pallas::Base);
  39. impl MerkleNode {
  40. pub fn to_bytes(&self) -> [u8; 32] {
  41. self.0.to_repr()
  42. }
  43. pub fn from_bytes(bytes: &[u8; 32]) -> CtOption<Self> {
  44. pallas::Base::from_repr(*bytes).map(MerkleNode)
  45. }
  46. }
  47. impl Serialize for MerkleNode {
  48. fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
  49. self.to_bytes().serialize(serializer)
  50. }
  51. }
  52. impl<'de> Deserialize<'de> for MerkleNode {
  53. fn deserialize<D: Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
  54. let parsed = <[u8; 32]>::deserialize(deserializer)?;
  55. <Option<_>>::from(Self::from_bytes(&parsed)).ok_or_else(|| {
  56. Error::custom("Attempted to deserialize a non-canonical representation of a Pallas base field element")
  57. })
  58. }
  59. }
  60. impl std::cmp::PartialEq for MerkleNode {
  61. fn eq(&self, other: &Self) -> bool {
  62. self.0.ct_eq(&other.0).into()
  63. }
  64. }
  65. impl std::hash::Hash for MerkleNode {
  66. fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
  67. <Option<pallas::Base>>::from(self.0).map(|b| b.to_bytes()).hash(state)
  68. }
  69. }
  70. impl Hashable for MerkleNode {
  71. fn empty_leaf() -> Self {
  72. MerkleNode(*UNCOMMITTED_ORCHARD)
  73. }
  74. /// Implements `MerkleCRH^Orchard` as defined in
  75. /// <https://zips.z.cash/protocol/protocol.pdf#orchardmerklecrh>
  76. ///
  77. /// The layer with 2^n nodes is called "layer n":
  78. /// - leaves are at layer MERKLE_DEPTH_ORCHARD = 32;
  79. /// - the root is at layer 0.
  80. /// `l` is MERKLE_DEPTH_ORCHARD - layer - 1.
  81. /// - when hashing two leaves, we produce a node on the layer above the leaves, i.e. layer
  82. /// = 31, l = 0
  83. /// - when hashing to the final root, we produce the anchor with layer = 0, l = 31.
  84. fn combine(altitude: Altitude, left: &Self, right: &Self) -> Self {
  85. // MerkleCRH Sinsemilla hash domain.
  86. let domain = HashDomain::new(MERKLE_CRH_PERSONALIZATION);
  87. MerkleNode(
  88. domain
  89. .hash(
  90. iter::empty()
  91. .chain(i2lebsp_k(altitude.into()).iter().copied())
  92. .chain(left.0.to_le_bits().iter().by_val().take(L_ORCHARD_MERKLE))
  93. .chain(right.0.to_le_bits().iter().by_val().take(L_ORCHARD_MERKLE)),
  94. )
  95. .unwrap_or(pallas::Base::zero()),
  96. )
  97. }
  98. fn empty_root(altitude: Altitude) -> Self {
  99. EMPTY_ROOTS[<usize>::from(altitude)].clone()
  100. }
  101. }
  102. impl Encodable for MerkleNode {
  103. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  104. self.0.encode(&mut s)
  105. }
  106. }
  107. impl Decodable for MerkleNode {
  108. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  109. Ok(Self(Decodable::decode(&mut d)?))
  110. }
  111. }