diff --git a/builders/build/eth-api/libraries/ethersjs.md b/builders/build/eth-api/libraries/ethersjs.md index 2770f0ea..cc6a55b9 100644 --- a/builders/build/eth-api/libraries/ethersjs.md +++ b/builders/build/eth-api/libraries/ethersjs.md @@ -25,7 +25,7 @@ description: 通过本教程以学习如何使用以太坊EtherJS代码库在Moo ## 安装Ethers.js {: #install-ethersjs } -首先,您需要创建一个目录,以存储您在本教程中将要创建的所有文件: +首先,您需要开始一个基本的JavaScript项目。第一步,创建一个目录来存储您在本教程中将要生成的所有文件,并使用以下命令来初始化该文件夹: ```bash mkdir ethers-examples && cd ethers-examples && npm init --y @@ -141,6 +141,8 @@ mkdir ethers-examples && cd ethers-examples && npm init --y }); ``` +将此代码片段保存起来,因为您将在以下部分使用的脚本中用到它。 + ## 发送交易 {: #send-a-transaction } 在这一部分,您将需要创建一些脚本。第一个脚本将用于发送交易前检查账户余额。第二个脚本将执行交易。 diff --git a/builders/build/eth-api/libraries/web3js.md b/builders/build/eth-api/libraries/web3js.md index e19b66cd..b6ebb62d 100644 --- a/builders/build/eth-api/libraries/web3js.md +++ b/builders/build/eth-api/libraries/web3js.md @@ -1,5 +1,5 @@ --- -title: 使用Web3.js发送交易和部署合约 +title: 如何使用Ethereum Web3.js代码库 description: 通过本教程学习如何使用以太坊web3.js JavaScript代码库在Moonbeam上发送交易和部署Solidity智能合约。 --- @@ -25,7 +25,7 @@ description: 通过本教程学习如何使用以太坊web3.js JavaScript代码 ## 安装Web3.js {: #install-web3js } -首先,您需要创建一个目录,以存储您在本教程中将要创建的所有文件: +首先,您需要开始一个基本的JavaScript项目。第一步,创建一个目录来存储您在本教程中将要生成的所有文件,并使用以下命令来初始化该文件夹: ```bash mkdir web3-examples && cd web3-examples && npm init --y @@ -88,6 +88,8 @@ mkdir web3-examples && cd web3-examples && npm init --y const web3 = new Web3('{{ networks.development.rpc_url }}'); ``` +将此代码片段保存起来,因为您将在以下部分使用的脚本中用到它。 + ## 发送交易 {: #send-a-transaction } 在这一部分,您将需要创建一些脚本。第一个脚本将用于发送交易前查看账户余额。第二个脚本将执行交易。 diff --git a/builders/build/eth-api/libraries/web3py.md b/builders/build/eth-api/libraries/web3py.md index eee42874..b5494a99 100644 --- a/builders/build/eth-api/libraries/web3py.md +++ b/builders/build/eth-api/libraries/web3py.md @@ -1,5 +1,5 @@ --- -title: 使用Web3.py发送交易和部署合约 +title: 如何使用Ethereum Web3.py代码库 description: 通过本教程学习如何使用以太坊Web3 Python代码库在Moonbeam上发送交易和部署Solidity智能合约。 --- @@ -39,43 +39,57 @@ pip3 install web3 py-solc-x ## 在Moonbeam上设置Web3.py {: #setup-web3-with-moonbeam } -您可以为任何Moonbeam网络配置Web3.py。 +在这个文章中,您将会创建多个用来实现不同功能的脚本;比如发送交易,部署智能合约,与已部署的智能合约交互。在大部的脚本中您都需要创建一个[Web3.py provider](https://web3py.readthedocs.io/en/stable/providers.html)来与网路互动。 + --8<-- 'text/_common/endpoint-setup.md' -每个网络最简单的设置方式如下所示: +您需要通过以下步骤来创建一个provider: + +1. 导入`web3`代码库 +2. 用`Web3(Web3.HTTPProvider())`方法创建一个`web3`provider并提供一个网络终端URL === "Moonbeam" ```python + # 1. 导入web3.py from web3 import Web3 + # 2. 创建web3.py provider web3 = Web3(Web3.HTTPProvider("{{ networks.moonbeam.rpc_url }}")) # Insert your RPC URL here ``` === "Moonriver" ```python + # 1. 导入web3.py from web3 import Web3 + # 2. 创建web3.py provider web3 = Web3(Web3.HTTPProvider("{{ networks.moonriver.rpc_url }}")) # Insert your RPC URL here ``` === "Moonbase Alpha" ```python + # 1. 导入web3.py from web3 import Web3 + # 2. 创建web3.py provider web3 = Web3(Web3.HTTPProvider("{{ networks.moonbase.rpc_url }}")) ``` === "Moonbeam开发节点" ```python + # 1. 导入web3.py from web3 import Web3 + # 2. 创建web3.py provider web3 = Web3(Web3.HTTPProvider("{{ networks.development.rpc_url }}")) ``` +您可以记下这个代码范例,您将在之后部分的脚本示例中使到它。 + ## 发送交易 {: #send-a-transaction } 在这一部分,您将需要创建一些脚本。第一个脚本将用于发送交易前查看账户余额。第二个脚本将执行交易。 @@ -164,6 +178,9 @@ touch compile.py --8<-- 'code/builders/build/eth-api/libraries/web3-py/compile.py' ``` +!!! 注意事项 + 如果您遇到`Solc is not installed`报错,反注释代码示例的第二步并运行它。 + ### 部署合约脚本 {: #deploy-contract-script } 有了用于编译`Incrementer.sol`合约的脚本,您就可以使用结果以发送部署的签名交易。首先,您可以为部署的脚本创建一个名为`deploy.py`的文件: diff --git a/builders/get-started/networks/moonbeam-dev.md b/builders/get-started/networks/moonbeam-dev.md index 5d152374..66b62555 100644 --- a/builders/get-started/networks/moonbeam-dev.md +++ b/builders/get-started/networks/moonbeam-dev.md @@ -43,7 +43,7 @@ Moonbeam开发节点是您自己的个人开发环境,用于在Moonbeam上构 ```bash docker run --rm --name {{ networks.development.container_name }} --network host \ purestake/moonbeam:{{ networks.development.build_tag }} \ - --dev + --dev --rpc-external ``` === "MacOS" @@ -51,7 +51,7 @@ Moonbeam开发节点是您自己的个人开发环境,用于在Moonbeam上构 ```bash docker run --rm --name {{ networks.development.container_name }} -p 9944:9944 \ purestake/moonbeam:{{ networks.development.build_tag }} \ - --dev --ws-external --rpc-external + --dev --rpc-external ``` === "Windows" @@ -59,7 +59,7 @@ Moonbeam开发节点是您自己的个人开发环境,用于在Moonbeam上构 ```bash docker run --rm --name {{ networks.development.container_name }} -p 9944:9944 ^ purestake/moonbeam:{{ networks.development.build_tag }} ^ - --dev --ws-external --rpc-external + --dev --rpc-external ``` !!! 注意事项 @@ -169,8 +169,7 @@ purestake/moonbeam \ - **`--dev`** - 指定开发链 - **`--tmp`** - 运行一个临时节点,该节点将在流程结束时删除所有配置 -- **`--rpc-external`** - 监听所有RPC接口 -- **`--ws-external`** - 监听所有Websocket接口 +- **`--rpc-external`** - 监听所有RPC与Websocket接口 ### 配置节点的常用选项 {: #node-options } @@ -182,10 +181,10 @@ purestake/moonbeam \ - **`-l ` or `--log `** - 设置自定义日志记录筛选器。日志模式的语法为`=`。例如,要打印所有JSON RPC日志,命令应如下所示:`-l json=trace` - **`--sealing `** - 什么时候区块需要被封装在开发服务中。可接受的时间间隔参数为:`instant`、`manual`、或一个代表计时器间隔(以毫秒为单位)的数字(例如,`6000`是指节点每6秒产生一次区块)。默认设置是`instant`。请参阅下面的[配置区块生产](#configure-block-production)部分以获取更多信息 -- **`--rpc-port `** - *从[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}开始弃用,使用`--ws-port`进行HTTP和WS的连接* - 设置HTTP RPC服务器的TCP端口。接受端口作为参数 -- **`--ws-port `** - 设置WebSockets RPC服务器的TCP端口。从[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}开始,WS端口是用于HTTP和WS连接的统一端口。接受端口作为参数。默认值是{{ networks.parachain.ws }} -- **`--rpc-max-connections `** - *自[客户端v0.30.0](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}起已弃用,此值已硬编码为100。请使用`--ws-max-connections`以调整HTTP和WS连接的总限制* - 指定HTTP RPC服务器连接的最大数量 -- **`--ws-max-connections `** - 指定WS RPC服务器连接的最大数量。自[客户端v0.30.0](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}起,此标志调整HTTP和WS连接的总限制。默认为100个连接。 +- **`--rpc-port `** - 用来配置HTTP与WS连接的统一端口。接收一个port作为参数,默认为{{ networks.parachain.rpc }} +- **`--ws-port `** - *从[v0.33.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.33.0){target=_blank}开始已弃用,HTTP与WS连接改为统一使用`--rpc-port`来配置* 设置WebSockets RPC服务器的TCP端口。从[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}开始使用,用来设置HTTP与WS连接的统一端口. 接收一个port作为参数 +- **`--rpc-max-connections `** - 配置HTTP与WS连接的上限总和. 默认连接数为100 +- **`--ws-max-connections `** - * *从[v0.33.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.33.0){target=_blank}开始已弃用, 改为使用`--rpc-max-connections`参数来限制 HTTP与WS连接数量上线* - 配置HTTP与WS连接的上限总和. 默认连接数为100 - **`--rpc-cors `** - 指定允许浏览器源头访问HTTP和WS RPC服务器。该源头可以是允许访问的以逗号分隔的来源列表,或者您也可以指定`null`。当运行一个开发节点时,预设为允许所有源头 如需命令行标志和选项的完整列表,请在命令末尾添加`--help`来启动Moonbeam开发节点。 diff --git a/builders/integrations/oracles/api3.md b/builders/integrations/oracles/api3.md index 22d1f3ba..6f1cb9c5 100644 --- a/builders/integrations/oracles/api3.md +++ b/builders/integrations/oracles/api3.md @@ -85,7 +85,7 @@ contract Requester is RrpRequesterV0 { } ``` -您也可以尝试在[Remix上部署范例合约](https://remix.ethereum.org/#url=https://github.com/vanshwassan/RemixContracts/blob/master/contracts/Requester.sol&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.9+commit.e5eed63a.js){target=_blank}。 +您也可以尝试在[Remix上部署范例合约](https://remix.ethereum.org/#url=https://github.com/api3-ecosystem/remix-contracts/blob/master/contracts/Requester.sol&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.9+commit.e5eed63a.js){target=_blank}。 ### 合约地址 {: #contract-addresses } @@ -140,12 +140,27 @@ contract Requester is RrpRequesterV0 { *要了解更多dAPI是如何运作的,您可以查看[API3的文档网站](https://docs.api3.org/explore/dapis/what-are-dapis.html){target=_blank}。* -### 访问自费的dAPI {: #self-funded-dapis} +### dAPI类型 {: #types-of-dapis } -自费的dAPI为开发者提供了以最少的前期付出体验数据源的机会,在使用托管dAPI之前提供了低风险的选择。 +dAPI有两种类型: [自费](https://docs.api3.org/reference/dapis/understand/self-funded.html){target=_blank}与[托管](https://docs.api3.org/reference/dapis/understand/managed.html){target=_blank}. 托管DAPI仅部署在主网上, 自费dAPI在主网和测试网都有部署。利用dAPI代理来读取自费或托管dAPI数据流程是一样的. + +#### 自费dAPIs {: #self-funded-dapis } + +[自费dAPI](https://docs.api3.org/reference/dapis/understand/self-funded.html){target=_blank}是用户自己付费订阅的单源数据推送. 它们为开发者提供了以最少的前期付出体验数据源的机会,在使用托管dAPI之前提供了低风险的选择。 通过自费的dAPI,您可以用自己的资金为dAPI提供资金。您提供的Gas数量将决定您dAPI的可用时间。如果您的Gas耗尽,您可以再次为dAPI提供资金以使其可供使用。 +您可以在[API3的自费dAPI文档](https://docs.api3.org/guides/dapis/subscribing-self-funded-dapis/){target=_blank}中获取更多关于它的知识。 + +#### 托管dAPIs {: #managed-dapis } + +[托管dAPI](https://docs.api3.org/reference/dapis/understand/managed.html)的数据由多个不同[一手](https://docs.api3.org/explore/airnode/why-first-party-oracles.html){target=_blank}数据提供商通过Airnode提供。数据提供商的数据会经过Airnode的median函数集成并签名。Gas费用与dAPI的可靠性由[API3 DAO](https://docs.api3.org/explore/dao-members/){target=_blank}管理. + +您可以在[API3的托管dAPI文档页面](https://docs.api3.org/reference/dapis/understand/managed.html){target=_blank}获取更多关于它的知识。 + +### 访问自费的dAPI {: #access-self-funded-dapis} + + 以下为访问自筹数据源的流程: 1. 探索API3 Market并选取一个dAPI @@ -159,6 +174,10 @@ contract Requester is RrpRequesterV0 { [API3 Market](https://market.api3.org/dapis){target=_blank}使用户能够连接到dAPI并访问相关的数据馈送服务。它提供了跨多个链(包括测试网)可用的所有dAPI的列表。您可以按链和数据提供商过滤列表。您还可以根据名称搜索特定的dAPI。点击dAPI进入详细信息页面,获取有关dAPI的更多信息。 +根据以上信息,您可以自己决定使用自费或托管dAPI. + +![API3 Dapi Page](/images/builders/integrations/oracles/api3/api3-5.png) + #### 资助一个赞助商钱包 {: #fund-sponsor-wallet } 选择中意的dAPI后,您可以使用[API3 Market](https://market.api3.org/){target=_blank}激活它,将资金(DEV、MOVR或GLMR)发送到`sponsorWallet `。确保您的: @@ -189,9 +208,29 @@ contract Requester is RrpRequesterV0 { 当交易完成并在区块链上确认后,代理合约地址将会在界面中显示。 +### 读取托管dAPIs {: #access-managed-dapis } + +如果您想使用托管dAPI,在选择dAPI后,会有两个选项供您选择:**Managed**或**Self-funded**. 选择**Managed dAPIs**. + +托管dAPI提供给用户配置dAPI参数的选项,其中包括[偏差临界](https://docs.api3.org/reference/dapis/understand/deviations.html){target=_blank}和[heartbeat](https://docs.api3.org/reference/dapis/understand/deviations.html#heartbeat){target=_blank}. 您会有以下选项来配置托管dAPI: + +| 偏差 | Heartbeat | +| --------- | --------- | +| 0.25% | 2 分钟 | +| 0.25% | 24 小时 | +| 0.5% | 24 小时 | +| 1% | 24 小时 | + +!!! 注意事项 + 根据资产和链的不同,并不是所有dAPI都支持全部配置选项。访问[API3市场](https://market.api3.org){target=_blank} 获取更多信息。 + +在选择偏差临界值和heartbeat之后,检查最后的价格,然后选择**Add to Cart**。您可以添加同一个网络上的多个dAPI进购物车。选择完成后点**Checkout**。请在付款页面确认最后的订单信息和价格。当您检查完后,连接您的钱包并付款。 + +在提交订单之后,您将需要等待dAPI的更新。dAPI团队通常需要五个工作日来根据提交的配置信息更新dAPI。当dAPI完成更新后,它就可以开始在您的dApp中使用了。 + #### 读取自费的dAPI {: #read-dapis } -以下为一个读取自费dAPI的基础合约范例: +以下为一个读取dAPI的基础合约范例: ```solidity // SPDX-License-Identifier: MIT @@ -227,9 +266,9 @@ contract DataFeedReaderExample is Ownable { - `setProxy()` - 用于设置dAPI代理合约的地址 - `readDataFeed()` - 返回设定dAPI最新价格的`view`函数 -[您可以尝试在Remix上部署](https://remix.ethereum.org/#url=https://gist.githubusercontent.com/vanshwassan/1ec4230956a78c73a00768180cba3649/raw/176b4a3781d55d6fb2d2ad380be0c26f412a7e3c/DapiReader.sol){target=_blank} +[您可以尝试在Remix上部署](https://remix.ethereum.org/#url=https://github.com/api3-ecosystem/remix-contracts/blob/master/contracts/DataFeedReader.sol&lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.18+commit.87f61d96.js){target=_blank} -另外,您可以在[API3的官方文档网站](https://docs.api3.org/guides/dapis/subscribing-self-funded-dapis/)中获取更多资讯{target=_blank}。 +另外,您可以在[API3的官方文档网站](https://docs.api3.org/guides/dapis/subscribing-managed-dapis/){target=_blank}中获取更多资讯。 ## API3 QRNG {: #api3-qrng } @@ -319,7 +358,7 @@ contract RemixQrngExample is RrpRequesterV0 { !!! 注意事项 您可以从下面的[QRNG提供商](#qrng-providers)部分获取`airnode`地址和`endpointIdUint256`。 -[您可以尝试在Remix上部署](https://remix.ethereum.org/#url=https://github.com/vanshwassan/RemixContracts/blob/master/contracts/QrngRequester.sol&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.9+commit.e5eed63a.js){target=_blank}。 +[您可以尝试在Remix上部署](https://remix.ethereum.org/#url=https://github.com/api3-ecosystem/remix-contracts/blob/master/contracts/QrngRequesterUpdated.sol&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.9+commit.e5eed63a.js&lang=en){target=_blank}。 ### QRNG Airnode和端点提供者 {: #qrng-providers } @@ -363,5 +402,6 @@ contract RemixQrngExample is RrpRequesterV0 { - [QRNG Docs](https://docs.api3.org/explore/qrng/){target=_blank} - [API3 DAO GitHub](https://github.com/api3dao/){target=_blank} - [API3 Medium](https://medium.com/api3){target=_blank} +- [API3 YouTube](https://www.youtube.com/API3DAO){target=_blank} --8<-- 'text/_disclaimers/third-party-content.md' diff --git a/builders/interoperability/.pages b/builders/interoperability/.pages index 9ee44f1e..d7578be4 100644 --- a/builders/interoperability/.pages +++ b/builders/interoperability/.pages @@ -3,4 +3,5 @@ hide: false nav: - index.md - xcm - - protocols \ No newline at end of file + - protocols + - mrl.md \ No newline at end of file diff --git a/builders/interoperability/mrl.md b/builders/interoperability/mrl.md new file mode 100644 index 00000000..b9f5f2e2 --- /dev/null +++ b/builders/interoperability/mrl.md @@ -0,0 +1,217 @@ +--- +title: Moonbeam路由流动性 +description: 学习与Moonbeam相关网络建立跨链集成后,如何通过Moonbeam接收路由流动性。 +--- + +# Moonbeam路由流动性 - Moonbeam Routed Liquidity(MRL) + +## 概览 {: #introduction } + +Moonbeam路由流动性(MRL)是Moonbeam的多种用例之一:与Moonbeam连接的任何区块链都能够通过Moonbeam将流动性导入波卡的其它平行链。而这是由多个组件协同工作来实现的: + +- **通用信息传递 - General Message Passing (GMP)** - GMP是一套连接包括Moonbeam在内数个区块链的传输协议。它可以用来跨链传递包含任意数据的消息,并且让代币可以通过[跨区块链GMP协议](/builders/interoperability/protocols){target=_blank}在非平行链区块链之间流通。 +- [**跨共识信息传递 - Cross-Consensus Message (XCM) Passing**](builders/interoperability/xcm/overview/){target=_blank} - Polkadot的GMP变种。是推动Polkadot及其平行链(包括Moonbeam)之间跨链互操作的主要技术。 +- **适配XCM的ERC-20代币** - 也称为[本地XC-20](/builders/interoperability/xcm/xc20/overview/#local-xc20s){target=_blank},是指Moonbeam EVM上原生的,已适配XCM的所有ERC-20代币。 +- [**GMP预编译合同**](/builders/pallets-precompiles/precompiles/gmp/){target=_blank} - 是一个[预编译合同](/builders/pallets-precompiles/precompiles/overview/){target=_blank}, 它是XCM与来自[Wormhole GMP 协议](/builders/interoperability/protocols/wormhole/){target=_blank}信息的接口。 + +通过组合这些组件,Web3的流动性能通过Moonbeam无缝导入其他平行链。流动性的传递既可以通过[GMP预编译](/builders/pallets-precompiles/precompiles/gmp){target=_blank}也可以通过传统智能合约,Moonbeam支持智能合约与XCM预编译之间的互相交互,比如[X-Tokens](/builders/interoperability/xcm/xc20/xtokens#xtokens-precompile){target=_blank}。 + +GMP协议通常以锁定/铸造或销毁/铸造方式移动资产。这种流动性通常以ERC-20代币的形式存在于Moonbeam上。现在Moonbeam上所有ERC-20代币都已支持XCM,只要代币在其他平行链上注册过,它们就可以在平行链上被认证。Moonbeam上启用XCM的ERC-20代币被称为[本地XC-20代币](/builders/interoperability/xcm/xc20/overview#local-xc20s){target=_blank}。 + +现在MRL仅支持与Wormhole相连的区块链,但任何平行链团队都能用其他GMP提供商来搭建类似路径。 + +本指南将主要解释一个平行链应该如何与Wormhole SDK和接口集成,以通过Moonbeam从非平行链区块链获得流动性。它也会解释使用时需要的基本配置以及如何有哪些是Wormhole协议支持的代币。 + +## 先决条件 {: #prerequisites } + +要开始与您的平行链进行MRL集成,您首先需要: + +- [通过HRMP通道建立与Moonbeam的跨链集成](/builders/interoperability/xcm/xc-registration/xc-integration){target=_blank}以便资产可以从Moonbeam发送到您的平行链。 +- [在您的平行链上注册Moonbeam的资产](/builders/interoperability/xcm/xc-registration/assets#register-moonbeam-native-assets){target=_blank}。由于负责跨链资产传送的XCM message pallet的功能限制,我们只能使用Moonbeam的原生gas资产来支付信息回传的跨链费用。 +- [注册您要路由到您平行链的本地XC-20代币](/builders/interoperability/xcm/xc-registration/assets#register-local-xc20){target=_blank} + - 允许这些本地XC-20代币用于支付XCM费用 +- 允许用户发送`Transact`指令(通过`polkadotXcm.Send`或者[XCM Transactor Pallet](/builders/interoperability/xcm/xcm-transactor#xcm-transactor-pallet-interface){target=_blank}),这将启用远程EVM调用,允许远程平行链上的账户与 Moonbeam上的Bridge智能合约交互。 + +## Wormhole MRL {: #mrl-through-wormhole } + +Wormhole是第一个为公众搭建的GMP平台,虽然MRL计划支持多种不同GMP提供商,但现在仍以Wormhole为主。在完成所有[先决条件](#prerequisites)之后,您还需要完成以下步骤来通过Wormhole接收流动性: + +- 通知Moonbeam团队您希望加入MRL计划,以便我们为您提供技术实施方面的帮助。 +- 与Wormhole团队和其他依赖MRL的前端联系以敲定技术细节并同步公告。他们可能会需要以下信息: + - 平行链ID + - 平行链使用的账户类型(例如,AccountId32 或 AccountKey20) + - 已注册代币的地址和名称 + - [Wormhole Connect](https://wormhole.com/connect/){target=_blank}前台可用的端点 + - 希望您的平行链通过Wormhole Connect连接的理由 + +### 通过Wormhole将代币发送至平行链 {: #sending-tokens-through-wormhole } + +MRL提供了一个一键式解决方案,允许您将Multilocation定义为最终目的地,以便资产从任何与[Wormhole Connect](https://wormhole.com/connect/){target=_blank}集成的Wormhole链中转移。 + +要通过Wormhole和MRL发送代币,用户界面将使用[Wormhole TokenBridge](https://github.com/wormhole-foundation/wormhole/blob/main/ethereum/contracts/bridge/interfaces/ITokenBridge.sol){target=_blank}和[Moonbeam GMP预编译](/builders/pallets-precompiles/precompiles/gmp){target=_blank}的混合体。 + +转移流动性的用户将调用起始链上部署的Wormhole TokenBridge智能合约中的`transferTokensWithPayload`函数,该方法通过 `ITokenBridge.sol`接口来将代币发送给GMP Precompile。此函数要求一个bytes负载,该负载必须格式化为SCALE编码的Multilocation对象,并包装在另一个预编译特定版本化的类型中。要了解如何构建此负载,请参阅GMP Precompile文档中的[搭建Wormhole负载](/builders/pallets-precompiles/precompiles/gmp#building-the-payload-for-wormhole){target=_blank}部分。 + +Wormhole使用一套分布式节点来监视多个区块链的状态。Wormhole将这些节点称为[守护者节点(Guardians)](https://docs.wormhole.com/wormhole/explore-wormhole/guardian){target=_blank}。Guardian节点的职责是监控消息并签署相应的负载。如果2/3 Wormhole参与签署的Guardian节点者验证了某个消息,则该消息将被批准并可以在其他链上接收。 + +Guardian节点的签名与消息组合成为一个叫做[已验证操作批准(Verified Action Approval (VAA))](https://docs.wormhole.com/wormhole/explore-wormhole/vaa){target=_blank}的证明。这些VAA将由Wormhole网络中的中继器(Relayer)传递至其目的地,然后在目的地链上VAA将被用于执行某项操作。在本文中,VAA会被传递给GMP Precompile的`wormholeTransferERC20`函数,该函数通过Wormhole桥接合约(该合约铸造代币,处理VAA,并使用XCM消息将代币中继到平行链。请注意,作为集成MRL的平行链,您大概率不需要部署或使用GMP预编译合约。 + +中继器的唯一工作是将Wormhole Guardian节点批准的交易传递到目的地链。部分中继器已经支持MRL但任何人都可以独立运行专属中继器。此外,用户在通过Wormhole进行桥接时可以在目的地链上手动执行该交易,并完全避免使用中继器。 + +![Transfering wormhole MRL](/images/builders/interoperability/mrl/mrl-1.png) + +### 通过Wormhole将代币从平行链发送回原链 {: #sending-tokens-back-through-wormhole } + +要通过Wormhole将代币从平行链发送回原链,用户需要发送一笔交易。推荐使用`utility.batchAll`批处理将代币转账交易和远程执行操作交易打包到同一个extrinsic中。例如同一个extrinsic中可以包含一个`xTokens.transferMultiassets`交易加上带有`Transact`指令的 `polkadotXcm.send`交易。 + +批处理能提供一个一键式解决方案。然而目前而言,这个操作需要用户在平行链上拥有xcGLMR(GLMR的外部代币)。这主要是因为两个原因: + +- 本地XC-20(启用XCM的ERC-20)不能用于支付Moonbeam上的XCM执行费用。这是一个设计决策,因为XC-20代币的设计需要贴近传统的ERC-20代币,使用ERC-20接口中的transfer函数来转移资产。处理XC-20的XCM指令仅限于将资金从一个账户转移到另一个账户,而XCM流程中需要资产寄存机制,这两者并不兼容。 +- 目前,XCM相关pallet的限制让我们无法使用XCM来转移具有不同储备链的代币。这也导致了在发送XC-20时无法将费用代币设置为本地平行链代币。 + +将来,[X-Tokens Pallet](/builders/interoperability/xcm/xc20/xtokens#x-tokens-pallet-interface){target=_blank}将得到更新,允许使用本地gas货币为XCM付费。使用不同pallet的平行链需要自己实现在一个消息中转移储备与非储备资产的解决方案。 + +举个例子,下面是将MRL代币通过Wormhole从平行链发送回原链过程的简要概述: + +1. 使用[Utility Pallet](/builders/pallets-precompiles/pallets/utility){target=_blank}的`batchAll`extrinsic发送一个批处理交易,其中包含以下两个调用: + - **`xTokens.transferMultiassets`** - 将xcGLMR和本地XC-20发送到用户的[Multilocation衍生账户(multilocation-derivative account)](#calculate-multilocation-derivative-account){target=_blank}。Multilocation衍生账户是Moonbeam上的一个无密钥账户,另一个平行链上的账户可以通过XCM来控制该账户。 + - **`polkadotXcm.send`** - 带有`Transact`指令。通过XCM向Moonbeam上的Batch预编译合同发送[远程EVM调用](/builders/interoperability/xcm/remote-evm-calls/){target=_blank},该Batch预编译使用 `ethereumXcm.transact`将以下两个调用批处理到一个远程EVM交易中: + - **`approve`**(本地 XC-20 合约)- 授权Wormhole中继器转移本地 XC-20 + - **`transferTokensWithRelay`**(中继器合约)- 调用Moonbeam上Wormhole TokenBridge智能合约上的`transferTokensWithPayload`函数来跨链转移代币,该函数广播消息供Wormhole Guardian节点拾取。 +2. Guardian节点网络将拾取Wormhole交易并对其签名 +3. Wormhole中继器将代币中继到原链和目标账户 + +![Transfering Wormhole MRL out](/images/builders/interoperability/mrl/mrl-2.png) + +现在我们已对MRL有了大致的了解,接下来我们将通过实例实现上述功能。以下的示例将向您展示如何将资产从平行链转移到Moonbase Alpha,并通过Wormhole返回原链,本指南也同样适用于Moonbeam。 + +#### 计算Multilocation衍生账户(Multilocation-Derivative Account) {: #calculate-multilocation-derivative-account } + +要通过Wormhole发送代币回原链,您需要计算用户在Moonbeam上的Multilocation衍生账户。您可以使用[xcm-tools repository](https://github.com/Moonsong-Labs/xcm-tools){target=_blank}中的[`calculate-multilocation-derivative-account.ts`脚本](https://github.com/Moonsong-Labs/xcm-tools/blob/main/scripts/calculate-multilocation-derivative-account.ts){target=_blank}在链外完成此步骤。有关更多详细信息,您可以参考远程EVM调用文档中的[计算Multilocation衍生账户](/builders/interoperability/xcm/remote-evm-calls/#calculate-multilocation-derivative){target=_blank}部分。 + +除此以外,您还可以使用[XCM Utilities 预编译](/builders/pallets-precompiles/precompiles/xcm-utils)中的`multilocationToAddress`函数。 + +#### 构建Transfer Multiassets Extrinsic {: #build-transfer-multiassets } + +当有了multilocation衍生账户,您就可以开始构建`utility.batchAll`交易。开始之前,您需要确认以下包已被安装: + +```bash +npm i @polkadot/api ethers +``` + +现在您可以开始构建`xTokens.transferMultiassets`交易,该交易接受四个参数:`assets`, `feeItem`, `dest`, 和 `destWeightLimit`。您可以在[X-Tokens Pallet接口](/builders/interoperability/xcm/xc20/xtokens#x-tokens-pallet-interface){target=_blank}文档中找到这些参数的更多信息。 + +简而言之,`assets`参数定义了xcDEV(Moonbeam的xcGLMR)和本地XC-20的multilocation和数量,并将xcDEV定位为第一资产,本地XC-20定位为第二资产。`feeItem`被设置为xcDEV资产的索引,在本例中为`0`,`feeItem`用DEV来支付Moonbase Alpha的执行费用。`dest`是一个multilocation,它用于定义我们在前一小节里计算得到的Moonbase Alpha multilocation衍生账户。 + +此示例的`xTokens.transferMultiassets`如下所示: + +???+ code "multiassets转账逻辑" + + ```js + --8<-- 'code/builders/interoperability/mrl/transfer-multiassets.js' + ``` + +在Moonbeam上使用,您需要修改以下参数: + +| 参数 | 值 | +|:------------------------------:|:-----:| +| Parachain ID | 2004 | +| Balances Pallet Index | 10 | +| ERC-20 XCM Bridge Pallet Index | 110 | + +#### 构建远程EVM调用 {: #build-the-remote-evm-call } + +要生成batch交易的第二个调用`polkadotXcm.send`,您需要先创建一个EVM交易,然后再拼装执行该EVM交易的XCM指令。这个EVM交易可以构建为一个与[Batch预编译](/builders/pallets-precompiles/precompiles/batch){target=_blank}交互的交易,以便在同一交易中执行两个交易。这很是个很有用的技巧,因为这个EVM交易必须同时批准Wormhole中继器来中继本地XC-20代币以及这个中继操作本身。 + +要创建batch交易并将其包装在远程EVM调用中以便在Moonbeam上执行,您需要执行以下步骤: + +1. 创建本地XC-20、[Wormhole中继器](https://github.com/wormhole-foundation/example-token-bridge-relayer/blob/main/evm/src/token-bridge-relayer/TokenBridgeRelayer.sol){target=_blank}和[Batch预编译合约](https://github.com/moonbeam-foundation/moonbeam/blob/master/precompiles/batch/Batch.sol){target=_blank}的实例您需要每个合约的ABI: + + ??? code "ERC-20接口ABI" + + ```js + --8<-- 'code/builders/interoperability/mrl/abi/ERC20.js' + ``` + + ??? code "TokenBridge中继器ABI" + + ```js + --8<-- 'code/builders/interoperability/mrl/abi/TokenRelayer.js' + ``` + + ??? code "Batch预编译合约ABI" + + ```js + --8<-- 'code/builders/interoperability/mrl/abi/Batch.js' + ``` + + 在Moonbase Alpha这个特定示例中,您还需要一个Wormhole中继器的地址。您可以使用: + + === "Moonbase Alpha" + + ```text + 0x9563a59c15842a6f322b10f69d1dd88b41f2e97b + ``` + +2. 使用Ethers的`encodeFunctionData`函数来encode batch交易中使用的`approve`交易和`transferTokensWithRelay`交易并得到encoded call data +3. 将两个交易合并为一个batch交易,并再次使用Ethers的`encodeFunctionData`函数来encode该交易的call data +4. 使用`ethereumXcm.transact`extrinsic为batch交易创建远程EVM调用,该extrinsic使用上一步得到的encoded call data作为`xcmTransaction`参数。有关更多信息,请参阅[远程EVM调用文档](/builders/interoperability/xcm/remote-evm-calls#ethereum-xcm-pallet-interface){target=_blank} + +???+ code "创建远程EVM调用逻辑" + + ```js + --8<-- 'code/builders/interoperability/mrl/evm-tx.js' + ``` + +接下来,您需要创建extrinsic以将远程EVM调用发送到Moonbeam。您需要发送一个XCM消息来执行`Transact`XCM指令。最常见的做法是通过`polkadotXcm.send`发送`WithdrawAsset`, `BuyExecution`, 和 `Transact`指令。也可用 `RefundSurplus`和 `DepositAsset`来确保资产不会被锁,但技术上它们不是必须的。 + +???+ code "发送远程EVM调用逻辑" + + ```js + --8<-- 'code/builders/interoperability/mrl/polkadotxcm-send.js' + ``` + +#### 构建Batch Extrinsic {: #build-batch-extrinsic } + +为确保`xTokens.transferMultiassets`与`polkadotXcm.send`交易同时发送,您可以使用`utility.batchAll`将它们批量处理在一起。至少在现在,这有助于确保资产转移在EVM交易之前发生,这是一个十分必要的特质。但是这在以后可能会因为XCM升级而发生变化。 + +???+ code "将multilocation资产交易与远程EVM调用发送打包" + + ```js + --8<-- 'code/builders/interoperability/mrl/batch-extrinsics.js' + ``` + +??? code "查看完整脚本" + + ```js + --8<-- 'code/builders/interoperability/mrl/complete-script.js' + ``` + +如果您想查看一个完全实现了此功能的示例项目,可以访问这个[GitHub repository](https://github.com/jboetticher/mrl-reverse){target=_blank}。 + +请注意,并非每个平行链都包括X-Tokens和其他必要Pallet。基于Substrate的链都非常灵活,甚至没有一个固定标准。如果您认为您的平行链不支持此路径,请在[Moonbeam论坛](https://forum.moonbeam.network/){target=_blank}上和Wormhole团队中提供替代解决方案。 + +### Wormhole支持的代币 {: #tokens-available-through-wormhole } + +虽然Wormhole在技术上支持跨链转移任何代币,但中继器并不支持所有代币的费用支付。基于Wormhole MRL的解决方案可转移的ERC-20资产取决于[xLabs 中继器](https://xlabs.xyz/){target=_blank}能接受的代币种类。以下表格中列出了Moonbeam支持的代币: + +=== "Moonbeam" + + | 代币名称 | 地址 | + |:----------:|:------------------------------------------:| + | WMATIC | 0x82DbDa803bb52434B1f4F41A6F0Acb1242A7dFa3 | + | WGLMR | 0xAcc15dC74880C9944775448304B263D191c6077F | + | WFTM | 0x609AedD990bf45926bca9E4eE988b4Fb98587D3A | + | WETH | 0xab3f0245B83feB11d15AAffeFD7AD465a59817eD | + | WBTC | 0xE57eBd2d67B462E9926e04a8e33f01cD0D64346D | + | wTBTC | 0xeCd65E4B89495Ae63b4f11cA872a23680A7c419c | + | WBNB | 0xE3b841C3f96e647E6dc01b468d6D0AD3562a9eeb | + | WAVAX | 0xd4937A95BeC789CC1AE1640714C61c160279B22F | + | USDT | 0xc30E9cA94CF52f3Bf5692aaCF81353a27052c46f | + | USDC | 0x931715FEE2d06333043d11F658C8CE934aC61D0c | + | SUI | 0x484eCCE6775143D3335Ed2C7bCB22151C53B9F49 | + | CELO | 0xc1a792041985F65c17Eb65E66E254DC879CF380b | + +使用前请花时间用[Wormhole资产验证器](https://www.portalbridge.com/#/token-origin-verifier){target=_blank}验证这些代币在Moonbeam上仍然是有效的Wormhole资产。 + +--8<-- 'text/disclaimers/third-party-content.md' \ No newline at end of file diff --git a/builders/interoperability/protocols/wormhole.md b/builders/interoperability/protocols/wormhole.md index 035d9a1f..d0c4eba6 100644 --- a/builders/interoperability/protocols/wormhole.md +++ b/builders/interoperability/protocols/wormhole.md @@ -67,13 +67,13 @@ Wormhole由多个模块化的交换组件组成,这些组件可以独立使用 如需在每条链上部署,您将需要Wormhole核心桥接的本地实例以及每条对应链的chain ID。如下所示为选定的几个测试网提供了这些数据。您可以在Wormhole的[文档网站](https://book.wormhole.com/reference/contracts.html#testnet){target=_blank}找到其他网络的端点。请注意,为本文设计的智能合约和中继器仅支持EVM,因此在本次演示只能使用EVM。 -| 网络 & 水龙头 | 核心桥地址 | Wormhole 链ID | -|:----------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------:|:-------------:| -| [Polygon Mumbai](https://faucet.polygon.technology/){target=_blank} | 0x0CBE91CF822c73C2315FB05100C2F714765d5c20 | 5 | -| [Avalanche Fuji](https://faucet.avax.network/){target=_blank} | 0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C | 6 | -| [Fantom TestNet](https://faucet.fantom.network/){target=_blank} | 0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7 | 10 | -| [Goerli](https://goerlifaucet.com/){target=_blank} | 0x706abc4E45D419950511e474C7B9Ed348A4a716c | 2 | -| [Moonbase Alpha](https://docs.moonbeam.network/builders/get-started/networks/moonbase/#moonbase-alpha-faucet){target=_blank} | 0xa5B7D85a8f27dd7907dc8FdC21FA5657D5E2F901 | 16 | +| 网络 & 水龙头 | 核心桥地址 | Wormhole 链ID | +|:----------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------:|:-----------------:| +| [Polygon Mumbai](https://faucet.polygon.technology/){target=_blank} | 0x0CBE91CF822c73C2315FB05100C2F714765d5c20 | 5 | +| [Avalanche Fuji](https://faucet.avax.network/){target=_blank} | 0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C | 6 | +| [Fantom TestNet](https://faucet.fantom.network/){target=_blank} | 0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7 | 10 | +| [Goerli](https://goerlifaucet.com/){target=_blank} | 0x706abc4E45D419950511e474C7B9Ed348A4a716c | 2 | +| [Moonbase Alpha](https://docs.moonbeam.network/builders/get-started/networks/moonbase/#moonbase-alpha-faucet){target=_blank} | 0xa5B7D85a8f27dd7907dc8FdC21FA5657D5E2F901 | 16 | 1. 确保选择的合约为**SimpleGeneralMessage** 2. 点击箭头按钮打开部署菜单 @@ -92,13 +92,13 @@ Wormhole建议在互连合约中包含一个白名单系统,您将在尝试发 要添加白名单合约,您必须调用`addTrustedAddress(bytes32 sender, uint16 _chainId)`函数,这需要一个*bytes32*格式的地址和一个chain ID。您可以在[上述表格](#deploying-the-wormhole-contract-with-remix-on-moonbase-alpha)中以及[Wormhole的文档网站](https://book.wormhole.com/reference/contracts.html#testnet){target=_blank}中找到chain ID。 -```javascript +```sol function addTrustedAddress(bytes32 sender, uint16 _chainId) external { myTrustedContracts[sender][_chainId] = true; } ``` -注意`sender`参数是一个_bytes32_类型,而非_address_类型。Wormhole的VAAs以_bytes32_的形式提供发射器(源)地址,所以它们以_bytes32_的形式存储和检查。若要将_address_类型转换为_bytes32_,您将需要再加上24个0。这是因为_address_的值是20个bytes,小于_bytes32_的32个。每个byte有两个十六进制字符,所以: +注意`sender`参数是一个`bytes32`类型,而非`address`类型。Wormhole的VAAs以`bytes32`的形式提供发射器(源)地址,所以它们以`bytes32`的形式存储和检查。若要将`address`类型转换为`bytes32`,您将需要再加上24个0。这是因为`address`的值是20个bytes,小于`bytes32`的32个。每个byte有两个十六进制字符,所以: ```text zeros to add = (32 bytes - 20 bytes) * 2 hexadecimal characters @@ -107,7 +107,9 @@ zeros to add = 24 例如,如果您的互连合约地址是`0xaf108eF646c8214c9DD9C13CBC5fadf964Bbe293`,您需要将下列内容输入至Remix: -`0x000000000000000000000000af108ef646c8214c9dd9c13cbc5fadf964bbe293` +```text +0x000000000000000000000000af108ef646c8214c9dd9c13cbc5fadf964bbe293 +``` 现在我们将继续使用Remix来确保您的两个互连合约相互信任。若您要来回发送消息,您必须对已部署的两个合约执行此操作。若要在不同链上切换合约,通过MetaMask连接至目标网络。 @@ -196,15 +198,15 @@ npm run testnet-spy 如果开发者想要向过滤器添加额外的逻辑,可在此处完成。就目前而言,只需列出一些硬编码的地址即可。 -```javascript +```ts // How the relayer injects the VAA filters. // This is the default implementation provided by the dummy plugin. getFilters(): ContractFilter[] { if (this.pluginConfig.spyServiceFilters) { return this.pluginConfig.spyServiceFilters; } - this.logger.error("Contract filters not specified in config"); - throw new Error("Contract filters not specified in config"); + this.logger.error('Contract filters not specified in config'); + throw new Error('Contract filters not specified in config'); } ``` @@ -214,7 +216,7 @@ npm run testnet-spy `nextStagingArea`对象是使用的事件(过滤后的VAA)相互影响的一种方法。例如,如果一名开发者想要将两个VAA打包至一个工作流,他们不会每次都返回一个`workflowData`。 -```javascript +```ts // Receives VAAs and returns workflows. async consumeEvent( vaa: ParsedVaaWithBytes, @@ -226,11 +228,11 @@ npm run testnet-spy } | undefined > { - this.logger.debug(`VAA hash: ${vaa.hash.toString("base64")}`); + this.logger.debug(`VAA hash: ${vaa.hash.toString('base64')}`); return { workflowData: { - vaa: vaa.bytes.toString("base64"), + vaa: vaa.bytes.toString('base64'), }, }; } @@ -300,7 +302,7 @@ npm run redis 有了Ethers解码的数据,我们可以知道负载所传送至的目标合约以及目标链,因为数据被打包至消息中了。该函数检查指定的目标chain ID是否属于一个EVM,并将使用上述的`execute.onEVM(options)`函数执行。否则,它将记录一个错误,因为系统会因简单起见而不与非EVM链交互。 -```javascript +```ts // Consumes a workflow for execution async handleWorkflow( workflow: Workflow, @@ -315,11 +317,8 @@ async handleWorkflow( // Here we are parsing the payload so that we can send it to the right recipient const hexPayload = parsed.payload.toString('hex'); - let [recipient, destID, sender, message] = - ethers.utils.defaultAbiCoder.decode( - ['bytes32', 'uint16', 'bytes32', 'string'], - '0x' + hexPayload - ); + let [recipient, destID, sender, message] = ethers.utils.defaultAbiCoder.decode(['bytes32', 'uint16', 'bytes32', 'string'], '0x' + hexPayload); + recipient = this.formatAddress(recipient); sender = this.formatAddress(sender); const destChainID = destID as ChainId; @@ -349,14 +348,21 @@ async handleWorkflow( 'Requested chainID is not an EVM chain, which is currently unsupported.' ); } -}; + + else { + // The relayer plugin has a built-in Solana wallet handler, which you could use here. + // NEAR & Algorand are supported by Wormhole, but they're not supported by the relayer plugin. + // If you want to interact with NEAR or Algorand you'd have to make your own wallet management system, that's all. + this.logger.error('Requested chainID is not an EVM chain, which is currently unsupported.'); + } +} ``` 在回调函数中,使用Ethers包创建一个[合约对象](https://docs.ethers.org/v6/api/contract/#Contract){target=_blank}。其导入的ABI从`SimpleGeneralMessage`合约的编译中导出,所以该代码假设VAA中指定的消息接收者是或从`SimpleGeneralMessage`合约继承。 然后,该代码会尝试用VAA执行函数`processMyMessage(bytes32 VAA)`,这是此前被定义为用于中继消息的函数。该函数名字是为智能合约随意设置的,因为中继器可以指定调用任何函数。这说明了开发者可以更改该中继器代码! -```js +```ts await execute.onEVM({ chainId: destChainID, f: async (wallet, chainId) => { @@ -369,7 +375,7 @@ await execute.onEVM({ 最后一步就是检查`relayer-engine-config/common.json`。该配置文件控制着整个中继器的执行。请确保您在使用的TestNet EVM是列出在该文件中`supportedChains`对象内的。如果其未被列出,该插件不会正常运行。如果您在运行的一条链未被列出,您将需要以下列格式从[Wormhole的开发者文档](https://book.wormhole.com/reference/contracts.html#testnet){target=_blank}导入数据至配置文件。 -该中继器还有许多其他配置。例如,`mode`字符串设置为`“BOTH”`以确保使用监听器和执行器插件,也可根据开发者需求选择只运行其中一个。此外,还有多个日志级别可供指定,如`“error”`可用来只记录错误消息。然而,在本次演示中只需保留配置设置即可。 +该中继器还有许多其他配置。例如,`mode`字符串设置为`"BOTH"`以确保使用监听器和执行器插件,也可根据开发者需求选择只运行其中一个。此外,还有多个日志级别可供指定,如`"error"`可用来只记录错误消息。然而,在本次演示中只需保留配置设置即可。 ```json "mode": "BOTH", @@ -402,7 +408,7 @@ npm run start 1. 环境为**Injected Provider**,网络为1287(Moonbase Alpha) 2. 您的钱包里有来自[faucet](https://faucet.moonbeam.network/){target=_blank}的大量资金,以支付源链和目标链上的交易Gas成本 -3. 在**sendMessage**部分的**message**输入框中输入您选择的短消息(在本示例中为“this is a message”) +3. 在**sendMessage**部分的**message**输入框中输入您选择的短消息(在本示例中为"this is a message") 4. 将您的在目标链上的SimpleGeneralMessage实例的地址放入**destAddress**输入框中 5. 将目标链的Wormhole chain ID放入**sendMessage**部分的**destChainId**输入框中 6. 当完成所有步骤后,请执行交易并在MetaMask中确认 @@ -417,6 +423,6 @@ npm run start Wormhole将通过Moonbeam路由流动性(Moonbeam Routed Liquidity,MRL)计划为平行链提供流动性。该计划允许通过Moonbeam网络发送流动性,将流动性从Wormhole连接的链一键转移到平行链钱包中。 -MRL利用[GMP预编译](/builders/pallets-precompiles/precompiles/gmp){target=_blank},GMP预编译的文档解释了跨链消息如何通过预编译来正确构建。现仅在Moonbase Alpha上可用。 +[MRL](/builders/interoperability/mrl){target=_blank}通过[GMP预编译](/builders/pallets-precompiles/precompiles/gmp){target=_blank}来实现,GMP预编译的文档中详细解释了应该如何通过该合约正确构建跨链消息。 --8<-- 'text/_disclaimers/third-party-content.md' diff --git a/builders/interoperability/xcm/xcm-sdk/v1/reference.md b/builders/interoperability/xcm/xcm-sdk/v1/reference.md index 3432de1d..f1a8ccbb 100644 --- a/builders/interoperability/xcm/xcm-sdk/v1/reference.md +++ b/builders/interoperability/xcm/xcm-sdk/v1/reference.md @@ -108,15 +108,16 @@ XCM SDK的前提是定义了要转移的资产,然后定义了发送资产的 - `SourceChainTransferData` - 定义用于转移的源链数据 - | 名称 | 类型 | 描述 | - |:--------------------:|:-------------:|:-----------------------------------------------------------------:| - | `balance` | *AssetAmount* | 从源地址转移的资产余额 | - | `chain` | *AnyChain* | 源链信息 | - | `existentialDeposit` | *AssetAmount* | 在源链上转移资产的账户最低保证金 | - | `fee` | *AssetAmount* | 从源链转移所需的费用数量 | - | `feeBalance` | *AssetAmount* | 从源链转移所需的资产余额 | - | `min` | *AssetAmount* | 源链上应保留的最小资产数量,包含转移的`existentialDeposit`和`fee` | - | `max` | *AssetAmount* | *能够*被转移的最大资产数量 | + | 名称 | 类型 | 描述 | + |:------------------------:|:-------------:|:---------------------------------------------------------------:| + | `balance` | *AssetAmount* | 从源地址转移的资产余额 | + | `chain` | *AnyChain* | 源链信息 | + | `destinationFeeBalance` | *AssetAmount* | 用于支付目的地链上交易费用的资产余额 | + | `existentialDeposit` | *AssetAmount* | 在源链上转移资产的账户最低保证金 | + | `fee` | *AssetAmount* | 从源链转移所需的费用数量 | + | `feeBalance` | *AssetAmount* | 从源链转移所需的资产余额 | + | `min` | *AssetAmount* | 源链上应保留的最小资产数量,包含转移的`existentialDeposit`和`fee` | + | `max` | *AssetAmount* | *能够*被转移的最大资产数量 | ## 核心函数 {: #core-sdk-methods } @@ -127,7 +128,7 @@ SDK提供以下核心函数: ??? code "参数" | 名称 | 类型 | 描述 | |:----------:|:------------:|:------------------------------------------:| - | `options?` | *SdkOptions* | 允许您指定`ethersSigner`或`polkadotSigner` | + | `options?` | *SdkOptions* | 允许您指定`evmSigner`或`polkadotSigner` | ??? code "返回" | 名称 | 类型 | 描述 | @@ -142,7 +143,7 @@ SDK提供以下核心函数: |:-----------------------:|:--------------------------------:|:------------------------------------------------:| | `destinationAddress` | *string* | 目标链上的接收账户地址 | | `destinationKeyorChain` | *string \| AnyChain* | 目标链的私钥或`Chain`数据 | - | `ethersSigner?` | *EthersSigner* | 使用H160以太坊式账户的以太坊兼容链的Ethers签署人 | + | `evmSigner?` | *EthersSigner \| WalletClient* | 使用H160以太坊式账户的以太坊兼容链的Ethers签署人,可以是Ethers signer或是Viem钱包signer| | `keyOrAsset` | *string \| Asset* | 正在转移的资产的私钥或`Asset`数据 | | `polkadotSigner?` | *PolkadotSigner \| IKeyringPair* | 波卡签署人或Keyring对 | | `sourceAddress` | *string* | 在源链上的发送账户地址 | diff --git a/builders/interoperability/xcm/xcm-sdk/v1/xcm-sdk.md b/builders/interoperability/xcm/xcm-sdk/v1/xcm-sdk.md index 23cf8a73..9dd1293d 100644 --- a/builders/interoperability/xcm/xcm-sdk/v1/xcm-sdk.md +++ b/builders/interoperability/xcm/xcm-sdk/v1/xcm-sdk.md @@ -23,24 +23,38 @@ XCM SDK提供帮助函数,该函数提供在波卡/Kusama生态中链之间执 npm install @moonbeam-network/xcm-sdk ``` -您同样需要安装一些额外的依赖项,用于在此教程中与该SDK交互: +您同样需要安装一些额外的依赖项,用于在此教程中与该SDK交互。您需要Polkadot.js API来创建一个Polkadot签署人:: ```bash -npm install ethers@^5.7.2 @polkadot/api @polkadot/util-crypto +npm install @polkadot/api @polkadot/util-crypto ``` +如果您需要与一个兼容以太坊的区块链交互,您也需要一个Ethereum签署人. 本文章使用Ethers.js与viem做例子. 您可以自己选择需要使用的库: + +=== "Ethers.js" + + ```bash + npm install ethers@^5.7.2 + ``` + +=== "viem" + + ```bash + npm install + ``` + ## 创建签署人 {: #create-signers } -当在链之间转移资产时,您需要签署人来负责签署交易。如果您与之交互的是一个使用标准以太坊风格H160地址的EVM兼容链(如Moonbeam),您将需要一个以太坊签署人。更详细地说,是一个[Ethers.js](https://docs.ethers.org/v5/){target=_blank}签署人。要与中继链或其他平行链交互,您需要的是一个[Polkadot](https://polkadot.js.org/docs/api/)签署人。 +当在链之间转移资产时,您需要签署人来负责签署交易。如果您与之交互的是一个使用标准以太坊风格H160地址的EVM兼容链(如Moonbeam),您将需要一个以太坊签署人。更详细地说,它可以是一个[Ethers.js](https://docs.ethers.org/v5/){target=_blank}签署人,也可以是一个[viem钱包客户端](https://viem.sh/docs/clients/wallet.html){target=_blank}。要与中继链或其他平行链交互,您需要的是一个[Polkadot](https://polkadot.js.org/docs/api/)签署人。 -举例来说,您可以传送一个[MetaMask签署人进入Ethers](https://docs.ethers.org/v5/getting-started/#getting-started--connecting){target=_blank}或是其他兼容的钱包。同样地,在波卡中,您可以[使用`@polkadot/extension-dapp`库传送一个兼容的钱包给签署人](https://polkadot.js.org/docs/extension/){target=_blank}。 +举例来说,您可以传送一个[浏览器钱包签署人进入Ethers](https://docs.ethers.org/v5/getting-started/#getting-started--connecting){target=_blank}或[viem](https://viem.sh/docs/clients/wallet.html#json-rpc-accounts){target=_blank}, 比如MetaMask。同样地,在波卡中,您可以[使用`@polkadot/extension-dapp`库传送一个兼容的钱包给签署人](https://polkadot.js.org/docs/extension/){target=_blank}。 -要为Ethers.js和Polkadot.js创建签署人,您可以参考以下部分教程。 +要创建EVM和Polkadot.js创建签署人,您可以参考以下部分教程。 !!! 请记住 **永远不要将您的私钥或是助记词存储在JavaScript或是TypeScript文件中。** -### 创建一个Ethers签署人 {: #create-a-ethers-signer } +### 创建一个EVM签署人 {: #create-a-evm-signer } 要创建一个Ethers签署人,您可以使用以下代码段: @@ -49,10 +63,10 @@ import { ethers } from 'ethers'; const privateKey = 'INSERT_PRIVATE_KEY'; const provider = new ethers.providers.WebSocketProvider('INSERT_WS_ENDPOINT', { - chainId: 'INSERT_CHAIN_ID', + chainId: INSERT_CHAIN_ID, name: 'INSERT_CHAIN_NAME', }); -const ethersSigner = new ethers.Wallet(privateKey, provider); +const evmSigner = new ethers.Wallet(privateKey, provider); ``` 关于Moonbeam网络,您可以使用以下配置: @@ -66,11 +80,11 @@ const ethersSigner = new ethers.Wallet(privateKey, provider); const provider = new ethers.providers.WebSocketProvider( '{{ networks.moonbeam.wss_url }}', { - chainId: '{{ networks.moonbeam.chain_id }}', + chainId: {{ networks.moonbeam.chain_id }}, name: 'moonbeam', } ); - const ethersSigner = new ethers.Wallet(privateKey, provider); + const evmSigner = new ethers.Wallet(privateKey, provider); ``` === "Moonriver" @@ -82,11 +96,11 @@ const ethersSigner = new ethers.Wallet(privateKey, provider); const provider = new ethers.providers.WebSocketProvider( '{{ networks.moonriver.wss_url }}', { - chainId: '{{ networks.moonriver.chain_id }}', + chainId: {{ networks.moonriver.chain_id }}, name: 'moonriver', } ); - const ethersSigner = new ethers.Wallet(privateKey, provider); + const evmSigner = new ethers.Wallet(privateKey, provider); ``` === "Moonbase Alpha" @@ -98,11 +112,49 @@ const ethersSigner = new ethers.Wallet(privateKey, provider); const provider = new ethers.providers.WebSocketProvider( '{{ networks.moonbase.wss_url }}', { - chainId: '{{ networks.moonbase.chain_id }}', + chainId: {{ networks.moonbase.chain_id }}, name: 'moonbase', } ); - const ethersSigner = new ethers.Wallet(privateKey, provider); + const evmSigner = new ethers.Wallet(privateKey, provider); + ``` + +或者您也可以创建并使用一个viem钱包客户端作为EVM签署人 + +=== "Moonbeam" + + ```js + import { createWalletClient, custom } from 'viem' + import { moonbeam } from 'viem/chains' + + const client = createWalletClient({ + chain: moonbeam, + transport: custom(window.ethereum) + }) + ``` + +=== "Moonriver" + + ```js + import { createWalletClient, custom } from 'viem' + import { moonriver } from 'viem/chains' + + const client = createWalletClient({ + chain: moonriver, + transport: custom(window.ethereum) + }) + ``` + +=== "Moonbase Alpha" + + ```js + import { createWalletClient, custom } from 'viem' + import { moonbase } from 'viem/chains' + + const client = createWalletClient({ + chain: moonbase, + transport: custom(window.ethereum) + }) ``` !!! 注意事项 @@ -124,6 +176,9 @@ const keyring = new Keyring({ const pair = keyring.createFromUri(privateKey); ``` +!!! 注意事项 + 上面实例中的`INSERT_PRIVATE_KEY`值可为私钥或助字词. + ## 构建XCM转移数据 {: #build-xcm-transfer-data } 要从一条链上转移资产至另外一条链,您需要构建转移数据,其用于定义被转移的资产、源链及地址、目标链及地址以及交易的相关签署人。第一步为构建转移数据,在下个部分教程中,您将会了解如何使用此转移数据转移资产。 @@ -133,7 +188,7 @@ const pair = keyring.createFromUri(privateKey); ```js import { Sdk } from '@moonbeam-network/xcm-sdk'; -const { assets, getTransferData } = Sdk(); +const sdkInstance = new Sdk(); ``` 您可以选择其一,因两个函数都会返回在源链和目标链之间资产转移的所需数据。使用`assets`将会提供额外的数据,包含支持资产列表,以及在当选定一个资产后,支持转移资产的源链和目标链。 @@ -143,7 +198,7 @@ const { assets, getTransferData } = Sdk(); 1. 调用`assets`函数并根据需求输入您希望获得可用资产转移列表的指定生态系统。可用生态系统包含:`polkadot`、`kusama`和`alphanet-relay`。例如: ```js - const assets = Sdk().assets('polkadot'); + const { assets, asset } = sdkInstance.assets('polkadot'); ``` 这将会返回支持资产以及`asset`能够定义的转移资产 @@ -152,7 +207,7 @@ const { assets, getTransferData } = Sdk(); ```js // Using the key - const asset = Sdk().assets().asset('dot'); + const { sourceChains, source } = asset('dot'); ``` 这将会返回支持源链以及用于定义资产转移源链的`source`函数的列表 @@ -161,7 +216,7 @@ const { assets, getTransferData } = Sdk(); ```js // Using the key - const asset = Sdk().assets().asset('dot').source('polkadot'); + const { destinationChains, destination } = source('polkadot'); ``` 这将会在拥有指定资产信息和`destination`函数支持的拥有开放XCM通道的目标链,用于定义转移资产的目标链 @@ -170,7 +225,7 @@ const { assets, getTransferData } = Sdk(); ```js // Using the key - const asset = Sdk().assets().asset('dot').source('polkadot').destination('moonbeam'); + const { sourceChains, source } = asset('dot'); ``` 这将会返回`accounts`函数,用于定义源链和目标链地址以及各地址相关的签署人 @@ -182,36 +237,37 @@ const { assets, getTransferData } = Sdk(); ```js import { Sdk } from '@moonbeam-network/xcm-sdk'; +const sdkInstance = new Sdk(); + const fromPolkadot = async () => { - const { assets, asset } = Sdk.assets(); + const { assets, asset } = sdkInstance.assets(); console.log( `The supported assets are: ${assets.map((asset) => asset.originSymbol)}` ); - const { sourceChains, source } = Sdk.assets().asset('dot'); + const { sourceChains, source } = sdkInstance.assets().asset('dot'); console.log( `The supported source chains are: ${sourceChains.map( (chain) => chain.name )}` ); - const { destinationChains, destination } = Sdk.assets() - .asset('dot') - .source('polkadot'); + const { destinationChains, destination } = source('polkadot'); console.log( `The supported destination chains are: ${destinationChains.map( (chain) => chain.name )}` ); - const data = await Sdk() - .assets() - .asset('dot') - .source('polkadot') - .destination('moonbeam') - .accounts(pair.address, ethersSigner.address, { - pair, - }); + const { accounts } = destination('moonbeam'); + const data = await accounts( + pair.address, + evmSigner.address, // If using viem, use evmSigner.account.address + { + evmSigner, + polkadotSigner: pair, + } + ); }; fromPolkadot(); @@ -226,13 +282,14 @@ fromPolkadot(); import { Sdk } from '@moonbeam-network/xcm-sdk'; const fromPolkadot = async () => { - const data = await Sdk().getTransferData({ - destinationAddress: ethersSigner.address, + const data = await sdkInstance.getTransferData({ + destinationAddress: evmSigner.address, destinationKeyOrChain: 'moonbeam', keyOrAsset: 'dot', polkadotSigner: pair, sourceAddress: pair.address, sourceKeyOrChain: 'polkadot', + evmSigner, }); }; diff --git a/builders/pallets-precompiles/precompiles/gmp.md b/builders/pallets-precompiles/precompiles/gmp.md index 43a1494e..cac36d79 100644 --- a/builders/pallets-precompiles/precompiles/gmp.md +++ b/builders/pallets-precompiles/precompiles/gmp.md @@ -38,8 +38,9 @@ GMP预编译位于以下地址: [`Gmp.sol`](https://github.com/moonbeam-foundation/moonbeam/blob/master/precompiles/gmp/Gmp.sol){target=_blank}是一个允许开发者与预编译交互的Solidity接口: -- **wormholeTransferERC20**(*bytes memory* vaa) - 接受一个Wormhole的桥接转账[VAA (Verified Action Approval)](https://book.wormhole.com/wormhole/4_vaa.html){target=_blank},通过Wormhole Token桥铸造Token并将流动性转移至自定义的有效负载[multilocation](/builders/interoperability/xcm/overview/#general-xcm-definitions){target=_blank} - - VAA为在源链交易后生成的包含有效负载的包,由Wormhole[守护者网络间谍](https://book.wormhole.com/wormhole/6_relayers.html?search=#specialized-relayers){target=_blank}发现。有效负载被预计称为预编译专属的SCALE编码项目,如先前在此教程的[Wormhole部分](#building-the-payload-for-wormhole)解释一般 +- **wormholeTransferERC20**(*bytes memory* vaa) - 接受一个Wormhole的桥接转账[VAA (Verified Action Approval)](https://book.wormhole.com/wormhole/4_vaa.html){target=_blank},通过Wormhole Token桥铸造Token并将流动性转移至自定义的有效负载[multilocation](/builders/interoperability/xcm/overview/#general-xcm-definitions){target=_blank}。有效负载被预计称为预编译专属的SCALE编码项目,如先前在此教程的[Wormhole部分](#building-the-payload-for-wormhole)解释一般 + +VAA为在源链交易后生成的包含有效负载的包,由Wormhole[守护者网络间谍](https://book.wormhole.com/wormhole/6_relayers.html?search=#specialized-relayers){target=_blank}发现。 用户必须与预编译交互的最常见实例是在恢复的情况下,也就是中继器不完成MRL事务。举例来说,用户必须搜索其源链交易附带的VAA,然后手动调用`wormholeTransferERC20`函数。 @@ -47,7 +48,8 @@ GMP预编译位于以下地址: 目前GMP预编译仅支持使用Wormhole通过Moonbeam发送流动性以及发送到其他平行链。GMP预编译不协助从平行链返回Moonbeam以及其他Wormhole连接链的路线。 -要从像以太坊这样的与Wormhole连接的源链发送流动性,用户必须调用[`transferTokensWithPayload`函数](https://book.wormhole.com/technical/evm/tokenLayer.html#contract-controlled-transfer){target=_blank}在[WormholeTokenBridge智能合约](https://github.com/wormhole-foundation/wormhole/blob/main/ethereum/contracts/bridge/interfaces/ITokenBridge.sol){target=_blank}的[origin-chain部署](https://book.wormhole.com/reference/contracts.html#token-bridge){target=_blank}。此函数需要一个字节有效负载,该有效负载必须格式化为包含在[另一个预编译特定版本类型](https://github.com/moonbeam-foundation/moonbeam/blob/1d664f3938698a6cd341fb8f36ccc4bb1104f1ff/precompiles/gmp/src/types.rs#L25-L39){target=_blank}中的SCALE编码multilocation对象。 +要从像以太坊这样的与Wormhole连接的源链发送流动性,用户必须调用[`transferTokensWithPayload`函数](https://book.wormhole.com/technical/evm/tokenLayer.html#contract-controlled-transfer){target=_blank}在[WormholeTokenBridge智能合约](https://github.com/wormhole-foundation/wormhole/blob/main/ethereum/contracts/bridge/interfaces/ITokenBridge.sol){target=_blank}的[origin-chain部署](https://book.wormhole.com/reference/contracts.html#token-bridge){target=_blank}。此函数需要一个字节有效负载,该有效负载必须格式化为包含在[另一个预编译特定版本类型](https://github.com/moonbeam-foundation/moonbeam/blob/{{ networks.moonbase.spec_version }}/precompiles/gmp/src/types.rs#L25-L48){target=_blank}中的SCALE编码multilocation对象。 + 如果您不熟悉波卡生态系统,您可能不熟悉SCALE编码和multilocation。[SCALE编码](https://docs.substrate.io/reference/scale-codec/){target=_blank}是波卡使用的一种紧凑形式的编码。[`MultiLocation`类型](https://wiki.polkadot.network/docs/learn-xcvm){target=_blank}用于定义波卡中的相对点,例如特定平行链上的特定账户(Polkadot区块链)。 @@ -101,7 +103,7 @@ Moonbeam的GMP协议需要一个multilocation来代表流动性路由的目的 } ``` -如果没有正确的工具,可能很难对整个有效负载进行正确的SCALE编码,特别是因为[预编译所需的自定义类型](https://github.com/moonbeam-foundation/moonbeam/blob/1d664f3938698a6cd341fb8f36ccc4bb1104f1ff/precompiles/gmp/src/types.rs#L25-L39){target=_blank}。幸运的是,有波卡JavaScript包可以帮助实现这一点,例如[`@polkadot/types`](https://www.npmjs.com/package/@polkadot/types){target=_blank}。以下脚本展示了如何创建可用作GMP预编译有效负载的`Uint8Array`: +如果没有正确的工具,可能很难对整个有效负载进行正确的SCALE编码,特别是因为[预编译所需的自定义类型](https://github.com/moonbeam-foundation/moonbeam/blob/{{ networks.moonbase.spec_version }}/precompiles/gmp/src/types.rs#L25-L48){target=_blank}。幸运的是,有波卡JavaScript包可以帮助实现这一点,例如[`@polkadot/types`](https://www.npmjs.com/package/@polkadot/types){target=_blank}。以下脚本展示了如何创建可用作GMP预编译有效负载的`Uint8Array`: ```javascript import { TypeRegistry, Enum, Struct } from '@polkadot/types'; @@ -110,7 +112,6 @@ import { TypeRegistry, Enum, Struct } from '@polkadot/types'; const registry = new TypeRegistry(); // Define the precompile's input types VersionedUserAction and XcmRoutingUserAction -// https://github.com/moonbeam-foundation/moonbeam/blob/1d664f3938698a6cd341fb8f36ccc4bb1104f1ff/precompiles/gmp/src/types.rs#L25-L39 class VersionedUserAction extends Enum { constructor(value) { super(registry, { V1: XcmRoutingUserAction }, value); @@ -142,7 +143,7 @@ function createMRLPayload(parachainId, account, isEthereumStyle) { // Format multilocation object as a Polkadot.js type const destination = registry.createType('VersionedMultiLocation', versionedMultiLocation); - // Wrap and format the MultiLocation object into the precompile's input type + // Wrap and format the multiLocation object into the precompile's input type const userAction = new XcmRoutingUserAction({ destination }); const versionedUserAction = new VersionedUserAction({ V1: userAction }); diff --git a/learn/platform/networks/moonbase.md b/learn/platform/networks/moonbase.md index 6e4ed639..2329e723 100644 --- a/learn/platform/networks/moonbase.md +++ b/learn/platform/networks/moonbase.md @@ -19,8 +19,8 @@ description: Moonbeam测试网(Moonbase Alpha当前配置的概述,以及如 Moonbase Alpha具有以下配置: - 以平行链方式接入中继链运行 - - 收集人有效集为{{ networks.moonbase.staking.max_candidates }}节点,包括一些由PureStake运行的收集人节点 - - 中继链上会有由PureStake运营的验证者节点来决定中继链上的区块。其中一个会被选来最终确定每一个由Moonbeam收集者提交的区块。此设定为将来扩展为两个平行链配置提供了空间。 + - 收集人有效集为{{ networks.moonbase.staking.max_candidates }}节点,包括一些由社区运行的收集人节点 + - 中继链上会有验证者节点来决定中继链上的区块。其中一个会被选来最终确定每一个由Moonbeam收集者提交的区块。此设定为将来扩展为两个平行链配置提供了空间。 - 拥有提供商提供的[API端点](/builders/get-started/endpoints/){target=_blank}以连接到网络。项目也可以运行和访问[自己的私有节点](/node-operators/networks/run-a-node/){target=_blank}。 ![TestNet Diagram](/images/learn/platform/networks/moonbase-diagram.png) diff --git a/node-operators/networks/run-a-node/docker.md b/node-operators/networks/run-a-node/docker.md index 4ec4f12a..58d42cba 100644 --- a/node-operators/networks/run-a-node/docker.md +++ b/node-operators/networks/run-a-node/docker.md @@ -70,10 +70,7 @@ description: 如何使用Docker为Moonbeam网络运行一个全平行链节点 - 在两处替换 `INSERT_YOUR_NODE_NAME` - 用服务器实际RAM的50%替换 `<50% RAM in MB>`。例如服务器有32 GB RAM,这里则应配置为 `16000`. 内存配置最低值为 `2000`,但这将低于推荐配置 -!!! 注意事项 - 对于v0.27.0之前的客户端版本,`--state-pruning`标志被命名为`--pruning`。 - - 对于v0.30.0之前的客户端版本,`--rpc-port`用于指定HTTP连接的端口,`--ws-port`用于指定WS连接的端口。从客户端版本v0.30.0开始,`--rpc-port`已被弃用,`--ws-port`命令行标志同时适用于HTTP连接和WS连接。类似地,`--rpc-max-connections`命令行标志已被弃用,现在被硬编码为100。您可以使用`--ws-max-connections`来调整HTTP和WS连接的总限制。 +--8<-- 'text/node-operators/client-changes.md' ### 全节点 {: #full-node } @@ -175,7 +172,7 @@ description: 如何使用Docker为Moonbeam网络运行一个全平行链节点 ``` !!! 注意事项 - 如果您想要运行RPC终端、连接至Polkadot.js Apps或是运行您自己的应用,使用`--unsafe-rpc-external`和/或`--unsafe-ws-external`标志来运行能够从外部访问RPC端口的全节点。您能够通过执行`moonbeam --help`以获得更多细节。我们**不建议**收集人节点使用此配置。 + 如果您想要运行RPC终端、连接至Polkadot.js Apps或是运行您自己的应用,使用`--unsafe-rpc-external`标志来运行能够从外部访问RPC端口的全节点。您能够通过执行`moonbeam --help`以获得更多细节。我们**不建议**收集人节点使用此配置。 ### 收集人 {: #collator } diff --git a/node-operators/networks/run-a-node/flags.md b/node-operators/networks/run-a-node/flags.md index 2100bffe..8d35c822 100644 --- a/node-operators/networks/run-a-node/flags.md +++ b/node-operators/networks/run-a-node/flags.md @@ -15,10 +15,10 @@ description: 有助于在Moonbeam上运行一个完整平行链节点的标志 - **`--collator`** —— 为候选收集人启用验证人模式,当可用时允许节点活跃参与区块生产 - **`--port`** —— 指定端对端协议的TCP端口。平行链的默认端口为`{{ networks.parachain.p2p }}`,嵌入的中继链则为`{{ networks.relay_chain.p2p }}` -- **`--rpc-port`** —— *从[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}开始弃用,使用`--ws-port`进行HTTP和WS的连接* —— 指定HTTP RPC服务器的TCP端口。平行链的默认端口为`{{ networks.parachain.rpc }}`,嵌入的中继链的默认端口则为`{{ networks.relay_chain.rpc }}` -- **`--ws-port`** —— 指定WebSockets RPC服务器的TCP端口。从[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}开始,WS端口是用于HTTP和WS连接的统一端口。平行链的的默认端口为`{{ networks.parachain.ws }}`,嵌入的中继链的默认端口则为`{{ networks.relay_chain.ws }}` -- **`--rpc-max-connections`** - *自[客户端v0.30.0](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}起已弃用,此值已硬编码为100。请使用`--ws-max-connections`以调整HTTP和WS连接的总限制* - 指定HTTP RPC服务器连接的最大数量 -- **`--ws-max-connections`** —— 指定WS RPC服务器连接的最大数量。自[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}起,此命令行标志调节HTTP和WS连接的总限制。默认值为100 +- **`--rpc-port`** - 用来配置HTTP与WS连接的统一端口。平行链的默认端口为`{{ networks.parachain.rpc }}`,嵌入的中继链的默认端口则为`{{ networks.relay_chain.ws }}` +- **`--ws-port`** - - *从[v0.33.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.33.0){target=_blank}开始已弃用,HTTP与WS连接改为统一使用`--rpc-port`来配置* 设置WebSockets RPC服务器的TCP端口。 平行链的的默认端口为`{{ networks.parachain.ws }}`,嵌入的中继链的默认端口则为`{{ networks.relay_chain.ws }}` +- **`--rpc-max-connections`** - 配置HTTP与WS连接的上限总和. 默认连接数为100 +- **`--ws-max-connections`** - *从[v0.33.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.33.0){target=_blank}开始已弃用, 改为使用`--rpc-max-connections`参数来限制 HTTP与WS连接数量上线* - 配置HTTP与WS连接的上限总和. 默认连接数为100 - **`--execution`** —— 指定所有执行内容该使用的执行策略。Substrate runtime被编译为本地可执行文件,该执行文件被包含在节点本地的一部分,以及存储在链上的WebAssembly二进制文件中。可用的选项如下: - **`native`** —— 仅执行本地文件 - **`wasm`** —— 仅执行Wasm文件 @@ -30,7 +30,7 @@ description: 有助于在Moonbeam上运行一个完整平行链节点的标志 - **`--state-pruning`** —— 指定状态调整模式。对于v0.27.0之前的客户端版本,`--state-pruning`标志被命名为`--pruning`。如果为使用`--collator`标志运行的节点,默认保持所有区块的状态。否则,状态仅会保留最近的256个区块,以下为可用选项: - **`archive`** —— 保持所有区块的状态 - **``** —— 指定保留状态的自定义区块编号 -- **`--trie-cache-size`** —— 指定内部状态缓存的大小,默认为`67108864`。您可以将其设置为`0`以关闭缓存换取收集人表现提升。对于v0.27.0之前的客户端版本,`--trie-cache-size`标志被命名为`--state-cache-size` +- **`--trie-cache-size`** —— 指定内部状态缓存的大小,默认为`67108864`。您可以将其设置为`1073741824`(1GB)以提升收集人表现。需要注意的是这个值有可能过低,可能需要对其进行调整。于v0.27.0之前的客户端版本,`--trie-cache-size`标志被命名为`--state-cache-size` - **`--db-cache`** —— 指定数据库缓存能够使用的记忆体。一般建议设置为您服务器拥有的实际RAM的50%。举例而言,32GB RAM的服务器建议将此选项设置为`16000`。虽然其最小值可以为`2000`,但低于建议的规格 - **`--base-path`** —— 指定您链上数据储存的路径 - **`--chain`** —— 指定使用的链规格。其可以为预先设定的链规格,如`{{ networks.moonbeam.chain_spec }}`、 `{{ networks.moonriver.chain_spec }}`、或 `{{ networks.moonbase.chain_spec }}`。也可以是具有链规格的特定文档路径(如使用`build-spec`命令输出的文档) @@ -39,6 +39,14 @@ description: 有助于在Moonbeam上运行一个完整平行链节点的标志 - **`--in-peers`** —— 指定可接受向内连接的最大数量,默认为`25` - **`--out-peers`** —— 指定可接受向外连接的最大数量以维持稳定,默认为`25` - **`--runtime-cache-size 64`** - 将保留在内存缓存中的不同运行时版本的数量配置为`64` +- **`--eth-log-block-cache`** - - 以字节为单位,限制用于区块数据的LRU缓存的大小。此标志因不同RPC提供商而异。默认值为`300000000` +- **`--eth-statuses-cache`** - 以字节为单位,限制用于交易状态数据(transaction statuses data的LRU缓存的大小。此标志因不同RPC提供商而异。默认值为`300000000` +- **--sync** - 设置区块链同步模式,可以用来加快区块链的同步速度。可用选项有: + - **`full`** - 下载并验证完整的区块链历史记录 + - **`fast`** - 下载区块而不执行它们,并下载最新的状态和证明 + - **`fast-unsafe`** - 与`fast`相同,但会跳过下载状态证明 + - **`warp`** - 下载最新的状态和证明 + ## 如何访问所有可用标志 {: #how-to-access-all-of-the-available-flags } diff --git a/node-operators/networks/run-a-node/overview.md b/node-operators/networks/run-a-node/overview.md index 26e1e63a..2a995a6d 100644 --- a/node-operators/networks/run-a-node/overview.md +++ b/node-operators/networks/run-a-node/overview.md @@ -59,8 +59,7 @@ Moonbeam拥有多种不同的部署渠道,包含Moonbase Alpha测试网,Kusa 只有指定P2P端口才需要对流入流量开放。**收集人节点不可以开放任何WS或RPC端口。** -!!! 注意事项 - 从[v0.30.0客户端版本](https://github.com/moonbeam-foundation/moonbeam/releases/tag/v0.30.0){target=_blank}开始,端口{{ networks.parachain.rpc }}的HTTP RPC端点已被弃用。端口{{ networks.parachain.ws }}的WS RPC端点应该同时用于HTTP和WS连接. +--8<-- 'text/node-operators/client-changes.md' ### 平行链全节点的默认端口 {: #default-ports-for-a-parachain-full-node } diff --git a/node-operators/networks/run-a-node/systemd.md b/node-operators/networks/run-a-node/systemd.md index e9e07673..1a466efe 100644 --- a/node-operators/networks/run-a-node/systemd.md +++ b/node-operators/networks/run-a-node/systemd.md @@ -205,16 +205,13 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 - 如果您使用不同目录,请再次检查基本路径 - 将文档命名为`/etc/systemd/system/moonbeam.service` -!!! 注意事项 - 对于v0.27.0之前的客户端版本,`--state-pruning`标志被命名为`--pruning`。 - - 对于v0.30.0之前的客户端版本,`--rpc-port`用于指定HTTP连接的端口,`--ws-port`用于指定WS连接的端口。从客户端版本v0.30.0开始,`--rpc-port`已被弃用,`--ws-port`命令行标志同时适用于HTTP连接和WS连接。类似地,`--rpc-max-connections`命令行标志已被弃用,现在被硬编码为100。您可以使用`--ws-max-connections`来调整HTTP和WS连接的总限制。 +--8<-- 'text/node-operators/client-changes.md' ### 全节点 {: #full-node } === "Moonbeam" - ```text + ```bash [Unit] Description="Moonbeam systemd service" After=network.target @@ -229,16 +226,13 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 SyslogFacility=local7 KillSignal=SIGHUP ExecStart={{ networks.moonbeam.node_directory }}/{{ networks.moonbeam.binary_name }} \ - --execution wasm \ - --wasm-execution compiled \ --state-pruning=archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonbeam.node_directory }} \ --chain {{ networks.moonbeam.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -247,7 +241,7 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 === "Moonriver" - ```text + ```bash [Unit] Description="Moonriver systemd service" After=network.target @@ -262,16 +256,13 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 SyslogFacility=local7 KillSignal=SIGHUP ExecStart={{ networks.moonriver.node_directory }}/{{ networks.moonriver.binary_name }} \ - --execution wasm \ - --wasm-execution compiled \ --state-pruning=archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonriver.node_directory }} \ --chain {{ networks.moonriver.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -280,7 +271,7 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 === "Moonbase Alpha" - ```text + ```bash [Unit] Description="Moonbase Alpha systemd service" After=network.target @@ -295,16 +286,13 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 SyslogFacility=local7 KillSignal=SIGHUP ExecStart={{ networks.moonbase.node_directory }}/{{ networks.moonbase.binary_name }} \ - --execution wasm \ - --wasm-execution compiled \ --state-pruning=archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonbase.node_directory }} \ --chain {{ networks.moonbase.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -312,13 +300,13 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 ``` !!! 注意事项 - 如果您想要运行RPC终端、连接至polkadot.js.org或是运行您自己的应用,使用`--unsafe-rpc-external`和/或`--unsafe-ws-external`标志来运行能够从外部访问RPC端口的全节点。您能够通过执行`moonbeam --help`以获得更多细节。我们**不建议**收集人节点使用此配置。有关上述标志的概述,请参阅开发者文档的[标志](/node-operators/networks/run-a-node/flags){target=_blank}页面。 + 如果您想要运行RPC终端、连接至polkadot.js.org或是运行您自己的应用,使用`--unsafe-rpc-external`标志来运行能够从外部访问RPC端口的全节点。您能够通过执行`moonbeam --help`以获得更多细节。我们**不建议**收集人节点使用此配置。有关上述标志的概述,请参阅开发者文档的[标志](/node-operators/networks/run-a-node/flags){target=_blank}页面。 ### 收集人 {: #collator } === "Moonbeam" - ```text + ```bash [Unit] Description="Moonbeam systemd service" After=network.target @@ -334,15 +322,12 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 KillSignal=SIGHUP ExecStart={{ networks.moonbeam.node_directory }}/{{ networks.moonbeam.binary_name }} \ --collator \ - --execution wasm \ - --wasm-execution compiled \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonbeam.node_directory }} \ --chain {{ networks.moonbeam.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -351,7 +336,7 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 === "Moonriver" - ```text + ```bash [Unit] Description="Moonriver systemd service" After=network.target @@ -367,15 +352,12 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 KillSignal=SIGHUP ExecStart={{ networks.moonriver.node_directory }}/{{ networks.moonriver.binary_name }} \ --collator \ - --execution wasm \ - --wasm-execution compiled \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonriver.node_directory }} \ --chain {{ networks.moonriver.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -384,7 +366,7 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 === "Moonbase Alpha" - ```text + ```bash [Unit] Description="Moonbase Alpha systemd service" After=network.target @@ -400,15 +382,12 @@ description: 如何使用Systemd为Moonbeam网络运行一个平行链全节点 KillSignal=SIGHUP ExecStart={{ networks.moonbase.node_directory }}/{{ networks.moonbase.binary_name }} \ --collator \ - --execution wasm \ - --wasm-execution compiled \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonbase.node_directory }} \ --chain {{ networks.moonbase.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] diff --git a/node-operators/networks/tracing-node.md b/node-operators/networks/tracing-node.md index cc3ec021..bf64ff5a 100644 --- a/node-operators/networks/tracing-node.md +++ b/node-operators/networks/tracing-node.md @@ -31,7 +31,7 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 - **`-ethapi-trace-cache-duration `** —— 设置持续时间(以秒为单位),在此之后给定块的`trace_filter`缓存被丢弃。区块存储在缓存中的默认时间为`300`秒 !!! 注意事项 - 如果您希望运行一个RPC端点以连接Polkadot.js Apps或是运行自有应用,请使用`--unsafe-rpc-external`和/或`--unsafe-ws-external`标志以运行一个能够外部访问RPC端口的完整节点。更多细节可以通过运行`moonbeam --help`命令获得。 + 如果您希望运行一个RPC端点以连接Polkadot.js Apps或是运行自有应用,请使用`--unsafe-rpc-external`标志以运行一个能够外部访问RPC端口的完整节点。更多细节可以通过运行`moonbeam --help`命令获得。 ## 使用Docker运行一个追踪节点 {: #run-a-tracing-node-with-docker } @@ -94,10 +94,7 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 - 在两处替换 `INSERT_YOUR_NODE_NAME` - 用服务器实际RAM的50%替换 `<50% RAM in MB>`。例如服务器有32 GB RAM,这里则应配置为 `16000`. 内存配置最低值为 `2000`,但这将低于推荐配置 -!!! 注意事项 - 对于v0.27.0之前的客户端版本,`--state-pruning`标志被命名为`--pruning`。 - - 对于v0.30.0之前的客户端版本,`--rpc-port`用于指定HTTP连接的端口,`--ws-port`用于指定WS连接的端口。从客户端版本v0.30.0开始,`--rpc-port`已被弃用,`--ws-port`命令行标志同时适用于HTTP连接和WS连接。类似地,`--rpc-max-connections`命令行标志已被弃用,现在被硬编码为100。您可以使用`--ws-max-connections`来调整HTTP和WS连接的总限制。 +--8<-- 'text/node-operators/client-changes.md' 运行一个追踪节点的完整命令如下所示: @@ -111,13 +108,12 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 --chain {{ networks.moonbeam.chain_spec }} \ --name="INSERT_YOUR_NODE_NAME" \ --state-pruning archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --ethapi=debug,trace,txpool \ --wasm-runtime-overrides=/moonbeam/moonbeam-substitutes-tracing \ --runtime-cache-size 64 \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" ``` @@ -131,13 +127,12 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 --chain {{ networks.moonriver.chain_spec }} \ --name="INSERT_YOUR_NODE_NAME" \ --state-pruning archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --ethapi=debug,trace,txpool \ --wasm-runtime-overrides=/moonbeam/moonriver-substitutes-tracing \ --runtime-cache-size 64 \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" ``` @@ -151,13 +146,12 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 --chain {{ networks.moonbase.chain_spec }} \ --name="INSERT_YOUR_NODE_NAME" \ --state-pruning archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --ethapi=debug,trace,txpool \ --wasm-runtime-overrides=/moonbeam/moonbase-substitutes-tracing \ --runtime-cache-size 64 \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" ``` @@ -273,14 +267,11 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 - 如果您使用的是不同的目录,请再次确认基本路径 - 将文件命名为`/etc/systemd/system/moonbeam.service` -!!! 注意事项 - 对于v0.27.0之前的客户端版本,`--state-pruning`标志被命名为`--pruning`。 - - 对于v0.30.0之前的客户端版本,`--rpc-port`用于指定HTTP连接的端口,`--ws-port`用于指定WS连接的端口。从客户端版本v0.30.0开始,`--rpc-port`已被弃用,`--ws-port`命令行标志同时适用于HTTP连接和WS连接。类似地,`--rpc-max-connections`命令行标志已被弃用,现在被硬编码为100。您可以使用`--ws-max-connections`来调整HTTP和WS连接的总限制。 +--8<-- 'text/node-operators/client-changes.md' === "Moonbeam" - ```text + ```bash [Unit] Description="Moonbeam systemd service" After=network.target @@ -295,9 +286,8 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 SyslogFacility=local7 KillSignal=SIGHUP ExecStart={{ networks.moonbeam.node_directory }}/{{ networks.moonbeam.binary_name }} \ - --execution wasm \ --state-pruning=archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonbeam.node_directory }} \ --ethapi=debug,trace,txpool \ @@ -306,7 +296,6 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 --chain {{ networks.moonbeam.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -315,7 +304,7 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 === "Moonriver" - ```text + ```bash [Unit] Description="Moonriver systemd service" After=network.target @@ -330,9 +319,8 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 SyslogFacility=local7 KillSignal=SIGHUP ExecStart={{ networks.moonriver.node_directory }}/{{ networks.moonriver.binary_name }} \ - --execution wasm \ --state-pruning=archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonriver.node_directory }} \ --ethapi=debug,trace,txpool \ @@ -341,7 +329,6 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 --chain {{ networks.moonriver.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] @@ -350,7 +337,7 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 === "Moonbase Alpha" - ```text + ```bash [Unit] Description="Moonbase Alpha systemd service" After=network.target @@ -365,9 +352,8 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 SyslogFacility=local7 KillSignal=SIGHUP ExecStart={{ networks.moonbase.node_directory }}/{{ networks.moonbase.binary_name }} \ - --execution wasm \ --state-pruning=archive \ - --trie-cache-size 0 \ + --trie-cache-size 1073741824 \ --db-cache <50% RAM in MB> \ --base-path {{ networks.moonbase.node_directory }} \ --ethapi=debug,trace,txpool \ @@ -376,13 +362,15 @@ Geth的`debug`和`txpool` API以及OpenEthereum的`trace`模块提供一个非 --chain {{ networks.moonbase.chain_spec }} \ --name "INSERT_YOUR_NODE_NAME" \ -- \ - --execution wasm \ --name="INSERT_YOUR_NODE_NAME (Embedded Relay)" [Install] WantedBy=multi-user.target ``` +!!! 注意事项 + 如果您希望运行一个RPC端点以连接Polkadot.js Apps或是运行自有应用,请使用`--unsafe-rpc-external`标志以运行一个能够外部访问RPC端口的完整节点。更多细节可以通过运行`moonbeam --help`命令获得。 + ### 运行服务器 {: #run-the-service } --8<-- 'text/node-operators/networks/run-a-node/systemd/run-service.md' diff --git a/tutorials/integrations/local-subsquid.md b/tutorials/integrations/local-subsquid.md index fb7c8e85..fba02031 100644 --- a/tutorials/integrations/local-subsquid.md +++ b/tutorials/integrations/local-subsquid.md @@ -35,7 +35,7 @@ _作者:Erin Shaben_ - `--dev` - 指定使用开发链 - `--sealing 4000` - 每四秒(4000毫秒)密封一个区块 -- `--ws-external` - 监听所有WebSocket接口 +- `--rpc-external` - 监听所有HTTP与WebSocket接口 要创建一个开发节点,您可以运行以下指令为Moonbeam提供最新的Docker映像: @@ -44,7 +44,7 @@ _作者:Erin Shaben_ ```bash docker run --rm --name {{ networks.development.container_name }} --network host \ purestake/moonbeam:{{ networks.development.build_tag }} \ - --dev --sealing 4000 --ws-external --rpc-external + --dev --sealing 4000 --rpc-external ``` === "MacOS" @@ -52,7 +52,7 @@ _作者:Erin Shaben_ ```bash docker run --rm --name {{ networks.development.container_name }} -p 9944:9944 \ purestake/moonbeam:{{ networks.development.build_tag }} \ - --dev --sealing 4000 --ws-external --rpc-external + --dev --sealing 4000 --rpc-external ``` === "Windows" @@ -60,7 +60,7 @@ _作者:Erin Shaben_ ```bash docker run --rm --name {{ networks.development.container_name }} -p 9944:9944 ^ purestake/moonbeam:{{ networks.development.build_tag }} ^ - --dev --sealing 4000 --ws-external --rpc-external + --dev --sealing 4000 --rpc-external ``` 这些指令将会启动我们的开发节点,您可以使用9944端口。