区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > PEPE > 正文

SAND:解读ZKEVM:编译Solidity源码到LLVM IR系列(一)_Handle

作者:

时间:

零知识证明(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 项目的一部分单独发行的。以下是对这几个概念的详细介绍。

观点:柴犬相关Meme币的上涨不可持续,无需过度解读:金色财经报道,周一,Twitter将网页LOGO图标从蓝鸟更改为DOGE狗狗头像,狗狗币(DOGE)的价格几乎立即飙升,其他几个以柴犬为主题的Meme币也大幅上涨,整个板块平均涨幅为14%。SHIB等大市值代币涨幅达10%,而FLOKI、KISHU和BABYDOGE等小市值代币涨幅达25%。此外,3月份上线的zkSync区块链上的zkDoge和zkShib,涨幅高达100%。

然而,这种上涨不太可能长期持续,一些交易员警告称,这种走势并不预示着更广泛的趋势。

加密货币交易公司Flowdesk首席执行官Guilhem Chaumont表示:“我们不认为这预示着一场长期牛市。恰恰相反,加密市场的上升趋势是有规律的,首先是比特币经历牛市,然后是主要的山寨币,最后是市值较小的代币。[2023/4/6 13:48:07]

LLVM:LLVM 和虚拟机技术没有关系。它的名字并不是一个缩写,而是 LLVM 项目的全称。LLVM 的目标是提供一个现代化的、基于 SSA 编译策略的、同时支持静态和动态编译任何编程语言的编译器架构。现在 LLVM 已经发展成为一个由多个子项目组成的总体项目,其中许多子项目已被广泛应用于学术研究、商业和开源项目中。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后端来使用。能够进行程序语言的编译期优化、链接优化、在线编译优化和代码生成。

Clang:是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言。Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 Abstract Syntax Tree(AST 抽象语法树) 和LLVM-IR,最后使用 LLVM 作为后端代码的生成器。

动态 | 江卓尔解读甘孜藏族自治州通知:冬天枯水期发电少,挖矿的就不要用了:金色财经报道,就甘孜藏族自治州发布《我州积极做好迎峰度冬保电工作》通知一事,江卓尔发微博称,看标题,翻译一下:虽然我们四川甘孜州,夏天丰水期弃水弃电很多,欢迎你们挖矿来用,增加我们收入,但是现在冬天枯水期了,发电少,你们挖矿的就不要用了,各电站要把大部分电卖给电网,不要自己矿场用光光,不然我们电就不够用了,还要从外面买电。[2019/12/26]

GCC:GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Java、Go语言的前端,也包括这些语言的库(如 libstdc++、libgcj 等)。GCC的开发初衷便是一款专为GNU操作系统设计的编译器。

传统的静态编译器(例如大多数C编译器)采用三段式设计:前端、优化组件和后端。前端组件解析程序源代码,检查语法错误,生成一个基于语言特性的 AST(Abstract Syntax Tree)来表示输入代码,并提供给优化器。优化器会对AST数据进行相应的优化处理,以便最大程度的提升源代码的执行效率。优化后的中间表示代码(IR)会被送往后端程序。后端编译器会进行指令选择、寄存器分配等操作,最后将IR转化为相应平台的机器码。

优化器的作用是采用各种方式使代码运行得更快,例如删除死代码(DCE) 、常量折叠、传播优化等等策略。 后端(又叫代码生成器)将代码与任务指令一一对应起来。除了生成正确的代码以外,也要与机器设备的特性结合以保证生成代码的质量。通常编译器后端包括指令选择、寄存器分配和指令安排表等功能。JVM 也是采用这种模式,使用 Java 字节码作为前端与优化器的接口来实现的。

声音 | 证券日报:应正视区块链信息服务备案编号的作用 不可过度解读:据证券日报4月2日报道,日前,国家互联网信息办公室官网发布公告,披露第一批共197个境内区块链信息服务名称及备案编号。值得注意的是,“备案编号”并不能看做是给区块链披上合法的“黄马甲”,应正确认识“备案编号”的作用。网信办表示,备案仅是对主体区块链信息服务相关情况的登记,不代表对其机构、产品和服务的认可,并强调,任何机构和个人不得用于任何商业目的。[2019/4/2]

编译器的分段式架构使得开发分工更加明确。比如擅长编译器前端设计的开发人员,可以注重于编译器前端的设计,而不用考虑应该为后端优化器和编译器后端预留相应的资源以及进行什么样的配置。这也使得相关社区人员可以快速融入进来,实现自己力所能及的那部分。

三段式的结构设计是非常好的,但是因为各个编程语言的编译器和优化器的实现没有采用统一的 AST 和 IR 数据结构,导致对编译器链路的各个组成部分进行重用仍异常困难。

LLVM 编译器架构

根据上述架构图我们可以看到 LLVM 编译器采用的是跟传统编译器相同的三段式架构,但存在明显的区别,即 LLVM 编译器架构的优化器输入和输出都是 LLVM-IR。 LLVM-IR 是 LLVM 框架构建的核心基础,它确立了IR的规范,使得其不同于传统的编译器前后端,将整体架构彻底拆分为三段式,方便开发人员进行分工。

动态 | “区块链”一词入选“汉语盘点2018”国际词解读:人民网刊文《“汉语盘点2018”国际词解读》,“区块链”一词,与贸易摩擦、板门店、伊核协议等一起入选。文中称, 2008 年首次提出区块链概念以来,这项技术快速发展并在全球范围内广泛应用。在全球化、信息化和数字化时代,区块链代表了一种新的技术发展方向,为推动世界经济与国际合作提供了一个新的机会。[2018/12/11]

总结:我们经常使用的 Clang 只是一个 LLVM 编译器前端,它是狭义的 LLVM。 而 GCC 是一个完整的可执行文件,没有给其它语言的开发者提供代码重用的接口,因此复用静态库做静态分析或者代码重构时就会变得特别困难。而且脚本语言经常是通过动态解释嵌入到即将运行的大型应用程序中,这使得代码变得非常臃肿,复用其中的某一模块几乎不可能。 而 LLVM 作为后起之秀,既传承了三段式编译设计,又给开发者提供了可重用的编译前端和后端的接口,让开发者几乎不费力气就可以完成一个新语言的编译器前端。

LLVM 编译过程

LLVM 编译过程涉及到前端、优化器、后端三部分的交互。具体过程如下:

Clang 读取源文件,并将源文件进行预处理。预处理的过程主要为:宏展开、导入头文件等。

词法分析器通过 Sanner 扫描处理过的源文件,生成 Token 序列,这个过程一般采用 Lex 完成。

以太坊安全主管解读硬分叉Constantinople:重建区块哈希值:据Ethnews的报道,今日,以太坊安全主管Martin Swende发布了一系列文章,介绍即将到来的以太坊硬分叉Constantinople正在讨论中的一些特点。文章讨论了V神提出的EIP210提案,Swende解释道,提案将分成三个阶段重建区块哈希值,允许新的区块直接与旧区块不按顺序地连接,增加区块间的连接性。EIP210将按照EDCC或智能合约的方式算入哈希值,“将会强化轻客户端要求”,这个区块哈希值升级将使以太坊用户免于查看历史区块哈希值。[2018/5/1]

语法分析在 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 中执行。从理论上来讲这套逻辑没有任何问题,但是实际执行的工程难度还是非常大的,具体细节需要研究后再做定论。

标签:ANDSANSANDNDBHandleSanta InuSANDMAN币UNDB币

PEPE热门资讯
TOKE:虎符智能链白皮书:易扩展、高性能公链_HSC价格

虎符智能链发布HOO生态白皮书:据官方消息,10月15日,虎符智能链(HSC)发布HOO生态白皮书.

ALT:Colony v2:有效降低市场交易成本的DAO基础设施(上)_ASH

DAOrayaki DAO研究奖金池:资助地址:?0xCd7da526f5C943126fa9E6f63b7774fA89E88d71投票进展:DAO Committee 5/7?通过赏金总量:.

BOX:Sandbox(SAND):你的世界你做主_dekbox币暴跌

Sandbox是一个基于区块链的游戏平台,以打造玩家自己的虚拟世界为特点,玩家可以在其中建立、拥有和盈利他们构建的游戏世界.

MEM:加密彼得专访Meme.com联合创始人Johan Unger:meme 的机会在哪里?_MEME

今年的大趋势除了有 DeFi 和 NFT 之外,还有 meme!狗狗币凭借着它的可爱狗狗图案,就能挤进加密货币市值排行榜前 10,可谓头号 meme 币.

MEME:Arbitrum是Rollup方案最优解?_PLASTIK价格

5月28日,Arbitrum宣布向开发人员开放主网。次日,Uniswap社区以接近100%的支持率通过了「在Arbitrum上部署Uniswap v3」的提案.

比特币:一份关于创建NEAR钱包和质押NEAR的详细教程_fida币最新消息

NEAR钱包是用户存储NEAR资产以及和NEAR应用互动的重要媒介,在整个NEAR生态中扮演着不可或缺的角色.