買比特幣 買比特幣
Ctrl+D 買比特幣
ads
首頁 > Gateio > Info

DSL:剖析六種 EVM 語言:優秀的語言要如何設計_ETH

Author:

Time:1900/1/1 0:00:00

以太坊虛擬機(EVM)是一個256位、基于堆棧、全球可訪問的圖靈機。由于架構與其他虛擬機和物理機的明顯不同,EVM需要領域特定語言DSL。

在本文中,我們將研究EVMDSL設計的最新技術,介紹六種語言Solidity、Vyper、Fe、Huff、Yul和ETK。

語言版本

Solidity:0.8.19

Vyper:0.3.7

Fe:0.21.0

Huff:0.3.1

ETK:0.2.1

Yul:0.8.19

閱讀本文,需要你對EVM、堆棧和編程有基本的了解。

以太坊虛擬機概述

EVM是一個基于256位堆棧的圖靈機。然而,在深入研究它的編譯器之前,應該介紹一些功能特性。

由于EVM是「圖靈完備」的,它會受到「停機問題」的困擾。簡而言之,在程序執行之前,沒有辦法確定它未來是否會終止。EVM解決這個問題的方法是通過「Gas」計量計算單位,一般來說,這與執行指令所需的物理資源成比例。每個交易的Gas量是有限制的,交易的發起者必須支付與交易消耗的Gas成比例的ETH。這個策略的影響之一是,如果有兩個功能上相同的智能合約,消耗更少Gas的合約將被更多采用。這導致協議競爭極端的Gas效率,工程師努力最小化特定任務的Gas消耗。

此外,當調用一個合約時,它會創建一個執行上下文。在這個上下文中,合約有一個堆棧用于操作和處理,一個線性內存實例用于讀寫,一個本地持久性存儲用于合約讀寫,并且附加到調用的數據「calldata」可以被讀取但不能被寫入。

Wintermute CEO:Yearn Finance提案對雙方來說是雙贏:金色財經報道,Wintermute創始人兼首席執行官Evgeny Gaevoy反駁了最近的市場操縱指控,表示引發爭議的Yearn Finance提案對雙方來說是雙贏,該提案的內容是Wintermute 將把 CRV 代幣存入 Yearn,Wintermute 請求提供 350 個 Yearn YFI 代幣的無擔保貸款,價值約 210 萬美元,用于其做市活動,并且僅支付 0.1% 的利息。提議引發了行業內的激烈爭論,凸顯了與做市相關的長期擔憂,包括涉嫌市場操縱、做市操作透明度以及加密交易實踐整體的誠信,許多批評者還認為 0.1% 的利率太低。

Gaevoy 表示,對于做市商來說,這樣的條款很正常。0.1% 的稅率僅僅是出于“法律和會計”原因,實際上應該被視為 0%。Wintermute 通常會出于做市目的而獲得無息代幣貸款,或者使用看漲期權結構,可以選擇在貸款結束時以預先指定的價格購買代幣。Gaevoy 表示,Wintermute 使用代幣貸款為整個 DeFi 提供流動性,但大部分借出的代幣都流向中心化交易所,例如 Binance、Kraken 或 Coinbase。

他說:“如果沒有這些貸款,我們就無法向市場展示真正好的出價和報價,這造成的一個誤解是,因為我們向人們展示了非常好的出價,所以有些人傾向于認為我們正在推高市場。其他人看到有這么多報價,他們認為我們正在拉高拋售。我們想做的其實就是公正的顯示出價和報價,這是我們的核心業務”。

為回應對其提案的反對,Wintermute 已對其提案進行了修訂,包括使用多簽名錢包持有其計劃在 Yearn 質押的 CRV 代幣,并提議將其在 Yearn 的 CRV 代幣抵押期從原先的 6 個月延長至 12 個月,與 YFI 代幣貸款期限相匹配。此外,提案還增加了一項選項,即在 6 個月后提前結束貸款并收回其 CRV 代幣。[2023/8/26 10:03:32]

