首页 / 专利库 / 资料储存系统 / 区块链 / 一种区块链智能合约实现方法

一种智能合约实现方法

阅读:49发布:2020-05-08

专利汇可以提供一种智能合约实现方法专利检索,专利查询,专利分析的服务。并且本 发明 涉及 区 块 链 技术领域,具体涉及一种区块链 智能合约 实现方法,大致流程如下:根据收到调用合约 接口 的 请求 ,创建一个新的Lua VM;从链上找到被调用合约的代码,装载到VM;根据运行场景,设置不同运行上下文信息,包括并不仅限于调用者账号信息,转入金额,合约初始化信息,然后,提供相应的接口给合约调用,我们称之为合约API;调用合约接口,根据返回结果,进行后续处理,同时关闭VM;本发明区块链智能合约实现方法使得合约执行实现了去中心化,且操作智能高效、准确性高,成本低。,下面是一种智能合约实现方法专利的具体信息内容。

1.一种智能合约实现方法,其特征在于,包括以下步骤:
(1)上传合约代码,用户构造并发起一个上传合约代码交易,合约代码交易中规定交易费用收取标准,如果费用不足,则交易失败,交易执行成功后,链上会保存一份合约代码,且不可更改,交易的Hash,即是合约代码的地址,用于后续部署合约时使用;
(2)部署合约,用户构造并发起一个部署合约的交易,其中包含了之前上传成功的合约代码的地址,转入合约账户的初始金额,以及初始化合约的参数,每次部署合约时,都会产生一个新的合约账户,为创建该账户,必须向其转入足够的金额;
(3)系统根据代码地址读取合约代码,创建Lua VM,装载合约代码,初始化运行上下文信息,设置可供调用的合约API,然后,调用合约的初始化函数,并传入初始化参数;
(4)若初始化函数执行失败,则交易失败,否则,存储合约的初始化信息到账本,部署成功,此时,查询合约账户,可看到该账户上的资产,以及所对应的合约代码地址;
(5)执行合约操作,用户构造并发起一个调用合约的交易,其中包含了之前部署合约时,所产生的合约账号,调用合约的费用,可选的转给合约账号的金额,以及调用合约的操作码及参数,系统根据合约账号找到其对应的合约代码地址,根据合约代码地址,读取合约代码,创建Lua VM,装载合约代码,初始化上下文信息,设置可供调用的合约API,然后,调用合约的执行函数;
(6)处理执行函数的返回结果,若返回失败,则交易失败,否则,继续后续的处理;
(7)检查交易中的费用是否满足合约所需费用的要求,若不满足,则交易失败,返回错误消息给用户,否则,交易成功。
2.根据权利要求1所述的一种区块链智能合约实现方法,其特征在于,
用户还可发起查询合约状态的请求,其中指定了合约账号,查询的状态码,以及参数,系统根据合约账号找到其对应的合约代码地址,根据合约代码地址,读取合约代码,创建Lua VM,装载合约代码,设置查询合约状态的API,调用合约的查询合约函数;
处理查询合约函数的返回结果,如果返回失败,则返回错误消息给用户,否则,返回查询到的合约状态给用户。
3.根据权利要求1所述的一种区块链智能合约实现方法,其特征在于,
合约代码交易中包含了经过16进制编码的合约代码,合约代码如果不超过4000字节,则不收取额外的交易费用,否则,每1字节收取1个单位的费用。
4.根据权利要求2所述的一种区块链智能合约实现方法,其特征在于,
查询合约函数为:function query (status,arg)
status:查询的合约状态码,其是一个字符串;
arg:查询合约状态的参数,由查询合约的用户以JSON格式提供,但不是必须的,调用前会经过解析,取决于传递的值,其可能是String,Number, Boolean,Table 或 Nil;
返回值:
该函数可以两个返回值,第一个是查询结果码,0表示成功,其它表示失败;第二个是查询的状态信息或失败的原因。
5.根据权利要求1所述的一种区块链智能合约实现方法,其特征在于,
初始化函数为:function deploy (cfg)
cfg:由创建合约实例的用户以JSON格式提供,但不是必须的,最后传递给该函数的cfg是经过解析的,取决于传递的值,其可能是一个String,Number,Boolean或Table,也可能是Nil,即用户没有提供该信息;
返回值:
该函数可以返回一个值,其会被存储下来,在后续执行合约时,作为初始化信息提供,其不可更改。
6.根据权利要求1所述的一种区块链智能合约实现方法,其特征在于,
 执行函数为:
