更新:是否可以通過“zk-SNARK”或“Bulletproofs”隱藏交易的發送者或接收者?
為了保護使用者隱私,是否可以通過**“zk-SNARK”或“Bulletproofs”隱藏交易的****發送方地址或接收方地址?或者我們只能隱藏映射到地址的值?**
假設以下映射:
mapping (address => bytes32) userData;
通常,使用非互動式零知識證明(如“zk-SNARK”或“Bulletproofs”),我們能夠隱藏映射到地址(即
userData
)的值,如下所示:mapping (address => bytes32) userDataHash;
然後通過零知識證明,我們可以證明如果
userDataHash
滿足一個條件?例如,證明加密數字在給定範圍內,而不透露有關該數字的任何其他資訊。但是,假設
Data
我們想要隱藏交易的發送者而不是(即address
)。我們希望為使用者/發送者本人而不是他們的數據保密。是否可以 ?如果是,如何?
是否可以為此目的使用機密地址?
粗略地說,涉及交易隱私的三個方面。
- 隱藏交易的發送者 -> 環簽名。請參閱是否可以在乙太坊實施環簽名方案?對於乙太坊中的 PoC。
- 隱藏交易的接收者 -> 隱形地址(就像在門羅幣中使用的一樣)。請參閱https://monero.stackexchange.com/questions/1500/what-is-a-stealth-address。我不知道乙太坊中有 PoC。
- 隱藏交易內容 -> 零知識證明。請參閱什麼是 zkSNARK?它們是如何工作的?,zk-SNARKs vs. Zk-STARKs vs. BulletProofs?(更新),以及是否有去中心化的 zk-SNARK(零知識簡潔非互動式知識論證)?
現在,有一點我不是 100% 確定的。zcash 具有屏蔽地址的概念,類似於門羅幣的環簽名/隱身地址。從這篇部落格文章https://medium.com/coinmonks/monero-vs-zcash-and-the-race-to-anonymity-4322b0a9bd90可以看出,可以使用 ZK-SNARKs (?) 實現屏蔽地址:
Zcash 啟用可選功能以啟用交易隱私,包括發送方、接收方和金額。以“t”(t-addrs)開頭的 Zcash 地址被認為是透明的,類似於比特幣交易。“屏蔽”交易用於以“z”(z-addrs)開頭的地址,這些被認為是完全匿名的。需要注意的是,截至 2017 年 12 月,只有 4% 的 Zcash 交易受到保護。
對於 z-addr,zk-SNARKs 用於隱藏 z-addr 的輸出和來自 z-addr 的輸出。因此,從 t-addr 到 z-addr 的交易將顯示 ZEC 離開 t-addr,但輸出將對 z-addr 隱藏。
更新:我只是偶然發現了這個。僅使用 ZK-SNARKS 就可以在所有三個方面(發送者、接收者、價值)實現隱私。有關使用 ZoKrates 庫的範例,請參閱https://medium.com/@atvanguard/zkdai-private-dai-transactions-on-ethereum-using-zk-snarks-9e3ef4676e22 。
嚴格來說,不可能隱藏乙太坊交易的發送者。這是因為可以直接提取發件人的公鑰,從而直接提取地址。有效的乙太坊交易包含構成 ECDSA 簽名的
v
,r
,s
(以及其他欄位)。這是從ethereumjs-utils提取公鑰的範例:
/** * ECDSA public key recovery from signature * @param {Buffer} msgHash * @param {Number} v * @param {Buffer} r * @param {Buffer} s * @return {Buffer} publicKey */ exports.ecrecover = function (msgHash, v, r, s) { const signature = Buffer.concat([exports.setLength(r, 32), exports.setLength(s, 32)], 64) const recovery = v - 27 if (recovery !== 0 && recovery !== 1) { throw new Error('Invalid signature v value') } const senderPubKey = secp256k1.recover(msgHash, signature, recovery) return secp256k1.publicKeyConvert(senderPubKey, false).slice(1) }
有效交易還包含一個
to
欄位,該欄位可以是接收方地址(發送乙太幣時)或智能合約的地址。部署新合約時為空(來自Solidity 文件):如果沒有設置目標賬戶(交易沒有收款人或收款人設置為空),則交易創建一個新合約。
這意味著如果您使用零知識證明創建自己的代幣合約,理論上您可以隱藏接收者的地址。您可能可以實現類似於 Zcash 的協議,但人們將能夠檢索發件人的地址。根據您的要求,這可能是也可能不是問題。作為一個側節點,有一個很好的使用 zk-SNARKs的概念驗證乙太坊混合器。
我不熟悉 Elements 機密地址,但根據Elements 網站,他們使用自己的區塊鏈,可以選擇與另一個區塊鏈掛鉤(它被部署為側鏈;像乙太坊這樣的區塊鏈被用作信任錨)。因此,它與乙太坊沒有直接關係。