前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Footprint 链底层数据质量

Footprint 链底层数据质量

原创
作者头像
Footprint Analytics
发布2023-01-18 14:39:31
5810
发布2023-01-18 14:39:31
举报
文章被收录于专栏:Footprint Analytics

数据质量的重要性

数据质量是指数据的准确性、完整性、可靠性和一致性。这些特征对于数据的有效性和可用性至关重要。如果数据质量不高,可能会导致决策失误、成本增加、浪费资源。因此,维护数据质量是非常重要的。

Footprint Analytics数据质量标准

Footprint Analytics 对链上数据的校验标准,分为以下几个纬度:

校验指标

英文

描述

时效性

Timeliness

对于brone级别的数据,比如链底层数据,Footprint是做到实时更新;而silver或者gold级别的数据,,Footprint是做到T-1更新

唯一性

Unique

没有重复数据,每个表都要有唯一键

连续性

Continutity

确保数据是连续不中断的

完整性

Completeness

衡量所必须的数据的完整程度,如不能缺失的空值校验

有效性

Validity

对于数据的值、格式要求符合数据定义或业务定义的要求

Footprint Analytics 数据质量校验框架

Footprint Analytics 使用 Great Expectations 框架对链上数据校验。Great Expectations 是一个开源的数据质量和数据流程管理工具,提供了一系列工具和功能,可以帮助用户定义数据质量期望值,并在数据处理过程中检查数据是否符合这些期望值。

Footprint Analytics 使用 Great Expectations 进行数据校验,将异常测试数据结果实时发送到 slack 预警,团队可以在第一时间对数据问题进行修复;同时在 Footprint 生成对应的数据测试结果报告,方便团队对数据质量进行分析。

Footprint Analytics Great Expectations 项目结构:

├── expectations

├── great_expectations

│ ├── checkpoints # 生成的 yml

│ ├── expectations # 生成的 json

│ ├── notebooks

│ │ └── basic_info

│ │ └── nft # nft 领域

│ │ │ └──nft_transfers_timeliness.py # 其中一个校验开发脚本

│ ├── output

│ │ └── validations # 校验结果

│ ├── plugins

│ │ └── expectations # 自定义规则 Custom Expectation

├── utils

测试结果报告

Footprint Analytics 链底层校验规则

此文章的数据生产流程介绍中,我们能了解到,所有到指标计算都是基于原始数据的抽象。因此,对链底层对数据校验是最基础的一步。

以 Ethereum 链为例,公链的底层数据表有:

  • ethereum_traces

内部合约调用表,一个交易(Transactions)可以触发更多的内部调用操作,一个内部调用还可能进一步触发更多的内部调用。这些调用执行的信息会被记录到内部合约调用表。内部合约调用表主要包括 block_time、block_number、transaction_hash、status、from_address、to_address、value、trace_type 等字段。

  • ethereum_blocks

区块(Block)是区块链的基本构建组件。一个区块包含多个交易记录。区块表记录了每一个区块生成的日期时间 (timestamp)、对应的区块编号 ( number)、区块哈希值、难度值、燃料消耗等信息。除了需要分析整个区块链的区块生成状况、燃料消耗等场景外,我们一般并不需要关注和使用区块表。其中最重要的是区块生成日期时间和区块编号信息,它们几乎都同时保存到了其他所有数据表中,只是对应的字段名称不同。

  • ethereum_token_transfers

token转账表保存了区块链上非原生代币的转移详细信息;token转账表中最常用的字段包括block_timestamp、block_number、transaction_hash、from_address、to_address、token_address、value等。

  • ethereum_transactions

交易表保存了区块链上发生的每一个交易的详细信息(同时包括成功交易和失败交易)。交易表中最常用的字段包括 block_timestamp、 block_number、from_address、to_address、value、hash 等。

Footprint Analytics 的校验规则如下:

ethereum_traces

唯一性校验

