在學習完solidity編程基礎之后,于是結合課程撰寫了一個簡單的眾籌合約,
【需求分析】
眾籌里面需要有2類角色:接收者和捐贈者,其中接收者可以對應多個捐贈者,下面是這兩類角色屬性分析:
接收者:接收者地址、眾籌總金額、當前眾籌金額、捐贈者的個數
捐贈者: 捐贈者地址、捐贈金額
1.接收者
我們按照上面的要求創建了一個接收者物件,里面包含其屬性
//接收者物件
struct Recipient{
address recipient_address; //接收者地址
uint goal; //籌資金額目標
uint amount; //當前籌資金額
uint contributor_amount; //捐贈者數量
mapping(uint => Contributor) map; //通過id與捐贈者關聯
}
2.捐贈者
//捐贈者物件
struct Contributor{
address contributor_address; //捐贈者地址
uint contributor_money; //捐贈金額
}
3.創建一個眾籌事件
address _address:代表的是當前發起眾籌用戶的地址
uint _goal:代表的是需要籌集的資金總額是多少
// 發起一個眾籌事件
function create_crowdfunding(address _address,uint _goal) public {
// 將接受者id加1
recipientId++;
// 創建接受者物件,并通過id與其系結
recipient_map[recipientId] = Recipient(_address,_goal,0,0);
}
4.為創建眾籌者捐贈
address Newaddress:捐贈者地址
uint _recipientId:接收者的id
//發起捐贈
function contribute(address Newaddress,uint _recipientId) public payable{
// 通過id獲取接受者物件
Recipient storage _recipient = recipient_map[_recipientId];
// 當前接受者金額加上獲贈的金額
_recipient.amount += msg.value;
//捐贈人數加1
_recipient.contributor_amount++;
// 將接受者id與捐贈者系結在一起
_recipient.map[ _recipient.contributor_amount] = Contributor(Newaddress,msg.value);
}
5.判斷眾籌是否完成
通過傳入接收者id來判斷該物件是否完成了眾籌
// 判斷眾籌任務是否完成
function Iscompelte(uint _recipientId)public returns(bool){
// 通過id獲取接受者物件
Recipient storage _recipient = recipient_map[_recipientId];
// 判斷籌集資金是否達到與其目標
if(_recipient.amount >= _recipient.goal){
//將眾籌到的資金轉移到接受者合約地址
_recipient.recipient_address.transfer(_recipient.amount);
return true;
}
return false;
}
6.完整代碼
pragma solidity ^0.4.24;
contract crowd_funding{
//捐贈者物件
struct Contributor{
address contributor_address; //捐贈者地址
uint contributor_money; //捐贈金額
}
//接收者物件
struct Recipient{
address recipient_address; //接收者地址
uint goal; //籌資金額目標
uint amount; //當前籌資金額
uint contributor_amount; //捐贈者數量
mapping(uint => Contributor) map; //通過id與捐贈者關聯
}
uint public recipientId; //接受者id
mapping(uint => Recipient) recipient_map; //通過id將接受者資訊關聯
// 發起一個眾籌事件
function create_crowdfunding(address _address,uint _goal) public {
// 將接受者id加1
recipientId++;
// 創建接受者物件,并通過id與其系結
recipient_map[recipientId] = Recipient(_address,_goal,0,0);
}
//發起捐贈
function contribute(address Newaddress,uint _recipientId) public payable{
// 通過id獲取接受者物件
Recipient storage _recipient = recipient_map[_recipientId];
// 當前接受者金額加上獲贈的金額
_recipient.amount += msg.value;
//捐贈人數加1
_recipient.contributor_amount++;
// 將接受者id與捐贈者系結在一起
_recipient.map[ _recipient.contributor_amount] = Contributor(Newaddress,msg.value);
}
// 判斷眾籌任務是否完成
function Iscompelte(uint _recipientId)public returns(bool){
// 通過id獲取接受者物件
Recipient storage _recipient = recipient_map[_recipientId];
// 判斷籌集資金是否達到與其目標
if(_recipient.amount >= _recipient.goal){
//將眾籌到的資金轉移到接受者合約地址
_recipient.recipient_address.transfer(_recipient.amount);
return true;
}
return false;
}
}
7.演示
首先我們運行合約然后點擊部署

將剛才我們選中的用戶地址:0xdd870fa1b7c4700f2bd7f44238821c26f7392148
填入到下面的框框中,然后自定義一個眾籌金額,如下所示:

點擊 transact,在編譯器中查看到如下所示:

接下來我們需要選擇第一個用戶地址為它進行捐贈

輸入捐贈金額2000wei

然后在下面的contribute輸入第一個用戶地址:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
以及需要捐贈的接收者id號,我們可以在下面 查看接收者的id

然后輸入進去,點擊 transcat

查看控制臺如下所示:

此時我們還需要判斷捐贈的金額是否達到我們預期的目標,如果滿足我們將這比捐贈者捐贈的2000wei轉移到接收者的合約地址上面,我們現在看看接收者合約地址上的余額是多少?

我們點擊Iscompelte,在里面輸入接收者id:1

可以看到我們接收者賬戶余額多了2000wei
再看下控制臺,回傳true說明完成眾籌了,

【總結】
上面測驗的只是通過一個人直接捐贈來完成的,我們還可以通過多人來完成捐贈,這里就不一一測驗了,通過這個簡單的眾籌合約基本上融匯了solidity編程中的基本概念,
參考資料:基于以太坊眾籌合約實戰
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/11518.html
標籤:AI
下一篇:Xception簡介
