diff --git a/orchard_note.py b/orchard_note.py new file mode 100644 index 0000000..6a402bd --- /dev/null +++ b/orchard_note.py @@ -0,0 +1,61 @@ +import struct + +from orchard_commitments import value_commit, rcv_trapdoor, note_commit +from orchard_key_components import diversify_hash, prf_expand, derive_nullifier, FullViewingKey, SpendingKey +from orchard_pallas import Point, Scalar +from orchard_utils import to_base, to_scalar + +from utils import leos2bsp + +class OrchardNote(object): + def __init__(self, d, pk_d, v, rho, rseed): + self.d = d + self.pk_d = pk_d + self.v = v + self.rho = rho + self.rseed = rseed + self.rcm = self.rcm(rho) + self.psi = self.psi(rho) + + def rcm(self, rho): + return to_scalar(prf_expand(bytes(self.rseed), b'\x05' + bytes(rho))) + + def psi(self, rho): + return to_base(prf_expand(bytes(self.rseed), b'\x09' + bytes(rho))) + + def note_plaintext(self, memo): + return OrchardNotePlaintext(self.d, self.v, self.rseed, memo) + +# https://zips.z.cash/protocol/nu5.pdf#notept +class OrchardNotePlaintext(object): + def __init__(self, d, v, rseed, memo): + self.leadbyte = b'0x02' + self.d = d + self.v = v + self.rseed = rseed + self.memo = memo + + def __bytes__(self): + return ( + self.leadbyte + + self.d + + struct.pack('