📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
crypto node 在 Thai Pham Facebook 的精選貼文
TẢN MẠN VỀ THỊ TRƯỜNG COINS (ĐỒNG TIỀN SỐ, TIỀN ẢO, HAY TIỀN GÌ ĐẤY CỦA TƯƠNG LAI…và một loạt các mỹ từ khác nói không hết)
Học trò trong lớp KUNGFU và nhiều bạn hỏi thầy giáo nghèo là “thầy ơi, thầy nghĩ sao về đồng tiền số, tiền điện tử của tương lai ấy? Em thấy thầy hơi có vẻ khắc nghiệt và gay gắt với chúng?”
Một câu hỏi hay cho tôi, do đó. tôi - thầy giáo nghèo - lại tản mạn đôi chút với bạn khi rep lại học trò:
1) Thầy coi đoạn này thị trường coins hay cryptos market thì là đoạn đuôi ở phần xương 🦴 🐟 cá. Nên đọc tin tức mọi thứ hiện tại là để cho vui thôi. Tất cả những mỹ từ về tương lai, công nghệ số, tiền số, tiền tương lai…là để hút người mới vào thị trường nhằm bơm thổi, để mong cho các tài sản mình mua nó tăng giá lên trở lại. Chứ không có mục đích khác to lớn hơn mục đích ấy.
2) Quay lại bản chất của các bạn trẻ, hay bạn lớn, bạn già…tham gia tìm hiểu, mua bán thị trường crypto:
Bản chất là gì? Bản chất cuối cùng vẫn là mục đích to lớn KIẾM TIỀN! Và sau tất cả những động tác mua bán tiền số rồi thì cũng quay trở lại để quy ra cái gọi là Việt Nam Đồng hay Đô la Mỹ (USD) - là những đồng tiền “thật” hay truyền thống hay không? (Tức là bán chốt lời đổi ra VND, USD tiêu xài).
Rốt cuộc thị trường tiền ảo hay tiền số, tiền của tương lai hay gì đó chung quy lại vẫn là một mẫu số: BẠN MUỐN GIÀU LÊN! Và với cuộc chơi có tổng âm thì bạn giàu lên x2, x5, x10 hay nhân 100 lần thì sẽ có những thằng khờ khác (more fool man) mất sạch tài sản.
Như vậy chúng đơn giản cần phải hiểu đúng, hiểu đủ với giới tài chính là một: CÔNG CỤ ĐẦU CƠ TÀI CHÍNH.
Thầy giáo nghèo view, quan điểm như vậy nên khi nó còn trend, còn xu hướng, còn ở thân cá thì còn kiếm tiền, hết thân cá vào đuôi cá và xương cá thì rời bỏ.
Không có khái niệm yêu hay ghét bỏ trong tài chính vì yêu/ghét chỉ làm cho mình không kiếm được tiền mà thôi. Tương tự như cổ phiếu, chứng khoán, kim cương, bộ sưu tập, bất động sản, du thuyền, xe hơi collections hàng hiếm... chúng cũng là những công cụ tài chính của người giàu. Hãy đừng thần thánh hóa cái gì cả, vì bản chất của các công cụ này qua lịch sử không thay đổi và nó biến thiên từ vỏ sò, vàng, bạc, giấy tờ có giá, kén tằm, tơ lụa, ngà voi, tranh hiếm, trước tác...qua các loại khác.
Đừng để yêu/ghết cảm xúc làm mờ đi nhận định giúp mình đạt được mục tiêu và cũng đừng ru ngủ mình bằng những mĩ từ tương lai đẹp đẽ để quên đi bản chất của tất cả.
Còn trend thì còn nắm, còn cầm, còn giữ. Hết trend thì thôi, dời bỏ, chốt lời. Chung quy bản chất là một công cụ đầu cơ, sẽ tạo bong bóng rồi lại xì xẹp lép sau đó lại có một vòng lặp nữa. Cứ thế mà thôi. Cứ hết năm nay qua tháng nọ, lịch sử luôn là vậy.
Cái ông thầy nghèo phê phán, đấu tranh và thậm chí là phản đối kịch liệt là những hoạt động biến tướng, FOMO, đa cấp dùng những mỹ từ đẹp đẽ, tương lai này nọ để kêu gọi bạn bè múc, rồi thu hút cả họ hàng bỏ tiền vào vào. Với những người dám chơi dám chịu thì không sao. Sợ nhất những người chỉ muốn ăn, k cần học kĩ. Vào mà kiếm ăn được không nói, vào sai mất tiền chửi bới. Mất cả bạn bè, quan hệ và để lại hậu quả xấu cho xã hội. Vì đơn giản thằng ăn được x2, x5, x10 thì sẽ có thằng mất sạch tài khoản. Cuộc chơi vốn không công bằng và phũ phàng, phải hiểu bản chất đầu cơ, cờ bạc Las Vegas của nó thì chơi. Dám chơi và dám chịu thì chơi, có nghĩa là rủi ro cao nhưng nếu ông giỏi, ông kiếm được. Còn khi ông mất là do ông chưa có giỏi. Phải học thêm, đọc sách thêm, tìm cao nhân mà học. Đấy! Hiểu thế thì thoải mái.
Nên thầy giáo nghèo nói lại 1 lần nữa, thầy giáo nghèo chả có bất cứ sự thiếu thiện cảm nào với đồng tiền kĩ thuật số, thậm chí bản thân còn được hưởng niềm vui nhất định (ít thôi) với chúng và biết đủ là dừng. Ai xem Youtube của tôi từ đầu thì sẽ hiểu sâu hơn.
Ngoài ra, các bạn có biết một sự thật giật mình (học trò tôi thì sẽ hiểu sâu hơn vì tôi chia sẻ kĩ càng): NHỮNG THỨ GỌI LÀ ĐỒNG TIỀN HIỆN TẠI TRÊN TOÀN THẾ GIỚI CÓ CÁI NÀO LÀ TIỀN THẬT ĐÂU? Toàn là tiền điện tử, USD, Euro hay Nhân dân tệ thì cũng thế. Hiện nay, thứ gọi là tiền 💰 là những con số trong tài khoản ngân hàng, do máy tính tạo ra chúng (gọi là hoạt động in tiền truyền thống) nên bản chất sẽ KHÔNG CÓ MỘT QUỐC GIA nào nếu không có chủ quyền có thể IN TIỀN SỐ và không quốc gia nào có chủ quyền chấp nhận sự thách thức từ quyền tài phán tối cao với việc tạo ra các đồng tiền số thay thế đồng tiền điện tử họ đang tạo ra trên tài khoản của đất nước họ cả? Dĩ nhiên, sẽ có thoả hiệp trong tương lai với việc đồng tiền số tư nhân và đồng tiền số do FED, châu Âu, Trung Quốc phát hành. Đó là điều chắc chắn. Có thỏa hiệp cùng tồn tại hay là dẹp bỏ? Không rõ, cùng chờ đợi.
Còn với công nghệ hiện tại sắp tới, chỉ cần mất chưa tới 1 tuần người ta có thể tạo ra một đồng tiền số công nghệ blockchain thêm vào danh mục 9.000 đồng tiền ảo hiện tại, và sẽ còn ngày một nhiều đồng tiền số mới ra đời. Thậm chí có bài báo trên New York Times vừa rồi, người ta có thể tạo ra một đồng tiền số mới trong 1 ngày nhờ điền đầy đủ templates và rất nhanh chóng.
Nói đến đây bạn có hiểu vấn đề chưa?
Đó, tiền số là vậy, mối tương quan của nó là vậy đấy! Ai muốn hiểu thì tìm hiểu sâu hơn nhé. Công nghệ Blockchain thì cực kì tuyệt vời và ứng dụng của nó là bá đạo. Còn tìm hiểu sâu hơn về tiền số bạn sẽ bắt gặp những tư duy thế này này (học trò tôi luận giải)
"Đầu tư vào crypto là phải dự trên nền tảng sự hiểu biết và tri thức về blockchain, giá trị của nó là gì, sinh ra để giải quyết vấn đề gì, cách thức nó vận hành và tạo block, chẻ block, chốt block và kết chain ra sao?
Khi hiểu đc cơ chết vận hành của một chain thì có thể soi mainnet của nó thì có thể soi ra dữ liệu vận hành on-chain. Cái đó là tinh tuý cốt tuỷ dữ liệu vận hành của hạ tầng chain. Thằng CEO Cứt Tồ nào mà bùa nhiều hay hổ báo PR nhiều mình soi ngược vào on-chain là nó ko thể che dấu đc sức mạnh blockchain và tính ứng dụng của nó (XRP là 1 ví dụ: Dữ liệu trên web nó báo về số lượng thực hiện giao dịch cho tụi bank này kia thực ra là ảo, soi on-chain nó chỉ vận hành bằng 1 phần 100 con số trên web.)
Chưa kể các node đồng thuận của nó ko phải là do cơ thế tự nguyện volunteer như TRX mà chỉ có cái sổ cái phân tán Online Distribute Ledger nên cơ bản node produce chain vs node đóng block tụi nó tự liên kết tự làm. Như vậy là mất đi tính phi tập trung của blockchain."
... và vân vân, càng ngày càng rối não và thú vị phải không nào?
(Tôi cá là 95% tham gia cái thị trường Cứt Tồ (Crypto) hiện tại chả ai tìm hiểu kĩ như mấy dòng note và cần khoảng 4-5 tháng đọc sách miệt mài, đọc tài liệu miệt mài trên mạng như thế cả, đa phần là mong mình x2 và đọc các câu chuyện từ 10K USD kiếm tháng 1 triệu đô la và mong muốn đổi đời, chấm hết!
Và nếu chỉ như vậy, bạn không có khả năng cãi nhau, tranh luận trên mạng và nếu chỉ như vậy thì bạn chỉ có nước chửi bới "biết gì mà nói", "á cái lão này..." "ối giời ơi..." một cách ú ớ mà thôi.
Thôi bài viết dài quá về bản chất của tiền số, tiền ảo đóng vai trò là một phương tiện tài chính, công cụ tài chính đầu cơ.
Tôi mong bạn thích nó và nếu thích nó, thấy hay, thú vị hữu ích thì chia sẻ bài này thoải mái, bình luận mái thoải (trái chiều, ngược chiều vô tư, nhưng nguyên tắc là hãy lịch sự :D).
#ThaiPham
#Tản_mạn_tiền_số_
#Tản_mạn_tiền_ảo
#CryptoMarket
P/S: À, mấy ông thần tượng Idol Elon Musk hay Mark Cuban hay Paul Tudor Jones thì tôi cược 99% tham gia thị trường này thì cũng đơn giản muốn kiếm trăm triệu đô, tỉ đô từ mua thấp, bán cao, mua cao bán cao hơn mà thôi. Nhưng họ có gì? Có danh tiếng, có fans và có tiếng nói, khác biệt là ở đấy đấy. Còn tương lai mỹ miều của nó, họ chẳng quan tâm mấy đâu. Khi hết sóng họ rời bỏ. Có sóng mới họ lại đu theo, bản chất con người là thế (Nên xem hết bộ phim Cuộc Chiến Vương Quyền Game of Thrones 8 seasons, xem hết House of Cards, xem Tam Quốc, Tào Tháo, đọc Machiavelli,...để hiểu thêm bản chất con người. Còn nói trong một tút, khó lắm ta ơi).
P.S.S: Lời khuyên số #2, làm gì cũng cần ăn học, đừng tin ai ngay 100%, phải đặt câu hỏi, và kể cả chia sẻ của tôi (nghe confuse quá phải không? :D)
Mà, hình chú chó đẹp nhỉ?
crypto node 在 小斯 Facebook 的精選貼文
【突發!MCO Visa Card 暫停信用卡top-up!】
👉MCO Visa Card: https://flyformiles.hk/19113
(最新更新:剛測試過,Crypto Wallet裡面既MCO轉出轉入MCO Visa Card係無問題,只係唔可以用信用卡top up MCO Visa Card)
各位注意,用開MCO Visa Card黎賺佢個免費Spotify同Netflix既,由於MCO Visa Card既發卡機構Wirecard宣佈破產,所以宜家MCO Visa Card暫停信用卡top-up!出咗notice估計會將你卡既餘額轉返去你Crypto Wallet到,所以大家請耐心等待!睇定啲先!
➡️Wirecard破產新聞:https://m.mingpao.com/fin/instantf2.php?node=1593085619071&issue=20200625
crypto node 在 crypto.createCredentials(details) : nodejs API 的推薦與評價
It also offers a set of wrappers for OpenSSL's hash, hmac, cipher, decipher, sign and verify methods. Table of Contents #. crypto.createCredentials(); crypto. ... <看更多>
crypto node 在 Using SHA-256 with NodeJS Crypto - Stack Overflow 的推薦與評價
... <看更多>