關于內存的一個重要說明是,雖然它的大小沒有確定的「上限」,但仍然是有限的。擴展內存的Gas成本是動態:一旦達到閾值,擴展內存的成本將呈二次方增長,也就是說Gas成本與額外內存分配的平方成正比。

過去1小時銷毀超600枚ETH:金色財經報道,據ultrasound.money數據顯示,當前以太坊Gas費升至145GWei左右,過去1小時銷毀逾600枚ETH,1小時內以太坊銷毀量最高的為0x9c22d5開頭合約(ClipperV2合約,銷毀144枚ETH),其次為Uniswap Universal Router(銷毀106枚ETH)、Uniswap V2 Router2(39枚ETH)、以太坊轉賬(34ETH)。[2023/5/5 14:44:27]

合約也可以使用一些不同的指令來調用其他合約。「call」指令將數據和可選的ETH發送到目標合約,然后創建自己的執行上下文,直到目標合約的執行停止。「staticcall」指令與「call」相同,但增加了一個檢查,即在靜態調用完成之前,斷言全局狀態的任何部分都未被更新。最后,「delegatecall」指令的行為類似于「call」,只是它會保留先前上下文的一些環境信息。這通常用于外部庫和代理合約。

為什么語言設計很重要

在與非典型架構交互時,特定領域語言是必要的。雖然存在諸如LLVM之類的編譯器工具鏈,但是依賴它們來處理智能合約,在程序正確性和計算效率至關重要的情況下,不太理想。

程序正確性非常重要,因為智能合約默認是不可變的,并且鑒于區塊鏈虛擬機的屬性,智能合約是金融應用程序的熱門選擇。雖然存在針對EVM的升級性解決方案,但它充其量只是一個補丁,最壞的情況是任意代碼執行漏洞。

計算效率也非常關鍵,因為最小化計算具有經濟優勢,但不能以安全為代價。

簡而言之,EVMDSL必須平衡程序正確性和Gas效率,在不犧牲太多靈活性的情況下通過做出不同的取舍來實現其中之一。

語言概覽

Bitfinex錢包地址過去24小時流入約41611枚BTC:金色財經報道,過去24小時,交易所錢包地址中的BTC儲備變化情況如下:

Bitfinex流入4161.1枚BTC,當前持有BTC約19.3萬枚,漲幅2.2%;

Binance流出994.2枚BTC,當前持有BTC約54.1萬枚,跌幅0.18%;

OKX流入455.2枚BTC,當前持有BTC約11.4萬枚,漲幅0.4%。[2023/4/1 13:39:28]

對于每種語言,我們將描述它們的顯著特性和設計選擇,并包括一個簡單的計數功能智能合約。言語流行度是根據DefiLlama上的總鎖定價值(TVL)數據確定的。

Solidity

Solidity是一種高級語言,其語法類似于C、Java和Javascript。它是按TVL計算最受歡迎的語言,其TVL是第二名的十倍。為了代碼重用,它使用面向對象模式,智能合約被視為類對象,利用了多重繼承。編譯器采用C++編寫,計劃在將來遷移到Rust。

可變的合約字段存儲在持久性存儲中,除非它們的值在編譯時或部署時已知。合約內聲明的方法可以聲明為pure、view、payable,或默認情況下是non-payable但狀態可修改。pure方法不會從執行環境中讀取數據,也不能讀取或寫入持久性存儲;也就是說,給定相同的輸入,pure方法將始終返回相同的輸出,它們不會產生副作用。view方法可以從持久性存儲或執行環境中讀取數據,但它們不能寫入持久性存儲,也不能創建副作用,例如附加事務日志。payable方法可以讀寫持久性存儲,從執行環境中讀取數據,產生副作用,并且可以接收附加在調用中的ETH。non-payable方法與payable方法相同,但具有運行時檢查,以斷言當前執行上下文中沒有附加ETH。

Crypto.com宣布正與可口可樂合作推出一系列NFT后,CRO上漲10%:金色財經報道,Crypto.com交易所宣布正與可口可樂合作推出一系列NFT以慶祝 2022 年卡塔爾世界杯后,Crypto.com的Cronos?代幣CRO上漲了10% ,成為過去24小時表現最好的山寨幣之一。[2022/12/6 21:24:27]

