Transactions

理解比特幣腳本中的保證合約

  • May 5, 2020

我在理解範例 3 時遇到了一些麻煩,即比特幣維基(<https://en.bitcoin.it/wiki/Contract>)上的比特幣保證契約,其中發送者選擇僅在籌集到 1000BTC 的總金額時才捐款。以下是保證契約範例的說明:

  1. 一位企業家創建一個新地址,並宣佈如果籌集到至少 1000 BTC,就會創建該商品。任何人都可以做出貢獻。
  2. 希望質押的每一方都會創建一個新的交易,將他們的一些硬幣花費到宣布的地址,但他們不會廣播它。該交易與普通交易類似,但有以下三點不同:第一,不能有任何變化。如果您沒有任何大小合適的輸出,則必須先通過花費到您自己的地址之一來創建一個。其次,輸入腳本簽名用 SIGHASH_ALL | 簽名。SIGHASH_ANYONE可以支付。最後,輸出值設置為 1000 BTC。請注意,這不是一個有效的交易,因為輸出值大於輸入值。
  3. 交易被上傳到企業家的伺服器,伺服器將其保存到磁碟並更新其已質押的硬幣數量。
  4. 一旦伺服器有足夠的硬幣,它將單獨的交易合併成一個新的交易。新交易有一個簡單的輸出,只需花費到已宣布的地址 - 它與每個貢獻交易的輸出相同。交易的輸入是從貢獻的質押中收集的。
  5. 完成的交易被廣播,將質押的硬幣發送到公佈的地址。

其中每筆交易都是來自比特幣維基( https://en.bitcoin.it/wiki/Transaction )的以下形式:

Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501

Output:
Value: 1000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

我無法理解第 4 步。如果企業家最終只籌集了 500BTC 並且從未達到籌集 1000BTC 的目標,為什麼企業家不能將輸出值更改為 500BTC,然後在沒有每個發件人同意?

SIGHASH_ALL | SIGHASH_ANYONECANPAY 對輸出進行簽名。所以企業家不能改變輸出,因為它會使他收到的所有輸入的簽名無效。

不過,他還有另一種方法可以繞過這一點——如果他自己有 500 BTC(或者可以非常短暫地借入這個數額)——他可以自己貢獻這筆錢,只籌集 500 BTC 但仍然拿走硬幣。解決這個問題的唯一方法是使用某種形式的託管來驗證付款。

引用自:https://bitcoin.stackexchange.com/questions/95742