Solidity

我需要眾籌契約方面的幫助

  • July 27, 2017

這個眾籌契約還遠未完成,我仍在編寫程式碼和測試每個單獨的功能。我使用 getRefund() 函式所採用的方法似乎工作得很好,但是,我有點擔心存在潛在的衝突,因為我已將所有投資者的地址映射到發送到合約的 ETH 數量。地址 A 和地址 B 是否可以映射到映射中的同一索引?如果是這樣,這是否意味著如果地址 A 要求退款,地址 A 不會也獲得從地址 B 發送的資金嗎?

pragma solidity ^0.4.0;

contract Crowdfunding {

   address private owner;

   mapping (address => uint) investors;

   //Constructor
   function Crowdfunding() {
       owner = msg.sender;
   }

   //Modifiers
   modifier investorsOnly {
       if(investors[msg.sender] == 0) throw;
       _;
   }

   //Events
   event PaymentReceived(uint Amount, address From, address To);
   event WithdrawalClaimed(uint Amount, address From);

   //Functions
   function() payable {
       investors[msg.sender] += msg.value;
       PaymentReceived(msg.value, msg.sender, this);
   }

   function withdrawFunds() {
       suicide(owner);
   }

   function getRefund() investorsOnly {
       uint amount = investors[msg.sender];
       investors[msg.sender] = 0;
       msg.sender.transfer(amount);
       WithdrawalClaimed(amount, msg.sender); 
   }
}

地址 A 和地址 B 是否可以映射到映射中的同一索引?

不,這是不可能的,因為通過映射,您可以定義地址和捐款金額之間的唯一連結。所以退款過程應該沒有問題。要碰撞 2 個地址應該有相同的私鑰,這幾乎是不可能的。

提示:不推薦使用 revert() 而不是 throw。

此外,備份功能氣體成本應低於 2300:

請確保在部署合約之前徹底測試您的回退功能,以確保執行成本低於 2300 gas。

引用自:https://ethereum.stackexchange.com/questions/23146