SimpleStorage.sol
Truffle 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 TruffleContract
objeto?
¿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 onDeployButtonClick
se 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
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.
instance.transactionHash
le da el hash de la creación del contrato txLa 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);
}
libertad bloqueada
simpleStorage.new().then(instance => {...})
Ver documentos sobre el nuevo métodonyxynyx
testrpc
corriendo Publicación original actualizadalibertad bloqueada
nyxynyx
200000
. ¿Hay alguna manera de estimar cuánto gas se necesita? ¿Hay una opción automática para configurar el gas?libertad bloqueada