function run (op,arg)
Op:执行合约的操作码,其是一个字符串;
arg:提供给合约操作的参数,由调用合约的用户以JSON格式提供,但不是必须的,调用前会经过解析,取决于传递的值,其可能是String, Number, Boolean, Table 或 Nil;
返回值:
该函数可以包含两个返回值,第一个是必须要有的执行结果码,0表示成功,其它表示失败;第二个是可选的结果消息,其会返回给用户,说明成功的结果或失败的原因。
7.根据权利要求1所述的一种区块链智能合约实现方法,其特征在于,
合约API包括并不仅限于:
(1)存储合约状态;(2)读取合约状态;(3)转出合约账户资产到其它账户;(4)调用其它合约;(5)发布合约事件通知;
其中,(1)、(3)、(4)会修改链上数据,故需在交易上下文执行,可在执行合约的deploy或run接口时,调用(2),(5)可在合约所有合约接口中使用。
8.根据权利要求7所述的一种区块链智能合约实现方法,其特征在于,
后续还可增加其它改变账本状态的API,比如那些系统已经统支持的交易,为了限制一个合约中新增或改变过多的状态,通过设置修改状态的数目的上限以及收费标准,进行相应限制。
9.根据权利要求1所述的一种区块链智能合约实现方法,其特征在于,
可从运行合约的Lua VM中去掉危险或会影响或占用系统资源的API,提高安全性,危险或会影响或占用系统资源的API包括并不仅限于文件IO,Network IO。

说明书全文

一种智能合约实现方法

技术领域

[0001] 本发明涉及区块链技术领域,具体涉及一种区块链智能合约实现方法,特别涉及基于账户模型的区块链通过LVM(Lua Virtual Machine)来运行的智能合约(Smart Contract)的实现方法。

背景技术

[0002] “智能合约”这一术语是1994年由著名密码学家尼克萨博首次提出的,它是通过编程来准确高效地执行预先设定的合约条款,智能合约其实是一种计算机协议,用一段计算机指令实现自我验证、自动执行,并产生可以验证的证据来证明合约操作的有效性,当智能合约的双方在区块链上产生资产交易的时候就会自动触发一段代码来自动完成具体流程,这串计算机代码就是智能合约。实现智能合约就需要“图灵完备”的计算机编程语言。
[0003] 传统合约受到诸如主客观、经济成本、适用范围执行度和执行时间等因素的影响,即使签订合同,我们也无法保证双方都能在规定期限内完整的履行合同规定的内容,对比智能合约和传统合约,智能合约便可以在很大程度上解决这些因素的影响。
[0004] 智能合约的主要特点可以简单地概括为:(1)去中心化:区块链最大的特质就是去中心化,在不信任中创造出信任,基于区块链的智能合约是将合约以数字化的形式写入到区块链中,在区块链优秀特性的加持下自然的具备了去中心化的特点,合约内容公开透明、条理清晰且不可篡改,编程语言就是规束合约的法律条文,交易双方可完全放心的进行交易;
(2)智能高效:整个产生和执行过程都是可追溯、不可篡改的,一旦触发合约就会立即执行,自动按照合约规范进行操作,整个过程智能高效,短时间快速完成更是体现了它的准确和经济;
(3)准确性:区块链共识机制和不可篡改的特性可确保数据准确无误;
(4)低成本:合约的整个执行过程,在区块链系统内自动执行,无需人工干预,大大降低了合约的执行成本,维权成本和运维成本。

发明内容

