¿Cómo genera solc el bytecode para un contrato?

Me cansé de usar remix y copiar y pegar mi texto de implementación web3, así que estoy tratando de escribir un script de python que generará esta prueba de implementación para mí. Sin embargo, uno de los campos en el código de creación de instancias es data, y contiene una representación de código de bytes del contrato. ¿Cómo puedo generar este código de bytes también? No puedo usar py-solc por alguna razón (cuando escribo desde solc import * obtengo un error ModuleNotFound), así que si pudiera recrear este código de bytes manualmente, sería increíble.

Aquí hay un ejemplo de lo que estoy tratando de hacer:

para el contrato inteligente "Storage.sol" a continuación:

pragma solidity ^0.4.0;

contract Storage {
    uint storedData;
    address lastSetter;
    function set(uint x) public {
        storedData = x;
        lastSetter = msg.sender;
    }

    function get() public constant returns (uint) {
        return storedData;
    }

    function getLastSetter() public constant returns (address) {
      return lastSetter;
    }
}

Remix genera esta implementación web3:

var storageContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getLastSetter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]);
var storage = storageContract.new(
   {
     from: web3.eth.accounts[0], 
     data: * long hex number *, 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

Mi script puede hacer esto:

var storageContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[],"payable":false,"stateMutability":"type":"function"},{"constant":true,"inputs":[],"name":"getLastSetter","outputs":[],"payable":false,"stateMutability":"type":"function"},])
var storage = storageContract.new(
    {
        from: web3.eth.accounts[0],
        data: '',
        gas: '470000'
    }, function(e, contract){
        console.log(e, contract);
        if (typeof contract.address != 'undefined') {
          console.log('Contract successfully mined. address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
})

(todavía averiguando la mutabilidad del estado (¿qué es eso?) y el análisis de salida también, pero esa es una pregunta para otro día)

Para resumir, estoy tratando de escribir un script de Python que va desde la solidez hasta el remix de texto 'web3 deployment' que genera. ¿Cómo puedo generar el campo de código de bytes requerido?

Editar: mordí la bala y abordé mi instalación de py-solc nuevamente. Lo hizo bien esta vez; Accidentalmente estaba instalando usando pip2.x en lugar de pip3.x. Todavía me gustaría saber cómo py-solc genera el código de bytes, pero el proyecto funciona. Gracias a todos por su ayuda

Debe usar un marco como populus o truffle para automatizar la implementación.
@Ismael, podría hacer eso, pero ¿cómo podría hacer que esta herramienta funcione? Estaba usando truffle, pero encontré que el proceso de prueba e implementación era engorroso y lento, mientras que ser capaz de crear un texto web3 desplegable y ponerlo en geth haría las cosas más rápidas para mí.

Respuestas (1)

Debe usar el compilador de Solidity (solc) para compilar su código de Solidity en bytecode. Si no puede usar Remix o py-solc, puede intentar simplemente instalarlo solcdirectamente y pagarlo. Pero recomendaría averiguar qué salió mal en su py-solcinstalación. Lo uso py-solcy lo encuentro bastante fácil de usar.

EDITAR

La ABI (la parte que incluye "stateMutability") también será emitida por el compilador de Solidity.

¡Gracias! Voy a investigar lo que pasó. Recibí un error de ModuleNotFound, así que probablemente no lo instalé en el lugar correcto