Go-Ethereum

在 Ubuntu 16.04 上,Solidity 已安裝但無法在 geth 中執行

  • June 14, 2016

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 編譯器中。您將不得不繼續尋找原因。

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