Zether: 要点和问题
上交所 朱立
Zether 使用 ElGamal 加密算法,基于公开的群(p, g, G), 使用公钥和随机数对账户余额(或转账金额)进行加密:。另外,Lazy入账前的准备工作也充分利用了同一时密文的加法同态特性。
即使有了私钥,对加密信息进行解密也不能直接得到,只能得到后暴力求解。
消除重放攻击的手法也没啥特别的,直接就可以猜得到,合约内部为每个账户记录一个从0开始的nonce,和以太坊本身的nonce原理一致。算法的细节很容易看懂,User Algorithm理解为Wallet做的事情就对了,Paper里面的acc[]保存的是ElGamal加密后的账户余额,pTransfer[]保存的是ElGamal加密后的待入账总额(论文没解释这2个字段的意思,这里一解释就很容易看明白了)。
Transfer时转出转入方身份的隐藏是把2个人隐藏在一堆其他人的转账操作之间完成的:1个人余额减b,一个人余额加b,其他人余额变动量是0,做完这种检查后,哪怕是别人的账户也是可以执行加0操作的。这种“伪更新”的手法能否有效应对大数据分析还不确定,但不妨借鉴来用于其他场景。
Zether也存在一些问题,所以个人认为不如MimbleWimble来得漂亮:
Epoch的RollOver是Lazy入账的手法,但Epoch的设计隐含了太强的同步网络假设,在网络变得不稳定的情况下还是不能解决front running的问题。
把自己的ZTH转给其他人或转回ETH时,交易发起方需要知道(或大致知道)Zether合约中保留的自己账户余额,这个并不那么显然可以做到,尤其是在把ZTH转入他人账户无需对方对交易签名确认已了解转账余额的情况下——因为很明显我可以通过给他人账户转入一小笔ZTH的方式令其不了解余额从而无法花钱。对方唯一可以尝试的就是用前述方法基于自己私钥的x暴力猜测自己的账户余额b。如果Zether也允许小到1Wei的单位,这种需要暴力猜测的空间就可能比较大,所以Zether很可能有一个较大粒度的最小单位。对于他人的小额账户,由于不知道对方私钥x,暴力破解就不行了。
另外,虽然可以附带要求TXN携带交易收款方对本交易的签名,表示“我了解其交易金额”,这种改进可以消除上述攻击。但这种方式泄露了交易者身份信息,对加上匿名保护的Zether不适用。但如果可以提供一个这样的零知识证明,证明以下二者必居其一但不让你知道是具体哪一种情况:(入账金额大于0并且不会造成溢出并且带有入账方已知晓)__OR__ (入账金额等于0),那么这种手法也是可以用的。
网友评论