Contract-Development

眾售合約和安全提款

  • July 31, 2017

根據https://www.ethereum.org/crowdsale上的眾籌合約,當使用外部函式 tokenReward.transfer(msg.sender, amount / price) 呼叫“function () paid”時,代幣將轉移到使用者賬戶。然而,當使用者在 safeWithdrawal() 領取其乙太幣時,因為還沒有達到fundingGoal,沒有呼叫 tokenReward.transfer() 外部函式,所以在我看來,購買的代幣沒有正確提取,儘管乙太幣被發送到使用者。

有沒有人使用此程式碼來銷售代幣並以使用者身份執行提款?呼叫 safeWithdrawal 時,代幣合約的代幣餘額是否適當減少?這怎麼可能?

參考:

Pre ico 和 ico 眾籌合約

購買 ICO 代幣?

買賣我的代幣

有沒有人使用此程式碼來眾籌代幣並以使用者身份執行提款?

IMO 該程式碼更像是實際 ICO 的草圖,並不意味著安全和適當的 ICO 參考實現。它至少有一個如下所述的問題。此外,我不知道有人確切使用此程式碼,大多數時候上限(上限)似乎比此處實現的下限更相關。

呼叫 safeWithdrawal 時,代幣合約的代幣餘額是否適當減少?這怎麼可能?

除了單獨的代幣合約(有關此實施的一些問題,請參見下文)之外,該合約還跟踪已支付的貢獻(以 Wei 為單位)。在safeWithdrawal函式內部,您有以下行,負責在未達到資金限額時重置已支付的捐款:

balanceOf[msg.sender] = 0;

該代幣銷售契約旨在使用任何代幣。因此,“銷毀”報銷的代幣必須在該代幣契約中逐案處理。具體來說,您作為使用者必須首先呼叫approve標準代幣的函式,現在這裡的合約可以嘗試通過將代幣發送到不可使用的地址(例如0x000...)或將其發送給自己來銷毀代幣。

您的觀點是,在償還乙太幣時,代幣不會被銷毀/償還是正確的。但是,您可能會爭辯說,如果所有 Ether 都已被償還,這些代幣就毫無意義。你可以更進一步,說你實際上為每一個想要償還他們的乙太幣的投資者節省了燃料——如果項目沒有得到任何乙太幣,那麼令牌無論如何都是沒有意義的,那麼為什麼要重新分配令牌餘額呢?

現在為

問題:

這個眾籌合約覆蓋了每個地址貢獻的乙太幣,而不是增加餘額:

uint amount = msg.value;
balanceOf[msg.sender] = amount;

對於發送多筆交易然後會在報銷期內損失資金的投資者來說,這是一個問題。事實上,除了在最後一筆交易中發送的乙太幣之外,所有乙太幣都將永遠鎖定在智能合約中。

因此我建議

修復:

uint amount = msg.value;
balanceOf[msg.sender] += amount;

當然,對於像SafeMath這樣的庫,而不是進行簡單的增量,這將是一個很好的做法。

現在您不必再為償還或銷毀乙太幣而煩惱了,如果尚未達到資金限額,任何投資者都可以隨時簡單地取回他們的出資額。當然,每個代幣持有者都應該意識到,在這種情況下,他們只是參與了另一個完全無用的乙太坊代幣

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