@aztec/protocol-contracts 0.0.1-commit.21ecf947b → 0.0.1-commit.2448fdb
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/AuthRegistry.json +27 -27
- package/artifacts/ContractClassRegistry.json +19 -19
- package/artifacts/ContractInstanceRegistry.json +33 -33
- package/artifacts/FeeJuice.json +32 -32
- package/artifacts/MultiCallEntrypoint.json +63 -63
- package/artifacts/PublicChecks.json +64 -64
- package/dest/auth-registry/index.d.ts +1 -1
- package/dest/auth-registry/index.d.ts.map +1 -1
- package/dest/auth-registry/index.js +3 -3
- package/dest/auth-registry/lazy.js +1 -1
- package/dest/class-registry/contract_class_published_event.d.ts +6 -3
- package/dest/class-registry/contract_class_published_event.d.ts.map +1 -1
- package/dest/class-registry/contract_class_published_event.js +9 -13
- package/dest/class-registry/index.d.ts +1 -1
- package/dest/class-registry/index.d.ts.map +1 -1
- package/dest/class-registry/index.js +3 -3
- package/dest/class-registry/lazy.js +1 -1
- package/dest/fee-juice/index.d.ts +1 -1
- package/dest/fee-juice/index.d.ts.map +1 -1
- package/dest/fee-juice/index.js +3 -3
- package/dest/fee-juice/lazy.js +1 -1
- package/dest/instance-registry/index.d.ts +1 -1
- package/dest/instance-registry/index.d.ts.map +1 -1
- package/dest/instance-registry/index.js +3 -3
- package/dest/instance-registry/lazy.js +1 -1
- package/dest/make_protocol_contract.d.ts +4 -4
- package/dest/make_protocol_contract.d.ts.map +1 -1
- package/dest/make_protocol_contract.js +27 -14
- package/dest/multi-call-entrypoint/index.d.ts +1 -1
- package/dest/multi-call-entrypoint/index.d.ts.map +1 -1
- package/dest/multi-call-entrypoint/index.js +3 -3
- package/dest/multi-call-entrypoint/lazy.js +1 -1
- package/dest/protocol_contract_data.d.ts +13 -1
- package/dest/protocol_contract_data.d.ts.map +1 -1
- package/dest/protocol_contract_data.js +99 -13
- package/dest/provider/bundle.js +1 -1
- package/dest/public-checks/index.d.ts +1 -1
- package/dest/public-checks/index.d.ts.map +1 -1
- package/dest/public-checks/index.js +3 -3
- package/dest/public-checks/lazy.js +1 -1
- package/dest/scripts/generate_data.js +66 -15
- package/package.json +4 -4
- package/src/auth-registry/index.ts +3 -3
- package/src/auth-registry/lazy.ts +1 -1
- package/src/class-registry/contract_class_published_event.ts +10 -19
- package/src/class-registry/index.ts +3 -3
- package/src/class-registry/lazy.ts +1 -1
- package/src/fee-juice/index.ts +3 -3
- package/src/fee-juice/lazy.ts +1 -1
- package/src/instance-registry/index.ts +3 -3
- package/src/instance-registry/lazy.ts +1 -1
- package/src/make_protocol_contract.ts +37 -15
- package/src/multi-call-entrypoint/index.ts +3 -3
- package/src/multi-call-entrypoint/lazy.ts +1 -1
- package/src/protocol_contract_data.ts +76 -13
- package/src/provider/bundle.ts +1 -1
- package/src/public-checks/index.ts +3 -3
- package/src/public-checks/lazy.ts +1 -1
package/artifacts/FeeJuice.json
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"bytecode": "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",
|
|
74
|
-
"debug_symbols": "
|
|
74
|
+
"debug_symbols": "pZlRbhs5DIbv4uc8SBRFiblKURRu6hYGDCdwkwUWQe6+pEaU7C4kpPKL5xuO5x+Soih5/L77cfj+9uvb8fzz+ffu8cv77vvleDodf307PT/tX4/PZ7G+75x+eEi7x/Cw8wF2j1GPaTui3+xI2zHKedIjbUeq58TbMWE95t2jdwI5CHiFXIFpA3ByrycFquCjAVcANDBLMEswCwaDVCGCgSmTPYv0ESyQnAEa5AoZDFIFNktxXiA4uR28QqzgzeJzBRDHICmoRe8Kmka9VPJawCya2RAUqAKZRZNbQF0NWSFX0PRuIK4iCKirKEOHJP4gKYiHKG5gpgosypgV4gZRw0FWQAOu4M3izQJm0bgKaNlskCpogBtQhWiPiNHABEmiiFItkdMGpJUQJS0EzsAsQS2gECvocMegkCqQWXSUN9Avo4I8NEp+KKNBrsBhg6SVuYE4HyWHyXsDsxTHkkKsX4aqnAIamAVNGeuzUvG5gArKECQd3MgKXEEHl5xCrsDVktXDDaiCN4sOUwEdJvIKXCGYJaigpC4Xx1ghVSiOFTCL1uEGVKFktYAqS3qzJpMkvezAgCrovNggGuhdkkPWCbJBrhDMEsyCZkGzRH2WpI61bCgpiKskOeQEFbJmgxXkoUmywewMtEV5Bd7AO4eNms0nI4BGzaa1txGqLhSKRrHZ1NcUCvH2fO/U7UrZKDVbSkbahippt0UlnbmV9Gnaor3O3UrN5kOjbATNFnwjVSYlnbCVmq3EkQrF+lxf4ihE2KjZShwbZaMSRy6UjEocXIgqlfWgEhtp86nUbGUUCmnbya5QMsJm0ziyjhGUVSsXikbaHit1GxuVdWyjbNTigBYHaBw5FIqVytJQqdl8s/lmg2YD9VTrJWhzy/Dx8bCzRfrb6+Vw0DX6atWWtfxlfzmcX3eP57fT6WH3z/70Vr70+2V/LsfX/UWuSh4O5x9yFMGfx9NB6eOh3+3GtybKVO9OyXeBCDcKfqxAqLO9KBCm1BTo1gcYKwRdHYpAIGz3p/B5DxjMg4g48gBnHsQqgDIbehLWssijLNJMITQBavcjfNoDWaCaAMaRB3mSRdm7WRbBwSiLPFaAZALAw3H8bBYxjWKYKcjCZAoMfljNk2KUhmKJ1NneJPJtMfgwyUO2CRk4X43lbSL9pB5Z+nSVYJ96QQb2txpxMp4uWEmRw15T4S+8yDazGa6y+T8v0lgjy51VIzPxWGNSmSFCy2eviuD+YlA9W4uRdk2jQYVJacXcs9kHJKel0gzDRguTKFh39dtwJBi5AJPClK1NtBmm25xxs8aZiPOpibgw7LcQ7242QHd2m1kgzAl6HJiHTkxLE60sQpy4MR8UvBoUHiYjTKrLy+QyDfahNx1c652BRgUaJgUKbZYFf90uPu9CxOZCCkMX8O72HeK97TvQ/e07pHvb92eTmcfJ5FnbdC2ZsqUdtRycFabLAVt158nubLLB8xKLaWSXh9U9d0RKqjtytUn705HpXI3Ue4Y0saHIbLNJyTISko8LGyXPzvXZHodL4rxhtBWRgZckuC8mHNOaRPJNIsOKhLxWNAlwCZck0Fku5HflmhcYugS5JYnoWiARaE0iuiYR/ZoEYpeARS+oSaR8txerEq3A5bXwUoEDITSJuDaoRG1E5J3kmkTr40DZ3R3ImoS8eW4bHXkNuCjR9/FuaVADB98kaJxOmizv2BcTzKFXuOfPe9E2W4JpLRDumwxeK3DfFgHBtcnuGLvE2mT3vpWWvNFbDIS6xP2BLEr43sE9pjWJmJoE8aJEWwRudo6LgaxKtF9n8kJ2bSmCPqjg86KE6xJ8byCrEv0HBcDVNvpPiQxrLeernO2fjpebv2s/VOty3H8/Herpz7fz09XV139f7Ir93ftyeX46/Hi7HFSp/+crH19AdlnA7qv+oSCn0slT1hOv16RXytL09UNd+Q8="
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
"name": "balance_of_public",
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
}
|
|
124
124
|
},
|
|
125
125
|
"bytecode": "JwACBAEoAAABBIBGJwAABEYlAAAARScCAgQBJwIDBAAfCgACAAMARC0IRAElAAAARi0CAUUnAgIERScCAwQBOw4AAwACJiUAAAFAHgIAAgknAgMBASQCAAIAAABiJQAAAWYpAgACAO9SU00nAgMAASsCAAQAAAAAAAAAAAMAAAAAAAAAAC0IAQUnAgYEBQAIAQYBJwMFBAEAIgUCBi0KBgctDgIHACIHAgctDgMHACIHAgctDgEHACIHAgctDgQHLQsFAQAiAQIBLQ4BBS0IAQEnAgIEBQAIAQIBJwMBBAEAIgUCAgAiAQIDPw8AAgADJwICBAEAKgECBC0LBAMnAgEAAAoqAwECJwIBAQAKKgIBBCQCAAQAAAEfJQAAAXgeAgABAC8qAAMAAQACHAoCAwYcCgMBABwKAQIGLQoCASYoAAAEBHhGDAAABAMkAAADAAABZSoBAAEF2sX11rRKMm08BAIBJioBAAEF3Btu6/u2vEM8BAIBJioBAAEFursh14IzGGQ8BAIBJg==",
|
|
126
|
-
"debug_symbols": "
|
|
126
|
+
"debug_symbols": "nZbbjuIwDIbfJde9iJ2jeZXRCBUoo0pVQR1YaYV493U6cUtHSrTihvxx2q927Jg81Kk73L/2/Xi+fKvdx0Mdpn4Y+q/9cDm2t/4ysvWhdPoJTu1MoyJPLA9uHsj8DFHtABoFOmQBmIUxImTJypIVixOLE4sHES6LoEVYEZRFlE9EcYMESP5HoAYRCWiSoCzAihALigXFYsRikxs2CZeFE4tLz/gkKAsvFi+WIJaIIjhkRBbJZ2SO0QxEn4TLAmbL89koScv+NnVdyspLnjh713bqxpvajfdhaNSfdrjPD31f23Eeb+3Eq7pR3XjikYHnfuiSejbr27r8KmjQNr/Omp0ShMMNA8oM8imoGUHehoXgt15gzYu4OMEltxCCeTeOWIqjykAbFwb6UGK4CoPrSBBIbiFEtyH4MgGjpNPQGoXF7WaGSjpg2UxChAVhCDaIWEZEShU8IyJ5KiKojDAOlzDWjTT6V1VV0oF8/DOCT7J/j7GmAzGaMqNSnDaQMGw0uDCA/tsNQ7Qm9SWrv92oFRYQSWEZ7UuFBRWEiyYTvF5bRQxvno9AxV5Rq04bpDgDlpyAWPXC+Rcviv0GqAbREBaINrbYtCr74dcC9aixiKi0TgxLiZMttb1aIMS7uMZhY9EJUzuqVgrDuIob9aTYl6RQeTNqJc69RhgE62G1lsvrk6ftsZ82F5lngk19exi6PD3fx+PL6u3vVVbkInSdLsfudJ+6RFpvQ+kv+cND4/1nuu3wJOgm4Oczffof"
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
"name": "check_balance",
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
}
|
|
166
166
|
},
|
|
167
167
|
"bytecode": "JwACBAEoAAABBIBFJwAABEUlAAAARicCAgQBJwIDBAAfCgACAAMARBwAREQGLQhEASUAAABsJwIBBEUnAgIEADsOAAIAASwAAEMAMGROcuExoCm4UEW2gYFYXSgz6Eh5uXCRQ+H1k/AAAAAmJQAAAaceAgACCScCAwEBJAIAAgAAAIglAAABzR4CAAIBCiICQwMWCgMEHAoEBQAEKgUCBCcCAgEACioDAgUkAgAFAAAAuycCBgQAPAYGASkCAAMA71JTTScCBQABKwIABgAAAAAAAAAAAwAAAAAAAAAALQgBBycCCAQFAAgBCAEnAwcEAQAiBwIILQoICS0OAwkAIgkCCS0OBQkAIgkCCS0OBAkAIgkCCS0OBgktCwcDACIDAgMtDgMHLQgBAycCBAQFAAgBBAEnAwMEAQAiBwIEACIDAgU/DwAEAAUnAgQEAQAqAwQGLQsGBScCAwAACioFAwQKKgQCAyQCAAMAAAFzJQAAAd8eAgADAC8qAAUAAwAEHAoEBQYcCgUDABwKAwQGDCoEAQMKKgMCASQCAAEAAAGmJQAAAfEmKAAABAR4RQwAAAQDJAAAAwAAAcwqAQABBdrF9da0SjJtPAQCASYqAQABBQ7+IEnrN048PAQCASYqAQABBbq7IdeCMxhkPAQCASYqAQABBYRygMKEIwtGPAQCASY=",
|
|
168
|
-
"debug_symbols": "
|
|
168
|
+
"debug_symbols": "nZZLbuMwDIbv4nUWEqkHmasUReGmbmHAcAI3GWBQ5O5D1aIfHUgosol+UfEXiq/4q3nrXm8fL/34fv5sjk9fzevUD0P/8TKcT+21P49i/WpM+rAWmyMeZKXm6GQFnFe0eQ3NMcrqZM9pDfPqzWz3fl6D7K1NwmcR1RIpC0IVUQSJ4DALMDYLABV6hHqEanFqcWpJ3szCqeAsAqqgLKL+RMxuACmQfBasQBYgmCRoFmhQhVqsWqxaQC0gboBcGdGpUItL38EkKAuvFq+WELKI4iFwEmLB9DgJENMRcRasFk4WSZ4zToVabEzifj80Wgsv16nrUilsikNK5tJO3XhtjuNtGA7Nn3a4fX/p89KO3+u1neRUrtiNb7IK8L0fuqTuh/VpU36U2If8NHGkBeBhR7BlAgdQAgcXF0LY+wBlgjXkMsFasxIiPnQLMqVbVAhsrfrAFotx8GVCcEEJEoZiHEKZgI4zAIMrRaHqAYN64J0reUA1D3wGOBktaxAeiuKmFn5WUwURA2ZCjGEBuN8n0vDqgsWiC7V6hCUMFtgvCNrHwWIZAaQ9iUybW+wzkYJVDuXSFAxgFway3TN8rS0AlrYIXGbUitLDcpM1oWh+hDNWYmGJMgLkr+YxxpoSAMIyg8sMF3mpbkJYGJZ/7YbM9DWvm8T+50atuixrm1s0oVRdUEF40h4JZu1Sig/1iPelHoFaebqohAglF8DXhj4sM1t0eWBCqEGMjQvEYHHmQSWpYa3PAAaKiMrchLhUOBcnd+0iLFFc7+Go5ASaWqc6LQv0FTfqSXGbpHAxGFgrcJk1yuDNBHYPDvG4/z9/ll176qfda/Q9saa+fR26vH2/jafN6fXvRU/0NfwynU/d223qEmnzLi6fT9EdIj+nF3LZSLeRf76nn/4H"
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"name": "claim",
|
|
@@ -1860,7 +1860,7 @@
|
|
|
1860
1860
|
"name": "fields",
|
|
1861
1861
|
"type": {
|
|
1862
1862
|
"kind": "array",
|
|
1863
|
-
"length":
|
|
1863
|
+
"length": 16,
|
|
1864
1864
|
"type": {
|
|
1865
1865
|
"kind": "field"
|
|
1866
1866
|
}
|
|
@@ -2015,9 +2015,9 @@
|
|
|
2015
2015
|
}
|
|
2016
2016
|
}
|
|
2017
2017
|
},
|
|
2018
|
-
"bytecode": "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",
|
|
2019
|
-
"debug_symbols": "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/O23Qv+2E3efyfp5o3Hb8Pn1wrtOra9w6m/sy5tbPT38/Xequvvh/bdf/r35XPbyo4BiXO9TMd98F3NM6x+ff/ruLz/8/Mtn6Z3PPTsev1aHro6Ht+3tXNvjMVrH3aPjKVrn1vbWj6/pv12PZer7uUy5H8yU68lMxw208/l5bT2b6diez887H9S1t7a3vrext31vc293Pd/1fNeLXS92vdj1YteLXS92vdj1YteLXS92vb7r9V2v73p91+u7Xt/1+q7Xd72+6/VdL3e93PVy1zue1XX88PjxqK5z2/f2qPe0yPGcrnM79naubT32tq1/fzzG69zueufj4I6/73u769WuV7te7Xpj1xu73tj1xq439v6NvX9j1xu73tj1xq43d73jKV7n1vbW93bv39z1jsfDndva27G3c23bYxdsj6ZgCq4QCl0hFUphKKjy8RDAFZqCKbiCKjdVbqrcVLmpcttzsB46GXrqZOixk6HnTroePOl68qTr0ZOuZ0+6Hj4Zevpk6PGToedPhh5AGXoCZexHUK6gfXbts6uyDwXNRmg2QrMRqhyqHKocqhyqHJqN0D6H9rlrn7sqd81z12x0zUbXbHRV7qrcVbmrcqpyajZS+5za59Q+q8Naap5Ts5GajdRsqM1aqXKpcqmyWq2p15qaranbmtrtfKTmWXlontVxTS3X1HPnIzXPVw1VVts19V1T4zV1XlPrNfVeU/Odj908K0/Ns/qvqQGbOvB87OZ61a5s6kFTD5p60NSDph409aCpB88HcR6VzwdxrrBnw9SDph60pspNldWDph409aCpB009aOpBUw+eD+s8K5spuEIodAVVNlVWD5p60NSDph409aCpB009eD6+86zsqaDZUA+aetBClUOV1YOmHjT1oKkHTT1o6kFTD1qoctc8qwdNPWjqQeuq3FVZPWjqQVMPmnrQ1IOmHjT1oOk9zvQmZ+pBUw+aetD0Rmd6pzP1oKkHTT1o6kFTD5p60NSD6wGorieguh6B6noGqushqK6noIYegxp6DmroQaihJ6GGHoUaehZq6GGosZ+GuoIqT82zetDUg6YePJ+Rul6lyupBUw+6etDVg64edPWgqwfPh6kelf2RCqUwFPZseFPlpsrqQVcPunrQ1YOuHnT1oKsHz2ewnpXtodAUTMEVVNlUWT3o6kFXD7p60NWDrh509aC7Knso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4rjEuS5Z616P325ia93r+Tz2te51xyB2YhKLOIhTca173bERjejEIHZiEos4iNAatAatQWvQGrQGrUFr0Bq0Bs2gGTSDZtAMmkEzaAbtdMl67u/pkhVPl+x40uKMRnRiEDsxqVBEaKdL1r89XbIjtIAW0AJaQAtoAS2gBWPrjK1D69A6tA6tQztdsmMRB5GxJbTTJTsa0YlBhJbQElpCS2jFTBZjK8ZWjK2gnS7ZkZksZrKYyYI2oA1oA9qANpjJwdgGYxuMbUAbHLfJTE5mcjKTE9qENqFNaBPaZCbnNba17nXHRrxoa93rjkHsxCQWFQYRWoPWoDUjOjGInQitFXEQr5lc6153hGbQDJpBM2iWRMZmjM0YGy5Z6153ZCadmXRmEpesda87QnNouKTjko5LOi7puGSte91PHee44ZKOSzouWeteV4UODZd0XNJxScclHZd0XNJxyVr3umid44ZLOi7puGSte10VEhou6bik45KOSzou6bik45K17nXRiuOGSzou6bhkrXvdFaDhko5LOi7puKTjko5LOi5Z614XbXDccEnHJR2XrHWvq8KEhks6Lum4pOOSjks6Lum4ZK17PWlr3euORnRiEDsVkljEQYSGSxKXJC5JXLLWvS5a68QkFnEQoRk0XJK4JHFJ4pLEJYlLEpck1yXJdUniksQliUuS65LkuiRxSeKSxCWJSxKXJC5JXLLWvS5acNxwSeKSxCVr3euuAA2XJC5JXJK4JHFJ4pLEJWvd66J1jhsuSVySuGSte10VEhouSVySuCRxSeKSxCWJS9a610UrjhsuSVySuGSte90VoOGSxCWJSxKXJC5JXJK4ZK17XbTBccMliUsSl6x1r6vChIZLEpckLklckrgkcUnikrXuddHmddwKlxQuKVyy1r2eFda61x07MYlFHMRrbIVLCpesda+L1pwYxE5MIrQGDZcULilcUrikcEnhksIla93rolkRB5GZxCXFZ5ziM07hksIlhUsKlxQuKVxSuGSte1204LjhksIlhUuKzzhr3euO0HBJ4ZLCJYVLCpcULlnrXhetc9xwSeGSwiXFZ5y17nVHaLikcEnhksIlhUsKl6x1r4uWHDdcUrikcEnxGWete90RGi4pXFK4pHBJ4ZLCJWvd66INjhsuKVxSuKT4jLPWve4IDZcULilcUrikcEnhkrXuddEmxw2XFC4ZuGTwGWete93RiUHsxCQWcRCvsa11r4vWGtGITgwitAYNlwxcMnDJwCUDlwxcMnDJWve6aNaJSSziIELDJYPrksF1ycAlg884a93rjtBwycAlA5cMrkvWutfjNyzYWvd6/KIAW+tedwxiJyaxiIM4r7hcsmIjQuvQOrQOrUPr0Dq0Di2hJbSEltASWkJLaAktoSW0glbQClpBK2gFraAVtNMlxzM1ba17XfF0yY4H7Xigpq11rzs6MYidmFQoIrTTJevfni7ZEdqENqFNaBPahDahTWjzGtta97rjRVvrXnd0YhA7MYlFHMRrbGvd66KdLtnRiE4MIrQGrUFr0Bo0exAZmzE2Y2wG7XTJjkks4iBCc2gOzaE5NGcmnbE5Y3PG5tCc4xbMZDCTwUwGtIAW0AJaQAtmMhhbZ2ydsXVonePWmcnOTHZmskPr0Dq0hJbQkplMxpaMLRlbQkuOWzKTyUwWM1nQClpBK2gFrZjJYmzF2Iqx4ZK17nVHZnIwk4OZxCVr3euO0AY0XDJxycQlE5dMXLLWvS7a5LjhkolLJi5Z616PCr7Wve7YiEZ0YhA7MYlFFM3XutcVL5f443KJPy6X+Fr3uio0aA1ag9agXS7xR2NsxtiMsRk0c2IQOzGJ0AyaQXNoDs2ZSWdszticsTk0LyIz6cxkMJMBLaAFtIAW0IKZDMYWjC0YW4fWOW6dmezMZGcmO7QOrUPr0Dq0ZCaTsSVjS8aW0JLjlsxkMpPJTCa0glbQClpBK2ayGFsxtmJsBa04boOZHMzkYCYHtAFtQBvQBrTBTA7GNhnbZGwT2uS4TWZyMpOTmZzQJjRc0nBJwyUNlzRc0nBJwyVr3etJW+tedxzEayYbLlnrXleFBg2XNFzScEnDJQ2XNFzScMla97po1ohGdGIQoRk0XNJwScMlDZc0XNJwScMla93ronknMpO4pOGSte51VQhouKThkoZLGi5puKThkoZL1rrXRQuOGy5puKThktahdWi4pOGShksaLmm4pOGShktaQkuOGy5puKThkrXudVeAhksaLmm4pOGShksaLmm4ZK17XbTiuOGShksaLmkD2oCGSxouabik4ZKGSxouabhkrXtdtMlxwyUNlzRc0ia0CQ2XNFzScInhEsMlhksMl6x1rydtrXvdMYlFHERoDRouMVxiuMRwieESwyWGS9a610Vr13EzXGK4xHCJGTSDhksMlxguMVxiuMRwieGSte510dyJzCQuMVxiDs2h4RLDJYZLDJcYLjFcYrhkrXtdtOC44RLDJYZLrEPr0HCJ4RLDJYZLDJcYLjFcsta9Llpy3HCJ4RLDJZbQEhouMVxiuMRwieESwyWGS9a610UrjhsuMVxiuMQKGi4xrkuM6xLDJTagDWgDGi4xXGK4xLguWetej99y4mvda9YZnRjETkxiEQdxKq51rzs2ohGdGMROTGIRBxFag9agNWgNWoPWoDVoDVqD1qAZNINm0AyaQTNoBs2gLZfMM84rLpeseNDqcUYjOjGInZhUKCK00yXr354u2RFaQAtoAS2gBbSAFtCCsXXG1qF1aB1ah9ahnS7ZsYiDyNgS2nLJikZ0YhChJbSEltASWjGTxdiKsRVjK2jLJSsyk8VMFjNZ0Aa0AW1AG9AGMzkY22Bsg7ENaIPjNpnJyUxOZnJCm9AmtAltQpvM5LzGtta97tiIF22te90xiJ2YxKLCIEJr0Bq0ZkQnBrETobUiDuI1k2vd647QDJpBM2gGzZLI2IyxGWPDJWvd647MpDOTzkzikrXudUdoDg2XBC4JXBK4JHDJWve6aMFxwyWBSwKXrHWvq0KHhksClwQuCVwSuCRwSeCSte510TrHDZcELglcsta9rgoJDZcELglcErgkcEngksAla93rohXHDZcELglcsta97grQcEngksAlgUsClwQuCVyy1r0u2uC44ZLAJYFL1rrXVWFCwyWBSwKXBC4JXBK4JHDJWvd60ta61x2N6MQgdioksYiDCA2XdFzScUnHJWvd66K1TkxiEQcRmkHDJR2XdFzScUnHJR2XdFzSuS7pXJd0XNJxScclneuSznVJxyUdl3Rc0nFJxyUdl3Rcsta9Llpw3HBJxyUdl6x1r7sCNFzScUnHJR2XdFzScUnHJWvd66J1jhsu6bik45K17nVVSGi4pOOSjks6Lum4pOOSjkvWutdFK44bLum4pOOSte51V4CGSzou6bik45KOSzou6bhkrXtdtMFxwyUdl3Rcsta9rgoTGi7puKTjko5LOi7puKTjkrXuddHmddwSlyQuSVyy1r2eFda61x07MYlFHMRrbIlLEpesda+L1pwYxE5MIrQGDZckLklckrgkcUniksQla93rolkRB5GZxCXJZ5zkM07iksQliUsSlyQuSVySuGSte1204LjhksQliUuSzzhr3euO0HBJ4pLEJYlLEpckLlnrXhetc9xwSeKSxCXJZ5y17nVHaLgkcUniksQliUsSl6x1r4uWHDdckrgkcUnyGWete90RGi5JXJK4JHFJ4pLEJWvd66INjhsuSVySuCT5jLPWve4IDZckLklckrgkcUnikrXuddEmxw2XJC4pXFJ8xlnrXnd0YhA7MYlFHMRrbGvd66K1RjSiE4MIrUHDJYVLCpcULilcUrikcMla97po1olJLOIgQsMlxXVJcV1SuKT4jLPWve4IDZcULilcUlyXrHWvZWc8x3ZWWJ9xVgxiJyaxiIM4r7hcsuJBG+2MRnRiEDsxiUUcxHnF0yU7QktoCS2hJbSEdrrk+O25vta97sjYirGtzzgrMpPFTBYzWcxkMZPFTBYzWdAGtAFtQBvQBrQBbTC2wUwOZnIwk5OZnMzkZCYnMzmZyclMTmgT2oQ2L9pa97pjI5pmfa17PUex1r3u2IlJLOIgXjO51r3u2IhGhNagNWgNWoPWoDVoxtiMsZkRnRjETkxiEQeRmXRoDs2hOTSH5tBOl6xZP10yxhkHcV7xdMmOjWhEJwaxEw/a8eunfa173XEQ5xVPl+zYiEZ0YhA7EVqH1qF1aAktoR0ued5gPKMT44h1xk5MYhEHcV7xcIliIxrRidAKWkEraAWtoA1oA9qANqANaAPagDagDWgD2oQ2oU1oE9qENqFNaBPahDYv2rnuVbERjejEIHZiEos4iNAatAbtcMnzru0ZD5r1MwaxE5NYxEGcVzxcotiIRoRm0AyaQTNoBs2gOTSH5tAcmkNzaA7NoTk0hxbQAlpAC2gBLaAFtIAW0AJah3a45HlP+4xGdGIQOzGJRRzEecXDJYrQElpCS2gJLaEltISW0ApaQStoBa2gFbSCVtAKWkEb0Aa0AW1AG9AGtAFtQBvQBrQJbUKb0Ca0CW1Cm9AmtAltihbnulfFRjSiE4PYiUks4iBCa9AatAatQWvQGrQGrUFr0Bo0g2bQDJpBM2gGzaAZNINm0ByaQ3NoDs2hOTSH5tAcmkMLaAEtoAW0gBbQAlpAC2gBrUPr0Dq0Dq1D69A6tA6tQ+vQElpCS2gJLaEltISW0BJaQitoBa2gFbSCVtAKWkEraAVtQBvQBrQBbUAb0Aa0AW1AG9AmtAltQpvQJrQJbUKb0CY0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZc0XNJwScMlDZe05ZI840GL9X+dGMROPGgxz3jQjqdKxbnuVfGg5RlPl+zYiEY8aNnPGMSDluOMB63Wvy3iQSv/17ff/O93P//w3Z9//P5/vvnDP59//K9//PSXv//w15/2H//+//6mv/nzzz/8+OMP//2nv/381798/5//+Pn7P/34178cf/fN4/jPcT7/R8tvrf3x+Y/b/v//Yb2+tco/Pt+3j79/9G+fp/DzT+c/N5/fPifl+GM7/hjjW+uP4/Wm1z+P9Lfhtl9/DPo5Ar3+eQn37fMNWq9/Ov/5xzxe78frj1f48XL9++f8xzz+Ov59j7te8bzm9GsP4/Ft9OOv83rF81ODPRn/+tcf//X/AQ==",
|
|
2020
|
-
"verification_key": "
|
|
2018
|
+
"bytecode": "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0rVncGw5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2py7dG3SL7xy7tK1OXfp2py7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5duvZKji3nLl2bc5euzblL1+bcpWtz7tK1OXfp2py7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt07QMcW85dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2ic4tpy7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXk8SxzcOxzcuxzcex5dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6ynHseXcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+t5hGPLuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1lObY8u5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9aTyrHl3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+uB7r+t3qRVm9ROVVq3aN+r1mZP09I33nTzLbfeVqZsudvvuPOuu++59777H3jwoYcfKf/oYxUqPl6pcpWq1Z6oXqNmrSdr13nq6WfqPvvc8y/Ue/Gl+g1SGjZq3KRps+YtXn6lZavWbdq+mtqufYfXXu/Y6Y0333r7nXcDnQNdAu8F3g98EPgw8FGga6Bb4OPAJ4FPA58Fugd6BHoG0gL+QHqgV6B3oE+gb6BfoH/g88CAwMDAoMDgwJDA0MCwwPDAiMDIwKjA6MCYwNjAuMD4wITAxMCkwOTAlMDUwLTA9MCMwMzArMDswJzA3MC8wPzAF4EFgYWBLwOLAl8Fvg58E/g28F3g+8APgR8DPwV+DiwOLAn8EggERGBpYFlgeWBFYGVgVWB1YE1gbWBdYH1gQ2BjYFNgc2BLYGtgW2B7YEdgZ2BXYHdgT2BvYF/g18D+wIHAwcChwOHAkcDRwLHA8cCJwMnAqcDpwG+B3wN/BP4M/BU4E/g78E/gbOBfYeUQliUsW1geYcUIK6ewvMKKFVYuYcUJK15YCcJKFFZuYfmElSSsPMLKK6x8wsovrALCukJYVwrrKmEVFFYhYV0trGuEda2wCgvrOmEVEVaysK4X1g3CKiqsYsIqLqwSwioprFLCKi2sG4V1k7BuFtYtwrpVWLcJq4ywygqrnLBuF9YdwrpTWHcJ625h3SOse4V1n7DuF9YDwnpQWA8J62FhPSKs8sJ6VFiPCauCsCoK63FhVRJWZWFVEVZVYVUT1hPCqi6sGsKqKaxawnpSWLWFVUdYTwnraWE9I6y6wnpWWM8J63lhvSCsesJ6UVgvCau+sBoIK0VYDYXVSFiNhdVEWE2F1UxYzYXVQlgvC+sVYbUUVithtRZWG2G1FdarwkoVVjthtRdWB2G9JqzXhdVRWJ2E9Yaw3hTWW8J6W1jvCOtdYXUWVhdhvSes94X1gbA+FNZHwuoqrG7C+lhYnwjrU2F9JqzuwuohrJ7CShOWX1jpwuolrN7C6iOsvsLqJ6z+wvpcWAOENVBYg4Q1WFhDhDVUWMOENVxYI4Q1UlijhDVaWGOENVZY44Q1XlgThDVRWJOENVlYU4Q1VVjThDVdWDOENVNYs4Q1W1hzhDVXWPOENV9YXwhrgbAWCutLYS0S1lfC+lpY3wjrW2F9J6zvhfWDsH4U1k/C+llYi4W1RFi/CCsgLCGspcJaJqzlwlohrJXCWiWs1cJaI6y1wlonrPXC2iCsjcLaJKzNwtoirK3C2ias7cLaIaydwtolrN3C2iOsvcLaJ6xfhbVfWAeEdVBYh4R1WFhHhHVUWMeEdVxYJ4R1UlinhHVaWL8J63dh/SGsP4X1l7DOCOtvYf0jrLPC+lfYOYRtCdsWtkfYMcLOKWyvsGOFnUvYccKOF3aCsBOFnVvYPmEnCTuPsPMKO5+w8wu7gLCvEPaVwr5K2AWFXUjYVwv7GmFfK+zCwr5O2EWEnSzs64V9g7CLCruYsIsLu4SwSwq7lLBLC/tGYd8k7JuFfYuwbxX2bcIuI+yywi4n7NuFfYew7xT2XcK+W9j3CPteYd8n7PuF/YCwHxT2Q8J+WNiPCLu8sB8V9mPCriDsisJ+XNiVhF1Z2FWEXVXY1YT9hLCrC7uGsGsKu5awnxR2bWHXEfZTwn5a2M8Iu66wnxX2c8J+XtgvCLuesF8U9kvCri/sBsJOEXZDYTcSdmNhNxF2U2E3E3ZzYbcQ9svCfkXYLYXdStithd1G2G2F/aqwU4XdTtjthd1B2K8J+3VhdxR2J2G/Iew3hf2WsN8W9jvCflfYnYXdRdjvCft9YX8g7A+F/ZGwuwq7m7A/FvYnwv5U2J8Ju7uwewi7p7DThO0Xdrqwewm7t7D7CLuvsPsJu7+wPxf2AGEPFPYgYQ8W9hBhDxX2MGEPF/YIYY8U9ihhjxb2GGGPFfY4YY8X9gRhTxT2JGFPFvYUYU8V9jRhTxf2DGHPFPYsYc8W9hxhzxX2PGHPF/YXwl4g7IXC/lLYi4T9lbC/FvY3wv5W2N8J+3th/yDsH4X9k7B/FvZiYS8R9i/CDghbCHupsJcJe7mwVwh7pbBXCXu1sNcIe62w1wl7vbA3CHujsDcJe7Owtwh7q7C3CXu7sHcIe6ewdwl7t7D3CHuvsPcJ+1dh7xf2AWEfFPYhYR8W9hFhHxX2MWEfF/YJYZ8U9ilhnxb2b8L+Xdh/CPtPYf8l7DPC/lvY/wj7rLD/FZ4cwiORbAuPR3hihCen8HiFJ1Z4cglPnPDEC0+C8CQKT27h8QlPkvDkEZ68wpNPePILTwHhuUJ4rhSeq4SnoPAUEp6rheca4blWeAoLz3XCU0R4koXneuG5QXiKCk8x4SkuPCWEp6TwlBKe0sJzo/DcJDw3C88twnOr8NwmPGWEp6zwlBOe24XnDuG5U3juEp67hece4blXeO4TnvuF5wHheVB4HhKeh4XnEeEpLzyPCs9jwlNBeCoKz+PCU0l4KsuP9uXH8PIjc/nxtvwoWn5sLD/ilR/Hyo9O5cec8iNJ+fGh/KhPfiwnP0KTH3fJj6bkx0jyIx/58Yz8KEV+7CE/opAfJ8hH//IxvXykLh9/y0fV8rGyfAQsH9fKR6vyMah8ZCkfL8pHgfKxnXzEJh+HyUdX8jGTfCQkH9/IRy3ysYh8hCEfN8hHA/JtvHzLLd8ey7ey8m2nfIso387Jt17ybZJ8SyPffsi3CvJlvXwJLl8uy5e28mWofMkoX97Jl2LyZdOE2k3ad0htXSGlfcrmHKVzWLYnJqc3NldcfEJibl9Snrz58he44sqrCha6+pprC19XJPn6G4oWK16iZKm0tM05bk3vMqp8oxapBdOXLY89eOqXH5ulpV340dWZf/RA+rJN391Ue21Fb5HQjx7M/KOHMv9INtWsfvhvFj+0c2TxQ8/u9GX9DxUYnTgw9/PODw9k9cNjWf3wt6x++HcWP4yxs/phrqx+6Mvqh7dnMfmYO7L64Z1Z/DDn6ax++FtWP/w9ix/Gzs3qh/Oy+uH8LH4Y1ymrH76R1Q/fzOKHCfdn9cMHsvphFkUjEv/J6odZlU1iVmWTVDiL7UgqmtUPS2f1w9uy+uGdWf3w/qx+WD6rH1bK6oet05dNnNSz8dudf+5y8Yd57k5f9sKC+L/61vp5sPPDhzIfQJGnkuuHA9I3lEo59y6rfqM2rdqmtG/RsGWT+m1SUxrJ/++1JqntWrRpXf/11JS2bZukbs5xZZfRj7Vp3a59ry5jKrRIbdKovd1lbJXW7Zs0a5I68unby6nfoGX891a2/n3nChn/fY7sxa/QZdRjKS1b+hMu+oyr3aSlXPRrTbI3E/kuMpODnV2HScG5NJYd97E2bTtdXFIF95xc5udnnvuyZ17BwMxH1Wnfpq0/PcxMM+zRY6Mfb9Gkpfrj3cQx5xl0YaV5ukx8vE1qkxbNWgf/Z58NxTq0b9GyRftO558JPHaxWGueq9VnzpdqWpq/y+Tzb+/LN26c2qRdu4uz8HcZU6dFq7Ytm5yfTihYhsnGZCsVHSt0mfhoi9YpwYcJ7Wu27RNy8Yx7QoZ+qnlK66CLU6wXg4yp2qFV2ypN0y/+gyu6TK7SuvH5mYY9IXdF+M79xh9Or51VtVyrLqOekqfVn+78+9BRvbDi9DkNO7Ro2bh+q3bN6jds2abRK/WbN2kZPN3WFf/j0z3wMk/3wAuV0zRzhWdvW3M8ntkhp5nTXdE9J5e5nLlr4RWdQSjqiKfvySB63BmEF1VyBuFFlZ1BeFEVZxBeVNUZhBdVcwbhRU84g/Ci6s4gvKiGMwgvqukMwotqOYPwoiedQXhRbWcQXlTHGYQXPeUMwouedgbhRc84g/Cius4gvOhZZxBe9JwzCC963hmEF73gDMKL6jmD8KIXnUF40UvOILyovjMIL2rgDMKLUpxBeFFDZxBe1MgZhBc1dgbhRU2cQXhRU2cQXtTMGYQXNXcG4UUtnEF40cvOILzoFWcQXtTSGYQXtXIG4UWtnUF4URtnEF7U1hmEF73qDMKLUp1BeFE7ZxBe1N4ZhBd1cAbhRa85g/Ci151BeFFHZxBe1MkZhBe94QzCi950BuFFbzmD8KK3nUF40TvOILzoXWcQXhTo7BpFkHVxjSLI3nONIsjed40iyD5wjSLIPnSNIsg+co0iyLq6RhFk3VyjCLKPXSP3q8uMuk9co0t0l/tesOJlv86t0GVk9Tavpbtf1V6Yq5XZ25vd2WX55soaKd/aud9XWe4IGd9GjdN8C2BlCO6EuBg+85rtC9m48D897o255L/EuKd8yX/JmeFdgXw/0yJjji136Az/zXbVVIb/5HGV0Xnn9uEWaWdepPNGMvPGerKX208v+w1anrCJtsMm2hM20TEXE325j0Y+vezc5Mn8cMV2m2V8uJI990cy/vsK2fv3MaHHJlmezNiMJ9PjJPuS3OdyBJf8PM7ZtiwDxI+p+GqHlJbt3DEuesVmeqoS367LqCfapDS++AOv849GyyynNskc2Zt15FwZl5bLOQ5Z/oO4jP8gzvkHo4Lz9Le89HlX4KiBhw4ZTrw3QjOOzZ533uw349jwzdhrqBnHZu5T3gh9Kld2z2KYsLkyh83lXneGbYhz/7cwlvFTQo8MXSWelXucU+bOP5YvlUIFnVXUnOGixmVeSKY6fSfjcmKdvUZrwtmSjLOMde9cOORe+jg168aYOSvewIALS5AsxHfS4/TWcFmLuFce97ZlnlVcoHvoxJ8OG0C94Kyt00MLTgvbCh4LSfqHz0mdDg0jZPpys2JnOfW+oaz8kXnqrlVfnHym150u/QXRoAiinI5I44VehbC5i5iESyaZOQm5AsOc0rjc5mWFP/OZtveSDF9ug/Jm2aBGO9sbNt8VWrwWphdl8aFVXHZ7eSaHeNd7s7LZ+HTjokHCZX/yluh+e6jzoWPu7E0hV+a3C5lPxORwO+RTt6WsNt8XmBGynhZ6QTYui/cysaEXRBnmmGSSN0kAFfOMrN6hZcYlqk5+vszlm0f5j/KOyeow5YvcK/MGvggdpjMZc+XLYj8Xho0eZj99zryzir4sZPxVpt30uROd8T8mAS+D8qhLLKsXQHkC34dScjbsW8Oky/uwV74EPh9CWFbGtOdx3uiEy3VmmuQJ9xbCVVOZ/lFed04yVXc+91ZEeq0V9qWtL3PIS151hO8fPmX/yJdVDlz/Psw/yx+RPHncq89cGfkDq5Qvt/KHKbp8l5A/C+v1oSWvzZiXvO4ef0G0O2z8rF6EumYR5p8VQF9w5c9i8gUCm5V5yRcmL/ndCMxsnS+wzTmM4eYe8QFTmH90ReZ/VMA9q4wNx7V/V0TYoHzOBkVwSAq/e3WatwxbOLlDD3Oz+o95L32ci7eO/JddHvnds8iqPA66XopGgGjebMzaF6GR+NyWF8F1ed/OGWjq2zmBU/9nX8+53EChb/bRA12zsMnyhzcf2EwPlDPmms+TpzZ4gh5od65aFe3ZnxVRBwrzVNET5rFoFk8tXU+pMlZbrLBCL92EFZvxofXFUCFFgTCKbL9YjgEfZHqcf3BJ5PgwD3UTwr02uvDjxCzSE+96apohPYnCyp9hA3I5/yzDY90ER5L1A+WMi4tXPNZNyPgPEjI+LhNWYrhCzObjXEv5jb3p/9tv7HW5+/K+sWfdffEVtX3ZHwntjH5nL/qdveh39qLf2Yt+Zy/6nb3od/ai39mLfmcv+p29Jv8n39nLQpbVV/aykH3qGkWQfeYaRZB1d40iyHq4RhFkPV2jCLI01yiCzO8aRZClu0YRZO5RBFlv1yiCrI9rFEHW1zWKIOvnGkWQ9XeNIsg+d40iyAa4RhFkA12jCLJBrlEE2WDXKIJsiGsUQTbUNYogG+YaRZANd40iyEa4RhFkI12jCLJRrlEE2WjXKIJsjGsUQTbWNYogG+caRZCNd40iyCa4RhFkE12jCLJJrlEE2WTXKIJsimsUQTbVNYogm+YaRZBNd40iyGa4RhFkM12jCLJZrlEE2WzXKIJsjmsUQTbXNYogm+caRZDNd40iyL5wjSLIFrhGEWQLXaMIsi9dowiyRa5RBNlXrlEE2deuUQTZN65RBNm3rlEE2XeuUQTZ965RBNkPrlEE2Y+uUQTZT65RBNnPrlEE2WLXKIJsiWsUQfaLaxRBFnCNIsiEaxRBttQ1iiBb5hpFkC13jSLIVrhGEWQrXaMIslWuUQTZatcogmyNaxRBttY1iiBb5xpFkK13jSLINrhGEWQbXaMIsk2uUQTZZtcogmyLaxRBttU1iiDb5hpFkG13jSLIdrhGEWQ7XaMIsl2uUQTZbtcogmyPaxRBttc1iiDb5xpFkP3qGkWQ7XeNIsgOuEYRZAddowiyQ65RBNlh1yiC7IhrFEF21DWKIDvmGkWQHXeNIshOuEYRZCddowiyU65RBNlp1yiC7DfXKILsd9coguwP1yiC7E/XKILsL9coguyMaxRB9rdrFEH2j2sUQXbWNYog+9c1Ci8TVg73MJLQcg8jCW33MJLQ4x5GEsa4h5GEOd3DSEKvexhJGOseRhLmcg8jCePcw0jCePcwkjDBPYwkTHQPIwlzu4eRhD73MJIwyT2MJMzjHkYS5nUPIwnzuYeRhPndw0jCAu5hJOEV7mEk4ZXuYSThVe5hJGFB9zCSsJB7GEl4tXsYSXiNexhJeK17GElY2D2MJLzOPYwkLOIeRhImu4eRhNe7h5GEN7iHkYRF3cNIwmLuYSRhcfcwJMzid/iFVcI9vET5v/8t/u3E3+LfEf0t/gvfccqp9Xv8wcIK94v8wVIKuef5n/wuv1XyP/q7/MF0X+Zv82e1tuhv8zf5n/02f/CFzn/49/nly9RLf6NfWJ9Gf6U/3P9Ff6XfbZbFb8wGX0bRfqc/+ILz/9Xf6hfWXRdXUfw/9Hv9wip98eD7Tf9mv7Buvbjom5W/2y+sO/5Tv9wvrHIXU9Mb+PX+4PzVv98vrHuAX/APqv47v+EvrAdcRfL/X7/jL6zyrl3+/+pv+W//f+O3/IVVxfSv+QurxkXzJ6K/6G/gF/2F9czFE9UP+FV/YT1r9nf9hfXKResX/ju/7S+sBhfzMuD/4Pf9B0d/3z/zf/OpO8n/5Bf+hdVG/TpM91f+hdX+4rJTgV/6F1bn/9Rv/Qurozo5ur/3L6w3Xcfy/6Hf/A/uUvRX/50a6ep+jfq/+eX/IMouq313utvUb/8LKy366/8Z/y/66/+ZHkIa+/X/4RfPwEjlr/9P+//er/9P/W//+v8407/+/1WzJu3rtyxbv32b+i3L1W/VpFXDJqntmrdoW//1Fu1by162OUe5//Ff7ml5mX+5p+UF3lx52R8meWi3AFRwz8llnukzvYv6cJ/oVQz7ed7jF/Jw1aVHqJLbPgxxPVm9jg//2Dybaa182WktFvZtmifsp3wxyg9Vr7/sT+gqXXZuimf+jM+1uphLPxPK9Ow2Z4TPc7zZnYjJT9pzGnoUmcVD1pyuLnvJ33i7/sLfeKvUpP0TZZ9q80S56hebXd3zvS494593c+3a+MpNUtqWT01N6eR+ulws/dI//NZl9HlJhr8HV6xXWGcr7H+xw/4XT68MUSP9r2x9LcDJ4v9bn97e9F/+7LaYmT8H2NLUW46y/3d/DnBD8dZt2rdo2ql+o9QmKe2bNK7fukPLli2atmiSGvozoG1T23Ts9L//458VL/NFRsULLTjxsv/Kg3XZ1AFeZNiZCZnVi4xRhv4saEX2nwWN+Nc9v2yb2uI1WX01zpXiY+crsUaoELP4q55OCMrf9az4/+Df9dxQsl2wjdZv0bp+k45NGkmUtmldv1FKo+YX/57vxb/je+v/+ChXvsyjXPlCFRW87IMYc9kv/4Cj7H45yPj7vdl+jxTu/Yd12S/zY7L/GjRn+NegHkOvQXNG+DaIzrc9cyq/flgowos6T9h3hpUu/Otil10llf+v2vn/Gy8+i/6XX3xeeykaS2XjLb4V5p3Uwgs8Pbe2Kq0rhnjwWBAHwT8Fn+V7JY8n/Dud9DDvmzwM/FY2hd9b/g/xe/P/r5urWWkgBsLZWG27niruRR/As++gXhV8gGLrCgvL0pam+Bil9KBnb4IgHn0WH8b9yW6SSaYkbChtr0uSmZ2fbz4mP5xHx9mUxSwn0hM2SpPx8IVlY16L01TU4MsDqcEDDzWjbefDogYfy4urdzMMj3KW8aWOMr7Kee25/Yddw6gLw9n+FIZK4Qh0eK4Uon/LU+WhzJQ7nijFyOVy7bcfg/eN1jadGjUy4Mc8EHYM+C62B3w/lZjclMUOxezpOXn9IwNoCOcuPJh/0hIdu64c2YwoRCIZ9Y+pOBGY8Rjq43iwMbQkWn0h/auaUIbx/aR5Cu3ok8u9SRbaX1FsVqc4KaexuQ3DH9nIEKcY2eq4cidw34oI1cyszZhAfZwx9rqtHVajpOaZ1bfImCRbxLP5OxQWtYz2cz/1kwh9moUha6lw0kIEFo+cyhtiUUO1nsZ5LKWj2UA+pDQIhA7Aec395Gj1KzuvNPFwyvJqFmfzN6he6OYGCuefenZjKBZG7EE3oQNqxUBGB2ox3IQOAZLSFDqj2XMP/wFH8UZySR8LAA==",
|
|
2019
|
+
"debug_symbols": "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",
|
|
2020
|
+
"verification_key": "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"
|
|
2021
2021
|
},
|
|
2022
2022
|
{
|
|
2023
2023
|
"name": "claim_and_end_setup",
|
|
@@ -3712,7 +3712,7 @@
|
|
|
3712
3712
|
"name": "fields",
|
|
3713
3713
|
"type": {
|
|
3714
3714
|
"kind": "array",
|
|
3715
|
-
"length":
|
|
3715
|
+
"length": 16,
|
|
3716
3716
|
"type": {
|
|
3717
3717
|
"kind": "field"
|
|
3718
3718
|
}
|
|
@@ -3867,9 +3867,9 @@
|
|
|
3867
3867
|
}
|
|
3868
3868
|
}
|
|
3869
3869
|
},
|
|
3870
|
-
"bytecode": "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2HJ66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euPYZjy+mla3N66dqcXro2p5euzemla3N66dqcXro2p5euTfp1S04vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9f+lmPL6aVrc3rp2pxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2qSGLpxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2ls4tpxeujanl67N6aVrc3rp2pxeujanl67N6aVr/8ux5fTStTm9dG1OL12b00vX5vTStTm9dG1OL12b00vX5vTStTm9dG1OL12b00vX5vTSdTi9dB1OL12H00vX4fTSdTi9dB1OL12H00vX4fTSdTi9dB1OL12H00vX4fTSdTi9dB1OL12H00vXCXBsMzm2BTm2hTi2nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tU4Nhy+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86lTi2nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63zp0cW07/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91sji2nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPp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mPPfW/n6992q5fz3Cfmbv1r3wVWbtmoVTDvlM+zOFq3kpp9pkb+VyPezuRzs/Dp8FV5Lc1mbq7Zt1+XUlqp51+QxP7HyjDNeeTUDKx98V8e27YLZUVaa44yqDqnRskUr9Rcp04eeoNXJnWZ2H1GjbVaLlk+0Cf+f7627uFPHlq1aduxy4ulE1VPJ2vB4rt57IlV79w52H3niQUPl5s2zWnTocGoVwe5D72rZul2rFieWE5ksx2IL5CsUnat1H1GlZZum4ccaHRu2ey/i4gyrJ6e++8mmbcIubrKemmRonU6t29V+PPvUPzir+8jabZqfWGnUG3J9jN9u/WH+ntXj6lRo3X3w3fK2BrPdfx+5qid3nD3hsU4tWzV/tHWHJx59rFXbZk8/+mSLVuHbbZ31P77dn5zh7f7kZOY8njvD83esCTVyOySaud3VvWvymMuVezZe3R1EZv38nhtziGq4g+iimu4guqiWO4guqu0OoovquIPoorruILqonjuILqrvDqKLGriD6KKG7iC6qJE7iC66wx1EF93pDqKL7nIH0UV3u4PoonvcQXTRve4guqixO4guus8dRBfd7w6iix5wB9FFD7qD6KKH3EF00cPuILroEXcQXfSoO4guauIOoouauoPoosfcQXRRM3cQXdTcHUQXtXAH0UWPu4PooifcQXTRk+4guqilO4guesodRBc97Q6ii1q5g+ii1u4guqiNO4guausOoovauYPoovbuILooyx1EF3VwB9FFHd1BdFEndxBd9Iw7iC561h1EF3V2B9FFXdxBdNFz7iC66Hl3EF30gjuILnrRHUQXveQOoou6uoPoolA3zyiGrLtnFEP2smcUQ/aKZxRD9qpnFEP2mmcUQ/a6ZxRD1sMziiHr6RnFkL3hGXlfXebUvekZnaY70/eC1c/4dW617oPqt30m2/uq9uRardzevvyuLs83V9Yg+dbO+77K8s6Q823UMM23AFaOyd0pTk2fe8/2yWic/D8d78Gc9r8U8C75tP8lMce7Avl+pmXOGFveqXP8b7Ynp3L8T44njU44d4y2STv3Jt03krkP1slfbN864zdomVEDbUcNtBM10AVOBfpMH428dcaxycz9cMX2muV8uJI/90o5/321/P37ApHHJnnezKScN9Nxg31a7JNdwWk/T3GPLc8JUodWb9+paasO3jlOeSXleqqS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",
|
|
3871
|
-
"debug_symbols": "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",
|
|
3872
|
-
"verification_key": "
|
|
3870
|
+
"bytecode": "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tTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWvP4Nhy7tK1OXfp2py7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqkX3jl3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2py7dO2VHFvOXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2gc4tpy7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StU9wbDl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euJ4ljm4djm5djm49jy7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1lOOY8u5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bzCMeWc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rac2x5Zz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/60nlWPLuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/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",
|
|
3871
|
+
"debug_symbols": "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5e5B6x607kHrHrTuQesetO7B84t2z8r66CAdtIN16MralbsHrXvQugete9C6B6170LoHzbqyeYeeje5B6x48v8J3vaordw9a96B1D1r3oHUPWvegdQ+eX/N7Vvae5+5B6x607sHza37PV42u3D1o3YPWPWjdg9Y9aN2D1j1o0ZWj57l70LoHrXvQ+lLT+lrTugete9C6B6170LoHrXvQugfPLwc+K2fPc/egdQ9a96D1hef55cArdOXuQesetO5B6x607kHrHjy/LvisPHueuwete9C6B60vQ2125e5B6x607kHrHvTuQe8e9O5Bf+zK/vAOo0N0yA7Vr+rK3YPePejdg9496N2D3j3o3YMuXVmqw54N7x707kHva1HXrtw96N2D3j3o3YPePejdg9496NaVTTv0bHQPeveg97WoW1fuHvTuQe8e9O5B7x707kHvHnTvyt7z3D3o3YPePeh9LeqjK3cPevegdw9696B3D3r3oHcP+ujK0fPcPejdg9496H0t6t2D3u+D3u+D3j3ofS3q2ZX7M593D3r3oHcPer8P+tmDeYTjG9ofR6gOc4fzS9/PIB20g3XwDqNDdOjK1ZWrK8+uPLvy7MqzK8+uPLvy7MqzK8+uPHfl8Xh0kA7awTp4h9EhOmSH6tCVpStLV5aufPRgnHcFvMPocFS2I2SH6jB3OH/jxBlkv+r8nRNn6Mrnb504/83o0JW1K2tX1q5sXdm6snVl68rW+2y9z9aVrStbV7au7F356MEVtIN16H32rnz04ArZoTrMHUZXHl15dOXRlUdXHj0bo/d59D6P3ufRlY8eXKFnI3o2omcjunJ05ejK0ZWjK0fPRvY+Z+9z9j5nV86e5+zZyJ6N7NnIrpxdubpydeXqytWzUb3P1ftcvc/VlavnuXo2Zs/G7NmYXXl25dmVZ1eeXXn2bMze57n3OR6PDrtyPLSDdfAOo0P0q7JDdejK0pVFOmgH6+AdurJEh+xQHfZsRPdgaFfWrqxduXswugejezC6B6N7MLQr26NDz0b3YHQPhnVl68rdg9E9GN2D0T0Y3YPRPRjdg+Fd2XueuwejezC6B8O7snfl7sHoHozuwegejO7B6B6M7sEYXXn0PHcPRvdgdA9GdOXoyt2D0T0Y3YPRPRjdg9E9GN2DkV05e567B6N7MLoHI7tyduXuwegejO7B6B6M7sHo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JYZL1rrXRUuOGy4xXGK4xPiMY7jEuC4xrksMlxifcda61x2h4RLDJYZLjOuSte71+C01uta9nt/fvta97ujEQQxiEos4O651rzsKUYlGdOIgBjGJRYQm0ASaQBNoAk2gCTSBJtAEmkJTaApNoSk0habQFNrpkvU9wadLVjxdsuNJG2dUohGdOIhBhSRCO12y/u3pkh2hOTSH5tAcmkNzaA7NGdtgbAPagDagDWgD2umSHZNYRMYW0E6X7KhEIzoRWkALaAEtoCUzmYwtGVsytoR2umRHZjKZyWQmE1pBK2gFraAVM1mMrRhbMbaCVhy3yUxOZnIykxPahDahTWgT2mQm5zW2te51RyFetLXudUcnDmIQkwpFhCbQBJoo0YhOHERoksQiXjO51r3uCE2hKTSFptA0iIxNGZsyNlyy1r3uyEwaM2nMJC5Z6153hGbQcMnAJQOXDFwycMla97q/pZzjhksGLhm4ZK17XRUGNFwycMnAJQOXDFwycMnAJWvd66INjhsuGbhk4JK17nVVCGi4ZOCSgUsGLhm4ZOCSgUvWutdFS44bLhm4ZOCSte51V4CGSwYuGbhk4JKBSwYuGbhkrXtdtOK44ZKBSwYuWeteV4UJDZcMXDJwycAlA5cMXDJwyVr3etLWutcdlWhEJw4qBDGJRYSGSwKXBC4JXLLWvS6aDGIQk1hEaAoNlwQuCVwSuCRwSeCSwCXBdUlwXRK4JHBJ4JLguiS4LglcErgkcEngksAlgUsCl6x1r4vmHDdcErgkcMla97orQMMlgUsClwQuCVwSuCRwyVr3umiD44ZLApcELlnrXleFgIZLApcELglcErgkcEngkrXuddGS44ZLApcELlnrXncFaLgkcEngksAlgUsClwQuWeteF604brgkcEngkrXudVWY0HBJ4JLAJYFLApcELglcsta9Ltq8jlviksQliUvWutezwlr3uuMgBjGJRbzGlrgkccla97poYkQnDmIQoQk0XJK4JHFJ4pLEJYlLEpesda+LpkksIjOJS5LPOMlnnMQliUsSlyQuSVySuCRxyVr3umjOccMliUsSlySfcda61x2h4ZLEJYlLEpckLklcsta9LtrguOGSxCWJS5LPOGvd647QcEniksQliUsSlyQuWeteFy04brgkcUnikuQzzlr3uiM0XJK4JHFJ4pLEJYlL1rrXRSuO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",
|
|
3872
|
+
"verification_key": "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"
|
|
3873
3873
|
},
|
|
3874
3874
|
{
|
|
3875
3875
|
"name": "public_dispatch",
|
|
@@ -3941,7 +3941,7 @@
|
|
|
3941
3941
|
}
|
|
3942
3942
|
},
|
|
3943
3943
|
"bytecode": "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",
|
|
3944
|
-
"debug_symbols": "
|
|
3944
|
+
"debug_symbols": "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"
|
|
3945
3945
|
}
|
|
3946
3946
|
],
|
|
3947
3947
|
"outputs": {
|
|
@@ -4202,63 +4202,63 @@
|
|
|
4202
4202
|
"path": "std/hash/mod.nr",
|
|
4203
4203
|
"source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\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;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\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// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\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 crate::assert_constant(separator);\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, true)[0].x\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 crate::assert_constant(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// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\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 // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [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: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::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 {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\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 u128 {\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 u8 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 u16 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 u32 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 u64 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<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"
|
|
4204
4204
|
},
|
|
4205
|
-
"
|
|
4205
|
+
"234": {
|
|
4206
4206
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/oracle/version.nr",
|
|
4207
4207
|
"source": "/// The ORACLE_VERSION constant is used to check that the oracle interface is in sync between PXE and Aztec.nr. We need\n/// to version the oracle interface to ensure that developers get a reasonable error message if they use incompatible\n/// versions of Aztec.nr and PXE. The TypeScript counterpart is in `oracle_version.ts`.\n///\n/// @dev Whenever a contract function or Noir test is run, the `utilityAssertCompatibleOracleVersion` oracle is called\n/// and if the oracle version is incompatible an error is thrown.\npub global ORACLE_VERSION: Field = 12;\n\n/// Asserts that the version of the oracle is compatible with the version expected by the contract.\npub fn assert_compatible_oracle_version() {\n // Safety: This oracle call returns nothing: we only call it to check Aztec.nr and Oracle interface versions are\n // compatible. It is therefore always safe to call.\n unsafe {\n assert_compatible_oracle_version_wrapper();\n }\n}\n\nunconstrained fn assert_compatible_oracle_version_wrapper() {\n assert_compatible_oracle_version_oracle(ORACLE_VERSION);\n}\n\n#[oracle(utilityAssertCompatibleOracleVersion)]\nunconstrained fn assert_compatible_oracle_version_oracle(version: Field) {}\n\nmod test {\n use super::{assert_compatible_oracle_version_oracle, ORACLE_VERSION};\n\n #[test]\n unconstrained fn compatible_oracle_version() {\n assert_compatible_oracle_version_oracle(ORACLE_VERSION);\n }\n\n #[test(should_fail_with = \"Incompatible oracle version. TXE is using version\")]\n unconstrained fn incompatible_oracle_version() {\n let arbitrary_incorrect_version = 318183437;\n assert_compatible_oracle_version_oracle(arbitrary_incorrect_version);\n }\n}\n"
|
|
4208
4208
|
},
|
|
4209
|
-
"299": {
|
|
4210
|
-
"path": "/home/aztec-dev/nargo/github.com/noir-lang/poseidon/v0.2.3/src/poseidon2.nr",
|
|
4211
|
-
"source": "use std::default::Default;\nuse std::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)\n }\n\n pub(crate) 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 self.state[0] += self.cache[0];\n self.state[1] += self.cache[1];\n self.state[2] += self.cache[2];\n self.state = crate::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>(input: [Field; N], in_len: u32) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut state = [0; 4];\n state[RATE] = iv;\n\n if std::runtime::is_unconstrained() {\n for i in 0..(in_len / RATE) {\n state[0] += input[i * RATE];\n state[1] += input[i * RATE + 1];\n state[2] += input[i * RATE + 2];\n state = crate::poseidon2_permutation(state, 4);\n }\n\n // handle remaining elements after last full RATE-sized chunk\n let num_extra_fields = in_len % RATE;\n if num_extra_fields != 0 {\n let remainder_start = in_len - num_extra_fields;\n state[0] += input[remainder_start];\n if num_extra_fields > 1 {\n state[1] += input[remainder_start + 1]\n }\n }\n } else {\n let mut states: [[Field; 4]; N / RATE + 1] = [[0; 4]; N / RATE + 1];\n states[0] = state;\n\n // process all full RATE-sized chunks, storing state after each permutation\n for chunk_idx in 0..(N / RATE) {\n for i in 0..RATE {\n state[i] += input[chunk_idx * RATE + i];\n }\n state = crate::poseidon2_permutation(state, 4);\n states[chunk_idx + 1] = state;\n }\n\n // get state at the last full block before in_len\n let first_partially_filled_chunk = in_len / RATE;\n state = states[first_partially_filled_chunk];\n\n // handle remaining elements after last full RATE-sized chunk\n let remainder_start = (in_len / RATE) * RATE;\n for j in 0..RATE {\n let idx = remainder_start + j;\n if idx < in_len {\n state[j] += input[idx];\n }\n }\n }\n\n // always run final permutation unless we just completed a full chunk\n // still need to permute once if in_len is 0\n if (in_len == 0) | (in_len % RATE != 0) {\n state = crate::poseidon2_permutation(state, 4)\n };\n\n state[0]\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"
|
|
4212
|
-
},
|
|
4213
4209
|
"3": {
|
|
4214
4210
|
"path": "std/array/mod.nr",
|
|
4215
4211
|
"source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl<T, let N: u32> [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a vector.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_vector();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n pub fn as_vector(self) -> [T] {}\n\n /// Returns this array as a vector.\n /// This method is deprecated in favor of `as_vector`.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_slice();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n #[deprecated(\"This method has been renamed to `as_vector`\")]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi<U, Env>(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each<Env>(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi<Env>(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold<U, Env>(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce<Env>(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the [`Self::sort_via`] function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via<Env>(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl<let N: u32> [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str<N> {}\n}\n\nimpl<let N: u32> From<str<N>> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str<N>) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n"
|
|
4216
4212
|
},
|
|
4217
|
-
"
|
|
4218
|
-
"path": "/home/aztec-dev/
|
|
4219
|
-
"source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, nullifier::Nullifier, private_log::PrivateLog,\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\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\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 compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\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 DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn compute_siloed_private_log(contract_address: AztecAddress, log: PrivateLog) -> PrivateLog {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n key_type_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n key_type_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_message_hash(\n message: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = message.contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = message.inner.recipient.to_be_bytes();\n let content_bytes: [u8; 32] = message.inner.content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::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 = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> 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.get(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 subarray_hash_matches_fixed() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash the entire values_to_hash.\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(values_to_hash, values_to_hash.len());\n\n assert_eq(subarray_hash, fixed_len_hash);\n}\n\n#[test]\nfn subarray_hash_matches_variable() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash up to values_to_hash.len() fields of the padded array.\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(padded, values_to_hash.len());\n\n assert_eq(subarray_hash, variable_len_hash);\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 unique_siloed_note_hash_matches_typescript() {\n let inner_note_hash = 1;\n let contract_address = AztecAddress::from_field(2);\n let first_nullifier = 3;\n let note_index_in_tx = 4;\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, inner_note_hash);\n let siloed_note_hash_from_ts =\n 0x1986a4bea3eddb1fff917d629a13e10f63f514f401bdd61838c6b475db949169;\n assert_eq(siloed_note_hash, siloed_note_hash_from_ts);\n\n let nonce: Field = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n let note_hash_nonce_from_ts =\n 0x28e7799791bf066a57bb51fdd0fbcaf3f0926414314c7db515ea343f44f5d58b;\n assert_eq(nonce, note_hash_nonce_from_ts);\n\n let unique_siloed_note_hash_from_nonce = compute_unique_note_hash(nonce, siloed_note_hash);\n let unique_siloed_note_hash = compute_note_nonce_and_unique_note_hash(\n siloed_note_hash,\n first_nullifier,\n note_index_in_tx,\n );\n assert_eq(unique_siloed_note_hash_from_nonce, unique_siloed_note_hash);\n\n let unique_siloed_note_hash_from_ts =\n 0x29949aef207b715303b24639737c17fbfeb375c1d965ecfa85c7e4f0febb7d16;\n assert_eq(unique_siloed_note_hash, unique_siloed_note_hash_from_ts);\n}\n\n#[test]\nfn siloed_nullifier_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let nullifier = 456;\n\n let res = compute_siloed_nullifier(contract_address, nullifier);\n\n let siloed_nullifier_from_ts =\n 0x169b50336c1f29afdb8a03d955a81e485f5ac7d5f0b8065673d1e407e5877813;\n\n assert_eq(res, siloed_nullifier_from_ts);\n}\n\n#[test]\nfn siloed_private_log_first_field_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let field = 456;\n let res = compute_siloed_private_log_first_field(contract_address, field);\n\n let siloed_private_log_first_field_from_ts =\n 0x29480984f7b9257fded523d50addbcfc8d1d33adcf2db73ef3390a8fd5cdffaa;\n\n assert_eq(res, siloed_private_log_first_field_from_ts);\n}\n\n#[test]\nfn empty_l2_to_l1_message_hash_matches_typescript() {\n // All zeroes\n let res = compute_l2_to_l1_message_hash(\n L2ToL1Message { recipient: EthAddress::zero(), content: 0 }.scope(AztecAddress::from_field(\n 0,\n )),\n 0,\n 0,\n );\n\n let empty_l2_to_l1_msg_hash_from_ts =\n 0x003b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992;\n\n assert_eq(res, empty_l2_to_l1_msg_hash_from_ts);\n}\n\n#[test]\nfn l2_to_l1_message_hash_matches_typescript() {\n let message = L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n );\n let version = 4;\n let chainId = 5;\n\n let hash = compute_l2_to_l1_message_hash(message, version, chainId);\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
|
|
4213
|
+
"302": {
|
|
4214
|
+
"path": "/home/aztec-dev/nargo/github.com/noir-lang/poseidon/v0.2.3/src/poseidon2.nr",
|
|
4215
|
+
"source": "use std::default::Default;\nuse std::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)\n }\n\n pub(crate) 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 self.state[0] += self.cache[0];\n self.state[1] += self.cache[1];\n self.state[2] += self.cache[2];\n self.state = crate::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>(input: [Field; N], in_len: u32) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut state = [0; 4];\n state[RATE] = iv;\n\n if std::runtime::is_unconstrained() {\n for i in 0..(in_len / RATE) {\n state[0] += input[i * RATE];\n state[1] += input[i * RATE + 1];\n state[2] += input[i * RATE + 2];\n state = crate::poseidon2_permutation(state, 4);\n }\n\n // handle remaining elements after last full RATE-sized chunk\n let num_extra_fields = in_len % RATE;\n if num_extra_fields != 0 {\n let remainder_start = in_len - num_extra_fields;\n state[0] += input[remainder_start];\n if num_extra_fields > 1 {\n state[1] += input[remainder_start + 1]\n }\n }\n } else {\n let mut states: [[Field; 4]; N / RATE + 1] = [[0; 4]; N / RATE + 1];\n states[0] = state;\n\n // process all full RATE-sized chunks, storing state after each permutation\n for chunk_idx in 0..(N / RATE) {\n for i in 0..RATE {\n state[i] += input[chunk_idx * RATE + i];\n }\n state = crate::poseidon2_permutation(state, 4);\n states[chunk_idx + 1] = state;\n }\n\n // get state at the last full block before in_len\n let first_partially_filled_chunk = in_len / RATE;\n state = states[first_partially_filled_chunk];\n\n // handle remaining elements after last full RATE-sized chunk\n let remainder_start = (in_len / RATE) * RATE;\n for j in 0..RATE {\n let idx = remainder_start + j;\n if idx < in_len {\n state[j] += input[idx];\n }\n }\n }\n\n // always run final permutation unless we just completed a full chunk\n // still need to permute once if in_len is 0\n if (in_len == 0) | (in_len % RATE != 0) {\n state = crate::poseidon2_permutation(state, 4)\n };\n\n state[0]\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"
|
|
4220
4216
|
},
|
|
4221
4217
|
"39": {
|
|
4222
4218
|
"path": "std/ops/arith.nr",
|
|
4223
4219
|
"source": "use crate::convert::AsPrimitive;\n\n// docs:start:add-trait\npub trait Add {\n fn add(self, other: Self) -> Self;\n}\n// docs:end:add-trait\n\nimpl Add for Field {\n fn add(self, other: Field) -> Field {\n self + other\n }\n}\n\nimpl Add for u128 {\n fn add(self, other: u128) -> u128 {\n self + other\n }\n}\nimpl Add for u64 {\n fn add(self, other: u64) -> u64 {\n self + other\n }\n}\nimpl Add for u32 {\n fn add(self, other: u32) -> u32 {\n self + other\n }\n}\nimpl Add for u16 {\n fn add(self, other: u16) -> u16 {\n self + other\n }\n}\nimpl Add for u8 {\n fn add(self, other: u8) -> u8 {\n self + other\n }\n}\nimpl Add for u1 {\n fn add(self, other: u1) -> u1 {\n self + other\n }\n}\n\nimpl Add for i8 {\n fn add(self, other: i8) -> i8 {\n self + other\n }\n}\nimpl Add for i16 {\n fn add(self, other: i16) -> i16 {\n self + other\n }\n}\nimpl Add for i32 {\n fn add(self, other: i32) -> i32 {\n self + other\n }\n}\nimpl Add for i64 {\n fn add(self, other: i64) -> i64 {\n self + other\n }\n}\n\n// docs:start:sub-trait\npub trait Sub {\n fn sub(self, other: Self) -> Self;\n}\n// docs:end:sub-trait\n\nimpl Sub for Field {\n fn sub(self, other: Field) -> Field {\n self - other\n }\n}\n\nimpl Sub for u128 {\n fn sub(self, other: u128) -> u128 {\n self - other\n }\n}\nimpl Sub for u64 {\n fn sub(self, other: u64) -> u64 {\n self - other\n }\n}\nimpl Sub for u32 {\n fn sub(self, other: u32) -> u32 {\n self - other\n }\n}\nimpl Sub for u16 {\n fn sub(self, other: u16) -> u16 {\n self - other\n }\n}\nimpl Sub for u8 {\n fn sub(self, other: u8) -> u8 {\n self - other\n }\n}\nimpl Sub for u1 {\n fn sub(self, other: u1) -> u1 {\n self - other\n }\n}\n\nimpl Sub for i8 {\n fn sub(self, other: i8) -> i8 {\n self - other\n }\n}\nimpl Sub for i16 {\n fn sub(self, other: i16) -> i16 {\n self - other\n }\n}\nimpl Sub for i32 {\n fn sub(self, other: i32) -> i32 {\n self - other\n }\n}\nimpl Sub for i64 {\n fn sub(self, other: i64) -> i64 {\n self - other\n }\n}\n\n// docs:start:mul-trait\npub trait Mul {\n fn mul(self, other: Self) -> Self;\n}\n// docs:end:mul-trait\n\nimpl Mul for Field {\n fn mul(self, other: Field) -> Field {\n self * other\n }\n}\n\nimpl Mul for u128 {\n fn mul(self, other: u128) -> u128 {\n self * other\n }\n}\nimpl Mul for u64 {\n fn mul(self, other: u64) -> u64 {\n self * other\n }\n}\nimpl Mul for u32 {\n fn mul(self, other: u32) -> u32 {\n self * other\n }\n}\nimpl Mul for u16 {\n fn mul(self, other: u16) -> u16 {\n self * other\n }\n}\nimpl Mul for u8 {\n fn mul(self, other: u8) -> u8 {\n self * other\n }\n}\nimpl Mul for u1 {\n fn mul(self, other: u1) -> u1 {\n self * other\n }\n}\n\nimpl Mul for i8 {\n fn mul(self, other: i8) -> i8 {\n self * other\n }\n}\nimpl Mul for i16 {\n fn mul(self, other: i16) -> i16 {\n self * other\n }\n}\nimpl Mul for i32 {\n fn mul(self, other: i32) -> i32 {\n self * other\n }\n}\nimpl Mul for i64 {\n fn mul(self, other: i64) -> i64 {\n self * other\n }\n}\n\n// docs:start:div-trait\npub trait Div {\n fn div(self, other: Self) -> Self;\n}\n// docs:end:div-trait\n\nimpl Div for Field {\n fn div(self, other: Field) -> Field {\n self / other\n }\n}\n\nimpl Div for u128 {\n fn div(self, other: u128) -> u128 {\n self / other\n }\n}\nimpl Div for u64 {\n fn div(self, other: u64) -> u64 {\n self / other\n }\n}\nimpl Div for u32 {\n fn div(self, other: u32) -> u32 {\n self / other\n }\n}\nimpl Div for u16 {\n fn div(self, other: u16) -> u16 {\n self / other\n }\n}\nimpl Div for u8 {\n fn div(self, other: u8) -> u8 {\n self / other\n }\n}\nimpl Div for u1 {\n fn div(self, other: u1) -> u1 {\n self / other\n }\n}\n\nimpl Div for i8 {\n fn div(self, other: i8) -> i8 {\n self / other\n }\n}\nimpl Div for i16 {\n fn div(self, other: i16) -> i16 {\n self / other\n }\n}\nimpl Div for i32 {\n fn div(self, other: i32) -> i32 {\n self / other\n }\n}\nimpl Div for i64 {\n fn div(self, other: i64) -> i64 {\n self / other\n }\n}\n\n// docs:start:rem-trait\npub trait Rem {\n fn rem(self, other: Self) -> Self;\n}\n// docs:end:rem-trait\n\nimpl Rem for u128 {\n fn rem(self, other: u128) -> u128 {\n self % other\n }\n}\nimpl Rem for u64 {\n fn rem(self, other: u64) -> u64 {\n self % other\n }\n}\nimpl Rem for u32 {\n fn rem(self, other: u32) -> u32 {\n self % other\n }\n}\nimpl Rem for u16 {\n fn rem(self, other: u16) -> u16 {\n self % other\n }\n}\nimpl Rem for u8 {\n fn rem(self, other: u8) -> u8 {\n self % other\n }\n}\nimpl Rem for u1 {\n fn rem(self, other: u1) -> u1 {\n self % other\n }\n}\n\nimpl Rem for i8 {\n fn rem(self, other: i8) -> i8 {\n self % other\n }\n}\nimpl Rem for i16 {\n fn rem(self, other: i16) -> i16 {\n self % other\n }\n}\nimpl Rem for i32 {\n fn rem(self, other: i32) -> i32 {\n self % other\n }\n}\nimpl Rem for i64 {\n fn rem(self, other: i64) -> i64 {\n self % other\n }\n}\n\n// docs:start:neg-trait\npub trait Neg {\n fn neg(self) -> Self;\n}\n// docs:end:neg-trait\n\n// docs:start:neg-trait-impls\nimpl Neg for Field {\n fn neg(self) -> Field {\n -self\n }\n}\n\nimpl Neg for i8 {\n fn neg(self) -> i8 {\n -self\n }\n}\nimpl Neg for i16 {\n fn neg(self) -> i16 {\n -self\n }\n}\nimpl Neg for i32 {\n fn neg(self) -> i32 {\n -self\n }\n}\nimpl Neg for i64 {\n fn neg(self) -> i64 {\n -self\n }\n}\n// docs:end:neg-trait-impls\n\n// docs:start:wrapping-add-trait\npub trait WrappingAdd {\n fn wrapping_add(self, y: Self) -> Self;\n}\n// docs:end:wrapping-add-trait\n\nimpl WrappingAdd for u1 {\n fn wrapping_add(self: u1, y: u1) -> u1 {\n self ^ y\n }\n}\n\nimpl WrappingAdd for u8 {\n fn wrapping_add(self: u8, y: u8) -> u8 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u16 {\n fn wrapping_add(self: u16, y: u16) -> u16 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u32 {\n fn wrapping_add(self: u32, y: u32) -> u32 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u64 {\n fn wrapping_add(self: u64, y: u64) -> u64 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u128 {\n fn wrapping_add(self: u128, y: u128) -> u128 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for i8 {\n fn wrapping_add(self: i8, y: i8) -> i8 {\n let x = self as u8;\n x.wrapping_add(y as u8) as i8\n }\n}\n\nimpl WrappingAdd for i16 {\n fn wrapping_add(self: i16, y: i16) -> i16 {\n let x = self as u16;\n x.wrapping_add(y as u16) as i16\n }\n}\n\nimpl WrappingAdd for i32 {\n fn wrapping_add(self: i32, y: i32) -> i32 {\n let x = self as u32;\n x.wrapping_add(y as u32) as i32\n }\n}\n\nimpl WrappingAdd for i64 {\n fn wrapping_add(self: i64, y: i64) -> i64 {\n let x = self as u64;\n x.wrapping_add(y as u64) as i64\n }\n}\nimpl WrappingAdd for Field {\n fn wrapping_add(self: Field, y: Field) -> Field {\n self + y\n }\n}\n\n// docs:start:wrapping-sub-trait\npub trait WrappingSub {\n fn wrapping_sub(self, y: Self) -> Self;\n}\n// docs:start:wrapping-sub-trait\n\nimpl WrappingSub for u1 {\n fn wrapping_sub(self: u1, y: u1) -> u1 {\n self ^ y\n }\n}\n\nimpl WrappingSub for u8 {\n fn wrapping_sub(self: u8, y: u8) -> u8 {\n wrapping_sub_hlp(self, y) as u8\n }\n}\n\nimpl WrappingSub for u16 {\n fn wrapping_sub(self: u16, y: u16) -> u16 {\n wrapping_sub_hlp(self, y) as u16\n }\n}\n\nimpl WrappingSub for u32 {\n fn wrapping_sub(self: u32, y: u32) -> u32 {\n wrapping_sub_hlp(self, y) as u32\n }\n}\nimpl WrappingSub for u64 {\n fn wrapping_sub(self: u64, y: u64) -> u64 {\n wrapping_sub_hlp(self, y) as u64\n }\n}\nimpl WrappingSub for u128 {\n fn wrapping_sub(self: u128, y: u128) -> u128 {\n wrapping_sub_hlp(self, y) as u128\n }\n}\n\nimpl WrappingSub for i8 {\n fn wrapping_sub(self: i8, y: i8) -> i8 {\n let x = self as u8;\n x.wrapping_sub(y as u8) as i8\n }\n}\n\nimpl WrappingSub for i16 {\n fn wrapping_sub(self: i16, y: i16) -> i16 {\n let x = self as u16;\n x.wrapping_sub(y as u16) as i16\n }\n}\n\nimpl WrappingSub for i32 {\n fn wrapping_sub(self: i32, y: i32) -> i32 {\n let x = self as u32;\n x.wrapping_sub(y as u32) as i32\n }\n}\nimpl WrappingSub for i64 {\n fn wrapping_sub(self: i64, y: i64) -> i64 {\n let x = self as u64;\n x.wrapping_sub(y as u64) as i64\n }\n}\nimpl WrappingSub for Field {\n fn wrapping_sub(self: Field, y: Field) -> Field {\n self - y\n }\n}\n\n// docs:start:wrapping-mul-trait\npub trait WrappingMul {\n fn wrapping_mul(self, y: Self) -> Self;\n}\n// docs:start:wrapping-mul-trait\n\nimpl WrappingMul for u1 {\n fn wrapping_mul(self: u1, y: u1) -> u1 {\n self & y\n }\n}\n\nimpl WrappingMul for u8 {\n fn wrapping_mul(self: u8, y: u8) -> u8 {\n wrapping_mul_hlp(self, y)\n }\n}\n\nimpl WrappingMul for u16 {\n fn wrapping_mul(self: u16, y: u16) -> u16 {\n wrapping_mul_hlp(self, y)\n }\n}\n\nimpl WrappingMul for u32 {\n fn wrapping_mul(self: u32, y: u32) -> u32 {\n wrapping_mul_hlp(self, y)\n }\n}\nimpl WrappingMul for u64 {\n fn wrapping_mul(self: u64, y: u64) -> u64 {\n wrapping_mul_hlp(self, y)\n }\n}\n\nimpl WrappingMul for i8 {\n fn wrapping_mul(self: i8, y: i8) -> i8 {\n let x = self as u8;\n x.wrapping_mul(y as u8) as i8\n }\n}\n\nimpl WrappingMul for i16 {\n fn wrapping_mul(self: i16, y: i16) -> i16 {\n let x = self as u16;\n x.wrapping_mul(y as u16) as i16\n }\n}\n\nimpl WrappingMul for i32 {\n fn wrapping_mul(self: i32, y: i32) -> i32 {\n let x = self as u32;\n x.wrapping_mul(y as u32) as i32\n }\n}\n\nimpl WrappingMul for i64 {\n fn wrapping_mul(self: i64, y: i64) -> i64 {\n let x = self as u64;\n x.wrapping_mul(y as u64) as i64\n }\n}\n\nimpl WrappingMul for u128 {\n fn wrapping_mul(self: u128, y: u128) -> u128 {\n wrapping_mul128_hlp(self, y)\n }\n}\nimpl WrappingMul for Field {\n fn wrapping_mul(self: Field, y: Field) -> Field {\n self * y\n }\n}\n\nfn wrapping_add_hlp<T>(x: T, y: T) -> T\nwhere\n T: AsPrimitive<Field>,\n Field: AsPrimitive<T>,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\nfn wrapping_sub_hlp<T>(x: T, y: T) -> Field\nwhere\n T: AsPrimitive<Field>,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n x.as_() + 340282366920938463463374607431768211456 - y.as_()\n}\n\nfn wrapping_mul_hlp<T>(x: T, y: T) -> T\nwhere\n T: AsPrimitive<Field>,\n Field: AsPrimitive<T>,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\nglobal two_pow_64: u128 = 0x10000000000000000;\n/// Splits a 128 bits number into two 64 bits limbs\nunconstrained fn split64(x: u128) -> (u64, u64) {\n let lo = x as u64;\n let hi = (x / two_pow_64) as u64;\n (lo, hi)\n}\n\n/// Split a 128 bits number into two 64 bits limbs\n/// It will fail if the number is more than 128 bits\nfn split_into_64_bit_limbs(x: u128) -> (u64, u64) {\n // Safety: the limbs are constrained below\n let (x_lo, x_hi) = unsafe { split64(x) };\n assert(x as Field == x_lo as Field + x_hi as Field * two_pow_64 as Field);\n (x_lo, x_hi)\n}\n\n#[field(bn254)]\nfn wrapping_mul128_hlp(x: u128, y: u128) -> u128 {\n let (x_lo, x_hi) = split_into_64_bit_limbs(x);\n let (y_lo, y_hi) = split_into_64_bit_limbs(y);\n // Multiplication using the limbs:(x_lo + 2**64*x_hi)*(y_lo + 2**64*y_hi)=x_lo*y_lo+...\n // and skipping the terms over 2**128\n // Working with u64 limbs ensures that we cannot overflow the field modulus.\n let low = x_lo as Field * y_lo as Field;\n let lo = low as u64 as Field;\n let carry = (low - lo) / two_pow_64 as Field;\n let high = x_lo as Field * y_hi as Field + x_hi as Field * y_lo as Field + carry;\n let hi = high as u64 as Field;\n (lo + two_pow_64 as Field * hi) as u128\n}\n\nmod tests {\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n crate::static_assert(1 == 2, \"custom message\");\n }\n\n mod arithmetic {\n use crate::ops::arith::{Add, Div, Mul, Neg, Rem, Sub};\n #[test]\n fn test_basic_arithmetic_traits() {\n // add\n assert_eq(5.add(3), 8);\n assert_eq(0u8.add(255u8), 255u8);\n assert_eq(42.add(58), 100);\n\n // sub\n assert_eq(10.sub(3), 7);\n assert_eq(100.sub(42), 58);\n\n // mul\n assert_eq(6.mul(7), 42);\n\n // div\n assert_eq(15.div(3), 5);\n assert_eq(10u8.div(3u8), 3u8);\n assert_eq(15.div(3), 5);\n\n // rem\n assert_eq(17.rem(5), 2);\n assert_eq(10u8.rem(3u8), 1u8);\n\n // neg\n assert_eq(42.neg(), -42);\n assert_eq((-10).neg(), 10);\n assert_eq(42.neg(), -42);\n }\n\n #[test]\n fn test_division() {\n // test division by one\n assert_eq(42.div(1), 42);\n assert_eq(0.div(1), 0);\n assert_eq(255u8.div(1u8), 255u8);\n\n // test division by self\n assert_eq(42.div(42), 1);\n assert_eq(1.div(1), 1);\n\n // test remainder\n assert_eq(42.rem(42), 0);\n assert_eq(0.rem(42), 0);\n assert_eq(1.rem(42), 1);\n }\n\n #[test(should_fail)]\n fn test_u8_sub_overflow_failure() {\n let _ = 0u8.sub(1u8);\n }\n\n #[test(should_fail)]\n fn test_u8_add_overflow_failure() {\n let _ = 255u8.add(1u8);\n }\n\n #[test(should_fail)]\n fn test_u8_mul_overflow_failure() {\n let _ = 255u8.mul(2u8);\n }\n\n #[test(should_fail)]\n fn test_u16_sub_overflow_failure() {\n let _ = 0u16.sub(1u16);\n }\n\n #[test(should_fail)]\n fn test_u16_add_overflow_failure() {\n let _ = 65535u16.add(1u16);\n }\n\n #[test(should_fail)]\n fn test_u16_mul_overflow_failure() {\n let _ = 65535u16.mul(2u16);\n }\n\n #[test(should_fail)]\n fn test_signed_sub_overflow_failure() {\n let val: i8 = -128;\n let _ = val.sub(1i8);\n }\n\n #[test(should_fail)]\n fn test_signed_overflow_failure() {\n let _ = 127i8.add(1i8);\n }\n\n #[test]\n fn test_field() {\n let zero: Field = 0;\n let one: Field = 1;\n\n // test Field basic operations\n assert_eq(zero.add(one), one);\n assert_eq(one.add(zero), one);\n assert_eq(one.sub(one), zero);\n assert_eq(one.mul(one), one);\n assert_eq(one.div(one), one);\n assert_eq(zero.neg(), zero);\n assert_eq(one.neg(), -one);\n }\n\n }\n\n mod wrapping_arithmetic {\n use crate::ops::arith::{Add, Div, Mul, Neg, Sub, WrappingAdd, WrappingMul, WrappingSub};\n #[test]\n fn test_wrapping_add() {\n assert_eq(255u8.wrapping_add(1u8), 0u8);\n assert_eq(255u8.wrapping_add(255u8), 254u8);\n assert_eq(0u8.wrapping_add(0u8), 0u8);\n assert_eq(128u8.wrapping_add(128u8), 0u8);\n\n // test u16 wrapping add\n assert_eq(65535u16.wrapping_add(1u16), 0u16);\n assert_eq(65535u16.wrapping_add(65535u16), 65534u16);\n\n // test u32 wrapping add\n assert_eq(0xffffffffu32.wrapping_add(1u32), 0u32);\n assert_eq(0xffffffffu32.wrapping_add(0xffffffffu32), 0xfffffffeu32);\n\n // test u64 wrapping add\n assert_eq(0xffffffffffffffffu64.wrapping_add(1u64), 0u64);\n assert_eq(\n 0xffffffffffffffffu64.wrapping_add(0xffffffffffffffffu64),\n 0xfffffffffffffffeu64,\n );\n\n // test u128 wrapping add\n assert_eq(0xffffffffffffffffffffffffffffffffu128.wrapping_add(1u128), 0u128);\n\n // test signed types\n assert_eq(127i8.wrapping_add(1i8), -128i8);\n let val: i8 = -128;\n assert_eq(val.wrapping_add(-1i8), 127i8);\n\n // test Field wrapping add\n let forty_two: Field = 42;\n let fifty_eight: Field = 58;\n let hundred: Field = 100;\n let neg_two: Field = -2;\n let two: Field = 2;\n let zero: Field = 0;\n let neg_two_hundred: Field = -200;\n let neg_one_ninety_eight: Field = -198;\n assert_eq(forty_two.wrapping_add(fifty_eight), hundred);\n assert_eq(neg_two.wrapping_add(two), zero);\n assert_eq(neg_two_hundred.wrapping_add(two), neg_one_ninety_eight);\n }\n\n #[test]\n fn test_wrapping_sub() {\n assert_eq(0u8.wrapping_sub(1u8), 255u8);\n assert_eq(255u8.wrapping_sub(255u8), 0u8);\n assert_eq(0u8.wrapping_sub(0u8), 0u8);\n assert_eq(1u8.wrapping_sub(2u8), 255u8);\n\n // test u16 wrapping sub\n assert_eq(0u16.wrapping_sub(1u16), 65535u16);\n assert_eq(65535u16.wrapping_sub(65535u16), 0u16);\n\n // test u32 wrapping sub\n assert_eq(0u32.wrapping_sub(1u32), 0xffffffffu32);\n assert_eq(0xffffffffu32.wrapping_sub(0xffffffffu32), 0u32);\n\n // test u64 wrapping sub\n assert_eq(0u64.wrapping_sub(1u64), 0xffffffffffffffffu64);\n assert_eq(0xffffffffffffffffu64.wrapping_sub(0xffffffffffffffffu64), 0u64);\n\n // test u128 wrapping sub\n assert_eq(0u128.wrapping_sub(1u128), 0xffffffffffffffffffffffffffffffffu128);\n\n // test signed types\n let val: i8 = -128;\n assert_eq(val.wrapping_sub(1i8), 127i8);\n assert_eq(127i8.wrapping_sub(-1i8), -128i8);\n\n // test Field wrapping sub\n let forty_two: Field = 42;\n let fifty_eight: Field = 58;\n let neg_sixteen: Field = -16;\n assert_eq(forty_two.wrapping_sub(fifty_eight), neg_sixteen);\n }\n\n #[test]\n fn test_wrapping_mul() {\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n assert_eq(zero, zero.wrapping_mul(one));\n assert_eq(zero, one.wrapping_mul(zero));\n assert_eq(one, one.wrapping_mul(one));\n assert_eq(zero, zero.wrapping_mul(two_pow_64));\n assert_eq(zero, two_pow_64.wrapping_mul(zero));\n assert_eq(two_pow_64, two_pow_64.wrapping_mul(one));\n assert_eq(two_pow_64, one.wrapping_mul(two_pow_64));\n assert_eq(zero, two_pow_64.wrapping_mul(two_pow_64));\n assert_eq(one, u128_max.wrapping_mul(u128_max));\n\n // test u8 wrapping mul\n assert_eq(255u8.wrapping_mul(2u8), 254u8);\n assert_eq(255u8.wrapping_mul(255u8), 1u8);\n assert_eq(128u8.wrapping_mul(2u8), 0u8);\n\n // test u16 wrapping mul\n assert_eq(65535u16.wrapping_mul(2u16), 65534u16);\n assert_eq(65535u16.wrapping_mul(65535u16), 1u16);\n\n // test u32 wrapping mul\n assert_eq(0xffffffffu32.wrapping_mul(2u32), 0xfffffffeu32);\n assert_eq(0xffffffffu32.wrapping_mul(0xffffffffu32), 1u32);\n\n // test u64 wrapping mul\n // 0xffffffffffffffffu64 is 2^64 - 1\n assert_eq(0xffffffffffffffffu64.wrapping_mul(2u64), 0xfffffffffffffffeu64);\n assert_eq(0xffffffffffffffffu64.wrapping_mul(0xffffffffffffffffu64), 1u64);\n\n // test signed types\n assert_eq(127i8.wrapping_mul(2i8), -2i8);\n let val: i8 = -128;\n assert_eq(val.wrapping_mul(-1i8), -128i8);\n\n // test Field wrapping mul\n let six: Field = 6;\n let seven: Field = 7;\n let forty_two: Field = 42;\n let neg_two: Field = -2;\n let two: Field = 2;\n let neg_four: Field = -4;\n assert_eq(six.wrapping_mul(seven), forty_two);\n assert_eq(neg_two.wrapping_mul(two), neg_four);\n }\n\n #[test]\n fn test_u1_behavior() {\n // u1 wrapping add is XOR\n assert_eq(0u1.wrapping_add(0u1), 0u1);\n assert_eq(0u1.wrapping_add(1u1), 1u1);\n assert_eq(1u1.wrapping_add(0u1), 1u1);\n assert_eq(1u1.wrapping_add(1u1), 0u1);\n\n // u1 wrapping sub is XOR\n assert_eq(0u1.wrapping_sub(0u1), 0u1);\n assert_eq(0u1.wrapping_sub(1u1), 1u1);\n assert_eq(1u1.wrapping_sub(0u1), 1u1);\n assert_eq(1u1.wrapping_sub(1u1), 0u1);\n\n // u1 wrapping mul is AND\n assert_eq(0u1.wrapping_mul(0u1), 0u1);\n assert_eq(0u1.wrapping_mul(1u1), 0u1);\n assert_eq(1u1.wrapping_mul(0u1), 0u1);\n assert_eq(1u1.wrapping_mul(1u1), 1u1);\n }\n\n // test wrapping operations is the same as the regular operations\n #[test]\n fn test_wrapping_vs_regular() {\n let u64_large = 0x123456789abcdef0u64;\n let u128_large = 0x123456789abcdef0123456789abcdef0u128;\n\n assert_eq(u64_large.wrapping_add(1u64), u64_large + 1u64);\n assert_eq(u64_large.wrapping_sub(1u64), u64_large - 1u64);\n assert_eq(u64_large.wrapping_mul(2u64), u64_large * 2u64);\n\n assert_eq(u128_large.wrapping_add(1u128), u128_large + 1u128);\n assert_eq(u128_large.wrapping_sub(1u128), u128_large - 1u128);\n assert_eq(u128_large.wrapping_mul(2u128), u128_large * 2u128);\n }\n\n #[test]\n fn test_field_wrapping_operations() {\n let zero: Field = 0;\n let one: Field = 1;\n let large_val = 0xffffffffffffffff;\n\n // test Field wrapping operations\n assert_eq(zero.wrapping_add(one), one);\n assert_eq(one.wrapping_add(large_val), one + large_val);\n assert_eq(zero.wrapping_sub(one), -one);\n assert_eq(one.wrapping_sub(large_val), one - large_val);\n assert_eq(zero.wrapping_mul(one), zero);\n assert_eq(one.wrapping_mul(large_val), large_val);\n\n // test Field basic operations\n assert_eq(zero.add(one), one);\n assert_eq(one.add(zero), one);\n assert_eq(one.sub(one), zero);\n assert_eq(one.mul(one), one);\n assert_eq(one.div(one), one);\n assert_eq(zero.neg(), zero);\n assert_eq(one.neg(), -one);\n }\n\n }\n\n mod split_functions {\n\n use crate::ops::arith::{split64, split_into_64_bit_limbs};\n\n // test split64 and split_into_64_bit_limbs functions\n #[test]\n fn test_split_functions() {\n let small_val = 0x123456789abcdefu128;\n let large_val = 0x123456789abcdef0123456789abcdef0u128;\n let max_val = 0xffffffffffffffffffffffffffffffffu128;\n\n // test split64 (unconstrained)\n // Safety: testing\n unsafe {\n let (lo, hi) = split64(small_val);\n assert_eq(lo, 0x123456789abcdefu64);\n assert_eq(hi, 0u64);\n\n let (lo2, hi2) = split64(large_val);\n assert_eq(lo2, 0x123456789abcdef0u64);\n assert_eq(hi2, 0x123456789abcdef0u64);\n }\n\n // test split_into_64_bit_limbs (constrained)\n let (lo3, hi3) = split_into_64_bit_limbs(small_val);\n assert_eq(lo3, 0x123456789abcdefu64);\n assert_eq(hi3, 0u64);\n\n let (lo4, hi4) = split_into_64_bit_limbs(large_val);\n assert_eq(lo4, 0x123456789abcdef0u64);\n assert_eq(hi4, 0x123456789abcdef0u64);\n\n let (lo5, hi5) = split_into_64_bit_limbs(max_val);\n assert_eq(lo5, 0xffffffffffffffffu64);\n assert_eq(hi5, 0xffffffffffffffffu64);\n }\n }\n}\n"
|
|
4224
4220
|
},
|
|
4225
|
-
"
|
|
4221
|
+
"391": {
|
|
4222
|
+
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
|
|
4223
|
+
"source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, nullifier::Nullifier, private_log::PrivateLog,\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\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\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 compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\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 DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn compute_siloed_private_log(contract_address: AztecAddress, log: PrivateLog) -> PrivateLog {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n key_type_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n key_type_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_message_hash(\n message: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = message.contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = message.inner.recipient.to_be_bytes();\n let content_bytes: [u8; 32] = message.inner.content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::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 = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> 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.get(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 subarray_hash_matches_fixed() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash the entire values_to_hash.\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(values_to_hash, values_to_hash.len());\n\n assert_eq(subarray_hash, fixed_len_hash);\n}\n\n#[test]\nfn subarray_hash_matches_variable() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash up to values_to_hash.len() fields of the padded array.\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(padded, values_to_hash.len());\n\n assert_eq(subarray_hash, variable_len_hash);\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 unique_siloed_note_hash_matches_typescript() {\n let inner_note_hash = 1;\n let contract_address = AztecAddress::from_field(2);\n let first_nullifier = 3;\n let note_index_in_tx = 4;\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, inner_note_hash);\n let siloed_note_hash_from_ts =\n 0x1986a4bea3eddb1fff917d629a13e10f63f514f401bdd61838c6b475db949169;\n assert_eq(siloed_note_hash, siloed_note_hash_from_ts);\n\n let nonce: Field = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n let note_hash_nonce_from_ts =\n 0x28e7799791bf066a57bb51fdd0fbcaf3f0926414314c7db515ea343f44f5d58b;\n assert_eq(nonce, note_hash_nonce_from_ts);\n\n let unique_siloed_note_hash_from_nonce = compute_unique_note_hash(nonce, siloed_note_hash);\n let unique_siloed_note_hash = compute_note_nonce_and_unique_note_hash(\n siloed_note_hash,\n first_nullifier,\n note_index_in_tx,\n );\n assert_eq(unique_siloed_note_hash_from_nonce, unique_siloed_note_hash);\n\n let unique_siloed_note_hash_from_ts =\n 0x29949aef207b715303b24639737c17fbfeb375c1d965ecfa85c7e4f0febb7d16;\n assert_eq(unique_siloed_note_hash, unique_siloed_note_hash_from_ts);\n}\n\n#[test]\nfn siloed_nullifier_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let nullifier = 456;\n\n let res = compute_siloed_nullifier(contract_address, nullifier);\n\n let siloed_nullifier_from_ts =\n 0x169b50336c1f29afdb8a03d955a81e485f5ac7d5f0b8065673d1e407e5877813;\n\n assert_eq(res, siloed_nullifier_from_ts);\n}\n\n#[test]\nfn siloed_private_log_first_field_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let field = 456;\n let res = compute_siloed_private_log_first_field(contract_address, field);\n\n let siloed_private_log_first_field_from_ts =\n 0x29480984f7b9257fded523d50addbcfc8d1d33adcf2db73ef3390a8fd5cdffaa;\n\n assert_eq(res, siloed_private_log_first_field_from_ts);\n}\n\n#[test]\nfn empty_l2_to_l1_message_hash_matches_typescript() {\n // All zeroes\n let res = compute_l2_to_l1_message_hash(\n L2ToL1Message { recipient: EthAddress::zero(), content: 0 }.scope(AztecAddress::from_field(\n 0,\n )),\n 0,\n 0,\n );\n\n let empty_l2_to_l1_msg_hash_from_ts =\n 0x003b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992;\n\n assert_eq(res, empty_l2_to_l1_msg_hash_from_ts);\n}\n\n#[test]\nfn l2_to_l1_message_hash_matches_typescript() {\n let message = L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n );\n let version = 4;\n let chainId = 5;\n\n let hash = compute_l2_to_l1_message_hash(message, version, chainId);\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
|
|
4224
|
+
},
|
|
4225
|
+
"399": {
|
|
4226
4226
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/merkle_tree.nr",
|
|
4227
4227
|
"source": "use crate::{\n hash::{accumulate_sha256, poseidon2_hash},\n traits::Empty,\n utils::math::is_power_of_2_u32,\n};\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn sha_merkle_hash(left: Field, right: Field) -> Field {\n accumulate_sha256(left, right)\n}\n\n#[derive(Eq)]\npub struct MerkleTree<let N: u32> {\n pub leaves: [Field; N],\n pub nodes: [Field; N - 1],\n}\n\nimpl<let N: u32> Empty for MerkleTree<N> {\n fn empty() -> Self {\n MerkleTree { leaves: [0; N], nodes: [0; N - 1] }\n }\n}\n\nimpl<let N: u32> MerkleTree<N> {\n pub fn new(leaves: [Field; N]) -> Self {\n let nodes = compute_merkle_tree_nodes(leaves, merkle_hash);\n MerkleTree { leaves, nodes }\n }\n\n pub fn new_sha(leaves: [Field; N]) -> Self {\n let nodes = compute_merkle_tree_nodes(leaves, sha_merkle_hash);\n MerkleTree { leaves, nodes }\n }\n\n pub fn get_root(self) -> Field {\n self.nodes[N - 2]\n }\n\n pub fn get_sibling_path<let K: u32>(self, leaf_index: u32) -> [Field; K] {\n assert_eq(2.pow_32(K as Field), N as Field, \"Invalid path length\");\n\n let mut path = [0; K];\n let mut current_index = leaf_index;\n let mut subtree_width = N;\n\n let mut current_sibling_index = sibling_index(current_index);\n\n path[0] = self.leaves[current_sibling_index];\n\n let mut subtree_offset: u32 = 0;\n\n for i in 1..K {\n current_index = current_index / 2;\n subtree_width = subtree_width / 2;\n\n current_sibling_index = sibling_index(current_index);\n\n path[i] = self.nodes[subtree_offset + current_sibling_index];\n\n subtree_offset += subtree_width;\n }\n\n path\n }\n}\n\npub fn sibling_index(index: u32) -> u32 {\n if index % 2 == 0 {\n index + 1\n } else {\n index - 1\n }\n}\n\npub fn compute_merkle_tree_nodes<let N: u32>(\n leaves: [Field; N],\n hasher: fn(Field, Field) -> Field,\n) -> [Field; N - 1] {\n // Note: `N` must be a power of 2.\n std::static_assert(is_power_of_2_u32(N), \"N must be a power of 2\");\n std::static_assert(N != 1, \"2 must divide N\");\n\n let mut nodes = [0; N - 1];\n\n let total_nodes = N - 1;\n let half_size = N / 2;\n\n // Hash base layer.\n for i in 0..half_size {\n nodes[i] = hasher(leaves[2 * i], leaves[2 * i + 1]);\n }\n\n // Hash the other layers.\n for i in 0..(total_nodes - half_size) {\n nodes[half_size + i] = hasher(nodes[2 * i], nodes[2 * i + 1]);\n }\n\n nodes\n}\n"
|
|
4228
4228
|
},
|
|
4229
|
-
"
|
|
4229
|
+
"401": {
|
|
4230
4230
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/root.nr",
|
|
4231
4231
|
"source": "use crate::merkle_tree::merkle_tree::{compute_merkle_tree_nodes, merkle_hash, sha_merkle_hash};\n\n/// Calculate the Merkle tree root from the sibling path and leaf, using the default merkle hash.\npub fn root_from_sibling_path<let N: u32>(\n leaf: Field,\n leaf_index: Field,\n sibling_path: [Field; N],\n) -> Field {\n root_from_sibling_path_with_hasher(leaf, leaf_index, sibling_path, merkle_hash)\n}\n\n/// Calculate the Merkle tree root from the sibling path and leaf, using a custom hasher.\n///\n/// The leaf is hashed with its sibling, the result is then hashed with the next sibling in the path. and so on.\n/// The last hash is the root.\npub fn root_from_sibling_path_with_hasher<let N: u32>(\n leaf: Field,\n leaf_index: Field,\n sibling_path: [Field; N],\n hasher: fn(Field, Field) -> Field,\n) -> Field {\n let mut node = leaf;\n let indices: [u1; N] = leaf_index.to_le_bits();\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = hasher(hash_left, hash_right);\n }\n node\n}\n\npub fn compute_tree_root<let N: u32>(leaves: [Field; N]) -> Field {\n compute_tree_root_with_hasher(leaves, merkle_hash)\n}\n\npub fn compute_sha_tree_root<let N: u32>(leaves: [Field; N]) -> Field {\n compute_tree_root_with_hasher(leaves, sha_merkle_hash)\n}\n\nfn compute_tree_root_with_hasher<let N: u32>(\n leaves: [Field; N],\n hasher: fn(Field, Field) -> Field,\n) -> Field {\n compute_merkle_tree_nodes(leaves, hasher)[N - 2]\n}\n\npub fn compute_empty_tree_root<let TreeHeight: u32>() -> Field {\n compute_empty_tree_root_with_hasher::<TreeHeight>(merkle_hash)\n}\n\npub fn compute_empty_sha_tree_root<let TreeHeight: u32>() -> Field {\n compute_empty_tree_root_with_hasher::<TreeHeight>(sha_merkle_hash)\n}\n\npub fn compute_empty_tree_root_with_hasher<let TreeHeight: u32>(\n hasher: fn(Field, Field) -> Field,\n) -> Field {\n let mut hashes = [0; TreeHeight + 1];\n for i in 1..TreeHeight + 1 {\n hashes[i] = hasher(hashes[i - 1], hashes[i - 1]);\n }\n hashes[TreeHeight]\n}\n\n#[test]\nfn test_merkle_roots_match_typescript() {\n // The following hardcoded values are generated from yarn-project/foundation/src/trees/balanced_merkle_tree_root.test.ts\n\n let root = compute_tree_root([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);\n let expected_tree_root_from_ts =\n 0x1528946361c480e8dc1e9ae3f8c31c997625fa1ddeddc7db5ad0dce3ac58fc4c;\n assert_eq(root, expected_tree_root_from_ts);\n\n let empty_root = compute_tree_root([0; 16]);\n let expected_empty_root_from_ts =\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e;\n assert_eq(empty_root, expected_empty_root_from_ts);\n\n let sha_root = compute_sha_tree_root([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);\n let expected_sha_root_from_ts =\n 0x00b007869b8a5e2a9b3b580a318e702cea04b2f5438f2e26743f545e4d1ecbdb;\n assert_eq(sha_root, expected_sha_root_from_ts);\n}\n\n#[test]\nfn test_empty_tree_root() {\n assert_eq(compute_empty_tree_root::<0>(), 0);\n\n assert_eq(\n compute_empty_tree_root::<1>(),\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1,\n );\n\n assert_eq(\n compute_empty_tree_root::<2>(),\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290,\n );\n\n assert_eq(\n compute_empty_tree_root::<6>(),\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76,\n );\n\n assert_eq(\n compute_empty_tree_root::<10>(),\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686,\n );\n}\n"
|
|
4232
4232
|
},
|
|
4233
|
-
"417": {
|
|
4234
|
-
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
4235
|
-
"source": "use crate::{\n constants::DOM_SEP__PUBLIC_STORAGE_MAP_SLOT, hash::poseidon2_hash_with_separator,\n traits::ToField,\n};\n\n// TODO: Move this to src/public_data/storage/map.nr\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field\nwhere\n K: ToField,\n{\n poseidon2_hash_with_separator(\n [storage_slot, key.to_field()],\n DOM_SEP__PUBLIC_STORAGE_MAP_SLOT,\n )\n}\n\nmod test {\n use crate::{address::AztecAddress, storage::map::derive_storage_slot_in_map, traits::FromField};\n\n #[test]\n fn test_derive_storage_slot_in_map_matches_typescript() {\n let map_slot = 0x132258fb6962c4387ba659d9556521102d227549a386d39f0b22d1890d59c2b5;\n let key = AztecAddress::from_field(\n 0x302dbc2f9b50a73283d5fb2f35bc01eae8935615817a0b4219a057b2ba8a5a3f,\n );\n\n let slot = derive_storage_slot_in_map(map_slot, key);\n\n // The following value was generated by `map_slot.test.ts`\n let slot_from_typescript =\n 0x2d225f361108379adc2da91378b9702675c5546b57e78bafc1e74ec7fec55967;\n\n assert_eq(slot, slot_from_typescript);\n }\n}\n"
|
|
4236
|
-
},
|
|
4237
4233
|
"42": {
|
|
4238
4234
|
"path": "std/option.nr",
|
|
4239
4235
|
"source": "use crate::cmp::{Eq, Ord, Ordering};\nuse crate::default::Default;\nuse crate::hash::{Hash, Hasher};\n\npub struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::mem::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// Asserts `self.is_some()` with a provided custom message and returns the contained `Some` value\n pub fn expect<let N: u32, MessageTypes>(self, message: fmtstr<N, MessageTypes>) -> T {\n assert(self.is_some(), message);\n self._value\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n\nimpl<T> Default for Option<T> {\n fn default() -> Self {\n Option::none()\n }\n}\n\nimpl<T> Eq for Option<T>\nwhere\n T: Eq,\n{\n fn eq(self, other: Self) -> bool {\n if self._is_some == other._is_some {\n if self._is_some {\n self._value == other._value\n } else {\n true\n }\n } else {\n false\n }\n }\n}\n\nimpl<T> Hash for Option<T>\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self._is_some.hash(state);\n if self._is_some {\n self._value.hash(state);\n }\n }\n}\n\n// For this impl we're declaring Option::none < Option::some\nimpl<T> Ord for Option<T>\nwhere\n T: Ord,\n{\n fn cmp(self, other: Self) -> Ordering {\n if self._is_some {\n if other._is_some {\n self._value.cmp(other._value)\n } else {\n Ordering::greater()\n }\n } else if other._is_some {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n"
|
|
4240
4236
|
},
|
|
4237
|
+
"420": {
|
|
4238
|
+
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
4239
|
+
"source": "use crate::{\n constants::DOM_SEP__PUBLIC_STORAGE_MAP_SLOT, hash::poseidon2_hash_with_separator,\n traits::ToField,\n};\n\n// TODO: Move this to src/public_data/storage/map.nr\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field\nwhere\n K: ToField,\n{\n poseidon2_hash_with_separator(\n [storage_slot, key.to_field()],\n DOM_SEP__PUBLIC_STORAGE_MAP_SLOT,\n )\n}\n\nmod test {\n use crate::{address::AztecAddress, storage::map::derive_storage_slot_in_map, traits::FromField};\n\n #[test]\n fn test_derive_storage_slot_in_map_matches_typescript() {\n let map_slot = 0x132258fb6962c4387ba659d9556521102d227549a386d39f0b22d1890d59c2b5;\n let key = AztecAddress::from_field(\n 0x302dbc2f9b50a73283d5fb2f35bc01eae8935615817a0b4219a057b2ba8a5a3f,\n );\n\n let slot = derive_storage_slot_in_map(map_slot, key);\n\n // The following value was generated by `map_slot.test.ts`\n let slot_from_typescript =\n 0x2d225f361108379adc2da91378b9702675c5546b57e78bafc1e74ec7fec55967;\n\n assert_eq(slot, slot_from_typescript);\n }\n}\n"
|
|
4240
|
+
},
|
|
4241
4241
|
"43": {
|
|
4242
4242
|
"path": "std/panic.nr",
|
|
4243
4243
|
"source": "pub fn panic<T, U>(message: T) -> U\nwhere\n T: StringLike,\n{\n assert(false, message);\n crate::mem::zeroed()\n}\n\ntrait StringLike {}\n\nimpl<let N: u32> StringLike for str<N> {}\nimpl<let N: u32, T> StringLike for fmtstr<N, T> {}\n"
|
|
4244
4244
|
},
|
|
4245
|
-
"
|
|
4245
|
+
"442": {
|
|
4246
4246
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/type_packing.nr",
|
|
4247
4247
|
"source": "use crate::traits::Packable;\n\nglobal BOOL_PACKED_LEN: u32 = 1;\nglobal U8_PACKED_LEN: u32 = 1;\nglobal U16_PACKED_LEN: u32 = 1;\nglobal U32_PACKED_LEN: u32 = 1;\nglobal U64_PACKED_LEN: u32 = 1;\nglobal U128_PACKED_LEN: u32 = 1;\nglobal FIELD_PACKED_LEN: u32 = 1;\nglobal I8_PACKED_LEN: u32 = 1;\nglobal I16_PACKED_LEN: u32 = 1;\nglobal I32_PACKED_LEN: u32 = 1;\nglobal I64_PACKED_LEN: u32 = 1;\n\nimpl Packable for bool {\n let N: u32 = BOOL_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> bool {\n (fields[0] as u1) != 0\n }\n}\n\nimpl Packable for u8 {\n let N: u32 = U8_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Packable for u16 {\n let N: u32 = U16_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u16\n }\n}\n\nimpl Packable for u32 {\n let N: u32 = U32_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Packable for u64 {\n let N: u32 = U64_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Packable for u128 {\n let N: u32 = U128_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u128\n }\n}\n\nimpl Packable for Field {\n let N: u32 = FIELD_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0]\n }\n}\n\nimpl Packable for i8 {\n let N: u32 = I8_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u8 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u8 as i8\n }\n}\n\nimpl Packable for i16 {\n let N: u32 = I16_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u16 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u16 as i16\n }\n}\n\nimpl Packable for i32 {\n let N: u32 = I32_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u32 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u32 as i32\n }\n}\n\nimpl Packable for i64 {\n let N: u32 = I64_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u64 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Packable for [T; M]\nwhere\n T: Packable,\n{\n let N: u32 = M * <T as Packable>::N;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n let mut result: [Field; Self::N] = std::mem::zeroed();\n for i in 0..M {\n let serialized = self[i].pack();\n for j in 0..<T as Packable>::N {\n result[i * <T as Packable>::N + j] = serialized[j];\n }\n }\n result\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::utils::reader::Reader::new(fields);\n let mut result: [T; M] = std::mem::zeroed();\n reader.read_struct_array::<T, <T as Packable>::N, M>(Packable::unpack, result)\n }\n}\n\n#[test]\nfn test_u16_packing() {\n let a: u16 = 10;\n assert_eq(a, u16::unpack(a.pack()));\n}\n\n#[test]\nfn test_i8_packing() {\n let a: i8 = -10;\n assert_eq(a, i8::unpack(a.pack()));\n}\n\n#[test]\nfn test_i16_packing() {\n let a: i16 = -10;\n assert_eq(a, i16::unpack(a.pack()));\n}\n\n#[test]\nfn test_i32_packing() {\n let a: i32 = -10;\n assert_eq(a, i32::unpack(a.pack()));\n}\n\n#[test]\nfn test_i64_packing() {\n let a: i64 = -10;\n assert_eq(a, i64::unpack(a.pack()));\n}\n"
|
|
4248
4248
|
},
|
|
4249
|
-
"
|
|
4249
|
+
"455": {
|
|
4250
4250
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/reader.nr",
|
|
4251
4251
|
"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_u64(&mut self) -> u64 {\n self.read() as u64\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() != 0\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 peek_offset(&mut self, offset: u32) -> Field {\n self.data[self.offset + offset]\n }\n\n pub fn advance_offset(&mut self, offset: u32) {\n self.offset += offset;\n }\n\n pub fn finish(self) {\n assert_eq(self.offset, self.data.len(), \"Reader did not read all data\");\n }\n}\n"
|
|
4252
4252
|
},
|
|
4253
|
-
"
|
|
4253
|
+
"456": {
|
|
4254
4254
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/serialization.nr",
|
|
4255
4255
|
"source": "use crate::{reader::Reader, writer::Writer};\n\n// docs:start:serialize\n/// Trait for serializing Noir types into arrays of Fields.\n///\n/// An implementation of the Serialize trait has to follow Noir's intrinsic serialization (each member of a struct\n/// converted directly into one or more Fields without any packing or compression). This trait (and Deserialize) are\n/// typically used to communicate between Noir and TypeScript (via oracles and function arguments).\n///\n/// # On Following Noir's Intrinsic Serialization\n/// When calling a Noir function from TypeScript (TS), first the function arguments are serialized into an array\n/// of fields. This array is then included in the initial witness. Noir's intrinsic serialization is then used\n/// to deserialize the arguments from the witness. When the same Noir function is called from Noir this Serialize trait\n/// is used instead of the serialization in TS. For this reason we need to have a match between TS serialization,\n/// Noir's intrinsic serialization and the implementation of this trait. If there is a mismatch, the function calls\n/// fail with an arguments hash mismatch error message.\n///\n/// # Associated Constants\n/// * `N` - The length of the output Field array, known at compile time\n///\n/// # Example\n/// ```\n/// impl<let N: u32> Serialize for str<N> {\n/// let N: u32 = N;\n///\n/// fn serialize(self) -> [Field; Self::N] {\n/// let mut writer: Writer<Self::N> = Writer::new();\n/// self.stream_serialize(&mut writer);\n/// writer.finish()\n/// }\n///\n/// fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n/// let bytes = self.as_bytes();\n/// for i in 0..bytes.len() {\n/// writer.write(bytes[i] as Field);\n/// }\n/// }\n/// }\n/// ```\n#[derive_via(derive_serialize)]\npub trait Serialize {\n let N: u32;\n\n fn serialize(self) -> [Field; Self::N];\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>);\n}\n\n/// Generates a `Serialize` trait implementation for a struct type.\n///\n/// # Parameters\n/// - `s`: The struct type definition to generate the implementation for\n///\n/// # Returns\n/// A quoted code block containing the trait implementation\n///\n/// # Example\n/// For a struct defined as:\n/// ```\n/// struct Log<N> {\n/// fields: [Field; N],\n/// length: u32\n/// }\n/// ```\n///\n/// This function generates code equivalent to:\n/// ```\n/// impl<let N: u32> Serialize for Log<N> {\n/// let N: u32 = <[Field; N] as Serialize>::N + <u32 as Serialize>::N;\n///\n/// fn serialize(self) -> [Field; Self::N] {\n/// let mut writer: Writer<Self::N> = Writer::new();\n/// self.stream_serialize(&mut writer);\n/// writer.finish()\n/// }\n///\n/// #[inline_always]\n/// fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n/// Serialize::stream_serialize(self.fields, writer);\n/// Serialize::stream_serialize(self.length, writer);\n/// }\n/// }\n/// ```\npub comptime fn derive_serialize(s: TypeDefinition) -> Quoted {\n let typ = s.as_type();\n let nested_struct = typ.as_data_type().unwrap();\n\n // We care only about the name and type so we drop the last item of the tuple\n let params = nested_struct.0.fields(nested_struct.1).map(|(name, typ, _)| (name, typ));\n\n // Generates the generic parameter declarations (to be placed after the `impl` keyword) and the `where` clause\n // for the `Serialize` trait.\n let generics_declarations = get_generics_declarations(s);\n let where_serialize_clause = get_where_trait_clause(s, quote {Serialize});\n\n let params_len_quote = get_params_len_quote(params);\n\n let function_body = params\n .map(|(name, _typ): (Quoted, Type)| {\n quote {\n $crate::serialization::Serialize::stream_serialize(self.$name, writer);\n }\n })\n .join(quote {});\n\n quote {\n impl$generics_declarations $crate::serialization::Serialize for $typ\n $where_serialize_clause\n {\n let N: u32 = $params_len_quote;\n\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n $crate::serialization::Serialize::stream_serialize(self, &mut writer);\n writer.finish()\n }\n\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n $function_body\n }\n }\n }\n}\n\n// docs:start:deserialize\n/// Trait for deserializing Noir types from arrays of Fields.\n///\n/// An implementation of the Deserialize trait has to follow Noir's intrinsic serialization (each member of a struct\n/// converted directly into one or more Fields without any packing or compression). This trait is typically used when\n/// deserializing return values from function calls in Noir. Since the same function could be called from TypeScript\n/// (TS), in which case the TS deserialization would get used, we need to have a match between the 2.\n///\n/// # Associated Constants\n/// * `N` - The length of the input Field array, known at compile time\n///\n/// # Example\n/// ```\n/// impl<let M: u32> Deserialize for str<M> {\n/// let N: u32 = M;\n///\n/// fn deserialize(fields: [Field; Self::N]) -> Self {\n/// let mut reader = Reader::new(fields);\n/// let result = Self::stream_deserialize(&mut reader);\n/// reader.finish();\n/// result\n/// }\n///\n/// fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n/// let mut bytes = [0 as u8; M];\n/// for i in 0..M {\n/// bytes[i] = reader.read() as u8;\n/// }\n/// str::<M>::from(bytes)\n/// }\n/// }\n/// ```\n#[derive_via(derive_deserialize)]\npub trait Deserialize {\n let N: u32;\n\n fn deserialize(fields: [Field; Self::N]) -> Self;\n\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self;\n}\n\n/// Generates a `Deserialize` trait implementation for a given struct `s`.\n///\n/// # Arguments\n/// * `s` - The struct type definition to generate the implementation for\n///\n/// # Returns\n/// A `Quoted` block containing the generated trait implementation\n///\n/// # Requirements\n/// Each struct member type must implement the `Deserialize` trait (it gets used in the generated code).\n///\n/// # Example\n/// For a struct like:\n/// ```\n/// struct MyStruct {\n/// x: AztecAddress,\n/// y: Field,\n/// }\n/// ```\n///\n/// This generates:\n/// ```\n/// impl Deserialize for MyStruct {\n/// let N: u32 = <AztecAddress as Deserialize>::N + <Field as Deserialize>::N;\n///\n/// fn deserialize(fields: [Field; Self::N]) -> Self {\n/// let mut reader = Reader::new(fields);\n/// let result = Self::stream_deserialize(&mut reader);\n/// reader.finish();\n/// result\n/// }\n///\n/// #[inline_always]\n/// fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n/// let x = <AztecAddress as Deserialize>::stream_deserialize(reader);\n/// let y = <Field as Deserialize>::stream_deserialize(reader);\n/// Self { x, y }\n/// }\n/// }\n/// ```\npub comptime fn derive_deserialize(s: TypeDefinition) -> Quoted {\n let typ = s.as_type();\n let nested_struct = typ.as_data_type().unwrap();\n let params = nested_struct.0.fields(nested_struct.1);\n\n // Generates the generic parameter declarations (to be placed after the `impl` keyword) and the `where` clause\n // for the `Deserialize` trait.\n let generics_declarations = get_generics_declarations(s);\n let where_deserialize_clause = get_where_trait_clause(s, quote {Deserialize});\n\n // The following will give us:\n // <type_of_struct_member_1 as Deserialize>::N + <type_of_struct_member_2 as Deserialize>::N + ...\n // (or 0 if the struct has no members)\n let right_hand_side_of_definition_of_n = if params.len() > 0 {\n params\n .map(|(_, param_type, _): (Quoted, Type, Quoted)| {\n quote {\n <$param_type as $crate::serialization::Deserialize>::N\n }\n })\n .join(quote {+})\n } else {\n quote {0}\n };\n\n // For structs containing a single member, we can enhance performance by directly deserializing the input array,\n // bypassing the need for loop-based array construction. While this optimization yields significant benefits in\n // Brillig where the loops are expected to not be optimized, it is not relevant in ACIR where the loops are\n // expected to be optimized away.\n let function_body = if params.len() > 1 {\n // This generates deserialization code for each struct member and concatenates them together.\n let deserialization_of_struct_members = params\n .map(|(param_name, param_type, _): (Quoted, Type, Quoted)| {\n quote {\n let $param_name = <$param_type as Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote {});\n\n // We join the struct member names with a comma to be used in the `Self { ... }` syntax\n // This will give us e.g. `a, b, c` for a struct with three fields named `a`, `b`, and `c`.\n let struct_members = params\n .map(|(param_name, _, _): (Quoted, Type, Quoted)| quote { $param_name })\n .join(quote {,});\n\n quote {\n $deserialization_of_struct_members\n\n Self { $struct_members }\n }\n } else if params.len() == 1 {\n let param_name = params[0].0;\n quote {\n Self { $param_name: $crate::serialization::Deserialize::stream_deserialize(reader) }\n }\n } else {\n quote {\n Self {}\n }\n };\n\n quote {\n impl$generics_declarations $crate::serialization::Deserialize for $typ\n $where_deserialize_clause\n {\n let N: u32 = $right_hand_side_of_definition_of_n;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $function_body\n }\n }\n }\n}\n\n/// Generates a quoted expression that computes the total serialized length of function parameters.\n///\n/// # Parameters\n/// * `params` - An array of tuples where each tuple contains a quoted parameter name and its Type. The type needs\n/// to implement the Serialize trait.\n///\n/// # Returns\n/// A quoted expression that evaluates to:\n/// * `0` if there are no parameters\n/// * `(<type1 as Serialize>::N + <type2 as Serialize>::N + ...)` for one or more parameters\ncomptime fn get_params_len_quote(params: [(Quoted, Type)]) -> Quoted {\n if params.len() == 0 {\n quote { 0 }\n } else {\n let params_quote_without_parentheses = params\n .map(|(_, param_type): (Quoted, Type)| {\n quote {\n <$param_type as $crate::serialization::Serialize>::N\n }\n })\n .join(quote {+});\n quote { ($params_quote_without_parentheses) }\n }\n}\n\ncomptime fn get_generics_declarations(s: TypeDefinition) -> Quoted {\n let generics = s.generics();\n\n if generics.len() > 0 {\n let generics_declarations_items = generics\n .map(|(name, maybe_integer_typ)| {\n // The second item in the generics tuple is an Option of an integer type that is Some only if\n // the generic is numeric.\n if maybe_integer_typ.is_some() {\n // The generic is numeric, so we return a quote defined as e.g. \"let N: u32\"\n let integer_type = maybe_integer_typ.unwrap();\n quote {let $name: $integer_type}\n } else {\n // The generic is not numeric, so we return a quote containing the name of the generic (e.g. \"T\")\n quote {$name}\n }\n })\n .join(quote {,});\n quote {<$generics_declarations_items>}\n } else {\n // The struct doesn't have any generics defined, so we just return an empty quote.\n quote {}\n }\n}\n\ncomptime fn get_where_trait_clause(s: TypeDefinition, trait_name: Quoted) -> Quoted {\n let generics = s.generics();\n\n // The second item in the generics tuple is an Option of an integer type that is Some only if the generic is\n // numeric.\n let non_numeric_generics =\n generics.filter(|(_, maybe_integer_typ)| maybe_integer_typ.is_none());\n\n if non_numeric_generics.len() > 0 {\n let non_numeric_generics_declarations =\n non_numeric_generics.map(|(name, _)| quote {$name: $trait_name}).join(quote {,});\n quote {where $non_numeric_generics_declarations}\n } else {\n // There are no non-numeric generics, so we return an empty quote.\n quote {}\n }\n}\n"
|
|
4256
4256
|
},
|
|
4257
|
-
"
|
|
4257
|
+
"458": {
|
|
4258
4258
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr",
|
|
4259
|
-
"source": "use crate::{reader::Reader, serialization::{Deserialize, Serialize}, writer::Writer};\nuse std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nglobal U1_SERIALIZED_LEN: u32 = 1;\nglobal BOOL_SERIALIZED_LEN: u32 = 1;\nglobal U8_SERIALIZED_LEN: u32 = 1;\nglobal U16_SERIALIZED_LEN: u32 = 1;\nglobal U32_SERIALIZED_LEN: u32 = 1;\nglobal U64_SERIALIZED_LEN: u32 = 1;\nglobal U128_SERIALIZED_LEN: u32 = 1;\nglobal FIELD_SERIALIZED_LEN: u32 = 1;\nglobal I8_SERIALIZED_LEN: u32 = 1;\nglobal I16_SERIALIZED_LEN: u32 = 1;\nglobal I32_SERIALIZED_LEN: u32 = 1;\nglobal I64_SERIALIZED_LEN: u32 = 1;\n\nimpl Serialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> bool {\n reader.read() != 0\n }\n}\n\nimpl Serialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u1\n }\n}\n\nimpl Serialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8\n }\n}\n\nimpl Serialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16\n }\n}\n\nimpl Serialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32\n }\n}\n\nimpl Serialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64\n }\n}\n\nimpl Serialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u128\n }\n}\n\nimpl Serialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self);\n }\n}\n\nimpl Deserialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read()\n }\n}\n\nimpl Serialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u8 as Field);\n }\n}\n\nimpl Deserialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8 as i8\n }\n}\n\nimpl Serialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u16 as Field);\n }\n}\n\nimpl Deserialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16 as i16\n }\n}\n\nimpl Serialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u32 as Field);\n }\n}\n\nimpl Deserialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32 as i32\n }\n}\n\nimpl Serialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u64 as Field);\n }\n}\n\nimpl Deserialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Serialize for [T; M]\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n for i in 0..M {\n self[i].stream_serialize(writer);\n }\n }\n}\n\nimpl<T, let M: u32> Deserialize for [T; M]\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut result: [T; M] = std::mem::zeroed();\n for i in 0..M {\n result[i] = T::stream_deserialize(reader);\n }\n result\n }\n}\n\nimpl<T> Serialize for Option<T>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N + 1;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write_bool(self.is_some());\n if self.is_some() {\n self.unwrap_unchecked().stream_serialize(writer);\n } else {\n writer.advance_offset(<T as Serialize>::N);\n }\n }\n}\n\nimpl<T> Deserialize for Option<T>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n if reader.read_bool() {\n Option::some(<T as Deserialize>::stream_deserialize(reader))\n } else {\n reader.advance_offset(<T as Deserialize>::N);\n Option::none()\n }\n }\n}\n\nglobal SCALAR_SIZE: u32 = 2;\n\nimpl Serialize for EmbeddedCurveScalar {\n\n let N: u32 = SCALAR_SIZE;\n\n fn serialize(self) -> [Field; SCALAR_SIZE] {\n [self.lo, self.hi]\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.lo);\n writer.write(self.hi);\n }\n}\n\nimpl Deserialize for EmbeddedCurveScalar {\n let N: u32 = SCALAR_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { lo: fields[0], hi: fields[1] }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { lo: reader.read(), hi: reader.read() }\n }\n}\n\nglobal POINT_SIZE: u32 = 3;\n\nimpl Serialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn serialize(self) -> [Field; Self::N] {\n [self.x, self.y, self.is_infinite as Field]\n }\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.x);\n writer.write(self.y);\n writer.write(self.is_infinite as Field);\n }\n}\n\nimpl Deserialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { x: fields[0], y: fields[1], is_infinite: fields[2] != 0 }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { x: reader.read(), y: reader.read(), is_infinite: reader.read_bool() }\n }\n}\n\nimpl<let M: u32> Deserialize for str<M> {\n let N: u32 = M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let u8_arr = <[u8; Self::N] as Deserialize>::stream_deserialize(reader);\n str::<Self::N>::from(u8_arr)\n }\n}\n\nimpl<let M: u32> Serialize for str<M> {\n let N: u32 = M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.as_bytes().stream_serialize(writer);\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Deserialize for BoundedVec<T, M>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut new_bounded_vec: BoundedVec<T, M> = BoundedVec::new();\n let payload_len = Self::N - 1;\n\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n let len = reader.peek_offset(payload_len) as u32;\n\n for i in 0..M {\n if i < len {\n new_bounded_vec.push(<T as Deserialize>::stream_deserialize(reader));\n }\n }\n\n // +1 for the length of the BoundedVec\n reader.advance_offset((M - len) * <T as Deserialize>::N + 1);\n\n new_bounded_vec\n }\n}\n\n// This may cause issues if used as program input, because noir disallows empty arrays for program input.\n// I think this is okay because I don't foresee a unit type being used as input. But leaving this comment as a hint\n// if someone does run into this in the future.\nimpl Deserialize for () {\n let N: u32 = 0;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(_reader: &mut Reader<K>) -> Self {\n ()\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Serialize for BoundedVec<T, M>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M + 1; // +1 for the length of the BoundedVec\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.storage().stream_serialize(writer);\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n writer.write_u32(self.len() as u32);\n }\n}\n\n// Create a slice of the given length with each element made from `f(i)` where `i` is the current index\ncomptime fn make_slice<Env, T>(length: u32, f: fn[Env](u32) -> T) -> [T] {\n let mut slice = @[];\n for i in 0..length {\n slice = slice.push_back(f(i));\n }\n slice\n}\n\n// Implements Serialize and Deserialize for an arbitrary tuple type\ncomptime fn impl_serialize_for_tuple(_m: Module, length: u32) -> Quoted {\n // `T0`, `T1`, `T2`\n let type_names = make_slice(length, |i| f\"T{i}\".quoted_contents());\n\n // `result0`, `result1`, `result2`\n let result_names = make_slice(length, |i| f\"result{i}\".quoted_contents());\n\n // `T0, T1, T2`\n let field_generics = type_names.join(quote [,]);\n\n // `<T0 as Serialize>::N + <T1 as Serialize>::N + <T2 as Serialize>::N`\n let full_size_serialize = type_names\n .map(|type_name| quote {\n <$type_name as Serialize>::N\n })\n .join(quote [+]);\n\n // `<T0 as Deserialize>::N + <T1 as Deserialize>::N + <T2 as Deserialize>::N`\n let full_size_deserialize = type_names\n .map(|type_name| quote {\n <$type_name as Deserialize>::N\n })\n .join(quote [+]);\n\n // `T0: Serialize, T1: Serialize, T2: Serialize,`\n let serialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Serialize,\n })\n .join(quote []);\n\n // `T0: Deserialize, T1: Deserialize, T2: Deserialize,`\n let deserialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Deserialize,\n })\n .join(quote []);\n\n // Statements to serialize each field\n let serialized_fields = type_names\n .mapi(|i, _type_name| quote {\n $crate::serialization::Serialize::stream_serialize(self.$i, writer);\n })\n .join(quote []);\n\n // Statements to deserialize each field\n let deserialized_fields = type_names\n .mapi(|i, type_name| {\n let result_name = result_names[i];\n quote {\n let $result_name = <$type_name as $crate::serialization::Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote []);\n let deserialize_results = result_names.join(quote [,]);\n\n quote {\n impl<$field_generics> Serialize for ($field_generics) where $serialize_constraints {\n let N: u32 = $full_size_serialize;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n\n $serialized_fields\n }\n }\n\n impl<$field_generics> Deserialize for ($field_generics) where $deserialize_constraints {\n let N: u32 = $full_size_deserialize;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n \n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $deserialized_fields\n ($deserialize_results)\n }\n }\n }\n}\n\n// Keeping these manual impls. They are more efficient since they do not\n// require copying sub-arrays from any serialized arrays.\nimpl<T1> Serialize for (T1,)\nwhere\n T1: Serialize,\n{\n let N: u32 = <T1 as Serialize>::N;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: crate::writer::Writer<Self::N> = crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.0.stream_serialize(writer);\n }\n}\n\nimpl<T1> Deserialize for (T1,)\nwhere\n T1: Deserialize,\n{\n let N: u32 = <T1 as Deserialize>::N;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n (<T1 as Deserialize>::stream_deserialize(reader),)\n }\n}\n\n#[impl_serialize_for_tuple(2)]\n#[impl_serialize_for_tuple(3)]\n#[impl_serialize_for_tuple(4)]\n#[impl_serialize_for_tuple(5)]\n#[impl_serialize_for_tuple(6)]\nmod impls {\n use crate::serialization::{Deserialize, Serialize};\n}\n"
|
|
4259
|
+
"source": "use crate::{reader::Reader, serialization::{Deserialize, Serialize}, writer::Writer};\nuse std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nglobal U1_SERIALIZED_LEN: u32 = 1;\nglobal BOOL_SERIALIZED_LEN: u32 = 1;\nglobal U8_SERIALIZED_LEN: u32 = 1;\nglobal U16_SERIALIZED_LEN: u32 = 1;\nglobal U32_SERIALIZED_LEN: u32 = 1;\nglobal U64_SERIALIZED_LEN: u32 = 1;\nglobal U128_SERIALIZED_LEN: u32 = 1;\nglobal FIELD_SERIALIZED_LEN: u32 = 1;\nglobal I8_SERIALIZED_LEN: u32 = 1;\nglobal I16_SERIALIZED_LEN: u32 = 1;\nglobal I32_SERIALIZED_LEN: u32 = 1;\nglobal I64_SERIALIZED_LEN: u32 = 1;\n\nimpl Serialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> bool {\n reader.read() != 0\n }\n}\n\nimpl Serialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u1\n }\n}\n\nimpl Serialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8\n }\n}\n\nimpl Serialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16\n }\n}\n\nimpl Serialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32\n }\n}\n\nimpl Serialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64\n }\n}\n\nimpl Serialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u128\n }\n}\n\nimpl Serialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self);\n }\n}\n\nimpl Deserialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read()\n }\n}\n\nimpl Serialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u8 as Field);\n }\n}\n\nimpl Deserialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8 as i8\n }\n}\n\nimpl Serialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u16 as Field);\n }\n}\n\nimpl Deserialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16 as i16\n }\n}\n\nimpl Serialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u32 as Field);\n }\n}\n\nimpl Deserialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32 as i32\n }\n}\n\nimpl Serialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u64 as Field);\n }\n}\n\nimpl Deserialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Serialize for [T; M]\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n for i in 0..M {\n self[i].stream_serialize(writer);\n }\n }\n}\n\nimpl<T, let M: u32> Deserialize for [T; M]\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut result: [T; M] = std::mem::zeroed();\n for i in 0..M {\n result[i] = T::stream_deserialize(reader);\n }\n result\n }\n}\n\nimpl<T> Serialize for Option<T>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N + 1;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write_bool(self.is_some());\n if self.is_some() {\n self.unwrap_unchecked().stream_serialize(writer);\n } else {\n writer.advance_offset(<T as Serialize>::N);\n }\n }\n}\n\nimpl<T> Deserialize for Option<T>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n if reader.read_bool() {\n Option::some(<T as Deserialize>::stream_deserialize(reader))\n } else {\n reader.advance_offset(<T as Deserialize>::N);\n Option::none()\n }\n }\n}\n\nglobal SCALAR_SIZE: u32 = 2;\n\nimpl Serialize for EmbeddedCurveScalar {\n\n let N: u32 = SCALAR_SIZE;\n\n fn serialize(self) -> [Field; SCALAR_SIZE] {\n [self.lo, self.hi]\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.lo);\n writer.write(self.hi);\n }\n}\n\nimpl Deserialize for EmbeddedCurveScalar {\n let N: u32 = SCALAR_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { lo: fields[0], hi: fields[1] }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { lo: reader.read(), hi: reader.read() }\n }\n}\n\nglobal POINT_SIZE: u32 = 3;\n\nimpl Serialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn serialize(self) -> [Field; Self::N] {\n [self.x, self.y, self.is_infinite as Field]\n }\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.x);\n writer.write(self.y);\n writer.write(self.is_infinite as Field);\n }\n}\n\nimpl Deserialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { x: fields[0], y: fields[1], is_infinite: fields[2] != 0 }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { x: reader.read(), y: reader.read(), is_infinite: reader.read_bool() }\n }\n}\n\nimpl<let M: u32> Deserialize for str<M> {\n let N: u32 = M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let u8_arr = <[u8; Self::N] as Deserialize>::stream_deserialize(reader);\n str::<Self::N>::from(u8_arr)\n }\n}\n\nimpl<let M: u32> Serialize for str<M> {\n let N: u32 = M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.as_bytes().stream_serialize(writer);\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Deserialize for BoundedVec<T, M>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut new_bounded_vec: BoundedVec<T, M> = BoundedVec::new();\n let payload_len = Self::N - 1;\n\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n let len = reader.peek_offset(payload_len) as u32;\n\n for i in 0..M {\n if i < len {\n new_bounded_vec.push(<T as Deserialize>::stream_deserialize(reader));\n }\n }\n\n // +1 for the length of the BoundedVec\n reader.advance_offset((M - len) * <T as Deserialize>::N + 1);\n\n new_bounded_vec\n }\n}\n\n// This may cause issues if used as program input, because noir disallows empty arrays for program input.\n// I think this is okay because I don't foresee a unit type being used as input. But leaving this comment as a hint\n// if someone does run into this in the future.\nimpl Deserialize for () {\n let N: u32 = 0;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(_reader: &mut Reader<K>) -> Self {\n ()\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Serialize for BoundedVec<T, M>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M + 1; // +1 for the length of the BoundedVec\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.storage().stream_serialize(writer);\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n writer.write_u32(self.len() as u32);\n }\n}\n\n// Create a slice of the given length with each element made from `f(i)` where `i` is the current index\ncomptime fn make_slice<Env, T>(length: u32, f: fn[Env](u32) -> T) -> [T] {\n let mut slice = @[];\n for i in 0..length {\n slice = slice.push_back(f(i));\n }\n slice\n}\n\n// Implements Serialize and Deserialize for an arbitrary tuple type\ncomptime fn impl_serialize_for_tuple(_m: Module, length: u32) -> Quoted {\n // `T0`, `T1`, `T2`\n let type_names = make_slice(length, |i| f\"T{i}\".quoted_contents());\n\n // `result0`, `result1`, `result2`\n let result_names = make_slice(length, |i| f\"result{i}\".quoted_contents());\n\n // `T0, T1, T2`\n let field_generics = type_names.join(quote [,]);\n\n // `<T0 as Serialize>::N + <T1 as Serialize>::N + <T2 as Serialize>::N`\n let full_size_serialize = type_names\n .map(|type_name| quote {\n <$type_name as Serialize>::N\n })\n .join(quote [+]);\n\n // `<T0 as Deserialize>::N + <T1 as Deserialize>::N + <T2 as Deserialize>::N`\n let full_size_deserialize = type_names\n .map(|type_name| quote {\n <$type_name as Deserialize>::N\n })\n .join(quote [+]);\n\n // `T0: Serialize, T1: Serialize, T2: Serialize,`\n let serialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Serialize,\n })\n .join(quote []);\n\n // `T0: Deserialize, T1: Deserialize, T2: Deserialize,`\n let deserialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Deserialize,\n })\n .join(quote []);\n\n // Statements to serialize each field\n let serialized_fields = type_names\n .mapi(|i, _type_name| quote {\n $crate::serialization::Serialize::stream_serialize(self.$i, writer);\n })\n .join(quote []);\n\n // Statements to deserialize each field\n let deserialized_fields = type_names\n .mapi(|i, type_name| {\n let result_name = result_names[i];\n quote {\n let $result_name = <$type_name as $crate::serialization::Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote []);\n let deserialize_results = result_names.join(quote [,]);\n\n quote {\n impl<$field_generics> Serialize for ($field_generics) where $serialize_constraints {\n let N: u32 = $full_size_serialize;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n\n $serialized_fields\n }\n }\n\n impl<$field_generics> Deserialize for ($field_generics) where $deserialize_constraints {\n let N: u32 = $full_size_deserialize;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n \n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $deserialized_fields\n ($deserialize_results)\n }\n }\n }\n}\n\n// Keeping these manual impls. They are more efficient since they do not\n// require copying sub-arrays from any serialized arrays.\nimpl<T1> Serialize for (T1,)\nwhere\n T1: Serialize,\n{\n let N: u32 = <T1 as Serialize>::N;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: crate::writer::Writer<Self::N> = crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.0.stream_serialize(writer);\n }\n}\n\nimpl<T1> Deserialize for (T1,)\nwhere\n T1: Deserialize,\n{\n let N: u32 = <T1 as Deserialize>::N;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n (<T1 as Deserialize>::stream_deserialize(reader),)\n }\n}\n\n#[impl_serialize_for_tuple(2)]\n#[impl_serialize_for_tuple(3)]\n#[impl_serialize_for_tuple(4)]\n#[impl_serialize_for_tuple(5)]\n#[impl_serialize_for_tuple(6)]\nmod impls {\n use crate::serialization::{Deserialize, Serialize};\n}\n\n#[test]\nunconstrained fn bounded_vec_serialization() {\n // Test empty BoundedVec\n let empty_vec: BoundedVec<Field, 3> = BoundedVec::from_array([]);\n let serialized = empty_vec.serialize();\n let deserialized = BoundedVec::<Field, 3>::deserialize(serialized);\n assert_eq(empty_vec, deserialized);\n assert_eq(deserialized.len(), 0);\n\n // Test partially filled BoundedVec\n let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]);\n let serialized = partial_vec.serialize();\n let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized);\n assert_eq(partial_vec, deserialized);\n assert_eq(deserialized.len(), 1);\n assert_eq(deserialized.get(0), [1, 2]);\n\n // Test full BoundedVec\n let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]);\n let serialized = full_vec.serialize();\n let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized);\n assert_eq(full_vec, deserialized);\n assert_eq(deserialized.len(), 3);\n assert_eq(deserialized.get(0), [1, 2]);\n assert_eq(deserialized.get(1), [3, 4]);\n assert_eq(deserialized.get(2), [5, 6]);\n}\n"
|
|
4260
4260
|
},
|
|
4261
|
-
"
|
|
4261
|
+
"468": {
|
|
4262
4262
|
"path": "/home/aztec-dev/nargo/github.com/noir-lang/sha256/v0.3.0/src/sha256.nr",
|
|
4263
4263
|
"source": "use std::hash::sha256_compression;\nuse std::runtime::is_unconstrained;\n\nuse constants::{\n BLOCK_BYTE_PTR, BLOCK_SIZE, HASH, INITIAL_STATE, INT_BLOCK_SIZE, INT_SIZE, INT_SIZE_PTR,\n MSG_BLOCK, MSG_SIZE_PTR, STATE, TWO_POW_16, TWO_POW_24, TWO_POW_32, TWO_POW_8,\n};\n\npub(crate) mod constants;\nmod tests;\nmod oracle_tests;\n\n// Implementation of SHA-256 mapping a byte array of variable length to\n// 32 bytes.\n\n// Deprecated in favour of `sha256_var`\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> HASH\n// docs:end:sha256\n{\n digest(input)\n}\n\n// SHA-256 hash function\n#[no_predicates]\npub fn digest<let N: u32>(msg: [u8; N]) -> HASH {\n sha256_var(msg, N)\n}\n\n// Variable size SHA-256 hash\npub fn sha256_var<let N: u32>(msg: [u8; N], message_size: u32) -> HASH {\n assert(message_size <= N);\n\n let (h, msg_block) = process_full_blocks(msg, message_size, INITIAL_STATE);\n\n finalize_sha256_blocks(message_size, h, msg_block)\n}\n\n/// Returns the first partially filled message block along with the internal state prior to its compression.\npub(crate) fn process_full_blocks<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n initial_state: STATE,\n) -> (STATE, MSG_BLOCK) {\n if std::runtime::is_unconstrained() {\n let num_full_blocks = message_size / BLOCK_SIZE;\n // Intermediate hash, starting with the canonical initial value\n let mut h: STATE = initial_state;\n // Pointer into msg_block on a 64 byte scale\n for i in 0..num_full_blocks {\n let msg_block = build_msg_block(msg, message_size, BLOCK_SIZE * i);\n h = sha256_compression(msg_block, h);\n }\n\n // We now build the final un-filled block.\n let msg_byte_ptr = message_size % BLOCK_SIZE;\n let msg_block: MSG_BLOCK = if msg_byte_ptr != 0 {\n let num_full_blocks = message_size / BLOCK_SIZE;\n let msg_start = BLOCK_SIZE * num_full_blocks;\n build_msg_block(msg, message_size, msg_start)\n } else {\n // If the message size is a multiple of the block size (i.e. `msg_byte_ptr == 0`) then this block will be empty,\n // so we short-circuit in this case.\n [0; 16]\n };\n\n (h, msg_block)\n } else {\n let num_blocks = N / BLOCK_SIZE;\n\n // We store the intermediate hash states and message blocks in these two arrays which allows us to select the correct state\n // for the given message size with a lookup.\n //\n // These can be reasoned about as followed:\n // Consider a message with an unknown number of bytes, `msg_size. It can be seen that this will have `msg_size / BLOCK_SIZE` full blocks.\n // - `states[i]` should then be the state after processing the first `i` blocks.\n // - `blocks[i]` should then be the next message block after processing the first `i` blocks.\n // blocks[first_partially_filled_block_index] is the last block that is partially filled or all 0 if the message is a multiple of the block size.\n //\n // In other words:\n //\n // blocks = [block 1, block 2, ..., block N / BLOCK_SIZE, block N / BLOCK_SIZE + 1]\n // states = [INITIAL_STATE, state after block 1, state after block 2, ..., state after block N / BLOCK_SIZE]\n //\n // We place the initial state in `states[0]` as in the case where the `message_size < BLOCK_SIZE` then there are no full blocks to process and no compressions should occur.\n let mut blocks: [MSG_BLOCK; N / BLOCK_SIZE + 1] = std::mem::zeroed();\n let mut states: [STATE; N / BLOCK_SIZE + 1] = [initial_state; N / BLOCK_SIZE + 1];\n\n // Optimization for small messages. If the largest possible message is smaller than a block then we know that the first block is partially filled\n // no matter the value of `message_size`.\n //\n // Note that the condition `N >= BLOCK_SIZE` is known during monomorphization so this has no runtime cost.\n let first_partially_filled_block_index = if N >= BLOCK_SIZE {\n message_size / BLOCK_SIZE\n } else {\n 0\n };\n\n for i in 0..num_blocks {\n let msg_start = BLOCK_SIZE * i;\n let new_msg_block = build_msg_block(msg, message_size, msg_start);\n\n blocks[i] = new_msg_block;\n states[i + 1] = sha256_compression(new_msg_block, states[i]);\n }\n // If message_size/BLOCK_SIZE == N/BLOCK_SIZE, and there is a remainder, we need to process the last block.\n if N % BLOCK_SIZE != 0 {\n let new_msg_block = build_msg_block(msg, message_size, BLOCK_SIZE * num_blocks);\n\n blocks[num_blocks] = new_msg_block;\n }\n\n (states[first_partially_filled_block_index], blocks[first_partially_filled_block_index])\n }\n}\n\n// Take `BLOCK_SIZE` number of bytes from `msg` starting at `msg_start` and pack them into a `MSG_BLOCK`.\npub(crate) unconstrained fn build_msg_block_helper<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n msg_start: u32,\n) -> MSG_BLOCK {\n let mut msg_block: MSG_BLOCK = [0; INT_BLOCK_SIZE];\n\n // We insert `BLOCK_SIZE` bytes (or up to the end of the message)\n let block_input = if message_size < msg_start {\n // This function is sometimes called with `msg_start` past the end of the message.\n // In this case we return an empty block and zero pointer to signal that the result should be ignored.\n 0\n } else if message_size < msg_start + BLOCK_SIZE {\n message_size - msg_start\n } else {\n BLOCK_SIZE\n };\n\n // Figure out the number of items in the int array that we have to pack.\n // e.g. if the input is [0,1,2,3,4,5] then we need to pack it as 2 items: [0123, 4500]\n let int_input = (block_input + INT_SIZE - 1) / INT_SIZE;\n\n for i in 0..int_input {\n let mut msg_item: u32 = 0;\n // Always construct the integer as 4 bytes, even if it means going beyond the input.\n for j in 0..INT_SIZE {\n let k = i * INT_SIZE + j;\n let msg_byte = if k < block_input {\n msg[msg_start + k]\n } else {\n 0\n };\n msg_item = (msg_item << 8) + msg_byte as u32;\n }\n msg_block[i] = msg_item;\n }\n\n // Returning the index as if it was a 64 byte array.\n // We have to project it down to 16 items and bit shifting to get a byte back if we need it.\n msg_block\n}\n\n// Build a message block from the input message starting at `msg_start`.\n//\n// If `message_size` is less than `msg_start` then this is called with the old non-empty block;\n// in that case we can skip verification, ie. no need to check that everything is zero.\nfn build_msg_block<let N: u32>(msg: [u8; N], message_size: u32, msg_start: u32) -> MSG_BLOCK {\n let msg_block =\n // Safety: We constrain the block below by reconstructing each `u32` word from the input bytes.\n unsafe { build_msg_block_helper(msg, message_size, msg_start) };\n\n if !is_unconstrained() {\n let mut msg_end = msg_start + BLOCK_SIZE;\n\n let max_read_index = std::cmp::min(message_size, msg_end);\n\n // Reconstructed packed item\n let mut msg_item: Field = 0;\n\n // Inclusive at the end so that we can compare the last item.\n for k in msg_start..=msg_end {\n if (k != msg_start) & (k % INT_SIZE == 0) {\n // If we consumed some input we can compare against the block.\n let msg_block_index = (k - msg_start) / INT_SIZE - 1;\n assert_eq(msg_block[msg_block_index] as Field, msg_item);\n\n msg_item = 0;\n }\n\n // If we have input to consume, add it at the rightmost position.\n let msg_byte = if k < max_read_index { msg[k] } else { 0 };\n msg_item = msg_item * (TWO_POW_8 as Field) + msg_byte as Field;\n }\n }\n msg_block\n}\n\n// Encode `8 * message_size` into two `u32` limbs.\nunconstrained fn encode_len(message_size: u32) -> (u32, u32) {\n let len = 8 * message_size as u64;\n let lo = len & 0xFFFFFFFF;\n let hi = (len >> 32) & 0xFFFFFFFF;\n (lo as u32, hi as u32)\n}\n\n// Write the length into the last 8 bytes of the block.\nfn attach_len_to_msg_block(mut msg_block: MSG_BLOCK, message_size: u32) -> MSG_BLOCK {\n // Safety: We assert the correctness of the decomposition below.\n // 2 `u32` limbs cannot overflow the field modulus so performing the check as `Field`s is safe.\n let (lo, hi) = unsafe { encode_len(message_size) };\n assert_eq(8 * (message_size as Field), lo as Field + hi as Field * TWO_POW_32);\n\n msg_block[INT_SIZE_PTR] = hi;\n msg_block[INT_SIZE_PTR + 1] = lo;\n msg_block\n}\n\n// Perform the final compression, then transform the `STATE` into `HASH`.\nfn hash_final_block(msg_block: MSG_BLOCK, mut state: STATE) -> HASH {\n // Hash final padded block\n state = sha256_compression(msg_block, state);\n\n // Return final hash as byte array\n let mut out_h: HASH = [0; 32]; // Digest as sequence of bytes\n for j in 0..8 {\n let h_bytes: [u8; 4] = (state[j] as Field).to_be_bytes();\n for k in 0..4 {\n out_h[4 * j + k] = h_bytes[k];\n }\n }\n\n out_h\n}\n\n/// Lookup table for the position of the padding bit within one of the `u32` words in the final message block.\nglobal PADDING_BIT_TABLE: [u32; 4] =\n [(1 << 7) * TWO_POW_24, (1 << 7) * TWO_POW_16, (1 << 7) * TWO_POW_8, (1 << 7)];\n\n/// Add 1 bit padding to end of message and compress the block if there's not enough room for the 8-byte length.\n/// Returns the updated hash state and message block that will be used to write the message size.\n///\n/// # Assumptions:\n///\n/// - `msg_block[i] == 0` for all `i > msg_byte_ptr / INT_SIZE`\n/// - `msg_block[msg_byte_ptr / INT_SIZE] & ((1 << 7) * (msg_byte_ptr % INT_SIZE)) == 0`\nfn add_padding_byte_and_compress_if_needed(\n mut msg_block: MSG_BLOCK,\n msg_byte_ptr: BLOCK_BYTE_PTR,\n h: STATE,\n) -> (STATE, MSG_BLOCK) {\n // Pad the rest such that we have a [u32; 2] block at the end representing the length\n // of the message, and a block of 1 0 ... 0 following the message (i.e. [1 << 7, 0, ..., 0]).\n // Here we rely on the fact that everything beyond the available input is set to 0.\n let index = msg_byte_ptr / INT_SIZE;\n\n // Lookup the position of the padding bit and insert it into the message block.\n msg_block[index] += PADDING_BIT_TABLE[msg_byte_ptr % INT_SIZE];\n\n // If we don't have room to write the size, compress the block and reset it.\n if msg_byte_ptr >= MSG_SIZE_PTR {\n let h = sha256_compression(msg_block, h);\n\n // In this case, the final block consists of all zeros with the last 8 bytes containing the length.\n // We set msg_block to all zeros and attach_len_to_msg_block will add the length to the last 8 bytes.\n let msg_block = [0; INT_BLOCK_SIZE];\n (h, msg_block)\n } else {\n (h, msg_block)\n }\n}\n\npub(crate) fn finalize_sha256_blocks(\n message_size: u32,\n mut h: STATE,\n mut msg_block: MSG_BLOCK,\n) -> HASH {\n let msg_byte_ptr = message_size % BLOCK_SIZE;\n\n let (h, mut msg_block) = add_padding_byte_and_compress_if_needed(msg_block, msg_byte_ptr, h);\n\n msg_block = attach_len_to_msg_block(msg_block, message_size);\n\n hash_final_block(msg_block, h)\n}\n\n/**\n * Given some state of a partially computed sha256 hash and part of the preimage, continue hashing\n * @notice used for complex/ recursive offloading of post-partial hashing\n *\n * @param N - the maximum length of the message to hash\n * @param h - the intermediate hash state\n * @param msg - the preimage to hash\n * @param message_size - the actual length of the preimage to hash\n * @return the intermediate hash state after compressing in msg to h\n */\npub fn partial_sha256_var_interstitial<let N: u32>(\n mut h: [u32; 8],\n msg: [u8; N],\n message_size: u32,\n) -> [u32; 8] {\n assert(message_size % BLOCK_SIZE == 0, \"Message size must be a multiple of the block size\");\n if std::runtime::is_unconstrained() {\n // Safety: running as an unconstrained function\n unsafe {\n __sha_partial_var_interstitial(h, msg, message_size)\n }\n } else {\n let (h, _) = process_full_blocks(msg, message_size, h);\n\n h\n }\n}\n\n/**\n * Given some state of a partially computed sha256 hash and remaining preimage, complete the hash\n * @notice used for traditional partial hashing\n *\n * @param N - the maximum length of the message to hash\n * @param h - the intermediate hash state\n * @param msg - the remaining preimage to hash\n * @param message_size - the size of the current chunk\n * @param real_message_size - the total size of the original preimage\n * @return finalized sha256 hash\n */\npub fn partial_sha256_var_end<let N: u32>(\n mut h: [u32; 8],\n msg: [u8; N],\n message_size: u32,\n real_message_size: u32,\n) -> [u8; 32] {\n assert(message_size % BLOCK_SIZE == 0, \"Message size must be a multiple of the block size\");\n if std::runtime::is_unconstrained() {\n // Safety: running as an unconstrained function\n unsafe {\n h = __sha_partial_var_interstitial(h, msg, message_size);\n\n // Handle setup of the final msg block.\n // This case is only hit if the msg is less than the block size,\n // or our message cannot be evenly split into blocks.\n\n finalize_last_sha256_block(h, real_message_size, msg)\n }\n } else {\n let (h, msg_block) = process_full_blocks(msg, message_size, h);\n finalize_sha256_blocks(real_message_size, h, msg_block)\n }\n}\n\nunconstrained fn __sha_partial_var_interstitial<let N: u32>(\n mut h: [u32; 8],\n msg: [u8; N],\n message_size: u32,\n) -> [u32; 8] {\n let num_full_blocks = message_size / BLOCK_SIZE;\n // Intermediate hash, starting with the canonical initial value\n // Pointer into msg_block on a 64 byte scale\n for i in 0..num_full_blocks {\n let msg_block = build_msg_block(msg, message_size, BLOCK_SIZE * i);\n h = sha256_compression(msg_block, h);\n }\n h\n}\n\n// Helper function to finalize the message block with padding and length\nunconstrained fn finalize_last_sha256_block<let N: u32>(\n mut h: STATE,\n message_size: u32,\n msg: [u8; N],\n) -> HASH {\n let msg_byte_ptr = message_size % BLOCK_SIZE;\n\n // We now build the final un-filled block.\n let msg_block: MSG_BLOCK = if msg_byte_ptr != 0 {\n let num_full_blocks = message_size / BLOCK_SIZE;\n let msg_start = BLOCK_SIZE * num_full_blocks;\n build_msg_block(msg, message_size, msg_start)\n } else {\n // If the message size is a multiple of the block size (i.e. `msg_byte_ptr == 0`) then this block will be empty,\n // so we short-circuit in this case.\n [0; 16]\n };\n\n // Once built, we need to add the necessary padding bytes and encoded length\n let (h, mut msg_block) = add_padding_byte_and_compress_if_needed(msg_block, msg_byte_ptr, h);\n msg_block = attach_len_to_msg_block(msg_block, message_size);\n\n hash_final_block(msg_block, h)\n}\n\nmod test_process_full_blocks {\n\n /// Wrapper to force an unconstrained runtime on process_full_blocks.\n unconstrained fn unconstrained_process_full_blocks<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n h: super::STATE,\n ) -> (super::STATE, super::MSG_BLOCK) {\n super::process_full_blocks(msg, message_size, h)\n }\n\n #[test]\n fn test_implementations_agree(msg: [u8; 100], message_size: u32) {\n let message_size = message_size % 100;\n // Safety: test function\n let unconstrained_state =\n unsafe { unconstrained_process_full_blocks(msg, message_size, super::INITIAL_STATE) };\n let state = super::process_full_blocks(msg, message_size, super::INITIAL_STATE);\n assert_eq(state, unconstrained_state);\n }\n}\n\nmod test_sha256_var {\n\n /// Wrapper to force an unconstrained runtime on sha256.\n unconstrained fn unconstrained_sha256<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n ) -> super::HASH {\n super::sha256_var(msg, message_size)\n }\n\n #[test]\n fn test_implementations_agree(msg: [u8; 100], message_size: u32) {\n let message_size = message_size % 100;\n // Safety: test function\n let unconstrained_sha = unsafe { unconstrained_sha256(msg, message_size) };\n let sha = super::sha256_var(msg, message_size);\n assert_eq(sha, unconstrained_sha);\n }\n\n}\n"
|
|
4264
4264
|
},
|