CSW|nSequence 和P2P交换
原文标题《nSequence and P2P exchange》,首发于2018年11月13日《Medium》
翻译:刘晔,上海市海上律师事务所
起初,比特币允许双方进行 P2P 的点对点交易和交换,然后交给区块链(矿工)进行结算。 欢迎来到比特币的过去和未来。
比特币的原始版本使用序列号。比特币区块浏览器上看不到这些序列号了,因为它们现在不再用于比特币,并且默认为最后的 FFFF’FF 时间。任何非默认序列号最终只显示在原始交易中。
序列号被设计用于交易完成前的交易替换。这个功能已经被禁用了,但是在 Bitcoin SV 中我们将再次使用这个功能,允许用户使用以下功能:
・ Alice 发送一个交易,其中 nLockTime 值设置成未来的某个日期。我们可以从任何东西开始,但是默认情况下我们会从序列号0开始
・ 矿工们不会认为这笔交易是有效的,因此,它不是“最终”交易。矿工网络在最终之前不会将其打包入块,只有在达到 nLockTime 值时才会发生。
・ 由于在到达 nLockTime 中指定的时间之前交易不会包含在块中,因此存在一个双方已经同意的最终状态以及发送更新交易的能力。如果有一个2/3的地址,当事人可以使用托管(如许可共享登记)来确保已经同意的交易是最终的。如果没有,我们也可以让各方协商,并允许在nLockTime 最后期限之前的任何时候以某种方式"退出"协商。
・ 使用这种方法,并且在达到设置的 nLockTime 之前,用户可以用更高版本的交易替换交易。较高序列号是取代之前序列号的较新版本。也就是说,一旦达到 nLockTime,网络将接受最高序列号的交易,并拒绝所有其他较低值的交易。
・ 协商也可以最终敲定。如果一方将序列号设置为 UINT_MAX,交易将被视为由矿工敲定,不能进行替换。当序列等于UINT_MAX时,即使 nLockTime 值在未来保持不变,矿工也不再接受替换交易。
・ 如果希望永久锁定交易,可以将序列号设置为UINT_MAX。然后交易将被认为是最终的,即使 nLockTime 表示的时间在将来仍然存在。
我们可以在比特币的原始版本中使用这个特性,允许两个(或更多)当事人创建和签署一个准备好的交易。
・ 这些事先准备好的交易可以由双方协商、同意和签署,允许他们彼此转移资金。允许有一个基础协议和支付流。这种做法安全可靠,而且不产生任何费用---已付费用支付给进行交易结算的矿工,不是付给交易所。
・ 扩展这一功能可以创建一系列服务,允许用户在不用等待确认的情况下将资金提取与存储于一个服务中。
・ 如果用户违约,最终的交易可以与一个托管方签署,以确保合规,并确保商户没有"受骗"
由于BTC(比特币核心)禁用了这些功能,所有比特币核心的交易均使用nLockTime=0,而序列号=UINT_MAX。
正如Mike Hearn 在下文中解释的那样:
”未记录的开放交易可以一直被替换,直到nLockTime 为止。它可能包含多方付款。 每个input所有者签署他们的input。对于要写入的新版本,每方必须签署一个更高的序列号(参见 IsNewerThan)。通过签名,一个input的所有者会说:"我同意输入(input)我的钱,如果每个人都输入,output就是这样的。"
签名哈希(Signaturehash)中还有其他选项,比如SIGHASH_ SINGLE,意思是"我同意,只要这个输出(也就是我的)是我想要的,我不在乎你如何处理其他输出。" 。如果nSequence的序列号较高,除了一项规定外,当事人可以退出谈判,或者签署SIGHASH_NONE完全退出谈判。
当事方可以通过使用 OP_CHECKMULTISIG创建一个更高的nSequence序列号Tx 来创建一个预同意的默认选项,该操作要求一部分当事方签名以完成签名。各方保留这个Tx,如果需要,可以传阅它,直到它有足够的签名。
Nlocktime可用于一组参与者之间的高频交易。
各参与方可以通过一致同意来不断更新 tx。付钱的一方将首先签署下一个版本。如果一方停止同意更改,那么最后一个状态将记录于nLockTime。如果需要,可以在每个版本之后准备一个默认交易,以便 n-1当事方可以将一个不响应的当事方除名。中间交易不需要广播。只有最终的结果才被网络记录。在 nLockTime 之前,当事方和一些见证节点广播它们所看到的最高序列Tx。“