코인 매입
시장
현물
선물
파이낸스
이벤트
더 알아보기
로그인

나의 자산이 머클트리에 있는지 확인하는 방법

머클트리가 무엇인가요?
해시트리라고도 불리는 머클트리(Merkle Tree)는 데이터 구조 중 하나이며 일반적으로 리프 노드에서 최상위 루트 노드까지 레이어별로 해시 값을 계산하는 이진 트리입니다.
CoinEx 머클트리 정의
노드 소개
각 트리 노드에 저장되는 정보는 다음과 같습니다. 1. 노드 해시 값. 2. 사용자 자산 스냅샷에 포함된 코인의 수(예: BTC, ETH, USDT).
해시 값{"BTC":"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를 각 사용자에게 할당할 예정이며, "balances"는 다음과 같이 사용자의 자산 스냅샷에 포함된 코인 수로 구성된 json 문자열( {"BTC":"1.023", "ETH":"0", "USDT":"20.2343322"})이며 아래와 같은 규칙을 따릅니다.
1. json 문자열은 줄바꿈과 공백이 없는 간결한 형식입니다.
2. 코인 수량 끝에 유효하지 않은 0을 제거하고 정밀도 8자리를 유지합니다.
3. 코인 이름은 영어 알파벳 순으로 정렬됩니다.
부모 노드
hash = SHA256(h1 + h2 + balances)
· h1: 왼쪽 자식 노드의 해시 값
· h2: 오른쪽 자식 노드의 해시 값
· 잔액: 왼쪽 자식 노드의 잔액과 오른쪽 자식 노드의 잔액을 합산한 같은 자산의 잔액
예:
왼쪽 자식 노드:
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"})
패딩 노드 규칙
완전한 머클트리(전체 이진)를 구축하려면 2^n 리프 노드 데이터가 필요하지만, 실제 데이터 수는 충분하지 않거나 균등하지 않을 수 있습니다. 이 경우 노드 k에 형제 노드가 없으면 패딩이 자동으로 형제 노드 k'를 생성하고, 이 형제 노드 hash(k') = hash(k)와 노드 k'의 코인 수는 완전히 0으로 설정됩니다.
예. Node 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 텍스트는 먼저 자체 데이터를 기반으로 리프 노드의 해시를 계산한 다음 경로의 각 형제 노드와 함께 부모 노드의 해시를 계산하고, 결과 노드 해시는 동일한 잔액으로 루트 노드 해시와 같아야 합니다. (형제 노드가 비어있을 경우 형제 노드가 없으며 패딩 노드 규칙에 따라 부모 노드 해시가 계산됩니다.)
머클트리 경로 데이터 (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: Terminal App; Windows: Terminal 또는 PowerShell)을 열고 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. 유효성 검증이 승인되면 프롬프트에 Merkle tree path validation passed라는 메시지가 표시됩니다. 실패한 경우 Merkle tree path validation failed 메시지가 표시됩니다.
이 문서와 오픈소스 유효성 검증 도구 코드에 제공된 설명을 참조하여 자신만의 유효성 검증 프로그램을 만들 수 있습니다.