在主网上验证 proof verifier 智能合约 (elderberry-fork.8) 的部署

本文档提供了一份详细的指南,旨在帮助用户在Mainnet上验证proof verifier智能合约(elderberry-fork.8)的部署。主要内容包括:准备工作站环境、安装和配置circom、编译生成verifier智能合约、编译合约、下载已部署合约的字节码,并最终比对两者是否一致,以验证部署的正确性。

验证主网上智能合约(elderberry-fork.8)的证明验证器部署

为了验证智能合约,你需要一台至少有 256GB 内存和 16 个核心的机器。

在本教程中,我们将提供有关 r6a.8xlarge aws 实例的说明。此实例有 16 个核心 32 线程,512GB 的 SSD。该实例将使用 Ubuntu 22.04 LTS,实例的成本约为 1.82 美元/小时。这个过程非常长,大约需要 5-6 个小时。

那么让我们从启动实例开始。

基本操作系统准备

sudo apt update
sudo apt install -y tmux git curl jq

调整操作系统以接受大量内存。

echo "vm.max_map_count=655300" | sudo tee -a /etc/sysctl.conf
sudo sysctl -w vm.max_map_count=655300
export NODE_OPTIONS="--max-old-space-size=230000"

安装 node 和 npm 的版本

curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt install -y nodejs
node -v

node 的版本应该是:18(例如 18.19.0)

下载并准备 circom

要编译电路,我们需要安装 circom。

cd ~
git clone https://github.com/iden3/circom.git
cd circom
git checkout v2.1.8
git log --pretty=format:'%H' -n 1

提交的哈希应该是:f0deda416abe91e5dd906c55507c737cd9986ab5

安装并编译 circom (RUST)

cd ~
sudo apt install -y cargo
cd circom
cargo build --release
cargo install --path circom
export PATH=$PATH:~/.cargo/bin
echo 'PATH=$PATH:~/.cargo/bin' >> ~/.profile
circom --version

circom 的版本应该是:2.1.8

准备快速构建常量树工具

cd ~
git clone https://github.com/0xPolygonHermez/zkevm-prover.git
cd zkevm-prover
git checkout 40cde45deacede2b10a91ce2dd926abd2ba67541
git submodule init
git submodule update
sudo apt install -y build-essential libomp-dev libgmp-dev nlohmann-json3-dev libpqxx-dev nasm libgrpc++-dev libprotobuf-dev grpc-proto libsodium-dev uuid-dev libsecp256k1-dev
make -j bctree

此步骤耗时不到 1 分钟。

准备并启动设置 (zkevm-proverjs)

cd ~
git clone https://github.com/0xPolygonHermez/zkevm-proverjs.git
cd zkevm-proverjs
git checkout 1f228c110be466ec8b91d251713df4194ba49aeb
npm install
tmux -c "npm run buildsetup --bctree=../zkevm-prover/build/bctree"

此步骤非常长,大约需要 4.5 小时。4.5 小时中的 2 小时用于 powersOfTau28_hez_final.ptau 下载,这是一个 288GB 的文件,只会加载一次。

注意:在文档末尾有一个表格,其中包含在此过程中生成的所有文件的哈希值。

编译生成的验证器智能合约 (solidity)

作为先前步骤的最终结果,已经生成了验证测试的智能合约。该文件是 final.fflonk.verifier.sol。此时,可以使用源代码验证智能合约,或者验证字节码是否相同。要验证字节码,你必须使用完全相同的版本、编译器和参数进行编译,以确保即使是包含在字节码中的元数据哈希也完全相同。以下说明生成一个使用 hardhat 工具构建的项目。

cd ~
mkdir contract
cd contract
npm init -y
npm install hardhat
mkdir -p contracts/verifiers

要生成相同的 bytecode,重要的是恢复编译期间使用的完全相同的选项,我们在 etherscan(设置)上的合约信息中找到了这些信息。 将此信息复制到 ~/contract/settings.json 文件中,如下所示:

cd ~/contract
cat <<EOF >settings.json
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "evmVersion": "shanghai",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}
EOF

之后,执行以下命令。

cd ~/contract
echo -e "module.exports={solidity:{compilers:[{version: \"0.8.20\",settings:$(cat settings.json)}]}}" > hardhat.config.js

