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?
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 machineAllocs
auftritt.
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.get
um alle MachineUserIdSet
Ereignisse 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!
Beim call
Aufruf einer view
Funktion 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:
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.)contract.machineAllocs(x, blockNumber)
.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.
Henk
Rija Soni
Rija Soni