- 基于 Leo 仓库 testnet3分支 2022年10月16日提交的commit版本 3a8e11e278c7cf34d485fe63a1e90dec4b042e45 对以下内容进行介绍。
文章目录
相关资料链接
- Leo官网 https://leo-lang.org/
- Leo白皮书 https://eprint.iacr.org/2021/651.pdf
- Leo源码 https://github.com/AleoHQ/leo
- Leo文档 https://developer.aleo.org/leo/getting_started/overview
- Leo包管理中心 https://aleo.pm/
- Aleo链上的Leo程序 https://www.aleo.network/programs
- Leo编程语言的语法格式 https://github.com/AleoHQ/grammars
- Leo编程介绍 https://www.entropy1729.com/leo-development-starter-pack/
- Leo编程案例
- ARC20 https://github.com/Entropy1729/ARC20_leo
- Bulls and Cows game(公牛和奶牛比赛游戏) https://github.com/mlsmith/aleo-numbers
- ZK coinflip https://github.com/demox-labs/zk-coinflip
- battleship游戏 https://github.com/demox-labs/zk-battleship
- 隐私NFT https://github.com/demox-labs/aleo-nft
- CTO讲述leo编程案例 https://youtu.be/-FrrylHITvg
概览
-
Leo编程语言的愿景
- 让软件开发工程师可以不用关心零知识证明的底层知识、电路的生成,只需要关注业务层,即可以高效地构建零知识证明应用。
-
Leo简介
- Leo是构建在 Aleo SDK 基础之上的零知识编程语言。
- Leo是一种用于编写隐私应用程序的函数式静态类型编程语言。
- Leo不同于传统计算机语言,Leo编写的程序会被编译成零知识证明的电路。
- Leo通过构建零知识证明的电路,来执行运算操作。
-
Leo引进了
- 零知识应用
- resolver
- 通用定理生成器 theorem generator for general-purpose
- 测试框架 testing framework
- 包管理器 package registry
Leo 编译器安装
-
方式一 通过Rust cargo宝箱库进行安装。(官方代码在快速迭代中,宝箱库里的代码比较陈旧,推荐通过源码进行安装)
# 安装Leo编译器 cargo install leo-lang # 验证是否安装成功 leo --version
-
方式二 通过源码进行安装。
# 下载源码 git clone https://github.com/AleoHQ/leo cd leo # 安装leo编译器 cargo install --path . # 验证是否安装成功 leo --version
Leo 命令行指令
# 创建一个项目
project_name="hello_world"
leo new ${project_name}
cd ${project_name}
# 编译一个项目
leo build
# 编译运行一个项目
leo run # 执行transition名字为main的状态转移,从input文件夹内读取参数值。
leo run ${transition_name} # 执行transition名字为${transition_name}的状态转移,从input文件夹内读取参数值。
leo run ${transition_name} 参数1 参数2 # 执行transition名字为${transition_name}的状态转移,从命令行读取参数值。
Leo 的Hello World程序
- 执行
leo new hello_world
指令创建一个名字为 hello_world 的项目。
项目目录结构
- program.json 项目的元文件
- README.md 项目的介绍
- build 项目被编译后的文件
- inputs 项目的输入参数文件夹
- hello_world.in hello_world程序的输入参数文件
- output 新建一个项目时并不会生成此目录,当编译运行时才会生成此文件夹。
- src 项目的源代码文件夹
- main.leo 项目的源代码入口
项目元文件 program.json
{
"program": "hello_world.aleo", // 项目的名字
"version": "0.0.0", // 项目版本号
"description": "", // 项目描述
"development": {
"private_key": "APrivateKey1zkp2wpbnb7MwfxSn5WHePdtpdd11sPkL39BTHxCZveyiLPK", // 用于运行程序,执行签名的账户私钥
"address": "aleo1t5w5dh60ftr9svj206sfkm3008l3auxctapr2tw36w6rjd5n2uxqfxv7tt" // 用于运行程序,的账户地址
},
"license": "MIT"
}
源代码文件入口 src/main.leo
// 通过 program 关键字定义一个名字为 'hello_world' 的程序。
program hello_world.aleo {
// transition 关键字,定义一次状态转移操作,定义名字为main。输入参数既可以从 inputs/hello_world.in 里读取,也可以在运行时从命令行里传入。
// 运行方式1 leo run main
// 运行方式2 leo run main 4u32 5u32
transition main(public a: u32, b: u32) -> u32 {
let c: u32 = a + b;
return c;
}
// transition 关键字,定义一次状态转移操作,定义名字为main2。输入参数既可以从 inputs/hello_world.in 里读取,也可以在运行时从命令行里传入。
// 运行方式1 leo run main2
// 运行方式2 leo run main2 4u32 5u32
transition main2(public a: u32, b: u32) -> u32 {
let c: u32 = a * b;
return c;
}
}
输入参数文件 hello_world.in
[main]
public a: u32 = 1u32;
b: u32 = 2u32;
[main2]
public a: u32 = 1u32;
b: u32 = 2u32;
- main 代表了transition名字为 main 的一次状态转移操作中的输入参数。
- 输入参数a,可见性为public,类型为u32,值为1
- 输入参数b,类型为u32,值为2
- main2 代表了transition名字为 main2 的一次状态转移操作中的输入参数。
- 输入参数a,可见性为public,类型为u32,值为1
- 输入参数b,类型为u32,值为2