Go-Ethereum

如何從合約中呼叫庫函式?=>錯誤____和rr這rerror合約程式碼無法儲存,請檢查您的gas量。不明確的

  • October 17, 2016

當我在“ https://ethereum.github.io/browser-solidity/ ”編譯以下程式碼時,它為我提供了兩個 Web3 部署程式碼:

var libraryContract  = web3.eth.contract(...); //Web3 deploy code
var contractContract = web3.eth.contract(...); //Web3 deploy code

然後我將 (libraryContract, contractContract) 的 Web3 部署程式碼複製粘貼到 geth 中,以便探勘我的契約。

我的程式碼(為簡單起見,我已經修剪了大部分程式碼):

library Library {
   function func () constant returns (uint8) {
       return 5;
   }
}

contract Contract {
   uint8 value;
   function call_library_function () {
       value = Library.func();
   }
}

“庫”的 Web3 部署程式碼非常好,但是當我嘗試探勘“契約”的 Web3 部署程式碼時,我收到以下錯誤:

> 錯誤:無法儲存合約程式碼,請檢查您的gas量。不明確的

如果我從我的 Contract Link 程式碼中刪除以下行,新生成的“Contract”的 Web3 部署程式碼就會被探勘!沒有任何問題:

value = Library.func();

$$ Q $$我的問題是,我該如何解決我遇到的這個問題?我應該怎麼做才能從契約中呼叫我在庫中的函式,這將允許我探勘它? 我是如何設置我的私有乙太坊區塊鏈的: 請參閱以下連結: 如何更新我的私有乙太坊區塊鏈上的預設 homesteadBlock 值?

感謝您的寶貴幫助和時間。

圖書館契約方法失敗 #2831

您可能使用 –dev 選項執行 geth 來創建專用網路?在這種情況下,使用 init 子命令創建一個私有鏈。說明可以在 wiki 中找到。或者使用測試網。

問題是這段程式碼使用了在 homestead release中添加的委託呼叫。–dev 標誌使用主網的宅基地塊號1150000在這個區塊之前的任何交易都會遇到一個無效的操作碼,消耗所有的氣體並且所有的狀態變化都會被恢復。

要解決此問題:

Genesis 配置文件支持配置部分。目前,您唯一可以配置的是宅基地塊號。如果你不指定它,它將預設為主網號 1150000。所以基本上你的合約將在這個塊之後工作。

嘗試以下創世文件:

{
  "config":{
     "homesteadBlock":"5"
  },
  "nonce":"0x0000000000000042",
  "timestamp":"0x0",
  "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData":"0x0",
  "gasLimit":"0x8000000",
  "difficulty":"0x400",
  "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase":"0x3333333333333333333333333333333333333333",
  "alloc":{

  }

}

如果合約部署在 <5 區塊中,則會出現 gas 限制問題。

在塊 >= 5 中部署它應該按預期工作。

可以在geth init 中找到有關使用 genesis 文件的更多資訊,參數是什麼?.


2016 年 10 月 14 日 10:33 更新

我使用以下程序設置了我的私有區塊鏈:

  1. 設置 genesis.json

Wocket:ESE bok$ more genesis.json 
{
   "config": {
           "homesteadBlock": 10
   },
   "nonce": "0",
   "difficulty": "0x400",
   "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
   "coinbase": "0x0000000000000000000000000000000000000000",
   "timestamp": "0x00",
   "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "extraData": "0x",
   "gasLimit": "0x3B4A1B44",
   "alloc": {}
}

2.密碼文件

我創建了一個testpassword包含我的帳戶密碼的密碼文件

  1. 區塊鏈初始化腳本

我創建了一個腳本來初始化我的區塊鏈:

Wocket:ESE bok$ more 02_runGethGenesisInit 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis init /Users/bok/ESE/genesis.json
geth --datadir /Users/bok/ESE/gethgenesis --password testpassword account new

我曾經chmod 700 02_runGethGenesisInit設置可執行位。

  1. 私有節點腳本

geth我創建了一個腳本來以探勘模式啟動我的私有節點:

Wocket:ESE bok$ more 02_runGethGenesis 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

我曾經chmod 700 02_runGethGenesis設置可執行位。

  1. 瀏覽器可靠性

我從https://github.com/ethereum/browser-solidity/tree/gh-pages下載了Browser Solidity

我解壓縮文件並載入index.html到我的網路瀏覽器中。

6.開始一切

我使用以下命令初始化了我的區塊鏈數據:

Wocket:ESE bok$ ./02_runGethGenesisInit 

我使用以下命令啟動了我的節點,並且已經執行了一段時間:

Wocket:ESE bok$ ./02_runGethGenesis
...
I1015 09:56:14.364062 miner/worker.go:342] 🔨  Mined block (#5210 / f881b1be). Wait 5 blocks for confirmation
I1015 09:56:14.364333 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 281.474µs
I1015 09:56:14.364360 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5205
I1015 09:56:14.364492 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 114.592µs
I1015 09:56:16.394886 miner/worker.go:342] 🔨  Mined block (#5211 / 420c7edc). Wait 5 blocks for confirmation
I1015 09:56:16.395189 miner/worker.go:539] commit new work on block 5212 with 0 txs & 0 uncles. Took 262.993µs
I1015 09:56:16.395222 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5206

7.測試宅基地模式

@TjadenHess我從如何更新我的私有乙太坊區塊鏈上的預設 homesteadBlock 值載入了測試腳本?進入 Solidity 瀏覽器:

contract TestHomestead{
   function test () returns(bool){
       return address(4).delegatecall(1);
   }
}

我通過點擊塊圖示並選擇Web3 Provider將 Solidity Browser 連接到我的本地私有節點。然後我點擊創建將上面的合約部署到區塊鏈。我點擊了測試,消息Transaction cost: 21657 gas.顯示我的區塊鏈處於 Homestead 模式。

在此處輸入圖像描述

在此處輸入圖像描述

注意:如果我更改函式以使其成為常量function test () constant returns(bool){,我會得到 Homestead 模式區塊鏈的以下結果 - true

在此處輸入圖像描述

有關區塊鏈處於非 Homestead 模式時顯示的消息,請參見下面的第 9 節。

  1. 測試庫呼叫原始碼

我稍微修改了庫呼叫原始碼以value公開變數,並將其載入到 Browser Solidity 中:

library Library {
   function func () constant returns (uint8) {
       return 5;
   }
}

contract Contract {
   uint8 public value;
   function call_library_function () {
       value = Library.func();
   }
}

我點Create部署程式碼,call_library_function執行方法,value查看庫呼叫函式結果:

在此處輸入圖像描述

在此處輸入圖像描述

成功

消息Transaction cost: 41914 gas.和 的值value表明庫函式呼叫成功。

  1. 當我的節點處於非 Homestead 模式時會發生什麼

我將 Browser Solidity 與區塊鏈連接geth --dev

geth --dev --datadir /Users/bok/ESE/gethdata --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

我執行了相同的 Homestead 測試程式碼以生成消息Gas required beyond limit: 50000000表明該--dev區塊鏈處於非 Homestead 模式:

在此處輸入圖像描述

注意:如果我更改函式以使其成為常數function test () constant returns(bool){,我會得到以下非 Homestead 模式區塊鏈的結果 - false

在此處輸入圖像描述

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