Solidity
錯誤 - 所需氣體超過限額或交易總是失敗
我剛剛開始在本地創建的區塊鏈中進行可靠的程式並部署智能合約。
我正在嘗試使用 remix 和 web3 提供程序部署一個簡單的智能合約,這個錯誤一直在殺死我。
這是我的程式碼。我只是試圖解析一個 json 文件以將其保存為結構。如果您知道更好的方法,那就太好了!我現在正在使用來自 github 的庫,我認為它對我的案例很有用,但我需要一些程式碼幫助。
pragma solidity ^0.4.21; import 'github.com/chrisdotn/jsmnSol/contracts/JsmnSolLib.sol'; contract MusicalContract { struct parameters { string name; string mr_share; string pr_share; string sr_share; string country; string walletDir; } //event debugStr(string str); //event debugInt(uint i); parameters[] public params; string public json = '[{"name":"Martin","pr_share":"2","mr_share":"2","sr_share":"2","country":"2101","walletDir":"12345"},{"name":"Ahoj","share":"","walletDir":"2589","pr_share":"2","mr_share":"2","sr_share":"2","country":"36"},{"name":"Cus","share":"","walletDir":"12345","pr_share":"2","mr_share":"3","sr_share":"1","country":"2100"}]'; /* function MusicalContract(string json) { } */ function MusCo() public { uint returnValue; uint actualNum; JsmnSolLib.Token[] memory tokens; string memory jsonElement; JsmnSolLib.Token memory t; (returnValue, tokens, actualNum) = JsmnSolLib.parse(json, 200); for(uint ielement=0; ielement < actualNum-1; ielement++) { t = tokens[ielement]; jsonElement = JsmnSolLib.getBytes(json, t.start, t.end); //emit debugStr(jsonElement); //emit debugInt(ielement); if(compareStrings(jsonElement, "name")) { t = tokens[ielement+1]; params[ielement].name = JsmnSolLib.getBytes(json, t.start, t.end); } else if(compareStrings(jsonElement, "pr_share")) { t = tokens[ielement+1]; params[ielement].pr_share = JsmnSolLib.getBytes(json, t.start, t.end); } else if(compareStrings(jsonElement, "mr_share")) { t = tokens[ielement+1]; params[ielement].mr_share = JsmnSolLib.getBytes(json, t.start, t.end); } else if(compareStrings(jsonElement, "sr_share")) { t = tokens[ielement+1]; params[ielement].sr_share = JsmnSolLib.getBytes(json, t.start, t.end); } else if(compareStrings(jsonElement, "country")) { t = tokens[ielement+1]; params[ielement].country = JsmnSolLib.getBytes(json, t.start, t.end); } else if(compareStrings(jsonElement, "walletDir")) { t = tokens[ielement+1]; params[ielement].walletDir = JsmnSolLib.getBytes(json, t.start, t.end); } } } function compareStrings (string a, string b) view returns (bool){ return keccak256(a) == keccak256(b); } function getContractAddress() public view returns (address) { return this; } }
好消息。它部署了成本為 3531698 的精細氣體。這超過了 3M 的預設值,這是為了讓我們保持誠實並警告我們可能會接近實際鏈上的塊 gasList。你可以提高gasLimit(我提高到7M試試),然後你會沒事的。
壞消息。這份合約幾乎是你能得到的非區塊鏈。我將向您展示如何處理它,但我不確定顯示的任何欄位是否是對象的唯一標識符。考慮智能合約中哪些欄位是絕對需要的,以及數據應該如何組織。https://medium.com/solidified/the-joy-of-minimalism-in-smart-contract-design-b67fb4073422
智能合約應該做的最後一件事是解析惰性客戶端傳入的對象。強制客戶說契約的語言。
希望能幫助到你。