📜 [專欄新文章] [ZKP 讀書會] Tornado Cash
✍️ Jerry Ho
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Disclaimer: 本人與Tornade Cash專案及其員工無任何利益往來。
Tornado Cash是一個Ethereum上的原生隱私轉帳解決方案,使用zk-SNARK+Merkle Tree的路徑證明作為其核心隱私保護機制。
你知我知,Ethereum上的交易記錄是公開的,這使得任何一個人只要知道你的address,便可以在https://etherscan.io/ 之類的網站上查出有多少人和這個位置進行過交易,你做過什麼消費行為或是交易行為等。
或許這聽來不像是個問題,而想要隱藏自己的交易記錄甚至聽起來反而像是不法分子的銷贓行為。
但試想下開情境:因為我曾經使用ethereum捐款給一個政治不正確的專案/組織,而我在接受dd/kyc/reference check的時候因為我的ethereum address就寫在自己的blog上而被查了個底朝天,因而被拒絕入職/拒絕開戶/拒絕服務。
這並不是一個很遙遠的情境…
Tl;dr
解決交易隱私問題分為兩個層次,Assuming你的目的是讓自己的金錢流向無法被追蹤。
層次一:我的錢「丟進了」Tornado Cash的contract,我要如何在不使用與轉入時同一個address的情況下— 若是同一個address就沒有隱私可言了 — 取出我的錢?contract如何知道我存過錢,餘額還夠,所以現在我來領錢了他讓我領?
層次二:就算層次一成立,我的隱私如何達成?到底有多隱私?到底有多不隱私?
技術上來說(細節下文詳談),層次一使用zero-knowledge的set-membership proof來證明,透過預先在Merkle Tree中「登記」一個自己的entry/leaf,tornado cash稱為note,爾後在提款時提出該leaf之zk proof,來解決這個提款時的認證問題。
層次二則是所謂的藏樹於林。既然轉出和轉入無法被連結在一起,那麼只要使用Tornado Cash的人數夠多,總轉出和總轉入的交易總筆數就會太多,以致無法輕易重新關聯轉入與轉出地址背後的真人。
使用界面
https://tornado.cash/
當然你也可以直接和合約地址互動啦
上圖左方紅框為存入幣種與金額大小,右方紅框為該額度對應之帳戶內有多少顆「樹」。
記得藏樹於林嗎?右方的 Anonymity set 就是告訴你現在森林的規模有多大。數量一大,跑資料分析試圖重新關聯某筆特定存款到某筆特定提款就變得更為困難。
提款界面如上。
值得注意的是,提款時的以上兩個選項(Wallet/Relayer),是在目前Account Abstraction尚未實現時的一個折衷方案。
這裡有個死循環:既然我提款的時候需要支付gas,那麼我的gas從哪裡來?是不是勢必得從交易所或是其他帳號來?簡言之,若是無法直接新建立一個地址然後直接將其作為Tornado Cash提款用,達到的隱私強度就大打折扣。
Relayer就是針對這個問題所設計的。透過付出一些手續費來提供社群架設relayer node的誘因,提款時該筆轉帳的gas費用,便可以讓relayer node來負責先出。relayer node收到使用者的zk proof後將其轉交給tornado cash的合約,合約就會會將應有的relayer手續費與扣除手續費+gas後的款項分別轉給relayer與使用者。
社群治理
Tornado Cash天生是一個比較沒有銅臭味的專案 — 社群治理和funded的味道相當強烈。
透過預先設計好的proxy contract與staking/locking機制,任何一個Tornado Cash的使用者都能夠提出對合約實行的改動建議,並交由社群來投票決定是否要執行該改動。
技術細節可以參照此篇,同時Tornado Cash的第一輪社群治理提案也剛投票過關,回顧可參考此處之討論。
誘因設計
本文作者比較任性不在意錢,請移駕此處閱讀官方如何設計Anonymity Mining來確保以下兩點:
機制能讓使用者願意加入存錢,提供流動性同時也讓樹林變大,增加隱私程度。
產生TORN(ERC20 token)與領取TORN的機制,透過在原本的tornado cash上面再加一層,來避免TORN激勵層錯誤的設計導致下一層之隱私洩漏(激勵層出事不影響核心隱私之意)。
技術細節
首先本文不打算解釋何為zero-knowledge proof,請接受以下描述:
若有一NP statement分類上是satisfiability problem(例:merkle tree中的hash chaining H(H(H(a,b),c),d) ),則我們可以設計出一個arithmetic circuit來確保能夠有效率的產生proof, 有效率的驗證, 無法產生假的且能說服人的proof…且其電路驗證的statement是我們想要的,像是此例中的merkle tree opening.
存款
存款者透過送出C = H(k, r) 以及存入之數額給tornado cash的合約來進行存款的動作。其中k在之後會成為存款者領錢的憑證,稱為nullifier,r則是增加randomness而已,此二值需要記下。此時合約端會將這個C(commitment)丟入Merkle Tree上其中一個空的leaf,並更新root hash。存款者還需要記下自己的C對應之leaf index。
產生proof,用此proof作為提款憑證
用一段話來概括,若是我
知道Merkle Tree上某個leaf的commitment的preimage, 代表我能在電路中證明我知道H(k, r) 中的 k, r, 同時不洩漏k, r到底是多少(zk特性, magic)。
我知道該leaf至root的路徑上會經過哪些點,我也提供了一個可以讓電路驗證root hash的hash chaining過程,代表我知道他是從哪個leaf開始走的。因而,這證明了我提出的1.中的commitment確實屬於某顆公開的、大家都知道的merkle tree中的特定leaf(就是我之前存款對應到的leaf)。
就可以在不需要提供像是原本存款地址的簽章之類的驗證機制情況下,透過zk proof,亦能正確做permission control讓unlinkable的提款能夠成真。
另,讀者可以看到在proof中已然預設了relayer的存在。這使得上開所提到之「使用者提款, 拜託relayer執行=>relayer預付gas發起transaction,將內容送給tornado cash合約=>合約處理proof並將款項拆成兩份給relayer與使用者」這個行為得以成立,且relayer無法得知或假造proof內容。
提款流程
基本上在上方的產生證明都講過一次了,這邊就是pseudo code順過一次提款流程而已,大家自己看啊。
值得一提的是,使用者除了需要提出上一部分提到的證明之外,還需要將k的部分額外拿出來再做一次H(k),將值一併傳給contract。
這裡的設計哲學,簡單來講是這樣的:zero-knowledge太強了,強到就算證明了我知道H(k, r)的k跟r, 收到的驗證者並沒有辦法知道H(k)是什麼東西。為了讓同一筆款項不會被提領兩次,在提款流程中合約會將「每一筆成功提款中的H(k)」記錄下來,另外開個表存著。爾後若是其他提款交易中的H(k)與表中的重複了,這就代表有人試圖想要騙合約重複提款,自然該提款嘗試就不會成立。
洗錢失敗例
工程師都知道使用者從來不看說明書,看了可能也不會懂。
Koh Wei Jie分析了Kucoin的駭客事件。Kucoin的駭客使用Tornado Cash來洗錢,但忽略了Tornado Cash官方一直三令五申的使用需知,因而讓款項在進入Tornado Cash跑了一輪之後還是能夠被追蹤,哈哈UCCU。
簡單來說,hacker為了節省多次使用relayer的手續費,而將大多數的提領過程都變成直接提領到wallet。雖然該wallet的位置是全新產生的沒有gas,但是透過只讓第一次的提款使用relayer,hacker便能從第一次提款中取得手續費並分發給其他全新產生的wallet address。
那問題在哪?還要問?
要達到隱私需要保持藏樹於林原則,同時使用者不應自己破壞tornado cash幫你達成的address unlinkability。這位hacker因為愛省手續費,所以違背了後者;同時他因為太心急又愛省手續費,太快、分太少次提領、每次提領的數額又太大了,所以side-channel去給他做簡單的traffic analysis就能夠用虛無假設推出:「綜觀歷史上所有的存款位置與數額,扣掉駭客存錢的那些位址之後,我們還需要14個unique address/user共謀,才能有能力一次提這麼多錢。」
這看起來可能嗎?自然是不可能的。
所以這位駭客就是錯誤的沒有遵守藏樹於林的原則,才導致自己的金流重新被和帳號聯繫在一起。
提供一些延伸閱讀,圈子內的”名人”對這種不看說明書的使用者的看法:
tornado * Gavin Andresen
如何避免洗錢失敗
我自己的投影片,我自己翻譯:
打開你的VPN 打開你的TOR 打開你的無痕瀏覽器分頁 用上你全新的VM PC VPS instance 最好連data-link layer安全都顧到 產生全新的地址不要懶惰 自己跑一個fullnode 乖乖用relayer付手續費提款 領錢之後記得把C(k,r)的記錄刪掉 不要急一次存或提領大額 時間拉長數目減少…..
簡而言之:要設計相對安全但又讓使用者可以直覺上手的安全系統真的很他媽難 - 使用者永遠會想辦法抄近路,然後系統的security assumption就爆炸了。
結論上來講,你想要多安全取決於你在臺大水源校區的腳踏車平常都上幾個大鎖=想付出多少成本。只要不要學Kucoin Hacker那樣連鎖都不鎖車還是新的,大部分時間都沒啥問題 lol。
參考資料與文中出現過的連結,不按先後順序:
https://tornado.cash/Tornado.cash_whitepaper_v1.4.pdf
https://tornado.cash/audits/TornadoCash_cryptographic_review_ABDK.pdf
https://tornado.cash/audits/TornadoCash_circuit_audit_ABDK.pdf
https://torn.community/t/whats-next-for-tornado-cash-governance/250
https://weijiek.medium.com/deanonymising-the-kucoin-hacker-418fa5e9911d
https://tornado-cash.medium.com/tornado-cash-governance-proposal-a55c5c7d0703#2084
https://eips.ethereum.org/EIPS/eip-2938
http://gavinandresen.ninja/private-thoughts
[ZKP 讀書會] Tornado Cash was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
vps vpn分別 在 VPN与VPS的区别翻墙服务器购买实现科学上网 - YouTube 的必吃

