挖礦 | 礦工并不是你的朋友,他們能干預你在區塊鏈上的交易
編者按:你可能想不到,最不被人注意的挖礦環節,卻有可能成為區塊鏈技術中最有可能被干擾的一環。近日,James Prestwich在 Medium上發表了一篇文章 詳細介紹了區塊鏈礦工操縱交易的各種可能性。他指出,礦工不是你的朋友。但他們也不是你的敵人。他們不想傷害你,他們只是無法避免有些事情發生而已。
共識層錯覺
以太坊是一個運行智能合約的去中心化平臺:應用程序完全按照編程運行,不存在停機、審查、欺詐或第三方干擾的可能性。
——Ethereum.org
作為開發人員,我們喜歡相信這樣的一個共識層:它能負責處理所有的硬分布式系統問題,并讓我們自己編寫應用程序。無論礦工們做什么,他們的行為都發生在共識層。開發者們則在應用層使用著智能合約:優雅的程序在以太坊虛擬機(EVM)上永遠完美地運行著。我們的去中心化應用程序(DAPPs)與一個永不停止的Ethereal(一個專業的協議分析軟件,它可以幫助調試應用層協議)計算機進行交互,并依賴于它的完整性。
我們知道,EVM是由共識驅動的,只要它能夠起作用,我們就不需要過多地關注它。我們不擔心礦工。畢竟,沒有人需要了解半導體是如何工作的,或者是現代CPU的電路是如何設計的。但不幸的是,這種層與層之間不過的分割是一種錯覺——共識層錯覺讓我們忘記了礦工并不是我們的朋友。
在實踐中,合約和共識之間的界限比市場營銷所顯示的更大,更容易折疊,更加模糊。“塊”的生產會影響EVM的狀態,從而影響到對智能合約的調用。反過來這也會影響到去中心化應用程序的運行以及使用這些程序的用戶。如果區塊的產生速度很慢,去中心化應用程序的運行速度就會很慢;如果區塊的產生速度很快,去中心化應用程序的運行速度就會很塊;如果區塊空了,中心化應用程序就會被凍結。
共識層一直在無意間干擾著去中心化應用程序。但有時,它的干擾也可能是有意的,畢竟共識層是由礦工控制的。礦工們為賺錢而工作。如果共識層支持應用層能盈利,一切都能正常運行。但是,如果礦工們能夠通過干預應用層來賺更多錢,他們最終會這么做。
挖礦的跑步機
礦工不是你的朋友。但他們也不是你的敵人。他們不想傷害你,他們只是無法避免——這是他們的天性,工作量證明需要他們。礦工必須進行激烈的競爭,才能獲得非常微薄的利潤。他們被困在挖礦的跑步機上,跑得最快的人控制著速度。
每當礦工們弄清楚如何更快或更便宜地解決問題時,困難就會增加。當困難增加時,每一個哈希值就會變得不那么有價值。如果你的哈希率(每秒處理數據的速度)保持不變,你得到的報酬也會越來越少。這迫使著礦工不斷地重新投資,來獲取收益。礦工只能通過不斷的消費、不斷的優化和不斷的競爭來獲利。無法進行競爭的礦工們會從跑步機上摔下來。
如果你的利潤率是1%,那么收入下降1%,你的利潤就是0了。如果一名礦工的哈希率落后一點,他們就會落在后面。如果不注意的話,他們就會在跑步機加速的時候掉下來。另一方面,收入增長1%將會使利潤翻倍。一個效率稍高的礦工將有更多的錢用于再投資更多的硬件。他們將會獲得更大的優勢,直到其他礦工無法與之競爭。工作量證明迫使礦工們找到這些小的優勢,并用它們把其他礦工從跑步機上推下去。簡單來說,提高挖礦盈利的能力有兩種方法:增加收入,或減少開支。收入來自于區塊獎勵和交易費用。開支來自于電力、硬件、員工、辦公場所等。
目前,礦商們正在通過一些明顯、而且易于優化的方面進行競爭,比如尋找更便宜的電力或更好的硬件。不幸的是,在這些方面進行優化的回報正在遞減——找到更便宜的電力變得越來越難,GPU的可優化空間也接近了內存帶寬的限制,ASIC也接近了晶體管大小的物理限制。目前,這些優化仍然能夠帶來利益。但在某些時候,這些能夠優化的空間將會耗盡,而礦工們將被迫尋找更精細、且不那么明顯的優化空間。
的確能有一些非常有效的優化。不幸的是,他們會傷害你。我想集中討論的是,礦工通過從依賴區塊鏈的人員和系統中獲取資金來增加收入和減少開支的方法。當你在閱讀這篇文章時,請記住,礦工們并不想拿走你的錢,但他們必須拿走你的錢。工作量證明要求他們競爭。
礦工如何干預
礦工可以通過多種方式干預EVM和運行在其上的應用程序。由于每個礦工都控制著自己“挖”出來的區塊,所以他們也能控制那個區塊的狀態變化。讓我們在高層次上找出來一些最簡單的方法。對于每一種情況,我們都會試著找出來干擾的策略,以及在這個策略中誰會受到傷害,礦工如何賺錢。
交易重新排序
交易是用區塊來處理的。每個區塊都有一個規范的順序,來處理交易的狀態變化。一般情況下,礦工按順序將每筆交易應用到EVM狀態。生產區塊的礦工控制著區塊交易的順序。從本質上講,通過控制一個區塊的交易順序,礦商也控制著交易狀態變化的順序。
比如說我想把錢轉給朋友。我將用三個功能做一個簡單的合約: deposit 、 unlock 和 retrieve 。調用deposit鎖定資金,每當我想給他轉賬的時候,我 unlock 5以太(Ether),然后我的朋友調用向他發送資金的 retrieve ,來收到這筆錢。如果一個礦工在同一個區塊中看到了一個 unlock 交易和一個 retrieve 交易。他們可以重新排列它們,以便優先處理 retrieve 交易,然后再處理 unlock 交易。但是處理 retrieve 的時候, unlock 還沒有被處理,所以當 unlock 處理完了之后,我的朋友不得不再提交一次 retrieve 交易,并支付第二筆交易費用。
通過對交易狀態的重新排序,礦工們可以影響合約執行的結果。這意味著,在一定程度上,他們可以控制EVM的狀態。這對于管理許多用戶之間交互的大型公共合約來說尤其糟糕。礦工們可以獲得的交易越多,對最終狀態的控制就越強。
合約開發商必須對區塊中的交易進行任意重新排序的情況有應對方案,否則就有可能讓他們的用戶面臨額外費用或其他意外傷害。
交易插入
當交易在一個區塊中被處理時,礦工們將不會受到其他人正在進行的交易的限制,他們也可以進行自己的交易。礦工們掌握著以太。他們可以在一個塊鏈里進行投機,在塊鏈交易中買或賣,就像我們其他人一樣。但是,由于礦工決定交易的順序,有些時候他們會把一些塊鏈的head給切掉。
讓我們再設計一個簡單的智能合約。這一次,愛麗絲(Alice)想玩一個猜謎游戲。愛麗絲在她的合約里放了5個以太。這些以太幣將會獎勵給那個最接近她所想到的數字的那個人。愛麗絲調用了 commit 來把數字哈希,所以她不能改變自己的想法。任何人都可以通過調用 guess 來提交猜測。2個區塊后,愛麗絲將會調用 reveal 來告訴大家,這個數字是什么。
有了這個簡單的猜謎游戲,愛麗絲就無法作弊了,但礦工作弊卻很容易,礦工可以一直等著,直到愛麗絲調用 reveal 告訴大家數字的時候再進行猜測。他會在區塊完成之前看到結果。即使大衛(David)也猜到了答案,礦工也能從重現安排大衛交易的順序,來獲得這場猜測的勝利。
當普通用戶進行交易時,他們會將其發送給礦工,來將其放入一個區塊之中。用戶必須承諾在確定交易的結果之前進行交易。另一方面,礦工們可以等到他們建造一個區塊之后,再決定是否進行交易。這意味著,礦工除了擁有能夠重新安排交易的權力以外,還能獲得比普通用戶更多的信息。這讓礦工在任何塊鏈系統中都具有強大的優勢。
任何時候,只要用戶和礦工通過智能合約進行交易,礦工就有可能插入或重新排列交易,來使自己受益。通常情況下,這些錢都是用來給普通用戶的。
智能合約開發者應該在設計他們的系統時考慮到這種用戶不平等。
強制錯誤
礦商可以利用交易重新排序和插入來干擾智能合約的調用。有時候,他們甚至會讓調用完全失敗。我們稱之為“強制錯誤”。當礦工將狀態修改為不期望而導致調用失敗時,就會發生強制錯誤。他們通過插入影響該狀態的交易來實現這一點。
讓我們為一個市場建立一個簡單的合約。我會調用 sell 列出一些以固定價格出售的代幣。任何人都可以調用 buy 來購買我的一些代幣。
這里的礦工可以檢查鮑勃(Bob)對 buy 的調用,并決定他是否也想買那個代幣。如果他想買,他就能買到足夠的代幣,讓鮑勃的交易出錯。如果鮑勃去購買2.5 GNT,那礦工就能確保剩下的代幣不夠了。鮑勃的交易將會出錯,而礦工將獲取交易費用。鮑勃不情愿地資助了礦工購買GNT的交易,結果卻一無所獲。
這一攻擊對于較老版本的Solidity來說尤其糟糕。較老的 assert 和 throw 關鍵字會給礦工帶來所有的附加的“gas”,這將導致非常高的費用,但卻沒有完成什么工作。較新的 require 和 revert 關鍵字將“gas”用量限制在實際完成的工作中。
強制錯誤允許礦工們因拒絕工作而獲得一定的報酬。當交易出錯時,狀態就會恢復。如果一名礦工能夠穩定地使調用出現錯誤,他們甚至不需要處理狀態變化。對于一個礦工來說,理想的區塊是充滿了錯誤交易的區塊。全額收取費用,狀態卻沒發生什么變化。
智能合約開發者可以通過檢查他們的 revert 和 require 的聲明來緩解這一問題。如果礦工能夠穩定地導致你的合約出錯,他們就可以從你的用戶那里收取額外的費用。根據經驗,如果一個調用依賴于可以被另一個用戶更改的狀態,那么它就容易受到強制錯誤的影響。
審查制度
在決定如何對區塊內的交易進行排序時,礦工也可以選擇忽略交易。他們可能出于政治或經濟原因而這么做。用戶無法確保礦工將會在一個區塊內納入給定的交易。
假設愛麗絲想把自己變成一個存錢罐。她可能會建立一份簡單的合約,讓她在1萬個區塊之后就可以提取資金。愛麗絲是個很不錯的人,想確保如果她死了,錢就會轉給某人。因此,她讓礦工們拿走5萬個區塊之后的錢。
每一個礦工都有強烈的動機不把愛麗絲的收回交易包括進去。畢竟,如果她從不收回,那么他們就會在未來有機會賺到錢。除非礦工們讓她離開,否則她就不能收回。即使沒有礦工合謀審查愛麗絲或任何類型的51%的攻擊,他們也可能會決定審查這筆交易。
這意味著,任何合約都不能假定用戶的交易是及時到達的。你必須考慮到不可預知的礦工審查制度。合約無法判斷礦工想要審查交易,因此必須為任意的延遲做好準備。
逐步升級的問題
一個系統中的資金越多,礦工就越有可能陷入困境。隨著我們建立更大的交易所、更復雜的賭場,并為塊鏈增添越來越多的價值的時候,礦工們有更大的動機去干預了。
共識并不是我們的去中心化程序下面的一層,這兩者是緊密聯系在一起的。當我們編寫軟件時,我們并不關心硅的物理特性——因為硅并沒有積極地試圖拿走我們的錢。不幸的是,EVM并不是直接在硅上運行,而是通過礦工來運行—— 如果礦工不能被信任,那么EVM就不能被信任。
Solidity開發人員必須編寫一個針對他們的計算機程序。EVM本身就是一個拜占庭式的系統。任何有可能失敗的部分都會在最糟糕的時刻這樣做。我們對加密貨幣、挖礦和智能合約的理解還為時過早。礦工們并沒有積極尋求以犧牲用戶為代價的方式來獲取利潤。但隨著以太坊的成長,我們總有一天會記住這是去中心化應用程序的黃金時代。
礦工不是你的朋友或敵人——他們是我們共識體系中的一股自然力量。未能將其計算在內而進行規劃的系統,最終將會輸給聰明的礦工。
來自:http://36kr.com/p/5114546.html