99久久国产亚洲高清观看2020_国产免费成人_四虎国产精品永久地址入口_国产精品免费一区二区久久夜色_美国超碰在线_男人天堂tv

您的位置:首頁 > 區塊鏈 >

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