日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从并发视角来看智能合约(上)【渡鸦论文系列】

發(fā)布時(shí)間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从并发视角来看智能合约(上)【渡鸦论文系列】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

論文作者:

Ilya Sergey1and Aquinas Hobor2


1 University College London, United Kingdomi.sergey@ucl.ac.uk
2 Yale-NUS College and School of Computing, National University of Singaporehobor@comp.nus.edu.sg


翻譯:渡鴉

讓國(guó)內(nèi)外的區(qū)塊鏈技術(shù)沒有時(shí)差」。





寫在【新欄目】前面:

翻譯論文無(wú)比痛苦。

但是我們的目標(biāo)是「讓國(guó)內(nèi)外的區(qū)塊鏈技術(shù)沒有時(shí)差」。

帶給大家更多區(qū)塊鏈技術(shù)干貨。

能力有限,還請(qǐng)各路大神多多監(jiān)督、指教。

歡迎投稿、中英文均可。



摘要:

在本文中,我們探討了諸如Ethereum等智能合約的多事務(wù)行為與共享內(nèi)存并發(fā)的經(jīng)典問(wèn)題之間的顯著相似之處。我們從Ethereum區(qū)塊鏈中檢查兩個(gè)真實(shí)世界的例子,并分析它們是如何容易受到與傳統(tǒng)并發(fā)程序中經(jīng)常出現(xiàn)的錯(cuò)誤的影響。然后,我們?cè)敿?xì)闡述可觀察的合約行為與已深入研究的并發(fā)主題之間的關(guān)系,如原子性,干擾,同步和資源所有權(quán)。描述的并發(fā)對(duì)象類似的類比可以更深入地了解智能合約的潛在威脅,指導(dǎo)實(shí)踐,并使用現(xiàn)有的最先進(jìn)的形式驗(yàn)證技術(shù)。


1、介紹:

智能合約是存儲(chǔ)在區(qū)塊鏈上,拜占庭容錯(cuò)數(shù)據(jù)庫(kù)的程序。智能合約可以通過(guò)區(qū)塊鏈交易觸發(fā),并在其塊上讀取和寫入數(shù)據(jù)[38] 。雖然智能合約以分布式方式運(yùn)行和驗(yàn)證,但是盡管存在許多復(fù)雜的交互模式,包括例如重入和遞歸調(diào)用,但它們的語(yǔ)義表明可以將它們視為順序程序。這種心理模型簡(jiǎn)化了關(guān)于合約的正式和非正式推理,使得可以立即重用現(xiàn)有的通用框架來(lái)進(jìn)行程序驗(yàn)證[5,16,31,32] ,可用于驗(yàn)證例如寫入的智能合約。固化[15] 只有微小的調(diào)整。


雖然區(qū)塊上的所有計(jì)算都是確定的[1],但由于交易本身之間的競(jìng)爭(zhēng)(如為某個(gè)給定的區(qū)塊選擇了哪些交易),所以仍然會(huì)發(fā)生一些非確定性的計(jì)算。我們將展示,非決定論可以被敵對(duì)方利用,并對(duì)合約行為進(jìn)行推理,特別微妙,讓人想起傳統(tǒng)并行編程中涉及的已知挑戰(zhàn)。


在本文中,我們概述了智能合約的并發(fā)執(zhí)行屬性。這種執(zhí)行可以跨越多個(gè)區(qū)塊鏈交易(在同一個(gè)塊內(nèi)或多個(gè)塊中),從而違反了僅使用合約的實(shí)施和本地狀態(tài)而不能指定的所需安全屬性,正是現(xiàn)有驗(yàn)證方法所關(guān)注的[5, 32] 。為了便于共同編程的重用,我們提出以下類比:


在區(qū)塊鏈中使用智能合約的帳戶就像在共享內(nèi)存中使用并發(fā)對(duì)象的線程。

