通用圖靈機和智能合約之間的關(guān)系是什么
在Kadena我們經(jīng)常談?wù)搮^(qū)塊鏈設(shè)計決策。我最近遇到的一個特別深刻的設(shè)計決策是關(guān)于圖靈完備的,它在我們的一個開發(fā)人員最近的一篇文章中引發(fā)了爭論。作為團隊的非技術(shù)成員,我想了解圖靈完備的真正含義,為什么區(qū)塊鏈社區(qū)在這個問題上存在分歧,為什么我們的工程師在努力教育其他人安全智能合約編程的缺點。
以下是我為揭開和理解智能合約安全這一核心屬性而進行探索的簡要總結(jié)。所以,如果你像我一樣,被區(qū)塊鏈系統(tǒng)的開發(fā)所吸引,尤其是被智能合約語言所吸引,那么希望這個故事能夠提高你對圖靈完備如何影響智能合約安全的理解。
圖靈機促進圖靈完備
20世紀(jì)30年代,艾倫·圖靈提出了通用圖靈機的概念。請注意,圖靈機不同于二戰(zhàn)期間用來解決Enigma代碼的設(shè)備。這就是炸彈機。圖靈機實際上是一種理論設(shè)備,一種數(shù)學(xué)計算模型,描述了我們今天所知道的最強大的機械計算機。
這可以歸結(jié)為“圖靈完備”,它是一個屬性,用于描述可以用來模擬圖靈機器的編程語言。事實上,現(xiàn)存的絕大多數(shù)編程語言都是圖靈完備的。圖靈完備智能合約機最著名的例子是Ethereum虛擬機(EVM)。
“一種圖靈完備的編程語言,理論上能夠表達計算機完成的所有任務(wù);如果忽略有限內(nèi)存的限制,幾乎所有的編程語言都是圖靈完備的。
這在實踐中意味著什么呢?編程語言能夠表達每一個可計算的算法是好是壞?
起初,這聽起來像是一個強大的特性。智能合約語言對于構(gòu)建任何類型的應(yīng)用程序都是普遍適用和靈活的,這當(dāng)然是有好處的。讓我們考慮一下其影響。
圖靈完備應(yīng)用于區(qū)塊鏈智能合約
不幸的是,我并不是智能合約設(shè)計領(lǐng)域的思想領(lǐng)袖,所以我求助于互聯(lián)網(wǎng)。初步的研究從StackOverflow或者像這樣的圖靈機上的深入論文中得到了完全沒有幫助的答案。這兩種方法都沒有通過編程智能合約的上下文來檢查所討論的屬性。
幸運的是,我有幸請到了一位非常有資格并且在這個主題上領(lǐng)先的的人物Emily Pillmore,她是Kadena的高級程序員。我問她:“在區(qū)塊鏈的中,圖靈完備和圖靈不完備有什么區(qū)別?””她的反應(yīng):圖靈不完備與區(qū)塊鏈并沒有太多直接關(guān)系。在計算機科學(xué)中,抽象重寫系統(tǒng)的一個特性是確保系統(tǒng)中的所有表達式都可以用正態(tài)形式表示(即可以被簡化)……圖靈不完備表現(xiàn)為在一種不可簡化的語言中的表達式?!斑@只是全部答案的一小部分!”對于像我這樣的人來說,其余的回答同樣令人費解。我問了一下“這個東西是如何工作的”問題,得到了一個全面而技術(shù)性的答案。很好。所以我想我會從不同的角度來看待這個問題。也許如果我問一個“這件事能做什么”的問題,我就能更具體地了解它的行為。
我問:“有沒有一些例子可以說明:圖靈不完備可以在區(qū)塊鏈上使用?”” Emily的回答是:“沒有。我想不出一個需要圖靈完備的區(qū)塊鏈用例。EVM不使用圖靈完備的任何屬性,因為它限制了通過gas模型進行的所有遞歸,這將強制遞歸在gas耗盡之前終止,或者在gas耗盡時終止程序。所以實際上,EVM的gas模型模擬了圖靈不完備,但不是真的。這就是為什么我說他們采用了圖靈完備的所有缺陷(副作用、難以理解和不合理的代碼、任意循環(huán)),但是沒有使用它的任何好處(不允許無限遞歸)?!鞍」?,我明白了!”也就是說當(dāng)你有能力做更多的事情,這也意味著更多的事情可能出錯。圖靈完備天生就更強大,但是如果您不能利用這種強大的優(yōu)勢,那么您就不必要地將自己暴露在更多的攻擊向量中,因為增加的表面積帶來了如此多的額外特性。
為進一步明確區(qū)分特征:
· 圖靈完備語言總是有條件重復(fù)或條件跳轉(zhuǎn)的形式
· 根據(jù)區(qū)塊鏈的設(shè)計,區(qū)塊鏈可以通過像gas這樣的機制來阻止這些無休止的循環(huán)。
· 因此,圖靈完備帶來了一個不必要的、繁重的攻擊表面。風(fēng)險高,回報低,如下圖所示。
在發(fā)布時,已知有16種針對Solidity的攻擊向量,Solidity是用于智能合約的最流行的特定領(lǐng)域的編程語言,碰巧是圖靈完備。如果圖靈機不完整,那么這些攻擊中代價最高的攻擊甚至都不可能發(fā)生。最值得注意的是,2016年的DAO攻擊——圖靈完備支持的可重入攻擊,從該基金中抽走了360萬ETH(約5000萬美元),導(dǎo)致以太坊社區(qū)對整個網(wǎng)絡(luò)進行了硬分叉,以恢復(fù)他們喜歡的歷史版本。最近在2019年,君士坦丁堡升級暫停,因為它引入了一種新的重入攻擊形式。
在設(shè)計像智能合約這樣的規(guī)避風(fēng)險技術(shù)時,最好避免將開發(fā)人員和用戶暴露在不必要的潛在風(fēng)險中,這樣他們也許有一天就可以提出一個用例來享受它所帶來的好處。畢竟,智能合約只不過是運行在區(qū)塊鏈上的計算機程序。他們是按要求去做的。在使用它們時,您將自己暴露在對所有可能的輸入的風(fēng)險中。與其信任一個未知程序員的邏輯,不如考慮信任一個圖靈不完備的編程語言,使用這種語言甚至不可能有危險的錯誤和漏洞。為了獲得更多的安全性,請考慮信任一種圖靈不完備語言,該語言在設(shè)計時考慮了智能合約安全性。
隨著我對這個主題的不斷了解,我很想知道您是否認(rèn)為圖靈完備里有我沒有提到的關(guān)鍵含義。您在您的智能合約中發(fā)現(xiàn)使用圖靈完備的好處了嗎?