Cómo cargar el archivo fuente de Solidity en geth

¿Es posible cargar el archivo de origen de Solidity en un .solarchivo go-ethereum.

Estoy usando el método 'loadScript' al guardar un .jsarchivo como el siguiente y cargarlo.

source = "contract test {\n" +
"   /// @notice will multiply `a` by 7.\n" +
"   function multiply(uint a) returns(uint d) {\n" +
"      return a * 7;\n" +
"   }\n" +
"} ";

¿Hay alguna forma mejor? no quiero usarbrowser-solidity

Respuestas (2)

Encontré este envoltorio Ruby de Solidity Compile Helper

Uso

solc_helper contract.sol

Esto generará un archivo javascript e imprimirá una declaración como la siguiente.

loadScript('/path/contract.js')

Pegue esta declaración en la consola geth. Su código se cargará y su contrato se implementará automáticamente.

También hay algunas funciones auxiliares para implementar fácilmente los contratos.

Actualización 3 de enero de 2017

Tenga en cuenta que el compilador de Solidity 4.7 crea un código diferente para el mismo contrato cuando tiene espacios en blanco diferentes. Esto será importante cuando intente agregar fuentes verificadas en los exploradores de blockchain, ya que la fuente compilada deberá coincidir con el código implementado. Es posible que desee considerar implementar sus contratos en Mainnet o Testnet blockchain utilizando Browser Solidity o Ethereum Wallet / Mist, en lugar de usar la gethlínea de comando.

Desde el enlace de arriba:

pragma solidity ^0.4.7; contract Test { }  

produce:

6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a7230582083d1e44aa5fc6707310b1b2f2f853c4fe7a55c7d9d7f5fd00699d97527c4fe4a0029

Y

pragma solidity ^0.4.7; contract Test {}  

produce:

6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a723058204687f46477038e9c93d271aa664f966bf84275743951a45d1f7b801daafe15ae0029

Esto es debido a:

Creo que estos 32 bytes adicionales son el hash Swarm del archivo de metadatos que genera Solidity. Consulte las notas de la versión 0.4.7 . Los comentarios del código explican lo que está pasando.

Estoy de acuerdo en que es un comportamiento inesperado para los cambios de espacios en blanco, pero tenga en cuenta que está destinado a ayudar con la verificación del código fuente, no a obstaculizarlo (consulte los comentarios en el código en uso para la verificación del código fuente ).



Usando Linux (también funcionará en Cygwin), he creado un script Perl simple para eliminar el CRLF y comprimir espacios que guardo como $HOME/bin/stripCrLf:

#!/usr/bin/perl
while (<>) {
  chomp;           # Remove newline
  s#/\*.*?\*/##sg; # Remove multiline comments
  s/\/\/.*$//go;   # Remove // comments
  s/\s+/ /go;      # Collapse space
  print;
}
print "\n";

Deberá ejecutar el siguiente comando para que el comando sea ejecutable:

chmod 700 $HOME/bin/stripCrLf

Guardé el siguiente código que tomé prestado de https://gist.github.com/alexvandesande/259b4ffb581493ec0a1c en random.sol.

contract random {
    /* Generates a random number from 0 to 100 based on the last block hash */
    function randomGen(uint seed) constant returns (uint randomNumber) {
        return(uint(sha3(block.blockhash(block.number-1), seed ))%100);
    }

    /* generates a number from 0 to 2^n based on the last n blocks */
    function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) {
        uint n = 0;
        for (uint i = 0; i < size; i++){
            if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0)
                n += 2**i;
        }
        return n;
    }
}

Luego puedo ejecutar el siguiente comando en una terminal de Linux:

beefee@Kumquat:~$ echo "var randomSource='`stripCrLf random.sol`'"
var randomSource='contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}'

Luego hago triple clic en la línea de salida y la pego en la línea de comando geth:

> var randomSource='contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}'
undefined
> randomSource
"contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}"
> I0309 08:26:32.300483 miner/worker.go:349] 🔨 Mined block (#53 / 7892a72e). Wait 5 blocks for confirmation
> var randomCompiled = web3.eth.compile.solidity(randomSource)
I0309 08:31:53.168772 miner/worker.go:570] commit new work on block 76 with 0 txs & 0 uncles. Took 262.261µs
...
> randomCompiled
{
  random: {
    code: "0x606060405260978060106000396000f3606060405260e060020a600035046341fa487681146024578063434b14e714606b575b005b6085600435602435600080805b83811015608f574381900360001901406060908152608086905260409020600290068314156064578060020a8201915081505b6001016031565b436000190140606090815260043560805260409020606490065b6060908152602090f35b50939250505056",
    info: {
      abiDefinition: [{...}, {...}],
      compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc030529307",
      compilerVersion: "0.2.2",
      developerDoc: {
        methods: {}
      },
      language: "Solidity",
      languageVersion: "0.2.2",
      source: "contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}",
      userDoc: {
        methods: {}
      }
    }
  }
}

Usando este método, puedo editar el código fuente en una terminal, stripCrLf y copiar la información resultante en otra terminal y pegar y ejecutar en geth en una tercera terminal.

Lamento decirlo, pero esto es más complicado que mi solución actual.
Si hay una nueva línea entre /**/ parece que no elimina los comentarios. Tenemos que hacer algo así: stackoverflow.com/a/911583/2402577@BokkyPooBah