การตรวจสอบ Proof of Reserves (PoR) คือกระบวนการที่ดำเนินการโดยผู้สอบบัญชีภายนอกที่เป็นอิสระ โดยมีวัตถุประสงค์เพื่อยืนยันว่าผู้รับฝากสินทรัพย์ได้ถือครองสินทรัพย์ตามที่กล่าวอ้างในนามของลูกค้าจริง ผู้ทำบัญชีนี้จะทำการบันทึกยอดคงเหลือที่ถืออยู่ทั้งหมดโดยไม่เปิดเผยตัวตน และนำมารวมกันเป็น Merkle Tree ซึ่งเป็นโครงสร้างข้อมูลที่มีความเป็นมิตรกับความเป็นส่วนตัว และเก็บรักษายอดคงเหลือทั้งหมดของลูกค้าไว้อย่างมิดชิด

จากนั้น ผู้ทำบัญชีจะได้รับ Merkle Root ซึ่งเป็นลายนิ้วมือเข้ารหัสที่ระบุการรวมยอดคงเหลือเหล่านี้โดยเฉพาะ ณ เวลาที่ทำการบันทึกข้อมูล
จากนั้น ผู้ทำบัญชีจะรวบรวมลายเซ็นดิจิทัลที่สร้างโดย Kraken ซึ่งพิสูจน์ความเป็นเจ้าของที่อยู่บนบล็อกเชนด้วยยอดคงเหลือที่ตรวจสอบได้โดยสาธารณะ สุดท้าย ผู้ทำบัญชีจะเปรียบเทียบและตรวจสอบยืนยันว่ายอดคงเหลือเหล่านี้เกินหรือตรงกับยอดคงเหลือของลูกค้าที่แสดงใน Merkle Tree หรือไม่ และด้วยเหตุนี้ สินทรัพย์ของลูกค้าจึงอยู่ภายใต้การควบคุมของ Kraken
ลูกค้าทุกรายสามารถตรวจสอบยืนยันได้อย่างอิสระว่ายอดคงเหลือของตนถูกรวมอยู่ในกระบวนการ Proof of Reserves หรือไม่ โดยการเปรียบเทียบข้อมูลที่เลือกกับ Merkle Root การเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับข้อมูลส่วนที่เหลือ ไม่ว่าจะเล็กน้อยแค่ไหน ก็จะส่งผลต่อ Root ทำให้สามารถเห็นการปลอมแปลงได้อย่างชัดเจน
รายงาน Proof of Reserves ของเราสามารถดูได้ที่นี่
ยอดคงเหลือสปอต
การตรวจสอบนี้จะครอบคลุมยอดคงเหลือทั้งหมดของคุณในสินทรัพย์ที่อยู่ในขอบเขตการตรวจสอบ ซึ่งถือครองไว้ ณ เวลาที่ทำการบันทึกข้อมูล สินทรัพย์ต่อไปนี้อยู่ในขอบเขตการตรวจสอบล่าสุด: Bitcoin (BTC), Ether (ETH), Solana (SOL), USD Coin (USDC), Tether (USDT), และ Ripple (XRP).
ยอดคงเหลือการสเตค
ถ้าคุณมียอดเงินที่จัดสรรไว้สำหรับการสเตคบนเชน ณ เวลาที่บันทึกข้อมูล มูลค่าของยอดที่สเตคไว้จะถูกนำมารวมกับยอดในบัญชีสปอตเป็นยอดเดียว
การซื้อขายมาร์จิ้น
ถ้าคุณเปิดสถานะมาร์จิ้นไว้ขณะนั้น คุณจะเห็นยอดคงเหลือรวมที่ปรับตามมูลค่าสถานะที่เป็นบวก
ตัวอย่าง 1
หากคุณซื้อ 1 BTC/USD ที่ราคา 30,000 USD ด้วยมาร์จิ้น และสถานะของคุณยังเปิดอยู่ ยอดคงเหลือใน Proof of Reserves จะแสดงการปรับปรุงยอดเพิ่มขึ้น +1 BTC ในยอดคงเหลือ BTC ของคุณ จะไม่มีการปรับค่าติดลบในยอดคงเหลือ USD ของคุณ ยอดคงเหลือสินทรัพย์ BTC ของคุณที่ถือครองภายใต้การดูแลของ Kraken จะรวมถึงยอด BTC ณ เวลานั้น ปรับเพิ่มขึ้น +1 BTC ตามสถานะมาร์จิ้นของคุณที่ปรับปรุงยอดเป็นบวก ยอดคงเหลือของสินทรัพย์ USD ของคุณจะยังคงเหมือนเดิม
ตัวอย่าง 2
หากคุณขาย 1 BTC/ETH ที่ราคา 15 ETH ด้วยมาร์จิ้น และสถานะของคุณยังเปิดอยู่ ยอดคงเหลือใน Proof of Reserves จะแสดงการปรับปรุงยอดเพิ่มขึ้น +15 ETH ในยอดคงเหลือ ETH ของคุณ จะไม่มีการปรับค่าติดลบในยอดคงเหลือ BTC ของคุณ ยอดคงเหลือสินทรัพย์ ETH ของคุณที่ถือครองภายใต้การดูแลของ Kraken จะรวมถึงยอด ETH ณ เวลานั้น ปรับเพิ่มขึ้น +15 ETH ตามสถานะมาร์จิ้นของคุณที่ปรับปรุงยอดเป็นบวก ยอดคงเหลือสินทรัพย์ BTC ของคุณที่ถือครองภายใต้การดูแลของ Kraken จะยังคงเหมือนเดิม
หมายเหตุ: วิธีการคำนวณสำหรับฟิวเจอร์สที่อธิบายไว้ข้างต้น มีผลบังคับใช้นับตั้งแต่การตรวจสอบ Proof of Reserves ประจำเดือนพฤษภาคม 2023 เป็นต้นไป
ยอดคงเหลือฟิวเจอร์ส
ถ้าคุณมียอดคงเหลือในกระเป๋าเงินฟิวเจอร์ส ณ ขณะที่ตรวจสอบ จะมีบันทึก Proof of Reserves แยกต่างหากสำหรับยอดคงเหลือหลักประกันฟิวเจอร์สของคุณ ยอดคงเหลือของคุณจะถูกปรับตามกำไรและขาดทุนที่ยังไม่เกิดขึ้นจริง (Unrealized PNL) สำหรับการเทรดฟิวเจอร์สแบบใช้หลักประกันสกุลเงินเดียว หลักการนี้จะครอบคลุมสินทรัพย์ที่อยู่ภายใต้ขอบเขตการตรวจสอบเช่นเดียวกับสปอตและมาร์จิ้น และจะเป็นส่วนหนึ่งของ Merkle Tree ชุดเดียวกัน (โดยมี Merkle Leaf ID เป็นของตนเอง)
ตัวอย่าง 1
ถ้าคุณมี 1 BTC ในกระเป๋าเงินฟิวเจอร์ส แล้วเปิดสถานะใน BTC Perp Single Collateral ซึ่งมีผลกำไรและขาดทุนที่ยังไม่เกิดขึ้นจริง -0.1 BTC เมื่อนั้นยอดคงเหลือ BTC ที่ถือครองภายใต้การดูแลของ Kraken จะอยู่ที่ 0.9 BTC (1 BTC ของคุณปรับ -0.1 BTC ตาม unrealised P&L)
ตัวอย่าง 2
ถ้าคุณมี 1 BTC ในกระเป๋าเงินฟิวเจอร์ส แล้วเปิดสถานะใน BTC Perp Multi-Collateral ซึ่งมีผลกำไรและขาดทุนที่ยังไม่เกิดขึ้นจริง -100.0 USD เมื่อนั้นยอดคงเหลือ BTC ที่ถือครองภายใต้การดูแลของ Kraken จะอยู่ที่ 1 BTC (1 BTC ของคุณไม่ได้ปรับตาม unrealised P&L เนื่องจากเป็นการติดตามค่า USD ซึ่งไม่ได้อยู่ในขอบเขตการตรวจสอบสินทรัพย์นี้)
หมายเหตุ: วิธีการคำนวณสำหรับฟิวเจอร์สที่อธิบายไว้ข้างต้น มีผลบังคับใช้นับตั้งแต่การตรวจสอบ Proof of Reserves ประจำเดือนพฤษภาคม 2023 เป็นต้นไป
การตรวจสอบทำได้ไม่ยาก
ทำตามขั้นตอนด้านล่างเพื่อตรวจสอบความถูกต้องทางรหัสผ่าน ว่ายอดคงเหลือในบัญชี Kraken ของคุณได้ถูกรวมอยู่ในการตรวจสอบ Proof of Reserves ครั้งล่าสุดเรียบร้อยแล้ว
หมายเหตุ: การยืนยันนี้จะสะท้อนเฉพาะยอดคงเหลือของสินทรัพย์ในบัญชีของคุณที่อยู่ในขอบเขต ณ เวลาที่ทำการตรวจสอบ โดยจะไม่แสดงผลการเทรดหรือธุรกรรมใดๆ ที่เกิดขึ้นหลังจากนั้น และจะไม่แสดงยอดคงเหลือของสินทรัพย์ที่ไม่อยู่ภายใต้ขอบเขตการตรวจสอบ
1. ล็อกอินเข้าบัญชี Kraken และไปที่หน้า Proof of Reserves ในอินเทอร์เฟซ Kraken Pro (pro.kraken.com) (ไอคอนบัญชี > Proof of Reserves).

