# Get Started With Casper (v1.3.2) ## Hackathon: The Friendly Hackathon: Start Building on Casper! ### Task 1: Create and deploy a simple, smart contract with cargo casper and cargo test - In a new VM install Rust: `# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` Customize it so it installs the nightly builds. Configure current shell running: `# source $HOME/.cargo/env` Check it works: `# rustup --version` `rustup 1.24.3 (ce5817a94 2021-05-31) info: This is the version for the rustup toolchain manager, not the rustc compiler. info: The currently active `rustc` version is rustc 1.57.0-nightly (9bb77da74 2021-09-13)` - Install cmake: `# snap install cmake --classic` `# cmake --version` `cmake version 3.21.2` `# apt install gcc` - Install Casper crates: `# cargo install cargo-casper --version 1.3.2` - Create a new project `# cd` `# cargo casper casper-simple-contract` `# cd casper-simple-contract` - Compile `# cd contract` `# rustup install $(cat rust-toolchain)` `# rustup target add --toolchain $(cat rust-toolchain) wasm32-unknown-unknown` ![](https://i.imgur.com/q85lPK0.png) - Edit Cargo.toml and add `cargo-features = ["edition2021"]`to the top of the file. Then, build: `# cargo build --release` ![](https://i.imgur.com/aLdxFE2.png) As a result we get a `contract.wasm` file: `# ls target/wasm32-unknown-unknown/release/` ![](https://i.imgur.com/IJjrHYN.png) - Test the contract `# cd ../tests` `# cargo test` ![](https://i.imgur.com/B9uDPBO.png) apt -y install libssl-dev apt -y install libssl-dev cd git clone https://github.com/rust-lang/cargo cd cargo cargo build --release ### Task 2: Complete tutorial "A Counter Contract Tutorial" - Install `casper-client`: `# rustup toolchain install nightly-2021-06-17` `# cargo +nightly-2021-06-17 install casper-client --locked` `# cargo install casper-client --locked` - View the network state -- Show the faucet account `# nctl-view-faucet-account` ![](https://i.imgur.com/l4fht2T.png) -- Get the state-root-hash `casper-client get-state-root-hash --node-address http://localhost:11101/` ![](https://i.imgur.com/Vs95Wna.png) -- Get the network state `casper-client query-state --node-address http://localhost:11101 --state-root-hash 63bc64d967aee7ef0c1285a1630bd51a2893932b017d43acbf0c7d383f50f84a --key account-hash-0607801997fa7806ed66aa9d860900eb44a3fca894780f1d552a560debf3e779` ![](https://i.imgur.com/Df8r6au.png) - Download the contract ` git clone https://github.com/casper-ecosystem/counter` - Build the contract `# cd counter` `# make prepare` `# make test` - Deploy the contract `casper-client put-deploy --node-address http://localhost:11101 --chain-name casper-net-1 --secret-key /home/dhernando/nctl/casper-node/utils/nctl/assets/net-1/faucet/secret_key.pem --payment-amount 5000000000000 --session-path ./target/wasm32-unknown-unknown/release/counter-define.wasm` ![](https://i.imgur.com/zvi9RS1.png) - Verify the deploy was successful `casper-client get-deploy --node-address http://localhost:11101 f98095d093eba1e3dcf7f4a1663c5e77b5dbd620e5f6be1ab5aa97d364294910` - Now get new state-root-hash `casper-client get-state-root-hash --node-address http://localhost:11101` ![](https://i.imgur.com/q6sqCjJ.png) - Get the updated newtork state `casper-client query-state --node-address http://localhost:11101 --state-root-hash 63bc64d967aee7ef0c1285a1630bd51a2893932b017d43acbf0c7d383f50f84a --key account-hash-0607801997fa7806ed66aa9d860900eb44a3fca894780f1d552a560debf3e779` - Retrieve the counter `casper-client query-state --node-address http://localhost:11101 --state-root-hash 531a16e6e012c669e03ad18c7fa2a1207675fc3993ff2e508641b00d7313dc78 --key account-hash-0607801997fa7806ed66aa9d860900eb44a3fca894780f1d552a560debf3e779 -q "counter/count"` ![](https://i.imgur.com/2wmPhbC.png) - Now increment the counter `casper-client put-deploy --node-address http://localhost:11101 --chain-name casper-net-1 --secret-key /home/dhernando/nctl/casper-node/utils/nctl/assets/net-1/faucet/secret_key.pem --payment-amount 5000000000000 --session-name "counter" --session-entry-point "counter_inc"` - And check the counter again with the new state-root-hash `casper-client query-state --node-address http://localhost:11101 --state-root-hash fa8a6a9c2579fd88f20b8cc19b2752f48a2d40af5aff14b14cbf5918955da038 --key account-hash-0607801997fa7806ed66aa9d860900eb44a3fca894780f1d552a560debf3e779 -q "counter/count"` ![](https://i.imgur.com/KM0dAjJ.png) - Increment the counter deploying the counter-call contract `casper-client put-deploy --node-address http://localhost:11101 --chain-name casper-net-1 --secret-key /home/dhernando/nctl/casper-node/utils/nctl/assets/net-1/faucet/secret_key.pem --payment-amount 5000000000000 --session-path ./target/wasm32-unknown-unknown/release/counter-call.wasm` - And check the counter again with the new state-root-hash `casper-client query-state --node-address http://localhost:11101 --state-root-hash ab0e95f4dd0387b7fac82bf6fe5b7f019b29490bd6c16a4338a257e10b1cbc95 --key account-hash-0607801997fa7806ed66aa9d860900eb44a3fca894780f1d552a560debf3e779 -q "counter/count"` ![](https://i.imgur.com/aV8x4M9.png) HOORAY! ### Task 3: Key management activity - Download the key management contract and build it `git clone https://github.com/casper-ecosystem/keys-manager` `cd keys-manager` `cd contract` `cargo build --release` - Set up the client `cd ../client` `touch .env` `nano .env` Edit like this: ``` BASE_KEY_PATH=/home/dhernando/nctl/casper-node/utils/nctl/assets/net-1/faucet/ NODE_URL=http://localhost:11101/rpc ``` And run: `npm install` - Test the client `npm run start:atomic` [Output here](https://hackmd.io/@K48d9TN9T2q7ERX4H27ysw/rkgHSmzmF) - **Now, I'll adapt the client example to implement the scenario 3: signing transactions with multiple keys** -- Create a new js file called `scenario-3.js` in the source folder. Add [this code](https://hackmd.io/@K48d9TN9T2q7ERX4H27ysw/ryWjoXfXY) -- Modify the package.json to add a new script task and run it with `npm run start:scn3` -- At step 2 the output shows that one single key can sign a transfer funds deploy action. ![](https://i.imgur.com/Jrv2bzY.png) -- At step 3 a transfer funds action is shown with just one signer (approval). ![](https://i.imgur.com/hvUt82R.png) -- At step 4 the output shows two keys are signing a key management task like adding a new key to the account. ![](https://i.imgur.com/XOgFYcf.png) -- [Full output here](https://hackmd.io/@K48d9TN9T2q7ERX4H27ysw/ryWjoXfXY) ### Task 4: Learn to transfer tokens from one account to another - Create an ccount `cd myaccount` `casper-client keygen .` - Fund the account in CSPR.live ![](https://i.imgur.com/nz3te14.png) - Create a target account `Public key: 0111bc2070a9af0f26f94b8549bffa5643ead0bc68eba3b1833039cfa2a9a8205d` - Get the IP address of a testnet peer `164.90.198.193:35000` - Transfer some motes `casper-client transfer --id 1 --transfer-id 123456789012345 --node-address http://164.90.198.193:7777 --amount 15000000000 --secret-key /home/dhernando/casper/myaccount/secret_key.pem --chain-name casper-test --target-account 0111bc2070a9af0f26f94b8549bffa5643ead0bc68eba3b1833039cfa2a9a8205d --payment-amount 1000 ` ![](https://i.imgur.com/Vt2H8y6.png) ### Task 5: Learn to delegate and undelegate on the testnet - Delegate stake from 'myaccount' to a validator following the instructions. ![](https://i.imgur.com/J9DMxvD.png) Delegated amount is shown in the account summary: ![](https://i.imgur.com/PNb8B9u.png) - Now undelegate stake ![](https://i.imgur.com/yYgIsn5.png)