一点儿知识

Posted on May 04, 2022Read on Mirror.xyz

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

之前内容我们知道每一种代币都有它自己的智能合约,用于创建代币、处理交易和跟踪资产;而Web3的app不需要针对每一种合约都创建一套定制的交互代码,而是使用统一的标准和所有的Tokens交互。这里将引出今天谈论的主要内容:ERC20和ERC721协议:

ERC20代币合约跟踪Fungible Tokens(同质化代币——一个代币的价值精确的等于另一种代币的价值,如1ETH=3000USDT=3000USDC),下方是一个ERC20的详细信息

ERC20包含6个必要的合约标准和3个可选择填写的内容,选择性内容包括代币的名称Name、符号Symbol和位数Decimals

必要的合约标准包括:

totalSupply():定义代币总供应量

balanceOf(account):确定任意地址的资产数量

transfer(recipient, amount):函数调用合约账户转移一定数量的Token给接收者账户

allowance(owner, spender):允许用户花费合约地址的剩余资产,默认值为0

approve(spender, amount):将金额设置为使用者对调用代币的限额函数

transferFrom(sender, recipient, amount):处理任意两个用户间的资产转移

💡 注意:ERC20更多内容和详细讲解可以参考https://docs.openzeppelin.com/contracts/2.x/api/token/erc20

ERC721代币合约跟踪NonFungible Tokens(非同质化代币——每一个代币都是唯一的,如NFT)

它有类似于ERC20的必要的合约标准,包括:

balanceOf(owner):返回账户拥有的NFT数量

ownerOf(tokenId):返回用户NFT特有的TokenID

transferFrom(from, to, tokenId):转移特有的NFT(TokenID)从一个账户到另一个账户,发送者必须是NFT的拥有者或者获得了拥有者的转移授权账户

approve(to, tokenId):授权其它地址转移特定的TokenID,一段时间内只能有一个地址被授权,该函数只能被拥账户有者或者授予操作权限的用户调用。

getApproved(tokenId):获取TokenID的授权地址

safeTransferFrom(from, to, tokenId):转移特有的NFT(TokenID)从一个账户到另一个账户,From和To的账户NFT不可以为0,发送者必须是NFT的拥有者或者获得了拥有者的转移授权账户

setApprovalForAll(operator, _approved):设置或取消操作者的授权,允许操作者代表所有者转移地址的所有代币

isApprovedForAll(owner, operator):是否操作者获得了给定账户的授权

💡 注意:ERC721更多内容和详细讲解可以参考https://docs.openzeppelin.com/contracts/2.x/api/token/erc721

这里以CryptoPunk为例,Punk NFT的诞生时间甚至早于ERC721合约,因此Punk的合约函数与ERC721的函数是不一样的,我们只能通过Punk独有的合约来查询它的链上数据,而对于大部分的NFT,我们可以直接用ERC721的合约参数来查询链上数据。

又如十分流行的BAYC NFT的合约就是ERC721的合约标准。


在开始Dune之前,我们还需要了解ABI(应用二进制接口,如同更低等级的API):是指两程序模块间的接口;通常其中一个程序模块会是库或操作系统所提供的服务,而另一边的模块则是用户所执行的程序。

从下图中,我们可以看出:所有的智能合约通常都是用Solidity写的,并编译成字节代码存储在区块链上,而Dune就能够实现将链上不易阅读的内容转换为我们用户易读的内容。

https://mmbiz.qpic.cn/mmbiz_gif/mP5Lm5f7OSPzabVFoibSF0REsLe46CyibTc4iaySEHmYdyg69mcN5S4opJhx698bHwicIEgDQoD4c7Q9ibAFxF2qjEQ/640?wx_fmt=gif&wxfrom=5&wx_lazy=1

图片可以点击上方链接进去看,也可以去公众号:一点儿知识查看

Decode:https://duneanalytics.retool.com/embedded/public/892af55f-a6ff-41df-b203-f8acb6f0a38b

我们可以直接在Etherscan搜索项目的合约地址,然后通过上方的链接进入Dune页面,提交合约地址给Dune,即可获得该项目ABI解码内容,我们可以将该项目提交给官方,同时留下自己的邮箱获取项目合约解码的信息,我们在使用SQL时就是调用的官方整理解码后的函数。

💡 聚合函数:https://docs.microsoft.com/zh-cn/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15

💡 比较运算:https://docs.microsoft.com/zh-cn/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver15

SELECT COUNT(*),
date_trunc('week', "call_block_time") AS weeks
FROM genieswap."GenieSwap_call_multiAssetSwap"
WHERE "call_success" = True
GROUP BY weeks
ORDER BY 2 DESC

我们通过以上SQL语句来构建我们的第一个图表

https://mmbiz.qpic.cn/mmbiz_gif/mP5Lm5f7OSPzabVFoibSF0REsLe46CyibTsoibghygYpianEO40vz2icDxCFoBw3Wup9ZqVkNAgUzOxKjbAtjhBaUrA/640?wx_fmt=gif&wxfrom=5&wx_lazy=1

通过下方SQL语句求过去Genieswap的日均交易量

WITH count_per_day AS (
SELECT
COUNT(*) AS count,
date_trunc('day', "call_block_time") AS days
FROM genieswap."GenieSwap_call_multiAssetSwap"
WHERE "call_success" = True
GROUP BY days
)
SELECT
AVG(count)
FROM count_per_day

💡 公用表表达:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15

Recommended Reading