[0005] 智能合约是现代区块链技术应用到数字货币之外的行业或领域,所以必须具备一种能力,它使得区块链具备高度的可扩展性和编程能力,能够在链上实现更为丰富的应用,扩展生态和应用范围,为此,我们提出了如下智能合约的实现方法,使其具备开发各种区块链应用的能力。
[0006] 一种区块链智能合约实现方法,其特征在于,包括以下步骤:(1)上传合约代码,用户构造并发起一个上传合约代码交易,合约代码交易中规定交易费用收取标准,如果费用不足,则交易失败,交易执行成功后,链上会保存一份合约代码,且不可更改,交易的Hash,即是合约代码的地址,用于后续部署合约时使用;
(2)部署合约,用户构造并发起一个部署合约的交易,其中包含了之前上传成功的合约代码的地址,转入合约账户的初始金额,以及初始化合约的参数,每次部署合约时,都会产生一个新的合约账户,为创建该账户,必须向其转入足够的金额;
(3)系统根据代码地址读取合约代码,创建Lua VM,装载合约代码,初始化运行上下文信息,设置可供调用的合约API,然后,调用合约的初始化函数,并传入初始化参数;
(4)若初始化函数执行失败,则交易失败,否则,存储合约的初始化信息到账本,部署成功,此时,查询合约账户,可看到该账户上的资产,以及所对应的合约代码地址;
(5)执行合约操作,用户构造并发起一个调用合约的交易,其中包含了之前部署合约时,所产生的合约账号,调用合约的费用,可选的转给合约账号的金额,以及调用合约的操作码及参数,系统根据合约账号找到其对应的合约代码地址,根据合约代码地址,读取合约代码,创建Lua VM,装载合约代码,初始化上下文信息,设置可供调用的合约API,然后,调用合约的执行函数;
(6)处理执行函数的返回结果,若返回失败,则交易失败,否则,继续后续的处理;
(7)检查交易中的费用是否满足合约所需费用的要求,若不满足,则交易失败,返回错误消息给用户,否则,交易成功。
[0007] 进一步的,用户还可发起查询合约状态的请求,其中指定了合约账号,查询的状态码,以及参数,系统根据合约账号找到其对应的合约代码地址,根据合约代码地址,读取合约代码,创建Lua VM,装载合约代码,设置查询合约状态的API,调用合约的查询合约函数;
处理查询合约函数的返回结果,如果返回失败,则返回错误消息给用户,否则,返回查询到的合约状态给用户。
[0008] 进一步的,合约代码交易中包含了经过16进制编码的合约代码,合约代码如果不超过4000字节,则不收取额外的交易费用,否则,每1字节收取1个单位的费用。
[0009] 进一步的,查询合约函数为:function query (status,arg)
status:查询的合约状态码,其是一个字符串;
arg:查询合约状态的参数,由查询合约的用户以JSON格式提供,但不是必须的,调用前会经过解析,取决于传递的值,其可能是String,Number, Boolean,Table 或 Nil;
返回值:
该函数可以两个返回值,第一个是查询结果码,0表示成功,其它表示失败;第二个是查询的状态信息或失败的原因。
[0010] 进一步的,初始化函数为:function deploy (cfg)
cfg:由创建合约实例的用户以JSON格式提供,但不是必须的,最后传递给该函数的cfg是经过解析的,取决于传递的值,其可能是一个String,Number,Boolean或Table,也可能是Nil,即用户没有提供该信息;
返回值:
该函数可以返回一个值,其会被存储下来,在后续执行合约时,作为初始化信息提供,其不可更改。
[0011] 进一步的, 执行函数为:
function run (op,arg)
Op:执行合约的操作码,其是一个字符串;
arg:提供给合约操作的参数,由调用合约的用户以JSON格式提供,但不是必须的,调用前会经过解析,取决于传递的值,其可能是String, Number, Boolean, Table 或 Nil;
返回值:
该函数可以包含两个返回值,第一个是必须要有的执行结果码,0表示成功,其它表示失败;第二个是可选的结果消息,其会返回给用户,说明成功的结果或失败的原因。
[0012] 进一步的,合约API包括并不仅限于:
(1)存储合约状态;(2)读取合约状态;(3)转出合约账户资产到其它账户;(4)调用其它合约;(5)发布合约事件通知;
其中,(1)、(3)、(4)会修改链上数据,故需在交易上下文执行,可在执行合约的deploy或run接口时,调用(2),(5)可在合约所有合约接口中使用。
[0013] 进一步的,后续还可增加其它改变账本状态的API,比如那些系统已经统支持的交易,为了限制一个合约中新增或改变过多的状态,通过设置修改状态的数目的上限以及收费标准,进行相应限制。
[0014] 进一步的,可从运行合约的Lua VM中去掉危险或会影响或占用系统资源的API,提高安全性,危险或会影响或占用系统资源的API包括并不仅限于文件IO,Network IO。
附图说明
[0015] 图1为本发明智能合约框架设计示意图。

