Move是一種相對發展時間較短的編程語言,但已經在許多Web3.0項目中得到了應用。
CertiK安全專家團隊最近審計了一個支持Move編寫智能合約的新型Layer1區塊鏈。借此機會,我們將為大家整體概述一下Move這一新型編程語言。
鑒于該內容較為專業,在這篇文章中,我們將討論Move及其兩個特性:可編程資源和形式化驗證。
在這一過程中,本文也將展示Move的語法、類型系統和內存模型,并研究工程師在使用Move時可能犯的一些常見錯誤。除此之外,我們也將從技術角度審視Move形式化驗證的潛力及面臨的挑戰。
什么是Move?
Move是一種用于編寫智能合約的特定領域編程語言。最近推出的幾個熱門項目均支持Move語言,包括Aptos、0L和Starcoin區塊鏈。另外還有Sui區塊鏈同樣支持Move語言并將其命名為SuiMove。
Move最初是作為Diem項目的一部分開發的,但這一屬于Meta的基于區塊鏈的支付網絡現在已被解散。
在Diem發表的《為什么要創建Move?》文檔中,其指出“為了成功支持像Diem支付網絡這樣的支付系統,我們需要一種可以對數字資產的所有權進行編碼,并為這些資產的轉移創建程序的編程語言。目前已經有數百種語言在使用,其中一些已經作為原生語言包含到區塊鏈的實現中。
DiemNetworks本可以選擇一種通用語言,如WebAssembly或Java字節碼,或現有的區塊鏈語言,如EVM字節碼或比特幣script。理論上,我們的確應當選擇一種現有的語言,畢竟一種語言的社區、庫、工具都和語言設計一樣重要,而這些都需要多年的時間來建立。從這一角度上來說,應該謹慎創建一種新語言。但最終選擇創建Move是因為我們看到了一個機會——Move將可以幫助我們在幾個重要方面對現有替代方案進行逐步改進。”
Diem需要安全地支持大量的交易,因此其團隊決定以這些目標為基礎創建Move。
可編程資源
Move的關鍵特征之一是它對可編程資源的使用。一個資源直接代表著一條有價值的數據。在Move中,每個持有項目資產的賬戶中通常都存儲著可以直接代表該資產的數據。這與Solidity中項目資產的表示形成了鮮明的對比,從賬戶到他們持有的項目資產數量的映射,Solidity通常是使用一張映射表在智能合約中進行記錄。
Mercury Fund任命Samantha Lewis為合伙人負責Web3和金融科技基金:金色財經報道,Mercury Fund宣布任命Samantha Lewis為合伙人負責Web3和金融科技基金,SamanthaLewis 此前在 Mercury 旗下一些投資組合公司的董事會任職,其中包括區塊鏈初創公司 Topl。Mercury Fund基金于2022年一月推出,其有限合伙人投資者包含多個知名加密機構,比如Galaxy Digital、Digital Currency Group、Accolade Partners、Evanston Capital、Isomer、Hutt Capital、Multiple Capital、Presight Partners和Rockaway,以及個人支持者a16z聯合創始人Marc Andreessen和a16z合伙人Chris Dixon、科技投資者Bo Shao和Erik Voorhees等。(bizjournals)[2023/2/14 12:06:48]
這種對可編程資源的利用有兩個主要優勢。首先,它形成了一個支持高交易率的智能合約編程模型。如果一項交易涉及兩個「僅相互交互」的賬戶,該交易可以與其他交易并行執行。類似于現實生活中,小明在便利店結賬付款并不影響小紅的結賬付款。Aptos區塊鏈就是一個很好的例子,其使用軟件交易存儲器來并行運行交易,并檢測兩個同時進行的交易是否可能發生沖突。
可編程資源的第二個優勢是它們可以自動驗證程序是否存在某些類型的錯誤:例如,資源永遠不會被悄無聲息地刪除或復制——這是由Move編譯器完成的。但是仍然有可能在智能合約代碼中引入算術或邏輯錯誤,從而導致資源中出現不正確的值。
下圖來自GitHub上的Move文檔,顯示了區塊鏈數據在Move中的組織方式。Move將區塊鏈狀態稱為全局存儲。
每個區塊鏈地址代表一個賬戶,其中一些可能是外部擁有的。與以太坊不同的是,所有地址都可以存儲數據。在下圖中,BasicCoin持有者的賬戶中有數據表明他們所持有的BasicCoin數量。該圖顯示,地址0x42還擁有一個實現BasicCoin的代碼模塊。
Binance.US收購Voyager資產的最終聽證會將于3月2日舉行,用戶回收資金價格的計算日暫未確定:1月16日消息,針對Binance.US收購Voyager資產的進程,Voyager無擔保債權人委員會在推特上表示,招標完成后,該交易的利益相關方有28天的時間提出異議,異議截止日期為2月22日,最終確認該筆交易的聽證會定于3月2日舉行,該聽證會提供一周的時間來回應聽證會前的任何異議。
此外該委員會表示,盡管Binance.US向UCC保證,轉移的加密貨幣將受到保護,但鑒于FTX的意外崩潰以及加密貨幣行業的盜竊和欺詐風險,UCC向Binance.US尋求更大的保護。即根據修訂后的購買協議,即在交易結束后,加密貨幣將從Voyager每周轉移到Binance.US,而被轉移的加密貨幣是將立即分配給債權人賬戶的加密貨幣。
此外,針對推特用戶關于“客戶資金回收是基于哪一天的價格”以及“是否有基于個人賬戶計算回收估計的電子表格”,此外該委員會回應稱,Binance.US為Voyager加密貨幣支付的價格將在接近交易截止日期的未來日期確定。加密資產的公平市場價值將決定客戶的資產回收率。客戶將獲得統一的百分比回收,無論他們持有的加密資產(包括USDC)如何。請注意,此回收估計是基于12月18日的現貨價格,因此實際回收將根據Voyager加密貨幣的價值而有所不同。
此前1月11日消息,美國法院初步批準Binance.US以10億美元收購Voyager資產。[2023/1/16 11:14:12]
當使用Move編寫智能合約時,最好的做法是將資源存儲在擁有該資源的賬戶中,而非包含該智能合約代碼的賬戶中。盡管有可能在Move智能合約中實現「Ethereum風格」的資源映射,但涉及此類合約的交易可能無法并行執行。
Move的安全功能
Move包含幾個可幫助開發者創建更安全智能合約的功能。其中就包括上文所提到的“編譯器會檢查資源的基本使用情況”這一功能。Move語言原生就支持形式化驗證,并有意排除了那些容易導致形式化驗證困難的語言結構。
此外,Move還支持泛型。泛型編程允許通用代碼在不同類型中被重復使用。
這一點很重要,因為使代碼更安全的一種方法是重用那些已被專家精心編寫過的代碼,少編寫一些新代碼。就像許多Coin共享實現代碼——如AptosCoin標準所示,通用編程允許該代碼在不同Coin之間共享。
聯邦法官裁定加密企業LBRY未注冊情況下將代幣作為證券出售:金色財經報道,新罕布什爾州的一名法官周一裁定,加密貨幣初創企業LBRY在未向美國證券交易委員會(SEC)注冊的情況下銷售其原生LBC代幣,違反了證券法。美國證券交易委員會在2021年3月起訴LBRY,稱LBC代幣是證券,該初創公司在未向該機構注冊的情況下銷售這些代幣,違反了證券法。LBRY進行了反擊,聲稱LBC代幣不是證券,而且美國證券交易委員會沒有給它公平的通知,說它出售LBC要遵守證券法,因此侵犯了該公司的正當程序權利。法官周一的裁決意味著該案將不會進行審判。定于11月21日舉行狀態聽證會,以確定下一步行動。(coindesk)[2022/11/8 12:29:34]
Move類型系統和Rust
在處理有價值的數據時,追蹤清楚是誰擁有這些數據,并限制對這些數據的操作十分重要。
幸運的是,已經有一種開發完善的支持所有權特性的編程語言:Rust。Move的開發者在類型和語法方面都受到了Rust思想的啟發。
此圖表顯示了Move的內置原始類型:
此圖表顯示了Move的結構類型,這些是由其他類型構建的類型:
當涉及到結構類型時,事情就變得有趣了,結構類型是Move中唯一的用戶定義類型,一個結構類型是一個存儲在字段中的值的集合:
在Move中,結構是一種“value”類型。結構類型的value在內存或存儲中是線性排列的,對一個結構的引用必須明確地構建。這與Solidity不同,在Solidity中,結構變量通常是對底層value的引用。下圖說明了這一點:
Axie Infinity部分早期投資者已將解鎖的AXS代幣轉入交易所,或有拋售傾向:10月26日消息,P2E游戲Axie Infinity代幣AXS于本周開始引來大約2150萬枚AXS(價值2億美元)的大額解鎖,Axie Infinity向早期投資者和內部人士解鎖了首批1000萬枚AXS代幣,這可能會給AXS代幣帶來拋售壓力。區塊鏈數據顯示,一個標記為“Axie Infinity: Token Vesting”的錢包向6個收件人轉移了785334個AXS代幣(價值660萬美元)。據TokenUnlock網站稱,這些收件人在Axie 2020年年中的一輪私人銷售中被列為顧問和早期投資者。
數字資產管理公司Arca是在私募期間購買AXS的機構投資者之一,通過與該公司相關聯的錢包收到了43.75萬枚AXS(約合400萬美元)。但根據Etherscan和Nansen的區塊鏈數據,該錢包將這些代幣全部轉入FTX。另外,數據顯示另一位早期投資者收到17.85萬枚AXS(約合170萬美元)的解鎖代幣后立刻將這些代幣轉移到了幣安 。報道稱,將代幣轉移到交易所表明這些投資者可能會拋售他們的資產,從而從他們的原始投資中獲得巨額利潤。據悉,參與私募的投資者當時以8美分的價格購買了AXS,目前AXS在交易所的價格約為9美元,他們可能會從其初始投資份額中獲得11,150%的利潤。
另TokenUnlock數據顯示,加密投資公司DeFiance Capital和Delphi Digital可以分別收到16萬枚AXS(約合150萬美元)和75萬枚AXS(約合680萬美元)解鎖代幣,區塊鏈數據表明他們尚未收到他們的代幣份額。(CoinDesk)[2022/10/26 16:38:55]
字段可以是除引用類型之外的任何類型,結構的實例是通過打包創建的。
Move為結構類型的value實現了一個類似于Rust的所有權系統,其中每個value都由包含它的變量或字段擁有。引用并不擁有它們所指向的任何value。
默認情況下,結構value只能被轉移到另一個所有者,它們不能被復制或刪除。當一個結構value被轉移到另一個所有者那里時,它將無法被先前的所有者訪問。
在一個結構類型的value被創建后,同一時間只存在該value的一個可以使用的副本。以下代碼說明了這一點:
Michael Saylor:加密市場中的很多代幣屬于“未注冊的證券”:6月21日消息,Microstrategy 首席執行官Michael Saylor在做客NorthmanTrader創始人Sven Henrich的播客節目時表示,流通中的 19,000 多種加密貨幣和數字代幣必須被視為“未注冊證券”,不能將其比作比特幣這樣的硬商品。Saylor認為,加密貨幣和比特幣不能互換使用,因為它們是完全不同的東西。你所看到的是一個價值4000億美元的不透明、未注冊的證券交易,沒有充分和公平的披露,而且它們都與比特幣交叉抵押,但比特幣與加密空間中的幾乎所有其他事物完全相反。Saylor敦促美國證券交易委員會(SEC)就哪些特定的加密貨幣有資格歸類為商品進行記錄,以便將它們與過多的未注冊證券區分開來。[2022/6/21 4:41:25]
Move還有一個稱為abilities的類型特性,它可以控制一個給定類型的value可被允許進行哪些操作——這是受到了Rust的啟發。這四種能力分別是:
Copy:value可以被復制。不具備復制能力的結構在被使用后無法被訪問。
Drop:value可以被刪除。當一個value的所屬變量或字段超出范圍時,該value將被刪除。不具備刪除能力的結構則必須被使用,無法被丟棄。要么明確地銷毀它們,要么將它們“轉移”到其他地方。它們不能被無聲無息地刪除或丟棄。
Store:value可以存儲在全局存儲的其他結構中。
Key:該類型可用作「鍵」來對全局存儲進行訪問。
對于結構類型來說,abilities是在結構類型聲明中聲明的,如下圖所示:
以上內容主要介紹了Move是什么,以及其一個關鍵特性:可編程資源。
接下來我們介紹Move的另一關鍵特性:形式化驗證,及該特性為Move所帶來的優勢和弊端。
深度資源
一個資源是一個只有key和store能力的結構體。在Move中,一個賬號每種類型的資源只能持有一個。資源不能被復制或丟棄,這使得資源適合直接代表價值的物品,例如coin。
賬戶與其資源之間的直接關聯,使得編寫某些「不好的」代碼也變得更加困難,例如導致價值意外損失的代碼。
但是,不正確的計算以及與資源有關的那些更微妙的邏輯錯誤還是有可能會出現。這就是為什么我們強烈建議進行智能合約審計來增強安全保障。
區塊鏈上全局存儲的編程接口執行了一個限制——每個賬戶最多只能持有每個資源的一個副本。
一個程序可以使用以下操作在全局存儲中創建、讀取、更新和刪除資源:
為了避免資源的偽造及其他不當操作,Move執行嚴格的數據封裝。Move的代碼和類型聲明被分組為module。代碼作為module的一部分被部署到一個賬戶中。
當一個結構類型在一個模塊中被聲明時,只有在同一模塊中定義的函數可以訪問該結構類型的字段或創建該結構類型的value。Move結構聲明被視為抽象數據類型,對其module以外的代碼隱藏其內部工作原理。module中的函數默認為私有,只能在模塊內調用。它們可以被聲明為public,這使得它們可以被外部代碼訪問。module可以有friend,也就是他們信任的其他module,并且可以聲明個別non-public方法以供friend訪問。
References
Reference是pointer的一種類型,包括對其使用方式的限制。使用pointer的語言中,一個常見問題是懸掛引用:指向已被重新用于其他目的或被取消分配的內存或存儲。
例如,如果你為一個向量的最后一個元素創建了一個reference,然后縮小了向量,則該reference現在就指向了無效的內存或存儲。懸掛引用和其他與不受限制的pointer相關的問題歷來是導致大多數軟件安全漏洞的原因。
Move處理reference的方式與Rust處理reference的方式類似。它包括類型檢查規則,以確保reference的生命周期不長于原始數據的生命周期。當代碼創建一個reference時,該reference并沒有取得數據的所有權。相反,代碼借用了讀取或寫入數據的能力。
在閱讀Move代碼時,名稱中帶有“borrow”一詞的操作就會產生reference。
Move語言的定義中并不包含對referencechecking的完整描述。
不過,今年有一份詳細的技術論文被發表,該定義中的兩個關鍵規則是:
①?不允許對reference的reference,而且reference不能存儲在結構中。這意味著,當一個函數被調用并帶有一個reference參數時,盡管它可以返回reference,但也不能將reference存儲在一個長期存在的數據結構中。一個函數調用并不會延長reference的生命周期。
②?對局部變量或局部變量字段的reference不能超過局部變量的作用域的終點。
類Rust語法
Move有一種類似于Rust的語法,在某些地方與C風格的語言有些不同。在此,我們總結了一些重要的語法規則,以便更輕松地瀏覽Move代碼。
使用let聲明變量:
類型注釋:type和initializer=e是可選的。當它們被省略時,Move使用類型推理來確定變量的類型。
下圖是一些變量聲明的例子:
Move有典型的表達式,用于算術、移位操作、函數調用、賦值等,用于流程控制的有if、while、for、break和continue等表達式。
函數是使用以下語法聲明的:
其中id是函數的名稱,parameter-list聲明參數,return-type是返回類型。還有一些必要的注釋,如acquires注釋。這些注釋列出了函數從全局存儲中訪問的資源,還有關于可見性的注解。如前所述,函數可以是公共的、私有的,或者可以被friendmodule訪問。
形式化驗證
智能合約安全和正確地運行至關重要,因為其往往持有巨額的資產。形式化驗證是確保一個程序執行其預期操作的最佳技術之一。
在形式化驗證中,工程師編寫規范,并以數學方式表達代碼的預期行為。然后使用工具嘗試檢查代碼是否符合規范。
我們可以將這種檢查視為測試,但這其中有一個關鍵的區別:它不是檢查代碼在某些特定情況下的行為,而是檢查代碼在所有可能情況下的行為。
如果檢查通過,則說明該工具找不到代碼違反規范的用例。不過這并不意味著代碼100%不存在違反規范的情況,因為工具或編譯器的漏洞還是有可能導致錯誤的發生。但這依舊使得其比運行一組測試用例提供了更嚴格的規范保證。
對于一些代碼,特別是復雜的代碼,工具可能無法自動檢查代碼是否符合規范。因此工程師也許需要為一小部分的代碼添加具體化的規范,直到檢查器能夠成功運行為止。工程師甚至可能需要寫證明規則,然后該工具會根據數學原理檢查代碼是否符合這些證明規則。
因為確保智能合約的安全是至關重要的,一些智能合約編程語言會原生就提供對形式化驗證的支持。就像Solidity編譯器提供的SMTChecker工具,它假設requires子句始終為真,然后試圖證明assert子句永遠不會失敗。
Move也對形式化驗證技術進行了集成支持。它含有豐富的用于形式化驗證的規范語言,能夠規范比Solidity的requires和assert子句更復雜的屬性,并且有目的地刪除了會對形式化驗證造成問題的語言結構。Move的開發環境中就包括一個名為“MoveProver”的檢查器。
CertiK由兩位常春藤盟校的計算機科學教授所創立。作為區塊鏈安全領域的先驅,CertiK運用的正是目前最先進的形式化驗證技術。創辦CertiK的兩位教授均是形式化驗證方面的專家,并創建了CertiKOS——世界上第一個也是唯一一個完全被驗證的并發式多核操作系統和管理程序。CertiK致力于通過將形式化驗證技術應用于安全審計以確保智能合約的安全。
因此,CertiK安全專家自然而然地就注意到了Move這一集成了形式化驗證技術的編程語言。
下方是一個double函數及其規范的簡單示例。double函數的功能是將一個64位無符號整數進行翻倍計算。由specdouble給出的double規范從數學上描述了預期的結果。
規范語言是Move的一個集成部分。規范被分離成specblock。specblock指定了函數的前置條件和后置條件。
前置條件需要在函數被調用之前必須為真,以便該函數能夠正常運行。而后置條件則是指當函數返回時必須為真。
此外,specblock還指定了失敗條件。規范語言支持大多數常規Move語法。它還支持用于指定程序行為的重要附加功能,包括forall、exists和implies。
下方是specblock的示例:
MoveProver將規范和程序語義轉換為了邏輯表達式。然后將它們傳遞給可滿足性模理論求解器,例如Z3和CVC5,以證明或反駁。以下大幅簡化的圖表說明了這一點:
形式化驗證有其優勢也有弊端。
形式化驗證被認為是構建可靠程序的“黃金標準”,并被用于許多如NASA這樣的關鍵任務系統。編寫系統行為的形式化規范可以暴露出邏輯上的不一致或思維的不清晰。
然而即使是對于專家來說,將相對簡單的系統進行形式化規范也是困難且耗時的。
除此之外,在處理更復雜的程序或規范時,檢察員也會遇到阻礙,并且可能會需要極長的時間來將其解決。
在CertiK接下來發布的文章中,我們將更深入地探究Move形式化驗證的潛力和其所面臨的挑戰。
由于形式化驗證的復雜性,CertiK在此建議如有需求的用戶應當尋找一個在形式化驗證方向有所建樹的安全機構來進行合約審計或是協助對合約的形式化驗證。
寫在最后
我們希望這篇文章可為想要了解Move語言的讀者提供足夠的參考價值。
Move確實引入了新的方法來解決可擴展性問題以及提高安全性。然而,沒有一種語言可以100%保證安全,非可擴展的或不正確的代碼仍有機會干擾Move的內置功能。
如同Web3.0,兔子洞的存在是永遠數之不盡的。
如果你想了解關于Move技術特點的更多信息,那么建議復制鏈接至瀏覽器訪問這些值得參考的開發人員文檔,并持續關注我們對MoveProver進行的技術深入研究。
來源:星球日報
原文來源:Bryan,IOSGVentures本文將主要討論ZKP作為擴容方案的發展現狀,從理論層面描述產生證明過程中主要需要優化的幾個維度,并引深到不同擴容方案對于加速的需求.
1900/1/1 0:00:00作者:TheDeFiInvestor,編譯:DeFi之道ZK季節來了。隨著人們期待已久的zkEVM擴展解決方案即將推出,一種新的敘事可能會出現.
1900/1/1 0:00:00日本大型服裝企業TSI控股將與阿里巴巴集團旗下的企業等合作,開發網上虛擬空間“元宇宙”服務。將通過舉辦時裝與運動相結合的活動,營造購物環境,與顧客建立新的接觸點.
1900/1/1 0:00:00摘要: -在?FTX?申請破產保護后,美國?CFTC?主席?RostinBehnam?希望獲得監管加密貨幣的新權力.
1900/1/1 0:00:00DeFi數據 1、DeFi代幣總市值:396.9億美元 DeFi總市值及前十代幣數據來源:coingecko2、過去24小時去中心化交易所的交易量25.
1900/1/1 0:00:00頭條 ▌FTX聘請美SEC和CFTC前官員協助調查公司破產原因金色財經報道,FTX已聘請美國證券交易委員會執法部門前聯席主管StevenPeikin和美國商品期貨交易委員會主席前執法主管Jame.
1900/1/1 0:00:00