基于安全多方计算的区块链智能合约执行系统*

2019-06-10 06:43宋晓旭薛显斌秦博涵刘国伟
密码学报 2019年2期
关键词:参与方计算结果合约

朱 岩,宋晓旭,薛显斌,秦博涵,刘国伟

1.北京科技大学 计算机与通信工程学院,北京 100083

2.北京市经济和信息化委员会,北京 100029

1 引言

区块链技术作为一种不可更改、去中心、公开可访问的交易系统,已经被认为是未来金融、医疗、保险、政府等领域的一种潜在革新性的技术.越来越多的研究学者已认识到了区块链技术的颠覆性,并对区块链的安全性进行分析[1].而近年来一种被称为智能合约(smart contract)的区块链技术已被提出,它作为一种两方或多方缔结的、具有法律效力的可执行计算机协议,正受到学术界和工业界的广泛关注.1994年密码学家Nick Szabo[2]首次提出“智能合约”这个术语,指出“智能合约就是执行合约条款的可计算交易协议”,他指出计算机代码可以代替手工操作,进行自动化的复杂数字财产交易,因此在债券、众筹、物流、金融、计算法律学等领域具有广泛的应用前景.

在概念上,智能合约是各方对数字资产转移的一种约定.现有的区块链技术仅支持特定指令集上简单的脚本式语言,不足以支持复杂合约的执行.为了最大限度的保证协议方的权益,避免数字资产由于合约执行而受到非法侵害或包含其中的秘密被泄露,某些情况下要求智能合约的参与方输入具有隐私性以及合约执行过程中对敌手攻击具有抵抗能力.然而,现有的交易指令集仅限制在对合约数据的完整性和所有权认证方面,对于参与方数据的隐私性尚不存在必要的安全措施,同时,脚本运行安全也存在安全风险,例如,2014年3月发生的Mt.Gox 事件中,敌手针对Bitcoin 脚本程序进行攻击,使得85 万个Bitcoin 被盗取.因此,现有交易指令集很难达到上述目标.而针对这一问题已有学者展开研究,例如,文献[3]中提出一种“沙箱” 式的智能合约系统,通过在区块链上存储金融交易的特殊加密形式,从而保护交易隐私不被泄露,但必须保证“沙箱” 的安全,分布式沙箱的构造仍是一个未解决的问题;文献[4]中提出了一种被称为Zerocoin 的比特币加密扩展方案,它通过引入零知识证明来扩展交易协议,以允许完全匿名的货币交易,从而保证货币的隐私性,但此方法不能够支持复杂的业务;类似工作又如文献[5],通过采用数据加密方式,构建了一种拥有隐私保护的基于分类账本的数字货币.文献[6]提出将数字资产创建视为评估行为的过程,搭建基于信誉值的区块链系统,但评估不等于具体的安全措施.总之,上述工作对数字货币的隐私性进行了有益探索,但并没有根本性地解决智能合约的执行安全问题.

安全多方计算(secure multi-party computation,SMPC)理论及实现技术是解决上述问题的一种较好的候选技术.在密码学上,SMPC 是指多方能以协同方式完成一项计算任务,并保持计算过程中各方输入的私密性,以及最终计算结果忠诚方的一致性.文献[7]提出了基于同态加密方式设计求解分布式线性方程组的安全两方计算协议和安全多方计算协议;文献[8]中,作者使用SMPC 以及密钥共享协议构造多租赁用户模型下的外包计算协议.荐于智能合约是对两方或多方交易的程序实现,因此,本文将智能合约的执行视为多租赁用户模型下的外包计算.

