深入了解达尔文跨链桥
最近仔细阅读了Darwinia Medium博客的四篇关于其跨链桥的说明文章,恰逢近期对跨链桥技术颇感兴趣,现将上述文章核心内容整理说明如下,本文为笔者个人的解读,仅供社区参考。本文约6000字,请耐心阅读,定不负时光。
参考内容:
1. [Understanding Darwinia Bridge 1-1] Darwinia Relayer Incentive Scheme—Fee Market.
2. [Understanding Darwinia Bridge 1-2] Mapping Token Factory.
3. [Understanding Darwinia Bridge 1-3] The Token Bridge Solution.
4. [Understanding Darwinia Bridge 1-4] The New Message Protocol for the Ethereum-Darwinia Bridge.
5. Fee Market Strategy and Design of Relayer Fee Market details from darwinia’s Github.
整体思路:
依据上述文章内容,为更好的、成体系的阐述所有内容,笔者对行文内容进行了编排,打乱了参考文章的顺序。首先我们从Darwinia提供的资产跨链解决方案展开(1-3)介绍,之后阐述一下该方案中Issuing模块下面的子模块映射代币工厂(1-2)。而后我们深入研究一下资产跨链解决方案中的信息传递环节,即darwinia提出的Ethereum-Darwinia跨链通讯协议(1-4),最后聚焦通讯协议中的核心角色Relayer,阐述一下市场化的跨链费用报价过程(1-1)。下面,我们开始。
一、The Token Bridge Solution(资产跨链解决方案)
目前最常用的达尔文跨链桥是达尔文和以太坊之间的双向跨链桥,达尔文是基于Substrate开发的区块链,因此达尔文和以太坊两者是异构的。本部分阐述的就是达尔文提出的用于异构区块链之间的资产跨链解决方案。
1. CBA model
达尔文桥基于CBA(Cryptocurrency Backed Asset)model设计,该模型下有两个核心模块,即源链上Backing module和目标链上的Issuing module。Backing module:用于锁定和解锁源区块链上的原生资产。Issuing module:用于发行和销毁目标链上的映射资产,这种价值由源链上的原生资产背书的映射资产,就是上文中提到的CBA。这种CBA模型在跨链桥的设计中是最常见的一种类型。其具体实现方式如下:
(1)Deploy&Register部署与注册
如下图所示:

桥创建者在源链上部署Backing的智能合约(Backing module),同时在目标链上部署Issuing的智能合约(Issuing module)。跨链桥的使用者可以调动Backing module的接口来注册源链上的原始资产,之后Relayer(中继者)将会把信息同步到目标链的Issuing合约,该合约会创建一个映射合约,后续来发行和存储映射的资产。关于Relayer的话题,我们会在后面部分详细说明。
(2)Issue发行
如下图所示:

用户在源链上锁定一定数量的原生代币并发起代币跨链申请(通过调用Backing module的lock_and_remote_issue()接口),代币锁定后用户可以获得锁定的证明,relayer将此证明发送至目标链上的Issuing module进行验证,验证成功后Issuing module依据合约规定将对应数量的映射资产发送至目标链上的收款账户。
(3)Transfer/Swap转账与兑换
如下图所示:

映射代币其本质也是一种代币,因此其也可以作为一种资产在不同用户之间转移,同时可以通过在dex上设置流动性交易对与其他代币进行兑换。
(4)Redeem赎回
如下图所示:

