Solidity

錯誤 - 所需氣體超過限額或交易總是失敗

  • April 16, 2018

我剛剛開始在本地創建的區塊鏈中進行可靠的程式並部署智能合約。

我正在嘗試使用 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

智能合約應該做的最後一件事是解析惰性客戶端傳入的對象。強制客戶說契約的語言。

希望能幫助到你。

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