在共享內(nèi)存中使用并發(fā)對(duì)象的線程。通過(guò)并發(fā)對(duì)象,我們意味著用于在同時(shí)運(yùn)行的多個(gè)線程(進(jìn)程)之間交換數(shù)據(jù)和管理交互的大量數(shù)據(jù)結(jié)構(gòu)[20] 。并發(fā)對(duì)象的典型示例是區(qū)塊,隊(duì)列和原子計(jì)數(shù)器 - 通常通過(guò)諸如java,util,concurrent的數(shù)據(jù)庫(kù)使用。同時(shí),在運(yùn)行時(shí),這些并發(fā)對(duì)象被分配到正在運(yùn)行的線程可訪問(wèn)的共享內(nèi)存塊中。由線程同時(shí)訪問(wèn)對(duì)象而產(chǎn)生的行為 - 即干擾是難以預(yù)測(cè)的,因此極難理解。


其不利用適當(dāng)同步的并發(fā)對(duì)象(例如,具有鎖定或障礙物)可以在干擾下會(huì)出現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng)[2]行為,導(dǎo)致內(nèi)存完整性的喪失。即使對(duì)于無(wú)競(jìng)爭(zhēng)對(duì)象,在一個(gè)或多個(gè)客戶端的觀點(diǎn)下,觀察到的干擾行為可能是錯(cuò)誤的。例如,特定的線程可能不會(huì)“預(yù)見”具有共享對(duì)象的其他線程采取的動(dòng)作,因此可能不會(huì)期望該對(duì)象以干擾方式改變。


帳戶使用智能合約塊。智能合約類似于并發(fā)對(duì)象。他們儲(chǔ)存在塊狀物中而不是一個(gè)共享的記憶中; 不是由線程使用,而是由帳戶(用戶或其他合約)調(diào)用。像并發(fā)對(duì)象一樣,它們具有內(nèi)部可變狀態(tài),管理資源(例如資金),并且可以在塊內(nèi)和多個(gè)塊中的多方訪問(wèn)。與傳統(tǒng)并發(fā)對(duì)象不同,由于計(jì)算的事務(wù)模型,智能合約的方法而是原子的。也就是說(shuō),合約的單一調(diào)用(或一系列調(diào)用一系列相互調(diào)用的合約)是有序執(zhí)行 - 沒有中斷 - 并且在成功更新區(qū)塊鏈之后終止或者中止并且回到之前的配置。


然而,“原子性自由”的概念是欺騙性的,因?yàn)樵趨^(qū)塊鏈的水平上仍然可以觀察到并發(fā)行為:


- 在交易執(zhí)行時(shí),包含在交易中的交易的順序并不確定,因此,結(jié)果可以在很大程度上取決于其他交易的排序[27].


- 幾個(gè)編程任務(wù)需要將合約邏輯分散在幾個(gè)區(qū)塊鏈交易中(例如,當(dāng)合約與塊之外的世界進(jìn)行“通信”時(shí)),從而實(shí)現(xiàn)真正的并發(fā)行為。


- 調(diào)用其他合約可以被認(rèn)為是一種多任務(wù)合作。通過(guò)協(xié)同多任務(wù),多個(gè)線程可以運(yùn)行,但不要中斷,除非它們明確地“產(chǎn)生”。也就是說(shuō),從合約A到合約B的呼叫可以被認(rèn)為是從合約A的角度來(lái)看的收益,合約B在返回時(shí)收益。智能合約的關(guān)鍵在于,合約B可以運(yùn)行合約A的設(shè)計(jì)者無(wú)意識(shí)到的代碼,這使得情況比典型的順序設(shè)備更接近并發(fā)設(shè)置。[3]特別地,合約B可以在調(diào)用期間修改合約A可能承擔(dān)的狀態(tài)。這是DAO錯(cuò)誤[9],的精髓,合約B在返回[27]之前調(diào)用合約A來(lái)修改A的本地狀態(tài)。然而,重入并不是表現(xiàn)出來(lái)的唯一錯(cuò)誤,因?yàn)?#xff1a;


