1. 概述
Qtum 量子鏈作為一個(gè)以技術(shù)革新為主導(dǎo)的創(chuàng)新公鏈,一直將推動(dòng)區(qū)塊鏈的技術(shù)發(fā)展和應(yīng)用落地為己任。量子鏈研究院一直在探索區(qū)塊鏈上的各種創(chuàng)新方式,其中基于Google Cloud進(jìn)行的對(duì)區(qū)塊鏈云計(jì)算與大數(shù)據(jù)方向的創(chuàng)新探究一直在穩(wěn)步推進(jìn)。繼Google Cloud推出Qtum開(kāi)發(fā)工具包后,Qtum量子鏈結(jié)合Google Cloud強(qiáng)大的數(shù)據(jù)分析能力與豐富的云平臺(tái)功能,基于數(shù)據(jù)分析工具BigQuery再次推出了一個(gè)重量級(jí)數(shù)據(jù)分析服務(wù)——Qtum鏈上數(shù)據(jù)分析。
Qtum量子鏈?zhǔn)侨蚴讉€(gè)基于PoS共識(shí)機(jī)制和UXTO模型的智能合約平臺(tái)。其賬戶(hù)抽象層實(shí)現(xiàn)了UTXO模型與智能合約虛擬機(jī)賬戶(hù)模型的的無(wú)縫交互,實(shí)現(xiàn)了區(qū)塊鏈技術(shù)與真實(shí)的商業(yè)世界的完美融合。最新數(shù)據(jù)顯示(截止到2019年5月),截止至5月30日地址數(shù)總量為1648035個(gè),在一個(gè)月內(nèi)增長(zhǎng)67596個(gè),平均每日增長(zhǎng)2253.2個(gè)。網(wǎng)絡(luò)權(quán)重變化整體較穩(wěn)定,挖礦平均年回報(bào)率為7.87%[1]。Qtum x86虛擬機(jī)、完善的DGP鏈上治理以及Qtum與金融、醫(yī)療、文娛、游戲等多領(lǐng)域的融合,使Qtum量子鏈逐漸成為全球最有影響力的項(xiàng)目之一。
主流貨幣的數(shù)據(jù)全是公開(kāi)透明的,我們可以用 blockchain.com、etherscan.io 、qtum.info等開(kāi)放的區(qū)塊鏈瀏覽器查詢(xún)交易、余額等基本信息。但若想對(duì)鏈上數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析并不容易,例如每日的交易量、全網(wǎng)算力等等,需要對(duì)歷史的所有區(qū)塊、交易進(jìn)行數(shù)據(jù)統(tǒng)計(jì)才能得到。
本文就基于BigQuery實(shí)現(xiàn)了Qtum鏈上數(shù)據(jù)的統(tǒng)計(jì)、分析以及可視化展現(xiàn),將Qtum的各項(xiàng)指標(biāo)更為直觀地呈現(xiàn)給用戶(hù)。最終效果參見(jiàn)網(wǎng)址:https://chart.qtum.info/
2. 背景
BigQuery [2] 是Google Cloud最新推出的數(shù)據(jù)分析工具。它是一個(gè)基于列存儲(chǔ)的數(shù)據(jù)庫(kù)系統(tǒng)。列存儲(chǔ)和行存儲(chǔ)的區(qū)別可以用下圖很好地表示。
列存儲(chǔ)和行存儲(chǔ)有著各自的優(yōu)缺點(diǎn),適用于不同的場(chǎng)合。從下表中可以很明顯地看出,列存儲(chǔ)可以有效應(yīng)用于數(shù)據(jù)統(tǒng)計(jì)中。因?yàn)閿?shù)據(jù)統(tǒng)計(jì)通常需要把大量的數(shù)據(jù)(列如用戶(hù)日志)加載進(jìn)表里,然后對(duì)逐個(gè)字段進(jìn)行篩選和統(tǒng)計(jì)。這個(gè)場(chǎng)景和列存儲(chǔ)的應(yīng)用場(chǎng)景是完全符合的。
目前開(kāi)源的列存儲(chǔ)數(shù)據(jù)庫(kù)并不多,主流的包括HBase、ClickHouse等。而各大互聯(lián)網(wǎng)公司都會(huì)研發(fā)自己的閉源列存儲(chǔ)數(shù)據(jù)庫(kù)。BigQuery就是Google研發(fā)的列存儲(chǔ)數(shù)據(jù)庫(kù),目前在Google Cloud上可以使用,主要按照SELECT操作涉及的數(shù)據(jù)量大小進(jìn)行收費(fèi)。
由于列存儲(chǔ)數(shù)據(jù)庫(kù)能很好地應(yīng)用于數(shù)據(jù)統(tǒng)計(jì)的場(chǎng)景中,所以我們采用BigQuery進(jìn)行Qtum鏈上數(shù)據(jù)的分析,以便更好地了解區(qū)塊、交易等數(shù)據(jù)。BigQuery也經(jīng)常宣傳自己在區(qū)塊鏈數(shù)據(jù)方面的應(yīng)用[3]。
03. 架構(gòu)
本系統(tǒng)分為上中下三層:
· 下層為數(shù)據(jù)源部分。運(yùn)行在服務(wù)端的Qtum節(jié)點(diǎn)開(kāi)啟了RPC服務(wù)。ETL(Extract-Transform-Load )程序會(huì)持續(xù)從RPC獲取鏈上數(shù)據(jù),然后輸出給中間層。
· 中間層用BigQuery實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和計(jì)算。運(yùn)行在服務(wù)端的定時(shí)任務(wù)會(huì)持續(xù)往BigQuery中寫(xiě)入最新的鏈上數(shù)據(jù)。然后,用SQL對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,寫(xiě)入上層的Redis中。
· 上層是前端展示部分。Flask框架從Redis中讀取數(shù)據(jù)返回給前端。前端通過(guò)在React框架中嵌入的Echarts工具,用來(lái)展示Qtum鏈上數(shù)據(jù)的統(tǒng)計(jì)分析結(jié)果。
數(shù)據(jù)源
數(shù)據(jù)源部分由Qtum節(jié)點(diǎn)和ETL程序組成。Qtum全節(jié)點(diǎn)實(shí)時(shí)同步最新的鏈上數(shù)據(jù)。ETL程序通過(guò)RPC接口獲取鏈上數(shù)據(jù),最終寫(xiě)入本地CSV(Comma-Separated Values)文件。流程圖如下:
ETL詳細(xì)步驟如下:
1. 啟動(dòng)Qtum全節(jié)點(diǎn)和ETL程序;
2. ETL程序調(diào)用Qtum節(jié)點(diǎn)的RPC接口獲取當(dāng)前區(qū)塊高度;
3. ETL程序開(kāi)啟多個(gè)進(jìn)程,并發(fā)地調(diào)用getblock接口,獲取最近多個(gè)區(qū)塊的數(shù)據(jù);
4. 將區(qū)塊數(shù)據(jù)寫(xiě)入本地的CSV文件。
其中,getblock接口有兩個(gè)參數(shù),分別是區(qū)塊哈希值和數(shù)字2(2代表會(huì)返回完整的交易信息)。返回結(jié)果如下:
BigQuery
BigQuery部分主要是數(shù)據(jù)的存儲(chǔ)和計(jì)算。每次ETL程序運(yùn)行完成之后,會(huì)將最新的CSV文件上傳至BigQuery。然后執(zhí)行SQL語(yǔ)句進(jìn)行統(tǒng)計(jì)計(jì)算,并將計(jì)算結(jié)果寫(xiě)入Redis。關(guān)鍵操作步驟如下:
· 建表:在BigQuery網(wǎng)站界面中新建數(shù)據(jù)庫(kù)表,表名為block。依次填寫(xiě)各個(gè)字段的名稱(chēng),類(lèi)型和模式,填寫(xiě)完畢點(diǎn)擊“創(chuàng)建表”。
· 上傳:BigQuery支持多種方式上傳數(shù)據(jù),數(shù)據(jù)也包括CSV、AVRO等多種格式。此處我們通過(guò)Python編寫(xiě)的任務(wù),將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))
· 通過(guò)SQL語(yǔ)句讀取BigQuery中block表的數(shù)據(jù)并進(jìn)行統(tǒng)計(jì)計(jì)算。這里我們以計(jì)算stake weight為例,其計(jì)算公式可以表示為:
對(duì)應(yīng)的SQL語(yǔ)句和在圖形界面的執(zhí)行效果如下:
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兩部分組成,最終展示結(jié)果如下圖。Flask從Redis獲取數(shù)據(jù)并通過(guò)HTTP JSON接口返回給前端。前端通過(guò)在React框架中嵌入的Echarts工具,用來(lái)展示數(shù)據(jù)。最終效果如下圖:
可視化部分處理步驟如下:
1.在瀏覽器中打開(kāi)地址(https://chart.qtum.info/),前端向接口發(fā)起請(qǐng)求。接口代碼如下:
# 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.獲取接口返回的數(shù)據(jù)之后,通過(guò)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. 總結(jié)
此次Qtum量子鏈基于谷歌的BigQuery搭建的數(shù)據(jù)工具,展示了一種新的合作可能性,幫助更多用戶(hù)不僅僅通過(guò)區(qū)塊鏈瀏覽器去查詢(xún)交易,而是從更加宏觀的視角幫助普通用戶(hù)挖掘真正的數(shù)據(jù)價(jià)值。這也會(huì)使得監(jiān)管等機(jī)構(gòu)更好的理解區(qū)塊鏈技術(shù)的未來(lái)數(shù)據(jù)價(jià)值,使得區(qū)塊鏈技術(shù)進(jìn)一步主流化,合規(guī)化。
系統(tǒng)的前端為React框架,編程語(yǔ)言為HTML,JavaScript和CSS,后端為輕量級(jí)Python框架Flask,接口,數(shù)據(jù)處理和定時(shí)任務(wù)也都是由Python編寫(xiě)。點(diǎn)擊鏈接即可查看Qtum鏈上實(shí)時(shí)動(dòng)態(tài)數(shù)據(jù):https://chart.qtum.info/
5. 下一步計(jì)劃
隨著區(qū)塊鏈行業(yè)各種公有鏈項(xiàng)目的不斷發(fā)展,積累了大量的交易和區(qū)塊數(shù)據(jù)。由于鏈上數(shù)據(jù)的透明性,區(qū)塊鏈技術(shù)將面臨用戶(hù)隱私泄露、非法金融活動(dòng)等問(wèn)題,我們從以下幾個(gè)方向來(lái)作為下一步計(jì)劃:
1. 隱私泄漏分析:通過(guò)實(shí)體識(shí)別和身份識(shí)別來(lái)分析區(qū)塊鏈用戶(hù)是否有隱私泄漏風(fēng)險(xiǎn)
2. 網(wǎng)絡(luò)畫(huà)像:通過(guò)對(duì)區(qū)塊鏈的活躍度畫(huà)像,服務(wù)畫(huà)像和網(wǎng)絡(luò)特性畫(huà)像從宏觀的角度對(duì)區(qū)塊鏈網(wǎng)絡(luò)的運(yùn)行狀態(tài)、規(guī)律、機(jī)制進(jìn)行分析,從而更好的理解區(qū)塊鏈網(wǎng)絡(luò)中用戶(hù)的活動(dòng)情況
3. 市場(chǎng)效應(yīng)分析:分析礦工,系統(tǒng),用戶(hù),政策,事件,競(jìng)爭(zhēng)等因素對(duì)市場(chǎng)的影響
4. 交易模式識(shí)別:對(duì)洗錢(qián)、詐騙等犯罪活動(dòng)的特定交易模式進(jìn)行分析,盡可能多的對(duì)交易模式進(jìn)行識(shí)別
5. 非法行為檢測(cè)與分析:在成功識(shí)別交易模式之后,通過(guò)技術(shù)手段來(lái)幫助政府追溯非法行為發(fā)生的源頭
評(píng)論
查看更多