创建项目结构后,我们继续复制在上一步中生成的智能合约。此智能合约保存在 ~/zkevm-proverjs/build/proof_ 中,并且必须使用完全相同的名称 Verifier.sol 复制到 contracts/verifiers 中。如果名称或路径发生更改,元数据的哈希也会更改,因此必须遵守名称和路径。为此,可以执行以下命令

cd ~/contract
cp ~/zkevm-proverjs/build/proof/final.fflonk.verifier.sol contracts/verifiers/FflonkVerifier.sol
sha256sum contracts/verifiers/FflonkVerifier.sol

结果应该是:

9bf2d96c589a64ba8ebde36f280993d1dc0ac3ca3cac1d09b5550055b8a523e8

要编译智能合约,请执行以下命令:

npx hardhat compile

注意:编译期间显示警告: 警告:未使用的函数参数。删除或注释掉变量名以消除此警告。 --> contracts/verifiers/FflonkVerifier.sol:162:26:

智能合约的字节码位于 json 文件 FflonkVerifier 的 bytecode 属性中,该文件在路径 artifacts/contracts/verifiers/FflonkVerifier.sol/ 上生成

608060405234801561001057600080fd5b506159
ee80620000216000396000f3fe60806040523480
1561001057600080fd5b506004361061002b5760
003560e01c80639121da8a14610030575b600080
fd5b61004361003e366004615973565b61005756
5b604051901515815260200160405180910390f3
5b6000615901565b6040516104c0820151808252
6020820191507f30644e72e131a029b85045b681
81585d2833e84879b9709143e1f593f000000161
04e0840151820990508082526020820191507f30
:
:
81612878565b61593a83826128b1565b61594381
612911565b61594c81613e61565b615955816145
59565b61595e816151f0565b615967816156ee56
5b90508060005260206000f35b60008061032080
848603121561598857600080fd5b610300840185
81111561599a57600080fd5b8493508582860111
156159ac57600080fd5b80925050509250929050
56fea2646970667358221220065c100f41ce696b
303e853b86cdaa6a5ef43dec684aa118e566f3fa
613427c464736f6c63430008140033

验证编译的字节码:

cd ~/contract
cat ./artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json | jq .bytecode -r | tee FflonkVerifier.sol.compiled.bytecode | sha256sum

结果应该是:

27270e1846e7e8512ab9cc311a96a1425a03adda282b18d5beb521dfe09c3d22

下载已部署智能合约的字节码

要下载已部署智能合约的字节码,需要智能合约的地址,在本例中为 0x4AaBBA26EA9E7A7fbD052d17a167e6aE3F8eC7Be

通过手动复制数据下载

转到 Etherscan 或 Beaconcha 获取交易字节码。

与地址 0x4AaBBA26EA9E7A7fbD052d17a167e6aE3F8eC7Be 关联,找到交易 0x6cc2cbf18cefe30ec2b4776b525e187f06f88bb52fe94c1b0dd2629b199fd9c9

注意:不要使用“复制原始数据”按钮,因为它会生成不兼容的格式。

某些在终端上运行的应用程序可能会限制它们在输入缓冲区溢出之前接受的输入量。为避免这种情况,请使用 nano 或 vi 等编辑器创建文件 FflonkVerifier.sol.explorer.bytecode

cd ~/contract
nano FflonkVerifier.sol.explorer.bytecode

在 nano 中,要将剪贴板粘贴到文件中,请使用 CTRL+P,使用 CTRL+X 保存内容,最后按 Y。

通过 L1 端点调用下载

cd ~/contract
L1_ENDPOINT=<YOUR_L1_ENDPOINT_HERE>
 curl -s -X POST -H "Content-Type: application/json" --data '{"method":"eth_getTransactionByHash","params":["0x6cc2cbf18cefe30ec2b4776b525e187f06f88bb52fe94c1b0dd2629b199fd9c9"], "id":1,"jsonrpc":"2.0"}' $L1_ENDPOINT | jq .result.input -r > FflonkVerifier.sol.explorer.bytecode

比较字节码

要比较两个文件是否相同,可以使用 diff。

cd ~/contract
diff FflonkVerifier.sol.compiled.bytecode FflonkVerifier.sol.explorer.bytecode

或者,你可以使用 sha256sum 检查内容:

cd ~/contract
sha256sum FflonkVerifier.sol.*.bytecode