- 不難想象某種合約被用作其他區(qū)塊(用戶和合約),管理對(duì)共享資源的訪問(wèn)以及在某種意義上作為并發(fā)庫(kù)的場(chǎng)景。隨著多重交易變得越來(lái)越普遍,各種觀察到的干涉模式,也應(yīng)該考慮在內(nèi)。


我們的目標(biāo)和動(dòng)機(jī)。幸運(yùn)的是,在過(guò)去三十年中進(jìn)行的并行和分布式編程的研究為大量的理論和應(yīng)用框架提供了代碼,指定,理由和正式驗(yàn)證并發(fā)對(duì)象及其實(shí)現(xiàn)的框架。因此,本文的目標(biāo)是雙重的。首先,我們將簡(jiǎn)要概述在智能合約中可能發(fā)生的一些已知的并發(fā)問(wèn)題,在更傳統(tǒng)的并發(fā)抽象方面表征問(wèn)題。第二,我們的目標(biāo)是建立一個(gè)直觀的“良好”和“不良”的合約行為,可以相應(yīng)地識(shí)別和驗(yàn)證/檢測(cè),使用現(xiàn)有的正式方法推理并發(fā)。


2.并發(fā)行為示例


在這里,我們討論了已經(jīng)部署在Ethereum塊上的兩個(gè)合約,每個(gè)合并都說(shuō)明了并發(fā)類型行為的不同方面。BlockKing的合約,像今天的Ethereum集團(tuán)許多其他人一樣,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的賭博游戲[2]。雖然BlockKing使用不廣泛,但我們研究它是因?yàn)樗故玖薕raclize服務(wù)的潛在用途[4],這是一種允許合約與塊之外的世界進(jìn)行通信的服務(wù),從而了解真正的并發(fā)性。由于Oraclize服務(wù)的早期采用者將其作為該服務(wù)的演示,并將其源代碼免費(fèi)提供,希望使用Oraclize的許多其他合約可能會(huì)在其實(shí)現(xiàn)中反映出來(lái)。


我們討論的第二個(gè)例子是DAO中廣泛研究的錯(cuò)誤[1]。 DAO與18,000多名投資者建立了一個(gè)業(yè)主管理的風(fēng)險(xiǎn)投資基金;它吸引了當(dāng)時(shí)存在的14%的以太幣。隨后的攻擊使投資者花費(fèi)了大約360萬(wàn)Ether,當(dāng)時(shí)價(jià)值約5000萬(wàn)美元。 DAO采用了我們所說(shuō)的“不協(xié)調(diào)的多任務(wù)”,因?yàn)楫?dāng)DAO向收件人發(fā)送錢時(shí),那個(gè)接收者能夠運(yùn)行代碼,通過(guò)DAO的合約狀態(tài)來(lái)干擾DAO的合約狀態(tài),假設(shè)DAO在調(diào)用期間不會(huì)改變。


2.1BlockKing合約


BlockKing的賭博如下。在任何時(shí)候,都有一個(gè)指定的“塊王”(最初是合約的編者)。當(dāng)發(fā)送方將貨幣發(fā)送到合約時(shí),在1到9之間生成隨機(jī)數(shù)j。如果當(dāng)前塊號(hào)10等于j,則s成為新的塊王。之后,BlockKing在合約中收到了一定比例的資金(根據(jù)不同的參數(shù),從50%到90%),合約的編者將收到余額。


在確定性系統(tǒng)中,生成優(yōu)質(zhì)隨機(jī)數(shù)是很困難,特別是在所有數(shù)據(jù)被公開存儲(chǔ)的情況下,而且對(duì)于攻擊者來(lái)說(shuō),都有經(jīng)濟(jì)激勵(lì)。因此,BlockKing利用信任方WolframAlpha的服務(wù),使用Oraclize服務(wù)生成其隨機(jī)數(shù)。假設(shè)Oraclize是很好的行為,這個(gè)隨機(jī)數(shù)選擇的策略應(yīng)該是攻擊者的預(yù)測(cè)。


