Wie können wir den Zustandswert einer Variablen aus der vorherigen Blocknummer mit web3 erhalten

Ich habe eine private Kette und betreibe einen eigenen Archivierungsknoten. Der mit --fast cache=1024Option verbundene Knoten.

Zum Beispiel habe ich eine festgelegte Funktion in meinem Smart Contract.

contract smartContract {
    uint  value;
    function set(uint input) returns (bool success) {
         value = input;
    }
    function getValue() public view
     returns (uint)
    {
        return value;
    } 

}

Diese Funktion wird bei Blocknummer 100 und 200 aufgerufen.

smartContract.set(10) //deployed at block number 100
smartContract.set(20) //deployed at block number 200

An dieser Stelle. Wenn unsere Blockchain, wie wir wissen, synchronisiert ist, gibt sie beim Aufruf smartContract.get()20 zurück.

Hier wird erwähnt, dass Smart Contact nur den aktuellen Status sehen kann.

Ein Vertrag kann nur den aktuellen Status sehen, wenn er ausgeführt wird, nicht frühere Status. Durch diese Einschränkung können Validierungsknoten nur mit dem aktuellen Status arbeiten, anstatt alle vorherigen Status speichern und darauf zugreifen zu können.

Hier können wir frühere Blockdaten abrufen. Da wir vorherige Blockdaten erhalten können, könnten wir die vorherigen Zustände erhalten.

[F] Könnte web3 den Status eines Werts aus früheren Blocknummern abrufen, anstatt den neuesten Statuswert zurückzugeben?

Wenn wir die Blocknummer wie 100, smartContract.get() at 100; irgendwie kann web3 valueden Wert bei Blocknummer 100 statt bei zurückgeben latest?

Wie? Ich konnte das spezifische Beispiel auf dem von Ihnen freigegebenen Link nicht finden. Wie wäre es mit web3.py? @Henk
Eine Alternative könnte darin bestehen, ein Ereignis auszulösen, wenn sich die Zustandsvariable ändert.
Das ist möglich, aber ich möchte das Ereignis aus der Tabelle nehmen, da es bereits im Speicher gespeichert ist, und ich möchte kein zusätzliches Gas für das Ereignis verbrauchen. @ Jesse Busmann
@Alper Wenn Sie eine Abfrage machen , können Sie einen zusätzlichen Parameter mit der Blocknummer übergeben, der Standardwert ist „latest“, aber Sie können „pending“ oder eine explizite Blocknummer/Hash übergeben. Das Problem ist, dass Nicht-Archiv-Clients nur die neueren 256 Zustände haben, die Abfrage eines Blocks außerhalb dieses Bereichs wird einen Fehler zurückgeben.
Was bedeutet, dass ich den vorherigen Status von Variablen nicht über web3 erhalten kann und stattdessen meine einzige Option zur Verwendung von Ereignissen? @Ismael
@Alper Es ist nicht garantiert, dass Sie alte Zustände abrufen, es sei denn, Sie betreiben einen eigenen Archivierungsknoten oder Sie speichern alle Änderungen explizit in Ihrem Vertragsspeicher.
Wie kann ich das erreichen, wenn ich meinen eigenen archivierten Knoten betreibe? @Ismael

Antworten (1)

[F] Könnte web3 den Status eines Werts aus vorherigen Blocknummern abrufen, anstatt den neuesten Statuswert zurückzugeben?

Ja, in web3.py v4.0+.

Bei einem Vertragsanruf können Sie eine Blocknummer (oder einen Hash) angeben. Diese Beispiele stammen aus der web3.py-Dokumentation :

# You can call your contract method at a block number:
>>> token_contract.functions.myBalance().call(block_identifier=10)

# or a number of blocks back from pending,
# in this case, the block just before the latest block:
>>> token_contract.functions.myBalance().call(block_identifier=-2)

# or a block hash:
>>> token_contract.functions.myBalance().call(block_identifier='0x4ff4a38b278ab49f7739d3a4ed4e12714386a9fdf72192f2e8f7da7822f10b4d')
>>> token_contract.functions.myBalance().call(block_identifier=b'O\xf4\xa3\x8b\'\x8a\xb4\x9fw9\xd3\xa4\xedN\x12qC\x86\xa9\xfd\xf7!\x92\xf2\xe8\xf7\xdax"\xf1\x0bM')

# Latest is the default, so this is redundant:
>>> token_contract.functions.myBalance().call(block_identifier='latest')

# You can check the state after your pending transactions (if supported by your node):
>>> token_contract.functions.myBalance().call(block_identifier='pending')