Polygon zkEVM的Roll-up交易形式和zkProver
在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,调用的交易为
在L1 goerli 上面查看到对应的batch交易为
Goerli Transaction Hash (Txhash) Details | Etherscan
利用etherscan的解码得到明文方法和参数:
使用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方法的调用信息
zkEVM中交易的证明和验证均由称为zkProver的零知识证明者组件处理。交易有效的所有规则都在zkProver中实现和执行。
zkProver以多项式和汇编语言的形式进行复杂的数学计算,随后在智能合约上进行验证。这些规则可以被看作是交易必须遵循的约束,以便能够修改状态树或退出树。
zkProver主要与两个组件进行交互,即节点和数据库(DB)。因此,在深入研究其他组件之前,我们必须了解zkProver、节点和数据库之间的控制流。这里有一张图来清楚地解释这个过程。
正如上面的流程图所描述的,整个互动过程分为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插件关系图:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!