使用 for 循環執行 eth_estimateGas 時出現 VM 異常
重要的:
- 將Solidity IDE與 Web3 提供程序一起使用
- 測試 RPC和web3安裝
- 使用 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
.你讓它
i
不3
存在,所以它不快樂。一個相關的提示,供您以後繼續使用。出於可伸縮性的原因,您需要完全重構循環。
希望能幫助到你。