如何在 solidity 中跟踪交易历史?

How to track transaction history in solidity?

我正在尝试创建一个区块链 具有以下功能的系统

  1. 获取当前所有者
  2. 更改所有者
  3. 获取产品历史记录(在某个时间点拥有该产品的所有用户)

现在我不知道如何实现这个产品历史要求。就像我们必须跟踪类型更改所有者的所有事务但不知道如何实现它。

我们正在使用这个智能合约 https://github.com/niksvisuals/contracts/blob/master/ProductManager.sol

注意:在我们的智能合约中,更改所有者实现为(发货产品 + 接收产品)

您有两个主要选择:

  1. 在智能合约上跟踪历史(不推荐,因为这真的很贵)。
  2. 在智能合约上发出事件、收听它们、收听事件并将它们编入索引。

数字 2 的示例

智能合约:

//Declare an Event
event OwnerChange(address _from, address _to);

//Emit an event when the transfer happens
emit OwnerChange("0x213..", "0x13123...");

在您的后端代码中,使用 web3js 的示例 我们将首先获取您的合约实例: (https://web3js.readthedocs.io/en/v1.7.1/web3-eth-contract.html?highlight=events#new-contract) 然后设置一个侦听器来监视这些事件 (https://web3js.readthedocs.io/en/v1.7.1/web3-eth-contract.html?highlight=events#contract-events):

var yourContractInstance= new web3.eth.Contract(yourContractABI,contractAddressYouWantToMonitor);
yourContractInstance.events.OwnerChange({
    fromBlock: 0 //This should be when you deployed your contract, ideally keep track of this number as you read new blocks
}, function(error, event){ console.log(event); })
.on("connected", function(subscriptionId){
    console.log(subscriptionId);
})
.on('data', function(event){
    console.log(event); // same results as the optional callback above
})
.on('changed', function(event){
    // remove event from local database
})
.on('error', function(error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt.
    ...
});

// event output example
> {
    returnValues: {
        _from: '0x123456789...',
        _to: '0x123456789...',
    },
    raw: {...}