如何在 solidity 中跟踪交易历史?
How to track transaction history in solidity?
我正在尝试创建一个区块链
具有以下功能的系统
- 获取当前所有者
- 更改所有者
- 获取产品历史记录(在某个时间点拥有该产品的所有用户)
现在我不知道如何实现这个产品历史要求。就像我们必须跟踪类型更改所有者的所有事务但不知道如何实现它。
我们正在使用这个智能合约
https://github.com/niksvisuals/contracts/blob/master/ProductManager.sol
注意:在我们的智能合约中,更改所有者实现为(发货产品 + 接收产品)
您有两个主要选择:
- 在智能合约上跟踪历史(不推荐,因为这真的很贵)。
- 在智能合约上发出事件、收听它们、收听事件并将它们编入索引。
数字 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: {...}
我正在尝试创建一个区块链 具有以下功能的系统
- 获取当前所有者
- 更改所有者
- 获取产品历史记录(在某个时间点拥有该产品的所有用户)
现在我不知道如何实现这个产品历史要求。就像我们必须跟踪类型更改所有者的所有事务但不知道如何实现它。
我们正在使用这个智能合约 https://github.com/niksvisuals/contracts/blob/master/ProductManager.sol
注意:在我们的智能合约中,更改所有者实现为(发货产品 + 接收产品)
您有两个主要选择:
- 在智能合约上跟踪历史(不推荐,因为这真的很贵)。
- 在智能合约上发出事件、收听它们、收听事件并将它们编入索引。
数字 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: {...}