在traces表中以trace_id作为唯一键,数据不能重复

SELECT if(( SELECT count(1) FROM ( SELECT trace_id, count(1) AS nums FROM "ethereum_traces" WHERE block_timestamp >= timestamp '2022-01-01' --节省运行时间,截取 2022-01-01 开始 GROUP BY 1 HAVING count(1) > 1 ) ) > 0, 'fail', 'pass')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-trace-uniqueness-fp-34876

时效性校验

traces 表必须有最新日期的数据 SELECT if((

SELECT count(*) FROM "ethereum_traces" WHERE block_timestamp >= CURRENT_DATE ) > 0, 'pass', 'fail')

Footprint Query URL: https://www.footprint.network/chart/ethereum-trace-timeliness-fp-34871

traces blocks 数量校验

traces中,trace_type= 'reward' 且 reward_type='block' 的去重 block 数量应该等于同一时间范围内blocks表的block数量 SELECT if((

SELECT count(DISTINCT block_number) AS trace_blocks_count

FROM "ethereum_traces"

WHERE trace_type = 'reward'

AND reward_type = 'block'

AND block_timestamp < CURRENT_DATE

) = (

SELECT count(*) AS blocks_count

FROM "ethereum_blocks"

WHERE timestamp < CURRENT_DATE

) - 1, 'pass', 'fail') AS trace_blocks_count_result

Footprint Query URL:

https://www.footprint.network/chart/ethereum-trace-blocks-count-check-fp-34872

traces transactions 数量校验

