《区块链 WebAssembly 虚拟机之 Singlepass 编译器-许雄-周维 .pdf》由会员分享,可在线阅读,更多相关《区块链 WebAssembly 虚拟机之 Singlepass 编译器-许雄-周维 .pdf(31页珍藏版)》请在三个皮匠报告上搜索。
1、区块链webassembly虚拟机之singlepass编译器许雄/周维目录 Wasm介绍 为什么开发新的Wasm JIT 实现方式 Wasm X Blockchain 性能WASM诞生背景Web永恒主题:性能及能力的追求Shockwave/FlashJava AppletActiveXSilverlightAsm.jsNaCl/PNaClWebAssembly 2017年粉墨登场,2019年12月成为W3C标准并被推荐WASM是什么 高性能 接近native速度 快速启动:语言设计适合快速编译 栈式bytecode,体积小 安全 内存安全 控制流安全 跨平台 超过Java bytecode,
2、支持平台更多 技术标准而不是runtime,倾向性更小 多语言 Post-mvp(module (func$fib(export fib)(param i64)(result i64)(if(result i64)(i64.le_u(local.get 0)(i64.const 1)(then(i64.const 1)(else (i64.add (call$fib(i64.sub(local.get 0)(i64.const 2)(call$fib(i64.sub(local.get 0)(i64.const 1)WASM现状WASM应用场景 Web 插件/三方库 轻量级容器 Faas/se
3、rverless 区块链WASM虚拟机 业界有很多wasm虚拟机的实现 实现方式:解释器,JIT,AOTWASM执行模式:解释器while(!terminated)auto insn=insnspc+;switch(insn)case I32_ADD:auto lhs=val_stack.pop();auto rhs=val_stack.pop();auto res=lhs+rhs;val_stack.push(res);break;case.频繁访问内存 所有运算指令都要访问操作数栈 操作数栈保存在堆上,无法映射到寄存器 频繁发生跳转 while:直接跳转 干扰处理器分支预测,性能损失 20
4、-30%switch:间接跳转 SGX 关闭了间接跳转分支预测WASM执行模式:JIT/AOT 把字节码编译成机器码再执行 JIT:实时编译 AOT:提前编译 操作数栈 栈上元素可以直接分配到寄存器 指令分发 不再需要指令分发逻辑,没有额外的跳转指令 相当于直接利用 CPU 本身的指令分发能力WASM执行模式:JIT/AOT 浏览器内置浏览器内置 JIT 引擎引擎 分层编译模式(Tiered)Tier 1-Baseline compiler 基本不做编译优化,编译速度很快 完成编译后立即开始执行 Tier 2-Optimizing compiler 使用传统编译优化,编译速度较慢 后台编译,替
5、换 tier 1 生成的代码 通用型通用型 JIT 引擎引擎 LLVM JIT 生成代码效率很高,编译速度很慢 Cranelift JIT 生成代码效率很高,编译速度较快 Singlepass JIT 类似 baseline compiler执行模式对比执行模式执行模式编译时间编译时间运行时间运行时间总时间总时间SGX移植难度移植难度解释执行无极长极长无LLVM jit长短长极高Cranelift jit较长较短较长高Wasmer Singlepass jit短较短较短中区块链场景,AOT模式需要在链上部署机器码,存在安全风险。为什么我们要开发自己的WASM JIT 蚂蚁链有比较复杂的业务合约
6、,解释器模式无法满足性能需求 在区块链场景,有很高的确定性和安全性要求,和通用虚拟机有差异 AOT模式有注入危险指令以及产生不确定行为的风险 区块链场景对JIT编译速度和执行速度都有很高要求 蚂蚁链有支持 Intel SGX可信执行环境中执行智能合约的需求 业界WASM虚拟机没有满足以上全部需求的实现自研Singlepass编译器 解析 wasm 字节码的同时生成机器指令,一遍完成 传统编译器需要执行许多遍优化,编译速度很慢编译组件OnePassCompilerOnePassCodeGenCodePatcherX64/A64 MachineStateLocalInfoDataLayoutGlo