在 BSV 上创建你的第一个零知识证明程序

ZoKrateszkSNARKs 的工具箱,隐藏了零知识证明 (ZKP) 固有的显着复杂性。它为开发人员提供了一种类似于 python 的高级语言来编写他们想要证明的计算问题。

我们扩展了它,使其支持在 BSV 上生成和验证的证明。

在这里插入图片描述

安装Zokrates

二进制包安装

下载并使用我们发布的二进制包:

二进制文件可以从我们的 发布页面 下载。

编译源码安装

git clone -b main https://github.com/sCrypt-Inc/ZoKrates
./build_release.sh
cd target/release

Zokrates 工作流程

整个工作流程与原始 ZoKrates 相同,只是验证步骤是在 BSV 上完成的。

1. 编写电路

创建一个名为 factor.zok 的新 Zokrates 文件,其内容如下:

// p and q are factorization of n
def main(private field p, private field q, field n) {
    assert(p * q == n);
    assert(p > 1);
    assert(q > 1);
    return;
}

这个简单的电路/程序证明了某人知道将整数 n 分解为两个整数,而无需透露整数。该电路有两个名为 pq 的私有输入和一个名为 n 的公共输入。

2. 编译电路

使用以下命令编译电路:

zokrates compile -i factor.zok

这会生成两个对电路进行编码的文件,一个是二进制格式和一个人类可读的格式。

3. 设置

这将为该电路生成一个证明密钥和一个验证密钥。

zokrates setup

4. 计算见证人

一份证明可以证明证明者知道满足电路的隐私信息。这个秘密信息被称为见证人。在以下示例中,713 是见证,因为它们是 91 的因数。

zokrates compute-witness -a 7 13 91

生成一个名为 witness 的文件。

5. 生成证明

它使用证明密钥和见证人生成证明。

zokrates generate-proof

证明文件 proof.json 如下所示:

{
  "scheme": "g16",
  "curve": "bn128",
  "proof": {
    "a": [
      "0x0a7ea3ca37865347396645d017c7623431d13103e9107c937d722e5da15f352b",
      "0x040c202ba8fa153f84af8dabc2ca40ff534f54efeb3271acc04a70c41afd079b"
    ],
    "b": [
      [
        "0x0ec1e4faea792762de35dcfd0da0e6859ce491cafad455c334d2c72cb8b24550",
        "0x0985ef1d036b41d44376c1d42ff803b7cab9f9d4cf5bd75298e0fab2d109f096"
      ],
      [
        "0x265151afd8626b4c72dfefb86bac2b63489423d6cf895ed9fa186548b0b9e3f3",
        "0x301f2b356621408e037649d0f5b4ad5f4b2333f58453791cc24f07d5673349bf"
      ]
    ],
    "c": [
      "0x2b75a257d68763100ca11afb3beae511732c1cd1d3f1ce1804cbc0c26043cb6b",
      "0x2f80c706b58482eec9e759fce805585595a76c27e37b67af3463414246fbabbd"
    ]
  },
  "inputs": [
    "0x000000000000000000000000000000000000000000000000000000000000005b"
  ]
}

6. 导出 sCrypt 验证程序

这会输出一个智能合约文件 verifier.scrypt,其中包含验证证明所需的所有代码。

zokrates export-verifier-scrypt

7. 部署验证程序

您现在可以将 verifier.scrypt 部署到 BSV 。最简单的方法是使用 sCrypt IDE

在这里插入图片描述

右键单击并选择 Deploy Contract: Debug

在这里插入图片描述

合约将在几分钟内编译完成,之后应弹出以下面板。单击部署按钮。

在这里插入图片描述

如果一切顺利,应该已经部署了验证者合约。

在这里插入图片描述

8. 验证证明

接下来,您需要从 proof.json 复制并粘贴到 Call 面板中,然后单击 Call unlock()

在这里插入图片描述
如果一切正常,通过支出交易可以看到证明通过验证。

总结

