转载于:https://learnblockchain.cn/article/1553

关于跨链需要知道的第一件事情是,我们永远没有办法把一条链上的资产真正的转移到另一条链上

关于跨链需要知道的第一件事情是,我们永远没有办法把一条链上的资产真正的转移到另一条链上,以比特币为例,2100 万枚比特币,全部都会且只会呆在某个确定的比特币地址中,而不会去其他任何地方。

那用跨链实现的资产转移是在做什么?它是在一条链上锁定资产,在另一条链上发行该资产的等值替代品*。**(注:哈希锁定不属于该方式)*

以比特币和以太坊之间的跨链为例,它需要你把比特币转入某个地址,锁定这部分比特币,然后在以太坊上发行比特币替代品,并转入你在以太坊上的地址;赎回的时候,需要你调用智能合约销毁比特币替代品,然后在比特币网络上把锁定的比特币释放给你。

不难发现,这其中唯一的难点就在于消息的互通。

也就是说,当你在比特币网络把比特币锁定后,只要以太坊能知道这件事,就可以在以太坊上铸币给你;当你在以太坊把替代品销毁后,只要比特币网络能知道这件事,就可以在比特币网络上释放币给你。

那么消息的互通难在哪里?我采访了 Cdot 的创始人刘毅,刘毅认为多链是一种更具生命力的系统,因此他和他的团队致力于链与链之间的联通。Cdot 已经为以太坊和 Flow 建立了跨链桥,也正在进行 Cosmos 与 Polkadot、Cosmos 与以太坊的跨链研发。

01 完美跨链为何难以实现

问:先问一个「大」问题,你是如何看待跨链的重要性的?

刘毅:公链技术发展面临的主要问题是如何突破性能和成本瓶颈,同时不过度牺牲链上应用的可组合性。目前看有三个解决方案:分片、Layer 2、多链(跨链)。Polkadot、Cosmos、Ava,还有包括 Cdot 在内的众多团队,做得就是多链这个方向。

也就是说,如果可以用 Substrate /Cosmos SDK 为每个加密协议开发出专用的链,又可以通过跨链,让这个加密协议可以跟其他加密协议互操作,那么公链的性能和成本问题就可以得到解决。

问:回归今天的技术主题,跨链时两条链消息的互通难在哪里?

刘毅:可以从 Vitalik 在 2016 年写的一篇叫《Chain Interoperability》的文章谈起,他把跨链技术分成了三类,哈希时间锁、见证人、中继,我觉得基本上可以沿用。

见证人和中继都是链下进程,它们负责把消息转来转去:它看到 A 链上发生了一件事,就告诉 B 链(注:负责两条链消息的互通)

那它俩的区别是什么?当我在目标链上收到一个消息后,如果是见证人跨链,我验证的是这条消息来自于见证人,如果我相信见证人,我就相信这个消息,就执行该执行的操作。

如果是中继跨链,我验证的不是这条消息来自于哪个中继,我验证的是这条消息是不是来自于源链,如果是,就执行该执行的操作。

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

中继是无法做恶的,如果一个中继提交的信息不是来自于源链,目标链验证之后会把它识别出来。但是见证人是可以做恶的,它可以造出一个消息发给目标链,目标链验证它是来自于自己相信的见证人后,就会执行这个操作。

这样看来,似乎大家都应该用中继去做跨链产品,但为什么还存在见证人方式?因为中继跨链的要求比较高。

它的要求到底是什么?假设咱们是两条链,你上面发生了一个事件,由一个中继发给了我,我要验证这个信息来自于你这条链,对吧?

怎么验证呢?我的链上需要有你的链的轻客户端。可以粗略地理解为类似于比特币 SPV 的机制,但发生在链上,而不是在手机钱包里,即你的所有区块头我这儿都要有。

这个时候,当一条消息过来,中继不但要把消息给我,还要把消息的证明给我,这个证明是一个 Merkle Proof,它告诉我这个事件或这笔交易是发生在你这条链上的哪个区块(高度)。

