{"content":{"title":"Polygon zkEVM的Roll-up交易形式和zkProver","body":"## Roll-up交易形式\r\n\r\n在polygon zkEVM上面部署了一个简单的存储合约，合约地址为`0xB5FeE9758E6f98F793B83d11332A6126A0D26C09`\r\n\r\n合约源码为\r\n\r\n```\r\n// SPDX-License-Identifier: GPL-3.0\r\n\r\npragma solidity >=0.7.0 <0.9.0;\r\n\r\n/**\r\n * @title Storage\r\n * @dev Store & retrieve value in a variable\r\n * @custom:dev-run-script ./scripts/deploy_with_ethers.ts\r\n */\r\ncontract Storage {\r\n\r\n    uint256 number;\r\n\r\n    /**\r\n     * @dev Store value in variable\r\n     * @param num value to store\r\n     */\r\n    function store(uint256 num) public {\r\n        number = num;\r\n    }\r\n\r\n    /**\r\n     * @dev Return value \r\n     * @return value of 'number'\r\n     */\r\n    function retrieve() public view returns (uint256){\r\n        return number;\r\n    }\r\n}\r\n```\r\n\r\n调用store方法，参数为1，调用的交易为\r\n\r\n[Transaction 0x661b76b668bc5657e913b4c8b93703465ad5e6f66d078f0e961071db31e98278 - Polygon zkEVM Explorer (zkevm-test.net)](https://explorer.public.zkevm-test.net/tx/0x661b76b668bc5657e913b4c8b93703465ad5e6f66d078f0e961071db31e98278)\r\n\r\n\r\n\r\n\r\n\r\n在L1 goerli 上面查看到对应的batch交易为\r\n\r\n\r\n\r\n[Goerli Transaction Hash (Txhash) Details | Etherscan](https://goerli.etherscan.io/tx/0x90e4c52b761ab836f0c2cfbed804aa082f10582bc426b790e813f2886b8367ec)\r\n\r\n\r\n\r\n利用etherscan的解码得到明文方法和参数：\r\n\r\n\r\n\r\n\r\n![image-20230306145506594.png](https://img.learnblockchain.cn/attachments/2023/03/I83czS9u64058e9dd6726.png)\r\n\r\n\r\n\r\n使用[0xPolygonHermez/zkevm-node: Go implementation of a node that operates the Polygon zkEVM Network (github.com)](https://github.com/0xPolygonHermez/zkevm-node)项目中的tool目录下的rlp工具逐个对其进行解码，\r\n\r\n\r\n\r\n命令为：` .\\rlp.exe decode batches.transactions`\r\n\r\n\r\n\r\n在每一项的解码信息中查找`0xB5FeE9758E6f98F793B83d11332A6126A0D26C09`，查找出第二项的  batches.transactions 就是包含L2的调用交易的batch\r\n\r\n解码部分结果为\r\n\r\n```\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:203 ChainID: 1442   {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:204 Cost: 27483000000000    {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:205 Data: 6057361d0000000000000000000000000000000000000000000000000000000000000001  {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:206 Gas: 27483      {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:207 GasPrice: 1000000000    {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:208 Hash: 0x661b76b668bc5657e913b4c8b93703465ad5e6f66d078f0e961071db31e98278        {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:209 Nonce: 3        {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:211 V: 2920 {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:212 R: 530974631635635949339010486907209692631436427741658350470006149236213824455  {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:213 S: 52881848401511468634411360431495732564597871518086883732508981355066608394832        {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:214 To: 0xB5FeE9758E6f98F793B83d11332A6126A0D26C09  {\"pid\": 2816, \"version\": \"v0.1.0\"}\r\n```\r\n\r\n\r\n\r\n查看data的信息`6057361d0000000000000000000000000000000000000000000000000000000000000001`就是store方法的调用信息\r\n\r\n\r\n\r\n\r\n\r\n## zkProver\r\n\r\n​\t\tzkEVM中交易的证明和验证均由称为zkProver的零知识证明者组件处理。交易有效的所有规则都在zkProver中实现和执行。\r\n\r\n​\t\tzkProver以多项式和汇编语言的形式进行复杂的数学计算，随后在智能合约上进行验证。这些规则可以被看作是交易必须遵循的约束，以便能够修改状态树或退出树。\r\n\r\n​\t\tzkProver主要与两个组件进行交互，即节点和数据库（DB）。因此，在深入研究其他组件之前，我们必须了解zkProver、节点和数据库之间的控制流。这里有一张图来清楚地解释这个过程。\r\n\r\n![zkProver, the Node, and Database ](https://wiki.polygon.technology/assets/images/fig1-zkprv-and-node-f20c428f92f99dfcec62cd20340e41cf.png)\r\n\r\n\r\n\r\n正如上面的流程图所描述的，整个互动过程分为4个步骤。\r\n\r\n1.→ 节点将Merkle树的内容发送到数据库以存储在那里\r\n\r\n2 → 节点然后将输入的交易发送到zkProver。\r\n\r\n3 → zkProver访问数据库并获取为节点发送的交易产生可验证的证明所需的信息。这些信息包括Merkle根、相关兄弟姐妹的密钥和哈希值，以及更多。\r\n\r\n4 → 然后zkProver生成交易证明，并将这些证明发回给节点\r\n\r\n\r\n\r\n## 关键信息\r\n\r\n\r\n\r\nzkProver安装配置要求: 1TB RAM with 128-core CPU\r\n\r\n\r\n\r\nzkProver是一个黑盒实现，polygon的zkEVM node 依赖于zkProver\r\n\r\n\r\n\r\nzkProver 源码： [0xPolygonHermez/zkevm-prover: zkEVM prover in C++ (github.com)](https://github.com/0xPolygonHermez/zkevm-prover)\r\n\r\n\r\n\r\nzkEVM插件关系图：\r\n\r\n\r\n![architecture.drawio.png](https://img.learnblockchain.cn/attachments/2023/03/vgcMPE6p64058eab20454.png)"},"author":{"user":"https://learnblockchain.cn/people/66","address":"0xCCF0761Ff668AAc57881af58607765573515CDA4"},"history":null,"timestamp":1678085894,"version":1}