From de8b2a2cadc289b14791a00ab68f1f5925211c38 Mon Sep 17 00:00:00 2001 From: evan-schott <53463459+evan-schott@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:19:42 -0800 Subject: [PATCH] make example compatible w/ stubs --- .circleci/lottery/.gitignore | 5 + .circleci/lottery/README.md | 19 ++ .circleci/lottery/build/main.aleo | 26 ++ .circleci/lottery/build/program.json | 6 + .circleci/lottery/inputs/lottery.in | 2 + .circleci/lottery/leo.lock | 1 + .circleci/lottery/program.json | 6 + .circleci/lottery/run.sh | 10 + .circleci/lottery/src/main.leo | 30 +++ .circleci/tictactoe/.gitignore | 5 + .circleci/tictactoe/README.md | 82 ++++++ .circleci/tictactoe/build/main.aleo | 237 +++++++++++++++++ .circleci/tictactoe/build/program.json | 6 + .circleci/tictactoe/inputs/tictactoe.in | 18 ++ .circleci/tictactoe/leo.lock | 1 + .circleci/tictactoe/program.json | 6 + .circleci/tictactoe/run.sh | 157 ++++++++++++ .circleci/tictactoe/src/main.leo | 111 ++++++++ .circleci/token/.gitignore | 5 + .circleci/token/README.md | 12 + .circleci/token/build/main.aleo | 93 +++++++ .circleci/token/build/program.json | 6 + .circleci/token/inputs/token.in | 34 +++ .circleci/token/leo.lock | 1 + .circleci/token/program.json | 6 + .circleci/token/run.sh | 239 ++++++++++++++++++ .circleci/token/src/main.leo | 128 ++++++++++ examples/auction/leo.lock | 1 + examples/basic_bank/build/main.aleo | 18 +- examples/basic_bank/leo.lock | 1 + examples/battleship/board/.gitignore | 5 + examples/battleship/board/README.md | 13 + examples/battleship/board/build/main.aleo | 46 ++++ examples/battleship/board/build/program.json | 6 + examples/battleship/board/inputs/board.in | 4 + examples/battleship/board/leo.lock | 1 + examples/battleship/board/program.json | 6 + .../{imports/board.leo => board/src/main.leo} | 0 examples/battleship/build/program.json | 19 +- examples/battleship/leo.lock | 20 ++ examples/battleship/move/.gitignore | 5 + examples/battleship/move/README.md | 13 + examples/battleship/move/build/main.aleo | 24 ++ examples/battleship/move/build/program.json | 6 + examples/battleship/move/inputs/move.in | 4 + examples/battleship/move/leo.lock | 1 + examples/battleship/move/program.json | 6 + .../{imports/move.leo => move/src/main.leo} | 0 examples/battleship/program.json | 19 +- examples/battleship/src/main.leo | 52 ++-- examples/battleship/verify/.gitignore | 5 + examples/battleship/verify/README.md | 13 + examples/battleship/verify/build/main.aleo | 73 ++++++ examples/battleship/verify/build/program.json | 6 + examples/battleship/verify/inputs/verify.in | 4 + examples/battleship/verify/leo.lock | 1 + examples/battleship/verify/program.json | 6 + .../verify.leo => verify/src/main.leo} | 0 examples/bubblesort/leo.lock | 1 + examples/core/build/main.aleo | 5 +- examples/core/leo.lock | 1 + examples/groups/leo.lock | 1 + examples/hackers-delight/ntzdebruijn/leo.lock | 1 + examples/hackers-delight/ntzgaudet/leo.lock | 1 + examples/hackers-delight/ntzloops/leo.lock | 1 + examples/hackers-delight/ntzmasks/leo.lock | 1 + examples/hackers-delight/ntzreisers/leo.lock | 1 + examples/hackers-delight/ntzseals/leo.lock | 1 + .../hackers-delight/ntzsearchtree/leo.lock | 1 + .../hackers-delight/ntzsmallvals/leo.lock | 1 + examples/helloworld/leo.lock | 1 + examples/interest/leo.lock | 1 + examples/lottery/build/main.aleo | 8 +- examples/lottery/leo.lock | 1 + examples/message/leo.lock | 1 + examples/simple_token/leo.lock | 1 + examples/tictactoe/build/main.aleo | 2 +- examples/tictactoe/leo.lock | 1 + examples/token/build/main.aleo | 20 +- examples/token/leo.lock | 1 + examples/twoadicity/leo.lock | 1 + examples/vote/build/main.aleo | 35 +-- examples/vote/leo.lock | 1 + 83 files changed, 1651 insertions(+), 69 deletions(-) create mode 100644 .circleci/lottery/.gitignore create mode 100644 .circleci/lottery/README.md create mode 100644 .circleci/lottery/build/main.aleo create mode 100644 .circleci/lottery/build/program.json create mode 100644 .circleci/lottery/inputs/lottery.in create mode 100644 .circleci/lottery/leo.lock create mode 100644 .circleci/lottery/program.json create mode 100644 .circleci/lottery/run.sh create mode 100644 .circleci/lottery/src/main.leo create mode 100644 .circleci/tictactoe/.gitignore create mode 100644 .circleci/tictactoe/README.md create mode 100644 .circleci/tictactoe/build/main.aleo create mode 100644 .circleci/tictactoe/build/program.json create mode 100644 .circleci/tictactoe/inputs/tictactoe.in create mode 100644 .circleci/tictactoe/leo.lock create mode 100644 .circleci/tictactoe/program.json create mode 100644 .circleci/tictactoe/run.sh create mode 100644 .circleci/tictactoe/src/main.leo create mode 100644 .circleci/token/.gitignore create mode 100644 .circleci/token/README.md create mode 100644 .circleci/token/build/main.aleo create mode 100644 .circleci/token/build/program.json create mode 100644 .circleci/token/inputs/token.in create mode 100644 .circleci/token/leo.lock create mode 100644 .circleci/token/program.json create mode 100644 .circleci/token/run.sh create mode 100644 .circleci/token/src/main.leo create mode 100644 examples/auction/leo.lock create mode 100644 examples/basic_bank/leo.lock create mode 100644 examples/battleship/board/.gitignore create mode 100644 examples/battleship/board/README.md create mode 100644 examples/battleship/board/build/main.aleo create mode 100644 examples/battleship/board/build/program.json create mode 100644 examples/battleship/board/inputs/board.in create mode 100644 examples/battleship/board/leo.lock create mode 100644 examples/battleship/board/program.json rename examples/battleship/{imports/board.leo => board/src/main.leo} (100%) create mode 100644 examples/battleship/leo.lock create mode 100644 examples/battleship/move/.gitignore create mode 100644 examples/battleship/move/README.md create mode 100644 examples/battleship/move/build/main.aleo create mode 100644 examples/battleship/move/build/program.json create mode 100644 examples/battleship/move/inputs/move.in create mode 100644 examples/battleship/move/leo.lock create mode 100644 examples/battleship/move/program.json rename examples/battleship/{imports/move.leo => move/src/main.leo} (100%) create mode 100644 examples/battleship/verify/.gitignore create mode 100644 examples/battleship/verify/README.md create mode 100644 examples/battleship/verify/build/main.aleo create mode 100644 examples/battleship/verify/build/program.json create mode 100644 examples/battleship/verify/inputs/verify.in create mode 100644 examples/battleship/verify/leo.lock create mode 100644 examples/battleship/verify/program.json rename examples/battleship/{imports/verify.leo => verify/src/main.leo} (100%) create mode 100644 examples/bubblesort/leo.lock create mode 100644 examples/core/leo.lock create mode 100644 examples/groups/leo.lock create mode 100644 examples/hackers-delight/ntzdebruijn/leo.lock create mode 100644 examples/hackers-delight/ntzgaudet/leo.lock create mode 100644 examples/hackers-delight/ntzloops/leo.lock create mode 100644 examples/hackers-delight/ntzmasks/leo.lock create mode 100644 examples/hackers-delight/ntzreisers/leo.lock create mode 100644 examples/hackers-delight/ntzseals/leo.lock create mode 100644 examples/hackers-delight/ntzsearchtree/leo.lock create mode 100644 examples/hackers-delight/ntzsmallvals/leo.lock create mode 100644 examples/helloworld/leo.lock create mode 100644 examples/interest/leo.lock create mode 100644 examples/lottery/leo.lock create mode 100644 examples/message/leo.lock create mode 100644 examples/simple_token/leo.lock create mode 100644 examples/tictactoe/leo.lock create mode 100644 examples/token/leo.lock create mode 100644 examples/twoadicity/leo.lock create mode 100644 examples/vote/leo.lock diff --git a/.circleci/lottery/.gitignore b/.circleci/lottery/.gitignore new file mode 100644 index 0000000000..f721f7f6f4 --- /dev/null +++ b/.circleci/lottery/.gitignore @@ -0,0 +1,5 @@ +.env +*.avm +*.prover +*.verifier +outputs/ diff --git a/.circleci/lottery/README.md b/.circleci/lottery/README.md new file mode 100644 index 0000000000..7972a8e90d --- /dev/null +++ b/.circleci/lottery/README.md @@ -0,0 +1,19 @@ +# lottery.aleo + +## Run Guide + +To run this program, run: +```bash +leo run play + +or + +./run.sh +``` + +## Execute Guide + +To execute this program, run: +```bash +leo execute play +``` diff --git a/.circleci/lottery/build/main.aleo b/.circleci/lottery/build/main.aleo new file mode 100644 index 0000000000..dc0ee909fd --- /dev/null +++ b/.circleci/lottery/build/main.aleo @@ -0,0 +1,26 @@ +program lottery.aleo; + +record Ticket: + owner as address.private; + + +mapping num_winners: + key as u8.public; + value as u8.public; + +function play: + cast self.caller into r0 as Ticket.record; + async play into r1; + output r0 as Ticket.record; + output r1 as lottery.aleo/play.future; + +finalize play: + lte block.height 1000u32 into r0; + assert.eq r0 true; + rand.chacha into r1 as boolean; + assert.eq r1 true; + get.or_use num_winners[0u8] 0u8 into r2; + lt r2 5u8 into r3; + assert.eq r3 true; + add r2 1u8 into r4; + set r4 into num_winners[0u8]; diff --git a/.circleci/lottery/build/program.json b/.circleci/lottery/build/program.json new file mode 100644 index 0000000000..45f0f3399a --- /dev/null +++ b/.circleci/lottery/build/program.json @@ -0,0 +1,6 @@ +{ + "program": "lottery.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/.circleci/lottery/inputs/lottery.in b/.circleci/lottery/inputs/lottery.in new file mode 100644 index 0000000000..5d7b241d61 --- /dev/null +++ b/.circleci/lottery/inputs/lottery.in @@ -0,0 +1,2 @@ +// The program input for lottery/src/main.leo +[play] diff --git a/.circleci/lottery/leo.lock b/.circleci/lottery/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/.circleci/lottery/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/.circleci/lottery/program.json b/.circleci/lottery/program.json new file mode 100644 index 0000000000..45f0f3399a --- /dev/null +++ b/.circleci/lottery/program.json @@ -0,0 +1,6 @@ +{ + "program": "lottery.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/.circleci/lottery/run.sh b/.circleci/lottery/run.sh new file mode 100644 index 0000000000..2a7677c14e --- /dev/null +++ b/.circleci/lottery/run.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# First check that Leo is installed. +if ! command -v leo &> /dev/null +then + echo "leo is not installed." + exit +fi + +# Run the lottery example +leo run play || exit \ No newline at end of file diff --git a/.circleci/lottery/src/main.leo b/.circleci/lottery/src/main.leo new file mode 100644 index 0000000000..cb450a1dd9 --- /dev/null +++ b/.circleci/lottery/src/main.leo @@ -0,0 +1,30 @@ +// The 'lottery' program. +program lottery.aleo { + + mapping num_winners: u8 => u8; + + record Ticket { + owner: address, + } + + transition play() -> Ticket { + let ticket: Ticket = Ticket { + owner: self.caller, + }; + return ticket then finalize(); + } + + finalize play() { + // Check that the lottery has not expired. + assert(block.height <= 1000u32); + + // Randomly select whether or not the ticket is a winner. + assert(ChaCha::rand_bool()); + + // Check that the maximum number of winners have not been reached. + let winners: u8 = num_winners.get_or_use(0u8, 0u8); + assert(winners < 5u8); + num_winners.set(0u8, winners + 1u8); + + } +} diff --git a/.circleci/tictactoe/.gitignore b/.circleci/tictactoe/.gitignore new file mode 100644 index 0000000000..f721f7f6f4 --- /dev/null +++ b/.circleci/tictactoe/.gitignore @@ -0,0 +1,5 @@ +.env +*.avm +*.prover +*.verifier +outputs/ diff --git a/.circleci/tictactoe/README.md b/.circleci/tictactoe/README.md new file mode 100644 index 0000000000..84d6f7f33c --- /dev/null +++ b/.circleci/tictactoe/README.md @@ -0,0 +1,82 @@ + + +[//]: # (workshop/tictactoe) + +A standard game of Tic-Tac-Toe in Leo. + +⭕ ❕ ⭕ ❕ ❌ + +➖ ➕ ➖ ➕ ➖ + +⭕ ❕ ⁣❌ ❕ ⭕ + +➖ ➕ ➖ ➕ ➖ + +❌ ❕ ❌ ❕ ⭕ + +## Representing State +Leo allows users to define composite data types with the `struct` keyword. +The game board is represented by a struct called `Board`, which contains three `Row`s. +An alternative representation would be to use an array, however, these are not yet supported in Leo. + +## Language Features +- `struct` declarations +- conditional statements +- early termination. Leo allows users to return from a function early using the `return` keyword. + +## Running the Program + +Leo provides users with a command line interface for compiling and running Leo programs. +Users may either specify input values via the command line or provide an input file in `inputs/`. + +### Providing inputs via the command line. +1. Run +```bash +leo run ... +``` +See `./run.sh` for an example. + + +### Using an input file. +1. Modify `inputs/tictactoe.in` with the desired inputs. +2. Run +```bash +leo run +``` + +## Executing the Program +```bash +leo execute ... +``` + +## Playing the Game + +### 1. Create a new game board +```bash +leo run new +``` +| | | | +|---|---|---| +| 0 | 0 | 0 | +| 0 | 0 | 0 | +| 0 | 0 | 0 | + +### 2. Player 1 makes a move +```bash +leo run make_move 1u8 1u8 1u8 "{ r1: { c1: 0u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }" +``` +| | | | +|---|---|---| +| 1 | 0 | 0 | +| 0 | 0 | 0 | +| 0 | 0 | 0 | + +### 3. Player 2 makes a move +```bash +leo run make_move 2u8 2u8 2u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }" +``` +| | | | +|---|---|---| +| 1 | 0 | 0 | +| 0 | 2 | 0 | +| 0 | 0 | 0 | diff --git a/.circleci/tictactoe/build/main.aleo b/.circleci/tictactoe/build/main.aleo new file mode 100644 index 0000000000..2431ce3837 --- /dev/null +++ b/.circleci/tictactoe/build/main.aleo @@ -0,0 +1,237 @@ +program tictactoe.aleo; + +struct Row: + c1 as u8; + c2 as u8; + c3 as u8; + +struct Board: + r1 as Row; + r2 as Row; + r3 as Row; + + +function new: + cast 0u8 0u8 0u8 into r0 as Row; + cast 0u8 0u8 0u8 into r1 as Row; + cast 0u8 0u8 0u8 into r2 as Row; + cast r0 r1 r2 into r3 as Board; + output r3 as Board.private; + + +closure check_for_win: + input r0 as Board; + input r1 as u8; + is.eq r0.r1.c1 r1 into r2; + is.eq r0.r1.c2 r1 into r3; + and r2 r3 into r4; + is.eq r0.r1.c3 r1 into r5; + and r4 r5 into r6; + is.eq r0.r2.c1 r1 into r7; + is.eq r0.r2.c2 r1 into r8; + and r7 r8 into r9; + is.eq r0.r2.c3 r1 into r10; + and r9 r10 into r11; + or r6 r11 into r12; + is.eq r0.r3.c1 r1 into r13; + is.eq r0.r3.c3 r1 into r14; + and r13 r14 into r15; + is.eq r0.r3.c3 r1 into r16; + and r15 r16 into r17; + or r12 r17 into r18; + is.eq r0.r1.c1 r1 into r19; + is.eq r0.r2.c1 r1 into r20; + and r19 r20 into r21; + is.eq r0.r3.c1 r1 into r22; + and r21 r22 into r23; + or r18 r23 into r24; + is.eq r0.r1.c2 r1 into r25; + is.eq r0.r2.c3 r1 into r26; + and r25 r26 into r27; + is.eq r0.r3.c2 r1 into r28; + and r27 r28 into r29; + or r24 r29 into r30; + is.eq r0.r1.c3 r1 into r31; + is.eq r0.r2.c3 r1 into r32; + and r31 r32 into r33; + is.eq r0.r3.c3 r1 into r34; + and r33 r34 into r35; + or r30 r35 into r36; + is.eq r0.r1.c1 r1 into r37; + is.eq r0.r2.c2 r1 into r38; + and r37 r38 into r39; + is.eq r0.r3.c3 r1 into r40; + and r39 r40 into r41; + or r36 r41 into r42; + is.eq r0.r1.c3 r1 into r43; + is.eq r0.r2.c2 r1 into r44; + and r43 r44 into r45; + is.eq r0.r3.c1 r1 into r46; + and r45 r46 into r47; + or r42 r47 into r48; + output r48 as boolean; + + +function make_move: + input r0 as u8.private; + input r1 as u8.private; + input r2 as u8.private; + input r3 as Board.private; + is.eq r0 1u8 into r4; + is.eq r0 2u8 into r5; + or r4 r5 into r6; + assert.eq r6 true; + lte 1u8 r1 into r7; + lte r1 3u8 into r8; + and r7 r8 into r9; + assert.eq r9 true; + lte 1u8 r2 into r10; + lte r2 3u8 into r11; + and r10 r11 into r12; + assert.eq r12 true; + is.eq r1 1u8 into r13; + is.eq r2 1u8 into r14; + and r13 r14 into r15; + is.eq r3.r1.c1 0u8 into r16; + and r15 r16 into r17; + is.eq r1 1u8 into r18; + is.eq r2 2u8 into r19; + and r18 r19 into r20; + is.eq r3.r1.c2 0u8 into r21; + and r20 r21 into r22; + is.eq r1 1u8 into r23; + is.eq r2 3u8 into r24; + and r23 r24 into r25; + is.eq r3.r1.c3 0u8 into r26; + and r25 r26 into r27; + is.eq r1 2u8 into r28; + is.eq r2 1u8 into r29; + and r28 r29 into r30; + is.eq r3.r2.c1 0u8 into r31; + and r30 r31 into r32; + is.eq r1 2u8 into r33; + is.eq r2 2u8 into r34; + and r33 r34 into r35; + is.eq r3.r2.c2 0u8 into r36; + and r35 r36 into r37; + is.eq r1 2u8 into r38; + is.eq r2 3u8 into r39; + and r38 r39 into r40; + is.eq r3.r2.c3 0u8 into r41; + and r40 r41 into r42; + is.eq r1 3u8 into r43; + is.eq r2 1u8 into r44; + and r43 r44 into r45; + is.eq r3.r3.c1 0u8 into r46; + and r45 r46 into r47; + is.eq r1 3u8 into r48; + is.eq r2 2u8 into r49; + and r48 r49 into r50; + is.eq r3.r3.c2 0u8 into r51; + and r50 r51 into r52; + is.eq r1 3u8 into r53; + is.eq r2 3u8 into r54; + and r53 r54 into r55; + is.eq r3.r3.c3 0u8 into r56; + and r55 r56 into r57; + ternary r57 r0 r3.r3.c3 into r58; + ternary r52 r0 r3.r3.c2 into r59; + ternary r52 r3.r3.c3 r58 into r60; + ternary r47 r0 r3.r3.c1 into r61; + ternary r47 r3.r3.c2 r59 into r62; + ternary r47 r3.r3.c3 r60 into r63; + ternary r42 r0 r3.r2.c3 into r64; + ternary r42 r3.r3.c1 r61 into r65; + ternary r42 r3.r3.c2 r62 into r66; + ternary r42 r3.r3.c3 r63 into r67; + ternary r37 r0 r3.r2.c2 into r68; + ternary r37 r3.r2.c3 r64 into r69; + ternary r37 r3.r3.c1 r65 into r70; + ternary r37 r3.r3.c2 r66 into r71; + ternary r37 r3.r3.c3 r67 into r72; + ternary r32 r0 r3.r2.c1 into r73; + ternary r32 r3.r2.c2 r68 into r74; + ternary r32 r3.r2.c3 r69 into r75; + ternary r32 r3.r3.c1 r70 into r76; + ternary r32 r3.r3.c2 r71 into r77; + ternary r32 r3.r3.c3 r72 into r78; + ternary r27 r0 r3.r1.c3 into r79; + ternary r27 r3.r2.c1 r73 into r80; + ternary r27 r3.r2.c2 r74 into r81; + ternary r27 r3.r2.c3 r75 into r82; + ternary r27 r3.r3.c1 r76 into r83; + ternary r27 r3.r3.c2 r77 into r84; + ternary r27 r3.r3.c3 r78 into r85; + ternary r22 r0 r3.r1.c2 into r86; + ternary r22 r3.r1.c3 r79 into r87; + ternary r22 r3.r2.c1 r80 into r88; + ternary r22 r3.r2.c2 r81 into r89; + ternary r22 r3.r2.c3 r82 into r90; + ternary r22 r3.r3.c1 r83 into r91; + ternary r22 r3.r3.c2 r84 into r92; + ternary r22 r3.r3.c3 r85 into r93; + ternary r17 r0 r3.r1.c1 into r94; + ternary r17 r3.r1.c2 r86 into r95; + ternary r17 r3.r1.c3 r87 into r96; + ternary r17 r3.r2.c1 r88 into r97; + ternary r17 r3.r2.c2 r89 into r98; + ternary r17 r3.r2.c3 r90 into r99; + ternary r17 r3.r3.c1 r91 into r100; + ternary r17 r3.r3.c2 r92 into r101; + ternary r17 r3.r3.c3 r93 into r102; + cast r94 r95 r96 into r103 as Row; + cast r97 r98 r99 into r104 as Row; + cast r100 r101 r102 into r105 as Row; + cast r103 r104 r105 into r106 as Board; + call check_for_win r106 1u8 into r107; + call check_for_win r106 2u8 into r108; + not r107 into r109; + and r109 r108 into r110; + ternary r110 r106.r1.c1 r106.r1.c1 into r111; + not r107 into r112; + and r112 r108 into r113; + ternary r113 r106.r1.c2 r106.r1.c2 into r114; + not r107 into r115; + and r115 r108 into r116; + ternary r116 r106.r1.c3 r106.r1.c3 into r117; + cast r111 r114 r117 into r118 as Row; + not r107 into r119; + and r119 r108 into r120; + ternary r120 r106.r2.c1 r106.r2.c1 into r121; + not r107 into r122; + and r122 r108 into r123; + ternary r123 r106.r2.c2 r106.r2.c2 into r124; + not r107 into r125; + and r125 r108 into r126; + ternary r126 r106.r2.c3 r106.r2.c3 into r127; + cast r121 r124 r127 into r128 as Row; + not r107 into r129; + and r129 r108 into r130; + ternary r130 r106.r3.c1 r106.r3.c1 into r131; + not r107 into r132; + and r132 r108 into r133; + ternary r133 r106.r3.c2 r106.r3.c2 into r134; + not r107 into r135; + and r135 r108 into r136; + ternary r136 r106.r3.c3 r106.r3.c3 into r137; + cast r131 r134 r137 into r138 as Row; + cast r118 r128 r138 into r139 as Board; + not r107 into r140; + and r140 r108 into r141; + ternary r141 2u8 0u8 into r142; + ternary r107 r106.r1.c1 r139.r1.c1 into r143; + ternary r107 r106.r1.c2 r139.r1.c2 into r144; + ternary r107 r106.r1.c3 r139.r1.c3 into r145; + cast r143 r144 r145 into r146 as Row; + ternary r107 r106.r2.c1 r139.r2.c1 into r147; + ternary r107 r106.r2.c2 r139.r2.c2 into r148; + ternary r107 r106.r2.c3 r139.r2.c3 into r149; + cast r147 r148 r149 into r150 as Row; + ternary r107 r106.r3.c1 r139.r3.c1 into r151; + ternary r107 r106.r3.c2 r139.r3.c2 into r152; + ternary r107 r106.r3.c3 r139.r3.c3 into r153; + cast r151 r152 r153 into r154 as Row; + cast r146 r150 r154 into r155 as Board; + ternary r107 1u8 r142 into r156; + output r155 as Board.private; + output r156 as u8.private; diff --git a/.circleci/tictactoe/build/program.json b/.circleci/tictactoe/build/program.json new file mode 100644 index 0000000000..a2f5a13696 --- /dev/null +++ b/.circleci/tictactoe/build/program.json @@ -0,0 +1,6 @@ +{ + "program": "tictactoe.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/.circleci/tictactoe/inputs/tictactoe.in b/.circleci/tictactoe/inputs/tictactoe.in new file mode 100644 index 0000000000..aff78f3ac5 --- /dev/null +++ b/.circleci/tictactoe/inputs/tictactoe.in @@ -0,0 +1,18 @@ +// The `new` function does not take any inputs. +[new] + +// Inputs for the `make_move` function. +// - `player` : A u8 representing the player making the move. 1 for player 1, 2 for player 2. +// - `row` : A u8 representing the row to make the move in. +// - `column` : A u8 representing the column to make the move in. +// - `board` : A representation of the board state. +[make_move] +player: u8 = 1u8; +row: u8 = 1u8; +col: u8 = 1u8; +board: Board = Board { + r1: Row { c1: 0u8, c2: 0u8, c3: 0u8 }, + r2: Row { c1: 0u8, c2: 0u8, c3: 0u8 }, + r3: Row { c1: 0u8, c2: 0u8, c3: 0u8 }, +}; + diff --git a/.circleci/tictactoe/leo.lock b/.circleci/tictactoe/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/.circleci/tictactoe/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/.circleci/tictactoe/program.json b/.circleci/tictactoe/program.json new file mode 100644 index 0000000000..a2f5a13696 --- /dev/null +++ b/.circleci/tictactoe/program.json @@ -0,0 +1,6 @@ +{ + "program": "tictactoe.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/.circleci/tictactoe/run.sh b/.circleci/tictactoe/run.sh new file mode 100644 index 0000000000..0c57c04e4e --- /dev/null +++ b/.circleci/tictactoe/run.sh @@ -0,0 +1,157 @@ +#!/bin/bash +# First check that Leo is installed. +if ! command -v leo &> /dev/null +then + echo "leo is not installed." + exit +fi +# Create a new game. +echo " +############################################################################### +######## ######## +######## STEP 0: Creating a new game of Tic-Tac-Toe ######## +######## ######## +######## | | | | ######## +######## | | | | ######## +######## | | | | ######## +######## ######## +############################################################################### +" +leo run new || exit + +# Have the Player 1 make a move. +echo " +############################################################################### +######## ######## +######## STEP 1: Player 1 makes the 1st move. ######## +######## ######## +######## | x | | | ######## +######## | | | | ######## +######## | | | | ######## +######## ######## +############################################################################### +" +leo run make_move 1u8 1u8 1u8 "{ r1: { c1: 0u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 2 make a move. +echo " +############################################################################### +######## ######## +######## STEP 2: Player 2 makes the 2nd move. ######## +######## ######## +######## | x | | | ######## +######## | | o | | ######## +######## | | | | ######## +######## ######## +############################################################################### +" +leo run make_move 2u8 2u8 2u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 1 make a move. +echo " +############################################################################### +######## ######## +######## STEP 3: Player 1 makes the 3rd move. ######## +######## ######## +######## | x | | | ######## +######## | | o | | ######## +######## | x | | | ######## +######## ######## +############################################################################### +" +leo run make_move 1u8 3u8 1u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 2u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 2 make a move. +echo " +############################################################################### +######## ######## +######## STEP 4: Player 2 makes the 4th move. ######## +######## ######## +######## | x | | | ######## +######## | o | o | | ######## +######## | x | | | ######## +######## ######## +############################################################################### +" +leo run make_move 2u8 2u8 1u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 2u8, c3: 0u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 1 make a move. +echo " +############################################################################### +######## ######## +######## STEP 5: Player 1 makes the 5th move. ######## +######## ######## +######## | x | | | ######## +######## | o | o | x | ######## +######## | x | | | ######## +######## ######## +############################################################################### +" +leo run make_move 1u8 2u8 3u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 0u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 2 make a move. +echo " +############################################################################### +######## ######## +######## STEP 6: Player 2 makes the 6th move. ######## +######## ######## +######## | x | o | | ######## +######## | o | o | x | ######## +######## | x | | | ######## +######## ######## +############################################################################### +" +leo run make_move 2u8 1u8 2u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 1 make a move. +echo " +############################################################################### +######## ######## +######## STEP 7: Player 1 makes the 7th move. ######## +######## ######## +######## | x | o | | ######## +######## | o | o | x | ######## +######## | x | x | | ######## +######## ######## +############################################################################### +" +leo run make_move 1u8 3u8 2u8 "{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }" || exit + +# Have the Player 2 make a move. +echo " +############################################################################### +######## ######## +######## STEP 8: Player 2 makes the 8th move. ######## +######## ######## +######## | x | o | | ######## +######## | o | o | x | ######## +######## | x | x | o | ######## +######## ######## +############################################################################### +" +leo run make_move 2u8 3u8 3u8 "{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 1u8, c3: 0u8 } }" || exit + +echo " +############################################################################### +######## ######## +######## STEP 9: Player 1 makes the 9th move. ######## +######## ######## +######## | x | o | x | ######## +######## | o | o | x | ######## +######## | x | x | o | ######## +######## ######## +############################################################################### +" +leo run make_move 1u8 1u8 3u8 "{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 1u8, c3: 2u8 } }" || exit + +echo " +############################################################################### +######## ######## +######## Game Complete! Players 1 & 2 Tied ######## +######## ######## +######## | x | o | x | ######## +######## | o | o | x | ######## +######## | x | x | o | ######## +######## ######## +############################################################################### +" diff --git a/.circleci/tictactoe/src/main.leo b/.circleci/tictactoe/src/main.leo new file mode 100644 index 0000000000..24ec333e6c --- /dev/null +++ b/.circleci/tictactoe/src/main.leo @@ -0,0 +1,111 @@ +program tictactoe.aleo { + // A row in a tic tac toe board. + // - `c1` : The first entry in the row. + // - `c2` : The second entry in the row. + // - `c3` : The third entry in the row. + // A valid entry is either 0, 1, or 2, where 0 is empty, 1 corresponds to player 1, and 2 corresponds to player 2. + // Any other values are invalid. + struct Row { + c1: u8, + c2: u8, + c3: u8 + } + + // A tic tac toe board. + // - `r1` : The first row in the board. + // - `r2` : The second row in the board. + // - `r3` : The third row in the board. + struct Board { + r1: Row, + r2: Row, + r3: Row, + } + + // Returns an empty board. + transition new() -> Board { + return Board { + r1: Row { c1: 0u8, c2: 0u8, c3: 0u8 }, + r2: Row { c1: 0u8, c2: 0u8, c3: 0u8 }, + r3: Row { c1: 0u8, c2: 0u8, c3: 0u8 }, + }; + } + + // Returns `true` if there exists a row, column, or diagonal with all entries occupied by the same player. + // - `b` : A tic tac toe board. + // - `p` : A number corresponding to a player. + function check_for_win(b: Board, p: u8) -> bool { + return + (b.r1.c1 == p && b.r1.c2 == p && b.r1.c3 == p) || // row 1 + (b.r2.c1 == p && b.r2.c2 == p && b.r2.c3 == p) || // row 2 + (b.r3.c1 == p && b.r3.c3 == p && b.r3.c3 == p) || // row 3 + (b.r1.c1 == p && b.r2.c1 == p && b.r3.c1 == p) || // column 1 + (b.r1.c2 == p && b.r2.c3 == p && b.r3.c2 == p) || // column 2 + (b.r1.c3 == p && b.r2.c3 == p && b.r3.c3 == p) || // column 3 + (b.r1.c1 == p && b.r2.c2 == p && b.r3.c3 == p) || // diagonal + (b.r1.c3 == p && b.r2.c2 == p && b.r3.c1 == p); // other diagonal + } + + // Returns an updated tic tac toe board with a move made by a player. + // Returns a `u8` corresponding to the player who won the game, or 0 if no one has won yet. + // - `player` : A number corresponding to a player. + // - `row` : The row of the move. + // - `col` : The column of the move. + // - `board` : A tic tac toe board. + // Assumes that `player` is either 1 or 2. + // Assumes that `row` and `col` are valid indices into the board. + // If an entry is already occupied, the move is invalid and the board is returned unchanged. + transition make_move(player: u8, row: u8, col: u8, board: Board) -> (Board, u8) { + // Check that inputs are valid. + assert(player == 1u8 || player == 2u8); + assert(1u8 <= row && row <= 3u8); + assert(1u8 <= col && col <= 3u8); + + // Unpack the entries in the board into variables. + let r1c1: u8 = board.r1.c1; + let r1c2: u8 = board.r1.c2; + let r1c3: u8 = board.r1.c3; + let r2c1: u8 = board.r2.c1; + let r2c2: u8 = board.r2.c2; + let r2c3: u8 = board.r2.c3; + let r3c1: u8 = board.r3.c1; + let r3c2: u8 = board.r3.c2; + let r3c3: u8 = board.r3.c3; + + // Update the appropriate entry with the given move. + if row == 1u8 && col == 1u8 && r1c1 == 0u8 { + r1c1 = player; + } else if row == 1u8 && col == 2u8 && r1c2 == 0u8 { + r1c2 = player; + } else if row == 1u8 && col == 3u8 && r1c3 == 0u8 { + r1c3 = player; + } else if row == 2u8 && col == 1u8 && r2c1 == 0u8 { + r2c1 = player; + } else if row == 2u8 && col == 2u8 && r2c2 == 0u8 { + r2c2 = player; + } else if row == 2u8 && col == 3u8 && r2c3 == 0u8 { + r2c3 = player; + } else if row == 3u8 && col == 1u8 && r3c1 == 0u8 { + r3c1 = player; + } else if row == 3u8 && col == 2u8 && r3c2 == 0u8 { + r3c2 = player; + } else if row == 3u8 && col == 3u8 && r3c3 == 0u8 { + r3c3 = player; + } + + // Construct the updated game board. + let updated: Board = Board { + r1: Row { c1: r1c1, c2: r1c2, c3: r1c3 }, + r2: Row { c1: r2c1, c2: r2c2, c3: r2c3 }, + r3: Row { c1: r3c1, c2: r3c2, c3: r3c3 }, + }; + + // Check if the game is over. + if check_for_win(updated, 1u8) { + return (updated, 1u8); + } else if check_for_win(updated, 2u8) { + return (updated, 2u8); + } else { + return (updated, 0u8); + } + } +} diff --git a/.circleci/token/.gitignore b/.circleci/token/.gitignore new file mode 100644 index 0000000000..f721f7f6f4 --- /dev/null +++ b/.circleci/token/.gitignore @@ -0,0 +1,5 @@ +.env +*.avm +*.prover +*.verifier +outputs/ diff --git a/.circleci/token/README.md b/.circleci/token/README.md new file mode 100644 index 0000000000..cbf994273b --- /dev/null +++ b/.circleci/token/README.md @@ -0,0 +1,12 @@ + + +[//]: # (workshop/token) + +A transparent & shielded custom token in Leo. + +## Run Guide + +To run this program, run: +```bash +./run.sh +``` \ No newline at end of file diff --git a/.circleci/token/build/main.aleo b/.circleci/token/build/main.aleo new file mode 100644 index 0000000000..2f80ca2797 --- /dev/null +++ b/.circleci/token/build/main.aleo @@ -0,0 +1,93 @@ +program token.aleo; + +record token: + owner as address.private; + amount as u64.private; + + +mapping account: + key as address.public; + value as u64.public; + +function mint_public: + input r0 as address.public; + input r1 as u64.public; + async mint_public r0 r1 into r2; + output r2 as token.aleo/mint_public.future; + +finalize mint_public: + input r0 as address.public; + input r1 as u64.public; + get.or_use account[r0] 0u64 into r2; + add r2 r1 into r3; + set r3 into account[r0]; + + +function mint_private: + input r0 as address.private; + input r1 as u64.private; + cast r0 r1 into r2 as token.record; + output r2 as token.record; + + +function transfer_public: + input r0 as address.public; + input r1 as u64.public; + async transfer_public self.caller r0 r1 into r2; + output r2 as token.aleo/transfer_public.future; + +finalize transfer_public: + input r0 as address.public; + input r1 as address.public; + input r2 as u64.public; + get.or_use account[r0] 0u64 into r3; + sub r3 r2 into r4; + set r4 into account[r0]; + get.or_use account[r1] 0u64 into r5; + add r5 r2 into r6; + set r6 into account[r1]; + + +function transfer_private: + input r0 as token.record; + input r1 as address.private; + input r2 as u64.private; + sub r0.amount r2 into r3; + cast r0.owner r3 into r4 as token.record; + cast r1 r2 into r5 as token.record; + output r4 as token.record; + output r5 as token.record; + + +function transfer_private_to_public: + input r0 as token.record; + input r1 as address.public; + input r2 as u64.public; + sub r0.amount r2 into r3; + cast r0.owner r3 into r4 as token.record; + async transfer_private_to_public r1 r2 into r5; + output r4 as token.record; + output r5 as token.aleo/transfer_private_to_public.future; + +finalize transfer_private_to_public: + input r0 as address.public; + input r1 as u64.public; + get.or_use account[r0] 0u64 into r2; + add r2 r1 into r3; + set r3 into account[r0]; + + +function transfer_public_to_private: + input r0 as address.public; + input r1 as u64.public; + cast r0 r1 into r2 as token.record; + async transfer_public_to_private self.caller r1 into r3; + output r2 as token.record; + output r3 as token.aleo/transfer_public_to_private.future; + +finalize transfer_public_to_private: + input r0 as address.public; + input r1 as u64.public; + get.or_use account[r0] 0u64 into r2; + sub r2 r1 into r3; + set r3 into account[r0]; diff --git a/.circleci/token/build/program.json b/.circleci/token/build/program.json new file mode 100644 index 0000000000..94d9bc9824 --- /dev/null +++ b/.circleci/token/build/program.json @@ -0,0 +1,6 @@ +{ + "program": "token.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/.circleci/token/inputs/token.in b/.circleci/token/inputs/token.in new file mode 100644 index 0000000000..fd1d929747 --- /dev/null +++ b/.circleci/token/inputs/token.in @@ -0,0 +1,34 @@ +// The program input for token/src/main.leo +[mint_public] +receiver: address = aleo1ptqvxu4gjfge8tuhgq2pqap0u5pms4p97gwhu7dwngxshpfzcszsswzpzd; +amount: u64 = 100u64; + +[mint_private] +receiver: address = aleo1ptqvxu4gjfge8tuhgq2pqap0u5pms4p97gwhu7dwngxshpfzcszsswzpzd; +amount: u64 = 100u64; + +[transfer_public] +receiver: address = aleo1mgfq6g40l6zkhsm063n3uhr43qk5e0zsua5aszeq5080dsvlcvxsn0rrau; +amount: u64 = 50u64; + +[transfer_private] +sender: token = token { + owner: aleo1ptqvxu4gjfge8tuhgq2pqap0u5pms4p97gwhu7dwngxshpfzcszsswzpzd, + amount: 100u64, + _nonce: 0group, +}; +receiver: address = aleo1mgfq6g40l6zkhsm063n3uhr43qk5e0zsua5aszeq5080dsvlcvxsn0rrau; +amount: u64 = 50u64; + +[transfer_private_to_public] +sender: token = token { + owner: aleo1ptqvxu4gjfge8tuhgq2pqap0u5pms4p97gwhu7dwngxshpfzcszsswzpzd, + amount: 100u64, + _nonce: 0group, +}; +receiver: address = aleo1mgfq6g40l6zkhsm063n3uhr43qk5e0zsua5aszeq5080dsvlcvxsn0rrau; +amount: u64 = 50u64; + +[transfer_public_to_private] +receiver: address = aleo1mgfq6g40l6zkhsm063n3uhr43qk5e0zsua5aszeq5080dsvlcvxsn0rrau; +amount: u64 = 50u64; diff --git a/.circleci/token/leo.lock b/.circleci/token/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/.circleci/token/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/.circleci/token/program.json b/.circleci/token/program.json new file mode 100644 index 0000000000..94d9bc9824 --- /dev/null +++ b/.circleci/token/program.json @@ -0,0 +1,6 @@ +{ + "program": "token.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/.circleci/token/run.sh b/.circleci/token/run.sh new file mode 100644 index 0000000000..45fdc91936 --- /dev/null +++ b/.circleci/token/run.sh @@ -0,0 +1,239 @@ +#!/bin/bash +# First check that Leo is installed. +if ! command -v leo &> /dev/null +then + echo "leo is not installed." + exit +fi + +# The private key and address of Alice. +# Swap these into program.json, when running transactions as the first bidder. +# "private_key": "APrivateKey1zkp1w8PTxrRgGfAtfKUSq43iQyVbdQHfhGbiNPEg2LVSEXR", +# "address": "aleo13ssze66adjjkt795z9u5wpq8h6kn0y2657726h4h3e3wfnez4vqsm3008q" + +# The private key and address of Bob. +# Swap these into program.json, when running transactions as the second bidder. +# "private_key": "APrivateKey1zkpFo72g7N9iFt3JzzeG8CqsS5doAiXyFvNCgk2oHvjRCzF" +# "address": "aleo17vy26rpdhqx4598y5gp7nvaa9rk7tnvl6ufhvvf4calsrrqdaqyshdsf5z" + +# Swap in the private key of Alice. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkp1w8PTxrRgGfAtfKUSq43iQyVbdQHfhGbiNPEg2LVSEXR +" > .env + +# Publicly mint 100 tokens for Alice. +echo " +############################################################################### +######## ######## +######## STEP 1: Publicly mint 100 tokens for Alice ######## +######## ######## +######## ----------------------------------------- ######## +######## | PUBLIC BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 100 | ######## +######## ----------------------------------------- ######## +######## | Bob | 0 | ######## +######## ----------------------------------------- ######## +######## ######## +######## ----------------------------------------- ######## +######## | PRIVATE BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 0 | ######## +######## ----------------------------------------- ######## +######## | Bob | 0 | ######## +######## ----------------------------------------- ######## +######## ######## +############################################################################### +" +leo run mint_public aleo13ssze66adjjkt795z9u5wpq8h6kn0y2657726h4h3e3wfnez4vqsm3008q 100u64 + +# Swap in the private key of Bob. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkpFo72g7N9iFt3JzzeG8CqsS5doAiXyFvNCgk2oHvjRCzF +" > .env + +# Privately mint 100 tokens for Bob. +echo " +############################################################################### +######## ######## +######## STEP 2: Privately mint 100 tokens for Bob ######## +######## ######## +######## ----------------------------------------- ######## +######## | PUBLIC BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 100 | ######## +######## ----------------------------------------- ######## +######## | Bob | 0 | ######## +######## ----------------------------------------- ######## +######## ######## +######## ----------------------------------------- ######## +######## | PRIVATE BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 0 | ######## +######## ----------------------------------------- ######## +######## | Bob | 100 | ######## +######## ----------------------------------------- ######## +######## ######## +############################################################################### +" +leo run mint_private aleo17vy26rpdhqx4598y5gp7nvaa9rk7tnvl6ufhvvf4calsrrqdaqyshdsf5z 100u64 + +# Swap in the private key of Alice. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkp1w8PTxrRgGfAtfKUSq43iQyVbdQHfhGbiNPEg2LVSEXR +" > .env + +# Publicly transfer 10 tokens from Alice to Bob. +echo " +############################################################################### +######## ######## +######## STEP 3: Publicly transfer 10 tokens from Alice to Bob ######## +######## ######## +######## ----------------------------------------- ######## +######## | PUBLIC BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 90 | ######## +######## ----------------------------------------- ######## +######## | Bob | 10 | ######## +######## ----------------------------------------- ######## +######## ######## +######## ----------------------------------------- ######## +######## | PRIVATE BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 0 | ######## +######## ----------------------------------------- ######## +######## | Bob | 100 | ######## +######## ----------------------------------------- ######## +######## ######## +############################################################################### +" +leo run transfer_public aleo17vy26rpdhqx4598y5gp7nvaa9rk7tnvl6ufhvvf4calsrrqdaqyshdsf5z 10u64 + +# Swap in the private key of Bob. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkpFo72g7N9iFt3JzzeG8CqsS5doAiXyFvNCgk2oHvjRCzF +" > .env + +# Privately transfer 20 tokens from Bob to Alice. +echo " +############################################################################### +######## ######## +######## STEP 4: Privately transfer 20 tokens from Bob to Alice ######## +######## ######## +######## ----------------------------------------- ######## +######## | PUBLIC BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 90 | ######## +######## ----------------------------------------- ######## +######## | Bob | 10 | ######## +######## ----------------------------------------- ######## +######## ######## +######## ----------------------------------------- ######## +######## | PRIVATE BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 20 | ######## +######## ----------------------------------------- ######## +######## | Bob | 80 | ######## +######## ----------------------------------------- ######## +######## ######## +############################################################################### +" +leo run transfer_private "{ + owner: aleo17vy26rpdhqx4598y5gp7nvaa9rk7tnvl6ufhvvf4calsrrqdaqyshdsf5z.private, + amount: 100u64.private, + _nonce: 6586771265379155927089644749305420610382723873232320906747954786091923851913group.public + }" aleo13ssze66adjjkt795z9u5wpq8h6kn0y2657726h4h3e3wfnez4vqsm3008q 20u64 + +# Swap in the private key of Alice. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkp1w8PTxrRgGfAtfKUSq43iQyVbdQHfhGbiNPEg2LVSEXR +" > .env + +# Convert 30 public tokens from Alice into 30 private tokens for Bob. +echo " +############################################################################### +######## ######## +######## STEP 5: Convert 30 public tokens from Alice into 30 ######## +######## private tokens for Bob. ######## +######## ######## +######## ----------------------------------------- ######## +######## | PUBLIC BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 60 | ######## +######## ----------------------------------------- ######## +######## | Bob | 10 | ######## +######## ----------------------------------------- ######## +######## ######## +######## ----------------------------------------- ######## +######## | PRIVATE BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 20 | ######## +######## ----------------------------------------- ######## +######## | Bob | 110 | ######## +######## ----------------------------------------- ######## +######## ######## +############################################################################### +" +leo run transfer_public_to_private aleo17vy26rpdhqx4598y5gp7nvaa9rk7tnvl6ufhvvf4calsrrqdaqyshdsf5z 30u64 + +# Swap in the private key of Bob. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkpFo72g7N9iFt3JzzeG8CqsS5doAiXyFvNCgk2oHvjRCzF +" > .env + +# Convert 40 private tokens from Bob into 40 public tokens for Alice. +echo " +############################################################################### +######## ######## +######## STEP 6: Convert 40 private tokens from Bob into 40 ######## +######## public tokens for Alice. ######## +######## ######## +######## ----------------------------------------- ######## +######## | PUBLIC BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 100 | ######## +######## ----------------------------------------- ######## +######## | Bob | 10 | ######## +######## ----------------------------------------- ######## +######## ######## +######## ----------------------------------------- ######## +######## | PRIVATE BALANCES | ######## +######## ----------------------------------------- ######## +######## ----------------------------------------- ######## +######## | Alice | 20 | ######## +######## ----------------------------------------- ######## +######## | Bob | 70 | ######## +######## ----------------------------------------- ######## +######## ######## +############################################################################### +" +leo run transfer_private_to_public "{ + owner: aleo17vy26rpdhqx4598y5gp7nvaa9rk7tnvl6ufhvvf4calsrrqdaqyshdsf5z.private, + amount: 80u64.private, + _nonce: 1852830456042139988098466781381363679605019151318121788109768539956661608520group.public + }" aleo13ssze66adjjkt795z9u5wpq8h6kn0y2657726h4h3e3wfnez4vqsm3008q 40u64 + + +# Swap in the private key of Alice. +# This is done to ensure that program.json is the same after every execution of ./run.sh. +echo " +NETWORK=testnet3 +PRIVATE_KEY=APrivateKey1zkp1w8PTxrRgGfAtfKUSq43iQyVbdQHfhGbiNPEg2LVSEXR +" > .env diff --git a/.circleci/token/src/main.leo b/.circleci/token/src/main.leo new file mode 100644 index 0000000000..120c6648fd --- /dev/null +++ b/.circleci/token/src/main.leo @@ -0,0 +1,128 @@ +program token.aleo { + // On-chain storage of an `account` map, with `address` as the key, + // and `u64` as the value. + mapping account: address => u64; + + record token { + // The token owner. + owner: address, + // The token amount. + amount: u64, + } + + /* Mint */ + + // The function `mint_public` issues the specified token amount for the token receiver publicly on the network. + transition mint_public(public receiver: address, public amount: u64) { + // Mint the tokens publicly by invoking the computation on-chain. + return then finalize(receiver, amount); + } + + finalize mint_public(public receiver: address, public amount: u64) { + // Increments `account[receiver]` by `amount`. + // If `account[receiver]` does not exist, it will be created. + // If `account[receiver] + amount` overflows, `mint_public` is reverted. + let current_amount: u64 = Mapping::get_or_use(account, receiver, 0u64); + Mapping::set(account, receiver, current_amount + amount); + } + + // The function `mint_private` initializes a new record with the specified amount of tokens for the receiver. + transition mint_private(receiver: address, amount: u64) -> token { + return token { + owner: receiver, + amount: amount, + }; + } + + /* Transfer */ + transition transfer_public(public receiver: address, public amount: u64) { + // Transfer the tokens publicly, by invoking the computation on-chain. + return then finalize(self.caller, receiver, amount); + } + + finalize transfer_public(public sender: address, public receiver: address, public amount: u64) { + // Decrements `account[sender]` by `amount`. + // If `account[sender]` does not exist, it will be created. + // If `account[sender] - amount` underflows, `transfer_public` is reverted. + let sender_amount: u64 = Mapping::get_or_use(account, sender, 0u64); + Mapping::set(account, sender, sender_amount - amount); + // Increments `account[receiver]` by `amount`. + // If `account[receiver]` does not exist, it will be created. + // If `account[receiver] + amount` overflows, `transfer_public` is reverted. + let receiver_amount: u64 = Mapping::get_or_use(account, receiver, 0u64); + Mapping::set(account, receiver, receiver_amount + amount); + } + + // The function `transfer_private` sends the specified token amount to the token receiver from the specified token record. + transition transfer_private(sender: token, receiver: address, amount: u64) -> (token, token) { + // Checks the given token record has sufficient balance. + // This `sub` operation is safe, and the proof will fail if an overflow occurs. + // `difference` holds the change amount to be returned to sender. + let difference: u64 = sender.amount - amount; + + // Produce a token record with the change amount for the sender. + let remaining: token = token { + owner: sender.owner, + amount: difference, + }; + + // Produce a token record for the specified receiver. + let transferred: token = token { + owner: receiver, + amount: amount, + }; + + // Output the sender's change record and the receiver's record. + return (remaining, transferred); + } + + // The function `transfer_private_to_public` turns a specified token amount from a token record into public tokens for the specified receiver. + // This function preserves privacy for the sender's record, however it publicly reveals the token receiver and the token amount. + transition transfer_private_to_public(sender: token, public receiver: address, public amount: u64) -> token { + // Checks the given token record has a sufficient token amount. + // This `sub` operation is safe, and the proof will fail if an underflow occurs. + // `difference` holds the change amount for the caller. + let difference: u64 = sender.amount - amount; + + // Produces a token record with the change amount for the caller. + let remaining: token = token { + owner: sender.owner, + amount: difference, + }; + + // Output the sender's change record. + // Increment the token amount publicly for the token receiver. + return remaining then finalize(receiver, amount); + } + + finalize transfer_private_to_public(public receiver: address, public amount: u64) { + // Increments `account[receiver]` by `amount`. + // If `account[receiver]` does not exist, it will be created. + // If `account[receiver] + amount` overflows, `transfer_private_to_public` is reverted. + let current_amount: u64 = Mapping::get_or_use(account, receiver, 0u64); + Mapping::set(account, receiver, current_amount + amount); + } + + // The function `transfer_public_to_private` turns a specified token amount from `account` into a token record for the specified receiver. + // This function preserves privacy for the receiver's record, however it publicly reveals the caller and the specified token amount. + transition transfer_public_to_private(public receiver: address, public amount: u64) -> token { + // Produces a token record for the token receiver. + let transferred: token = token { + owner: receiver, + amount: amount, + }; + + // Output the receiver's record. + // Decrement the token amount of the caller publicly. + return transferred then finalize(self.caller, amount); + } + + finalize transfer_public_to_private(public sender: address, public amount: u64) { + // Decrements `account[sender]` by `amount`. + // If `account[sender]` does not exist, it will be created. + // If `account[sender] - amount` underflows, `transfer_public_to_private` is reverted. + let current_amount: u64 = Mapping::get_or_use(account, sender, 0u64); + Mapping::set(account, sender, current_amount - amount); + } + +} diff --git a/examples/auction/leo.lock b/examples/auction/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/auction/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/basic_bank/build/main.aleo b/examples/basic_bank/build/main.aleo index f0498806f6..963c29ed1a 100644 --- a/examples/basic_bank/build/main.aleo +++ b/examples/basic_bank/build/main.aleo @@ -6,8 +6,8 @@ record Token: mapping balances: - key left as field.public; - value right as u64.public; + key as field.public; + value as u64.public; function issue: input r0 as address.private; @@ -22,9 +22,10 @@ function deposit: input r1 as u64.private; sub r0.amount r1 into r2; cast r0.owner r2 into r3 as Token.record; - hash.bhp256 r0.owner into r4 as field; output r3 as Token.record; - - finalize r4 r1; + hash.bhp256 r0.owner into r4 as field; + async deposit r4 r1 into r5; + output r3 as Token.record; + output r5 as basic_bank.aleo/deposit.future; finalize deposit: input r0 as field.public; @@ -547,11 +548,12 @@ function withdraw: input r2 as u64.private; input r3 as u64.private; assert.eq self.caller aleo1t0uer3jgtsgmx5tq6x6f9ecu8tr57rzzfnc2dgmcqldceal0ls9qf6st7a; - hash.bhp256 r0 into r4 as field; call calculate_interest r1 r2 r3 into r5; + hash.bhp256 r0 into r4 as field; + call calculate_interest r1 r2 r3 into r5; cast r0 r5 into r6 as Token.record; + async withdraw r4 r1 into r7; output r6 as Token.record; - - finalize r4 r1; + output r7 as basic_bank.aleo/withdraw.future; finalize withdraw: input r0 as field.public; diff --git a/examples/basic_bank/leo.lock b/examples/basic_bank/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/basic_bank/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/battleship/board/.gitignore b/examples/battleship/board/.gitignore new file mode 100644 index 0000000000..f721f7f6f4 --- /dev/null +++ b/examples/battleship/board/.gitignore @@ -0,0 +1,5 @@ +.env +*.avm +*.prover +*.verifier +outputs/ diff --git a/examples/battleship/board/README.md b/examples/battleship/board/README.md new file mode 100644 index 0000000000..d7d689efbc --- /dev/null +++ b/examples/battleship/board/README.md @@ -0,0 +1,13 @@ +# board.aleo + +## Build Guide + +To compile this Aleo program, run: +```bash +snarkvm build +``` + +To execute this Aleo program, run: +```bash +snarkvm run hello +``` diff --git a/examples/battleship/board/build/main.aleo b/examples/battleship/board/build/main.aleo new file mode 100644 index 0000000000..fac2e70af8 --- /dev/null +++ b/examples/battleship/board/build/main.aleo @@ -0,0 +1,46 @@ +program board.aleo; + +record board_state: + owner as address.private; + hits_and_misses as u64.private; + played_tiles as u64.private; + ships as u64.private; + player_1 as address.private; + player_2 as address.private; + game_started as boolean.private; + + +function new_board_state: + input r0 as u64.private; + input r1 as address.private; + cast self.caller 0u64 0u64 r0 self.caller r1 false into r2 as board_state.record; + output r2 as board_state.record; + + +function start_board: + input r0 as board_state.record; + not r0.game_started into r1; + assert.eq r1 true; + cast r0.owner r0.hits_and_misses r0.played_tiles r0.ships r0.player_1 r0.player_2 true into r2 as board_state.record; + output r2 as board_state.record; + + +function update_played_tiles: + input r0 as board_state.record; + input r1 as u64.private; + sub r1 1u64 into r2; + and r1 r2 into r3; + assert.eq r3 0u64; + and r1 r0.played_tiles into r4; + assert.eq r4 0u64; + or r0.played_tiles r1 into r5; + cast r0.owner r0.hits_and_misses r5 r0.ships r0.player_1 r0.player_2 r0.game_started into r6 as board_state.record; + output r6 as board_state.record; + + +function update_hits_and_misses: + input r0 as board_state.record; + input r1 as u64.private; + or r0.hits_and_misses r1 into r2; + cast r0.owner r2 r0.played_tiles r0.ships r0.player_1 r0.player_2 r0.game_started into r3 as board_state.record; + output r3 as board_state.record; diff --git a/examples/battleship/board/build/program.json b/examples/battleship/board/build/program.json new file mode 100644 index 0000000000..b140f09fcc --- /dev/null +++ b/examples/battleship/board/build/program.json @@ -0,0 +1,6 @@ +{ + "program": "board.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/examples/battleship/board/inputs/board.in b/examples/battleship/board/inputs/board.in new file mode 100644 index 0000000000..d414604f3e --- /dev/null +++ b/examples/battleship/board/inputs/board.in @@ -0,0 +1,4 @@ +// The program input for board/src/main.leo +[main] +public a: u32 = 1u32; +b: u32 = 2u32; diff --git a/examples/battleship/board/leo.lock b/examples/battleship/board/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/battleship/board/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/battleship/board/program.json b/examples/battleship/board/program.json new file mode 100644 index 0000000000..b140f09fcc --- /dev/null +++ b/examples/battleship/board/program.json @@ -0,0 +1,6 @@ +{ + "program": "board.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/examples/battleship/imports/board.leo b/examples/battleship/board/src/main.leo similarity index 100% rename from examples/battleship/imports/board.leo rename to examples/battleship/board/src/main.leo diff --git a/examples/battleship/build/program.json b/examples/battleship/build/program.json index 1d0c6e88d6..fe5a3d5e74 100644 --- a/examples/battleship/build/program.json +++ b/examples/battleship/build/program.json @@ -2,5 +2,22 @@ "program": "battleship.aleo", "version": "0.0.0", "description": "", - "license": "MIT" + "license": "MIT", + "dependencies" : [ + { + "name": "board.aleo", + "location": "local", + "path": "board" + }, + { + "name": "move.aleo", + "location": "local", + "path": "move" + }, + { + "name": "verify.aleo", + "location": "local", + "path": "verify" + } + ] } diff --git a/examples/battleship/leo.lock b/examples/battleship/leo.lock new file mode 100644 index 0000000000..dcb0468d95 --- /dev/null +++ b/examples/battleship/leo.lock @@ -0,0 +1,20 @@ +[[package]] +name = "board" +location = "local" +path = "board" +checksum = "da94274230d0c0c3deb96d80e07ad9db8bbf53264286c14cc3231b7a8b7ef380" +dependencies = [] + +[[package]] +name = "move" +location = "local" +path = "move" +checksum = "7d9fef5fe083eb24376e63935855e4ec709c17fb5ee46a0bb4594b0f9ef8eb08" +dependencies = [] + +[[package]] +name = "verify" +location = "local" +path = "verify" +checksum = "2c2035ebd70500b7e5a9a6198bed1a1163cd1ddfd09128db8f4c16cf23ad2c62" +dependencies = [] diff --git a/examples/battleship/move/.gitignore b/examples/battleship/move/.gitignore new file mode 100644 index 0000000000..f721f7f6f4 --- /dev/null +++ b/examples/battleship/move/.gitignore @@ -0,0 +1,5 @@ +.env +*.avm +*.prover +*.verifier +outputs/ diff --git a/examples/battleship/move/README.md b/examples/battleship/move/README.md new file mode 100644 index 0000000000..a8beca6049 --- /dev/null +++ b/examples/battleship/move/README.md @@ -0,0 +1,13 @@ +# move.aleo + +## Build Guide + +To compile this Aleo program, run: +```bash +snarkvm build +``` + +To execute this Aleo program, run: +```bash +snarkvm run hello +``` diff --git a/examples/battleship/move/build/main.aleo b/examples/battleship/move/build/main.aleo new file mode 100644 index 0000000000..ed5247d932 --- /dev/null +++ b/examples/battleship/move/build/main.aleo @@ -0,0 +1,24 @@ +program move.aleo; + +record move: + owner as address.private; + incoming_fire_coordinate as u64.private; + player_1 as address.private; + player_2 as address.private; + prev_hit_or_miss as u64.private; + + +function create_move: + input r0 as move.record; + input r1 as u64.private; + input r2 as u64.private; + is.eq r0.player_1 r0.owner into r3; + ternary r3 r0.player_2 r0.player_1 into r4; + cast r4 r1 r0.player_2 r0.player_1 r2 into r5 as move.record; + output r5 as move.record; + + +function start_game: + input r0 as address.private; + cast r0 0u64 self.caller r0 0u64 into r1 as move.record; + output r1 as move.record; diff --git a/examples/battleship/move/build/program.json b/examples/battleship/move/build/program.json new file mode 100644 index 0000000000..b8acf29858 --- /dev/null +++ b/examples/battleship/move/build/program.json @@ -0,0 +1,6 @@ +{ + "program": "move.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/examples/battleship/move/inputs/move.in b/examples/battleship/move/inputs/move.in new file mode 100644 index 0000000000..d632154504 --- /dev/null +++ b/examples/battleship/move/inputs/move.in @@ -0,0 +1,4 @@ +// The program input for move/src/main.leo +[main] +public a: u32 = 1u32; +b: u32 = 2u32; diff --git a/examples/battleship/move/leo.lock b/examples/battleship/move/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/battleship/move/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/battleship/move/program.json b/examples/battleship/move/program.json new file mode 100644 index 0000000000..b8acf29858 --- /dev/null +++ b/examples/battleship/move/program.json @@ -0,0 +1,6 @@ +{ + "program": "move.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/examples/battleship/imports/move.leo b/examples/battleship/move/src/main.leo similarity index 100% rename from examples/battleship/imports/move.leo rename to examples/battleship/move/src/main.leo diff --git a/examples/battleship/program.json b/examples/battleship/program.json index 1d0c6e88d6..fe5a3d5e74 100644 --- a/examples/battleship/program.json +++ b/examples/battleship/program.json @@ -2,5 +2,22 @@ "program": "battleship.aleo", "version": "0.0.0", "description": "", - "license": "MIT" + "license": "MIT", + "dependencies" : [ + { + "name": "board.aleo", + "location": "local", + "path": "board" + }, + { + "name": "move.aleo", + "location": "local", + "path": "move" + }, + { + "name": "verify.aleo", + "location": "local", + "path": "verify" + } + ] } diff --git a/examples/battleship/src/main.leo b/examples/battleship/src/main.leo index f88a651fca..743cb7bc5d 100644 --- a/examples/battleship/src/main.leo +++ b/examples/battleship/src/main.leo @@ -1,8 +1,8 @@ -import board.leo; -import move.leo; -import verify.leo; +import board.aleo; +import move.aleo; +import verify.aleo; -// The 'battleship.leo' program. +// The 'battleship.aleo' program. program battleship.aleo { // Returns a new record representing a new game of battleship. transition initialize_board( @@ -16,25 +16,25 @@ program battleship.aleo { destroyer: u64, // The address of the opponent. player: address, - ) -> board.leo/board_state.record { + ) -> board.aleo/board_state.record { // Verify that each individual ship placement bitstring is valid. - let valid_carrier: bool = verify.leo/validate_ship(carrier, 5u64, 31u64, 4311810305u64); + let valid_carrier: bool = verify.aleo/validate_ship(carrier, 5u64, 31u64, 4311810305u64); assert(valid_carrier); - let valid_battleship: bool = verify.leo/validate_ship(battleship, 4u64, 15u64, 16843009u64); + let valid_battleship: bool = verify.aleo/validate_ship(battleship, 4u64, 15u64, 16843009u64); assert(valid_battleship); - let valid_cruiser: bool = verify.leo/validate_ship(cruiser, 3u64, 7u64, 65793u64); + let valid_cruiser: bool = verify.aleo/validate_ship(cruiser, 3u64, 7u64, 65793u64); assert(valid_cruiser); - let valid_destroyer: bool = verify.leo/validate_ship(destroyer, 2u64, 3u64, 257u64); + let valid_destroyer: bool = verify.aleo/validate_ship(destroyer, 2u64, 3u64, 257u64); assert(valid_destroyer); // Create the board with all the ship placements combined. - let board: u64 = verify.leo/create_board(carrier, battleship, cruiser, destroyer); + let board: u64 = verify.aleo/create_board(carrier, battleship, cruiser, destroyer); // Initialize the board state record. - let state: board_state = board.leo/new_board_state(board, player); + let state: board_state = board.aleo/new_board_state(board, player); return state; } @@ -44,10 +44,10 @@ program battleship.aleo { // This function commits a given board to a game with an opponent and creates the initial dummy move. transition offer_battleship( // The board record to start a game with. - board: board.leo/board_state.record, - ) -> (board.leo/board_state.record, move.leo/move.record) { - let state: board_state = board.leo/start_board(board); - let dummy: move = move.leo/start_game(board.player_2); + board: board.aleo/board_state.record, + ) -> (board.aleo/board_state.record, move.aleo/move.record) { + let state: board_state = board.aleo/start_board(board); + let dummy: move = move.aleo/start_game(board.player_2); return (state, dummy); } @@ -56,16 +56,16 @@ program battleship.aleo { // Returns dummy move record owned by the opponent. transition start_battleship( // The board record to play the game with. - board: board.leo/board_state.record, + board: board.aleo/board_state.record, // The move record to play to begin the game. This should be the dummy move record created from offer_battleship. - move_start: move.leo/move.record, - ) -> (board.leo/board_state.record, move.leo/move.record) { + move_start: move.aleo/move.record, + ) -> (board.aleo/board_state.record, move.aleo/move.record) { // Validate that the move players and board players match each other. assert_eq(board.player_1, move_start.player_2); assert_eq(board.player_2, move_start.player_1); - let state: board_state = board.leo/start_board(board); - let dummy: move = move.leo/start_game(board.player_2); + let state: board_state = board.aleo/start_board(board); + let dummy: move = move.aleo/start_game(board.player_2); return (state, dummy); } @@ -74,12 +74,12 @@ program battleship.aleo { // Returns new move record owned by opponent. transition play( // The board record to update. - board: board.leo/board_state.record, + board: board.aleo/board_state.record, // The incoming move from the opponent. - move_incoming: move.leo/move.record, + move_incoming: move.aleo/move.record, // The u64 equivalent of the bitwise representation of the next coordinate to play on the opponent's board. shoot: u64, - ) -> (board.leo/board_state.record, move.leo/move.record) { + ) -> (board.aleo/board_state.record, move.aleo/move.record) { // Verify the board has been started. This prevents players from starting a game and then creating // a brand new board to play with. assert(board.game_started); @@ -89,15 +89,15 @@ program battleship.aleo { assert_eq(board.player_2, move_incoming.player_1); // Play coordinate on own board. Will fail if not a valid move. - let hit_or_miss: board_state = board.leo/update_played_tiles(board, shoot); + let hit_or_miss: board_state = board.aleo/update_played_tiles(board, shoot); // Update own board with result of last shot. - let next_board: board_state = board.leo/update_hits_and_misses(hit_or_miss, move_incoming.prev_hit_or_miss); + let next_board: board_state = board.aleo/update_hits_and_misses(hit_or_miss, move_incoming.prev_hit_or_miss); // Assess whether incoming fire coordinate is a hit. let is_hit: u64 = move_incoming.incoming_fire_coordinate & board.ships; - let next_move: move = move.leo/create_move(move_incoming, shoot, is_hit); + let next_move: move = move.aleo/create_move(move_incoming, shoot, is_hit); return (next_board, next_move); } diff --git a/examples/battleship/verify/.gitignore b/examples/battleship/verify/.gitignore new file mode 100644 index 0000000000..f721f7f6f4 --- /dev/null +++ b/examples/battleship/verify/.gitignore @@ -0,0 +1,5 @@ +.env +*.avm +*.prover +*.verifier +outputs/ diff --git a/examples/battleship/verify/README.md b/examples/battleship/verify/README.md new file mode 100644 index 0000000000..f5f2c6731e --- /dev/null +++ b/examples/battleship/verify/README.md @@ -0,0 +1,13 @@ +# verify.aleo + +## Build Guide + +To compile this Aleo program, run: +```bash +snarkvm build +``` + +To execute this Aleo program, run: +```bash +snarkvm run hello +``` diff --git a/examples/battleship/verify/build/main.aleo b/examples/battleship/verify/build/main.aleo new file mode 100644 index 0000000000..804dcf2a0e --- /dev/null +++ b/examples/battleship/verify/build/main.aleo @@ -0,0 +1,73 @@ +program verify.aleo; + + + +closure bitcount: + input r0 as u64; + div r0 2u64 into r1; + div r0 4u64 into r2; + div r0 8u64 into r3; + and r1 8608480567731124087u64 into r4; + and r2 3689348814741910323u64 into r5; + and r3 1229782938247303441u64 into r6; + sub r0 r4 into r7; + sub r7 r5 into r8; + sub r8 r6 into r9; + div r9 16u64 into r10; + add r9 r10 into r11; + and r11 1085102592571150095u64 into r12; + rem r12 255u64 into r13; + output r13 as u64; + + +closure adjacency_check: + input r0 as u64; + input r1 as u64; + div r0 r1 into r2; + is.eq r2 0u64 into r3; + ternary r3 3u64 r2 into r4; + sub r4 1u64 into r5; + and r5 r4 into r6; + is.eq r6 0u64 into r7; + output r7 as boolean; + + +closure horizontal_check: + input r0 as u64; + input r1 as u64; + rem r0 255u64 into r2; + div r2 r1 into r3; + is.eq r3 0u64 into r4; + ternary r4 3u64 r3 into r5; + sub r5 1u64 into r6; + and r6 r5 into r7; + is.eq r7 0u64 into r8; + output r8 as boolean; + + +function validate_ship: + input r0 as u64.private; + input r1 as u64.private; + input r2 as u64.private; + input r3 as u64.private; + call bitcount r0 into r4; + assert.eq r4 r1; + call adjacency_check r0 r2 into r5; + call horizontal_check r0 r2 into r6; + and r5 r6 into r7; + call adjacency_check r0 r3 into r8; + or r7 r8 into r9; + output r9 as boolean.private; + + +function create_board: + input r0 as u64.private; + input r1 as u64.private; + input r2 as u64.private; + input r3 as u64.private; + or r0 r1 into r4; + or r4 r2 into r5; + or r5 r3 into r6; + call bitcount r6 into r7; + assert.eq r7 14u64; + output r6 as u64.private; diff --git a/examples/battleship/verify/build/program.json b/examples/battleship/verify/build/program.json new file mode 100644 index 0000000000..b9b28db270 --- /dev/null +++ b/examples/battleship/verify/build/program.json @@ -0,0 +1,6 @@ +{ + "program": "verify.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/examples/battleship/verify/inputs/verify.in b/examples/battleship/verify/inputs/verify.in new file mode 100644 index 0000000000..0321a565c0 --- /dev/null +++ b/examples/battleship/verify/inputs/verify.in @@ -0,0 +1,4 @@ +// The program input for verify/src/main.leo +[main] +public a: u32 = 1u32; +b: u32 = 2u32; diff --git a/examples/battleship/verify/leo.lock b/examples/battleship/verify/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/battleship/verify/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/battleship/verify/program.json b/examples/battleship/verify/program.json new file mode 100644 index 0000000000..b9b28db270 --- /dev/null +++ b/examples/battleship/verify/program.json @@ -0,0 +1,6 @@ +{ + "program": "verify.aleo", + "version": "0.0.0", + "description": "", + "license": "MIT" +} diff --git a/examples/battleship/imports/verify.leo b/examples/battleship/verify/src/main.leo similarity index 100% rename from examples/battleship/imports/verify.leo rename to examples/battleship/verify/src/main.leo diff --git a/examples/bubblesort/leo.lock b/examples/bubblesort/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/bubblesort/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/core/build/main.aleo b/examples/core/build/main.aleo index 40adc53c98..c7c63279b5 100644 --- a/examples/core/build/main.aleo +++ b/examples/core/build/main.aleo @@ -4,4 +4,7 @@ program core.aleo; function main: input r0 as field.private; - hash.bhp256 r0 into r1 as field; hash.psd2 r1 into r2 as field; commit.bhp256 r2 1scalar into r3 as field; output r3 as field.private; + hash.bhp256 r0 into r1 as field; + hash.psd2 r1 into r2 as field; + commit.bhp256 r2 1scalar into r3 as field; + output r3 as field.private; diff --git a/examples/core/leo.lock b/examples/core/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/core/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/groups/leo.lock b/examples/groups/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/groups/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzdebruijn/leo.lock b/examples/hackers-delight/ntzdebruijn/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzdebruijn/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzgaudet/leo.lock b/examples/hackers-delight/ntzgaudet/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzgaudet/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzloops/leo.lock b/examples/hackers-delight/ntzloops/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzloops/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzmasks/leo.lock b/examples/hackers-delight/ntzmasks/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzmasks/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzreisers/leo.lock b/examples/hackers-delight/ntzreisers/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzreisers/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzseals/leo.lock b/examples/hackers-delight/ntzseals/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzseals/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzsearchtree/leo.lock b/examples/hackers-delight/ntzsearchtree/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzsearchtree/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/hackers-delight/ntzsmallvals/leo.lock b/examples/hackers-delight/ntzsmallvals/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/hackers-delight/ntzsmallvals/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/helloworld/leo.lock b/examples/helloworld/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/helloworld/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/interest/leo.lock b/examples/interest/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/interest/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/lottery/build/main.aleo b/examples/lottery/build/main.aleo index 73941df8de..dc0ee909fd 100644 --- a/examples/lottery/build/main.aleo +++ b/examples/lottery/build/main.aleo @@ -5,14 +5,14 @@ record Ticket: mapping num_winners: - key left as u8.public; - value right as u8.public; + key as u8.public; + value as u8.public; function play: cast self.caller into r0 as Ticket.record; + async play into r1; output r0 as Ticket.record; - - finalize; + output r1 as lottery.aleo/play.future; finalize play: lte block.height 1000u32 into r0; diff --git a/examples/lottery/leo.lock b/examples/lottery/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/lottery/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/message/leo.lock b/examples/message/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/message/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/simple_token/leo.lock b/examples/simple_token/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/simple_token/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/tictactoe/build/main.aleo b/examples/tictactoe/build/main.aleo index c6aa9f0a9c..2431ce3837 100644 --- a/examples/tictactoe/build/main.aleo +++ b/examples/tictactoe/build/main.aleo @@ -181,7 +181,7 @@ function make_move: ternary r17 r3.r3.c3 r93 into r102; cast r94 r95 r96 into r103 as Row; cast r97 r98 r99 into r104 as Row; - cast r100 r98 r99 into r105 as Row; + cast r100 r101 r102 into r105 as Row; cast r103 r104 r105 into r106 as Board; call check_for_win r106 1u8 into r107; call check_for_win r106 2u8 into r108; diff --git a/examples/tictactoe/leo.lock b/examples/tictactoe/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/tictactoe/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/token/build/main.aleo b/examples/token/build/main.aleo index ec32c954b3..2f80ca2797 100644 --- a/examples/token/build/main.aleo +++ b/examples/token/build/main.aleo @@ -6,14 +6,14 @@ record token: mapping account: - key left as address.public; - value right as u64.public; + key as address.public; + value as u64.public; function mint_public: input r0 as address.public; input r1 as u64.public; - - finalize r0 r1; + async mint_public r0 r1 into r2; + output r2 as token.aleo/mint_public.future; finalize mint_public: input r0 as address.public; @@ -33,8 +33,8 @@ function mint_private: function transfer_public: input r0 as address.public; input r1 as u64.public; - - finalize self.caller r0 r1; + async transfer_public self.caller r0 r1 into r2; + output r2 as token.aleo/transfer_public.future; finalize transfer_public: input r0 as address.public; @@ -65,9 +65,9 @@ function transfer_private_to_public: input r2 as u64.public; sub r0.amount r2 into r3; cast r0.owner r3 into r4 as token.record; + async transfer_private_to_public r1 r2 into r5; output r4 as token.record; - - finalize r1 r2; + output r5 as token.aleo/transfer_private_to_public.future; finalize transfer_private_to_public: input r0 as address.public; @@ -81,9 +81,9 @@ function transfer_public_to_private: input r0 as address.public; input r1 as u64.public; cast r0 r1 into r2 as token.record; + async transfer_public_to_private self.caller r1 into r3; output r2 as token.record; - - finalize self.caller r1; + output r3 as token.aleo/transfer_public_to_private.future; finalize transfer_public_to_private: input r0 as address.public; diff --git a/examples/token/leo.lock b/examples/token/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/token/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/twoadicity/leo.lock b/examples/twoadicity/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/twoadicity/leo.lock @@ -0,0 +1 @@ +package = [] diff --git a/examples/vote/build/main.aleo b/examples/vote/build/main.aleo index fdaafdbfdf..57d566d206 100644 --- a/examples/vote/build/main.aleo +++ b/examples/vote/build/main.aleo @@ -16,31 +16,32 @@ record Ticket: mapping proposals: - key left as field.public; - value right as ProposalInfo.public; + key as field.public; + value as ProposalInfo.public; mapping tickets: - key left as field.public; - value right as u64.public; + key as field.public; + value as u64.public; mapping agree_votes: - key left as field.public; - value right as u64.public; + key as field.public; + value as u64.public; mapping disagree_votes: - key left as field.public; - value right as u64.public; + key as field.public; + value as u64.public; function propose: input r0 as ProposalInfo.public; assert.eq self.caller r0.proposer; - hash.bhp256 r0.title into r1 as field; cast self.caller r1 r0 into r2 as Proposal.record; + hash.bhp256 r0.title into r1 as field; + cast self.caller r1 r0 into r2 as Proposal.record; + async propose r1 into r3; output r2 as Proposal.record; - - finalize r1; + output r3 as vote.aleo/propose.future; finalize propose: input r0 as field.public; @@ -51,9 +52,9 @@ function new_ticket: input r0 as field.public; input r1 as address.public; cast r1 r0 into r2 as Ticket.record; + async new_ticket r0 into r3; output r2 as Ticket.record; - - finalize r0; + output r3 as vote.aleo/new_ticket.future; finalize new_ticket: input r0 as field.public; @@ -64,8 +65,8 @@ finalize new_ticket: function agree: input r0 as Ticket.record; - - finalize r0.pid; + async agree r0.pid into r1; + output r1 as vote.aleo/agree.future; finalize agree: input r0 as field.public; @@ -76,8 +77,8 @@ finalize agree: function disagree: input r0 as Ticket.record; - - finalize r0.pid; + async disagree r0.pid into r1; + output r1 as vote.aleo/disagree.future; finalize disagree: input r0 as field.public; diff --git a/examples/vote/leo.lock b/examples/vote/leo.lock new file mode 100644 index 0000000000..c4293b3b9f --- /dev/null +++ b/examples/vote/leo.lock @@ -0,0 +1 @@ +package = []