Solidity

使用 for 循環執行 eth_estimateGas 時出現 VM 異常

  • September 5, 2017

重要的:

  • Solidity IDE與 Web3 提供程序一起使用
  • 測試 RPCweb3安裝
  • 使用 10 個 Ether 賬戶進行測試,每個賬戶有足夠的 Ether (100 ETH)。

我正在測試一個簡單的合約,它從一個賬戶接收乙太幣,拆分價值並將其轉移到其他 3 個賬戶。

contract testContract {

   address[] employees = [
       0x4cd28d9a0d66216382ad3e1c993797989d1a8e05,
       0xb871e16d7192cbaa2b5be32f85c1a19f61b8a50d,
       0x5e5527378c42b91e95fee2cfbe974259d983a99e
   ];

   function testContract() payable {

   }

   function () payable {
       uint amountPerEmployee = msg.value / employees.length;

       for(uint i = 0; i <= employees.length; i++) {
           employees[i].transfer(amountPerEmployee);
       }
   }

} 

使用循環執行回調函式時出現錯誤:

回調不包含結果錯誤:錯誤:執行 eth_estimateGas 時出現 VM 異常:/usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:59368:17 在 /usr/local/lib/node_modules 的操作碼無效/ethereumjs-testrpc/build/cli.node.js:69306:5 在 /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11335:9 在 /usr/local/lib/node_modules /ethereumjs-testrpc/build/cli.node.js:7895:16 在iterateeCallback (/usr/ local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8405:17) 在 /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8380:16 在 /usr /local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11332:13 在 /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli。node.js:69302:9 在 /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:63982:7

在測試如下回調函式時,一切順利:

function () payable {
   uint amountPerEmployee = msg.value / employees.length;

   // Test with only the first item in the array, no loop
   employees[0].transfer(amountPerEmployee);
}

這裡發生了什麼?是否是循環使用了過多的氣體?

你正在離開陣列的末端

for(uint i = 0; i <= employees.length; i++)

employees[]正好有 3 行,它們是:0, 1, 2.

你讓它i3存在,所以它不快樂。

一個相關的提示,供您以後繼續使用。出於可伸縮性的原因,您需要完全重構循環。

希望能幫助到你。

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