Solidity
在眾籌合約中實施應付賬款回退功能的正確方法是什麼?
我正在實施眾籌智能合約以接受乙太幣並呼叫 ERC20 智能合約來分配代幣數量,該數量取決於投資的乙太幣數量。
我聽說僅實施預設應付賬款回退不是正確的方法,因為這不會阻止客戶直接從交易所共享錢包賬戶發送乙太幣。
function() payable { }
那麼,在眾籌合約中實施備份應付(除了扔在那裡)以便客戶只能通過 MEW、Metamask 和其他私人錢包發送乙太幣的正確方法是什麼?
據我所知,該
fallback
功能在內部sends
和transfers
從一個智能合約到另一個智能合約時有 2300 gas 的津貼。發生這種情況是因為send
並transfer
沒有設置消耗氣體的機制,因此它們預設限制為 2300(另一方面call
,根據需要消耗盡可能多的氣體)。所以他們仍然會觸發程式碼執行,但被呼叫的合約只獲得了 2,300 gas 的津貼,目前僅夠記錄一個事件。如果您從外部帳戶收到乙太幣,我相信您的
send
或transfer
. 所以理論上,如果你只接受來自外部賬戶的乙太幣,你可以使用這個fallback
方法。我相信最好的做法是對revert
任何呼叫fallback
並簡單地添加一個購買功能即payable
.希望能幫助到你!
如果您只想啟用此類事務,則還應檢查 tx.origin 以排除對您的回退的任何可能的不同呼叫。
require(tx.origin == msg.sender, “EOA direct transfer not detected”);
因為你的備份的第一行就足夠了。
另一方面,這也使您的備份無法用於惡意合約的操縱。