比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads

解讀ZKEVM:編譯Solidity源碼到LLVM IR系列(一)_LVM

Author:

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

零知識證明(ZKP)發展至今,大多數方案都是基于低級別表述語言實現的,例如 QAP、R1CS 或 Circuit。盡管 ZKP 不受語言限制,可以使用任何語言定義,但是高級語言所帶來的生成證明的復雜度卻是難以接受的。因此很多區塊鏈技術團隊開始使用新的 DSL 語言去編寫業務邏輯,來實現復雜度較低的證明,但是這種模式卻增加了用戶編寫合約的難度,因為大多數用戶根本沒有時間和精力學習 Rust、C++ 等語言。

Matter Labs 團隊為了解決 ZKP 的圖靈完備問題,引入了 ZINC 這門新的編寫智能合約的語言。 然而該團隊在 Youtube 上一段 ZKEVM 設計視頻中曾公開表示 ZINC 目前并不是圖靈完備的,缺乏循環、遞歸等內容。團隊還表示,為了減少引入新的語言給開發者帶來的學習成本,將嘗試采用 Solidity-> YUL -> LLVM IR-> ZKEVM 的技術路線。

受該視頻啟發,本系列文章將與讀者探討使用 LLVM 編譯器編譯 Solidity /YUL字節碼 到 R1CS 或 Circuit 的過程。盡管該方案后續可能發生重大變化,但是也是一次很好的學習機會。

第一篇 LLVM 介紹

概念

LLVM是模塊化和可重用的編譯器與工具鏈技術的集合, 經常被誤認為是一個單純的編譯器,拿來跟 Clang 和 GCC 進行比較,實際上 Clang 也是僅僅作為 LLVM 項目的一部分單獨發行的。以下是對這幾個概念的詳細介紹。

動態 | 西秀區干部大講堂專題解讀區塊鏈:12月3日,2019年第六期西秀干部大講堂在西秀文化中心開講,邀請中誠區塊鏈研究院副院長、中國金融培訓中心專家講師、國家信息工程研究院專家講師馬強,為全區廣大干部職工專題解讀了區塊鏈相關內容。

講座上,主講人從什么是區塊鏈、區塊鏈核心技術的突破與發展、區塊鏈在各個行業的典型應用、區塊鏈在政務服務和政務監管中的典型應用、探索使用區塊鏈賦能誠信建設、政府部門如何有效參與和監管企業區塊鏈應用等方面,給大家做了詳細的講解,詳細介紹區塊鏈的發展歷程及所帶來的經濟效益,并就區塊鏈的現狀和未來進行具體的分析展望,還與現場的參會人員進行了互動解答。

通過這次講座,大家對區塊鏈在建設網絡強國、發展數字經濟、助力經濟社會發展等方面的作用,有了較為全面的認識,也為今后西秀區在提高運用和管理區塊鏈技術能力、加速推進以信息技術帶動全區經濟高質量發展奠定了一定的基礎。(西秀區委宣傳部)[2019/12/6]

LLVM:LLVM 和虛擬機技術沒有關系。它的名字并不是一個縮寫,而是 LLVM 項目的全稱。LLVM 的目標是提供一個現代化的、基于 SSA 編譯策略的、同時支持靜態和動態編譯任何編程語言的編譯器架構。現在 LLVM 已經發展成為一個由多個子項目組成的總體項目,其中許多子項目已被廣泛應用于學術研究、商業和開源項目中。LLVM 核心庫提供了與編譯器相關的支持,可以作為多種語言編譯器的后端來使用。能夠進行程序語言的編譯期優化、鏈接優化、在線編譯優化和代碼生成。

Clang:是 LLVM 的一個編譯器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等編程語言。Clang 對源程序進行詞法分析和語義分析,并將分析結果轉換為 Abstract Syntax Tree(AST 抽象語法樹) 和LLVM-IR,最后使用 LLVM 作為后端代碼的生成器。

聲音 | 李少平解讀最高法“五五改革綱要”: 要推動區塊鏈存證等科技創新手段深度運用:據中國之聲《央廣新聞》消息,《最高人民法院關于深化人民法院司法體制綜合配套改革的意見》,即《人民法院第五個五年改革綱要(2019—2023)》今日發布。最高人民法院副院長李少平在對該文件進行解讀時表示,“五五改革綱要”在前期工作基礎上,提出要構建中國特色社會主義現代化智慧法院應用體系,不斷破解改革難題、提升司法效能。其中,要推動語音識別、圖文識別、語義識別、智能輔助辦案、區塊鏈存證、常見糾紛網上數據一體化處理等科技創新手段深度運用。[2019/2/27]

