写点什么

XCM:跨链开发者的「低代码平台」

  • 2025-01-31
    河北
  • 本文字数:5744 字

    阅读完需:约 19 分钟

XCM:跨链开发者的「低代码平台」


想象一下,你是一位满怀激情的区块链工程师,站在 Web3 技术的最前沿。你看到了无数的机会:

  • Acala 上有 30% APY 的流动性挖矿

  • Moonbeam 上有优质的借贷机会

  • Astar 上线了热门 NFT 项目

但是要把这些机会连接起来,你需要面对:

  • 智能合约开发

  • 跨链技术的基本原理

  • 跨链交易的安全性

  • 构建实际的跨链应用场景

  • 代码审计和安全性分析

为了更科学、更合理地编写代码,你还需要深入研究:

  • 一些顶尖的跨链项目

  • 基础设施型 DApp 的代码和合约地址

这一切似乎让人望而却步!

然而,你不禁思考,是否存在一种工具,能够让你绕过复杂的跨链原理、安全性的顾虑,甚至免去代码学习的艰辛,让你能够将大部分精力集中在跨链场景的构建和用户体验的优化上。幸运的是,波卡的跨链协议:  XCMP ,可能就是你寻找的答案。


为什么要关注 XCM ?

让我们先来看一个真实的场景:小明是一个 DeFi 玩家,他发现 Moonbeam 上有个很好的借贷机会,而 Acala 上则有个高收益的流动性挖矿项目。但是要同时参与这两个项目,他需要:先把资产从 Moonbeam 转到中心化交易所,等待确认,从交易所提现到 Acala 再等待确认,最后才能开始操作。

整个过程不仅耗时,还要支付高额手续费,更别说中间还要承担中心化交易所的风险。  

而有了 XCM,这个过程可以简化为:「在 Moonbeam 上点击"跨链转移到 Acala 并挖矿"」

等待十几秒,tada!交易完成!

在波卡生态中,XCM 就像是一张"跨链通行证",让你的资产和操作可以自由地在不同链间流转。不仅如此,作为开发者,你甚至可以让用户在你的应用中直接使用其他链的功能,就像在同一个超级 APP 里切换不同的服务一样流畅!

XMC 与传统跨链桥的区别

简单来说,XCM(Cross-Consensus Message)就是 Polkadot 生态的"万能积木"。它不是普通的跨链桥,而是一种全新的跨链通信格式,就像乐高积木一样可以自由组合,构建出各种有趣的应用。

安全性对比

传统安全桥通常会有 2 个重要的技术组件:1)源链交易正确性证明 2)跨链消息 relay,因此跨链桥的安全级别既取决于源链和目标链的链安全级别,也取决于跨链桥项目的安全级别。

而支撑 Polkadot 的 XCMP 的真正协议正是 Polkadot 的根基:共识共享安全。也就是说在 Polkadot 生态里,所有平行链的安全级别和 Polkadot 是一样的,而跨链消息的正确传递也由 Polkadot 保证。从模型的角度看,如果把 parachain 都理解成「大合约」的话,那么 Polkadot 和 parachain 所组成的并不是一个传统意义上的跨链网络,这就是一个超级区块链,只不过「应用/合约」和「应用/合约」之间的沟通形式是「异步」的而已。

这也是我们为什么可以抛开 XCM 的原理和安全性,只聚焦于业务构建的原因。

传统跨链桥的安全性:

源链安全性 + 桥的安全性 + 目标链安全性 = 最终安全性

Polkadot XCMP 的安全性:

Polkadot 中继链安全性 = 平行链安全性 = XCM 安全性

功能对比

传统跨链桥:就像坐轮渡过河,每次都要重新排队、买票、等待

XCM:像是城市地铁,刷一张卡就能畅通无阻


XCMP 不仅能够传输资产,还能携带错误处理、指令、回调和自定义信息,使得跨链通信更加强大和灵活。这种能力上的飞跃,让 XCMP 在跨链通信领域独树一帜,为开发者提供了前所未有的便利和可能性。