2. เลือกแท็บ Proof of Reserves ข้อมูลนี้จะรวมถึงอัตราส่วนเงินสำรองล่าสุดที่ได้รับการตรวจสอบแล้ว ตลอดจนข้อมูลเฉพาะสำหรับบัญชีของคุณด้วย บัญชีของคุณจะแสดงรายงาน Proof of Reserves ล่าสุดที่ยอดคงเหลือในบัญชีของคุณได้รับการตรวจสอบแล้ว ซึ่งรวมถึงวันที่ระบุในรายงาน ผู้ตรวจสอบ และขอบเขตการประเมินดังกล่าว

3. เลือกวันที่แล้วคลิกยืนยันด้วยตัวเอง ในส่วนนี้จะมีข้อมูลยืนยันยอดคงเหลือที่ถือครอง ณ เวลาที่มีการตรวจสอบ รวมถึงคำแนะนำเกี่ยวกับวิธีการตรวจสอบรายละเอียดของคุณ

ยืนยันด้วยผู้ทำบัญชีบุคคลที่สาม
-
ใช้ Merkle Leaf ID ของคุณ - คัดลอกตัวอักษร 16 ตัวแรก แล้วนำไปกรอกในเครื่องมือของผู้ตรวจสอบบัญชีภายนอก เพื่อดึงข้อมูลยอดคงเหลือของคุณและตรวจสอบ ID ของคุณใน Merkle Tree Path เครื่องมือของผู้ตรวจสอบบัญชีภายนอกจะเปิดในหน้าต่างแยก
หมายเหตุ: ส่วนนี้เปิดให้ใช้งานตั้งแต่การตรวจสอบรอบปี 2023 เป็นต้นไป สำหรับการตรวจสอบก่อนหน้า โปรดไปที่หน้าเว็บพันธมิตรของเราเพื่อใช้เครื่องมือยืนยัน

