Schreibfunktionen im Smart Contract nicht möglich - ungültige Adresse?

Ich habe den folgenden einfachen Smart Contract ...

contract SimpleStorage {
    uint storedData;
    function set(uint x) {
        storedData = x;
    }
    function get() constant returns (uint retVal) {
        return storedData;
    }
}

Welches ich mit dem folgenden Code in der Geth-Konsole bereitstelle ...

var source = "contract SimpleStorage...[code here]"
var compiled = web3.eth.compile.solidity(source)
var contract = web3.eth.contract(compiled.Coin.info.abiDefinition)
var storage = contract.new({from:web3.eth.accounts[0], data: compiled.SimpleStorage.code, gas: 300000})

Nachdem der Vertrag geschürft wurde, kann ich über das Speicherobjekt auf die Vertragsfunktionen zugreifen. Ich dachte, ich könnte einfach anrufen...

storage.set(10)

...um die Variable savedData zu setzen. Jedes Mal, wenn ich dies versuche, erhalte ich jedoch die Fehlermeldung „Ungültige Adresse“.

Ich bin mir sicher, dass dies daran liegt, dass ich versuche, einen Schreibvorgang für den internen Zustand des Vertrags durchzuführen (Lesevorgänge funktionieren einwandfrei).

Ich muss eine Transaktion einreichen, die den neuen Vertragsstatus nutzt, aber ich kann nicht herausfinden, wie das geht.

Wie kann ich Schreibtransaktionen in Smart Contracts durchführen?

Antworten (1)

Einstellung versuchen

web3.eth.defaultAccount = eth.accounts[0]

Es hört sich so an, als ob Ihre Transaktion nicht weiß, welches Konto zum Signieren des Anrufs verwendet werden soll. Jeder Aufruf, der den Vertragsstatus ändert (Schreibvorgang), erfordert eine signierte Transaktion.

Ein alternativer Ansatz wäre, ein "Transaktionsobjekt" als letztes Argument an die Contract-Methode zu übergeben:

storage.set(10,{from: accounts[0]});

Bearbeiten 1:

Als ich das „Von“-Konto auswählte, erhielt ich die folgende Fehlermeldung: „Authentifizierung erforderlich: Passwort oder Entsperren“. Also musste ich personal.unlockAccount(eth.accounts[0],"password",15000) ausführen. Sie können darüber unter „Authentifizierung erforderlich: Passwort oder Entsperren“ nachlesen. Fehler beim Versuch, die Smart-Contract-Methode über web3 aufzurufen .

Ich wusste, dass es einfach sein würde! Wie würde ich dies tun, ohne das defaultAccount festzulegen? Zum Beispiel, wenn ich mehrere Konten auf derselben Geth-Instanz verwende?
Sie können die Ergebnisse aufrufen web3.accountsund in einem Array speichern. Greifen Sie dann auf das Array für das spezifische Konto zu. Wenn Sie eine Methode aufrufen, die eine Transaktion ausführt und ein Konto benötigt, übergeben Sie ein Objekt, das Folgendes enthält from:storage.set(10,{from: accounts[1]});
Das ist genau das, wonach ich gesucht habe. So einfach! Wenn die Funktion mehrere Parameter hat, ist es nur... storage.set(a,b,c,d,{from: eth.accounts[0]})?
Ja. Siehe die web3.js-API-Dokumentation: github.com/ethereum/wiki/wiki/… Beachten Sie das transactionObject. Dies können Sie als letztes Argument an Ihren Vertragsaufruf übergeben
und wie erhalte ich die txID des Ergebnisses?
web3.eth.defaultAccount = accounts[0]sollte seineth.defaultAccount = eth.accounts[0]
Das hat auch bei mir funktioniert. Ich möchte nur mitteilen, wie ich meinen Aufruf geändert habe, um eine Antwort basierend auf den obigen Kommentaren in web3.js auf dem Mac-Terminal zu erhalten: Ursprünglicher Aufruf: contractInstance.getStep() . Neuer Aufruf: contractInstance.getStep({from: web3.eth.accounts[0]}).