XCMP 简单介绍

XCM 的传递信道就是 XCMP ,是 Polkadot 生态内重要的跨链消息传递基础设施,目前的信道分成两大类:

VMP (垂直消息传递)

适用场景:平行链和中继链之间的沟通

平行链 <==(UMP/DMP)==> 中继链

UMP: 向上消息传递

DMP: 向下消息传递

HRMP(横向消息传递)

适用场景:平行链之间的沟通,目前还需要通过中继链。

ParaA ==> 中继链 ==> ParaB

特点:

  • 消息经过中继链转发

  • 成本较高但稳定可靠


主角登场:什么是 XCM

通过这些信道传递的消息就是 XCM (Cross-Chain Message)。XCM,准确来说,它是一种消息格式,是 Polkadot 生态中用于实现跨链和跨共识通信的标准:允许不同区块链之间交换「任意」数据,为开发者提供了一种编写跨不同链、智能合约平台和 Substrate 模块的通用语言。

简言之,基于 XCM 构造跨链消息,可以在 Polkadot relaychain 和 parachain 之间以「任意」路径路由「任意」消息。



深入之前,你还应该知道

到了这里,我们离 XCM 构造学习只差一步了,想象你正在构建一个跨链应用,如何准确定位链上的任何资源?MultiLocation 就是为解决这个问题而设计的通用寻址系统。

为什么需要 MultiLocation

传统区块链的地址表示:

0x742d35Cc6634C0532925a3b844Bc454e4438f44e

如果要进一步优化,可以标识网络:

eth:0x742d35Cc6634C0532925a3b844Bc454e4438f44e

sep:0x2a01008eaf04151687736326c9fea17e25fc5287

但是这样做仍有缺点:

  • 只能在单链内使用

  • 无法表达跨链关系

  • 缺乏层级结构

而为了解决以上的问题,MultiLocation 选择了相对路径的描述方案:

为了更加形象地理解这一点,假设我们现在有两个账户,Acala 链上的 Alice,和 Bifrost 链上的 Bob,他们的账户位置如下:

如果我们从 Polkadot 的视角来看,那么 Alice 和 Bob 的相对路径就是( child 即向下数):

Child -> Parachain(acala_chain_id)-> Account(alice)

Child -> Parachain(bifrost_chain_id)-> Account(bob)

如果从 Acala 的视角来看的话,那么 Bob 的描述就是( Parent 即向上数):

Parent -> Parachain(bifrost_chain_id) -> Account(bob)

也就是说,对于源链而言,知道了发送目的地的目标账户,即知道此条 XCM 消息的路径;同样地,目标链会从 xcm sender 的表示中知道源链的信息,并用此完成一些目标链上的资产、账户隔离等安全操作。

由此,我们也可以总结得到 MultiLocation 的关键设计原则:

相对性原则

  • 位置始终相对于当前链

  • 使用 parents 向上导航

  • 使用 interior 向下/平行导航

最短路径原则

  • 优先选择直接路径

  • 避免不必要的中继链跳转

  • 减少定位层级

统一性原则

  • 统一的寻址格式

  • 支持各类链上资源

  • 便于跨链互操作

更重要的是,MultiLocation 不仅涉及跨链系统中账户标识的设计,也是跨链资产的重要基石,它可以帮助目标链准确定位跨链资产的来源信息,从而保证在目标链的安全映射。

跨链系统特有的安全风险通常包括:账户混淆、资产欺诈和路由劫持,而 MultiLocation 的设计思路是一个很好的解决方案。

XCM 初探

XCM 是一门「跨链语言」,而且相当简单。我们可以把 XCM 想象成一堆指令,而「执行 XCM」就是一个虚拟机在执行指令。所以我们在很多文章中经常可以看到 XCVM 和 XCM 成对出现。这里的 XCVM 并不是一个真正的虚拟机,而是一个虚拟概念,准确地说,它是 xcm-executor。当一堆 XCM 消息到达目标链时,他们被按照顺序拿出并依次执行。

