基于区块链的多语言智能合约编译方法与流程

文档序号:21454210发布日期:2020-07-10 17:48阅读:590来源:国知局
基于区块链的多语言智能合约编译方法与流程

本发明涉及区块链智能合约技术,特别涉及一种基于区块链的多语言智能合约编译方法。



背景技术:

区块链技术是一种新型去中心化信息技术,能安全地存储数字交易和其他数据,信息不可伪造和篡改,是比特币、以太坊等数字货币的底层技术。区块链上的交易确认由所有节点共识完成,共识成功后打包写入区块。区块链维护一个公共的账本,用于存储区块链网络上所有交易,公共账本位于存储区块上任何节点都是一份完整的靠背,从而保证其不可伪造和篡改,并实现信息共享,能提高交易和信息流通的效率。

智能合约是部署在区块链上的一段可自动执行的程序,广泛意义上的智能合约包含编译语言、编译器、虚拟机、事件、状态机、容错机制等。其中,对应用程序开发影响较大的是编程语言以及智能合约的执行引擎,即虚拟机。虚拟机内部执行的智能合约不能直接接触网络、文件系统或者系统中的其他线程等系统资源。合约之间只能进行有限调用。

现有的区块链系统的智能合约在使用时,由于设计上的原因,一般只支持一种或者两种编程语言编写智能合约,例如以太坊支持solidity语言,eos支持c++语言。支持编写智能合约的编程语言单一,只是其中一方面的问题,另一个问题是智能合约编程语言的学习成本较高,例如对于以太坊的智能合约编程语言solidity,需要重新学习。对于eos的智能合约编程语言c++,学习成本较高,不易熟练掌握。这样就为使用智能合约的普通用户或开发者带来一定的困扰:无法快速学习智能合约的编写,无法深入掌握智能合约编程语言。



技术实现要素:

根据本发明实施例,提供了一种基于区块链的多语言智能合约编译方法,包含如下步骤:

编译智能合约的表达式和赋值语句;

编译智能合约的条件判断语句;

编译智能合约的循环语句;

编译智能合约的函数语句。

进一步,表达式和赋值语句包含:数学运算类表达式、关系和逻辑类表达式、带优先级的表达式、赋值语句。

进一步,编译表达式和赋值语句包含如下步骤:

处理表达式或赋值语句的左侧元素,获取入栈指令;

处理表达式或赋值语句的右侧元素,获取入栈指令;

处理表达式或赋值语句的操作符,获取操作指令。

进一步,若左侧或右侧元素是标识符,将左侧或右侧元素在符号表中的索引值入栈,获取标识符入栈指令;若左侧或右侧元素是值类型元素,将值类型入栈,获取值类型入栈的指令。

进一步,按优先级从高到低的顺序,处理表达式或赋值语句的操作符。

进一步,编译条件判断语句包含如下步骤:

编译条件判断语句的条件表达式,获取当前的指令的相对偏移地址,获取条件跳转指令及条件跳转指令的跳转目标地址;

编译条件判断语句主体,获取目标地址;

将目标地址赋值给条件跳转指令的跳转目标地址。

进一步,编译条件判断语句的条件表达式获取的条件跳转指令的跳转目标地址为空。

进一步,编译循环语句包含如下步骤:

编译循环语句开始处的条件表达式,获取代码相对偏移地址,获取条件跳转指令;

编译循环语句的主体,获取代码偏移地址,用代码偏移地址设置条件跳转指令。

进一步,编译函数语句包含如下步骤:

编译函数语句的所有参数,获取每个参数在符号表中的索引值;

生成函数跳转指令和参数调用指令;

编译函数语句的函数主体,获取函数语句的局部变量的数量;

若函数语句缺少返回指令,补足返回指令。

进一步,生成函数跳转指令时,函数跳转指令的跳转目标地址为空。

根据本发明实施例的基于区块链的多语言智能合约编译方法,编译时能够兼容和支持多种编程语言编写的智能合约,提高编译效率,降低对不同程序语言的学习成本,大大降低智能合约的运行门槛。

要理解的是,前面的一般描述和下面的详细描述两者都是示例性的,并且意图在于提供要求保护的技术的进一步说明。

附图说明

图1为根据本发明实施例基于区块链的多语言智能合约编译方法的流程图;

图2为图1中编译表达式和赋值语句的流程图;

图3为图1中编译条件判断语句的流程图;

图4为图1中编译循环语句的流程图;

图5为图1中编译函数语句的流程图。

具体实施方式

以下将结合附图,详细描述本发明的优选实施例,对本发明做进一步阐述。

