64个版本 (14个破坏性更新)

新版本 0.15.0 2024年8月16日
0.13.0 2024年8月16日
0.6.2 2024年7月31日

#10神奇豆

Download history 144/week @ 2024-06-02 110/week @ 2024-06-09 30/week @ 2024-06-16 965/week @ 2024-06-23 457/week @ 2024-06-30 500/week @ 2024-07-07 676/week @ 2024-07-14 928/week @ 2024-07-21 871/week @ 2024-07-28 1470/week @ 2024-08-04 1780/week @ 2024-08-11

5,118 每月下载量

自定义许可

2MB
44K SLoC

Proof of SQL

Proof of SQL TwitterDiscord Server

Proof of SQL 是由 Space and Time 团队开发的高性能零知识(ZK)证明器,通过密码学保证 SQL 查询针对未被篡改的数据准确计算。它针对在线延迟,在证明整个链历史计算时,比最先进的 zkVM 和协处理器快一个数量级。

作为第一个亚秒级 ZK 证明器,该协议可以在单个 GPU 上在不到一秒内执行 10 万行表的分析查询(见下文基准测试)。它可以在单个 NVIDIA T4 上在以太坊区块时间内处理数百万行的索引数据。该协议设计用于支持链上和链下验证,利用一种新颖的承诺方案,通过链上验证显著降低燃气费。

使用 Proof of SQL,开发人员可以以无信任的方式计算链上和链下数据集,在交易过程中即时将结果证明回他们的智能合约(或链下验证者),以使用数据驱动合同为更复杂的 DeFi 协议提供动力。Proof of SQL 可以集成到任何 SQL 数据库(例如 Google BigQuery),无论是集中式还是去中心化,并且已经为一些最著名的 Web3 应用、金融机构和企业提供安全保障。

贡献

SQL 证明正在积极开发中,并非所有 SQL 函数都得到了支持。SQL 证明作为一个社区驱动的项目,是最强大的。我们希望培养一大群贡献者,帮助他们维护、改进并使用这个项目来创造一个无需信任且数据驱动的未来。如果您想添加 SQL 功能、集成到其他 ZK 解决方案、在您的项目中使用它或任何其他事情,请创建一个问题、提交一个 PR 或通过 Discord 联系我们!查看我们的指南:[CONTRIBUTING.md](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/CONTRIBUTING.md)。

针对开发者

可以通过使用在 crates.io 上发布的包或克隆存储库并查看示例来开始使用 Proof of SQL。查看 README 中的以下部分:

设置