GCC:GNU編譯器套件(GNU Compiler Collection)包括C、C++、Objective-C、Java、Go語言的前端,也包括這些語言的庫(如 libstdc++、libgcj 等)。GCC的開發初衷便是一款專為GNU操作系統設計的編譯器。

傳統的靜態編譯器(例如大多數C編譯器)采用三段式設計:前端、優化組件和后端。前端組件解析程序源代碼,檢查語法錯誤,生成一個基于語言特性的 AST(Abstract Syntax Tree)來表示輸入代碼,并提供給優化器。優化器會對AST數據進行相應的優化處理,以便最大程度的提升源代碼的執行效率。優化后的中間表示代碼(IR)會被送往后端程序。后端編譯器會進行指令選擇、寄存器分配等操作,最后將IR轉化為相應平臺的機器碼。

動態 | 律師解讀《區塊鏈信息服務管理規定》:部分要求在現階段實施條件尚不成熟:2月14日,微信公眾號“京都律師”刊文指出,《區塊鏈信息服務管理規定》的部分條款偏向于原則性規定,且部分要求在現階段實施條件尚不成熟,可操作性值得商榷,有以下幾點可供探討和完善: 1.區塊鏈信息服務提供者的概念并未完全明確; 2.區塊鏈信息服務提供者的技術標準并不明晰; 3.區塊鏈信息服務提供者的安全評估流程并未說明; 4.行業自律條件尚不成熟。[2019/2/15]

優化器的作用是采用各種方式使代碼運行得更快,例如刪除死代碼(DCE) 、常量折疊、傳播優化等等策略。 后端(又叫代碼生成器)將代碼與任務指令一一對應起來。除了生成正確的代碼以外,也要與機器設備的特性結合以保證生成代碼的質量。通常編譯器后端包括指令選擇、寄存器分配和指令安排表等功能。JVM 也是采用這種模式,使用 Java 字節碼作為前端與優化器的接口來實現的。

編譯器的分段式架構使得開發分工更加明確。比如擅長編譯器前端設計的開發人員,可以注重于編譯器前端的設計,而不用考慮應該為后端優化器和編譯器后端預留相應的資源以及進行什么樣的配置。這也使得相關社區人員可以快速融入進來,實現自己力所能及的那部分。

三段式的結構設計是非常好的,但是因為各個編程語言的編譯器和優化器的實現沒有采用統一的 AST 和 IR 數據結構,導致對編譯器鏈路的各個組成部分進行重用仍異常困難。

LLVM 編譯器架構

金色財經獨家分析 巨人轉讓區塊鏈相關股份的兩種解讀:被投資公司盈利能力反映在巨人公司的投資損益項,盈利能力存在風險會直接對其財務報表產生風險,而這正是股東看重的地方。巨人公司出售OKC股份,從因“不確定性”而“保護投資者”理由解釋合理充分,轉讓對價2850萬美元占2%左右比例并不高,董事會在其職權范圍內作出決定也不用勞煩整個股東大會,巨人也按照程序做了相同的關聯方解釋,資產并未被低估賤賣,完全符合要求。

然而“不確定性”卻存在兩種解讀。如果解釋為風險,史玉柱等自然展現了擔當與無私;如果解釋為潛在收益,那么OKC成功轉型帶來的利潤巨人公司的廣大股東也是享受不到的。旁人并不知道史玉柱和董事會的想法,但至少,此次減少“區塊鏈”相關的股權,并不能說明OKC或區塊鏈概念的利空。如果真是巨大風險,就沒必要賣給“利益相關方”了,解釋為史玉柱與股東會的“分歧”更為準確。而且值得注意的是,OKC是從經營幣到搞區塊鏈“實業”,更符合政策,有理由是個正向消息。[2018/3/24]

根據上述架構圖我們可以看到 LLVM 編譯器采用的是跟傳統編譯器相同的三段式架構,但存在明顯的區別,即 LLVM 編譯器架構的優化器輸入和輸出都是 LLVM-IR。 LLVM-IR 是 LLVM 框架構建的核心基礎,它確立了IR的規范,使得其不同于傳統的編譯器前后端,將整體架構徹底拆分為三段式,方便開發人員進行分工。

