Solidity

獲取特定日期特定資產的最後狀態

  • March 24, 2022

我有一份智能合約,其中我正在映射機器 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 的每個事件記錄。

要了解如何,請查看此答案答案。祝你好運!

callweb3view呼叫函式時,您可以指定要評估呼叫的塊號。

所以你的任務可以分解為兩個步驟:

  1. 找到與您感興趣的時間戳相對應的塊號。(您可以進行二進制搜尋,web3.eth.getBlock()直到找到正確的時間戳,儘管您可以通過基於大約 10-15 秒的智能初始猜測來做得更好每塊。)
  2. 呼叫您的函式並指定該塊號。例如,在 web3.js 0.2xx 中:contract.machineAllocs(x, blockNumber).

引用自:https://ethereum.stackexchange.com/questions/46669