Axelar跨链网关协议固态性实施
议定书概览
Axelar是一个分散的互操作网络,通过一套通用协议和API连接所有区块链,资产和app. 它建在宇宙SDK上方 用户/应用程序可以使用Axelar网络在任何Cosmos和EVM链之间发送令牌. 他们也可以 在 EVM 链之间发送任意信息.
Axelar网络的分散验证器确认EVM链上排放出的事件(如存款确认和发送信息), 并签署(通过自动服务)提交网关智能合同的命令(如铸造信使和批准目的地信息).
见 这个医生 为更多的设计信息.
构建
我们建议使用最新的节点 LTS 版本。 。 。 .
npm ci
npm run build
npm run test
预编译字节代码可见于 释放。 。 。 . 此外,预先编译的字节码和ABI在 npm 软件包 并可通过下列方式导入:
npm i @axelar-network/axelar-cgp-solidity
const IAxelarGateway = require('@axelar-network/axelar-cgp-solidity/artifacts/interfaces/IAxelarGateway.json');
const AxelarGateway = require('@axelar-network/axelar-cgp-solidity/artifacts/contracts/AxelarGateway.sol/AxelarGateway.json');
部署合同
见Axelar合同部署 仓库 用于相关部署/升级脚本:
实时网络测试
- 检查合同部署仓库是否支持您将要使用的链条 。 可找到支持的链条 这里。如果链条没有支持,请进入步骤2-4,否则可以跳过步骤5.
- 合同部署的导航 这里 并本地复制仓库.
- 在合同部署内重播,编辑其中的环境特定文件
axelar-chains-config/info要添加您将要测试的链条的文件夹 。 需要提供以下数值:
{
"chains": {
"example": {
"name": "Example",
"axelarId": "example",
"chainId": 123,
"rpc": "PROVIDER_RPC",
"tokenSymbol": "EXM",
"gasOptions": {
"gasLimit": 8000000
},
"confirmations": 1
}
}
}
gasLimit 超接会跳过汽车气体估计(对于某些txs,在某些链条上可能不可靠). confirmations 表示等待的块确认数. axelarId 是Axelar上用来引用链条的唯一标识.
- 回到原点
axelar-cgp-solidity仓库。 之后,在这个寄存器的根目录中,导航到hardhat.config.js文件并修改链导入行如下:
const chains = require(`/path/to/axelar-contract-deployments/axelar-chains-config/info/${env}.json`);
- 创建一个
keys.json包含用于测试的账户私钥的文件。 一些测试,例如:AxelarGateway测试,您至少需要提供 两个私钥 (你可以参考 测试 (d) 寻找所需账户的数目。 此时此刻keys.json文件应该与下面的示例文件相类似( e)chains可留空 :
{
"chains": {},
"accounts": ["PRIVATE_KEY1", "PRIVATE_KEY2"]
}
- 保证您对应提供的私人密钥的账户在链条上有足够的气体符号 .
- 运行
npm ci
npx hardhat test --network example
- 要运行特定测试,您可以通过添加来修改测试脚本
.only改为describe和(或)it如下所示的块或 grep 特定测试名称 :
describe.only();
it.only();
应该检查两个基本测试组的EVM兼容链:
npx hardhat test --network example --grep 'AxelarGateway'
npx hardhat test --network example --grep 'RpcCompatibility'
调试步骤
- 明确通过
getGasOptions()使用 utils.js 文件进行一些小交易。 参见以下代码
await sourceChainGateway
.execute(
await getSignedWeightedExecuteInput(await getTokenDeployData(false), [operatorWallet], [1], 1, [operatorWallet]),
getGasOptions()
)
.then((tx) => tx.wait(network.config.confirmations));
-
使用最新的和快的rpc可以帮助测试执行运行时间. 确保不超过 rpc 的利率限制 .
-
确保用于广播交易的账户有足够的本土余额。 最大值
gasLimit对于链条,应该从探索者取出并将其设置在配置文件中。 您可能需要更新confirmations将交易成功包含在配置中的块中 这里 取决于网络. -
请注意,某些测试可能需要多达3个账户.
-
如果以前的交易没有被查封,并且被查封,交易就可能失败,因此在广播后等待交易被查封。 参见以下代码
await testToken.mint(userWallet.address, 1e9).then((tx) => tx.wait(network.config.confirmations));
// Or
const txExecute = await interchainGovernance.execute(commandIdGateway, governanceChain, governanceAddress, payload, getGasOptions());
const receiptExecute = await txExecute.wait(network.config.confirmations);
示例流量
见Axelar 实例 具体的例子.
调试
- 设置: 托肯的包裹版本
A已部署(AxelarGateway.deployToken()(中文(简体) ) 每个非本地EVM链作为 ERC-20 令牌(BurnableMintableCappedERC20.sol) (中文(简体) ). - 鉴于目的地链和地址,Axelar网络生成一个存款地址(地址:
DepositHandler.sol已经部署,BurnableMintableCappedERC20.depositAddress())在源EVM链上. - 用户发送其代号
A在那个地址,押金合同把信使锁入网关(或烧为包裹信使). - Axelar 网络验证器确认押金
Transfer使用源链的 RPC 节点( 使用多数表决). - Axelar网络准备一个薄荷命令 验证器在上面签名.
- 现在通过任何外部中继器向目的地链上的网关合同提交已签名的命令
AxelarGateway.execute()。 。 。 . - 网关合同认证命令,以及
mint'是所包裹的托肯的指定数量'A到目的地地址.
跨链智能合同呼叫
- 设置 :
- 目标合同执行
IAxelarExecutable.sol接口以接收消息. - 如果发送了信号,源合同需要调用
ERC20.approve()事先允许网关合同 以转移指定的amount代表发件人/来源合同.
- 目标合同执行
- 关于源链呼叫的智能合同
AxelarGateway.callContractWithToken()与目的地链/地址,payload和标志. - 外部服务商店
payload在常规数据库中,按hash(payload)任何人都可以问. - 类似上述,Axelar验证器确认
ContractCallWithToken活动. - 阿克塞尔网络准备
AxelarGateway.approveContractCallWithMint()命令,由验证者签名. - 交给目的地网关合同,
记录批准
payload hash并发布事件ContractCallApprovedWithMint。 。 。 . - 任何外部中继器服务都会在网关合同中收听此事件,并呼叫
IAxelarExecutable.executeWithToken()目标合同,与payload和其他数据作为参数. executeWithToken核实合同召见是否确实得到AxelarGateway.validateContractCallAndMint()在网关合同.- 作为其中的一部分,网关合同记录了目的地地址验证了批准,不允许重放.
- 目的地合同使用
payload因为它自己的应用.
参考资料
网络资源 : https://docs.axelar.dev/resources (中文(简体) )
部署的合同: https://docs.axelar.dev/resources/mainnet 互联网档案馆的存檔,存档日期2013-12-21
一般信件传用 : https://docs.axelar.dev/dev/gmp 页面存档备份,存于互联网档案馆
实例 : https://app.squidrouter.com (中文(简体) )
Axelar网络的EVM模块,为网关准备命令: https://github.com/axelarnetwork/axelar-core/blob/main/x/evm/keepers/msg server.go. 互联网档案馆的存檔,存档日期2014-12-21