matter-labs/zksync-withdrawal-finalizer
GitHub: matter-labs/zksync-withdrawal-finalizer
一个用Rust编写的提款终结器,用于监控和最终确认zkSync 2.0的L2到L1提款交易。
Stars: 60 | Forks: 51
# m, it might be best to keep the technical parts and only translate the generic parts.
一个用 Rust 编写的提款终结器。
## 目的
提款终结器是 `zksync-era` 的一个组件,负责监控并最终确认 [L2->L1 的提款](https://github.com/matter-labs/zksync-era/blob/main/docs/advanced/03_withdrawals.md)。它通过持续监控 L2 和 L1 上发生的事件,在持久化存储(即 PostgreSQL)中维护状态,并在必要时发送提款最终确认交易来实现这一功能。
## 构建
构建项目非常直接:
```
cargo build
```
## 部署
要部署此服务,您需要以下前置条件:
1. 以太坊上的 WebSocket RPC 端点。
2. zkSync Era 上的 WebSocket RPC 端点。
3. 一个 PostgreSQL 数据库实例。
### 运行数据库迁移
在部署服务之前,需要使用 [`sqlx`](https://github.com/launchbadge/sqlx) 的 [`sqlx-cli`](https://github.com/launchbadge/sqlx/tree/main/sqlx-cli) 组件运行数据库迁移:
```
$ cd ./storage
$ env DATABASE_URL=postgres://mycreds@myhost/mydb sqlx database create
$ env DATABASE_URL=postgres://mycreds@myhost/mydb sqlx migrate run
```
### 配置
配置通过环境变量完成,这些变量也可以从 `.env` 文件中读取(如果存在)。
部署是通过部署该服务的 Docker 化镜像来完成的。
| 变量名 | 描述 |
| :--- | :--- |
| `ETH_CLIENT_WS_URL` | 以太坊 WebSocket RPC 端点的地址 |
| `ETH_CLIENT_HTTP_URL` | 以太坊 HTTP RPC 端点的地址 |
| `CONTRACTS_L1_ERC20_BRIDGE_PROXY_ADDR` | L1 ERC20 桥合约的地址** |
| `CONTRACTS_L2_ERC20_BRIDGE_ADDR` | L2 ERC20 桥合约的地址** |
| `CONTRACTS_DIAMOND_PROXY_ADDR` | L1 钻石代理合约的地址** |
| `CONTRACTS_WITHDRAWAL_FINALIZER_CONTRACT` | 提款终结器合约的地址 ** |
| `API_WEB3_JSON_RPC_WS_URL` | zkSync Era WebSocket RPC 端点的地址 |
| `API_WEB3_JSON_RPC_HTTP_URL` | zkSync Era HTTP RPC 端点的地址 |
| `DATABASE_URL` | 服务将其状态存储到的 PostgreSQL 数据库的 URL |
| `GAS_LIMIT` | 在调用 WithdrawalFinalizerContract 的 `finalizeWithdrawals` 函数时,批量提款最终确认中单次提款最终确认的 Gas 限制 |
| `BATCH_FINALIZATION_GAS_LIMIT` | 在调用提款终结器合约的 `finalizeWithdrawals` 函数时,整个批量最终确认的 Gas 限制 |
| `WITHDRAWAL_FINALIZER_ACCOUNT_PRIVATE_KEY` | 用于提交最终确认交易的账户的私钥 |
| `TX_RETRY_TIMEOUT_SECS` | 在可能卡住的最终确认交易上等待的秒数,之后将重新调整其费用 |
| `FINALIZE_ETH_TOKEN` | (可选)配置是否应监控以太坊提款事件。对于仅关注特定 ERC20 代币且与主以太坊提款无关的自定义桥接,将其关闭可能有用 |
| `CUSTOM_TOKEN_DEPLOYER_ADDRESSES` | (可选)通常 ERC20 代币由桥合约部署。然而,在自定义情况下,可能需要使用一组已部署代币的自定义地址来覆盖此行为 |
| `CUSTOM_TOKEN_ADDRESSES` | (可选)添加要最终确认的预定义代币列表。当常规查找代币部署的技术在自定义桥接设置下不起作用时,这可能很有用。 |
| `ENABLE_WITHDRAWAL_METERING` | (可选,默认值:`"true"`)默认情况下,终结器会收集有关提取代币数量的指标。用户可以选择性地关闭此计量功能。 |
| `ETH_FINALIZATION_THRESHOLD` | (可选,默认值:"0")终结器将仅最终确认大于或等于此值的 ETH 提款 |
| `ONLY_FINALIZE_THESE_TOKENS` | (可选,默认值:`None`)如果指定,将创建一个 ERC20 代币白名单,只有这些代币会被最终确认。 |
描述服务配置的配置结构体可以在 [`config.rs`](https://github.com/matter-labs/zksync-withdrawal-finalizer/blob/main/bin/withdrawal-finalizer/src/config.rs) 中找到。
** 关于 zkSync 合约的更多信息可以在 [这里](https://github.com/matter-labs/zksync-era/blob/main/docs/src/specs/contracts/overview.md) 找到。
## 部署终结器智能合约
终结器智能合约需要引用 L1 Nullifier 合约的地址,该地址通过构造函数提供。
您还需要知道用于部署终结器合约的账户密钥。
当您知道这些信息后,要部署合约,需要运行以下命令(假设您在另一个终端中运行了 `anvil`):
```
$ yarn
$ npm run contracts:build
$ MNEMONIC="test test test test test test test test test test test junk" ETH_CLIENT_WEB3_URL="http://localhost:8545" npx hardhat deploy --nullifier 0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB
```
如果一切顺利,结果将是:
```
RPC: http://localhost:8545
Signer: 0x1A24e5C53B1438f15B25c819fEe1F894e6D131f2
CONTRACTS_WITHDRAWAL_FINALIZER_ADDRESS=0x32b6F45f18F9f46e9177f01A61CB1b0757b156f3
```
这样您就知道了已部署合约的地址。
## 许可证
zkSync 提款终结器根据以下条款之一分发:
- Apache 许可证 2.0 版,([LICENSE-APACHE](LICENSE-APACHE) 或 )
- MIT 许可证([LICENSE-MIT](LICENSE-MIT) 或 )
由您选择。
## 官方链接
- [网站](https://zksync.io/)
- [GitHub](https://github.com/matter-labs)
- [Twitter](https://twitter.com/zksync)
- [开发者 Twitter](https://twitter.com/zkSyncDevs)
- [Discord](https://discord.gg/nMaPGrDDwk)
## 免责声明
zkSync Era 已经过大量测试和审计。尽管它已上线,但仍处于 Alpha 阶段,并将经历更多审计和漏洞赏金计划。我们非常乐意听取社区的想法和建议!
重要的是要声明,现在对它进行分叉可能会导致错过重要的安全更新、关键功能和性能改进。
标签:DeFi, Docker, L2到L1提款, Layer 2, PostgreSQL, Rust, WebSocket, Withdrawal Finalizer, zkSync, zkSync Era, 事件监控, 以太坊, 依赖分析, 区块链, 区块链开发, 可视化界面, 安全防御评估, 提款最终化, 智能合约, 桥接协议, 测试用例, 状态持久化, 网络流量审计, 请求拦截, 资产转移, 跨链桥, 通知系统