已有一些文献提出采用安全多方计算实现智能合约,例如,文献[9]针对Bitcoin 中的货币交易中的忠实性和隐私性问题,提出一种时间相关的承诺(timed commitments)扩展Bitcoin 中的指令集,进一步保证了货币交易的安全.文献[10]扩展了前述工作,实现了一种更加一般化的安全两方计算协议.文献[11]采用Bitcoin 网络设计了一种支持“索赔或退款”(claim-or-refund)的两方公平协议,并将其扩展到带有处罚(penalties)的安全多方计算协议设计中.然而,上述工作主要是针对Bitcoin 网络及其指令集开展的研究,并没有对常用的智能合约开发与安全执行进行研究,因此需要进一步开展安全智能合约执行系统领域的研究.

本文针对区块链中智能合约执行安全问题开展了研究,通过提出基于SMPC 的智能合约框架、面向线性秘密共享的公平安全多方计算算法设计,以及非阻塞信息传递接口(non-blocking MPI),系统性地给出了基于SMPC 的智能合约执行流程、语言结构以及语法规范,实现了具有输入隐私性和计算正确性的公平SMPC 方法,保障了计算节点错误下的安全群组通信,上述工作将为未来智能合约语言的设计开发和执行安全提供理论基础.

2 智能合约系统模型

区块链技术的核心是对交易的支持,通过区块链交易可实现数字资产的创建、转移、变更、终止等过程.文献[12]中概述了现有加密货币中所使用的指令集.现有的交易指令集仅限制在对合约数据的完整性和所有权认证方面,对于参与方数据的隐私性尚不存在必要的安全措施,同时,脚本运行也存在安全风险.交易指令集是为保证比特币中交易安全而提出,它是一种基于栈的脚本式语言,具有以下特点:简单、紧凑、容易理解;不带有循环结构;支持各种密码操作;有限的时间和存储开销;非Turing 完全的.

智能合约是执行合约条款的可计算交易协议,智能合约不是一段简单的可执行程序,在程序中包含财务和法律属性.所以智能合约的制定,需要多个行业的参与,例如金融、法律以及计算机行业等.为了保证用户的数据隐私和数据安全,用户希望在自身信息不被他人获取的情况下协作完成计算任务.基于这些要求,本文提出了一种新的智能合约执行架构,称为基于SMPC 的智能合约执行架构(SMPC-SC).SMPC-SC 将单方执行合约扩展到多方共同完成合约的执行.

图1 基于安全多方计算的智能合约执行系统Figure 1 Execution system of smart contract based on SMPC

当合约运行时,根据合约参与方的要求,智能合约的多方执行环境被建立,SMPC 被用来完成智能合约的安全执行.本文搭建的智能合约执行脚本将智能合约的运行环境配置为SMPC 的执行环境.SMPCSC 的基础架构如图1 所示.系统由合约层、计算层和群组通信层组成,分别对应了区块链结构中的交易层、数据层[13]和共识层.

(1)合约层:合约层封装了合约的调度算法、编辑器以及智能合约.它是实现区块链系统的灵活编程和运行数据的基础.

(2)安全计算层:安全计算层封装了SMPC 的算法以及密钥共享算法,在执行智能合约的计算任务时调用SMPC 算法.

(3)群组通信层:群组通信层封装了P2P 协议、MPI 以及拜占庭协议.P2P 协议强调每个节点地位对等,不存在任何中心化特殊节点.系统的数据传播协议使用的是MPI 协议.共识算法采用的是拜占庭协议.

智能合约的整个执行过程是建立在区块链网络之上的,当智能合约进行计算时,调用计算层的SMPC计算协议,在SMPC 计算协议执行过程中,多方之间使用非阻塞MPI 群组通信协议进行通信.

3 合约层

执行系统中的合约层封装了执行合约的调度算法,解释器以及智能合约的相关算法.在合约层中我们给出了基于SMPC 的智能合约模型,在合约执行过程中将调用安全计算层的SMPC 算法.

3.1 智能合约

区块链是维护数字货币交易的基础技术[14],区块链的核心技术是对交易的支持,通过使用区块链技术,数字资产能够进行创建、交易、更改等操作.区块链对数字资产交易的支持经历了从交易到合约、再到智能合约的过程,三者之间既存在联系也存在差异:

(1)交易:是数字资产转移的记录,以脚本代码的方式在区块链上被体现.区块链依据时间排序记录了系统中所有的交易信息,因此每个有效的交易都能够追溯到上一个交易.

(2)合约:涉及到两方或者多方之间自愿的具有法律效益的协议,合约通常是记录未来数字资产交易的协议.包括具体交易时间、交易流程等.

(3)智能合约:是一种数字形式的承诺,包括合约参与方执行这些承诺的协议,或者说它是能够自动执行合约条款的计算程序.

智能合约不是传统的计算机程序,它的本质是合约.传统的计算机程序是单方执行的,合约是多方达成的协议.智能合约是多方共同完成一个具有法律效益的计算任务,需要中立的公正机构或仲裁机构参与监督合约的运行,确立其合法性.智能合约需要一种安全运行机制保证合约的运行安全,智能合约应该具有以下特性:

(1)公平性:其他参与方不能比忠诚方获取任何优势(忠诚方是指执行过程完全按照指定过程执行的参与方).

(2)正确性:在合约执行结束后,忠诚方的结果是一致的,并且与预期结果相同(预期结果是指单个诚实节点在没有任何攻击的情况下执行整个智能合约所得到的执行结果).

(3)隐私性:对于每个参与方的输入,在合约执行期间,任何参与方不能够获得他人的敏感信息,并且每个参与方获得的输出只包含计算后应该获得的信息.

满足上述特性的智能合约对于区块链来说是很重要的.原因在于数字资产被记录在区块链中,只有这样一种足够安全可靠的合约才能被信任去操作区块链.为此,我们引入了一种密码技术安全多方计算(SMPC),以保证智能合约执行的安全性.SMPC 的引入能够使智能合约满足上述三种特性:

(1)SMPC 强调多方共同参与完成一项计算任务,以及每一方的计算任务相同,这满足了公平性.

(2)正确性体现在SMPC 中所有忠诚方得到的最终结果是一致的.

(3)每一个SMPC 的参与方都不能获得其他参与方的输入,这满足了隐私性.

3.2 智能合约模型

本文通过一个简单的Alice 给Bob 转账的实例来介绍基于SMPC 的智能合约模型.假设Alice 的账户余额为AliceVal;Bob 的账户余额是BobVal;Alice 给Bob 的转账金额是X.整个交易过程是多方参与计算,Bob 将自己的账户余额进行秘密共享给参与方,Alice 将自己的账户余额以及转账金额进行秘密共享给参与方,参与方拿到密文后,直接对密文进行运算,然后将计算结果发送给重构方,重构方进行重构得到最终的计算结果.图2 是以转账智能合约实例展示了基于SMPC 的智能合约的整体框架.

本文在智能合约模型中引入了一个可信方Dealer,它是来管理和监督智能合约的执行过程.事实上,Dealer 不会参与智能合约的计算,Dealer 在执行过程中只是起到了验证和通知的作用,因此Dealer 的存在并不影响智能合约的公平性.为了完成智能合约的执行,本文在智能合约语言中引入了几个控制字符,在转账智能模型中有以下四种控制字符:

(1)@SMPCConfig 定义了基础的操作环境,并建立了操作参数,例如,变量ParmSMPC 定义了SMPC 的参数.

(2)@execute··· 用来规定下面的函数执行者,其他的参与方来验证执行者的身份(例如@execte Dealer 表示,下面的函数由Dealer 完成执行,其他的参与方在函数执行之前,负责验证Dealer的身份).

(3)@before 和@after 表示下面的函数在特定函数之前或者之后执行.

图2 转账智能合约模型Figure 2 Model of transfer smart contract

图3 展示了整个智能合约在运行时的时序和状态转换.智能合约的执行过程要经历四个阶段:初始化阶段,对合约的调用方进行身份验证,初始化合约的执行环境并对合约的数据进行初始化;秘密分享阶段,调用方将计算值进行秘密分发给计算节点;SMPC 阶段,计算节点执行自己的计算任务,最后将计算结果发给Dealer;秘密重构阶段,Dealer 收集计算结果并对其进行重构得出最终结果并将结果传到账本中.

图3 合约的状态转换图Figure 3 Transfer graph of contract state

初始化:验证付款方以及收款方的身份,征集参与计算的节点并对执行环境和数据进行初始化.

(1)身份认证.智能合约使用secp256kl 椭圆曲线[15]派生的公钥导出地址,通过使用相应的私钥和椭圆曲线数字签名算法生成签名,证明地址所有权,从而来验证Alice 和Bob 的身份.认证Alice的身份,验证者Dealer 向Alice 发送一个挑战(challenge),Alice 对挑战进行签名,给Dealer 发送响应(response),Dealer 对Alice 发送的response 用公钥进行认证,从而认证Alice 身份;同样的,认证Bob 的身份.

(2)征集计算节点.这里需要至少征集100 个节点,从100 个节点中随机选取10 个节点作为参与者参与计算(此处征集结点数以及随机选取节点数并非定值,本文为方便描述将其赋值为100 和10);将参与者ip 存入公共存储区的“machines” 文件中.

(3)环境和数据的初始化.连接machines 文件中列出的机器并启动每台机器的守护进程,以及获取参与运算机器的数量,并计算门限t=2 num/3.

当上面三个动作全部完成后,Dealer 通知调用者Alice 和Bob 进入秘密分享阶段.

秘密分享:对于Alice 来说,转账动作是付款,是用Alice 账户余额减去转账金额X;对于Bob 来说,转账动作是收款,是将X加到Bob 账户余额中.Alice 和Bob 将参与计算的值进行秘密分享.

(1)Alice 将自己的账户余额AliceVal 以及转账金额X 进行秘密分享,这里需要保证至少t个节点成功接收秘密分享片段(这里调用第4 节安全多方计算模型中的SPSharingProtocol( )函数来进行秘密共享).

(2)Bob 将自己的账户余额BobVal 进行秘密分享,和Alice 密钥分享过程相同,这里需要保证至少t个节点成功接收秘密分享片段.当Alice 和Bob 秘密分享结束,Dealer 通知所有参与节点进行SMPC.如果少于t个节点成功接收了秘密片段,Dealer 通知Alice 和Bob 重新进行秘密共享.

SMPC:计算节点调用安全计算层的SMPC 算法去完成合约的计算过程,当自己的计算任务完成之后,将结算结果发送给重构方,如果重构方收到的正确的计算结果少于t个,那么计算节点重新进行计算阶段.

秘密重构:重构方收到计算节点发送的计算结果,进行秘密重构得到最终的结果.秘密重构要求至少有门限值t个正确的结果,才能重构出正确的最终结果.在重构阶段,调用安全计算层中的秘密重构算法.除此之外,智能合约的计算结果上传到区块链上,这里涉及到签名和认证过程.

智能合约是存储在区块链中,一旦有人调用智能合约,区块链节点开始执行上述操作,完成智能合约的调用.

4 安全多方计算

安全多方计算(SMPC)是n个参与者P1,P2,···,Pn,需要共同执行某一个计算任务

每一方Pi只能得到自己的输入xi,并且只能获得自己的输出yi,SMPC 有以下安全要求:

(1)忠诚性,大部分的参与方是忠诚的,忠诚是指参与方完全按照规定执行任务.

(2)终止性,在有限的时间中,忠诚方能够终止执行计算任务.

(3)隐私性,任何参与方Pi不能够得到其他参与方的输入xj(ij).

(4)一致性,所有忠诚方最终得到相同的输出y1=y2=···=yn.

如果对于大小为n的域中,少于t个参与方是不诚实的(多数参与方式忠诚的,例如t

由于智能合约需要中立的公正机构或仲裁机构参与监督合约的运行,在这里引入SMPC,使公正机构或仲裁机构不仅仅起到一个监督作用,而且还让它们参与智能合约的执行.SMPC 的执行过程中,每一方的计算任务是一致的,不存在任何中心化特殊节点,由此特性可以保证引入SMPC 的智能合约的公平性.SMPC 隐私性的特性体现到智能合约中,保护合约各方的输入信息的私密性,保证了智能合约的隐私性.

由于MPI 支持非阻塞通信,可以满足SMPC 中门限是t的要求.如图4 所示是SMPC 加减法的流程图.根据SMPC 的加减法流程图给出的数据流图,假设参与方为n个,以计算a与b的和为例,整体数据的流向图如图5 所示.

SMPC 算法的执行过程是建立在MPI 多方通信机制上,但进行秘密分享时,由于需要发送给每方的密钥片段是不同的,所以调用MPI 中的散发函数,将密钥片段发送给参与计算的参与方.当各方通过MPI非阻塞通信收到密钥片段后,对其进行计算,然后通过MPI 非阻塞通信将计算结果发送给重构方.重构方通过MPI 中的收集函数收集其它方的计算结果,将收到的结果进行秘密重构得出最终结果.

SMPC 的加减法运算主要分为以下三个阶段:

(1)秘密分享:利用Shamir 的秘密共享方案[16]使用拉格朗日插值公式完成了基本的(t,n)门限秘密共享,其过程如下:在Fp中,对于给定的秘密a,随机选取t−1 个随机数(r1,r2,···,rt−1),令r0=a构成多项式方程.对于分布式计算中的任意具有标识的成员Pi(其中,i∈[1,n])所获得秘密a的共享值为ai=fa(xi);同样地,对于给定的秘密b,随机选取t−1个随机数(l1,l2,···,lt−1),令l0=b构成多项式方程对于分布式计算中的任意具有标识xi的成员Pi所获得秘密b的共享值为bi=fb(xi);

(2)计算阶段:每个成员Pi通过MPI 非阻塞通信中的接收函数接收需要计算的数值,分别进行各自的计算,得出计算结果ci,将计算结果通过MPI 非阻塞通信中的发送函数发送;

(3)秘密重构:成员使用MPI 通信中的收集函数,收集其他节点发送来的结果,然后进行秘密重构.如果由m(mt)名成员所计算的结果{c1,c2,···,cm} 恢复出原始秘密值c,那么可求解出其中称(α1,α2,···,αn)为一个重组向量.伪代码中使用MPI 通信函数中的收集函数,收集成员Pi的发来的ci,然后进行秘密重构,得出最终的结果.

图4 安全多方计算加减法流程图Figure 4 Flow chart of SMPC addition and subtraction

图5 安全多方计算加法数据流图Figure 5 Data flow chart of SMPC addition and subtraction

为了保证上述安全多方计算过程的抗攻击性,进一步引入可验证秘密共享机制如下:取乘法群的一个p阶生成元为g获得循环子群,采用可验证秘密分享对a进行分享,将(其中p|(q−1))进行广播,那么通过验证等式是否成立即可验证分享fa(x)是否正确.同样的采用可验证密钥分享对b进行分享,将进行广播,那么通过验证等式是否成立,即可验证分享fb(x)是否正确.通过验证是否成立即可验证fa(x)+fb(x)的计算结果是否正确.这至少有t方计算结果正确才能重构出最终正确的计算结果,即门限值为t.

5 基于MPI的多方通信机制

安全多方计算中实现多名参与者之间的高效通信问题是极其重要的,本文采用MPI[17,18]通信机制,满足在安全多方计算过程中的通信要求.

表1 中的函数属于MPI 系统函数,其中Init()初始化MPI 执行环境,建立多个MPI 进程之间的联系,为后续通信做准备;Finalize()函数来终止MPI 的执行环境.Size()函数返回在给定通信域中所包含的进程个数,即参与方个数;Rank()函数返回给定通信域中的进程号,即给定参与方id.

表1 MPI 中的系统函数Table 1 System functions in MPI

表2 中描述的是调用的MPI 中的通信函数,MPI 应用于多方安全计算通信时,主要应用的函数是广播,收集,散发以及全交换函数.将任务进行秘密的分发调用Scatter()函数,将生成的分享片段分发给参与方;各方调用Gather()函数收集密钥片段;调用Alltoall()函数来完成各方之间的完全消息交换.

表2 MPI 中的通信函数Table 2 Communication functions in MPI

在本文的SMPC-SC 执行系统中,主要使用上述功能来实现底层通信.在系统中可能存在两种攻击:截断攻击以及通信私密性攻击.在MPI 中为防止截断攻击,这里采用非阻塞范式来解决,而通信私密性问题主要是通过计算层中的安全多方计算解决.

本文通过时间约束以及门限限制来防止截断攻击:

(1)时间约束:在一定的时间内,完成通信或者结束通信.

(2)门限限制:在时间约束的前提下,增加门限限制.在通信被关闭之前消息正确传输的数量必须不少于门限值.

在MPI-2.2 版本中点对点通信已经满足了阻塞和非阻塞通信的功能.阻塞调用是指调用结果返回之前,当前线程被挂起,直到得到结果之后才会返回;非阻塞指在不能得到返回结果之前,该调用不会阻塞当前进程.对于一个有效的非阻塞通信,要求在有限的时间内通信必须被关闭,同时要保证忠诚方的数量超过了门限值.安全多方计算的底层异步通信过于复杂,不便于描述,下面仅仅对简单的发送和接收函数进行描述.

图6 展示了非阻塞通信的发送函数加上时间约束和门限限制之后的流程图.首先建立一个时间约束,这里假设在时间tc内,使用Isend 函数向n个进程发送n条消息.最终所使用的时间记为tc′,所成功发送的消息数量记为n′.在时间tc内,n条消息全部发送,通信被关闭;当tc′tc时,如果超过了n条消息被成功发送,那么关闭通信成功,通信被关闭;其他情况,通信是失败的.

实现的伪代码如图7 所示,在伪代码中,接收函数和发送函数类似,使用进程号去控制0 号进程发送消息,其他进程接收消息.调用System.currentTimeMillis( )函数获取当前的时间time.0 号进程通过for 循环给其他进程发送100 条消息,然后使用MPI.REQUEST NULL.Test 函数监视发送状态.当成功发送的消息数量超过67=×100并且当前时间小于等于time+10 ms 时,说明成功完成了通信.

图6 非阻塞send 函数流程图Figure 6 Flowchart of non-blocking send function flowchart

图7 MPI 非阻塞发送和接收函数伪代码Figure 7 Pseudo code of MPI non-blocking sending and receiving function

6 总结

智能合约日益成为区块链技术研究的热点,然而如何保证智能合约在两方或多方协同计算下的执行安全仍然是目前没有解决的问题,而采用密码学中的安全多方计算技术来设计和实现智能合约被认为是最具潜力的解决方案之一.据此,本文研究基于安全多方计算的智能合约,采用MPI 通信机制中的非阻塞通行方式,支持SMPC 每方计算过程中的相互通信,满足至少门限值t个参与方能够正确通信.SMPC 引入到智能合约,将SMPC 的特性体现到智能合约的公平性、隐私性以及正确性,从而通过安全多方计算技术保证智能合约执行系统的安全,本文研究对未来智能合约设计具有一定的理论指导意义.

猜你喜欢
参与方计算结果合约
基于秘密分享的高效隐私保护四方机器学习方案
基于SNA视角的PPP项目参与方行为风险研究
BT模式研究
趣味选路
扇面等式
求离散型随机变量的分布列的几种思维方式
绿色农房建设伙伴关系模式初探
谈数据的变化对方差、标准差的影响