我拿到 Merkle Proof 后,因为有你所有的区块头,就可以把对应高度的区块头拿出来,用 Merkle Proof 验证这个交易或者这个事件是否存在。如果存在性得到证明,我就确定了这个消息确实是源自于你这条链的。

然后,当我这条链生成一个事件或者发生一笔交易后,中继也发给你,你也有我全部的区块头,也可以验证这个消息是否来自于我。这是一个完美的跨链,对吧?

可为什么大家不去实现完美的中继跨链呢?因为有些链是没有办法实现别的链的轻客户端的。比如比特币,它上面实现不了任何一个链的轻客户端。

以太坊上能不能实现别的链的轻客户端呢?要看实现的难度。以太坊需要用智能合约实现轻客户端,但智能合约是有 gas 限制的,所以轻客户端验证的计算量是要能够容纳到 Gas Limit 以内的。

问:可不可以这么认为,如果一个链不具备实现另外一个链的轻客户端的条件,它就永远无法以中继的方式与另一个链跨链?

刘毅:它就只能用见证人的方式跨链,但可以混合,一个方向上用见证人,另外一个方向上用中继。

比如我开发一条链,比特币肯定实现不了我的轻客户端,但我可以实现比特币的轻客户端,那么比特币到我这个方向能够用中继,我到比特币这个方向就只能用见证人。

问:以太坊的情况如何?比如要实现以太坊与 Cosmos 的中继跨链。

刘毅:以太坊是一个复杂的问题,它有条件实现一些轻客户端,但就像上边说的,最主要的限制是 Gas Limit。

比如一个 Tendermint(Cosmos 采用的共识协议)的链,中继跨链需要验证它的区块头,它的区块头是所有验证者的签名,这些签名用的是 BLS 签名算法,验证区块头就要验证这些 BLS 签名,但是,以太坊上没有预编译 BLS 签名。

智能合约可以直接调用预编译加密算法,比如调 ECRecover 方法,用它验证 ECDSA 签名只需要 3000 gas,还是比较低的;但验证没有预编译的 BLS 签名,就得把整个的签名验证算法 Solidity 实现,不是底层支持的,这个太贵了。

验证一个 BLS 签名,最优好像是二十几万 gas,如果 Tendermint 上有 100 个验证人,那每个区块可能就有 100 个签名,验证 100 个 BLS 签名,gas 肯定会超,不可能做到。

不过今年 Vitalik 写的路线图上,以太坊 1.x 会增加 BLS 签名预编译合约,相当于在客户端底层实现 BLS 验证,那么一个函数调用就可以验证签名。

假设和 ECDSA 一样,也是 3000 gas,那验证 100 个 BLS 签名是三十万 gas,这就有可能在智能合约里实现。

有了 BLS 预编译后,理论上就可以在以太坊上实现 Tendermint 的轻客户端,那么以太坊和 Cosmos 就可以实现双向的中继跨越。所以说和 Cosmos 中继跨链的话,比特币肯定不行,以太坊是现在不行,未来可能行。

问:即便都是采用 Cosmos 的 IBC 标准开发的链,也不是天然就能跨链?

刘毅:对,两条链即使都实现了 IBC,要中继跨链的话还要实现对方链的轻客户端。

02 跨链消息如何在链间传递

问:轻客户端用于跨链消息的验证,但跨链消息本身是怎样在两条链间传递的?

刘毅:跨链桥很形象,它有两个桥墩和一个桥梁。两个桥墩就是两套智能合约(有些链可能叫模块),一个运行在 A 链,一个运行在 B 链;中间是桥梁,桥梁是链下进程,负责监控两边这两套智能合约的事件

问:比如我在以太坊上把一只加密猫锁进了智能合约,链下进程监听到这个事件很容易,但它怎么告诉 Flow 上的智能合约我锁了一只猫?

刘毅:链下进程就是给 Flow 发一笔交易,说以太坊这边锁了一只猫,你那边要铸造出一只猫。它是一个程序,通过 RPC(远程过程调用)接口,一边连以太坊的节点,另一边连 Flow 的节点。

