撰文:李画

受访人:__p0n1 ,安比实验室研究员;王东,路印协议创始人;刘毅,__Cdot__创始人;__John_Poly Network__创始成员_

跨 layer、跨链、不同跨 layer 的方式、不同跨链的方式,看上去纷繁芜杂令人迷惑,但它们背后的逻辑是简单的,本文对各种跨 layer 与跨链方式做了简要总结,希望能让「跨」这件事看上去清晰些。

这篇文章更像一个索引,围绕下图展开,每种方式的具体实现如果以前文章讨论过,便只做关键内容的引用,如果你对此了解便可跳过;如果未讨论过,便会详细展开。

一文理清跨 layer 与跨链方式

01

跨 layer

Layer 2 与侧链(包括其他公链)是两种不同的主体,跨 Layer 与跨链是两件截然不同的事情。以比喻来做说明:

古希腊的神庙用麦子为公民记账,假设「主神庙」太忙记不过来,便让其他神庙帮它记,这些神庙记账后需要定期汇报给主神庙知道,而不管公民的账被记在哪个神庙,也不管这些神庙是否发生变故,公民想取出资产时总能拿到属于他的麦子,这是跨 Layer。

假设有另一片大陆,一个聪明人为两地的商人提供一项服务,使大家在古希腊账本上的资产能跨到这片大陆的账本上使用,某个人把资产跨过来后,这片大陆为他记账时是不会把账目信息汇报给主神庙知道的;此外,这片大陆是不产麦子的,它的记账单位也不是麦子,如果这个人想在这片大陆取出资产,他拿到的不是麦子,这是跨链。他能拿到什么取决于不同的跨链方式。

跳出比喻来说就是:Layer 2 为子账本,跨 Layer 是一套账本体系下具体的记账地方发生了变化,Layer 2 和 Layer 1 的记账单位相同,Layer 2 记的账需要告知 Layer 1;链是不同的账本,跨链是从一套账本体系到另一套账本体系,侧链和主链的记账单位不同,侧链记的账不会告知主链。

**
**

Rollup

在区分 Layer 2 与跨链后,来看 Layer 2。Rollup 是最主流也最有发展潜力的 Layer 2,目前阶段似乎只需要关注它。Rollup 是什么

“__Rollup 指先在链下进行复杂的计算和状态维护,再将与状态更改相关的数据通过合约调用的方式,利用更便宜的 CALLDATA 在链上保存_。_

_
_

___任何人都能根据链上保存的数据复原出全局的状态,从而消除因数据可用性问题带来的安全风险。 Rollup 将大量交易卷起 / 汇总成为一个交易,在保证数据可用性的前提下提高 TPS。”_

——p0n1,__《时髦有趣且有用:这 12 个以太坊新事物你不能错过》__________________

通俗来讲就是: Rollup 负责处理具体的记账事宜,但它的账是如何记得是要汇报并记录在以太坊上的,这会使以太坊承认 Rollup 记的账。具体而言,Rollup 以如下方式工作(以 ZK Rollup 为例):

“有一个技术的东西叫 Merkle Tree,它是把不同的数据一层一层的哈希,最后变成一个简单的哈希值,这个值就叫树的根。这个根实际上能代表树里边一切的状态,虽然不知道具体的状态是什么。

这棵树本身是要能够在某个地方找到的,如果没有这棵树,只有根,那这个账户也是不安全的。__ZK Rollup 就是在 Layer 2 维护这样一棵树。它最开始的时候非常简单,里边什么都没有,然后当你交易或支付时,就会改这棵树里边的数据,这个改动本身是要放到以太坊上去的,作为一个数据存到以太坊上_。(注:并不是把这棵树放在以太坊上,这棵树在 Layer 2,但要把对这棵树的改动的数据放在以太坊上)_

因此,你可以通过以太坊把这棵树在任何一个时间点的历史状态全部恢复出来,恢复出来之后,你可以通过树根来验证你恢复的数据是不是对的。任何一个用户都可以把从叶子节点到根的一串数据拿过来,这一串的数据叫默克尔证明。

把这个证明扔到以太坊的路印协议的智能合约里,合约就会算这个默克尔证明能不能证明你确实是在这棵树里面,如果能证明你在这棵树里,就会把这棵树里标记的你有 多少钱从以太坊的智能合约里解锁出来,直接转到你的以太坊账号里。这就是在最不理想的情况下提现的方式。”

——王东,_《专访王东:关于路印新版本的一切》___

Rollup 实现扩容的原理如下(以 ZK Rollup 为例):

_
_

