本发明涉及金融科技(fintech)领域中的区块链(blockchain)领域,尤其涉及一种区块链的三方转账方法及装置。
背景技术:
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。目前,基于区块链的不可篡改性,金融科技领域中常通过区块链(blockchain)进行交易。三方转账是区块链领域中一种特殊场景,三方的资产只在三个参与方内部发生转移。在三方转账场景下,在区块链上注册了支付通道后,为了提高转账效率,中间转账的过程在链下进行,在中间转账开始前,区块链只需要记录三个参与方各自的最初余额。
但是,目前的方案中,当某一参与方需要取回资产时,三个参与方都要在区块链上确定结算金额,仍需要和区块链上的支付通道交互,在区块链确定三个参与方都认可了最终余额后,区块链才将该参与方在支付通道内的资产退回给该参与方。显然,目前三方转账的场景下,参与方与区块链的交互次数较多,导致三方转账效率较低,这是一个亟待解决的问题。
技术实现要素:
本发明提供一种区块链的三方转账方法及装置,解决了现有技术中三方转账效率较低的问题。
第一方面,本发明提供一种区块链的三方转账方法,包括:在三方支付通道开启期间,第一参与方将针对第一交易信息的第一签名发送至第二参与方和第三参与方;所述第一交易信息为所述第一参与方发起的交易信息;所述第一交易信息包括第一余额信息;所述第一余额信息中记录了三个参与方的余额信息;
所述第一参与方获取来自所述第二参与方的针对所述第一交易信息的第二签名和来自所述第三参与方的针对所述第一交易信息的第三签名;所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,获得门限签名;
若所述第一交易信息为返还资产的交易信息,所述第一参与方在验证所述门限签名通过后,则至少根据所述门限签名和所述第一交易信息,调用区块链的第一智能合约;所述第一智能合约用于确定所述三个参与方均认同了所述第一交易信息,使得区块链将所述第一参与方在所述第一余额信息中相应返还金额的资产从所述三方支付通道取回。
上述方法中,在三方支付通道开启期间,第一参与方通过与第二参与方和第三参与方交互签名,获得门限签名,并至少根据所述门限签名和所述第一交易信息,调用区块链的第一智能合约,由于是门限签名,区块链只需要验证门限签名,即可确定三个参与方都认同了第一交易信息,便可以使得区块链将所述第一参与方在所述第一余额信息中相应返还金额的资产,从所述三方支付通道取回,该过程只需要取回资产的第一参与方调用一次区块链的第一智能合约即可,有效减少了参与方与区块链的交互次数。
可选的,所述第一参与方按照以下方式获得所述第一签名:
所述第一参与方根据第一哈希值、所述第一交易信息、第一总哈希值、第一公钥系数、多签总公钥和预设哈希算法,获得第一签名;
所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第一总哈希值是所述三个参与方针对所述第一交易信息生成的总哈希值;所述第一公钥系数是所述第一参与方的公钥系数;所述多签总公钥是所述三个参与方约定的总公钥。
上述方法中,第一哈希值、第一总哈希值、第一公钥系数、多签总公钥联合参与了所述第一签名的生成,因此第一签名生成过程中,既考虑了第一参与方单独生成的信息,三方联合生成的信息,增加了第一签名的可信性。
可选的,所述第一参与方按照以下方式获得所述第一哈希值和所述第一总哈希值:
所述第一参与方生成针对所述第一交易信息的第一随机数,并根据所述第一随机数和所述预设哈希算法,获得所述第一哈希值;
所述第一参与方将所述第一交易信息发送至所述第二参与方和所述第三参与方;
所述第一参与方获取来自所述第二参与方的针对所述第一交易信息的第二哈希值和来自所述第三参与方的针对所述第一交易信息的第三哈希值;所述第二哈希值是根据第二随机数和所述预设哈希算法得到的;所述第三哈希值是根据第三随机数和所述预设哈希算法得到的;
所述第一参与方根据所述第一哈希值、所述第二哈希值和所述第三哈希值,获得所述第一总哈希值。
上述方法中,通过第一随机数增加了第一哈希值的随机性,而第二哈希值和第三哈希值也是通过随机数得到的,从而结合起来使得所述第一总哈希值随机性更强,更加难以伪造。
可选的,所述第一参与方根据第一哈希值、所述第一交易信息、第一总哈希值、第一公钥系数、多签总公钥和预设哈希算法,获得第一签名,包括:
所述第一参与方根据所述第一哈希值、所述第一交易信息、所述第一总哈希值、所述多签总公钥、所述第一公钥系数和所述预设哈希算法,基于预设椭圆曲线算法,获得所述第一签名;
所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,获得门限签名,包括:
所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,基于预设运算,获得所述门限签名;
所述第一参与方按照以下方式验证所述门限签名:
所述第一参与方基于所述预设椭圆曲线算法,若确定所述门限签名、预设生成元、所述第一总哈希值、所述第一交易信息、所述多签总公钥和所述预设哈希算法满足预设关系,则确定所述门限签名验证通过;所述预设关系是根据所述预设椭圆曲线算法和所述预设运算设定的。
上述方式下,通过预设椭圆曲线算法和预设运算,设置了门限签名的构造方法以及验证方法,由于椭圆曲线算法有零知识证明性质,从而对私有信息的保密性更强。
可选的,所述多签总公钥按照以下方式获得:
根据所述第一参与方的第一公钥、所述第二参与方的第二公钥、所述第三参与方的第三公钥和所述预设哈希算法,获得公钥哈希值;
根据所述第一公钥、所述公钥哈希值和所述预设哈希算法,获得所述第一公钥系数;
根据所述第二公钥、所述公钥哈希值和所述预设哈希算法,获得第二公钥系数;
根据所述第三公钥、所述公钥哈希值和所述预设哈希算法,获得第三公钥系数;
根据所述第一公钥系数、所述第二公钥系数和所述第三公钥系数,获得所述多签总公钥。
上述方式下,所述公钥哈希值绑定了三个参与方的公钥,而每个参与方的公钥系数都是根据所述公钥哈希值生成的,因此每个参与方的公钥系数都是和三个参与方关联的,所以所述多签总公钥和三个参与方的关联性更强,更加难以伪造。
可选的,所述第一交易信息中包括:第一交易序列号;
所述至少根据所述门限签名和所述第一交易信息,调用区块链的第一智能合约,包括:
至少根据所述门限签名、所述第一交易信息、第一哈希值、第二哈希值和第三哈希值,调用区块链的第一智能合约;所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第二哈希值是所述第二参与方针对所述第一交易信息生成的哈希值;所述第三哈希值是所述第三参与方针对所述第一交易信息生成的哈希值;
所述第一智能合约用于验证:所述第一交易序列号是否大于所述第一智能合约中记录的最大交易序列号;所述第一哈希值、所述第二哈希值和所述第三哈希值是否未在所述第一智能合约中记录过。
上述方式下,所述第一交易信息中包括:第一交易序列号,并且可以结合第一哈希值、第二哈希值和第三哈希值一同调用区块链的第一智能合约,从而进一步增加所述第一智能合约的验证,保证资产返还的正确性。
可选的,若所述第一交易信息为所述第一参与方发起的链下转账的交易信息,还包括:
所述第一参与方若验证所述门限签名通过,则所述第一参与方确定所述三个参与方均认同了此次转账。
上述方法下,若所述第一交易信息为所述第一参与方发起的链下转账的交易信息,所述第一参与方若验证所述门限签名通过后,不需要调用智能合约,直接在链下记录了所述第一余额信息。
第二方面,本发明提供一种区块链的三方转账装置,包括:数据传输模块,用于在三方支付通道开启期间,将针对第一交易信息的第一签名发送至第二参与方和第三参与方;所述第一交易信息为第一参与方发起的交易信息;所述第一交易信息包括第一余额信息;所述第一余额信息中记录了三个参与方的余额信息;
以及用于获取来自所述第二参与方的针对所述第一交易信息的第二签名和来自所述第三参与方的针对所述第一交易信息的第三签名;所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,获得门限签名;
处理模块,若所述第一交易信息为返还资产的交易信息,用于在验证所述门限签名通过后,则至少根据所述门限签名和所述第一交易信息,调用区块链的第一智能合约;所述第一智能合约用于确定所述三个参与方均认同了所述第一交易信息,使得区块链将所述第一参与方在所述第一余额信息中相应返还金额的资产从所述三方支付通道取回。
可选的,所述处理模块具体用于:按照以下方式获得所述第一签名:
根据第一哈希值、所述第一交易信息、第一总哈希值、第一公钥系数、多签总公钥和预设哈希算法,获得第一签名;
所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第一总哈希值是所述三个参与方针对所述第一交易信息生成的总哈希值;所述第一公钥系数是所述第一参与方的公钥系数;所述多签总公钥是所述三个参与方约定的总公钥。
可选的,所述处理模块具体用于:按照以下方式获得所述第一哈希值和所述第一总哈希值:
生成针对所述第一交易信息的第一随机数,并根据所述第一随机数和所述预设哈希算法,获得所述第一哈希值;
将所述第一交易信息发送至所述第二参与方和所述第三参与方;
获取来自所述第二参与方的针对所述第一交易信息的第二哈希值和来自所述第三参与方的针对所述第一交易信息的第三哈希值;所述第二哈希值是根据第二随机数和所述预设哈希算法得到的;所述第三哈希值是根据第三随机数和所述预设哈希算法得到的;
根据所述第一哈希值、所述第二哈希值和所述第三哈希值,获得所述第一总哈希值。
可选的,所述处理模块具体用于:根据所述第一哈希值、所述第一交易信息、所述第一总哈希值、所述多签总公钥、所述第一公钥系数和所述预设哈希算法,基于预设椭圆曲线算法,获得所述第一签名;根据所述第一签名、所述第二签名和所述第三签名,基于预设运算,获得所述门限签名;基于所述预设椭圆曲线算法,若确定所述门限签名、预设生成元、所述第一总哈希值、所述第一交易信息、所述多签总公钥和所述预设哈希算法满足预设关系,则确定所述门限签名验证通过;所述预设关系是根据所述预设椭圆曲线算法和所述预设运算设定的。
可选的,所述多签总公钥按照以下方式获得:
根据所述第一参与方的第一公钥、所述第二参与方的第二公钥、所述第三参与方的第三公钥和所述预设哈希算法,获得公钥哈希值;
根据所述第一公钥、所述公钥哈希值和所述预设哈希算法,获得所述第一公钥系数;
根据所述第二公钥、所述公钥哈希值和所述预设哈希算法,获得第二公钥系数;
根据所述第三公钥、所述公钥哈希值和所述预设哈希算法,获得第三公钥系数;
根据所述第一公钥系数、所述第二公钥系数和所述第三公钥系数,获得所述多签总公钥。
可选的,所述第一交易信息中包括:第一交易序列号;
所述处理模块具体用于:
至少根据所述门限签名、所述第一交易信息、第一哈希值、第二哈希值和第三哈希值,调用区块链的第一智能合约;所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第二哈希值是所述第二参与方针对所述第一交易信息生成的哈希值;所述第三哈希值是所述第三参与方针对所述第一交易信息生成的哈希值;
所述第一智能合约用于验证:所述第一交易序列号是否大于所述第一智能合约中记录的最大交易序列号;所述第一哈希值、所述第二哈希值和所述第三哈希值是否未在所述第一智能合约中记录过。
可选的,若所述第一交易信息为所述第一参与方发起的链下转账的交易信息,所述处理模块还用于:若验证所述门限签名通过,则确定所述三个参与方均认同了此次转账,并确定此次转账后所述三个参与方的余额信息为所述第一余额信息。
上述第二方面及第二方面各个可选装置的有益效果,可以参考上述第一方面及第一方面各个可选方法的有益效果,这里不再赘述。
第三方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
第四方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
本发明的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为区块链的结构示意图;
图2为本发明实施例提供的一种区块链的三方转账方法的流程示意图;
图3为本发明实施例提供的一种区块链的三方转账装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
下面首先解释本申请实施例中出现的名词。
区块链:如图1所示,区块链是由一系列区块组成的一条链,每个块上除了记录本块的数据还会记录上一块的哈希(hash)值,通过这种方式组成一条链。区块链的核心理念有两个,一个是密码学技术,另一个是去中心化思想,基于这两个理念做到区块链上的历史信息无法被篡改。
节点:网络中的每一个参与者就是一个节点,节点参与网络组建和数据交换。在区块链网络中,一个节点是指一个具有唯一身份的参与者,该节点具有一份完整的账本拷贝,具有参与区块链网络共识和账本维护的能力。
智能合约:智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约具体形式为部署在区块链上,完成特定功能的代码。举例来说,solidity是一种主流的智能合约编程语言,用solidity语言编写的智能合约,叫solidity合约。当智能合约被部署到区块链上时,会产生合约地址,用户可通过合约地址调用此智能合约。智能合约中定义的函数,称为合约接口,对智能合约的调用,就是通过合约地址调用合约中的某个合约接口。
哈希算法:一个将数字消息映射到长度固定的字符串(又称消息摘要,哈希值,指纹)的算法。若输入的消息不同,映射到相同字符串的机率可以忽略。若已知哈希值,计算其原始的数字消息不可行。
状态通道:是指在链外状态变化的虚拟通道(channel)。
支付通道:支付通道是状态通道的特例,指双方交易的无信任机制。中间的承诺交易都是链下(offchain)的,只有后面的结算交易最终上链,从而达到提高交易的吞吐量、低延迟和精细粒度的效果。
公钥:公钥指公钥密码学中的公开密钥参数,需要公布。用于加密和验证签名。区块链账户体系下,公钥对应一个账户地址。
私钥:私钥指公钥密码学中的私有密钥参数,需要妥善保护。用于解密和进行签名。区块链账户体系下,私钥控制着账户的所有权和使用权。
地址:地址是账户的标识。对于外部账户来说,地址表示的是该账户公钥的后20字节(通常会以0x开头,例如,0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826,该地址使用的是16进制表示法)。
在金融机构(银行机构、保险机构或证券机构)在进行业务(如银行的贷款业务、存款业务等)运转过程中,基于区块链的不可篡改性,金融科技领域中常通过区块链进行交易。三方转账是区块链领域中一种特殊场景,三方的资产只在三个参与方内部发生转移。在三方转账场景下,参与方的资产返还方式与区块链的交互较多。这种情况不符合银行等金融机构的需求,无法保证金融机构各项业务的高效运转。为此,如图2所示,本发明实施例提供一种三方转账方法。
步骤201:在三方支付通道开启期间,第一参与方将针对第一交易信息的第一签名发送至第二参与方和第三参与方。
所述第一交易信息为所述第一参与方发起的交易信息;所述第一交易信息包括第一余额信息;所述第一余额信息中记录了三个参与方的余额信息。
步骤202:所述第一参与方获取来自所述第二参与方的针对所述第一交易信息的第二签名和来自所述第三参与方的针对所述第一交易信息的第三签名;所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,获得门限签名。
步骤203:若所述第一交易信息为返还资产的交易信息,所述第一参与方在验证所述门限签名通过后,则至少根据所述门限签名和所述第一交易信息,调用区块链的第一智能合约。
所述第一智能合约用于确定所述三个参与方均认同了所述第一交易信息,使得区块链将所述第一参与方在所述第一余额信息中相应返还金额的资产从所述三方支付通道取回。
需要说明的是,步骤201~步骤203的方法中,举例来说:
a,b,c三个参与方通过协商建立状态通道。其中,c为第一参与方,a为第二参与方,b为第三参与方。可以授权任意一参与方调用已部署的支付通道智能合约的openchannel(开启通道)函数。
一种开启通道的过程可以如下:
开启通道需传入a,b,c三个参与方的账户地址,账户公钥和通道超时时间,openchannel函数会根据传入的三个参与方的账户地址进行hash运算,计算出全局唯一的支付通道channeid,并设置通道的超时时间,将通道状态置为开启(open)。
openchannel函数同时也可以完成多签总公钥的初始化。一种可选实施方式中,所述多签总公钥按照以下方式获得:
根据所述第一参与方的第一公钥、所述第二参与方的第二公钥、所述第三参与方的第三公钥和所述预设哈希算法,获得公钥哈希值。
根据所述第一公钥、所述公钥哈希值和所述预设哈希算法,获得所述第一公钥系数。
根据所述第二公钥、所述公钥哈希值和所述预设哈希算法,获得第二公钥系数。
根据所述第三公钥、所述公钥哈希值和所述预设哈希算法,获得第三公钥系数。
根据所述第一公钥系数、所述第二公钥系数和所述第三公钥系数,获得所述多签总公钥。
具体来说,可能的情形如下:
假设传入的a,b,c的公钥分别为第一公钥(pc),第二公钥(pa),第二公钥(pb),openchannel函数会进行如下初始化操作:
计算l=h(pa||pb||pc),并保存l。
其中,h为所述预设哈希算法,||表示连接起来一同作为所述预设哈希算法的输入,l为公钥哈希值。
分别计算a,b,c的公钥系数,并存入区块链的支付通道智能合约中。
pc1=pc*h(pc||l);pc1为所述第一公钥系数。
pa1=pa*h(pa||l);pa1为所述第二公钥系数。
pb1=pb*h(pb||l);pb1为所述第三公钥系数。
计算用于多签总公钥,并保存:
p=pa1+pb1+pc1;p为多签总公钥。
上述多签公钥是根据多个参与方公钥的公钥系数共同计算得到的。多签总公钥可以和门限签名一同使用,每个公钥系数可以得到独立的签名,各独立的签名可以得到门限签名,而多签总公钥直接计算也可以得到门限签名。因此,在验证时,使用多签总公钥可以直接得到门限签名,省略再次分别计算独立签名的步骤。
此时,多签初始化已完成,后续a,b,c可以通过这些公钥系数完成多签操作(如schnorr多签操作)。
进一步地,a,b,c知道通道channeid后,分别调用settotaldeposit(存入资产)函数存入链上资产到智能合约。settotaldeposit函数会校验支付通道的通道状态和超时时间,如果通过,则记录调用者存入的资产金额。
至此,a,b,c均在支付通道存入了资产。下面开启链下转账,注意此时的转账都是链下执行,无须跟区块链交互。
现假设多次转账后,最新余额表为a:50b:50c:200。转账序列号为5。c想从状态通道合约中提取100资产作为它用。c需通知a和b,发起即时取回请求,即时取回为了避免a和b再到区块链做验证。
首先要获得第一签名,一种可选实施方式下,所述第一参与方按照以下方式(以下称为基于总哈希值的签名获取实施方式)获得所述第一签名:
所述第一参与方根据第一哈希值、所述第一交易信息、第一总哈希值、第一公钥系数、多签总公钥和预设哈希算法,获得第一签名。
其中,所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第一总哈希值是所述三个参与方针对所述第一交易信息生成的总哈希值;所述第一公钥系数是所述第一参与方的公钥系数;所述多签总公钥是所述三个参与方约定的总公钥。
本方案设计流程如下:
第一交易信息m=(balancelist,nonce,status);
c需要对最新的余额表(balancelist)即a:50b:50c:100,进行签名。还可以包括转账序列号nonce(此时为6),交易状态status(“withdraw”)等信息表示。
基于总哈希值的签名获取实施方式下,一种可能的情形中,所述第一参与方按照以下方式获得所述第一哈希值和所述第一总哈希值:
生成所述第一哈希值的方式为:
所述第一参与方生成针对所述第一交易信息的第一随机数,并根据所述第一随机数和所述预设哈希算法,获得所述第一哈希值。
生成所述第一总哈希值的方式为:
所述第一参与方将所述第一交易信息发送至所述第二参与方和所述第三参与方。
所述第一参与方获取来自所述第二参与方的针对所述第一交易信息的第二哈希值和来自所述第三参与方的针对所述第一交易信息的第三哈希值。
所述第一参与方根据所述第一哈希值、所述第二哈希值和所述第三哈希值,获得所述第一总哈希值。
所述第二哈希值是根据第二随机数和所述预设哈希算法得到的;所述第三哈希值是根据第三随机数和所述预设哈希算法得到的。
基于总哈希值的签名获取实施方式,获得第一签名的具体实施方式可以如下:
所述第一参与方根据所述第一哈希值、所述第一交易信息、所述第一总哈希值、所述多签总公钥、所述第一公钥系数和所述预设哈希算法,基于预设椭圆曲线算法,获得所述第一签名。
进一步地,基于总哈希值的签名获取实施方式,获得所述门限签名可以为:
所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,基于预设运算,获得所述门限签名。
进一步地,基于总哈希值的签名获取实施方式,验证所述门限签名可以为:
所述第一参与方基于所述预设椭圆曲线算法,若确定所述门限签名、预设生成元、所述第一总哈希值、所述第一交易信息、所述多签总公钥和所述预设哈希算法满足预设关系,则确定所述门限签名验证通过。
所述预设关系是根据所述预设椭圆曲线算法和所述预设运算设定的。
基于总哈希值的签名获取实施方式,具体交互流程如下:
c向a,b索要此次签名的随机数的哈希ra(第二哈希值),rb(第三哈希值),c生成随机数rc,保存rc在本地,然后哈希得到rc(第一哈希值),计算第一总哈希值r=ra+rb+rc。
c从区块链上的智能合约获取多签总公钥p和自己的公钥系数即第一公钥系数pc1;计算:
sc=rc+h(m||r||p)*pa1;最后得到c的第一签名sc。
c将签名后的数据(rc,sc)以及r通过客户端线下发送给b和a。b也进行如上的签名操作得到(rb,sb),a也进行如上签名得到(ra,sa)。a和b将签名发送给c。
c将三个签名sa,sb,sc相加得到门限签名s。
c验证s*g=r+h(m||r||p)*p是否相等。如果相等,则证明a,b,c均已有效签名。
显然,门限签名是由多个独立签名共同运算而来,验证时并不需要验证每个独立的签名是否正确,直接验证门限签名即可,门限签名通过验证便意味着用于得到门限签名的所有独立签名通过验证。
c将(r,s)发送给a和b。a和b均保留此次转账凭证。
一种可能的情形中,所述第一交易信息中包括:第一交易序列号;步骤203可以按照以下方式执行:
至少根据所述门限签名、所述第一交易信息、第一哈希值、第二哈希值和第三哈希值,调用区块链的第一智能合约。
所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第二哈希值是所述第二参与方针对所述第一交易信息生成的哈希值;所述第三哈希值是所述第三参与方针对所述第一交易信息生成的哈希值。
所述第一智能合约用于验证:所述第一交易序列号是否大于所述第一智能合约中记录的最大交易序列号;所述第一哈希值、所述第二哈希值和所述第三哈希值是否未在所述第一智能合约中记录过。
c将调用第一智能合约中的withdrawimmediately函数,第一智能合约中的withdrawimmediately函数逻辑如下:
第一智能合约会验证门限签名是否正确,不正确则拒绝此次交易。
第一智能合约检验c上传的a,b,c三方门限签名通过后,检查此次转账nonce,如果大于合约记录的nonce,则更改合约的nonce并更改a,b,c在通道的余额。如果签名或者nonce校验失败,则交易失败。
第一智能合约判断传入的此次的随机数哈希ra,rb,rc是否已经在随机数列表中,如果存在,则判定为签名重复使用,交易失败,如果成功,则将ra,rb,rc存入合约中的随机数列表中。此步骤主要可以防止双花。
第一智能合约将c要提取的资产额度发送给c的地址。
withdrawimmediately函数调用成功后,至此即时取回成功。可以继续进行链下转账。
上述方式下,本方案在支付通道方案中可以引入schnorr多签算法,设计了新的三方支付通道解决方案,通过设计新的交互流程和支付通道合约,有效的减少链下传递签名和验证签名的次数。基于schnorr多签,在三方支付通道中支持即时取回资产功能,而无需进入挑战期和关闭通道才能取回资产,增加了支付通道的灵活性。
另一种可能的情形中,若所述第一交易信息为所述第一参与方发起的链下转账的交易信息,还可以执行如下步骤:
所述第一参与方若验证所述门限签名通过,则所述第一参与方确定所述三个参与方均认同了此次转账,并确定此次转账后所述三个参与方的余额信息为所述第一余额信息。
现假设a,b,c三方均存入资产金额100。此时a为第一参与方,现在a想给b转账20。三方支付通道链下支付流程如下:
a需要对最新的余额表(所述第一余额信息)即a:80b:120c:100,以及转账序列号nonce进行签名,签名算法采用schnorr签名算法。
举例来说,具体交互流程如下:
a发起转账请求,自己生成随机数ra,保存ra在本地。
链下通知b和c发起转账请求,b和c接到请求分别产生随机数rb,rc。保存到本地后,分别计算rb=h(rb),rc=h(rc),然后将rb和rc发送给a。
a最后计算此轮多签的总随机数r=ra+rb+rc;
a从链上智能合约获取p和pa1;
a计算自己的签名sa=ra+h(m||r||p)*pa1。
a将签名后的数据(ra,sa)以及r通过客户端线下发送给b。
b也进行以上的步骤,代入自己的随机数和公钥系数,签名得到(rb,sb),并将a的签名(ra,sa)以及自己的(rb,sb)以及r发送给c。
c也进行以上的步骤,得到签名操作得到(rc,sc),然后c将三个签名sa,sb,sc相加得到门限签名s。
c验证等式s*g=r+h(m||r||p)*p,rb+rb+rc=r是否相等。如果相等,验签成功,则证明a,b,c均已有效签名。c将(r,s)发送给a和b。
至此a,b,c均已对余额表进行多签,此轮转账成功。
如果验签出错,可以沟通让对方重发,或者直接关闭支付通道。
需要说明的是,在一种可能情形的方式中,经过多次链下转账后,三方中任意一方想退出通道,取回通道里的资产。则进入关闭支付通道的流程。注意此时需要跟链上智能合约交互。
现假设多次转账后,最新余额表为a:50b:50c:100。转账序列号为10。
以a作为关闭方为例,a调用closechannel函数关闭支付通道。须传入通道channeid和最新的余额表和转账序列号nonce和门限签名。签名即对最新余额表为a:50b:50c:100。转账序列号为10的签名。门限签名流程跟步骤3的流程类似。
closechannel函数逻辑如下:
智能合约将a置为关闭方,b和c则为非关闭方。智能合约会门限签名是否正确。不正确则需重新提交。智能合约检验a上传的a,b,c三方门限签名通过后,记录下a提交的转账余额表(a:50b:50c:100)和序列号10。
将通道状态置为close。a成功调用closechannel函数后此时支付通道进入挑战期。a等待b和c校验自己提交的余额和转账nonce是否正确。
非关闭方更新余额表(挑战期内):
b和c知道a发起关闭通道的交易,则也去查询通道状态,检查a传入的余额表和转账nonce是否正确,如果正确直接进行通道结算,否则执行以下步骤:
如果a传入的余额表和转账序列号b或c不认同,比如a只是传入了第9次的转账。余额表为(a:100b:0c:100),转账序列号为9。显然此次转账结果对a有利。则b和c需要调用合约的updatenonclosingbalanceproof函数更新通道记录的余额表和转账序列号,防止a作恶。
通道结算的方式如下:
b和c检查余额后,等待挑战期结束,a调用settlechannel函数结算通道。支付通道合约会按记录的余额表自动将之前质押的资产转给a,b,c。并将通道状态置为关闭。至此三方支付通道生命周期结束。
如图3所示,本发明提供一种区块链的三方转账装置,包括:数据传输模块301,用于在三方支付通道开启期间,将针对第一交易信息的第一签名发送至第二参与方和第三参与方;所述第一交易信息为第一参与方发起的交易信息;所述第一交易信息包括第一余额信息;所述第一余额信息中记录了三个参与方的余额信息;
以及用于获取来自所述第二参与方的针对所述第一交易信息的第二签名和来自所述第三参与方的针对所述第一交易信息的第三签名;所述第一参与方根据所述第一签名、所述第二签名和所述第三签名,获得门限签名;
处理模块302,若所述第一交易信息为返还资产的交易信息,用于在验证所述门限签名通过后,则至少根据所述门限签名和所述第一交易信息,调用区块链的第一智能合约;所述第一智能合约用于确定所述三个参与方均认同了所述第一交易信息,使得区块链将所述第一参与方在所述第一余额信息中相应返还金额的资产从所述三方支付通道取回。
可选的,所述处理模块302具体用于:按照以下方式获得所述第一签名:
根据第一哈希值、所述第一交易信息、第一总哈希值、第一公钥系数、多签总公钥和预设哈希算法,获得第一签名;
所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第一总哈希值是所述三个参与方针对所述第一交易信息生成的总哈希值;所述第一公钥系数是所述第一参与方的公钥系数;所述多签总公钥是所述三个参与方约定的总公钥。
可选的,所述处理模块302具体用于:按照以下方式获得所述第一哈希值和所述第一总哈希值:
生成针对所述第一交易信息的第一随机数,并根据所述第一随机数和所述预设哈希算法,获得所述第一哈希值;
将所述第一交易信息发送至所述第二参与方和所述第三参与方;
获取来自所述第二参与方的针对所述第一交易信息的第二哈希值和来自所述第三参与方的针对所述第一交易信息的第三哈希值;所述第二哈希值是根据第二随机数和所述预设哈希算法得到的;所述第三哈希值是根据第三随机数和所述预设哈希算法得到的;
根据所述第一哈希值、所述第二哈希值和所述第三哈希值,获得所述第一总哈希值。
可选的,所述处理模块302具体用于:根据所述第一哈希值、所述第一交易信息、所述第一总哈希值、所述多签总公钥、所述第一公钥系数和所述预设哈希算法,基于预设椭圆曲线算法,获得所述第一签名;根据所述第一签名、所述第二签名和所述第三签名,基于预设运算,获得所述门限签名;基于所述预设椭圆曲线算法,若确定所述门限签名、预设生成元、所述第一总哈希值、所述第一交易信息、所述多签总公钥和所述预设哈希算法满足预设关系,则确定所述门限签名验证通过;所述预设关系是根据所述预设椭圆曲线算法和所述预设运算设定的。
可选的,所述多签总公钥按照以下方式获得:
根据所述第一参与方的第一公钥、所述第二参与方的第二公钥、所述第三参与方的第三公钥和所述预设哈希算法,获得公钥哈希值;
根据所述第一公钥、所述公钥哈希值和所述预设哈希算法,获得所述第一公钥系数;
根据所述第二公钥、所述公钥哈希值和所述预设哈希算法,获得第二公钥系数;
根据所述第三公钥、所述公钥哈希值和所述预设哈希算法,获得第三公钥系数;
根据所述第一公钥系数、所述第二公钥系数和所述第三公钥系数,获得所述多签总公钥。
可选的,所述第一交易信息中包括:第一交易序列号;
所述处理模块302具体用于:
至少根据所述门限签名、所述第一交易信息、第一哈希值、第二哈希值和第三哈希值,调用区块链的第一智能合约;所述第一哈希值是所述第一参与方针对所述第一交易信息生成的哈希值;所述第二哈希值是所述第二参与方针对所述第一交易信息生成的哈希值;所述第三哈希值是所述第三参与方针对所述第一交易信息生成的哈希值;
所述第一智能合约用于验证:所述第一交易序列号是否大于所述第一智能合约中记录的最大交易序列号;所述第一哈希值、所述第二哈希值和所述第三哈希值是否未在所述第一智能合约中记录过。
可选的,若所述第一交易信息为所述第一参与方发起的链下转账的交易信息,所述处理模块302还用于:若验证所述门限签名通过,则确定所述三个参与方均认同了此次转账,并确定此次转账后所述三个参与方的余额信息为所述第一余额信息。
基于同一发明构思,本发明实施例还提供了一种计算机设备,包括程序或指令,当所述程序或指令被执行时,如本发明实施例提供的区块链的三方转账方法及任一可选方法被执行。
基于同一发明构思,本发明实施例还提供了一种计算机可读存储介质,包括程序或指令,当所述程序或指令被执行时,如本发明实施例提供的区块链的三方转账方法及任一可选方法被执行。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。