用区块链实现溯源的提法听过不少,文章也看过不少,现在就来实现一把,看看是如何实现的。
在我的上篇文章《以太坊中比mapping更便宜的存储方案:事件日志?》 有分析过,如果是用于存储目的,那么用mapping并不是最佳的方案,用事件日志才是! 然后,再从区块中读取日志,提取有用的信息。
https://etherjiang.github.io
上面的etherjiang是我最近设计的结果,把这些技能都完成了一遍。
web3实现遍历日志
1 2 3 4 5 6 7 8 9
| myContract.getPastEvents('MyEvent', { filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, fromBlock: 0, toBlock: 'latest' }, function(error, events){ console.log(events); })
eg: let res = await instance.getPastEvents('SetContent', {fromBlock: 0, toBlock: 'latest'}) let log = res[0].returnValues[0]
|
getPastEvents
这个方法就可以实现日志遍历了,速度还不错。得到的是一个日志数组。帖一个看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 0: address: "0x98C59036C71Ef10684b3A4a3ffA85b280fe7b402" args: Result {0: "QmVRPzXoLsXa7PccffrCk9x2z81MnfYtKfM1iVaijfzhAG", __length__: 1, t: "QmVRPzXoLsXa7PccffrCk9x2z81MnfYtKfM1iVaijfzhAG"} blockHash: "0xa5016d26ee660a5e9b87893aa937d1c3f0c6cd6a6dc8585b400f1760ad751f2c" blockNumber: 7840738 event: "SetContent" id: "log_ce314885" logIndex: 0 raw: {data: "0x000000000000000000000000000000000000000000000000…96a667a684147000000000000000000000000000000000000", topics: Array(1)} removed: false returnValues: Result {0: "QmVRPzXoLsXa7PccffrCk9x2z81MnfYtKfM1iVaijfzhAG", t: "QmVRPzXoLsXa7PccffrCk9x2z81MnfYtKfM1iVaijfzhAG"} signature: "0x8372f4d5703f980a74984746e8a40c81a527b0806704c2d078f255a0dc26fe3e" transactionHash: "0xe614c0216af7ff16ec7905153b9748ece9c5fb86f4eeeb8b390c6a2dbcfd98cb" transactionIndex: 0 __proto__: Object
|
可以看出,此日志包含了所有的数据,有用的数据在 returnValues 中。
所以,用事件日志的方法可以轻松地实现一个数据溯源的应用,是不是还不错呢!
This page is synchronized from the post: ‘区块链如何实现溯源?用日志吧! / 学习智能合约#6’