本文档介绍了Shutter API,这是一个旨在为去中心化应用程序(dApp)提供安全、去中心化和防篡改的提交与揭示工作流程的系统。通过该API,开发者可以注册身份并设置时间锁定的解密触发器,检索加密数据和解密密钥,以及解密提交的信息,从而保障应用程序的完整性和保密性。
此软件正处于开发的早期阶段。强烈建议用户谨慎行事,在进一步成熟和去中心化之前,不要将任何高价值的资产或敏感信息委托给此 API。
请注意,所有阈值密码学系统和多方计算 (MPC) 框架本质上都依赖于阈值信任假设。虽然 Shutter API 目前使用一组去中心化的 keyper,但该网络目前尚未完全去中心化。我们预计很快会有更多的 keyper 加入并增强网络的弹性。
本项目以开源形式发布,并按“原样”提供,不提供任何明示或暗示的保证。对于因使用或误用此 API 而引起的任何问题、损失或损害,开发者和贡献者不承担任何责任。使用风险自负。
本指南将帮助你将 Shutter 的 Commit and Reveal Scheme 集成到你的去中心化应用程序 (dApp) 中。Shutter 系统提供安全、去中心化和防篡改的 commit-and-reveal 工作流程,确保你应用程序的完整性和机密性。
Shutter 系统利用阈值加密、分布式密码学操作和去中心化基础设施来安全地处理承诺。核心组件包括:
本文档将指导你完成以下操作:
API 访问: 目前,访问是免费的,但 Gnosis Mainnet 有速率限制。你只需要在以下地址查询 API 端点:
https://shutter-api.chiado.staging.shutter.network/api/[ADD_ENDPOINT]
https://shutter-api.shutter.network/api/[ADD_ENDPOINT]
Shutter Registry Contract 的地址:
0x2693a4Fb363AdD4356e6b80Ac5A27fF05FeA6D9F
0x694e5de9345d39C148DA90e6939A3fd2142267D9
API 的地址:
0xb9C303443c9af84777e60D5C987AbF0c43844918
0x228DefCF37Da29475F0EE2B9E4dfAeDc3b0746bc
对于未经授权的访问,Gnosis Mainnet 上的 API 受到速率限制,每个端点和远程 ip 都有以下限制:
/register_identity
每 24 小时 5 个请求/get_data_for_encryption
每 24 小时 10 个请求/get_decryption_key
每 24 小时 20 个请求/decrypt_commitment
每 24 小时 10 个请求我们建议使用 Chiado 进行开发,因为它没有速率限制。
如果你需要更高的限制,请联系 loring@brainbot.com 以申请 API 密钥。
授权请求有以下限制:
/register_identity
每 24 小时 500 个请求/get_data_for_encryption
每 24 小时 1000 个请求/get_decryption_key
每 24 小时 2000 个请求/decrypt_commitment
每 24 小时 1000 个请求授权通过在使用 API 时使用 Authorization: Bearer $API_KEY
标头来完成。
使用 /check_authentication
端点来测试你的 API 密钥。
要开始使用 Shutter 系统,请注册一个身份并指定一个基于时间的解密触发器。此步骤将身份链接到解密密钥,并将密钥的发布条件设置为 Unix 时间戳。
有关参数和响应的详细信息,请参阅 Swagger 文档中的 /register_identity
端点。
注意: 通过我们的 API 注册身份时,API 帐户地址用于计算将返回的身份。如果你想使用自己的地址,则需要将注册直接提交到注册合约。合约的定义可以在这里找到: ShutterRegistry.sol.
curl -X POST https://<API_BASE_URL>/register_identity \
-H "Content-Type: application/json" \
-d '{
"decryptionTimestamp": 1735044061,
"identityPrefix": "0x79bc8f6b4fcb02c651d6a702b7ad965c7fca19e94a9646d21ae90c8b54c030a0"
}'
{
"eon": 1,
"eon_key": "0x57af5437a84ef50e5ed75772c18ae38b168bb07c50cadb65fc6136604e662255",
"identity": "0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75",
"identity_prefix": "0x79bc8f6b4fcb02c651d6a702b7ad965c7fca19e94a9646d21ae90c8b54c030a0",
"tx_hash": "0x3026ad202ca611551377eef069fb6ed894eae65329ce73c56f300129694f12ba"
}
要加密承诺,请获取与你的身份关联的加密数据。使用 /get_data_for_encryption
端点检索所有必要的加密数据。
有关此端点的详细信息,请参阅 Swagger 文档。
curl -X GET "https://<API_BASE_URL>/get_data_for_encryption?address=0xb9C303443c9af84777e60D5C987AbF0c43844918&identityPrefix=0x79bc8f6b4fcb02c651d6a702b7ad965c7fca19e94a9646d21ae90c8b54c030a0"
{
"eon": 1,
"eon_key": "0x57af5437a84ef50e5ed75772c18ae38b168bb07c50cadb65fc6136604e662255",
"identity": "0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75",
"identity_prefix": "0x79bc8f6b4fcb02c651d6a702b7ad965c7fca19e94a9646d21ae90c8b54c030a0",
"epoch_id": "0x88f2495d1240f9c5523db589996a50a4984ee7a08a8a8f4b269e4345b383310abd2dc1cd9c9c2b8718ed3f486d5242f5"
}
以下 Go 代码演示了如何使用从 Shutter API 检索的加密数据来加密承诺:
// NOTE: This example requires the "github.com/shutter-network/shutter/shlib/shcrypto" package.
// Make sure to install it in your Go environment before running this code.
package main
import (
"crypto/rand"
"encoding/hex"
"fmt"
"log"
"strings"
"github.com/shutter-network/shutter/shlib/shcrypto"
)
func main() {
// Encryption data provided by the Shutter API
identityHex := "0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75"
eonPublicKeyHex := "0x57af5437a84ef50e5ed75772c18ae38b168bb07c50cadb65fc6136604e662255"
message := []byte("please hide this message")
identityHex = strings.TrimPrefix(identityHex, "0x")
eonPublicKeyHex = strings.TrimPrefix(eonPublicKeyHex, "0x")
// Convert hex strings to bytes
identity, err := hex.DecodeString(identityHex)
if err != nil {
log.Fatalf("Failed to decode identity: %v", err)
}
eonPublicKeyBytes, err := hex.DecodeString(eonPublicKeyHex)
if err != nil {
log.Fatalf("Failed to decode eon public key: %v", err)
}
// Create EonPublicKey struct from bytes
eonPublicKey := &shcrypto.EonPublicKey{}
if err := eonPublicKey.Unmarshal(eonPublicKeyBytes); err != nil {
log.Fatalf("Failed to unmarshal EonPublicKey: %v", err)
}
// Compute the Epoch ID from the identity
epochID := shcrypto.ComputeEpochID(identity)
// Generate a random sigma
sigma, err := shcrypto.RandomSigma(rand.Reader)
if err != nil {
log.Fatalf("Failed to generate random sigma: %v", err)
}
// Encrypt the message
encryptedCommitment := shcrypto.Encrypt(message, eonPublicKey, epochID, sigma)
// Marshal the encrypted commitment into bytes
encryptedCommitmentBytes := encryptedCommitment.Marshal()
// Convert to hex string
encryptedCommitmentHex := "0x" + hex.EncodeToString(encryptedCommitmentBytes)
// Print the encrypted commitment
fmt.Printf("Encrypted Commitment: %s\n", encryptedCommitmentHex)
}
你也可以使用我们的 Shutter TypeScript SDK 轻松地加密承诺:
import { encryptData } from "@shutter-network/shutter-sdk";
import { stringToHex } from "viem";
// Encryption data provided by the Shutter API
const eonKeyHex = "0x57af5437a84ef50e5ed75772c18ae38b168bb07c50cadb65fc6136604e662255";
const identityPreimageHex = "0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75";
const msgHex = stringToHex("please hide this message")
// some random sigma
const sigmaHex = "0x312c10b186086d502ba683cffc2ae650d53b508904b3c430df8e7d5aa336c0f5";
// Encrypt the message
const encryptedCommitment = await encryptData(message, eonPublicKey, identityPreimageHex, sigma);
// Print the encrypted commitment
console.log("Encrypted Commitment:", encryptedCommitment);
在满足解密触发条件(即,指定的的时间戳已过)后,使用 /get_decryption_key
端点检索解密密钥。
有关详细用法,请参阅 Swagger 文档。
curl -X GET "https://<API_BASE_URL>/get_decryption_key?identity=0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75"
{
"decryption_key": "0x99a805fc26812c13041126b25e91eccf3de464d1df7a95d1edca8831a9ec02dd",
"decryption_timestamp": 1735044061,
"identity": "0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75"
}
获得解密密钥后,使用它来解密使用 Shutter 系统加密的承诺。/decrypt_commitment
端点启用此过程。
有关端点详细信息,请参阅 Swagger 文档。
curl -X GET "https://<API_BASE_URL>/decrypt_commitment?identity=0x8c232eae4f957259e9d6b68301d529e9851b8642874c8f59d2bd0fb84a570c75&encryptedCommitment=0x03b5685a460a95ba628e04b24155d6722f7c4e376a1627f714a4ae9cecd2982e005eff12ac8150b8842c29f8d5eaf4d0da0b626f762b4826d779d8969b577acb28df96cab026aa57c00cd74b07ca51e8c0c1a59933e29a728311900ebfc26c6804260914c96cb10dbd6d2ed3f6cb77788a74b5aae5f4ce6f40be53310a0524d42d5a6f03b5c1517ec097553733e228276fcdfc4b569f7ef4311a461d68819d634c"
{
"decrypted_message": "0x706c6561736520686964652074686973206d657373616765"
}
解密后的消息以十六进制格式返回。要获取初始消息,请将解密后的消息转换为字符串。
注意: 将所有示例请求中的
<API_BASE_URL>
替换为 API 的实际基本 URL,该 URL 位于先决条件部分中,例如https://shutter-api.shutter.network/api
。
基于事件和基于区块的触发器 未来版本的 Shutter 系统将支持基于事件和基于区块的解密触发器,以增强功能。
实时通知 计划的更新包括基于 WebSocket 的实时密钥发布通知,从而改善用户体验和交互性。
Keyper 集旨在优雅地处理停机时间。任何错过的解密密钥发布都会在恢复后发送。
Shutter 系统使用阈值加密和分布式密码学操作来确保没有单个实体可以危及承诺的安全性。
有关详细的 API 规范,包括参数、响应和错误代码,请访问 Swagger 文档:
如需其他支持或咨询:
感谢你使用 Shutter! 让我们一起构建一个更安全和去中心化的未来。
- 原文链接: github.com/shutter-netwo...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!