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 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 solc
directamente y pagarlo. Pero recomendaría averiguar qué salió mal en su py-solc
instalación. Lo uso py-solc
y lo encuentro bastante fácil de usar.
EDITAR
La ABI (la parte que incluye "stateMutability") también será emitida por el compilador de Solidity.
ismael
steve