{"content":{"title":"使用Dune制作dashboard","body":"本文主要来自Dune的官方文档翻译和摘取\r\n\r\n文档：[https://dune.com/docs/](https://dune.com/docs/)\r\n注册：[https://dune.com/auth/register](https://dune.com/auth/register)\r\n\r\n#3 1. 基本使用\r\n\r\n参考 [https://dune.com/docs/quickstart/](https://dune.com/docs/quickstart/)\r\n\r\n\r\n1. 创建查询，写SQL，执行并保存这个查询，例如： [https://dune.com/queries/2335378](https://dune.com/queries/2335378)\r\n\r\n```sql\r\n--Query to get Ethereum's unique daily active users and passive users in 2023 \r\n\r\nSELECT \r\n--truncate time to day \r\ndate_trunc('day', block_time) AS time, \r\n--count distinct addresses that sent a transactions \r\nCOUNT(distinct \"from\") AS users, \r\n--count distinct addresses that received a transaction \r\nCOUNT(distinct \"to\") AS receiving_addresses \r\nFROM ethereum.transactions WHERE block_time > DATE '2023-01-01' \r\nGROUP BY 1\r\n```\r\n\r\n\r\n\r\n\r\n1. 创建一个visulazation，选择可视化的类型，x,y坐标的数据源，做一些设置，这些都可以在网页上完成。\r\n2. 展示图标。\r\n\r\n3. 1. 创建一个dashboard\r\n   2. 把2里创建的visulazation添加到这个dashboard\r\n   3. 调整dashboard的布局\r\n   4. 命名并保存这个dashboard\r\n\r\n\r\n\r\n每次有人查看这个dashboard时，它都会自动更新成最新数据。\r\n关于如何写查询语句的指导：[https://dune.com/docs/query/](https://dune.com/docs/query/)\r\n可以把生成的visulation插入到twitter等地方。\r\n\r\n\r\n1. 解码合约数据\r\n\r\n有时候查询出来的数据，或者构建query的东西是合约里的，需要对合约的数据进行解码。也就是提交合约的abi。\r\n\r\n\r\n1. 提交合约。 在settings->Contracts里可以提交合约ABI 需要提交：\r\n\r\n2. 1. 链信息\r\n   2. 合约地址\r\n   3. 项目名称（如Tether)\r\n   4. 合约名称（如USDT)\r\n   5. ABI 有时候可能会有些高级选项，比如如果合约是由工厂创建的，它们就可能有相同的代码，但是不同的实例，如Uniswap V3的Pool。Dune可以把同样代码的不同实例的合约显示在同一个表格里。\r\n\r\n\r\n\r\n1. 合约解码被approve后，会收到邮件通知。一般需要6小时才能把数据加载更新完。\r\n2. 然后就可以使用了。在Dune's Explorer里可以看到，可以在查询里使用它们。[https://dune.com/docs/app/decoding-contracts/#step-3-finding-your-decoded-contract](https://dune.com/docs/app/decoding-contracts/%23step-3-finding-your-decoded-contract)\r\n\r\n\r\n1. 其他\r\n\r\n* 可以创建team，在team内共享内容。[https://dune.com/docs/app/teams/](https://dune.com/docs/app/teams/)\r\n* Wand LLM，测试版本，用大模型创建query\r\n* 本地数据查询，可以自己上传一个csv文件，像其他数据源一样查找这个csv文件里的数据。\r\n* 在twitter, discord等嵌入表格，能实时更新[https://dune.com/docs/app/embeds/](https://dune.com/docs/app/embeds/)\r\n* 设置Alert。可以保存一个定期查询，每次查询执行后，就会发送一个alert给用户。可以通过email或者api发送。可以用于，比如每天一封email，收到最新的数据表格。 [https://dune.com/docs/app/alerts/](https://dune.com/docs/app/alerts/)\r\n* API：支持12条链，可以进行各种查询，获取最新的结果（也可以自己上传csv）\r\n\r\n\r\n**Non-EVM Chains**\r\n\r\n* * Solana\r\n  * Bitcoin\r\n\r\n**EVM Chains**\r\n\r\n* * Ethereum Mainnet\r\n  * Gnosis (previously xDai)\r\n  * Polygon (POS)\r\n  * Optimism\r\n  * Base\r\n  * BNB (Binance Smart Chain)\r\n  * Arbitrum\r\n  * Avalanche (c-chain)\r\n  * Goerli (Ethereum)\r\n  * Fantom\r\n  * Zksync Era\r\n  * Celo\r\n\r\n\r\n1. 费用\r\n\r\n![](https://img.learnblockchain.cn/pics/20240314091149.webp)\r\n\r\n\r\n在触发查询的运行时，可能会消耗credits. 例如下面查询的触发部分。\r\n\r\n## 查询深入\r\n\r\n[https://dune.com/docs/query/](https://dune.com/docs/query/)\r\n所有数据均来源于查询，因此查询是最重要的部分。\r\nDuneSQL 是我们的区块链数据查询引擎。它是 TrinoSQL 的一个分支，TrinoSQL 是一个开源的分布式 SQL 查询引擎\r\n###  查询的触发\r\n查询就是用户保存的查询语句，是所有图表数据的来源。\r\n查询分为public和private，public的可以由任何用户触发，private的可以由owner触发。\r\n查询可以通过query editor，dashboard editor，或API触发。另外对热门的query，也会定期自动触发刷新。\r\nQuery engine决定了你的查询可以用多少资源。更大的query engine可以查询的更快，也不太会超时。\r\n几种查询触发方式：\r\n\r\n\r\n* Interactive, 交互式，可以在query editor里点运行按钮，或刷新仪表盘来触发刷新。 本地query editor里运行查询，可以选择免费的直接刷新（慢），或用集群来刷新。\r\n\r\n![](https://img.learnblockchain.cn/pics/20240314091208.webp)\r\n\r\n\r\n而在dashboard里刷新时，就一定需要集群，就得付credit\r\n\r\n\r\n![](https://img.learnblockchain.cn/pics/20240314091212.webp)\r\n\r\n\r\n\r\n\r\n* scheduled，可以定时，或固定频率刷新，需支付credit。\r\n* API，可由API触发，如社区触发\r\n* Popular Dashboards，根据受欢迎程度自动触发。最受欢迎的每小时触发一次，不太受欢迎的24h触发一次，热门的可以通过社区集群进行刷新。\r\n\r\n\r\n\r\nDune 具有三种查询引擎大小：**community**、**medium**和**large**。查询引擎的大小决定了分配给查询的资源量。查询引擎越大，分配给查询的资源就越多。这意味着在较大的查询引擎上执行的查询将运行得更快并且不太可能超时。\r\ncommunity引擎是免费的，但大家都用的话，就会很慢。中型需要10个credit，大型需要20个credit。\r\n\r\n### DuneSQL\r\n[https://dune.com/docs/query/DuneSQL-reference/](https://dune.com/docs/query/DuneSQL-reference/)\r\n为了方便对区块链上的数据进行检索和操作，添加了很多[自定义的运算符，函数](https://dune.com/docs/query/DuneSQL-reference/Functions-and-operators/%23trino-base-functions)等。\r\n任何修改数据的操作，如create, update,delete,drop，都被禁用，只能查询。因为对图表来说，数据源是只读的。\r\n可以用创建查询的方式，来取代创建view。\r\n\r\n\r\n1. 使用API\r\n\r\n[https://dune.com/docs/api/](https://dune.com/docs/api/)\r\n使用API可以做到：\r\n\r\n\r\n* 执行查询\r\n* 编辑查询\r\n* 上传自己的数据\r\n\r\n使用API需要先获取api key。也是需要付费的，从两个维度收费：\r\n\r\n\r\n![](https://img.learnblockchain.cn/pics/20240314091220.webp)\r\n\r\n\r\ndatapoints指获取查询结果，可以认为：rows * columns，且每个结果有平均100 bytes的大小限制。\r\nCredits = Datapoints/1000 = max(rows*columns, ceil(totalbytes/100))/1000\r\n\r\n## 数据来源\r\n\r\nDune的节点提供商是[QuickNode](https://www.quicknode.com/case-study/dune-analytics).\r\n从节点获得链上原始数据后，会被保存到**raw tables**，然后通过合约ABI解码后，添加到**decoded tables**，方便使用。然后创建**abstracted tables**来标准化和聚合数据，最终提供给用户好用的**spell tables**.\r\n在使用中，应该优先使用 spellbook 和decoded tables，实在不行才用raw tables.\r\n\r\n### Spell book\r\n\r\n是一些优化过，抽象出来的表，用它可以很方便。每个知道怎么添加spell book的社区成员都可以自己把自己的数据添加进来。最流行的一些表格：\r\n\r\n\r\n* dex.trades，EVM链上DEX交易的聚合，可以通过[这里](https://dune.com/docs/data-tables/spellbook/top-tables/dex.trades/)查看表的columns.\r\n* nft.trades，EVM和solana上，NFT交易的抽象和聚合\r\n* labels，给地址打标签，是个key-value对。例如针对某地址0xD551234Ae421e3BCBA99A0Da6d736074f22192FF，进行标记：type:cex, name:binance\r\n* Tokens:\r\n\r\n* * Metadata:包含token的一些基本信息\r\n\r\n  * * tokens.nft\r\n    * tokens.erc20.\r\n\r\n\r\n\r\n\r\n* * Transfer Table:\r\n\r\n  * * **`erc20_ethereum.evt_Transfer`**:所有的erc20的transfer event。\r\n    * **`nft.transfers`：**所有erc721,1155的transfer event.\r\n\r\n\r\n\r\n\r\n\r\n\r\n### Decoded Tables:\r\n\r\n[https://dune.com/docs/data-tables/decoded/evm](https://dune.com/docs/data-tables/decoded/evm)\r\n为ABI中定义的每个事件和函数创建表。随后对该合约进行的每个事件、消息调用或交易都会被解码并作为一行插入到这些表中。 命名：\r\n**events:** `[projectname_blockchain].contractName_evt_eventName`\r\n**function calls:** `[projectname_blockchain].contractName_call_eventName` 例如：Ethereum上Uniswap-v2的Pair合约的swap事件，会在表： uniswap_v2_ethereum.Pair_evt_Swap 如果一个合约有多个实例，则这些实例会被插入到同一张表里，可以通过`contract_address` 来区分它们。可以通过labels.contracts来获得唯一的contract names/addresses。 合约必须上传ABI后才可以被解码。在[这里](https://dune.com/dune/is-my-contract-decoded-yet-v2)可以查看已经支持的合约，在[这里](https://dune.com/contracts/new)可以上传合约。可以通过CSV批量上传。一般上传后需要24h来初始化解码。可以通过[这里](https://dune.com/contracts/new)查看当前表数据跟链上数据的delay。一般几分钟的delay。 例如分析PICKLE 这个代币的一笔转账，可以： Select * from ethereum.logs where tx_hash = '0x2bb7c8283b782355875fa37d05e4bd962519ea294678a3dcf2fdffbbd0761bc5' 得到\r\n\r\n\r\n|            |              |            |                  |        |        |        |        |      |         |       |          |\r\n| ---------- | ------------ | ---------- | ---------------- | ------ | ------ | ------ | ------ | ---- | ------- | ----- | -------- |\r\n| block_time | block_number | block_hash | contract_address | topic1 | topic2 | topic3 | topic4 | data | tx_hash | index | tx_index |\r\n\r\n\r\n这是些原始数据。 但我们还可以这样子：\r\nSELECT * FROM pickle_finance_ethereum.PickleToken_evt_Transfer WHERE evt_tx_hash = '0x2bb7c8283b782355875fa37d05e4bd962519ea294678a3dcf2fdffbbd0761bc5'\r\n可以得到：\r\n\r\n\r\n|                  |             |           |                |                  |      |      |       |\r\n| ---------------- | ----------- | --------- | -------------- | ---------------- | ---- | ---- | ----- |\r\n| contract_address | evt_tx_hash | evt_index | evt_block_time | evt_block_number | from | to   | value |\r\n\r\n\r\n这就有用多了。这是因为event被解码了。\r\n\r\n### raw tables\r\n\r\n原始的，未经处理的数据。\r\n**Blocks**：\r\n表名：ethereum.blocks，polygon.blocks，optimism.blocks，bnb.blocks。。。\r\nColumns:\r\n\r\n\r\n|      |        |           |          |            |                  |      |                  |      |             |       |       |\r\n| ---- | ------ | --------- | -------- | ---------- | ---------------- | ---- | ---------------- | ---- | ----------- | ----- | ----- |\r\n| time | number | gas_limit | gas_used | difficulty | total_difficulty | size | base_fee_per_gas | hash | parent_hash | miner | nonce |\r\n\r\n\r\n**Events**:\r\n表名：ethereum.logs， polygon.logs。。。\r\nColumns:\r\n\r\n\r\n|            |              |            |                  |        |        |        |        |      |         |       |          |\r\n| ---------- | ------------ | ---------- | ---------------- | ------ | ------ | ------ | ------ | ---- | ------- | ----- | -------- |\r\n| block_time | block_number | block_hash | contract_address | topic1 | topic2 | topic3 | topic4 | data | tx_hash | index | tx_index |\r\n\r\n\r\n**Traces**:\r\n表名：ethereum.traces，polygon.traces...\r\nColumns:\r\n\r\n\r\n|            |              |       |      |          |            |         |          |            |       |            |         |      |      |               |      |         |      |           |       |        |                |\r\n| ---------- | ------------ | ----- | ---- | -------- | ---------- | ------- | -------- | ---------- | ----- | ---------- | ------- | ---- | ---- | ------------- | ---- | ------- | ---- | --------- | ----- | ------ | -------------- |\r\n| block_time | block_number | value | gas  | gas_used | block_hash | success | tx_index | sub_traces | error | tx_success | tx_hash | from | to   | trace_address | type | address | code | call_type | input | output | refund_address |\r\n\r\n\r\n**Transactions**:\r\n表名：ethereum.transactions，polygon.transactions,...\r\nColumns:\r\n\r\n\r\n|            |              |       |           |           |          |                 |                          |                      |       |       |         |      |      |            |      |      |      |             |\r\n| ---------- | ------------ | ----- | --------- | --------- | -------- | --------------- | ------------------------ | -------------------- | ----- | ----- | ------- | ---- | ---- | ---------- | ---- | ---- | ---- | ----------- |\r\n| block_time | block_number | value | gas_limit | gas_price | gas_used | max_fee_per_gas | max_priority_fee_per_gas | priority_fee_per_gas | nonce | index | success | from | to   | block_hash | data | hash | type | access_list |\r\n\r\n**Withdraws**:\r\nvalidator提款操作，对我们用处不大，不关心了。\r\n\r\n### 上传自己的数据\r\n\r\n可以是各种各样的数据\r\n\r\n\r\n* product data\r\n* custom contract mappings\r\n* labels\r\n* macroeconomic data\r\n* off-chain data like snapshot votes\r\n* on-chain data from blockchains we don't support yet\r\n* ...\r\n\r\n可以通过UI或API上传，通过csv完成。\r\n[https://dune.com/docs/api/api-reference/upload-data/](https://dune.com/docs/api/api-reference/upload-data/)"},"author":{"user":"https://learnblockchain.cn/people/13806","address":null},"history":"bafkreieggs7lpvukxhincsfl5jcsq6xn3ekyffusnjiskveknxcd3froqm","timestamp":1710379119,"version":1}