先决条件

  • Linux x86_64(注意:大多数代码库应该适用于大多数 Rust 目标。然而,证明使用了 NVIDIA GPU 进行加速,所以其他目标将运行得非常慢,可能需要修改。)
  • NVIDIA GPU 及驱动程序(强烈推荐)
  • lld(sudo apt install lld
  • clang(sudo apt install clang
  • Rust 1.78.0

示例

Proof of SQL 附带了演示其使用的示例代码。您可以在 crates/proof-of-sql/examples 文件夹中找到这些示例。以下是一些示例的运行说明

“Hello World” 示例

“Hello World” 示例演示了为表中的查询生成和验证证明 SELECT b FROM table WHERE a = 2

a b
1 hi
2 hello
3 there
2 world

运行

cargo run --example hello_world

输出

Warming up GPU... 520.959485ms
Loading data... 3.229767ms
Parsing Query... 1.870256ms
Generating Proof... 467.45371ms
Verifying Proof... 7.106864ms
Valid proof!
Query result: OwnedTable { table: {Identifier { name: "b" }: VarChar(["hello", "world"])} }

有关示例及其实现的详细说明,请参阅[README](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/crates/proof-of-sql/examples/hello_world/README.md)和源代码[hello_world/main.rs](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/crates/proof-of-sql/examples/hello_world/main.rs)。

CSV 数据库示例

CSV 数据库示例演示了具有 Proof of SQL 功能的简单 CSV 支持的数据库的实现。

要安装示例

cargo install --example posql_db --path crates/proof-of-sql #TODO: update once this is published to crates.io

有关详细使用说明和如何在 CSV 支持的数据库中创建、追加、证明和验证查询的示例,请参阅[README](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/crates/proof-of-sql/examples/posql_db/README.md)和源代码[posql_db/main.rs](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/crates/proof-of-sql/examples/posql_db/main.rs)。

基准测试

Proof of SQL 优化了速度和效率。以下是它如此之快的原因:

  1. 我们使用对数据的本地、预计算承诺。换句话说,当向数据库添加数据时,我们计算数据的“摘要”,这实际上将数据“锁定”。与大多数区块链中使用基于 merkle 树的承诺不同,我们使用 Proof of SQL 自身的内在承诺方案。
  2. SQL 适合于自然的算术化,这意味着与其他围绕指令/顺序计算设计的证明系统相比,开销非常小。相反,Proof of SQL 从一开始就是针对数据处理和并行性设计的。
  3. 我们在验证器中最昂贵的密码学上使用 GPU 加速。我们使用 [Blitzar](https://github.com/spaceandtimelabs/blitzar) 作为我们的加速框架。

设置

我们在多块 NVIDIA A100 GPU(NC A100 v4系列 Azure VM)和单块 NVIDIA T4 GPU(NCasT4_v3系列 Azure VM)的机器上运行基准测试。

为了运行这些基准测试,我们首先生成一个大型、随机填充的数据表,如下所示

a(BIGINT) b(BIGINT) c(VARCHAR)
17717 -1 Z
11651 -3 W
-9563 -2 dS
-6435 -2 x
-8338 -1 jI
12420 -2 DX
11546 -3
18292 2
6500 -1 C
16219 2 D5

然后,我们对这些数据进行以下3个查询,证明并验证结果

  • 查询#1 - SELECT b FROM table WHERE a = 0
  • 查询#2 - SELECT * FROM table WHERE ((a = 0) or (b = 1)) and (not (c = 'a'))
  • 查询#3 - SELECT b, SUM(a) as sum_a, COUNT(*) as c FROM table WHERE (c = 'a' OR c = 'b') AND b > 0 GROUP BY b

第3个查询的一个示例结果如下

b sum_a c
1 -45585 301
2 -137574, 300
3 -107073 282

结果

以下图表显示了在T4机器和A100机器上对上述三个查询的结果。总的来说,结果是

  • 对100k行数据的查询可以在几秒内证明。
  • 对1亿行数据的查询可以在大约1分钟内证明。
  • 验证时间大约为20ms。

Proof Of SQL Benchmarks (200k - T4)Proof Of SQL Benchmarks (200k - A100)Proof Of SQL Benchmarks (10m - T4)Proof Of SQL Benchmarks (100m - A100)

支持的 SQL 语法

有关更多详细信息,请参阅SQL规范。总的来说,我们支持以下内容,并将快速添加更多SQL功能

  • SELECT ... WHERE
  • GROUP BY
  • 比较操作:=>=<=等。
  • 逻辑操作:ANDORNOT
  • 数值操作 +-*
  • 聚合:SUMCOUNT
  • 数据类型:BOOLEAN,整数类型,VARCHARDECIMAL75TIMESTAMP

路线图

SQL证明正在积极开发中。以下是我们目前正在工作的项目。我们很高兴收到社区对更多功能的反馈。

  • 扩展的 SQL 支持 - 尤其是多表查询(如 JOIN)和子查询
  • 集群规模证明 - 这意味着在更大的表上更快地证明!
  • Solidity (EVM) 验证器 - 用于更高效的链上验证。
  • 一种新的承诺方案 - 虽然我们支持各种承诺方案,但我们正在开发一种专门针对数据库操作的承诺方案,确保链上验证的燃气消耗更低。

我们目前正在进行稳健的安全审计。请在使用此代码时牢记这一点。

协议概述

请参阅空间和时间白皮书以获取更深入的说明。我们还将很快向此存储库添加更多技术文档。

我们创建此协议有几个关键目标。首先,它需要非常快速地进行数据处理,无论是验证还是往返执行。这需要一个从头开始构建的设计,而不是使用任意的 zkVM。其次,我们使其非常适用于开发者。使用 SQL,最受欢迎的数据查询语言,确保任何构建数据导向应用程序或复杂数据驱动合约的人都有熟悉的感觉。最后,我们的协议旨在处理复杂的数据处理,而不仅仅是简单的串行计算或数据检索。

在此协议中,有两个主要角色:发送查询的客户端(验证器)和返回结果的数据库服务(证明者)。当然,验证器不一定要发送查询;它可以是任何客户端,例如智能合约、dapp 前端或笔记本电脑。这种设置对于计算或存储有限但仍然需要保证数据分析和数据未更改的安全性的应用程序至关重要。证明者处理繁重的计算,而验证器轻量级,适合资源有限的客户端设备或智能合约。

一个关键架构特性是承诺或摘要的概念。为了确保数据完整性,验证器维护这个承诺以检测任何篡改。将其视为数字指纹 - 轻量级的摘要表示表中的数据。

数据摄取

验证器和证明者之间的初始交互涉及数据摄取。在这个过程中,当服务或客户端提交数据以供数据库包含时,它首先通过验证器。在这里,验证器生成(或更新)一个承诺,其中包含足够的信息以在整个协议中防止篡改。一旦建立了这个承诺,验证器就将数据转发到数据库进行存储,同时保留承诺以供将来参考。

Data Ingestion Diagram

查询请求

第二次交互涉及查询请求,其中验证器寻求对证明者持有的数据进行数据分析。当服务、客户端或验证器启动查询请求时,它将请求发送给证明者。在这里,证明者解析查询,计算结果并生成一个证明,与结果一起发送给维护承诺的验证器。验证器,拥有证明和承诺,可以验证证明者的结果与查询请求的一致性。

Query Request Diagram

许可证

SQL 证明根据去中心化开源软件许可证 1.0 许可。请参阅LICENSE文件以获取详细信息。

依赖关系

~21–31MB
~497K SLoC