📜 [專欄新文章] [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.
👏 歡迎轉載分享鼓掌
想太多是會爆炸的pdf 在 心理師的歡樂之旅 - Facebook 的推薦與評價
我只是想表達,道 理大家都知道,就如同那個提示卡,但最後真的要怎麼 做,還是來自你當下的判斷,你和其他網絡之間的合作 …… 而這世界有太多人無法理解社工為什麼會不 ... ... <看更多>
想太多是會爆炸的pdf 在 Re: [心得] 想太多也沒關係讀後感- 看板book - 批踢踢實業坊 的推薦與評價
容我用該標題原文來表達自己對這本書的看法
老實說我的理解跟你極度不同
這本書是給極度少數派的「大腦多向思考者」所撰寫的
而且內文其實不是很好理解,因為我至少整整細讀四次才總算有自己的心得
如果是書中定義的一般人
其實看起來大概只會覺得是一群無法適應社會的人互相自慰一般的內文
※ 引述《B123 (FAY)》之銘言:
: 這本書是給那些腦袋無時無刻愛亂想的人看的
: 基本上我算是書中描述的典型人物,
: 大概出去外面走個十幾二十分鐘就寫完一篇一千多字的文章
本書的「想太多」
其實是指對任何事情的思考有著多面性看法,超高標準價值觀
對他人的情感感到敏感
與他人溝通跟相處時該價值觀會受到極度挑戰(因為他人往往只用自己的想法強壓
甚至只會很不負責任的說那你就這樣那樣就好為什麼做不到)
這一類人會設身處地覺得無論哪種說法都有其基礎,但是自己有一套高於社會
主流的價值標準
然後無法處理而導致對自己的厭惡(因為無從解決)
內文中比較嚴重的話就會造成類似亞斯伯格症的疾病
跟文思泉湧並不是同一件事情
: 但是我對這本書評價不算太高
: 最主要原因是作者是以消極面的態度去看待這樣的人格
: 縱然其實作者是很肯定這樣的人,尤其是在創作領域上
: 但在內容上,對這樣的人格類型表示:
: 少數-三成左右為右腦發展
: 蠻多問題-孤寂、人際關係上會很難融入
: 容易被騙-有愛心、同理心、善良
: 容易憂鬱-會想很多很多
本書是法國心理諮商專家撰寫
所以是把這一類型的人透過歸納法方式
把諮商的人歸類成「大腦多向思考者」
所以當然會有一定人格類型的樣貌出現
這並不是消極看待
而是客觀表達出這些人的特徵
而且由於這些特徵造成了這樣的症狀
書中其實也有講到
有些人是可以平衡兩者的關係與他人好好互動的人
但本書不就是訴求給「無法好好互動的人」看的嗎?
: 我很肯定在早期的狀況,這樣的人格特質的確會有上述問題
這點同意
: 但是在不同階段,上述問題是能夠有很成熟的發展方向,在書中有寫到
: 但「如何發展」的這個概念比重是相對低的
: 而大部分的內容,會比較強調在差異層面
: 差異層面在右腦發展跟左腦發展
: 想太多的人是右腦發展,以網狀、圖像化的思考
: 而左腦則是線性思考
: 但我這邊不苟同的在於,完全區隔為左腦或為右腦的人絕對不多
本書所指的「大腦多向思考者」當然絕對不多
這些人一直都是「少數」
所以你的不苟同是對的
但並不是這本書的問題
原因是這本書就是在講「大眾中的少數,用了較多的右腦來思考並且出現該特徵並且因此
受苦的人」
: 只會有偏向哪方面、發展哪方面,
: 但在書中以區隔的方式去講,那麼只會讓讀者自我認同朝二元對立的方式去思考
: 將這些問題視為理所當然,卻少了適度的理解雙方的不同處
這本書花了很多地方在解釋書中的一般人跟大腦多向思考者的不同之處
節錄:
「左腦使用者」傾向於個人主義....以自我為中心的主意,然而右腦使用者偏好的是集體
主義與利他思想...(P193)
作者是很單純的把現象表達出來,並沒有對此下判斷說是理所當然
: 也忽略了其實有不同發展的可能
: 想太多的人,其實能夠有發展果斷的可能
: 線性思考的人,做適度導引也可以發展出圖向性思考
人類本來就無法完全被分類
事實上這樣的可能本來就會有
所以他前面有講(節錄)
...要找到一個精確的名詞來定義這群人,事實上是有困難的,因為他們每個人身上
的問題樣貌都不盡相同。(P25)
: 我這麼說的意思在於,其實在開始階段,
: 很多人思考上還不太成熟,的確在很多領域上會有許多問題
: 但是能夠做做適度引導下,差異是能夠淡化的,尤其是以理解做為主要行動價值
: 這邊的重點在於,以理解為初心,絕對能夠淡化差異
: 而以適應社會為基礎,雙方絕對能夠找尋到一個最大公約數
: 那麼文中的差異,就不成問題
: 而右腦發展在這兩項前提上,便能夠有效找到適應自己、適應社會的方向
: 書中沒有特別有效的針對長處做完整性的概述是蠻可惜的
所以只能再重申一次
本書訴求是給少數的「大腦多向思考者」閱讀的,除此之外的一般人
看了這本書是得不到任何感動的
一般人的思考是以個人價值為中心
也就是「自己認知至上主義」
而且由於眾人所想及行為模式都是如此
所以適應上很容易
但是對大腦多向思考者來說
內建的利他主義跟團體思想容易造成與他人溝通的不良
同時也因為自己與他人的不同而導致了自身的痛苦
所謂的差異能夠淡化這種事情
對大腦多向思考者來說只會停留在表面行為上的淡化
但是根本精神構造上是不可能有所改變的
本書的訴求是給精神上無法解脫的大腦多向思考者一個解套的辦法而已
所以本書有特別探討到真我跟假我的問題
節錄:
「大腦多向思考者」的假我,就像是一間豪華貴賓室....這個假我的功能
就是要考慮到所有親朋好友的想法、需求、及存在...(P147)
而所謂,以理解為初心,絕對能夠淡化差異,以適應社會為基礎,雙方能夠
找到最大公因數的這種說法──
根本不存在。
因為,只有大腦多向思考者有這樣的煩惱,而一般人只會覺得你想太多
哪來的理解為初心,社會的主流價值也並非大腦多向思考者帶動
最終,也只會是讓少數人去接受而已。
最後,以下是我個人的粗淺心得,拋磚引玉,希望更多跟我一樣因而受苦的人,
能透過本書獲得拯救。
心得:
本書是由法國心理諮商師用17年諮商經驗,將有著「想太多」這個問題並造成影響
之人經驗,集結案例寫成。作者將這類人定義為「大腦多向思考者」
身為大腦多向思考者,抱持著理想主義,以及有著纖細及敏感的感官,
而這些人的情緒也會因此容易搖擺震盪。
本書的內容有三大部分:
一、為什麼你總是想太多
二、想太多的人與一般人的不同
三、總是想太多的人的生存之道
所以這本其實是「想太多的人」在這個社會的生存指南。
看完這本書後,這些少數終於可以真正理解自己的姿態,並且相信自己,
不愧於自己的在這個社會立足下去。畢竟,對這些人來講,相信自己一直都是最大
難題,因為他們的思考並非是只站在自己立場,是很容易懷疑自己的。
在相信自己之後,緊接著是了解社會的運作以及其差異,然後你終於可以放過自己,
終於可以不用再因為社會的紊亂而導致自己精神世界的受苦,
本來,眾人的作法也都只是站在自己的立場思考並且行動而已。
而大腦多向思考者們,在了解到「啊,大家都有自己的立場之後」,你也可以問心
無愧的為自己辯護,而學著可以不要因為自己與他人的衝突而感到根本上的痛苦。
至少我希望我可以做得到。
這本書,推薦給有著共同這樣煩惱的族群,值得一看再看。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.49.100
※ 文章網址: https://www.ptt.cc/bbs/book/M.1495646681.A.0E3.html
... <看更多>