partial.rs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. use bellman::groth16;
  2. use bls12_381::Bls12;
  3. use std::io;
  4. use super::TransactionOutput;
  5. use crate::crypto::SpendRevealedValues;
  6. use crate::error::Result;
  7. use crate::impl_vec;
  8. use crate::serial::{Decodable, Encodable, VarInt};
  9. pub struct PartialTransaction {
  10. pub clear_inputs: Vec<PartialTransactionClearInput>,
  11. pub inputs: Vec<PartialTransactionInput>,
  12. pub outputs: Vec<TransactionOutput>,
  13. }
  14. pub struct PartialTransactionClearInput {
  15. pub value: u64,
  16. pub asset_id: u64,
  17. pub valcom_blind: jubjub::Fr,
  18. pub asset_commit_blind: jubjub::Fr,
  19. pub signature_public: jubjub::SubgroupPoint,
  20. }
  21. pub struct PartialTransactionInput {
  22. pub spend_proof: groth16::Proof<Bls12>,
  23. pub revealed: SpendRevealedValues,
  24. }
  25. impl Encodable for PartialTransaction {
  26. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  27. let mut len = 0;
  28. len += self.clear_inputs.encode(&mut s)?;
  29. len += self.inputs.encode(&mut s)?;
  30. len += self.outputs.encode(s)?;
  31. Ok(len)
  32. }
  33. }
  34. impl Decodable for PartialTransaction {
  35. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  36. Ok(Self {
  37. clear_inputs: Decodable::decode(&mut d)?,
  38. inputs: Decodable::decode(&mut d)?,
  39. outputs: Decodable::decode(d)?,
  40. })
  41. }
  42. }
  43. impl Encodable for PartialTransactionClearInput {
  44. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  45. let mut len = 0;
  46. len += self.value.encode(&mut s)?;
  47. len += self.asset_id.encode(&mut s)?;
  48. len += self.valcom_blind.encode(&mut s)?;
  49. len += self.asset_commit_blind.encode(&mut s)?;
  50. len += self.signature_public.encode(&mut s)?;
  51. Ok(len)
  52. }
  53. }
  54. impl Decodable for PartialTransactionClearInput {
  55. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  56. Ok(Self {
  57. value: Decodable::decode(&mut d)?,
  58. asset_id: Decodable::decode(&mut d)?,
  59. valcom_blind: Decodable::decode(&mut d)?,
  60. asset_commit_blind: Decodable::decode(&mut d)?,
  61. signature_public: Decodable::decode(&mut d)?,
  62. })
  63. }
  64. }
  65. impl Encodable for PartialTransactionInput {
  66. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  67. let mut len = 0;
  68. len += self.spend_proof.encode(&mut s)?;
  69. len += self.revealed.encode(s)?;
  70. Ok(len)
  71. }
  72. }
  73. impl Decodable for PartialTransactionInput {
  74. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  75. Ok(Self {
  76. spend_proof: Decodable::decode(&mut d)?,
  77. revealed: Decodable::decode(d)?,
  78. })
  79. }
  80. }
  81. impl_vec!(PartialTransactionClearInput);
  82. impl_vec!(PartialTransactionInput);