# 使用 SQL 证明验证查询


By [西门吹雪](https://paragraph.com/@002120) · 2024-01-30

---

深入探讨运行 SQL 查询证明

> 🚧阿尔法版可用
> --------
> 
> 请注意，Proof of SQL 目前处于封闭测试阶段，仅适用于有限的客户。虽然文档可供社区使用，但某些功能仅限于 alpha 参与者。[要加入 Proof of SQL alpha，请通过Discord](https://discord.gg/spaceandtime)联系我们。

使用 SQL 证明对空间和时间运行防篡改查询遵循与针对空间和时间执行的标准流程类似的工作流程。然而，有几个关键的区别必须要注意。以下指南将引导您完成创建表、插入数据以及对数据运行防篡改查询的端到端过程。

作为参考，请注意本指南的[防篡改 API 文档](https://docs.spaceandtime.io/reference/execute-sql-tamperproof)和[支持的 SQL 。](https://docs.spaceandtime.io/docs/supported-sql-syntax)

本指南假设您拥有 Space and Time 帐户并了解登录和运行查询等基本概念。如果您是《空间和时间》的新手，我们建议您从我们的标准[入门](https://docs.spaceandtime.io/docs/getting-started)指南开始。

> 📘
> --
> 
> 在初始版本中，不支持通过 SxT CLI 或 JDBC 进行防篡改查询。

首先，我们将了解防篡改查询特有的具体步骤，而不是逐步完成创建表、插入数据和查询数据的所有步骤。之后，我们将完成运行 sxt-tamper-proof-example.py 脚本的端到端步骤。

防篡改查询基础知识
---------

端到端工作流程涉及以下步骤：

1.  使用 SxT API 进行身份验证
    
2.  制作一块饼干
    
3.  创建防篡改表
    
4.  将数据插入防篡改表中
    
5.  查询防篡改表
    

身份验证和饼干创建是相同的，因此我们不需要解决这些问题。

### 创建防篡改表

我们看一下创建防篡改表所用的SQL：

SQL

    CREATE TABLE <resource_id> (PROOF_ORDER BIGINT PRIMARY KEY, PLANET VARCHAR) WITH 
            "public_key=<biscuit_public_key>,access_type=public_read,tamperproof=true,immutable=true,persist_interval=10
    

**请注意，此初始版本需要该列。**`PROOF_ORDER`PLANET 列只是一个示例，不是必需的。

`resource_id`将用于您正在创建的 schema.table，并且将是您的饼干公钥。`biscuit_public_key`

您可能以前见过，但接下来的三个WITH 标志可能是新的。`access_type`

*   `tamperproof=true`\- 正如您所期望的，这告诉 SxT 您想要创建一个防篡改表。
    
*   `immutable=true`\- 防篡改表也需要不可变。
    
*   `persist_interval=10`\- 虽然可选，但此标志告诉 SxT 刷新数据以在 10 秒内点燃。
    

这就是 CREATE 方面所需的全部！

### 将数据插入防篡改表中

SQL

    INSERT INTO <resource_id> (PROOF_ORDER, PLANET) VALUES (0,'EARTH')
    

需要严格增加列。目前，这需要手动完成，但将来，将在后台为您处理。`PROOF_ORDERauto-increment`

### 查询防篡改表

SQL

    SELECT * FROM <resource_id>
    

**用于基本防篡改查询的 SQL 是相同的。不过，目前并非所有 SQL 都支持防篡改查询。**[您可以在此处](https://docs.spaceandtime.io/docs/supported-sql-syntax)找到有关支持的 SQL 的更多信息。此外，还有一个新的防篡改查询端点，以及我们需要查看的标头、有效负载和响应数据中的一些显着差异。

1.  新 API 端点 - 此 URL 将由 SxT 团队提供给您。
    
2.  在标头中，注意与标准 JSON 接受的偏差：`"accept": "application/octet-stream",`
    
3.  在有效负载中，请注意我们使用资源 ID。这与其他 API 端点不同。`resourceId`
    
4.  响应数据 - 防篡改查询端点以 Arrow IPC 格式返回查询响应数据。因此，我们需要处理响应数据，将其从二进制反序列化并使其易于人类读取。[您可以在这里](https://arrow.apache.org/docs/status.html#ipc-format)找到各种语言的解析库。
    

SxT-tamper-proof-example.py
---------------------------

该脚本进行了完整的端到端演示：

1.  正在验证
    
2.  制作饼干
    
3.  创建防篡改表
    
4.  将数据插入防篡改表中
    
5.  查询防篡改表
    

为了简单起见，此脚本将在该架构下为您创建一个新的饼干和随机表。或者，您可以通过将架构作为命令行参数提供给脚本来使用架构，如下所示：`se_playgroundpython SxT-tamper-proof-example.py <your-schema-here>`

### 设置和要求

1.  下载存储库。请注意，该存储库当前是私有的。如果您是 alpha 版本的一部分并希望访问，请通过您的 GitHub 用户名与 SxT 联系。`git clone https://github.com/SxT-Community/tamper-proof-example.git`
    
2.  设置 Python 虚拟环境。
    

你如何做到这一点并不重要。此存储库使用 pyenv 的 virtualenv 插件。您可以使用 virtualenv 插件创建环境，如下所示：`pyenv virtualenv 3.11.2 POFSQL-3.11.2`

现在，当您位于此目录中时，它将从存储库中获取文件并自动激活此环境。`.python-version`

1.  设置你的环境
    

`cp sample.env .env`

> 确保使用具有有效订阅的 SxT 帐户，以便您拥有创建表所需的权限。

添加您的用户名和用于身份验证的 pub/priv 密钥对。

1.  运行！
    

`python SxT-tamper-proof-example.py`

输出将如下所示：

终端

INFO:root:Biscuit private Key: c30f6... INFO:root:Biscuit public Key: 63a0c... INFO:root:Resource ID: se\_playground.zcrcbuml INFO:root:Biscuit: Et0CCvIBCg5zeHQ6Y2FwYWJp...== INFO:root:Table se\_playground.zcrcbuml created successfully with API response code : 200 INFO:root:Inserted data '0', Mercury into tamper proof table successfully with response code : 200 - Please wait 10 seconds for the data to be persisted... INFO:root:Query tamperproof table successfully with code : 200 INFO:root:SxT query response data: pyarrow.Table proof\_order: int64 not null planet: string not null ---- proof\_order: \[\[0\]\] planet: \[\["Mercury"\]\]

---

*Originally published on [西门吹雪](https://paragraph.com/@002120/sql)*