问:能完整描述一个具体的跨链过程吗?

刘毅:假设现在有一个 ERC20 的代币,比如说是 UNI,它发行在以太坊上,我们想把它跨到 PlatON 上面去。

那么以太坊这边要有一个智能合约,比如叫 Vault 合约,它是跨链桥的一个桥墩;跨链的用户要做两笔交易,第一笔交易是调用 UNI 合约的 Approve 方法,允许 Vault 合约转走多少用户的 UNI。

第二笔交易是发给 Vault 合约的 Lock 方法,把要锁定的币种(本例是 UNI)和数量(比如 500 个) 作为参数传进去,然后还要提供一个 PlatON 的地址,说我锁 500 个是为了在这个地址上铸造出 500 个 UNI 的替代品。

这个时候,Vault 合约就会去调用 UNI 合约做 UNI 的转移,因为 Vault 合约已经被 Approve 了,就可以把 UNI 从用户地址转到 Vault 合约的地址上,也就是把 UNI 锁住。

锁完之后,Vault 合约就会发一个事件,比如叫 AssetLock 事件;链下进程是通过 RPC 接口连在以太坊节点上的,它会订阅 Vault 合约的 AssetLock 事件,这个事件只要一出现在日志里,链下进程就得到这个事件了

这个事件里包含相关参数,比如锁定的是哪个币,锁了多少,另一条链上的受益人是谁;链下进程会等待比如说 100 个块的确认,不可逆转;然后,链下进程也有一个连接 PlatON 的 RPC 接口,它会提交一笔交易到 PlatON,假设这笔交易叫 Mint。

PlatON 上也会有一个合约,比如叫 Control 合约,它是跨链桥的另一个桥墩;Control 合约事先会创建一个类似 ERC20 的合约,比如叫 EUNI,Control 合约是这个合约的 owner,也就是说它有权力控制 EUNI 合约的代币供应。

Control 合约收到 Mint 请求后,验证这个请求确实来自于见证人,就会调用 EUNI 合约的 Mint 方法,告诉它给某个地址铸造 500 个 EUNI 代币;EUNI 铸造出来后,就会放在用户之前提供的地址上,用户就可以用了。

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

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

问:可以抛开「链下进程」这个角色实现跨链吗?比如一条链直接去监听另一条链,然后完成相关的跨链操作?

刘毅:这是做不到的,因为链都不能主动发起操作,链的逻辑都是被动的

唯一的例外是 Substrate(Polkadot 开发框架),它上边有 off-chain worker 这个机制,可以用一个链下工作机发起请求。其他的,比如以太坊智能合约,是不能自己主动发起干什么事的,它只有被调用。

问:可不可以这么理解,不管是中继跨链还是见证人跨链,都需要链下进程来传递消息,所不同的是,中继跨链通过轻客户端验证消息,见证人跨链信任见证人提供的消息?

刘毅:这样理解基本上没有问题。中继跨链依赖链下进程的可用性,但不依赖它的忠诚。

03 见证人如何更值得信任

问:似乎通过链下进程传递消息不难,难的是验证消息或者信任消息?

刘毅:对,因为两条链都有 RPC 接口,而且都有 SDK(软件开发工具包),是能够访问的,所以不难。

而且特定目的的跨链,不需要定义一个可扩展的协议,只要自己够用就好:定义是什么事件,抽取什么参数,提交什么参数给谁,就行了。

问:验证消息是技术问题,要么能验证要么不能验证,但信任消息的话,似乎就有不同的模型,反映在见证人跨链上就是它可以有不同的实现方式 ,需要信任的消息可以来自中心化的见证人,也可以来自去中心化的见证人?

刘毅:其实就是一个安全性问题。而安全是一个没有极限的东西,也没有绝对,安全通常是一个渐进的过程。

比如一开始,没什么资产时,可以用单见证人,连 KMS(密钥管理服务)都不用;有了资产后就要用 KMS;资产多了,需要多个见证人,为了省 gas,就要做链下签名聚合;资产更多了,就要用到 MPC(安全多方计算)。

