MACI,即Minimal Anti-Collusion Infrastructure的简称,由Vitalik在2019年5月于ethreaser.ch提出。它旨在为区块链应用提供一种抵御共谋的机制,旨在确保想法的正确执行和抗审查(censorship resistance)。其中,投票是最具实际应用场景的例子。如果在区块链上投票能保证他人无法查证个人投票,那么行贿者就无法得知你是否按规投票,从而减少行贿的诱因。
其基本流程大致如下:
在注册期间,投票者需使用公钥(EdDSA)向合约注册身份;注册期结束后,投票者将加密后的票投给合约;投票结束后,协调者(coordinator)从合约中提取所有票数,计算结果,并生成zk证明上传至合约,以更新票数(注1)MACI中最关键的机制在于,在投票结束前,投票者可以向合约发出更换公钥的指令,然后使用新的公私钥进行投票。当协调者计票时,会从合约中查找注册者的公钥,若发现该身份更换过公钥,则旧公钥所投的票将被认定为无效票。程序大致如下:
假设Alice以公钥A注册身份,行贿者试图利诱或威胁Alice投赞成票,而Alice也按行贿者的意愿投给了赞成票。在投票结束前,Alice可以随时向合约更改身份为公钥B。更改完公钥后,Alice可以使用私钥B签署反对票。当协调者计票时,会发现公钥A已被更改为公钥B,因此私钥A所签署的赞成票将被记为无效票进一步深入细节...
用户注册时,首先生成一组EdDSA的私钥对(注2),然后通过合约的signUp()方法注册公钥,合约中记录着账号的相关信息。接着,用户生成一组临时的(ECDSA)私钥对prvE/pubE(每次投票生成一组)。使用这组临时的私钥prvE和协调者的公钥pubC生成加密的钥匙EncKey,用密钥EncKey加密投票指令(command)(注3)。然后将临时的公钥pubE和加密后的指令通过合约的publishMessage()方法上链。协调者通过ECDH交换秘密的方式获取EncKey,在投票结束时,协调者使用这把密钥解密信息(注3),并更新票数。更换公钥的指令也是通过publishMessage()方法上链的,因为上链的指令都是加密过的,只有协调者能解密,所以行贿者无法得知受贿者是否更换过身份。
在MACI中,所有信息都是上链的,因此不怕协调者不打包特定数据。然而,所有数据协调者都可以解密,行贿者可以直接与协调者勾结,得知受贿者们是否按规投票,如何防范这一点并不在MACI的原始提案中。有兴趣的人可以去MACI的GitHub了解实施细节。
注1:是的,MACI系统中协调者必须是诚实的。注2:在snarks的应用中,通常使用EdDSA进行签名,而非以太坊的ECDSA,因为EdDSA在zk circuit的实现上复杂度较低。注3:在MACI中,投票、更换公钥等操作都称为指令(command),而加密后的指令称为信息(message)
标签: 数字货币