diff --git a/sdk/src/program-manager.ts b/sdk/src/program-manager.ts index 25c534c4f..b3bf74d9a 100644 --- a/sdk/src/program-manager.ts +++ b/sdk/src/program-manager.ts @@ -73,6 +73,7 @@ interface ExecuteOptions { program?: string | Program; imports?: ProgramImports; edition?: number, + skipProof?: boolean, } /** @@ -316,6 +317,7 @@ class ProgramManager { * @param {RecordSearchParams | undefined} recordSearchParams Optional parameters for searching for a record to use pay the deployment fee * @param {string | RecordPlaintext | undefined} feeRecord Optional Fee record to use for the transaction * @param {PrivateKey | undefined} privateKey Optional private key to use for the transaction + * @param {boolean | undefined} skipCertificate Whether to skip proof generation and key sysnthesis in the deployment transaction * @returns {string} The transaction id of the deployed program or a failure message from the network * * @example @@ -352,6 +354,7 @@ class ProgramManager { recordSearchParams?: RecordSearchParams, feeRecord?: string | RecordPlaintext, privateKey?: PrivateKey, + skipCertificate?: boolean, ): Promise { // Ensure the program is valid. let programObject; @@ -412,6 +415,28 @@ class ProgramManager { ); } + // Resolve the program imports if they exist + let imports; + try { + imports = await this.networkClient.getProgramImports(program); + } catch (e: any) { + logAndThrow( + `Error finding program imports. Network response: '${e.message}'. Please ensure you're connected to a valid Aleo network and the program is deployed to the network.`, + ); + } + if (skipCertificate === undefined) { + skipCertificate = false; + } + if (skipCertificate === true) { + return await WasmProgramManager.buildDevnodeDeploymentTransaction( + deploymentPrivateKey, + program, + priorityFee, + feeRecord, + this.host, + imports, + ); + } // Get the proving and verifying keys from the key provider let feeKeys; try { @@ -425,16 +450,6 @@ class ProgramManager { } const [feeProvingKey, feeVerifyingKey] = feeKeys; - // Resolve the program imports if they exist - let imports; - try { - imports = await this.networkClient.getProgramImports(program); - } catch (e: any) { - logAndThrow( - `Error finding program imports. Network response: '${e.message}'. Please ensure you're connected to a valid Aleo network and the program is deployed to the network.`, - ); - } - // Build a deployment transaction return await WasmProgramManager.buildDeploymentTransaction( deploymentPrivateKey, @@ -580,6 +595,12 @@ class ProgramManager { let programName = options.programName; let imports = options.imports; let edition = options.edition; + let skipProof = options.skipProof; + + // Skip proof defaults to false. + if (typeof skipProof === "undefined") { + skipProof = false; + } // Ensure the function exists on the network if (program === undefined) { @@ -640,32 +661,6 @@ class ProgramManager { ); } - // Get the fee proving and verifying keys from the key provider - let feeKeys; - try { - feeKeys = privateFee - ? await this.keyProvider.feePrivateKeys() - : await this.keyProvider.feePublicKeys(); - } catch (e: any) { - logAndThrow( - `Error finding fee keys. Key finder response: '${e.message}'. Please ensure your key provider is configured correctly.`, - ); - } - const [feeProvingKey, feeVerifyingKey] = feeKeys; - - // If the function proving and verifying keys are not provided, attempt to find them using the key provider - if (!provingKey || !verifyingKey) { - try { - [provingKey, verifyingKey] = ( - await this.keyProvider.functionKeys(keySearchParams) - ); - } catch (e) { - console.log( - `Function keys not found. Key finder response: '${e}'. The function keys will be synthesized`, - ); - } - } - // Resolve the program imports if they exist const numberOfImports = Program.fromString(program).getImports().length; if (numberOfImports > 0 && !imports) { @@ -679,35 +674,78 @@ class ProgramManager { ); } } - - if (offlineQuery && !this.inclusionKeysLoaded) { + if (skipProof === true) { + console.log("program is: {}", program); + // Build a transaction without a proof + return await WasmProgramManager.buildDevnodeExecutionTransaction( + executionPrivateKey, + program, + functionName, + inputs, + priorityFee, + feeRecord, + this.host, + imports, + offlineQuery, + edition + ); + } + + // Get the fee proving and verifying keys from the key provider + let feeKeys; try { - const inclusionKeys = await this.keyProvider.inclusionKeys(); - WasmProgramManager.loadInclusionProver(inclusionKeys[0]) - this.inclusionKeysLoaded = true; - console.log("Successfully loaded inclusion key"); - } catch { - logAndThrow(`Inclusion key bytes not loaded, please ensure the program manager is initialized with a KeyProvider that includes the inclusion key.`) + feeKeys = privateFee + ? await this.keyProvider.feePrivateKeys() + : await this.keyProvider.feePublicKeys(); + } catch (e: any) { + logAndThrow( + `Error finding fee keys. Key finder response: '${e.message}'. Please ensure your key provider is configured correctly.`, + ); + } + const [feeProvingKey, feeVerifyingKey] = feeKeys; + + // If the function proving and verifying keys are not provided, attempt to find them using the key provider + if (!provingKey || !verifyingKey) { + try { + [provingKey, verifyingKey] = ( + await this.keyProvider.functionKeys(keySearchParams) + ); + } catch (e) { + console.log( + `Function keys not found. Key finder response: '${e}'. The function keys will be synthesized`, + ); + } } - } - // Build an execution transaction - return await WasmProgramManager.buildExecutionTransaction( - executionPrivateKey, - program, - functionName, - inputs, - priorityFee, - feeRecord, - this.host, - imports, - provingKey, - verifyingKey, - feeProvingKey, - feeVerifyingKey, - offlineQuery, - edition - ); + if (offlineQuery && !this.inclusionKeysLoaded) { + try { + const inclusionKeys = await this.keyProvider.inclusionKeys(); + WasmProgramManager.loadInclusionProver(inclusionKeys[0]) + this.inclusionKeysLoaded = true; + console.log("Successfully loaded inclusion key"); + } catch { + logAndThrow(`Inclusion key bytes not loaded, please ensure the program manager is initialized with a KeyProvider that includes the inclusion key.`) + } + } + + // Build an execution transaction + return await WasmProgramManager.buildExecutionTransaction( + executionPrivateKey, + program, + functionName, + inputs, + priorityFee, + feeRecord, + this.host, + imports, + provingKey, + verifyingKey, + feeProvingKey, + feeVerifyingKey, + offlineQuery, + edition + ); + } /** diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 29be4dd0a..983ec469e 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -2186,9 +2186,8 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f86971b37e69b5306aef35c69d0f72161a060b1f8b32aca3d212f1ed2d04637" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -2214,9 +2213,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf787de3f5a32684c6133dce0d7cc9e60a275e1f8d4693f64ed8c6b440f6607" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2229,9 +2227,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d949b4afd5d8f82f5b4eb77415992b10946bd9751a39cc2f6a065a6b7a6f5360" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-network", "snarkvm-circuit-types", @@ -2240,9 +2237,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "313bcc7cdfedb85fe5be3eb2e15f2e02b68b36ba82fc06d5cf4948518acc057b" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-types", "snarkvm-console-algorithms", @@ -2251,9 +2247,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa18201496366b5b4df792b2a8390cd4a3b43fbda450391b53622af519bc8008" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-types", @@ -2262,9 +2257,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8604e360ae3af16bdb7d24755260d93c76461b8701dfe1541db1622fa8b106b3" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "indexmap", "itertools", @@ -2281,15 +2275,13 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d99ae833a7aaddbe07e27ba9670bf2784e5bb50ba0b0e798b2f393dcd989c9" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" [[package]] name = "snarkvm-circuit-network" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "191442c2657e9331232b5eb4b7dcb2d092b8bbeba62d05e8cf5586a297eedcf1" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2299,9 +2291,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6838f4bbc73db38e163b9d4da521004e10b051cbb3aadf5d98a132bbb8e5bc7a" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2314,9 +2305,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "181b57e5fdfd2c0e727ccbe6235eec867cc99748df725896ec7285478a1bcdf4" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2330,9 +2320,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16af5c272f68f6b2ab10cfcc68d8170297a604c4dcaece052b5cd7f3a253600c" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2344,9 +2333,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be45db5be35742275f1f59e36c0e8ff56bc117848029636dc64563f18e298ee3" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-console-types-boolean", @@ -2354,9 +2342,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a4754c415165409c9e77f8f0f02e60e18b04e6bbfe8aa91b44948b3fd1f45f3" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2365,9 +2352,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2fe589b309d79926bca0505a2a9e7978e95fb4b18899f9a0108e1e6e975cdc5" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2378,9 +2364,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4a33327a1f2a2858bf21f9a5ae9afb2f2b85d97494c4bb707e007e822a2c78" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2391,9 +2376,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0ec6bacf1997791fef10d31d7be1c2efdb26b2ef73e05d1c1986b58d62d82f" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2403,9 +2387,8 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e689dc2153df5a1603cac825e094b9ec3df809c74dda2b6d0b67ee06f56f35cd" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2416,9 +2399,8 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dea6574370cf8ac3c758dc1f0dd1265497af0c1e7f01a8955610a95cf8ec9e4" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2430,9 +2412,8 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea7c6463add8b7625bddd527348eecf8cda97b5a596bdfc7e67206f8c05d2ede" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "bs58", "snarkvm-console-network", @@ -2442,9 +2423,8 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f6669a797f6b8ec7919e359988b1b3ef4f6e1e7900864e4d455f2708708b9a9" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "blake2s_simd", "hex", @@ -2458,9 +2438,8 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f04696546d115687ad110ced1dc517a0cd68c743881ff0bb78821225dd5b06" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "rayon", @@ -2470,9 +2449,8 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54edb16375212ce535092cfff04182886929712a6d5530ed4ab586ae00092fa1" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "anyhow", "enum-iterator", @@ -2491,9 +2469,8 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "361a00b34d968e01f49c6f8da53119c31b23f779777d1e45762337566d926f58" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "anyhow", "bech32", @@ -2510,9 +2487,8 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2724a0f9c3e07e39ae100fb365f9a54e7d3e572f46ae0d2d709d670d8f0889b8" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "enum-iterator", "enum_index", @@ -2532,9 +2508,8 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd89b14c1d1a77f492e07c0b50f77e2d706a7b75d44ab1685a35a01a36fee766" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2548,9 +2523,8 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "935164389f178ffd7da422263d36661377c21e6ddad4fd9eb24a4700ac44ebe5" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -2560,18 +2534,16 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910a4367a81f30731c3b0535eceed9a280aaf478b2e9e3298ea32a7ca04d71cf" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", ] [[package]] name = "snarkvm-console-types-field" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e9a52034ccfb9308e23b4b236b6d4075ed6bec6566d2d33a51f4f23c4b438c" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -2580,9 +2552,8 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41b75c933082fa878f29070405dacf085c7a5e3b8f066f0524c4eed590d07e" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -2592,9 +2563,8 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831ffa9a56f9211b58d46080a4c9e3f94eace41c61a71b9303ad21732baf86c7" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -2604,9 +2574,8 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab607e15f5f3cb1eafa1d28d4a40fcef2f75a95034ab1f5defbeca7227c93e46" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -2616,9 +2585,8 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f505fa474dc70240f9e9331c686f38af82df977e85427cb37b63b68a29666b" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-boolean", @@ -2628,9 +2596,8 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2adf8d9a2acbafca5575f83a9d78774e6d79bd3526b02b746ee63ec167e7d9" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "rand", "rayon", @@ -2643,9 +2610,8 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cc3b1f09847f7da99b556167b64f9eceb3eedc7af0f5917727007c9194123f" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -2661,9 +2627,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002e33a0a88ad237da5c57aca5067a19191acea7ae4488c5476e4ace47babf3e" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "anyhow", "rand", @@ -2674,9 +2639,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "386dc4871c03423e02bf210719a248fdfaca0682d48f5fc97b6d3bd92544a0f3" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "anyhow", "indexmap", @@ -2697,9 +2661,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33028e2cc8325895d30461b7bea220cd7eb824dfcf2587e0d44b638de90d9135" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "indexmap", "rayon", @@ -2710,9 +2673,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d3d400a147baa29db3a84ad85341efebb12283c3605c164affef165e182d93" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "indexmap", "rayon", @@ -2724,9 +2686,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58769eb72fe63f91acf711f4c76693a5fca72064295726f59fcb070c192f06bf" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "indexmap", "rayon", @@ -2737,9 +2698,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6f6e4d203b4596284326c8bc5f31dc9dc5255cbfac3d00d77a2547dce9722f" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "bytes", "serde_json", @@ -2748,9 +2708,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7653bd1c28cfe27718a87e8f6712e3fbd84e2f7f74c055ca2d3501f78b762afa" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "indexmap", "rayon", @@ -2764,9 +2723,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc3a8e2ca8db6946e741d9b5fca15fb845b6647f1c8f812ef5a909995735cc2" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "snarkvm-console", "snarkvm-ledger-puzzle", @@ -2774,9 +2732,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-puzzle" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112817b750d364635271c73cb057ce87b93c7e7ed4f90ff07c2e7502aaf89b1b" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -2794,9 +2751,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-puzzle-epoch" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8189964b8431b596ca13c205ad75a06955724d7944b61260496c5008e416843b" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -2817,9 +2773,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d498ad741971e12b904a6f8352cf574a63df52bde4e1b4e947a7bde9e735d92" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "anyhow", "async-trait", @@ -2835,9 +2790,8 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128f2bce363f115e18db532f5d62cd86854d92b88520734a606969f94233ebcc" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std-storage", "anyhow", @@ -2860,9 +2814,8 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25165b3f146ed21d737ab1077dac1b011d6d845f0026bd86771a79077661c875" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -2886,9 +2839,8 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6181e0c1cbfc89bae764cd5f627a0663ca0e321f153f32233e63cc21a2defee1" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -2918,9 +2870,8 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8ba692ccaa27582ca0499e84d9162837b22c5a1bb98588e2c55006fbda0631" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "colored", @@ -2943,9 +2894,8 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4700d448ce9c5591b5d7de628e9a8c450096cc09796c08e2e10254e1def6123d" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "enum-iterator", "indexmap", @@ -2963,9 +2913,8 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581b7f70cf5a53ace9a99d6c126d1d17d0c659d568484cb3dc64ae10c37bf89f" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "bincode", "serde_json", @@ -2977,9 +2926,8 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abfb48a504c75ce3860aefcea4b7c67143087810e88cb0d25533bb183fc4958" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "aleo-std", "anyhow", @@ -3000,9 +2948,8 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d2b40fbea924467662de1deeb3ca6e4c1b7c0d49bb3eccebb6d982e5d39535" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "proc-macro2", "quote 1.0.38", @@ -3011,9 +2958,8 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0345be0d84019f1dfbfdc6e9e8815e8e5b7475b99090ef461b39715b8372b44" +version = "4.3.0" +source = "git+https://github.com/ProvableHQ/snarkVM.git?rev=f9adcf4#f9adcf4244a723da072789b0b40b4c72b3e687b2" dependencies = [ "getrandom", "snarkvm-console", diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 3882f960c..b2360c75c 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -22,19 +22,24 @@ crate-type = [ "cdylib", "rlib" ] doctest = false [dependencies.snarkvm-algorithms] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" [dependencies.snarkvm-circuit-network] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" features = ["wasm"] [dependencies.snarkvm-console] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" default-features = false features = [ "account", "algorithms", "collections", + "dev_skip_checks", + "test_consensus_heights", "network", "program", "types", @@ -42,31 +47,38 @@ features = [ ] [dependencies.snarkvm-ledger-block] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" features = ["wasm"] [dependencies.snarkvm-ledger-query] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" features = ["async", "wasm"] [dependencies.snarkvm-ledger-store] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" [dependencies.snarkvm-parameters] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" default-features = false features = ["wasm"] [dependencies.snarkvm-synthesizer-program] -version = "4.3.1" +rev = "f9adcf4" +git = "https://github.com/ProvableHQ/snarkVM.git" features = ["wasm"] [dependencies.snarkvm-synthesizer] -version = "4.3.1" -features = ["async", "wasm"] +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" +features = ["async", "wasm", "dev_skip_checks"] [dependencies.snarkvm-wasm] -version = "4.3.1" +git = "https://github.com/ProvableHQ/snarkVM.git" +rev = "f9adcf4" features = ["fields", "utilities"] [dependencies.anyhow] diff --git a/wasm/package.json b/wasm/package.json index 3a4d76cca..cbfc6ce53 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -1,7 +1,7 @@ { "name": "@provablehq/wasm", "version": "0.9.11", - + "type": "module", "description": "SnarkVM WASM binaries with javascript bindings", "collaborators": [ "The Provable Team" diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index cc5e6eb1b..94aa0ce55 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -185,6 +185,7 @@ pub use utilities::{ get_statepath_for_commitment, get_statepaths_for_commitments, latest_block_height, + latest_program_edition, latest_stateroot, }; diff --git a/wasm/src/programs/manager/deploy.rs b/wasm/src/programs/manager/deploy.rs index e5cc805e0..e95c9ce79 100644 --- a/wasm/src/programs/manager/deploy.rs +++ b/wasm/src/programs/manager/deploy.rs @@ -24,17 +24,23 @@ use crate::{ Transaction, execute_fee, latest_block_height, + latest_program_edition, + latest_stateroot, log, types::native::{ AddressNative, + CertificateNative, CurrentAleo, CurrentNetwork, + DeploymentNative, + FeeNative, PrivateKeyNative, ProcessNative, ProgramNative, ProgramOwnerNative, RecordPlaintextNative, TransactionNative, + VerifyingKeyNative, ViewKeyNative, }, }; @@ -207,4 +213,138 @@ impl ProgramManager { .saturating_mul(1_000_000); // 1 microcredit = 1e-6 credits. Ok(namespace_cost) } + + /// Deploy an Aleo program without synthesizing keys and generating certificates. + /// Intended for use with Leo Devnode. + /// + /// @param private_key The private key of the sender + /// @param program The source code of the program being deployed + /// @param imports A javascript object holding the source code of any imported programs in the + /// form \{"program_name1": "program_source_code", "program_name2": "program_source_code", ..\}. + /// Note that all imported programs must be deployed on chain before the main program in order + /// for the deployment to succeed + /// @param priority_fee_credits The optional priority fee to be paid for the transaction + /// @param fee_record The record to spend the fee from + /// @param url The url of the Aleo network node to send the transaction to + /// @param imports (optional) Provide a list of imports to use for the program deployment in the + /// form of a javascript object where the keys are a string of the program name and the values + /// are a string representing the program source code \{ "hello.aleo": "hello.aleo source code" \} + /// @param fee_proving_key (optional) Provide a proving key to use for the fee execution + /// @param fee_verifying_key (optional) Provide a verifying key to use for the fee execution + /// @returns {Transaction} + #[wasm_bindgen(js_name = buildDevnodeDeploymentTransaction)] + #[allow(clippy::too_many_arguments)] + pub async fn devnode_deploy( + private_key: &PrivateKey, + program: &str, + priority_fee_credits: f64, + fee_record: Option, + url: Option, + imports: Option, + offline_query: Option, + ) -> Result { + log("Creating deployment transaction"); + let mut process_native = ProcessNative::load_web().map_err(|err| err.to_string())?; + let process = &mut process_native; + + log("Checking program has a valid name"); + let program = ProgramNative::from_str(program).map_err(|err| err.to_string())?; + let program_id = program.id(); + + log("Checking program imports are valid and add them to the process"); + ProgramManager::resolve_imports(process, &program, imports)?; + let rng = &mut StdRng::from_entropy(); + + log("Creating deployment"); + let node_url = url.as_deref().unwrap_or(DEFAULT_URL); + + // Create deployment without synthesizing keys and generating certificates. + assert!(!program.functions().is_empty(), "Program must have at least one function"); + let mut verifying_keys = Vec::with_capacity(program.functions().len()); + for function_name in program.functions().keys() { + let (verifying_key, certificate) = { + // Sample a dummy verifying key for each function. + let verifying_key = VerifyingKeyNative::from_str( + "verifier1qygqqqqqqqqqqqyvxgqqqqqqqqq87vsqqqqqqqqqhe7sqqqqqqqqqma4qqqqqqqqqq65yqqqqqqqqqqvqqqqqqqqqqqgtlaj49fmrk2d8slmselaj9tpucgxv6awu6yu4pfcn5xa0yy0tpxpc8wemasjvvxr9248vt3509vpk3u60ejyfd9xtvjmudpp7ljq2csk4yqz70ug3x8xp3xn3ul0yrrw0mvd2g8ju7rts50u3smue03gp99j88f0ky8h6fjlpvh58rmxv53mldmgrxa3fq6spsh8gt5whvsyu2rk4a2wmeyrgvvdf29pwp02srktxnvht3k6ff094usjtllggva2ym75xc4lzuqu9xx8ylfkm3qc7lf7ktk9uu9du5raukh828dzgq26hrarq5ajjl7pz7zk924kekjrp92r6jh9dpp05mxtuffwlmvew84dvnqrkre7lw29mkdzgdxwe7q8z0vnkv2vwwdraekw2va3plu7rkxhtnkuxvce0qkgxcxn5mtg9q2c3vxdf2r7jjse2g68dgvyh85q4mzfnvn07lletrpty3vypus00gfu9m47rzay4mh5w9f03z9zgzgzhkv0mupdqsk8naljqm9tc2qqzhf6yp3mnv2ey89xk7sw9pslzzlkndfd2upzmew4e4vnrkr556kexs9qrykkuhsr260mnrgh7uv0sp2meky0keeukaxgjdsnmy77kl48g3swcvqdjm50ejzr7x04vy7hn7anhd0xeetclxunnl7pd6e52qxdlr3nmutz4zr8f2xqa57a2zkl59a28w842cj4783zpy9hxw03k6vz4a3uu7sm072uqknpxjk8fyq4vxtqd08kd93c2mt40lj9ag35nm4rwcfjayejk57m9qqu83qnkrj3sz90pw808srmf705n2yu6gvqazpvu2mwm8x6mgtlsntxfhr0qas43rqxnccft36z4ygty86390t7vrt08derz8368z8ekn3yywxgp4uq24gm6e58tpp0lcvtpsm3nkwpnmzztx4qvkaf6vk38wg787h8mfpqqqqqqqqqqt49m8x", + ).map_err(|err| err.to_string())?; + + // Sample a dummy certificate. + let certificate = CertificateNative::from_str( + "certificate1qyqsqqqqqqqqqqxvwszp09v860w62s2l4g6eqf0kzppyax5we36957ywqm2dplzwvvlqg0kwlnmhzfatnax7uaqt7yqqqw0sc4u" + ).map_err(|err| err.to_string())?; + (verifying_key, certificate) + }; + verifying_keys.push((*function_name, (verifying_key, certificate))); + } + + let edition_response = latest_program_edition(node_url, &program_id.to_string()).await; + let edition = match edition_response { + Ok(edition) => edition + 1, + Err(_) => 0, + }; + + let mut deployment = DeploymentNative::new(edition, program.clone(), verifying_keys, None, None) + .map_err(|err| err.to_string())?; + + let latest_height = latest_block_height(node_url).await.map_err(|err| err.to_string())?; + let consensus_version = CurrentNetwork::CONSENSUS_VERSION(latest_height).map_err(|err| err.to_string())?; + + let private_key_native = PrivateKeyNative::from(private_key); + if consensus_version < ConsensusVersion::V9 { + deployment.set_program_checksum_raw(None); + deployment.set_program_owner_raw(None) + } else { + deployment.set_program_checksum_raw(Some(deployment.program().to_checksum())); + deployment + .set_program_owner_raw(Some(AddressNative::try_from(private_key_native).map_err(|e| e.to_string())?)); + } + + let deployment_id = deployment.to_deployment_id().map_err(|e| e.to_string())?; + + let owner = ProgramOwnerNative::new(private_key, deployment_id, rng).map_err(|err| err.to_string())?; + + // Construct the fee authorization for the deployment + let (minimum_deployment_cost, _) = deployment_cost::(process, &deployment, consensus_version) + .map_err(|err| err.to_string())?; + + // Check to see if the fee record has enough microcredits to pay for the deployment. + let priority_fee_microcredits = (priority_fee_credits * 1_000_000.0) as u64; + Self::validate_fee_record(&fee_record, minimum_deployment_cost, priority_fee_microcredits) + .map_err(|e| e.to_string())?; + + let fee_authorization = match fee_record { + Some(record) => process + .authorize_fee_private::( + &private_key, + record.into(), + minimum_deployment_cost, + priority_fee_microcredits, + deployment_id, + rng, + ) + .map_err(|e| e.to_string())?, + None => process + .authorize_fee_public::( + &private_key, + minimum_deployment_cost, + priority_fee_microcredits, + deployment_id, + rng, + ) + .map_err(|e| e.to_string())?, + }; + + // Get the state root. + let state_root = latest_stateroot(node_url).await.map_err(|e| e.to_string()).map_err(|e| e.to_string())?; + + let fee = FeeNative::from(fee_authorization.transitions().into_iter().next().unwrap().1, state_root, None) + .map_err(|err| err.to_string())?; + + log("Creating deployment transaction"); + Ok(Transaction::from( + TransactionNative::from_deployment(owner, deployment, fee) + .map_err(|err| err.to_string()) + .map_err(|e| e.to_string())?, + )) + } } diff --git a/wasm/src/programs/manager/execute.rs b/wasm/src/programs/manager/execute.rs index d0886bee1..2684512ef 100644 --- a/wasm/src/programs/manager/execute.rs +++ b/wasm/src/programs/manager/execute.rs @@ -29,12 +29,15 @@ use crate::{ execute_fee, execute_program, latest_block_height, + latest_stateroot, log, process_inputs, types::native::{ AuthorizationNative, CurrentAleo, CurrentNetwork, + ExecutionNative, + FeeNative, IdentifierNative, LocatorNative, ProcessNative, @@ -462,6 +465,129 @@ impl ProgramManager { Ok(Transaction::from(TransactionNative::from_execution(execution, fee).map_err(|e| e.to_string())?)) } + /// Generate an execution transaction without a proof. + /// Intended for use with the Leo devnode tool. + /// + /// @param private_key The private key of the sender + /// @param program The source code of the program being executed + /// @param function The name of the function to execute + /// @param inputs A javascript array of inputs to the function + /// @param priority_fee_credits The optional priority fee to be paid for the transaction + /// @param fee_record The record to spend the fee from + /// @param url The url of the Aleo network node to send the transaction to + /// If this is set to 'true' the keys synthesized (or passed in as optional parameters via the + /// `proving_key` and `verifying_key` arguments) will be stored in the ProgramManager's memory + /// and used for subsequent transactions. If this is set to 'false' the proving and verifying + /// keys will be deallocated from memory after the transaction is executed. + /// @param imports (optional) Provide a list of imports to use for the function execution in the + /// form of a javascript object where the keys are a string of the program name and the values + /// are a string representing the program source code \{ "hello.aleo": "hello.aleo source code" \} + /// @param proving_key (optional) Provide a verifying key to use for the function execution + /// @param verifying_key (optional) Provide a verifying key to use for the function execution + /// @param fee_proving_key (optional) Provide a proving key to use for the fee execution + /// @param fee_verifying_key (optional) Provide a verifying key to use for the fee execution + /// @param offline_query An offline query object to use if building a transaction without an internet connection. + /// @param edition The edition of the program to execute. Defaults to the latest found on the network, or 1 if the program does not exist on the network. + /// @returns {Transaction} + #[wasm_bindgen(js_name = buildDevnodeExecutionTransaction)] + #[allow(clippy::too_many_arguments)] + pub async fn devnode_execute( + private_key: &PrivateKey, + program: &str, + function: &str, + inputs: Array, + priority_fee_credits: f64, + fee_record: Option, + url: Option, + imports: Option, + offline_query: Option, + edition: Option, + ) -> Result { + log("Loading the SnarkVM process"); + let mut process_native = ProcessNative::load_web().map_err(|err| err.to_string())?; + let process = &mut process_native; + let node_url = url.as_deref().unwrap_or(LOCAL_URL); + + // Initialize the rng. + let rng = &mut StdRng::from_entropy(); + + log("Check program imports are valid and add them to the process"); + let program_native = ProgramNative::from_str(program).map_err(|e| e.to_string())?; + let program_id = program_native.id().to_string(); + ProgramManager::resolve_imports(process, &program_native, imports)?; + let edition = edition.unwrap_or(1); + + let inputs = process_inputs!(inputs); + + // Add the program to the process. + if program_id != "credits.aleo" { + if !process.contains_program(program_native.id()) { + log("Adding program to the process"); + process.add_program_with_edition(&program_native, edition).map_err(|e| e.to_string())?; + } + } + + // Generate the authorization. + let authorization = process + .authorize::(&private_key, &program_id, function, inputs.iter(), rng) + .map_err(|e| e.to_string())?; + + // Get the state root. + let state_root = latest_stateroot(node_url).await.map_err(|e| e.to_string())?; + + // Get the consensus version. + let latest_height = latest_block_height(node_url).await.map_err(|err| err.to_string())?; + let consensus_version = CurrentNetwork::CONSENSUS_VERSION(latest_height).map_err(|err| err.to_string())?; + + // Execute without proving. + let execution = ExecutionNative::from(authorization.transitions().values().cloned(), state_root, None) + .map_err(|e| e.to_string())?; + + // Calculate the cost. + let (cost, _) = execution_cost(&process, &execution, consensus_version).map_err(|e| e.to_string())?; + + // Generate the fee authorization. + let id = authorization.to_execution_id().map_err(|e| e.to_string())?; + + // Convert the priority fee to microcredits. + let priority_fee_microcredits = (priority_fee_credits * 1_000_000.0) as u64; + + let fee_authorization = match fee_record { + Some(fee_record) => { + log("Authorizing credits.aleo/fee_private"); + let fee_record_native = RecordPlaintextNative::from_str(&fee_record.to_string()) + .map_err(|e| format!("Invalid fee record: {}", e))?; + process + .authorize_fee_private::( + &private_key, + fee_record_native, + cost, + priority_fee_microcredits, + id, + rng, + ) + .map_err(|e| e.to_string())? + } + None => { + log("Authorizing credits.aleo/fee_public"); + process + .authorize_fee_public::(&private_key, cost, priority_fee_microcredits, id, rng) + .map_err(|e| e.to_string())? + } + }; + + // Create a fee transition without a proof. + let fee = FeeNative::from(fee_authorization.transitions().into_iter().next().unwrap().1, state_root, None) + .map_err(|e| e.to_string())?; + + // Evaluate the process to ensure validity. + let response = process.evaluate::(authorization).map_err(|e| e.to_string())?; + + // Create the transaction. + let transaction = TransactionNative::from_execution(execution, Some(fee)).map_err(|e| e.to_string())?; + Ok(Transaction::from(transaction)) + } + /// Estimate Fee for Aleo function execution. Note if "cache" is set to true, the proving and /// verifying keys will be stored in the ProgramManager's memory and used for subsequent /// program executions. diff --git a/wasm/src/programs/manager/mod.rs b/wasm/src/programs/manager/mod.rs index 1517fcfd4..ecba1a0a3 100644 --- a/wasm/src/programs/manager/mod.rs +++ b/wasm/src/programs/manager/mod.rs @@ -23,6 +23,7 @@ mod split; mod transfer; pub const DEFAULT_URL: &str = "https://api.explorer.provable.com/v1"; +pub const LOCAL_URL: &str = "http://localhost:3030"; use crate::{ KeyPair, diff --git a/wasm/src/types/native/mod.rs b/wasm/src/types/native/mod.rs index 77c2f4dd9..978f3edb6 100644 --- a/wasm/src/types/native/mod.rs +++ b/wasm/src/types/native/mod.rs @@ -38,12 +38,12 @@ use snarkvm_console::{ }, types::{Boolean, Field, Group, I8, I16, I32, I64, I128, Scalar, U8, U16, U32, U64, U128}, }; -use snarkvm_ledger_block::{Execution, Input, Output, Transaction, Transition}; +use snarkvm_ledger_block::{Deployment, Execution, Fee, Input, Output, Transaction, Transition}; use snarkvm_synthesizer::{ Authorization, Process, Program, - snark::{ProvingKey, VerifyingKey}, + snark::{Certificate, ProvingKey, VerifyingKey}, }; mod request; @@ -78,6 +78,7 @@ pub type BHP256Native = BHP256; pub type BHP512Native = BHP512; pub type BHP768Native = BHP768; pub type BHP1024Native = BHP1024; +pub type CertificateNative = Certificate; pub type Pedersen64Native = Pedersen64; pub type Pedersen128Native = Pedersen128; pub type Poseidon2Native = Poseidon2; @@ -102,7 +103,9 @@ pub type ResponseNative = Response; pub type ValueNative = Value; // Ledger types +pub type DeploymentNative = Deployment; pub type ExecutionNative = Execution; +pub type FeeNative = Fee; pub type InputNative = Input; pub type OutputNative = Output; pub type ProgramOwnerNative = ProgramOwner; diff --git a/wasm/src/utilities/mod.rs b/wasm/src/utilities/mod.rs index 8455176bd..ae90793da 100644 --- a/wasm/src/utilities/mod.rs +++ b/wasm/src/utilities/mod.rs @@ -27,6 +27,7 @@ pub use rest::{ get_statepath_for_commitment, get_statepaths_for_commitments, latest_block_height, + latest_program_edition, latest_stateroot, }; diff --git a/wasm/src/utilities/rest.rs b/wasm/src/utilities/rest.rs index 5180c8a00..39b2eec52 100644 --- a/wasm/src/utilities/rest.rs +++ b/wasm/src/utilities/rest.rs @@ -62,6 +62,11 @@ pub async fn latest_stateroot(base_url: &str) -> Result< Result { + get(&format!("{base_url}/{}/program/{}/latest_edition", get_network(), program_id)).await +} + /// Make a GET request to the service. pub async fn get(url: &str) -> Result where