Merkle Tree คืออะไร
เรียน Bitgetter ทั่วโลกทุกท่าน
Merkle Tree คือโครงสร้างข้อมูลรูปแบบหนึ่ง เรียกกันในอีกชื่อว่า Hash Tree โดย Merkle Tree จะจัดเก็บข้อมูลอยู่ใน Leaf Node ของโครงสร้างต้นไม้ ใช้วิธีการ Hash ข้อมูลไปทีละขั้นจนถึง Root Node ชั้นบนสุด หากข้อมูลใน Leaf Node มีการเปลี่ยนแปลง การเปลี่ยนแปลงนี้จะถูกส่งต่อขึ้นไปยัง Node ชั้นที่สูงขึ้นไปด้วย และในท้ายที่สุดการเปลี่ยนแปลงดังกล่าวก็จะไปแสดงอยู่ในส่วน Root ของโครงสร้างต้นไม้
1. บทบาทของ Merkle Tree
- Zero-Knowledge Proof
- ทำให้มั่นใจว่าแก้ไขเปลี่ยนแปลงข้อมูลไม่ได้
- ทำให้มั่นใจว่าข้อมูลจะมีความเป็นส่วนตัว
2. คำอธิบายของ Bitget Limited Merkle Tree
2.1 ข้อมูล Node
ข้อมูลที่จัดเก็บอยู่ในทุก Node ของต้นไม้มีดังนี้
1. Hash Value
2. จำนวนของเหรียญที่มีอยู่ในสแนปช็อตสินทรัพย์ของผู้ใช้ (เช่น BTC, ETH, USDT)
2.2 กฎการ Hash
Leaf Node (ยกเว้น Padding Node)
- encryptUid: UID ที่เข้ารหัสของผู้ใช้
- nonce: ค่าที่ไม่ซ้ำกันซึ่งแสดงถึงผู้ใช้แต่ละคน
- balances: JSON String ที่ประกอบด้วยจำนวนของเหรียญในสแนปช็อตสินทรัพย์ของผู้ใช้ (หมายเหตุ: ลบเลข 0 ที่ไม่มีผลตัวท้ายสุดออก คงความแม่นยำของ 8 บิตเอาไว้)
- ตัวอย่าง: {"BTC":1.763,"ETH":362,"USDT":1077200.2274}
Parent Node
- h1: Hash ของ Child Node ตัวซ้ายของ Node ปัจจุบัน
- h2: Hash ของ Child Node ตัวขวาของ Node ปัจจุบัน
- level: ลำดับชั้นที่ Parent Node อยู่
คำอธิบายลำดับชั้นของ Tree Node: Merkle Tree ที่สมบูรณ์ (Binary Tree แบบเต็ม) จำเป็นต้องมีข้อมูล Leaf Node 2^n, ลำดับชั้น Leaf Node = n+1, ลำดับชั้น Parent Node = ลำดับชั้น Child Node - 1, ลำดับชั้น Root Node level = 1, ลำดับชั้น Leaf Node เป็นจำนวนสูงสุด
กฎ Padding Node
Merkle Tree ที่สมบูรณ์ (Binary Tree แบบเต็ม) จำเป็นต้องมีข้อมูล Leaf Node 2^n แต่จำนวนที่แท้จริงของข้อมูลอาจมีไม่ครบและเป็นจำนวนคี่ ในกรณีเช่นนี้ หาก Node k ไม่มี Sibling Node ตัว Auto Padding จะสร้าง Sibling Node k' ขึ้นมา และ hash(k') = hash(k) และจำนวนเหรียญของ Node k' จะตั้งเป็นศูนย์
ตัวอย่าง:
โดย Padding Node hash4 = hash3 และ balances ที่จัดเก็บคือ {"BTC": 0, "ETH": 0, "USDT": 0} ดังที่แสดงใน Node ที่ไฮไลต์ไว้ในภาพที่ 1
ภาพที่ 1
ดังนั้น hash6 = SHA256 (hash3 + hash3, {BTC: (2+0), ETH:(1+0), USDT:(12+0)}, level)
หลักการยืนยันความถูกต้อง
1. หลักการยืนยันความถูกต้อง: ดังที่ระบุไว้ในส่วนคำอธิบายของ Bitget Limited Merkle Tree ค่า Hash Value ของ Parent Node นั้นคำนวณมาจากตัว Leaf Node เองของผู้ใช้ขึ้นไปจนถึง Root Node และจะมีการนำค่า Hash Value ของ Root Node มาเปรียบเทียบกับค่า Hash Value ของ Merkle Tree ใน "ขั้นตอนการยืนยันความถูกต้อง - ขั้นตอนที่ 1" หากทั้ง 2 ค่านี้เท่านั้น แสดงว่ายืนยันความถูกต้องผ่าน แต่หากไม่เท่ากัน แสดงว่ายืนยันความถูกต้องไม่ผ่าน
2. ตัวอย่าง: เมื่อรวมภาพที่ 1 และข้อความ JSON ต่อไปนี้ และเมื่อดูตาม Leaf Node h3 เองของผู้ใช้และข้อมูลที่อยู่ใน Node h4 ที่ติดกัน เราจึงคำนวณค่า Hash ของ Parent Node h6 ออกมาได้ จากนั้นเมื่อดูตามข้อมูลที่อยู่ใน Node h5 ที่ติดกัน เราจึงคำนวณค่า Hash ของ Parent Node h7 ออกมาได้ แล้วจากนั้นเปรียบเทียบค่า Hash Value กับ Root Node h7 ที่อยู่ในข้อมูล Merkle Tree Path เพื่อดูว่าค่า Hash Value นั้นเท่ากันหรือไม่เพื่อดำเนินการยืนยันความถูกต้องให้เสร็จสิ้น
ข้อความ JSON ของข้อมูล Merkle Tree Path:
ขั้นตอนการยืนยันความถูกต้อง
1. ล็อกอินเข้าสู่บัญชี Bitget ของคุณ แล้วคลิก "ภาพรวมสินทรัพย์ - Proof of Asset / Asset Overview - Proof of Assets" จากนั้นไปที่ "Proof of Asset / Proof of Assets" เพื่อดูการตรวจสอบล่าสุดโดยตรง ข้อมูล ณ เวลาของการตรวจสอบของคุณจะแสดงให้เห็นโดยค่าเริ่มต้น
2. หากคุณต้องการยืนยันความถูกต้องเพิ่มเติมด้วยตัวเองว่าได้มีการรวมสินทรัพย์ของคุณเข้าใน Merkle Tree แล้วหรือไม่ สามารถทำได้โดยดำเนินการขั้นตอนการยืนยันความถูกต้องต่อไปนี้ คลิกปุ่ม "ดาวน์โหลดข้อมูล / Download Data" เพื่อรับข้อมูลที่จำเป็นต่อการยืนยันความถูกต้องด้วยตัวเอง จากนั้นการดาวน์โหลดไฟล์ที่มีชื่อเริ่มต้น: merkel_tree_bg.json จะเริ่มต้นขึ้น
3. ปฏิบัติการที่เฉพาะเจาะจง:
ในตัวอย่างของเรา ชื่อไฟล์คือ merkel_tree_bg.json ข้อความของข้อมูล Merkle Tree Path ในรูปแบบ JSON แสดงอยู่ที่ด้านล่าง:
4. ดาวน์โหลดเครื่องมือการยืนยันความถูกต้องแบบโอเพนซอร์ส ProofOfReserves.zip ที่มีให้โดย Bitget Limited
5. แตกไฟล์ ProofOfReserves.zip ใส่ใน Directory ปัจจุบันและจัดเก็บไฟล์ merkel_tree_bg.json ที่บันทึกมาในขั้นตอนที่ 3 เอาไว้ในโฟลเดอร์เดียวกัน ในกรณีของเรานี้ ไฟล์จัดเก็บอยู่ใน "Downloads" และโฟลเดอร์มีชื่อว่า "proof-of-reserves" ดูภาพหน้าจอได้ดังนี้
6. เปิดโปรแกรม Terminal (ระบบ Mac: terminal application, ระบบ Windows: cmd application)
7. ป้อนคำสั่ง cd ~/Downloads/proof-of-reserves ในโปรแกรม Terminal เพื่อไปยัง Directory ของ Package ที่ดาวน์โหลดมา
8. ยืนยันความถูกต้องของข้อมูลของคุณโดยป้อนคำสั่งต่อไปนี้
Mac/Linux
Windows
เปิดไฟล์ start.bat
หมายเหตุ: หากคุณใช้ระบบ Mac แล้วพบปัญหาเกี่ยวกับการตั้งค่าความปลอดภัยในขั้นตอนนี้ ให้ไปที่ การตั้งค่าระบบ -> ความปลอดภัยและความเป็นส่วนตัว -> ทั่วไป -> คลิกล็อคเพื่อทำการเปลี่ยนแปลง -> อนุญาตแอปที่ดาวน์โหลดจาก: App Store และนักพัฒนาที่ระบุ -> ให้อนุญาตเครื่องมือ (System Preferences -> Security Privacy -> General -> Tap the lock button to make changes -> Allow apps downloaded from: App Store and approved developers -> Give permission to tools)
หากเกิดปัญหาต่อไปนี้ขึ้น zsh: permission denied: . /start.sh ให้ใช้คำสั่งต่อไปนี้
9. ดูผลลัพธ์
(1) หากข้อมูลของคุณถูกต้องและยืนยันความถูกต้องผ่าน จะแสดงผลเป็น "Merkle tree root hash consistent, verification succeeded" ("การ Hash Merkle Tree Root สอดคล้องกัน การยืนยันความถูกต้องสำเร็จ")
(2) หากข้อมูลของคุณไม่ถูกต้องและยืนยันความถูกต้องไม่ผ่าน จะแสดงผลเป็น "Merkle tree root hash inconsistency, verification failed" ("การ Hash Merkle Tree Root ไม่สอดคล้องกัน การยืนยันความถูกต้องล้มเหลว")
10. นอกจากนี้ คุณยังสามารถดูข้อมูลโค้ดเครื่องมือการยืนยันความถูกต้องแบบโอเพนซอร์สของ Bitget Limited และคำอธิบาย Merkle Tree (ดูที่ส่วน "Merkle Tree คืออะไร") แล้วเขียนโปรแกรมของคุณเองได้เพื่อยืนยันความถูกต้องของข้อมูล Path ที่ได้มาในขั้นตอนที่ 2 หรือเพื่อตรวจสอบให้แน่ใจว่าได้มีการรวมสินทรัพย์ของคุณไว้ใน Merkle Tree ที่สร้างขึ้นโดยการตรวจสอบนี้แล้ว
ทีมงาน Bitget