Cómo usar Trufa con Solidity 0.4

Solo traté de configurar un proyecto de trufas y traté de compilar un contrato que ya había escrito.

Cuando lo hago me sale el siguiente mensaje de error:

/usr/lib/node_modules/truffle/node_modules/solidity-parser/index.js:39
      throw e;
      ^
SyntaxError: Expected "contract", "import", "library", comment, end of input, end of line or whitespace but "p" found. Line: 1, Column: 1
    at peg$buildException (/usr/lib/node_modules/truffle/node_modules/solidity-parser/build/imports_parser.js:423:14)
    at Object.peg$parse [as parse] (/usr/lib/node_modules/truffle/node_modules/solidity-parser/build/imports_parser.js:3355:13)
    at Object.module.exports.parse (/usr/lib/node_modules/truffle/node_modules/solidity-parser/index.js:34:23)
    at /usr/lib/node_modules/truffle/lib/profiler.js:134:36
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3)

La primera línea de la que se queja el compilador es:

pragma solidity ^0.4.0;

Hasta donde yo sé, no hay forma de que pueda dejar salir esa línea. ¿Hay alguna solución que me permita usar Truffle con la versión más reciente de solidity?

Gracias de antemano.

¿Cuál es tu contrato? Ayudaría si pudieras publicarlo aquí.
Creo que funcionará sin esa línea de pragma, intente una vez sin esa línea.
No funciona sin él. Si uso Solidity 0.4, el compilador se queja de _;
¿Qué solc --versionda? Si uso v0.3.6, obtengo el mismo error en la pragmalínea.
Mi solc todavía era 0.3 pero ahora lo actualicé a la versión: 0.4.1-develop.2016.09.09+commit.79867f4.Linux.g++ y sigo teniendo el mismo error

Respuestas (4)

Acabo de agregar support solidity 0.4.x y lancé una nueva versión de Truffle. Puede leer el anuncio aquí: https://www.reddit.com/r/ethereum/comments/574rvr/truffle_v210_now_with_solc_04x_support/

¡Salud!

Tuve el mismo problema, así que pregunté en el canal Gitter de Truffle, y esta es la respuesta que recibí:

Truffle no admitirá solc 0.4.x hasta que se lance Truffle 3.0, ya que se requieren cambios significativos en Truffle.

¡Espero que esto ayude!

No puedo saber sin el código de contexto, pero apostaría a que esto está en un modificador de función y la línea de arriba es _.

En Solidity >= 0.4, el _debe tener un punto y coma después.

es decir_;

También debe agregar la línea pragma sugerida en la parte superior de sus archivos, solo para que deje de quejarse.

Consulte las notas de la versión para obtener más información.

Exactamente ese es el problema. Mi código está escrito en Solidity 0.4 y tengo el _; en los modificadores. El compilador se queja de que mi código comienza con "pragma" y no con "contrato" o "biblioteca"
Ah, claro. Creo que Truffle solo compila usando su solc local, así que mientras esté actualizado, no sé por qué se quejaría.
Como ya mencioné anteriormente: Mi solc todavía era 0.3 pero ahora lo actualicé a la Versión: 0.4.1-develop.2016.09.09+commit.79867f4.Linux.g++ y sigo teniendo el mismo error

EDITAR: La solución de trabajo más corta es usar Browser Solidity ( https://ethereum.github.io/browser-solidity/ ) y simplemente decirle que use Solidity 0.3.6, luego las cosas volverán a funcionar en truffle.

Estoy luchando con el mismo problema y, finalmente , hay una solución alternativa: aún no lo he probado:

  1. compile e implemente su contrato "de la manera difícil" a través de solidity y geth.
  2. ejecutar truffle migratey truffle builden su proyecto de trufas sin el pragma solidity ^0.4.0;en su contrato
  3. tome la dirección de su contrato "implementado manualmente", abra app.js creado por truffle en /build/app.js, busque Contract.all_networksy cambie la dirección a la de su contrato implementado manualmente.

De esta manera, podría engañar a su compilación de trufas para usar el contrato previamente bien compilado. Absolutamente ninguna garantía, tal vez alguien con una comprensión más profunda de todo esto pueda decir, si esto es completamente absurdo o una solución viable.

PD: compilar e implementar de la manera difícil: 1. $ sudo apt-get install -y solc2. Elimine todos los saltos de línea de su código de contrato (las herramientas en línea pueden ayudar) 3. En geth: > var myContractSource = *paste contract source without linebreaks here*4. > var myContractCompiled = eth.compile.solidity(myContractSource)5. > var myContract = eth.contract(myContractCompiled.theContractNameInTheSolidityCode.info.abiDefinition);6. de nuevo sin saltos de línea y con la minería activada:

var myContractTransaction = myContract.new({
    from: eth.coinbase, 
    data: myContractCompiled.theContractNameInTheSolidityCode.code, 
    value: 1000000000000000000,
    gas: 1000000
  },
  function(err, contract) {
      if (err) {
        console.error(err); 
      } else {
        console.log(contract); 
        console.log(contract.address);
      }
});

la última dirección devuelta es la dirección de su contrato.

PPS: Nuevamente, no estoy seguro, pero tal vez a medida app.jstambién deba reemplazar unlinked_binary(bajo contract.all_networks) con lo que encuentra code:cuando hace solo > myContractCompileden geth después de definir esta var. esos valores me parecen de alguna manera relacionados con la identificación de contratos.

Espero poder ser de ayuda. Esperemos la actualización de trufa..