您好,登錄后才能下訂單哦!
本篇內容主要講解“以太坊眾籌智能合約怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“以太坊眾籌智能合約怎么實現”吧!
實現一個好的idea常常需要付出巨大的努力,并且需要大量的資金。我們可以尋求用戶捐贈,或者尋求投資機構投資,但這往往很難。對于捐贈,國內的風氣不太好,資金去向往往不了了之,捐贈者對于當前的捐贈形式早已失去了信心。而風險投資,對于沒有人脈的創業者來說,非常困難。 區塊鏈提供了一種眾籌的新形式——眾籌智能合約。募資人通過眾籌合約設定好眾籌目標,以及完成時間,設定不同眾籌結果所對應的操作(例如目標失敗退回全款、目標成功時受益人獲得加密代幣或ETH)。由于區塊鏈不可篡改的特性,眾籌合約會是一個非常吻合的應用場景。
這個例子中我們將通過解決兩個重要的問題進行更好的眾籌:
如何管理資金,保證流動性;
籌集資金后如何花錢。
區塊鏈出現之前的眾籌項目一般缺少流動性,投資人一旦錯過眾籌截止時間將無法參與眾籌;一旦參與眾籌,投資人也不能中途退出。智能合約通過發行代幣的形式來記錄投資額,并提供了類似股票市場的流動性。投資人可以選擇交易或者繼續持有。項目成功后投資者可以使用代幣交換實物或者產品服務。項目失敗的話投資者可以按照原先的約定退出,并且繼續持有代幣以表紀念。
同樣,當前眾籌項目也存在資金去向不明的問題。在這個項目中,我們使用DAO(分布式自治組織)記錄每一筆資金去向。
先放上代碼,然后再一步步解讀。
pragma solidity ^0.4.16; interface token { function transfer(address receiver, uint amount); } contract Crowdsale { address public beneficiary; uint public fundingGoal; uint public amountRaised; uint public deadline; uint public price; token public tokenReward; mapping(address => uint256) public balanceOf; bool fundingGoalReached = false; bool crowdsaleClosed = false; event GoalReached(address recipient, uint totalAmountRaised); event FundTransfer(address backer, uint amount, bool isContribution); /** * Constrctor function * * Setup the owner */ function Crowdsale( address ifSuccessfulSendTo, uint fundingGoalInEthers, uint durationInMinutes, uint etherCostOfEachToken, address addressOfTokenUsedAsReward ) { beneficiary = ifSuccessfulSendTo; fundingGoal = fundingGoalInEthers * 1 ether; deadline = now + durationInMinutes * 1 minutes; price = etherCostOfEachToken * 1 ether; tokenReward = token(addressOfTokenUsedAsReward); } /** * Fallback function * * The function without name is the default function that is called whenever anyone sends funds to a contract */ function () payable { require(!crowdsaleClosed); uint amount = msg.value; balanceOf[msg.sender] += amount; amountRaised += amount; tokenReward.transfer(msg.sender, amount / price); FundTransfer(msg.sender, amount, true); } modifier afterDeadline() { if (now >= deadline) _; } /** * Check if goal was reached * * Checks if the goal or time limit has been reached and ends the campaign */ function checkGoalReached() afterDeadline { if (amountRaised >= fundingGoal){ fundingGoalReached = true; GoalReached(beneficiary, amountRaised); } crowdsaleClosed = true; } /** * Withdraw the funds * * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached, * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw * the amount they contributed. */ function safeWithdrawal() afterDeadline { if (!fundingGoalReached) { uint amount = balanceOf[msg.sender]; balanceOf[msg.sender] = 0; if (amount > 0) { if (msg.sender.send(amount)) { FundTransfer(msg.sender, amount, false); } else { balanceOf[msg.sender] = amount; } } } if (fundingGoalReached && beneficiary == msg.sender) { if (beneficiary.send(amountRaised)) { FundTransfer(beneficiary, amountRaised, false); } else { //If we fail to send the funds to beneficiary, unlock funders balance fundingGoalReached = false; } } } }
構造函數中
fundingGoal = fundingGoalInEthers * 1 ether; deadline = now + durationInMinutes * 1 minutes;
ether和minutes是以太坊預留的關鍵字,1 ether == 1000 finney , 2 days == 48 hours。日期類型的關鍵字有seconds,minutes,hours, days,weeks,years,以太幣單位預留的關鍵字有wei,finney,szabo,ether。1 finney == 1000 szabo,1 szabo == 10^12 wei。now也是以太坊預留的關鍵字,代表當前時間。
接下來我們實例化了一個合約:
tokenReward = token(addressOfTokenUsedAsReward); token的定義在代碼開頭: interface token { function transfer(address receiver, uint amount){ } }
這里我們并未實現token合約,只是告訴編譯器我們的token是一個合約,具有一個transfer()函數,并且在給定的地址上有這個合約。
接下來我們看看合約如何接收資金,相關代碼如下:
function () { require(!crowdsaleClosed); uint amount = msg.value; // ...
這個函數很特別,它沒有名字,在solidity中我們稱之為回退函數(Fallback function),回退函數沒有參數,也沒有返回值。如果合約接收ether,則必須明確定義回退函數,否則會觸發異常,并返回ether。接收ether的函數必須帶有關鍵字payable,否則會報錯。
require語句先判斷眾籌是否結束,如果眾籌已經結束,錢將退回給主叫方,避免主叫方出現不必要的損失。
部署通過之后可以用自己的測試賬戶向合約地址轉賬,這樣就可以參與眾籌了。
眾籌成功后,如果繼續往合約地址轉賬,錢將會退回你的賬戶。
到此,相信大家對“以太坊眾籌智能合約怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。