数据 | 数据分析之Dune Analytics(一)

写下日常的Dune 学习笔记,方便回看,图片不清晰可以去原地址查看:

https://docs.google.com/presentation/d/1I6vDOS52uMCmWg3KIbuKYe8lK-8_ol9bEksIUEHNNLI/edit#slide=id.p

https://www.youtube.com/watch?v=EnUUeM7FPac&list=PL_7kfUeJgSzz5Fltb2nivE_8xuAe2XTJl&index=2&t=1369s

💡文章中出现的代码块可以向右滑动查看。

上图对应外部合约与内部合约,下图对应日志内容,调用时看是transtions、trace、logs中的哪一个,就对应哪一种数据调用。

我们在Dune中主要是去调用区块浏览器的交易数据和日志信息,一般钱包地址签名发起的均为外部合约,而合约与合约之间的交互为内部合约(如下图)

SELECT * FROM ethereum."transactions”
LIMIT 10

SELECT——指想要目标的哪一栏(column)

*——指所有,这里是想要每一个单一的以太坊交易

FROM——指要查询的表,这里是以太坊所有的交易

Run快捷键——Command+Enter

LIMIT——执行我所想要执行的

10——最早的10笔交易

SELECT "hash" FROM ethereum."transactions"
LIMIT 10

选择列(column)或者表的时候必须要有双引号,如这里的”hash”,英文引号。

SELECT * FROM ethereum."transactions"
WHERE "hash" = '\x66d2be3bf2865711e769b64b55a26fe7720e93111506f75f42587fc65a2e7e4e'

WHERE——在结果里面筛选自己需要的内容

Hash——0x在sql语句中,0必须换成 \

内部调用的tx_hash与外部调用的hash(上面均是外部调用)是同一个值即:Transaction Hash

SELECT * FROM ethereum."traces" as tr --mention not all transfers have an internal tx, USDC is special due to their proxy pattern
WHERE tr."tx_hash"='\x979b8fb58254f28f5f659df16d81c6ac2103d8b135ba809474bb06e75c8a0ec2'
SELECT * FROM ethereum."logs" el
WHERE el."tx_hash"='\x979b8fb58254f28f5f659df16d81c6ac2103d8b135ba809474bb06e75c8a0ec2'

上面分别是调用的内部合约和日志数据

💡 上方我们通过日志查询得出的data数据是解码之前的Hex数据,我们想要知道究竟Transfer了多少的usdt,我们需要对数据解码,需要用到函数bytea2numeric(字节转数字)函数

因为这笔交易的U值是1000,但这里的Value是1000000000,是因为数据在并不是以10进制的形式存储在链上,我们需要移除6个0,因此还需要除以10^6(1e6)

右下角数据名为?column?,我们可以为其重命名为data_translated,这里as同样可以省略

SELECT "data", bytea2numeric("data")/1e6 as "data_translated" FROM ethereum."logs" el
WHERE el."tx_hash"='\x979b8fb58254f28f5f659df16d81c6ac2103d8b135ba809474bb06e75c8a0ec2'

当我们在polygon网络时,方式是差不多的,假设我们想要查询Aave质押状况,我们直接找到官方整理好的Aave表即可,然后去polygonscan找到对应的交易

这里的Address和Number是可以和Dune的User和Amount对上号的,点击上方104数字旁的Address,我们可以进入合约页面

然后我们搜索合约中的deposit函数,函数包含reserve(Token合约地址,如USDT)、user(钱包地址)、onBehalfof、amount(质押数量)、referral(提交的代码)等参数,这里的参数都可以和Dune结果栏的参数对上号。


下方SQL语句是筛选出给定地址有质押的情况,并对其排序,Descending(DESC)是递减,没有的话是按照递增排序。

SELECT * FROM aave_v2."LendingPool_evt_Deposit"
WHERE "user" IN ('\x0f8361ef329b43fa48ac66a7cd8f619c517274f1','\xa409cceeb14f0228b7951b8d08d119131d85b855','\xa783839c4fa4e7030866ddb3869db5355a820679','\x6f3a6d9867d6213056b55ce52b55514215deb343','\xd43de4138422ad09890203c2e82624715350b784','\xaf5f36cbdc99e25ccd8ab1a4ec23f15a90598645','\xea0f1f68d7c3f580a80e170a21ee0ce34cdcdd17','\x85f3f846a2e13970adea6c213a90c8f61c6e86ef')
ORDER BY "amount" DESC

该结果运行后会筛选出给定地址中,于一年内发生的区块事件,最多输出为10条。

WHERE "user" IN ('\x0f8361ef329b43fa48ac66a7cd8f619c517274f1','\xa409cceeb14f0228b7951b8d08d119131d85b855','\xa783839c4fa4e7030866ddb3869db5355a820679','\x6f3a6d9867d6213056b55ce52b55514215deb343','\xd43de4138422ad09890203c2e82624715350b784','\xaf5f36cbdc99e25ccd8ab1a4ec23f15a90598645','\xea0f1f68d7c3f580a80e170a21ee0ce34cdcdd17','\x85f3f846a2e13970adea6c213a90c8f61c6e86ef')
AND "evt_block_time" > now() - interval '1 year'
LIMIT 10

下方将展示如何将Ethereum.logs的Topic2的内容在Dune中输出为钱包地址。

SELECT CONCAT( '\x', RIGHT(encode("topic2", 'hex'),40))::bytea as from_address FROM ethereum."logs" el
WHERE el."tx_hash"='\x979b8fb58254f28f5f659df16d81c6ac2103d8b135ba809474bb06e75c8a0ec2'

先用encode对topic2的hex内容进行解码,然后取右侧40位字符,去掉了0x,后与\x进行组合,此时组合的数据为字符串,我们需要将其转换为字节,故加入::bytea

Subscribe to 一点儿知识
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from 一点儿知识

Skeleton

Skeleton

Skeleton