📜 [專欄新文章] [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 的精選貼文
【本文三點交稿,然後四點多教育部宣布延後開學,所以內文有部分修正,但這次教育部表現還是太慢了】
先講好,這篇文章只針對本次防疫中兩個部會的怪異狀況提出質疑,不開地圖炮!瞄準的對象,就是教育部和經濟部兩個單位。
我在上週文章說過,因為恐慌的關係,搶購和囤積難以避免,而且短時間內找不出甚麼好方法立刻解決。所以這篇文章,不打算浪費時間在這個議題上。預計口罩是稀缺物品的狀況,三月中以後到四月中應該會解決,疫情則是要到五月之後才有可能減緩(如果那時候沒有,大家就要真的擔心了,未來要排隊買的東西可能就不只是口罩了)。
首先是教育部,我稍稍跟網友打聽了一下各級學校的開學時間,幼稚園的部分比較混亂一點,有的私立幼稚園1/30號已經開學,非營利幼稚園2/3號開學,公立幼稚園2/11號開學,國小、國中、高中統一延後到2/25號開學,大學還有待各校決定。
但關於防疫和口罩這件事情,教育部的立場是甚麼?我查詢Google新聞的結果覺得十分困惑,教育部在整個對抗武漢肺炎的過程中,1/31號才第一次對媒體說明不是每個學童都要戴口罩,同一天媒體詢問大學是否要照常開學,教育部的回應是2/3號再開會討論。根據東森財經新聞1/31號引述中央社的報導:【教育部今天表示,一般學生還不需要戴口罩,幼兒園也還沒有要配發口罩的規畫;近期會與學校討論是否延後開學與後續防疫工作。】課輔,寒輔的狀況如何?教育部也沒說。
是的,你沒看錯。沒決定,沒規劃,近期開會討論。但著急的第一線教育工作者跟幼稚園,早就已經通知家長必須準備足夠的口罩讓孩子上學,幼稚園需要準備一天三個以上,由老師協助幼童戴,小學則是一天兩個必須帶到學校更換。【特別說明,以幼童的狀況來說,這裡提到的自然是缺貨中的缺貨:兒童口罩。】
再次強調,這些第一線教育工作者完全沒有錯,因為他們有常識,知道開學用品必須事先準備,但問題出在教育部的官身上。而且你第一天當家長嗎?中小學校的公布就是聖旨,我敢笑蘇貞昌光頭,但難道我能叫兒子不要管班導不用戴口罩上學嗎?不敢啊!大人。
教育部到底要不要針對戴口罩這件事做個統一?防疫中心說不用戴,教育部知道自己底下的第一線學校命令,已經透過各個群組發出去了嗎?口罩這件事,教育部到底要追認還是當作沒這回事?還是要等你放完假再來開會討論?等你開完會,家長要怎麼反應?每天就算都排的到三個口罩,這數量也只夠12天使用,兩周上課就用完了啊!更別提兒童口罩了,要排也買不到啊!
那麼你會想要知道去教育部的臉書看看,有沒有最新消息呢?有啦,截至本人截稿的2/2下午3點,教育部臉書上面最新的消息是1/24號吃年夜飯和抽獎啊!
好啦,教育部的官網到了第二層有一個1/31號公布的PDF檔案:【各級學校、幼兒園、實驗教育機構及團體、補習班、兒童課後照顧中心及托育機構因應中國大陸新型冠狀病毒肺炎疫情開學前後之防護建議及健康管理措施】,其中只有四個地方提到口罩兩個字,最具體的是這條【請學校預先備妥適量的耳(額)溫槍、洗手液或肥皂及口罩以備不時之需。】但是怎麼取得?適量是多少量?不要說基層教育人員看不懂了,你可以去問問大家,誰看得懂?這種沒意義的官樣文章,寫了也幫不上忙啊!
第二,難道教育部沒有想到,目前學校要開學的狀況下,兒童口罩可能缺貨,更別提全面搶購的狀況下,成人口罩會排擠兒童口罩,你們提前一點跟經濟部或是防疫中心報告這個,可能有甚麼困難的嗎?這都可以預料的到啊!
相較於其他單位這次防疫風風火火,發布的訊息間隔可以用12小時來計算,教育部是在幹嘛呢?我真的不明白,請教育部警醒起來,你們一個怠惰,就是那些違逆少子化的勇敢家長們雞飛狗跳,不要讓家長跟著倒楣好嗎?
根據聯合報2/2號的報導:【經濟部次長王美花昨表示,如果人人都戴口罩,台灣真的沒那麼多貨源可提供,目前已協助鋪貨,呼籲民眾「有需要再買」,也會要求通路嚴抓重複排隊者。】美花次長是不是已經很久沒有去便利商店和通路買口罩了?
一個超商店員,是被緊急狀況賦予了新的公權力嗎?在繳費、捲霜淇淋、調咖啡、做關東煮、倒啤酒,加熱便當、被打、心臟外科手術(等等這條沒有)之外,現在還可以嚴抓重覆排隊者了?要甚麼分辨重覆排隊?臉部辨識?身分證?身上的菜味?就算退一萬步,抓到重覆排隊者之後,一個小七店員能怎麼樣?威脅沒收排隊者所有超商點數嗎?
我有好幾個在超商打工的網友看到這段,白眼都快翻到掉出來了。除了每天要被問上個幾十次有沒有賣口罩,九成都只能回答沒有,搞到客人生氣、自己不爽之外,現在還要扮演福爾摩斯抓犯人、比對長相喝止他們重覆排隊,得罪社區熟客?
我這個人很講道理,因為排隊搶購這件事情無解,甚麼限購、甚麼免費送都是沒有用的。恐懼就是一個無底洞,裝不滿的。但我只希望經濟部不要沒有答案硬是擠答案,給第一線超商店員添亂好嗎?他們已經快爆炸啦!又要手動分裝口罩,又要每天被顧客臭臉,還叫他們做那些做不到的事情,可以不要嗎?
防疫這件事就是互相體諒啊,不然是能怎樣?最後一句話提醒在野黨:執政黨的對立面不一定是反對執政黨,還有一個叫做共體時艱。提升形象好嗎?
想 太 多 是會爆炸的 pdf 在 家醫/職醫_陳崇賢醫師 Facebook 的最讚貼文
【職業醫學】~ 造船業可能的風險
週末騎騎ubike,沒想到還可以經過造船廠!印象中,只覺得高雄是造船、拆船的重鎮,原來北部也有造船廠⋯⋯真是長了見識⋯⋯
在光鮮亮麗的船舶後面,從業人員可能會面臨到什麼樣的健康風險呢?
我們就來看看吧⋯⋯
因為造船包含了很多的工序及接觸到的材料,所以好像什麼都會沾到一些,下面的說明都用概要簡述,以免版面太雜亂,對其中的議題有興趣的,可以再點進相關的延伸閱讀中。
1. 重金屬:主要都是作為防鏽的塗層或焊接的材料
* 鎘(Cadmium):常出現在鍍鎘的鋼材,或一些焊接的材料中。
急性:吸入高劑量的鎘會造成嚴重的「肺臟損害」。
慢性:長時間地暴露於含低劑量鎘的空氣、食物或水,會造成鎘累積於腎臟並可能導致「腎臟」疾病的產生。其他的長期影響,則是「肺」的損傷和「骨骼脆弱」(痛痛病)。
* 鋅(Zinc):主要在鍍鋅的鋼材,和含鋅的塗料中。
急性:吸入大量的鋅(如:粉塵或煙霧)可能會導致一個特殊的疾病,稱為「金屬煙燻熱」。
* 鉻(Chromium):主要用在顏料之中
急性:吸入高濃度的六價鉻會造成鼻粘膜疼痛、鼻塞、流鼻水及呼吸問題,如氣喘、咳嗽、呼吸急促。(黏膜刺激性)
慢性:長期接觸可能導致「皮膚」過敏,為人類的致癌物。
* 錳(Manganese):常在焊條中出現
慢性:最可怕的就是會產生「巴金森氏症」
* 鐵(Iron):船身的鋼材中就會有鐵
慢性:在吸入船身拋光或研磨的粉塵或是焊接時的金屬燻煙後,長期會產生鐵質沈積症(siderosis)。
想了解更多有關焊接的風險,可以參考這篇之前寫的文章:
〖電焊工的職業風險〗
https://fmomdoctorchen.blogspot.com/2017/…/blog-post_26.html
2. 玻璃纖維強化塑膠 (FRP)
現在為求材質的堅固及輕量化,在遊艇常會使用的就是FRP,在使用上最常遇到的問題就是「接觸性皮膚炎」及「苯乙烯對神經系統的傷害」。
特別是遊艇製造時,常使用的工法是「手積層製造」,然而因為這樣作業的方法是「開模式」,顧名思義,作業沒有密閉,所以局部的排氣以及個人防護具要更加注意,以免造成長期暴露的職業傷害。
想了解更多有關FRP的風險,可以參考這篇之前寫的文章:
〖接觸「玻璃纖維強化塑膠 (FRP) 」的職業風險〗
https://fmomdoctorchen.blogspot.com/2017/10/FRP.html
3. 石棉(Asbestos)
以前用在管路的隔熱,是很普遍的材質,現在因為知道其健康的危害,已經用的很少了,然而在拆船業,還是可能會碰到石棉,要注意呼吸道的防護;否則,在數十年之後,可能會出現「石棉肺」、「惡性間皮瘤」等疾病,這時候再去反省幾十年前沒戴呼吸防護具就來不及了!
更多有關台灣石棉使用的歷史及資料,可以參考這篇:
〖工業發展史中的致命粉塵:台灣石綿職業病〗
http://bit.ly/2V22VwH
4. 油漆顏料(Paints)
為了船身的美觀、保護漆面下的材質,「油漆」在造船業一定不能少,甚至就如前面提到的,會加一些重金屬,來達到特定的目的,如:防鏽。
在油漆施作時,主要會影響到健康的有以下三個:
A. 揮發性有機溶劑
B. 顏料中的重金屬
C. 粉塵
而這些健康風險,又可能因為後面提到的「局限空間」,造成通風不良、濃度累積,造成更嚴重的風險。
想了解更多有關油漆工的風險,可以參考這篇之前寫的文章:
〖油漆工的職業風險〗
https://fmomdoctorchen.blogspot.com/2017/10/paint.html
5. 局限空間(Confined Spaces)
在船艙內施作相關的工程時,其實就算是一種「局限空間」;法規中的定義如下:
職業安全衛生設施規則第 19-1 條:
局限空間,指非供勞工在其內部從事經常性作業,勞工進出方法受限制,且無法以自然通風來維持充分、清淨空氣之空間。
可能產生的風險有:
物理性危害:
如:墜落、感電、掩埋/溺水、夾/捲、熱傷害/冷傷害。
化學性危害:
如:缺氧、急性化學中毒、火災、爆炸。
想了解更多有關局限空間作業的風險,可以參考這篇之前寫的文章:
〖局限空間作業的風險〗
https://fmomdoctorchen.blogspot.com/…/06/confined-space.html
※ 最後補充一下,在美國OSHA的統計資料,造船及修船業中,造成最多死傷的,其實是船塢的污水處理系統 ~ 硫化氫中毒。(因為其他即便產生職業病,也不會一下子就死亡!)
參考資料:
https://www.osha.gov/SLTC/shipbuildingrepair/hazards.html
如果想看中文的,我之前也有整理一篇:
https://fmomdoctorchen.blogspot.com/2017/07/H2S.html
※ 結語:
看起來好像很可怕,怎麼那麼多危害物質,其實最重要的就是
「通風」&「個人防護具」
通風能做好,危害物質的濃度低;再配合適當的防護具,就可以讓風險降到合理的範圍。
所以大家應該多去了解工作中可能的風險,我最常說的一句話就是:「無知則無懼」,多了解以後,自然就會去找出趨吉避兇的方法,而不是在現場傻傻地吸好吸滿。
(有人看到最後嗎?可以猜猜看這是ubike騎到哪兒可以看到的風景唷)
〖參考文獻〗
International Labour Organization (ILO)
"Safety and health in shipbuilding and ship repair (2019 revised)"
https://www.ilo.org/…/d…/normativeinstrument/wcms_618575.pdf