Interoperation and Composability within CKB

翻译来啦!! 和 @Cipher一块更新了

CKB的可组合性与互操作性

可组合性,也就是不同应用程序之间相互通信的能力,对于智能合约平台来说是非常重要的。对于基于账户模型的区块链,如Ethereum,可通过跨合约函数调用来实现可组合性。您可能想知道,是否可以通过像 CKB 这种基于 UTXO 模型的区块链来实现可组合性,因为这些状态是在链下生成的,并且它们内部没有“功能接口”。答案是肯定的,这篇文章提出了一种在 CKB 实现跨合约互操作的通用方法。

脚本互操作的桥接 The bridge for script interoperation

我们使用函数调用来链接在账户模型的区块链中不同的合约,在此 ABI 可以充当桥接的角色。

  • 在账户模型中的 ABI 桥接

相似的,我们在 UTXO 模型的区块链中也使用 cell 的交易来链接不同的脚本,在此由特定的指令作为桥接。为了要在不同的脚本间产生交互关系,我们需要详细定义以下几种桥接指令的特性。

  • 对 input cells 的需求
    • 是否有特定的 Type (script)
    • 是否有特定的 Lock (script)
    • 是否有对 Data 字段的特定限制
  • 对 output cells 的需求
  • input 与 output 之间的关系

它实际上定义了您将与哪些脚本进行对话,以及将产生哪些互操作的结果。例如,如果一个资金池脚本想要与 NervosDAO 对话(从它那里获得利息),那么它应该构建一个桥接的操作,以资金池的cell 作为输入,而 NervosDAO 存款的 cell 作为输出。如果市场预测脚本想要与 oracle 脚本进行对话,则需要构建一个以 oracle 数据的 cell 和市场预测的 cell 做为输入,仲裁结算的 cell 做为输出的桥接指令。

  • CKB中的Action桥接

桥接指令的范例

以链上 DEX 为例。这里有两个不同的脚本,sUDT 和 DEX。它们是可组合的,这意味着任何 sUDT都可以在 DEX 上上币。该 DEX 包括三个简单的操作:1.将资产存入 DEX,2.进行交易,3.从中提取资产。(注:以下会有这三种操作的代码)

// Deposit action of DEX DEX 的存款指令
Inputs:
    sUDT_Instance_Cell:
        Type:
            <sUDT + UUID>
        Lock:
            <Alice_lock>
Outputs:
    sUDT_Instance_Cell:
        Type:
            <sUDT + UUID>
        Lock:
            <DEX_DEPOSIT_LOCK>
    DEX_Receipt_Cell:
        Data:
            amount, 
            sUDT UUID,
            personal_order_book
        Type:
            <DEX_Type>
        Lock:
            <DEX_Exchange_Lock with Alice_lock as args>

DEX的存储操作实际上定义了输入和输出的 cell 需要的详细信息和验证规则。它花费 sUDT 这个例子的 cell,然后用 DEX_DEPOSIT_LOCKDEX_Receipt_Cell 创建新的 sUDT cell。DEX_Receipt_Cell 可以在稍后用来交易或提取存款。

// Exchange action 交易指令
Inputs:
    DEX_Receipt_Cell:
        Data:
            1000 USDT
             order_book:
                  ask: <600 USDT for 10 GOLD>
        Lock:
            <DEX_Exchange_Lock with Alice_lock as args>
    DEX_Receipt_Cell:
        Data:
            50 GOLD
        Lock:
            <DEX_Exchange_Lock with Bob_lock as args>
Outputs:
    DEX_Receipt_Cell:
        Data:
            400 USDT
        Lock:
            <DEX_Exchange_Lock with Alice_lock as args>
    DEX_Receipt_Cell:
        Data:
            10 GOLD
        Lock:
            <DEX_Exchange_Lock with Alice_lock as args>
    DEX_Receipt_Cell:
        Data:
            40 GOLD
        Lock:
            <DEX_Exchange_Lock with Bob_lock as args>
    DEX_Receipt_Cell:
        Data:
            600 USDT
        Lock:
            <DEX_Exchange_Lock with Bob_lock as args>

DEX_Receipt_Cell 可作为将 sUDT 从 DEX 存款池中取出的凭据。

// Withdraw action  取出指令
Inputs:
    DEX_Receipt_Cell:
        Lock:
            <DEX_Exchange_Lock with Bob_lock as args>
    sUDT_Instance_Cell:
        Data:
            reserve_amount
        Lock:
            <DEX_DEPOSIT_LOCK>
Outputs:
    sUDT_Instance_Cell:
        Data:
            withdraw_amount
        Lock:
            <Bob_lock>
    sUDT_Instance:
        Data:
            reserve_amount - withdraw_amount
        Lock:
            <DEX_DEPOSIT_LOCK>

存款和取款的动作实际上是硬编码的,好让 sUDT token 可以符合的 DEX 规则。它类似于Etheruem将 DEX 合约被以硬编码的形式来调用 ERC20 的特定 ABI。

和 ABI 桥接比较 Compared with ABI bridge
首先,ABI桥是一个弱联结,它只定义了交互的意图。相反,我们的桥接指令定义了交互的实质内容,包括它所依赖、更改和创建的状态。因此,它比 ABI bridge 更可靠、更安全。
其次,ABI桥是一对一的连接。为了连接多个合约,它必须创建多个 ABI 桥接。然而,我们的指令桥接是一个多对多的连接。您可以使用多个 input cell 和多个 output cell 去定义一个操作,这些 input 和 output cell 的 type scripts 和 Lock scripts 属于不同的dapp。
第三是我们的指令桥接的组成标准低于 ABI 桥接。以 UDT 组成为例,Action 桥接将第三方的 dApp 链接到 sUDT 模板,ABI 桥接则将第三方的 dApp 链接到 ERC20 的实际案例中 。您不能强制每个 ERC20 都真正实现正确的逻辑,但(在 sUDT 模板的)格式总是能如预期的表现。

3 Likes