@aztec/accounts 0.75.0 → 0.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifacts/EcdsaKAccount.json +500 -500
- package/artifacts/EcdsaRAccount.json +364 -364
- package/artifacts/SchnorrAccount.json +743 -743
- package/artifacts/SchnorrSingleKeyAccount.json +121 -121
- package/package.json +8 -8
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.1+
|
|
3
|
+
"noir_version": "1.0.0-beta.1+3f8376928465907d",
|
|
4
4
|
"name": "SchnorrSingleKeyAccount",
|
|
5
5
|
"functions": [
|
|
6
|
+
{
|
|
7
|
+
"name": "sync_notes",
|
|
8
|
+
"is_unconstrained": true,
|
|
9
|
+
"custom_attributes": [],
|
|
10
|
+
"abi": {
|
|
11
|
+
"error_types": {
|
|
12
|
+
"17843811134343075018": {
|
|
13
|
+
"error_kind": "string",
|
|
14
|
+
"string": "Stack too deep"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"parameters": [],
|
|
18
|
+
"return_type": null
|
|
19
|
+
},
|
|
20
|
+
"bytecode": "H4sIAAAAAAAA/7WTyw7CIBBFqcUo0sTEx39MU0y7dOHafyCtLHVRN+766dZkJkyI0QVwEzJMgMNcHoXwKjBKESGCHDEqjAs2Xs7tjDnEqVbBvin5HRijvvhLWH+jkFnk4QPxM50/rJBzmTyfe6F913PTrF8J/z5y+af7y+l//8OzRq9bzCvh/8P4uvfXx/M2ij/SbJGc0ptoOwAqvkT+EvmhJBvn8w+Yb4Svj6KMqNO1tnaNdfZkh8H0dhfwP+KH/QbzqHp4zgQAAA==",
|
|
21
|
+
"debug_symbols": "bY/RCoMwDEX/Jc99SCqO6a/IkKpRCqWVWgdD/PfFIeI2X8K94eSSu0DHzTzU1vdhgrJawIXWJBu8uGVV0ETrnB3q8xpwG5R9+Gk0frNTMjFBeUMF7DsRd7nurWOR2ar+QEJCvbOidXHglOM1X9DBa8Iv/rGKfZpoTeN4f72ffXtqkl4j/5QaY2i5myNv9U7NZFaUK40SK9Fv",
|
|
22
|
+
"brillig_names": [
|
|
23
|
+
"sync_notes"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
6
26
|
{
|
|
7
27
|
"name": "entrypoint",
|
|
8
28
|
"is_unconstrained": false,
|
|
@@ -1792,7 +1812,7 @@
|
|
|
1792
1812
|
}
|
|
1793
1813
|
},
|
|
1794
1814
|
"bytecode": "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",
|
|
1795
|
-
"debug_symbols": "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",
|
|
1815
|
+
"debug_symbols": "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",
|
|
1796
1816
|
"brillig_names": [
|
|
1797
1817
|
"get_auth_witness",
|
|
1798
1818
|
"decompose_hint",
|
|
@@ -3438,7 +3458,7 @@
|
|
|
3438
3458
|
}
|
|
3439
3459
|
},
|
|
3440
3460
|
"bytecode": "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",
|
|
3441
|
-
"debug_symbols": "7Z3fjtzG0cXfRde6YHdX
|
|
3461
|
+
"debug_symbols": "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",
|
|
3442
3462
|
"brillig_names": [
|
|
3443
3463
|
"get_auth_witness",
|
|
3444
3464
|
"decompose_hint",
|
|
@@ -3450,116 +3470,6 @@
|
|
|
3450
3470
|
],
|
|
3451
3471
|
"verification_key": "AAAAAAAQAAAAAAAAAAAAFAAAAAAAAAAQAAAAAAADKLEBAAAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAAAAAAAAAACiPlV8hjnKRdGhPUZHUZgYpY1545ebNTWU7wnpm6YI1LSjJqLFoYUq6DVDUeGYw7cAEfeYcHgs8C7lQR8jGiOQm1onSGQ0igOFVdSfW7vugawIel99cf/5lYMYXU5Sv+yeCWG1HA50eXDM7E2lIC41aouqzHnmhBQM1x8XMmbJ/DWooGAzxKFSL/6gwa6J7dDw6O1sbnO7rlz2ppbhXh98rfBbHtwUvryaApXOZl5GIXycZAn2iWRB96KYtuiZb8gbiddPauRNq14ZXskcLyKd+ElgF2nS7mbPQSCOpF+SuBLmn33jNtBvnO7O29Qh6yeLeE8r0ljDx0VpfrdeLVmoqsvUVlfIGRVtx7qTbt87erkrrv0uj2huc4fSGWjxBFhYvq7cImP/V8MNIMD/Ge/8pu0da85dGSJXjkOTDu092L4Xc7ZBFghtWreFD09dL93eDckaxDAFTjgf4BpTi0iUkdxStWtf4fcPMeJZ0hBGwMKz2ZFNniLLZCejecJ5kXQRWu3AbWwtGO7zwxP5xkFUjk9CVM+GyAEvYTp+KU6iPA4D05rswR3a/1Psi4gmHdBVkgemj+PCR0w2xADptqrQNVrvvFHJ4/cBX+aM22YTQoACAzY80ug43VGwQJmXI/ikfu+C39vKCPVRpz5gaHvEfPq7YcmAmIR0u4Pg+MuRTJFneFFyD919tXO+hj2U4DEgO9grPnhHaakksrwCqJforSIOtHNTfUmm1eKctW6qQcv+sUkawTIOQiUVRLGJ9oSHg0Yy0nhk7HbkPxqvEeM+Wj3Ld4RsQfQDWzmCdEI28J8BHSR/uwq3NIAZ2AYAghogPw2PFjAMT9S3dB42VxkgL8tk8RlWiMnZAHemXBl5+Bn3K7Ey/nwDDDvP12aZ7hgZXScNkI75sewVh9PzCUKT5vUC4zboBHeMLUiMq2WJyJVUIHpC+NywbUxAv6gU7IJpihfVdfTpwNN3r+dCKDaYHbL6FYXV0gaZPUfxv0EcYYu6pAgzMQ5OCNjEAZlyZ0xLZ8guns9X8N9VuyBRf5UByz5gr0skY9TOdWe5FOK50AHPtO7NoyGCb8JFn0KLn8wpuu3oh0ENsb9UQLXxCwvAK8L1gS0e3t2rLeKNfxRMimEoOh+BKsJC5g7Mmy19c4SP7Yd6m5JkYl/R6IUnZFLk7Mdydra5I0rlUM7PhFM5FFU0cv4YQP6DXrPRreiFHuvkOIm/B1i/cDUzl2CGaw/8PoybtbTV77tyTXARQ3R2SzGEHHbcpAUIgxZNPGmsygiDKVgQkmwXAP2b/dz4QvSL3AMnzyk7z1RMrFUSj5gpbHR0PbcO9Vu5FsQTDv5MuUhiMiS8/TFHPtTo6eOrZr6MQ0InMEgKPJtXyi0ufKHw8XwDWlQqaRY/KQvdKtd1pHRtQ6WZxduYORCY7SbOI1py88Giq87VLC+dFvsAvsNgsCOULc9qzmvSeL3QT8R3yq7ly4Y4sXC8jG1YmhXOqZ0wn6DTIXbEk1WnHtzfdGAM2vdGVkkmnFXIQyliGQ45EmAAM4h096VkmFojAqzbjYoo3j5+3tW5m+v6AKL+03aSiC02dxRNuR1bFqtV4kgRjta9u7qzSZ0qVRMCA49zyhnUSRxxz2b/lnjJG1ywkns0221yIWTOCkk0jCgyds/RumxUQQC1Dv1CMeWPUEXpSfsz8dn/sBiTJoRJbE8mmvWPhBDHNyXfKyeTrdAvx6z/pZqyICm5p79+CCSZBmzZEytYAk8Hgb94hwvCmwMEm1ole13dVzjJlRFv35u5IRj4YSAK/RM8EEneR3YKZOsonm7N0vC/Q4YOrssNPFfCMWZVbBdq3lYs72TzVNnMFypsj+OKSn6WBhJDHX9nmjprghnwKhQGeElJpkxLL1exqI7KEqbNSfNLr/2KyRaBKqyWPkhu6Gm5J8LpmZD6LMv0JDgC17ucjNkMMP+t9pri1fhVRALNOAIK8Wu2BmoG7NnRMTWEsgPyRommqqql1yEyOWNYAE66jvMCEHsbZSyhfG+u+uWng8seFYnDcX9osXTmdzALZ8EZe9LKxFtS4hiU0TyZxeCqTNyqtNpUwrkt1wivbJl8McFNuwC98m+TOGcKdJumDmULXKSAUH+vasH5MIMMngHpPeyPZzByGXvmTCZk6M56MuMZI0Hw03ctO9EUngwy/nW4Lb6pgndvVgX9dELxP2BDHgdeyOaR6CGNhaG7cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhN89ebDOTmbb5Oc8VbcYl7eq01OyuvYaethFsMK69N1HofN404S/fYzJEmvB0jSEdB1hdj9h3Wf8XX2Z/CshccPy7+dPPQCuqPu2l8Knkm1werJWyZMMC3IVObyLXMw3yg+39qJyUgFl/CzRC6XUt751Y/Ckgg2GUJh97Fj/vuvHViqYcZK1SIEPXnEgCIZ5Vuhl1Gt/mw2Mk0/tsLaCYktfBipPD2uWICfqu7GqGp49LO8YfGdbnBpNZu/R+f5Bw=="
|
|
3452
3472
|
},
|
|
3453
|
-
{
|
|
3454
|
-
"name": "compute_note_hash_and_optionally_a_nullifier",
|
|
3455
|
-
"is_unconstrained": true,
|
|
3456
|
-
"custom_attributes": [],
|
|
3457
|
-
"abi": {
|
|
3458
|
-
"error_types": {
|
|
3459
|
-
"16541607464495309456": {
|
|
3460
|
-
"error_kind": "fmtstring",
|
|
3461
|
-
"item_types": [],
|
|
3462
|
-
"length": 16
|
|
3463
|
-
},
|
|
3464
|
-
"17843811134343075018": {
|
|
3465
|
-
"error_kind": "string",
|
|
3466
|
-
"string": "Stack too deep"
|
|
3467
|
-
}
|
|
3468
|
-
},
|
|
3469
|
-
"parameters": [
|
|
3470
|
-
{
|
|
3471
|
-
"name": "contract_address",
|
|
3472
|
-
"type": {
|
|
3473
|
-
"fields": [
|
|
3474
|
-
{
|
|
3475
|
-
"name": "inner",
|
|
3476
|
-
"type": {
|
|
3477
|
-
"kind": "field"
|
|
3478
|
-
}
|
|
3479
|
-
}
|
|
3480
|
-
],
|
|
3481
|
-
"kind": "struct",
|
|
3482
|
-
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3483
|
-
},
|
|
3484
|
-
"visibility": "private"
|
|
3485
|
-
},
|
|
3486
|
-
{
|
|
3487
|
-
"name": "nonce",
|
|
3488
|
-
"type": {
|
|
3489
|
-
"kind": "field"
|
|
3490
|
-
},
|
|
3491
|
-
"visibility": "private"
|
|
3492
|
-
},
|
|
3493
|
-
{
|
|
3494
|
-
"name": "storage_slot",
|
|
3495
|
-
"type": {
|
|
3496
|
-
"kind": "field"
|
|
3497
|
-
},
|
|
3498
|
-
"visibility": "private"
|
|
3499
|
-
},
|
|
3500
|
-
{
|
|
3501
|
-
"name": "note_type_id",
|
|
3502
|
-
"type": {
|
|
3503
|
-
"kind": "field"
|
|
3504
|
-
},
|
|
3505
|
-
"visibility": "private"
|
|
3506
|
-
},
|
|
3507
|
-
{
|
|
3508
|
-
"name": "compute_nullifier",
|
|
3509
|
-
"type": {
|
|
3510
|
-
"kind": "boolean"
|
|
3511
|
-
},
|
|
3512
|
-
"visibility": "private"
|
|
3513
|
-
},
|
|
3514
|
-
{
|
|
3515
|
-
"name": "packed_note_content",
|
|
3516
|
-
"type": {
|
|
3517
|
-
"kind": "array",
|
|
3518
|
-
"length": 0,
|
|
3519
|
-
"type": {
|
|
3520
|
-
"kind": "field"
|
|
3521
|
-
}
|
|
3522
|
-
},
|
|
3523
|
-
"visibility": "private"
|
|
3524
|
-
}
|
|
3525
|
-
],
|
|
3526
|
-
"return_type": {
|
|
3527
|
-
"abi_type": {
|
|
3528
|
-
"kind": "array",
|
|
3529
|
-
"length": 4,
|
|
3530
|
-
"type": {
|
|
3531
|
-
"kind": "field"
|
|
3532
|
-
}
|
|
3533
|
-
},
|
|
3534
|
-
"visibility": "public"
|
|
3535
|
-
}
|
|
3536
|
-
},
|
|
3537
|
-
"bytecode": "H4sIAAAAAAAA/9VZy67aQAwdSEJIuAEKn3Cl7tomXJ47Fn3c30AFPqHrrLppP7qMGCcH46siYVfFEpoknhyfOXZmJqHjztY//TrhOA5tz10b9dmGtrzPKkWs0pJn50F4dh+EZ/QgPGNFnh2Bp2/peUvc+ZlL3fl5bC7iTT7BEdzk/gYAwX6HNgttF/yKCakyYZBa+Otyvs/cpSnzf8kCZmqDvyD8vg1+Sbw/1y0+joXiRqF9rVstX+Eeb0U4xuIlXPJ1wfeF+SLwfWU+rOFvzId1T5xIN1qYlOtqY50XGlsKY+u80TrXaofXSOvcmdZoRTnPGB/On/gU1Kdu+fSYLwZfxnwJ+Eh/3z5DP577FPp9hONP0IfXZ+Su65n8lH/U3aK+YgP8k82lHPD8xPVlbPRhDmLQ85npY7FuoD4W+nt9pm/wp2Nvae0ai5ieqBFp1sf+zJeBL64v4+ThPIY4iEU8Etb/QzgfhbYH99D9YyF+j8W/4C1cQ404ViRco/7++Xwfjgfh52voJ93jructvc31ci7N4Xr4qwY/s+F/JPzcBn9J+AMb/GZv82SCPysJv7Dh38xBQ5v6afaWIxv+B8Ifm+DPD7QOv3OtNXNEOJ7Adb35u6pu2SNh/JxxtdojTRgfrg+uwd43FbiOBR/P4VSIMxXiSFiZItaTItboPx1jXxFroIg1VMTSzGOqiKWpV66IVShiada9pl6UR2mf5m0b2vJOk/ZpiviVtE/TfJcnram+YkFDHF/C+v9gOg9MeFYzWnPoWacYGLswin3rek3xC4EP8c4F3z0fZw+L9XGzXmxOW7JqOds0+SwYV34N34twPsb+0tov7fsUtS6ld/8h6OotBl/BfAn4iKP07j804n+L/hh/LPj4+n9rLifuej0csHHjN6+typjb74HSt3rj+Wtx67NJ8XN3PV//q++NqA/fS+cC17Hg4/uTXIiTC3EeEYt/s0cNfV2TTnHd+rVyuVq3f3TRXJS4y/8BHIufsP6/wjmOjdp75vzjalcdX3bH3WK338+/7yYM31sXdPoDg5oBSR0fAAA=",
|
|
3538
|
-
"debug_symbols": "tZfBisMgFEX/xbULn8YY+yvDUExiiiAmmGRgCPn3MSVMS7ssdxN84XrceMC7sd636+0a0jDO7PK1sTh2bgljKtO2c9bmEGO4XZ9/M3F8rL7n58mlY5wXlxd2qQVnPvVl0ZTdQ4i+LNXO34JGnkFj/oNa7t+c2RoFNihwgwJbEJiEgJEJRpYwsoKRKxhZw8g1jGxg5AZGhjlIMAcJ5iDBHCSYgwRzkGAOEsxBgjlInzlo1RksV+ENbWFoKXBowqElDq1w6AqH1jh0jUMbHBpno8TZqHA2KpCNe5l+XA6ujf5sTcOauqcStfxO/qVPTXnsfL9mfzSrR6k61FOaV/r+8igDqYqTsuWQctAf",
|
|
3539
|
-
"brillig_names": [
|
|
3540
|
-
"compute_note_hash_and_optionally_a_nullifier"
|
|
3541
|
-
]
|
|
3542
|
-
},
|
|
3543
|
-
{
|
|
3544
|
-
"name": "sync_notes",
|
|
3545
|
-
"is_unconstrained": true,
|
|
3546
|
-
"custom_attributes": [],
|
|
3547
|
-
"abi": {
|
|
3548
|
-
"error_types": {
|
|
3549
|
-
"17843811134343075018": {
|
|
3550
|
-
"error_kind": "string",
|
|
3551
|
-
"string": "Stack too deep"
|
|
3552
|
-
}
|
|
3553
|
-
},
|
|
3554
|
-
"parameters": [],
|
|
3555
|
-
"return_type": null
|
|
3556
|
-
},
|
|
3557
|
-
"bytecode": "H4sIAAAAAAAA/7WTyw7CIBBFqcUo0sTEx39MU0y7dOHafyCtLHVRN+766dZkJkyI0QVwEzJMgMNcHoXwKjBKESGCHDEqjAs2Xs7tjDnEqVbBvin5HRijvvhLWH+jkFnk4QPxM50/rJBzmTyfe6F913PTrF8J/z5y+af7y+l//8OzRq9bzCvh/8P4uvfXx/M2ij/SbJGc0ptoOwAqvkT+EvmhJBvn8w+Yb4Svj6KMqNO1tnaNdfZkh8H0dhfwP+KH/QbzqHp4zgQAAA==",
|
|
3558
|
-
"debug_symbols": "bY/RCoMwDEX/Jc99SCqO6a/IkKpRCqWVWgdD/PfFIeI2X8K94eSSu0DHzTzU1vdhgrJawIXWJBu8uGVV0ETrnB3q8xpwG5R9+Gk0frNTMjFBeUMF7DsRd7nurWOR2ar+QEJCvbOidXHglOM1X9DBa8Iv/rGKfZpoTeN4f72ffXtqkl4j/5QaY2i5myNv9U7NZFaUK40SK9Fv",
|
|
3559
|
-
"brillig_names": [
|
|
3560
|
-
"sync_notes"
|
|
3561
|
-
]
|
|
3562
|
-
},
|
|
3563
3473
|
{
|
|
3564
3474
|
"name": "process_log",
|
|
3565
3475
|
"is_unconstrained": true,
|
|
@@ -3671,6 +3581,96 @@
|
|
|
3671
3581
|
"brillig_names": [
|
|
3672
3582
|
"process_log"
|
|
3673
3583
|
]
|
|
3584
|
+
},
|
|
3585
|
+
{
|
|
3586
|
+
"name": "compute_note_hash_and_optionally_a_nullifier",
|
|
3587
|
+
"is_unconstrained": true,
|
|
3588
|
+
"custom_attributes": [],
|
|
3589
|
+
"abi": {
|
|
3590
|
+
"error_types": {
|
|
3591
|
+
"16541607464495309456": {
|
|
3592
|
+
"error_kind": "fmtstring",
|
|
3593
|
+
"item_types": [],
|
|
3594
|
+
"length": 16
|
|
3595
|
+
},
|
|
3596
|
+
"17843811134343075018": {
|
|
3597
|
+
"error_kind": "string",
|
|
3598
|
+
"string": "Stack too deep"
|
|
3599
|
+
}
|
|
3600
|
+
},
|
|
3601
|
+
"parameters": [
|
|
3602
|
+
{
|
|
3603
|
+
"name": "contract_address",
|
|
3604
|
+
"type": {
|
|
3605
|
+
"fields": [
|
|
3606
|
+
{
|
|
3607
|
+
"name": "inner",
|
|
3608
|
+
"type": {
|
|
3609
|
+
"kind": "field"
|
|
3610
|
+
}
|
|
3611
|
+
}
|
|
3612
|
+
],
|
|
3613
|
+
"kind": "struct",
|
|
3614
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3615
|
+
},
|
|
3616
|
+
"visibility": "private"
|
|
3617
|
+
},
|
|
3618
|
+
{
|
|
3619
|
+
"name": "nonce",
|
|
3620
|
+
"type": {
|
|
3621
|
+
"kind": "field"
|
|
3622
|
+
},
|
|
3623
|
+
"visibility": "private"
|
|
3624
|
+
},
|
|
3625
|
+
{
|
|
3626
|
+
"name": "storage_slot",
|
|
3627
|
+
"type": {
|
|
3628
|
+
"kind": "field"
|
|
3629
|
+
},
|
|
3630
|
+
"visibility": "private"
|
|
3631
|
+
},
|
|
3632
|
+
{
|
|
3633
|
+
"name": "note_type_id",
|
|
3634
|
+
"type": {
|
|
3635
|
+
"kind": "field"
|
|
3636
|
+
},
|
|
3637
|
+
"visibility": "private"
|
|
3638
|
+
},
|
|
3639
|
+
{
|
|
3640
|
+
"name": "compute_nullifier",
|
|
3641
|
+
"type": {
|
|
3642
|
+
"kind": "boolean"
|
|
3643
|
+
},
|
|
3644
|
+
"visibility": "private"
|
|
3645
|
+
},
|
|
3646
|
+
{
|
|
3647
|
+
"name": "packed_note_content",
|
|
3648
|
+
"type": {
|
|
3649
|
+
"kind": "array",
|
|
3650
|
+
"length": 0,
|
|
3651
|
+
"type": {
|
|
3652
|
+
"kind": "field"
|
|
3653
|
+
}
|
|
3654
|
+
},
|
|
3655
|
+
"visibility": "private"
|
|
3656
|
+
}
|
|
3657
|
+
],
|
|
3658
|
+
"return_type": {
|
|
3659
|
+
"abi_type": {
|
|
3660
|
+
"kind": "array",
|
|
3661
|
+
"length": 4,
|
|
3662
|
+
"type": {
|
|
3663
|
+
"kind": "field"
|
|
3664
|
+
}
|
|
3665
|
+
},
|
|
3666
|
+
"visibility": "public"
|
|
3667
|
+
}
|
|
3668
|
+
},
|
|
3669
|
+
"bytecode": "H4sIAAAAAAAA/9VZy67aQAwdSEJIuAEKn3Cl7tomXJ47Fn3c30AFPqHrrLppP7qMGCcH46siYVfFEpoknhyfOXZmJqHjztY//TrhOA5tz10b9dmGtrzPKkWs0pJn50F4dh+EZ/QgPGNFnh2Bp2/peUvc+ZlL3fl5bC7iTT7BEdzk/gYAwX6HNgttF/yKCakyYZBa+Otyvs/cpSnzf8kCZmqDvyD8vg1+Sbw/1y0+joXiRqF9rVstX+Eeb0U4xuIlXPJ1wfeF+SLwfWU+rOFvzId1T5xIN1qYlOtqY50XGlsKY+u80TrXaofXSOvcmdZoRTnPGB/On/gU1Kdu+fSYLwZfxnwJ+Eh/3z5DP577FPp9hONP0IfXZ+Su65n8lH/U3aK+YgP8k82lHPD8xPVlbPRhDmLQ85npY7FuoD4W+nt9pm/wp2Nvae0ai5ieqBFp1sf+zJeBL64v4+ThPIY4iEU8Etb/QzgfhbYH99D9YyF+j8W/4C1cQ404ViRco/7++Xwfjgfh52voJ93jructvc31ci7N4Xr4qwY/s+F/JPzcBn9J+AMb/GZv82SCPysJv7Dh38xBQ5v6afaWIxv+B8Ifm+DPD7QOv3OtNXNEOJ7Adb35u6pu2SNh/JxxtdojTRgfrg+uwd43FbiOBR/P4VSIMxXiSFiZItaTItboPx1jXxFroIg1VMTSzGOqiKWpV66IVShiada9pl6UR2mf5m0b2vJOk/ZpiviVtE/TfJcnram+YkFDHF/C+v9gOg9MeFYzWnPoWacYGLswin3rek3xC4EP8c4F3z0fZw+L9XGzXmxOW7JqOds0+SwYV34N34twPsb+0tov7fsUtS6ld/8h6OotBl/BfAn4iKP07j804n+L/hh/LPj4+n9rLifuej0csHHjN6+typjb74HSt3rj+Wtx67NJ8XN3PV//q++NqA/fS+cC17Hg4/uTXIiTC3EeEYt/s0cNfV2TTnHd+rVyuVq3f3TRXJS4y/8BHIufsP6/wjmOjdp75vzjalcdX3bH3WK338+/7yYM31sXdPoDg5oBSR0fAAA=",
|
|
3670
|
+
"debug_symbols": "tZfBisMgFEX/xbULn8YY+yvDUExiiiAmmGRgCPn3MSVMS7ssdxN84XrceMC7sd636+0a0jDO7PK1sTh2bgljKtO2c9bmEGO4XZ9/M3F8rL7n58mlY5wXlxd2qQVnPvVl0ZTdQ4i+LNXO34JGnkFj/oNa7t+c2RoFNihwgwJbEJiEgJEJRpYwsoKRKxhZw8g1jGxg5AZGhjlIMAcJ5iDBHCSYgwRzkGAOEsxBgjlInzlo1RksV+ENbWFoKXBowqElDq1w6AqH1jh0jUMbHBpno8TZqHA2KpCNe5l+XA6ujf5sTcOauqcStfxO/qVPTXnsfL9mfzSrR6k61FOaV/r+8igDqYqTsuWQctAf",
|
|
3671
|
+
"brillig_names": [
|
|
3672
|
+
"compute_note_hash_and_optionally_a_nullifier"
|
|
3673
|
+
]
|
|
3674
3674
|
}
|
|
3675
3675
|
],
|
|
3676
3676
|
"outputs": {
|
|
@@ -3915,7 +3915,7 @@
|
|
|
3915
3915
|
"path": "std/field/bn254.nr",
|
|
3916
3916
|
"source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\nglobal TWO_POW_64: Field = 0x10000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(mut x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 64 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low_lower_64 = (x as u64) as Field;\n x = (x - low_lower_64) / TWO_POW_64;\n let low_upper_64 = (x as u64) as Field;\n\n let high = (x - low_upper_64) / TWO_POW_64;\n let low = low_upper_64 * TWO_POW_64 + low_lower_64;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n /// Safety: borrow is enforced to be boolean due to its type.\n /// if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n /// if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n /// Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n /// Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n /// Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n /// Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n"
|
|
3917
3917
|
},
|
|
3918
|
-
"
|
|
3918
|
+
"185": {
|
|
3919
3919
|
"path": "/build-volume/noir-projects/aztec-nr/aztec/src/utils/array/subarray.nr",
|
|
3920
3920
|
"source": "/// Returns `DST_LEN` elements from a source array, starting at `offset`. `DST_LEN` must not be larger than the number\n/// of elements past `offset`.\n///\n/// Examples:\n/// ```\n/// let foo: [Field; 2] = subarray([1, 2, 3, 4, 5], 2);\n/// assert_eq(foo, [3, 4]);\n///\n/// let bar: [Field; 5] = subarray([1, 2, 3, 4, 5], 2); // fails - we can't return 5 elements since only 3 remain\n/// ```\npub fn subarray<T, let SRC_LEN: u32, let DST_LEN: u32>(\n src: [T; SRC_LEN],\n offset: u32,\n) -> [T; DST_LEN] {\n assert(offset + DST_LEN <= SRC_LEN, \"DST_LEN too large for offset\");\n\n let mut dst: [T; DST_LEN] = std::mem::zeroed();\n for i in 0..DST_LEN {\n dst[i] = src[i + offset];\n }\n\n dst\n}\n\nmod test {\n use super::subarray;\n\n #[test]\n unconstrained fn subarray_into_empty() {\n // In all of these cases we're setting DST_LEN to be 0, so we always get back an emtpy array.\n assert_eq(subarray::<Field, _, _>([], 0), []);\n assert_eq(subarray([1, 2, 3, 4, 5], 0), []);\n assert_eq(subarray([1, 2, 3, 4, 5], 2), []);\n }\n\n #[test]\n unconstrained fn subarray_complete() {\n assert_eq(subarray::<Field, _, _>([], 0), []);\n assert_eq(subarray([1, 2, 3, 4, 5], 0), [1, 2, 3, 4, 5]);\n }\n\n #[test]\n unconstrained fn subarray_different_end_sizes() {\n // We implicitly select how many values to read in the size of the return array\n assert_eq(subarray([1, 2, 3, 4, 5], 1), [2, 3, 4, 5]);\n assert_eq(subarray([1, 2, 3, 4, 5], 1), [2, 3, 4]);\n assert_eq(subarray([1, 2, 3, 4, 5], 1), [2, 3]);\n assert_eq(subarray([1, 2, 3, 4, 5], 1), [2]);\n }\n\n #[test(should_fail_with = \"DST_LEN too large for offset\")]\n unconstrained fn subarray_offset_too_large() {\n // With an offset of 1 we can only request up to 4 elements\n let _: [_; 5] = subarray([1, 2, 3, 4, 5], 1);\n }\n\n #[test(should_fail)]\n unconstrained fn subarray_bad_return_value() {\n assert_eq(subarray([1, 2, 3, 4, 5], 1), [3, 3, 4, 5]);\n }\n}\n"
|
|
3921
3921
|
},
|
|
@@ -3927,7 +3927,7 @@
|
|
|
3927
3927
|
"path": "std/hash/mod.nr",
|
|
3928
3928
|
"source": "pub mod poseidon;\npub mod poseidon2;\npub mod keccak;\npub mod sha256;\npub mod sha512;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\nuse crate::uint128::U128;\n\n// Kept for backwards compatibility\npub use sha256::{digest, sha256, sha256_compression, sha256_var};\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0]\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n /// Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n// docs:start:keccak256\npub fn keccak256<let N: u32>(input: [u8; N], message_size: u32) -> [u8; 32]\n// docs:end:keccak256\n{\n crate::hash::keccak::keccak256(input, message_size)\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation<let N: u32>(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: StructDefinition) -> Quoted {\n let name = quote { Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: std::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher<H>\nwhere\n H: Hasher,\n{\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher<H> for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for U128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self.lo as Field);\n H::write(state, self.hi as Field);\n }\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n"
|
|
3929
3929
|
},
|
|
3930
|
-
"
|
|
3930
|
+
"253": {
|
|
3931
3931
|
"path": "/build-volume/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr",
|
|
3932
3932
|
"source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{\n partial_address::PartialAddress, salted_initialization_hash::SaltedInitializationHash,\n },\n constants::{\n AZTEC_ADDRESS_LENGTH, FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n MAX_FIELD_VALUE,\n },\n contract_class_id::ContractClassId,\n hash::{poseidon2_hash_with_separator, private_functions_root_from_siblings},\n merkle_tree::membership::MembershipWitness,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, ToPoint, TpkM},\n traits::{Deserialize, Empty, FromField, Packable, Serialize, ToField},\n};\n\n// We do below because `use crate::point::Point;` does not work\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\n\nuse crate::public_keys::AddressPoint;\nuse ec::{pow, sqrt};\nuse std::{\n embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key},\n ops::Add,\n};\n\n// Aztec address\npub struct AztecAddress {\n pub inner: Field,\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\n/// We implement the Packable trait for AztecAddress because it can be stored in contract's storage (and there\n/// the implementation of Packable is required).\nimpl Packable<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn pack(self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n self.serialize()\n }\n\n fn unpack(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n Self::deserialize(fields)\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn to_address_point(self) -> AddressPoint {\n // We compute the address point by taking our address, setting it to x, and then solving for y in the\n // equation which defines our bn curve:\n // y^2 = x^3 - 17; x = address\n let x = self.inner;\n let y_squared = pow(x, 3) - 17;\n\n // TODO (#8970): Handle cases where we cannot recover a point from an address\n let mut y = sqrt(y_squared);\n\n // If we get a negative y coordinate (any y where y > MAX_FIELD_VALUE / 2), we pin it to the\n // positive one (any value where y <= MAX_FIELD_VALUE / 2) by subtracting it from the Field modulus\n // note: The field modulus is MAX_FIELD_VALUE + 1\n if (!(y.lt(MAX_FIELD_VALUE / 2) | y.eq(MAX_FIELD_VALUE / 2))) {\n y = (MAX_FIELD_VALUE + 1) - y;\n }\n\n AddressPoint { inner: Point { x: self.inner, y, is_infinite: false } }\n }\n\n pub fn compute(public_keys: PublicKeys, partial_address: PartialAddress) -> AztecAddress {\n let public_keys_hash = public_keys.hash();\n\n let pre_address = poseidon2_hash_with_separator(\n [public_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n );\n\n let address_point = derive_public_key(EmbeddedCurveScalar::from_field(pre_address)).add(\n public_keys.ivpk_m.to_point(),\n );\n\n // Note that our address is only the x-coordinate of the full address_point. This is okay because when people want to encrypt something and send it to us\n // they can recover our full point using the x-coordinate (our address itself). To do this, they recompute the y-coordinate according to the equation y^2 = x^3 - 17.\n // When they do this, they may get a positive y-coordinate (a value that is less than or equal to MAX_FIELD_VALUE / 2) or\n // a negative y-coordinate (a value that is more than MAX_FIELD_VALUE), and we cannot dictate which one they get and hence the recovered point may sometimes be different than the one\n // our secrect can decrypt. Regardless though, they should and will always encrypt using point with the positive y-coordinate by convention.\n // This ensures that everyone encrypts to the same point given an arbitrary x-coordinate (address). This is allowed because even though our original point may not have a positive y-coordinate,\n // with our original secret, we will be able to derive the secret to the point with the flipped (and now positive) y-coordinate that everyone encrypts to.\n AztecAddress::from_field(address_point.x)\n }\n\n pub fn compute_from_private_function(\n function_selector: FunctionSelector,\n function_vk_hash: Field,\n function_leaf_membership_witness: MembershipWitness<FUNCTION_TREE_HEIGHT>,\n contract_class_artifact_hash: Field,\n contract_class_public_bytecode_commitment: Field,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys: PublicKeys,\n ) -> Self {\n let private_functions_root = private_functions_root_from_siblings(\n function_selector,\n function_vk_hash,\n function_leaf_membership_witness.leaf_index,\n function_leaf_membership_witness.sibling_path,\n );\n\n let contract_class_id = ContractClassId::compute(\n contract_class_artifact_hash,\n private_functions_root,\n contract_class_public_bytecode_commitment,\n );\n\n // Compute contract address using the preimage which includes the class_id.\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n salted_initialization_hash,\n );\n\n AztecAddress::compute(public_keys, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys() {\n let public_keys = PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: 0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab,\n y: 0x0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7,\n is_infinite: false,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: 0x111223493147f6785514b1c195bb37a2589f22a6596d30bb2bb145fdc9ca8f1e,\n y: 0x273bbffd678edce8fe30e0deafc4f66d58357c06fd4a820285294b9746c3be95,\n is_infinite: false,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: 0x09115c96e962322ffed6522f57194627136b8d03ac7469109707f5e44190c484,\n y: 0x0c49773308a13d740a7f0d4f0e6163b02c5a408b6f965856b6a491002d073d5b,\n is_infinite: false,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: 0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a762,\n y: 0x2f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a,\n is_infinite: false,\n },\n },\n };\n\n let partial_address = PartialAddress::from_field(\n 0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de,\n );\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // The following value was generated by `derivation.test.ts`.\n // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data.\n let expected_computed_address_from_partial_and_pubkeys =\n 0x24e4646f58b9fbe7d38e317db8d5636c423fbbdfbe119fc190fe9c64747e0c62;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkeys);\n}\n\n#[test]\nfn compute_preaddress_from_partial_and_pub_keys() {\n let pre_address = poseidon2_hash_with_separator([1, 2], GENERATOR_INDEX__CONTRACT_ADDRESS_V1);\n let expected_computed_preaddress_from_partial_and_pubkey =\n 0x23ce9be3fa3c846b0f9245cc796902e731d04f086e8a42473bb29e405fc98075;\n assert(pre_address == expected_computed_preaddress_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"
|
|
3933
3933
|
},
|
|
@@ -3935,27 +3935,27 @@
|
|
|
3935
3935
|
"path": "std/hash/poseidon2.nr",
|
|
3936
3936
|
"source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"
|
|
3937
3937
|
},
|
|
3938
|
-
"
|
|
3938
|
+
"269": {
|
|
3939
3939
|
"path": "/build-volume/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr",
|
|
3940
3940
|
"source": "/// Utility function to console.log data in the acir simulator.\n/// Example:\n/// debug_log(\"blah blah this is a debug string\");\npub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n\n/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the\n/// `${k}` tokens will be replaced with the k-eth value in the `args` array.\n/// Examples:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\npub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n /// Safety: This oracle call returns nothing: we only call it for its side effects. It is therefore always safe\n /// to call.\n unsafe { debug_log_oracle_wrapper(msg, args) };\n}\n\npub unconstrained fn debug_log_oracle_wrapper<let M: u32, let N: u32>(\n msg: str<M>,\n args: [Field; N],\n) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<let M: u32>(_msg: str<M>, args: [Field]) {}\n"
|
|
3941
3941
|
},
|
|
3942
|
-
"
|
|
3942
|
+
"270": {
|
|
3943
3943
|
"path": "/build-volume/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
|
|
3944
3944
|
"source": "use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector,\n log_hash::{LogHash, ScopedLogHash},\n note_hash::ScopedNoteHash,\n nullifier::ScopedNullifier,\n private_log::{PrivateLog, PrivateLogData},\n side_effect::{OrderedValue, scoped::Scoped},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n },\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n poseidon2::Poseidon2Sponge,\n traits::{FromField, Hash, is_empty, ToField},\n utils::field::field_from_bytes_32_trunc,\n};\nuse super::{constants::TWO_POW_64, utils::{arrays::array_concat, field::field_from_bytes}};\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n GENERATOR_INDEX__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), note_hash],\n GENERATOR_INDEX__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique note hashes from siloed note hashes\npub fn compute_unique_siloed_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n if siloed_note_hash == 0 {\n 0\n } else {\n let nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(nonce, siloed_note_hash)\n }\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_note_hash(note_hash.contract_address, note_hash.value())\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), nullifier],\n GENERATOR_INDEX__OUTER_NULLIFIER,\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn compute_siloed_private_log_field(contract_address: AztecAddress, field: Field) -> Field {\n poseidon2_hash([contract_address.to_field(), field])\n}\n\npub fn silo_private_log(private_log: Scoped<PrivateLogData>) -> PrivateLog {\n if private_log.contract_address.is_zero() {\n private_log.inner.log\n } else {\n let mut fields = private_log.inner.log.fields;\n fields[0] = compute_siloed_private_log_field(private_log.contract_address, fields[0]);\n PrivateLog { fields }\n }\n}\n\nfn compute_siloed_contract_class_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_contract_class_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_contract_class_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let mut bytes: [u8; 160] = std::mem::zeroed();\n\n let inputs =\n [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..5 {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes[32 * i + j] = item_bytes[j];\n }\n }\n\n sha256_to_field(bytes)\n}\n\npub fn silo_l2_to_l1_message(\n msg: ScopedL2ToL1Message,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id,\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes: [u8; 32] = input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\npub fn compute_tx_logs_hash<let N: u32>(logs: [LogHash; N]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; N * 32];\n for offset in 0..N {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn verification_key_hash<let N: u32>(key: [Field; N]) -> Field {\n crate::hash::poseidon2_hash(key)\n}\n\n#[inline_always]\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = array_concat([separator.to_field()], inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n// Performs a fixed length hash with a subarray of the given input.\n// Useful for SpongeBlob in which we aborb M things and want to check it vs a hash of M elts of an N-len array.\n// Using stdlib poseidon, this will always absorb an extra 1 as a 'variable' hash, and not match spongeblob.squeeze()\n// or any ts implementation. Also checks that any remaining elts not hashed are empty.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, false);\n sponge.squeeze()\n}\n\n// NB the below is the same as std::hash::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check,\n// and absorbing in chunks of 3 below.\n#[no_predicates]\npub fn poseidon2_cheaper_variable_hash<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, true);\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if in_len != N {\n sponge.absorb(1);\n }\n sponge.squeeze()\n}\n\n// The below fn reduces gates of a conditional poseidon2 hash by approx 3x (thank you ~* Giant Brain Dev @IlyasRidhuan *~ for the idea)\n// Why? Because when we call stdlib poseidon, we call absorb for each item. When absorbing is conditional, it seems the compiler does not know\n// what cache_size will be when calling absorb, so it assigns the permutation gates for /each i/ rather than /every 3rd i/, which is actually required.\n// The below code forces the compiler to:\n// - absorb normally up to 2 times to set cache_size to 1\n// - absorb in chunks of 3 to ensure perm. only happens every 3rd absorb\n// - absorb normally up to 2 times to add any remaining values to the hash\n// In fixed len hashes, the compiler is able to tell that it will only need to perform the permutation every 3 absorbs.\n// NB: it also replaces unnecessary range checks (i < thing) with a bit check (&= i != thing), which alone reduces the gates of a var. hash by half.\n\n#[no_predicates]\nfn poseidon2_absorb_chunks<let N: u32>(\n input: [Field; N],\n in_len: u32,\n variable: bool,\n) -> Poseidon2Sponge {\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n // Even though shift is always 1 here, if we input in_len = 0 we get an underflow\n // since we cannot isolate computation branches. The below is just to avoid that.\n let shift = if in_len == 0 { 0 } else { 1 };\n if in_len != 0 {\n // cache_size = 0, init absorb\n sponge.cache[0] = input[0];\n sponge.cache_size = 1;\n // shift = num elts already added to make cache_size 1 = 1 for a fresh sponge\n // M = max_chunks = (N - 1 - (N - 1) % 3) / 3: (must be written as a fn of N to compile)\n // max_remainder = (N - 1) % 3;\n // max_chunks = (N - 1 - max_remainder) / 3;\n sponge = poseidon2_absorb_chunks_loop::<N, (N - 1 - (N - 1) % 3) / 3>(\n sponge,\n input,\n in_len,\n variable,\n shift,\n );\n }\n sponge\n}\n\n// NB: If it's not required to check that the non-absorbed elts of 'input' are 0s, set skip_0_check=true\n#[no_predicates]\npub fn poseidon2_absorb_chunks_existing_sponge<let N: u32>(\n in_sponge: Poseidon2Sponge,\n input: [Field; N],\n in_len: u32,\n skip_0_check: bool,\n) -> Poseidon2Sponge {\n let mut sponge = in_sponge;\n // 'shift' is to account for already added inputs\n let mut shift = 0;\n // 'stop' is to avoid an underflow when inputting in_len = 0\n let mut stop = false;\n for i in 0..3 {\n if shift == in_len {\n stop = true;\n }\n if (sponge.cache_size != 1) & (!stop) {\n sponge.absorb(input[i]);\n shift += 1;\n }\n }\n sponge = if stop {\n sponge\n } else {\n // max_chunks = (N - (N % 3)) / 3;\n poseidon2_absorb_chunks_loop::<N, (N - (N % 3)) / 3>(\n sponge,\n input,\n in_len,\n skip_0_check,\n shift,\n )\n };\n sponge\n}\n\n// The below is the loop to absorb elts into a poseidon sponge in chunks of 3\n// shift - the num of elts already absorbed to ensure the sponge's cache_size = 1\n// M - the max number of chunks required to absorb N things (must be comptime to compile)\n// NB: The 0 checks ('Found non-zero field...') are messy, but having a separate loop over N to check\n// for 0s costs 3N gates. Current approach is approx 2N gates.\n#[no_predicates]\nfn poseidon2_absorb_chunks_loop<let N: u32, let M: u32>(\n in_sponge: Poseidon2Sponge,\n input: [Field; N],\n in_len: u32,\n variable: bool,\n shift: u32,\n) -> Poseidon2Sponge {\n assert(in_len <= N, \"Given in_len to absorb is larger than the input array len\");\n // When we have an existing sponge, we may have a shift of 0, and the final 'k+2' below = N\n // The below avoids an overflow\n let skip_last = 3 * M == N;\n // Writing in_sponge: &mut does not compile\n let mut sponge = in_sponge;\n let mut should_add = true;\n // The num of things left over after absorbing in 3s\n let remainder = (in_len - shift) % 3;\n // The num of chunks of 3 to absorb (maximum M)\n let chunks = (in_len - shift - remainder) / 3;\n for i in 0..M {\n // Now we loop through cache size = 1 -> 3\n should_add &= i != chunks;\n // This is the index at the start of the chunk (for readability)\n let k = 3 * i + shift;\n if should_add {\n // cache_size = 1, 2 => just assign\n sponge.cache[1] = input[k];\n sponge.cache[2] = input[k + 1];\n // cache_size = 3 => duplex + perm\n for j in 0..3 {\n sponge.state[j] += sponge.cache[j];\n }\n sponge.state = std::hash::poseidon2_permutation(sponge.state, 4);\n sponge.cache[0] = input[k + 2];\n // cache_size is now 1 again, repeat loop\n } else if (!variable) & (i != chunks) {\n // if we are hashing a fixed len array which is a subarray, we check the remaining elts are 0\n // NB: we don't check at i == chunks, because that chunk contains elts to be absorbed or checked below\n let last_0 = if (i == M - 1) & (skip_last) {\n 0\n } else {\n input[k + 2]\n };\n let all_0 = (input[k] == 0) & (input[k + 1] == 0) & (last_0 == 0);\n assert(all_0, \"Found non-zero field after breakpoint\");\n }\n }\n // we have 'remainder' num of items left to absorb\n should_add = true;\n // below is to avoid overflows (i.e. if inlen is close to N)\n let mut should_check = !variable;\n for i in 0..3 {\n should_add &= i != remainder;\n should_check &= in_len - remainder + i != N;\n if should_add {\n // we want to absorb the final 'remainder' items\n sponge.absorb(input[in_len - remainder + i]);\n } else if should_check {\n assert(input[in_len - remainder + i] == 0, \"Found non-zero field after breakpoint\");\n }\n }\n sponge\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n let sub_chunk_hash = poseidon2_hash_subarray(input, in_len);\n let fixed_len_hash = std::hash::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len());\n assert(sub_chunk_hash == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_matches_variable() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n for i in 0..in_len {\n input[i] = 3;\n }\n let variable_chunk_hash = poseidon2_cheaper_variable_hash(input, in_len);\n let variable_len_hash = std::hash::poseidon2::Poseidon2::hash(input, in_len);\n assert(variable_chunk_hash == variable_len_hash);\n}\n\n#[test]\nfn existing_sponge_poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n // absorb 250 of the 501 things\n let empty_sponge = Poseidon2Sponge::new((in_len as Field) * TWO_POW_64);\n let first_sponge = poseidon2_absorb_chunks_existing_sponge(empty_sponge, input, 250, true);\n // now absorb the final 251 (since they are all 3s, im being lazy and not making a new array)\n let mut final_sponge = poseidon2_absorb_chunks_existing_sponge(first_sponge, input, 251, true);\n let fixed_len_hash = Poseidon2Sponge::hash(fixed_input, fixed_input.len());\n assert(final_sponge.squeeze() == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_empty_inputs() {\n let in_len = 0;\n let mut input: [Field; 4096] = [0; 4096];\n let mut constructed_empty_sponge = poseidon2_absorb_chunks(input, in_len, true);\n let mut first_sponge =\n poseidon2_absorb_chunks_existing_sponge(constructed_empty_sponge, input, in_len, true);\n assert(first_sponge.squeeze() == constructed_empty_sponge.squeeze());\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3),\n },\n version,\n chainId,\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"
|
|
3945
3945
|
},
|
|
3946
|
-
"
|
|
3946
|
+
"287": {
|
|
3947
3947
|
"path": "/build-volume/noir-projects/noir-protocol-circuits/crates/types/src/poseidon2.nr",
|
|
3948
3948
|
"source": "use crate::constants::TWO_POW_64;\n\n// NB: This is a clone of noir/noir-repo/noir_stdlib/src/hash/poseidon2.nr\n// It exists as we sometimes need to perform custom absorption, but the stdlib version\n// has a private absorb() method (it's also designed to just be a hasher)\n// Can be removed when standalone noir poseidon lib exists: See noir#6679\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2Sponge {\n pub cache: [Field; 3],\n pub state: [Field; 4],\n pub cache_size: u32,\n pub squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2Sponge {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n Poseidon2Sponge::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2Sponge {\n let mut result =\n Poseidon2Sponge { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = std::hash::poseidon2_permutation(self.state, 4);\n }\n\n pub fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n pub fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n"
|
|
3949
3949
|
},
|
|
3950
|
-
"
|
|
3950
|
+
"296": {
|
|
3951
3951
|
"path": "/build-volume/noir-projects/noir-protocol-circuits/crates/types/src/public_keys.nr",
|
|
3952
3952
|
"source": "use crate::{\n address::public_keys_hash::PublicKeysHash,\n constants::{\n DEFAULT_IVPK_M_X, DEFAULT_IVPK_M_Y, DEFAULT_NPK_M_X, DEFAULT_NPK_M_Y, DEFAULT_OVPK_M_X,\n DEFAULT_OVPK_M_Y, DEFAULT_TPK_M_X, DEFAULT_TPK_M_Y, GENERATOR_INDEX__PUBLIC_KEYS_HASH,\n },\n hash::poseidon2_hash_with_separator,\n point::POINT_LENGTH,\n traits::{Deserialize, Hash, Serialize},\n};\n\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\nuse std::default::Default;\n\npub global PUBLIC_KEYS_LENGTH: u32 = 12;\n\npub struct PublicKeys {\n pub npk_m: NpkM,\n pub ivpk_m: IvpkM,\n pub ovpk_m: OvpkM,\n pub tpk_m: TpkM,\n}\n\npub trait ToPoint {\n fn to_point(self) -> Point;\n}\n\npub struct NpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for NpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for NpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\n// Note: If we store npk_m_hash directly we can remove this trait implementation. See #8091\nimpl Hash for NpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\npub struct IvpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for IvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for IvpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\npub struct OvpkM {\n pub inner: Point,\n}\n\nimpl Hash for OvpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\nimpl ToPoint for OvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for OvpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\npub struct TpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for TpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nimpl Serialize<POINT_LENGTH> for TpkM {\n fn serialize(self) -> [Field; POINT_LENGTH] {\n self.inner.serialize()\n }\n}\n\nimpl Default for PublicKeys {\n fn default() -> Self {\n PublicKeys {\n npk_m: NpkM {\n inner: Point { x: DEFAULT_NPK_M_X, y: DEFAULT_NPK_M_Y, is_infinite: false },\n },\n ivpk_m: IvpkM {\n inner: Point { x: DEFAULT_IVPK_M_X, y: DEFAULT_IVPK_M_Y, is_infinite: false },\n },\n ovpk_m: OvpkM {\n inner: Point { x: DEFAULT_OVPK_M_X, y: DEFAULT_OVPK_M_Y, is_infinite: false },\n },\n tpk_m: TpkM {\n inner: Point { x: DEFAULT_TPK_M_X, y: DEFAULT_TPK_M_Y, is_infinite: false },\n },\n }\n }\n}\n\nimpl Eq for PublicKeys {\n fn eq(self, other: PublicKeys) -> bool {\n (self.npk_m.inner == other.npk_m.inner)\n & (self.ivpk_m.inner == other.ivpk_m.inner)\n & (self.ovpk_m.inner == other.ovpk_m.inner)\n & (self.tpk_m.inner == other.tpk_m.inner)\n }\n}\n\nimpl PublicKeys {\n pub fn hash(self) -> PublicKeysHash {\n PublicKeysHash::from_field(poseidon2_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__PUBLIC_KEYS_HASH as Field,\n ))\n }\n}\n\nimpl Serialize<PUBLIC_KEYS_LENGTH> for PublicKeys {\n fn serialize(self) -> [Field; PUBLIC_KEYS_LENGTH] {\n [\n self.npk_m.inner.x,\n self.npk_m.inner.y,\n self.npk_m.inner.is_infinite as Field,\n self.ivpk_m.inner.x,\n self.ivpk_m.inner.y,\n self.ivpk_m.inner.is_infinite as Field,\n self.ovpk_m.inner.x,\n self.ovpk_m.inner.y,\n self.ovpk_m.inner.is_infinite as Field,\n self.tpk_m.inner.x,\n self.tpk_m.inner.y,\n self.tpk_m.inner.is_infinite as Field,\n ]\n }\n}\n\nimpl Deserialize<PUBLIC_KEYS_LENGTH> for PublicKeys {\n fn deserialize(serialized: [Field; PUBLIC_KEYS_LENGTH]) -> PublicKeys {\n PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: serialized[0],\n y: serialized[1],\n is_infinite: serialized[2] as bool,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: serialized[3],\n y: serialized[4],\n is_infinite: serialized[5] as bool,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: serialized[6],\n y: serialized[7],\n is_infinite: serialized[8] as bool,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: serialized[9],\n y: serialized[10],\n is_infinite: serialized[11] as bool,\n },\n },\n }\n }\n}\n\npub struct AddressPoint {\n pub inner: Point,\n}\n\nimpl ToPoint for AddressPoint {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[test]\nunconstrained fn compute_public_keys_hash() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let actual = keys.hash();\n let expected_public_keys_hash =\n 0x0fecd9a32db731fec1fded1b9ff957a1625c069245a3613a2538bd527068b0ad;\n\n assert(actual.to_field() == expected_public_keys_hash);\n}\n\n#[test]\nunconstrained fn compute_default_hash() {\n let keys = PublicKeys::default();\n\n let actual = keys.hash();\n let test_data_default_hash = 0x1d3bf1fb93ae0e9cda83b203dd91c3bfb492a9aecf30ec90e1057eced0f0e62d;\n\n assert(actual.to_field() == test_data_default_hash);\n}\n\n#[test]\nunconstrained fn test_public_keys_serialization() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let serialized = keys.serialize();\n let deserialized = PublicKeys::deserialize(serialized);\n\n assert_eq(keys.npk_m.inner.x, deserialized.npk_m.inner.x);\n assert_eq(keys.npk_m.inner.y, deserialized.npk_m.inner.y);\n assert_eq(keys.ivpk_m.inner.x, deserialized.ivpk_m.inner.x);\n assert_eq(keys.ivpk_m.inner.y, deserialized.ivpk_m.inner.y);\n assert_eq(keys.ovpk_m.inner.x, deserialized.ovpk_m.inner.x);\n assert_eq(keys.ovpk_m.inner.y, deserialized.ovpk_m.inner.y);\n assert_eq(keys.tpk_m.inner.x, deserialized.tpk_m.inner.x);\n assert_eq(keys.tpk_m.inner.y, deserialized.tpk_m.inner.y);\n}\n"
|
|
3953
3953
|
},
|
|
3954
|
-
"
|
|
3954
|
+
"336": {
|
|
3955
3955
|
"path": "/build-volume/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr",
|
|
3956
3956
|
"source": "pub struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<let K: u32>(&mut self) -> [Field; K] {\n let mut result = [0; K];\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array());\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(\n &mut self,\n deserialise: fn([Field; K]) -> T,\n mut result: [T; C],\n ) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"
|
|
3957
3957
|
},
|
|
3958
|
-
"
|
|
3958
|
+
"348": {
|
|
3959
3959
|
"path": "/root/nargo/github.com/noir-lang/schnorr/v0.1.1/src/lib.nr",
|
|
3960
3960
|
"source": "use std::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul};\nuse std::hash::{blake2s, pedersen_hash};\n\npub fn verify_signature<let N: u32>(\n public_key: EmbeddedCurvePoint,\n signature: [u8; 64],\n message: [u8; N],\n) -> bool {\n //scalar lo/hi from bytes\n let sig_s = scalar_from_bytes(signature, 0);\n let sig_e = scalar_from_bytes(signature, 32);\n // pub_key is on Grumpkin curve\n let mut is_ok = (public_key.y * public_key.y == public_key.x * public_key.x * public_key.x - 17)\n & (!public_key.is_infinite);\n\n if ((sig_s.lo != 0) | (sig_s.hi != 0)) & ((sig_e.lo != 0) | (sig_e.hi != 0)) {\n let (r_is_infinite, result) =\n calculate_signature_challenge(public_key, sig_s, sig_e, message);\n\n is_ok &= !r_is_infinite;\n for i in 0..32 {\n is_ok &= result[i] == signature[32 + i];\n }\n } else {\n is_ok = false;\n }\n is_ok\n}\n\npub fn assert_valid_signature<let N: u32>(\n public_key: EmbeddedCurvePoint,\n signature: [u8; 64],\n message: [u8; N],\n) {\n //scalar lo/hi from bytes\n let sig_s = scalar_from_bytes(signature, 0);\n let sig_e = scalar_from_bytes(signature, 32);\n\n // assert pub_key is on Grumpkin curve\n assert(public_key.y * public_key.y == public_key.x * public_key.x * public_key.x - 17);\n assert(public_key.is_infinite == false);\n // assert signature is not null\n assert((sig_s.lo != 0) | (sig_s.hi != 0));\n assert((sig_e.lo != 0) | (sig_e.hi != 0));\n\n let (r_is_infinite, result) = calculate_signature_challenge(public_key, sig_s, sig_e, message);\n\n assert(!r_is_infinite);\n for i in 0..32 {\n assert(result[i] == signature[32 + i]);\n }\n}\n\nfn calculate_signature_challenge<let N: u32>(\n public_key: EmbeddedCurvePoint,\n sig_s: EmbeddedCurveScalar,\n sig_e: EmbeddedCurveScalar,\n message: [u8; N],\n) -> (bool, [u8; 32]) {\n let g1 = EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860,\n is_infinite: false,\n };\n let r = multi_scalar_mul([g1, public_key], [sig_s, sig_e]);\n // compare the _hashes_ rather than field elements modulo r\n let pedersen_hash = pedersen_hash([r.x, public_key.x, public_key.y]);\n let pde: [u8; 32] = pedersen_hash.to_be_bytes();\n\n let mut hash_input = [0; N + 32];\n for i in 0..32 {\n hash_input[i] = pde[i];\n }\n for i in 0..N {\n hash_input[32 + i] = message[i];\n }\n\n let result = blake2s(hash_input);\n (r.is_infinite, result)\n}\n\n//Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\nfn scalar_from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v: Field = 1;\n let mut lo: Field = 0;\n let mut hi: Field = 0;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = EmbeddedCurveScalar::new(lo, hi);\n sig_s\n}\n\nmod test {\n use std::embedded_curve_ops::EmbeddedCurvePoint;\n\n use super::verify_signature;\n\n #[test]\n fn test_zero_signature() {\n let public_key: EmbeddedCurvePoint = EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860,\n is_infinite: false,\n };\n let signature: [u8; 64] = [0; 64];\n let message: [u8; _] = [2; 64]; // every message\n let verified = verify_signature(public_key, signature, message);\n assert(!verified);\n }\n\n #[test]\n fn smoke_test() {\n let message: [u8; 10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n let pub_key_x: Field = 0x04b260954662e97f00cab9adb773a259097f7a274b83b113532bce27fa3fb96a;\n let pub_key_y: Field = 0x2fd51571db6c08666b0edfbfbc57d432068bccd0110a39b166ab243da0037197;\n let signature: [u8; 64] = [\n 1, 13, 119, 112, 212, 39, 233, 41, 84, 235, 255, 93, 245, 172, 186, 83, 157, 253, 76,\n 77, 33, 128, 178, 15, 214, 67, 105, 107, 177, 234, 77, 48, 27, 237, 155, 84, 39, 84,\n 247, 27, 22, 8, 176, 230, 24, 115, 145, 220, 254, 122, 135, 179, 171, 4, 214, 202, 64,\n 199, 19, 84, 239, 138, 124, 12,\n ];\n\n let pub_key = EmbeddedCurvePoint { x: pub_key_x, y: pub_key_y, is_infinite: false };\n let valid_signature = verify_signature(pub_key, signature, message);\n assert(valid_signature);\n super::assert_valid_signature(pub_key, signature, message);\n }\n\n}\n\nmod bench {\n use super::{assert_valid_signature, verify_signature};\n use std::embedded_curve_ops::EmbeddedCurvePoint;\n\n #[export]\n pub fn bench_verify_signature(\n public_key: EmbeddedCurvePoint,\n signature: [u8; 64],\n message: [u8; 32],\n ) -> bool {\n verify_signature(public_key, signature, message)\n }\n\n #[export]\n pub fn bench_assert_valid_signature(\n public_key: EmbeddedCurvePoint,\n signature: [u8; 64],\n message: [u8; 32],\n ) {\n assert_valid_signature(public_key, signature, message)\n }\n}\n"
|
|
3961
3961
|
},
|