BlockKing的代碼有365行,但是在圖1中給出的代碼十分有趣; 這里的行號(hào)是由Etherscan[2]給出的合約的實(shí)際源代碼。當(dāng)貨幣發(fā)送到合約時(shí),輸入函數(shù)被調(diào)用。它設(shè)置一些合約變量(行 299-301)),然后發(fā)送查詢到Oraclize服務(wù)(行 303)。



圖1.BlockKing代碼片段[2]


oraclize_query函數(shù)引發(fā)一個(gè)事件在“真實(shí)世界”中可見,然后返回到其調(diào)用者,然后退出(行 304)。在現(xiàn)實(shí)世界中,Oraclize服務(wù)器監(jiān)視事件日志,服務(wù)請(qǐng)求(在這種情況下通過(guò)聯(lián)系WolframAlpha Web服務(wù)),然后在指定的回調(diào)點(diǎn)(BlockKing中的行 306 )對(duì)原始合約進(jìn)行新的調(diào)用。在事件和其回調(diào)之間,可能會(huì)發(fā)生許多事情,在這種意義上,塊調(diào)用可以在調(diào)用oraclize_query之前推出幾個(gè)塊,并在回調(diào)時(shí)恢復(fù)控制。在此期間,塊狀態(tài),甚至BlockKing合約本身的狀態(tài)可能會(huì)發(fā)生巨大變化。換句話說(shuō),這是塊上的真正并發(fā)行為。


什么可以出錯(cuò)?假設(shè)多個(gè)賭徒希望在短時(shí)間內(nèi)嘗試運(yùn)氣(甚至在同一個(gè)區(qū)塊內(nèi))。合約沒有嘗試追蹤這種行為。因此,每個(gè)新的參賽者都將覆蓋第s 299-301行中的上一個(gè)數(shù)據(jù)(關(guān)鍵warrior塊和warrior變量)。當(dāng)回調(diào)最終發(fā)生時(shí),批次中的最后一名參賽者將享有多次機(jī)會(huì),以贏得該批次中參加其他回調(diào)的參賽者的寶座。罪魁禍?zhǔn)资莵?lái)自process_payment函數(shù)的第 339-347 行,稱為行309中的回調(diào)函數(shù)的最后一行。


每次process_支付函數(shù)被稱為warrior區(qū)塊的最低有效數(shù)字被計(jì)算并存儲(chǔ)到變量singleDigitBlock中.[4]。每次調(diào)用process_支付函數(shù)時(shí),他都有一個(gè)新機(jī)會(huì)匹配第339 行中的隨機(jī)數(shù)。如果數(shù)字匹配,則最后的參賽者在第345行加冠。


2.2DAO合約


DAO的源代碼有1,239行,比BlockKing更復(fù)雜[[23]由于這個(gè)bug已經(jīng)寫得很多了(例如[9,27])),所以我們僅在圖2中給出了關(guān)鍵行。問(wèn)題是第1012行的順序,(通過(guò)一系列進(jìn)一步的函數(shù)調(diào)用)將Ether發(fā)送到msg.sender,在1014 行,將零余數(shù)的msg.sender的帳戶為零。




圖.2.?DAO代買片段[23]


在順序程序中,重新排序兩個(gè)獨(dú)立的操作對(duì)程序的最終行為沒有影響。然而,在并發(fā)程序中,順序無(wú)害的重新排序的效果可以具有顯著的效果,因?yàn)椴僮靼l(fā)生的順序可以影響線程如何干擾。在DAO中,在第1012 行中發(fā)送Ether,在某些多任務(wù)的意義上,產(chǎn)生“位于msg.sender的任意(潛在的惡意)合約的控制。


不幸的是,DAO內(nèi)部狀態(tài)仍然表明該賬戶由于其賬戶余額在第1014 行尚未清零而得到資助。因此,惡意msg.sender可以通過(guò)回調(diào)DAO合約來(lái)啟動(dòng)第二次撤回,該協(xié)議將在當(dāng)控制再次到達(dá)1012行時(shí),轉(zhuǎn)一次付款。事實(shí)上,惡意的msg.sender可以啟動(dòng)第三,第四等撤回,所有這些將導(dǎo)致付款。只有在支付原始余額的許多倍數(shù)之后,最終他的賬戶被清除。