注意:將ETH附加到交易中與支付Gas費用是分開的,附加的ETH由合約接收,可以通過恢復上下文選擇接受或拒絕它。

在合約的范圍內聲明時,方法可以指定以下四種可見性修飾符:private、internal、public或external。private方法可以通過當前合約內的「jump」指令在內部訪問。任何繼承的合約都不能直接訪問private方法。internal方法也可以通過「jump」指令在內部訪問,但繼承的合約可以直接使用內部方法。public方法可以通過「call」指令由外部合約訪問,創建一個新的執行上下文,并在直接調用方法時通過跳轉進行內部訪問。public方法也可以通過在方法調用前加上「this.」來在新的執行上下文中從同一合約中訪問。external方法只能通過「call」指令訪問,無論是來自不同的合約還是在同一合約內,都需要在方法調用前加上「this.」。

注意:「jump」指令操作程序計數器,「call」指令為目標合約的執行期間創建一個新的執行上下文。在可能的情況下,使用「jump」而不是「call」更加節約Gas。

Solidity還提供了三種定義庫的方式。第一種是外部庫,它是一個無狀態的合約,單獨部署到鏈上,在調用合約時動態鏈接,并通過「delegatecall」指令訪問。這是最不常見的方法,因為外部庫的工具支持不足,「delegatecall」很昂貴,它必須從持久存儲中加載額外的代碼,并且需要多個事務進行部署。內部庫的定義方式與外部庫相同,只是每個方法必須定義為內部方法。在編譯時,內部庫被嵌入到最終合約中,并且在死代碼分析階段,庫中未使用的方法將被刪除。第三種方式與內部庫類似,但不是在庫內定義數據結構和功能,而是在文件級別定義,并且可以直接導入和在最終合約中使用。第三種方法提供了更好的人機交互性,可以使用自定義數據結構,將函數應用于全局作用域中,并一定限程度上將別名運算符應用于某些函數。

分析師:以太坊有進一步下跌31%的風險:金色財經報道,來自加密貨幣期貨市場的數據顯示,許多投資者似乎在合并后的幾個小時內平倉了對沖頭寸,根據Crypto分析師Ali Martinez的說法,如果ETH跌破 1460 美元的支撐位,可能會進一步跌至1000 美元,較當前價格下跌 31%。 在合并之前,Glassnode 報告說,9 月之后的期貨和期權向后移動表明在事件發生之前存在“賣新聞”的假設。鏈上分析公司Glassnode還強調,即期貨交易者在合并后以折扣價定價ETH,并愿意為下行保護支付溢價。這是基于合并事件后通過期權對 ETH 敞口的需求相對較低。[2022/9/16 7:02:15]

編譯器提供兩個優化通道。第一個是指令級優化器,對最終的字節碼執行優化操作。第二個是近期增加使用Yul語言作為編譯過程中的中間表示,然后對生成的Yul代碼進行優化操作。

為了與合約中的公共和外部方法交互,Solidity規定了一種應用程序二進制接口標準來與其合約交互。目前,SolidityABI被視為EVMDSL的事實標準。指定外部接口的以太坊ERC標準都按照Solidity的ABI規范和風格指南來執行。其他語言也遵循Solidity的ABI規范,很少出現偏差。

Solidity還提供了內聯Yul塊,允許對EVM指令集進行低級別訪問。Yul塊包含Yul功能的子集,詳細信息請參見Yul部分。這通常用于進行Gas優化,利用高級語法不支持的功能,并自定義存儲、內存和calldata。

由于Solidity的流行,開發人員工具非常成熟且設計精良,Foundry是在這方面突出的代表。

以下是用Solidity編寫的一個簡單合約:

Vyper

Vyper是一種語法類似于Python的高級語言。它幾乎是Python的一個子集,只有一些小的不同。它是第二受歡迎的EVMDSL。Vyper針對安全性、可讀性、審計能力和Gas效率進行了優化。它不采用面向對象模式、內聯匯編,并且不支持代碼重用。它的編譯器是用Python編寫的。