金色財經獨家解讀:韓國區塊鏈協會自律控制案不具備法律效力,但協會可與商業銀行合作關閉不參加宣言的交易所的法幣兌換通道:今天韓國區塊鏈協會發布數字貨幣交易所自律控制案,金色財經第一時間對此方案進行了解析。其中對交易所最重要的一點便是,韓國區塊鏈協會自律控制案不具備法律效力,但介于協會與政府及商業銀行的友好關系,協會可以通過與商業銀行的協議關閉法幣-代幣轉換通道。而這便直接導致了大部分韓國大型交易所一致支持宣言,其中包括bithumb,korbit,coinone等。但upbit或因其主要業務為新幣種交易,拒絕接受宣言。在場的小型交易所也因為此方案對廣告限制的范圍過于廣義,而沒有同意宣言。

一家小型交易所對金色財經表態,他們認為這樣的宣言內容會對中小型交易所造成不利的競爭環境,希望協會能夠重新斟酌此方案。[2017/12/15]

總結:我們經常使用的 Clang 只是一個 LLVM 編譯器前端,它是狹義的 LLVM。 而 GCC 是一個完整的可執行文件,沒有給其它語言的開發者提供代碼重用的接口,因此復用靜態庫做靜態分析或者代碼重構時就會變得特別困難。而且腳本語言經常是通過動態解釋嵌入到即將運行的大型應用程序中,這使得代碼變得非常臃腫,復用其中的某一模塊幾乎不可能。 而 LLVM 作為后起之秀,既傳承了三段式編譯設計,又給開發者提供了可重用的編譯前端和后端的接口,讓開發者幾乎不費力氣就可以完成一個新語言的編譯器前端。

LLVM 編譯過程

LLVM 編譯過程涉及到前端、優化器、后端三部分的交互。具體過程如下:

Clang 讀取源文件,并將源文件進行預處理。預處理的過程主要為:宏展開、導入頭文件等。

詞法分析器通過 Sanner 掃描處理過的源文件,生成 Token 序列,這個過程一般采用 Lex 完成。

語法分析在 Clang 中由 Parser 和 Sema 兩個模塊配合完成。根據定義好的語法(Grammar),對 Token 序列構成的輸入文本進行分析并確定其語法結構。語法分析的過程會使用自頂向下或者自底向上的方式進行推導,最終形成AST(抽象語法樹)。

CodeGen 負責將語法樹從頂至下遍歷,翻譯成 LLVM IR。LLVM IR 既是 Frontend 的輸出,也是 LLVM Backend 的輸入。

通用優化器負責優化 LLVM IR, 可能會進行死代碼刪除(DCE) 、常量折疊、傳播優化等過程。

最后 LLVM 后端根據 LLVM IR 生成特定平臺可執行代碼。

為了方便介紹以下的工具鏈,我們編寫一個簡單的hello.c文件

#includeint main() {        printf('Hello World!');        return 0;}Clang 編譯器

Clang 本身不屬于 LLVM 命令行工具的一部分,但是因為它是基于 LLVM 工具鏈開發的,使得它擁有了其他類似編譯器不具備的功能,使用 Clang 可以將高級語言的源文件編譯為LLVM-IR中間代碼

Clang -S -emit-llvm hello.c

在上面的命令中 參數 “-S” 指定編譯器生成包含具有可讀性匯編代碼的目標文件; 參數 “-emit-llvm” 用于設置編譯器以LLVM-IR的形式生成目標文件,該參數需要配合 “-S” 參數一起使用。當該命令執行完成后,會在當前目錄生成一個名為 “hello.ll” 的文件, 文件名后綴為 “.ll”, 表示這是一個含有可讀 LLVM-IR 代碼的 ASCII 文本文件。

LLVM-IR 解釋器 - lli

通過 lli 命令,我們可以直接調用專門為 LLVM-IR 設計的即時解釋器,解釋器會逐行解釋并執行目標文件內的 IR 代碼。

LLVM-IR 優化器 - opt

通過 opt 命令,我們可以直接在命令行中調用 LLVM 工具鏈提供的 IR 代碼優化器對 LLVM-IR 代碼優化,該優化器同時支持對可讀文本以及二進制格式下的 LLVM-IR 代碼進行優化,并且可以通過參數執行相應的優化策略。

優化策略比較多,這里不一一列舉,只列舉一些常用的策略

-mem2reg:該策略會將IR內的內存級變量引用提升為寄存器級變量引用

“-constprop” :該策略主要是用于 “常量傳播優化”

“-dce” :該策略主要是用于刪除死代碼(無法執行到的代碼)

opt -S -mem2reg -constprop -dce hello.ll

LLVM 靜態編譯器 - llc

