شراء العملة
الأسواق
التداول
العقود
المالية
الأنشطة
المزيد

كيفية التحقق مما إذا كانت أصول حسابك موجودة في شجرة ميركل 、

ما هي شجرة ميركل
شجرة ميركل (Merkle Tree)، والمعروفة أيضًا باسم Hash Tree، هي بنية بيانات، عادة ما تكون شجرة ثنائية، تقوم بحساب طبقة قيمة التجزئة بطبقة من العقدة الورقية إلى عقدة الجذر العليا بطريقة معينة.
تعريف شجرة ميركل CoinEx
معلومات العقدة
تتضمن المعلومات المخزنة في كل عقدة شجرة ما يلي: 1. قيمة تجزئة العقدة؛ 2. عدد العملات التي تغطيها لقطات أصول المستخدم (خذ BTC و ETH و USDT كأمثلة)
قيمة هاش{"BTC":"مبلغ البيتكوين","ETH":"مبلغ ETH","USDT":"مبلغ USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
حكم الهاش
عقدة ورقة
hash = SHA256(nonce + balances)
مثل:
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
من بينها، ستقوم CoinEx بتعيين رمز nonce فريد لكل مستخدم، ويمكن الاستعلام عن هذا nonce في بيانات التدقيق؛ الأرصدة عبارة عن سلسلة json تتكون من عدد العملات التي تغطيها لقطة أصول المستخدم، مثل:{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}، اتبع القواعد التالية:
1. سلسلة json بتنسيق مضغوط بدون أسطر ومسافات جديدة.
2. قم بإزالة 0 غير صالح في نهاية كمية العملة، واحتفظ بدقة 8 أرقام.
3. يتم فرز أسماء العملات أبجديًا.
عقدة الأصلة
hash = SHA256(h1 + h2 + balances)
h1: قيمة هاش للعقدة الفرعية اليسرى
h2: قيمة هاش للعقدة الفرعية اليمانية
·balances: أرصدة العقدة الفرعية اليسرىbalances + أرصدة العقدة الفرعية اليمنى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 كاملة (شجرة ثنائية كاملة) 2^n من بيانات العقدة الطرفية، ولكن قد لا يكون العدد الفعلي للبيانات كافياً وقد يكون فرديًا. في هذه الحالة، إذا كانت العقدة k لا تحتوي على عقد شقيقة، فإن الحشو سينشئ تلقائيًا العقدة الشقيقة ’k، وتجزئة العقدة الشقيقة (k') = التجزئة (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. مبدأ التحقق:وفقًا لتعريف شجرة ميركل، يتم حساب قيمة تجزئة العقدة الأصلية من العقدة الطرفية للمستخدم نفسه، حتى يتم الحصول على قيمة تجزئة العقدة الجذرية، وقيمة تجزئة الجذر تتم مقارنة العقدة. إذا كان الاثنان متساويين، إذا تم تمرير التحقق، وإذا لم يكن متساويًا، فلن يمر التحقق.
2. على سبيل المثال، يحسب نص json التالي تجزئة العقدة الطرفية بناءً على بيانات المستخدم (الذاتية)، ثم يحسب تجزئة العقدة الأصلية مع كل عقدة شقيقة على المسار (المسار)، وتجزئة العقدة الناتجة يجب أن تكون مساوية لعقدة الجذر (الجذر)، والأرصدة متساوية أيضًا. (لاحظ أنه عندما تكون العقدة الشقيقة فارغة، فهذا يشير إلى أنه لا توجد عقدة شقيقة، ويتم حساب تجزئة العقدة الأصلية وفقًا لقاعدة عقدة التعبئة)
نص بيانات مسار شجرة ميركل:
{
    "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 الخاص بك، وانقر فوق "حجز الشهادة"، وأدخل صفحة "حجز الشهادة"، ثم انقر فوق "نسخ بيانات التدقيق الخاصة بي".
2. الصق بيانات التدقيق المنسوخة في ملف نصي، مثل merkle_proof_file.json.
3. قم بتنزيل [أداة التحقق من المصدر المفتوح] المقدمة من CoinEx.
4. قم بفك ضغط أداة التحقق، وضع الملف الذي تم فك ضغطه وmerkle_proof_file.json في نفس المجلد، مثل ~/Downloads/proof-of-reserves
5. افتح المحطة(MacOS: المحطة App؛المحطة Windows:اوWindows: )، أدخل cd ~/Downloads/proof-of-reserves لإدخال الدليل أعلاه.
6. أدخل الأمر التالي للتحقق من بياناتك:
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. إذا تم اجتياز التحقق، فسيطلب منك "اجتياز التحقق من مسار شجرة ميركل"، وإذا فشل التحقق، فسيظهر رسالة "فشل التحقق من صحة مسار شجرة ميركل".
ممكن الرجوع إلى التعليمات الواردة في هذا المستند و [كود مصدر أداة التحقق من المصدر المفتوح] لكتابة التحقق من البرنامج بنفسك.