From 4525f17a07182061429d1f63c2f8a0b21b25cd89 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Thu, 11 Jan 2024 13:58:20 +0100 Subject: [PATCH 1/4] EVM/Node: add blueprint related arguments to chunker --- etherlink/bin_evm_node/evm_node.ml | 67 +++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/etherlink/bin_evm_node/evm_node.ml b/etherlink/bin_evm_node/evm_node.ml index e8426cc23abf..145aa0cacf24 100644 --- a/etherlink/bin_evm_node/evm_node.ml +++ b/etherlink/bin_evm_node/evm_node.ml @@ -435,6 +435,56 @@ let keep_alive_arg = ~long:"keep-alive" () +let blueprint_mode_arg = + Tezos_clic.switch + ~long:"as-blueprint" + ~doc:"Chunk the data into a blueprint usable in sequencer mode" + () + +let timestamp_arg = + let open Lwt_result_syntax in + let open Tezos_clic in + parameter (fun _ timestamp -> + let timestamp = String.trim timestamp in + match Time.Protocol.of_notation timestamp with + | Some t -> return t + | None -> ( + match + Int64.of_string_opt timestamp |> Option.map Time.Protocol.of_seconds + with + | Some t -> return t + | None -> + failwith + "Timestamp must be either in RFC3399 format (e.g., \ + [\"1970-01-01T00:00:00Z\"]) or in number of seconds since the \ + {!Time.Protocol.epoch}.")) + |> Tezos_clic.default_arg + ~long:"timestamp" + ~doc:"" + ~placeholder:"1970-01-01T00:00:00Z" + ~default:"0" + +let blueprint_number_arg = + let open Lwt_result_syntax in + let open Tezos_clic in + parameter (fun _ number -> + try String.trim number |> Z.of_string |> return + with _ -> failwith "Blueprint number must be an integer") + |> default_arg + ~long:"number" + ~doc:"Level of the blueprint" + ~placeholder:"0" + ~default:"0" + +let secret_key_arg = + let open Tezos_clic in + Params.secret_key + |> default_arg + ~long:"Secret ley" + ~doc:"Secret key to sign the blueprints" + ~placeholder:"" + ~default:"edsk422LGdmDnai4Cya6csM6oFmgHpDQKUhatTURJRAY4h7NHNz9sz" + let proxy_command = let open Tezos_clic in let open Lwt_result_syntax in @@ -689,9 +739,22 @@ let chunker_command = ~desc: "Chunk hexadecimal data according to the message representation of the \ EVM rollup" - (args2 devmode_arg rollup_address_arg) + (args6 + devmode_arg + rollup_address_arg + blueprint_mode_arg + timestamp_arg + blueprint_mode_arg + secret_key_arg) (prefixes ["chunk"; "data"] @@ data_parameter @@ stop) - (fun (devmode, rollup_address) data () -> + (fun ( devmode, + rollup_address, + _as_blueprint, + _blueprint_timestamp, + _blueprint_number, + _secret_key ) + data + () -> let print_chunks smart_rollup_address s = let* messages = if devmode then make_dev_messages ~smart_rollup_address s -- GitLab From 2ecb4e16f389cd8228a1c966af890c06a3ca04f4 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Thu, 11 Jan 2024 15:40:12 +0100 Subject: [PATCH 2/4] EVM/Node: chunk data into blueprints --- etherlink/bin_evm_node/evm_node.ml | 40 ++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/etherlink/bin_evm_node/evm_node.ml b/etherlink/bin_evm_node/evm_node.ml index 145aa0cacf24..2650e9d994bb 100644 --- a/etherlink/bin_evm_node/evm_node.ml +++ b/etherlink/bin_evm_node/evm_node.ml @@ -721,14 +721,27 @@ let make_prod_messages ~smart_rollup_address s = in return (List.map (fun m -> m |> Hex.of_string |> Hex.show) messages) -let make_dev_messages ~smart_rollup_address s = +let make_dev_messages ~kind ~smart_rollup_address s = let open Lwt_result_syntax in let open Evm_node_lib_dev in let s = Ethereum_types.hex_of_string s in - let*? _, messages = - Transaction_format.make_encoded_messages - ~smart_rollup_address - (Evm_node_lib_dev_encoding.Ethereum_types.hex_to_bytes s) + let*? messages = + match kind with + | `Blueprint (secret_key, timestamp, number) -> + Sequencer_blueprint.create + ~secret_key + ~timestamp + ~smart_rollup_address + ~number:(Ethereum_types.quantity_of_z number) + ~transactions: + [Evm_node_lib_dev_encoding.Ethereum_types.hex_to_bytes s] + |> List.map (fun (`External s) -> s) + |> Result.ok + | `Transaction -> + Transaction_format.make_encoded_messages + ~smart_rollup_address + (Evm_node_lib_dev_encoding.Ethereum_types.hex_to_bytes s) + |> Result.map snd in return (List.map (fun m -> m |> Hex.of_string |> Hex.show) messages) @@ -744,20 +757,25 @@ let chunker_command = rollup_address_arg blueprint_mode_arg timestamp_arg - blueprint_mode_arg + blueprint_number_arg secret_key_arg) (prefixes ["chunk"; "data"] @@ data_parameter @@ stop) (fun ( devmode, rollup_address, - _as_blueprint, - _blueprint_timestamp, - _blueprint_number, - _secret_key ) + as_blueprint, + blueprint_timestamp, + blueprint_number, + secret_key ) data () -> + let kind = + if as_blueprint then + `Blueprint (secret_key, blueprint_timestamp, blueprint_number) + else `Transaction + in let print_chunks smart_rollup_address s = let* messages = - if devmode then make_dev_messages ~smart_rollup_address s + if devmode then make_dev_messages ~kind ~smart_rollup_address s else make_prod_messages ~smart_rollup_address s in Format.printf "Chunked transactions :\n%!" ; -- GitLab From bbfae9312053ae9a6dcb0742fd118001d6b3c6d5 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Thu, 11 Jan 2024 15:40:53 +0100 Subject: [PATCH 3/4] EVM/Benchmark: make erc20 bench usable in sequencer mode --- .../scripts/benchmarks/bench_erc20tok.js | 8 +++++-- .../benchmarks/scripts/benchmarks/utils.js | 24 +++++++++++++------ .../config/benchmarking_sequencer.yaml | 11 +++++++++ 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 etherlink/kernel_evm/config/benchmarking_sequencer.yaml diff --git a/etherlink/kernel_evm/benchmarks/scripts/benchmarks/bench_erc20tok.js b/etherlink/kernel_evm/benchmarks/scripts/benchmarks/bench_erc20tok.js index b15dd3615f62..30204a1d5749 100644 --- a/etherlink/kernel_evm/benchmarks/scripts/benchmarks/bench_erc20tok.js +++ b/etherlink/kernel_evm/benchmarks/scripts/benchmarks/bench_erc20tok.js @@ -37,5 +37,9 @@ txs.push(utils.send(player1, create.addr, 0, transfer_token(player2, 5000))); txs.push(utils.send(player1, create.addr, 0, burn(15000))); txs.push(utils.send(player2, create.addr, 0, burn(5000))); - -utils.print_bench([txs]) +var args = process.argv.slice(2) +if (args.length == 1 && args[0] == '--blueprint') { + utils.print_bench([txs], { blueprint: true }) +} else { + utils.print_bench([txs]) +} diff --git a/etherlink/kernel_evm/benchmarks/scripts/benchmarks/utils.js b/etherlink/kernel_evm/benchmarks/scripts/benchmarks/utils.js index 92de2011e1ba..9e468e10f134 100644 --- a/etherlink/kernel_evm/benchmarks/scripts/benchmarks/utils.js +++ b/etherlink/kernel_evm/benchmarks/scripts/benchmarks/utils.js @@ -74,18 +74,19 @@ exports.send = function (player, contract_addr, amount, data, options = {}) { return rawTx.rawTx; } -const print_list = function (src) { +const print_list = function (src, blueprint, blueprint_number) { const txs = src.slice(); console.log("[") for (var i = 0; i < txs.length; i++) { transaction = txs[i]; - messages = chunk_data(transaction); + messages = blueprint ? chunk_data_into_blueprint(transaction, i + blueprint_number) : chunk_data(transaction); for (var j = 0; j < messages.length; j++) { seperator = (i < txs.length - 1 || j < messages.length - 1) ? "," : ""; console.log(`{"external": "${messages[j]}"}${seperator}`); } } - console.log("]") + console.log("]"); + return txs.length } const chunk_data = function (src) { @@ -94,16 +95,25 @@ const chunk_data = function (src) { return chunked_message.split("\n").slice(1, -1); } -exports.print_bench = function (src) { +const chunk_data_into_blueprint = function (src, number) { + run_chunker_command = `${CHUNKER} chunk data "${src}" --devmode --as-blueprint --number ${number} --timestamp ${number}` + chunked_message = new Buffer.from(execSync(run_chunker_command)).toString(); + return chunked_message.split("\n").slice(1, -1); +} + +exports.print_bench = function (src, options = {}) { + let number = 0; const inputs = src.slice(); console.log("[") while (inputs.length > 1) { - print_list(inputs.shift()) - console.log(",") + let txs_length = print_list(inputs.shift(), options.blueprint, number) + console.log(","); + number += txs_length; } - print_list(inputs.shift()) + print_list(inputs.shift(), options.blueprint, number) console.log("]") } + exports.print_raw_txs = function (src) { const txs = src.slice(); txs.forEach(element => { diff --git a/etherlink/kernel_evm/config/benchmarking_sequencer.yaml b/etherlink/kernel_evm/config/benchmarking_sequencer.yaml new file mode 100644 index 000000000000..656d4f85142c --- /dev/null +++ b/etherlink/kernel_evm/config/benchmarking_sequencer.yaml @@ -0,0 +1,11 @@ +instructions: + - set: + value: 00000000000000000000dc0a0713000c1e020000000000000000000000000000 + to: /evm/eth_accounts/d9e5c94a12f78a96640757ac97ba0c257e8aa262/balance + - set: + # KT1DXADSWXucAJ6PujZeUSK9brpToFtC9fz6 + value: 4b5431445841445357587563414a3650756a5a6555534b39627270546f46744339667a36 + to: /evm/ticketer + - set: + value: 00 + to: /evm/sequencer -- GitLab From a41b49d6a5b9b1bb3c53d239d3fae9c8499dfe65 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Thu, 11 Jan 2024 16:26:05 +0100 Subject: [PATCH 4/4] Etherlink: update node's changelog --- etherlink/CHANGES_NODE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/etherlink/CHANGES_NODE.md b/etherlink/CHANGES_NODE.md index 7af77956780a..8d44c2768379 100644 --- a/etherlink/CHANGES_NODE.md +++ b/etherlink/CHANGES_NODE.md @@ -22,6 +22,7 @@ Currently supported kernel version: 9978f3a5f8bee0be78686c5c568109d2e6148f13 transactions on the L1. (!11102) - Add a keep alive argument that waits until the connection is made with the rollup node. (!11236) +- The chunker can also produce blueprints out of the given bytes. (!11497) ### Bug fixes -- GitLab