Script

在 ANYONECANPAY 眾籌腳本中,如何讓盈餘去籌款?

  • April 27, 2021

ANYONECANPAY 可用於眾籌,除非達到籌資目標/軟上限,否則無法使用已承諾的捐款。但是由於承諾了產出,當超過軟上限時,所有的盈餘都將用於交易費用。有什麼方法可以讓超出部分像 ICO 通常那樣用於籌款活動?

全部|任何人都可以支付

這種構造可用於進行“眾籌”式交易。試圖籌集資金的人可以構造具有單一輸出的交易。單一輸出將“目標”金額支付給籌款人。這樣的交易顯然是無效的,因為它沒有輸入。但是,其他人現在可以通過添加自己的輸入來修改它,作為捐贈。他們用 ALL|ANYONECANPAY 對自己的輸入進行簽名。除非收集到足夠的輸入以達到輸出的價值,否則交易無效。每筆捐款都是一份“承諾”,籌款人在籌到全部目標金額之前無法收回。

不,我認為使用SIGHASH_ALL | SIGHASH_ANYONECANPAY. 因為總是有一個預設值的輸出,正如你所提到的,在這種情況下,任何盈餘都將被視為挖礦費用。

但是,我認為在更複雜的設計下仍然可以實現。讓我們仔細看看這個問題。既然是眾籌,我們可以假設,

  • 參與者願意捐款,並且,
  • 如果眾籌失敗,即未達到上限,他們希望收回資金。

問題是,如果眾籌達到了 10 BTC 的上限,而最終收到了 11 BTC 的總捐款,那麼籌款人怎麼能得到額外的 1 BTC 呢?

在這裡申請SIGHASH_ALL | SIGHASH_ANYONECANPAY無濟於事,額外的1 BTC將被視為交易費用。借用閃電網路的一些想法,我認為使用比特幣腳本可以實現一個可行的解決方案。這是草稿,

設想

發起眾籌,上限為 10 BTC。如果在 60 天內未達到上限,則資金將退還給參與者。否則,所有的錢都會用於籌款活動。

第一階段 - 參與者匯款

  1. 參與者生成一個名為 it 的秘密,payment_secret並對其進行雜湊處理payment_hash(例如,使用 RIPEMD160)。
  2. 參與者創建一個帶有輸出的交易,它的鎖定腳本指定如下,其中,有兩種​​可能的路徑來花費它,
  • 如果payment_secret提出,錢將用於籌款活動。
  • 否則,如果 60 天過去了,這筆錢將歸參與者所有。

劇本,

OP_IF
   # To the fundraiser if payment secret is supplied
   OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
   <fundraiser_pubkey> OP_CHECKSIG
OP_ELSE
   # To the participant after 60 days
   <60 days later> OP_CHECKLOCKTIMEVERIFY
   <participant_pubkey> OP_CHECKSIG
OP_ENDIF

其中,籌款人可以使用<fundraiser_sig> <payment_secret> 1,參與者可以使用<participant_sig> 0

第二階段 - 籌款人收集/歸還資金

  1. 如果達到上限,籌款人將要求所有參與者向payment_secret他/她透露。籌款人將能夠得到所有的錢,即使它超出了上限。為了花費產出,籌款<fundraiser_sig> <payment_secret> 1人用來解鎖它們。
  2. 如果未達到上限,即已達到 60 天的時間限制,所有參與者現在都可以拿回他們的錢,<participant_sig> 0用來解鎖他們。

所以剩餘問題解決了,但是這種方法有很多缺點,

  • 事務太多,特別是與SIGHASH_ALL | SIGHASH_ANYONECANPAY方法相比,儘管它可能會被優化。
  • 參與者需要知道籌集了多少資金。這需要籌款人收集所有交易並將其展示給所有參與者,這可能需要集中式服務,例如網站。

不僅僅是使用SIGHASH_ALL|SIGHASH_ANYONECANPAY. 這是因為無法修改輸出。

SIGHASH_ALL|SIGHASH_ANYONECANPAY 對所有輸出進行簽名,但僅對這一個輸入進行簽名,並且它還允許任何人添加或刪除其他輸入,因此任何人都可以貢獻額外的 satoshis,但他們無法更改發送的 satoshis 數量以及它們的去向。- <https://bitcoin.org/en/developer-guide#signature-hash-types>。

但是,籌款人不必送出包含額外資金的交易(因為這不會使他們受益,只會讓礦工受益)。一旦第一筆交易完成(已達到最低金額),其他人就可以驗證已籌集到最低金額的資金,然後只需向籌款人創建一個正常交易即可。

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