2 个版本

1.0.1 2023 年 11 月 8 日
1.0.0 2023 年 11 月 6 日
0.1.1 2024 年 1 月 31 日
0.1.0 2023 年 11 月 8 日

#18 in #llvm-ir

每月 39 下载次数

Apache-2.0GPL-3.0 许可证

2MB
50K SLoC

Ola Logo

CI Project license LoC Twitter

简介

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 语言特性

语言类型

  • 简单类型:包括 u32fieldboolenumaddresshash 类型。在 Ola 中,所有数据类型都内部表示为 field 类型的组合。field 类型的最大值是 0xFFFFFFFF00000001。地址和哈希类型内部表示为四个 field 元素组成的数组。
  • 复杂类型:包括静态数组、动态数组、stringfields、结构体和映射。fields 类型是 field 元素的动态数组。
  • 类型别名:支持类型别名。

运算符

  • 不同类型支持不同的运算符。类型 u32 支持最多的运算符,例如:+-*/%**==!= 等。

函数

  • 函数的语法与 Solidity 和 Rust 类似,使用关键字 fn 来声明函数。

控制流程

  • 控制流程结构包括 if 语句、if-else 语句、while 语句、do-while 语句、for 循环、continuebreak

先知函数

  • Ola 语言中的 prophet 函数用于特定场景下的非确定性计算,例如 u32_sqrtu32_quick_sort 等。

核心库函数

  • Ola 语言提供了许多核心库,包括 assertprintfileds_conctencodedecode 等。

IR 生成

  • Ola 语言由前端处理为 LLVM IR 的子集以进行编译。

Olac 后端

Olac 编译器前端生成的 LLVM IR 子集被降级为 OlaVM 字节码,以便由 OlaVM 虚拟机执行。

支持的 LLVM IR 子集

类型系统

  • void 类型
  • 函数类型
  • 一阶类型内的单值类型支持 i64i1ptr 类型
  • labeltoken 类型
  • 数组、结构等聚合类型

指令集

  • 终端指令:retbrswitch
  • 一元运算:neg
  • 二元运算:addsubmul
  • 逻辑运算:andorxor
  • 聚合运算:insertvalueextractvalue
  • 内存访问和寻址:allocastoreloadgetelementptr
  • 转换指令:trunc
  • 其他操作:icmpphicall

支持的 IR 库扩展

  • 包括内置和先知:assertrangechecku32_sqrtdivmodvec_newposeidon_hash
  • 合约存储访问操作:set_storageget_storage
  • 合约输入/输出访问操作:get_context_dataget_tape_dataset_tape_data
  • 调试:printf
  • 跨合约调用:contract_call

OlaVM 汇编

  • 汇编语言包括 programprophet 部分,分别由 VM 直接执行和嵌入式解释器解释。
  • program 部分:定义汇编输出格式,支持整个 OlaVM 自定义指令集。
  • prophet 部分:指在 IR 库扩展中描述的 prophets 集合。

未来工作

  • 引入测试框架,更有序的语言设计,以及稳健的编译器工程实现。
  • 堆内存分配和管理重构,更简洁的指令生成。
  • 优化前端和后端的代码生成,指令生成和执行效率更高。
  • 设计面向对象的合约语法,增强语言的表达能力。
  • 扩展合约中的隐私功能,支持 ZK 隐私合约编程。

🧰 故障排除

如果您在安装和使用 Ola 时遇到问题,请打开 问题

许可证

Apache 2.0

依赖项

~10–20MB
~266K SLoC