Zama 发布了 Concrete v2.10,引入了对 Rust 的支持,通过 concrete-macro 和 concrete 这两个 crates,可以直接在 Rust 中使用 FHE(全同态加密) 功能,使得开发者能够更容易地将 Python 原型移植到生产环境。此外,新版本还增强了与 TFHE-rs 的互操作性。
/
2025 年 4 月 10 日
-
Quentin Bourgerie
Concrete v2.10 推出了一个强大的新工具:Concrete for Rust——一个将全同态加密 (FHE) 直接引入 Rust 生态系统的集成。这是在现代系统编程中实现生产级 FHE 应用程序的重要一步。
如果你已经尝试过 Concrete,你可能已经熟悉了 concrete-python 前端。此工具允许你将 Python 程序编译成其全同态加密 (FHE) 等效程序,然后使用客户端和服务器 SDK 来处理加密、评估和解密。现在,有了这个新的 Rust 支持,以前使用底层 C++ API 的高级用户现在可以直接在 Rust 中利用 Concrete 的强大功能。
在过去的几年里,Python 已经被证明是 Concrete 的一个很好的目标。它灵活、易于使用,并且拥有强大的科学计算生态系统。这就是为什么像 concrete-ml 这样的工具能够如此快速地支持如此多的机器学习模型。Python 非常适合尝试新想法和快速构建原型,并且 concrete-python 可以很好地集成在一起。
然而,当需要从原型转向真正的生产系统时,Python 可能会受到限制,而这正是 Rust 的用武之地。在 Zama,我们一直很欣赏 Rust 在编写密码学代码时的安全性。但除了内存安全之外,Rust 也越来越成为构建可靠的大规模应用程序的流行选择。
随着 Concrete for Rust 的首次发布,我们的目标是将两者的优点结合在一起:Python 的原型设计的便捷性,以及 Rust 用于生产就绪部署的强大而安全的基础。
让我们来看一个简单的例子,看看 Rust 中的 Concrete 是如何工作的。
步骤 1 — 在 Python 中定义和编译模块。
我们首先使用 concrete-python 生成与 concrete-compiler 兼容的工件。然后,此工件将被导入并在 Rust 项目中使用,从而演示 Rust 集成如何融入更广泛的 Concrete 工具链中。
首先,使用 pip 安装 concrete-python:
pip install concrete-python
然后,我们定义一个包含两个函数的简单模块 inc 和 dec,它们分别增加和减少一个 8 位整数(即,计算以 2^8 为模进行):
from concrete import fhe
@fhe.module()
class MyModule:
@fhe.function({"x": "encrypted"})
def inc(x):
return (x+1) % 2**8
@fhe.function({"x": "encrypted"})
def dec(x):
return (x-1) % 2**8
inputset = fhe.inputset(fhe.uint8)
module = MyModule.compile({"inc": inputset, "dec": inputset})
module.server.save(path="MyModule.zip", via_mlir=True)
请注意,本示例中使用的 Python 代码有意简单,仅用于测试目的。在实践中,你可以在程序中编写任何兼容的逻辑。
执行脚本后,你将获得一个名为 test.zip 的文件,其中包含你将在 Rust 项目中使用的已编译工件。
步骤 2 — 在 Rust 中使用该模块。
为了支持此工作流程,我们在 crates.io 上发布了两个 crate:
首先初始化你的 rust 项目并添加 concrete 依赖项:
cargo init
cargo add concrete@=2.10.1-rc1 concrete-macro@=2.10.1-rc1
使用 concrete_macro,你可以使用 FHE 轻松地将预编译模块导入到你的 Rust 项目中:
mod MyModule {
use concrete_macro::from_concrete_python_export_zip;
from_concrete_python_export_zip!("MyModule.zip");
}
在底层,过程宏执行多个任务来集成预编译模块:
在上面的例子中,该模块包含两个函数 inc 和 dec,这些函数现在在 Rust 中可用。你可以运行完整的 FHE 工作流程:
fn main() {
use concrete::common::Tensor;
let input = Tensor::new(vec![5], vec![]);
let expected_output = Tensor::new(vec![6], vec![]);
// Step 1 (Client side) : keygen
// 步骤 1(客户端):密钥生成
let mut secret_csprng = concrete::common::SecretCsprng::new(0u128);
let mut encryption_csprng = concrete::common::EncryptionCsprng::new(0u128);
let keyset = my_module::new_keyset(secret_csprng.pin_mut(), encryption_csprng.pin_mut());
let client_keyset = keyset.get_client();
// Step 2 (Client side) : Create the client stub of the inc function
// 步骤 2(客户端):创建 inc 函数的客户端存根
let mut inc_client = my_module::client::inc::ClientFunction::new(&client_keyset, encryption_csprng);
// Step 3 (Client side) : Encrypt the input and get the evaluation keys
// 步骤 3(客户端):加密输入并获取评估密钥
let encrypted_input = inc_client.prepare_inputs(input);
let evaluation_keys = keyset.get_server();
// Step 4 (Server side) : Create the server stub of the inc function
// 步骤 4(服务器端):创建 inc 函数的服务器存根
let mut inc_server = my_module::server::inc::ServerFunction::new();
// Step 5 (Server side) : Invoke the server stub with the evaluation keys and the encrypted input
// 步骤 5(服务器端):使用评估密钥和加密输入调用服务器存根
let encrypted_output = inc_server.invoke(&evaluation_keys, encrypted_input);
// Step 6 (Client side) : Decrypt the output
// 步骤 6(客户端):解密输出
let decrypted_output = inc_client.process_outputs(encrypted_output);
// Assert that the decrypted output is equal to the expected output
// 断言解密后的输出等于预期输出
assert_eq!(decrypted_output.values(), expected_output.values());
}
注意: Rust API 目前处于 beta 阶段,这意味着它仍然是实验性的,并且可能会在未来的版本中发展。我们正在积极改进——欢迎尝试、分享你的反馈,并继续关注更新!
除了 Rust 支持之外,Concrete v2.10 还带来了一些对 TFHE-rs 互操作性的增强——从而更容易地结合两个生态系统的优势。
有关更多详细信息,请查看发行说明。
未找到任何项目。
Concrete ↗ Concrete ML ↗ FHEVM ↗ TFHE-rs ↗
隐私保护机器学习 Confidential blockchain Threshold key management SYSTEM
博客 文档 ↗ GITHUB ↗ FHE 资源 ↗ 研究论文 ↗ Bounty Program ↗ FHE STATE OS
关于 introduction to fhe 活动 媒体 职业 ↗ 法律
与专家交谈 联系我们 X Discord Telegram 所有社群频道
在电子时代,隐私对于一个开放的社会是必要的。隐私不是秘密。私事是不想让全世界知道的事,而秘密是不想让任何人知道的事。隐私是有选择地向世界展示自己的力量。如果双方有某种交易,那么双方都会记住他们的互动。每一方都可以谈论他们自己对这件事的记忆;谁能阻止呢?可以立法禁止,但言论自由比隐私更重要,是开放社会的基础;我们不寻求限制任何言论。如果许多人在同一个论坛上一起发言,每个人都可以向所有其他人发言,并将关于个人和其他各方的知识汇总在一起。电子通信的力量实现了这种群体言论,并且它不会仅仅因为我们可能想要它消失而消失。由于我们渴望隐私,我们必须确保交易的每一方只知道该交易直接需要的知识。由于任何信息都可以被说出来,我们必须确保我们尽可能少地透露信息。在大多数情况下,个人身份并不重要。当我在商店购买杂志并将现金交给店员时,没有必要知道我是谁。当我要求我的电子邮件提供商发送和接收消息时,我的提供商不需要知道我在与谁交谈或我说什么,也不需要知道别人对我说什么;我的提供商只需要知道如何将消息发送到那里以及我欠他们多少费用。当我的身份被交易的底层机制泄露时,我就没有隐私。我不能在这里有选择地展示自己;我必须始终展示自己。因此,开放社会中的隐私需要匿名交易系统。到目前为止,现金一直是主要的此类系统。匿名交易系统不是秘密交易系统。匿名系统使个人能够在需要时以及仅在需要时透露自己的身份;这是隐私的本质。开放社会中的隐私也需要密码学。如果我说什么,我希望只有我打算听的人才能听到。如果我的言论内容对全世界都可用,我就没有隐私。加密是为了表明对隐私的渴望,而使用弱加密是为了表明对隐私没有太多的渴望。此外,当默认设置为匿名时,要确信地显示自己的身份,需要密码签名。我们不能期望政府、公司或其他大型、没有面孔的组织出于他们的恩惠而给予我们隐私。对他们有利的是谈论我们,我们应该期望他们会谈论。试图阻止他们的言论是与信息的现实作斗争。信息不仅仅是想要自由,它渴望自由。信息会扩展以填充可用的存储空间。信息是谣言的年轻、更强大的表弟;信息脚步更快,眼睛更多,知道更多,但比谣言理解得更少。如果我们希望拥有任何隐私,我们必须捍卫自己的隐私。我们必须团结起来,创建允许匿名交易发生的系统。几个世纪以来,人们一直在用耳语、黑暗、信封、关闭的门、秘密握手和信使来捍卫自己的隐私。过去的技术不允许强大的隐私,但电子技术允许。我们这些密码朋克致力于构建匿名系统。我们正在使用密码学、匿名邮件转发系统、数字签名和电子货币来捍卫我们的隐私。密码朋克编写代码。我们知道必须有人编写软件来捍卫隐私,而且由于我们不能在除非我们都这样做的情况下获得隐私,所以我们将编写它。我们发布我们的代码,以便我们的密码朋克同伴可以练习和使用它。我们的代码可供全世界所有人免费使用。如果你不赞成我们编写的软件,我们不太在意。我们知道软件无法被销毁,而且广泛分散的系统无法被关闭。密码朋克谴责对密码学的监管,因为加密从根本上说是一种私人行为。事实上,加密行为将信息从公共领域移除。即使是反对密码学的法律也只能触及一个国家的边界及其暴力的触角。密码学将不可避免地蔓延到整个地球,并随之蔓延到它所实现的匿名交易系统。为了使隐私得到广泛传播,它必须成为社会契约的一部分。人们必须走到一起并部署这些系统以造福大众。隐私的范围仅限于社会同伴的合作。我们这些密码朋克寻求你的问题和你的担忧,并希望我们可以与你互动,这样我们才不会欺骗自己。但是,我们不会因为某些人可能不同意我们的目标而改变我们的路线。密码朋克正在积极参与使网络更安全以保护隐私。让我们一起加快步伐。前进。埃里克·休斯。1993 年 3 月 9 日。
- 原文链接: zama.ai/post/concrete-v2...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!