2 个版本

0.4.1 2022年8月15日
0.4.0 2022年8月15日

#2969 in 魔法豆

Apache-2.0

365KB
7K SLoC

Webb Relayer 🕸️

🚀 Webb Relayer 🧑‍✈️
⚠️ 测试版软件 ⚠️

GitHub release (latest by date) GitHub Workflow Status Codecov License Apache 2.0 Twitter Telegram Discord

📖 目录

目录

入门 🎉

在 Webb 协议中,中继器扮演着多种角色。该仓库包含 Anchor 协议预言机、事务和数据中继器以及协议治理参与者的代码。目的是让所有这些都可以独立运行,以确保外部参与者对 Webb 协议的最大灵活性。

中继器系统由三个主要组件组成。每个组件都应该被视为完全独立的,因为它们可能由不同的实体完全处理。

  1. 私有事务中继(例如 Tornado Cash 的中继器中的用户桥接事务)
  2. 数据查询(用于零知识证明生成)
  3. 事件监听、提案和签名中继(在 DKG 提案中,中继器充当预言机)

事务中继角色

履行事务中继角色的中继器负责向希望通过提交事务中继其零知识事务的客户端暴露 API。这种角色的中继器必须在它们中继这些事务的区块链上拥有足够的余额,因为毕竟,它们必须拥有本币余额来支付这些交易的费用。中继器可以为任何数量的链和协议进行配置,从混合器到可变锚,并运行单个链或给定桥接锚集中存在的所有链。

数据查询角色

履行此角色的中继器与交易中继角色相结合,尽管不需要同时拥有这两个角色。具体来说,这个角色关注监听锚定协议实例内部发生的事件,并存储希望通过传统HTTP方法快速访问数据的客户端数据。这个角色正在积极维护,并且定期更新我们希望在未来如何存储和提供数据的方案。

预言机角色

履行预言机角色的中继器会监听锚定存在在各个链上的锚定协议实例。当它们听到锚定梅克尔树中的插入时,会相应地处理(如事件监视器中实现的那样)。扮演这个角色的人然后将锚定更新信息中继给其他连接的锚定、DKG治理系统以及在此存储库中实施的任何其他集成。预言机中继器通过确保实例内的所有锚定都了解其相邻锚定的最新状态,帮助保持锚定协议实例的状态更新。

有关更多信息,请参阅Webb Relayer Rust 文档 📝。对改进中继网络有反馈吗?或者有具体问题要问?请查看中继器反馈讨论 💬。

先决条件

此存储库使用Rust,因此需要设置Rust开发环境。首先安装并配置rustup

# Install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Configure
source ~/.cargo/env

配置Rust工具链以默认为最新稳定版本,并添加夜间版本

rustup default stable
rustup update
rustup update nightly

太好了!现在你的Rust环境已经准备好了!🚀🚀

安装 💻

Unix(Linux、macOS、WSL2等)

git clone https://github.com/webb-tools/relayer.git

cargo build --release --features cli

使用

快速入门 ⚡

本地EVM设置

急于尝试Webb中继器并看到其效果?运行带有预设EVM本地网络配置的中继器,立即开始运行。您可以按照此指南使用中继器进行EVM桥接!您还需要在根目录中配置一个.env文件。下面配置部分将提供更多详细信息。

# Update your local env file
cp ./config/development/evm-localnet/.env.example .env
cargo run -- -c ./config/development/evm-localnet -vvv

热提示 🌶️:要增加记录器详细程度,在启动命令期间添加额外的-vvvv。现在您将看到TRACE记录。祝您调试愉快!

本地Substrate混洗器

要使用中继器进行我们的Substrate混洗器,您首先需要启动一个本地substrate节点,该节点与我们的小部件webb-standalone-node集成。一旦本地启动了substrate节点,您就可以继续启动中继器。您可以按照此指南使用中继器进行Substrate混洗器!

cargo run -- -c ./config/development/local-substrate -vvv

运行 🏃

Webb中继器易于运行,且配置灵活 👌。第一步是创建一个配置文件。

示例

  • 创建一个.env文件,其中包含您希望支持的网络的以下值。
WEBB_EVM_<network>_ENABLED=true
WEBB_EVM_<network>_PRIVATE_KEY=<0X_PREFIXED_PRIVATE_KEY>

WEBB_EVM_<network>_BENEFICIARY=<0X_PREFIXED_ADDRESS>

查看配置,其中包含许多网络的有用默认配置。这些配置文件可以根据您的喜好进行更改,并且可以通过上面列出的.env配置启用。

然后运行

webb-relayer -vv -c ./config

热提示 🌶️:如果您更喜欢,您还可以使用json格式为配置文件。

配置

注意:您还可以查看EVM和Substrate的不同链配置。

链配置

字段 描述 可选性
http-endpoint Http(s)端点用于快速请求/响应 必需
ws-endpoint WebSocket端点,用于长期连接 必需
名称 链/节点名称 必需
浏览器 区块浏览器,用于生成在此链上发生的交易的点击链接。 可选
chain-id 链特定ID。 必需
private-key 此网络中此账户的私钥。请参阅私钥文档以获取安全设置 必需
受益人 将接收中继费用的账户地址。 可选
runtime 指示要使用的Substrate运行时 对于Substrate是必需的
suri 解释一个字符串以生成一个密钥对。在这种情况下,如果该对可以表示为从种子直接派生的,则 对于Substrate是必需的
pallets 特定Substrate节点支持的Pallets 可选

合约配置