然后再多资产,就要对参与 MPC 的多方进行随机分组调度,例如 RenVM。这样就跟做一条公链的难度和实践都差不多,但它也就实现了去中心化的见证人。

问:可以更具体地描述一下吗?

刘毅:比如一边是以太坊,一边是 Flow,我们可以开发一个见证人的节点,把两边连起来。

但这一个见证人的安全性和可用性是比较低的,如果黑客攻破了见证人的服务器,拿到见证人的私钥,就能够把所有锁在以太坊上面的 ETH 或者 ERC20 偷走。

还有一个风险就是可用性,如果见证人服务器宕机了,那在一条链上锁定资产后,另一条链上是铸造不出来的,因为消息传不过去。

如果承载的跨链资产不多,一个见证人是可以接受的,也有一些方法解决单见证人的安全问题和宕机问题。但如果想进一步提高,怎么做?可以包含 3 个见证人。

假设一边是比特币,一边是以太坊,比特币网络上有一个 2/3 的多签钱包,用户发交易把比特币锁进去,3 个见证人看到后,就给以太坊发消息,以太坊确认消息来自于见证人后,就在以太坊上铸造代币。

兑回的时候,用户在以太坊发交易要求赎回比特币,3 个见证人看到后,就去比特币网络发多签:一个见证人发一笔交易,说要释放,另一个见证人也发一笔交易,说要释放,2/3 钱包看到够两个签名了,就释放比特币给用户。

2/3 比一个见证人要好一点,但 3 个私钥持有人中只要有 2 人串通,就能把比特币全部拿走,所以其去中心化程度是不够的。

那么更好的方案是 MPC/TSS(安全多方计算/门限签名)支持下的见证人链。刚才说见证人需要被信任,但如果把见证人做成一条链,它是不是也可以实现 trustless ?

信任集合扩大了,除了要信任源链、目标链,中间还有一个见证人,但这个见证人不是中心化的,它是一条链,有自己的经济安全性,只要相信见证人链的验证者(validator)集合整体不会作恶,那整个过程还是 trustless 的。

见证人链可以把众多的见证人节点随机分组,每个组都会比如说有一个比特币地址,一段时间之后再把这些节点重新分组,这样的话,节点如果想串通起来偷走比特币是不太容易的。

这其中门限签名的作用是,比如一个分组里有 21 个节点,每个节点拿一片私钥,如果设置为 15/21,那这 21 个节点里需要有 15 个节点签名,然后形成一个 ECDSA 的签名,再通过一笔交易把钱包解锁。

显然这种方式的安全性更高,也更可靠(可以容忍 6 个节点不在线,或者故意不参与签名),而且更经济,因为解锁比特币只需要发一次交易。

在聚合门限签名的过程中,需要用到 MPC,因为不能把节点的私钥放到一起去签名,需要大家分别做计算。所以是门限签名加 MPC 的一个机制,这样能够形成一个见证人链。

问:MPC/TSS 通常被用于比特币与以太坊之间的跨链,可不可以把它方便地移植到另外两条链之间做跨链?

刘毅:可以,但不一定很容易。它的门限签名和 MPC 是针对 ECDSA 签名的,这套机制在 ECDSA 的链之间做资产跨链是容易的。如果它的门限签名和 MPC 支持其他签名算法,这套机制则是可以扩展到其他链的。

问:我们对中继跨链和见证人跨链有了一定的了解,那么哈希时间锁是怎样的一种跨链机制?

刘毅:我给哈希时间锁这种方式起了一个新的名字,叫外部协调。

外部协调是指在跨链的全过程中,两条链是互不知道对方的,A 链不知道 B 链上发生了什么,B 链不知道 A 链上发生了什么(注:在中继跨链和见证人跨链中,两条链是互相知道的)

比如哈希时间锁,我们是先在 A 上面做一个交易,拿到哈希之后,再把这个哈希提交给 B,这是两个用户钱包在做协调的跨链,两条链本身是不知道对方链的。