VPN 与 VPS 的区别 VPS 的购买 VPS 供应商家 VPS 搭建谷歌云. ... <看更多>
vps vpn分別 在 [攻略] 架設屬於自己的Proxy Server | PTT 熱門文章Hito 的必吃
... 之前介紹過在VPS 主機上運行PPTP 協議的VPN 或是OpenVPN-Access Server 之後,這次來介紹Shadowsocks 這套基於Socks5 協議撰寫的代理伺服器程式,其實OpenVPN-AS ... ... <看更多>
vps vpn分別 在 [分享] VPS 選擇及SS 架設心得(VPN) - 看板WorkinChina 的必吃
先感謝在前篇文給與指引的大大們
特以此篇分享心路歷程,如果有問題也歡迎來問我,感謝
好讀無音樂網誌版 https://goo.gl/sO89J6
------------------------------------------------------------------
既然翻牆的梯子這麼難買,那就自己做一個吧 – 聊買 VPS 及架構 Shadowsocks
前一篇文說到,我試了 N+1 個 VPN,最後找到了 Astrill 這個可免費測試一週的
服務,雖然最後試用結果還算滿意,但我沒有買入,原因是我最後決定自己來造梯
了。
前文請參考:[分享] 深圳+電信 VPN 心得
https://www.ptt.cc/bbs/WorkinChina/M.1489306469.A.9F5.html
並不是說 Astrll 不好,它速度不錯,但我把這篇文章分享到 ptt 的 Workinchina
版,裡面有不少大大提示了我 VPS(virtual private server) + SS(Shadowsocks)
會是另一個新世界。當晚很快的爬了文章,並且實作,發現其實真如同大大們所說
,只要架構起來後,速度和穩定性都非常的驚人……
先科普一下,VPS +Shadowsocks 是透過 Socks 5 的代理方式,透過加密達到翻牆
的目的。就我使用下來,應該有幾家商用的 VPN 提供商也是利用類似的協定來完
成目標。Shadowsocks 必須被設定在遠端(牆外)的 Server 上,本機端(牆內)
的電腦安裝 Client 端,透過雙方的加密和傳輸,來接觸到外面的世界。所以也就
是說,必須在中國境外架設 Server,除了文章會提到的 VPS 之外,也可以直接放
台電腦,或是買台支援 SS server 的 Router (基本上支援開源的,像是 openwrt
、ddwrt)。考慮到維護成本,實體裝置都不在我考慮的範圍內,原因是還有重啟、
防火牆、實體維運的成本。
上網查詢了許多 VPS 評價,最後我們嚐試了三家,以下列出使用心得和優缺點。
Bandwagonhonst 搬瓦工
(20G/1G/1xCPU/2000 GB 流量/9.99 美金/3 個月/ping150-200/洛杉磯)
人稱對電腦白痴最友善的 VPS + SS 解決方案,後台完整的 GUI 可查詢用量、重
裝 OS、一鍵安裝設定 Shadowsocks 或 OpenVPN server。如果你不會或是不想學
習 linux 指令,搬瓦工應該是唯一的選擇了。特別提醒,如果你在牆內,第一次
的註冊及購買「請不要使用 VPN 或代理」,因為一旦使用了,會被系統判定為詐
騙 (fruad) 帳號,然後帳戶就會被關,很麻煩。
要說搬瓦工的缺點,就是採用 openvz 的架購,無法直接執行 BBR 來提速。使用
簡單的 linux 指令可登入系統安裝 net-speeder 來讓封包加倍,但效果有限。
Youtube 一開始只能跑到 480p,後來我們在網路上找到教學,在 openvz 的架構
裡安裝 UML 去模擬另一個系統執行 BBR,目前是 1080p 都很流暢。如果新手要
購買,建議購買產品前有標示「中國直連」的產品,因為速度真的有差……
Digital Ocean
(20G/512MB/1xCPU/1000 GB 流量/5 美金/1 個月/ping 180-220/舊金山)
KVM 架構,一個月 5 塊,註冊再送 10 塊,升了核心開了 BBR 之後 Youtube
1080 沒問題,雖然後台的 GUI 很陽春,然後我也找不到那邊看流量,不過應
沒什麼好嫌棄的?在沒開 BBR 之前,速度比不上搬瓦工,打開之後小勝,但搬
瓦工也打開 BBR 後,Digital Ocean 已經變成我的 FTP 和 Webhost 了……基
本上三個月用完之後就會關站囉。
但是, 如果你會簡單的 linux 指令,對於升核和開 BBR 沒問題,但對於在
openvz 裡裝另一台虛擬機感到困惑,或許 Digital Ocaea 會是你的好選擇。
GigsGigscloud
(20G/512MB/1 x CPU/500 GB 流量/3.8 美金/1 個月/ping 15-20/香港)
然後為什麼又買了一台(同事也這樣問我),其實主要是美國機器的 ping 和
掉封包的狀況讓我蠻不滿意的,雖然中美電纜是直連,但電信的尖峰時間約有
15-20 % 的 time out,所以我就開始找有沒有香港的 VPS 服務了。在網路
上找到不少測試 ip,最後找到 Gigs 的 ping 值最低,只有 15 上下。要特
別留意的是,Gigs 最便宜的方案是採 openvz 並且不是中國直連,如果是要
kvm 架構,最便宜是 3.8 美金一個月,然後流量只有 500GB。要特別留意,
使用 SS 時流量會被兩倍計算,每一家 VPS 對於超量的罰則不一,購買前要
先閱讀一下規定。
當我懷著忐忑不安的心結完了帳,拿到了 ip,開獎得到了 ping 值,還好還是
在 20 以內。花了點時間把 SS 和 BBR 設定好後,發現 Youtube 可以輕鬆的
上 4k……果然近又貴是有價值的啊!但這幾天發現,有時候用用會變慢,需要
把遠端機器重啟才能獲得改善,不確定是否因為架構較差的原因,系統穩定性
比不上搬瓦工和 Digital Ocaen。
講完了 VPS,來講一下架構 Shadowsocks 的兩三事。
前面有提到,如果不會語法,會建議直接買搬瓦工的方案,但缺點就是不能打
開 BBR,也就是說 Youtube 只能到 480p 上下。網路上非常多教學文,我覺得
每一篇都寫的很好,但每一篇也都缺了些什麼,這種感覺只有跟著走過而且不
斷中招的人才明白……
Shadowsocks 分成 Shadowsocks 和 Shadowsocks-R,兩者基本沒有太大差別
,因為前者已經停止更新,只要安裝的教學是從 git 上拿的就不會有太大問
題。畢竟 Shadowsocks 是走代理的方式,記得加密的協議選好,就沒有太大
的問題了。另外有很多教學會提到更新 ChinaPAC 的方式,讓訪問中國境內的
網站加速。我自己是沒這樣做,反正只是按個按鈕,平常都是全部代理(所有
流量都先繞到 VPS 再回來),如果訪問中國境內太慢,我就直接把代理關了
,然後要用再打開就好。iOS 和 Android 都已經有 Shadowsocks
的軟體了,免費付費都有,我沒有特別推薦那套,可以自行下載玩看看。
如果上面講的文字對你來說太困難,網路上有很多免費或付費的 Shadowsocks
帳號可使用,但你的所有瀏覽資料都會經過第三方,這就已經是購買 VPN 的
狀態,而且對方是不是你可以信任的,必須要好好想一想囉。
接下來,每一台電腦都已經可以上網,但如果是電視盒、遊戲機、智慧電視該
怎麼辦呢?所以我們還缺一個可以把 Shadowsocks 分享出來的 Router,過去
48 小時我試著用手邊的 Rapsberry Pi 2 + OpenWRT 來架設,目前還差最後
一步,如果真的成了再來跟大家分享心路歷程吧。
我卡在 DNS 污染啊哭哭~~~~~
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.92.129.46
※ 文章網址: https://www.ptt.cc/bbs/WorkinChina/M.1490087317.A.F14.html
... <看更多>