弹性签名是什么?弹性签名(Elastic signature,ES)旨在使用用户体验更友好的secret对数据进行签名。该secret存储在智能合约中并使用零知识证明加密,仅用户本人可对secret进行更改。secret没有固定的长度,使用体验上与传统密码相似,对于非技术用户来说,secret这一概念比私钥更易于理解。而EIP 6327则定义了一个智能合约接口,用于验证和授权使用ES进行的各项操作
有怎样的应用场景?总体而言,弹性签名(Elastic signature,ES)是一种替代签名算法,其并非私钥的替代解决方案,而是用作私钥签名之上的附加签名机制。具体用例包括但不限于:
1)用于DeFi的资金转账等流程。这一过程中,用户需要提供用户将需要提供secret才能完成交易,私钥被泄露时,secret提供额外的保护
2)用作其他智能合约钱包的插件,如账户抽象(Account Abstraction,AA)ERC-4337,在提升web3新用户体验的同时,增强钱包的安全性
针对私钥的其他安全解决方案——MPC。MPC的核心思路为分散控制权以达到分散风险或提高备灾的目的,有效避免了单点失败等安全问题。MPC钱包提供用户名密码登录,密码在Multi-Party多方校验通过后,各个节点用自己的私钥碎片签名,最终合成一个正确签名,全程不暴露私钥。但其缺点在于需要依赖服务器节点,增强了中心化属性和运维成本
EIP6327的提出则为这一问题的解决提供了新的思路。弹性签名在不改变私钥本身的前提下,使用基于零知识证明的签名算法,将签名所用的一长串乱码私钥转化为用户自定义的类似密码的字符串。与当前MPC方案相比,其由纯算法实现,没有节点,没有传统意义上的私钥。使得用户的信任重心由服务器转移至算法本身,具有极高的可信度。同时没有服务器,运维成本也大幅降低。
弹性签名的技术原理。弹性签名的核心为将上链数据带上密码(secret)进行加密得到ZK-Proof,跟上链数据明文一起发到智能合约。在传统私钥签名中,私钥签名的作用是保证名为没有被篡改,在这一过程需要隐藏私钥。而弹性签名中,则是使用ZK-Proof确保明文没有被篡改,同时隐藏密码(secret)。
以下图为例解释整个流程。首先用户需要将做什么的信息,用Keccak256生成
datahash,再跟签名过期时间expiration、指定的链chainId、从1开始自增的nonce,用Keccak256生成fullhash。(为方便理解,省去部分技术细节的说明)在ZK circult中,使用Poseidon算法来生成hash(gas较低的hash算法)。
password(即用户自定义的secret)和address生成pwdhash,确保每个用户的pwdhash都不一样。pwdhash和fullhash生成allhash,确保所有的数据都包含其中。最后proof就相当于给allhash、pwdhash、fullhash盖了个章,证明pwdhash是由password生成的,但是并不知道password具体是什么,也证明了allhash是由password和fullhash生成。fullhash作为输出,在合约里可以验证是否被篡改(即签名)。但弹性签名也存在一定的缺点,如1)可以被暴力破解,破解难度取决于密码(secret)长度。根据测算,以目前全网算力,私钥的破解难度是上亿年。如果弹性签名设置为40位密码长度,破解难度将大于私钥。80位密码长度,将能抗量子计算。而8位纯数字,5分钟可破解。推荐12位英文大小写加数字,破解需要几千片3090显卡100年时间。实际上,MPC方案所用的密码,只要校验密码的单一节点遭到入侵,所有用户的密码都有暴力破解的风险,所以也会要求用户输入复杂密码。
2)gas较高,受限制于zk特性,使用zk相关方案都会导致较高的gas。潜在优化方案为将zk算法内置到EVM,用来降低zkRollup的gas,这同样也会降低签名的gas,目前已有相关EIP的提出。
接下来以zksafe为例,简要介绍弹性签名的实际应用情况。
整体而言,zksafe通过创建一种密码+私钥的保险箱确保私钥被盗时用户的资金安全。用户可将小额热资产存在钱包中(如MetaMask)参与web3各类活动,将大额冷资产存入保险箱(即zksafe),确保资金安全。这样一来由MetaMaske处理私钥,zksafe则处理密码(secret)。重要的是,ZKSAFE不存储用户的私钥,也不存储用户的密码。
zksafe密码与MetaMask密码区别。MetaMask并不直接存储用户私钥,而是存储了私钥的证书,打开MetaMask时输入的密码,其实是证书的密码,目的是导出私钥。如果证书丢失(比如重装系统),密码就导不出私钥,资产就取不出来;如果私钥被盗,黑客不需要密码,也能盗走资产。证书+密码是用来避免直接存储私钥,从而避免私钥被木马盗取。zksafe密码则存储于智能合约之中,通过零知识证明加密,仅用户本人可修改。
用户在使用zksafe时,可以在自己的钱包和保险箱之间转移资产,保险箱相当于一个智能合约钱包,特点是转出资产的时候,要输入正确的密码,同时资产只能转移至用户钱包地址。该密码正是通过弹性签名所实现。因此可以将zksafe看作私钥签名+弹性签名的多签方案。如此一来,直接使用两个私钥做多签是否会更好呢?
问题在于私钥的触网程度,以下安全性逐级递减:**私钥在硬件钱包 -> 私钥在电脑或手机 -> 私钥在服务器。**由于服务器保持触网且固定IP,所以私钥在服务器上的安全性最差。而如果两个私钥都在一台电脑上,黑客能盗走一个,也就能盗走另一个,安全性并没有提升。而密码则不存在于任何设备上,除物理破解(如线下逼问)外,不存在被黑的可能。但是简单密码有被暴力破解的可能,所以加上私钥签名的双保险资产更安全。
未来使用方向的展望。在日常钱包的使用上,也可通过使用弹性签名作为登陆密码:
对于智能合约钱包而言,可以没有私钥,任何钱包提交的tx都处理,只验证弹性签名即可。但需要代理钱包来提交tx,代理钱包就像RPC服务,不存在单点故障,也无法篡改tx。因此这套方案可以跟EIP4337实现很好的结合。
MPC方案的优势是gas低,可以支持刷脸识别等各种注册方式,作为新用户的第一个钱包,是最容易接受的。但当用户资产增加,势必要使用更安全的方案。如果给MPC方案增加一个保险箱,使用MPC的门限签名+弹性签名,相当于用户有一个登录密码,一个资金密码,体验上很接近web2的使用习惯,又能兼顾去中心化的安全性,可能也是未来的一种方向。
在资管平台上,也可以引入弹性签名,对重要的操作,必须带上密码,这样能确保私钥被盗的时候,资金还在。比如Ankr的被盗事件,更新合约这类毁灭级的权限,不能只由一个私钥说了算。
目前ZKSAFE已完成由NGC领投,Aperture、Bytetrade、Catcher VC参投的种子轮募资。