存儲在持久性存儲器中的變量是在文件級別聲明的。如果它們的值在編譯時已知,可以將它們聲明為「constant」;如果它們的值在部署時已知,則可以將它們聲明為「immutable」;如果它們被標記為public,則最終合約將為該變量公開一個只讀函數。常量和不變量的值通過它們的名稱在內部訪問,但是持久性存儲器中的可變量可以通過在名稱前面添加「self.」來訪問。這對于防止存儲變量、函數參數和局部變量之間的命名空間沖突非常有用。

和Solidity類似,Vyper也使用函數屬性來表示函數的可見性和可變性。被標記為「@external」的函數可以通過「call」指令從外部合約訪問。被標記為「@internal」的函數只能在同一合約中訪問,并且必須以「self.」為前綴。被標記為「@pure」的函數不能從執行環境或持久存儲中讀取數據,也不能寫入持久存儲或創建任何副作用。被標記為「@view」的函數可以從執行環境或持久存儲中讀取數據,但不能寫入持久存儲或創建副作用。被標記為「@payable」的函數可以讀取或寫入持久存儲,創建副作用,接受收ETH。沒有聲明這個可變性屬性的函數默認為non-payable,也就是說,它們和payable函數一樣,但不能接收ETH。

Vyper編譯器還選擇將局部變量存儲在內存中而不是堆棧上。這使得合約更加簡單和高效,并解決了其他高級語言中常見的「堆棧過深」的問題。但是,這也帶來了一些折衷。

另外,由于內存布局必須在編譯時知道,因此動態類型的最大容量也必須在編譯時知道,這是一個限制。此外,分配大量內存會導致非線性的Gas消耗,正如EVM概述部分中提到的。但是,對于許多用例來說,這個Gas成本可以忽略不計。

雖然Vyper不支持內聯匯編,但它提供了更多內置函數,以確保幾乎每個Solidity和Yul中的功能在Vyper中也可以實現。通過內置函數可以訪問低級位運算、外部調用和代理合約操作,通過編譯時提供覆蓋文件可以實現自定義存儲布局。

Vyper沒有豐富的的開發工具套件,但它有更緊密集成的工具,并且也可以插入到Solidity開發工具中。值得關注的Vyper工具包括Titanaboa解釋器,它具有許多與EVM和Vyper相關的內置工具,可用于實驗和開發,以及Dasy,一種基于Vyper的Lisp,具有編譯時代碼執行功能。

下面是用Vyper編寫的一個簡單合約:

Fe

Fe是一種類似Rust的高級語言,目前正在積極開發中,大部分功能尚未推出。它的編譯器主要用Rust編寫,但使用Yul作為其中間表示形式,依賴于用C++編寫的Yul優化器。隨著Rust原生后端Sonatina的加入,這一點有望改變。Fe使用模塊進行代碼共享,因此不使用面向對象的模式,而是通過基于模塊的系統重用代碼,在模塊內聲明變量、類型和函數,可以以類似于Rust的方式進行導入。

持久存儲變量在合約級別聲明,如果沒有手動定義的getter函數則不可公開訪問。常量可以在文件或模塊級別聲明,并且可以在合約內部訪問。當前不支持不可變的部署時變量。

方法可以在模塊級別或合約內聲明,默認是pure和private。要使合約方法公開,必須在定義前加上「pub」關鍵字,這使得它可以在外部訪問。要從持久化存儲變量中讀取,方法的第一個參數必須是「self」,在變量名前加上「self.」,使該方法具有只讀訪問本地存儲變量的權限。要讀取和寫入持久化存儲,第一個參數必須是「mutself」。「mut」關鍵字表示合約的存儲在方法執行期間是可變的。訪問環境變量是通過將「Context」參數傳遞給方法來完成的,通常命名為「ctx」。

函數和自定義類型可以在模塊級別聲明。默認情況下,模塊項都是私有的,除非加上「pub」關鍵字才能訪問。但是,不要和合約級別的「pub」關鍵字混淆。模塊的公共成員只能在最終合約或其他模塊內部訪問。

