您的位置:首頁 > 區(qū)塊鏈 >

        Semaphore是用零知識證明的開源項目 每個Identity只能發(fā)送一次Signal

        2019-11-12 14:16:38 來源: 區(qū)塊網(wǎng)

        Semaphore是一個用零知識證明(zk-SNARK)技術(shù)的開源項目。Semaphore實現(xiàn)的是基于零知識證明的身份和信號。https: github com barryWhiteHat

        Semaphore是一個用零知識證明(zk-SNARK)技術(shù)的開源項目。Semaphore實現(xiàn)的是基于零知識證明的身份和信號。

        https://github.com/barryWhiteHat/semaphore

        1. 整體框架

        Semaphore整個項目,由三部分組成:nodejs模塊(客戶端/服務(wù)器端以及前端頁面),snark模塊(zk-SNARK Groth16電路相關(guān)模塊),以及以太坊上的智能合約。主要邏輯都在semaphorejs目錄中,其源代碼目錄結(jié)構(gòu)如下:

        contracts - 智能合約,使用truffle框架部署測試。

        snark - snark模塊,使用snarkjs(iden3)開發(fā)zk-SNARK電路。

        src - nodejs模塊,實現(xiàn)前后端。

        三部分之間的邏輯關(guān)系如下:

        2. Key & Identity

        使用Semaphore的每個賬戶需要創(chuàng)建私鑰和公鑰。每個賬戶的公鑰和私鑰,以及對應(yīng)的Identity的具體邏輯可以查看semaphorejs/src/client/semaphore.js文件中g(shù)enerate_identity函數(shù):

        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位的隨機數(shù)。公鑰是私鑰的EdDSA的簽名。Identity主要由兩部分組成:31個字節(jié)的nullifier和31個字節(jié)的trapdoor。這兩部分都是隨機生成。這里的nullfier,不要和ZCash中的Nullifier混淆。這里的nullfier就是隨機數(shù)。每個Identity會對應(yīng)兩個對應(yīng)的信息:一個是commitment,一個是nullifier_hash。Commitment的計算方式如下圖:

        Identity中的nullifier以及trapdoor并不記錄在以太坊的智能合約中,對應(yīng)的commitment會記錄在合約中。

        3. Semaphore.sol

        semaphorejs/contracts/Semaphore.sol是智能合約部分的邏輯實現(xiàn)。insertIdentity函數(shù)實現(xiàn)一個賬戶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對應(yīng)的commitment會添加到一個merkle樹上,同時新的merkle樹根會記錄在root_history的mapping中。

        4. Nullifier Hash

        Nullifier Hash是用來證明某個Identity對應(yīng)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已經(jīng)足夠表示。額外加入了external nullfier的原因是,同一個Identity,在external nullifier不同的情況下,生成不同的nullifier hash。也就是說,一個賬戶可以多次“消費”。這樣設(shè)計的原因是為了Signal的業(yè)務(wù)需求。

        5. Signal

        通過智能合約創(chuàng)建了Identity,就可以發(fā)信號(Signal)了。一個賬戶發(fā)送信號,必須首先提供Identity在merkle樹上的證明(能計算出commitment)。智能合約中的broadcastSignal是發(fā)送信號的接口:

        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就是需要發(fā)送的信號,a/b/c是零知識證明的proof信息,input是零知識證明對應(yīng)電路的輸入,包括merkle樹根,nullifier hash,signal hash以及external nullifier。

        只有在proof信息驗證過后,對應(yīng)signal才會記錄。每次發(fā)送signal時對應(yīng)的nullifier hash會被記錄下來。也就是說,在external nullifier不變的情況下,所有Identity只能發(fā)送一次Signal。

        總結(jié):

        Semaphore項目由js開發(fā),結(jié)合零知識證明(zk-SNARK),在以太坊的智能合約的基礎(chǔ)上實現(xiàn)Identity。每個Identity可以發(fā)送信號。在external nullifier不變的情況下,每個Identity只能發(fā)送一次Signal。(Star Li)

        關(guān)鍵詞: Semaphore 零知識證明 Identity

        精選 導(dǎo)讀

        募資55億港元萬物云啟動招股 預(yù)計9月29日登陸港交所主板

        萬科9月19日早間公告,萬物云當日啟動招股,預(yù)計發(fā)行價介乎每股47 1港元至52 7港元,預(yù)計9月29日登陸港交所主板。按發(fā)行1 167億股計算,萬

        發(fā)布時間: 2022-09-20 10:39
        管理   2022-09-20

        公募基金二季度持股情況曝光 隱形重倉股多為高端制造業(yè)

        隨著半年報披露收官,公募基金二季度持股情況曝光。截至今年二季度末,公募基金全市場基金總數(shù)為9794只,資產(chǎn)凈值為269454 75億元,同比上

        發(fā)布時間: 2022-09-02 10:45
        資訊   2022-09-02

        又有上市公司宣布變賣房產(chǎn) 上市公司粉飾財報動作不斷

        再有上市公司宣布變賣房產(chǎn)。四川長虹25日稱,擬以1 66億元的轉(zhuǎn)讓底價掛牌出售31套房產(chǎn)。今年以來,A股公司出售房產(chǎn)不斷。根據(jù)記者不完全統(tǒng)

        發(fā)布時間: 2022-08-26 09:44
        資訊   2022-08-26

        16天12連板大港股份回復(fù)深交所關(guān)注函 股份繼續(xù)沖高

        回復(fù)交易所關(guān)注函后,大港股份繼續(xù)沖高。8月11日大港股份高開,隨后震蕩走高,接近收盤時觸及漲停,報20 2元 股。值得一提的是,在7月21日

        發(fā)布時間: 2022-08-12 09:56
        資訊   2022-08-12

        萬家基金再添第二大股東 中泰證券擬受讓11%基金股權(quán)

        7月13日,中泰證券發(fā)布公告,擬受讓齊河眾鑫投資有限公司(以下簡稱齊河眾鑫)所持有的萬家基金11%的股權(quán),交易雙方共同確定本次交易的標的資

        發(fā)布時間: 2022-07-14 09:39
        管理   2022-07-14

        央行連續(xù)7日每天30億元逆回購 對債市影響如何?

        央行12日再次開展了30億元逆回購操作,中標利率2 10%。這已是央行連續(xù)7日每天僅進行30億元的逆回購縮量投放,創(chuàng)下去年1月以來的最低操作規(guī)

        發(fā)布時間: 2022-07-13 09:38
        資訊   2022-07-13

        美元指數(shù)創(chuàng)近20年新高 黃金期貨創(chuàng)出逾9個月新低

        由于對美聯(lián)儲激進加息的擔憂,美元指數(shù)11日大漲近1%創(chuàng)出近20年新高。受此影響,歐美股市、大宗商品均走弱,而黃金期貨創(chuàng)出逾9個月新低。美

        發(fā)布時間: 2022-07-13 09:36
        資訊   2022-07-13

        美股三大股指全線下跌 納斯達克跌幅創(chuàng)下記錄以來最大跌幅

        今年上半年,美股持續(xù)回落。數(shù)據(jù)顯示,道瓊斯指數(shù)上半年下跌15 3%,納斯達克綜合指數(shù)下跌29 5%,標普500指數(shù)下跌20 6%。其中,納斯達克連續(xù)

        發(fā)布時間: 2022-07-04 09:51
        推薦   2022-07-04

        融資客熱情回升 兩市融資余額月內(nèi)增加超344億元

        近期A股走強,滬指6月以來上漲4%,融資客熱情明顯回升。數(shù)據(jù)顯示,截至6月16日,兩市融資余額1 479萬億元,月內(nèi)增加344 67億元,最近一個半

        發(fā)布時間: 2022-06-20 09:41
        資訊   2022-06-20

        4個交易日凈買入超百億元 北向資金持續(xù)流入A股市場

        北向資金凈流入態(tài)勢延續(xù)。繼6月15日凈買入133 59億元后,北向資金6月16日凈買入44 52億元。自5月27日至今,除6月13日以外,北向資金累計凈

        發(fā)布時間: 2022-06-17 09:37
        推薦   2022-06-17