Solidity

VM 異常:當我呼叫第二個函式時跳轉無效

  • January 17, 2017

我正在嘗試使用 Solidity 瀏覽器

這是我的契約程式碼:

合約測試{

映射(地址=> uint256)weismap;

函式賭注(uint vote)應付回報(uint256 weis){
如果(msg.value==0)拋出;
weismap[msg.sender]=msg.value;
返回weismap[msg.sender];
}

函式 test() 返回 (uint myVote) {
返回 1;
}
}

如果我設置為交易價值1

我將交易價值設置為 1

,創建合約並呼叫函式bet,參數為1

函式執行成功。

如果在那之後,我呼叫我得到的 test() 函式

虛擬機異常:無效的跳轉

任何想法,關於什麼是錯的?

您需要將constant關鍵字添加到test()函式中,例如:

pragma solidity ^0.4.0;
contract Test {
   mapping (address => uint256) weismap;

   function bet(uint vote) payable returns (uint256 weis) {
       if (msg.value==0) 
           throw;
       weismap[msg.sender]= msg.value;
       return  weismap[msg.sender];
   }

   function test() constant returns (uint myVote)  {
       return 1;
   }
}

使用值 2呼叫bet(...)。請注意,我在交易中也發送了 2 個乙太幣:

在此處輸入圖像描述

現在我打電話test() AND 我留下了價值 2。此呼叫test()失敗,因為常量函式被稱為事務,而不是從區塊鏈中讀取值:

在此處輸入圖像描述

如果我呼叫test() AND 我已將 value 設置為 blank,則此呼叫test()成功,因為常量函式被呼叫為從區塊鏈中讀取值:

在此處輸入圖像描述

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