Solidity
我需要眾籌契約方面的幫助
這個眾籌契約還遠未完成,我仍在編寫程式碼和測試每個單獨的功能。我使用 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。