備份功能中的提款模式
我需要為我的智能合約實施提款模式。我希望通過在備用函式中發送一些乙太幣,讓使用智能手機和桌子的人與合約互動成為可能。實施這樣的事情是否可能且安全?
function () payable public { if (isWinner(msg.sender)) { require(!winners[msg.sender].prizeTaken) winners[msg.sender].prizeTaken = true; msg.sender.transfer(winners[msg.sender].prize); } else { makeSomeBet(); } }
隨著技術的成熟,越來越多的支持 web3 的移動瀏覽器正在開發和採用。
就個人而言,在為乙太坊開發時,我會避免變通辦法——並增加技術債務;它仍然是一項相當不成熟的技術,一旦程式碼生效,它就幾乎無法控制。
我可以通過這種方法看到的一個潛在問題是,由於這不是正常的函式呼叫,因此發送交易的客戶端很可能無法確定完成程式碼的任何邏輯分支需要多少氣體需要。通過嘗試找到解決方法,您已經向客戶端/使用者洩露了實現細節;使事情複雜化。
互動不再是*“啟動這個酷炫的乙太坊移動錢包並按下這個按鈕”,而是變成了“如果你是贏家,用這個量的 gas 發送 1 wei 到這個地址;否則用這個量的 gas 發送 x ETH “* - 這只會引發一堆問題和潛在的人為錯誤。
實施這樣的事情是否可能且安全?
如果沒有看到更多/所有程式碼,很難說。
我想說一個問題可能是你沒有跟踪獲勝者發送給合約的 ETH(或歸還它)——這可能是一個缺陷。
我假設您正在嘗試實現類似於“乙太王座之王”的東西;有很多地方可以利用漏洞——閱讀更多關於此類合約中已知漏洞的文章是一個不錯的起點。
有沒有可能,大概。我會建議以這種方式解決問題嗎…不。
是的,這是可能的並且受支持。
然而…
當有人在乙太坊中發送正常的價值轉移交易時,預設情況下可用的 gas 將不足以在你的備份函式中處理該邏輯。錢包通常只是假設這沒問題,畢竟這只是一種價值轉移,……沒有檢查估計的 gas 成本或建議使用者考慮更改 gas 限制。
所以這種方式聽起來對人們來說超級方便,但實際上會導致很多
out of gas
交易失敗。對於您的問題,這是否安全,是的,它與其他方法一樣安全。唯一需要考慮的是為交易分配正確的氣體限制。否則你會讓使用者感到沮喪,他們在 gas 上損失了一點 ETH……但沒有造成真正的傷害。