From 7d592cee2a92e2115b0ff332cd3ee89f0bf37bb3 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 24 Jul 2024 10:33:05 -0400 Subject: [PATCH 01/17] WIP update tutorial for Ghostnet --- .../tutorials/build-files-archive-with-dal.md | 18 ++-- .../get-dal-params.md | 61 ++++++++------ .../get-slot-info.md | 30 +++---- .../set-up-environment.md | 77 +++++++++++------- .../img/tutorials/dal-file-tutorial-setup.png | Bin 23016 -> 73449 bytes 5 files changed, 106 insertions(+), 80 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal.md b/docs/tutorials/build-files-archive-with-dal.md index 8198d6c42..3b9ea60ac 100644 --- a/docs/tutorials/build-files-archive-with-dal.md +++ b/docs/tutorials/build-files-archive-with-dal.md @@ -1,14 +1,16 @@ --- title: Implement a file archive with the DAL and a Smart Rollup -authors: 'Tezos Core Developers' +authors: Tezos Core Developers last_update: - date: 10 June 2024 + date: 22 July 2024 --- The Data Availability Layer (DAL) is a companion peer-to-peer network for the Tezos blockchain, designed to provide additional data bandwidth to Smart Rollups. It allows users to share large amounts of data in a way that is decentralized and permissionless, because anyone can join the network and post and read data on it. -In this tutorial, you will set up a file archive that stores and retrieves files with the DAL. +This test uses the Ghostnet test network, but you can use the information in it to work with other test network or Tezos Mainnet. + +In this tutorial, you set up a file archive that stores and retrieves files with the DAL. You will learn: - How data is organized and shared with the DAL and the reveal data channel @@ -16,9 +18,6 @@ You will learn: - How to host a DAL node - How to publish data and files with the DAL -This tutorial uses the [Weeklynet test network](https://teztnets.com/weeklynet-about). -Weeklynet runs just like other Tezos networks like Mainnet and Ghostnet, with its own nodes, bakers, and accusers, so you don't need to run your own nodes and bakers. - See these links for more information about the DAL: - For technical information about how the DAL works, see [Data Availability Layer](https://tezos.gitlab.io/shell/dal.html) in the Octez documentation. @@ -29,18 +28,19 @@ See these links for more information about the DAL: In this tutorial, you set up these components: - The Octez client, which you use to manage a local wallet, deploy a Smart Rollup, and send data to the DAL +- A layer 1 node to provide a connection to Tezos and information about the - A Data Availability Layer node (not to be confused with a layer 1 node), which stores data temporarily and distributes it to Smart Rollups - A Smart Rollup that listens for data published to the DAL, retrieves it from the DAL node, and stores it locally - A Smart Rollup node that runs your Smart Rollup -For simplicity, you do not set up a layer 1 node or a baker, which are responsible for verifying that the data is available before Smart Rollups can access it. -Instead, you use the existing nodes and bakers that are running on Weeklynet. +For simplicity, you do not set up a baker, which is responsible for verifying and attesting that the data is available before Smart Rollups can access it. +For instructions on running a layer 1 node and baker with the DAL, see the tutorial [Join the DAL as a baker, in 5 steps](./join-dal-baker). ## Tutorial diagram Here is a diagram that shows the components that you set up in this tutorial in a light blue background: -![A diagram of the DAL file tutorial, highlighting the Octez client, DAL node, and Smart Rollup that you create with a light blue background to distinguish them from the existing DAL nodes, layer 1 nodes, and bakers](/img/tutorials/dal-file-tutorial-setup.png) +![A diagram of the DAL file tutorial, highlighting the Octez client, DAL node, layer 1 node, and Smart Rollup that you create with a light blue background to distinguish them from the existing DAL nodes, layer 1 nodes, and bakers](/img/tutorials/dal-file-tutorial-setup.png) diff --git a/docs/tutorials/build-files-archive-with-dal/get-dal-params.md b/docs/tutorials/build-files-archive-with-dal/get-dal-params.md index 00d2db895..d6e042de9 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-dal-params.md +++ b/docs/tutorials/build-files-archive-with-dal/get-dal-params.md @@ -1,8 +1,8 @@ --- title: "Part 2: Getting the DAL parameters" -authors: 'Tezos Core Developers' +authors: Tezos core developers, Tim McMackin last_update: - date: 14 February 2024 + date: 24 July 2024 --- The Data Availability Layer stores information about the available data in layer 1 blocks. @@ -27,7 +27,7 @@ Different networks can have different DAL parameters. Future changes to the protocol may allow the DAL to resize dynamically based on usage. Therefore, clients must get information about the DAL before sending data to it. -In these steps, you set up a simple Smart Rollup to get the current DAL parameters and print them to the log. +Smart contracts can't access the DAL; it is intended for Smart Rollups, so in these steps you set up a simple Smart Rollup to get the current DAL parameters and print them to the log. ## Prerequisites @@ -52,10 +52,13 @@ To get the DAL parameters, you can use built-in functions in the Tezos [Rust SDK tezos-smart-rollup = { version = "0.2.2", features = [ "proto-alpha" ] } ``` + If you set up your Docker container with a connected folder on the host machine, you can create this file in the connected folder and it will appear in the Docker container. + As a reminder, the kernel of a Smart Rollup is a WASM program. The `proto-alpha` feature is necessary to get access to the functions specific to the DAL because they are not yet released in the main version of the Smart Rollup toolkit. If you need a text editor inside the Docker container, you can run `sudo apk add nano` to install the [Nano text editor](https://www.nano-editor.org/). + If you set up the container with a volume, you can use any editor on your host machine to edit the file and it appears in the linked folder in the container. 1. Create a file named `src/lib.rs` to be the kernel. @@ -74,10 +77,15 @@ To get the DAL parameters, you can use built-in functions in the Tezos [Rust SDK This function gets the DAL parameters of the currently connected network and prints them to the log. -1. From the folder that contains the `Cargo.toml` file, run these commands to build the kernel: +1. From the folder that contains the `Cargo.toml` file, run this command to build the kernel: ```bash cargo build --release --target wasm32-unknown-unknown + ``` + +1. Run this command to copy the compiled kernel to the current folder: + + ```bash cp target/wasm32-unknown-unknown/release/files_archive.wasm . ``` @@ -98,30 +106,28 @@ Now the Smart Rollup is ready to deploy. ## Deploying the Smart Rollup and starting a node -Follow these steps to deploy the Smart Rollup to Weeklynet and start a node: +Follow these steps to deploy the Smart Rollup to Ghostnet and start a node: -1. Run this command to deploy the Smart Rollup, replacing `$MY_ACCOUNT` with your account alias and `$ENDPOINT` with the RPC endpoint: +1. Run this command to deploy the Smart Rollup, replacing `my_wallet` with your account alias: ```bash - octez-client --endpoint ${ENDPOINT} \ - originate smart rollup files_archive from ${MY_ACCOUNT} \ + octez-client --endpoint http://127.0.0.1:8732 \ + originate smart rollup files_archive from my_wallet \ of kind wasm_2_0_0 of type unit with kernel "$(cat installer.hex)" \ --burn-cap 2.0 --force ``` -1. Start the node with this command: +1. Start the Smart Rollup node with this command: ```bash - octez-smart-rollup-node --endpoint ${ENDPOINT} \ + octez-smart-rollup-node --endpoint http://127.0.0.1:8732 \ run observer for files_archive with operators \ --data-dir ./_rollup_node --log-kernel-debug ``` For simplicity, this command runs the Smart Rollup in observer mode, which does not require a stake of 10,000 tez to publish commitments. -1. Open a new terminal window in the same environment. -If you are using a Docker container, you can enter the container with the `docker exec` command, as in `docker exec -it my-image /bin/sh`. -To get the name of the Docker container, you run the `docker ps` command. +1. Leave the node running in that terminal window and open a new terminal window in the same environment. 1. Run this command to watch the node's log: @@ -132,11 +138,12 @@ To get the name of the Docker container, you run the `docker ps` command. The log prints the current DAL parameters, as in this example: ``` -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } ``` These parameters are: @@ -148,11 +155,11 @@ These parameters are: ## Setting up a deployment script -In later parts of this tutorial, you will update and redeploy the Smart Rollup multiple times. +In later parts of this tutorial, you update and redeploy the Smart Rollup multiple times. To simplify the process, you can use this script: ```bash -#!/usr/bin/bash +#!/bin/sh alias="${1}" @@ -167,25 +174,27 @@ cp target/wasm32-unknown-unknown/release/files_archive.wasm . smart-rollup-installer get-reveal-installer -P _rollup_node/wasm_2_0_0 \ -u files_archive.wasm -o installer.hex -octez-client --endpoint ${ENDPOINT} \ +octez-client --endpoint http://127.0.0.1:8732 \ originate smart rollup files_archive from "${alias}" of kind wasm_2_0_0 \ of type unit with kernel "$(cat installer.hex)" --burn-cap 2.0 --force -octez-smart-rollup-node --endpoint ${ENDPOINT} \ +octez-smart-rollup-node --endpoint http://127.0.0.1:8732 \ run observer for files_archive with operators --data-dir _rollup_node \ --dal-node http://localhost:10732 --log-kernel-debug ``` -To use it, save it in a file with an `sh` extension, such as `deploy_smart_rollup.sh` and give it executable permission. +To use it, save it in a file with an `sh` extension, such as `deploy_smart_rollup.sh` and give it executable permission by running `chmod +x deploy_smart_rollup.sh`. Then you can run it any tme you update the `lib.rs` or `Cargo.toml` files to deploy a new Smart Rollup by passing your account alias, as in this example: ```bash -./deploy_smart_rollup.sh $MY_ACCOUNT +./deploy_smart_rollup.sh my_wallet ``` +This script assumes that your local node is running at http://127.0.0.1:8732. + If you run this script and see an error that says that the file was not found, update the first line of the script (the shebang) to the path to your shell interpreter. -For example, if you are using the Tezos Docker image, the path is `/bin/sh`, so the first line becomes `#!/bin/sh`. -Then try the command `./deploy_smart_rollup.sh $MY_ACCOUNT` again. +For example, if you are using the Tezos Docker image, the path is `/bin/sh`, so the first line is `#!/bin/sh`. +Then try the command `./deploy_smart_rollup.sh my_wallet` again. In the next section, you will get information about the state of slots in the DAL. See [Part 3: Getting slot information](/tutorials/build-files-archive-with-dal/get-slot-info). diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index d920b11f2..a8e7ab3ab 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -1,8 +1,8 @@ --- title: "Part 3: Getting slot information" -authors: 'Tezos Core Developers' +authors: Tezos core developers, Tim McMackin last_update: - date: 14 February 2024 + date: 24 July 2024 --- When clients send data to the DAL, they must choose which slot to put it in. @@ -11,9 +11,8 @@ If more than one client tries to write to the same slot and a baker includes tho The other operations fail and the clients must re-submit the data to be included in a future block. For this reason, clients should check the status of slots to avoid conflicts. -For example, slots 0, 30, and 31 are often used for regression tests. -To see which slots are in use, you can use the Explorus indexer at https://explorus.io/dal and select Weeklynet. +To see which slots are in use, you can use the Explorus indexer at https://explorus.io/dal and select your network. For example, this screenshot shows that slots 10 and 25 are in use: ![The Explorus indexer, showing the slots that are in use in each block](/img/tutorials/dal-explorus-slots.png) @@ -26,14 +25,16 @@ Similarly, the protocol assigns bakers to monitor certain slots. To run a DAL node, use the Octez `octez-dal-node` command and pass the slots to monitor in the `--producer-profiles` argument. -Run this command to start a DAL node and monitor slot 0: + + +In a new terminal window in the Docker container, run this command to start a DAL node and monitor slot 0: ```bash -octez-dal-node run --endpoint ${ENDPOINT} \ +octez-dal-node run --endpoint http://127.0.0.1:8732 \ --producer-profiles=0 --data-dir _dal_node ``` -Leave this process running in terminal window. +Leave this process running in the terminal window. ## Accessing the slot data from a Smart Rollup @@ -122,14 +123,13 @@ Follow these steps to update the Smart Rollup to access information about slot 0 tezos-smart-rollup-host = { version = "0.2.2", features = [ "proto-alpha" ] } ``` -1. Stop the Smart Rollup process. - -1. Run the commands to build and deploy the Smart Rollup and start the node. +1. Stop the process that is running the `octez-smart-rollup-node` program. +1. Run the commands to build and deploy the Smart Rollup and start the Smart Rollup node. - If you set up the deployment script as described in [Part 2: Getting the DAL parameters](/tutorials/build-files-archive-with-dal/get-dal-params), you can run `./deploy_smart_rollup.sh $MY_ACCOUNT`. + If you set up the deployment script as described in [Part 2: Getting the DAL parameters](./get-dal-params), you can run `./deploy_smart_rollup.sh my_wallet`. - If not, run these commands, using your account alias for `MY_ACCOUNT`: + If not, run these commands: ```bash rm -rf _rollup_node @@ -139,11 +139,11 @@ Follow these steps to update the Smart Rollup to access information about slot 0 smart-rollup-installer get-reveal-installer -P _rollup_node/wasm_2_0_0 \ -u files_archive.wasm -o installer.hex - octez-client --endpoint ${ENDPOINT} \ - originate smart rollup files_archive from "${MY_ACCOUNT}" of kind wasm_2_0_0 \ + octez-client --endpoint http://127.0.0.1:8732 \ + originate smart rollup files_archive from my_wallet of kind wasm_2_0_0 \ of type unit with kernel "$(cat installer.hex)" --burn-cap 2.0 --force - octez-smart-rollup-node --endpoint ${ENDPOINT} \ + octez-smart-rollup-node --endpoint http://127.0.0.1:8732 \ run observer for files_archive with operators --data-dir _rollup_node \ --dal-node http://localhost:10732 --log-kernel-debug ``` diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index 9f5f43d80..370c6e846 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -1,33 +1,30 @@ --- title: "Part 1: Setting up an environment" -authors: 'Tim McMackin' +authors: Tim McMackin last_update: - date: 14 February 2024 + date: 23 July 2024 --- -Because Weeklynet requires a specific version of the Octez suite, you can't use most wallet applications and installations of the Octez suite with it. -Instead, you must set up an environment with a specific version of the Octez suite and use it to create and fund an account. +These steps cover how to set up a development environment to work with Smart Rollups and the DAL. +To work with these elements, you need the Octez suite, which includes the Octez command-line client for interacting with Tezos and the binaries for the DAL node and Smart Rollup node. +You must use the same version of the Octez suite that the network is using. -:::note Weeklynet resets every week -Weeklynet is reset every Wednesday, which deletes all accounts, smart contracts, and Smart Rollups. -Therefore, you must recreate your environment and account and redeploy your smart Contracts and Smart Rollups after the network resets. -::: - -## Set up a Weeklynet environment and account - -The easiest way to use Weeklynet is to use the Docker image that is generated each time Weeklynet is reset and recreated. -As another option, you can build the specific version of the Octez suite locally. -For instructions, see the Weeklynet page at https://teztnets.com/weeklynet-about. +The easiest way to use the Octez suite is to use the `tezos/tezos` Docker image. +As another option, you can get the built version of the Octez suite from https://tezos.gitlab.io/ or build the specific version of the Octez suite locally. To set up an environment and account in a Docker container, follow these steps: -1. From the [Weeklynet](https://teztnets.com/weeklynet-about) page, find the Docker command to create a container from the correct Docker image, as in this example: +1. Retrieve the latest version of the `tezos/tezos` Docker image by running this command: ```bash - docker run -it --entrypoint=/bin/sh tezos/tezos:master_7f3bfc90_20240116181914 + docker pull tezos/tezos:latest ``` - The image tag in this command changes each time the network is reset. +1. Start a Docker container from the image: + + ```bash + docker run -it --entrypoint=/bin/sh tezos/tezos:latest + ``` :::tip If you're not used to working inside Docker containers, you can map a folder on your computer to a folder in the container to create a [Docker volume](https://docs.docker.com/storage/volumes/). @@ -35,28 +32,48 @@ To set up an environment and account in a Docker container, follow these steps: For example, to start a container and map the current folder to the `/home/tezos` folder in the container, run this command: ```bash - docker run -it --entrypoint=/bin/sh -v .:/home/tezos tezos/tezos:master_7f3bfc90_20240116181914 + docker run -it --entrypoint=/bin/sh -v .:/home/tezos tezos/tezos:latest ``` You can map a folder like this only when you create a container; you cannot add it later. ::: -1. Copy the URL of the public RPC endpoint for Weeklynet, such as `https://rpc.weeklynet-2024-01-17.teztnets.com`. -This endpoint also changes each time the network is reset. +1. In the container, configure the layer 1 node for Ghostnet: -1. For convenience, you may want to set this endpoint as the value of the `ENDPOINT` environment variable. -The parts of the Octez suite don't use this environment variable directly, but you can save time by using this variable in commands. + ```bash + octez-node config init --network ghostnet + ``` -1. In the container, initialize the Octez client with that endpoint, such as this example: +1. Download a snapshot of Ghostnet from https://snapshot.tzinit.org based on the instructions on that site. +For example, the command to download the snapshot may look like this: ```bash - octez-client -E https://rpc.weeklynet-2024-01-17.teztnets.com config init + wget -O snapshot_file https://snapshots.eu.tzinit.org/ghostnet/rolling ``` - or: +1. Load the snapshot in the node by running this command: + + ```bash + octez-node snapshot import snapshot_file + ``` + + If you see the error "The chain name contained in the snapshot file is not consistent with the network configured in the targeted data directory," the snapshot is for the previous instance of Weeklynet and no snapshot is available for this week. + Continue with the next step as usual. + +1. Run this command to start the node: + + ```bash + octez-node run --rpc-addr 127.0.0.1:8732 + ``` + +1. Leave the node running in that terminal window and open a new terminal window in the same environment. +If you are using a Docker container, you can enter the container with the `docker exec` command, as in `docker exec -it my-image /bin/sh`. +To get the name of the Docker container, run the `docker ps` command. + +1. In the container, initialize the Octez client to use your node:, such as this example: ```bash - octez-client -E $ENDPOINT config init + octez-client -E http://127.0.0.1:8732 config init ``` 1. Optional: Hide the network warning message by running this command: @@ -67,11 +84,11 @@ The parts of the Octez suite don't use this environment variable directly, but y This command suppresses the message that your instance of the Octez client is not using Mainnet. -1. Create an account with the command `octez-client gen keys $MY_ACCOUNT`, where `$MY_ACCOUNT` is an alias for your account. +1. Create an account with the command `octez-client gen keys my_wallet`, where `my_wallet` is an alias for your account. -1. Get the public key hash of the new account by running the command `octez-client show address $MY_ACCOUNT`. +1. Get the public key hash of the new account by running the command `octez-client show address my_wallet`. -1. From the [Weeklynet](https://teztnets.com/weeklynet-about) page, open the Weeklynet faucet and send some tez to the account. +1. From the [Ghostnet](https://teztnets.com/ghostnet-about) page, open the Ghostnet faucet and send some tez to the account. 50 tez is enough to get started, and you can always go back to the faucet to get more. Now you can use this account to deploy Smart Rollups. @@ -107,7 +124,7 @@ For example, it may prompt you to run `source "$HOME/.cargo/env"` to configure y Clang and LLVM are required for compilation to WebAssembly. Version 11 or later of Clang is required. -If you are using the Tezos Docker container, run these commands: +If you are using the `tezos/tezos` Docker image, run these commands: ```bash sudo apk add clang diff --git a/static/img/tutorials/dal-file-tutorial-setup.png b/static/img/tutorials/dal-file-tutorial-setup.png index 9434fadfc94ec608fb23bf463582ae727777d3e6..d3058c47d0a985146c9e8d55a163430e255b96be 100644 GIT binary patch literal 73449 zcmeFZ^;=f!^9H&Q1*H*{1_4DRln`l9TImjH6a=J0q@^2C5h($YZUK>QQ5xxxmQLwD zv)G^Sb)7%q{BYjA-CKBh*Lv1GGxyBg_dEnC%1hznP~ad4g8xWbTp2;m7a$1crHfeb z9TKt5BlzESV`*hM1aV3@%_E2-JAy14APE0Q1R=GFFIN(TH?WLkq{NX^ z^q-`v^mp)`OE%J4_6R~2hyKBMIMo*y-1AC(73`RDm%E*O2) zYi*s%GW&uRh?Cqz&ukaT{@}g1qT%-pA2yX5ku>{wL;twXre2+g+lwV!rX7D>JFdqi zewsTx`Wqo~vWF@De=o_!OPRRW>Hqi2!pCI&zrS;u;}rz{@AWf-qxS#4PoMGw3HiS_ zLMi_L5B&dD`u~J$Fe;Ni5Dybe&1&4oHT&*<7~Y#oL`+P~eJPy4y{qqQNbfTuVkM#f z{9kO5K5)KHEwgX1z!rChHq`fX!nw{Jr?=%d&__wpP*?Kb6iG)ANf#G`g}1wg^zR<& zULz*%^TN2MM53OmK7C9mEH2-1H7AzR`_rEnU+x4!KxF(<%S7B9zdKj13SC%fZ%e)7cXn-aYm;y_d$EF3#T%+wk2728=;<-Z42Zdv25>_V#NB1* zL-`e0`)9^{QyxmD;oCMRqOqt2A~DblW)yG9Zh8J7=iD(vgWdcJJZ*i6w`gW7e0g>q z!`XO#X+VYE=LbVO4_#c+P)`q-CIcpmcLCQVVW@(*YZR;THy@(+poYjx-h|8HU(=TQERNtQ~0z~N1eAn*6?4P zlxgTHiVN$g_A3px;ou<=(eDslSm6wHp!V0hU*(V%cj++xlb9VdfXM!mF_(Zr~F*}887LVa&&GoK0nIn@r!8 zyrP9F`BEVs0|V#jAoqQiqNBC6eNsyW{{0d@GH#{Hr2V0-?=sr zFWUyUM)$k3CX36rDo^;IQqJVcCaY(2xMzyI|NA(>-re1q2bmB_c3q^t)~o(*=iYaL ztcod*@c@ZMKk?M7&!*;1Fa5zp@bkDhPuQnA8jZU{le95&$~z7nf8O_LK6T^6ojfd^ zry_mHNE7UY<9ipM#De%!&D`|}_^HKhbCG7SbfbN-wMDqtEe6MGV@tE>-v#DRm|UES zGC4G}+W%U-y0~{kaZLbkq~elL#n5#(Gcu&MI4V=qc)Lq}{a1~;s8(KM?1kj1qHCgB zVj>K5uW1|lY~PG=U5XdPb*&y}5nhV4VhA;Ipgwa)l^<#sgEG2*KIIe~X}yHl%s>6| zUDq*R8IQ1^^S7i_`C)L zT~F*1f{-|mdfq9yDN;MRcd*^|JI|~;^m<{M1eZ7RToflcO<2e^q*<4(Z9qW7?H?iH z1)pp*5YOm=kkg!lRU0MLbKqa~yk9qQj9c}~h$MniaJB1~G*fGo<~@ds;~ut1kKU(q zh~fv9!VQs0!s9>9FZk(&1v($npf?X0KS1shZ2vwCFQMl3xQMV1E%jmPtK_POj2lkO zXrYg?C(L>oOd{4TPZu7Kc~6DL!gVJ)|L;SsJV+s;N7bjt$9f!s?szhm#eUe~AjSvsNx$A_iu7_eAtcyeKSZi|bq{#XoLMiaHB|!~& zk2~lUM%iicUT$BppjchJ?f+0zjx$CUk4--DRB25|NcsT9>HHAx zVVL{mO?WF~RV_GW7<|Pqd-^(j4ga=%qPmXd<$q4>S=r^aBQ~O>i&Xx8Sp~uX^o` z)XRrP8&7D-;`{s8I$gW+9+5rT0*g8Bu;nt5NbU3P*yR+-w}yW(O7NFl>y_ZO-aauJ z9^h~|g&3LNj=pS;agXJ(FmwHUR&IdP{0q`^Y~VA5y@y!g=ohfRMGo!pr zZX`f4(PEdnmw*u)sZ;N9*VP#l!Lhy?oJbk_c;U!&JTccT*An7k zkDtHSO<2^sY2+d3A37?l^Yd}v(qu2u!Vu|3!_ax1G7q(U5hbyEU(&$m9qI|`9$ZdK z38S1%A+7&nsxSWZ$PjXqkZMAh?Ws_X%e-Yz-mbctZ9@Ar?R)m}#eXG&@73Q2F*N%w z_z2V76M*httxbKNUJFTe zAtC!)?b^_oe8ddjWi;?ho%v?N_Jhg0rTGLkgn?$2c{Z0dGn$EnPHH-(glP` zn=pKmd45e#AELyto3swgBI~vd=M|5OJ=pqW^LqLGuMg#FX&d1lLS4rdeB~6Q zcYN()`_9p}XV8K7gi_A>0Fn_W9%1T{-&cFH|A`IM8~gEtPDIJqKb*<$xs%w7M?Z+dyp{6;Ce@4LtIE_)Lcq%qx&{CZ z{?|?QjxvkxC)s}cMjui5$#F9+<8{ngS6A{mmm_z0e?aqHGBJ;riOUdbr3%_`qs3N_ zsja$2I$29cz3LCUwXdZobLkV-&8Mffr(Vghw3t_&LLm8MA6@E9I(XmsV`ob7E)_p{ zkkI&A6HCJn`q^e<1gRmtC9=+EOcD{Yt>F49xZ_HnZon=XUID9s)5A`y``_Kz2xFp) zy3$RpH_Em-x@z#d?qyg9dSIn>pY1_+gCQX+z4<-J2!YA3yJVy*luElAb(7SyDeslY zKQGROy&KQo7CNvNa(PZ(ZnYij6)PoO!owv67oWN(YIu;;#XhQ-KwDF#n%>cC9@a)F z`dvyw;DT^Msq$PUB+x#W!%Ndm|B{BCPVX@jL&nB+O<0Y0WKueO%Wz{88w)>7z5OyNqI8fV#Gl zf0%1SQzR?kG5yYEm)|q_Qyx$_CBz)%hvR3Z-sg6Yt}hxXw&uE{-`calw|(8$SgM?$XGjkU#(uL* z%tHbs=@RqHlOf-#gO`Jkx``p-BDGK+xXkfJUI~bLA|mFpBVkJ^rH2Ltu@FBR5f9~W zGzFcyx&9M4?{+zG!276iy~X|w_DLEyn=IoyLjYxD*C%9aIRvsWQT8{#VE2%Y(|CG+ z)(_Mbfg`2vhgaYJ?ts!Vl2>~UiZS#?^-m-Q9i0jFVg!g^UC`({?TnhN7P+dsgyRX> zq32}zrD|2$L_q|8{|zFFx1PHVN`*15+p}}^^IT$%A0X)G^0PY@i{p|#VNn~Ecd-tx z=T8JXkI{B8k_oP{*xxc5m=uEQ%NKnho55yeONv&A$*}h~l&){yJ7L{=JB8POH`Ifx z*FKA`Sc6BlvpNvguUWRuC5!us?xYPPHc@LuNp*Pq6h49H5df>gcz1+>z|+xBynBG6 z6T}8;lAPgd!B8d54~~fn`ZMI8^%XSKJKzvlS|x0~6HefJW1jAJbf~cx+|h_>Oq8pI zixRCrO8Tx_VXZV8MioB-EZQcJ(T zVlr>&%0u^JjWJ>Ko6A?VusM7vdqni4uTXx(ZN4D;FCai2^B}-*s4zq`ktp13_s{P< z{cd?BT14TZ3*^K@tB>`z)#7wT6 zq&TYd;cnia?nm8)dJN9sxD5-NBK7;^rh{4|!97c=yUa~yrn4rqQ#-IlQx{2BRz!ua zzGPmHPsx@KOcMH+Av`H6W^p;s7K(Z=M)B^GoCAB3*r)+DQ*h-`rn1*)aenMeEZdil z_7}x6X5T%siR7!O94QK-)!!%o>m)WFo}=zc7irTjZR)Fc`=a;QM~jln8P8$haLm_r zX*9WLkg~1ozSuTS2{c$&T+P)^37n|MeDVp``Yp=!NLLc;7Tf1>t*=hjm_3>w?!H|0 z!X-!r7t)axvo!_+9o3?ofcvvmaiq3XpDJTR;L4|k)Jhq2877u((3RkqKhYl8Th0<8 zfi{*O!i|oP=TfV%+t#Uvgt$0<0}_%Eo1MP zX0fwP+O9?EFPa#LOYk!>w{b`qtnnw+H%cz1yeGr;JF(6uQn6#WQT5vkGq_UYGRV(YD&d(wajs zfFvO%jy$h^A=jr}<=f9gZqfm3orcV!jX{s=R3n7G(}}c}-Ir8_-ApBXI%^I`RuDx~ z_UXZq{YZbF3p{yrH(1Gt^~HsMBTEncRW+@Q^T7|h~$m4cE$Zp7rLONmU+2UBQx9P*aRc|^h(%ooYcLt z0$sICQM0nkd>Tc`S*k%Q6eXR>?qSC1DGuhu?>|^{=#K3Cw!3+`BmO)hr>J3h%ItU* zjQQq6l=9rYmPOxbbCuLQ(T=_s8#KlFbb=8@3y-Gk4^}*P8#~pQuPQ4m6J5RPx4is9 zRgF7G7`#)53JN=TJ-tEYDqyVE#m|b95b!Rja4O^ac$qL6$Dj;VPzmgmZA<(&YaVK! z#ZNfZ_U;H`+VgHgU;w-BHJ#1;-}CUJ&h|#gH`iKj zY#LkelDLEf9j~Tmtf{#8`Q??BoBKo8>CG2-&ztTO8y;Krw8B7A(6EdAqo%DtKOTFdeW5%9KjMi z&1;@pSl7*;oP(7pYUee^KRdyvxV=3oz`|}+K#Is|GWI%ha$H0GDJt?EQOzy#=9i39 z+qPUpm#>AkyEd2$&3SvCr{@u&1RL^Ja}jTvvT_cpyx3UW=N|~$qrd#Ee`oN!1sjrN zaf@Z6>{92ijTnr*rxk5YP0j0cbQr&W{Tlo#!NqCS9?Ko^*VHR8a0`u3cyV%K zQtK!wtG}?hS$njkfgq_@cSV+lf8mT<@%wjP%gf&!jg6GwoERJ-XZ#v_>#6M4zoxAq zE;^nlE zpDK3qpJX3@%A%L^5bkl@$yU}d{Oip<_>K7-YRS%@4UXp@w*)W6y8!9w16@XkQ! zd3z@(|Lkm*w{PDjDQ7+abff)W?2~7zE5t5Z+Apu*J+W|&ms6;3Yf_n<pmv%J)TTN?WsGGkHCC)RUu z)1&Mci2b<>G%*1RH1Lv~N#9II9xPKo3mjDq zhs`lMXpH#|!SLdH^+|T0QOa&WR9qr{#p z*cv%nm4y$vFEQjYTSYItsL3wR-W28%(8a?j^`xNlcWLEeC622Zm>I~9j!a0v$Hm26 z9xlOUWQ=v){P*u1G4Z1Spp4O1s5qdFZAo=Z^=qu%+iV)abfifOEB9O%1qZc9rU8Aq zcOuL)+Lj#>cKu3mFc8Zpr56x~(ythZPT7Zal_$CwkwISrQk$oF;Lh3z8<6*_#u*w~(F~JQ<~&DQ;V6a`>m>S=WnmLXQS>nM(an*z06K7MS<434OHFB>`M$SF0?TxGX^K`dDyj zcipJyoSW@Wjw16pJe#Alq87Y>+ z4#8d_0t7GmppYz5poGFbVSxNW`6G-IT(%$4yXrLVGl>jMRdScpdLo*KJqvaXhF5s4dWp zBYLwvZ{qWsAP+@Kx48p@_HSyMWd>n-HJOH14DkHtz)ol;@M5ghzFJHW?b%)jP`IA3 zzE&dZ$VEbb^G9n$u&#A&sxd zb9IrN1rKG;P9vMsWaM7YMYUa3{_W@E_S^jVlv+wm$&!1nb}#RiQ3mwSw4?bFEdBs;P`p75ML%1 zGC?H~rvCyyY)M?1>aG2|f@QIj!>h!Rg_BoA&tM)!dUHlXPaN<79jJsJ>57JQK^q7} z+9GEl&0{DInb*`F>q-`xTA2_4S8=ALnD3y@LS6#;?C>@Hvy`GyddA&bEzQcQ4TKII^mmoq?l>m0 zoA1iwuSs-|QKd+^7;Q-_$WrZcj(PB0Ob~GJ_i@+Hl!5ZoTz#-H0cvh)zN<~^Ef*{A zjS=p+CluH%nSv*&rmQJQ8PC`d`fFUax0??sO;f156{qo77Y9U-BB<&Ee_o7Ie?Qq$ zA}BcBrN5|rvG#f5z?*;eII1rKirn z-IfYpr&*kjCDZS@jl0^1u@FV)Y{f<8z^yA|%-&yRgVI-CfY^ro{F`P&KGB92`5BRg z*w=_7iOX}#ee~SpzufUD{{H>d1TYEr?Qf;nLlfon?f#2FEAdZ`ivfw7U%%X$js$WN z8=84(T`XY9uA_Dh42=E$>AujHJFklcpFQ&%4S58D!Ie)wf?w{WcSotcH|+bSh}3>J z6u$Uzrt_*@P~d!|vDaDQxOK4+_-V&W5urc~+WoUHoE$gQteg}Beu_^FgnE}RgP8wG z@f6}?EvWdju}~THljXa&r)Q1EnVcB&ze|Y|eyNJ#Q*Xzw0}9JNRUQ5C|6r{fa|u{v zU^ixF=FaTRZT#P|1LuU?!Tn-HuSMtkZ(^A;?>O{lnO?3SnO3=^I#044Ph>!Amu75m`RCx zKJWuirRw<0ohZ1^BLmcch?m9wtH7WmLd4+r5(c}4sor$;)xXaMYq+Qo_Tf2haO}u( zH+mP@tX}hY-WV@^TpXLfi}`^<#1WAVLS18{RL2Kf{)a?7;1b)y`es_>A9C?7bXA_q ziT(KVsSS8(eyRWD-%B3s7MA`R{$Ww&=ATZ~3;VASFCI*h4BPQz zfriLs=3%YXz(iDe+Q_jHYe)IWDz& zi)3{EjpdebwRbD#y{PY56@m6xNv-&E9AVsyNX7DZ=w4PxbYtjo^tJclfg{kyQLroQOrk^l8_ zMX4JG;=H}BRWSdh;;p*GEAqU*b98gRC9aIKayo~(Mny4IYxxG-HFz4bz+a}~BtR#3 z87b~m>e&$Q-2>wvF{o~udP4A19d&A;cFp?`JB|^&Gh0wpQb(GtF_F8Vf*?;`F8|mT zZBKj>m30|J?>BCDE+95l1sCD(imBUkI&t77y;~uQnaoP0&&rJU?6+j$ zsW-AsOIkL1#YxE0=Jwj#FOHz5a$h*>`}s$uDt&uwm6(2Zip^B#uP-iPOqoU=R*Sxh zxvbuQ--dSM?f0rZ6XN^1x_9J7t`u`=)SmunDp=~%82#XKhghH*&o3k{pw29qwj&V( z(X2L!BYSgcMBQ(tuBGWU(_NK*XF+1_>im~$SJUzDxSZ;K?EPvtR($)N?fOUxlM*v= z;TqAH>n-F`I!TkT2EzVJVbj#*^phojGqX%9`^!3`nVH!?<1Z@-(`r_6C0zehyK&2z z_MSImaoi!zJMEsj{$4}XV8vf|Csr`EEM`jN$Tz+0TN#?0Zl!p+c-pvDpr zu}m}`LW0gG#qcw+9_zUkU4%8$`D=`kq}955o1B+~N45~YB-)W05~e(Ik}%11x98|t z$y|^77Y|i&wjWX1HRq7ASmD$TtQAI1a&^`xc*vlq;-)}DcX9+TCoUqaP30SL4LiB2 z%!-M7CHDcWeG>L=y?^WWe3GKUX`Qqi)xVey55BTjQx1~R7#&ml{7hG3JI8Q*zp8q^ zpN-5gHgfKJnCz8lb{yAE0#rgV3R00YE1ABhNB78fnOQbE6?`z}6{thORbT{*hcIWz z4Y?b(+aNQ2Twt<^0RW94^iICqk9B_qZD>|<;u#7=)Y{*RqahKxGuM%R4*B%;Yu3O? z0>5@(zFO8}hmvJ)QmF`{(lDBZAi$UHdiIe|LPV}J2xPT}P&1Fc&OA26YsUUIf6u9J zx6U2R_>KMa)}~ErSO6K{DCW(_Hwh$Zy0cmKb#NHNb{{TBV(zWh-lj`>SiGkZZ@p*3XsjAP8Uu_fDhv#m;VFo$WXC z9NEg*O=d3P1lyGR8A4yPigQkm7a0{O(n-vJ{Y?XdB1nh6G-gta36m_x5$_&m!a^u) z3*yX@Las!QU)|N5UeD#j&u7E3*iVh*tosumt*VWnAg zrgvcnKzh#O58tkqcTd|&O*IY9FQIIpwA-9zOK@==-g3_A41+XE zL5Svqtf-;Hl#I4TGC9ZmugbRyvN}}9v=^Vyea5~K>U~g>l%#h!Ua7`fZM96S^Wj56 z(?FjFM@}By zr+1B*?)%?Fya>m&=p4)N-+qYl_Te~OU!}yw8zbe;qxq9~E@^>fyHw*=?~s`JHh+6P z{<|NC_gvV9@ux8Eh1`Bk&Ue64LNMP$yF&Sj;y$3Z$`8g>^!BjfpA*U$1%DpjR9V|p z{(G!MCOX)coMN)&+jXQn;x|K^TAgY_H)nnyW%W3?Mkk>O0BUHxB}a+u^c$&Np2^a( z>rwi1s?*!ri*G4GsiFgt3%^fD%_kiAfyu!IrVM6ECmk6c%a*5wF$bSh6O$h2=0OU= zt|5ubQSkgz+HKKoMU*d;pqQkrM$dixxg*Q($Lha!svC1RgHD$P$_Vo>>>K{8&m7!K zw8?CR@{JScjLsr_=A9_wt;-R(o_jcF%E4B_F!gQ@S2DjdG%}?__ z7!{e^Q_8eX|Ai73bt310F$pcRK0i4mjM=R{MzIjBTxdI>-KIGcGEqwuO2H{9Xaapq zW~;}GJe^iC;G*cO1AQxLQqDbU5NB+FtY|#cqIe@wrfzRwtTy;rh~cp+57TfQ419@0 zX1;H^k5hQ--sG0+THEghvs7xq)HHqHcVgq%SrT`6nx6Ee8!UzY8C*}Dec85dxXK>+ zOEFd5xcj#PnnoA`Tn)6=v6V&2U1E5xSS2I2dWX`K)uy83by)YG-yANv-_RQkrNz6z zKxt*PHkwbybMBxPIkv&mBEQZ5Q2kYm$zm+Tw`3*n!%=<4cXjr~gi}WJ8-M3$Lm0k8 z)USVHzaUjT#J0`GZDy)Wg4zNoE(7m@r?##G^6CY^-9d-Ax1i%K@0H31{cXRlYcDU` z8uYzr!`*T1L&1_&{-#z`IS!AERZ>;VInU!IecK|Kd+C(`w*@}ec>X~I)&*&`MdtWN za*fa{fBb2FGC&G%LT6=jxN6C}OP*mL_J0H?T$V+cbft4MUmpY6Dtwu-&Ck|7ANlF| z$T$2G;)4s1-#@NAwo(i`^eE<)zWXM!Rc>QUps2v9fpKH7+(ol*#yVfV)~^>2-4V2W zSpR!%aA)~7;3R?ouxlRd?xuP?B?RO9y%W>V!Nsq;clton@moFU_L;2!MsM*>+d~5b z&HFYNg!xaOB*-#~8Fbm*pb`mgt$7-(g6XszE@>Dm|;^2H=!;IJ*PLTGCD226o~ zA$_d~>V~#%Ahjq#^YOHd42k-{vH>CG(rgwnTdrk?2_eS58+LtJuoxfc(WyBg84UhM zuhJaOHX_bd6S*YxYACJrt5NgCXvsDBF_c*vQW+O(TH&m6kG9tQ%tQSfc&a#!Rd3*4 zmTI)wJgS)-Xprk33Y=NJY9Gs-ne8?m(>21$miuO0e1yz9EAZ<*oh%>LFNnv>%hvy` zWcm54T@2gr9Oi*QU7qZafWm^q?mM>s_p)Gyujc^<;i~}WytKxSek@uxg8BjdwX?>6 z?QDKGD+>C%bt<86{qFZtvhE#Lk!$Y0r;d@us?c*c9LUZeJMjVeY8Wpk=9M@DX9I>S0NU>0ivl1nPN?@ReETu=i_-xdH7$R@v}m^$S8n3RbV zKhW+WhP@k!pNTglzL3Qy$c9Q-dEB3^CO)4SNrDECa~LpdC0H-mBEf=a@|V=?3kZ@m zvC-DIR5?Z)j7QVW6oS#~TDmG15~vP@*WXJRPY5^Sx2pTYkXdNhpP;~uCL@xUpnjM% ziko-?lmRbOyMsCD{H&kJd9TdiSR*?UG6!&kV;uF;x0}a0-o&+VSoMM*7OISg9EMUH z(4%sRv9&4U1^)@97N!BO`q?HwATSrapNMkC@QFx!?k9NpSi7`1z^*Qrj~MS)DqtYv z%~Ji&BBJ;#q&cs3U%EQ1Jbh-Ps%r7d;ykwh#2=n(53HC6$|6>>+7h z`^%YHbGFy{MdPc}g$|?-$zCTDKk+#vl=x3mY07j0RL6L(e%_&SJdPGvaz{y3-JgQE z$j_GcE9t!FP&#-+aQL{qIH4vZ=AUNO7?5964pNhwKnT58XR@8$@^swk8_Q3dd)8M* zY4u^0XzfwPiuuDaW}&rO6=cv94cOMgQajhx70} z-oV-hANHAEt>4zqy@pu;H+c@^(_ejiyw#C0SssK$GMuS&yUi6mG*lm?)rnPIJNW z171c~h1^|cFL1-Ab@P#|iyT)*Yz>O^rtQV3T=*t|spW6(*Vv9!_g=*4iM7mDR94UF zajq)X$sAzGE(hlz(`$EUkfyry0Tr8m0v8Sqy4zWIpAnOxtWnp{dBI~XOw6q8Whmx1&N}8^*^Bt2GA+S{M~N~Zd%=ZpAfL>D zHZ*V2ZVEiIqojTx_wS$m+9cYjZd06d1tdtXzmy*Wdk)c{j?dgu0EbV6*E! zaJ+sX9E2x?dyl(LqxDM(jX;+n5n=#Z%+In|Hob~83NfC52Wpx1g*{4p%le5)K4lk> z_U9ZAxG3E_q{W=iYKyDO)f{RU_5|04y^)o4% zHmz9*v--(xZypG+#tyNOMhZwg#;cSM_olKHff&B?X%n5aX$_HGR^|k zxsuEoWsngQBW%l<77qH!&;m?kFj>*^cZub%sWp;DVs!$9-I&Q;U8^wJkVI_`GGIYT z^*EKs^w$-pTt(5b$Kl^B+qS|<1|3VA1J-gLbhR0PT1yB+Z3S!H6&=DljGQF0iM%B5 zs?ry!uo1nx&LIpLfRGHJvjOA!*>dR{|J=3JLNGRaWQ@UKIdTB^Iig<&zJxqZ2(jE-Z3UENflj6CRO^-?&vWEJum?AIXZz5-@O0v(W`*Iq+0hUmc9$=v zVTT0ddHcF0o}Kp{N@mt@!L?>X|7&ZY;`kV2cJfVXzuc+>Oaafds9$< zWtgRU>}p|tKgt;eYM+TvswuavtFpOp7WJOp^r(srp$(^&1bV06?eh7xODgNX_hL_# zU5*Z|5#){)4Ol=*NA`xBo;zl)tXyif5WTs$io1T_rMM3#$L>01ZzJ|pM2yhVx7?T~ zPv`im%;|}+>{CvkIcd2Xlox`2Hqvz;$Ifo^&AT{kfhUxi))BCj8$W2EQ;MjycnAaR zFDq>KwLkTy-pf)?O9SSE)EdhJfwdqA)U;vWKd#}e=BsB%+8i;RF>N-sn+Wpdlg#@A zbsEYN?J$@{89Z4T*fVX622xw{dD91lLZ>;fw!W`+?uYVtNn`qVbzms2wEfA}ZQ%V= zz6$R*&vDZfIR=$k zi_@JY6H=2Z;FUk6fQ;T9>56~SByjf@?%!vRHMK@+a}xOU$hJ9=>$B^^nXR5*e7nq7 zI<}oTy0AAjuqVf1G%xIJoN~0J*k>RA&UBF`vxs0NT`GK^ z`po5!Nv8FTe*%Y+a*iOs05k~uWoEV1-crz7#V=2ThVWTxdFRi_-tMmJ#@gC08eZ!T zuP_>P1CkXw$KLd@hoxnbt;Y*Mo1mnZCT{kNttxFvG(UHEr)cdF{{(0T2BB&gHc znGFM7Dsa*v@)aL$vqx~#ZaSZlFU{y~dJ6HT3TtmoHb>(tc0H=83(b1rZ%WOFd#nxx zdt}_)8TTvoth0S0r4R)A(g$}2MzdQHQ>fR`N^_?kqSt&9&1gcBP%!_Pqz#{1CyX_7 zyi2fApHasU_u^yU(AT)V@~_INn_3cOX$t}fp2tJ3x1!MAxHro1{%c<~>28Bz@5?Y_ zj#?{Te*e%L$ucfT#m@@hTMw%9d& zM|xBoZMvf;zz#_ZN7tJ`Z!F%3$UFw2LRH;PT2ScY@89Tz@MoBZ>rL$v+dFY6hPk*V zIz6%}L9*~Fs?e-`VFnjvmzWVr;`9I3x>pTH*LtMyxz8T9qJ>h=Vw{v^+Mg=&ICxK6(dw zS(IQy0~{7MUG*|{CqoW)*Tn{}fQA8>(Ahhhcn^wtx2{K@ln|uf%94|PK{XX|(+~!t zrFC)0ySm8_T^FyH%VGtp1n ziRb&A-P$JI<(O+-vRYLJ4~OocCn9|9(>GRrttr};ejaOXeaeYS7u%L^BKK{k|6#3+ ze{*~iy1nk7-ikX9Y6DCazKMS+vpACR4p`gEsk6J@JJMN8eiBBTJ0+C&4S~?aiWrBO zDmoe`Iy6R;WNSUL#G#bQ%mKV2+G#?=L-3AqaLGTALSwrt>-ND-E;+Ycp{wg7r^^`w z8*(KvuAri!H|zN!Uk3*tr1$sF5hNTD3|Q+%m)|o_%L-7JQ>xoOeEl+j0B2)+m!o;f zodAR#h>J2Z10hCWWRn#?a#hlsC;JLNf>}OveAD@RW!F`G}} z9cLAN=s|-Rs14F22x|@Rtl$AEKYeEn{--r9Rq2hMWswaw{wNVvpHo5(qs-Sx>enjT~rSJv0YF9CDpXPJDIRt+bPptWS7qBO{-jFtOv25 zA5Y`%HXT*Z$J3_!jQ0tk0kt@~+a%t(V^^P@!k82-m(NJ8eZ1Ri>#%57Gi0YHe+^dG zw7b%FRdc<2?#(fIM|Ph%)xIQGY`ts!d+p9Ypx42hK&Ml@nAJNT9_Dvg#;ef#aXi@LoyMN)d%&e6Fsom4i%i0$C z2NdcQj=z6wnJ2BiPCiHF{qSKF5)WYOv3RV_DYAFw4cQ!T6FxnyTYK{%GP5YRs*LYo zd*M&g^+!*%T^KFRx!h!}0n}8a%&xX7E#pZjnHI;XskOu>}kQpe2 ziO!vhEncSZBa$Sa;v2>$IXY@u$LYFfO*%NZEvZ}S#%Mg=A%_)LHsE9loOTLfLGdNS zYms#JZsQ-yeIE30%tnt*t*5MD!ZF#EQue0MAc=zl{ z)9Ctr&lIAbW(XJatRCzhPEPdWz;R8C?yGLpd|4IA*mnc5g%#IBkY%zxj>Jpr#5xJ+ zS7nh8*k7H*cpta6(2Q)-yC@C|?tW=ie$gk$j@r*I*)-)kcUkMR`j*fI_Z;cDvK}+tJN^4@LB5%v zINA&2H~}Qs4Ea7OvA$^C{Azp(^1hZ{)irHG7fbrL{wUc;5jooTRi?_D#j;OI+4d=% zv{Y){@a?^z*wfed6?ZH)Z^4$tb5RP3RkZkNW8K*JV`2G8&(6PKoSZ*I;e{mWM$3(v zfk9znQQErG+#)#pcw+vp(=LX@h@593aHkD}K`I+cKTY?TX1L(P54E&S*7rbjLNzwC zlh=D38?w0roDQ<)2NFJqs&Kp%M71{Eg7a_{<5Tx$LV|(abo}J^wHR-t zddvqtO2#=#X-~>pcj7bNmkmQF=Bzu?41khSV zqRBGBq%i#WAh73pRdZ;)^jc70xKPmCA1rdgQm`Kw($Lhx$8vHBPU#x{-YZ0HUbv96 zPW79U6J@=q0gz4Q5^dOB%b?Ma5o1g$yGV8?QTtdeQ!h^w8SRY$0YF zr@;4SNvV4kwx_G(xf#123Rhd;?!5Q3znd%v?NLx>MZbR@+vi%%E`Cegj(j4gXgD%R zHti(=q-YlhPaNcp4S(Se8fwrzu_8)VhA@B4DKApb{I?QfZd1I1j4=S6tNJe$nb?5} z0dmi1k9`-L=BBE9-{=0^zlawkh;8#W{?=3cc!9*=TmdIzuqTM9uOoKJpiE6A3B~9l z4^yM9XUa~`$#MAha`CyL%{aJ`qohgSKtzz~dPLXV#y;x*?VdC#CTmt{&#iF5^+F!& zt0He>0qE;qVmm?gL%5OdAwEi&ezxZ&7I&)!3YL;PEX{_>^bT*!v^G|2TFWJ(${K>a z82)$FNTG4Si?rP=jHw2Cr4qK-Z%5S+)PWk%7CGNFP4(CNd_q=-6&dEn(O6 zZ6{`zEL%KByMoTOBfGIEewfvbM(0U3t$g4hI4-~A;?MP9l=XoA5*L%zTy>?LyJrig z5Q0a*N#X;!s0^UU3WjO~afqw0z_ZEQ)CQ56yS}grHx~# zHYoq<{kMp~SWbDmFOoN-(0(rY zS%_jD0zdEUIT@h%;RA@{geVmZcGd$Y{kIFpt8*J49+W~63kdULM5_~2^%4r z%-#$VkE8c3LlMKRw~8U_CkaC*^8@KT;1Pxm(N7FUim=CAO+R!n<-{)1@{Oi+xW;g_ z6W$G{c`f&(8s*TPEe@`P?r!`j_w)~$i)xiCgqGfo)}9KxMkp9i5=AkvQr9<2O7Z4T zzS}CXlItO3o*HvUD8$*hGleJ0*6!nGlAX55kgZMQ|8D>zo#dT^q%$$M#^FnU20jj& zo^gWuq&XN$2?z{ryir4rcpbZbvsKe$(6CLPnpA)RIaORNP1SUuk&OVGw#W2Ai~^N~ zKl>u{aGWuSPE)S80;-J^)kgM9cDai4Q9#H&=+D@Tx@YL5 za^!kKw~Ad^=2&6hnv&vxI|>hd0dRCd?k}6BlbZwGLN3OdT>MuOrGoU9I&PdTIqiPr!;pAA@M&3u?-Z0j=2lX7Z zuo!m}f051aoP!2vi8}g|9hRwlqBxKlNK!)CxvB%+I?%lhx*wh1XUmxs} z-J}COgikF*5y<4&0}nB`VzV_e`}SOR^%{?Dv~?l};4O4m%S?rl^2HAim>!Ay=63VW z2m0kFPb>wTBqxsiRAFc#*+=v>R2%HJqpeu!fA#OOiZ)h@p)il26FO-2ZSI(Sr4o^^152Lmy3-e!VvHN&~dKkHPgFRhgzn+MdPB#+I0v@9xM zh4iUF3vGpXfozELZ?nL9j&XUU?2^TO+Ab|RoAC~t#wPLLH4wp2A^k1MG)xXf?8}H5 z4lJGM-{?Fd3!v8b4_?d7u_PiT39>(xd+-Eva=?&I5N9t6%GihbZRB=EjgYgUO0O2RMDuuwS$bUoK~ zUIJ-6p7!7kTgOinyEAZfCsR3l%_PTKYWdaP0Q%lW6)+4? z2>h>J-GH`~U+A_m+Q@+L8j+BT?=rkqTeg`w#atUuGlU6Ib?+ved*_XQMS~vLnrqeK zXUO$kU$jLJKZaCa^bb=bL=V^WM!;{uh~-0RpBwyOHs|o2*PYqcNl}@%nOj;5Jo=2T z%*;(jC-zKCK5+B1nH(|e`x(VO_L`~wyh6_`X4o$;&|1<(7IqaXCtTq9EbyATsNqkXvV@UcyO}h2yN78iEwWJ0zc&-2Y)gES^zG~>flE^} z=l-_ZbyRlj+NG1=4uZQlq)wvZJ!A06CwK(}RQ!0z$9rQ^rcDzd%PHw8y#`ibp%;2f zrT7mS)OweipFTA)gn1&WP(g2~B4LOjIHhj*n`Mf99*VU;4KzNQhp}3AcpQ#fOUufb zzqj9pnZ?MwhKa#e;(zLF)B7-1w1r|<y!BS&(zY`bbS*hSl-bYa=oSv8>~>a4vFv7r zxTa%)@Qj^GBW*}yQyVK4uLBv>`%P*8kOI%nZ;U*bW#&$_W9s{CiQvp=kYWGW$7AWk zn^k%YMUa?c&(4mi-c|qO5}5CI+Z))od6Vmd%rKN$drYh=l(^~xp3U*|_sIAIl9#VL zEv#*VuPc#sWv2M;X=`bxm3|%HuK!FCAt%$>iyLV*#@s(*9T>*~m8=+)CtoKH6avsn z5WHEQz`by5ZEd9-M>0q`2#OH%uCmaWWcDS876l+K?>$uzq;q@)MG>Ljse&ZT z&G%Z(#qGYY`@GKcSm$v(kLRiS^j7YR&kt^f z`8~#bhPTmJE&HSPbNnGE-iE?{{a$`giW{-S4g=&u=zL61$Eo>WsWIp(WiSy^ITLx9 zpR?PijhQ5bsz(;L7&FA5$WQixU>?8SOGKdne40k0R$aR(9uUWW1^Qnhn!>F0YGtIU zg4e2D$BG8!J%4_BRM(lE(;vJM654K%zt$F#4f%s2D=b=wcA`K^c`Ul98myZjJYC1yB*nV^~6KSeiqB7#qq+ zmjN^*|0|XjLl>lUnyc>V%U^%8v)yB-Y9(C6rhG3OR4eyp0yDzU5WHsyK#yP}!|4)b zC^-OD>)qI-&H?SXPg#9t7Clxj$vds9Vw&=-~IyI zJVN2$)`lP-AzGb2L!XrPQ_8rkIWjUj-6l_XzVOhV$^;jc*f>|msAnmUS);V#2__1$)*?B6cc!&O>Htdz1PqCboj z^;!avw3HqIu{Rypaf^8Sbm)7HJt!jbM$$@06M%#w){{neG<#oB-5NXftA3HHT0bch zaAZ|gzPJFE)-riBrn}~$ZE3TOxb%|NB-C;yw2IInYP70M!U+#&Qd55_-tvt|B3LtB zfeM2C5^~W5J_Z!5R`0Uwg%@Jk8+dE4AzwgGA490DqQy!ZNukZz-=2tUT(MzyXStt? zMJ34C^j@y4rk7i869Vlm^21tf@${gpyty|RBV+X;T35SzjFwAsm6lcbvX|!XRo-aG z7GIzJLx`t4*iGp%UE5jA#d{?ko&0)OyY9CPxoTGeh-kiAP3qW7mUU}gGuG4l&%3p!ge35@WF2pKJO1!(w9IL8lR8_}5maAMnH4SZQ8;>#cCv^O%@) zyu6U%avi@%rD%iH!`tpZQQl-vX-P_|!WsIt-P@5C2}E1V%g|o|i4j2W$!TGoEK6vj zL(n9rg;7k9o144&>(}eZNRkh-^kU-T)2plg_LHtdjN;j8pR=>4&lE}w+KHN4TjjI_ z6$}41h2R1@6O2U}m^Is5=ciAgB>;_?X80}VB zQTptC5f88B-4*71{bsC}<7I@GE?v5K@#0-2C8Db8YE#Pf6lErwr*%)BJQ}n89v>gicicAQlozmFA=cE?v|Q=GwG{=+WA!e{ z&Qkf&BNPb<$=Z)f5?FRiE313=?xB4tEabFZQ4S#IMQ&od7yq@pyJck{YkFbftzxp2 z-rm{>2+KF@x3?`OaM;<|;f=C)_F>^|_cAgw#gvtaVOFMp{tW7hr+@yabUM01Osorcvb3@B3J%7HVRAU{z1$+ZN=#hW)rISEQQY(dy%!IHRO2*v3uO;iBs**)`^*8Mo_B8!$pVIz$ zf&oU|BvEVY+^G|98d-Ql$@;1=vZupdxFDb|@@ad3M_$7LNO0|N*%wy|1Kb;pO> zgp`y4lKxj|85u7^r>R=8$&*0dw3L*(p&=63u!FGFMX+i-Qc^;9cX!X$C{-}3-Q2V+ zD=WJOmAc0zP`*Jy zh=RQb(*YgzWfc|rvn_$p8gFETLvb4iq~QL82hCBO&vY#;f}gbp>D9l6sJ76kr=g(% zosEqRmZhmT5zvRAnJARAv$KJbk^j(@*K}}$l(e+#f`a6-sY=<>u>|IlQc?|2O}*m= z!Y9a!f~jPO38IbcKts{e(r)hVHlLmxaoQ}%Glt7bNK3DdCqUQa@1143w|2asxA&k| zvZ|^Iu>=Kf6ciM1e0={@DdQXVGIu=eoMb?Tl(AnhjezWlVHBLyM-%5(xW#< z!mOx%>Y)15IOAi2RSV|hMSa~#G$7mqc!hHMp5el9;V)(b?QSty6|CFlHT>5g@hVMMxLgh4U7~Tp^ekf-jr|5a-*V^&wQY#m#CI^+tk!FZr{3G6DQ`4 zv8VmU#1&JR5dAupII+Y!Fk{UVPf?b$Ex6UF_r4~Gmu+in*Z42q*Xy41Am3;H!}8&V z@`!pMox-NU;}lW)Z9t-5^Dn)oH#8s0@9y;-9V16Ql%aV7ljJbdi}P4 zK*RG^RT*qCNST`2QqXuwQBl96g}y#IbY)wmL~zh^(9xYUH#Y~(dYzC!!@|nitSfiX z|Bd!T^!4R8wuIf&^Yf|u(FByw4GeUbdK25ayQOq>uR&X_>7B_y3O>}5&m+*gT>A%m zdwYT#aUVbK#4mfE!z3UlAD!BONu#}Seakgs(+(KR&0xOf)O` zZz=jRlX~-F-(*qx+2QZsGY4C%=SwSFTS((|ldKMOWd|GULe5w|Lx@J;= z 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 KlYZmzi~j>pj1j8< literal 23016 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 sjQr;g0xuyE>~Q4o5w2ea0z5oCK From 949fa029e1300703a868976f0290fd86dd5fe631 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Tue, 30 Jul 2024 14:57:36 -0400 Subject: [PATCH 02/17] REmove weeklynet issue --- .../build-files-archive-with-dal/set-up-environment.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index 370c6e846..01fc2a6f2 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -57,9 +57,6 @@ For example, the command to download the snapshot may look like this: octez-node snapshot import snapshot_file ``` - If you see the error "The chain name contained in the snapshot file is not consistent with the network configured in the targeted data directory," the snapshot is for the previous instance of Weeklynet and no snapshot is available for this week. - Continue with the next step as usual. - 1. Run this command to start the node: ```bash From 0671dc2483cea03572cf50b2d9769be9afeba89f Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Tue, 30 Jul 2024 14:58:35 -0400 Subject: [PATCH 03/17] Clarify default port --- .../build-files-archive-with-dal/set-up-environment.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index 01fc2a6f2..f100d8fd2 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -67,12 +67,14 @@ For example, the command to download the snapshot may look like this: If you are using a Docker container, you can enter the container with the `docker exec` command, as in `docker exec -it my-image /bin/sh`. To get the name of the Docker container, run the `docker ps` command. -1. In the container, initialize the Octez client to use your node:, such as this example: +1. In the container, initialize the Octez client to use your node, such as this example: ```bash octez-client -E http://127.0.0.1:8732 config init ``` + This command uses the default port for the node, but you can change it if you are running the node somewhere else. + 1. Optional: Hide the network warning message by running this command: ```bash From eec625e1cbd050ea3cb5af417f6da6de898f2a1f Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Tue, 30 Jul 2024 16:24:51 -0400 Subject: [PATCH 04/17] This needs to be "slots", not "slot" --- .../build-files-archive-with-dal/publishing-on-the-dal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index c9e992b78..d67f34488 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -147,7 +147,7 @@ If you are using the Tezos Docker image, you can run `sudo apk add jq xxd`. echo -n "${slot_size_bin}${slot_contents}" | xxd -p -r > "${target}" - certificate="$(curl localhost:10732/slot --data-binary "@${target}" -H 'Content-Type: application/octet-stream')" + certificate="$(curl localhost:10732/slots --data-binary "@${target}" -H 'Content-Type: application/octet-stream')" echo "${certificate}" From 395650b8c06dfcf83cd114bdbe3818ee3a419e27 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Tue, 30 Jul 2024 16:42:13 -0400 Subject: [PATCH 05/17] Complete update of tutorial for Ghostnet --- .../get-slot-info.md | 21 +++-- .../publishing-on-the-dal.md | 80 ++++++++++-------- .../using-full-slot.md | 12 +-- .../img/tutorials/dal-explorus-blue-slot.png | Bin 0 -> 10791 bytes 4 files changed, 63 insertions(+), 50 deletions(-) create mode 100644 static/img/tutorials/dal-explorus-blue-slot.png diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index a8e7ab3ab..f7dc8312e 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -2,7 +2,7 @@ title: "Part 3: Getting slot information" authors: Tezos core developers, Tim McMackin last_update: - date: 24 July 2024 + date: 30 July 2024 --- When clients send data to the DAL, they must choose which slot to put it in. @@ -23,15 +23,13 @@ Similarly, the protocol assigns bakers to monitor certain slots. ## Starting a DAL node -To run a DAL node, use the Octez `octez-dal-node` command and pass the slots to monitor in the `--producer-profiles` argument. - - +To run a DAL node, use the Octez `octez-dal-node` command and pass the slots to monitor in the `--observer-profiles` argument. In a new terminal window in the Docker container, run this command to start a DAL node and monitor slot 0: ```bash octez-dal-node run --endpoint http://127.0.0.1:8732 \ - --producer-profiles=0 --data-dir _dal_node + --observer-profiles=0 --data-dir _dal_node ``` Leave this process running in the terminal window. @@ -153,14 +151,14 @@ Follow these steps to update the Smart Rollup to access information about slot 0 The log shows information about slot 0, as in this example: ``` -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -No attested slot at index 0 for level 56875 +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +No attested slot at index 0 for level 7325504 See you in the next level -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -Attested slot at index 0 for level 56876: [16, 0, 0, 2, 89, 87, 0, 0, 0, 0] +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +No attested slot at index 0 for level 7325505 See you in the next level -RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } -No attested slot at index 0 for level 56877 +RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } +No attested slot at index 0 for level 7325506 See you in the next level ``` @@ -168,6 +166,7 @@ For the first 4 Tezos blocks produced after the origination of the Smart Rollup, This is because, as of January, 2024, a Smart Rollup cannot fetch the content of a slot published before it is originated. This is why you must wait for 4 blocks before seeing slot page contents being logged. + Now that you can see the state of the slots, you can find an unused slot and publish data to it. When you are ready, continue to [Part 3: Publishing on the DAL](/tutorials/build-files-archive-with-dal/publishing-on-the-dal). diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index d67f34488..f90b1e7c0 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -1,14 +1,14 @@ --- title: "Part 3: Publishing on the DAL" -authors: 'Tezos Core Developers' +authors: Tezos core developers, Tim McMackin last_update: - date: 26 January 2024 + date: 30 July 2024 --- Now that you can get information about the DAL, the next step is to publish data to it and verify that the kernel can access it. :::note Planning ahead -Before trying to run the code yourself, look at [Explorus](https://explorus.io/dal), select Weeklynet, and choose a slot that is not currently being used. +Before trying to run the code yourself, look at [Explorus](https://explorus.io/dal), select Ghostnet, and choose a slot that is not currently being used. ::: The examples in this tutorial use slot 10. @@ -18,15 +18,15 @@ Throughout the rest of this tutorial, replace slot 10 with the number of the slo When you have selected a slot that does not appear to be in use, follow these steps to restart the Smart Rollup and DAL node: -1. Stop the DAL node and restart it with a new `--producer-profiles` argument. +1. Stop the DAL node and restart it with a new `--observer-profiles` argument. For example, this command uses slot 10: ```bash - octez-dal-node run --endpoint ${ENDPOINT} \ - --producer-profiles=10 --data-dir _dal_node + octez-dal-node run --endpoint http://127.0.0.1:8732 \ + --observer-profiles=10 --data-dir _dal_node ``` -1. Update the kernel to monitor that slot by updating this line: +1. In the `lib.rs` file, update the kernel to monitor that slot by updating this line: ```rust const SLOT_TO_MONITOR: u8 = 0; @@ -38,7 +38,7 @@ For example, this command uses slot 10: const SLOT_TO_MONITOR: u8 = 10; ``` -1. Run the commands to build and deploy the Smart Rollup and start the node. +1. Stop the Smart Rollup node and run the commands to build and deploy the Smart Rollup and start the node. You can use the script in [Part 2: Getting the DAL parameters](/tutorials/build-files-archive-with-dal/get-dal-params) to simplify the process. ## Publishing messages @@ -51,6 +51,8 @@ The DAL node provides an RPC endpoint for clients to send data to be added to a curl localhost:10732/slots --data '"Hello, world!"' -H 'Content-Type: application/json' ``` + Note that the value of the message is in double quotes because it must be a valid JSON string, as hinted by the `Content-Type` header. + This command assumes that you have not changed the default RPC server address. The command returns the certificate from the DAL node, which looks like this example: @@ -62,34 +64,39 @@ The DAL node provides an RPC endpoint for clients to send data to be added to a } ``` - Note that the value of the message is in double quotes because it must be a valid JSON string, as hinted by the `Content-Type` header. - 1. Using the values of the commitment and proof from the previous command, post the certificate to layer 1 with this command, being sure to set the slot number that you are using: ```bash commitment="sh1u3tr3YKPDYUp2wWKCfmV5KZb82FREhv8GtDeR3EJccsBerWGwJYKufsDNH8rk4XqGrXdooZ" proof="8229c63b8e858d9a96321c80a204756020dd13243621c11bec61f182a23714cf6e0985675fff45f1164657ad0c7b9418" - octez-client --endpoint ${ENDPOINT} \ - publish dal commitment "${commitment}" from ${MY_ACCOUNT} for slot 10 \ - with proof "${proof}" + octez-client publish dal commitment "${commitment}" from my_wallet for slot 10 with proof "${proof}" ``` If the Octez client successfully published the commitment, the response to the command shows the slot number and the block (level) that it was published in. - For example, this response shows that the commitment is in level 8455 in slot 10: + For example, this response shows that the commitment is in level 7325485 in slot 10: ``` Data availability slot header publishing: Slot: slot_index: 13, commitment: sh1u3tr3YKPDYUp2wWKCfmV5KZb82FREhv8GtDeR3EJccsBerWGwJYKufsDNH8rk4XqGrXdooZ This data availability slot header publishing was successfully applied - id:(published_level: 8455, index: 10), commitment: sh1u3tr3YKPDYUp2wWKCfmV5KZb82FREhv8GtDeR3EJccsBerWGwJYKufsDNH8rk4XqGrXdooZ + id:(published_level: 7325485, index: 10), commitment: sh1u3tr3YKPDYUp2wWKCfmV5KZb82FREhv8GtDeR3EJccsBerWGwJYKufsDNH8rk4XqGrXdooZ Consumed gas: 1331.033 ``` - After 4 blocks, you should see a message in the kernel log that looks like this: +1. Note the value of the `published_level` field in the response and look for that block number on [Explorus](https://explorus.io/dal). +The slot that you published the message to turns blue, as in this picture: + + ![The Explorus record of slots in use, showing slot 10 in use](/img/tutorials/dal-explorus-blue-slot.png) + + The blue slot means that data was published to the slot but has not been attested yet. + + After 8 blocks, the slot turns green if DAL nodes attested to the availability of the data or red if they did not. + + If the slot turns green, you should see a message in the kernel log that looks like this: ``` - RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } - Attested slot at index 10 for level 8455: [72, 101, 108, 108, 111, 44, 32, 119, 111, 114] + RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } + Attested slot at index 10 for level 7325485: [72, 101, 108, 108, 111, 44, 32, 119, 111, 114] See you in the next level ``` @@ -103,24 +110,25 @@ If you don't see the message that the slot is attested and contains your data, t - Make sure that the Smart Rollup and the DAL node are both using the slot that you published the commitment to: - - In the file `lib/src.rs`, the line `const SLOT_TO_MONITOR: u8 = 13;` should use your slot. - - When you run the command to start the DAL node, make sure that the `--producer-profiles` argument is set to your slot: + - In the file `lib/src.rs`, the line `const SLOT_TO_MONITOR: u8 = 10;` should use your slot. + - When you run the command to start the DAL node, make sure that the `--observer-profiles` argument is set to your slot: ```bash - octez-dal-node run --endpoint ${ENDPOINT} \ - --producer-profiles=10 --data-dir _dal_node + octez-dal-node run --endpoint http://127.0.0.1:8732 \ + --observer-profiles=10 --data-dir _dal_node ``` - When you run the command to publish the commitment to the DAL, make sure that you publish it to your slot: ```bash - octez-client --endpoint ${ENDPOINT} \ - publish dal commitment "${commitment}" from ${MY_ACCOUNT} for slot 10 \ + octez-client --endpoint http://127.0.0.1:8732 \ + publish dal commitment "${commitment}" from my_wallet for slot 10 \ with proof "${proof}" ``` -- Check the page at https://explorus.io/dal. - If that page shows red (unattested) slots, it's possible that the attesters for the network are offline. - You can also see the level that your commitment was published to in the result of the `octez-client publish dal commitment` command and check its status on https://explorus.io/dal. +- If the slot turned red, it's possible that the attesters for the network are offline. +In this case, your Smart Rollup cannot use the data on the DAL, but the blue slot in Explorus verifies that you published it successfully. +Without active attesters, you cannot continue with this tutorial. +You can try running your own attester by getting tez from the faucet and running a baker as described in [Join the DAL as a baker, in 5 steps](../join-dal-baker). ## Publishing files @@ -154,27 +162,33 @@ If you are using the Tezos Docker image, you can run `sudo apk add jq xxd`. commitment="$(echo -n ${certificate} | jq '.commitment' -r)" proof="$(echo -n ${certificate} | jq '.commitment_proof' -r)" - octez-client --endpoint ${ENDPOINT} \ + octez-client --endpoint http://127.0.0.1:8732 \ publish dal commitment "${commitment}" from "${alias}" \ for slot "${index}" with proof "${proof}" rm "${target}" ``` +1. Make the script executable by running this command: + + ```bash + chmod +x upload_file.sh + ``` + +1. Try uploading a file with the script. + The script accepts three arguments: the file to send, the account alias to use and the slot index to use. - This script also assumes that the `PATH` and `ENDPOINT` environment variables are correctly set. + This script also assumes that the `PATH` environment variable is correctly set. For example, if you create a file named `myFile.txt` and are using slot 10, you can run this command: ```bash - ./upload_file.sh myFile.txt $MY_ACCOUNT 10 + ./upload_file.sh myFile.txt my_wallet 10 ``` If you run this script and see an error that says that the file was not found, update the first line of the script (the shebang) to the path to your shell interpreter. For example, if you are using the Tezos Docker image, the path is `/bin/sh`. - If you see the error "Wrong value for command line option --endpoint," make sure that the `ENDPOINT` environment variable is set and then make it available to the script by running `export ENDPOINT=$ENDPOINT`. - - Again, by inspecting the kernel logs, you should be able to see that the file that you wanted to publish is indeed the one fetched by the Smart Rollup. + Again, by inspecting the kernel logs and Explorus, you should be able to see that the file that you wanted to publish is indeed the one fetched by the Smart Rollup. Now you can publish data to the DAL and use it in a Smart Rollup. In the next section, you write to and retrieve the entire slot. diff --git a/docs/tutorials/build-files-archive-with-dal/using-full-slot.md b/docs/tutorials/build-files-archive-with-dal/using-full-slot.md index 6ee53c95b..8b057cf85 100644 --- a/docs/tutorials/build-files-archive-with-dal/using-full-slot.md +++ b/docs/tutorials/build-files-archive-with-dal/using-full-slot.md @@ -1,8 +1,8 @@ --- title: "Part 4: Using the entire slot" -authors: 'Tezos Core Developers' +authors: Tezos core developers, Tim McMackin last_update: - date: 18 January 2024 + date: 30 July 2024 --- In some cases, you may want to retrieve the entire contents of a slot. @@ -13,7 +13,7 @@ For example, it can be convenient to get the entire slot because it has a fixed Retrieving the full slot is similar to retrieving any data from the slot. In this case, you change the kernel to retrieve data of the exact size of the slot. -1. Update the `run` function in the `lib/rs` file to this code: +1. Update the `run` function in the `lib/rs` file to this code, without changing the rest of the file: ```rust pub fn run( @@ -92,7 +92,7 @@ In this case, you change the kernel to retrieve data of the exact size of the sl These dependencies use `tezos_crypto_rs` for hashing, and `hex` for encoding. -1. Add the matching dependencies to the `Cargo.toml` file: +1. Add the matching dependencies to the end of the `Cargo.toml` file: ```toml tezos_crypto_rs = { version = "0.5.2", default-features = false } @@ -105,8 +105,8 @@ In this case, you change the kernel to retrieve data of the exact size of the sl The Smart Rollup log shows the hash of the data, as in this example: ``` - RollupDalParameters { number_of_slots: 32, attestation_lag: 4, slot_size: 65536, page_size: 4096 } - Attested slot at index 10 for level 15482 + RollupDalParameters { number_of_slots: 32, attestation_lag: 8, slot_size: 126944, page_size: 3967 } + Attested slot at index 10 for level 7325751 Saving slot under `/6a578d1e6746d29243ff81923bcea6375e9344d719ca118e14cd9f3d3b00cd96' See you in the next level ``` diff --git a/static/img/tutorials/dal-explorus-blue-slot.png b/static/img/tutorials/dal-explorus-blue-slot.png new file mode 100644 index 0000000000000000000000000000000000000000..464a9735fb3afeba54c9aeb4d1faff9c03772bdd GIT binary patch literal 10791 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 JQNDiTzW{M3T`>Rv literal 0 HcmV?d00001 From 7a90517e6fd05b3a54299ab8485c5388f52fac5e Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Mon, 12 Aug 2024 08:59:04 -0400 Subject: [PATCH 06/17] Update source command after Rust installation --- .../build-files-archive-with-dal/set-up-environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index f100d8fd2..b48e3a8dc 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -108,7 +108,7 @@ If you are using the Tezos Docker container, run `sudo apk add curl`. ``` 1. Follow the instructions in the Rust installation program. -For example, it may prompt you to run `source "$HOME/.cargo/env"` to configure your current terminal window to run Rust. +For example, it may prompt you to run `. "$HOME/.cargo/env"` to configure your current terminal window to run Rust. 1. Add WASM as a compilation target for Rust by running this command: From efb3aba5679ccc78bec81eb0a2110c50ddd9fee8 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Mon, 12 Aug 2024 13:12:29 -0400 Subject: [PATCH 07/17] Some tweaks --- .../build-files-archive-with-dal/get-dal-params.md | 8 +++----- .../build-files-archive-with-dal/get-slot-info.md | 10 ++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/get-dal-params.md b/docs/tutorials/build-files-archive-with-dal/get-dal-params.md index d6e042de9..088fa9c2f 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-dal-params.md +++ b/docs/tutorials/build-files-archive-with-dal/get-dal-params.md @@ -2,7 +2,7 @@ title: "Part 2: Getting the DAL parameters" authors: Tezos core developers, Tim McMackin last_update: - date: 24 July 2024 + date: 12 August 2024 --- The Data Availability Layer stores information about the available data in layer 1 blocks. @@ -111,8 +111,7 @@ Follow these steps to deploy the Smart Rollup to Ghostnet and start a node: 1. Run this command to deploy the Smart Rollup, replacing `my_wallet` with your account alias: ```bash - octez-client --endpoint http://127.0.0.1:8732 \ - originate smart rollup files_archive from my_wallet \ + octez-client originate smart rollup files_archive from my_wallet \ of kind wasm_2_0_0 of type unit with kernel "$(cat installer.hex)" \ --burn-cap 2.0 --force ``` @@ -174,8 +173,7 @@ cp target/wasm32-unknown-unknown/release/files_archive.wasm . smart-rollup-installer get-reveal-installer -P _rollup_node/wasm_2_0_0 \ -u files_archive.wasm -o installer.hex -octez-client --endpoint http://127.0.0.1:8732 \ - originate smart rollup files_archive from "${alias}" of kind wasm_2_0_0 \ +octez-client originate smart rollup files_archive from "${alias}" of kind wasm_2_0_0 \ of type unit with kernel "$(cat installer.hex)" --burn-cap 2.0 --force octez-smart-rollup-node --endpoint http://127.0.0.1:8732 \ diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index f7dc8312e..9878b530f 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -2,7 +2,7 @@ title: "Part 3: Getting slot information" authors: Tezos core developers, Tim McMackin last_update: - date: 30 July 2024 + date: 12 August2024 --- When clients send data to the DAL, they must choose which slot to put it in. @@ -137,8 +137,7 @@ Follow these steps to update the Smart Rollup to access information about slot 0 smart-rollup-installer get-reveal-installer -P _rollup_node/wasm_2_0_0 \ -u files_archive.wasm -o installer.hex - octez-client --endpoint http://127.0.0.1:8732 \ - originate smart rollup files_archive from my_wallet of kind wasm_2_0_0 \ + octez-client originate smart rollup files_archive from my_wallet of kind wasm_2_0_0 \ of type unit with kernel "$(cat installer.hex)" --burn-cap 2.0 --force octez-smart-rollup-node --endpoint http://127.0.0.1:8732 \ @@ -162,11 +161,10 @@ No attested slot at index 0 for level 7325506 See you in the next level ``` -For the first 4 Tezos blocks produced after the origination of the Smart Rollup, the kernel will report that no slot has been attested for the targeted level, _even if Explorus states the opposite_. +For the first 8 Tezos blocks produced after the origination of the Smart Rollup, the kernel will report that no slot has been attested for the targeted level, _even if Explorus states the opposite_. This is because, as of January, 2024, a Smart Rollup cannot fetch the content of a slot published before it is originated. -This is why you must wait for 4 blocks before seeing slot page contents being +This is why you must wait for 8 blocks before seeing slot page contents being logged. - Now that you can see the state of the slots, you can find an unused slot and publish data to it. When you are ready, continue to [Part 3: Publishing on the DAL](/tutorials/build-files-archive-with-dal/publishing-on-the-dal). From 9dcbb7ea4046fb2bcdd74e29e6d2c31ada1a98c4 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Thu, 22 Aug 2024 09:11:04 -0400 Subject: [PATCH 08/17] Typo --- docs/tutorials/build-files-archive-with-dal/get-slot-info.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index 9878b530f..9b6eb72ae 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -2,7 +2,7 @@ title: "Part 3: Getting slot information" authors: Tezos core developers, Tim McMackin last_update: - date: 12 August2024 + date: 12 August 2024 --- When clients send data to the DAL, they must choose which slot to put it in. From 381fa1db9de0e1ed2ec02cddb837348e3dc01350 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Thu, 29 Aug 2024 08:52:32 -0400 Subject: [PATCH 09/17] root-relative links --- docs/tutorials/build-files-archive-with-dal/get-slot-info.md | 2 +- .../build-files-archive-with-dal/publishing-on-the-dal.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index 9b6eb72ae..91821725e 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -125,7 +125,7 @@ Follow these steps to update the Smart Rollup to access information about slot 0 1. Run the commands to build and deploy the Smart Rollup and start the Smart Rollup node. - If you set up the deployment script as described in [Part 2: Getting the DAL parameters](./get-dal-params), you can run `./deploy_smart_rollup.sh my_wallet`. + If you set up the deployment script as described in [Part 2: Getting the DAL parameters](/tutorials/build-files-archive-with-dal/get-dal-params), you can run `./deploy_smart_rollup.sh my_wallet`. If not, run these commands: diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index f90b1e7c0..60a93b0df 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -128,7 +128,7 @@ If you don't see the message that the slot is attested and contains your data, t - If the slot turned red, it's possible that the attesters for the network are offline. In this case, your Smart Rollup cannot use the data on the DAL, but the blue slot in Explorus verifies that you published it successfully. Without active attesters, you cannot continue with this tutorial. -You can try running your own attester by getting tez from the faucet and running a baker as described in [Join the DAL as a baker, in 5 steps](../join-dal-baker). +You can try running your own attester by getting tez from the faucet and running a baker as described in [Join the DAL as a baker, in 5 steps](/tutorials/join-dal-baker). ## Publishing files From 4e37354ea152044b26e8352774a2d38b90e4e442 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 11:19:51 -0400 Subject: [PATCH 10/17] Updates to get it working --- docs/tutorials/build-files-archive-with-dal.md | 8 ++++---- .../set-up-environment.md | 11 ++++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal.md b/docs/tutorials/build-files-archive-with-dal.md index 3b9ea60ac..09630cc3e 100644 --- a/docs/tutorials/build-files-archive-with-dal.md +++ b/docs/tutorials/build-files-archive-with-dal.md @@ -2,13 +2,13 @@ title: Implement a file archive with the DAL and a Smart Rollup authors: Tezos Core Developers last_update: - date: 22 July 2024 + date: 10 September 2024 --- The Data Availability Layer (DAL) is a companion peer-to-peer network for the Tezos blockchain, designed to provide additional data bandwidth to Smart Rollups. It allows users to share large amounts of data in a way that is decentralized and permissionless, because anyone can join the network and post and read data on it. -This test uses the Ghostnet test network, but you can use the information in it to work with other test network or Tezos Mainnet. +This tutorial uses the Ghostnet test network, but you can use the information in it to work with other test networks or Tezos Mainnet. In this tutorial, you set up a file archive that stores and retrieves files with the DAL. You will learn: @@ -34,7 +34,7 @@ In this tutorial, you set up these components: - A Smart Rollup node that runs your Smart Rollup For simplicity, you do not set up a baker, which is responsible for verifying and attesting that the data is available before Smart Rollups can access it. -For instructions on running a layer 1 node and baker with the DAL, see the tutorial [Join the DAL as a baker, in 5 steps](./join-dal-baker). +For instructions on running a layer 1 node and baker with the DAL, see the tutorial [Join the DAL as a baker, in 5 steps](/tutorials/join-dal-baker). ## Tutorial diagram @@ -89,7 +89,7 @@ The DAL works like this: For example, if a certificate is included in level 100 and the attestation lag is 4, bakers must attest that the data is available in level 104, along with their usual attestations that build on level 103. If enough shards are attested in that level, the data becomes available to Smart Rollups at the end of layer 104. - If not enough shards are attested in that level, the certificate is considered bogus and the related data is dropped. + If not enough shards are attested in that level, the certificate is considered bogus, the related data is dropped, and Smart Rollups cannot access it. 1. The Smart Rollup node monitors the blocks and when it sees attested DAL data, it connects to a DAL node to request the data. Smart Rollups must store the data if they need it because it is available on the DAL for only a short time. diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index b48e3a8dc..3d64188a9 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -2,7 +2,7 @@ title: "Part 1: Setting up an environment" authors: Tim McMackin last_update: - date: 23 July 2024 + date: 10 September 2024 --- These steps cover how to set up a development environment to work with Smart Rollups and the DAL. @@ -44,6 +44,12 @@ To set up an environment and account in a Docker container, follow these steps: octez-node config init --network ghostnet ``` + If you see an error that says that the node has a pre-existing configuration file, update the existing configuration file by running this command: + + ```bash + octez-node config update --network ghostnet + ``` + 1. Download a snapshot of Ghostnet from https://snapshot.tzinit.org based on the instructions on that site. For example, the command to download the snapshot may look like this: @@ -75,6 +81,9 @@ To get the name of the Docker container, run the `docker ps` command. This command uses the default port for the node, but you can change it if you are running the node somewhere else. + If you get an error that says "Failed to acquire the protocol version from the node," the node is not ready yet. + Wait a few minutes for the node to be ready, run `rm -rf /home/tezos/.tezos-client/config` to remove the configuration file, and try the `config init` command again. + 1. Optional: Hide the network warning message by running this command: ```bash From 4b55b7656bdf73011fded44979a3cd20bdc993c6 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 11:20:08 -0400 Subject: [PATCH 11/17] Doesn't compile with Rust 1.81 --- .../build-files-archive-with-dal/set-up-environment.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index 3d64188a9..8d64dc273 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -119,6 +119,12 @@ If you are using the Tezos Docker container, run `sudo apk add curl`. 1. Follow the instructions in the Rust installation program. For example, it may prompt you to run `. "$HOME/.cargo/env"` to configure your current terminal window to run Rust. +1. Set the version of Rust to 1.80 by running this command: + + ```bash + rustup set override 1.80 + ``` + 1. Add WASM as a compilation target for Rust by running this command: ```bash From 259a81ce8ac0753f30f0101b2eed42c896d5ceac Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 12:30:57 -0400 Subject: [PATCH 12/17] Install trusted setup --- .../get-slot-info.md | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index 91821725e..5a6addbc2 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -2,7 +2,7 @@ title: "Part 3: Getting slot information" authors: Tezos core developers, Tim McMackin last_update: - date: 12 August 2024 + date: 11 September 2024 --- When clients send data to the DAL, they must choose which slot to put it in. @@ -23,14 +23,32 @@ Similarly, the protocol assigns bakers to monitor certain slots. ## Starting a DAL node -To run a DAL node, use the Octez `octez-dal-node` command and pass the slots to monitor in the `--observer-profiles` argument. +To run a DAL node, you must configure a set of cryptographic parameters for it and the use the Octez `octez-dal-node` command and pass the slots to monitor in the `--observer-profiles` argument: -In a new terminal window in the Docker container, run this command to start a DAL node and monitor slot 0: +1. In a new terminal window in the Docker container, run this command to download the trusted setup scripts: -```bash -octez-dal-node run --endpoint http://127.0.0.1:8732 \ - --observer-profiles=0 --data-dir _dal_node -``` + ```bash + wget https://gitlab.com/tezos/tezos/-/raw/master/scripts/install_dal_trusted_setup.sh https://gitlab.com/tezos/tezos/-/raw/master/scripts/version.sh + ``` + +1. Run this command to make the scripts executable: + + ```bash + chmod +x install_dal_trusted_setup.sh version.sh + ``` + +1. Run this command to install the trusted setup: + + ```bash + ./install_dal_trusted_setup.sh --legacy + ``` + +1. Run this command to start a DAL node and monitor slot 0: + + ```bash + octez-dal-node run --endpoint http://127.0.0.1:8732 \ + --observer-profiles=0 --data-dir _dal_node + ``` Leave this process running in the terminal window. From c87dfefdd05c6041352c7d1c3079211d5840c73d Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 12:46:41 -0400 Subject: [PATCH 13/17] Correct override command --- .../build-files-archive-with-dal/set-up-environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md index 8d64dc273..c43645a8b 100644 --- a/docs/tutorials/build-files-archive-with-dal/set-up-environment.md +++ b/docs/tutorials/build-files-archive-with-dal/set-up-environment.md @@ -122,7 +122,7 @@ For example, it may prompt you to run `. "$HOME/.cargo/env"` to configure your c 1. Set the version of Rust to 1.80 by running this command: ```bash - rustup set override 1.80 + rustup override set 1.80 ``` 1. Add WASM as a compilation target for Rust by running this command: From 1ecfdab903a64219acda3cd1ac3bf53c0de334a3 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 13:22:46 -0400 Subject: [PATCH 14/17] correct URL --- .../build-files-archive-with-dal/publishing-on-the-dal.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index 60a93b0df..871e7852d 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -2,7 +2,7 @@ title: "Part 3: Publishing on the DAL" authors: Tezos core developers, Tim McMackin last_update: - date: 30 July 2024 + date: 11 September 2024 --- Now that you can get information about the DAL, the next step is to publish data to it and verify that the kernel can access it. @@ -48,7 +48,7 @@ The DAL node provides an RPC endpoint for clients to send data to be added to a 1. Run this command to publish a message to the DAL: ```bash - curl localhost:10732/slots --data '"Hello, world!"' -H 'Content-Type: application/json' + curl localhost:10732/slot --data '"Hello, world!"' -H 'Content-Type: application/json' ``` Note that the value of the message is in double quotes because it must be a valid JSON string, as hinted by the `Content-Type` header. From 7f38b9c481af938d4378681ae7c32d3b9583c2df Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 13:46:32 -0400 Subject: [PATCH 15/17] Bakers do the attesting --- .../build-files-archive-with-dal/publishing-on-the-dal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index 871e7852d..c84e17bc4 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -90,7 +90,7 @@ The slot that you published the message to turns blue, as in this picture: The blue slot means that data was published to the slot but has not been attested yet. - After 8 blocks, the slot turns green if DAL nodes attested to the availability of the data or red if they did not. + After 8 blocks, the slot turns green if bakers attested to the availability of the data or red if they did not. If the slot turns green, you should see a message in the kernel log that looks like this: From bf7d48f93fde529436d9fd28f3499cbd7555f9a3 Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 11 Sep 2024 13:55:26 -0400 Subject: [PATCH 16/17] Correct step numbering --- docs/tutorials/build-files-archive-with-dal/get-slot-info.md | 2 +- .../build-files-archive-with-dal/publishing-on-the-dal.md | 4 ++-- .../tutorials/build-files-archive-with-dal/using-full-slot.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index 5a6addbc2..134598f36 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -185,4 +185,4 @@ This is why you must wait for 8 blocks before seeing slot page contents being logged. Now that you can see the state of the slots, you can find an unused slot and publish data to it. -When you are ready, continue to [Part 3: Publishing on the DAL](/tutorials/build-files-archive-with-dal/publishing-on-the-dal). +When you are ready, continue to [Part 4: Publishing on the DAL](/tutorials/build-files-archive-with-dal/publishing-on-the-dal). diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index c84e17bc4..075e8cb9d 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -1,5 +1,5 @@ --- -title: "Part 3: Publishing on the DAL" +title: "Part 4: Publishing on the DAL" authors: Tezos core developers, Tim McMackin last_update: date: 11 September 2024 @@ -192,4 +192,4 @@ If you are using the Tezos Docker image, you can run `sudo apk add jq xxd`. Now you can publish data to the DAL and use it in a Smart Rollup. In the next section, you write to and retrieve the entire slot. -When you are ready, go to [Part 4: Using the entire slot](/tutorials/build-files-archive-with-dal/using-full-slot). +When you are ready, go to [Part 5: Using the entire slot](/tutorials/build-files-archive-with-dal/using-full-slot). diff --git a/docs/tutorials/build-files-archive-with-dal/using-full-slot.md b/docs/tutorials/build-files-archive-with-dal/using-full-slot.md index 8b057cf85..2b00a4855 100644 --- a/docs/tutorials/build-files-archive-with-dal/using-full-slot.md +++ b/docs/tutorials/build-files-archive-with-dal/using-full-slot.md @@ -1,5 +1,5 @@ --- -title: "Part 4: Using the entire slot" +title: "Part 5: Using the entire slot" authors: Tezos core developers, Tim McMackin last_update: date: 30 July 2024 From 76978e9f376811d193676af5b8313b3ef2f9041f Mon Sep 17 00:00:00 2001 From: Tim McMackin Date: Wed, 27 Nov 2024 15:01:20 -0500 Subject: [PATCH 17/17] Clarify variables --- docs/tutorials/build-files-archive-with-dal/get-dal-params.md | 2 +- docs/tutorials/build-files-archive-with-dal/get-slot-info.md | 4 ++-- .../build-files-archive-with-dal/publishing-on-the-dal.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/build-files-archive-with-dal/get-dal-params.md b/docs/tutorials/build-files-archive-with-dal/get-dal-params.md index 088fa9c2f..87730f0ac 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-dal-params.md +++ b/docs/tutorials/build-files-archive-with-dal/get-dal-params.md @@ -108,7 +108,7 @@ Now the Smart Rollup is ready to deploy. Follow these steps to deploy the Smart Rollup to Ghostnet and start a node: -1. Run this command to deploy the Smart Rollup, replacing `my_wallet` with your account alias: +1. Run this command to deploy the Smart Rollup, replacing `my_wallet` with your Octez client account alias: ```bash octez-client originate smart rollup files_archive from my_wallet \ diff --git a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md index 134598f36..9bba86739 100644 --- a/docs/tutorials/build-files-archive-with-dal/get-slot-info.md +++ b/docs/tutorials/build-files-archive-with-dal/get-slot-info.md @@ -143,9 +143,9 @@ Follow these steps to update the Smart Rollup to access information about slot 0 1. Run the commands to build and deploy the Smart Rollup and start the Smart Rollup node. - If you set up the deployment script as described in [Part 2: Getting the DAL parameters](/tutorials/build-files-archive-with-dal/get-dal-params), you can run `./deploy_smart_rollup.sh my_wallet`. + If you set up the deployment script as described in [Part 2: Getting the DAL parameters](/tutorials/build-files-archive-with-dal/get-dal-params), you can run `./deploy_smart_rollup.sh my_wallet`, where `my_wallet` is the Octez client alias of your address. - If not, run these commands: + If not, run these commands, where `my_wallet` is the Octez client alias of your address: ```bash rm -rf _rollup_node diff --git a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md index 075e8cb9d..c510f394f 100644 --- a/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md +++ b/docs/tutorials/build-files-archive-with-dal/publishing-on-the-dal.md @@ -64,7 +64,7 @@ The DAL node provides an RPC endpoint for clients to send data to be added to a } ``` -1. Using the values of the commitment and proof from the previous command, post the certificate to layer 1 with this command, being sure to set the slot number that you are using: +1. Using the values of the commitment and proof from the previous command, post the certificate to layer 1 with this command, being sure to set the slot number that you are using and replacing `my_wallet` with your Octez client alias of your address: ```bash commitment="sh1u3tr3YKPDYUp2wWKCfmV5KZb82FREhv8GtDeR3EJccsBerWGwJYKufsDNH8rk4XqGrXdooZ"