Deterministic Client: Enforcing Determinism on Untrusted Machine Code (OSDI 2025)
一句话总结:智能合约等需 adversarial 确定性,传统 WASM/EVM 解释器 TCB 大;DeCl 把 SFI 式机器码验证扩展到确定性子集(x86-64/Arm64),配合确定性 metering 与 LFI 位置无关隔离,SPEC 子集 ~20% 开销,Groundhog 集成相对解释 ~30×、相对 JIT ~2×,沙箱启动 <15µs。
问题与动机
确定性执行目前只能靠定义 IL 的解释器/JIT(WASM、eBPF、EVM),需信任整个翻译栈。SFI 擅长内存隔离(NaCl/LFI),但无人对原生机器码做确定性保证。DeCl 目标:不信任编译器,仅信任小型 verifier + rewriter。
关键观察 / 隐含假设
- 观察 1:确定性可像 memory-safety 一样用「只允许已知语义指令」的静态分析强制执行。
- 依赖假设:runtime 禁用 SMP、提供确定性 syscall API、初始内存清零。
- 可能失效场景:需浮点确定性子集时当前仅整数+SIMD(论文留 future)。
- 观察 2:传统定时器 interrupt 使抢占点非确定;需 branch metering 或指令计数 metering。
- 证据强度:强——两种机制单独描述并评估。
- 假设 1:x86 需 32-byte aligned bundles + W⊕X 防 jump-into-instruction;Arm64 固定宽指令 + W⊕X 足够。
- 可能失效场景:编译器未配合 bundle padding 则验证拒绝。
核心方法
验证器:拒绝非确定性指令(RDRAND、原子 load/store 对等);x86 对 SHLD/BSF 等 guard 未定义输入。
Rewriter:LLVM/GCC 汇编后处理,产可验证二进制。
Metering:分支计数或指令预算确定性抢占。
+LFI:位置无关 sandbox,Linux 进程内多沙箱,快速启动。
Groundhog:替换 WASM 解释路径跑原生合约。
设计取舍
- 取舍 1:拒绝大量指令与浮点,换小 TCB 与近原生速度。
- 取舍 2:torn store 遇页边界直接终止程序,简化 Arm 语义。
- 边界条件:Armv8.0 + 16KiB 页;x86 BMI2(SHRX)用于 branch metering。
实验与结果
- SPEC 2017 子集 + metering + SFI:~20% CPU overhead(x86/Arm64)。
- Groundhog:vs 解释 ~30×,vs JIT ~2×;load+execute <15µs。
- 17 个 Linux bug/CVE 复现路径与 KRR 不同领域——DeCl 侧为合约引擎场景。
Critical Analysis
论证链条
威胁模型清晰 → 指令枚举/BDD → rewriter 产码 → SPEC 与 Groundhog 数字,工程完整。确定性跨微架构依赖 ISA 子集假设,新 CPU 扩展需更新 verifier。
假设压力测试
侧信道:论文称去除 timer/原子后缓解,但 cache 等需 runtime 配合。大型合约是否触及指令预算边界行为一致?浮点 ML 合约不在范围。
实验可信度
SPEC 子集非全套;Groundhog 对比条件需读 §6 配置。与 WASM SIMD 提案演进的对照在 related work。
系统性缺陷
验证拒绝率高时开发者调试成本;论文未讨论 formal proof of verifier 自身。
局限与 Future Work
- 局限 1:整数子集,无 general FP determinism。
- Future work 1:可验证确定性浮点子集。
- Future work 2:与 eBPF 策略统一的跨平台 policy 语言。
相关
- 同会议:OSDI-2025