Open Tx 协议头脑风暴[1]: OTX 概述

Cipher Wang

Cipher Wang

Nervos Core Team

背景

Open Transaction(OTX)是故意构造的部分的交易(不是一笔完整的交易),它们可以组合在一起从而形成一笔有效的完整的交易。注意,它不是有效交易的简化版。首先,OTXs 由参与者签名,并将最终的交易限制在他们的意愿范围内,比如预定的输出金额,预定的接收地址等等。其次,一笔 OTX 可以与其他 OTX 自由地组合,只要组合的交易遵循 OTXs 定义的约束条件。

OTX 对于链下多方协作非常重要。每个参与者的意图是可以同时实现的,下面举几个例子:

  • Alice 同意花费她的 1 BTC,只要 Bob 收到了 1.5 BTC
  • Alice 同意任何人都可以花费她的 10 USDT,只要她收到了 100 CKBytes
  • Alice 签名了一个智能合约的调用,而合约的运营商会帮忙支付交易手续费
  • 候选人在链下从用户处收集选票,从而在链上构造一笔 多-输入-单-输出 的交易
  • 一名董事同意通过一笔支出,只要其他成员都同意

OTX 是基于 UTXO 模型的区块链(如比特币和 Nervos CKB)的关键性基础设施。它不适用于基于账户模型的区块链(如以太坊)。对于基于账户模型的区块链,链下多方协作必须依赖于密码学机制,因为它们对于每一笔交易只允许有一个发起者。

比特币中的 Sighash

OTX 最早是由比特币通过其签名中的一个字节 sighash 作为非脚本参数引入的。Sighash 不是部分签署的比特币交易(又名 PSBT),而是一种交换格式的还没有完全签署的比特币交易,它会连同相关的元数据,以帮助合作对象完成签名。

bitcoin-sighash

* 图片来自 libbitcoin 文档

如上图所示,sighash 是比特币签名的一部分,与(部分)交易数据一同签名。在比特币中定义了六种类型的 sighash

Sighash TypeMarkerSignature Coverage
SIGHASH_ALL0x01default, all input and output
SIGHASH_NONE0x02all the inputs, but none of the outputs
SIGHASH_SINGLE0x03all inputs, and exactly one corresponding output
SIGHASH_ALL SIGHASH_ANYONECANPAY0x81all outputs and only one input it is part of
SIGHASH_NONE SIGHASH_ANYONECANPAY0x82only the one input it is in, but none of the outputs
SIGHASH_SINGLE SIGHASH_ANYONECANPAY0x83the input that contains it, and the corresponding output

SIGHASH_SINGLE | SIGHASH_ANYONECANPAY 为例,它只签名一个输入和一个输出。Raghav Sood 对这个 sighash 类型和它的用户使用流程给出了很好的介绍。

Alice 有 100 个 COIN,她签名了一个输入,允许他人移动她的这个 100 个 COIN,但是输出中的一个地址得是她控制的,并且里面需要有 1 个 BTC。然后她就发布了这个不完整的且无效的交易(因为目前输入中并没有 1 个 BTC)。我们将其称之为 open transaction。

任何想要用 1 个 BTC 购买这 100 个 COIN 的人,他们可以在输入中放入大于等于 1 个 BTC,然后一个输出地址去请求这 100 个 COIN(请记住,Alice 的输出中仅请求了 BTC),如果需要,还可以添加一些找零输出。这样就形成了一笔完整的交易,它就可以被广播并被无需信任地执行。

OTX 在 CKB 上的用户场景

比特币上 sighash 的用户场景非常有限。首先,sighash 只有六种类型,只涵盖了很小一部分情况。例如,它在一笔交易中只能约束输入/输出中的所有,没有或者一个,所以在一个 OTX 中,如果我们只有一个输入,那么我们无法向多个地址进行付款。其次,比特币很难支持多资产和智能合约,而链下协作的最佳方案就是资产交换和用户自定义交互。

在我看来,OTX 在 CKB 上非常有前景,特别是在以下场景中:

  • DApp 运营商为用户支付交易手续费
    • 用户签名了一笔 DApp 发起的 OTX,然后 DApp 运营商在输入中加入交易手续费
  • CKB 上的不同 UDTs 之间的原子交换
    • Alice 签名了一个 10 个 UDT-A 作为输入,5 个 UDT-B 为输出,但是输出需要填写她控制的地址,然后等待其他人来补全这笔 OTX
  • 用户通过 UDT 来支付交易手续费,而非原生代币
    • 如果用户可以使用 UDT 支付交易手续费,那 ta 就不需要持有原生代币
    • 用户签名了一笔 0 交易手续费但是附带了一些额外 USDTs 的 OTX,这时候,任何人都可以附加上另一个 OTX,输入中包含一些原生代币作为交易手续费,而在输出中就可以将这些多余的 USDTs 作为代付交易手续费的回报。
  • 匹配用户 OTXs 的 DEX(去中心交易所)
  • 增强交易隐私,类似于 Coinjoin
    • 不仅支持支付类交易的组合,还支持通用的交易的组合

我们需要定义一个 OTX 协议或者标准来促进链下的协作,它将极大地提高效率并增加 Layer1 的交易吞吐量。在接下来的两章中,我将分享我对于 CKB 交易结构的思考,以及对于 CKB 上的 OXT 协议的初步设计。我期待听到你的想法。

原文链接