Qtum基於谷歌BigQuery釋出視覺化鏈上資料服務

買賣虛擬貨幣
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.

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;