作者:陳劍Jason,來源:作者推特@jason_chen998
聊聊「面向Vitalik創業」的專案Nocturne和晦澀的隱私地址技術。前天Nocturne剛官宣融資600萬美金且拿到了VitalikButerin的投資,為什麼我叫它面向Vitalik創業呢,因為該項目主打的技術是隱私地址,而今年1月20日,Vitalik就曾在自己的博客中專門發文探討隱私地址的可行性,我當時在第二天也針對這篇文章進行了拆解分析,大家可以翻一下進行溫習回顧。
Nocturne的推特帳號第一次發文是今年的5月份,即在Vitalik探討隱私地址5個月後,然後又過了5個月拿到了Vitalik的投資,所以還是挺成功的一次面向Vitalik創業的案例。
那單獨聊聊隱私地址這個事吧,到底是做什麼的,如何實現,效果怎麼樣。
隱私地址的核心就是實現Token轉移過程中的匿名性,也就是tornado cash之前實現的效果,匿名轉帳是一個Crypto永恆的話題,也是非常剛性的需求,我接下來會盡可能通俗且詳細的講解隱私地址是如何實現的,又和tornado cash有何差別。
但首先要明確隱私地址絕對不是新概念,而是存在很久並且已經有不少項目和衍生協議產生,門羅幣其實差不多也是這樣的原理,但Vitalik是其在以太坊生態理論化的重要推動者。
在2022年8月的以太坊研究者論壇中,Nerolation提出了能否將ZK和ERC721結合實現匿名發送和接收NFT,Vitalik回复說你想的太麻煩了,也許用一種更簡單的方式實現,並暫時叫它ERC721S,原文連結如下:
https://ethresear.ch/t/erc721-extension-for-zk-snarks/13237
然後緊接著,Nerolation和Vitalik就提了一個EIP5564,將其徹底推進標準化:
https://eips.ethereum.org/EIPS/eip-5564
但其實在更早之前就已經有一個項目將隱私地址產品化了,至少從成熟度來說達到了可用狀態,但是我不清楚為什麼沒有得到Vitalik的青睞……反而是一年後才姍姍來遲的Nocturne被寵幸了。
隱私地址的原理簡單來說就是為每一次交易都產生一個一次性的新地址,付款人將錢轉到新地址,且新地址只能由收款人進行控制,用完即拋,手動操作就相當於A產生了一個新位址,然後將該位址的私鑰告訴B,A再往裡面轉10U,因為只有B知道這個位址的私鑰,所以B則可用控制這個位址並將10U輸入到交易所,所以從公開的鏈上只能看到A往一個空地址轉了10U,然後這個地址又將10U轉入交易所,但至於具體是誰把10U轉入交易所則沒人知道。
但以上過程是依賴很多人工操作,且涉及到私鑰的傳遞,不光麻煩風險也很高,那有沒有什麼辦法可以將這個流程給產品化呢,思路就是在於怎麼樣能夠自動實現“A生成一個只有B才能控制的位址」過程。
這個就是隱私地址要完成的任務,這裡面也用到了ZK的想法。
回到剛才的例子,舉個例子,A想給B轉10U,A已經知道了B的公開地址,但A又不想讓別人知道AB之間的交易鏈路,於是A生成一對臨時私匙和公鑰,並將該臨時私匙和B的公開地址結合後產生一個隱私地址,然後A將10U轉入隱私地址。
從鏈上來看這時候A往一個新位址中轉入了10U,這時候出現了兩個問題,首先B如何知道這個新的隱私位址是A為B創建的?也許A還給C、D、E等其他人也發了10U呢,其次即使B知道該隱私地址就是A為他創建的,那B又該如何拿到這新地址的10U或者說如何控制該新地址呢?
剛才說到A用來產生隱私地址的時候會先生成一對臨時私匙和公鑰,其中臨時私匙+B公開地址=隱私地址,而B私鑰+臨時公鑰也等於隱私地址,所以A在發送10U到隱私地址時也會同時將臨時公鑰發佈在鏈上,B則去掃描公鑰註冊表,對於每個新發現的臨時公鑰B都會將他的私鑰結合起來產生一個隱私地址,如果裡面剛好有錢則表示是A給他的。
然後再用B自己的私鑰就可以計算出該隱私地址的私鑰,從而用隱私地址的私鑰控制隱私地址進行下一步轉帳交易。
從鏈上來看的效果則是A往一個新地址轉了10U,然後10U轉移到了交易所,但到底是誰操縱新地址進行轉移則在鏈上體現不出來,新地址就像是一個提線木偶被後面的一雙手進行控制。
以上就是隱私位址的原理,到現在Nocturne的測試網和主網都沒有上線,且無roadmap,所以到底Nocturne是否能夠做到tornado cash的效果還是要再觀察。