fixed with unified approach

This commit is contained in:
jonesmarvin8 2026-01-27 16:00:42 -05:00
parent ffe1034c0d
commit 752ad89ac7
8 changed files with 82 additions and 522 deletions

View File

@ -19,40 +19,7 @@
],
"initial_commitments": [
{
"npk": [
63,
202,
178,
231,
183,
82,
237,
212,
216,
221,
215,
255,
153,
101,
177,
161,
254,
210,
128,
122,
54,
190,
230,
151,
183,
64,
225,
229,
113,
1,
228,
97
],
"npk": [13, 25, 40, 5, 198, 248, 210, 248, 237, 121, 124, 145, 186, 142, 253, 216, 236, 69, 193, 32, 166, 167, 49, 133, 172, 111, 159, 46, 84, 17, 157, 23],
"account": {
"program_owner": [
0,
@ -70,40 +37,7 @@
}
},
{
"npk": [
192,
251,
166,
243,
167,
236,
84,
249,
35,
136,
130,
172,
219,
225,
161,
139,
229,
89,
243,
125,
194,
213,
209,
30,
23,
174,
100,
244,
124,
74,
140,
47
],
"npk": [32, 67, 72, 164, 106, 53, 66, 239, 141, 15, 52, 230, 136, 177, 2, 236, 207, 243, 134, 135, 210, 143, 87, 232, 215, 128, 194, 120, 113, 224, 4, 165],
"account": {
"program_owner": [
0,
@ -155,4 +89,4 @@
37,
37
]
}
}

View File

@ -87,7 +87,7 @@
},
{
"Private": {
"account_id": "HPA6RHTmRUTf2D49UHrsejkFZkeME8oxqZtSfWBCdyfE",
"account_id": "2ECgkFTaXzwjJBXR7ZKmXYQtpHbvTTHK9Auma4NL9AUo",
"account": {
"program_owner": [
0,
@ -104,19 +104,19 @@
"nonce": 0
},
"key_chain": {
"secret_spending_key": [196, 236, 51, 176, 156, 24, 26, 234, 21, 244, 173, 27, 4, 252, 99, 166, 106, 160, 56, 106, 122, 118, 63, 29, 37, 252, 121, 201, 139, 148, 219, 67],
"secret_spending_key": [112, 17, 152, 192, 217, 201, 142, 92, 111, 68, 85, 222, 107, 73, 78, 196, 118, 226, 37, 17, 185, 177, 149, 182, 9, 85, 187, 152, 163, 144, 68, 121],
"private_key_holder": {
"nullifier_secret_key": [82, 238, 58, 161, 96, 201, 25, 193, 53, 101, 100, 173, 183, 167, 165, 141, 252, 214, 214, 3, 176, 186, 62, 112, 56, 54, 6, 197, 29, 178, 88, 214],
"viewing_secret_key": [14, 114, 31, 116, 147, 114, 62, 111, 176, 100, 211, 68, 38, 47, 250, 34, 224, 249, 25, 40, 35, 37, 237, 224, 161, 58, 228, 154, 44, 162, 128, 138]
"nullifier_secret_key": [52, 33, 235, 245, 42, 132, 163, 182, 114, 56, 144, 187, 147, 23, 184, 227, 128, 12, 180, 142, 217, 110, 188, 177, 155, 141, 23, 127, 216, 185, 33, 126],
"viewing_secret_key": [44, 81, 165, 166, 34, 188, 192, 240, 40, 9, 83, 189, 215, 184, 246, 154, 247, 227, 155, 16, 121, 238, 4, 245, 63, 135, 192, 213, 222, 247, 120, 86]
},
"nullifer_public_key": [40, 104, 183, 124, 101, 11, 61, 45, 140, 53, 3, 155, 139, 134, 105, 108, 60, 229, 165, 195, 187, 246, 14, 88, 76, 69, 137, 154, 29, 113, 205, 153],
"viewing_public_key": [3, 243, 200, 219, 91, 171, 128, 76, 173, 117, 255, 212, 233, 71, 205, 204, 89, 104, 92, 187, 249, 154, 197, 102, 241, 66, 15, 55, 194, 189, 16, 124, 176]
"nullifer_public_key": [13, 25, 40, 5, 198, 248, 210, 248, 237, 121, 124, 145, 186, 142, 253, 216, 236, 69, 193, 32, 166, 167, 49, 133, 172, 111, 159, 46, 84, 17, 157, 23],
"viewing_public_key": [3, 43, 116, 165, 161, 27, 150, 158, 175, 198, 215, 27, 121, 126, 158, 224, 249, 92, 168, 163, 173, 115, 120, 122, 89, 173, 133, 94, 39, 238, 62, 52, 193]
}
}
},
{
"Private": {
"account_id": "4k4Wsbzqs4vLw9QsCEturGKfdmG8rMT4XrTh3mZqnV5i",
"account_id": "E8HwiTyQe4H9HK7icTvn95HQMnzx49mP9A2ddtMLpNaN",
"account": {
"program_owner": [
0,
@ -133,13 +133,13 @@
"nonce": 0
},
"key_chain": {
"secret_spending_key": [19, 36, 184, 185, 157, 16, 188, 150, 54, 162, 211, 113, 17, 169, 24, 125, 238, 91, 162, 221, 128, 149, 11, 141, 0, 93, 110, 29, 156, 164, 155, 48],
"secret_spending_key": [48, 175, 124, 10, 230, 240, 166, 14, 249, 254, 157, 226, 208, 124, 122, 177, 203, 139, 192, 180, 43, 120, 55, 151, 50, 21, 113, 22, 254, 83, 148, 56],
"private_key_holder": {
"nullifier_secret_key": [218, 3, 90, 97, 159, 247, 176, 10, 94, 11, 208, 181, 85, 241, 221, 57, 27, 85, 42, 1, 154, 208, 107, 186, 151, 43, 58, 61, 53, 70, 138, 41],
"viewing_secret_key": [91, 28, 90, 197, 47, 25, 7, 211, 201, 30, 15, 145, 46, 138, 226, 186, 154, 228, 137, 179, 205, 64, 235, 29, 9, 61, 210, 118, 244, 24, 236, 37]
"nullifier_secret_key": [99, 82, 190, 140, 234, 10, 61, 163, 15, 211, 179, 54, 70, 166, 87, 5, 182, 68, 117, 244, 217, 23, 99, 9, 4, 177, 230, 125, 109, 91, 160, 30],
"viewing_secret_key": [205, 32, 76, 251, 255, 236, 96, 119, 61, 111, 65, 100, 75, 218, 12, 22, 17, 170, 55, 226, 21, 154, 161, 34, 208, 74, 27, 1, 119, 13, 88, 128]
},
"nullifer_public_key": [2, 9, 93, 209, 212, 58, 34, 166, 27, 192, 143, 112, 169, 89, 134, 247, 95, 226, 219, 238, 35, 43, 35, 154, 237, 153, 158, 118, 214, 211, 74, 247],
"viewing_public_key": [3, 123, 93, 15, 99, 185, 28, 149, 2, 31, 8, 86, 2, 253, 198, 171, 160, 145, 116, 162, 138, 96, 160, 34, 69, 137, 193, 254, 230, 13, 83, 18, 170]
"nullifer_public_key": [32, 67, 72, 164, 106, 53, 66, 239, 141, 15, 52, 230, 136, 177, 2, 236, 207, 243, 134, 135, 210, 143, 87, 232, 215, 128, 194, 120, 113, 224, 4, 165],
"viewing_public_key": [2, 79, 110, 46, 203, 29, 206, 205, 18, 86, 27, 189, 104, 103, 113, 181, 110, 53, 78, 172, 11, 171, 190, 18, 126, 214, 81, 77, 192, 154, 58, 195, 238]
}
}
}

View File

@ -24,8 +24,8 @@ pub const TIME_TO_WAIT_FOR_BLOCK_SECONDS: u64 = 12;
pub const ACC_SENDER: &str = "BLgCRDXYdQPMMWVHYRFGQZbgeHx9frkipa8GtpG2Syqy";
pub const ACC_RECEIVER: &str = "Gj1mJy5W7J5pfmLRujmQaLfLMWidNxQ6uwnhb666ZwHw";
pub const ACC_SENDER_PRIVATE: &str = "3oCG8gqdKLMegw4rRfyaMQvuPHpcASt7xwttsmnZLSkw";
pub const ACC_RECEIVER_PRIVATE: &str = "AKTcXgJ1xoynta1Ec7y6Jso1z1JQtHqd7aPQ1h9er6xX";
pub const ACC_SENDER_PRIVATE: &str = "2ECgkFTaXzwjJBXR7ZKmXYQtpHbvTTHK9Auma4NL9AUo";
pub const ACC_RECEIVER_PRIVATE: &str = "E8HwiTyQe4H9HK7icTvn95HQMnzx49mP9A2ddtMLpNaN";
pub const NSSA_PROGRAM_FOR_TEST_DATA_CHANGER: &str = "data_changer.bin";

View File

@ -1,8 +1,6 @@
use common::HashType;
use k256::{Scalar, elliptic_curve::PrimeField};
use nssa_core::{NullifierPublicKey, encryption::ViewingPublicKey};
use serde::{Deserialize, Serialize};
use sha2::{Digest, digest::FixedOutput};
use crate::key_management::{
KeyChain,
@ -31,21 +29,10 @@ impl KeyNode for ChildKeysPrivate {
.last_chunk::<32>()
.expect("hash_value is 64 bytes, must be safe to get last 32");
// TODO: check these generations
let nsk = ssk.generate_nullifier_secret_key();
let vsk = ssk.generate_viewing_secret_key();
let npk: NullifierPublicKey = {
let mut hasher = sha2::Sha256::new();
hasher.update("LEE/keys");
hasher.update(nsk);
hasher.update([7u8]);
hasher.update([0u8; 23]);
NullifierPublicKey(<HashType>::from(hasher.finalize_fixed()))
};
let nsk = ssk.generate_nullifier_secret_key(None);
let vsk = ssk.generate_viewing_secret_key(None);
let npk = NullifierPublicKey::from(&nsk);
let vpk = ViewingPublicKey::from_scalar(vsk);
Self {
@ -89,20 +76,10 @@ impl KeyNode for ChildKeysPrivate {
.last_chunk::<32>()
.expect("hash_value is 64 bytes, must be safe to get last 32");
let nsk = ssk.generate_child_nullifier_secret_key(cci);
let vsk = ssk.generate_child_viewing_secret_key(cci);
let npk: NullifierPublicKey = {
let mut hasher = sha2::Sha256::new();
hasher.update("LEE/chain");
hasher.update(nsk);
hasher.update([7u8]);
hasher.update([0u8; 22]);
NullifierPublicKey(<HashType>::from(hasher.finalize_fixed()))
};
let nsk = ssk.generate_nullifier_secret_key(Some(cci));
let vsk = ssk.generate_viewing_secret_key(Some(cci));
let npk = NullifierPublicKey::from(&nsk);
let vpk = ViewingPublicKey::from_scalar(vsk);
Self {
@ -221,22 +198,21 @@ mod tests {
];
let expected_nsk: NullifierSecretKey = [
82, 238, 58, 161, 96, 201, 25, 193, 53, 101, 100, 173, 183, 167, 165, 141, 252, 214,
214, 3, 176, 186, 62, 112, 56, 54, 6, 197, 29, 178, 88, 214,
19, 100, 119, 73, 191, 225, 234, 219, 129, 88, 40, 229, 63, 225, 189, 136, 69, 172,
221, 186, 147, 83, 150, 207, 70, 17, 228, 70, 113, 87, 227, 31,
];
let expected_npk: NullifierPublicKey = nssa_core::NullifierPublicKey([
40, 104, 183, 124, 101, 11, 61, 45, 140, 53, 3, 155, 139, 134, 105, 108, 60, 229, 165,
195, 187, 246, 14, 88, 76, 69, 137, 154, 29, 113, 205, 153,
133, 235, 223, 151, 12, 69, 26, 222, 60, 125, 235, 125, 167, 212, 201, 168, 101, 242,
111, 239, 1, 228, 12, 252, 146, 53, 75, 17, 187, 255, 122, 181,
]);
let expected_vsk: ViewingSecretKey = [
14, 114, 31, 116, 147, 114, 62, 111, 176, 100, 211, 68, 38, 47, 250, 34, 224, 249, 25,
40, 35, 37, 237, 224, 161, 58, 228, 154, 44, 162, 128, 138,
218, 219, 193, 132, 160, 6, 178, 194, 139, 248, 199, 81, 17, 133, 37, 201, 58, 104, 49,
222, 187, 46, 156, 93, 14, 118, 209, 243, 38, 101, 77, 45,
];
let expected_vpk_as_bytes: [u8; 33] = [
3, 243, 200, 219, 91, 171, 128, 76, 173, 117, 255, 212, 233, 71, 205, 204, 89, 104, 92,
187, 249, 154, 197, 102, 241, 66, 15, 55, 194, 189, 16, 124, 176,
3, 164, 65, 167, 88, 167, 179, 51, 159, 27, 241, 174, 77, 174, 142, 106, 128, 96, 69,
74, 117, 231, 42, 193, 235, 153, 206, 116, 102, 7, 101, 192, 45,
];
assert!(expected_ccc == child_node.ccc);

View File

@ -27,7 +27,7 @@ impl KeyChain {
let seed_holder = SeedHolder::new_os_random();
let secret_spending_key = seed_holder.produce_top_secret_key_holder();
let private_key_holder = secret_spending_key.produce_private_key_holder();
let private_key_holder = secret_spending_key.produce_private_key_holder(None);
let nullifer_public_key = private_key_holder.generate_nullifier_public_key();
let viewing_public_key = private_key_holder.generate_viewing_public_key();
@ -46,7 +46,7 @@ impl KeyChain {
let seed_holder = SeedHolder::new_mnemonic(passphrase);
let secret_spending_key = seed_holder.produce_top_secret_key_holder();
let private_key_holder = secret_spending_key.produce_private_key_holder();
let private_key_holder = secret_spending_key.produce_private_key_holder(None);
let nullifer_public_key = private_key_holder.generate_nullifier_public_key();
let viewing_public_key = private_key_holder.generate_viewing_public_key();
@ -64,7 +64,7 @@ impl KeyChain {
ephemeral_public_key_sender: EphemeralPublicKey,
) -> SharedSecretKey {
SharedSecretKey::new(
&self.secret_spending_key.generate_viewing_secret_key(),
&self.secret_spending_key.generate_viewing_secret_key(None),
&ephemeral_public_key_sender,
)
}
@ -110,7 +110,7 @@ mod tests {
let seed_holder = SeedHolder::new_os_random();
let top_secret_key_holder = seed_holder.produce_top_secret_key_holder();
let utxo_secret_key_holder = top_secret_key_holder.produce_private_key_holder();
let utxo_secret_key_holder = top_secret_key_holder.produce_private_key_holder(None);
let nullifer_public_key = utxo_secret_key_holder.generate_nullifier_public_key();
let viewing_public_key = utxo_secret_key_holder.generate_viewing_public_key();

View File

@ -74,70 +74,52 @@ impl SeedHolder {
}
impl SecretSpendingKey {
pub fn generate_nullifier_secret_key(&self) -> NullifierSecretKey {
let mut hasher = sha2::Sha256::new();
pub fn generate_nullifier_secret_key(&self, index: Option<u32>) -> NullifierSecretKey {
let index = match index {
None => 0u32,
_ => index.expect("Expect a valid u32"),
};
hasher.update("LEE/keys");
const PREFIX: &[u8; 8] = b"LEE/keys";
const SUFFIX_1: &[u8; 1] = &[1];
const SUFFIX_2: &[u8; 19] = &[0; 19];
let mut hasher = sha2::Sha256::new();
hasher.update(PREFIX);
hasher.update(self.0);
hasher.update([1u8]);
hasher.update([0u8; 23]);
hasher.update(SUFFIX_1);
hasher.update(index.to_le_bytes());
hasher.update(SUFFIX_2);
<NullifierSecretKey>::from(hasher.finalize_fixed())
}
pub fn generate_viewing_secret_key(&self) -> ViewingSecretKey {
let mut hasher = sha2::Sha256::new();
pub fn generate_viewing_secret_key(&self, index: Option<u32>) -> ViewingSecretKey {
let index = match index {
None => 0u32,
_ => index.expect("Expect a valid u32"),
};
const PREFIX: &[u8; 8] = b"LEE/keys";
const SUFFIX_1: &[u8; 1] = &[2];
const SUFFIX_2: &[u8; 19] = &[0; 19];
hasher.update("LEE/keys");
let mut hasher = sha2::Sha256::new();
hasher.update(PREFIX);
hasher.update(self.0);
hasher.update([2u8]);
hasher.update([0u8; 23]);
hasher.update(SUFFIX_1);
hasher.update(index.to_le_bytes());
hasher.update(SUFFIX_2);
<HashType>::from(hasher.finalize_fixed())
}
pub fn produce_private_key_holder(&self) -> PrivateKeyHolder {
// TODO: this should use index
pub fn produce_private_key_holder(&self, index: Option<u32>) -> PrivateKeyHolder {
PrivateKeyHolder {
nullifier_secret_key: self.generate_nullifier_secret_key(),
viewing_secret_key: self.generate_viewing_secret_key(),
nullifier_secret_key: self.generate_nullifier_secret_key(index),
viewing_secret_key: self.generate_viewing_secret_key(index),
}
}
pub fn generate_child_nullifier_secret_key(&self, cci: u32) -> NullifierSecretKey {
let mut key = vec![];
key.extend_from_slice(b"LEE/chain");
let mut input = vec![];
input.extend_from_slice(&self.0);
input.extend_from_slice(&[1u8]);
input.extend_from_slice(&cci.to_le_bytes());
input.extend_from_slice(&[0u8; 22]);
let hash_value = hmac_sha512::HMAC::mac(input, key);
*hash_value
.first_chunk::<32>()
.expect("hash_value is 64 bytes, must be safe to get first 32")
}
pub fn generate_child_viewing_secret_key(&self, cci: u32) -> ViewingSecretKey {
let mut key = vec![];
key.extend_from_slice(b"LEE/chain");
let mut input = vec![];
input.extend_from_slice(&self.0);
input.extend_from_slice(&[2u8]);
input.extend_from_slice(&cci.to_le_bytes());
input.extend_from_slice(&[0u8; 22]);
let hash_value = hmac_sha512::HMAC::mac(input, key);
*hash_value
.first_chunk::<32>()
.expect("hash_value is 64 bytes, must be safe to get first 32")
}
}
impl PrivateKeyHolder {
@ -179,7 +161,7 @@ mod tests {
let top_secret_key_holder = seed_holder.produce_top_secret_key_holder();
let _ = top_secret_key_holder.generate_viewing_secret_key();
let _ = top_secret_key_holder.generate_viewing_secret_key(None);
}
#[test]

View File

@ -29,9 +29,9 @@ impl AsRef<[u8]> for NullifierPublicKey {
impl From<&NullifierSecretKey> for NullifierPublicKey {
fn from(value: &NullifierSecretKey) -> Self {
let mut bytes = Vec::new();
const PREFIX: &[u8; 9] = b"LEE/chain";
const PREFIX: &[u8; 8] = b"LEE/keys";
const SUFFIX_1: &[u8; 1] = &[7];
const SUFFIX_2: &[u8; 22] = &[0; 22];
const SUFFIX_2: &[u8; 23] = &[0; 23];
bytes.extend_from_slice(PREFIX);
bytes.extend_from_slice(value);
bytes.extend_from_slice(SUFFIX_1);

View File

@ -84,9 +84,9 @@
]
}
},
{
{
"Private": {
"account_id": "3oCG8gqdKLMegw4rRfyaMQvuPHpcASt7xwttsmnZLSkw",
"account_id": "2ECgkFTaXzwjJBXR7ZKmXYQtpHbvTTHK9Auma4NL9AUo",
"account": {
"program_owner": [
0,
@ -103,185 +103,19 @@
"nonce": 0
},
"key_chain": {
"secret_spending_key": [
251,
82,
235,
1,
146,
96,
30,
81,
162,
234,
33,
15,
123,
129,
116,
0,
84,
136,
176,
70,
190,
224,
161,
54,
134,
142,
154,
1,
18,
251,
242,
189
],
"secret_spending_key": [112, 17, 152, 192, 217, 201, 142, 92, 111, 68, 85, 222, 107, 73, 78, 196, 118, 226, 37, 17, 185, 177, 149, 182, 9, 85, 187, 152, 163, 144, 68, 121],
"private_key_holder": {
"nullifier_secret_key": [
29,
250,
10,
187,
35,
123,
180,
250,
246,
97,
216,
153,
44,
156,
16,
93,
241,
26,
174,
219,
72,
84,
34,
247,
112,
101,
217,
243,
189,
173,
75,
20
],
"viewing_secret_key": [
251,
201,
22,
154,
100,
165,
218,
108,
163,
190,
135,
91,
145,
84,
69,
241,
46,
117,
217,
110,
197,
248,
91,
193,
14,
104,
88,
103,
67,
153,
182,
158
]
"nullifier_secret_key": [52, 33, 235, 245, 42, 132, 163, 182, 114, 56, 144, 187, 147, 23, 184, 227, 128, 12, 180, 142, 217, 110, 188, 177, 155, 141, 23, 127, 216, 185, 33, 126],
"viewing_secret_key": [44, 81, 165, 166, 34, 188, 192, 240, 40, 9, 83, 189, 215, 184, 246, 154, 247, 227, 155, 16, 121, 238, 4, 245, 63, 135, 192, 213, 222, 247, 120, 86]
},
"nullifer_public_key": [
63,
202,
178,
231,
183,
82,
237,
212,
216,
221,
215,
255,
153,
101,
177,
161,
254,
210,
128,
122,
54,
190,
230,
151,
183,
64,
225,
229,
113,
1,
228,
97
],
"viewing_public_key": [
3,
235,
139,
131,
237,
177,
122,
189,
6,
177,
167,
178,
202,
117,
246,
58,
28,
65,
132,
79,
220,
139,
119,
243,
187,
160,
212,
121,
61,
247,
116,
72,
205
]
"nullifer_public_key": [13, 25, 40, 5, 198, 248, 210, 248, 237, 121, 124, 145, 186, 142, 253, 216, 236, 69, 193, 32, 166, 167, 49, 133, 172, 111, 159, 46, 84, 17, 157, 23],
"viewing_public_key": [3, 43, 116, 165, 161, 27, 150, 158, 175, 198, 215, 27, 121, 126, 158, 224, 249, 92, 168, 163, 173, 115, 120, 122, 89, 173, 133, 94, 39, 238, 62, 52, 193]
}
}
},
{
"Private": {
"account_id": "AKTcXgJ1xoynta1Ec7y6Jso1z1JQtHqd7aPQ1h9er6xX",
"account_id": "E8HwiTyQe4H9HK7icTvn95HQMnzx49mP9A2ddtMLpNaN",
"account": {
"program_owner": [
0,
@ -298,179 +132,13 @@
"nonce": 0
},
"key_chain": {
"secret_spending_key": [
238,
171,
241,
69,
111,
217,
85,
64,
19,
82,
18,
189,
32,
91,
78,
175,
107,
7,
109,
60,
52,
44,
243,
230,
72,
244,
192,
92,
137,
33,
118,
254
],
"secret_spending_key": [48, 175, 124, 10, 230, 240, 166, 14, 249, 254, 157, 226, 208, 124, 122, 177, 203, 139, 192, 180, 43, 120, 55, 151, 50, 21, 113, 22, 254, 83, 148, 56],
"private_key_holder": {
"nullifier_secret_key": [
25,
211,
215,
119,
57,
223,
247,
37,
245,
144,
122,
29,
118,
245,
83,
228,
23,
9,
101,
120,
88,
33,
238,
207,
128,
61,
110,
2,
89,
62,
164,
13
],
"viewing_secret_key": [
193,
181,
14,
196,
142,
84,
15,
65,
128,
101,
70,
196,
241,
47,
130,
221,
23,
146,
161,
237,
221,
40,
19,
126,
59,
15,
169,
236,
25,
105,
104,
231
]
"nullifier_secret_key": [99, 82, 190, 140, 234, 10, 61, 163, 15, 211, 179, 54, 70, 166, 87, 5, 182, 68, 117, 244, 217, 23, 99, 9, 4, 177, 230, 125, 109, 91, 160, 30],
"viewing_secret_key": [205, 32, 76, 251, 255, 236, 96, 119, 61, 111, 65, 100, 75, 218, 12, 22, 17, 170, 55, 226, 21, 154, 161, 34, 208, 74, 27, 1, 119, 13, 88, 128]
},
"nullifer_public_key": [
192,
251,
166,
243,
167,
236,
84,
249,
35,
136,
130,
172,
219,
225,
161,
139,
229,
89,
243,
125,
194,
213,
209,
30,
23,
174,
100,
244,
124,
74,
140,
47
],
"viewing_public_key": [
2,
181,
98,
93,
216,
241,
241,
110,
58,
198,
119,
174,
250,
184,
1,
204,
200,
173,
44,
238,
37,
247,
170,
156,
100,
254,
116,
242,
28,
183,
187,
77,
255
]
"nullifer_public_key": [32, 67, 72, 164, 106, 53, 66, 239, 141, 15, 52, 230, 136, 177, 2, 236, 207, 243, 134, 135, 210, 143, 87, 232, 215, 128, 194, 120, 113, 224, 4, 165],
"viewing_public_key": [2, 79, 110, 46, 203, 29, 206, 205, 18, 86, 27, 189, 104, 103, 113, 181, 110, 53, 78, 172, 11, 171, 190, 18, 126, 214, 81, 77, 192, 154, 58, 195, 238]
}
}
}