首先,将结合图1~5描述根据本发明实施例的基于区块链的多语言智能合约编译方法,应用前景广阔。

如图1所示,本发明实施例的基于区块链的多语言智能合约编译方法,具有如下步骤,需要说明的是,执行下述步骤时,没有先后顺序,编译顺序取决于编译区块链智能合约本身。

具体地,如图1、2所示,编译智能合约的表达式和赋值语句。在本实施例中,表达式和赋值语句包含数学运算类表达式、关系和逻辑类表达式、带优先级的表达式、赋值语句。

进一步,如图2所示,编译表达式和赋值语句包含如下步骤:

在步骤s11中,处理表达式或赋值语句的左侧元素,获取入栈指令。

在步骤s12中,处理表达式或赋值语句的右侧元素,获取入栈指令。

进一步,步骤s11和s12中,若左侧或右侧元素是标识符,则在符号表中查找元素后,将左侧或右侧元素在符号表中的索引值入栈,获取标识符入栈指令;若左侧或右侧元素是值类型元素,则将值类型入栈,获取值类型入栈的指令。

在步骤s13中,处理表达式或赋值语句的操作符,获取操作指令。

进一步,在本实施例中,由于表达式的优先级一般指的是对于一元操作符、二元操作符,由于每个操作符优先级不同,当读个操作符处于同一个表达式中,就需要在编译时,先处理高优先级的操作符,后处理低优先级的操作符,但是由于操作符在表达式中的位置随机,需处理完一个操作符之后,再查看其后操作符的优先级,如果后操作符高于当前操作符,则继续调用函数递归处理,否则从当前函数返回,返回的过程中和调用函数的过程相反,会先处理高优先级的操作符,而后处理低优先级的操作符。

具体地,如图1、3所示,编译智能合约的条件判断语句。

进一步,如图3所示,编译条件判断语句包含如下步骤:

在步骤s21中,编译条件判断语句的条件表达式,获取当前的指令的相对偏移地址,获取条件跳转指令及条件跳转指令的跳转目标地址,以检查条件判断语句的结果是否为真,但在本实施例中,在本步骤中,条件跳转指令的跳转目标地址为空。

在步骤s22中,编译条件判断语句主体,获取目标地址。

在步骤s23中,将目标地址赋值给条件跳转指令的跳转目标地址,以确定代码执行流的走向。

具体地,如图1、4所示,编译智能合约的循环语句。

进一步,如图4所示,编译循环语句包含如下步骤:

在步骤s31中,编译循环语句开始处的条件表达式,获取代码相对偏移地址,获取条件跳转指令,以检查循环语句的条件表达式的结果是否为真。

在步骤s32中,编译循环语句的主体,获取代码偏移地址,并用代码偏移地址设置编译上述循环条件时产生的条件跳转指令,即可完成循环语句的编译。

具体地,如图1、5所示,编译智能合约的函数语句。

进一步,如图5所示,编译函数语句包含如下步骤:

在步骤s51中,编译函数语句的所有参数,保存函数的名称和其参数长度到函数表,编译函数的参数,将所有参数当作变量声明处理,将所有变量的名称和类型加入符号表,返回并收集每个变量在符号表中的索引值。

在步骤s52中,生成函数跳转指令和参数调用指令,以在运行时跳过函数定义,只有通过函数调用才能运行函数语句,在本步骤中,暂时设置跳转指令的跳转目标地址为空。进一步,在本实施例中,参数调用指令有2个参数,分别是参数的数量和参数在符号表中的索引值。

在步骤s53中,编译函数语句的函数主体,获取函数语句的局部变量的数量,并保存在函数表中。

在步骤s54中,若函数语句缺少返回指令,补足返回指令即可。

由于各种语言中必要的元素大致有:数学运算类表达式、关系和逻辑类表达式、带优先级的表达式、条件判断语句、循环语句、函数语句、赋值语句,而这些语言元素,可以代表大部分语言中必须出现的特性,对这些语言元素的编译,就能处理大部分语言编译到虚拟机指令集的问题,因此,当编译智能合约时,根据智能合约的语言和结构,按照本发明实施例中记载的对表达式和赋值语句、条件判断语句、循环语句、函数语句的编译方法,进行编译,能够兼容和支持多种编程语言编写的智能合约,大大提高了编译效率,降低了对不同程序语言的学习成本,降低了智能合约的运行门槛。

以上,参照图1~5描述了根据本发明实施例的基于区块链的多语言智能合约编译方法,编译时能够兼容和支持多种编程语言编写的智能合约,提高编译效率,降低对不同程序语言的学习成本,大大降低智能合约的运行门槛。

需要说明的是,在本说明书中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包含……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。

尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1