天才程序员: 那些年我偷懒没敲的EOS代码, 让我失去了一切, 如果...
作者 | 紅石
責編 | 喬治
出品 | 區塊鏈大本營(blockchain_camp)
#今天是一篇技術文。
3月15日,mercatox 遭受(hard_fail)攻擊,黑客獲利數千 EOS,約合數萬人民幣。
3月11日,EOS DApp nkpaymentcap 被攻擊,黑客成功獲利 5 萬 EOS,約合人民幣100多萬元。經分析發現,攻擊者采用假轉賬通知攻擊獲取大量合約代幣,又將代幣通過 DApp 合約兌換成真 EOS 進行套現。
3月10日,EOS 競猜類游戲 Vegas Town 被連續(hard_fail)攻擊,黑客獲利數千枚 EOS 。
3月9日,EOS 競猜類游戲 Gamble EOS 遭受假轉賬攻擊,黑客成功獲利數千 EOS……
僅僅三月份,利用交易驗證漏洞進行的攻擊就已經有這么多起,損失達上千萬人民幣。
那么,什么是交易驗證漏洞?為何?EOS 讓你頻頻“丟錢”?BM告訴你,是你的代碼“太笨”。
先說說交易驗證,你不了解交易驗證,但黑客了解。
因為在支付領域,這很重要。在區塊鏈領域,無論做 DApp,還是接入數字貨幣支付,交易驗證都是重要部分。
交易驗證,說起來也簡單:就是如何確認一筆金額已經到賬。
說起來也不簡單,因為會有無數黑客試圖讓并未成功的交易通過驗證,從而空手套白狼。
比如最近針對 EOS 交易的 hard_fail 狀態攻擊,就是這樣一種黑客攻擊。
hard_fail 狀態攻擊
在 EOS 區塊鏈上,每筆交易(transaction)都有一個狀態(status)參數,只有當這個參數為?executed(已執行),才說明交易成功。但是因為一般來說,失敗的交易都不會提交到鏈上,所以,一些不謹慎的交易所、DApp 甚至沒有驗證這個參數。
這才有了最近的 hard_fail 狀態攻擊。其實這個攻擊手法的背后原理遠比它的名字簡單,就是黑客發起了注定失敗的、但是又能上鏈的交易,專門攻擊那些只要交易上鏈就視作交易成功的平臺。
不試不知道,一試嚇一跳,真的有很多平臺沒驗證這個參數……
那么,EOS 交易驗證到底需要驗證些啥?
EOS 交易驗證涉及的參數
EOS 交易驗證,需驗證:
1、交易?excuted,驗證 transaction?status?參數為?executed,驗證這個參數可以有效避免 hard_fail 狀態攻擊;
說簡單點,這一步是驗證交易是否正常執行。
2、不可逆,即交易所在區塊號低于當前最新不可逆塊號,需要獲得 transaction 所在區塊的區塊號,以及主網最新不可逆塊的區塊號(不可逆區塊高度),判斷:
block_num < last_irreversible_block_num;
說簡單點,這一步是驗證交易是否已經同步。
區塊鏈是分布式賬本,交易提交上去后,需要大多數節點記錄了這筆交易,才能認為交易已上鏈并不可篡改。不然的話,比如如果只有一個節點有這筆交易,則只要這個節點的交易信息一改,這筆交易就變了。
3、合約賬戶和貨幣符號;
合約賬戶就是貨幣的智能合約賬戶。EOS 區塊鏈轉賬都是基于智能合約的,比如 EOS 幣的智能合約賬戶就是?eosio.token,每一次進行 EOS 幣轉賬,都會調用這個合約。
假幣攻擊就是因為交易所沒驗證合約賬戶。
4、交易(action)類型為?transfer;
EOS 區塊鏈上的交互都是以 transaction 進行,無一例外。所以,不是每一筆 transaction 都包含轉賬。EOS 一筆 transaction 可以有多個 action,只有類型為?transfer(轉賬)的 action,才是轉賬,才是需要做交易驗證的。
5、From?和?to,即轉入轉出的賬戶需要再次確認。
交易(Transaction)同時滿足這些條件,才能判斷為交易成功,并執行下一步程序。而且,如果是通過公共 API 或 API 服務商提供的數據進行交易驗證,需要使用不同服務提供商的 API 至少進行二次確認,以防止 API 信息出錯導致問題。
那么問題又來了,如何通過公共 API 進行交易驗證呢?
通過 EOSPark API 獲取交易、進行交易驗證
讓我們以 EOSPark 的 API 服務做個基本示例。
EOSPark 本身是一個主流 EOS 區塊瀏覽器,但他們也面向開發者提供 API、代碼一致性校驗、合約安全(SEC)、合約語義化等服務。
1、EOSPark API 官網:
https://eospark.com/openapi
2、EOSPark API 官方文檔:
https://developer.eospark.com/api-doc/zh/https/
EOSPark API 服務思維導圖:
EOSPark API 有四種查詢 EOS 交易的方式。
根據賬戶查詢:
HTTPS API get_account_related_trx_info
Websocket API subscribe_account
根據 txID 查詢:
HTTPS API get_transaction_detail_info
HTTPS API get_transaction_action_info
以 HTTPS API get_account_related_trx_info 為例,這個接口能查詢對應賬戶的進出交易,無論是收到的轉賬還是發起的轉賬,都可以一起查到:
get_account_related_trx_info 的基本查詢語句如下:
https://api.eospark.com/api?module=account&action=get_account_related_trx_info&apikey=
{這里放你的 API KEY}&account={這里放 EOS 賬戶名}&page=1&size=10
語句填好參數后可以直接在普通瀏覽器中打開查詢信息,不過當然,我們更習慣用 IDE:
Node.js 代碼示例:
返回 JSON 示例:
可以看到在 get_account_related_trx_info 返回的信息中,本來就包括交易所在區塊號(block_num)和不可逆區塊高度(last_irreversible_block_num)。
同時 status、code(合約賬戶)、symbol、From(這里是?sender)和?to(這里是?receiver)這些參數也一應俱全。(交易類型因為這個接口本身就是返回轉賬交易,所以這里可以不作驗證。)
也就是說,使用這個接口,查詢一次就可以直接驗證獲取到的交易。
那么問題又來了,也就是說,有些時候查詢的信息不能直接進行交易驗證?
很不幸,是滴。
獲取不可逆區塊高度和交易狀態的補充方法
有些接口返回的交易信息不包含交易驗證所需所有參數,需要再另外獲取。最常見的就是不可逆區塊高度的缺失,還有一些直接查詢 actions 的接口有交易狀態參數缺失。
不過處理起來都很簡單。
同樣以 EOSPark API 服務為例:
獲取不可逆區塊高度,使用 RPC 接口 get_info 就好,這是一個獲取 EOS 主網基本信息的接口:
Node.js 代碼示例:
返回 JSON 示例:
獲取狀態參數,可以使用 HTTPS 接口 get_transaction_detail_info,這是一個根據 txID 查詢交易(transaction)詳情的接口:
查詢語句:
https://api.eospark.com/api?module=transaction&action=get_transaction_detail_info&apikey=
{這里放你的API KEY}&trx_id={這里放查詢的交易ID}
返回 JSON 示例:
至此,我們就簡單說完了 EOS 區塊鏈交易驗證的一個基本思路。當然,具體情況具體分析,具體開發時驗證的方式不一定按這樣來。不過條條大路通羅馬,思路是一樣的,驗證的參數也基本都是這些。
命令千萬條,安全第一條。
代碼不齊全,親人兩行淚。
歡迎補充,歡迎拍磚!
紅石,氫石網絡科技CEO,
DApp 獨立開發者,區塊鏈技術顧問,資深營銷人,攝影設計師。
技術架構?|?應用架構?|?安全?|?隱私
推薦閱讀:
要錢還是要命? 比特幣正悄悄殺死你...
大學生利用漏洞“騙走”京東110萬, 中心化白條的漏洞, 區塊鏈能否補得上?
好萊塢大片! 為躲避死亡威脅, 只用15步, 這個密碼朋克大叔就從世界"消失"了...
前阿里 P9 級員工稱離婚是模擬測試,已回滾復婚!
淘寶、飛豬、閑魚都掛了,阿里云卻正常?!
剛剛,數學界“諾獎”Abel Prize迎來首位女性得主
沒有新芯片,沒有大核彈,黃教主這次給大家帶來了個PRADA
曝光!月薪 5 萬的程序員面試題:73% 人都做錯,你敢試嗎?
猛戳"閱讀原文"有驚喜喲!
老鐵在看了嗎??
總結
以上是生活随笔為你收集整理的天才程序员: 那些年我偷懒没敲的EOS代码, 让我失去了一切, 如果...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中怎么让字体可以显示下划线呢_数
- 下一篇: sprintf在c语言中的作用,c语言中