区块链专业有哪些大学:零知识证明 - Semaphore源代码导读

  Semaphore是一个用零知识证明(zk-SNARK)技术的开源项目。Semaphore实现的是基于零知识证明的身份和信号。

  https://github.com/barryWhiteHat/semaphore

  1. 整体框架

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

  

  contracts - 智能合约,使用truffle框架部署测试。

  snark - snark模块,使用snarkjs(iden3)开发zk-SNARK电路。

  src - nodejs模块,实现前后端。

  三部分之间的逻辑关系如下:

  

  2. Key & Identity

  使用Semaphore的每个账户需要创建私钥和公钥。每个账户的公钥和私钥,以及对应的Identity的具体逻辑可以查看semaphorejs/src/client/semaphore.js文件中generate_identity函数:

  const private_key=crypto.randomBytes(32).toString('hex');

  const prvKey=Buffer.from(private_key, 'hex');

  const pubKey=eddsa.prv2pub(prvKey);

  const identity_nullifier='0x' + crypto.randomBytes(31).toString('hex');

  const identity_trapdoor='0x' + crypto.randomBytes(31).toString('hex');

  const identity_commitment=pedersenHash([bigInt(circomlib.babyJub.mulPointEscalar(pubKey, 8)[0]), bigInt(identity_nullifier), bigInt(identity_trapdoor)]);

  私钥是256位的随机数。公钥是私钥的EdDSA的签名。Identity主要由两部分组成:31个字节的nullifier和31个字节的trapdoor。这两部分都是随机生成。这里的nullfier,不要和ZCash中的Nullifier混淆。这里的nullfier就是随机数。每个Identity会对应两个对应的信息:一个是commitment,一个是nullifier_hash。Commitment的计算方式如下图:

  

  Identity中的nullifier以及trapdoor并不记录在以太坊的智能合约中,对应的commitment会记录在合约中。

  3. Semaphore.sol

  semaphorejs/contracts/Semaphore.sol是智能合约部分的逻辑实现。insertIdentity函数实现一个账户Identity的“注册”。

  function insertIdentity(uint256 identity_commitment) public style="box-sizing: border-box; padding-right: 0.1px;"> insert(id_tree_index, identity_commitment);

  uint256 root=tree_roots[id_tree_index];

  root_history[root]=true;

  }

  Identity对应的commitment会添加到一个merkle树上,同时新的merkle树根会记录在root_history的mapping中。

  4. Nullifier Hash

  Nullifier Hash是用来证明某个Identity对应commitment存在一个merkle树上,并生成的标示。Nullfier Hash的计算过程可以查看电路的逻辑(semaphorejs/snark/semaphore-base.circom)。

  template Semaphore(jubjub_field_size, n_levels, n_rounds) {

  ...

  component external_nullifier_bits=Num2Bits(232);

  external_nullifier_bits.in <==external_nullifier;

  component nullifiers_hasher=Blake2s(512, 0);

  for (var i=0; i < 248; i++) {

  nullifiers_hasher.in_bits[i] <==identity_nullifier_bits.out[i];

  }

  for (var i=0; i < 232; i++) {

  nullifiers_hasher.in_bits[248 + i] <==external_nullifier_bits.out[i];

  }

  for (var i=0; i < n_levels; i++) {

  nullifiers_hasher.in_bits[248 + 232 + i] <==identity_path_index[i];

  }

  for (var i=(248 + 232 + n_levels); i < 512; i++) {

  nullifiers_hasher.in_bits[i] <==0;

  }

  component nullifiers_hash_num=Bits2Num(253);

  for (var i=0; i < 253; i++) {

  nullifiers_hash_num.in[i] <==nullifiers_hasher.out[i];

  }

  nullifiers_hash <==nullifiers_hash_num.out;

  ...

  }

  Nullifier Hash的计算逻辑如下图:

  

  其实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 nullifiers_hash=input[1];

  signals[current_signal_index++]=signal;

  nullifier_hash_history[nullifiers_hash]=true;

  emit SignalBroadcast(signal, nullifiers_hash, input[3]);

  }

  signal就是需要发送的信号,a/b/c是零知识证明的proof信息,input是零知识证明对应电路的输入,包括merkle树根,nullifier hash,signal hash以及external nullifier。

  只有在proof信息验证过后,对应signal才会记录。每次发送signal时对应的nullifier hash会被记录下来。也就是说,在external nullifier不变的情况下,所有Identity只能发送一次Signal。

  总结:

  Semaphore项目由js开发,结合零知识证明(zk-SNARK),在以太坊的智能合约的基础上实现Identity。每个Identity可以发送信号。在external nullifier不变的情况下,每个Identity只能发送一次Signal。

