วิธีตรวจสอบว่าทรัพย์สินของคุณอยู่ใน Merkle Tree หรือไม่
Merkle Tree คืออะไร
Merkle Tree Merkle Tree)หรือที่เรียกว่า Hash Tree เป็นโครงสร้างข้อมูลและมักจะเป็นต้นไม้ไบนารี ซึ่งจะคำนวณค่าแฮชทีละชั้น จากโหนดปลายสุดไปยังโหนดใบ(Leaf Node)บนด้วยวิธีเฉพาะ
คำจำกัดความ Merkle Tree ของ CoinEx
ข้อมูลโหนด
ข้อมูลที่จัดเก็บในแต่ละโหนดต้นไม้ประกอบด้วย: 1. ค่าแฮชของโหนด 2. จำนวนเหรียญที่ครอบคลุมโดยภาพรวมสินทรัพย์ของผู้ใช้ (ยกตัวอย่าง BTC, ETH, USDT)
ค่าแฮช{"BTC":"จำนวน BTC","ETH":"จำนวน ETH","USDT":"จำนวน USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
ค่าแฮช (Hash value)
โหนดใบ(Leaf Node)
hash = SHA256(nonce + balances)
ยกตัวอย่างเช่น
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
ในท่ามกลางพวกเขา CoinEx จะกำหนด nonce ที่ไม่ซ้ำกันให้กับผู้ใช้แต่ละคน ซึ่งสามารถสืบค้นได้ในข้อมูลการตรวจสอบ ในขณะที่ "ยอดคงเหลือ" เป็นสตริง json ที่ประกอบด้วยจำนวนเหรียญที่ครอบคลุมโดยภาพรวมสินทรัพย์ของผู้ใช้ เช่น: {"BTC" :"1.023", "ETH":"0", "USDT":"20.2343322"} ให้ปฏิบัติตามกฎด้านล่าง:
1. สตริง json อยู่ในรูปแบบกะทัดรัดโดยไม่มีการขึ้นบรรทัดใหม่และเว้นวรรค
2. ลบ 0 ที่ไม่ถูกต้องที่ส่วนท้ายของจำนวนเหรียญ และรักษาความแม่นยำ 8 หลัก
3. ชื่อเหรียญเรียงตามตัวอักษร
1. สตริง json อยู่ในรูปแบบกะทัดรัดโดยไม่มีการขึ้นบรรทัดใหม่และเว้นวรรค
2. ลบ 0 ที่ไม่ถูกต้องที่ส่วนท้ายของจำนวนเหรียญ และรักษาความแม่นยำ 8 หลัก
3. ชื่อเหรียญเรียงตามตัวอักษร
โหนดหลัก
hash = SHA256(h1 + h2 + balances)
· h1: ค่าแฮชของโหนดย่อยทางด้านซ้าย
· h2: ค่าแฮชของโหนดย่อยทางด้านขวา
· balances: ยอดคงเหลือของโหนดย่อยทางด้านซ้าย + ยอดคงเหลือของโหนดย่อยทางด้านขวา เป็นการรวมยอดคงเหลือของสินทรัพย์เดียวกัน
· h2: ค่าแฮชของโหนดย่อยทางด้านขวา
· balances: ยอดคงเหลือของโหนดย่อยทางด้านซ้าย + ยอดคงเหลือของโหนดย่อยทางด้านขวา เป็นการรวมยอดคงเหลือของสินทรัพย์เดียวกัน
ยกตัวอย่างเช่น
โหนดย่อยด้านซ้าย:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
โหนดย่อยด้านขวา:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
แฮชของโหนดหลัก :
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
การขยายความกฎของโหนด
การสร้าง Merkle Tree ที่สมบูรณ์ (ไบนารีแบบเต็ม) ต้องการข้อมูลโหนดลีฟ (leaf node) 2^n อย่างไรก็ตาม จำนวนข้อมูลจริงอาจไม่เพียงพอหรือเท่ากัน ในกรณีนี้ หากโหนด k ไม่มีโหนดพี่น้อง (sibling node) การเติมจะสร้างโหนดพี่น้อง(sibling node) โดยอัตโนมัติ k' และโหนดพี่น้อง(sibling node) นี้ hash(k') = hash(k) และจำนวนเหรียญในโหนด k' จะถูกตั้งค่าเป็นศูนย์ทั้งหมด
ยกตัวอย่างเช่น โหนด K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
แฮชของโหนดหลัก :
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
กฎการตรวจสอบ
1. หลักการตรวจสอบความถูกต้อง: ตามคำจำกัดความของ Merkle Tree ค่าแฮชของโหนดหลัก (parent node) จะคำนวณจากโหนดใบ (leaf node) ของผู้ใช้เอง จนกว่าจะได้ค่าแฮชของ โหนดราก (Root Node) และค่าแฮชของโหนดราก (Root Node) มีการเปรียบเทียบ หากทั้งสองมีค่าเท่ากัน การตรวจสอบจะได้รับการอนุมัติ ถ้าไม่เช่นนั้น การตรวจสอบจะล้มเหลว
2. ตัวอย่างเช่น ข้อความ json ต่อไปนี้จะคำนวณแฮชของโหนดใบ (Leaf Node) ตามข้อมูลตนเอง จากนั้นจึงคำนวณแฮชของโหนดหลัก(parent node) กับโหนดพี่น้อง (Siblings) แต่ละโหนดบนพาธ และแฮชของโหนดที่เป็นผลลัพธ์ควรเท่ากับแฮชโหนดราก (Root Node)โดยมียอดคงเหลือเท่ากัน(โปรดทราบว่าไม่มีโหนดพี่น้อง (Siblings) เมื่อโหนดพี่น้อง (Siblings) แสดงค่าว่าง และแฮชโหนดหลัก(parent node) จะถูกคำนวณตามกฎของโหนดการขยาย (padding node))
2. ตัวอย่างเช่น ข้อความ json ต่อไปนี้จะคำนวณแฮชของโหนดใบ (Leaf Node) ตามข้อมูลตนเอง จากนั้นจึงคำนวณแฮชของโหนดหลัก(parent node) กับโหนดพี่น้อง (Siblings) แต่ละโหนดบนพาธ และแฮชของโหนดที่เป็นผลลัพธ์ควรเท่ากับแฮชโหนดราก (Root Node)โดยมียอดคงเหลือเท่ากัน(โปรดทราบว่าไม่มีโหนดพี่น้อง (Siblings) เมื่อโหนดพี่น้อง (Siblings) แสดงค่าว่าง และแฮชโหนดหลัก(parent node) จะถูกคำนวณตามกฎของโหนดการขยาย (padding node))
ข้อมูลเส้นทาง Merkle Tree (json text):
{ "root": { "balances": { "CET": "14373493.24153457", "ETH": "104543541.61407674", "USDC": "2419089.97192761", "USDT": "4836955256.81519091" }, "hash": "c01a6c3b0fedde2a066f8a38968e40420c0b0742bb4ccda571a4349fb1c64f18" }, "self": { "balances": { "USDT": "3990000" }, "nonce": "9885b5df557ba3cec41a74347719a8a37d5792a1cf7f0e216510d60dd1b1fc95" }, "path": [ { "balances": { "CET": "10000.01994324", "USDC": "40000", "USDT": "1004.13066254" }, "hash": "01f94322a74bee4431b809406997cee575bed3b85ef36b4ba3b2ff9dd140f99a", "pos": "left" }, { "balances": { "CET": "1000", "ETH": "0.90765244", "USDT": "143151.30772787" }, "hash": "c99051749a3a83e60d1338454382044f9d7236928cfdc4b7fca1a7cc7450c7a6", "pos": "left" }, { "balances": { "CET": "548800.95984406", "ETH": "50000.00001068", "USDC": "9986.281143", "USDT": "62752.29303779" }, "hash": "173a9a7ef562f1b537def5d58167d7402c8e268b1423c5f8e1d806cd0c524344", "pos": "left" }, { "balances": { "CET": "10023.01105146", "ETH": "9900.74253772", "USDT": "22516389.78119662" }, "hash": "d79bd6c7a1536db199747061c119f98f86d99f9c7a8350fe63c6314ef3e8a24c", "pos": "right" }, { "balances": { "CET": "5393361.46905487", "ETH": "23711.51394236", "USDC": "201404.61667184", "USDT": "230211961.3159725" }, "hash": "115551fd3f85328d32858cc6d1bea9c1274984b0f8abba8140752f9d55e48277", "pos": "left" }, { "balances": { "CET": "1554146.8440552", "ETH": "100.0040003", "USDC": "160006.6", "USDT": "11201397.46983634" }, "hash": "7b92897456af56f473b75d5e009be090726ad64694fd27971dc46f2631db51d8", "pos": "right" }, { "balances": { "CET": "4712634.46013087", "ETH": "91469.27009748", "USDC": "1002463.00913027", "USDT": "830313049.62523756" }, "hash": "0905786187f2c582902b84175813b063c31755a2930b25dee7ba005f7c8a7cf9", "pos": "right" }, { "balances": { "CET": "2143526.47745487", "ETH": "104368359.17583576", "USDC": "1005229.4649825", "USDT": "3738515550.89151969" }, "hash": "41dc5da7477fab3ac6fe233a1bf1bec0d26d0f5dea679b5d91f2f09c488fcb2f", "pos": "right" } ] }
วิธีการตรวจสอบ
1. ลงชื่อเข้าใช้บัญชี CoinEx ของคุณ คลิก " Proof of Reserve " เข้าสู่หน้านี้ และคลิก "คัดลอกออดิชั่นของคุณ"
2. วางข้อมูลการตรวจสอบที่คัดลอกลงในไฟล์ข้อความ เช่น merkle_proof_file.json
3. ดาวน์โหลด [เครื่องมือตรวจสอบโอเพ่นซอร์ส] ที่จัดทำโดย CoinEx
4. เปิด Unzip เครื่องมือตรวจสอบ และวางไฟล์ที่คลายการบีบอัดและ merkle_proof_file.json ไว้ในโฟลเดอร์เดียวกัน เช่น ~/Downloads/proof-of-reserves
5. เปิดเทอร์มินัล (MacOS: Terminal App; Windows: Terminal หรือ PowerShell) ป้อน `cd ~/Downloads/proof-of-reserves' และไปที่ไดเร็กทอรี(Directory)ด้านบน
6. ป้อนคำสั่งต่อไปนี้เพื่อตรวจสอบข้อมูลของคุณ:MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. หากการตรวจสอบได้รับการอนุมัติ ข้อความจะแสดงเป็น 'การตรวจสอบเส้นทาง Merkle tree ผ่านแล้ว' หากไม่มี ข้อความแจ้งจะแสดงเป็น 'การตรวจสอบเส้นทาง Merkle tree ล้มเหลว'
คุณยังสามารถดูคำแนะนำที่ให้ไว้ในเอกสารนี้และ [ รหัสแหล่งที่มาของเครื่องมือตรวจสอบแบบโอเพ่นซอร์ส] เพื่อสร้างเครื่องมือการตรวจสอบของคุณเอง