具体实施方式

[0016] 为了使本领域技术人员更好的理解本说明书实施例中的技术方案,下面将对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部实施例,基于本说明书中的实施例,本领域普通技术人员所获得的其他实施例,都应当属于保护范围。
[0017] 以下详细说明本说明书中各实施例提供的技术方案,需要说明的是,由于以下各实施例所基于的技术思想都是类似的,因此,下文各实施例可互相参照理解。
[0018] 实施例1:进一步的,
我们选择Lua语言作为智能合约的开发语言,原因是:
Lua是一完备的编程语言,具备丰富的生态以及良好的互操作性,同时,为了效率和Host资源访问,可方便通过C/C++扩展其能力;
Lua是一门高效快速的脚本语言,其执行速度快,占用资源少;
Lua可以函数库的方式,被嵌入到宿主程序中使用,集成简单方便。
[0019] 进一步的,每个发布到链上的合约代码,有如下接口要求:
(1)有一个初始化合约接口,该接口只会在创建合约时调用,其形式如下:
function deploy (cfg)
参数说明:
cfg:由创建合约实例的用户以JSON格式提供,但不是必须的,最后传递给该函数的cfg是经过解析的,取决于传递的值,其可能是一个String, Number,Boolean或Table,也可能是Nil,即用户没有提供该信息;
返回值:
该函数可以返回一个值,其会被存储下来,在后续执行合约时,作为初始化信息提供,其不可更改;
(2)有一个执行合约操作的接口,其形式如下:
function run (op,arg)
参数说明:
Op:执行合约的操作码,其是一个字符串;
arg:提供给合约操作的参数,由调用合约的用户以JSON格式提供,但不是必须的,调用前会经过解析,取决于传递的值, 其可能是String, Number, Boolean, Table 或 Nil;
返回值:
该函数可以包含两个返回值,第一个是必须要有的执行结果码,0表示成功,其它表示失败;第二个是可选的结果消息,其会返回给用户,说明成功的结果或失败的原因;
(3)有一个查询合约状态的接口,其形式如下:
function query (status,arg)
参数说明:
status:查询的合约状态码,其是一个字符串;
arg:查询合约状态的参数,由查询合约的用户以JSON格式提供,但不是必须的,调用前会经过解析,取决于传递的值,其可能是String,Number, Boolean,Table 或 Nil;
返回值:
该函数可以两个返回值,第一个是查询结果码,0表示成功,其它表示失败;第二个是查询的状态信息或失败的原因。
[0020] 进一步的,对应上面定义的三个合约接口,每个接口都有其不同的运行时环境和上下文,下面分别说明:
Deploy:其在创建合约或者说初始化或部署合约时,被调用,其拥有存储数据到账本,以及读取的能力,能够获取部署合约的账号信息,能够转出合约账号中的资产到其它账号,部署合约作为一个链上交易执行,保证其原子性,以及其状态数据可在链上存储;
Run:执行合约操作,由合约用户调用,其拥有存储数据到账本,以及读取的能力,能够获取调用合约的账号信息,转入合约账户的金额信息,以及合约初始化信息,能够转出合约账户中的资产到其它账号,部署合约作为一个链上交易执行,保证其原子性,以及其状态数据可在链上存储;
Query: 查询合约状态,由合约用户调用,其可读取存储到账本上的合约数据,以及合约初始化信息,但其不能修改合约状态数据,作为一个非交易的请求执行。
[0021] 进一步的,合约在链上运行的大致流程如下:
(1)根据收到调用合约接口的请求,创建一个新的Lua VM;
(2)从链上找到被调用合约的代码,装载到VM;
(3)根据运行场景,设置不同运行上下文信息,包括并不仅限于调用者账号信息,转入金额,合约初始化信息,然后,提供相应的接口给合约调用,我们称之为合约API;
(4)调用合约接口,根据返回结果,进行后续处理,同时关闭VM;
其中,合约上下文相关的信息在合约代码中通过名为ctx的全局变量访问,其是一个table;
说明:
从描述中,可以得知每次运行合约,都会创建一个新的Lua VM,而不会一直为合约维护一个VM并记录其状态,其原因是:
在每次合约执行后,为其产生和保存一个完整的VM状态,过于消耗空间;
VM状态无法做增量存储,会导致消耗空间迅速增大;
这样做可以减少系统的内存消耗,这也意味着我们不应该依赖全局变量保存跨合约调用的状态,以及状态持久化;
另外,为了安全性,我们从运行合约的Lua VM中去掉了文件IO,Network IO等危险或会影响或占用系统资源的API;
另外,关于合约API:这里只给出关键的用于存取合约状态,以及会改变账本状态的的API;
(1)存储合约状态;
(2)读取合约状态;
(3)转出合约账户资产到其它账户;
(4)调用其它合约;
(5)发布合约事件通知;
其中,(1)、(3)、(4)会修改链上数据,故需在交易上下文执行,可在执行合约的deploy或run接口时,调用(2),(5)可在合约所有合约接口中使用,除了以上接口,后续还会增加其它改变账本状态的API,比如那些系统已经统支持的交易;
进一步的,为了限制一个合约中新增或改变过多的状态,我们对其做了相应限制,并设置了修改状态的数目的上限以及收费标准。
[0022] 进一步的,合约在链上运行的具体流程如下:
(1)上传合约代码,用户构造并发起一个上传合约代码交易,其中包含了经过16进制编码的合约代码,上传的代码大小(16进制编码前),如果不超过4000字节,则不收取额外的交易费用,否则,每1字节收取1个单位的费用,如果费用不足,则交易失败,交易执行成功后,链上会保存一份合约代码,且不可更改,交易的Hash,即是合约代码的地址,用于后续部署合约时使用;
(2)部署合约,用户构造并发起一个部署合约的交易,其中包含了之前上传成功的合约代码的地址,转入合约账户的初始金额,以及初始化合约的参数,每次部署合约时,都会产生一个新的合约账户,与普通账户一样,为创建该账户,必须向其转入足够的金额,但不同于普通账户的是,该账户不是根据生成的某个公钥,计算而来,故其没有对应的私钥,无法通过源账户签名交易的方式转出,而只能在合约调用的上下文,由合约代码转出;
(3)系统根据代码地址读取合约代码,创建Lua VM,装载合约代码,初始化运行上下文,设置可供调用的合约API,然后,调用合约的deploy函数,并传入初始化参数;
(4)若deploy函数执行失败,则交易失败,否则,存储合约的初始化信息到账本,部署成功,此时,查询合约账户,可看到该账户上的资产,以及所对应的合约代码地址;
(5)执行合约操作,用户构造并发起一个调用合约的交易,其中包含了之前部署合约时,所产生的合约账号,调用合约的费用,可选的转给合约账号的金额,以及调用合约的操作码及参数,系统根据合约账号找到其对应的合约代码地址,根据合约代码地址,读取合约代码,创建Lua VM,装载合约代码,初始化上下文信息,设置可供调用的合约API,然后,调用合约的run函数;
(6)处理run函数的返回结果,若返回失败,则交易失败,否则,继续后续的处理;
(7)检查交易中的费用是否满足合约所需费用的要求,若不满足,则交易失败,返回错误消息给用户,否则,交易成功;
(8)用户发起查询合约状态的请求,其中指定了合约账号,查询的状态码,以及参数,系统根据合约账号找到其对应的合约代码地址,根据合约代码地址,读取合约代码,创建Lua VM,装载合约代码,设置查询合约状态的API, 调用合约的query函数;
(9)处理query函数的返回结果,如果返回失败,则返回错误消息给用户,否则,返回查询到的合约状态给用户。
[0023] 上述实施例仅为本发明技术构思及特点,并不能以此限制本发明的保护范围,凡根据本发明精神实质所作的等效变化或装饰,都应该涵盖在本发明的保护范围之内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