Page 120 - 《软件学报》2025年第9期
P. 120

王小兵 等: Solidity  到  MSVL  转换的等价性研究                                              4031


                 4   相关工作

                    目前, 国内外学者针对智能合约操作语义的研究主要分为两种, 分别是对于                          EVM  操作语义的研究和对于
                 Solidity  操作语义的研究.
                    2018  年, Zakrzewski [20] 提出了  Solidity  子集的形式化规范, 给出了  Solidity  的核心数据模型和函数修饰符等特
                 殊功能的形式化规范, 对       Solidity  的形式化更注重于动态语义, 采用的是一元函数大步语义               (big-step semantics). 提
                 供了对于    Solidity  语言特性的准确描述和一些核心结构的动态语义, 所提出的语义在                     Coq  中以可执行的形式
                 给出.
                    2019  年, Yang  等人  [25] 提出了一种定义在  Coq  中的  Solidity  子集的形式语义, 称为  Lolisa. 首先将  Solidity  程序
                 翻译成   Lolisa, 使用词法分析器对智能合约进行分析, 生成           Solidity token  流, 并根据  Lolisa 的语法糖, 词法分析器
                 生成相应的    Lolisa token  流. 之后将  Solidity token  流作为解析器参数, 生成智能合约的语法树. 然后将        Lolisa 的
                 token  流作为语法树的    token, 通过语法分析器重建       Lolisa  语法树, 并输出由  Lolisa  重写的形式智能合约. 此外
                 Yang  等人  [26] 还为  Lolisa 在  Coq  中实现了一个经过正式验证的解释器, 称为     FEther, FEther 严格遵循基于  GERM
                 框架的   Lolisa 的形式语法和语义, 保证了智能合约与其正式模型之间的一致性. FEther 是以太坊第一个支持                        Coq
                 混合验证技术的证明引擎, 将符号执行与高阶逻辑定理证明相结合, 包含一组专有的自动策略, 以高度自动化的方
                 式执行和验证     Coq  中的智能合约.
                    2020  年, Jiao  等人  [27,28] 为  Solidity  开发了一种结构化操作语义  (structural operational semantics, SOS). 在
                 Solidity  类型、表达式和语句的规则之下, 抽象出了          K  框架  [29] 中  Solidity  的可执行语义, 能够涵盖官方  Solidity  文
                 档所指定的大部分语义. 重点在于          Solidity  存储  (storage) 和内存  (memory) 访问的语义计算上, 并在  K  框架中实现
                 了所提出的结构化操作语义, 提供了一个可达性逻辑证明. 此外, 以                    DAO  攻击的  4  种变体为实例, 模拟了其在区
                 块链中的行为, 结果表明生成的          Solidity  语义是可执行的, 并且可以通过可执行语义检测到智能合约中的一些漏
                 洞, 有助于验证智能合约中的安全属性.
                    2020  年, Velasco [21] 提出了一种可以在  Maude 中实现的  Solidity  语义. 基于大步语义给出了    Solidity  的高级语
                 义定义, 在一定程度上参考了“Executable operational semantics of Solidity” [27] , 重点关注  Solidity  的内存模型, 给出
                 了详细的语法规则. 给出一个初始规则, 作为其余所有规则的起始点, 当智能合约部署到区块链时会分配一个新地
                 址, 同时得到一个初始状态实例           σ. 依据规则从初始状态        σ  开始执行, 之后给出了访问和更新            Solidity  存储
                 (storage)、表达式、基本语句、变量声明和函数调用的操作语义.
                    2021  年, Marmsoler 等人  [30] 提出了一个在  Isabelle/HOL  中可执行的  Solidity  语义, 这种形式化语义为  Solidity
                 程序建立了交互式程序验证环境的基础, 并允许通过符号执行来检查                      Solidity  程序. 该方法首先在  Isabelle/HOL  中
                 为  Solidity  子集提供了可执行的表示性语义, 然后提出了基于语法的模糊框架, 可以自动验证以太坊区块链的正
                 式语义, 其次使用     Isabelle 的代码生成器从所提出的形式化语义自动生成              Solidity  求值器, 并使用  Haskell 作为代
                 码生成器的目标平台, 为       Solidity  程序构建集成的验证和符号执行环境, 并展示了对常数折叠和内存优化两个例
                 子的形式化验证.
                    2016  年, Luu  等人  [31] 提出了一种用于  EVM  字节码的静态分析工具, 它依赖于符号执行对智能合约的安全性
                 漏洞进行检测. 静态分析方法的优势是为可以静态确认的合约属性实现完全自动化. Oyente 忽略了与智能合约调
                 用和创建相关的几个重要命令, 提供了简化的              EVM  字节码语义. Oyente 是使用    Python  进行开发的符号执行引擎,
                 支持大多数    EVM  操作码, 将智能合约字节码反编译成控制流图, 并执行控制流分析, 使用                     Z3  作为求解器来评估
                 其满足性. Oyente 支持检测多个常见的智能合约安全漏洞, 如交易顺序依赖漏洞、时间戳依赖、异常障碍和重入
                 漏洞. 从区块链中收集了       19 366  份智能合约作为实例, 验证了       Oyente 工具的可行性, 并对其准确率和误判率进行
                 了统计分析. 作为     Solidity  安全性验证的开源工具, Oyente 工具增加了以太坊开发者创建安全可靠的分散式应用
                 程序的能力, 也为其他研究人员奠定了理论基础.
   115   116   117   118   119   120   121   122   123   124   125