为什么要把哈希时间锁扩展成叫外部协调呢?因为除了哈希时间锁外,还有大量的非哈希时间锁的外部协调式跨链。

这其中最大的一个应用就是中心化的交易所,我把比特币存进去,换成以太坊提出来,这就是一个 Web 应用做协调的跨链。

外部协调的跨链在联盟链领域用得也非常多,联盟链厂商,例如 Hyperledger Cactus,就是专门做外部协调的中间件,它能够跨两个链。用户把一个交易提交到中间件上,中间件就知道先在 A 链上边做一个操作,再在 B 链上做一个操作,A 链和 B 链相互之间是不知情的。

所以不管是由钱包做协调,还是由应用做协调,还是由中间件做协调,这一类跨链的特点就是两个链实际上是互不知情的,是有外部实体在做协调。

为什么我们在公链或者加密协议领域很少提外部协调?因为 Web 应用或者中间件一定是由中心化实体运行的,不可能做到去中心化。

但钱包做外部实体协调的跨链可以认为是 trustless 的,因为用户和钱包是合体的,我们做任何操作都必须信任钱包,也就是说它没有扩大信任集合。这就是为什么把哈希时间锁当成一种 trustless 的跨链。

但哈希时间锁一个是功能受限,它能做的就是资产的互换,另外它也有业务上的问题。跨链的 atomic swap 在 2015 年就实现了,到现在 5 年时间过去了,没有形成什么业务。

结束语:

让我们以一个小小的总结结束这篇文章吧。似乎可以把现今流行的跨链方法分为三大类:

第一类:中心化的跨链(类外部协调)。它是由一个中心化的第三方在一条链上抵押资产,在另一条链上发行资产,资产的跨链实际上是在该第三方抵押和发行资产时发生,在此过程中,两条链之间并未互通消息。

用户在进行跨链操作时,并不是一个锁币、铸币的过程,而是更接近于把 A 链上的资产兑换为 B 链上的、由第三方发行的另一种资产。

中心化的跨链实现起来最为简单,但它依赖于一个较强的中心化的信任;此类跨链项目包括交易所提供的跨链资产等等。

第二类:见证人跨链。通过链下进程传递消息,在一条链上锁定或解锁资产,在另一条链上铸造或销毁资产;两条链都需要相信见证人传递的消息为真。

见证人可以是一个或多个见证人节点,也可以是一条见证人节点组成的链,后者虽然需要相信见证人,但可以认为它是去中心化的,因为它不需要信任某个或某些中心化的第三方。

见证人跨链实现起来可以简单,也可以复杂,取决于见证人的构成;此类跨链项目包括 RenVM、tBTC 等等。

第三类:中继跨链。通过链下进程传递消息,在一条链上锁定或解锁资产,在另一条链上铸造或销毁资产;两条链上有对方链的轻客户端,通过轻客户端验证链下进程传递的消息是否为真。

中继跨链是无需信任的理想跨链方式,但由于其实现难度,目前还难以见到;在 Cosmos 的 IBC 跨链 1.0 上线之后,可以在两条 Cosmos 链之间实现中继跨链。

Cdot 也正在 ICF 基金会(Cosmos 生态基金)的资助下开发 Substrate IBC,通过它能够使 Substrate 开发的应用链和支持 IBC 的链实现中继跨链,Substrate IBC 希望成为多链世界的重要基础组件。

