1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use crate::note::TRANSPARENT_BLINDER;
use crate::{BlsScalar, JubJubScalar};
use crate::{Crossover, Error, Fee, Note, NoteType, Remainder};
use core::convert::TryFrom;
use dusk_jubjub::{GENERATOR_EXTENDED, GENERATOR_NUMS_EXTENDED};
use dusk_poseidon::cipher::PoseidonCipher;
impl From<(Fee, Crossover)> for Note {
fn from((fee, crossover): (Fee, Crossover)) -> Note {
let Fee {
stealth_address, ..
} = fee;
let Crossover {
value_commitment,
nonce,
encrypted_data,
..
} = crossover;
let note_type = NoteType::Obfuscated;
let pos = u64::MAX;
Note {
note_type,
value_commitment,
nonce,
stealth_address,
pos,
encrypted_data,
}
}
}
impl TryFrom<Note> for (Fee, Crossover) {
type Error = Error;
fn try_from(note: Note) -> Result<Self, Self::Error> {
match note.note_type {
NoteType::Obfuscated => {
let gas_limit = 0;
let gas_price = 0;
let Note {
stealth_address,
value_commitment,
nonce,
encrypted_data,
..
} = note;
Ok((
Fee {
gas_limit,
gas_price,
stealth_address,
},
Crossover {
value_commitment,
nonce,
encrypted_data,
},
))
}
_ => Err(Error::InvalidNoteConversion),
}
}
}
impl From<Remainder> for Note {
fn from(remainder: Remainder) -> Note {
let note_type = NoteType::Transparent;
let pos = u64::MAX;
let stealth_address = remainder.stealth_address;
let value = remainder.gas_changes;
let nonce = JubJubScalar::zero();
let value_commitment = JubJubScalar::from(value);
let value_commitment = (GENERATOR_EXTENDED * value_commitment)
+ (GENERATOR_NUMS_EXTENDED * TRANSPARENT_BLINDER);
let encrypted_data = {
let zero = TRANSPARENT_BLINDER.into();
let mut encrypted_data = [zero; PoseidonCipher::cipher_size()];
encrypted_data[0] = BlsScalar::from(value);
PoseidonCipher::new(encrypted_data)
};
Note {
note_type,
value_commitment,
nonce,
stealth_address,
pos,
encrypted_data,
}
}
}