• BSV 上基于智能合约的众筹


    我们展示如何在 BSV 上开发众筹平台。与 Kickstarter 类似,资金要么是全部,要么什么都没有。也就是说,如果没有达到筹款目标,则保证资金返还。

    在这里插入图片描述

    与 Kickstarter 相比,我们的方法由智能合约自动执行,不需要将资金委托给受信任的第三方,并且费用低。

    我们首先介绍一种传统的方法来实现这一点,然后介绍一个改进的版本。

    第一次尝试:Lighthouse

    早期的比特币开发者 Mike Hearn 建立了一个基于担保合约的众筹平台 Lighthouse。它使用 SIGHASH 标志 是 ALL | ANYONECANPAY.

    在这里插入图片描述

    ANYONECANPAY 输入可以被合并
    • ALL 确保所有资金都流向所需的接收者,并且总数恰好是某个目标。签名后无法更改收件人和目标,防止捐款被重定向。
    • ANYONECANPAY 确保每个贡献者都可以独立捐款。每个人都签署自己的输入并将部分交易交给接收者,接收者将所有输入合并到一个交易中并赎回资金。

    请注意,在达到目标之前,输入值之和小于输出值,交易无效,收款人无法领取资金。

    改进

    上述众筹有几个缺点:

    1. 贡献者可以随时提取他的认捐资金
    2. 募集资金不得超额认购。即使人们想贡献超过目标,额外的金额也将作为费用支付给矿工,而不是支付给接受者。

    为了改进,每个贡献者将他的资金锁定到以下合约中并广播包含它的交易。这锁定了他的资金,在截止日期之前不能撤回。

    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));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    BSV 上的众筹

    如果在截止日期之前筹集了足够的总资金,则受益人可以通过在第 13 行调用 pledge() 来收集所有已抵押的资金,如图 1 所示。否则,每个贡献者都可以在图 2 中的截止日期之后撤回他的资金,方法是在第 28 行调用 refund()

    在这里插入图片描述

    图 1:活动成功

    在这里插入图片描述

    图 2:活动失败
  • 相关阅读:
    html网页设计大学生作业成品——公益校园网站设计与实现(HTML+CSS+JavaScript)
    原型设计软件,异地办公提升效率
    1997-2018年各省互联网普及率数据
    【mybatis注解开发+二级缓存】
    List容器(C++)
    Hadoop3:MapReduce源码解读之Map阶段的TextInputFormat切片机制(3)
    AI五子棋 C++ 借助图形库raylib和raygui 设计模式思考过程和实现思路总结
    Flink-CEP基于web日志检测暴力破解和异地登陆行为代码示例
    SVG文件动态绘制echarts图表
    C++ 虚函数优化探索简介
  • 原文地址:https://blog.csdn.net/freedomhero/article/details/127568476