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

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



                                            表 10 Solidity  到  MSVL  的核心转换规则

                           类型                      Solidity程序                      MSVL程序
                                         uint public a=0;           int a and a<== 0 and skip;
                          声明语句
                                         uint[] public arr;         int arr[MAX] and skip;
                                         struct id{                 struct id{
                           结构体            block s                    block m
                                         }                          }
                                                                    function vote (int id){
                                         function vote(uint id) public{   frame(a) and (
                           函数              uint a= id;                 int a and a<== id and skip
                                         }                           )
                                                                    };
                                         throw;
                                                                    skip;
                                         block s ;
                                                                    function fun(int return_value) {
                          转向语句           function fun() {            frame(return_flag)(
                                          return 0;                    int return_flag <== 0 and skip;
                                         }                            return_flag := 1 and return_value:= 0)
                                                                    };
                                         if(expression){            if(expression) then {
                                          block s                     block m
                          条件语句           }else{                     }else{
                                          block s                    block m
                                         }                          }
                                                                    while(e1) {
                                         for(statedef;e1;e2){
                          循环语句             block s                    block m
                                                                     e2;
                                         }
                                                                    }
                                         e1[+, -, *, /, %]e2        e1[+, -, *, /, %]e2
                     含算术运算符的表达式
                                         e1[++, --]                 e1:= e1[+, -]1
                                         e1=e2                      e1:= e2
                     含赋值运算符的表达式
                                         e1[+, -, *, /, %]=e2       e1:= e1[+, -, *, /, %]e2
                                         e1&&e2                     e1 AND e2
                     含逻辑运算符的表达式
                                         e1||e2                     e1 OR e2


                 3.2   引理定义
                    本文在第    2  节定义了   Solidity  状态  µ =< a,σ, M >, 其中网络状态  σ =< b, p,S >. S  表示  storage  存储状态,
                 storage 用于保存合约的状态变量,       M  表示  memory  内存状态, memory  用于保存合约函数内的局部变量. 本文重点
                 关注  Solidity  语言本身的语法操作, 因此可以认为        Solidity  状态   µ 的改变仅由其存储状态    S  和内存状态   M  决定,
                 而  MSVL  中无论是状态变量还是局部变量, 均存放在同一内存中, 没有相应的结构可以区分                         storage 与  memory.
                 因此本文从语义逻辑的角度出发, 将            MSVL  内存分为两部分, 记为      mstorage 与  mmemory, 分别对应  Solidity  中的
                 storage 与  memory. 这两部分对应的  MSVL  内存状态分别记为       s[s] 与  s[m], 当其分别与  Solidity  的存储状态  S  和
                        M  等价时, 认为   Solidity  µ 与  MSVL         s 等价时, 即状态等价. 在本节证明过程不对其分别
                 内存状态                      状态           的内存状态
                 证明.
                    本文使用函数      α  表示内存注入    [24] , 定义为一个从   Solidity  的  storage  地址  addr  或者  memory  地址  loc  到
                 MSVL  的存储位置    (bl,δ m ) 的单射函数, 表明  Solidity  程序中的  addr  或者  loc 对应  MSVL  程序中的块索引  bl 和偏
                 移  δ m .
                    基于内存注入函数       α, Solidity  中的值  v s  和  MSVL  中的值   v m  的等价关系记为  α ⊢ v s ∼ v m , 定义如下:
                          α ⊢ c ∼ c,其中v s = v m = c.
                    ● V1
                                                               ,
                    ● V2   α ⊢ ptr(addr,i s ) ptr(bl,i m ), 其中  v s = ptr(addr,i s ) v m = ptr(bl,i m ), 当且仅当存在  δ m ∈ N 0  满足  α(addr) =
   105   106   107   108   109   110   111   112   113   114   115