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

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

![](https://img.learnblockchain.cn/2020/10/10/16022918809863.jpg) 关于跨链需要知道的第一件事情是,我们永远没有办法把一条链上的资产真正的转移到另一条链上,以比特币为例,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 以内的。 问:可不可以这么认为,如果一个链不具备实现另外一个链的轻客户端的条件,它就永远无法以中继的方式与另一个链跨链? 刘毅:它就只能用见证人的方式跨链,但可以混合,一个方向上用见证人,另外一个方向上用中继。 比如我开发一条链,比特币肯定实现不了我的轻客户端,但我可以实现比特币的轻客户端,那么比特币到我这个方向能够用中继,我到比特币这个方向就只能用见证人。 ![](https://img.learnblockchain.cn/2020/10/10/16022917200516.jpg) 问:以太坊的情况如何?比如要实现以太坊与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 支持其他签名算法,这套机制则是可以扩展到其他链的。 ![](https://img.learnblockchain.cn/2020/10/10/16022918056082.jpg) 问:我们对中继跨链和见证人跨链有了一定的了解,那么哈希时间锁是怎样的一种跨链机制? 刘毅:我给哈希时间锁这种方式起了一个新的名字,叫外部协调。 *外部协调是指在跨链的全过程中,两条链是互不知道对方的,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 希望成为多链世界的重要基础组件。

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

关于跨链需要知道的第一件事情是,我们永远没有办法把一条链上的资产真正的转移到另一条链上,以比特币为例,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 希望成为多链世界的重要基础组件。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2020-10-10 09:06
  • 阅读 ( 134 )
  • 学分 ( 21 )
  • 分类:跨链

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/27660

联系我们

aliyinhang@gmail.com