循环依赖

很多比特币的合约协议涉及一系列按顺序签名的交易。例如,Alice和Bob想要将资金存入一个只能通过两人签名才能花费的脚本,但他们每个人也希望在对方不响应时能够拿回自己的钱。一个简单的解决方案是按顺序签署交易:

  • Tx0支付了来自Alice和Bob的资金到一个脚本的输出,该脚本要求Alice和Bob的签名才能花费。

  • Tx1花费了前一个输出到两个输出,一个是退还Alice她的钱,另一个是退还Bob他的钱(减去一笔小额用于交易费)。

  • 如果Alice和Bob在签署Tx0之前签署Tx1,那么他们都能随时获得退款。这个协议不需要他们中的任何一个相信另一个,因此是一个无需信任的协议。

在传统的交易格式中,这种构造存在一个问题,即每个字段,包括包含签名的输入脚本字段,都用于生成交易的标识符(txid)。Tx1的txid是Tx1中输入的outpoint的一部分。这意味着在Alice和Bob了解Tx0的签名之前,他们无法构造Tx1。但如果他们知道Tx0的签名,其中一个人可以在签署退款交易之前广播该交易,从而消除退款的保证。这就是一个循环依赖。

Last updated