如何從合約中呼叫庫函式?=>錯誤____和rr這rerror合約程式碼無法儲存,請檢查您的gas量。不明確的
當我在“ 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 值?
感謝您的寶貴幫助和時間。
您可能使用 –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 更新
我使用以下程序設置了我的私有區塊鏈:
- 設置 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
包含我的帳戶密碼的密碼文件
- 區塊鏈初始化腳本
我創建了一個腳本來初始化我的區塊鏈:
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
設置可執行位。
- 私有節點腳本
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
設置可執行位。
- 瀏覽器可靠性
我從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 節。
- 測試庫呼叫原始碼
我稍微修改了庫呼叫原始碼以
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
表明庫函式呼叫成功。
- 當我的節點處於非 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: