文章閱讀頁通欄

Qtum基于谷歌BigQuery發布可視化鏈上數據服務

來源: Qtum量子鏈 作者:Qtum
1. 概述 Qtum 量子鏈作為一個以技術革新為主導的創新公鏈,一直將推動區塊鏈的技術發展和應用落地為己任。量子鏈研究院一直在探索區塊鏈上的各種創......
1. 概述

Qtum 量子鏈作為一個以技術革新為主導的創新公鏈,一直將推動區塊鏈的技術發展和應用落地為己任。量子鏈研究院一直在探索區塊鏈上的各種創新方式,其中基于Google Cloud進行的對區塊鏈云計算與大數據方向的創新探究一直在穩步推進。繼Google Cloud推出Qtum開發工具包后,Qtum量子鏈結合Google Cloud強大的數據分析能力與豐富的云平臺功能,基于數據分析工具BigQuery再次推出了一個重量級數據分析服務——Qtum鏈上數據分析。
 
Qtum量子鏈是全球首個基于PoS共識機制和UXTO模型的智能合約平臺。其賬戶抽象層實現了UTXO模型與智能合約虛擬機賬戶模型的的無縫交互,實現了區塊鏈技術與真實的商業世界的完美融合。最新數據顯示(截止到2019年5月),截止至5月30日地址數總量為1648035個,在一個月內增長67596個,平均每日增長2253.2個。網絡權重變化整體較穩定,挖礦平均年回報率為7.87%[1]。Qtum x86虛擬機、完善的DGP鏈上治理以及Qtum與金融、醫療、文娛、游戲等多領域的融合,使Qtum量子鏈逐漸成為全球最有影響力的項目之一。
 
主流貨幣的數據全是公開透明的,我們可以用 blockchain.com、etherscan.io 、qtum.info等開放的區塊鏈瀏覽器查詢交易、余額等基本信息。但若想對鏈上數據進行統計分析并不容易,例如每日的交易量、全網算力等等,需要對歷史的所有區塊、交易進行數據統計才能得到。
 
本文就基于BigQuery實現了Qtum鏈上數據的統計、分析以及可視化展現,將Qtum的各項指標更為直觀地呈現給用戶。最終效果參見網址:https://chart.qtum.info/

2. 背景

BigQuery [2] 是Google Cloud最新推出的數據分析工具。它是一個基于列存儲的數據庫系統。列存儲和行存儲的區別可以用下圖很好地表示。  

列存儲和行存儲有著各自的優缺點,適用于不同的場合。從下表中可以很明顯地看出,列存儲可以有效應用于數據統計中。因為數據統計通常需要把大量的數據(列如用戶日志)加載進表里,然后對逐個字段進行篩選和統計。這個場景和列存儲的應用場景是完全符合的。

目前開源的列存儲數據庫并不多,主流的包括HBase、ClickHouse等。而各大互聯網公司都會研發自己的閉源列存儲數據庫。BigQuery就是Google研發的列存儲數據庫,目前在Google Cloud上可以使用,主要按照SELECT操作涉及的數據量大小進行收費。
 
由于列存儲數據庫能很好地應用于數據統計的場景中,所以我們采用BigQuery進行Qtum鏈上數據的分析,以便更好地了解區塊、交易等數據。BigQuery也經常宣傳自己在區塊鏈數據方面的應用[3]。

03. 架構

本系統分為上中下三層:

· 下層為數據源部分。運行在服務端的Qtum節點開啟了RPC服務。ETL(Extract-Transform-Load )程序會持續從RPC獲取鏈上數據,然后輸出給中間層。
· 中間層用BigQuery實現數據存儲和計算。運行在服務端的定時任務會持續往BigQuery中寫入最新的鏈上數據。然后,用SQL對數據進行統計分析,寫入上層的Redis中。
· 上層是前端展示部分。Flask框架從Redis中讀取數據返回給前端。前端通過在React框架中嵌入的Echarts工具,用來展示Qtum鏈上數據的統計分析結果。

數據源

數據源部分由Qtum節點和ETL程序組成。Qtum全節點實時同步最新的鏈上數據。ETL程序通過RPC接口獲取鏈上數據,最終寫入本地CSV(Comma-Separated Values)文件。流程圖如下:

ETL詳細步驟如下:

