您的位置:首页 > 区块链 >

Semaphore是用零知识证明的开源项目 每个Identity只能发送一次Signal

2019-11-12 14:16:38 来源: 区块网

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

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。(Star Li)

关键词: Semaphore 零知识证明 Identity

精选 导读

募资55亿港元万物云启动招股 预计9月29日登陆港交所主板

万科9月19日早间公告,万物云当日启动招股,预计发行价介乎每股47 1港元至52 7港元,预计9月29日登陆港交所主板。按发行1 167亿股计算,万

发布时间: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情况曝光 隐形重仓股多为高端制造业

随着半年报披露收官,公募基金二季度持股情况曝光。截至今年二季度末,公募基金全市场基金总数为9794只,资产净值为269454 75亿元,同比上

发布时间: 2022-09-02 10:45
资讯   2022-09-02

又有上市公司宣布变卖房产 上市公司粉饰财报动作不断

再有上市公司宣布变卖房产。四川长虹25日称,拟以1 66亿元的转让底价挂牌出售31套房产。今年以来,A股公司出售房产不断。根据记者不完全统

发布时间: 2022-08-26 09:44
资讯   2022-08-26

16天12连板大港股份回复深交所关注函 股份继续冲高

回复交易所关注函后,大港股份继续冲高。8月11日大港股份高开,随后震荡走高,接近收盘时触及涨停,报20 2元 股。值得一提的是,在7月21日

发布时间: 2022-08-12 09:56
资讯   2022-08-12

万家基金再添第二大股东 中泰证券拟受让11%基金股权

7月13日,中泰证券发布公告,拟受让齐河众鑫投资有限公司(以下简称齐河众鑫)所持有的万家基金11%的股权,交易双方共同确定本次交易的标的资

发布时间: 2022-07-14 09:39
管理   2022-07-14

央行连续7日每天30亿元逆回购 对债市影响如何?

央行12日再次开展了30亿元逆回购操作,中标利率2 10%。这已是央行连续7日每天仅进行30亿元的逆回购缩量投放,创下去年1月以来的最低操作规

发布时间: 2022-07-13 09:38
资讯   2022-07-13

美元指数创近20年新高 黄金期货创出逾9个月新低

由于对美联储激进加息的担忧,美元指数11日大涨近1%创出近20年新高。受此影响,欧美股市、大宗商品均走弱,而黄金期货创出逾9个月新低。美

发布时间: 2022-07-13 09:36
资讯   2022-07-13

美股三大股指全线下跌 纳斯达克跌幅创下记录以来最大跌幅

今年上半年,美股持续回落。数据显示,道琼斯指数上半年下跌15 3%,纳斯达克综合指数下跌29 5%,标普500指数下跌20 6%。其中,纳斯达克连续

发布时间: 2022-07-04 09:51
推荐   2022-07-04

融资客热情回升 两市融资余额月内增加超344亿元

近期A股走强,沪指6月以来上涨4%,融资客热情明显回升。数据显示,截至6月16日,两市融资余额1 479万亿元,月内增加344 67亿元,最近一个半

发布时间: 2022-06-20 09:41
资讯   2022-06-20

4个交易日净买入超百亿元 北向资金持续流入A股市场

北向资金净流入态势延续。继6月15日净买入133 59亿元后,北向资金6月16日净买入44 52亿元。自5月27日至今,除6月13日以外,北向资金累计净

发布时间: 2022-06-17 09:37
推荐   2022-06-17