结果应该是:

27270e1846e7e8512ab9cc311a96a1425a03adda282b18d5beb521dfe09c3d22  FflonkVerifier.sol.compiled.bytecode
27270e1846e7e8512ab9cc311a96a1425a03adda282b18d5beb521dfe09c3d22  FflonkVerifier.sol.explorer.bytecode

生成的文件哈希

<font size=2> <table> <tr><th>step/file</th><th>sha256</th></tr> <tr><td colspan=2><b>buildrom</b></td></tr> <tr><td>rom.json</td><td>676c3f58263fc284bc53ef949dd1acedcfb090f3287ee080b2a277ed2157894a</td></tr> <tr><td colspan=2><b>buildpil</b></td></tr> <tr><td>main.pil.json</td><td>e6220953585202f5ecfaa8d7bb2fe3d06bf85fb0af22c2fe46a97abd39ae9aa7</td></tr> <tr><td colspan=2><b>buildstoragerom</b></td></tr> <tr><td>storage_sm_rom.json</td><td>676c3f58263fc284bc53ef949dd1acedcfb090f3287ee080b2a277ed2157894a</td></tr> <tr><td colspan=2><b>buildconstants</b></td></tr> <tr><td>zkevm.const</td><td>ca00d4c994f4793c14b19a9a26f17f170165b9177ada598f94a416604a6ec0b8</td></tr> <tr><td colspan=2><b>buildstarkinfo</b></td></tr> <tr><td>zkevm.starkstruct.json</td><td>284b6ce275c637af4a0b4b10cd83a881c6f1b21e21ad7ea2276379ed8393b099</td></tr> <tr><td>zkevm.starkinfo.json</td><td>cd4615be096817d14b3b19780897ad39f5cd26f83e5d17518dae7688563fcb54</td></tr> <tr><td colspan=2><b>buildconstanttree</b></td></tr> <tr><td>zkevm.verkey.json</td><td>466b663f730c032b235e7c9ac57d4492bdeea51af8b62bc204ef20700de88c6d</td></tr> <tr><td>zkevm.consttree</td><td>ca00d4c994f4793c14b19a9a26f17f170165b9177ada598f94a416604a6ec0b8</td></tr> <tr><td colspan=2><b>gencircom</b></td></tr> <tr><td>zkevm.verifier.circom</td><td>4a9abd5c5d31f3675cac455fb4e8e06a1f524d86e4e6e18f32f0090f017c9f6d</td></tr> <tr><td colspan=2><b>compilecircom</b></td></tr> <tr><td>zkevm.verifier.r1cs</td><td>3ed36eec0462885d480e6e3023f91e0265aad8c5556aa33d6c7b34e866e59605</td></tr> <tr><td>zkevm.verifier.sym</td><td>57803c3774b227440b0cae55bace553a198ec675d8bdae72b37bbc2a59b7d9c9</td></tr> <tr><td colspan=2><b>c12a_setup</b></td></tr> <tr><td>c12a.pil</td><td>13b74f6e33dcbfcb9aa1a5eb7a93691635f51f33aa91e7c867dec11509c93f4d</td></tr> <tr><td>c12a.const</td><td>96b15b147af5ffcf08f2692d6bcbc149ca46521f80a2d5476da017c78c673cb7</td></tr> <tr><td>c12a.exec</td><td>6fe8e529645f1b72de3851ecd50dde6b830846c4cd3af0b83267151b11ec45e1</td></tr> <tr><td colspan=2><b>c12a_buildstarkinfo</b></td></tr> <tr><td>c12a.starkstruct.json</td><td>c8ceea75f0aa05fdbdb20ac41b224355fde07a0dbeecd6649ff8c2636b9a759c</td></tr> <tr><td>c12a.starkinfo.json</td><td>c05b27f4538e8071a0e8045faeb8a6de8771053587ad657b07c9401b9597a663</td></tr> <tr><td colspan=2><b>c12a_buildconstanttree</b></td></tr> <tr><td>c12a.verkey.json</td><td>20f9ed1d602fe5155c0c93f342fda579987cd85b9011fd8658a427ffd09e7468</td></tr> <tr><td>c12a.consttree</td><td>96b15b147af5ffcf08f2692d6bcbc149ca46521f80a2d5476da017c78c673cb7</td></tr> <tr><td colspan=2><b>c12a_gencircom</b></td></tr> <tr><td>c12a.verifier.circom</td><td>63c0537db15875dd0e61696c5b97344424f1a1dffaa201ae04bded78feb5bb0e</td></tr> <tr><td colspan=2><b>recursive1_gencircom</b></td></tr> <tr><td>recursive1.circom</td><td>83543e99e0a1f660761fa8a06310dfd9b69d0c0a358a73b6baec55d9587234e5</td></tr> <tr><td colspan=2><b>recursive1_compile</b></td></tr> <tr><td>recursive1.r1cs</td><td>9ef158594515431ac644c0b79cc9b3ca441754ea98529e1ae2db176ccced110a</td></tr> <tr><td>recursive1.sym</td><td>f2db344f3289e513fc8a9cacc68b697a39a410fae834bdc8feabee7b394cabc0</td></tr> <tr><td colspan=2><b>recursive1_setup</b></td></tr> <tr><td>recursive1.pil</td><td>94ea2856942dd0745e2d6443c6988a4fdc65ac2c3173633e897e02b6d7eaad8b</td></tr> <tr><td>recursive1.const</td><td>f81f9d99dc7be4ec8ce515a0d58958e10d09aaefabd778164fc4f076bbf273d0</td></tr> <tr><td>recursive1.exec</td><td>359e6e221cefd35827960ff5cf9cd506ba5e2a5ec92c33312a5903ce087aa155</td></tr> <tr><td colspan=2><b>recursive1_buildstarkinfo</b></td></tr> <tr><td>recursive.starkstruct.json</td><td>8bc8b44a7e493e447af7c04d1a362c2198f3e9b29e425248b7646c36b67fd02c</td></tr> <tr><td>recursive1.starkinfo.json</td><td>ab63b4008c2b2e769519ff3df4ba6130d66b8d6778c0ba0fb7724d5a4a9e2841</td></tr> <tr><td colspan=2><b>recursive1_buildconstanttree</b></td></tr> <tr><td>recursive1.verkey.json</td><td>883d526a0a9027641307a56f3cf94bbd3072d98413273f424c5026951277aec6</td></tr> <tr><td>recursive1.consttree</td><td>f81f9d99dc7be4ec8ce515a0d58958e10d09aaefabd778164fc4f076bbf273d0</td></tr> <tr><td colspan=2><b>recursive1_verifier_gencircom</b></td></tr> <tr><td>recursive1.verifier.circom</td><td>835cf0a8c4706ced7395957a8bef1e00b70d1007586c9fccf107f12b4936dea5</td></tr> <tr><td colspan=2><b>recursive2_gencircom</b></td></tr> <tr><td>recursive2.circom</td><td>c936419331d9d07aacdc912002d30bce42baa2c05a956b51d12580c82276803a</td></tr> <tr><td colspan=2><b>recursive2_compile</b></td></tr> <tr><td>recursive2.r1cs</td><td>b2c0f5fb9ccda0474e246cdeca3e34fc5907cd5b34f15f2192b163fb53062376</td></tr> <tr><td>recursive2.sym</td><td>a47d475bcb09309b2100bfc19ce4c4baa9cee2699373290569617d71fcf51a64</td></tr> <tr><td colspan=2><b>recursive2_setup</b></td></tr> <tr><td>recursive2.pil</td><td>94ea2856942dd0745e2d6443c6988a4fdc65ac2c3173633e897e02b6d7eaad8b</td></tr> <tr><td>recursive2.const</td><td>381fcf6ad4237bdbf878473f854053849a7decfbaab6c846624c41d3000ef5b8</td></tr> <tr><td>recursive2.exec</td><td>f32201da15042d9167dc8dd6707c2920d7d2e772d411566739ac874bdbf269fb</td></tr> <tr><td colspan=2><b>recursive2_buildstarkinfo</b></td></tr> <tr><td>recursive2.starkinfo.json</td><td>ab63b4008c2b2e769519ff3df4ba6130d66b8d6778c0ba0fb7724d5a4a9e2841</td></tr> <tr><td colspan=2><b>recursive2_buildconstanttree</b></td></tr> <tr><td>recursive2.verkey.json</td><td>a2477ca847f493163113860a42ecede027bc67b4935e5ab30f2e825009363a47</td></tr> <tr><td>recursive2.consttree</td><td>381fcf6ad4237bdbf878473f854053849a7decfbaab6c846624c41d3000ef5b8</td></tr> <tr><td colspan=2><b>recursive2_verifier_gencircom</b></td></tr> <tr><td>recursive2.verifier.circom</td><td>835cf0a8c4706ced7395957a8bef1e00b70d1007586c9fccf107f12b4936dea5</td></tr> <tr><td colspan=2><b>recursivef_gencircom</b></td></tr> <tr><td>recursivef.circom</td><td>68ba6079a221f4cfe3afd071e8df62c38309f34d0633f5574cf76750d8fe2066</td></tr> <tr><td colspan=2><b>recursivef_compile</b></td></tr> <tr><td>recursivef.r1cs</td><td>f45f7a9caa97913263f81ba31630dd615403f9fe3d72478a270b65b1be8a468e</td></tr> <tr><td>recursivef.sym</td><td>fcbe9cd852065f1224a82f8b595d2c7aaa9fdbc616ef9048714105d69d988cd7</td></tr> <tr><td colspan=2><b>recursivef_setup</b></td></tr> <tr><td>recursivef.pil</td><td>62527bfc12f535e8fa3a6dd7055bc595b27fc491f7203987108ee3d13283dbfe</td></tr> <tr><td>recursivef.const</td><td>a74d6e18aab5a524c0e1ea87001cdd88cb20fcf8a957e831d28b58b116cb358d</td></tr> <tr><td>recursivef.exec</td><td>1751c8a070d68cc64aa7d932a1785330da24139e547805e583f5407c5600715e</td></tr> <tr><td colspan=2><b>recursivef_buildstarkinfo</b></td></tr> <tr><td>recursivef.starkstruct.json</td><td>ba99ad986178db98b1a867bb9d8592fa6ba5c29d9233fd939d01424425ce6cba</td></tr> <tr><td>recursivef.starkinfo.json</td><td>8d6e9503550ad8bdde303af5b37ad0320171d4f180fc11323b58fbf8d82bb1a6</td></tr> <tr><td colspan=2><b>recursivef_buildconstanttree</b></td></tr> <tr><td>recursivef.verkey.json</td><td>f41c6973c1a71970af291da4177f11f1b7accda7654c63169c607efeef5981e6</td></tr> <tr><td>recursivef.consttree</td><td>a74d6e18aab5a524c0e1ea87001cdd88cb20fcf8a957e831d28b58b116cb358d</td></tr> <tr><td colspan=2><b>recursivef_verifier_gencircom</b></td></tr> <tr><td>recursivef.verifier.circom</td><td>3607ed5c1ec397aaa35a09122128d57896b0b9ae648a273721f23c82f69eca30</td></tr> <tr><td colspan=2><b>final_gencircom</b></td></tr> <tr><td>final.circom</td><td>74a06304ce73b282a520c358baead152dad790b0aa6b7031f6ba8c00166be459</td></tr> <tr><td colspan=2><b>final_compile</b></td></tr> <tr><td>final.r1cs</td><td>8980408e97bd37a12dcb3cca90309421a25b17d899a9021a7eb55d86c46b4eb5</td></tr> <tr><td>final.sym</td><td>9c20071021039f3f82b3ecb471402949cbbc290812da97f47aae4b13ad73342d</td></tr> <tr><td colspan=2><b>fflonk_setup</b></td></tr> <tr><td>final.fflonk.zkey</td><td>95f221bb359705463b02c43e7c7fc3928676dfc4e2a788504d2009a598f144ee</td></tr> <tr><td colspan=2><b>fflonk_evk</b></td></tr> <tr><td>final.fflonk.verkey.json</td><td>65fe92de992fa6a8e43760dd4c7629d700dd9cb4ef8c4210581b6e277fec104a</td></tr> <tr><td>dependencies.txt</td><td>1201d73ded9420e99e434147a91f82200781bb6b6348dfca6439f315b9612672</td></tr> <tr><td colspan=2><b>fflonk_solidity</b></td></tr> <tr><td>final.fflonk.verifier.sol</td><td>9bf2d96c589a64ba8ebde36f280993d1dc0ac3ca3cac

  • 原文链接: github.com/0xPolygonHerm...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
0xPolygonHermez
0xPolygonHermez
江湖只有他的大名,没有他的介绍。