一文详解跨链的技术点及难点:从完美跨链谈起相关推荐

  1. hfss仿真时间过长怎么解决_一文详解相控阵天线仿真技术

    天线是移动通信系统的重要组成部分,随着移动通信技术的发展,天线形态越来越多样化,并且技术也日趋复杂.进入5G时代,大规模MIMO.波束赋形等成为关键技术,促使天线向着有源化.复杂化的方向演进.天线设计 ...

  2. 一文详解车道线检测技术分析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 针对车道线检测的任务,我们需要弄清楚几个问题: 1.车道线的表示形式? 输出类型:掩码/点集/矢量线条 ...

  3. 一文详解知识图谱关键技术与应用 | 公开课笔记

    讲师 | 桂洪冠 来源 | AI科技大本营在线公开课 视频回放地址:https://edu.csdn.net/huiyiCourse/detail/844 本课程从知识图谱的历史由来开展,讲述知识图谱 ...

  4. 一文详解 ChatGPT:背后的技术,数据,未来发展

    文章目录 一文详解 ChatGPT ChatGPT背后的技术 基于 Transformer 的预训练语言模型 提示学习与指令精调 思维链(Chain of Thought,COT) 基于人类反馈的强化 ...

  5. 一文详解自动驾驶V2X车联网技术丨曼孚科技

    ​自动驾驶系统是一个高度复杂的大系统产业集成,车辆在多个子系统技术的加持下,实现不同程度的自动驾驶. 中国汽车工业协会对自动驾驶汽车的定义为: 自动驾驶汽车是搭载先进车载传感器.控制器.执行器等装置, ...

  6. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...

  7. OpenCV-Python实战(12)——一文详解AR增强现实

    OpenCV-Python实战(12)--一文详解AR增强现实 0. 前言 1. 增强现实简介 2. 基于无标记的增强现实 2.1 特征检测 2.2 特征匹配 2.3 利用特征匹配和单应性计算以查找对 ...

  8. 一文详解自动驾驶的动态驾驶任务(DDT) | 自动驾驶系列

    文章版权所有,未经授权请勿转载或使用 本系列上篇文章<一文详解自动驾驶的运行设计域(ODD)>解读了什么是自动驾驶ODD,本篇文章依据SAE J3016详细解读自动驾驶DDT.DDT fa ...

  9. asterisk配置文详解

    asterisk配置文详解 Configuration GuideYou've  installed Asterisk and verified that it will  start up.Now ...

  10. 一文详解自动驾驶的运行设计域(ODD)| 自动驾驶系列 1

    一文详解自动驾驶的运行设计域(ODD)| \n 自动驾驶系列 2021年4月30日,SAE发布了第四版J3016<驾驶自动化分级>,这是即2014年1月16日.2016年9月30日.201 ...

最新文章

  1. python 深度 视差 计算_开源双目视觉BM算法-Matlab/Python/Javascript
  2. ELASTIC SEARCH 性能调优
  3. Effective java 43返回零长度的数组或者集合而不是null
  4. python原始数据是什么_以python请求发送原始数据
  5. python3爬虫实例-Python3 爬虫实例(一)-- 简单网页抓取
  6. 【Python】Matplotlib绘制可爱机器人
  7. 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
  8. bzoj1601 灌水
  9. linux发挥不出显卡性能,Ubuntu 9.04 显卡性能不佳问题的解决
  10. 读xml文件时字体串类型的判断
  11. 快速失败(fail-fast)和安全失败(fail-safe)的区别
  12. rostcm6情感分析案例分析_情感分析师在线指导情感挽回
  13. 【java】随机分组:设计一个GUI程序,可以用来随机分组功能,如小组作业、球赛赛程
  14. 华为交换机修改radius服务器地址,华为交换机修改radius服务器地址
  15. (转)价值杂志:推荐阅读投资理财经典55本(上篇)
  16. SpringCloud常用注解
  17. Mysql 使用Maxscale读写分离,负载均衡
  18. 某宝抢购taobaosnap开发与实现
  19. win7开机加速怎么设置|win7开机加速的方法
  20. 随机森林、LGBM基于贝叶斯优化调参

热门文章

  1. 思科“思蜀援川”灾后援建项目圆满完成
  2. vue 动画 —— 滚动动画
  3. 实体的厦门窗帘小编接下来也会为您作详客厅的布艺
  4. win10下AirSim搭建
  5. 如何制作一份更具洞察力的商业BI报告?
  6. 【云原生 | 从零开始学Docker】六、如何写出自己的镜像——Docker file
  7. C++ Primer Plus(第六版)--学习杂记(第四章)
  8. 智能化赋能应急安全管理创新
  9. 重学前端 => 浏览器渲染原理,过程
  10. 码蹄集 - MT2140 - 双端队列