llc 是 LLVM 命令行工具提供的一個靜態編譯器。通過該編譯器,可以將一個包含有 LLVM-IR 代碼的 “.ll' 文件編譯為以 “.s” 結尾的為特定平臺架構的匯編代碼文件。

llc hello.ll

執行完上述命令,會在當前目錄生成一個 hello.s 的匯編文件,因為我的機器是 mac os 的,所以生成的匯編文件中會帶有 mac os version 等字樣

LLVM 匯編器 - llvm-as

通過 llvm-as 命令行工具,可以將包含有可讀文本格式的 LLVM-IR 文件轉為二進制格式的 LLVM 比特碼

llvm-as hello.ll

執行完上述命令,會在當前目錄生成一個 hello.bc 的比特碼文件,可以通過 hexdump 查看文件具體內容

LLVM 符號表查看器 - llvm-nm

通過 llvm-nm 命令行工具,我們可以查看一個包含二進制 LLVM-IR 比特碼的 “.bc” 文件內的符號表信息

上述命令中, “-A” 參數表示在輸出結果中顯示每個符號的來源文件名。 查看該輸出可知在這個 LLVM 模塊中存在兩個符號,一個是內部名為 “main” 的符號,該符號對應著源碼中的主函數,“T” 表示該函數是一個全局對象函數。“printf” 符號是引用外部標準庫的函數, 所以用 “U”表示。

上面的實例中,我們生成了多個包含不同狀態的 LLVM-IR 中間代碼,以及面向特定底層平臺架構的匯編代碼,對于這些文件,我們都可以使用 Clang 將其編譯為可執行的二進制文件。

本文簡單介紹了 LLVM 項目,讓讀者能夠了解 LLVM 項目的整體架構,懂得通過改造 LLVM 編譯器前端,可以適配多種高級編程語言,包括 Java、Rust、Solidity 等。 鑒于直接通過 Solidity 生成 LLVM IR 難度較大,且 Solidity 語法變更迅速,開發者可通過 Solidity 生成中間語言 YUL ,將 YUL 作為輸入提供給 LLVM 前端生成 LLVM IR 字節碼,即各種零知識證明需要的表示形式,最后在 ZKEVM 中執行。從理論上來講這套邏輯沒有任何問題,但是實際執行的工程難度還是非常大的,具體細節需要研究后再做定論。

Tags:LVM區塊鏈cLAELLOLVM幣區塊鏈存證PEPE CLASSICHello Art Token

狗狗幣最新價格
關注 UNI V3 那么 Visor 值得你了解_SOR

在上篇文章中《Visor 為 UNI V3 打造,提供 NFT 保險庫服務》簡單說了,在 UNI V3 的變化下,基于 NFT LP 的新玩法。今天繼續講講 Visor 這個東東怎么運作的.

1900/1/1 0:00:00
DeFi生態大爆炸 ZILD 2.0為借貸市場帶來無限想象_DEF

前言:在人類發展道路進程中,各國由于、文化等背景差異,導致經濟發展歷程大不相同。隨著近代全球經濟共同體的建立,世界上大多數國家都采用了市場經濟體制.

1900/1/1 0:00:00
3分鐘了解最新DeFi資管黑馬DePlutus協議_DEP

DePlutus是目前“唯一一個”已上線的,且支持基金專屬代幣功能的成熟資管協議,技術領先程度遠超同類協議搶先構建鏈上金融基礎設施,開啟屬于每個人的鏈上基金時代對于傳統金融市場來說.

1900/1/1 0:00:00
對話黃孫權、MetaDAO:在元宇宙復現「鄉建中國」_DAO

采訪者:唐晗、白魚 訪談嘉賓:Flynn、黃孫權編者按:2021年4月9日-5月7日,由中國美術學院視覺中國協同創新中心空間生產與鄉土實踐研究組主辦的“鄉建中國思想展”在杭州市蕭山區高帆攝影藝術.

1900/1/1 0:00:00
未來交通出行用戶體驗會是什么樣?MobiFi給出解決之道_MOB

2019年,SmartMob團隊在荷蘭贏得了“交通出行馬拉松”大賽勝利,他們希望能夠填補現有出行基礎設施中公共交通和私家車使用量的空白——而這,正是MobiFi的雛形.

1900/1/1 0:00:00
金色說明書 | WeStarter 操作指南_STA

DeFi流動性挖礦火爆一時,吸引了大量投資者參與。為了方便投資者及時了解DeFi挖礦項目的相關信息和挖礦流程,金色財經推出了“金色說明書”系列挖礦教程.

1900/1/1 0:00:00
ads