Addresses

更新:是否可以通過“zk-SNARK”或“Bulletproofs”隱藏交易的發送者或接收者?

  • January 8, 2019

為了保護使用者隱私,是否可以通過**“zk-SNARK”或“Bulletproofs”隱藏交易的****發送方地址接收方地址?或者我們只能隱藏映射到地址的值?**

假設以下映射:

mapping (address => bytes32) userData;

通常,使用非互動式零知識證明(如“zk-SNARK”或“Bulletproofs”),我們能夠隱藏映射到地址(即userData)的值,如下所示:

mapping (address => bytes32) userDataHash;

然後通過零知識證明,我們可以證明如果userDataHash滿足一個條件?例如,證明加密數字在給定範圍內,而不透露有關該數字的任何其他資訊。

但是,假設Data我們想要隱藏交易的發送者而不是(即address)。我們希望為使用者/發送者本人而不是他們的數據保密。

是否可以 ?如果是,如何?

是否可以為此目的使用機密地址?

粗略地說,涉及交易隱私的三個方面。

  1. 隱藏交易的發送者 -> 環簽名。請參閱是否可以在乙太坊實施環簽名方案?對於乙太坊中的 PoC。
  2. 隱藏交易的接收者 -> 隱形地址(就像在門羅幣中使用的一樣)。請參閱https://monero.stackexchange.com/questions/1500/what-is-a-stealth-address。我不知道乙太坊中有 PoC。
  3. 隱藏交易內容 -> 零知識證明。請參閱什麼是 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 網站,他們使用自己的區塊鏈,可以選擇與另一個區塊鏈掛鉤(它被部署為側鏈;像乙太坊這樣的區塊鏈被用作信任錨)。因此,它與乙太坊沒有直接關係。

引用自:https://ethereum.stackexchange.com/questions/57619