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, 事件监控, 以太坊, 依赖分析, 区块链, 区块链开发, 可视化界面, 安全防御评估, 提款最终化, 智能合约, 桥接协议, 测试用例, 状态持久化, 网络流量审计, 请求拦截, 资产转移, 跨链桥, 通知系统