EOS數據
從EOS上線一段時間來看,他產生的Block已經遠遠超過了以太坊。以太坊在交易完成後,很容易過濾出交易信息(如何獲取交易Hash,在我之前以太坊文章中有詳細描述,以太坊愛好者可以參考)。EOS機制與以太坊有區別,EOS如此大的數據量,我們就會問,EOS數據時如何獲取,查詢。今天我們就這個問題,給大家分析一下。寫這篇文章的原因是,我們的EOS網路開啓一段時間後,出現了狀況,我們定位出問題出在數據這部分。
Data的價值分析
隨着區塊量各種應用的爆棚,EOS每天增加的用戶量上萬。我們從https://www.dappradar.com/ 上分析當前DApp排行榜,就可以清查看到目前的熱點和應用方向。
如此多的應用,大家非常關心就是,交易數據如何獲取。
通過history_plugin插件獲取交易數據
在EOSIO的1.3.0版本之前,官方提供文檔通過history_plugin插件獲取交易歷史數據,通過一下配置,可以獲取交易歷史數據。
如果你想蒐集所有的交易信息,包括收集所有traces信息,
我們可以查看V1.1.0版本的官方文檔描述
Options
-f [ --filter-on ] arg Track actions which match
receiver:action:actor. Actor may be
blank to include all. Receiver and
Action may not be blank.
Config Options for eosio::http_client_plugin:
--https-client-root-cert arg PEM encoded trusted root certificate
(or path to file containing one) used
to validate any TLS connections made.
(may specify multiple times)
--https-client-validate-peers arg (=1)
true: validate that the peer
certificates are valid and trusted,
false: ignore cert errors
可以通過config.ini 文件配置。
需要配置如下插件,配置方式
# config.ini
plugin = eosio::history_plugin
通過啓動node節點,通過參數配置如下:
# nodeos startup params
--plugin eosio::history_plugin
如果我們需要收集所有traces信息,那麼歡需要在config.ini文件中打開下面配置
# Track actions which match receiver:action:actor. Actor may be blank to include all. Action and Actor both blank allows all from Recieiver. Receiver may not be blank. (eosio::history_plugin)
# filter-on = //默認
filter-on =* #打開配置
# Do not track actions which match receiver:action:actor. Action and Actor both blank excludes all from Reciever. Actor blank excludes all from reciever:action. Receiver may not be blank. (eosio::history_plugin)
# filter-out =
# PEM encoded trusted root certificate (or path to file containing one) used to validate any TLS connections made. (may specify multiple times)
# (eosio::http_client_plugin)
# https-client-root-cert =
那麼我們如何獲取數據,典型的做法是,我們同步一個node節點,加入EOS主網,同步最新的鏈上數據,同時就能很方便的執行轉賬,使用命令行玩各種DApps。當然如果你懶得配置nodeos,也可以使用各個超級BP提供的RPC API。
比如從鏈上取到的一個Transaction如下:
account1111-> account2222
{
"timestamp": "2018-08-16T12:45:57.000",
"producer": "eosbixinboot",
"confirmed": 0,
"previous": "00ae4ccb182c2906e443ab99e2fa85cf8744f4ee5951a40a526c54e2f629202e",
"transaction_mroot": "47a441fd376307c48fe4a081ad90b3ed731c2e659dd97950510f2938f7585b11",
"action_mroot": "9462c900fa1b4db6aead6f38cfde7ae5a5020c283d703e8f31bad3719e66afcb",
"schedule_version": 291,
"new_producers": null,
"header_extensions": [],
"producer_signature": "SIG_K1_JuPWPNAFyjPNqZSLx27NiNVBY2eU6fGcJK91hxuXwHMQxXLFAxVzUuPeTS1RoPg9r53SvCrpRwpLBetff7Hu7QxiqsjCWz",
"transactions": [
{
"status": "executed",
"cpu_usage_us": 1313,
"net_usage_words": 16,
"trx": {
"id": "678c8b715d84bdf9d99627c5dc54c62a3ae0a0f06b7a99663aa769b252ea3af6",
"signatures": [
"SIG_K1_KWMARsmdRjwBKkdsz2uxM2KtbkLVxQRnNEj4yrjPvoXLUNo3ougmkgeLnvfcJPPpyHcrtiAJN3cPgowwJRQjJP7PX9HmKz"
],
"compression": "none",
"packed_context_free_data": "",
"context_free_data": [],
"packed_trx": "2979755b754be0ef6f12000000000100a6823403ea3055000000572d3ccdcd0170b4a29d6aefa6de00000000a8ed32322170b4a29d6aefa6de30c61843a169a23958474c000000000004454f53000000000000",
"transaction": {
"expiration": "2018-08-16T13:16:25",
"ref_block_num": 19317,
"ref_block_prefix": 309325792,
"max_net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
"actions": [
{
"account": "eosio.token",
"name": "transfer",
"authorization": [
{
"actor": "account1111",
"permission": "active"
}
],
"data": {
"from": "account1111",
"to": "account2222",
"quantity": "499.9000 EOS",
"memo": ""
},
"hex_data": "70b4a29d6aefa6de30c61843a169a23958474c000000000004454f530000000000"
}
],
"transaction_extensions": []
}
}
}
],
"block_extensions": [],
"id": "00ae4ccc6879ed8936a6b90e133c6f8a37a3c2dbc6e1486a4df677ce148f0840",
"block_num": 11422924,
"ref_block_prefix": 247047734
}
這裏是一個完整的Transaction信息。
首先獲取到的塊是一個json串,在塊信息中,包含了塊生成的時間,BP名稱等基本信息,不細說,看名稱就能識別。其中的Transaction信息,看上圖,能看到執行的合約是eosio.token,執行的是轉賬(Transfer)操作,從data中能看到,發送者是account1111,發送給account2222,數量是499.9000 EOS,很簡單,很直觀。一般從區塊瀏覽器中看到這些就夠了,轉賬的確認再加上確認數就可以了。
如何配置history_plugin插件
在history_plugin插件的配置下,可以查詢一個賬號的Transaction和Action都依賴於此插件,因爲這種配置也有非常大的問題,但是在EOSIO的1.3.0版本,已經移除了此插件。那麼還有其他地方記錄這些狀態信息麼?
通過MongoDB插件獲取數據
EOS上的數據對外輸出都直接是json格式的,而MongoDB非常適合存儲這樣的數據。在EOSIO官方文檔中是mongo_db_plugin,查看此文檔能幫助你如何使用,更多的信息還得看下它的歷史。在EOSIO1.0版本中,其實你是看不到此插件的,而在1.1的版本中才恢復,而且在當時的版本,問題不少,功能也有欠缺;在1.2版本之後才越來越穩定好用。
看看使用該插件都存儲了哪些信息:
官方文檔中,描述的非常清晰,我們就簡單挑選出主要部分
https://developers.eos.io/eosio-nodeos/v1.3.0/docs/mongo_db_plugin
accounts - created on applied transaction
action_traces - created on applied transaction
block_states - created on accepted block
- block_num
- block_id
- block_header_state -
- see eosio::chain::block_header_state
- validated
- in_current_chain
blocks - created on accepted block
- block_num
- block_id
- block - signed block - see eosio::chain::signed_block
- validated - added on irreversible block
- in_current_chain - added on irreversible block
- irreversible=true - added on irreversible block
transaction_traces - created on applied transaction
- see chain::eosio::transaction_trace
transactions - created on accepted transaction - does not include inline actions
see eosio::chain::signed_transaction. In addition to signed_transaction data the following are also stored.
- trx_id - transaction id
- irreversible=true - added on irreversible block
- block_id - added on irreversble block
- block_num - added on irreversible block
- signing_keys
- accepted
- implicit
- scheduled
account_controls - created on applied transaction. Always updated even if mongodb-store-action-traces=false.
- controlled_account
- controlling_permission
- controlling_account
可以通過一下 地址查詢 /v1/history/get_controlled_acounts
db.account_controls.find({"controlling_account":"hellozhangyi"}).pretty()
pub_keys - created on applied transaction. Always updated even if mongodb-store-action-traces=false.
- account
- permission
- public_key
我們可以參考github上大家對MongoDB的討論,https://github.com/EOSIO/eos/pull/5066 分析這個問題。
在沒有action_traces之前,前面說的traces信息主要看transaction_traces,裏面包含了所有合約調用交互的細節,比如買賣RAM的所有轉賬信息。
那如何使用呢,上面的官方文檔裏面有配置說明,通常在配置文件config.ini中增加如下配置即可,當然還得啓動mongodb(下面的參考鏈接裏有)
abi-serializer-max-time-ms = 5000
plugin = eosio::mongo_db_plugin
mongodb-uri = mongodb://localhost:27017/eos
# 曾經刷測TPS的賬號,目前已經停止
mongodb-filter-out = blocktwitter:tweet:
# 可以控制存儲哪些信息
#mongodb-store-blocks = false
# 可以選擇從哪個塊開始存儲
#mongodb-block-start = 19455000
通過腳本實現,在啓動腳本中加入如下:
--abi-serializer-max-time-ms 5000 --plugin eosio::mongo_db_plugin -- mongodb-uri mongodb://localhost:27017/eos
我們可以通過robo3t工具,瀏覽mongoDb數據。
https://robomongo.org/ 下載工具
在新的官方文檔中,提供了其他一些插件連接,後續我們再繼續分析。
我們對一些問題的思考的探索
EOSIO的代碼更新很快,有時候覺得後進入整理數據的人有時候是幸運的,nodeos穩定許多,mongodb_db_plugin插件還增加了更多的功能。不過EOS的鏈上數據增長也很快,存儲blocks的文件夾都已經有61G,mongodb光存儲transactions_traces信息都有幾百G了。
- state數據庫
早期想保存所有traces信息的人,如果使用filter-on=*配置,簡直就不可能。因爲traces信息很快將state數據庫填滿,使你在config.ini中配置的chain-state-db-size-mb不夠用,而這也將使nodeos的同步停止,IO飆升,只能升機器的內存,當時用過128G內存的機器,很快就不夠用了。這個也和EOSIO使用的狀態數據庫chainbase有關,有興趣的可以查查,這也是,我們鏈運行幾周後,無法同步數據,讓我們聯合分析了很久才查到的原因,也正是我也整理這篇文章的主要原因。 - 垃圾數據
在主網正式運行後不久,就一直能看到blocktwitter賬號執行tweet,來壓測整個網絡的TPS,導致了大量無用的信息,這也是前面配置過濾該賬號的原因。而最近又有部分非常規數據出現,比如賬號cryptohongbo,在10月11日左右的數據,Actions雖然不明顯,但是在traces中能發現大量數據,還不知道是用來做什麼的。 - 新增賬號
前面提到塊中信息的不完整,導致的一個問題就是新增賬號數統計,有可能不準確。比如直接調用系統合約創建賬號,那麼在塊信息中會有體現。但是很多合約如signupeoseos提供了通過轉賬,自動幫你創建賬號的功能。而這些信息是在塊中看不到的,只有traces新中才有。
2018年11月9日寫於深圳