区块链父子孙钱包账户机制设计
区块链父子孙钱包账户机制设计
1.1 钱包模型研究及设计
1.1.1 现行区块链监管治理的不足
由于区块链技术是一个新的领域以及当下涌现了众多数字货币,腐败分子和不法分子为逃避执法部门和其他政府机构的审查,而利用区块链这个新领域进行贿赂的腐败行为和洗钱及恐怖融资的行为的出现频次越来越高,区块链上的监管治理逐渐成为学术界的一个重要研究课题。
国际监管组织金融行动特别工作组(Financial Action Task Force, FATF)是西方七国于1989年在法国成立的用于打击洗钱犯罪、资助***活动行为,并且协调全世界各国进行洗钱打击的机构,是当今世界上最重要的打击洗钱国际组织之一。但一些评论人士批评FATF的作用很弱,仅做表面功夫,似乎在很努力地打击洗钱活动,但却没有足够良好的方案去限制资本的无序流动。
在区块链监管领域,FATF于2020年提出了一种遵循旅行规则的监管科技系统TRISA,该系统实现了要求虚拟资产服务提供商(Virtual Asset Service Providers, VASP)发送、接收和存储资产转账双方的身份信息。TRISA系统其无需修改区块链系统的核心协议,也不会增加交易成本或改变数字资产的交易流程。TRISA系统只监管虚拟资产服务提供商之间的交易,而不监控与虚拟资产服务提供商与个人之间的交易,这会导致明显的漏洞发生。比如,虚拟资产服务提供商A先与某个个人用户进行交易,该个人用户再与虚拟资产服务提供商B交易,不诚实的虚拟资产服务提供商之间可以达成交易却逃避了监管。
我国中国人民银行也签署了旅行规则协议,因此中国也需要执行旅行规则,于是国内区块链领域著名学者蔡维德教授提出了一个更加全面、健全的,且更加符合中国国情的实施旅行规则的区块链监管系统STRISA,该系统可以监控和跟踪个人数字钱包的交易,避免了上述漏洞的发生,且该系统提供了区块链数据湖和法规遵守系统等新功能特性,监管更加严格。
TRISA系统和STRISA系统的监管功能的实现,依赖虚拟资产服务提供商主动在其系统上注册,从而达到合规,但部分资产服务提供商可能躲避监管而不进行注册,一些虚拟资产服务提供商即使进行了注册,其数据共享并一定十分及时,且其可能隐藏部分非法交易数据的共享。现行的大部分区块链监管治理系统都将关注点集中在区块链系统上,而没有考虑到区块链钱包。区块链钱包处于用户和区块链系统中间,是两者之间的桥梁,如果在区块链钱包层次实现监管治理,会带来许多好处,一是对区块链上的交易的监管治理的覆盖度会更广,二是监管治理的及时性更高。此外,目前的监管治理方案,对区块链上的洗钱、恐怖融资等犯罪活动的发现,采用离线的可疑交易识别方法,实时性较低,且无法有效制止非法金融交易。
因此,在区块链钱包层次实现监管治理功能是当下对区块链钱包的一个新需求。
1.1.2 几种钱包模型研究及改进
根据现行区块链的设计,可以将区块链钱包初步分为4大大类,分别是客户端完全自主模型、客户端部分自主模型、服务端全控模型、带账本的服务端全控模型。
现行的区块链钱包大部分采用客户端完全自主模型,钱包仅由一个客户端软件组成,客户端软件直接与各种区块链系统进行交互。客户端自主生成交易并使用其私钥对交易数据进行签名,然后将交易数据及签名发送至区块链系统节点,经区块链系统节点验证通过后,将相关交易记录在区块链上。同理地,钱包查询等其它功能实现也是如此。
在该模型下,用户可以采用钱包客户端与钱包服务端通信发起交易请求并签名,钱包服务端接收相关请求将相关交易发送至区块链系统进行验证从而数据上链,钱包服务端的存在可以给用户的操作带来更高的便利性;但可能出于对钱包服务端的不信任,用户也可以采用钱包客户端直接与相应区块链系统通信,发起交易并签名,从而交易记录上链。其模型示意图如上图所示。
客户端部分自主模型相比客户端完全客户端模型而言,由于多了区块链钱包服务端,所以可以由区块链钱包服务端来实现一些仅采用客户端的模型所不能实现的功能,如使用秘密共享方案保存密钥,避免私钥丢失后资产无法找回的困难问题等;同时在钱包服务端实现监管治理,使得区块链的监管可以更加及时和有效。但是由于该模型和客户端完全自主相比而言,均可以自主启动对外交易,或是接受外部交易的请求,由于也可以不经过服务端,导致其监管治理方面仍然存在一定的缺陷。
在该模型下,钱包客户端不能自主发起对区块链系统的交易,或是接受外部交易的请求,所有交易的发生或者其它数据状态的变更均需经过钱包服务端。从流程角度而言,钱包客户端交易的发起或接收,需通知钱包服务端,钱包服务端进行交易和签名的校验,通过后再将其发送至区块链系统,再由区块链系统进行验证,通过后相关数据或状态变更则会记录在区块链系统上。服务端全控模型的示意图如上所示。
由于钱包客户端不能向区块链系统直接发起交易,因此在钱包服务端实现的钱包监管治理对区块链上交易的监管治理覆盖度更加广,及时性也更高。
基于以上研究,服务端全控模型是更符合我国国情的钱包模型。
然而,服务端全控模型模型并非没有缺点,由于钱包服务端作为一个服务端系统,不可避免地要保存一些数据,这些数据可能被非法或者不公正的修改,站在更广阔的视角上下待服务端全控模型,服务端全控模型在分权治理、多中心化的角度来看,是违背区块链的思想的,其示意图如上图所示。
如图所示,钱包服务端成为整个区块链及钱包系统中,唯一一个中心化的节点,假如该中心节点作恶,其恶意篡改数据或者其被黑客劫持了,将会产生不可估量的影响。
为此,为改进普通的服务端全控模型,提出了一种带账本的服务端全控模型。如图所示,在该模型中,所有的数据均采用一个区块链账本进行处理,所涉及的数据多种多样,有关系型和非关系型的数据,该数据存放在钱包中的区块链账本中,钱包客户端可以访问钱包服务端中的一些非敏感账本数据,从而使得整个钱包系统的设计遵循了区块链系统设计中的多中心化的思想。
在钱包服务端系统内部的小型区块链账本,以下简称为钱包链。钱包链可以将每次账户更新的数据上链,也可以将一些交易信息进行校验,经过钱包链的校验也可以带来一些系统设计层面的优势。比如,钱包链设计中可以含有监管节点,该监管节点可以是特殊节点或超级节点,该监管节点可以经过投票机制来停止任何一笔对外部区块链系统的非法或不合规的交易。
1.2 父子孙账户机制的关键设计
本文所提父子孙账户机制的概念,是相对于中国人民银行数字货币研究所于2021年公布的《中国数字人民币的研发进展白皮书》中提到的母子钱包而言的。
父子孙账户机制是指,父钱包可以生成一个子钱包,子钱包可以使用父钱包账户中的资金;同样地子钱包也可以生成其子钱包也即所提的孙钱包,孙钱包可以使用子钱包中的资金;再类似的,孙钱包也可以生成自己的子钱包也即曾孙钱包,曾孙钱包可以生成自己的曾曾孙钱包,该账户机制可以一直往更深的层次生成下去,无穷无尽。每个父钱包都可以生成多个子钱包,每个子钱包可以生成多个孙钱包,形成一棵树状的层次图。
1.2.1 账户机制的区块数据设计
本节主要讨论钱包中父子孙账户机制的区块数据设计。
在父子孙的账户机制里,如果父钱包想让某个钱包成为其子钱包,以下将该钱包称为子钱包。该子钱包在生成之时会与父钱包进行多次通信,从而生成一个仅有该子钱包可知的私钥,该私钥对父钱包而言是不可知的,该子钱包使用该私钥对交易进行签名,第三方验证者也即区块链系统的节点,可以使用其父钱包公开的群签名公钥进行验证该签名是否有效,如果无效则拒绝交易,如果有效则将交易数据更新到区块链系统中,从而赋予了子钱包去花父钱包的账户上的资金的权力。该账户机制在实现赋予子钱包使用父钱包账户里的资金的同时,还实现了如下功能特性:
1. 子钱包签署的交易对除了父钱包以外的所有第三方包括区块链系统节点,都是匿名的,第三方无法获知该笔交易是父钱包众多子钱包中的具体哪一个子钱包进行签名,进行资金的使用;
2. 子钱包拥有使用父钱包账户资金的权力,但无法获知父钱包的账户余额,保护好父钱包的资金金额隐私;
3. 父钱包可对子钱包实施限额支付,限时支付,避免子钱包滥用父钱包的资金;
4. 父钱包可以随时撤销子钱包的权力,使得该子钱包以后不允许再使用父钱包的资金。
如上所述,父钱包生成子钱包,本质上是将其资产控制权下放给子钱包,同理,子钱包生成孙钱包,也是将其资产控制权下放给孙钱包,此时孙钱包与子钱包的关系,等同于子钱包和父钱包之间的关系。父子孙账户机制可以实现多个用户对一笔金融资产的控制,在当前形式越发纷繁复杂的数字资产面前,该账户机制可以起到很好的应对作用。
本文所设计的父子孙账户机制,其底层技术实现依赖于一种带数字证书的经典群签名方案,以及基于以太坊账户状态树Merkle Patricia Trie改进的区块格式,从而使得所设计出来的钱包可以实现对各种数字资产,如数字基金、数字股票、数字房地产、数字期货等的灵活控制。
Merkle Tree是一种基于散列值的、以分层形式组织进行数据计算的签名,其在验证某时刻状态下,如何处理某笔交易或如何执行某种状态的数据更改的共识达成起到十分关键的作用。在以太坊系统中,一共含有三棵数据结构相似的Merkle Tree,分别是交易树、收据树和状态树。
在以太坊系统中,每当一些交易发布验证通过后,这些交易会被组织成一棵Merkle Tree,该Merkle Tree被称为交易树,交易树的根植Root可以证明某个交易被打包到某个区块里面,从而提供一种快速、轻便的Merkle Proof。此外,以太坊中还有一棵收据树,每个交易在执行完成之后会形成一个收据,以太坊中之所以设计收据树主要出于对以太坊智能合约复杂的执行过程,通过使用收据树的数据结构可以有加快查询执行的结果的考虑。
以太坊系统可以使相互不信任的节点通过P2P网络来维护全局状态下的通用视图,并根据请求执行智能合约代码,这套机制中的关键在于状态树。可以说状态树是以太坊中系统三棵Merkle Tree中最重要的一棵,其用于保存以太坊每个账户的一些状态。状态树中的每个节点最多有16个分支,每个叶子节点表示一一个账户,这些叶子节点的父节点由叶节点的散列组成,而这些父节点再组成更高一层的父节点,直至到形成根节点。状态树本质上是一个账户地址到账户状态的映射,在以太坊中,账户的状态有4个值,分别是Nonce,Balance,CodeHash,StorageRoot。CodeHash用于保存智能合约代码的散列值,只有合约账户才拥有该字段,对于普通的外部账户而言该字段为空值。StorageRoot是指根节点的散列值,会根据账户存储内容的散列值进行编码,默认是空值。
本方案设计的父子孙账户机制同样采用一种基于账户的模型(Account-Base Model),其设计思路借鉴于以太坊的状态树,但账户的状态值不同,仅保留所需的字段,以及加入了创新的字段值。在本方案中,父子孙账户机制下,每个账户下面保存4个状态值,分别是Nonce、publicKey、parentAddr、groupPubKey值。Nonce值用于记录该账户交易的次数,防止重放攻击;publicKey用于记录该账户的公钥;ParentAddr值用于记录该账户的父账户的地址,如果该钱包账户地址不存在父钱包,则该字段值为空;groupPubKey用于记录该账户的父钱包的群组公钥,如果该钱包账户地址不存在父钱包,则该字段值为空。
本方案采用Merkle Patricia Trie来保存账户地址与账户状态之间的映射关系。由于对状态树进行了改进,由于其修改了状态字段,分别是Nonce、publicKey、parentAddr、groupPubKey字段值,所以其MPT也发生了变化,具体如下图所示。
从区块头部设计的角度来看,其设计如下图所示。
如下图所示,每个区块的区块头会保存一个State Root值,该值是有系统中所有的账户组成的一棵状态树。每个区块都拥有这样一棵树,但是不同区块的两棵树中的绝大部分节点是共享的,所以从存储空间的角度来看并不会占用太多的空间,但是每个账户的状态的变化,都可以反映到区块头的State Root字段值中,使得节点之间可以以非常小的通信成本完成节点间数据的一致性调整。
父子孙钱包机制的实现除了需要对区块进行修改外,还依赖一套签名方案,该签名方案基于经典的ACJT群签名算法改进,融合了数字证书机制,具体的工作流程将在后续小节中具体阐述。
1.2.2 账户机制的角色设计
为了模型的简化,本节仅使用父钱包、子钱包、孙钱包三种钱包来代表该账户机制下的角色,同时本账户也支持不使用父子孙账户机制的普通钱包。本钱包的账户机制方案是在一种经典的群签名算法上进行改进,融合了数字证书机制,从而使得签名的功能更加丰富,而且可以在更多的场景下验证交易的有效性。此外,父子孙账户机制的实现也依赖于钱包服务端的区块链系统的一颗状态树,其与以太坊状态树存在不同,不同之处在于区块头和区块体。该钱包服务端的区块链系统拥有一棵用于记录账户关系的Merkle Tree,而该区块链的区块头部则含有一个用于维护账户关系的Merkle Tree Root,该部分内容上一小节已经阐述过。
序列号是数字证书的唯一标识码,每个数字证书均有一个序列号,不同数字证书的序列号均不同;
版本号是表示该证书格式的版本,用于为将来系统升级预留;
签名算法是指该验证该证书的非对称签名算法种类;
有效期是指该证书生效的时间,其包含起始时间和终止时间;
群组公钥是指该钱包所在的群组的公钥,也即由父钱包公开的公钥组成;
交易金额是指如果该钱包为子钱包,该子钱包可以在不经过父钱包签名同意下自由使用的金额。
1.2.3 钱包生成的方案设计
交易金额是指如果该钱包为子钱包,该子钱包可以在不经过父钱包签名同意下自由使用的金额。
(一)普通钱包生成
普通钱包的私钥、公钥及地址的生成步骤如下:
首先通过某种方式生成一个随机的长度位256比特的数字,这个数字需要被钱包客户端安全地保存起来且不能公开,这个随机数被视作私钥;
然后根据这个256比特的随机数,采用SECP256K1椭圆曲线算法计算得出其对应的公钥;
再使用SHA-256算法计算出公钥的哈希值,再根据RIPEMD160算法计算的哈希值,并在的前面加上2个字节长度钱包服务端系统版本号作为前缀,记为;
使用SHA-256算法对计算两次,将结果值的前4个字节拼接在的末尾作为后缀,其起校验作用,最终得到值记为;
最终对使用base58算法进行编码转换,从而得到钱包地址,记为。
(二)父钱包生成
当一个普通钱包想要成为含有父钱包功能时,其首先需要设置系统安全参数、和,其中参数用于控制统计零知识证明的紧密性,参数用于控制无碰撞的哈希函数的结果的比特位长度,参数用于控制要使用数字的比特位个数。
然后设置参数,,和,使这几个参数分别满足,,,。
接着再定义一个整数区间和,以及定义一个无碰撞的Hash函数,本文采用SHA-256算法。
再接着其随机地、私密地选择个比特位的素数和,并使得,,同时使得和均为素数。
其紧接着令,再随机选择,随机秘密地选择,同时令,此时父钱包的公钥为,然后对公钥进行公开,私钥为,私钥进行安全保存。
再紧接着,计算该公钥的地址,过程是使用SHA-256算法计算出公钥的哈希值,再根据RIPEMD160算法去计算哈希值,并在的前面加上2个字节长度的钱包服务端系统版本号作为前缀,记为,再使用SHA-256算法对计算两次,将结果值的前4个字节拼接在的末尾作为后缀,其起校验作用,最终得到值记为,再对使用base58算法进行编码转换,从而得到父钱包地址,记为
最后,其向钱包服务端的证书生成服务注册相关信息,申请父钱包的数字证书。
申请通过后,证书将返回给该钱包,同时将该证书会被发送至证书查询服务进行保存,之后该证书可以被外界访问查询。
注意,父钱包用于子钱包加入、校验交易、打开签名的公钥和私钥,以下分别称为群组公钥和群组私钥,而根据群组公钥计算出来的地址称为父钱包地址。要区分群组公钥、群组私钥、父钱包地址和其作为普通钱包时的公钥、私钥和地址。
(三)子钱包或孙钱包生成
当某普通钱包想向另一已经生成父钱包功能的钱包发起申请,申请成为其子钱包后,父钱包收到普通钱包的申请信息后,会发送消息给普通钱包通知其意见是同意或是拒绝,如果意见是拒绝则流程至此终止,如果是同意则继续往下执行。
收到同意的意见后,普通钱包会产生一个秘密值,和一个随机整数,然后计算,并将发送给给父钱包,其中来源于父钱包的群组公钥。
父钱包检查普通钱包发送过来的值是否满足,如果不满足则流程终止;如果满足,那么父钱包则随机选择两个数,并将发送给普通钱包。
普通钱包收到后,将其用于计算,首先计算,然后根据公式计算得出,并将其发送给父钱包。
父钱包收到后,检查以下条件是否均满足:,对的离散对数在的范围内,u在内,,。如果上述条件有任意一个条件不满足,则流程终止;如果任意条件均满足,则继续执行下一步,父钱包随机选择一个素数,计算,并将发送给普通钱包。
普通钱包收到后,验证其是否满足,如果不满足则流程终止,如果满足,则普通钱包需私密地保存,因为即为普通钱包作为父钱包的子钱包的私钥。此时,普通钱包发送消息给父钱包请求生成其作为其子钱包的数字证书。
父钱包收到消息后,生成一个用于数字证书公钥和私钥对,设置父钱包信息、证书公钥、对普通钱包的交易限定额度、失效时间戳,并对其使用群组私钥进行签名计算得到一个父钱包签名,然后,再使用数字证书的私钥对以上所有信息进行签名计算得到证书签名,最后将父钱包信息、证书公钥、交易限定额度、失效时间戳、父钱包签名、证书私钥签名发送至钱包服务端的证书服务。
钱包服务端的证书服务校验信息是否有效,如果无效则流程终止,如果有效则对该信息进行签名,得到一个包含父钱包信息、证书公钥、交易限定额度、失效时间戳、父钱包签名、证书签名、证书服务签名等完整信息的数字证书,并将其发送给父钱包,同时将该证书发送至钱包查询服务以备查询,之后该证书可以被外界通过访问证书服务进行查询。
父钱包收到该子钱包数字证书后,向服务端证书查询服务检查数字证书是否生效,将该子钱包的数字证书和私钥发送给普通钱包。
普通钱包在收到子钱包数字证书和私钥后,正式成为父钱包的子钱包。
整个流程可如下图所示。
同理,孙钱包的生成与子钱包生成的流程是完全一模一样的,父钱包与子钱包的关系等同于子钱包与孙钱包的关系。
1.2.4 钱包退出的方案设计
钱包退出可以分为父钱包退出和子钱包退出。父钱包退出是指钱包停止使用其作为父钱包的功能,子钱包退出是指该钱包退出某个父钱包的子钱包角色列表,不再拥有使用父钱包中资产的权利。
父钱包退出的流程为父钱包自我生成一个子钱包,然后使用该子钱包将父钱包中的金额均转回其普通钱包地址中,然后发送相关消息及对相关消息的签名到钱包服务端的证书服务,证书服务校验签名有效后,命令证书查询服务将该父钱包下的所有子钱包数字证书均设置为失效,至此,父钱包成功退出。
子钱包退出可以分为子钱包主动申请退出和由父钱包将子钱包设置为失效。
具体的流程为父钱包或子钱包使用子钱包数字证书的私钥,对发送相关消息并对其签名,然后将信息发送至证书服务。
证书服务验证签名是否有效,验证通过后,将向证书查询发送失效命令,证书查询服务将该证书设置为失效。
同样的,孙钱包的退出流程和子钱包的退出流程是完全一模一样的,父钱包与子钱包的关系等同于子钱包与孙钱包的关系。
1.2.5 钱包支付验证及仲裁的方案设计
(一)钱包支付
前文已经阐述过,当某个普通包成功成为某个父钱包的子钱包时,其是具有子钱包私钥的。
当子钱包想发起某笔交易时,记要签名的交易数据为。
首先子钱包产生一个随机数,计算,,。
子钱包继续随机选择,,和,然后计算:,,,,,
,,,。
最终得到消息的签名为,将消息、签名及群成员数字证书一同发送至钱包服务端节点,从而进行数据上链。
(二)支付验证
区块链验证节点在收到消息、签名和群成员数字证书后,首先向证书查询服务检验该群成员数字证书的有效性,如果通过则进行下一步,否则拒绝交易。
然后判断消息的交易信息是否符合群成员数字证书中的交易限定条件,如果满足则进行下一步,否则拒绝交易。
接着通过群成员数字证书中的群组公钥,验证是否为消息的有效签名,计算公式为,先计算,,,,然后再计算。
当且仅当,且,,和时说明该群签名有效,接收签名,并将交易数据记录到区块链上,否则流程终止。
(三)父钱包仲裁
当一笔历史交易记录存在纠纷时,父钱包可以使用自己的群私钥打开签名,确认签名者的身份。
父钱包首先使用自己的群组私钥通过验证算法,验证交易签名的有效性,如果无效则流程终止;如果有效,则进行下一步;
这一步是通过公式计算恢复出,因为每个子钱包均含有私钥,
通过证明,可以确定是哪个子钱包发起的交易,从而对具体的子钱包实施仲裁,具体的仲裁措施是撤销该钱包的子钱包数字证书,或者限制其交易金额等。
1.2.6 钱包查询的方案设计
钱包查询也是钱包中常用的功能之一,其包含账单和余额查询这两个方面。普通钱包的账单查询较为简单,本节不进行赘述,主要阐述子钱包的查询。
对于子钱包的账单查询,因为只有父钱包才能判定一笔交易具体是由哪个子钱包进行签名,区块链节点和钱包服务端都无法判定是哪一个子钱包发起并签名的交易,所以子钱包对于账单的查询,需经过父钱包的操作进行打开。
本文设计的子钱包查询账单的流程主要可以分为5步:
1. 子钱包向钱包服务端发起查询账单的交易;
2. 钱包服务端根据子钱包所在群组,向区块链系统检索与该群组相关的所有交易;
3. 区块链系统返回所需数据;
4. 钱包服务端与该群组的父钱包建立连接,传输检索得到的数据;
5. 父钱包打开每一笔交易的签名,确定每一笔交易是否由该子钱包发起,遍历完之后,将由该子钱包签名的交易发送给该子钱包。
以上即为子钱包账单查询的流程。
对于子钱包的余额查询,因为父钱包的余额属于父钱包的隐私,子钱包得知父钱包的所有余额会造成隐私泄露,而子钱包对交易进行签名使用的是群组的名义,所以余额查询功能对子钱包而言应当是屏蔽的,钱包服务端简单的返回0或者其它。
1.3 安全性分析
(一)数学理论分析
假设发布的成员证书的个数K是多项式有界的,则在强RSA假设下,满足的成员证书仅能由群管理员生成,其中,。且在强RSA假设下,该算法的交互式协议是关于的统计零知识证明。
PKI是目前应用十分广泛的工具,其安全性依赖于椭圆曲线数学难题,截至目前,关于椭圆曲线的数学问题还没有找到可算的方法,所以PKI的安全性也是足够的。
本方案中的证书查询服务,因为证书查询仅具备查询能力,钱包服务端和区块链验证节点保持严格的步骤进行验证,可以保证系统的安全性。
(二)抵抗双花攻击
在比特币等区块链系统中,“双花攻击”是一个非常热门的话题。“双花”也即双重花费,其字面意思是指在同一个货币系统中一笔钱可以被花费两次。由于数据的可复制性,数字货币系统中存在同一笔数字资产因操作不当而被重复花费的情况。
比特币系统中的双花问题主要来源于两类,一是51%算力攻击,二是利用区块确认的时间差。
由于当下流行的区块链系统多数为联盟链系统,其共识算法并不采用工作量证明算法,因此51%算力攻击本身不存在;而区块确认时间差的问题同样在本方案中是不会发生的,因为该钱包方案采用基于账户的模型,资金花费两次则从账户状态中的Balance中扣除两次金额即可。
(三)抵抗重放攻击证明
在比特币等区块链系统中,存在一种叫做“重放攻击”的攻击。但重放攻击(Replay Attack)并不是区块链技术所特有的,其最初指在互联网中,攻击者将拦截到的数据再次原封不动发送给接收方的情况。只要攻击者知晓自己所拦截信息的用途,哪怕信息经过加密,其仍然可以发起重放攻击达到恶意目的,例如窃取存款、窃取账号等。
在本系统中,由于账户状态中含有Nonce值,用户发起的交易中带有Nonce值并且签名,所以攻击者即使向系统重新把交易数据又发送一次,钱包服务端或者区块链系统节点收到交易数据,检查资金转出账户的Nonce值大于或等于交易数据中的Nonce值,于是判定该笔交易是无效的,因此可以抵抗重放攻击。