HBTC 100% 資産保管証明(PoR)
原理
顧客資産を預かる暗号資産取引所に対してよくある質問は、顧客資産はちゃんと取引所のウォレットに保管されているか、盗難されていないか、使い込まれていないかどうか、というものです。お客様が出金時にコインを円滑に引き出せるでしょうか?
お客様が入金した資産がきちんと取引所のウォレットに保管されることを証明する仕組みは、一般に「資産保管証明(PoR)」と呼ばれています。保管証明の手順は以下の通りです。
⋆ 取引所のホトウォレット及びコールドウォレットのアドレスと残高を発表
⋆ 顧客資産残高を記録
⋆ 顧客資産残高記録を使用してマークルツリーを作成する。この時、リーフ部分は顧客の各資産残高、ルート部分は顧客の総資産残高となる。
⋆ マークルツリーを公表して検証を受ける。
お客様による確認
⋆ マークルツリーのリーフノードに残高が残っているかどうかを確認
⋆ リーフノードからルートノードまでのマークルツリーの残高の計算値を検証し、そのハッシュ値が正しいことを確認
⋆ ルートノードの総資産残高と、コールドウォレット及び取引所が公表したウォレットアドレスの残高とを比較し、取引所の資産が十分であることを確認する。
制限事項
⋆ お客様のコインが取引所ウォレットにあることが証明された場合であっても、出金に応じかねる場合がございます。
⋆ 取引所がマークルツリーのデータを改ざんし、かつ、発見されないような事態が起こる可能性を減らすためには、実際に検証操作を実施する十分な数の利用者が必要です。ポジションを持っている全利用者が自身の手で妥当性の検証を実行し、全ての検証で問題がないことが理想です。そしてそれは取引所によって作成されたマークルツリーが完全に正しいことを証明します。
HBTCでの具体的な実施方法
元データの選択
銘柄:HBTCは現在BTC、ETH、USDTの3つの資産保管証明を提供しています。
残高の記録:HBTCは、2020年4月13日0:00 UTC時間(北京時間午前8時)にすべての顧客残高(サマリーウォレットアカウント、オプションアカウント、契約アカウント、ユーザー定義のサブアカウントの残高を含む)を記録します。通貨ごとにuserID、nonceランダムコード、amountを記録します。今回のノンスは、ユーザーのウォレットアカウントのアカウントIDを使用します。
ホットウォレットとコールドウォレットのアドレス:
BTC:
3Bm99oWTc7Eebrv4TEUBTY86t4AFXSdPRK
378E5HP7SGcW6XvriEirgvNUF54G79mftB
3CTgNAMCY6ZoMFYPNFo8xBLeVv4stcXBhx
ETH:
0x3c047B9Dfa4fd8F812f264f1611b959a4DD980f8
0xA31974408AAD18C1e5C4648d435795Fa757EA47f
0x1Ee7C37EFF6a37d38d805A0ceDc134147a9DD3Cf
0xa4938E606eDfe350D08813a0785Ed85D4640d365
0xCe76a14dABe64acb8b044c489374C8ca1f456837
USDT:
0x3c047B9Dfa4fd8F812f264f1611b959a4DD980f8
0xA31974408AAD18C1e5C4648d435795Fa757EA47f
0x1Ee7C37EFF6a37d38d805A0ceDc134147a9DD3Cf
0xa4938E606eDfe350D08813a0785Ed85D4640d365
0xCe76a14dABe64acb8b044c489374C8ca1f456837
備考:
⋆ ETH、USDT、および一部の資金は、ウォレット収集戦略のために、ホットウォレットアドレスに集められませんでした。
⋆ Bluehelixクラウドのカストディ&決済プラットフォーム、流動性共有機能の特徴から、HBTC取引所の残高は急速に変化しており、すべての残高変更がオンチェーンのホットウォレットの残高に反映されるわけではありませんが、カストディ&決済プラットフォームは内的にクリアリング処理を完了します。
リーフノードの作成
⋆ amount(顧客残高) * 10 ^ 8の整数を取る
⋆ ハッシュを計算= sha256(userId + "|" + nonce + "|" + amount)
⋆ ハッシュを16進数の文字列に変換し、最初の16文字をhexHashとして受け取り、 ノードに保存します。
ツリーノードの作成
⋆ 2つの子ノードに対して1つの親ノードを収集する必要があるため、子ノードの数が奇数の場合は、最後のノードをコピーし、amountを消去して、paddingノードとして使用します。
⋆ 親ノードのハッシュ = sha256(親ノードのamount + "|" + leftNode.hexHash + "|" +
⋆ 親ノードのハッシュ = sha256(親ノードのamount + "|" +leftNode.hexHash + "|" + rightNode.hexHash)
⋆ 親ノードhexHashは、16進数への親ノードハッシュで、最初の16文字を取ります
サブツリーの生成をユーザーが検証
⋆ ユーザーが配置されているルートノードからリーフノードへの唯一の経路を通過するすべてのノードの組、および計算に関与する他のノードは、ユーザー検証サブツリーと呼ばれます。 検証操作のためにユーザーに提供されます。
⋆ ユーザー所有のリーフノードはそれ自体を「self」と呼ばれます。隣のユーザーノードはユーザーノード「user」と呼ばれます。
⋆ ファーストレベルのノードはルートノード「root」と呼ばれます
⋆ リーフノードからルートノードまでに通過するノード群は関連ノード「relevant」と呼ばれます。
⋆ 関連ノードの計算に含まれる非関連ノードは、通常ノード「node」と呼ばれます。
製品化
HBTCは以下のリンク先で自己検証用のページを提供します。
https://www.hbtc.com/finance/trace_back/BTC
検証方法
⋆ マイページにアクセスして、userIDを取得します。
⋆ 資産ページにアクセスして、保有している各通貨の資産残高を取得し、残高に10 ^ 8を掛けて整数化し、この値をamountとします。
⋆ 資産認証ページにアクセスして、nonceを取得します
⋆ sha256(userId + "|" + nonce + "|" + amount)左側の16バイトを計算し、それを資産認証ページのselfノードのハッシュと比較します。
⋆ selfノードから、各ノードのハッシュを計算および検証します。まず2つの子ノードのamountを足して、その結果を親ノードのamountとします。次にsha256(親ノードのamount + "|" + leftNode.hexHash + "|" + rightNode .hexHash)左側の16バイトを計算し、親ノードのハッシュと比較します。
⋆ ルートノードまですべて計算し、各レベルのamountとハッシュが正しく一致することを確認します