零知识证明 - Semaphore源代码导读

2019-11-08 17:29 栏目:经验之谈 来源: 查看()
Semaphore是一个用零知识证明(zk-SNARK)技术的开源项目。Semaphore实现的是基于零知识证明的身份和信号。 https://github.com/barryWhiteHat/semaphore 1. 整体框架

信号量的整个项目由三个部分组成:nodejs模块(客户端/服务器端和前端页面)、snark模块(zk-SNARK Groth16电路相关模块)和以太网智能合同。主要逻辑在semaphorejs目录中,其源代码目录结构如下:

零知识证明 - Semaphore源代码导读

合同-智能合同,使用松露框架部署测试。 snark-snark模块,使用snarkjs(iden3)开发zk-SNARK电路。 src-nodejs模块,实现前端和后端。 三个部分之间的逻辑关系如下:

零知识证明 - Semaphore源代码导读

2。密钥标识 每个使用信号量的帐户都需要创建一个私钥和一个公钥。每个帐户的公钥和私钥以及相应身份的特定逻辑可以在信号量文件中的generate_identity函数中查看: 常量私钥=加密随机字节(32)。to string(' hex '); 常量prvKey=缓冲区. from(私钥,“十六进制”); const PubKeY=eddsa . PRV 2 PubK(PRV KeY); 常量identity _ null ifier='0x '+crypto . random bytes(31)。toString(“十六进制”); 常数identity _ trap door='0x '+crypto . random bytes(31)。toString(“十六进制”); const identity _ commission=pedersenHash([BigInt(circomlib . BabyJub . Murpoiscalar(PubKey,8)[0))、bigInt(identity_nullifier)、BigInt(identity _ trap door)]; 私钥是一个256位随机数。公钥是私钥EdDSA的签名。身份主要由两部分组成:一个31字节的置零器和一个31字节的陷门。这两个部分都是随机生成的。这里是无效符,不要把它和ZCash中的无效符混淆。这里的空值是一个随机数。每个标识对应两个相应的消息:一个是承诺,另一个是无效散列。提交的计算方法如下:

零知识证明 - Semaphore源代码导读

IDENTITY中的 无效器和陷门未记录在以太网广场智能合同中,相应的承诺记录在合同中。 3 .信号量。索尔· 信号量js/contracts/信号量。索尔是智能契约部分的逻辑实现。插入身份函数实现帐户身份的“注册”。 函数插入标识(uint 256 IDentity _ commission)公共样式=' box-sizing : border-box;向右填充: 0.1 px;'插入(id_tree_index,identity _ commission);uint256根=树根id _树索引];根_历史[根]=真;对应于 } 身份的承诺被添加到merkle树中,并且新的merkle根被记录在根历史的映射中。 4。无效散列 无效散列是一个生成的标签,用来证明在merkle树中存在对应于身份的承诺。null fieldhash的计算过程可以查看电路的逻辑(信号量js/snark/信号量-base.circom)。 模板信号量(jub_field_size,n_levels,n_rounds) { .组件外部_零化器_位=Num 2位(232);external _ null ifier _ bits . in==external _ null ifier;组件无效器_哈希器=Blake2s(512,0);(var I=0;i 248i++) {无效器\u hasher \u in \u bits[\u==identity \u无效器\u bits . out[\u I];}对于(var I=0;i 232i++) {[248+I位中的无效器_散列]==外部无效器_位中的无效器_[I];}对于(var I=0;i n _ levels[248+232+I]==identity _ path _ index[I];} for(var I=(248+232+n _ levels);i 512i++) {无效器\u hasher \u in \u bits[I]==0;}组件无效器_ hash _ num=Bits 2 Num(253);(var I=0;i 253在[i]==在[i外无效_散列];}无效器_hash==无效器_ hash _ num.out . } 无效散列的计算逻辑如下:

零知识证明 - Semaphore源代码导读

其实nullfier和path index已经足够表示。额外加入了external nullfier的原因是,同一个Identity,在external nullifier不同的情况下,生成不同的nullifier hash。也就是说,一个账户可以多次“消费”。这样设计的原因是为了Signal的业务需求。 5. Signal 通过智能合约创建了Identity,就可以发信号(Signal)了。一个账户发送信号,必须首先提供Identity在merkle树上的证明(能计算出commitment)。智能合约中的broadcastSignal是发送信号的接口: function broadcastSignal( bytes memory signal, uint[2] memory a, uint[2][2] memory b, uint[2] memory c, uint[4] memory input //(root, nullifiers_hash, signal_hash, external_nullifier) ) public style='box-sizing: border-box; padding-right: 0.1px;' isValidSignalAndProof(signal, a, b, c, input) { uint无效器_hash=输入[1];信号[电流_信号_指数+]=信号;无效器_散列_历史[无效器_散列]=真;发射信号广播(信号,调零器_散列,输入[3]); } 信号是要发送的信号,a/b/c是零知识证明的证明信息,输入是相应零知识证明电路的输入,包括merkle根、置零器散列、信号散列和外部置零器 相应的信号只有在验证信息后才会被记录 每次发送信号时,都会记录相应的无效散列。 换句话说,所有身份只能发送一次信号,而不需要改变外部置零器。 摘要: 信号量项目由js开发,结合零知识证明(zk-SNARK)实现基于以太网广场智能契约的身份认证 每个身份都可以发送信号 在外部置零器不变的情况下,每个身份只能发送一次信号。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发