fixed_bases.rs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use halo2_gadgets::ecc::{
  2. chip::{compute_lagrange_coeffs, NUM_WINDOWS, NUM_WINDOWS_SHORT},
  3. FixedPoints, H,
  4. };
  5. use pasta_curves::pallas;
  6. pub mod commit_ivk_r;
  7. pub mod note_commit_r;
  8. pub mod nullifier_k;
  9. pub mod spend_auth_g;
  10. pub mod value_commit_r;
  11. pub mod value_commit_v;
  12. /// SWU hash-to-curve personalization for the value commitment generator
  13. pub const VALUE_COMMITMENT_PERSONALIZATION: &str = "z.cash:Orchard-cv";
  14. /// SWU hash-to-curve value for the value commitment generator
  15. pub const VALUE_COMMITMENT_R_BYTES: [u8; 1] = *b"r";
  16. /// SWU hash-to-curve value for the value commitment generator
  17. pub const VALUE_COMMITMENT_V_BYTES: [u8; 1] = *b"v";
  18. #[derive(Copy, Clone, Debug, Eq, PartialEq)]
  19. pub enum OrchardFixedBases {
  20. CommitIvkR,
  21. NoteCommitR,
  22. ValueCommitR,
  23. SpendAuthG,
  24. NullifierK,
  25. ValueCommitV,
  26. }
  27. impl FixedPoints<pallas::Affine> for OrchardFixedBases {
  28. fn generator(&self) -> pallas::Affine {
  29. match self {
  30. OrchardFixedBases::CommitIvkR => commit_ivk_r::generator(),
  31. OrchardFixedBases::NoteCommitR => note_commit_r::generator(),
  32. OrchardFixedBases::ValueCommitR => value_commit_r::generator(),
  33. OrchardFixedBases::SpendAuthG => spend_auth_g::generator(),
  34. OrchardFixedBases::NullifierK => nullifier_k::generator(),
  35. OrchardFixedBases::ValueCommitV => value_commit_v::generator(),
  36. }
  37. }
  38. fn u(&self) -> Vec<[[u8; 32]; H]> {
  39. match self {
  40. OrchardFixedBases::CommitIvkR => commit_ivk_r::U.to_vec(),
  41. OrchardFixedBases::NoteCommitR => note_commit_r::U.to_vec(),
  42. OrchardFixedBases::ValueCommitR => value_commit_r::U.to_vec(),
  43. OrchardFixedBases::SpendAuthG => spend_auth_g::U.to_vec(),
  44. OrchardFixedBases::NullifierK => nullifier_k::U.to_vec(),
  45. OrchardFixedBases::ValueCommitV => value_commit_v::U_SHORT.to_vec(),
  46. }
  47. }
  48. fn z(&self) -> Vec<u64> {
  49. match self {
  50. OrchardFixedBases::CommitIvkR => commit_ivk_r::Z.to_vec(),
  51. OrchardFixedBases::NoteCommitR => note_commit_r::Z.to_vec(),
  52. OrchardFixedBases::ValueCommitR => value_commit_r::Z.to_vec(),
  53. OrchardFixedBases::SpendAuthG => spend_auth_g::Z.to_vec(),
  54. OrchardFixedBases::NullifierK => nullifier_k::Z.to_vec(),
  55. OrchardFixedBases::ValueCommitV => value_commit_v::Z_SHORT.to_vec(),
  56. }
  57. }
  58. fn lagrange_coeffs(&self) -> Vec<[pallas::Base; H]> {
  59. match self {
  60. OrchardFixedBases::ValueCommitV => {
  61. compute_lagrange_coeffs(self.generator(), NUM_WINDOWS_SHORT)
  62. }
  63. _ => compute_lagrange_coeffs(self.generator(), NUM_WINDOWS),
  64. }
  65. }
  66. }