Qtum基于微软BigQuery发布可视化链上数据服务,精准数据采集与智能剖析

优采云 发布时间: 2020-08-15 14:18

  02

  背景

  BigQuery [2] 是Google Cloud最新推出的数据剖析工具。它是一个基于列存储的数据库系统。列存储和行储存的区别可以用右图挺好地表示。

  

  列存储和行储存有着各自的优缺点,适用于不同的场合。从下表中可以很明显地看出,列存储可以有效应用于数据统计中。因为数据统计一般须要把大量的数据(列如用户日志)加载进表里,然后对挨个数组进行筛选和统计。这个场景和列存储的应用场景是完全符合的。

  行储存

  列存储

  优点

  INSERT和UPDATE容易

  SELECT时只有涉及的列会被读取,所有列都能作为索引

  缺点

  SELECT操作虽然只涉及较少的列,所有的列就会被读取

  INSERT和UPDATE麻烦

  应用

  频繁的写和更新操作,SELECT操作涉及较少的行较多的列

  SELECT操作涉及较多的行较少的列,大多数列都须要构建索引

  目前开源的列储存数据库并不多,主流的包括HBase、ClickHouse等。而各大互联网公司还会研制自己的闭源列存储数据库。BigQuery就是Google研制的列储存数据库,目前在Google Cloud上可以使用,主要根据SELECT操作涉及的数据量大小进行收费。

  由于列存储数据库能挺好地应用于数据统计的场景中,所以我们采用BigQuery进行Qtum链上数据的剖析,以便更好地了解区块、交易等数据。BigQuery也常常宣传自己在区块链数据方面的应用[3]。

  03

  架构

  

  本系统分为上中下三层:

  数据源

  数据源部份由Qtum节点和ETL程序组成。Qtum全节点实时同步最新的链上数据。ETL程序通过RPC插口获取链上数据,最终写入本地CSV(Comma-Separated Values)文件。流程图如下:

  

  ETL详尽步骤如下:

  启动Qtum全节点和ETL程序;

  ETL程序调用Qtum节点的RPC插口获取当前区块高度;

  ETL程序开启多个进程,并发地调用getblock插口,获取近来多个区块的数据;

  将区块数据写入本地的CSV文件。

  其中,getblock插口有两个参数,分别是区块哈希值和数字2(2代表会返回完整的交易信息)。返回结果如下:

  

  BigQuery

  BigQuery部份主要是数据的储存和估算。每次ETL程序运行完成以后,会将最新的CSV文件上传至BigQuery。然后执行SQL句子进行统计估算,并将估算结果写入Redis。关键操作步骤如下:

  

  from google.cloud import bigquery

  client = bigquery.Client()

  filename = 'data.csv' # file path

  dataset_id = 'qtum_data' # data set name

  table_id = 'block' # table name

  dataset_ref = client.dataset(dataset_id)

  table_ref = dataset_ref.table(table_id)

  job_config = bigquery.LoadJobConfig()

  job_config.write_disposition = 'WRITE_TRUNCATE'

  job_config.source_format = bigquery.SourceFormat.CSV

  job_config.skip_leading_rows = 1

  job_config.fieldDelimiter=','

  with open(filename, 'rb') as source_file:

  job = client.load_table_from_file(

  source_file,

  table_ref,

  location='us-east4',

  job_config=job_config) # API request

  job.result() # Waits for table load to complete.

  print('Loaded {} rows into {}:{}.'.format(

  job.output_rows, dataset_id, table_id))

  对应的SQL句子和在图形界面的执行疗效如下:

  SELECT

  SUM( block_difficulty ) * 16 * (1

  FROM `data-service-232303.qtum_data.block`

  GROUP BY day_num

  可视化

  

  可视化部份由Flask和React两部份组成,最终展示结果如下图。Flask从Redis获取数据并通过HTTP JSON插口返回给后端。前端通过在React框架中嵌入的Echarts工具,用来展示数据。最终疗效如下图:

  

  可视化部份处理步骤如下:

  1.在浏览器中打开地址(),前端向插口发起恳求。接口代码如下:

  # parameter key, for example:username = 'block_size'

  # api::23456/api/block_size

  @app.route('/api/')

  def get_each_data(username):

  ...

  x, y = get_data_from_redis(username)

  if len(x) > 0:

  print('Total :'+str(len(x)))

  result = {

  'success': True,

  'msg': '',

  'data': {

  "title": input_dic[username]['title'],

  "desc": input_dic[username]['desc'],

  "unit": input_dic[username]['unit'],

  "x": x,

  "y": y

  }

  }

  ...

  return jsonify(result)

  2.获取插口返回的数据然后,通过Echarts工具展示在浏览器中。Echarts示例代码如下:

  # parameter key, for example:key = "block_size"

  showChart = (key) => {

  fetch(`/api/${key}`)

  .then(function (res) {

  return res.json();

  })

  .then(function (res) {

  ...

  xAxis: {

  data: res.data.x

  },

  yAxis: {

  name: res.data.unit

  },

  ...

  }

  }

  04

  总结

  此次Qtum量子链基于微软的BigQuery搭建的数据工具,展示了一种新的合作可能性,帮助更多用户不仅仅通过区块链浏览器去查询交易,而是从愈发宏观的视角帮助普通用户挖掘真正的数据价值。这也会促使监管等机构更好的理解区块链技术的未来数据价值,使得区块链技术进一步主流化,合规化。

  系统的后端为React框架,编程语言为HTML,JavaScript和CSS,后端为轻量级Python框架Flask,接口,数据处理和定时任务也都是由Python编撰。点击链接即可查看Qtum链上实时动态数据:

  05

  下一步计划

  随着区块链行业各类公有链项目的不断发展,积累了大量的交易和区块数据。由于链上数据的透明性,区块链技术将面临用户隐私泄漏、非法金融活动等问题,我们从以下几个方向来作为下一步计划:

  隐私泄露剖析:通过实体辨识和身分辨识来剖析区块链用户是否有隐私泄露风险

  网络画像:通过对区块链的活跃度画像,服务画像和网路特点画像从宏观的角度对区块链网路的运行状态、规律、机制进行剖析,从而更好的理解区块链网路中用户的活动情况

  市场效应剖析:分析矿工,系统,用户,政策,事件,竞争等诱因对市场的影响

  交易模式辨识:对洗钱、诈骗等*敏*感*词*活动的特定交易模式进行剖析,尽可能多的对交易模式进行辨识

  非法行为测量与剖析:在成功辨识交易模式以后,通过技术手段来帮助政府溯源非法行为发生的源头[4]

  06

  参考文献

  [1]

  [2] BigQuery.

  [3] Bitcoin in BigQuery: blockchain analytics on public data.

  [4] 陈伟利,郑子彬. 区块链数据剖析:现状、趋势与挑战[J]. 计算机研究与发展, 2018, 55(9): 1853-1870.

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线