用户可以在目标链上通过销毁映射代币的方式来解锁源链上锁定的代币(通过调动目标链上Issuing module的remote_unlock()接口),relayer将销毁映射代币的证明中继至源链上的Backing module,Backing module在验证该证明后解锁原生代币。
2. Backing Technology去中心化的资产背书技术
常见的资产背书技术实现方式主要有以下三种,这里用比较宏观的方式来说明,想研究技术细节还需要去看对应项目的docs,由于不是本文重点,就不展开说了。
(1)多节点验证:通过设置多个信任节点或者托管人对用户锁定的原生资产进行集体托管,往往通过多签或者至少占比多少的节点签名等方式来避免单节点模式下的单点失效,去中心化程度依据参与验证节点数量的多少决定。参考Parity Bridge, ChainX。
(2)桥资产质押与Chain Relay结合:参考XClaim项目的方式,但是该方案仅仅适用于同质化、高流动性的资产,并且其经济模型可行性相对较弱。
(3)完全使用Chain Relay(链中继):达尔文跨链桥就是此种方式,完全使用Chain Relay进行链上验证。这种解决方案要求部署Issuing module的目标链必须支持智能合约、链上runtime、硬分叉等特性,因此在链中继和类似Bitcoin的区块链是无法部署的。这种模式的优势是能够支持多样化的原生资产,包括非流动性资产和NFT。经济模型而言,类似达尔文的Sub-linear亚线性链中继会有更好的表现。
二、Mapping Token Factory(映射代币工厂)
本部分我们针对前文提到的,目标链上Issuing module的其中一个子模块Mapping Token Factory进行实现细节的阐述,该模块主要用于在目标链上创造、发行和销毁映射资产。
1. Mapping Assets映射资产
这里的Mapping Assets主要强调与源链上native Assets原生资产的一一映射,在很多场景中也可以叫做Wrapped Assets/Wrapped Tokens,本质都是一样的,都是由原生资产背书的衍生资产,是跨链场景中常见的技术安排。在映射资产创建之前,Mapping Token Factory(映射代币工厂)为创建映射资产设定了一系列的准则,最终目的都是使映射资产与原生资产保持同样的特性和方法(具体体现在代币的智能合约中),当然,允许存在不同,也允许后续的优化升级。在提取链上元数据时,映射资产主要从两方面进行体现:Symbol prefix:”x”:在元数据中,Mapping Token标志的前缀会多一个x,举例来说,如果原生资产为RING,那么映射资产就为xRING,如果xRING再次被映射,则映射后的资产名称为xxRING。Name postfix:”[${backing_chain_short_name}>”:还是举将RING从Darwinia主网向其测试网Crab进行跨链,RING的全称叫做Darwinia Network Native Token,则Crab上跨链后的资产名称就为Darwinia Network Native Token[Darwinia>,如果该资产又跨链至其他区块链网络,则新网络上的资产名称为Darwinia Network Native Token[Darwinia>[Crab>。下图展示了以USDT进行跨链的类似流程:

2. Permission Management许可管理
进行资产的发行许可不是由单个私钥进行控制的,而是由系统账户进行控制,只有在源链上的backing module锁定了原生资产以后,才可以激活目标链上的发行许可,一旦映射资产发行至收款人的账户,收款人对该资产就拥有了完全控制权。对应的,在解锁的流程中,只有在目标链上进行了映射资产的销毁,才能够获取源链上的原生资产的解锁许可,这种机制确保的映射资产和原生资产的一一背书和映射关系,实质上来讲,映射资产的转移与原生资产的转移,在价值上,是对等的。
3. Safety of Assets资产安全
一旦在两个区块链中为某种资产Token建立了跨链桥,这个桥就拥有了独立的安全性,也就是说,不同资产之间的跨链桥是相互独立的,单个资产桥的安全问题不会影响其他桥。
三、The Message Protocol for the Ethereum-Darwinia Bridge(以太坊-达尔文桥的信息跨链协议)
IT技术的本质是信息的传递,而跨链技术的核心就是跨链信息的传递和确认,在从代币的角度了解了达尔文跨链桥的宏观架构后,我们聚焦跨链过程中信息中继和传递的过程,the Message Protocol,为便于细节讲解,后文基于已经实现并落地的达尔文Ethereum-Darwinia跨链桥进行阐述,可参考下图:

1. 相关概念
(1)Message信息:所谓信息跨链本质上是指从源链上发送带有参数的跨链指令,调用目标链上智能合约的功能函数。简单来讲,就是用户向跨链桥发起跨链指令,该指令中含有用户需要进行跨链的token,数量等参数信息,该信息被处理并中继至目标链的智能合约,调用智能合约代码中的功能函数。这个过程类似于一个RPC调用,而message中往往含有源链、目标链、指令内容等数据。
(2)Channel通道:通道是单向的,负责将信息从源链发送至目标链,包括源链上的outbound lane(出站通道)和目标链的inbound lane(入站通道)两种,当然,在实现双向跨链的情况下,两个区块链上两种通道都是有的。如上图,在Darwinia跨链桥的三层设计中,用户想要实现跨链就必须将信息通过Message Layer信息层的通道进行传输,信息层含有多个这样的出入站通道,并且并对传输信息有一定的保护和筛选机制。
(3)Relayer中继:中继是信息传输搬运工的角色,负责将信息在源链和目标链之间传递,与区块链上的智能合约不同,它是一个链下的角色,是达尔文跨链桥的重要组成部分。
2. Message Workflow信息流
信息传输协议可以通过链上智能合约或者runtime中的一个模块实现,目前达尔文网络已经实现了DVM虚拟机(对以太坊智能合约兼容),因此Darwinia在以太坊和达尔文网络两边都通过智能合约部署了信息传输协议。
(1)Data Structure of Message信息流的数据结构

如上图所示,
Message是由源链上的智能合约产生,被发送至目标链上的智能合约并被执行。其包括MessageKey和MessageData两部分,其中MessageKey包括源链、目标链和出入站通道ID;MessageData代表了用户想要对目标链上智能合约进行的操作指令,包括指令内容payload(发起账户地址、目标合约地址及具体指令参数)和跨链费用信息fee。理论上payload中包含的指令数据信息没有限制,而且可以被目标链上的智能合约解码读取并执行,在设计上达尔文使用ABI编码方式,因为它易于生成且gas fee低。
(2)Process of a message delivery信息传递的完整生命周期
完整生命周期如下图所示(请放大图片观看,以信息从以太坊跨链至达尔文网络为例):

首先,以太坊的用户发送指令消息来调用达尔文网络上智能合约的功能函数(通过调用outbound lane出站通道的send_message()),就像前文中提到的,该信息包括通道的ID、用户愿意支付的跨链费用信息等数据。
Phase1第一阶段(Delivery Phase):
#1 保存信息并触发MessageAccepted事件:以太坊上指定的出站通道会检查并保存信息,并且触发“信息已接收”的事件,如果该信息通过了检查,会被配发一个nonce并保存在智能合约中,到这一步,信息就处于“被跨链桥接收”的状态。
#2 获取存储/信息证明:一旦relayer发现了处于被接收状态的信息,就会要求获取相关证明(receipt_proof或者storage_proof)。
#3 接收信息证明 & #4 验证信息证明:relayer接收了相关证明后,就会通过调用达尔文网络上特定inbound lane入站通道的receive_message_proof()功能来转发信息和相关证明,同时由运行在达尔文网络上的以太坊轻客户端(所谓轻客户端是与完整客户端相对应的,相较完整客户端完全存储以太坊的区块链信息,轻客户端仅仅存储以太坊区块头信息以确保信息进行验证,轻客户端往往背后会依赖于完整的客户端以确保万一需要对完整信息进行核验)对信息的证明进行验证(通过调用verify_message_proof()功能)。
#5 接收信息并发送信息 & #6 保存传递的信息并触发MessageDispatched事件:以太坊轻客户端验证完信息后,入站通道会继续转发信息并触发“消息已发送”事件,至此,消息已被转发至目标链并处于“被跨链桥送达”的状态,虽然消息已经被送达,但目标链并不知道这个情况,因此需要进入信息跨链的第二阶段,relayer需要把达尔文网络上的信息传递情况通知以太坊侧。
Phase2第二阶段(Confirmation Phase):
进行第二阶段Confirmation的信息传递主要出于以下两方面的考虑:一是通过该阶段流程的开展,可以对完成对已经delivered但尚未confirmed的信息进行流量控制;二是如果部署了Relayer Fee Market(后文会提到),relayer需要证明他们确实完成了信息的传递并获取对应奖励。
#7 获取存储/信息证明、#8 接收信息传递证明、#9 验证信息传递证明、#10 确认信息传递:与第一阶段的流程类似,以太坊上部署的达尔文轻客户端会对relayer提交过来的第一阶段工作证明进行验证,之后以太坊上的入站通道就会触发第二阶段的“消息已被跨链桥送达”事件,至此,信息传递已最终被跨链桥两侧确认。
#11 触发MessageDelivered事件并支付relayer奖励:之后就会触发relayer 获取奖励的流程也是支付跨链费的过程。
#12 获取存储/信息证明 & #13 接收信息证明:最后relayer会通知达尔文链信息传递已经被最终确认,可以进行后面其他信息的跨链操作,没有这最后一步,达尔文链上的所有跨链信息都会排队堆积在入站通道,而无法被转发。
3. Relayer Incentive Scheme中继激励机制
目前relayer节点是由达尔文项目自己运行的,以确保跨链桥的有效运行,同时达尔文也设计了一套名为Relayer Fee Market的Relayer激励机制,以确保未来通过更为去中心化的形式实现跨链桥并吸引更多参与者来建设社区。
四、Darwinia Relayer Incentive Scheme—Fee Market(达尔文中继的激励框架—跨链费市场)
最后我们聚焦于跨链桥的最重要角色Relayer(中继),阐述一下达尔文设计的一个集中竞价的跨链费价格决定机制,Relayer Fee Market。
1. 前提条件
(1)仅支持源链的原生代币作为作为跨链费的支付方式。(2)跨链费的计算由源链上的定价系统决定,该定价系统是由Relayer Fee Market实现的。(3)目标链上的所有交易成本均由relayer承担,relayer通过出示其成功传递消息的证明获取跨链处理费用,为了确保激励机制可行,定价机制应当确保relayer获取的跨链费用收益高于其成本,如果自动化的定价市场出现问题,relayer应当可以手工出价,一旦relayer没有如期传递消息,他们应当被惩罚。(4)在Relayer Fee Market市场上,relayers和用户是供需的双方,因此跨链费的高低随着供需双方的多寡而波动,同时任何人都可以承担relayer的角色,一旦成为relayer,就必须承担对应的风险,这些风险包括代币价格波动、报价和获取收益的时滞、操作失败后惩罚导致的押金损失等。
2. Tiered Quotation Market分层报价市场
分层报价市场适用于源链上gas费较低且交易确认速度比较快的链,例如Heco、BSC、Polygon和Darwinia,其具体报价流程如下:首先会有一个链下的定价系统来发布价格参考信息,relayers依据系统提供的参考价格信息提出自己的报价,同时需要在链上锁定一定数量的保证金做抵押以防止失败和作恶的情形。在有意向的relayers都提出报价后,系统会对价格进行升序排序并选出最低的n个报价,我们假设是最低报价为Relayer1(简称R1)提出的价格P1,次低为R2提出的P2,依次类推直至Rn提出的Pn,这n个被选出的Relayers都叫做Assigned Relayer,而用户在本次市场中实际支付的跨链费为Pn,之所以一次选择n个Relayer出来,是出于备份冗余的考虑。这n个被选出来的Assigned Relayers实际上集体为本次的信息跨链负责,跨链成功,他们会拿走多数的奖励,也会因为失败而被严厉惩罚。依据自己报价的高低每个Assigned Relayer都会被分配一个time slot,出价越低time slot的优先级越高,信息跨链就越可能在自己的time slot被传递和确认。同时系统会确保有足量的Assigned Relayer才会执行信息跨链,如果参与的Assigned Relayer低于系统要求的MIN_ASSIGNED_RELAYERS_NUMBER,系统会自动拒绝用户跨链请求。这里我们要聚焦一下Assigned Relayer、Delivery Relayer和Confirmation Relayer的区别,因为最终的跨链费奖励会流向他们(下一部分阐述)。笔者在阅读原文过程中一开始对这三个概念有些混淆,在反复阅读原文并咨询Darwinia Dev后,进一步理解阐述如下:
Assigned Relayer:如前文所言Assigned Relayers要质押保证金在链上,集体为本次的信息跨链负责,是可能被惩罚的,但只要正常履职,会拿走多数奖励。
Delivery Relayer:是执行本文第三部分中提到的Delivery Phase过程的Relayer,可以是Assigned Relayer,也可以是报价未被选中的Relayer,实际上成为Relayer的门槛不高,只要机器运行darwinia Bridger客户端即可,也不是必须要进行保证金抵押。
Confirmation Relayer:是执行本文第三部分中提到的Confirmation Phase过程的Relayer,同样的,也可以是Assigned Relayer或者是其他Relayer,对是否质押保证金也没有要求。Confirmation Relayer和Delivery Relayer可以不是同一个。
3. Details of Implementation详细的实现过程
(1)Relayer注册和锁定保证金:调用enroll_and_lock_collateral实现,可以调用cancel_enrollment退出,但值得注意的是,一旦Relayer被选作了单个信息跨链过程的Assigned Relayer,在跨链过程结束前是无法退出的,因为其可能会被slash掉保证金。
(2)报价:目前使用较为简单的报价方式,即fn(message)=const_price * 1,即每条消息的固定价格是多少,后续会对fn(message)报价方式进行更市场化的开发。如果Relayer在注册后保证金由于被罚款而导致不足,那么其在补足保证金前将无法在成为Assigned Relayer。
(3)发送信息:用户支付Pn跨链费来进行跨链,Pn的分配会通过relayer fund account 模块开展。
(4)信息传递:Delivery Phase和Confirmation Phase过程,具体可参考第三部分。
(5)奖励或者惩罚Relayer:

上图展示了用户支付的跨链费Pn的分配过程,以及一旦在所有Assigned Relayers的time slot中均跨链失败后Assigned Relayer被集体惩罚的过程:
a. 虽然用户实际支付了Pn的跨链费用,但实际只有Assigned Relayers中的最低报价P1被支付给了各个Relayer,中间的差值Pn-P1直接上缴国库。在P1的分配上,如果用户的信息跨链最终在Relayer n的time slot中被确认,那么Rn就会得到60%P1的奖励,Message Delivery Relayer可以得到80%(1-60%)P1的奖励,Confirmation Relayer得到剩下20%(1-60%)P1的奖励。
b. 一旦在所有Assigned Relayers的time slot中均跨链失败后,用户的跨链信息依然会被跨链并经过Delivery和Confirmation的过程,此时Message Delivery Relayer和Confirmation Relayer会按照8:2的比例分享全部的跨链奖励S(t)(S(t)>Pn),而这个跨链奖励S(t)来自于对所有Assigned Relayer锁定的保证金罚款而来。
c. 我们可以将跨链费的分配看做是一个order+auction的市场,Assigned Relayer们所在的是order订单市场,他们需要在合理的时间内实现信息的跨链(即在所有Assigned Relayer的time slot跑完之前完成跨链,否则就会被slash),一旦在有限时间内未实现跨链,则该订单进入拍卖市场由大家竞争参与S(t)的争夺,当然在拍卖市场中之前的Assigned Relayer也可以进来参与争夺,以对冲之前被slash的损失。除了介绍上文提到的跨链费报价市场外,原文还提出了预言机+链上自动定价的替代机制,也提到了专门针对与non-Substrate区块链进行跨链的BEEFY协议,它可以看做是GRANDPA Finality协议的可选组件,有兴趣的读者可以自行深入研究。