Solidity está instalado pero no funciona dentro de geth, en Ubuntu 16.04

Salidas de la consola Geth después de 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

y

eth.getCompilers()
[]

Obtengo una matriz vacía en lugar de ['Solidity'].

Solidez instalada a través de:sudo apt-get install solc

salida para which solc: /usr/bin/solc(agregué esto a PATH)

He visto una pregunta similar , pero estoy usando la última versión (0.3.3) y todavía tengo el problema. ¿Me estoy perdiendo algo?

Respuestas (1)

El resultado vacío eth.getCompilers()es normal.

Puedes probar lo siguiente:

> 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: {}
      }
    }
  }
}

Si puede reproducir los resultados anteriores, la instalación de su compilador funciona correctamente.

(El código es de ¿Cuál es la forma más económica de redondear () o ceil () a múltiplos de 1000? ).

Además, obtengo los mismos resultados que usted al compilar una cadena vacía:

> 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



EDITAR 15/06/2016 - Respondiendo a@Matthias

P: Cuando dice que el resultado de getCompilers vacío es normal, ¿qué significa eso exactamente? ¿Qué hace que esta función devuelva algo o no?

R: No sé qué significa exactamente el []resultado eth.getCompilers(), pero cuando ejecuto los siguientes comandos en mi geth consolepantalla, los resultados son los que veo, y no tengo problemas para compilar el código de Solidity desde dentro geth. Solo estoy tratando de eliminar los diferentes puntos de error.

Esto es lo que veo:

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()
[]

La primera ejecución de getCompilers()produce algunos resultados de solc. Desde la línea de comando, si ejecuto solc --version, también obtengo la información de la versión.

user@Kumquat:~/TestSolc$ solc --version
solc, the solidity compiler commandline interface
Version: 0.3.4-0/RelWithDebInfo-Linux/g++/Interpreter

Si puede ver información similar a la que obtengo, se puede acceder a su compilador de Solidity desde geth.

Aquí hay una prueba adicional que puede probar si tiene problemas para compilar la fuente de Solidity desde dentro geth.

Guardé el siguiente código en 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;
    }
}

Ahora estoy compilando afuera gethusando los parámetros de la línea de comando en los ceilCompiledresultados anteriores:

user@Kumquat:~/TestSolc$ solc --bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc067035811 Ceil.sol 

Aquí está el contenido de mi directorio /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

Y aquí está el contenido de los archivos en el directorio /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" : {}
}

Si puede reproducir resultados similares ejecutándose solcdesde su línea de comando, lo más probable es que el problema no esté en su compilador de Solidity. Tendrás que seguir buscando la causa.

Gracias @BokkyPooBah. El compilador estaba funcionando bien. Solo quería saber si el resultado de eth,getCompilers() era diferente solo para mí.
Sin preocupaciones. Hubo un problema de falla de segmentación solcen otra pregunta , por lo que tuve la curiosidad de revisar su pregunta.
Me encuentro con el mismo problema que @varm. solccompila su fragmento de código muy bien en el cli (estoy recuperando la misma cadena binaria), pero tan pronto como cargo geth e intento compilar a través eth.compile.solidityde , obtengo solc: exit status 1; Unknown exception during compilation.Cuando dice que el resultado de getCompilers vacío es normal, ¿qué significa eso? significa exactamente? ¿Qué hace que esta función devuelva algo o no?
@Matthias, agregué más información para ayudarlo a tratar de resolver su solcproblema. Algunas posibilidades: solcno se puede crear el subdirectorio temporal; solcno se puede compilar correctamente con algunos de los parámetros de la línea de comandos --bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc067035811.
Gracias @BokkyPooBah: lo ejecuté con todos estos conmutadores y funciona bien en la línea de comandos. Estoy viendo todos los mismos resultados y archivos creados. Sin embargo, todavía no puedo ejecutar el compilador desde dentro de geth.
¿Tiene más de un solcejecutable instalado en su sistema? Puede usar el comando find / -name 'solc'en Linux o OS/X.