Solidity
獲取特定日期特定資產的最後狀態
我有一份智能合約,其中我正在映射機器 id 和使用者 id,如下所述:
mapping(bytes32 => uint256) public machineAllocs; machineAllocs[machineId] = userId;
現在,我將使用者 ID 分配給機器 ID,並且使用者 ID 可以更改為相同的機器 ID。因此,如果我想知道在特定日期特定機器 ID 的最後狀態(讓我們晚上 11:59)是什麼,則意味著最後一個使用者 ID 與該機器 ID 映射。
那麼,如何獲取這些詳細資訊呢?
要在 Solidity 中訪問這些歷史詳細資訊,您必須儲存每個突變,因為智能合約只能看到區塊鏈的目前狀態。
要使案例如 web3 從區塊鏈外部獲取資訊,您應該讓您的智能合約在每次發生突變時記錄一個事件
machineAllocs
。看看這個例子:
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); }
現在,當您想要查找某個 machineId 的每個突變時,您可以使用它
web3.eth.filter.get
來獲取MachineUserIdSet
有關您的契約和 machineId 的每個事件記錄。要了解如何,請查看此答案答案。祝你好運!
從
call
web3view
呼叫函式時,您可以指定要評估呼叫的塊號。所以你的任務可以分解為兩個步驟:
- 找到與您感興趣的時間戳相對應的塊號。(您可以進行二進制搜尋,
web3.eth.getBlock()
直到找到正確的時間戳,儘管您可以通過基於大約 10-15 秒的智能初始猜測來做得更好每塊。)- 呼叫您的函式並指定該塊號。例如,在 web3.js 0.2xx 中:
contract.machineAllocs(x, blockNumber)
.