“为什么 ZK Rollup 能够扩容,能够变得那么快、那么省钱,与对这棵 Merkle Tree 的更新涉及到的一些计算相关。

比如一个人的账户状态改了,那要怎么改_Merkle Tree_的根?需要一层一层的去算,算到那个根。所以一笔交易可能要改大约 4、5 个叶子节点,一笔转账大概要改 3 个叶子节点,这些改动是非常多的。

但现在,__这些改动跟以太坊没有关系,它不用去做这些改动过程的计算,计算都是在_Merkle Tree_上面,在中继里边做的,以太坊上只要把零知识证明验证一下就行了_,可能就花费 10 万 gas 还是多少 gas,大概是这样。_

比如说做 1000 笔交易,改动可能是大约 4000 个叶子节点,可能要算几万次哈希算出一个根,但这些数据都在 Layer 2,最后扔到以太坊上的数据其实就是三种:第一个是对各个叶子怎么改的;第二个是对根怎么改的;第三个是一个证明来证明前两者的一致性。

零知识证明做什么呢?零知识证明就是验证改这棵树里边这么多数据的时候,这个根的计算跟各种改动是能够匹配得上的。__零知识证明只是做了这么一件事,就是证明数据的一致性_。它对应的也不是每__一笔交易怎么去证明,而是说一大堆交易打成一个包 / 块,如何去证明这个包,它是一个批处理的过程。“_

——王东,_《专访王东:关于路印新版本的一切》___

通俗来讲就是: Rollup 帮主链干活,那么干活的人多了,能同时干的活也就多了。

ZK Rollup 与 Optimistic Rollup

在理解 Rollup 后,来看 ZK Rollup 与 Optimistic Rollup,两者的核心区别如下

ZK Rollup_方案的关键在于_ZK_,它的每一次的状态转变都需要提供零知识证明,并由主链上的合约进行验证,只有验证通过才能更改状态。即,__ZK Rollup__的状态转变严格依赖于密码学证明。_

_
_

Optimistic Rollup__方案中,每次状态转变无需严格验证,它是__先乐观地假设每次转变都是正确的,然后在一定时限内可以对某次转变进行挑战_,如果挑战成功就证明之前的提交有问题,会惩罚提交者并将状态回滚。即,__Optimistic Rollup__的状态转变依赖于经济激励和博弈。_

——__p0n1_,__《时髦有趣且有用:这 12 个以太坊新事物你不能错过》_

ZK Rollup 的突出问题在于对可编程性的实现上,这是因零知识证明而起,如果你对此感兴趣可以看《彻底读懂零知识证明及其实现方法:解析 zk-SNARK》一文,它介绍了如何实现零知识证明,从中能了解它为何难以实现可编程性。不过,zkSync (Matter Labs)的 VM 及相关设计能够让可编程性落地,值得期待。

Optimistic Rollup 最被关注的问题似乎是当资金从 Layer 2 返回时,因为挑战期带来的延时问题,但可以有中间商提供垫付服务曲线救国,所以这一点也许不会成为困扰。

以上是关于跨 layer 的全部,它是在子账本记账,记的账要成批的汇报给以太坊知道;ZK Rollup 用密码学的方法杜绝假账,Optimistic Rollup 用监督举报的方法避免假账。

02

跨链

跨链是从一套账本体系到另一套账本体系,不管参与方是哪两条链,也不管以何种方式跨链,当跨链发生时,都需要一个第三者在两条链之间传话,不然两条链都不会知道对方链发生了什么,跨链也就无从谈起。

一个完整的跨链过程如下(以锁定+铸造方式为例):

“__跨链桥很形象,它有两个桥墩和一个桥梁。两个桥墩就是两套智能合约,一个运行在 A 链,一个运行在 B 链;中间是桥梁,桥梁是链下进程,负责监控两边这两套智能合约的事件_。_

假设现在有一个 ERC20 的代币,比如说是 UNI,它发行在以太坊上,我们想把它跨到__PlatON__上去。那么以太坊这边要有一个智能合约,比如叫__Vault__合约,它是跨链桥的一个桥墩;跨链的用户要发给__Vault__合约__Lock__方法,把要锁定的币种和数量作为参数传进去,然后还要提供一个__PlatON__的地址,说我锁 500 个__UNI__是为了在这个地址上铸造出 500 个__UNI__的替代品。

这个时候,__Vault__合约就会去调用__UNI__合约做__UNI__的转移,把__UNI__从用户地址转到__Vault__合约的地址上,也就是把__UNI__锁住。锁完之后,__Vault__合约就会发一个事件,比如叫__AssetLock__事件。

