在 ANYONECANPAY 眾籌腳本中,如何讓盈餘去籌款?
ANYONECANPAY 可用於眾籌,除非達到籌資目標/軟上限,否則無法使用已承諾的捐款。但是由於承諾了產出,當超過軟上限時,所有的盈餘都將用於交易費用。有什麼方法可以讓超出部分像 ICO 通常那樣用於籌款活動?
全部|任何人都可以支付
這種構造可用於進行“眾籌”式交易。試圖籌集資金的人可以構造具有單一輸出的交易。單一輸出將“目標”金額支付給籌款人。這樣的交易顯然是無效的,因為它沒有輸入。但是,其他人現在可以通過添加自己的輸入來修改它,作為捐贈。他們用 ALL|ANYONECANPAY 對自己的輸入進行簽名。除非收集到足夠的輸入以達到輸出的價值,否則交易無效。每筆捐款都是一份“承諾”,籌款人在籌到全部目標金額之前無法收回。
不,我認為使用
SIGHASH_ALL | SIGHASH_ANYONECANPAY
. 因為總是有一個預設值的輸出,正如你所提到的,在這種情況下,任何盈餘都將被視為挖礦費用。但是,我認為在更複雜的設計下仍然可以實現。讓我們仔細看看這個問題。既然是眾籌,我們可以假設,
- 參與者願意捐款,並且,
- 如果眾籌失敗,即未達到上限,他們希望收回資金。
問題是,如果眾籌達到了 10 BTC 的上限,而最終收到了 11 BTC 的總捐款,那麼籌款人怎麼能得到額外的 1 BTC 呢?
在這裡申請
SIGHASH_ALL | SIGHASH_ANYONECANPAY
無濟於事,額外的1 BTC將被視為交易費用。借用閃電網路的一些想法,我認為使用比特幣腳本可以實現一個可行的解決方案。這是草稿,設想
發起眾籌,上限為 10 BTC。如果在 60 天內未達到上限,則資金將退還給參與者。否則,所有的錢都會用於籌款活動。
第一階段 - 參與者匯款
- 參與者生成一個名為 it 的秘密,
payment_secret
並對其進行雜湊處理payment_hash
(例如,使用 RIPEMD160)。- 參與者創建一個帶有輸出的交易,它的鎖定腳本指定如下,其中,有兩種可能的路徑來花費它,
- 如果
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
。第二階段 - 籌款人收集/歸還資金
- 如果達到上限,籌款人將要求所有參與者向
payment_secret
他/她透露。籌款人將能夠得到所有的錢,即使它超出了上限。為了花費產出,籌款<fundraiser_sig> <payment_secret> 1
人用來解鎖它們。- 如果未達到上限,即已達到 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>。
但是,籌款人不必送出包含額外資金的交易(因為這不會使他們受益,只會讓礦工受益)。一旦第一筆交易完成(已達到最低金額),其他人就可以驗證已籌集到最低金額的資金,然後只需向籌款人創建一個正常交易即可。