我们可以通过:

https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/xcm/src/v5/mod.rs#L393 

直接看到 XCM 的具体指令,我们可以大致把 XCM 指令大致分成 6 类:资产操作类、错误处理类、流程控制类、权限控制类、通用操作类、其他

资产操作类

WithdrawAsset,ReserveAssetDeposited,ReceiveTeleportedAsset,TransferAsset,TransferReserveAsset,DepositAsset,DepositReserveAsset,ExchangeAsset,InitiateReserveWithdraw,InitiateTeleport,ClaimAsset,BurnAsset,ExpectAsset,LockAsset,UnlockAsset,InitiateTransfer,
复制代码

流程控制类

SetAppendix(Xcm<Call>),
复制代码

错误处理类

SetErrorHandler,Trap,ClearError,ClearTransactStatus,ExpectPallet,ReportError,ReportTransactStatus,ExpectOrigin(Option<Location>),
复制代码

权限控制类

ClearOrigin,DescendOrigin,ExecuteWithOrigin,UniversalOrigin(Junction),
复制代码

通用操作类

Transact,
复制代码

其他类里包括一些查询状态、自定义路由、gasfee 处理相关的指令。

我们可以从 XCM 的指令分类中看出,XCVM( XCM 执行器)几乎就是一个资产特化版的「简单虚拟机」。有了 XCM ,就可以把开发者从「跨链系统原理」、「业务研究」、「手搓合约」的繁重劳动中解放出来,而只需要关注「如何组合 XCM 指令完成业务」即可。到这里,我们就触摸到了 XCM 的精髓—— XCM 的可组合性。

跨链乐高:XCM 的可组合性

到这里,我们都对 XCM 有了基本的概念,基于各种 XCM 指令的组合可以构建丰富的跨链场景。在实际应用中,Polkadot 使用 XCM 的可组合性,为跨链资产转账这一场景构造了一些基本的 XCM 组合范式,目前已经成为了中继链和平行链、平行链和平行链之间跨链资产的事实标准。

Polkadot 内,跨链资产转移有 2 种模式:1. Burn-mint 2. Reserve-Deposit. 顾名思义,这两种模式在目标链上的行为相差不大,重要的是在源链上,被跨链的资产是被销毁还是锁定在某个「托管账户」中。从这两种模式的区别我们可以看出,burn-mint 对源链和目标链的信任度要求非常高,因此这种模式的跨链转账通常发生在中继链与其系统平行链跨链转账中,而其他三方平行链之间则通常使用 withdraw-deposit 模式。

Burn-mint: Teleport

Burn-mint 的转移模式在 Polkadot 中有一种特定的称呼,叫做 teleport.



每次 teleport 通常由下面的三条指令完成业务功能:

[   InitiateTeleport, // 扣押并销毁发送地址上的资产  ReceiveTeleportedAsset, // 通知目标链  DepositAsset // 目标链直接增发资产至接收地址 ]  Withdraw-deposit: reserve-asset-transfer
复制代码


这种锁定-释放模式的跨链转账可以安全地转移任意资产,更具体地说,资产发行地在 Polkadot 任意链上,并不局限于只能转移源链或者目标链上的资产,图中展示的即是 AB 链之间跨链转移 C 链资产的场景。可以看到,完成这种相对复杂的跨链资产转移,也只需要 5 条 XCM 消息

[ WithdrawAsset, // 源链上扣押发送者资产 InitiateReserveWithdraw, // 通知资产发行链 DepositReserveAsset, // 路由至资产发行链,扣押源链主权账户上的资产 ReserveAssetDeposited, // 在资产发行链上,对目标链主权账户增发资产 DepositAsset // 在目标链的接受者地址上存入资产]
复制代码

头脑风暴:XCM 如何构造性感的跨链应用

此处给出的 XCM 组合仅作为示意,不能直接把它用在生产环境中。

到了这里,我们就已经基本了解如何构造 XCM 用于跨链转账了,下面让我们畅想一些有趣的跨链应用,以及要如何组合使用 XCM 来实现它们。

场景一:跨链流动性聚合器

想象一个可以自动在多个 DEX 间寻找最佳价格的跨链交易系统:


// 2. 设置价格检查ExpectAsset {    assets: expected_output.clone(),    effects: vec![       // 如果价格不满足则回退        BuyExecution {             fees,             weight_limit: Limited(1_000_000)         },        RefundSurplus,        DepositAsset { beneficiary: sender }    ]},// 3. 执行最优路径交易Transact {    origin_type: OriginKind::Native,    require_weight_at_most: 5_000_000,    call: router::swap_with_best_route(        input_amount,        min_output,        dex_routes,        deadline    ).encode()  }]);
复制代码

场景二:跨链借贷协议

实现在一个链上存入抵押品,在另一个链上借出资产:

// 跨链借贷   let cross_chain_lending = Xcm(vec![   // 1. 锁定抵押品    WithdrawAsset(collateral_assets.clone()),       // 2. 验证抵押率    Transact {        call: lending::check_collateral_ratio(            user_account,            collateral_amount,            borrow_amount        ).encode()    },       // 3. 设置清算条件    Transact {        call: lending::set_liquidation_params(            threshold: 150,          // 150% 清算阈值            penalty: 5,              // 5% 清算惩罚            grace_period: 24 * 3600  // 24小时宽限期        ).encode()    },       // 4. 发放贷款    Transact {        call: lending::borrow_assets(            asset_id,            borrow_amount,            recipient        ).encode()    },        // 5. 设置自动还款    SetAppendix(Xcm(vec![        QueryHolding {            query_id: 2,            dest: ParaId(2004),            assets: repayment_asset,            max_response_weight: 1_000_000        },        Transact {            call: lending::auto_repay(                loan_id,                repayment_schedule            ).encode()        }    ]))]);
复制代码

场景三:跨链 DAO 治理

实现跨链投票和提案执行:

 // 跨链治理let governance_xcm = Xcm(vec![   // 1. 验证提案权重    QueryHolding {        query_id: 3,        dest: dao_location,        assets: governance_token,        max_response_weight: 1_000_000    },   // 2. 提交投票    Transact {        call: governance::cast_vote(            proposal_id,            vote_direction,            vote_weight        ).encode()    },   // 3. 锁定投票权重    LockAsset {        assets: governance_token,        duration: 7 * 24 * 3600  // 锁定一周    },   // 4. 设置自动执行    SetAppendix(Xcm(vec![       // 当提案通过时自动执行        Transact {            call: governance::execute_proposal(                proposal_id,                execution_params            ).encode()        }    ]))]);
复制代码

XCM,波卡开发者的新机遇

Polkadot 开发新范式:从「造链」到「造桥」

除了上述场景之外,我们还有无穷无尽的跨链机遇:跨链 NFT 的交易,跨链闪电贷套利方案、 资产收益多链配置.......曾经,在 Polkadot 生态内,开发者都努力学习 substrate(polkadot-sdk),努力开发自己的 app-chain.                        

时间来到 2024 年,Polkadot 此时:

  • 平行链数量来到了 45 条

  • Coretime 竞拍降低入场门槛

  • 链间互操作需求激增

  • 跨链应用迎来爆发期

此时有一扇全新的大门敞开了:「整合多平行链功能,构造跨链入口」,这也深度契合当前区块链世界大的发展方向——链抽象。也就是说,我们只需要理解其他平行链的业务代码,并合理组合 XCM 指令,就可以创造出性感的跨链应用,甚至很可以成为 Polkadot 的独角兽应用。

The future is cross-chain, and it starts with XCM.

参考资料

XCM 入门:https://wiki.polkadot.network/docs/learn-xcm-index

发布于: 刚刚阅读数: 6
用户头像

还未添加个人签名 2022-01-14 加入

还未添加个人简介

评论

发布
暂无评论
XCM:跨链开发者的「低代码平台」_区块链_One Block Community_InfoQ写作社区