Skip to content

Commit 6482ec6

Browse files
committed
circuit tests pass
1 parent 32919f4 commit 6482ec6

3 files changed

Lines changed: 106 additions & 27 deletions

File tree

zk-id/src/lib.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ pub mod verifying_key;
3131
pub mod zk_id {
3232

3333
use groth16_solana::decompression::{decompress_g1, decompress_g2};
34-
use light_hasher::hash_to_field_size::{
35-
hashv_to_bn254_field_size_be_array, hashv_to_bn254_field_size_be_const_array,
36-
};
37-
use light_sdk::instruction::account_info::CompressedAccountInfoTrait;
34+
use light_hasher::hash_to_field_size::hashv_to_bn254_field_size_be_const_array;
3835

3936
use super::*;
4037

zk-id/src/verifying_key.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
use groth16_solana::groth16::Groth16Verifyingkey;
22

33
pub const VERIFYINGKEY: Groth16Verifyingkey = Groth16Verifyingkey {
4-
nr_pubinputs: 5,
4+
nr_pubinputs: 7,
55

66
vk_alpha_g1: [45u8, 77u8, 154u8, 167u8, 227u8, 2u8, 217u8, 223u8, 65u8, 116u8, 157u8, 85u8, 7u8, 148u8, 157u8, 5u8, 219u8, 234u8, 51u8, 251u8, 177u8, 108u8, 100u8, 59u8, 34u8, 245u8, 153u8, 162u8, 190u8, 109u8, 242u8, 226u8, 20u8, 190u8, 221u8, 80u8, 60u8, 55u8, 206u8, 176u8, 97u8, 216u8, 236u8, 96u8, 32u8, 159u8, 227u8, 69u8, 206u8, 137u8, 131u8, 10u8, 25u8, 35u8, 3u8, 1u8, 240u8, 118u8, 202u8, 255u8, 0u8, 77u8, 25u8, 38u8],
77

88
vk_beta_g2: [9u8, 103u8, 3u8, 47u8, 203u8, 247u8, 118u8, 209u8, 175u8, 201u8, 133u8, 248u8, 136u8, 119u8, 241u8, 130u8, 211u8, 132u8, 128u8, 166u8, 83u8, 242u8, 222u8, 202u8, 169u8, 121u8, 76u8, 188u8, 59u8, 243u8, 6u8, 12u8, 14u8, 24u8, 120u8, 71u8, 173u8, 76u8, 121u8, 131u8, 116u8, 208u8, 214u8, 115u8, 43u8, 245u8, 1u8, 132u8, 125u8, 214u8, 139u8, 192u8, 224u8, 113u8, 36u8, 30u8, 2u8, 19u8, 188u8, 127u8, 193u8, 61u8, 183u8, 171u8, 48u8, 76u8, 251u8, 209u8, 224u8, 138u8, 112u8, 74u8, 153u8, 245u8, 232u8, 71u8, 217u8, 63u8, 140u8, 60u8, 170u8, 253u8, 222u8, 196u8, 107u8, 122u8, 13u8, 55u8, 157u8, 166u8, 154u8, 77u8, 17u8, 35u8, 70u8, 167u8, 23u8, 57u8, 193u8, 177u8, 164u8, 87u8, 168u8, 199u8, 49u8, 49u8, 35u8, 210u8, 77u8, 47u8, 145u8, 146u8, 248u8, 150u8, 183u8, 198u8, 62u8, 234u8, 5u8, 169u8, 213u8, 127u8, 6u8, 84u8, 122u8, 208u8, 206u8, 200u8],
99

1010
vk_gamma_g2: [25u8, 142u8, 147u8, 147u8, 146u8, 13u8, 72u8, 58u8, 114u8, 96u8, 191u8, 183u8, 49u8, 251u8, 93u8, 37u8, 241u8, 170u8, 73u8, 51u8, 53u8, 169u8, 231u8, 18u8, 151u8, 228u8, 133u8, 183u8, 174u8, 243u8, 18u8, 194u8, 24u8, 0u8, 222u8, 239u8, 18u8, 31u8, 30u8, 118u8, 66u8, 106u8, 0u8, 102u8, 94u8, 92u8, 68u8, 121u8, 103u8, 67u8, 34u8, 212u8, 247u8, 94u8, 218u8, 221u8, 70u8, 222u8, 189u8, 92u8, 217u8, 146u8, 246u8, 237u8, 9u8, 6u8, 137u8, 208u8, 88u8, 95u8, 240u8, 117u8, 236u8, 158u8, 153u8, 173u8, 105u8, 12u8, 51u8, 149u8, 188u8, 75u8, 49u8, 51u8, 112u8, 179u8, 142u8, 243u8, 85u8, 172u8, 218u8, 220u8, 209u8, 34u8, 151u8, 91u8, 18u8, 200u8, 94u8, 165u8, 219u8, 140u8, 109u8, 235u8, 74u8, 171u8, 113u8, 128u8, 141u8, 203u8, 64u8, 143u8, 227u8, 209u8, 231u8, 105u8, 12u8, 67u8, 211u8, 123u8, 76u8, 230u8, 204u8, 1u8, 102u8, 250u8, 125u8, 170u8],
1111

12-
vk_delta_g2: [21u8, 161u8, 226u8, 221u8, 72u8, 190u8, 228u8, 85u8, 167u8, 57u8, 40u8, 128u8, 233u8, 193u8, 56u8, 244u8, 90u8, 177u8, 76u8, 127u8, 110u8, 35u8, 192u8, 135u8, 248u8, 147u8, 123u8, 6u8, 82u8, 96u8, 152u8, 142u8, 5u8, 98u8, 80u8, 250u8, 68u8, 190u8, 236u8, 147u8, 117u8, 119u8, 6u8, 249u8, 231u8, 131u8, 151u8, 3u8, 124u8, 255u8, 52u8, 31u8, 214u8, 91u8, 122u8, 81u8, 9u8, 115u8, 1u8, 223u8, 246u8, 145u8, 39u8, 16u8, 41u8, 213u8, 50u8, 227u8, 149u8, 29u8, 90u8, 38u8, 20u8, 83u8, 126u8, 34u8, 163u8, 166u8, 38u8, 118u8, 51u8, 124u8, 246u8, 42u8, 84u8, 201u8, 143u8, 244u8, 248u8, 211u8, 159u8, 102u8, 121u8, 202u8, 46u8, 227u8, 29u8, 54u8, 160u8, 253u8, 118u8, 218u8, 40u8, 236u8, 47u8, 85u8, 49u8, 203u8, 185u8, 186u8, 146u8, 191u8, 175u8, 137u8, 235u8, 52u8, 151u8, 255u8, 224u8, 95u8, 96u8, 13u8, 224u8, 83u8, 157u8, 224u8, 66u8, 106u8],
12+
vk_delta_g2: [9u8, 182u8, 194u8, 239u8, 134u8, 104u8, 17u8, 202u8, 241u8, 205u8, 236u8, 6u8, 64u8, 221u8, 138u8, 78u8, 208u8, 85u8, 135u8, 216u8, 232u8, 200u8, 74u8, 214u8, 161u8, 211u8, 86u8, 224u8, 135u8, 47u8, 46u8, 240u8, 38u8, 202u8, 49u8, 185u8, 86u8, 166u8, 237u8, 191u8, 36u8, 87u8, 88u8, 80u8, 198u8, 160u8, 109u8, 103u8, 206u8, 197u8, 9u8, 85u8, 251u8, 84u8, 0u8, 84u8, 122u8, 107u8, 207u8, 52u8, 170u8, 159u8, 6u8, 177u8, 21u8, 151u8, 177u8, 91u8, 211u8, 112u8, 141u8, 188u8, 194u8, 178u8, 84u8, 152u8, 215u8, 15u8, 37u8, 232u8, 8u8, 128u8, 55u8, 244u8, 130u8, 210u8, 243u8, 190u8, 138u8, 238u8, 202u8, 71u8, 154u8, 54u8, 179u8, 121u8, 17u8, 162u8, 164u8, 61u8, 219u8, 107u8, 133u8, 200u8, 103u8, 133u8, 194u8, 207u8, 92u8, 76u8, 90u8, 59u8, 18u8, 156u8, 221u8, 232u8, 230u8, 81u8, 95u8, 123u8, 189u8, 63u8, 188u8, 156u8, 163u8, 5u8, 108u8, 75u8],
1313

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

zk-id/tests/circuit.rs

Lines changed: 95 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use groth16_solana::groth16::Groth16Verifier;
33
use groth16_solana::proof_parser::circom_prover::{convert_proof, convert_public_inputs};
44
use light_compressed_account::compressed_account::{CompressedAccount, CompressedAccountData};
55
use light_compressed_account::Pubkey;
6-
use light_hasher::{hash_to_field_size::hash_to_bn254_field_size_be, Poseidon};
6+
use light_hasher::{hash_to_field_size::hash_to_bn254_field_size_be, Hasher, Poseidon, Sha256};
77
use light_merkle_tree_reference::MerkleTree;
88
use num_bigint::BigUint;
99
use std::collections::HashMap;
@@ -24,25 +24,44 @@ use zk_id::verifying_key::VERIFYINGKEY;
2424
/// * `compressed_account` - The compressed account to convert to circuit inputs
2525
/// * `merkle_tree_pubkey` - The public key of the Merkle tree
2626
/// * `leaf_index` - The index of the leaf in the Merkle tree
27+
/// * `issuer_pubkey` - The issuer's public key
28+
/// * `credential_pubkey` - The credential public key (private input)
29+
/// * `encrypted_data` - The encrypted data
2730
fn add_compressed_account_to_circuit_inputs(
2831
inputs: &mut HashMap<String, Vec<String>>,
2932
compressed_account: &CompressedAccount,
3033
merkle_tree_pubkey: &Pubkey,
3134
leaf_index: u32,
35+
issuer_pubkey: &Pubkey,
36+
credential_pubkey: &Pubkey,
37+
encrypted_data: &[u8],
3238
) {
3339
// Extract data from compressed account
3440
let owner = compressed_account.owner;
35-
let (discriminator, data_hash) = if let Some(ref data) = compressed_account.data {
36-
(data.discriminator, data.data_hash)
41+
let discriminator = if let Some(ref data) = compressed_account.data {
42+
data.discriminator
3743
} else {
38-
([0u8; 8], [0u8; 32])
44+
[0u8; 8]
3945
};
4046

41-
// Hash owner and merkle tree pubkey for circuit - the circuit expects hashed values
47+
// Hash values for circuit
4248
let owner_hashed = hash_to_bn254_field_size_be(owner.as_ref());
4349
let merkle_tree_hashed = hash_to_bn254_field_size_be(merkle_tree_pubkey.as_ref());
50+
let issuer_hashed = hash_to_bn254_field_size_be(issuer_pubkey.as_ref());
51+
let credential_pubkey_hashed = hash_to_bn254_field_size_be(credential_pubkey.as_ref());
4452

45-
// Add all compressed account inputs to the HashMap
53+
// Hash encrypted_data with SHA256 and truncate (set first byte to 0)
54+
let mut encrypted_data_hash = Sha256::hash(encrypted_data).unwrap();
55+
encrypted_data_hash[0] = 0;
56+
57+
// Compute public_data_hash (hash of issuer and credential pubkey)
58+
let public_data_hash = Poseidon::hashv(&[
59+
issuer_hashed.as_slice(),
60+
credential_pubkey_hashed.as_slice(),
61+
])
62+
.unwrap();
63+
64+
// Add all inputs to the HashMap
4665
inputs.insert(
4766
"owner_hashed".to_string(),
4867
vec![BigUint::from_bytes_be(&owner_hashed).to_string()],
@@ -57,8 +76,24 @@ fn add_compressed_account_to_circuit_inputs(
5776
vec![BigUint::from_bytes_be(&discriminator).to_string()],
5877
);
5978
inputs.insert(
60-
"data_hash".to_string(),
61-
vec![BigUint::from_bytes_be(&data_hash).to_string()],
79+
"issuer_hashed".to_string(),
80+
vec![BigUint::from_bytes_be(&issuer_hashed).to_string()],
81+
);
82+
inputs.insert(
83+
"credential_pubkey_hashed".to_string(),
84+
vec![BigUint::from_bytes_be(&credential_pubkey_hashed).to_string()],
85+
);
86+
inputs.insert(
87+
"encrypted_data_hash".to_string(),
88+
vec![BigUint::from_bytes_be(&encrypted_data_hash).to_string()],
89+
);
90+
inputs.insert(
91+
"public_encrypted_data_hash".to_string(),
92+
vec![BigUint::from_bytes_be(&encrypted_data_hash).to_string()],
93+
);
94+
inputs.insert(
95+
"public_data_hash".to_string(),
96+
vec![BigUint::from_bytes_be(&public_data_hash).to_string()],
6297
);
6398
}
6499

@@ -92,10 +127,22 @@ fn add_merkle_proof_to_circuit_inputs(
92127
fn test_compressed_account_merkle_proof_circuit() {
93128
let zkey_path = "./build/compressed_account_merkle_proof_final.zkey".to_string();
94129

95-
// Create compressed account
130+
// Create test data
96131
let owner = Pubkey::new_from_array([1u8; 32]);
97132
let merkle_tree_pubkey = Pubkey::new_from_array([2u8; 32]);
98133
let leaf_index: u32 = 0;
134+
let issuer_pubkey = Pubkey::new_from_array([4u8; 32]);
135+
let credential_pubkey = Pubkey::new_from_array([5u8; 32]);
136+
let encrypted_data = vec![6u8; 64];
137+
138+
// Compute data_hash as hash of issuer and credential
139+
let issuer_hashed = hash_to_bn254_field_size_be(issuer_pubkey.as_ref());
140+
let credential_pubkey_hashed = hash_to_bn254_field_size_be(credential_pubkey.as_ref());
141+
let data_hash = Poseidon::hashv(&[
142+
issuer_hashed.as_slice(),
143+
credential_pubkey_hashed.as_slice(),
144+
])
145+
.unwrap();
99146

100147
let compressed_account = CompressedAccount {
101148
owner,
@@ -104,7 +151,7 @@ fn test_compressed_account_merkle_proof_circuit() {
104151
data: Some(CompressedAccountData {
105152
discriminator: [1u8; 8],
106153
data: vec![],
107-
data_hash: [3u8; 32],
154+
data_hash,
108155
}),
109156
};
110157

@@ -128,6 +175,9 @@ fn test_compressed_account_merkle_proof_circuit() {
128175
&compressed_account,
129176
&merkle_tree_pubkey,
130177
leaf_index,
178+
&issuer_pubkey,
179+
&credential_pubkey,
180+
&encrypted_data,
131181
);
132182
add_merkle_proof_to_circuit_inputs(&mut proof_inputs, &merkle_proof_hashes, &merkle_root);
133183

@@ -151,10 +201,22 @@ fn test_compressed_account_merkle_proof_circuit() {
151201
fn test_invalid_proof_rejected() {
152202
let zkey_path = "./build/compressed_account_merkle_proof_final.zkey".to_string();
153203

154-
// Create compressed account
204+
// Create test data
155205
let owner = Pubkey::new_from_array([1u8; 32]);
156206
let merkle_tree_pubkey = Pubkey::new_from_array([2u8; 32]);
157207
let leaf_index: u32 = 0;
208+
let issuer_pubkey = Pubkey::new_from_array([4u8; 32]);
209+
let credential_pubkey = Pubkey::new_from_array([5u8; 32]);
210+
let encrypted_data = vec![6u8; 64];
211+
212+
// Compute data_hash as hash of issuer and credential
213+
let issuer_hashed = hash_to_bn254_field_size_be(issuer_pubkey.as_ref());
214+
let credential_pubkey_hashed = hash_to_bn254_field_size_be(credential_pubkey.as_ref());
215+
let data_hash = Poseidon::hashv(&[
216+
issuer_hashed.as_slice(),
217+
credential_pubkey_hashed.as_slice(),
218+
])
219+
.unwrap();
158220

159221
let compressed_account = CompressedAccount {
160222
owner,
@@ -163,7 +225,7 @@ fn test_invalid_proof_rejected() {
163225
data: Some(CompressedAccountData {
164226
discriminator: [1u8; 8],
165227
data: vec![],
166-
data_hash: [3u8; 32],
228+
data_hash,
167229
}),
168230
};
169231

@@ -185,6 +247,9 @@ fn test_invalid_proof_rejected() {
185247
&compressed_account,
186248
&merkle_tree_pubkey,
187249
leaf_index,
250+
&issuer_pubkey,
251+
&credential_pubkey,
252+
&encrypted_data,
188253
);
189254

190255
let invalid_root = [0u8; 32];
@@ -211,10 +276,22 @@ fn test_invalid_proof_rejected() {
211276
fn test_groth16_solana_verification() {
212277
let zkey_path = "./build/compressed_account_merkle_proof_final.zkey".to_string();
213278

214-
// Create compressed account
279+
// Create test data
215280
let owner = Pubkey::new_from_array([1u8; 32]);
216281
let merkle_tree_pubkey = Pubkey::new_from_array([2u8; 32]);
217282
let leaf_index: u32 = 0;
283+
let issuer_pubkey = Pubkey::new_from_array([4u8; 32]);
284+
let credential_pubkey = Pubkey::new_from_array([5u8; 32]);
285+
let encrypted_data = vec![6u8; 64];
286+
287+
// Compute data_hash as hash of issuer and credential
288+
let issuer_hashed = hash_to_bn254_field_size_be(issuer_pubkey.as_ref());
289+
let credential_pubkey_hashed = hash_to_bn254_field_size_be(credential_pubkey.as_ref());
290+
let data_hash = Poseidon::hashv(&[
291+
issuer_hashed.as_slice(),
292+
credential_pubkey_hashed.as_slice(),
293+
])
294+
.unwrap();
218295

219296
let compressed_account = CompressedAccount {
220297
owner,
@@ -223,7 +300,7 @@ fn test_groth16_solana_verification() {
223300
data: Some(CompressedAccountData {
224301
discriminator: [1u8; 8],
225302
data: vec![],
226-
data_hash: [3u8; 32],
303+
data_hash,
227304
}),
228305
};
229306

@@ -247,6 +324,9 @@ fn test_groth16_solana_verification() {
247324
&compressed_account,
248325
&merkle_tree_pubkey,
249326
leaf_index,
327+
&issuer_pubkey,
328+
&credential_pubkey,
329+
&encrypted_data,
250330
);
251331
add_merkle_proof_to_circuit_inputs(&mut proof_inputs, &merkle_proof_hashes, &merkle_root);
252332

@@ -267,7 +347,7 @@ fn test_groth16_solana_verification() {
267347

268348
// Convert proof and public inputs to groth16-solana format
269349
let (proof_a, proof_b, proof_c) = convert_proof(&proof.proof).expect("Failed to convert proof");
270-
let public_inputs: [[u8; 32]; 5] = convert_public_inputs(&proof.pub_inputs);
350+
let public_inputs: [[u8; 32]; 7] = convert_public_inputs(&proof.pub_inputs);
271351

272352
// Verify with groth16-solana
273353
let mut verifier =

0 commit comments

Comments
 (0)