32 个版本

0.11.0-beta.7 2024 年 8 月 17 日
0.11.0-beta.62024 年 5 月 24 日
0.11.0-beta.52024 年 3 月 12 日
0.11.0-beta.22023 年 12 月 25 日
0.4.0 2021 年 7 月 31 日

#147模拟器

Download history 78/week @ 2024-04-26 48/week @ 2024-05-03 56/week @ 2024-05-10 102/week @ 2024-05-17 508/week @ 2024-05-24 171/week @ 2024-05-31 635/week @ 2024-06-07 744/week @ 2024-06-14 656/week @ 2024-06-21 561/week @ 2024-06-28 502/week @ 2024-07-05 438/week @ 2024-07-12 461/week @ 2024-07-19 1575/week @ 2024-07-26 391/week @ 2024-08-02 744/week @ 2024-08-09

3,225 每月下载量
25 仓库(4 个直接使用)中使用

Apache-2.0

555KB
12K SLoC

AluVM rust 实现

Build Tests Lints codecov

crates.io Docs unsafe forbidden Apache-2 licensed

AluVM(算术逻辑单元虚拟机)的 Rust 实现和汇编器,将 Alu 汇编语言转换为字节码。

AluVM 是一个纯功能注册表基础的、高度确定性和无异常的指令集架构(ISA)和虚拟机(VM),没有随机内存访问,能够执行算术操作,包括椭圆曲线操作。AluVM ISA 可以通过运行虚拟机的环境(宿主环境)进行扩展,提供将数据加载到 VM 注册器和支持特定应用指令(如 SIMD)的能力。

ALuVM 的主要目的是用于分布式系统,其中鲁棒性和平台无关的确定性比计算速度更重要。AluVM 的主要应用领域(使用适当的 ISA 扩展)是区块链环境、共识关键计算、边缘计算、多方计算(包括确定性机器学习)、客户端验证、沙盒计算和遗传算法。

有关 AluVM 的更多详细信息,请参阅 规范,观看 YouTube 上的详细演示或查看演示的 幻灯片

设计

鲁棒性是 AluVM 的核心。它旨在避免任何未定义的行为。具体来说,

  • 所有寄存器可能处于未定义状态;
  • 不可能或不正确的操作将目标寄存器置于特殊的 未定义状态
  • 代码始终扩展到 2^16 字节,用零填充,对应于“设置 st0 寄存器为假并停止执行”操作码;
  • 没有无效的跳转操作;
  • 没有无效的指令;
  • 循环和跳转计数有2^16的限制(有界时间执行);
  • 无歧义:任何两个不同的字节字符串总是代表严格不同的程序;
  • 代码始终是已签名的;
  • 数据段始终是已签名的;
  • 代码承诺使用所用的ISA扩展;
  • 库通过签名识别;
  • 如果库不全,则代码不运行;

Comparison table

指令集架构

Instruction set architecture

指令操作码

  • RISC:只有256条指令
  • 三种核心指令系列
    • 控制流
    • 寄存器间的数据加载/移动
    • ALU(包括密码学)
  • 可使用ISA扩展进行扩展:127个操作为扩展预留
    • 更多密码学
    • 自定义数据I/O(区块链、LN、客户端验证)
    • 遗传算法/代码自我修改

算术ISA的设计具有强大的鲁棒性目标

  • 不可能的算术运算(0/0、Inf/inf)始终将目标寄存器设置为未定义状态(与IEEE-754中的NaN不同,它只有一个唯一的值)
  • 导致值无法适应使用编码的位维度的操作,包括整数编码的无限表示(x/0如果x不等于0)会导致
    • 对于浮点下溢,异常编码的数
    • 对于浮点数中的x/0(如果x不等于0),±Inf浮点值
    • 对于整数检查操作和浮点数的溢出:未定义值,将st0设置为false
    • 对于整数封装操作中的溢出,最大寄存器值上的模除

大多数算术操作必须提供标志,指定应使用哪种编码和异常处理

  • 整数编码有两个标志
    • 一个用于编码的符号/无符号变体
    • 一个用于检查或封装的异常处理变体
  • 浮点编码有4种舍入方式,与IEEE-754选项匹配

因此,许多算术指令有8种变体,指示使用的编码(无符号整数或浮点数)以及在结果值无法适应寄存器时(整数溢出或封装和浮点数的四种舍入选项之一)的操作行为。

请查看规范以获取详细信息。

寄存器

ALU寄存器:8块32个寄存器

  • 整数算术(A寄存器)块:8、16、32、64、128、256、512、1024位
  • 浮点算术(F寄存器)块
    • IEEE:二进制半精度、单精度、双精度、四精度、八精度
    • IEEE扩展:80位X87寄存器
    • BFloat16寄存器,用于机器学习
  • 密码学操作(R寄存器)块:128、160、256、512、1024、2048、4096、8192位
  • 字符串寄存器(S寄存器):1块256个寄存器,每个64kb

控制流寄存器

  • 状态(st0),布尔值(1位)
  • 周期计数器(cy0),16位
  • 指令复杂度累加器(ca0),16位
  • 调用栈寄存器(cs0),3*2^16位(192kB块)
  • 调用栈指针寄存器(cp0),16位

历史

依赖关系

~4.5–7MB
~143K SLoC