1 micromix
micromix的源代码github地址:githubcomweijiekohmixer。核心逻辑实现在contractssoliditymixersol文件中。
micromix在semaphore项目之上,提供混币服务,整个框架如下:
整个micromix生态存在三种角色:发送方,接收方以及relayer。使用micromix,需要两个步骤:1)deposit(存钱)2)mix(提钱)。
11 deposit
在使用mixer服务之前,发送方需要deposit(存入)固定数量的代币(eth或者erc20代币)。deposit同时要求发送方生成semaphore对应的identity。也就是说,每“混”一笔交易,发送方需要创建一个identity。
12 mix
mix接口实现”提钱“的功能。mix接口由“relayer”(中继)调用,而不是由发送方调用。因为每个identity在external nullfier不变的情况下,能且只能发送一次signal,从而保证每笔存入的代币都能mix。每个需要“提钱”的账户,提供identity的证明给relayer,同时在signal中指定relayer,接收方以及费用,从而relayer可以发起交易,调用mix接口转账给接收方。
也就是说,可以存在多个relayer,relayer通过提供mix的服务,“代替”发送方,向接收方发起转账,同时赚取服务费。每笔mix服务的服务费可以由发送方指定。
13 性能
micromix使用semaphore构建了20层的identity的merkle树。deposit大约消耗110w的gas,mix大约消耗77w的gas费用(主要是zksnark的验证)。
2 tornado mixer
tornado mixer的源代码地址:githubcompeppersectornado-mixer。tornado mixer的核心逻辑在contractsmixersol文件中:一个是deposit函数,一个是withdraw函数。tonado mixer的框架如下图:
大体逻辑和micromix类似,发送方(sender)首先向智能合约转账(固定金额),并在智能合约上创建commitment。接下来,发送方(sender)将零知识证明发送给mixer,mixer确认证明后,通过withdraw函数向接收方转账。
21 commitment merkle树
所有的commitment在智能合约中组织成一个merkle树:
叶子节点的计算采用pedersen hash算法,中间节点采用mimc hash算法。整个树高为16。也就是说,tornado mixer一个智能合约,支持2^16次转账。
22 性能
commitment merkle树高为16。deposit函数大约消耗888w的gas,withdraw函数大约消耗692w的gas。证明电路的contraint为22617。生成一次证明的时间大约为61秒。
3 hopper
hopper的源代码地址:githubcomargentlabshopper。hopper的核心逻辑在soliditycontractsmixersol中:一个是commit函数,一个是withdraw函数。大体思路和tornado mixer一致,不再详细描述。相比较其他两个项目,hopper有个明显的特色,实现了手机端的mixer的功能。
31 commitment merkle树
从安全性角度考虑,叶子节点仍然采用sha256的计算。但是,为了降低证明电路的大小,中间节点采用mimc hash算法。commitment merkle树高为15。也就是说,hopper一个智能合约,支持2^15=32768次转账。
32 性能
commitment merkle树高为15。gas消耗和生成证明的时间没有实测。从理论上计算,gas消耗会比tornado mixer略低一些,生成时间会比tornado mixer高。
总结:mixer,混币,是零知识证明的一种应用,隐藏转账的发送方。目前,在以太坊上的mixer实现的思路大体一致:发送方,首先转账固定金额给智能合约,同时提交的commitment构造上一棵merkle树。需要转账时,发送方链下将零知识证明的信息发送给mixer或者relayer。mixer或者relayer,将证明相关信息提交到智能合约。智能合约验证后转账给接收方。mixer或者relayer赚取一定的服务费。