Stellen Sie den Vertrag (von Truffle kompiliert) bereit, ohne Truffle zu verwenden

Ein Vertrag SimpleStorage.solwurde 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 TruffleContractObjekt 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 onDeployButtonClickerhalte 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
simpleStorage.new().then(instance => {...})Siehe Dokumente zur neuen Methode
@LibertyLocked Ausprobiert, aber eine Fehlermeldung erhalten. Irgendwelche Ideen? Ich laufe weiter testrpc. Originalbeitrag aktualisiert
Wenn Ihnen auf testrpc das Gas ausgeht, geben Sie ihm einfach mehr Gas
@LibertyLocked Hat endlich funktioniert, als ich Gas auf eingestellt habe 200000. Gibt es eine Möglichkeit abzuschätzen, wie viel Gas benötigt wird? Gibt es eine automatische Option zum Einstellen des Gases?
Es schätzt das Gas automatisch, aber ich vermute, dass es sich um einen Fehler in testrpc handeln könnte. Es funktioniert normalerweise gut in Geth, ohne Gas anzugeben.

Antworten (2)

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.

Auf testrpc wird die Adresse des neu bereitgestellten Vertrags sofort zurückgegeben. Wird es im Mainnet/Testnet länger dauern?
Ja, da Sie warten müssen, bis der TX abgebaut ist.
Ist es möglich, den Transaktionshash dieser Vertragserstellung zu erhalten?
instance.transactionHashgibt Ihnen den Hash der Vertragserstellung tx

Der 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);
  }
Du hast meine nächste Frage beantwortet! Danke, dass du mir das Fabrikmuster in smart contrats vorgestellt hast!