2 个版本
1.0.1 |
|
---|---|
1.0.0 |
|
0.1.1 | 2024 年 1 月 31 日 |
0.1.0 | 2023 年 11 月 8 日 |
#18 in #llvm-ir
每月 39 下载次数
2MB
50K SLoC

简介
Ola 是一种用于开发 OlaVM 智能合约的高级编程语言。它是图灵完备的,可以用来编写算术程序。计算过程通过 OlaVM 后端证明系统得到证明,该系统验证 OlaVM 处理的准确性。大多数现有的 ZKP 领域编程语言都需要对电路领域的根本知识,这并非普遍适用,或者执行过程难以通过 ZKP 进行证明和验证。
👉👉📖 Ola 语言文档
简单示例
以下是一个用于计算斐波那契函数的简单合约示例
contract Fibonacci {
fn fib_recursive(u32 n) -> (u32) {
if (n <= 2) {
return 1;
}
return fib_recursive(n -1) + fib_recursive(n -2);
}
fn fib_non_recursive(u32 n) -> (u32) {
u32 first = 0;
u32 second = 1;
u32 third = 1;
for (u32 i = 2; i <= n; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
}
Ola 语言特性
语言类型
- 简单类型:包括
u32
、field
、bool
、enum
、address
和hash
类型。在 Ola 中,所有数据类型都内部表示为field
类型的组合。field
类型的最大值是0xFFFFFFFF00000001
。地址和哈希类型内部表示为四个field
元素组成的数组。 - 复杂类型:包括静态数组、动态数组、
string
、fields
、结构体和映射。fields 类型是 field 元素的动态数组。 - 类型别名:支持类型别名。
运算符
- 不同类型支持不同的运算符。类型
u32
支持最多的运算符,例如:+
、-
、*
、/
、%
、**
、==
、!=
等。
函数
- 函数的语法与 Solidity 和 Rust 类似,使用关键字
fn
来声明函数。
控制流程
- 控制流程结构包括
if
语句、if-else
语句、while
语句、do-while
语句、for
循环、continue
和break
。
先知函数
- Ola 语言中的
prophet
函数用于特定场景下的非确定性计算,例如u32_sqrt
、u32_quick_sort
等。
核心库函数
- Ola 语言提供了许多核心库,包括
assert
、print
、fileds_conct
、encode
、decode
等。
IR 生成
- Ola 语言由前端处理为 LLVM IR 的子集以进行编译。
Olac 后端
Olac 编译器前端生成的 LLVM IR 子集被降级为 OlaVM 字节码,以便由 OlaVM 虚拟机执行。
支持的 LLVM IR 子集
类型系统
void
类型- 函数类型
- 一阶类型内的单值类型支持
i64
、i1
、ptr
类型 label
和token
类型- 数组、结构等聚合类型
指令集
- 终端指令:
ret
、br
、switch
- 一元运算:
neg
- 二元运算:
add
、sub
、mul
- 逻辑运算:
and
、or
、xor
- 聚合运算:
insertvalue
、extractvalue
- 内存访问和寻址:
alloca
、store
、load
、getelementptr
- 转换指令:
trunc
- 其他操作:
icmp
、phi
、call
支持的 IR 库扩展
- 包括内置和先知:
assert
、rangecheck
、u32_sqrt
、div
、mod
、vec_new
、poseidon_hash
- 合约存储访问操作:
set_storage
、get_storage
- 合约输入/输出访问操作:
get_context_data
、get_tape_data
、set_tape_data
- 调试:
printf
- 跨合约调用:
contract_call
OlaVM 汇编
- 汇编语言包括
program
和prophet
部分,分别由 VM 直接执行和嵌入式解释器解释。 program
部分:定义汇编输出格式,支持整个 OlaVM 自定义指令集。prophet
部分:指在 IR 库扩展中描述的prophets
集合。
未来工作
- 引入测试框架,更有序的语言设计,以及稳健的编译器工程实现。
- 堆内存分配和管理重构,更简洁的指令生成。
- 优化前端和后端的代码生成,指令生成和执行效率更高。
- 设计面向对象的合约语法,增强语言的表达能力。
- 扩展合约中的隐私功能,支持 ZK 隐私合约编程。
🧰 故障排除
如果您在安装和使用 Ola 时遇到问题,请打开 问题。
许可证
依赖项
~10–20MB
~266K SLoC