文章内容系本站作者个人观点,不代表本站对其观点赞同或支持,文章的版权归该作者所有。如需转载,请注明文章来源。本文地址:http://www.cis.net.cn/kejikuaixun/43530.html
留言与评论(共有 条评论)
验证码:

最新文章

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

科技快讯
Semaphore是一个用零知识证明(zk-SNARK)技术的开源项目。Semaphore实现的是基于零知识证明的身份和信号。1.整体框架Semaphore整个项目,由三部分组成:nodejs模块(客户端/服务器端以及前端页面),snark模块(zk-SNAR

区块链与智能制造培训(区块链在智能制造方面的应用)

科技快讯
会上,行业专家进行了区块链、智能制造的相关介绍、案例和应用展望,分享行业经验,共享创新发展成果。邮电大学博士、通信行业市场研究与分析专家高峰做了题为“发展现状和趋势”的专题报告。据介绍,当前,区块链技术已经涉及服务、、社会管理、教育、通信等领域。在实际应用上,区块链技术可以进行税收监管与征信管理,如交易数据与发票

比特币现金BCC开发商提出了新的地址格式!

科技快讯
本周,领先的比特币ABC开发者AmaurySéchet建议将Bech32地址格式添加到BitcoinCash(BCC)网络。目前,BCC社区一直在讨论修改BCC地址格式,同时准备修订协议的紧急难度调整(EDA)。BCC社区和开发者建议更改协议的地址格式10月14日,AmaurySéchet提议为比特币现金网络实施新的地址格式。改变BCC地址格式的主题已经争

零交易费的点对点艺术市场《PeerArt》

科技快讯
区块链技术可以允许供应链中的所有参与者在没有中间人的情况下进行交互和价值的交易。我们能够以真正的点对点和去中心化的方式汇款,进行交易和使用软件等。这是具有革命性意义的。在Origin开源协议上建立的市场平台可以允许买家和卖家直接进行交易,没有中间人抽取很高的交易费。很快的,所有各式各样的共享经济

PlusToken超百亿资金去向追踪,币圈第一资金盘已波及300万人

科技快讯
近期,被称为“币圈第一资金盘”的Plustoken钱包资金盘事件引发了大量关注,关于Plustoken是个什么“玩意儿”,想必大家已经了解了很多,类似的文章在网上也有很多。首先笔者想说的是,这里面存在着一个误区,其实从本质上来说,Plustoken

黄震之(黄震传)

科技快讯
在可预见的未来世界中,即将成为我们生活与职业的一种方式。大家好,我是黄震,很高兴与大家在个人发展学会相遇!2008年,一篇标题为《,一种点对点的电子现金系统》的学术论文悄然发表,并没有引起多大的反响。2018年1月9日,一位著名投资基金创始人在一个500人的大群里,发布了一条让大家不要外传的消息,称区块链的革命已经到来,这是一场

到2027年,每个公司都将使用区块链

科技快讯
十年前,比特币的创造者中本聪(SatoshiNakamoto)用一篇长达八页的研究论文描述如何通过比特币使得货币去中心化,悄无声息地革新了像银行一样的信托提供机构。当时,没有多少人明白这八页文件内在蕴藏的潜力。在这八页文件里,中本先生不只是解释了我们如何能够

首届中国区块链媒体社会责任论坛在京隆重举行

科技快讯
活动由中国经济新闻联播网主持人韩旭(左)和斯思(右)联袂主持中国经济新闻联播网总裁、总编辑黄凤荣代表论坛主办方致欢迎词中华全国新闻工作者协会书记处书记潘岗致辞中国经济传媒协会会长赵健致辞《经济日报》社副总编辑丁士做主旨发言《科技日报》社总编辑刘亚东做主旨发言北师大新闻传播学院执行院长喻国明教授做主旨发言火星

继比特币之后又一强劲的数字货币时代的到来

科技快讯
随着区块链技术的不断普及以及数字货币的市值攀升,以比特币为首的诸多数字货币成为普通民众的追捧对象。再加上世界政治经济的变化,数字货币的积极作用在不断凸显,成为继黄金之外的又一避险资产。但是数字货币作为法律边缘的固定资产,由于其的虚拟性和数字化

区块链如何帮助验证护照

科技快讯
护照或签证是被认为是最重要的身份证件之一。他们被认为是全球最可信、最优质的旅行和可识别的证据报告。任何一个有过申请国际身份证护照或签证经历的人都知道,整个情况是不容妥协。这些程序可归结为一个严格的申请程序,需要范围广泛的支持文件,例如出生证明和公民身份的确认。不法分子对护照欺诈收取高额费用并不令人意外。今