之前内容我们知道每一种代币都有它自己的智能合约,用于创建代币、处理交易和跟踪资产;而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时就是调用的官方整理解码后的函数。
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