Contrato de implementación (compilado por Truffle) sin usar Truffle

SimpleStorage.solTruffle ha compilado un contrato usando truffle compile. Su artefacto se encuentra en build/contracts/SimpleStorage.json.

Sin embargo, este contrato solo debe implementarse en la red Ethereum cuando un usuario hace clic en un botón.

Al manejar el clic del botón, ¿qué se debe hacer para implementar el artefacto una vez que obtenga el TruffleContractobjeto?

¿Podemos obtener también el hash de la transacción y la dirección del contrato después de implementarlo?

import SimpleStorageContract from '../../../build/contracts/SimpleStorage.json';

onDeployButtonClick() {
    const contract = require('truffle-contract');
    const simpleStorage = contract(SimpleStorageContract);
    simpleStorage.setProvider(this.props.web3.currentProvider);

    // How to deploy this contract to the Ethereum network?
    // then get the TX hash and contract address
}

Probé este código entestrpc

onDeployButtonClick() {
    const contract = require('truffle-contract');
    const simpleStorage = contract(SimpleStorageContract);
    simpleStorage.setProvider(this.props.web3.currentProvider);

    this.props.web3.eth.getAccounts((error, accounts) => {
        simpleStorage.new([], {from: accounts[0]})
    })
}

pero en la consola JS, cuando onDeployButtonClickse activa, aparece un error

Uncaught (in promise) Error: VM Exception while processing transaction: out of gas
    at Object.InvalidResponse (errors.js:35)
    at requestmanager.js:86
    at XMLHttpRequest.r
simpleStorage.new().then(instance => {...})Ver documentos sobre el nuevo método
@LibertyLocked Lo probé, pero aparece un error... ¿alguna idea? estoy testrpccorriendo Publicación original actualizada
Si te quedas sin gasolina en testrpc, solo dale más gasolina
@LibertyLocked Finalmente funcionó cuando ajusté el gas a 200000. ¿Hay alguna manera de estimar cuánto gas se necesita? ¿Hay una opción automática para configurar el gas?
Hace una estimación automática del gas, pero supongo que podría ser un error en testrpc. Sin embargo, generalmente funciona bien en geth sin especificar gas.

Respuestas (2)

Con el contrato Truffle puedes hacerlo fácilmente con la fábrica que construiste a partir de la ABI.

const Contract = require('truffle-contract');
const SimpleStorage = Contract(SimpleStorageContract);
SimpleStorage.setProvider(this.props.web3.currentProvider);

// deploy from accounts[0]
SimpleStorage.new({from: this.props.web3.eth.accounts[0], gas: 6000000}).then(instance => {
    console.log(instance.address);
});

Ajuste el gas en consecuencia.

En testrpc, la dirección del contrato recién implementado regresa instantáneamente. ¿Tomará más tiempo en mainnet/testnet?
Sí, ya que tendrás que esperar a que se extraiga el TX.
¿Es posible obtener el hash de transacción de la creación de este contrato?
instance.transactionHashle da el hash de la creación del contrato tx

La mejor manera de lograr esto sería tener 2 contratos. Su contrato SimpleStorage, tal como es, y un contrato SimpleStorageFactory que usa el patrón Factory.

Implementaría el contrato de fábrica que tiene una función que se llama cuando hace clic en el botón. Esta función básicamente crea una nueva instancia del contrato SimpleStorage. Algo como esto:

function createSStorage() {
    SimpleStorage s = new SimpleStorage(); // You can pass other constructor parameters.

    //Store the SStorages created in either an array or mapping so you can later list them, for example.

    //Array of SStorages
    SimpleStorageArray.push(address(s));

    // Mapping of SStorages with address key
    SimpleStorageMapping[address(s)] = s;

    SStorageCreated(address(s),msg.sender);
  }
Respondiste mi siguiente pregunta! ¡Gracias por presentarme el patrón de fábrica en los contratos inteligentes!