ยืนยันด้วย Kraken
- ยืนยัน Record ID ของคุณ - ทำตามขั้นตอนเพื่อสร้าง Record ID ของคุณขึ้นมาใหม่ ซึ่งจะระบุข้อมูลเฉพาะของบัญชีคุณและ Review ID (ซึ่งจะไม่ซ้ำกันในแต่ละรอบวันที่ของรายงาน)
- ยืนยัน Merkle Leaf ID ของคุณ - ทำตามขั้นตอนเพื่อสร้าง Merkle Leaf ID ของคุณขึ้นมาใหม่ ซึ่งจะระบุเอกลักษณ์ของบัญชีคุณควบคู่ไปกับยอดคงเหลือที่ถือครอง ณ เวลาที่บันทึกข้อมูลเพื่อตรวจสอบ
- ยืนยัน Merkle Leaf ID ของคุณใน Merkle Tree - ยืนยันว่า ID ของคุณเป็นส่วนหนึ่งของ Merkle Tree และตรวจสอบความถูกต้องของ Path ไปยัง Merkle Tree Root ซึ่งได้รับการรับรองโดยผู้ตรวจสอบบัญชีภายนอกของเรา และมีการแชร์ข้อมูลนี้ร่วมกันในกลุ่มลูกค้าทั้งหมด
หมายเหตุ: ส่วนนี้เปิดให้ใช้งานตั้งแต่การตรวจสอบรอบปี 2023 เป็นต้นไป สำหรับการตรวจสอบก่อนหน้า โปรดไปที่หน้าเว็บพันธมิตรของเราเพื่อใช้เครื่องมือยืนยัน



