翻译来啦!! 和 @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_LOCK
和 DEX_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 模板的)格式总是能如预期的表现。