字段 描述 可选性
contract 链合约。必须是以下之一
- VAnchor
- SignatureBridge
必需
address 此合约在此链上的地址。 必需
deployed-at 此合约部署到的区块号。 必需
events-watcher 控制此合约的事件监视器。 可选
withdraw-config 配置您的私有事务中继器的费用和Gas限制。 可选
proposal-signing-backend 一个ProposalSigingBackend的值(例如{ type = "DKGNode", node = "dkg-node" } 可选

Docker 🐳

要使用Docker运行中继器,您需要指定一个配置文件,并提供一个如上所述的.env文件。然后将它保存到config目录。

运行Docker镜像

docker run --rm -v "<ABSOLUTE_PATH_TO_CONFIGS_DIRECTORY>:/config" --env-file .env -p 9955:9955 ghcr.io/webb-tools/relayer:edge

注意:这使用从main分支部署的最新和预发布版本,将edge更改为最新稳定发布版本。

这将在容器内部的/config目录挂载配置文件,这样它就可以读取您添加的配置。

API 📡

中继器有3个端点可供查询。以下以方便的方式概述了它们。

检索节点IP地址

/api/v1/ip
预期响应
{
  "ip": "127.0.0.1"
}

检索中继器配置

/api/v1/info
预期响应
{
  "evm": {
      "rinkeby": {
          "enabled": true,
          "chainId": 4,
          "beneficiary": "0x58fcd47ece3ed24ace88fee06efd90dcb38f541f",
          "contracts": [{
              "contract": "Anchor",
              "address": "0x626fec5ffa7bf1ee8ced7dabde545630473e3abb",
              "deployedAt": 8896800,
              "eventsWatcher": {
                  "enabled": true,
                  "pollingInterval": 15000
              },
              "size": 0.1,
              "proposalSigningBackend": { "type": "DKGNode", "node": "dkg-local" },
              "withdrawFeePercentage": 0.05
          }]
      }
  },
  "substrate": {},
  "experimental": {
      "smart-anchor-updates": false,
      "smart-anchor-updates-retries": 0
  }
}

检索历史叶子缓存

参数
  • target_system(可以是evmsubstrate)。
  • chain_id
  • contract_address
对于evm
/api/v1/leaves/evm/4/0x626fec5ffa7bf1ee8ced7dabde545630473e3abb
对于substrate

注意:由于substrate没有合约地址,我们使用tree_id

/api/v1/leaves/substrate/4/9
预期响应
 {
  "leaves": ["0x2e5c62af48845c095bfa9b90b8ec9f6b7bd98fb3ac2dd3039050a64b919951dd", "0x0f89f0ef52120b8db99f5bdbbdd4019b5ea4bcfef14b0c19d261268da8afdc24", "0x3007c62f678a503e568534487bc5b0bc651f37bbe1f34668b4c8a360f15ba3c3"],
  "lastQueriedBlock": "0x9f30a8"
}

测试 🧪

以下说明如何运行中继器的基础测试套件和端到端测试套件。

运行基础测试

cargo test

运行端到端测试

首先您需要一个protocol-substrate节点,本地编译(在发布模式下),并且protocol-substraterelayer项目必须相邻。中继器必须使用--features integration-tests编译。

以下是你需要的基本设置

  1. 克隆中继器仓库 git clone https://github.com/webb-tools/relayer.git
  2. 克隆协议Substrate节点 https://github.com/webb-tools/protocol-substrate.git
  3. 然后获取节点 cd protocol-substrate && git submodule update --init 的子模块。
  4. 同时,构建独立节点 cargo build --release -p webb-standalone-node
  5. 然后回到中继器目录 cd ../relayer
  6. 运行 cargo build --features integration-tests
  7. 运行 cd tests && git submodule update --init --recursive
  8. tests 目录下运行 yarn install
  9. 运行 yarn test

E2E 测试技巧

  1. 如果您想运行特定测试,请运行 yarn test -fgrep <UNIQUE_PART_OF_TEST_NAME>
  2. 如果您想使测试快速失败(在第一个错误时失败),请运行 yarn test --bail
  3. 默认情况下,测试并行运行,要禁用此功能,请运行 yarn test --parallel=false
  4. 失败的测试将在放弃之前持续重试,最多 5 次。要禁用此功能,请使用 yarn test --retries=0
  5. 您可以组合上述所有技巧,有关更多选项,请参阅 此处

对于 Substrate 混合器测试,您可以通过以下方式手动连接到本地链:

  1. 指定 Alice 节点的端口,例如
const aliceManualPorts = { ws: 9944, http: 9933, p2p: 30333 };
  1. 指定 Bob 节点的端口,例如
const bobManualPorts = { ws: 9945, http: 9934, p2p: 30334 };
  1. ports 属性值分别设置为 aliceManualPortsbobManualPorts,在 LocalNodeOpts 配置中,这是 LocalProtocolSubstrate.start() 方法的参数。
  2. LocalNodeOpts 配置中将 isManual 标志设置为 true,这是 LocalProtocolSubstrate.start() 方法的参数。

贡献

有兴趣为 Webb 中继器网络做出贡献吗?非常感谢您的兴趣!我们始终赞赏开源社区的贡献!

如果您有贡献的想法,请查看我们的 贡献指南,了解如何进行贡献。我们期待您的第一次贡献!

许可证

本软件受Apache 2.0 许可协议许可。

除非您明确声明,否则根据Apache 2.0 许可协议定义的,您有意提交包含在此软件包中的任何贡献,将按照上述方式许可,不附加任何额外的条款或条件。

支持者


依赖项

~27–46MB
~841K SLoC