跨链通信使一个区块链能够以可证实的安全方式验证另一个区块链上事件的真实性,目标是让区块链之间的通信像智能合约之间的内部链式沟通一样安全.
轻量级的默克尔树证明
- 比特币的SPV(简单支验证)
- EOS引入LCV
EOS跨链通信
EOS.IO 的设计能促进跨链通信,实现方式是简化生成操作存在证明和顺序证明。这些证明和围绕操作传递设计的应用架构一起,使得跨链通信的细节和验证工作对应用开发者不可见,开发者看到的只是更高层次的抽象。
用于轻客户端的 Merkle 证明 (LCV)
如果客户端不需要处理全部交易的话,和其他区块链的结合将变得非常容易。毕竟类似交易所这样的客户端,它只关心资产的转入和转出。理想情况下,交易所的链可以用转账交易的轻量默克尔证明(来完成交易所业务),而不是完全信任某个区块生产者。每条链的区块生产者都希望和其他链同步的开销尽可能地小。
轻量客户端验证(LCV)的目标是生成相对轻量的存在证明,这些证明可以被任何关心一个轻量的数据集的客户端用来验证。在上述例子中,LCV 的目的就是为了用来证明某笔交易已经被包含进某一特定区块,而这一区块已经被某条特定的链所收录。
比特币支持交易验证的功能,这一功能基于一个假设,那就是所有的节点都可以访问到全部的区块头历史数据(区块头数据每年增加 4MB)。在每秒 10 笔交易的吞吐下,一个验证用到的存储空间约为 512 个字节。对于 10 分钟一个区块的比特币来说,这是可行的。但对于拥有 0.5 秒的出块速度的 EOS.IO 软件来说,这个机制显然不够轻量。
任何有不可逆区块头数据的用户在交易被区块记录后,都可以使用 EOS.IO 提供的轻量证明。轻量证明的哈希连接(hash-linked)结构表明,最多只要 1024 个字节,即可验证任何一笔交易的存在与否。
考虑到区块链中的区块的 id 和区块头都是可信的且不可逆的,因此证明某个区块被包含在某个区块链中也是可行的。这类证明最多只需 ceil(log2(N)) 次摘要计算即可完成,其中 N 为区块链中的区块个数。就 SHA256 这种摘要算法来说,你只需要 864 个字节就可以在一个有着 1 亿个区块的链上验证某个区块的存在。
使用合适的哈希连接(hash-linking)机制生产区块以启用上述证明,几乎不会带来什么额外开销,所以这种方式十分可行。
若要在其他链上验证证明,时间、空间和带宽上都有很多优化空间。追踪全部的区块头(每年 420MB 递增)可以将证明维持在比较小的空间占用。仅追踪最近的区块头会在最小长期存储和证明大小之间实现平衡。另外也可以采用惰性求值的方式,记录过去的证明的中间哈希值。新证明只需要包含已知的稀疏树的连接。具体选取何种方式,取决于默克尔证明引用的带有交易的外部区块的比例。
当互联和耦合程度达到一定的复杂度之后,将两条链的数据合并将更简单高效,如此一来也就不再需要默克尔证明了。因为性能的原因,跨链证明的频度当然是越小越好。
跨链通信的延时
当和外部区块链进行通信的时候,区块生产者必须要 100% 确认一笔交易已经被不可逆转地写入到外部区块链之后,才可以将其当作合法输入。EOS.IO 的区块链加上 DPOS 算法 0.5 秒的出块速度,结合拜占庭容错机制,使得等待上述确认的时间大约为 0.5 秒。任何区块生产者若违背上述原则,不等待确认即开始下一步操作,例如交易所在未确认的情况下就将资产冲入用户账户,随后又将资产取消的行为,都将影响区块链共识的有效性。EOS.IO 软件使用 DPOS 算法结合异步拜占庭容错机制快速实现交易的不可逆性。
完备性证明
当外部的区块链使用默克尔证明的时候,去知晓处理的全部交易全部有效,迥异于去知晓没有交易被跳过或省略。因为想要证明"最近全部的交易都已经被知晓"是不可行的,而证明“交易历史记录里没有被跳过的交易”则很容易。EOS.IO 软件通过给发送到每个账户的每个操作一个顺序编号来实现这一点。用户可以使用这些顺序编号来验证某个特定账户的所有操作都已经被处理,并且是严格按照顺序来处理的。