📜 [專欄新文章] Merkle Tree in JavaScript
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
這篇文章會說明 Merkle Tree 的運作原理,以及解釋 Merkle Proofs 的用意,並以 JavaScript / TypeScript 簡單實作出來。
本文為 Tornado Cash 研究系列的 Part 1,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 2:ZKP 與智能合約的開發入門
Part 3:Tornado Cash 實例解析
Special thanks to C.C. Liang for review and enlightenment.
本文中實作的 Merkle Tree 是以 TypeScript 重寫的版本,原始版本為 tornado-core 以 JavaScript 實作而成,基本上大同小異。
Merkle Tree 的原理
在理解 Merkle Tree 之前,最基本的先備知識是 hash function,利用 hash 我們可以對資料進行雜湊,而雜湊後的值是不可逆的,假設我們要對 x 值做雜湊,就以 H(x) 來表示,更多內容可參考:
一次搞懂密碼學中的三兄弟 — Encode、Encrypt 跟 Hash
SHA256 Online
而所謂的 Merkle Tree 就是利用特定的 hash function,將一大批資料兩兩進行雜湊,最後產生一個最頂層的雜湊值 root。
當有一筆資料假設是const leaves = [A, B, C, D],我們就用function Hash(left, right),開始製作這顆樹,產生H(H(A) + H(B))與H(H(C) + H(D)),再將這兩個值再做一次 Hash 變成 H(H(H(A) + H(B)) + H(H(C) + H(D))),就會得到這批資料的唯一值,也就是 root。
本文中使用的命名如下:
root:Merkle Tree 最頂端的值,特色是只要底下的資料一有變動,root 值就會改變。
leaf:指單一個資料,如 H(A)。
levels:指樹的高度 (height),以上述 4 個資料的假設,製作出來的 levels 是 2,levels 通常會作為遞迴的次數。
leaves:指 Merkle Tree 上的所有資料,如上述例子中的 H(A), H(B), H(C), H(D)。leaves 的數量會決定樹的 levels,公式是 leaves.length == 2**levels,這段建議先想清楚!
node:指的是非 leaves 也非 root 的節點,或稱作 branch,如上述例子中的H(H(A) + H(B)) 和 H(H(C) + H(D))。
index:指某個 leaf 所在的位置,leaf = leaves[index],index 如果是偶數,leaf 一定在左邊,如果是奇數 leaf 一定在右邊。
Merkle Proofs
Merkle Proofs 的重點就是要證明資料有沒有在樹上。
如何證明?就是提供要證明的 leaf 以及其相對應的路徑 (path) ,經過計算後一旦能夠產生所需要的 root,就能證明這個 leaf 在這顆樹上。
因此這類要判斷資料有無在樹上的證明,類似的說法有:proving inclusion, proving existence, or proving membership。
這個 proof 的特點在於,我們只提供 leaf 和 path 就可以算出 root,而不需要提供所有的資料 (leaves) 去重新計算整顆 Merkle Tree。這讓我們在驗證資料有沒有在樹上時,不需要花費大量的計算時間,更棒的是,這讓我們只需要儲存 root 就好,而不需要儲存所有的資料。
在區塊鏈上,儲存資料的成本通常很高,也因此 Merkle Tree 的設計往往成為擴容上的重點。
我們知道 n 層的 Merkle Tree 可以存放 2**n 個葉子,以 Tornado Cash 的設計來說,他們設定 Merkle Tree 有 20 層,也就是一顆樹上會有 2**20 = 1048576 個葉子,而我們用一個 root 就代表了這 1048576 筆資料。
接續上段的例子,這顆 20 層的 Merkle Tree 所產生的 Proof ,其路徑 (path) 要從最底下的葉子 hash 幾次才能到達頂端的 root 呢?答案就是跟一棵樹的 levels 一樣,我們要驗證 Proof 所要遞迴的次數就會是 20 次。
在實作之前,我們先來看 MerkleTree 在 client 端是怎麼調用的,這有助於我們理解 Merkle Proofs 在做什麼。
基本上一個 proof 的場景會有兩個人:prover 與 verifier。
在給定一筆 leaves 的樹,必定產生一特定 root。prover 標示他的 leaf 在樹上的 index 等於 2,也就是 leaves[2] == 30,以此來產生一個 proof,這個 proof 的內容大致上會是這個樣子:
對 verifier 來說,他要驗證這個 proof,就是用裡面的 leaf 去一個一個與 pathElements 的值做 hash,上述就是 H('30', 40) 後得出 node,再 hash 一次 H('19786...', node) 於是就能得出這棵樹的 root。
重點來了,這麼做有什麼意義?它的巧思在於對 verifier 來說,他只需要儲存一個 root,由 prover 提交證明給他,經過計算後產生的 root 如果跟 verifier 儲存的 root 一樣,那就證明了 prover 所提供的資料確實存在於這個樹上。
而 verifier 若不透過 proof ,要驗證某個 leaf 是否存在於樹上,也可以把 leaves = [10, 20 ,leaf ,40]整筆資料拿去做 MerkleTree 的演算法跑一趟也能產生特定的 root。
但由 prover 先行計算後所提交的 proof,讓 verifier 不必儲存整批資料,也省去了大量的計算時間,即可做出某資料有無在 Merkle Tree 上的判斷。
Sparse Merkle Tree
上述能夠證明資料有無在樹上的 Merkle Proofs 是屬於標準的 Merkle Tree 的功能。但接下來我們要實作的是稍微不一樣的樹,叫做 Sparse Merkle Tree。
Sparse Merkle Tree 的特色在於除了 proving inclusion 之外,還可以 proving non-inclusion。也就是能夠證明某筆資料不在某個 index,例如 H(A) 不在 index 2 ,這是一般 Merkle Tree 沒辦法做到的。
而要做到 non-membership 的功能其實也不難,就是我們要在沒有資料的葉子裡補上 zero value,或是說 null 值。更多內容請參考:What’s a Sparse Merkle Tree。
實作細節
本節將完整的程式碼分成三個片段來解釋。
首先,這裡使用的 Hash Function 是 MiMC,主要是為了之後在 ZKP 專案上的效率考量,你可以替換成其他較常見的 hash function 例如 node.js 內建 crypto 的 sha256:
crypto.createHash("sha256").update(data.toString()).digest("hex");
這裡定義簡單的 Merkle Tree 介面有 root, proof, and insert。
首先我們必須先給定這顆樹的 levels,也就是樹的高度先決定好,樹所能容納的資料量也因此固定為 2**levels 筆資料,至於要不要有 defaultLeaves 則看創建 Merkle Tree 的 client 自行決定,如果有 defaultLeaves 的話,constructor 就會跑下方一大段計算,對 default 資料開始作 hash 去建立 Merkle Tree。
如果沒有 defaultLeaves,我們的樹也不會是空白的,因為這是顆 Sparse Merkle Tree,這裡使用 zeroValue 作為沒有填上資料的值,zeros 陣列會儲存不同 level 所應該使用的 zero value。假設我們已經填上第 0 筆與第 1 筆資料,要填上第 2 筆資料時,第 2 筆資料就要跟 zeros[0] 做 hash,第 2 筆放左邊, zero value 放右邊。
我們將所有的點不論是 leaf, node, root 都用標籤 (index) 標示,並以 key-value 的形式儲存在 storage 裡面。例如第 0 筆資料會是 0–0,第 1 筆會是 0–1,這兩個 hash 後的節點 (node) 會是 1–0。假設 levels 是 2,1–0 節點就要跟 1–1 節點做 hash,即可產出 root (2–0)。
後半部份的重點在於 proof,先把 proof 和 traverse 看懂,基本上就算是打通任督二脈了,之後有興趣再看 insert 和 update。
sibling 是指要和 current 一起 hashLeftRight 的值…也就是相鄰在兩旁的 leaf (or node)。
到這裡程式碼的部分就結束了。
最後,讓我們回到一開始 client 調用 merkleTree 的例子:
以及 proof 的內容:
前面略過了 proof 裡頭的 pathIndices,pathIndices 告訴你的是當前的 leaf (or node) 是要放在左邊,還是放在右邊,大概是這個樣子:
if (indices == 0) hash(A, B);if (indices == 1) hash(B, A);
有興趣的讀者可以實作 verify function 看看就會知道了!
原始碼
TypeScript from gist
JavaScript from tornado-core
參考
Merkle Proofs Explained
What’s a Sparse Merkle Tree?
延伸:Verkle Tree
Merkle Tree in JavaScript was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有7部Youtube影片,追蹤數超過2萬的網紅Untyped 對啊我是工程師,也在其Youtube影片中提到,拖了三個月的軟體工程師面試SOP在此獻上!把面試當作刷題的我,把面試經驗技巧,努力濃縮再濃縮,還是有15分鐘的精華,只要五步驟,面試照著做,保證你 ace the coding interview like a PRO (most of the time). 這集會聊到... 💬 Overvie...
c++ 演算法 教學 在 S編的風格思維圈 Facebook 的精選貼文
#社群放大鏡
因為知道限動可以提高跟粉絲的互動
所以每天都昴起來發
但是有時觀看數會突然低到不行...
#有發現這個窘境的先按讚看解答
其實有可能默默犯了這些錯被降觸及了
今天就來盤點三個S編親測發現的真相
❶千萬不要內建幫你切割
如果一次發布15秒以上的影片
系統會自動幫你切割成多段影片
這是很方便的功能沒有錯
不過發布之前先啾抖嗎de!
連續發布會嚴重降觸及
觀看數會直線下降的
❷每篇需間隔15分鐘
上一點提到連續發布會降低觸及
S編實測過後至少間隔15分鐘
關看數就會趨於平穩!
❸已經很差的時後休息一小時
有時不小心連發限動讓觀看數跌落谷底
別擔心!
完全休息一小時之後再發布
有會重置狀態回復原狀唷!
留言告訴我
你會觀察限動發出去的表現跟狀況嗎?
a.發出去就隨風去吧
b.一定要觀察的啊
c.我看S風格社群工作室貼文就好
------------------------
經營IG總是處處碰壁
只知道追求讚數與粉絲數
卻不懂的如何發揮自身優勢創造價值嗎?
《生涯定位設計課_斜槓版》將帶你建立系統性的品牌規劃
從內容出發打造專屬你的獲利模式
S-style-cycle.com
——————————
#ig直播#直播#鐵粉 #小群效應 #鐵粉社群 #社群行銷 #行銷
#遠端工作 #內容創作 #社群 #個人網站 #個人品牌 #限動觸及 #限動玩法 #演算法 #社群經營 #音頻節目 #限動沒人看 #社群平台 #medium #限時動態 #story #限動教學
#自架網站 #限時動態教學 #限時動態封面 #限時動態教學
c++ 演算法 教學 在 軟體開發學習資訊分享 Facebook 的最讚貼文
NT370 特價中
課程說明
如果你可以建立一個能在玩的時候也能學習的角色會是什麼狀況呢? 想想你可以開發出讓敵人開始比玩家更聰明的遊戲類型。 這就是遊戲中的機器學習。 在本課程中,我們將發現人工智慧的迷人世界,超越簡單的東西,並檢查日益流行的機器學習自我思考的領域。
在本課程中,Penny 介紹了流行的遺傳演算法和神經網路的機器學習技術,她運用了她在國際上廣受讚譽的教學風格和博士學位遊戲人物 AI 的知識,以及超過 25 年的遊戲和計算機圖形學工作經驗。 此外,她還寫了兩本關於遊戲 AI 的獲獎書籍,以及另外兩本關於 Unity 遊戲開發的暢銷書。 在整個課程中,你將跟著一些實踐性的工作坊學習,這些工作坊旨在教你基本的機器學習技巧,提煉數學知識,使這個主題對於初學者來說更容易理解。
https://softnshare.com/machine-learning-with-unity/
c++ 演算法 教學 在 Untyped 對啊我是工程師 Youtube 的最佳解答
拖了三個月的軟體工程師面試SOP在此獻上!把面試當作刷題的我,把面試經驗技巧,努力濃縮再濃縮,還是有15分鐘的精華,只要五步驟,面試照著做,保證你 ace the coding interview like a PRO (most of the time).
這集會聊到...
💬 Overview 💬
💙 什麼是 coding interview? 1:20
💙 面試必備 - 比履歷還重要的東西 3:44
💙 面試流程 1 - 聽問題問問題 4:15
💙 面試流程 2 - 如何分析問題 6:00
💙 面試流程 3 - 如何寫程式碼 8:45
💙 面試流程 4 - 測試程式碼 10:10
💙 面試流程 5 - 再問更多問題 12:08
💙 面試流程 0 - 寒暄問暖不囉唆 13:30
🙌🏻 面試好書推薦 🙌🏻
👍🏻 準備軟體工程師面試必備書
Cracking the Coding Interview 提升程式設計師的面試力 https://shp.ee/y7rbjqk
https://www.books.com.tw/products/0010881287
👍🏻 當畫家遇上演算法 看圖學演算法
Grokking Algorithms 白話演算法!培養程式設計的邏輯思考
https://shp.ee/k3jtmvg
👍🏻 置入生活中的演算法
Algorithms to Live By: The Computer Science of Human Decisions 決斷的演算:預測、分析與好決定的11堂邏輯課
https://shp.ee/rvvh89e
https://www.books.com.tw/products/0010761815
👍🏻 Logitech 羅技 MX Keys 無線鍵盤 https://shp.ee/ptt9wtm
👍🏻 Logitech 羅技 MX Master 3 無線藍牙滑鼠 https://shp.ee/pu9qtcc
👍🏻 Backbone 人體工學椅 https://shp.ee/fgi35c9
👍🏻 Tresanti 電動升降桌 https://shp.ee/9wmht7r
👍🏻 logitech 羅技 StreamCam https://shp.ee/fbvgbvc
👍🏻 RODE Lavalier GO 領夾式 小型麥克風 https://shp.ee/nx6w9vc
📢 📣 📢 本頻道影片內容有輸出成 podcast 📢 📣 📢
可以在各大podcast平台搜尋「Untyped 對啊我是工程師」
請大家多多支持呀!!🙏🏻💁🏻♀️
#面試SOP #工程師求職 #面試流程大剖析
一定要看到影片最後面並且在「YouTube影片下方」按讚留言訂閱分享唷!
【愛屋及烏】
YouTube 👉 https://www.youtube.com/c/Untyped對啊我是工程師
Podcast 👉 https://open.spotify.com/show/3L5GRMXmq1MRsliQt43oi2?si=3zgvfHlETeuGfp9rIvwTdw
Facebook 臉書粉專 👉 https://www.facebook.com/untyped/
Instagram 👉 https://www.instagram.com/untypedcoding/
合作邀約 👉 untypedcoding@gmail.com
-
Untyped 對啊我是工程師 - There are so many data types in the world of computer science, so are the people who write the code. We aim to UNTYPE the stereotype of engineers and of how coding is only for a certain type of people.
凱心琳: 一個喜歡電腦科學邏輯推理,在科技圈努力為性別平等奮鬥的工程師。
【Disclaimer 聲明】
Some links are affiliated.
上面有些連結是回饋連結,如果你透過這些連結購買商品,我可以得到一些小獎勵,但不會影響到你購買的價格,甚至會是更低的價格!謝謝你的支持💕

