雖然這篇基本電路圖教學鄉民發文沒有被收入到精華區:在基本電路圖教學這個話題中,我們另外找到其它相關的精選爆讚文章
在 基本電路圖教學產品中有13篇Facebook貼文,粉絲數超過3,460的網紅Taipei Ethereum Meetup,也在其Facebook貼文中提到, 📜 [專欄新文章] 從 Rollups 來聊聊以太坊 Layer2 的演進 ✍️ Kimi Wu 📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium Photo by Clark Van De...
同時也有1部Youtube影片,追蹤數超過2萬的網紅MintCat薄荷貓 game,也在其Youtube影片中提到,#未來戰 #製造廠 #裝備 《未來戰》教學!跟大家介紹一下「製造廠」,包含製造廠的功能和使用方式,以及強化裝備和裝備改造的詳細介紹,新手玩家看這就對啦! -------------------------------------------------------------------------...
基本電路圖教學 在 Sherlock Instagram 的最佳解答
2021-02-22 16:17:37
. 《如何規劃自主學習?》 (文長,完整內容請看內文;精簡版本請看貼文圖片) 眾所周知, 「自主學習計畫」在現行課綱要求學生的學習歷程檔案佔有很重要的地位。 今天我想以一個大學生的身分 來說說我對於自主學習的想法和看法 以及推薦大家一些可以拿來自主學習的資源。 如有其...
-
基本電路圖教學 在 MintCat薄荷貓 game Youtube 的精選貼文
2021-03-02 18:00:03#未來戰 #製造廠 #裝備
《未來戰》教學!跟大家介紹一下「製造廠」,包含製造廠的功能和使用方式,以及強化裝備和裝備改造的詳細介紹,新手玩家看這就對啦!
------------------------------------------------------------------------------------------
記得要按讚訂閱打開鈴鐺🔔🔔
加入Youtube會員:https://reurl.cc/d53Qq6
歐付寶斗內:https://reurl.cc/X61Daa
薄荷貓粉絲專頁:https://www.facebook.com/Mintcat99
薄荷貓Instagram:https://www.instagram.com/mintcat1113
工商合作來信邀約:mintcat1113@gmail.com
------------------------------------------------------------------------------------------
《未來戰》 ► 新角色評價!新池弗雷德里克 多馬和游馬 小抽個一下試水溫 歐洲機票來一張
https://youtu.be/CpLNwR3YRE0
《未來戰》 ► 聖鎧玩法介紹 本週是李智秀之週?排位戰和戰略對抗戰全攻略
https://youtu.be/mGMGY0jd9RM
《未來戰》 ► 課下去就對了 情人節兔女郎造型大集合 再也不會孤單寂寞覺得冷 情人節活動介紹
https://youtu.be/ICKmVas0SFo
《未來戰》 ► 椅子女王羅莎莉亞·弗里登出現 主線EP5劇情開啟 補給作戰刷素材 等級上限110等極限融合介紹 改版內容一次分享
https://youtu.be/r5KLkoKinFA
《未來戰》 ► 資料片大更新 覺醒希爾德技能大解析和PVP聖鎧用法、電路賓果系統活動、李智秀介紹、韓國同步時裝 大廳主頁面改版 通通帶你一次了解
https://youtu.be/mJr5_kJzlb8
《未來戰》 ►新角小解析 突發事件和團隊副本介紹 團隊副本高CP值玩法
https://youtu.be/f2wl_MrKXOg
《未來戰》 ►世界地圖全攻略 派遣任務選擇困難怎麼辦?情報又要怎麼獲得?
https://youtu.be/gw-d5KofELs
《未來戰》 ► 好缺錢怎麼辦?從初學入門到高級進階刷金幣方式
https://youtu.be/5UlgkugZ-Rg
《未來戰》 ► 培養老婆缺能力鑑定書怎麼辦?刷哪個關卡CP最高就看這裡
https://youtu.be/FEJmiY86tYQ
《未來戰》 ► 5分鐘帶你快速了解培育老婆們小訣竅 遊戲起步不輸人 https://youtu.be/szGDpjX3G2E
《未來戰》 ► 新手玩家開局首抽推薦SSR/SR/R角色 最快刷首抽推薦~
https://youtu.be/4MJ_0ubPwJs
------------------------------------------------------------------------------------------
記得要按讚訂閱打開鈴鐺🔔🔔
加入Youtube會員:https://reurl.cc/d53Qq6
歐付寶斗內:https://reurl.cc/X61Daa
薄荷貓粉絲專頁:https://www.facebook.com/Mintcat99
薄荷貓Instagram:https://www.instagram.com/mintcat1113
工商合作來信邀約:mintcat1113@gmail.com
------------------------------------------------------------------------------------------
https://youtu.be/CpLNwR3YRE0
2021年也太多新手機遊戲了吧!幾款薄荷自己私心推薦 全球尚未推出的手機遊戲
https://youtu.be/Pn5ZVcY9xrk
負評滿天飛?《Cyberpunk 2077》的缺點到底有哪些?到底值不值得購買?
https://youtu.be/hRd8VO-VHJE
超級致敬?遊戲風格抄襲《返校》?還以為返校出續作呢~
https://youtu.be/ZkRanM1w3SA
像素風格遊戲正夯?推薦2020年像素風格手機遊戲
https://youtu.be/jTdkZ0jQ5JI
政治正確 滿滿嘲諷國產遊戲 內建防盜版裝置 恐怖維尼病毒來襲
https://youtu.be/fuwcSymAPQk
------------------------------------------------------------------------------------------
#最新 #手遊 #轉蛋 #介紹 #試玩 #攻略 #動畫 #下載 #電玩 #遊戲 #事前登錄 #無課 #新手 #首抽 #新手首抽 #推薦 #刷首抽 #SSR #角色 #卡池 #2021手遊 #無課玩家 #課長 #玩法 #基本操作
------------------------------------------------------------------------------------------
基本電路圖教學 在 Taipei Ethereum Meetup Facebook 的最佳解答
📜 [專欄新文章] 從 Rollups 來聊聊以太坊 Layer2 的演進
✍️ Kimi Wu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Photo by Clark Van Der Beken on Unsplash
去年 Defi summer 的熱潮後,以太上 Defi 應用呈現爆炸性成長,造就高昂的交易手續費,為了有更快的交易速度及可負擔的交易費用,人們對側鏈、Layer2 的需求更加強烈。Rollups 是 Layer2 的一種技術,在今年相當熱門,幾個耕耘已久的專案 zkSync、Optimism、Arbitrum 等也開始廣為人知。今天想來聊聊以太坊上 Layer2 技術的演進。
State Channel
state channel 最一開始是建立在 Bitcoin 上,最廣為人知的就是 lightning network。簡單來說,就是兩方在私下建立一條可以互相轉帳的通道,轉帳完畢後把通道關閉,接著將交易後的狀態更新到鏈上。若交易一筆後即關閉通道,那交易成本就跟在鏈上一樣,所以在實務上,通道一直開著(或是一段時間),交易數筆、數百筆後再上鏈更新狀態,藉此平均每筆的交易手續費就大幅降低。也因為只需通道雙方驗證交易內容,交易速度能大幅提升,讓小額支付能夠實現,就不需等10分鐘(Bitcoin)後交易才會被打包,甚至要等6個區塊的時間。而最早在以太上的 state channel 是 Raiden。
對於 Raiden 技術有興趣的可以參考這篇文章。
Plasma
Plasma 於2017年8月由 V 跟 Joseph Poon (Lightning Network的創始人之一)所提出,概念上是可以有鏈中鏈中鏈(就是Layer2 → Layer3 → … LayerN),藉此可達到百萬級甚至更高的交易量,不過概念太美好,沒人知道怎麼實作。
隔年1月 V 提出了 Plasma 的第一個版本 Plasma MVP,是以 UTXOs 模型的設計,接著3月提出了第二個版本 Plasma Cash,同年(2018)Plasma 的提案數呈現著爆炸性的成長(絕大部分都是基於 Plasma MVP 跟 Plasma Cash 做改進)(如下圖),強大的社群力量,讓大部分關鍵的問題在同年年底都找到了解答。也為之後的 Optimistic Rollup 打下了基礎。
而較著名的開發團隊,除了 EF 出來的 Plasma Group 外,還有 OmiseGo 跟 Matic(現在的 Polygon)。
對 Plasma 技術有興趣的,可以參考這篇、這篇跟這篇
https://ethresear.ch/t/plasma-world-map-the-hitchhiker-s-guide-to-the-plasma/4333
Plasma 看似一切美好,但因為資料的可取得性(data availability)的問題,使得在使用者體驗上有點糟糕。
Plasma 的所有交易資料都在 Plasma 鏈上,而 Plasma 鏈的礦工(即operator)只需繳交 Merkle root 到 L1 的合約作公證就好。因此若 operator 作惡,在 Plasma 鏈上交易者,就需有能力證明 operator 作惡。
在 Plasma 設計中有”所有者”的概念(UTXOs 的設計中,收款者需要到拿送款者的轉出證明,才能動用這筆款項,轉出證明只有收款人會擁有),如果該所有者不關心自己的資產,就可能造成資產無效的結果(account-based 的設計,若你不理你的帳號,別人一樣可以轉帳到你的戶頭中)。因此每個交易者須有能力自行提出證明,無法委託第三方。
而要證明這件事,用戶需要把 Plasma 鏈上的交易都下載下來,才能證明 operator 做了一件不合法的行為,也才能產生詐欺證明(fraud proof)到 L1 上的合約來證明 operator 作惡。而這個送出的詐欺證明,必需要被確保可以安全地送到 L1 上的合約被執行,因此需要有一段挑戰期,讓使用者可以下載及驗證資料(或是網路塞車造成詐欺證明無法被合約執行)。
題外話,Eth 2.0 light client利用了 ECC (Error Correction Code)的原理,所以只需要部分資料就可以驗證正確性。
Rollups
同年(2018) 9月,在支線專注隱私性的開發的 Barry Whitehat 提出了 zk Rollup,隨後 V 也在以太坊研究員論壇發了一篇文章,解釋 zk Rollup 是如何運作的,並以On-chain scaling to potentially ~500 tx/sec through mass tx validation 為標題,也因此開啟了 Layer2 新的一頁。隔年(2019)三月,Matter Labs 獲得了 EF 的 grant 將 zk Rollup 產品化,也就是大家所知的 zkSync。
所謂的 rollups,一樣是在 Layer2 上做交易,不同的是 L1 上會記錄每一筆的交易紀錄。什麼!如果每一筆交易紀錄都上鏈,跟一般 L1 交易有什麼不同?想了解細節可以看這篇。簡單來說,在合約裡用了一顆樹來記錄每個帳號的狀態,樹的第幾片葉子(index)代表一個帳號地址,因此帳號就從20 bytes 的地址變成了幾個 bytes 的 index。以 ZK Rollups 來說,交易都是在 Layer2 被驗證過的,所以簽章資訊(65 bytes)也不用上鏈,Optimistic Rollups 會利用簽章聚合的技術,數百個簽章最終會被聚合成一個。因此,交易資料從原本100多 bytes 變成了10幾個 bytes。因為交易紀錄都 ”放上鏈“,資料可取得性也就不是問題了。
”放上鏈”指的是利用 calldata 的方式放在鏈上,並非一般認知的寫進合約裡。非0值的 calldata 每 byte 需要耗費 16 gas,而合約寫進一個 32bytes 的資料需要花 20,000(新增) or 5,000(修改) gas,相當於每個 byte 的成本為625 or 156 gas,約為 calldata 的 40 or 10倍。
同年(2019)六月 John Adler 在以太坊研究者論壇提出了Minimal Viable Merged Consensus,也就是大家熟知的 Optimistic Rollups 的原型,接著 Plasma Group 基於John Adler 的提案,提出了 OVM,從此 Layer2 上除了單純的轉帳外,還可以執行合約,也奠定了 Rollups 在 Layer2 的地位,開啟 rollups 的新世代。
StarkWare 團隊建立了可評估的數學模型,驗證了 calldata 的成本從64 gas 降到 16 gas並不會對鏈的安全造成危害,提出了 EIP-2028(在 Istanbul 上線),也是推動 rollups 可行性的重要一環。
Validity Proof v.s. Fraud Proof
Optimistic Rollups 跟 ZK Rollups 最近有很多文章在介紹跟比較,這邊就不贅述。這邊想聊的是資料的有效性,這篇文章解釋地很好,這裏擷取部分敘述。ZK Rollups 保證了上鏈的資料都是正確的,資料必須被驗證過是合法的(例如沒有被雙花)才會改變使用者的狀態(例如 balance),跟現在各個主鏈的設計是一樣的,稱作有效性證明(Validity Proof),這種設計假設大家都是壞人,要通過驗證才會相信你,確認資料是百分之百的正確聽起來很理所當然,但是背後要維護資料的正確性,需要相當高的成本。
Optimistic Rollups 則是相反,假設大家都是好人,送上鏈的交易都接受,當發現有人作弊,再靠檢舉機制來更正狀態,這稱作詐欺證明(Fraud Proof)。這樣的機制系統維護成本較低(L1 上不需要驗證每一筆資料的正確性),但需要多一個爪耙子的角色來維護系統的安全,也就多一個系統潛在的風險。而要確保爪耙子有足過的時間反應,就不能讓使用者即時地離開系統,這是 Optimistic Rollups 最被詬病的一點,提款要等七天(現在有第三方流動性提供者,使用者可以請第三方流動性提供者預付使用者的提款。使用者支付手續費來換取快速提款的服務,而流動性提供者則承擔資產鎖住七天的風險來賺取手續費。不過在 protocol 層以安全性為主要考量,還是需要較長的挑戰期)。
ZK Rollups 的實作上,也有數個小時的提款期,不過那是基於成本考量,而非安全性。
此外對照於 Plasma, rollups 的設計是 account-based,交易也都公開在鏈上,每個人都可以參與監督及提出詐欺證明。
ZK Rollups v.s. Optimistic Rollups
ZK Rollups 從資料的有效性來看勝過 Optimistic Rollups,離開系統時不需要額外的挑戰期,能即時提款離開系統,不過付出的代價就是交易延遲上鏈。因為產生 zkp 證明需要龐大的運算量,產生一次證明,大約需要10 ~ 20分鐘,所以說在 Layer2 上做一筆交易,10分鐘後你的交易才是有 L1 的安全性。
為了能盡早得知發出的交易是否完成,實作上會把完成的交易先丟上鏈,等zkp 證明產生後再上鏈驗證其正確性,若驗證成功,則交易視同有 L1 的安全性。
但是在通用性上,Optimistic Rollups 沒有複雜的 zkp 電路的限制,對於合約的支援度上更好,而且 zkp(SNAKRKs)在使用前需要一個盛大的啟用典禮(trusted setup ceremony)。
zkSync
zkSync 1.0 在去年(2020) 六月上線,因為不能執行合約,使用的專案並不多。同年的年初,Matter Labs 已經默默在開發一種新語言 Zinc,是可以在 zkSync 上開發合約的語言。年底,與 Defi 專案 Curve 合作,發表了在 zkSync上可以跑基本版的 Curve(兩幣交換)。今年(2021)三月,Matter Labs 發表了令人振奮的消息,zkSync 支援 EVM!只需要部分修改現有的合約就可以部署到 zkSync 上,測試網今年五月已經上線,主網預計8月上線。不過目前測試網上的交易量非常地少,相信在初期還是有相當多問題或是困難,以短期來看,Optimistic Rollups 陣營的速度跟支援度略勝一籌,不過個人相信長期會是 ZK Rollups 的世代(私心認為 lol),但最終還是由生態系的大小來決定贏家。
在 ZK 這個陣線上有延伸出不同的設計,為了加快速度及減少上鏈成本,StarkWare 提出了 Validium 的概念,資料不上鏈但使用 zkp 確保資料的正確性,像是 StarkWare 的 Volition 跟 Matter Labs 的 zkPorter 都是同樣概念的實作,不過不是本篇的重點,就不多解釋。
ETH 2
V在2020年10月提出了 A Rollup Centric Ethereum,rollup 也因此進到 Eth2 的規劃中。Eth2 的設計中 shard chain 是資料層,而在 phase 2 後才有執行層(也就是才能執行合約),V 的提案 除了讓 shard chain 當資料層外,也會內建 rollups 的邏輯。至於會採用哪種 rollups 目前沒看到結論,不過 V 本人是傾向 ZK Rollups。如果成真,那未來數百個 rollups 之間的溝通,將會是另一個挑戰 。
專案比較
ZK Rollups 有目前這幾個較知名的專案: zkSync(Matter Labs)、 Hermez(Iden3)、 Loopring(Loopring)、 StarkNet(StarkWare)跟 Aztec(Aztec)。
Optimistic Rollups 目前幾個專案 Optimism(Optimisim,前Plasma Group 成員)、 Arbitrum(Offchain Labs)、 Fuel(Fuel)。
這是目前幾大 rollups 的生態系(今年3月時的統計),比較值得一提的是,Uniswap 團隊因為社群的投票,也將會在 Arbitrum 上面部署,對於整個 Arbitrum 的生態,相信有很大的影響。
https://www.chainnews.com/articles/872971457746.htm
感謝 NIC Lin 及 Chih-Cheng Liang 的審查跟建議。若有錯誤或不同觀點,歡迎指教。
從 Rollups 來聊聊以太坊 Layer2 的演進 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
基本電路圖教學 在 單媽美國奮鬥記 Facebook 的最佳解答
《移民美國前期常見的心理障礙》
如果是常看新聞的人就會發現
台灣的電視新聞內容20-40%都會扯到美國
所以有一部份的台灣人都有美國夢
覺得美國什麼都好都進步
忘記了美國也是由凡人構成的
有一些人抱持著夢想就來打拼
最後乘夢而來 鍛羽而歸
以下談談一般移民跨越過蜜月期之後
可能會遇到的心理/生活障礙
1. 誤解和惡意
剛剛遷居到新國家的人
常常過於敏感
會因為一兩個當地人某些動作和語言
自行腦補過度解讀
認為傷害了他們的感覺
甚至最終決定搬回台灣
事實上就是
不管哪個國家都有善人跟沒耐性的人
不是每個人都有耐心去辨識你的口音
遇到不友善的人
比如說聽到你的口音後
態度轉為不耐或是不理人
理性處理 找別的窗口就好
千萬別為了這樣的人影響自己的情緒
Grace 個人都會設想
這些人是比較封閉保守不願意跟外國人接觸
或是自己日子過得不好
所以拿相對弱勢的外國人出氣
這樣退一步去思考氣就消了
不用跟他們計較
況且美國的總體氛圍是個人主義
對外籍人士和各種種族信仰的包容度
其實比台灣高很多 大部份的人都是友善的
為了一兩個異類 自我信心崩潰沮喪
甚至放棄自己的生涯規劃回國
根本不值得
有人謠傳共和黨很多種族歧視者
守舊 排外 討厭亞洲人
Grace 正巧住在共和黨大票倉
五年來遇到的怪奇人物
跟台灣比 認真說起來還少一點
但如果有人蓄意攻擊你
對方言論的確涉及種族歧視
Grace 建議不要姑息
採證事後通報主管機關或報警處理
因為 你的姑息 只會讓這些人
更大膽的去尋找下一個受害者
2. 不便和無聊
除非你住美國超級大城市
一般美國賣場八點或九點就打烊了
週日可能還提早到六點關門
市中心除了電影院也沒有很多娛樂
以Grace 住的田州大城市為例
市中心可以數出來的娛樂場所
大概就是兩家電子遊樂場
一家迷你攀岩場 動物園
幾家迷你高爾夫 博物館
除非你和美國人一樣熱愛戶外和運動
不然應該住了兩週就想跳上飛機回家
住美國95%以上的情形
從你住的地方出發
想買瓶飲料都得開車五分鐘以上
每天早上伴隨起床的不是人聲
而是蟲鳴鳥叫
如果有庭院還得按時剪樹除草
每天的生活
真是好山好水好無聊
再加上地廣人稀
所有我們台灣一家便利商店可以辦好的事情
在美國都要跑好幾個地方
等上三天 五天 半個月
Grace 在美國生出海量的耐心
去應對這裡常常出錯的職員
和公家單位顢頇的辦事態度
想著不傷他們自尊的方式去指正他們
或是提醒他們辦好他們的份內事情
所以跳上飛機移居前
最好先想想自己是不是喜歡戶外活動
有沒有心臟去適應他們的行政系統
3. 無法融入社交圈
因為語言能力的限制
像Grace 這樣已屆熟齡才移民的人
是極難像幼年或是青年移民的族群
可以在短時間內把語言能力衝上
說出一口沒有外國口音的英語
最重要的是能準確無誤地表達意思
Grace 在很短的時間把這個能力提升
並融合了一些幽默感在內
偶而出錯的異國腔英文
在應付工作或教學上
大致上沒有很大的問題
跟職場上同事們
也能達到簡單閒聊的開玩笑
或是背景比較類似的同事
(比如:單親或前單親的女同事)
能達到比較深入的交流
會偶爾約出去吃飯的程度
但是說到排除職場外的交朋友閒聊
除非是對異國文化極有興趣的美國人
一般人很難長時間有耐性的去辨認你的口音
更何況當兩個本地人聊起當地的文化
本地歷史事件 或是一些古流行
比如說上一屆郡長的軼聞
以前學校流行的募款活動
就跟台灣人說起「中部粽」「聯考」
會讓非台灣人搞不懂你在說什麼一樣
類似情況發生Grace 往往插不上口
也很難跟別人攀上什麼交情
更不用說可以跟當地人深交到什麼程度
排除語言障礙
西方文化的本身就和東方非常不同
比方說 摸清他們職場的潛規則
怎麼恰到好處的讓上司看到你好用
又不搶了他們的風頭 都是一門功夫
如果不是挫折忍受力高
又觀察力強 願意學習的人
一定會時時都有格格不入的感覺
也會產生有過身在異鄉的人才會明白的孤寂
不過Grace 要告訴你
你並不寂寞
因為美國人自己
也有很多職場適應困難
或是社交生活貧乏的人
美國因為地廣人稀
非常多的人下班是零社交的
如果這些人沒有家庭
回家就看電視看到睡著的人很多
同時美國職場跟台灣不同
他們非常尊重員工私人生活
所以大多是職場並沒有
下班後一定要跟老闆 同事交際的潛規則
只要跟同事保持基本的來往
有亮眼的工作表現
把主管或老闆關係弄好
不用擔心會變成邊緣人
Grace 本身就沒有很強的交際需求
對於大型群體活動沒有很大的興趣
大多數的時間用來讀書、運動看手機新聞
交朋友只要兩三個知心的人就滿足
搬到美國不過就是換個地方宅
所以這些事情並不會影響太大
但如果你本人是社交王
兩天沒跟朋友一起吃飯玩耍就孤單寂寞冷
偏偏英文沒有很溜
Grace 誠心建議你
好好評估美國是否值得你
捨去在台灣經營已久的人脈
遷居美國之前把英文練好
搬來後才不會悶出病來呀!
—————-
若您喜歡Grace 的分享
請到評論區給Grace 五顆星鼓勵
讓Grace 有更多動力寫文章分享!
圖:每天都開心不得了的夏令營科學老師Mrs. Grace與負責的疫苗科學攤位。今天博物館竟然請來了county 的電路維修人員,現場示範怎麼跟路邊高壓電線保持安全距離。Grace 等下週夏令營工作結束之後,會再發一篇文分享下週即將發生的工作上又一奇遇。
基本電路圖教學 在 Taipei Ethereum Meetup Facebook 的最佳貼文
📜 [專欄新文章] Tornado Cash 實例解析
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Tornado Cash 是一個使用 zk-SNARKs 建立的 Dapp,它實現了匿名的代幣交易,這篇文章就用一些程式碼片段,來分享它是怎麼運作的。
本文為 Tornado Cash 研究系列的 Part 3,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 1:Merkle Tree in JavaScript
Part 2:ZKP 與智能合約的開發入門
Special thanks to C.C. Liang for review and enlightenment.
我們知道在以太坊上的交易紀錄都是公開的,你可以在 etherscan 上看到某個地址的所有歷史交易紀錄,當然地址是合約的話也是一樣。
也許創建一個新的錢包和地址就好了?假設一個情境是 Alice 想要匿名傳送 1 ETH 給 Bob,Alice 原本的錢包是 A,但她不想讓 A 地址傳給 Bob 的交易紀錄被看到,所以 Alice 創建另一個錢包 B,顯然 B 錢包是空的,Alice 必須把 A 錢包的 1 ETH 傳到 B 錢包,再用 B 錢包的地址傳給 Bob。
但問題就在於,只要追蹤 B 錢包的地址,就能看到 B 的歷史交易紀錄中 A 錢包曾經打幣給 B 錢包,於是到頭來交易還是被追蹤到了。
Tornado Cash 的解決方案,簡單來說,它是一份合約,當你要匿名傳送代幣時,就把一定數量的幣丟進合約裡 (Deposit),此時你會拿到一個 note,長得像這樣:
tornado-eth-0.1-5-0x3863c2e16abc85d72b64d78c68fca5936db2501832e26345226efdfb2bc45804977f167d86b711bb6b4095ddaa646ec93f0a93ac4884a66c1d881f4fc985
note 就是一串字串,擁有這字串的人,就能提領 (Withdraw) 剛剛傳入合約的代幣。握有 note 就代表擁有提款的權利,所以 note 一旦被別人知道,別人就可以把錢給提走。
其中,後面那段亂碼,本篇文章就以「秘密」來稱呼,這個秘密是由 secret 與 nullifier 組成,而這兩個都是在鏈下隨機產生的亂數。
因此 Tornado 的合約基本上會有兩個函式:
Deposit
Withdraw
有興趣的人可以先到 Dapp 上先玩一次看看,使用 Goerli 測試網,這裡可以領 Goerli 的代幣:https://goerli-faucet.slock.it/
Deposit
我們就從 Deposit 開始說起,簡單來說, Deposit 是將資料儲存到合約的 Merkle Tree 上。
剛剛提到的秘密,它是在鏈下產生,由 secret 跟 nullifier 組成,合在一起之後也稱作 preimage,因為我們要對這個 preimage 進行 hash,就會成為 commitment。
合約中 Deposit 如下:
deposit 除了傳送代幣到合約之外,需填入一個參數 _commitment。
我們對 preimage 使用 Pedersen 作為 hash function 加密後產生 commitment,以偽代碼表示如下:
const preimage = secret + nullifier;const commitment = pedersenHash(preimage);
這個 commitment 會成為 Merkle Tree 的葉子,所以合約中的 _insert(commitment) 來自 MerkleTreeWithHistory.sol 的合約,將我們的資料插入 Merkle Tree,然後回傳一個 index 給你,告訴你這個 commitment 在 Merkle Tree 上的位置,最後一起發布成公開的 Deposit 事件。
我們知道 MerkleTree 是將一大筆資料兩兩做雜湊後產生一個唯一值 root,這個 root 就是合約上所儲存的歷史資料。
root 的特性就是只要底下的資料一有更動,就會重新產生新的 root。
所以只要一有用戶 deposit ,就會插入新的葉子到 Merkle Tree 上,於是就會產生新的 root,所以在合約中有一個陣列是用來儲存所有的 root 的 roots:
bytes32[ROOT_HISTORY_SIZE] public roots;
roots 是用來紀錄每個 deposit 的歷史,每一次 deposit 都會創造新的 root,而所有 root 都會被儲存進 roots 裡,於是當你要提領的時候,就要證明你的 commitment 所算出的 root 曾經出現在 roots 裡,代表曾經有 deposit 的動作,因此才可以進行提領。
Withdraw
在 Deposit 之前 Tornado Cash 就會在鏈下產生秘密後交給使用者,擁有這個秘密的人等於擁有提款的權利。
提領的時候,秘密會在鏈下計算後產生 proof,proof 是 withdraw 需要的參數,所以只要確保這個 proof 能夠被驗證,那麼代幣的接收地址 (recipient) 就可以隨便我們填,只要不填上當初拿來 deposit 用的地址,基本上就做到匿名交易的效果了。
也就是說,產生這個 proof 並提交給合約,能夠證明此人知道秘密,但卻不告訴合約秘密本身是什麼。
function withdraw(bytes calldata _proof, bytes32 _root, bytes32 _nullifierHash, address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund) external payable nonReentrant;
我們可以清楚看到 withdraw 函式裡沒有接收有關秘密的任何資訊作為參數,也就是秘密不會與合約有所接觸,也不會暴露在 etherscan 上。
回顧 ZKP 所帶來的效果:
鏈下計算
隱藏秘密
在 Tornado Cash 的例子中,我們用秘密來產生證明,完成的鏈下計算包括:
將秘密 hash 成 commitment
算出 Merkle Tree 的 root。
以下是簡化後的 withdraw.circom:
template Withdraw(levels) { signal input root; signal input nullifierHash;
signal private input nullifier; signal private input secret; signal private input pathElements[levels]; signal private input pathIndices[levels];
component hasher = CommitmentHasher(); // Pedersen hasher.nullifier <== nullifier; hasher.secret <== secret; hasher.nullifierHash === nullifierHash;
component tree = MerkleTreeChecker(levels); // MiMC tree.leaf <== hasher.commitment; tree.root <== root; for (var i = 0; i < levels; i++) { tree.pathElements[i] <== pathElements[i]; tree.pathIndices[i] <== pathIndices[i]; }}
component main = Withdraw(20);
從上述代碼就可以看出這份 circuit 的 private 變數有:
secret
nullifier
pathElements
pathIndices
而 public 變數有:
root
nullifierHash
如同我們一開始說過的,秘密就是指 secret 與 nullifier。這裡進行的鏈下計算就是對 secret 與 nullifier 雜湊成 commitment。而使用的 hash function 叫做 Pedersen。
在進行 Merkle Tree 的計算之前,我們還檢查了 nullifier 雜湊後的 nullifierHash 跟 public 變數 nullifierHash 是不是一樣的。
hasher.nullifierHash === nullifierHash;
接下來,開始計算 Merkle Proof,用意是確認經過雜湊後的 commitment 有沒有出現在 Merkle Tree 上,所以我們的 private input 還有 pathElements 與 pathIndices(詳情參考 Part 1 Merkle Tree in JavaScript),讓它跑一趟 Merkle Proof 的計算,最後就能夠算出一個 root,再確認計算後的 root 與我們的 public 變數 root 是否一樣。
tree.root <== root;
於是我們就能產生一個 ZKP 的證明 — 證明 private 變數:secret, nullifier, pathElements, pathIndices 可以計算出 public 變數:root 與 nullifierHash。
把這個證明提交給合約,合約透過 Verifier 驗證 proof 是否正確,以及必須事先確認:
public 變數 root 有在合約的 roots 裡面。
public 變數 nullifierHash 在合約中是第一次出現。
以下附上完整的 withdraw 原始碼:
必須注意 ZKP 是向合約證明使用者填入的 secret 和 nullifier 可以計算出某個 root,但無法保證這個 root 曾經在合約的 roots 歷史上。
所以合約的 withdraw 中,除了 verifyProof 之外,還要事先檢查 ZKP 算出來的 root 是不是真的在歷史上發生過,所以需要 isKnownRoot 的檢查:
function isKnownRoot(bytes32 _root) public view returns(bool)
必須先檢查 isKnownRoot 後才能進行 verifyProof。
經過 verifyProof 驗證成功後,合約就開始進行提款的動作,也就會將代幣傳到 recipient 的地址,最後拋出 Withdrawal 的事件。
nullifier 與 nullifierHash
為什麼我們的秘密不是只有 secret 還要額外加一個 nullifier?
簡單來說,這是為了防止已經提領過的 note 又再提領一次,也就是所謂的 double spend。
require(!nullifierHashes[_nullifierHash], "The note has been already spent");
可以看到 withdraw 需要填入參數 nullifierHash,跟 isKnownRoot 一樣的狀況,我們需要對電路的 public 變數先經過一層檢查之後,才能帶入到 verifyProof 裡面。
nullifierHash 可以理解為這個 note 的 id,但它不會連結到 deposit,因此可以用來紀錄這個 note 是否已經被提領過。
所以當 verifyProof 驗證成功之後,我們要紀錄 nullifierHash 已完成提領:
nullifierHashes[_nullifierHash] = true;
有關為什麼需要事先檢查 public 變數後,才能帶入 verifyProof ,可以參考 Part 2:ZKP 與智能合約的開發入門 提到的 publicSignals 的部分。
附上 Tornado Cash 的架構圖:
簡化版的 tornado-core
tornado-core 的程式碼很簡潔漂亮,所以我模仿該專案自己實作一遍:
simple-tornado:https://github.com/chnejohnson/simple-tornado
這份專案只完成了 tornado-core 的核心部分,不一樣的是我的開發環境使用 hardhat 與 ethers 寫成,而 circom 與 snarkjs 使用官方當前的版本,合約用 0.7.0,測試使用 Typescript 。
比起兩年前的 tornado-core ,simple-tornado 使用的技術更新,可能更適合初學者理解這份專案,但是它有 bug…我在 issues 的地方有紀錄說明。
在開發的過程中,我的順序是先從最小單位的 MiMC hash function 開始玩,發現必須 javascript 算一次 hash、solidity 算一次、circom 再算一次,確保這三個語言對同一個值算出同樣的 hash 之後,才能放心去做更複雜的 Merkle Tree。
總結
我們可以看到 Tornado Cash 簡單的兩個函式:Deposit 與 Withdraw,透過將代幣送入合約後再提領到另一個地址的流程,應用 ZKP 達成匿名的交易。
除了斷開 Deposit 與 Withdraw 的地址關聯性之外,Tornado Cash 還有做了一層「藏樹於林」的隱私防護,這部份的解釋就請參考 ZKP 讀書會 Tornado Cash。
網路上很多關於 ZKP 的文章或專案都是在 2019 年後出產的,經過許多人對這項技術的嘗試,讓我們對 ZKP 有了更清晰的理解,如今兩年後,開發工具也變得更加成熟,期待未來在 web 隱私議題上能看到更多 ZKP 大放異彩的應用。
原始碼
tornado-core
simple-tornado
參考資料
ZKP 讀書會 Tornado Cash
Tornado Privacy Solution Cryptographic Review
Tornado Cash 實例解析 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