链下进程是通过__RPC__接口连在以太坊节点上的,它会订阅__Vault__合约的__AssetLock__事件,这个事件只要一出现在日志里,链下进程就得到这个事件了,这个事件里包含相关参数,比如锁定的是哪个币,锁了多少,另一条链上的受益人是谁。链下进程也有一个连接__PlatON__的__RPC__接口,它会提交一笔交易到__PlatON_,假设这笔交易叫__Mint__。_

PlatON 上也会有一个合约,比如叫 Control 合约,它是跨链桥的另一个桥墩;Control 合约事先会创建一个类似 ERC20 的合约,比如叫 EUNI。Control 合约收到 Mint 请求后,验证这个请求确实来自于见证人,就会调用 EUNI 合约的 Mint 方法,告诉它给某个地址铸造 500 个 EUNI 代币;EUNI 铸造出来后,就会放在用户之前提供的地址上,用户就可以用了。

假设用户把 EUNI 转给了另外一个用户,新用户想要以太坊上的 UNI,那他要做的操作是调用 Control 合约的 Redeem 方法,烧掉比如说 100 个 EUNI,并释放一个事件叫 AssetBurn。

链下进程监控到 Control 合约的__AssetBurn__事件,就会给以太坊__Vault__合约发一个交易请求,调用__Release__接口,以太坊验证这个交易是来自于见证人后,就会把__UNI__从__Vault__合约的地址上转移到指定的用户地址上,用户就得到了原始的__UNI_。这就是一个完整的跨链过程。”_

——刘毅,_《一文详解跨链的技术点及难点:从完美跨链谈起》_

简单而言,跨链是先在 A 链上做一个操作,然后由一个传话的人把这个消息告诉 B 链,之后 B 链做一个对应的操作。从中也可见侧链与 Layer 2 方式的不同,侧链只在跨链发生时与主链通消息,而 Layer 2 定期要与 Layer 1 通消息。

虽然跨链说的是把资产从 A 链跨到 B 链,但 B 链是没有真正的 A 链资产的(没有麦子),比如,比特币链之外的任何链上都不会有真正的 BTC,以太坊之外的任何链上都不会有真正的 ETH。用户在 B 链上收到的是什么取决于不同的跨链实现方式。

锁定+铸造

锁定+铸造方式这样工作:在 A 链锁定资产,在 B 链铸造出对应的资产;在 B 链销毁铸造出的资产,在 A 链解锁对应的资产。

用户在 B 链收到的,是他使用的跨链协议铸造出来的资产,比如使用 Ren 跨链协议,收到的便是 renBTC,它类似于 BTC 的某种等值兑换券。只要跨链协议和 B 链不出问题,这种兑换券便不会有问题。

锁定+解锁

假如有一种代币叫 test,其发行方在 A 链和 B 链都发行了代币,那针对这种代币就可以使用锁定+解锁方式:在 A 链锁定资产,在 B 链释放等额资产;在 B 链锁定资产,在 A 链释放等额资产。

在这种情况下,用户在 B 链收到的不是类似于兑换券的「假」资产,而是「真」资产。用户不用担心跨链桥出问题,因为不再需要依赖跨链桥把资产跨回源链兑现,锁定+解锁方式对跨链桥的使用可以是单方向、一次性的。(文中的真、假并无褒贬意,只为清晰区分不同的跨链方式)

这种跨链方式安全、利落,但只适用于在多条链上都做了发行的 token,且需要发行方与跨链协议合作。它也许是最优选择,但单独使用时是不具有普适性的。

跨链池:兑换

兑换的方式需要引入跨链池这个新主体。跨链池既不位于源链,也不位于目标链,它位于提供跨链服务的协议的链上,其工作方式如下图所示(以 Poly Network 为例):

一文理清跨 layer 与跨链方式

用户的 USDT 从以太坊跨链到 BSC 的过程如下:先在以太坊上锁定 USDT,然后在 Poly 上释放 PUSDT,之后在跨链池中把 PUSDT 兑换为 PBUSD,接着在 Poly 上锁定 PBUSD,最后在 BSC 上释放 BUSD。

这个过程看上去比较复杂,有两次跨链操作加一次交易操作,不过对跨链用户而言该过程是无感的,他放入以太坊上的 USDT,得到 BSC 上的 BUSD。在兑换方式下,用户在目标链收到的是「真」资产,因此也不用担心跨链桥出问题。

这种跨链方式之所以被发明并开始变得流行,是因为它能带来两个好处:

1.随意跨 token。用户可以在以太坊上放入任意 token,获得 BSC 上他希望的任意 token。在下图的例子中,用户放入 ETH,获得 BNB。

