在 Ubuntu 16.04 上,Solidity 已安裝但無法在 geth 中執行
Geth 控制台輸出後
admin.setSolc("/usr/bin/solc")
:eth.compile.solidity("") I0601 15:31:56.663260 common/compiler/solidity.go:114] solc, the solidity compiler commandline interface Version: 0.3.3-0/RelWithDebInfo-Linux/g++/Interpreter path: /usr/bin/solc solc: empty source string at web3.js:3119:20 at web3.js:6023:15 at web3.js:4995:36 at :1:1
和
eth.getCompilers() []
我得到一個空數組而不是
['Solidity']
.通過以下方式安裝solidity:
sudo apt-get install solc
輸出
which solc
:(/usr/bin/solc
將此添加到PATH)我看到了一個類似的問題,但是我使用的是最新版本(0.3.3)並且仍然有問題。我錯過了什麼嗎?
空
eth.getCompilers()
結果是正常的。您可以嘗試以下方法:
> eth.getCompilers() [] > var ceilSource='contract Ceil { function ceil(uint a, uint m) constant returns (uint ) { return ((a + m - 1) / m) * m; }}' undefined > var ceilCompiled = web3.eth.compile.solidity(ceilSource); undefined > ceilCompiled { Ceil: { code: "0x606060405260348060106000396000f3606060405260e060020a60003504638587be6e8114601a575b005b602435600435810160001901819004026060908152602090f3", info: { abiDefinition: [{...}], compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc067035811", compilerVersion: "0.3.4", developerDoc: { methods: {} }, language: "Solidity", languageVersion: "0.3.4", source: "contract Ceil { function ceil(uint a, uint m) constant returns (uint ) { return ((a + m - 1) / m) * m; }}", userDoc: { methods: {} } } } }
如果您可以重現上述結果,則您的編譯器安裝工作正常。
(程式碼來自What is the最便宜的方式將roundup() 或 ceil() 轉換為 1000 的倍數?)。
此外,我得到與編譯空字元串時相同的結果:
> eth.compile.solidity("") solc: empty source string at web3.js:3119:20 at web3.js:6023:15 at web3.js:4995:36 at <anonymous>:1:1
編輯 15/06/2016 - 回應
@Matthias
問:當你說空的 getCompilers 結果是正常的,這究竟是什麼意思?是什麼讓這個函式返回一些東西?
答:我不知道
[]
結果的eth.getCompilers()
確切含義,但是當我在geth console
螢幕上執行以下命令時,返回的結果就是我所看到的,並且我從內部編譯 Solidity 程式碼沒有問題geth
。我只是想消除不同的錯誤點。這是我看到的:
geth console ... > eth.getCompilers() I0615 01:17:48.956307 common/compiler/solidity.go:114] solc, the solidity compiler commandline interface Version: 0.3.4-0/RelWithDebInfo-Linux/g++/Interpreter path: /usr/bin/solc [] > eth.getCompilers() []
第一次執行
getCompilers()
產生了一些結果solc
。從命令行,如果我執行,solc --version
我也會得到版本資訊。user@Kumquat:~/TestSolc$ solc --version solc, the solidity compiler commandline interface Version: 0.3.4-0/RelWithDebInfo-Linux/g++/Interpreter
如果您可以看到與我得到的資訊類似的資訊,那麼您的 Solidity 編譯器可以從
geth
.如果您在從內部編譯 Solidity 原始碼時遇到問題,可以嘗試以下一項額外測試
geth
。我已將以下程式碼保存到 Ceil.sol 中:
contract Ceil { function ceil(uint a, uint m) constant returns (uint ) { return ((a + m - 1) / m) * m; } // To measure gas function ceil1(uint a, uint m) returns (uint ) { return ((a + m - 1) / m) * m; } }
我現在正在
geth
使用上面結果中的命令行參數進行外部編譯ceilCompiled
:user@Kumquat:~/TestSolc$ solc --bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc067035811 Ceil.sol
這是我的 /tmp/solc067035811 目錄的內容:
user@Kumquat:~/TestSolc$ ls -al /tmp/solc067035811/ total 24 drwxrwxr-x 2 bok bok 4096 Jun 15 01:21 . drwxrwxrwt 12 root root 4096 Jun 15 01:22 .. -rw-rw-r-- 1 bok bok 328 Jun 15 01:21 Ceil.abi -rw-rw-r-- 1 bok bok 156 Jun 15 01:21 Ceil.bin -rw-rw-r-- 1 bok bok 22 Jun 15 01:21 Ceil.docdev -rw-rw-r-- 1 bok bok 22 Jun 15 01:21 Ceil.docuser
以下是 /tmp/solc067035811 目錄中文件的內容:
user@Kumquat:~/TestSolc$ cat /tmp/solc067035811/Ceil.abi [{"constant":false,"inputs":[{"name":"a","type":"uint256"}, {"name":"m","type":"uint256"}],"name":"ceil1","outputs": [{"name":"","type":"uint256"}],"type":"function"}, {"constant":true,"inputs":[{"name":"a","type":"uint256"}, {"name":"m","type":"uint256"}],"name":"ceil","outputs": [{"name":"","type":"uint256"}],"type":"function"}] user@Kumquat:~/TestSolc$ cat /tmp/solc067035811/Ceil.bin 6060604052603e8060106000396000f3606060405260e060020a600035046314bdae22811460245780638587be6e146024575b005b602435600435810160001901819004026060908152602090f3 user@Kumquat:~/TestSolc$ cat /tmp/solc067035811/Ceil.docdev { "methods" : {} } user@Kumquat:~/TestSolc$ cat /tmp/solc067035811/Ceil.docuser { "methods" : {} }
如果您可以
solc
從命令行重現類似的結果,則問題很可能不在您的 Solidity 編譯器中。您將不得不繼續尋找原因。