@aztec/aztec.js 0.1.0-alpha45 → 0.1.0-alpha46
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/.tsbuildinfo +1 -1
- package/dest/abis/ecdsa_account_contract.json +14 -14
- package/dest/abis/schnorr_account_contract.json +14 -14
- package/dest/abis/schnorr_single_key_account_contract.json +8 -8
- package/dest/main.js +1 -1
- package/package.json +4 -4
- package/src/abis/ecdsa_account_contract.json +14 -14
- package/src/abis/schnorr_account_contract.json +14 -14
- package/src/abis/schnorr_single_key_account_contract.json +8 -8
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
}
|
|
142
142
|
],
|
|
143
143
|
"returnTypes": [],
|
|
144
|
-
"bytecode": "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",
|
|
144
|
+
"bytecode": "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",
|
|
145
145
|
"verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
|
|
146
146
|
}
|
|
147
147
|
],
|
|
@@ -149,12 +149,12 @@
|
|
|
149
149
|
"debugSymbols": [
|
|
150
150
|
"eJyrVsrJT04syczPK1ayqq6tBQAz9wY7",
|
|
151
151
|
"eJzFld1qwkAQhd9lr3OxM7O/eZXSC2ktCKKleid59xoxm2CHLMKeeqdwmO+w5Ju5mP3xY3PeHQ8n01+MmP7tYk7fm8P473Te/JxNL2R9Z7aHz/GnT0Nnvnb7rent0P3JkkicwiTOx5IWGt4749AAjwYENCCiAQkNyGgAWTiB4ASGE+A2E1xngvtMcKEJbjTBlSa40wx3muFOM9xphjvNcKcZ7jTDnWa40wx3muFOC9xpgTstcKelgXFeUiEElkdCA+MqhAbGVQgNjKsQGhhXITQwbp3gGhhXITQwrkJoYFyF0OCKVghwpx3caQd32sGddnCnvW6cUJwIksIqIecwzbfiStQlrQ0Hmk9JXIbHLvp3/UQXIi7zaZFVy8QwFU9E87NkJertFPXez1ODEuU0Pbcwz1HWotbdoyxzV7k9ha4H6imyzfdsDmn5FGMV3aN/qBLlsYou3Euq6Ga+pIp+ll9RJejbxEvZV9671SoSSus8f4nR3qbrl/WJ6cHJPRoiPU7Xt0+r6fpFbTVdXxetpusboNV0XWpXVq4EK6vTOdpSZLG9rot0GH4BHcP2jg==",
|
|
152
|
-
"
|
|
152
|
+
"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"
|
|
153
153
|
],
|
|
154
154
|
"fileMap": {
|
|
155
155
|
"0": {
|
|
156
156
|
"source": "mod storage;\nmod public_key_note;\n\n// Account contract that uses Schnorr signatures for authentication.\n// The signing key is stored in an immutable private note and should be different from the encryption/nullifying key.\ncontract SchnorrAccount {\n use dep::std;\n use dep::aztec::entrypoint;\n use dep::aztec::entrypoint::EntrypointPayload;\n use dep::aztec::abi;\n use dep::aztec::abi::PrivateContextInputs;\n use dep::aztec::abi::CallContext;\n use dep::aztec::private_call_stack_item::PrivateCallStackItem;\n use dep::aztec::public_call_stack_item::PublicCallStackItem;\n use dep::aztec::context::PrivateContext;\n use dep::aztec::log::emit_encrypted_log;\n use dep::aztec::oracle::get_public_key::get_public_key;\n use dep::aztec::types::vec::BoundedVec;\n use dep::aztec::types::point::Point;\n use dep::aztec::note::utils as note_utils;\n use dep::aztec::note::note_header::NoteHeader;\n use dep::aztec::constants_gen::MAX_NOTE_FIELDS_LENGTH;\n use dep::aztec::constants_gen::GENERATOR_INDEX__CONTRACT_ADDRESS;\n use dep::aztec::constants_gen::GENERATOR_INDEX__SIGNATURE_PAYLOAD;\n\n use crate::storage::Storage;\n use crate::public_key_note::PublicKeyNote;\n use crate::public_key_note::PublicKeyNoteMethods;\n use crate::public_key_note::PUBLIC_KEY_NOTE_LEN;\n\n // docs:start:entrypoint\n\n fn entrypoint(\n inputs: pub PrivateContextInputs,\n payload: pub EntrypointPayload, // contains a set of arguments, selectors, targets and a nonce\n signature: pub [u8;64], // schnorr signature of the payload hash\n ) -> distinct pub abi::PrivateCircuitPublicInputs {\n // Initialize context\n // ENTRYPOINT_PAYLOAD_SIZE(13) + 64\n let mut args: BoundedVec<Field, 77> = BoundedVec::new(0);\n args.push_array(payload.serialize());\n for byte in signature { args.push(byte as Field); }\n let mut context = PrivateContext::new(inputs, abi::hash_args(args.storage));\n\n // Load public key from storage\n let storage = Storage::init();\n let public_key = storage.signing_public_key.get_note(&mut context);\n\n // Verify payload signature\n let payload_fields: [Field; entrypoint::ENTRYPOINT_PAYLOAD_SIZE] = payload.serialize();\n let message_field: Field = std::hash::pedersen_with_separator(payload_fields, GENERATOR_INDEX__SIGNATURE_PAYLOAD)[0];\n let message_bytes = message_field.to_be_bytes(32);\n\n // Verify signature of the payload bytes\n let verification = std::schnorr::verify_signature(public_key.x, public_key.y, signature, message_bytes);\n assert(verification == true);\n\n // docs:end:entrypoint\n\n // Execute calls\n payload.execute_calls(&mut context);\n\n context.finish()\n }\n\n // Constructs the contract\n fn constructor(\n inputs: pub PrivateContextInputs,\n signing_pub_key_x: pub Field,\n signing_pub_key_y: pub Field,\n ) -> distinct pub abi::PrivateCircuitPublicInputs {\n let storage = Storage::init();\n \n let mut context = PrivateContext::new(inputs, abi::hash_args([signing_pub_key_x, signing_pub_key_y]));\n \n let this = context.this_address();\n let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this);\n storage.signing_public_key.initialise(&mut context, &mut pub_key_note);\n \n emit_encrypted_log(\n &mut context,\n this,\n storage.signing_public_key.storage_slot,\n get_public_key(this),\n pub_key_note.serialise(),\n );\n\n context.finish()\n }\n\n // Computes notes hash and nullifier.\n // Note 1: Needs to be defined by every contract producing logs.\n // Note 2: Having it in all the contracts gives us the ability to compute the note hash and nullifier differently for different kind of notes.\n unconstrained fn compute_note_hash_and_nullifier(contract_address: Field, nonce: Field, storage_slot: Field, preimage: [Field; PUBLIC_KEY_NOTE_LEN]) -> [Field; 4] {\n assert(storage_slot == 1);\n let note_header = NoteHeader { contract_address, nonce, storage_slot };\n note_utils::compute_note_hash_and_nullifier(PublicKeyNoteMethods, note_header, preimage)\n }\n}\n",
|
|
157
|
-
"path": "/mnt/user-data/
|
|
157
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main"
|
|
158
158
|
},
|
|
159
159
|
"3": {
|
|
160
160
|
"source": "mod poseidon;\n\n#[foreign(sha256)]\nfn sha256<N>(_input : [u8; N]) -> [u8; 32] {}\n\n#[foreign(blake2s)]\nfn blake2s<N>(_input : [u8; N]) -> [u8; 32] {}\n\nfn pedersen<N>(input : [Field; N]) -> [Field; 2] {\n pedersen_with_separator(input, 0)\n}\n\n#[foreign(pedersen)]\nfn pedersen_with_separator<N>(_input : [Field; N], _separator : u32) -> [Field; 2] {}\n\n#[foreign(hash_to_field_128_security)]\nfn hash_to_field<N>(_input : [Field; N]) -> Field {}\n\n#[foreign(keccak256)]\nfn keccak256<N>(_input : [u8; N], _message_size: u32) -> [u8; 32] {}\n\n// mimc-p/p implementation\n// constants are (publicly generated) random numbers, for instance using keccak as a ROM.\n// You must use constants generated for the native field\n// Rounds number should be ~ log(p)/log(exp)\n// For 254 bit primes, exponent 7 and 91 rounds seems to be recommended\nfn mimc<N>(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field {\n //round 0\n let mut t = x + k;\n let mut h = t.pow_32(exp);\n //next rounds\n for i in 1 .. constants.len() {\n t = h + k + constants[i];\n h = t.pow_32(exp);\n };\n h + k\n}\n\nglobal MIMC_BN254_ROUNDS = 91;\n\n//mimc implementation with hardcoded parameters for BN254 curve.\nfn mimc_bn254<N>(array: [Field; N]) -> Field {\n //mimc parameters\n let exponent = 7;\n //generated from seed \"mimc\" using keccak256 \n let constants: [Field; MIMC_BN254_ROUNDS] = [\n 0, \n 20888961410941983456478427210666206549300505294776164667214940546594746570981,\n 15265126113435022738560151911929040668591755459209400716467504685752745317193,\n 8334177627492981984476504167502758309043212251641796197711684499645635709656,\n 1374324219480165500871639364801692115397519265181803854177629327624133579404,\n 11442588683664344394633565859260176446561886575962616332903193988751292992472,\n 2558901189096558760448896669327086721003508630712968559048179091037845349145,\n 11189978595292752354820141775598510151189959177917284797737745690127318076389,\n 3262966573163560839685415914157855077211340576201936620532175028036746741754,\n 17029914891543225301403832095880481731551830725367286980611178737703889171730,\n 4614037031668406927330683909387957156531244689520944789503628527855167665518,\n 19647356996769918391113967168615123299113119185942498194367262335168397100658,\n 5040699236106090655289931820723926657076483236860546282406111821875672148900,\n 2632385916954580941368956176626336146806721642583847728103570779270161510514,\n 17691411851977575435597871505860208507285462834710151833948561098560743654671,\n 11482807709115676646560379017491661435505951727793345550942389701970904563183,\n 8360838254132998143349158726141014535383109403565779450210746881879715734773,\n 12663821244032248511491386323242575231591777785787269938928497649288048289525,\n 3067001377342968891237590775929219083706800062321980129409398033259904188058,\n 8536471869378957766675292398190944925664113548202769136103887479787957959589,\n 19825444354178182240559170937204690272111734703605805530888940813160705385792,\n 16703465144013840124940690347975638755097486902749048533167980887413919317592,\n 13061236261277650370863439564453267964462486225679643020432589226741411380501,\n 10864774797625152707517901967943775867717907803542223029967000416969007792571,\n 10035653564014594269791753415727486340557376923045841607746250017541686319774,\n 3446968588058668564420958894889124905706353937375068998436129414772610003289,\n 4653317306466493184743870159523234588955994456998076243468148492375236846006,\n 8486711143589723036499933521576871883500223198263343024003617825616410932026,\n 250710584458582618659378487568129931785810765264752039738223488321597070280,\n 2104159799604932521291371026105311735948154964200596636974609406977292675173,\n 16313562605837709339799839901240652934758303521543693857533755376563489378839,\n 6032365105133504724925793806318578936233045029919447519826248813478479197288,\n 14025118133847866722315446277964222215118620050302054655768867040006542798474,\n 7400123822125662712777833064081316757896757785777291653271747396958201309118,\n 1744432620323851751204287974553233986555641872755053103823939564833813704825,\n 8316378125659383262515151597439205374263247719876250938893842106722210729522,\n 6739722627047123650704294650168547689199576889424317598327664349670094847386,\n 21211457866117465531949733809706514799713333930924902519246949506964470524162,\n 13718112532745211817410303291774369209520657938741992779396229864894885156527,\n 5264534817993325015357427094323255342713527811596856940387954546330728068658,\n 18884137497114307927425084003812022333609937761793387700010402412840002189451,\n 5148596049900083984813839872929010525572543381981952060869301611018636120248,\n 19799686398774806587970184652860783461860993790013219899147141137827718662674,\n 19240878651604412704364448729659032944342952609050243268894572835672205984837,\n 10546185249390392695582524554167530669949955276893453512788278945742408153192,\n 5507959600969845538113649209272736011390582494851145043668969080335346810411,\n 18177751737739153338153217698774510185696788019377850245260475034576050820091,\n 19603444733183990109492724100282114612026332366576932662794133334264283907557,\n 10548274686824425401349248282213580046351514091431715597441736281987273193140,\n 1823201861560942974198127384034483127920205835821334101215923769688644479957,\n 11867589662193422187545516240823411225342068709600734253659804646934346124945,\n 18718569356736340558616379408444812528964066420519677106145092918482774343613,\n 10530777752259630125564678480897857853807637120039176813174150229243735996839,\n 20486583726592018813337145844457018474256372770211860618687961310422228379031,\n 12690713110714036569415168795200156516217175005650145422920562694422306200486,\n 17386427286863519095301372413760745749282643730629659997153085139065756667205,\n 2216432659854733047132347621569505613620980842043977268828076165669557467682,\n 6309765381643925252238633914530877025934201680691496500372265330505506717193,\n 20806323192073945401862788605803131761175139076694468214027227878952047793390,\n 4037040458505567977365391535756875199663510397600316887746139396052445718861,\n 19948974083684238245321361840704327952464170097132407924861169241740046562673,\n 845322671528508199439318170916419179535949348988022948153107378280175750024,\n 16222384601744433420585982239113457177459602187868460608565289920306145389382,\n 10232118865851112229330353999139005145127746617219324244541194256766741433339,\n 6699067738555349409504843460654299019000594109597429103342076743347235369120,\n 6220784880752427143725783746407285094967584864656399181815603544365010379208,\n 6129250029437675212264306655559561251995722990149771051304736001195288083309,\n 10773245783118750721454994239248013870822765715268323522295722350908043393604,\n 4490242021765793917495398271905043433053432245571325177153467194570741607167,\n 19596995117319480189066041930051006586888908165330319666010398892494684778526,\n 837850695495734270707668553360118467905109360511302468085569220634750561083,\n 11803922811376367215191737026157445294481406304781326649717082177394185903907,\n 10201298324909697255105265958780781450978049256931478989759448189112393506592,\n 13564695482314888817576351063608519127702411536552857463682060761575100923924,\n 9262808208636973454201420823766139682381973240743541030659775288508921362724,\n 173271062536305557219323722062711383294158572562695717740068656098441040230,\n 18120430890549410286417591505529104700901943324772175772035648111937818237369,\n 20484495168135072493552514219686101965206843697794133766912991150184337935627,\n 19155651295705203459475805213866664350848604323501251939850063308319753686505,\n 11971299749478202793661982361798418342615500543489781306376058267926437157297,\n 18285310723116790056148596536349375622245669010373674803854111592441823052978,\n 7069216248902547653615508023941692395371990416048967468982099270925308100727,\n 6465151453746412132599596984628739550147379072443683076388208843341824127379,\n 16143532858389170960690347742477978826830511669766530042104134302796355145785,\n 19362583304414853660976404410208489566967618125972377176980367224623492419647,\n 1702213613534733786921602839210290505213503664731919006932367875629005980493,\n 10781825404476535814285389902565833897646945212027592373510689209734812292327,\n 4212716923652881254737947578600828255798948993302968210248673545442808456151,\n 7594017890037021425366623750593200398174488805473151513558919864633711506220,\n 18979889247746272055963929241596362599320706910852082477600815822482192194401,\n 13602139229813231349386885113156901793661719180900395818909719758150455500533,\n ];\n\n let mut r = 0;\n for elem in array {\n let h = mimc(elem, r, constants, exponent);\n r = r + elem + h;\n }\n r\n}\n",
|
|
@@ -166,47 +166,47 @@
|
|
|
166
166
|
},
|
|
167
167
|
"31": {
|
|
168
168
|
"source": "use crate::constants_gen::{\n RETURN_VALUES_LENGTH,\n MAX_READ_REQUESTS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n GENERATOR_INDEX__FUNCTION_ARGS,\n HISTORIC_BLOCK_DATA_LENGTH,\n CONTRACT_DEPLOYMENT_DATA_LENGTH,\n CALL_CONTEXT_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH,\n CONTRACT_STORAGE_READ_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n GENERATOR_INDEX__FUNCTION_DATA,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST,\n GENERATOR_INDEX__CALL_CONTEXT,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS,\n GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA,\n};\n\nuse crate::oracle::debug_log;\nuse crate::types::vec::BoundedVec;\nuse crate::types::point::Point;\n\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\nstruct ContractDeploymentData {\n deployer_public_key: Point,\n constructor_vk_hash : Field,\n function_tree_root : Field,\n contract_address_salt : Field,\n portal_contract_address : Field,\n}\n\nimpl ContractDeploymentData {\n fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] {\n [\n self.deployer_public_key.x,\n self.deployer_public_key.y,\n self.constructor_vk_hash,\n self.function_tree_root,\n self.contract_address_salt,\n self.portal_contract_address,\n ]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA)[0]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_data: HistoricBlockData,\n\n contract_deployment_data: ContractDeploymentData,\n\n private_global_variables: PrivateGlobalVariables,\n}\n\n// PublicContextInputs are expected to be provided to each public function\nstruct PublicContextInputs {\n call_context: CallContext,\n block_data: HistoricBlockData,\n\n public_global_variables: PublicGlobalVariables,\n}\n\nstruct CallContext {\n msg_sender : Field,\n storage_contract_address : Field,\n portal_contract_address : Field,\n\n is_delegate_call : bool,\n is_static_call : bool,\n is_contract_deployment: bool,\n}\n\nimpl CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n [\n self.msg_sender,\n self.storage_contract_address,\n self.portal_contract_address,\n self.is_delegate_call as Field,\n self.is_static_call as Field,\n self.is_contract_deployment as Field,\n ]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)[0]\n }\n}\n\nstruct HistoricBlockData {\n private_data_tree_root : Field,\n nullifier_tree_root : Field,\n contract_tree_root : Field,\n l1_to_l2_messages_tree_root : Field,\n blocks_tree_root: Field,\n public_data_tree_root: Field,\n global_variables_hash: Field,\n}\n\nimpl HistoricBlockData {\n // NOTE: this order must match the order in `private_circuit_public_inputs.hpp`\n fn serialize(self) -> [Field; HISTORIC_BLOCK_DATA_LENGTH] {\n [\n self.private_data_tree_root,\n self.nullifier_tree_root,\n self.contract_tree_root,\n self.l1_to_l2_messages_tree_root,\n self.blocks_tree_root,\n self.public_data_tree_root,\n self.global_variables_hash,\n ]\n }\n\n fn empty() -> Self {\n Self { private_data_tree_root: 0, nullifier_tree_root: 0, contract_tree_root: 0, l1_to_l2_messages_tree_root: 0, blocks_tree_root: 0, public_data_tree_root: 0, global_variables_hash: 0 }\n }\n}\n\nstruct FunctionData {\n function_selector: Field,\n is_internal: bool,\n is_private: bool,\n is_constructor: bool,\n}\n\nimpl FunctionData {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator([\n self.function_selector,\n self.is_internal as Field,\n self.is_private as Field,\n self.is_constructor as Field,\n ], GENERATOR_INDEX__FUNCTION_DATA)[0]\n }\n}\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n read_requests: [Field; crate::abi::MAX_READ_REQUESTS_PER_CALL],\n new_commitments: [Field; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [Field; MAX_NEW_NULLIFIERS_PER_CALL],\n nullified_commitments: [Field; MAX_NEW_NULLIFIERS_PER_CALL],\n private_call_stack: [Field; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n // Explore introducing a new type like uint256 (similar to Point), so it's more explicit that\n // we're talking about a single number backed by two field elements.\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n block_data: HistoricBlockData,\n contract_deployment_data: ContractDeploymentData,\n chain_id: Field,\n version: Field,\n}\n\nimpl PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0); \n fields.push(self.call_context.hash());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n fields.push_array(self.read_requests);\n fields.push_array(self.new_commitments);\n fields.push_array(self.new_nullifiers);\n fields.push_array(self.nullified_commitments);\n fields.push_array(self.private_call_stack);\n fields.push_array(self.public_call_stack);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_data.serialize());\n fields.push(self.contract_deployment_data.hash());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n dep::std::hash::pedersen_with_separator(fields.storage, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)[0]\n }\n\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n fields.push_array(self.read_requests);\n fields.push_array(self.new_commitments);\n fields.push_array(self.new_nullifiers);\n fields.push_array(self.private_call_stack);\n fields.push_array(self.public_call_stack);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_data.serialize());\n fields.push_array(self.contract_deployment_data.serialize());\n fields.push(self.chain_id);\n fields.push(self.version);\n fields.storage\n }\n}\n\nstruct ContractStorageRead {\n storage_slot: Field,\n value: Field,\n}\n\nimpl ContractStorageRead {\n fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.value]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)[0]\n }\n\n fn empty() -> Self {\n Self { storage_slot: 0, value: 0 }\n }\n}\n\nstruct ContractStorageUpdateRequest {\n storage_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nimpl ContractStorageUpdateRequest {\n fn serialize(self) -> [Field; CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH] {\n [self.storage_slot, self.old_value, self.new_value]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST)[0]\n }\n\n fn empty() -> Self {\n Self { storage_slot: 0, old_value: 0, new_value: 0 }\n }\n}\n\n\nstruct PublicCircuitPublicInputs {\n call_context: CallContext,\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [ContractStorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_read: [ContractStorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [Field; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [Field; crate::abi::MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [Field; crate::abi::MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: Field,\n block_data: HistoricBlockData,\n prover_address: Field,\n\n // TODO: include globals in here and check them elsewhere\n // https://github.com/AztecProtocol/aztec-packages/issues/1567\n}\n\nimpl PublicCircuitPublicInputs {\n \n fn hash(self) -> Field {\n let mut inputs: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0);\n inputs.push(self.call_context.hash());\n inputs.push(self.args_hash);\n inputs.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n inputs.push(self.contract_storage_update_requests[i].hash());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n inputs.push(self.contract_storage_read[i].hash());\n }\n inputs.push_array(self.public_call_stack);\n inputs.push_array(self.new_commitments);\n inputs.push_array(self.new_nullifiers);\n inputs.push_array(self.new_l2_to_l1_msgs);\n\n // We do not include block_data since it's not in the cpp hash\n\n inputs.push_array(self.unencrypted_logs_hash);\n inputs.push(self.unencrypted_log_preimages_length);\n inputs.push_array(self.block_data.serialize()); // see https://github.com/AztecProtocol/aztec-packages/issues/1473\n inputs.push(self.prover_address);\n\n dep::std::hash::pedersen_with_separator(inputs.storage, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)[0]\n }\n\n fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize()); \n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.push_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.push_array(self.contract_storage_read[i].serialize());\n }\n fields.push_array(self.public_call_stack);\n fields.push_array(self.new_commitments);\n fields.push_array(self.new_nullifiers);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_data.serialize());\n fields.push(self.prover_address);\n fields.storage\n }\n}\n\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\nfn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = dep::std::hash::pedersen_with_separator(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS)[0];\n }\n chunks_hashes[i] = chunk_hash;\n }\n dep::std::hash::pedersen_with_separator(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)[0]\n }\n}\n",
|
|
169
|
-
"path": "/mnt/user-data/
|
|
169
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/abi"
|
|
170
170
|
},
|
|
171
171
|
"32": {
|
|
172
172
|
"source": "use crate::constants_gen::{\n EMPTY_NULLIFIED_COMMITMENT,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n};\n\nuse crate::abi;\n\nuse crate::abi::{\n hash_args,\n CallContext,\n ContractDeploymentData,\n HistoricBlockData,\n FunctionData,\n PrivateCircuitPublicInputs,\n PublicCircuitPublicInputs,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\n// l1 to l2 messaging\nuse crate::messaging::process_l1_to_l2_message;\nuse crate::private_call_stack_item::PrivateCallStackItem;\nuse crate::public_call_stack_item::PublicCallStackItem;\n\nuse crate::types::{\n vec::BoundedVec,\n point::Point,\n};\n\nuse crate::utils::arr_copy_slice;\n\nuse crate::oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n};\n\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n inputs: abi::PrivateContextInputs,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n read_requests: BoundedVec<Field, MAX_READ_REQUESTS_PER_CALL>,\n\n new_commitments: BoundedVec<Field, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<Field, MAX_NEW_NULLIFIERS_PER_CALL>,\n nullified_commitments: BoundedVec<Field, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n private_call_stack : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n new_l2_to_l1_msgs : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n block_data: HistoricBlockData,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec<Field>,\n // unencrypted_logs_preimages: Vec<Field>,\n}\n\nimpl PrivateContext {\n fn new(inputs: abi::PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(0),\n new_nullifiers: BoundedVec::new(0),\n nullified_commitments: BoundedVec::new(0),\n\n block_data: inputs.block_data,\n\n private_call_stack: BoundedVec::new(0),\n public_call_stack: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n fn msg_sender(self) -> Field {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> Field {\n self.inputs.call_context.storage_contract_address\n }\n\n fn this_portal_address(self) -> Field {\n self.inputs.call_context.portal_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n fn finish(self) -> abi::PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = abi::PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n nullified_commitments: self.nullified_commitments.storage,\n private_call_stack: self.private_call_stack.storage,\n public_call_stack: self.public_call_stack.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_data: self.block_data,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n fn push_read_request(&mut self, read_request: Field) {\n self.read_requests.push(read_request);\n }\n\n fn push_new_note_hash(&mut self, note_hash: Field) {\n self.new_commitments.push(note_hash);\n }\n\n fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n self.new_nullifiers.push(nullifier);\n self.nullified_commitments.push(nullified_commitment);\n }\n\n fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n fn consume_l1_to_l2_message(&mut self, inputs: abi::PrivateContextInputs, msg_key: Field, content: Field, secret: Field) {\n let nullifier = process_l1_to_l2_message(inputs.block_data.l1_to_l2_messages_tree_root, inputs.call_context.storage_contract_address, msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT)\n }\n\n fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: Field, \n function_selector: Field, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n fn call_private_function_no_args(\n &mut self,\n contract_address: Field, \n function_selector: Field, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n fn call_private_function_with_packed_args(\n &mut self,\n contract_address: Field,\n function_selector: Field,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address, \n function_selector, \n args_hash\n );\n let item = PrivateCallStackItem {\n contract_address: fields[0],\n function_data: FunctionData {\n function_selector: fields[1],\n is_internal: fields[2] as bool,\n is_private: fields[3] as bool,\n is_constructor: fields[4] as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : fields[5],\n storage_contract_address : fields[6],\n portal_contract_address : fields[7],\n \n is_delegate_call : fields[8] as bool,\n is_static_call : fields[9] as bool,\n is_contract_deployment: fields[10] as bool,\n },\n // TODO handle the offsets as a variable incremented during extraction?\n args_hash: fields[11],\n return_values: arr_copy_slice(fields, [0; RETURN_VALUES_LENGTH], 12),\n read_requests: arr_copy_slice(fields, [0; MAX_READ_REQUESTS_PER_CALL], 16),\n new_commitments: arr_copy_slice(fields, [0; MAX_NEW_COMMITMENTS_PER_CALL], 20),\n new_nullifiers: arr_copy_slice(fields, [0; MAX_NEW_NULLIFIERS_PER_CALL], 24),\n nullified_commitments: arr_copy_slice(fields, [0; MAX_NEW_NULLIFIERS_PER_CALL], 28),\n private_call_stack: arr_copy_slice(fields, [0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL], 32),\n public_call_stack: arr_copy_slice(fields, [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL], 36),\n new_l2_to_l1_msgs: arr_copy_slice(fields, [0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL], 40),\n encrypted_logs_hash: arr_copy_slice(fields, [0; NUM_FIELDS_PER_SHA256], 42),\n unencrypted_logs_hash: arr_copy_slice(fields, [0; NUM_FIELDS_PER_SHA256], 44),\n encrypted_log_preimages_length: fields[46],\n unencrypted_log_preimages_length: fields[47],\n block_data: HistoricBlockData {\n // Must match order in `private_circuit_public_inputs.hpp`\n private_data_tree_root : fields[48],\n nullifier_tree_root : fields[49],\n contract_tree_root : fields[50],\n l1_to_l2_messages_tree_root : fields[51],\n blocks_tree_root : fields[52],\n public_data_tree_root: fields[53],\n global_variables_hash: fields[54],\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: Point::new(fields[55], fields[56]),\n constructor_vk_hash : fields[57],\n function_tree_root : fields[58],\n contract_address_salt : fields[59],\n portal_contract_address : fields[60],\n },\n chain_id: fields[61],\n version: fields[62],\n },\n is_execution_request: fields[63] as bool,\n };\n assert(contract_address == item.contract_address);\n assert(function_selector == item.function_data.function_selector);\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender == self.inputs.call_context.storage_contract_address);\n assert(item.public_inputs.call_context.storage_contract_address == contract_address);\n\n self.private_call_stack.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: Field, \n function_selector: Field, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n fn call_public_function_no_args(\n &mut self,\n contract_address: Field, \n function_selector: Field,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n fn call_public_function_with_packed_args(\n &mut self,\n contract_address: Field,\n function_selector: Field,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash\n );\n let item = PublicCallStackItem {\n contract_address: fields[0],\n function_data: FunctionData {\n function_selector: fields[1],\n is_internal: fields[2] as bool,\n is_private: fields[3] as bool,\n is_constructor: fields[4] as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : fields[5],\n storage_contract_address : fields[6],\n portal_contract_address : fields[7],\n \n is_delegate_call : fields[8] as bool,\n is_static_call : fields[9] as bool,\n is_contract_deployment: fields[10] as bool,\n },\n args_hash: fields[11],\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [ContractStorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_read: [ContractStorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [0; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [0; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_data: HistoricBlockData::empty(),\n prover_address: 0,\n },\n is_execution_request: true,\n };\n\n assert(contract_address == item.contract_address);\n assert(function_selector == item.function_data.function_selector);\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender == self.inputs.call_context.storage_contract_address);\n assert(item.public_inputs.call_context.storage_contract_address == contract_address);\n\n self.public_call_stack.push(item.hash());\n }\n}\n\nuse crate::abi::{\n ContractStorageRead,\n ContractStorageUpdateRequest\n};\n\nstruct PublicContext {\n inputs: abi::PublicContextInputs,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n contract_storage_update_requests: BoundedVec<ContractStorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_read: BoundedVec<ContractStorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n\n new_commitments: BoundedVec<Field, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<Field, crate::abi::MAX_NEW_NULLIFIERS_PER_CALL>,\n\n new_l2_to_l1_msgs: BoundedVec<Field, crate::abi::MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hash: BoundedVec<Field, NUM_FIELDS_PER_SHA256>,\n unencrypted_logs_preimages_length: Field,\n\n block_data: HistoricBlockData,\n prover_address: Field,\n}\n\nimpl PublicContext {\n fn new(inputs: abi::PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = ContractStorageRead::empty();\n let empty_storage_update = ContractStorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_read: BoundedVec::new(empty_storage_read),\n public_call_stack: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(0),\n new_nullifiers: BoundedVec::new(0),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_data: inputs.block_data,\n prover_address: 0,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n fn msg_sender(self) -> Field {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> Field {\n self.inputs.call_context.storage_contract_address\n }\n\n fn this_portal_address(self) -> Field {\n self.inputs.call_context.portal_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n fn finish(self) -> abi::PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = abi::PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_read: self.contract_storage_read.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack: self.public_call_stack.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_data: self.inputs.block_data,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n fn push_new_note_hash(&mut self, note_hash: Field) {\n self.new_commitments.push(note_hash);\n }\n\n fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n self.new_nullifiers.push(nullifier);\n }\n\n fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_data.l1_to_l2_messages_tree_root, this, msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT)\n }\n\n fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn call_public_function<ARGS_COUNT>(\n _self: Self,\n contract_address: Field, \n function_selector: Field,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = abi::hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n fn call_public_function_no_args(\n _self: Self,\n contract_address: Field, \n function_selector: Field,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}",
|
|
173
|
-
"path": "/mnt/user-data/
|
|
173
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/context"
|
|
174
174
|
},
|
|
175
175
|
"33": {
|
|
176
176
|
"source": "use crate::context::PrivateContext;\nuse crate::oracle;\nuse crate::types::point::Point;\n\nfn emit_encrypted_log<N>(\n context: &mut PrivateContext,\n contract_address: Field,\n storage_slot: Field,\n encryption_pub_key: Point,\n log: [Field; N],\n) {\n let _ = oracle::logs::emit_encrypted_log(contract_address, storage_slot, encryption_pub_key, log);\n context.accumulate_encrypted_logs(log);\n}\n\nfn emit_unencrypted_log<T>(\n context: &mut PrivateContext,\n log: T,\n) {\n let _ = oracle::logs::emit_unencrypted_log(log);\n context.accumulate_unencrypted_logs(log);\n}\n",
|
|
177
|
-
"path": "/mnt/user-data/
|
|
177
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/log"
|
|
178
178
|
},
|
|
179
179
|
"39": {
|
|
180
180
|
"source": "use dep::std::option::Option;\nuse crate::abi::PublicContextInputs;\nuse crate::context::{\n PrivateContext,\n PublicContext,\n};\nuse crate::note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n utils::compute_inner_note_hash,\n};\nuse crate::oracle::notes::{notify_created_note, notify_nullified_note};\nuse crate::constants_gen::EMPTY_NULLIFIED_COMMITMENT;\n\nfn create_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface<Note, N>,\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0 };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n let serialise = note_interface.serialise;\n let preimage = serialise(*note);\n assert(notify_created_note(storage_slot, preimage, inner_note_hash) == 0);\n\n context.push_new_note_hash(inner_note_hash);\n}\n\nfn create_note_hash_from_public<Note, N>(\n context: &mut PublicContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface<Note, N>,\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0 };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n context.push_new_note_hash(inner_note_hash);\n}\n\nfn destroy_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note: Note,\n note_interface: NoteInterface<Note, N>,\n) {\n let mut nullifier = 0;\n let mut nullified_commitment: Field = EMPTY_NULLIFIED_COMMITMENT;\n let compute_nullifier = note_interface.compute_nullifier;\n nullifier = compute_nullifier(note);\n\n let serialise = note_interface.serialise;\n let preimage = serialise(note);\n\n // We also need the note commitment corresponding to the \"nullifier\"\n let get_header = note_interface.get_header;\n let header = get_header(note);\n // 0 nonce implies \"transient\" nullifier (must nullify a commitment in this TX).\n // `nullified_commitment` is used to inform the kernel which pending commitment\n // the nullifier corresponds to so they can be matched and both squashed/deleted.\n // nonzero nonce implies \"persistable\" nullifier (nullifies a persistent/in-tree\n // commitment) in which case `nullified_commitment` is not used since the kernel\n // just siloes and forwards the nullier to its output.\n if (header.nonce == 0) {\n // TODO(suyash): Can we reuse the note commitment computed in `compute_nullifier`?\n nullified_commitment = compute_inner_note_hash(note_interface, note);\n }\n assert(notify_nullified_note(storage_slot, nullifier, preimage, nullified_commitment) == 0);\n\n context.push_new_nullifier(nullifier, nullified_commitment)\n}",
|
|
181
|
-
"path": "/mnt/user-data/
|
|
181
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/lifecycle"
|
|
182
182
|
},
|
|
183
183
|
"40": {
|
|
184
184
|
"source": "use dep::std::option::Option;\nuse crate::constants_gen::{\n MAX_READ_REQUESTS_PER_CALL,\n GET_NOTE_ORACLE_RETURN_LENGTH,\n GET_NOTES_ORACLE_RETURN_LENGTH,\n MAX_NOTES_PER_PAGE,\n VIEW_NOTE_ORACLE_RETURN_LENGTH,\n};\nuse crate::context::PrivateContext;\nuse crate::note::{\n note_getter_options::{NoteGetterOptions, Select, Sort},\n note_interface::NoteInterface,\n note_header::NoteHeader,\n note_viewer_options::NoteViewerOptions,\n utils::compute_note_hash_for_read_or_nullify,\n utils::compute_unique_siloed_note_hash,\n utils::compute_inner_note_hash,\n utils::compute_siloed_note_hash,\n};\nuse crate::messaging::get_commitment_getter_data::make_commitment_getter_data;\nuse crate::oracle;\nuse crate::types::vec::BoundedVec;\n\nfn check_note_header<Note, N>(\n context: PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: Note,\n) {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n let contract_address = context.this_address();\n assert(header.contract_address == contract_address);\n assert(header.storage_slot == storage_slot);\n}\n\nfn ensure_note_exists<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: &mut Note,\n) {\n let saved_note = get_note_internal(storage_slot, note_interface);\n\n // Only copy over the header to the original note to make sure the preimage is the same.\n let get_header = note_interface.get_header;\n let set_header = note_interface.set_header;\n let note_header = get_header(saved_note);\n set_header(note, note_header);\n\n check_note_header(*context, storage_slot, note_interface, *note);\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, *note);\n context.push_read_request(note_hash_for_read_request);\n}\n\n// Ensure a note's hash exists in the tree without retrieving the entire\n// notes via the oracle.\n// Modifies the note by populating it with header info.\nfn ensure_note_hash_exists<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: &mut Note,\n) {\n // Initialize header of note. Must be done before computing note hashes as it initializes the:\n // - storage slot (used in inner note hash)\n // - the contract address (used in siloed note hash)\n // - and the nonce (used in the unique siloed note hash)\n let set_header = note_interface.set_header;\n let note_header = NoteHeader {\n contract_address: (*context).this_address(),\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be\n // real nonce (once public kernel applies nonces).\n nonce: 0,\n storage_slot\n };\n set_header(note, note_header);\n\n // Get a note from oracle and early out if it doesn't exist.\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n let raw_oracle_ret = oracle::get_commitment::get_commitment(inner_note_hash);\n let deserialized_oracle_ret = make_commitment_getter_data(raw_oracle_ret, 0);\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be\n // unique_siloed_note_hash once public kernel applies nonces\n let saved_siloed_note_hash = deserialized_oracle_ret.message;\n\n assert(saved_siloed_note_hash != 0); // TODO(dbanks12): necessary?\n\n check_note_header(*context, storage_slot, note_interface, *note);\n\n // Ensure that the note hash retrieved from oracle matches the one computed from note.\n let computed_siloed_note_hash = compute_siloed_note_hash(note_interface, *note);\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be\n // compute_note_hash_for_read_or_nullify once public kernel applies nonces\n assert(computed_siloed_note_hash == saved_siloed_note_hash);\n\n context.push_read_request(computed_siloed_note_hash);\n}\n\nfn get_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n) -> Note {\n let note = get_note_internal(storage_slot, note_interface);\n\n check_note_header(*context, storage_slot, note_interface, note);\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n\n context.push_read_request(note_hash_for_read_request);\n note\n}\n\nfn get_notes<Note, N, FILTER_ARGS>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteGetterOptions<Note, N, FILTER_ARGS>,\n) -> [Option<Note>; MAX_READ_REQUESTS_PER_CALL] {\n let opt_notes = get_notes_internal(storage_slot, note_interface, options);\n for i in 0..opt_notes.len() {\n let opt_note = opt_notes[i];\n let mut note_hash_for_read_request = 0;\n if opt_note.is_some() {\n let note = opt_note.unwrap_unchecked();\n check_note_header(*context, storage_slot, note_interface, note);\n note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n };\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1410): test to ensure\n // failure if malicious oracle injects 0 nonce here for a \"pre-existing\" note.\n context.push_read_request(note_hash_for_read_request);\n };\n\n // TODO(#1660)\n // Move it back to get_notes_internal and only make read request for selected notes.\n let filter = options.filter;\n let filter_args = options.filter_args;\n filter(opt_notes, filter_args)\n}\n\nunconstrained fn get_note_internal<Note, N>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n) -> Note {\n let placeholder_note = [Option::none()];\n let placeholder_fields = [0; GET_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n 0,\n [],\n [],\n [],\n [],\n 1, // limit\n 0, // offset\n placeholder_note,\n placeholder_fields,\n )[0].unwrap() // Notice: we don't allow dummies to be returned from get_note (singular).\n}\n\nunconstrained fn get_notes_internal<Note, N, FILTER_ARGS>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteGetterOptions<Note, N, FILTER_ARGS>,\n) -> [Option<Note>; MAX_READ_REQUESTS_PER_CALL] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_READ_REQUESTS_PER_CALL];\n let placeholder_fields = [0; GET_NOTES_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields,\n )\n}\n\nunconstrained fn view_notes<Note, N>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteViewerOptions<Note, N>,\n) -> [Option<Note>; MAX_NOTES_PER_PAGE] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_NOTES_PER_PAGE];\n let placeholder_fields = [0; VIEW_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields,\n )\n}\n\nunconstrained fn flatten_options<Note, N>(\n selects: BoundedVec<Option<Select>, N>,\n sorts: BoundedVec<Option<Sort>, N>,\n) -> (u8, [u8; N], [Field; N], [u8; N], [u2; N]) {\n let mut num_selects = 0;\n let mut select_by = [0; N];\n let mut select_values = [0; N];\n for i in 0..selects.len {\n let select = selects.get(i);\n if select.is_some() {\n select_by[num_selects] = select.unwrap_unchecked().field_index;\n select_values[num_selects] = select.unwrap_unchecked().value;\n num_selects += 1;\n };\n };\n\n let mut sort_by = [0; N];\n let mut sort_order = [0; N];\n for i in 0..sorts.len {\n let sort = sorts.get(i);\n if sort.is_some() {\n sort_by[i] = sort.unwrap_unchecked().field_index;\n sort_order[i] = sort.unwrap_unchecked().order;\n };\n };\n\n (num_selects, select_by, select_values, sort_by, sort_order)\n}",
|
|
185
|
-
"path": "/mnt/user-data/
|
|
185
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/note_getter"
|
|
186
186
|
},
|
|
187
187
|
"42": {
|
|
188
188
|
"source": "use dep::std::hash::{pedersen, pedersen_with_separator};\nuse crate::constants_gen::{GENERATOR_INDEX__UNIQUE_COMMITMENT, GENERATOR_INDEX__SILOED_COMMITMENT};\n\nfn compute_inner_hash(storage_slot: Field, note_hash: Field) -> Field {\n // TODO(#1205) Do we need a generator index here?\n pedersen([storage_slot, note_hash])[0]\n}\n\nfn compute_siloed_hash(contract_address: Field, inner_note_hash: Field) -> Field {\n let inputs = [contract_address, inner_note_hash];\n pedersen_with_separator(inputs, GENERATOR_INDEX__SILOED_COMMITMENT)[0]\n}\n\nfn compute_unique_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n pedersen_with_separator(inputs, GENERATOR_INDEX__UNIQUE_COMMITMENT)[0]\n}\n",
|
|
189
|
-
"path": "/mnt/user-data/
|
|
189
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/note_hash"
|
|
190
190
|
},
|
|
191
191
|
"46": {
|
|
192
192
|
"source": "use crate::note::{\n note_hash::{compute_inner_hash, compute_siloed_hash, compute_unique_hash},\n note_header::NoteHeader,\n note_interface::NoteInterface,\n};\nuse crate::utils::arr_copy_slice;\n\nfn compute_inner_note_hash<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n\n compute_inner_hash(header.storage_slot, note_hash)\n}\n\nfn compute_siloed_note_hash<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note_with_header: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let inner_note_hash = compute_inner_note_hash(note_interface, note_with_header);\n\n compute_siloed_hash(header.contract_address, inner_note_hash)\n}\n\nfn compute_unique_siloed_note_hash<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note_with_header: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let siloed_note_hash = compute_siloed_note_hash(note_interface, note_with_header);\n\n compute_unique_hash(header.nonce, siloed_note_hash)\n}\n\nfn compute_note_hash_for_read_or_nullify<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note_with_header: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n if (header.nonce == 0) {\n // when nonce is zero, that means we are reading a pending note (doesn't have a nonce yet),\n // so we just read the inner_note_hash (kernel will silo by contract address)\n compute_inner_note_hash(note_interface, note_with_header)\n } else {\n // When nonce is nonzero, that means we are reading a settled note (from tree) created in a\n // previous TX. So we need the unique_siloed_note_hash which has already been hashed with\n // contract address and then nonce. This hash will match the existing leaf in the private\n // data tree, so the kernel can just perform a membership check directly on this hash/leaf.\n compute_unique_siloed_note_hash(note_interface, note_with_header)\n }\n\n}\n\nfn compute_note_hash_and_nullifier<Note, N, S>(\n note_interface: NoteInterface<Note, N>,\n note_header: NoteHeader,\n preimage: [Field; S],\n) -> [Field; 4] {\n let deserialise = note_interface.deserialise;\n let set_header = note_interface.set_header;\n let mut note = deserialise(arr_copy_slice(preimage, [0; N], 0));\n set_header(&mut note, note_header);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n let inner_note_hash = compute_inner_hash(note_header.storage_slot, note_hash);\n\n let siloed_note_hash = compute_siloed_hash(note_header.contract_address, inner_note_hash);\n\n let unique_siloed_note_hash = compute_unique_hash(note_header.nonce, siloed_note_hash);\n\n let compute_nullifier = note_interface.compute_nullifier;\n let inner_nullifier = compute_nullifier(note);\n\n [inner_note_hash, siloed_note_hash, unique_siloed_note_hash, inner_nullifier]\n}\n",
|
|
193
|
-
"path": "/mnt/user-data/
|
|
193
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/utils"
|
|
194
194
|
},
|
|
195
195
|
"48": {
|
|
196
196
|
"source": "use dep::std::hash::pedersen_with_separator;\nuse crate::context::PrivateContext;\nuse crate::note::{\n lifecycle::create_note,\n note_getter::{get_note, view_notes},\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n};\nuse crate::oracle;\nuse crate::constants_gen::{\n GENERATOR_INDEX__INITIALISATION_NULLIFIER,\n EMPTY_NULLIFIED_COMMITMENT,\n};\n\nstruct ImmutableSingleton<Note, N> {\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n}\n\nimpl<Note, N> ImmutableSingleton<Note, N> {\n fn new(storage_slot: Field, note_interface: NoteInterface<Note, N>) -> Self {\n ImmutableSingleton { storage_slot, note_interface }\n }\n\n unconstrained fn is_initialised(self) -> bool {\n let nullifier = self.compute_initialisation_nullifier();\n oracle::notes::is_nullifier_emitted(nullifier)\n }\n\n fn initialise(self, context: &mut PrivateContext, note: &mut Note) {\n // Nullify the storage slot.\n let nullifier = self.compute_initialisation_nullifier();\n context.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT);\n\n create_note(context, self.storage_slot, note, self.note_interface);\n }\n\n fn compute_initialisation_nullifier(self) -> Field {\n pedersen_with_separator([self.storage_slot], GENERATOR_INDEX__INITIALISATION_NULLIFIER)[0]\n }\n \n fn get_note(self, context: &mut PrivateContext) -> Note {\n let storage_slot = self.storage_slot;\n get_note(context, storage_slot, self.note_interface)\n }\n\n unconstrained fn view_note(self) -> Note {\n let options = NoteViewerOptions::new().set_limit(1);\n view_notes(self.storage_slot, self.note_interface, options)[0].unwrap()\n }\n}",
|
|
197
|
-
"path": "/mnt/user-data/
|
|
197
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton"
|
|
198
198
|
},
|
|
199
199
|
"55": {
|
|
200
200
|
"source": "\nstruct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n fn push_array<Len>(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n}\n\n// #[test]\n// fn test_vec() {\n// let vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n// assert(vec.len == 0);\n// let vec1 = vec.push(1);\n// assert(vec1.len == 1);\n// let vec2 = vec1.push(1);\n// assert(vec2.len == 2);\n// let vec3 = vec2.push(1);\n// assert(vec3.len == 3);\n// let x = vec3.pop();\n// assert(x == 1);\n// }",
|
|
201
|
-
"path": "/mnt/user-data/
|
|
201
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/types/vec"
|
|
202
202
|
},
|
|
203
203
|
"70": {
|
|
204
204
|
"source": "use crate::types::point::Point;\nuse dep::std::hash;\nuse crate::constants_gen::GENERATOR_INDEX__CONTRACT_ADDRESS;\n\n#[oracle(getPublicKey)]\nfn get_public_key_oracle(_address: Field) -> [Field; 3] {}\n\nunconstrained fn get_public_key_internal(address: Field) -> [Field; 3] {\n get_public_key_oracle(address)\n}\n\nfn get_public_key(address: Field) -> Point {\n let result = get_public_key_internal(address);\n let pub_key_x = result[0];\n let pub_key_y = result[1];\n let partial_address = result[2];\n \n let calculated_address = hash::pedersen_with_separator([pub_key_x, pub_key_y, partial_address], GENERATOR_INDEX__CONTRACT_ADDRESS)[0];\n assert(calculated_address == address);\n \n Point::new(pub_key_x, pub_key_y)\n}\n",
|
|
205
|
-
"path": "/mnt/user-data/
|
|
205
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/oracle/get_public_key"
|
|
206
206
|
},
|
|
207
207
|
"78": {
|
|
208
208
|
"source": "use crate::abi;\nuse crate::types::vec::BoundedVec;\nuse crate::context::PrivateContext;\nuse crate::private_call_stack_item::PrivateCallStackItem;\nuse crate::public_call_stack_item::PublicCallStackItem; \n\nglobal ACCOUNT_MAX_PRIVATE_CALLS: Field = 2;\nglobal ACCOUNT_MAX_PUBLIC_CALLS: Field = 2;\nglobal ACCOUNT_MAX_CALLS: Field = 4;\n// 1 (ARGS_HASH) + 1 (FUNCTION_SELECTOR) + 1 (TARGET_ADDRESS)\nglobal FUNCTION_CALL_SIZE: Field = 3;\n\nstruct FunctionCall {\n args_hash: Field,\n function_selector: Field,\n target_address: Field,\n}\n\nimpl FunctionCall {\n fn serialize(self) -> [Field; FUNCTION_CALL_SIZE] {\n [self.args_hash, self.function_selector, self.target_address]\n }\n}\n\n// FUNCTION_CALL_SIZE * (ACCOUNT_MAX_PUBLIC_CALLS + ACCOUNT_MAX_PRIVATE_CALLS) + 1\nglobal ENTRYPOINT_PAYLOAD_SIZE: Field = 13;\nglobal ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES: Field = 416;\n\nstruct EntrypointPayload {\n // Noir doesnt support nested arrays or structs yet so we flatten everything\n flattened_args_hashes: [Field; ACCOUNT_MAX_CALLS],\n flattened_selectors: [Field; ACCOUNT_MAX_CALLS],\n flattened_targets: [Field; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n\nimpl EntrypointPayload {\n // TODO(#1207) Do we need a generator index?\n fn hash(self) -> Field {\n dep::std::hash::pedersen(self.serialize())[0]\n }\n\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; ENTRYPOINT_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, ENTRYPOINT_PAYLOAD_SIZE> = BoundedVec::new(0); \n fields.push_array(self.flattened_args_hashes);\n fields.push_array(self.flattened_selectors);\n fields.push_array(self.flattened_targets);\n fields.push(self.nonce);\n fields.storage\n }\n\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] = [0; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES];\n\n let args_len = self.flattened_args_hashes.len();\n let selectors_len = self.flattened_selectors.len();\n let targets_len = self.flattened_targets.len();\n\n for i in 0..args_len {\n let item_bytes = self.flattened_args_hashes[i].to_be_bytes(32);\n for j in 0..32 { \n bytes[i * 32 + j] = item_bytes[j];\n }\n }\n\n for i in 0..selectors_len {\n let item_bytes = self.flattened_selectors[i].to_be_bytes(32);\n for j in 0..32 { \n bytes[args_len * 32 + i * 32 + j] = item_bytes[j];\n }\n }\n\n for i in 0..targets_len {\n let item_bytes = self.flattened_targets[i].to_be_bytes(32);\n for j in 0..32 { \n bytes[(args_len + selectors_len) * 32 + i * 32 + j] = item_bytes[j];\n }\n }\n \n let item_bytes = self.nonce.to_be_bytes(32);\n for j in 0..32 { \n bytes[(args_len + selectors_len + targets_len) * 32 + j] = item_bytes[j];\n }\n\n bytes\n }\n\n // Executes all private and public calls \n fn execute_calls(self, context: &mut PrivateContext) {\n for i in 0..ACCOUNT_MAX_PRIVATE_CALLS {\n let target_address = self.flattened_targets[i];\n if target_address != 0 {\n let function_selector = self.flattened_selectors[i];\n let args_hash = self.flattened_args_hashes[i];\n let _callStackItem = context.call_private_function_with_packed_args(target_address, function_selector, args_hash);\n }\n }\n for i in ACCOUNT_MAX_PRIVATE_CALLS..ACCOUNT_MAX_CALLS {\n let target_address = self.flattened_targets[i];\n if target_address != 0 {\n let function_selector = self.flattened_selectors[i];\n let args_hash = self.flattened_args_hashes[i];\n let _callStackItem = context.call_public_function_with_packed_args(target_address, function_selector, args_hash);\n }\n }\n }\n}",
|
|
209
|
-
"path": "/mnt/user-data/
|
|
209
|
+
"path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/entrypoint"
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
}
|