Rufen Sie die Schreibfunktion auf, die den Vertragswert nicht ändert

Ich bin neu in Smart Contracts und stehe vor einem Problem. Nachdem ich den Vertrag in meinem lokalen Blockchain-Testnetzwerk bereitgestellt habe, versuche ich, den neuen Wert über den Setter festzulegen, danach rufe ich die Vertragsmethode auf und gebe den alten Wert zurück.

Das ist mein Vertrag,

pragma solidity ^0.4.10;

contract Storage {
    uint256 storedData;

    function set(uint256 data) {
        storedData = data;
    }

    function get() constant returns (uint256) {
        return storedData;
    }
}

Welche Schritte habe ich gemacht:

  1. Stellen Sie den Vertrag über web3j in Java-Code bereit. Nach der Bereitstellung sehe ich die Adresse meines Vertrags, sodass er bereitgestellt wird
  2. Danach erstellen Sie in der Geth-Konsole die Variable abi: var abi = [{"constant":false,"inputs":[{"name":"data","type":"uint256"}],"name":"set ","outputs":[],"payable":false,"statemutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name": "get","outputs":[{"name":"","type":"uint256"}],"payable":false,"statemutability":"view","type":"function"}] ;
  3. Vertrag laden: var storage = eth.contract(abi)
  4. Vertrag per Adresse laden: var contractInstance = storage.at("0x45564fe8d90e542f3f896dd43b374210bc109299");
  5. Versuchen Sie, die Methode get() aufzurufen: var result = contractInstance.get(); es ist Ausgang 0
  6. Versuchen Sie dann, einen neuen Wert festzulegen: var result = contractInstance.set(566); After that I see something like this: INFO [09-07|08:42:07] Submitted transaction fullhash=0x7110b3fdfc8005187ed367beb8275a6f4b926f4852f726784219a5a3aa9c8d9e recipient=0x45564fe8d90e542f3f896dd43b374210bc109299 "0x7110b3fdfc8005187ed367beb8275a6f4b926f4852f726784219a5a3aa9c8d9e"
  7. Als nächstes beginne ich mit dem Mining: miner.start(), zu Beginn des Minings ein See-Log wie folgt: INFO [09-07|08:44:15] Commit new mining work number=38 txs=1 uncles=0 elapsed=1.044 ms INFO [09-07|08:44:15] Neue Blocknummer erfolgreich versiegelt = 38 Hash = e62548…39ad89 INFO [09-07|08:44:15] 🔗 Block hat kanonische Kettennummer erreicht = 33 Hash = 9a6ae1…9cb82d INFO [09-07|08:44:15] 🔨 abgebauter potenzieller Block Nummer = 38 Hash = e62548…39ad89 INFO [09-07 | 08:44:15] Commit für neue Mining-Arbeit Nummer = 39 txs = 0 Onkel = 0 abgelaufen =182,5µs INFO [09-07|08:44:15] Neue Blocknummer erfolgreich versiegelt=39 Hash=87b682…f52e39 INFO [09-07|08:44:15] 🔗 Block hat kanonische Kettennummer=34 Hash=cc9a2d erreicht …36838a INFO [09-07|08:44:15] 🔨 abgebaute potenzielle Blocknummer=39 Hash=87b682…f52e39 INFO [09-07|08:44:15] Mining zu weit in der Zukunft warten=2s
  8. Dann höre ich mit dem Mining auf: miner.stop() 9. Dann rufe contractInstance.get() auf: und sehe denselben Wert 0

Ich bin verwirrt (Danke an alle für die Hilfe!

Ihr Code ist korrekt, und ich teste, dass alles in Ordnung ist. Bestätigen Sie, dass Mining erfolgreich ist?
@BinGoBinBin Ich denke ja. Dort ist mein Log, wenn ich mit dem Mining beginne. Mining-Betrieb starten INFO [09-06|18:10:01] Neue Mining-Arbeit übernehmen Zahl=1400 txs=6 Uncles=0 verstrichen=1.092ms INFO [09-06|18:10:01] Neuer Block erfolgreich versiegelt Zahl= 1400 Hash=8cd59b…0bb28c INFO [09-06|18:10:01] 🔗 Block hat kanonische Kettennummer erreicht=1395 Hash=81696a…5fc7fa INFO [09-06|18:10:01] 🔨abgebaute potenzielle Blocknummer=1400 hash=8cd59b…0bb28c
Können Sie die genaue Art und Weise hinzufügen, wie Sie diese Funktionen über web3 aufrufen? Außerdem sollten Sie zwischen miner.start() und dem Aufruf dieser Funktionen so etwas wie „Transaktion zum Pool hinzugefügt“ sehen. Können Sie bestätigen, dass Sie so etwas sehen?
@ wtk219 Ich aktualisiere meine Frage und gebe detailliertere Schritte an, die ich getan habe.
Versuchen Sie, storedDataeinen Standardwert anzugeben, bevor Sie versuchen, ihn zu ändern, der Ihnen sagt, ob Ihr Problem das Lesen oder das Schreiben ist.
@EdmundEdgar hat den Standardwert hinzugefügt, es gibt immer noch 0 zurück , ich denke, Probleme liegen in der web3j-Bibliothek, es scheint, als wäre es falsch, Wrapper für Smart Contract zu erstellen
@EdmundEdgar Ich ändere sogar die Funktion get, dass sie Literal (256) zurückgibt, aber es gibt immer noch 0 zurück, vielleicht ist es ein Fehler in der Vertragsversion oder ein kniffliges Problem, ich bin wirklich verwirrt
Allgemeine Hinweise: 1. Aktuelle Solidity-Version verwenden, 2. Funktion nicht vergessen constructor().

Antworten (1)

Verwenden Sie die folgenden Befehle:

storage.get.call() 0 storage.set.sendTransaction(42, {from: eth.accounts[0], gas: 1000000}) "0x7a54ab329fcbf551432eb78c4b2a1ff48fc8b9f9aa23d94fa86330e5c1d711f3" storage.get.call() 42

Referenzlink: https://medium.com/@gus_tavo_guim/deploying-a-smart-contract-the-hard-way-8aae778d4f2a