c++ 演算法 教學 在 在地上滾的工程師 Nic Youtube 的精選貼文
現在學習知識的渠道越來越多,無論對於零基礎或是有經驗的工程師,想要持續成長應該看書還是看影片來的更有效率呢?
主要會和你分享我過去從新手到資深的過程中,如何持續保持進步及學習的經驗
也許這個經驗可以幫助到你,也歡迎留言和我分享你的看法
相信彼此分享不同的學習見解,能讓對於想要更精進自己程式開發功力的人有很大的幫助
===章節===
00:00 哪一個有效律?
00:36 寫程式如同寫作
05:14 書是最便宜的資源
10:14 折扣碼操作示範
===蝦皮購書折扣碼===
折扣碼:FLAGNIC36
時間:2021-03-29 ~ 2021-06-29
折扣碼:FLAGNIC79
時間:2021-06-30 ~ 2021-09-30
折扣碼: FLAGNIC11
時間:2021-10-01~ 2021-12-31
===前陣子在看的推薦書單===
(零基礎)
- 白話演算法!培養程式設計的邏輯思考
- Python 刷提鍛鍊班
(中高階)
- 設計模式之禪(第2版)
- 無瑕的程式碼-整潔的軟體設計與架構篇
- 單元測試的藝術
- 演算法之美:隱藏在資料結構背後的原理(C++版)
- Kent Beck的實作模式
(Ruby)
- Writing Efficient Ruby Code
(成長思考)
- 圖解.實戰 麥肯錫式的思考框架:讓大腦置入邏輯,就能讓90%的困難都有解!
- 師父:那些我在課堂外學會的本事
- 高勝算決策:如何在面對決定時,降低失誤,每次出手成功率都比對手高?
- 窮查理的普通常識
- 懶人圖解簡報術:把複雜知識變成一看就秒懂的圖解懶人包
- 寫作,是最好的自我投資
喜歡影片的話!可以幫忙點個喜歡以及分享、訂閱唷!😘
━━━━━━━━━━━━━━━━
🎬 觀看我的生活廢片頻道: https://bit.ly/2Ldfp1B
⭐ instagram (生活日常): https://www.instagram.com/niclin_tw/
⭐ Facebook (資訊分享): https://www.facebook.com/niclin.dev
⭐ Blog (技術筆記): https://blog.niclin.tw
⭐ Linkedin (個人履歷): https://www.linkedin.com/in/nic-lin
⭐ 蝦皮賣場: https://shopee.tw/bboyceo
⭐ Github: https://github.com/niclin
⭐ Podcast: https://anchor.fm/niclin
━━━━━━━━━━━━━━━━
✉️ 合作邀約信箱: niclin0226@gmail.com
#寫程式 #前端 #後端