การตรวจสอบยืนยันขั้นสูง
ลูกค้าที่มีความเชี่ยวชาญด้านเทคโนโลยีอาจต้องการสร้างค่าแฮชของ Merkle Tree leaf node ของตนเองขึ้นมาใหม่ และตรวจสอบยอดคงเหลือใน Merkle Tree ผ่านการเขียนโปรแกรมด้วยตนเอง แทนที่จะตรวจสอบผ่านเครื่องมือแสดงผลที่ Kraken หรือผู้สอบบัญชีภายนอกจัดเตรียมไว้ให้
คุณสามารถดำเนินการขั้นตอนการตรวจสอบยืนยันเหล่านี้ได้ด้วยการเขียนโค้ด:
-
คุณสามารถตรวจสอบการสร้าง Merkle Tree Leaf ID สำหรับบัญชีของคุณได้ ตามขั้นตอนที่ระบุไว้ด้านล่างนี้
-
จากนั้น คุณสามารถตรวจสอบ Merkle Tree Path สำหรับ Leaf ID ของคุณ และสร้าง Path ตั้งแต่ตำแหน่งของคุณขึ้นไปจนถึง Root Node ใหม่ได้ เรามอบความโปร่งใสอย่างเต็มรูปแบบ และยังได้รวมข้อมูล Sibling Leaf ID (ID ของโหนดข้างเคียง) ของคุณไว้ให้ด้วย
ขั้นตอนที่จำเป็นในรูปแบบ Pseudocode เพื่อสร้าง Record ID และ Merkle Leaf ขึ้นมาใหม่จาก Account Code, Kraken IIBAN, Review ID และยอดคงเหลือของคุณ ซึ่งมีรายละเอียดดังนี้ โปรดทราบว่าผลลัพธ์ที่ได้จะมีความละเอียดอ่อนต่อรูปแบบการจัดวางตัวอักษรของยอดคงเหลือ และลำดับของสินทรัพย์ที่ถูกตรวจสอบ ตามที่แสดงอยู่บนหน้าเพจ Proof of Reserves
- Record ID = SHA256(concatenate(Account Code, Kraken IIBAN, Review ID))
- Balances = ""
- สำหรับแต่ละสินทรัพย์:
- Balances = concatenate(Asset, ":", AssetBalances[asset])
- Merkle Hash = concatenate(Record ID, “,”, Balances)
- Merkle Leaf = substring(SHA256(Merkle Hash), 0, 16)
เมื่อระบุ Merkle Leaf ของคุณได้แล้ว คุณสามารถใช้การตรวจสอบด้วย SHA256 ร่วมกับค่า HEX เพื่อสร้างเส้นทาง Merkle Tree Path ขึ้นมาใหม่ได้
เราได้แสดงตัวอย่างที่เฉพาะเจาะจงไว้ในส่วนของ Code Snippets ด้านล่างนี้ ค่า Merkle Leaf ที่ได้จากการคำนวณจะแสดงให้เห็นในรายละเอียดการตรวจสอบ เพื่อช่วยยืนยันว่าคุณได้สร้างขึ้นมาใหม่อย่างถูกต้องแล้ว
Python
import hashlib
# Merkle Leaf ID calculation
account_code = "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
iiban = "AB12C34DEFG5KSQI"
review_id = "PR30SEP24"
record_id = hashlib.sha256((account_code + iiban + review_id).encode('utf-8')).hexdigest()
balances = "BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0"
print("Record ID: {}".format(record_id))
print("Merkle Hash: {}".format((record_id + "," + balances)))
hash_result = hashlib.sha256((record_id + "," + balances).encode('utf-8')).hexdigest()
print("SHA Result: {}".format(hash_result))
print("Merkle Leaf: {}".format(hash_result[0:16]))
#Merkle Tree Path function
def mix(x, y):
a = bytes.fromhex(x)
b = bytes.fromhex(y)
d = hashlib.sha256()
d.update(a)
d.update(b)
return d.hexdigest()Rust
use sha2::{Digest, Sha256};
//Merkle Leaf ID calculation
const ACCOUNT_CODE: &str = "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1";
const IIBAN: &str = "AB12C34DEFG5KSQI";
const REVIEW_ID: &str = "PR30SEP24";
const BALANCES: &str = "BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0";
fn main() {
let mut record_hasher: Sha256 = Default::default();
record_hasher.update(ACCOUNT_CODE);
record_hasher.update(IIBAN);
record_hasher.update(REVIEW_ID);
let record_id = format!("{:x}", record_hasher.finalize());
let merkle_hash = format!("{},{}", record_id, BALANCES);
let mut merkle_hasher: Sha256 = Default::default();
merkle_hasher.update(&merkle_hash);
let merkle_result = format!("{:x}", merkle_hasher.finalize());
println!("Record ID: {}", record_id);
println!("Merkle Hash: {}", merkle_hash);
println!("SHA Result: {}", merkle_result);
println!("Merkle Leaf: {}", &merkle_result[..16]);
}
//Merkle Tree Path function
fn mix(x: &str, y: &str) -> Result<String, hex::FromHexError> {
let mut leaves_hasher: Sha256 = Default::default();
let a = hex::decode(x)?;
let b = hex::decode(y)?;
leaves_hasher.update(&a);
leaves_hasher.update(&b);
Ok(hex::encode(leaves_hasher.finalize()))
}
fn main() {
println!("{}", mix("f42372aeb1be7296", "dfcced6ec3235f5e").unwrap());
assert_eq!(
mix("f42372aeb1be7296", "dfcced6ec3235f5e").unwrap(),
"ad86a5ee2f21347403ce07e365530604690454fa76787e76be9d2f6efdceeabf"
);
}Go
package main
import (
"crypto/sha256"
"fmt"
)
//Merkle Leaf ID Calculation
func main() {
accountCode := "8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
iiban := "AB12C34DEFG5KSQI"
reviewId := "PR30SEP24"
secret := accountCode + iiban + reviewId
data := []byte(secret)
hash := sha256.Sum256(data)
recordId := string(hash[:])
fmt.Printf("Record ID: %x\n", recordId)
balances := "BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0"
merkleHash := fmt.Sprintf("%x%s%s", recordId, ",", balances)
fmt.Printf("Merkle Hash: %s\n", merkleHash)
hashResult := sha256.Sum256([]byte(merkleHash))
hashResultStr := string(hashResult[:])
fmt.Printf("SHA Result: %x\n", hashResultStr)
fmt.Printf("Merkle Leaf: %x\n", hashResultStr[0:8])
}
//Merkle Tree path hashing
func mix(x, y string) (string, error) {
// Convert the hex strings to bytes
a, err := hex.DecodeString(x)
if err != nil {
return "", err
}
b, err := hex.DecodeString(y)
if err != nil {
return "", err
}
h := sha256.New()
h.Write(a)
h.Write(b)
// Get the final hash value as a byte slice
hashed := h.Sum(nil)
// Convert the hash to a hex string and return it
return hex.EncodeToString(hashed), nil
}
func main() {
result, _ := mix("f42372aeb1be7296", "dfcced6ec3235f5e")
fmt.Println(result)
}Bash
#!/bin/bash
#Merkle Leaf ID calculation
ACCOUNT_CODE="8dc20f34da8cea8dd0f46b001694f5123ecd30d786c5eb92ad1a013703a4f8d1"
IIBAN="AB12C34DEFG5KSQI"
REVIEW_ID="PR30SEP24"
RECORD_ID=$(echo -n "${ACCOUNT_CODE}${IIBAN}${REVIEW_ID}" | sha256sum | head -c 64)
BALANCES="BTC:0.00093799,ETH:0.0422125592,SOL:0.0,USDC:0.0,USDT:6.72754,XRP:0.0"
MERKLE_HASH="${RECORD_ID},${BALANCES}"
HASH_RESULT=$(echo -n ${MERKLE_HASH} | sha256sum | head -c 64)
echo "Record ID: ${RECORD_ID}"
echo "Merkle Hash: ${MERKLE_HASH}"
echo "SHA Result: ${HASH_RESULT}"
echo "Merkle Leaf: $(echo -n ${HASH_RESULT} | head -c 16)"
#Merkle Tree Path function
hex_string1="f42372aeb1be7296"
hex_string2="dfcced6ec3235f5e"
# convert hex strings to binary, concatenate them and then hash
hash_result=$(echo -n "$(echo -n $hex_string1 | xxd -r -p)$(echo -n $hex_string2 | xxd -r -p)" | sha256sum | awk '{ print $1 }')
echo $hash_resultเพื่อให้สอดคล้องกับความมุ่งมั่นในการสนับสนุนความโปร่งใส เราจึงต้องการแชร์ข้อจำกัดบางประการที่พบในกระบวนการตรวจสอบ Proof of Reserves ให้คุณทราบ
- การทำ Proof of Reserves เกี่ยวข้องกับการพิสูจน์อำนาจในการควบคุมเงินทุนบนเชน ณ ขณะที่ทำการตรวจสอบ แต่ไม่สามารถพิสูจน์ได้ว่ามีการถือครองกุญแจส่วนตัวเพียงผู้เดียว เนื่องจากในทางทฤษฎี คีย์เหล่านั้นอาจถูกคัดลอกโดยผู้โจมตีไปแล้วก็ได้
- กระบวนการนี้ไม่สามารถตรวจพบภาระผูกพันที่ถูกซ่อนไว้ หรือพิสูจน์ได้ว่าเงินทุนเหล่านั้นไม่ได้ถูกหยิบยืมมาเพียงเพื่อวัตถุประสงค์ในการผ่านการตรวจสอบเท่านั้น ในทำนองเดียวกัน คีย์อาจสูญหายหรือเงินทุนอาจถูกขโมยไปได้นับตั้งแต่การตรวจสอบครั้งล่าสุด
- ผู้ตรวจสอบบัญชีจะต้องมีความสามารถและมีความเป็นอิสระ เพื่อลดความเสี่ยงจากการหลอกลวงในส่วนของผู้รับการตรวจสอบ หรือการสมรู้ร่วมคิดกันระหว่างฝ่ายต่างๆ
- เราพยายามที่จะลดข้อจำกัดเหล่านี้ โดยการประสานงานร่วมกับบริษัทภายนอกที่มีชื่อเสียงและมีความเป็นอิสระ เพื่อดำเนินการตรวจสอบ Proof of Reserves ของเรา และจัดให้มีการตรวจสอบดังกล่าวอย่างสม่ำเสมอตามรอบระยะเวลาที่กำหนด เรายังมุ่งเน้นการสร้างความโปร่งใสผ่านการแสดงข้อมูลเหล่านี้ให้คุณเห็นได้โดยตรงบนแพลตฟอร์มสำหรับลูกค้าของเรา