spaceandtimefdn/sxt-proof-of-sql

GitHub: spaceandtimefdn/sxt-proof-of-sql

一个高性能的零知识 SQL 证明器,通过密码学保证查询结果未被篡改,支持亚秒级生成针对百万行数据的可验证计算证明。

Stars: 5405 | Forks: 610

# SQL 证明

Proof of SQL TwitterDiscord Server

Proof of SQL 是由 [Space and Time](https://www.spaceandtime.io/) 团队开发的高性能零知识 (ZK) 证明器,它通过密码学方式保证了 SQL 查询是针对未被篡改的数据准确计算的。它的目标是满足在线延迟要求,同时能够对整个链历史进行计算证明,速度比最先进的 zkVM 和协处理器快一个数量级。 作为首个亚秒级 ZK 证明器,该协议可以在不到一秒的时间内对超过 100 万行数据执行分析查询(参见下文的基准测试)。它可以在单个 NVIDIA T4 上,在 Ethereum 的出块时间内对数百万行索引数据进行聚合。该协议旨在支持链上和链下验证,利用了一种新颖的承诺方案,显著降低了链上验证的 gas 费用。 使用 Proof of SQL,开发者可以以无信任的方式对链上和链下数据集进行计算,并在交易过程中实时向其智能合约(或链下验证器)证明结果,从而为数据驱动的合约赋能更复杂的 DeFi 协议。Proof of SQL 可以集成到任何 SQL 数据库(例如 [Google BigQuery](https://cloud.google.com/blog/topics/partners/how-space-and-times-proof-of-sql-integrates-with-bigquery))中,无论是中心化还是去中心化的,并且已经在保护一些最著名的 Web3 应用、金融机构和企业。 ## 面向开发者 通过使用 [crates.io](https://crates.io/) 上发布的 crate 来开始使用 Proof of SQL,或者克隆仓库并查看示例。请查看 README 的以下部分: * [示例](#examples) * [基准测试](#benchmarks) * [支持的 SQL 语法](#supported-sql-syntax) * [路线图](#roadmap) * [协议概述](#protocol-overview) ## 设置 ### 前置条件 * Linux `x86_64`(注意:代码库的大部分_应该_适用于大多数 Rust 目标平台。然而,证明过程使用 NVIDIA GPU 进行了加速,因此其他目标平台运行会非常缓慢,并且可能需要修改。) * NVIDIA GPU 及驱动程序(强烈推荐) * lld (`sudo apt install lld`) * clang (`sudo apt install clang`) * [Rust 1.81.0](https://www.rust-lang.org/tools/install)
非 Linux 和/或非 GPU 机器的替代方案。 * 替代方案 #1:通过设置 `BLITZAR_BACKEND` 环境变量来启用 Blitzar 的 CPU 版本。示例: export BLITZAR_BACKEND=cpu cargo test --all-features --all-targets * 替代方案 #2:在仓库中禁用 `blitzar` 特性。示例 cargo test --no-default-features --features="arrow cpu-perf"
## 示例 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: {Ident { value: "b", quote_style: None }: 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 虚拟机)运行基准测试。 为了运行这些基准测试,我们首先生成一个填充了随机数据的大型表,如下所示:

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

然后,我们针对这些数据运行以下 4 个查询,并证明和验证结果: * 过滤 - `SELECT b FROM bench_table WHERE a = 0` * 复杂过滤 - `SELECT * FROM bench_table WHERE (((a = 0) AND (b = 1)) OR ((c = 'a') AND (d = 'b')))` * 分组 - `SELECT SUM(a), COUNT(*) FROM bench_table WHERE a = 0 GROUP BY b` * 连接 - `SELECT table_a.column, table_b.column FROM table_a JOIN table_b on table_a.column=table_b.column` ### 结果 下图展示了在单台和多台 A100 机器上使用 `HyperKZG` 承诺方案的结果。

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

## 支持的 SQL 语法 有关更多详细信息,请参见 [SQL 规范](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/docs/SQLSyntaxSpecification.md)。总体而言,我们支持以下功能,并且正在快速添加更多的 SQL 特性: * `SELECT ... WHERE` * `GROUP BY` * 比较运算:`=`、`>=`、`<=` 等。 * 逻辑运算:`AND`、`OR`、`NOT`。 * 数值运算 `+`、`-`、`*`。 * 聚合函数:`SUM`、`COUNT` * 数据类型:`BOOLEAN`、整数类型、`VARCHAR`、`DECIMAL75`、`TIMESTAMP`。 ## 路线图 Proof of SQL 正在积极开发中。以下是我们目前正在着手的一些项目。我们非常乐意接受社区要求的额外功能的反馈。 * 扩展的 SQL 支持 - 特别是多表查询(如 JOIN)和子查询 * 集群规模证明 - 这意味着对更大的表进行更快的证明! * Solidity (EVM) 验证器 - 用于更高效的链上验证。 * 一种新颖的承诺方案 - 虽然我们支持多种承诺方案,但我们正在开发一种专门用于数据库操作的承诺方案,以确保更低 gas 的链上验证。 我们目前也正在进行严格的安全审计。在使用此代码时请牢记这一点。 ## 协议概述 有关更深入的解释,请参见 [Space and Time 白皮书](https://assets-global.website-files.com/642d91209f1e772d3740afa0/658edf3cf26933c4878ec965_whitepaper.pdf)。我们还将在不久的将来向此仓库添加更多技术文档。 我们创建此协议时有几个关键目标。首先,它在数据处理方面必须非常快,无论是验证还是往返执行。这需要一种从头开始构建的设计,而不是使用任意的 zkVM。其次,我们使其对开发者非常友好。使用 SQL(最受欢迎的数据查询语言)确保了任何构建以数据为中心的应用程序或复杂数据驱动合约的人都能获得熟悉的体验。最后,我们的协议旨在处理复杂的数据处理,而不仅仅是简单的串行计算或数据检索。 在该协议中,有两个主要角色:发送查询的客户端(Verifier)和返回结果的数据库服务(Prover)。当然,Verifier 并不总是必须发送查询;它可以是任何客户端,例如智能合约、dapp 前端或笔记本电脑。这种设置对于计算或存储能力有限但仍然需要安全保证(确保数据分析正确执行且数据保持不变)的应用程序至关重要。Prover 处理繁重的计算,而 Verifier 是轻量级的,适用于资源有限的客户端设备或智能合约。 一个关键的架构特征是承诺(或摘要)的概念。为了确保数据完整性,Verifier 维护此承诺以检测任何篡改。可以将其视为数字指纹——一种代表表中数据的轻量级摘要。 ### 数据接入 Verifier 和 Prover 之间的初始交互涉及数据接入。在此过程中,当服务或客户端提交数据以包含在数据库中时,它首先通过 Verifier。在这里,Verifier 生成(或更新)一个承诺,其中包含足够的信息,以防止在整个协议过程中发生篡改。一旦建立了此承诺,Verifier 就会将数据转发到数据库进行存储,同时保留该承诺以备将来参考。

Data Ingestion Diagram

### 查询请求 第二次交互涉及查询请求,即 Verifier 寻求对 Prover 持有的数据进行数据分析。当服务、客户端或 Verifier 发起查询请求时,它会将该请求发送给 Prover。在这里,Prover 解析查询,计算结果,并生成一个证明,连同结果一起发送给正在维护承诺的 Verifier。拥有证明和承诺的 Verifier 可以根据查询请求验证 Prover 的结果。

Query Request Diagram

## 许可证 Proof of SQL 采用去中心化开放软件许可证 1.0 (Decentralized Open Software License 1.0) 进行许可。有关详细信息,请参见 [LICENSE](https://github.com/spaceandtimelabs/sxt-proof-of-sql/blob/main/LICENSE) 文件。
标签:SQL数据库, Web3, 区块链, 可视化界面, 多线程, 密码学, 手动系统调用, 数据验证, 智能合约, 通知系统, 零知识证明