区块链如何实现溯源?用日志吧! / 学习智能合约#6

区块链如何实现溯源?用日志吧! / 学习智能合约#6

用区块链实现溯源的提法听过不少,文章也看过不少,现在就来实现一把,看看是如何实现的。

在我的上篇文章《以太坊中比mapping更便宜的存储方案:事件日志?》 有分析过,如果是用于存储目的,那么用mapping并不是最佳的方案,用事件日志才是! 然后,再从区块中读取日志,提取有用的信息。

etherjiang.jpg

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’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×