以前對(duì)此bug的分析表明,問(wèn)題是在于遞歸或意外的重入。在狹義上,這是真的,但在更廣泛的意義上,正在發(fā)生的是順序代碼在并發(fā)環(huán)境中運(yùn)行的意義。


3干預(yù)和同步


3.1共享內(nèi)存并發(fā)中的原子更新


圖3描述了錯(cuò)誤使用的并發(fā)對(duì)象的示例(以類似Java8的偽代碼呈現(xiàn)),該實(shí)例應(yīng)該使用get和set方法實(shí)現(xiàn)“原子”計(jì)數(shù)器。由于使用了同步原語(yǔ),左邊的并發(fā)計(jì)數(shù)器的實(shí)現(xiàn)顯然是線程安全的(即無(wú)數(shù)據(jù)競(jìng)爭(zhēng))[17] 。然而,有問(wèn)題的是,在右側(cè)的多線程客戶端代碼中如何使用Counter類的實(shí)例。





圖. 3. 并發(fā)計(jì)數(shù)器(左)及其雙線程客戶端應(yīng)用程序(右)


具體來(lái)說(shuō),有兩個(gè)線程并行運(yùn)行并且它們的操作分離,對(duì)線程2的body內(nèi)的incr()的調(diào)用可能會(huì)發(fā)生在例如在a中的賦值與a之間的調(diào)用c.set(a + 1))調(diào)用thread1。這將使以下assert語(yǔ)句中的條件無(wú)效,使得整個(gè)程序?qū)τ谀硞€(gè)執(zhí)行失敗!


出現(xiàn)這個(gè)問(wèn)題是因?yàn)樵谟?jì)數(shù)器之上的incr()的實(shí)現(xiàn)沒有提供客戶端代碼預(yù)期的原子性保證。具體來(lái)說(shuō),右邊的代碼是假設(shè)incr()的語(yǔ)句之間不會(huì)有任何干擾的,因此計(jì)數(shù)器c將被增加1,a和b將在也是一樣的。實(shí)際上,并發(fā)的運(yùn)行線程2并不總是這樣,不僅a和b將不同,所以后來(lái)的c.set()調(diào)用也將“覆蓋”早期的結(jié)果。


與提供incr()的原子實(shí)現(xiàn)相比,更好的Counter的設(shè)計(jì)實(shí)現(xiàn)可以提供通過(guò)顯式鎖定或通過(guò)Java的同步關(guān)鍵字,fetch-and-increment操作[20,§5.6]來(lái)實(shí)施。然而,給定唯一的兩種方法是獲取和設(shè)置,Counter的實(shí)現(xiàn)具有一個(gè)原子寄存器的同步屬性,該原子寄存器的共識(shí)號(hào)[20,§5.1](即可以明確地同意get和 set)正好是1.因此,而不依賴于一些額外的同步,不給予某些預(yù)先設(shè)定的線程的優(yōu)先級(jí),通過(guò)僅使用get和set來(lái)實(shí)現(xiàn)c的原子增量是根本不可能的。


也許有點(diǎn)令人驚訝的是,盡管圖3的Counter的實(shí)現(xiàn)本身并沒有缺陷,但是它的弱原子性質(zhì)使得它在無(wú)限數(shù)量的線程的存在下變得無(wú)用,使得實(shí)際上不可能做出任何穩(wěn)定的(即,有彈性的關(guān)于并發(fā)變化)關(guān)于其內(nèi)部狀態(tài)的假設(shè)。


3.2并發(fā)區(qū)塊鏈交易中的原子更新