恭喜!你刚刚在 BSV 上创建了你的第一个零知识证明程序。接下来,您可以扩展模板 verifier.scrypt 并添加您自己的业务逻辑。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 Go 和 PHP 通讯的 RSA 加密源码示例: Go 代码: ```go package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "fmt" "io/ioutil" "net/http" ) func main() { // 从文件中读取公钥 pubPEM, err := ioutil.ReadFile("public.pem") if err != nil { panic(err) } pubBlock, _ := pem.Decode(pubPEM) pubKey, err := x509.ParsePKCS1PublicKey(pubBlock.Bytes) if err != nil { panic(err) } // 生成随机数据 data := make([]byte, 32) _, err = rand.Read(data) if err != nil { panic(err) } // 使用公钥加密数据 encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, data) if err != nil { panic(err) } // 发送加密后的数据到 PHP 服务器 resp, err := http.Post("http://localhost:8000/decrypt.php", "application/octet-stream", bytes.NewReader(encryptedData)) if err != nil { panic(err) } // 读取 PHP 服务器返回的解密后的数据 decryptedData, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Printf("加密前的数据:%x\n", data) fmt.Printf("加密后的数据:%x\n", encryptedData) fmt.Printf("解密后的数据:%x\n", decryptedData) } ``` PHP 代码: ```php <?php // 从文件中读取私钥 $privateKey = '-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCzB5hJw7Z8G3q3V7PzJkC5t7y8tQ9uEgPfN/47MOTeN8vNQ2fN AfnbY1W/8Czv3kUdOC6nIcGZf4m4v4aDzNu6U2QlUkGl6UvS6pO6g0o+IAwA0Zf4 1FVz1M+Y2S8zPvU6S+oCk/ggA+Tt8ImvLZ2ePt0sIYgO3OyGv3q3L/PHQQIDAQAB AoGADeKxH3aVJ+YJYd7R8NcH9QdLgOGhQ2CwVJj+mkalgeGg5cs5z5Y5K30n5AiF BgK7VY+1t8h7V9gPmtE3GqCp+D8eOZfJgZrH1a5fjK5Ob5G5p5J+J7+tK0Jt8F2Q Q1t6FWL+6JYU6yQlXKvU4d4HufStJf8ZwfcInAUvU3z3qkECQQDyJcK99sF+JNQ2 H1e8jwW+eyvI3oq3pOYdI8s1sXsXQJQ2RraL1j8Ww0oKvS6U7J6UzC6y2KjF1d4f 4B0L0oZJAkEAxKfmyr1Y5Dn0nW5p5GmzA7l0Kt5hZ2QgJ1xKjV7MzjB8bsV7yCtP Ej3pCtGZfVwZuA5r5FhE0zCt5HR5VLB9pQJBAKLOJj0Q0zxZ1x2L2LLcQOHPdYV7 8Pv9u3qfEi5hL1LZ8a0L+3qg3zEYrsHcJ8zv9XQg/2bFmTqwZj8vZiDmOCMCQG4n QzC6Fv9X4zfk4nL4GZc8lZv4pS+6OYU0k0AG6yv1X9f1+4JF4aMw0ZvUJZqk3C3f zjW8sHbXlQ64T/B+OZECQDr8OvPuxH7VjKf1YR7V/8v+u9q3h3gDpNwN8eblZ+gG eLGCz5J5W5+5k5p7mzdGJzKowmQ8F/b1CmYU6Lk/6S4= -----END RSA PRIVATE KEY----- '; $privateKey = openssl_pkey_get_private($privateKey); // 从请求中读取加密后的数据 $data = file_get_contents("php://input"); // 使用私钥解密数据 openssl_private_decrypt($data, $decryptedData, $privateKey); // 发送解密后的数据回到 Go 程序 header('Content-Type: application/octet-stream'); echo $decryptedData; ``` 注意事项: - 请确保你的公钥和私钥是一对。 - 请确保你的 PHP 程序在收到加密后的数据后能够正确地使用私钥解密数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sCrypt Web3应用开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值