数据 | 数据分析之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就能够实现将链上不易阅读的内容转换为我们用户易读的内容。

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

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语句来构建我们的第一个图表

通过下方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

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