圖4的左邊部分顯示了一個(gè)在Solidity[15]中實(shí)現(xiàn)的智能合約,其功能和方法讓人聯(lián)想到原子并發(fā)計(jì)數(shù)器的功能和方法。函數(shù)get允許一個(gè)查詢與當(dāng)前余額相關(guān)聯(lián)的合約,與一些固定的地址id相關(guān)聯(lián),而集合函數(shù)可以通過(guò)msg.value從消息中獲取新的余額來(lái)更新余額,發(fā)回舊的數(shù)量和因此返回。




圖.4.計(jì)數(shù)器合約(左)和同步testAndSet方法(右)


既然獲取和設(shè)置的兩個(gè)實(shí)體將在一些事務(wù)的過(guò)程中按順序執(zhí)行,那么既不需要同步它們,在Solidity也沒有任何明確的方法。然而,不難看出,作為最簡(jiǎn)單的可能存儲(chǔ)(例如,對(duì)于某些id相關(guān)資金)的實(shí)現(xiàn),由多個(gè)不同方使用以更新其平衡,計(jì)數(shù)器合約與其對(duì)應(yīng)的圖中的Java對(duì)應(yīng),看圖3。


例如,假設(shè)雙方不知道彼此試圖增加一個(gè)數(shù)量的計(jì)數(shù)器存儲(chǔ)的某個(gè)值。由于合約不能為他們?cè)谝粋€(gè)操作中提供一種方法,所以他們必須首先通過(guò)獲取查詢數(shù)量,然后嘗試通過(guò)設(shè)置函數(shù)來(lái)改變它,遵循與圖中實(shí)施incr相同的模式。實(shí)際上,這兩個(gè)調(diào)用都可以在單個(gè)事務(wù)中實(shí)現(xiàn)。但是由于天然氣需求有限,在執(zhí)行過(guò)程中不宜調(diào)用多個(gè)外部合約。此外,獲取的調(diào)用可以由塊的外部的客戶端執(zhí)行,這意味著獲取和設(shè)置的連續(xù)調(diào)用將最終在兩個(gè)不同的事務(wù)中。如果是這種情況,這些調(diào)用可能會(huì)干擾多方嘗試同時(shí)修改Counter的其他事務(wù)。我們將面對(duì)一個(gè)常見的問(wèn)題:不能從本地觀察中預(yù)測(cè)調(diào)用函數(shù)集的結(jié)果。


在共享存儲(chǔ)器和塊狀情況下,問(wèn)題的原因是缺乏強(qiáng)大的同步原語(yǔ),允許在同時(shí)執(zhí)行的情況下同時(shí)觀察和操縱計(jì)數(shù)器。該問(wèn)題的一個(gè)解決方案是增加計(jì)數(shù)器的原子可能性,使用testAndSet函數(shù)增強(qiáng)計(jì)數(shù)器(圖4的右側(cè)部分)。該功能實(shí)現(xiàn)了類似于比較和交換原語(yǔ)[20,第5.8節(jié)](在Intelx86和Itanium架構(gòu)上稱為CMPXCHG)的檢查/更新邏輯,作為實(shí)現(xiàn)多線程之間同步的一種方式。已知testAndSet(和其他一些類似的Read-Modify-Write原語(yǔ))的一致數(shù)量為∞,因此它足夠強(qiáng)大,允許任意數(shù)量的并發(fā)方與操作的結(jié)果一致。


關(guān)于正式推理和驗(yàn)證的注意事項(xiàng)。運(yùn)行時(shí)并發(fā)驗(yàn)證的方法基于探索動(dòng)態(tài)執(zhí)行跟蹤和總結(jié)其屬性,為檢測(cè)違反原子性假設(shè)和缺乏同步提供了有效的工具[26]。例如,通過(guò)將我們的合約轉(zhuǎn)換為相應(yīng)的共享內(nèi)存并發(fā)對(duì)象,可以使用現(xiàn)有工具來(lái)總結(jié)其跟蹤[13],從而可以觀察到不需要的交互模式。


原文:?https://zhuanlan.zhihu.com/p/29291411

總結(jié)

以上是生活随笔為你收集整理的从并发视角来看智能合约(上)【渡鸦论文系列】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。