我們展示如何在 BSV 上開發(fā)眾籌平臺。與 Kickstarter 類似,資金要么是全部,要么什么都沒有。也就是說,如果沒有達(dá)到籌款目標(biāo),則保證資金返還。
與 Kickstarter 相比,我們的方法由智能合約自動(dòng)執(zhí)行,不需要將資金委托給受信任的第三方,并且費(fèi)用低。
我們首先介紹一種傳統(tǒng)的方法來實(shí)現(xiàn)這一點(diǎn),然后介紹一個(gè)改進(jìn)的版本。
第一次嘗試:Lighthouse
早期的比特幣開發(fā)者 Mike Hearn 建立了一個(gè)基于擔(dān)保合約的眾籌平臺 Lighthouse。它使用 SIGHASH 標(biāo)志 是 ALL | ANYONECANPAY.
- ALL 確保所有資金都流向所需的接收者,并且總數(shù)恰好是某個(gè)目標(biāo)。簽名后無法更改收件人和目標(biāo),防止捐款被重定向。
- ANYONECANPAY 確保每個(gè)貢獻(xiàn)者都可以獨(dú)立捐款。每個(gè)人都簽署自己的輸入并將部分交易交給接收者,接收者將所有輸入合并到一個(gè)交易中并贖回資金。
請注意,在達(dá)到目標(biāo)之前,輸入值之和小于輸出值,交易無效,收款人無法領(lǐng)取資金。
改進(jìn)
上述眾籌有幾個(gè)缺點(diǎn):
- 貢獻(xiàn)者可以隨時(shí)提取他的認(rèn)捐資金
- 募集資金不得超額認(rèn)購。即使人們想貢獻(xiàn)超過目標(biāo),額外的金額也將作為費(fèi)用支付給礦工,而不是支付給接受者。
為了改進(jìn),每個(gè)貢獻(xiàn)者將他的資金鎖定到以下合約中并廣播包含它的交易。這鎖定了他的資金,在截止日期之前不能撤回。
contract Crowdfund {
// receiver of the fund
PubKeyHash recepient;
PubKey contributor;
int deadline;
// minimum amount to raise
int target;
// pledge fund
public function pledge(SigHashPreimage txPreimage, int raisedAmount) {
require(Tx.checkPreimage(txPreimage));
// reach target
require(raisedAmount >= this.target);
// fund goes to the recepient
bytes lockingScript = Utils.buildPublicKeyHashScript(this.recepient);
bytes output = Utils.buildOutput(lockingScript, raisedAmount);
require(hash256(output) == SigHash.hashOutputs(txPreimage));
}
// contributor can take the fund back after deadline
public function refund(Sig sig, SigHashPreimage txPreimage) {
require(Tx.checkPreimage(txPreimage));
// fundraising expired
require(SigHash.nLocktime(txPreimage) >= this.deadline);
require(checkSig(sig, this.contributor));
}
}
BSV 上的眾籌
如果在截止日期之前籌集了足夠的總資金,則受益人可以通過在第 13
行調(diào)用 pledge()
來收集所有已抵押的資金,如圖 1 所示。否則,每個(gè)貢獻(xiàn)者都可以在圖 2 中的截止日期之后撤回他的資金,方法是在第 28
行調(diào)用 refund()
。
文章來源:http://www.zghlxwxcb.cn/news/detail-403274.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-403274.html
到了這里,關(guān)于BSV 上基于智能合約的眾籌的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!