在 traces 表中,非空 trace_address 中的非空 transaction_hash 数量应该等于同一时间范围内 transactions 表的总记录数 SELECT if((

SELECT count(transaction_hash)

FROM "ethereum_traces"

WHERE trace_address IS NULL

AND transaction_hash IS NOT NULL

AND block_timestamp < CURRENT_DATE

AND block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

) = (

SELECT count(*)

FROM "ethereum_transactions"

WHERE block_timestamp < CURRENT_DATE

AND block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

), 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-trace-transactions-count-check-fp-34874

ethereum_blocks

唯一性校验

在blocks表中以number作为唯一键,数据不能重复

SELECT if((

SELECT count(1)

FROM (

SELECT number, count(1) AS nums

FROM "ethereum_blocks"

GROUP BY 1

HAVING count(1) > 1

)

) > 0, 'fail', 'pass')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-uniqueness-fp-34878

时效性校验

blocks表必须有最新日期的数据 SELECT if((

SELECT count(*)

FROM "ethereum_blocks"

WHERE timestamp >= CURRENT_DATE

) > 0, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-timeliness-fp-34879

连续性校验

blocks表中的number必须是连续不中断的 SELECT if((

SELECT expect_total_blocks - total_blocks

FROM (

SELECT max(number) - min(number) + 1 AS expect_total_blocks

, count(DISTINCT number) AS total_blocks

FROM "ethereum_blocks"

)

) = 0, 'pass', 'fail') --blocks的number应该是连续不中断的

Footprint Query URL: https://www.footprint.network/chart/ethereum-blocks-continuity-fp-34880

blocks 数量有效性校验

blocks 表中最大的 number+1 等于 blocks 表的总行数,因为blocks的number是从0开始,也就是创世块的number=0

SELECT if((

SELECT expect_total_blocks - total_blocks

FROM (

SELECT count(1) AS total_blocks

, max(number) + 1 AS expect_total_blocks

FROM "ethereum_blocks"

)

) = 0, 'pass', 'fail') --blocks的记录数应该等于最大的block number+1

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-blocks-validity-check-fp-34882

blocks transaction 数量校验

blocks中的transaction_count 总和等于同一时间范围内transactions的总行数 SELECT if((

SELECT sum(transaction_count) AS block_transaction_count

FROM "ethereum_blocks"

WHERE timestamp < CURRENT_DATE

) = (

SELECT count(*) AS transaction_count

FROM "ethereum_transactions"

WHERE block_timestamp < CURRENT_DATE

), 'pass', 'fail') --相同时间范围内,blocks中的transaction 总数等于transactions中的总行数

Footprint Query URL:

https://www.footprint.network/chart/ethereum-blocks-transactions-validity-check-fp-34883

ethereum_token_transfers

唯一性校验

token_transfers表以block_timestamp,log_index,transaction_hash 为唯一键,数据不能重复

SELECT if((

SELECT count(1)

FROM (

SELECT block_timestamp,log_index,transaction_hash,count(1) AS nums

FROM "ethereum_token_transfers"

WHERE block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

GROUP BY 1,2,3

HAVING count(1) > 1

)

) > 0, 'fail', 'pass')

Footprint Query URL: https://www.footprint.network/chart/ethereum-token-transfers-uniqueness-fp-35017

时效性校验

token_transfers表必须有最新日期的数据

SELECT if((

SELECT count(*)

FROM "ethereum_token_transfers"

WHERE block_timestamp >= CURRENT_DATE

) > 0, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/token-transfers-timeliness-fp-35018

连续性校验

token_transfers每日应该有交易数据,按天为纬度是连续的

SELECT if((

SELECT total_day - diff_day AS block_timestamp_continue_result

FROM (

SELECT date_diff('day', date(min(block_timestamp)), date(max(block_timestamp))) AS diff_day

, count(DISTINCT date(block_timestamp)) AS total_day

FROM "ethereum_token_transfers"

WHERE block_timestamp >= timestamp '2022-01-01’ --节省运行时间,截取2022-01-01开始

)

) = 1, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-token-transfers-continuity-fp-35020

ethereum_transactions

唯一性校验

transactions表以block_timestamp,hash,block_number 为唯一键,数据不能重复

SELECT if((

SELECT count(1)

FROM (

SELECT block_timestamp,hash,block_number,count(1) AS nums

FROM "ethereum_transactions"

WHERE block_timestamp >=timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

GROUP BY 1,2,3

HAVING count(1) > 1

)

) > 0, 'fail', 'pass')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-transactions-uniqueness-fp-35021

时效性校验

transactions表必须有最新日期的数据

SELECT if((

SELECT count(*)

FROM "ethereum_transactions"

WHERE block_timestamp >= CURRENT_DATE

) > 0, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-transactions-timeliness-fp-35022

连续性校验

transactions每日应该有交易数据,按天为纬度是连续的

SELECT if((

SELECT total_day - diff_day AS block_timestamp_continue_result

FROM (

SELECT date_diff('day', date(min(block_timestamp)), date(max(block_timestamp))) AS diff_day

, count(DISTINCT date(block_timestamp)) AS total_day

FROM "ethereum_transactions"

WHERE block_timestamp >= timestamp '2022-01-01' --节省运行时间,截取2022-01-01开始

)

) = 1, 'pass', 'fail')

Footprint Query URL:

https://www.footprint.network/chart/ethereum-transactions-continuity-fp-35023

总结

以上就是 Footprint Analytics 技术团队对底层链的数据进行测试的方法和规则,仍在持续完善更新中,欢迎大家提出优化的建议,一起让Footprint Analytics的数据质量得到更可靠的保证。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据质量的重要性
  • Footprint Analytics数据质量标准
  • Footprint Analytics 数据质量校验框架
  • Footprint Analytics 链底层校验规则
    • ethereum_traces
      • 唯一性校验
      • 时效性校验
      • traces blocks 数量校验
      • traces transactions 数量校验
    • ethereum_blocks
      • 唯一性校验
      • 时效性校验
      • 连续性校验
      • blocks 数量有效性校验
      • blocks transaction 数量校验
    • ethereum_token_transfers
      • 唯一性校验
      • 时效性校验
      • 连续性校验
    • ethereum_transactions
      • 唯一性校验
      • 时效性校验
      • 连续性校验
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档