一文理清跨 layer 与跨链方式

相比对应币种的跨链,该跨链过程需要多一次的交易操作,此交易并不是发生在跨链协议的交易池里,而是发生在源链或目标链本来的交易协议中,跨链协议在此处分别提供源链和目标链的 DEX 聚合器功能,为用户寻找源链或目标链上最好的交易价格。

至于交易是发生在源链还是目标链,取决于哪种跨链路径上的价格更好,比如该跨链过程也可以是:ETH-PETH-PBETH-BETH-(BETH:BNB)-BNB。

更进一步,假设用户想把 ETH 换为 USDT,此时 BSC 上的交易价格好于以太坊,那么一种可能的交易路径是:ETH-PETH-PBETH-BETH-(BETH:BUSD)-BUSD-PBUSD-PUSDT-USDT。有_一些协议称打通不同链的流动性,我想很大程度上便是指这件事情,这种跨链架构能够通过交易路径的选择,给用户提供多条链上最好的交易价格_。

2.随意跨链。锁定+解锁方式是两条链的直连:跨链协议在以太坊与 BSC 之间建了一条跨链桥,在以太坊与 Polygon 之间建了一条跨链桥,这时候如果想实现 BSC 与 Polygon 之间的跨链,就需要在 BSC 与 Polygon 之间再新建一条跨链桥。

但_兑换方式通过跨链池把多条链连接起来,可实现该架构中任意两条链之间的跨链_:跨链协议接入了以太坊和 BSC,这时候如果它接入 Polygon,就可以提供 Polygon 与以太坊、Polygon 与 BSC 间的跨链,无需再一一建桥。其结构如下图所示:

一文理清跨 layer 与跨链方式

「跨链池 : 兑换」方式可能会催生一个或多个跨链底层协议:各个想要在自己应用中提供跨链功能的协议,只需接入这些跨链协议即可支持跨链;而另一方面,「跨链池 : 兑换」也是应用自己做链的方式,已有一些 DeFi 应用声明将要做链,它们的链并不是像公链一样支持各种应用的链,而很大可能是上文所述的这样一条维护它自己的多链的流动性池的链。

要注意的是,兑换方式与锁定+铸造方式并不一种取代对方的关系,它们解决不同的问题。兑换方式的跨链是基于两条链上已经存在的资产的,它不能把目标链上没有的资产从源链「带」过去,当需要在目标链铸造源链资产时,需要使用锁定+铸造的方式。

跨链的其他分类维度

跨链需要第三者在两条链之间传话,上述 3 种跨链方式都不例外。这个传话的第三者可以是许可式的,比如由跨链协议组建的联盟;也可以是非许可式的,比如由无需许可进入的节点。因此便有 3×2=6 种跨链方式。

跨链还可以分为见证人跨链和中继跨链,它们的区 别是:

__“当目标链收到一个消息后,如果是见证人跨链,验证的是这条消息来自于见证人,如果相信见证人,就执行该执行的操作;如果是中继跨链,验证的不是这条消息来自于哪个中继,验证的是这条消息是不是来自于源链,如果是,就执行该执行的操作。

也就是说,见证人可以看做是需要被信任的中继,中继可以看做是无需被信任的见证人。这就是两者的核心区别,中继显然比见证人更符合 trustless 的原则。”__

——刘毅,_《一文__详解跨链的技术点及难点:从完美跨链谈起》_

中继跨链优于见证人跨链,在这种方式中,负责传话的第三者是无法作恶的,但该方式需要两条链上互有对方链的轻客户端,而有些链是没有办法实现别的链的轻客户端的,比如比特币。

因此这种分类方法不会带来 6×2=12 种跨链方式,而是:如果有条件实现中继跨链,跨链协议都会去实现它或者以实现它为目标;如果没有条件实现中继跨链,也只能以见证人的方式跨链。

以上是关于跨链的全部。跨链是跨到另一个账本记账,有 3 种不同的跨链方法,不同的方法决定了当跨到目标链后你拥有的是什么,也决定了对跨链桥的不同的依赖程度。

结束语:

提到跨链,我们还会谈论波卡与 Cosmos。但实际上波卡并不是为跨链服务的,它是一个以链为单位的结构体,它的跨链是指这个结构体内部的链与链的交互;Cosmos 则是为跨链服务的,它做的是链之间的通信标准,采用其标准的链易于实现跨链,但前提是要采用其标准。

最后想要表达的是,虽然现在有一批发展中的公链,但其中的绝大部分与以太坊是相似的,真希望未来能出现一些与以太坊不太一样的公链,不是在性能上的不一样,而是在能做的事情上的不一样。