為什麼我不能將代幣從 etherdelta 提取到 myetherwallet?
我無法將 SIFT 令牌從 etherdelta 提取到 myetherwallet。我已經提高了 gas 價格,並確保我在 etherdelta 和 myetherwallet 中有足夠的 ether,但它仍然說我的 gas 用完了。每次我嘗試都會失去乙太。 https://etherscan.io/tx/0x9b076789f1c0db1c18175b0869f9159ad5f2ade016aad855dcb18cf12de7e6fa
SIFT 代幣合約有一個錯誤:如果呼叫者的地址餘額為零,它會嘗試將其添加到代幣持有者列表中(為清楚起見刪除了行)
/* Transfer the balance from owner's account to another account */ function transfer(address _to, uint256 _amount) fundSendablePhase onlyPayloadSize(2) returns (bool) { .. /* Do a check to see if they are new, if so we'll want to add it to our array */ bool isRecipientNew = balances[_to] < 1; .. /* Consolidate arrays if they are new or if sender now has empty balance */ if (isRecipientNew) tokenOwnerAdd(_to); .. }
這是一個糟糕的程式,它會迭代目前的代幣持有者列表以查找地址是否已經存在。如果有很多持有者,它會消耗大量的氣體,如果你有太多可能會導致氣體耗盡。它將導致對合約的拒絕服務攻擊。
/* If the specified address is not in our owner list, add them - this can be called by descendents to ensure the database is kept up to date. */ function tokenOwnerAdd(address _addr) internal { /* First check if they already exist */ uint256 tokenHolderCount = allTokenHolders.length; for (uint256 i = 0; i < tokenHolderCount; i++) if (allTokenHolders[i] == _addr) /* Already found so we can abort now */ return; /* They don't seem to exist, so let's add them */ allTokenHolders.length++; allTokenHolders[allTokenHolders.length - 1] = _addr; }
這還不是完全拒絕服務,因為 Etherdelta 強制最大 gas 為 250k,但應該可以在設置大 gas 量的 Etherdelta 介面之外發送交易。
但無論如何,在開發人員遷移到新契約之前,您可能不應該相信該契約的任何重要價值。
我想添加來自 SIFT 的正式回复,以便其他在此問題上尋求幫助的人可以找到此回复。
契約的問題很早就被確定了。由於代幣持有者之間存在混淆的可能性,我們對 SIFT 持有者進行了投票,以確定他們想要的行動方案。社區以壓倒性多數投票贊成保留目前的契約。您可以在此處查看完整的詳細資訊:https ://smartift.com/voting-proposals/SVP001.pdf
本質上,當您將 SIFT 轉移到新錢包時,您需要設置更高的 gas 限制——而不是更高的價格。有了這個,您仍然可以以幾美分的成本從 EtherDelta 中退出。
如果您需要進一步的幫助,通常會有人在我們的 Telegram 聊天室提供幫助https://t.me/SmartIFT
以下步驟應該允許您退出 EtherDelta。
這些問題的存在是由於智能合約缺陷,SIFT 持有者投票決定在 ICO 關閉後不立即解決。這意味著如果您還沒有持有 SIFT,第一次提款可能會很困難。您第一次從 EtherDelta 提款到新地址需要 3,000,000 的氣體限制。您可以將 gas 價格設置為 EthGasStation.info 上顯示的目前“安全低點”(最初寫作時為 1Gwei,但在擁擠時可能會更高)。在 1Gwei 上,這將花費 0.003 ETH。在 20Gwei 時,這將花費 0.06 ETH。我們建議使用盡可能低的值。很多時候,這可能低至 0.1Gwei(整個交易為 0.0003 ETH)
EtherDelta 不支持直接設置 gas 限制。最好的選擇是使用 MyEtherWallet.com 直接訪問 EtherDelta 智能合約以提取您的 SIFT。如果您有 Trezor、私鑰、Ledger 或恢復種子,則可以使用 MyEtherWallet。您必須在 MyEtherWallet.com 上使用與 EtherDelta 上的 SIFT 相同的錢包——例如,如果您使用私鑰在 EtherDelta 進行身份驗證,請在下面的步驟 9 中輸入該密鑰。
一旦您的錢包存入 SIFT,請按照這些說明進行操作。請注意,您的錢包需要足夠的 ETH 來支付 gas 費用。
- 訪問 MyEtherWallet.com
- 導航到契約選項卡
- 輸入0x8d12A197cB00D4747a1fe03395095ce2A5CC6819的EtherDelta合約地址
- 按“訪問”
- 當“Read/Write Contract”部分出現時,從標有“Select a function”的下拉菜單中選擇“WithdrawToken”
- 在“令牌地址”中輸入 0x8a187d5285d316bcbc9adafc08b51d70a0d8e000(辨識 SIFT 本身的地址)
- 在“金額”中輸入您想從 Etherdelta 提取的 SIFT 餘額
- 選擇如何解鎖您的錢包(即私鑰、Ledger、Trezor 等)
- 完成右側顯示解鎖錢包的任何操作(點擊連接到 TREZOR、連接到 Ledger 錢包、連接到 MetaMask、選擇錢封包件、輸入您的私鑰、輸入助記詞等)
- 在螢幕的右上角有三個下拉菜單——其中一個顯示“Gas Price: XX Gwei”(其中 XX 是目前數字)。我們建議將其更改為 1 以降低交易成本。
- 點擊“寫”
- 將出現一個彈出視窗。當出現提示時,輸入“3000000”作為氣體限制,並將“發送量”保留為 0。如果氣體限制預先填充了另一個更精確的數字(無論是大於還是小於 3000000),然後將其保留。
- 點擊“Generate Transaction”,應該會生成交易。您可能在此處對硬體錢包等進行了額外的確認步驟,但如果您對所有內容感到滿意,請確認出現在您的硬體錢包/螢幕上的更多彈出視窗。
- 將生成一筆交易——點擊 EtherScan.io 的連結來觀察它。完成後(以 1GWei 的價格可能需要幾分鐘甚至幾個小時),您的錢包中將計入 SIFT。
- 然後,您可以使用 MyEtherWallet.com 將 SIFT 從您的 ED 地址發送到您的普通錢包 - 或將其保存在此錢包中。如果你想把它全部發送到另一個錢包,你需要以 3,500,000 的氣體限制發送它。
一旦您從 Etherdelta 進行了第一次 SIFT 提款,您就可以相對輕鬆地再次提款到同一個錢包,以便進一步提款 SIFT。氣體限制降至 60k,從 ED 提取一些 SIFT 到已經持有它的錢包,因此可以僅使用 EtherDelta 介面進行未來提取。
有一個社區編寫的指南,可以幫助一些使用者進一步進行 SIFT 轉賬:http ://www.cryptospikes.com/buying-sift-on-etherdelta-with-ledger.pdf
請注意,如果 MEW 建議呼叫更高的 gas 限制,則使用建議的更高 gas 限制。隨著代幣持有者數量的波動,這個確切的值可能會發生變化。如果 SIFT 持有者在未來有強烈的看法來改變這一點,則可以再次投票以重新部署。