Polygon zkEVM的Roll-up交易形式和zkProver

  • Duanraudon
  • 更新于 2023-03-06 14:58
  • 阅读 2019

Polygon zkEVM的Roll-up交易形式和zkProver

Roll-up交易形式

在polygon zkEVM上面部署了一个简单的存储合约,合约地址为0xB5FeE9758E6f98F793B83d11332A6126A0D26C09

合约源码为

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 * @custom:dev-run-script ./scripts/deploy_with_ethers.ts
 */
contract Storage {

    uint256 number;

    /**
     * @dev Store value in variable
     * @param num value to store
     */
    function store(uint256 num) public {
        number = num;
    }

    /**
     * @dev Return value 
     * @return value of 'number'
     */
    function retrieve() public view returns (uint256){
        return number;
    }
}

调用store方法,参数为1,调用的交易为

Transaction 0x661b76b668bc5657e913b4c8b93703465ad5e6f66d078f0e961071db31e98278 - Polygon zkEVM Explorer (zkevm-test.net)

在L1 goerli 上面查看到对应的batch交易为

Goerli Transaction Hash (Txhash) Details | Etherscan

利用etherscan的解码得到明文方法和参数:

image-20230306145506594.png

使用0xPolygonHermez/zkevm-node: Go implementation of a node that operates the Polygon zkEVM Network (github.com)项目中的tool目录下的rlp工具逐个对其进行解码,

命令为:.\rlp.exe decode batches.transactions

在每一项的解码信息中查找0xB5FeE9758E6f98F793B83d11332A6126A0D26C09,查找出第二项的 batches.transactions 就是包含L2的调用交易的batch

解码部分结果为

2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:203 ChainID: 1442   {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:204 Cost: 27483000000000    {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:205 Data: 6057361d0000000000000000000000000000000000000000000000000000000000000001  {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:206 Gas: 27483      {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:207 GasPrice: 1000000000    {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:208 Hash: 0x661b76b668bc5657e913b4c8b93703465ad5e6f66d078f0e961071db31e98278        {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:209 Nonce: 3        {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:211 V: 2920 {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:212 R: 530974631635635949339010486907209692631436427741658350470006149236213824455  {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:213 S: 52881848401511468634411360431495732564597871518086883732508981355066608394832        {"pid": 2816, "version": "v0.1.0"}
2023-03-06T11:36:17.962+0800    INFO    rlp/main.go:214 To: 0xB5FeE9758E6f98F793B83d11332A6126A0D26C09  {"pid": 2816, "version": "v0.1.0"}

查看data的信息6057361d0000000000000000000000000000000000000000000000000000000000000001就是store方法的调用信息

zkProver

​ zkEVM中交易的证明和验证均由称为zkProver的零知识证明者组件处理。交易有效的所有规则都在zkProver中实现和执行。

​ zkProver以多项式和汇编语言的形式进行复杂的数学计算,随后在智能合约上进行验证。这些规则可以被看作是交易必须遵循的约束,以便能够修改状态树或退出树。

​ zkProver主要与两个组件进行交互,即节点和数据库(DB)。因此,在深入研究其他组件之前,我们必须了解zkProver、节点和数据库之间的控制流。这里有一张图来清楚地解释这个过程。

zkProver, the Node, and Database

正如上面的流程图所描述的,整个互动过程分为4个步骤。

1.→ 节点将Merkle树的内容发送到数据库以存储在那里

2 → 节点然后将输入的交易发送到zkProver。

3 → zkProver访问数据库并获取为节点发送的交易产生可验证的证明所需的信息。这些信息包括Merkle根、相关兄弟姐妹的密钥和哈希值,以及更多。

4 → 然后zkProver生成交易证明,并将这些证明发回给节点

关键信息

zkProver安装配置要求: 1TB RAM with 128-core CPU

zkProver是一个黑盒实现,polygon的zkEVM node 依赖于zkProver

zkProver 源码: 0xPolygonHermez/zkevm-prover: zkEVM prover in C++ (github.com)

zkEVM插件关系图:

architecture.drawio.png

点赞 2
收藏 2
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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