Mist

在使用合約執行過程中遇到的 MEW 錯誤巴德__instruction乙一種d一世ns噸r在C噸一世這nBad instruction

  • October 14, 2017

我在代幣轉移方面遇到了一些問題,當我將 REMIX 與 Metamask 一起使用時,將代幣從非所有者帳戶轉移到另一個帳戶可以正常工作。然而,當使用 MEW 或 MIST 時,事務會失敗。

 function transfer(address _to, uint _value) returns (bool success){
     require( balances[msg.sender] >= _value &&
         _value > 0 );
         _value     = _value.mul(1000000000000000000);
         balances[msg.sender]  = balances[msg.sender].sub(_value);
         balances[_to]  = balances[_to].add(_value);
         Transfer(msg.sender,_to,_value);
         return true;
 }

 function transferFrom(address _from, address _to, uint _value) returns (bool success){
     require( balances[_from] >= _value && _value > 0 );
   _value     = _value.mul(1000000000000000000);
   balances[_from]  = balances[_from].sub(_value);
   balances[_to]    = balances[_to].add(_value);
   Transfer(_from,_to,_value);
   return true;
 }

失敗的交易是ropsten.etherscan.io/tx/…

該交易試圖轉移 10^22 個基礎代幣 (0x21e19e0c9bab2400000)。然後,您在契約中乘以 10^18。除非您的帳戶中有 10^40 個基本令牌,否則它將失敗。

我預計您打算轉移 10,000 個代幣,但 UI(MEW 和 Mist,但在 Metamask 的情況下不是)已將其乘以 10^18 以說明decimals提供契約的價值。

您可以設置decimals為 0,或刪除乘以 10^18 的乘積,以使其更直覺。在我的代幣合約中,我沒有小數,也沒有乘法!但通常的 ERC20 代幣合約方法是不進行乘法運算。他們假設所有輸入和內部數據都是基於基本令牌的。然後,該decimals值用於前端 UI 顯示並從顯示標記轉換為基本標記。這是一個很大的混亂來源,你需要知道你的前端是否在進行轉換。通常,您可以根據他們向您顯示的帳戶餘額來計算。但是,是的,這不是很好。

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