partial.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 signature_public: jubjub::SubgroupPoint,
  19. }
  20. pub struct PartialTransactionInput {
  21. pub spend_proof: groth16::Proof<Bls12>,
  22. pub revealed: SpendRevealedValues,
  23. }
  24. impl Encodable for PartialTransaction {
  25. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  26. let mut len = 0;
  27. len += self.clear_inputs.encode(&mut s)?;
  28. len += self.inputs.encode(&mut s)?;
  29. len += self.outputs.encode(s)?;
  30. Ok(len)
  31. }
  32. }
  33. impl Decodable for PartialTransaction {
  34. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  35. Ok(Self {
  36. clear_inputs: Decodable::decode(&mut d)?,
  37. inputs: Decodable::decode(&mut d)?,
  38. outputs: Decodable::decode(d)?,
  39. })
  40. }
  41. }
  42. impl Encodable for PartialTransactionClearInput {
  43. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  44. let mut len = 0;
  45. len += self.value.encode(&mut s)?;
  46. len += self.asset_id.encode(&mut s)?;
  47. len += self.valcom_blind.encode(&mut s)?;
  48. len += self.signature_public.encode(&mut s)?;
  49. Ok(len)
  50. }
  51. }
  52. impl Decodable for PartialTransactionClearInput {
  53. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  54. Ok(Self {
  55. value: Decodable::decode(&mut d)?,
  56. asset_id: Decodable::decode(&mut d)?,
  57. valcom_blind: Decodable::decode(&mut d)?,
  58. signature_public: Decodable::decode(&mut d)?,
  59. })
  60. }
  61. }
  62. impl Encodable for PartialTransactionInput {
  63. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  64. let mut len = 0;
  65. len += self.spend_proof.encode(&mut s)?;
  66. len += self.revealed.encode(s)?;
  67. Ok(len)
  68. }
  69. }
  70. impl Decodable for PartialTransactionInput {
  71. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  72. Ok(Self {
  73. spend_proof: Decodable::decode(&mut d)?,
  74. revealed: Decodable::decode(d)?,
  75. })
  76. }
  77. }
  78. impl_vec!(PartialTransactionClearInput);
  79. impl_vec!(PartialTransactionInput);