Abrufen des letzten Zustands eines bestimmten Assets für ein bestimmtes Datum

Ich habe einen Smart Contract, in dem ich die unten erwähnte Maschinen-ID und Benutzer-ID zuordne:

mapping(bytes32 => uint256) public machineAllocs;
machineAllocs[machineId] = userId;

Jetzt weise ich einer Maschinen-ID eine Benutzer-ID zu, und auch die Benutzer-ID kann für dieselbe Maschinen-ID geändert werden. Wenn ich also wissen möchte, dass an einem bestimmten Datum der letzte Status (z. B. 23:59 Uhr) einer bestimmten Maschinen-ID vorliegt, bedeutet dies, welche letzte Benutzer-ID dieser Maschinen-ID zugeordnet ist.

Also, wie kann man diese Details abrufen?

Möchten Sie einen Smart Contract, um die Details abzurufen, oder eine Anwendung außerhalb der Blockchain, wie web3?
Ja, ich möchte es von web3 abrufen. Und wenn es eine Option in Solidität gibt, dann ist es auch ok für mich. Aber ist das mit web3 bcoz möglich? Ich hole bereits die Vergangenheit aus dem Ereignisobjekt. Aber jetzt möchte ich eine genauere Geschichte, wie ich in meiner Frage erwähnt habe.
Weißt du, wie man das mit web3 macht?

Antworten (2)

Um auf diese Verlaufsdetails in Solidity zuzugreifen, müssten Sie jede Mutation speichern, da Smart Contracts nur den aktuellen Zustand der Blockchain sehen können.

Um die Informationen von außerhalb der Blockchain mit beispielsweise web3 zu erhalten, sollten Sie Ihren Smart Contract jedes Mal ein Ereignis protokollieren lassen, wenn eine Mutation von machineAllocsauftritt.

Schauen Sie sich dieses Beispiel an:

pragma solidity ^0.4.22;

contract MachineMapping {

    mapping(bytes32 => uint256) public machineAllocs;


    function setMachineUserId(bytes32 _machineId, uint256 _userId) {
        emit MachineUserIdSet(_machineId, machineAllocs[_machineId], _userId);
        machineAllocs[_machineId] = _userId;
    }

    event MachineUserIdSet(bytes32 indexed machineId, uint256 oldUserId, uint256 newUserId);
}

Wenn Sie nun jede Mutation für eine bestimmte Maschinen-ID nachschlagen möchten, können Sie verwenden, web3.eth.filter.getum alle MachineUserIdSetEreignisse in Bezug auf Ihren Vertrag und die Maschinen-ID protokolliert zu bekommen.

Sehen Sie sich diese Antwort an, um zu sehen, wie . Viel Glück!

Gemäß Ihrer Antwort hatte ich diesen Code bereits erstellt. Erstellt ein Ereignis und ruft es in meinem js wie unten erwähnt auf: var machineHistoryEvent = contractInstance.Transferred({}, {fromBlock: 0, toBlock: 'latest'}).get((error, result) => { var blockNumber = JSON .stringify(result[i].blockNumber); } Aber jetzt habe ich viele Benutzer-IDs einer bestimmten Maschinen-ID zugewiesen und möchte den letzten Zustand der Maschinen-ID erhalten. Bedeutet, was die letzte Benutzer-ID war, die der Maschinen-ID zugeordnet wurde, also wie es zu tun ?

Beim callAufruf einer viewFunktion aus web3 können Sie die Blocknummer angeben, bei der Sie den Aufruf auswerten möchten.

Ihre Aufgabe kann also in zwei Schritte zerlegt werden:

  1. Suchen Sie die Blocknummer, die dem Zeitstempel entspricht, an dem Sie interessiert sind. (Sie könnten eine binäre Suche durchführen, web3.eth.getBlock()bis Sie den richtigen Zeitstempel gefunden haben, obwohl Sie es besser machen könnten, indem Sie eine intelligente Anfangsschätzung basierend auf ungefähr 10-15 Sekunden machen pro Block.)
  2. Rufen Sie Ihre Funktion auf und geben Sie diese Blocknummer an. ZB in web3.js 0.2xx: contract.machineAllocs(x, blockNumber).
Aber in diesem Fall, wenn wir genauer werden, wenn ich das Datum als 24. April übergebe, gibt es mir die Ergebnisse aller Maschinen-IDs, nehmen wir die Zeit als 23:59 Uhr. Also, wie geht das, bcoz haben wir keine Eingabe der Blocknummer für 23:59 Uhr.
Darum geht es bei Punkt 1 meiner Antwort. Gab es da etwas, das Sie nicht verstanden haben?
Aber wenn ich einen Zeitstempel eingebe, der nicht im Block vorhanden ist, wie kann ich dann den Status abrufen?
Wenn Sie nach dem Wert zum Zeitpunkt X suchen, suchen Sie nach dem Block mit dem höchsten Zeitstempel kleiner oder gleich X.
ok, das heißt, ist es möglich, den höchsten Zeitstempel aus den Blöcken zu holen, oder?
Ich weiß nicht, was du meinst. Jeder Block hat genau einen zugeordneten Zeitstempel, und Sie können sehen, was dieser Zeitstempel ist.
Ja, das weiß ich. Und ich bekomme auch einen Zeitstempel in meinem Code. Aber wie finde ich den höchsten Zeitstempel für eine bestimmte Maschinen-ID aus dem Block, bei dem ich gerade hängengeblieben bin?
Vielleicht brauchen wir dafür eine Logik wie Find Maximum Number from Many Number. Diese Logik muss ich verwenden, um den höchsten Zeitstempel für eine bestimmte Maschinen-ID für ein bestimmtes Datum zu finden.
Ich habe keine Ahnung, wovon du sprichst. machineAllocs[xyz]Was ich dachte, Sie fragen: "Wie kann ich den Wert von zu einem bestimmten Zeitstempel herausfinden ?" Wenn Sie etwas anderes fragen, erklären Sie es bitte.
Nein, Sie haben den richtigen Punkt.var blockNumber = JSON.stringify(result[i].blockNumber); var blockCreationTime = web3.eth.getBlock(blockNumber).timestamp; Ich habe dies bis jetzt getan. Aber die Frage ist: Für eine bestimmte Maschinen-ID muss ich den höchsten Zeitstempelblock an diesem bestimmten Tag finden, richtig?
"Für eine bestimmte Maschinen-ID" ... Nein, richtig? Wenn Sie einen Wert am 24. April um 23:59 Uhr wissen möchten, müssen Sie den Block mit dem höchsten Zeitstempel vor dem 24. April um 23:59 Uhr finden. Welcher Block das ist, hat nichts damit zu tun, welche Maschinen-ID Sie überprüfen werden.
Auch hier können Sie einfach eine binäre Suche durch die Blöcke durchführen, bis Sie den richtigen finden. Ich weiß nicht, wie ich klarer antworten soll; Ich glaube, ich wiederhole nur immer wieder dasselbe.