Fe暫時不支持內聯匯編,相反,指令由編譯器內部函數或在編譯時解析為指令的特殊函數包裝。

Fe遵循Rust的語法和類型系統,支持類型別名、帶有子類型的枚舉、特征和泛型。目前這方面的支持還有限,但正在進行中。特征可以針對不同類型進行定義和實現,但不支持泛型,也不支持特征約束。枚舉支持子類型,并可以在其上實現方法,但不能在外部函數中對其進行編碼。盡管Fe的類型系統仍在發展中,但它在為開發人員編寫更安全、編譯時檢查的代碼方面顯示出了很大的潛力。

下面是用Fe編寫的一個簡單的合約:

Huff

Huff是一種匯編語言,具有手動堆棧控制和對EVM指令集的最小化抽象。通過「Billions項目組definefn」指令定義,可以接受模板參數以提高靈活性,并指定函數開始和結束時的預期堆棧深度。由于這些函數是內部的,因此無法從外部訪問,在內部訪問需要使用「jump」指令。

其他控制流程,例如條件語句和循環語句可以使用跳轉目標定義。跳轉目標是由標識符后跟冒號定義的。可以通過將標識符壓入堆棧并執行跳轉指令來跳轉到這些目標。這在編譯時解析為字節碼偏移量。

宏由「Billions項目組、Swift和Kotlin到Solidity、Sway和Cairo。學習在這些語言之間無縫切換為軟件工程職業提供了無與倫比的靈活性。最后,重要的是要了解每一種語言背后都需要付出大量的工作。沒有人是完美的,但無數有才華的人付出了大量努力,為像我們這樣的開發者創造安全愉快的體驗。

Tags:ETHDSLMDSETH錢包地址ETH挖礦app下載Etherael指什么寓意DSL幣是什么幣MDS價格MDS幣

Gateio
Merge:V 神:Rollup 二層網絡的三個階段_Merge幣是什么幣

目前有大量的rollup項目,它們處于不同的發展階段。這些項目共有的一個模式是使用了臨時輔助輪:雖然項目的技術仍然不成熟,但為了發展生態的目的,便選擇了提前啟動,而不是完全依賴其欺詐證明或ZK證.

1900/1/1 0:00:00
BTC:美聯儲冷卻加密市場樂觀情緒_比特幣最新價格行情走勢BTCs是不是黃了

美聯儲主席杰羅姆鮑威爾關于“滯脹”的評論和近期加息引發了市場樂觀情緒和投資者的積極回應昨晚,比特幣(BTC)兌美元的價格達到了23,400美元的關鍵水平.

1900/1/1 0:00:00
元宇宙:元宇宙帶來的游戲變革會是怎樣的?_元宇宙體驗館需要投資多少錢區塊鏈工程專業學什么

這場革命將需要整個技術堆棧的創新,從生產管道和創意工具,到游戲引擎和多人網絡,再到分析和實時服務。您安裝了每個人都在談論的新跑酷游戲,您的化身立即獲得了一套新技能.

1900/1/1 0:00:00
BTC:脫水大字報:沒有BTC的領漲會是反轉嗎(1.5)_LSDBTCs是不是黃了

刷推特、看研報累不累?脫水大字報幫你篩選和梳理每日重要市場觀點和研報。該內容由幾位交易員和分析師志愿者利用業余時間完成,請大家關注點贊給予鼓勵.

1900/1/1 0:00:00
BAL:Base鏈上暴漲MEME幣BALD的可疑內幕和部署_BAL價格

本文我們來一起深入了解一下時下火熱的新興meme幣BALD,其在CoinbaseBase鏈上勢頭正猛,神秘的面紗下疑點重重.

1900/1/1 0:00:00
NFT:哪些NFT項目會受到FTX暴雷影響_FTX

好消息是:許多頂級NFT收藏團隊都表示,他們受FTX事件的影響并不大 免于FTX事件影響的有:YugaLabs/BAYCRTFKT/CloneX Azuki Doodles 比特幣鏈上的NFT在.

1900/1/1 0:00:00
ads