Ein Vertrag SimpleStorage.sol
wurde von Truffle mit erstellt truffle compile
. Sein Artefakt befindet sich bei build/contracts/SimpleStorage.json
.
Dieser Vertrag sollte jedoch nur im Ethereum-Netzwerk bereitgestellt werden, wenn ein Benutzer auf eine Schaltfläche klickt.
Was sollte beim Umgang mit dem Schaltflächenklick getan werden, um das Artefakt bereitzustellen, sobald ich das TruffleContract
Objekt erhalten habe?
Können wir nach der Bereitstellung auch den Transaktionshash und die Vertragsadresse erhalten?
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
}
Habe diesen Code ausprobierttestrpc
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]})
})
}
aber in der JS-Konsole onDeployButtonClick
erhalte ich eine Fehlermeldung, wenn ausgelöst wird
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
Mit dem Truffle-Vertrag können Sie dies ganz einfach mit der Fabrik tun, die Sie aus dem ABI gebaut haben.
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);
});
Stellen Sie das Gas entsprechend ein.
instance.transactionHash
gibt Ihnen den Hash der Vertragserstellung txDer beste Weg, dies zu erreichen, wäre, 2 Verträge zu haben. Ihr SimpleStorage-Vertrag, so wie er ist, und ein SimpleStorageFactory-Vertrag, der das Factory-Muster verwendet.
Sie würden den Factory-Vertrag bereitstellen, der eine Funktion hat, die aufgerufen wird, wenn Sie auf die Schaltfläche klicken. Diese Funktion erstellt im Grunde eine neue Instanz des SimpleStorage-Vertrags. Etwas wie das:
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);
}
libertylocked
simpleStorage.new().then(instance => {...})
Siehe Dokumente zur neuen MethodeNyxynyx
testrpc
. Originalbeitrag aktualisiertlibertylocked
Nyxynyx
200000
. Gibt es eine Möglichkeit abzuschätzen, wie viel Gas benötigt wird? Gibt es eine automatische Option zum Einstellen des Gases?libertylocked