11 个不稳定版本 (3 个破坏性更新)
0.4.0 | 2024年7月29日 |
---|---|
0.3.0 | 2024年6月5日 |
0.2.0 | 2024年1月23日 |
0.1.8 | 2023年2月8日 |
0.1.2 | 2022年7月27日 |
56 在 编程语言 中排名
每月下载量 200 次
在 3 个crate中使用(通过 tandem_garble_interop)
390KB
9K SLoC
Garble 语言
Garble 是一种简单的编程语言,用于使用 安全多方计算 的 混淆电路。Garble 生成的电路指定了一个 函数,每个输入来自不同的参与者,所有参与者协同计算输出,这样没有任何参与者能够学习到其他参与者的输入。Garble 是静态类型的、低级别的、纯函数式,并使用大量受Rust启发的语法。
所有用Garble编写的程序都是故意图灵不完备的(只支持有限递归),保证它们只能使用 AND
、XOR
和 NOT
门电路(不使用任何类型的具有状态的触发器或寄存器)编译成电路。以下是使用Garble解决 百万富翁问题 的示例
// A function for solving Yao's Millionaires' problem:
enum Richest {
IsA,
IsB,
Tie,
}
pub fn main(a: u64, b: u64) -> Richest {
if a > b {
Richest::IsA
} else if b > a {
Richest::IsB
} else {
Richest::Tie
}
}
有关更多示例,请参阅 语言之旅。
如何使用 Garble
Garble 生成的电路旨在使用一个加密安全的MPC引擎执行,该引擎不是由这个crate提供的。Garble 对MPC引擎的细节一无所知,只假设引擎支持使用 AND
、XOR
和 NOT
门的混淆电路。对于本地开发和测试,Garble 支持直接和不加密地评估生成的电路,所有输入均由本地用户提供。
要执行百万富翁问题示例,首先安装 garble
工具,检出存储库以获取示例程序,然后在存储库目录中运行函数
$ cargo install garble_lang
$ git clone [email protected]:sine-fdn/garble-lang.git
$ cd garble-lang
$ garble run garble_examples/millionaires.garble.rs --function=main 10000000u64 10000u64
Richest::IsA
$ garble run garble_examples/millionaires.garble.rs --function=main 100u64 5000000u64
Richest::IsB
$ garble run garble_examples/millionaires.garble.rs --function=main 1000u64 1000u64
Richest::Tie
您也可以使用 garble check
后跟文件名来在不运行程序的情况下进行类型检查。
如果输入或元数据包含空格,您可能需要用单引号将其包裹起来。
此存储库的架构
Garble 编译器相对简单直接,可以将程序 &str
转换为 circuit::Circuit
(或者在扫描/解析/类型错误时中断)。以下是其不同步骤及其模块(步骤 1-4 在编译时发生,步骤 5 在运行时发生):
scan.rs
将程序&str
划分为token::Token
序列。parse.rs
解析token::Token
序列,生成无类型的ast::Program
。check.rs
对无类型的ast::Program
进行类型检查,返回有类型的ast::Program
。compile.rs
将有类型的ast::Program
转换为circuit::Circuit
。eval.rs
使用本地提供的输入执行circuit::Circuit
。
依赖
~0–330KB