1. 啟動Qtum全節點和ETL程序;
2. ETL程序調用Qtum節點的RPC接口獲取當前區塊高度;
3. ETL程序開啟多個進程,并發地調用getblock接口,獲取最近多個區塊的數據;
4. 將區塊數據寫入本地的CSV文件。

其中,getblock接口有兩個參數,分別是區塊哈希值和數字2(2代表會返回完整的交易信息)。返回結果如下:

BigQuery

BigQuery部分主要是數據的存儲和計算。每次ETL程序運行完成之后,會將最新的CSV文件上傳至BigQuery。然后執行SQL語句進行統計計算,并將計算結果寫入Redis。關鍵操作步驟如下:

· 建表:在BigQuery網站界面中新建數據庫表,表名為block。依次填寫各個字段的名稱,類型和模式,填寫完畢點擊“創建表”。

· 上傳:BigQuery支持多種方式上傳數據,數據也包括CSV、AVRO等多種格式。此處我們通過Python編寫的任務,將CSV上傳到BigQuery。

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語句讀取BigQuery中block表的數據并進行統計計算。這里我們以計算stake weight為例,其計算公式可以表示為:

對應的SQL語句和在圖形界面的執行效果如下:

SELECT
 SUM( block_difficulty ) * 16 * (1<<32) /(MAX( block_time )-MIN( block_time ) + 144) AS stake_weight,
 DATE_FROM_UNIX_DATE(CAST(FLOOR(block_time/(3600*24)) AS INT64)) AS day_num
FROM  `data-service-232303.qtum_data.block`
GROUP BY day_num

可視化

可視化部分由Flask和React兩部分組成,最終展示結果如下圖。Flask從Redis獲取數據并通過HTTP JSON接口返回給前端。前端通過在React框架中嵌入的Echarts工具,用來展示數據。最終效果如下圖: 

可視化部分處理步驟如下:

1.在瀏覽器中打開地址(https://chart.qtum.info/),前端向接口發起請求。接口代碼如下:

# parameter key, for example:username = 'block_size'
# api:http://127.0.0.1:23456/api/block_size
@app.route('/api/<username>')
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
       },
           ...
         }
}

4. 總結

此次Qtum量子鏈基于谷歌的BigQuery搭建的數據工具,展示了一種新的合作可能性,幫助更多用戶不僅僅通過區塊鏈瀏覽器去查詢交易,而是從更加宏觀的視角幫助普通用戶挖掘真正的數據價值。這也會使得監管等機構更好的理解區塊鏈技術的未來數據價值,使得區塊鏈技術進一步主流化,合規化。
 
系統的前端為React框架,編程語言為HTML,JavaScript和CSS,后端為輕量級Python框架Flask,接口,數據處理和定時任務也都是由Python編寫。點擊鏈接即可查看Qtum鏈上實時動態數據:https://chart.qtum.info/

5. 下一步計劃

隨著區塊鏈行業各種公有鏈項目的不斷發展,積累了大量的交易和區塊數據。由于鏈上數據的透明性,區塊鏈技術將面臨用戶隱私泄露、非法金融活動等問題,我們從以下幾個方向來作為下一步計劃:

1. 隱私泄漏分析:通過實體識別和身份識別來分析區塊鏈用戶是否有隱私泄漏風險
2. 網絡畫像:通過對區塊鏈的活躍度畫像,服務畫像和網絡特性畫像從宏觀的角度對區塊鏈網絡的運行狀態、規律、機制進行分析,從而更好的理解區塊鏈網絡中用戶的活動情況
3. 市場效應分析:分析礦工,系統,用戶,政策,事件,競爭等因素對市場的影響
4. 交易模式識別:對洗錢、詐騙等犯罪活動的特定交易模式進行分析,盡可能多的對交易模式進行識別
5. 非法行為檢測與分析:在成功識別交易模式之后,通過技術手段來幫助政府追溯非法行為發生的源頭[4]
 
6. 參考文獻

[1] Qtum量子鏈5月主網報告
[2] BigQuery. https://cloud.google.com/bigquery/
[3] Bitcoin in BigQuery: blockchain analytics on public data. https://cloud.google.com/blog/products/gcp/bitcoin-in-bigquery-blockchain-analytics-on-public-data.
[4] 陳偉利,鄭子彬. 區塊鏈數據分析:現狀、趨勢與挑戰[J]. 計算機研究與發展, 2018, 55(9): 1853-1870.

關鍵詞: Qtum  BigQuery  
0/300
? 好运彩3单双