c++ 演算法 教學 在 OP凱文 Youtube 的最佳解答
**重要說明**
抱歉我修正一下影片內的言論,不要去按倒讚,因為各位去搜尋他的頻道反而會助長他的演算法推送,就記得沒有無敵單這種東西就好了,時間久了它自然會消失不見
選擇權課程:小資族大翻身!
https://optionplayerkevin.teachable.com/p/9b20c3
歡迎留言問問題唷!如果不知道要留什麼也沒關係,在底下選個食物與我分享吧!
🍺🍷🥤🍕🍖🥩🍔🍟🌭🍙🍝🍜🍦🍩🍫🧀🍇🍎🍉
成為這個頻道的會員並獲得獎勵:
https://www.youtube.com/channel/UCL2JKimITPdd37tEzJrHPAg/join
▼底下有各種資訊,歡迎點開參考▼
✅telegram:https://t.me/opplayergroup
✅選擇權討論社團:http://optionplayerkevin.pros.is/groupkevin
✅IG:http://optionplayerkevin.pros.is/instagramkevin
✅FB:http://optionplayerkevin.pros.is/facebookkevin
✅Blog:https://optionplayerkevin.blogspot.com/
這個頻道專注在選擇權的話題上
股票、期貨、基金也歡迎大家來討論
希望大家都能變得更有錢,邁向財務自由
----------
音樂:
► Music Credit: LAKEY INSPIRED
Track Name: "Days Like These"
Music By: LAKEY INSPIRED @ https://soundcloud.com/lakeyinspired
申明:影片主要為分享我個人的想法,並非投資建議,請觀眾在操作前仍需三思。
