Real Math Simulation (BIP-32/39/44/84/86)
HD Wallet (Hierarchical Deterministic Wallet) คือระบบกระเป๋าบิตคอยน์ที่ใช้ คำลับ (Mnemonic/Seed Phrase) เพียงชุดเดียว เพื่อสร้าง ที่อยู่บิตคอยน์ได้ไม่จำกัดจำนวน — ทั้งหมดนี้เชื่อมโยงกันด้วยสมการคณิตศาสตร์ที่พิสูจน์ได้จริง
ระบบใช้การคำนวณจริงตามมาตรฐานของ Bitcoin Core
เราเริ่มต้นจาก Seed Phrase (ชุดคำภาษาอังกฤษ) แล้วแปลงมันเป็น Master Seed ซึ่งเป็นตัวเลขฐานสิบหกยาว 128 ตัวอักษร (64 Bytes / 512 bits)
เปรียบได้กับการ นำรหัสลับของคุณไปใส่ในเครื่องผสม (PBKDF2) วนซ้ำ 2,048 รอบ เพื่อให้ผลลัพธ์ซับซ้อนเกินกว่าจะถอดรหัสกลับได้
PBKDF2 ย่อมาจาก Password-Based Key Derivation Function 2 — ทำหน้าที่ปั่นข้อความ Mnemonic เพื่อสร้าง Master Seed โดยมีการ ถ่วงเวลา (Key Stretching) 2,048 รอบ เพื่อป้องกันการ Brute Force
"mnemonic" ต่อด้วย Passphrase ของคุณ (ถ้ามี)บทบาทของ Passphrase (คำลับเสริม):
ในมาตรฐาน BIP-39 ระบบใช้คำว่า "mnemonic" เป็น Salt ตั้งต้น แต่ถ้าคุณเพิ่ม Passphrase เข้ามา ระบบจะต่อท้ายเป็น "mnemonicYourPassword" — แค่ตัวอักษรเดียวเปลี่ยนไป ผลลัพธ์ Master Seed จะเปลี่ยนไปเป็นคนละเรื่อง นี่คือเทคนิค "Hidden Wallet" ที่นักเก็บ Bitcoin ขั้นสูงใช้ซ่อนกระเป๋าหลัก
ลองรัน Python เพื่อพิสูจน์ (DIY Verify):
import hashlib, binascii
mnemonic = b""
salt = b"mnemonic"
seed = hashlib.pbkdf2_hmac('sha512', mnemonic, salt, 2048)
print("Master Seed:", binascii.hexlify(seed).decode())
คัดลอกโค้ดนี้ไปรันใน Python หรือ python.org/shell แล้วเปรียบเทียบผลลัพธ์กับค่าที่แสดงด้านบน — ต้องตรงกัน 100%
Master Seed (512 bits) ถูกป้อนเข้า HMAC-SHA512 อีกครั้ง แล้ว ผ่าครึ่งผลลัพธ์ ออกเป็นสองส่วน:
ทำไมต้องแยกเป็นสองส่วน?
เพราะ Bitcoin ใช้หลักการ การแยกอำนาจ (Separation of Powers):
ทำหน้าที่นำ Master Seed มาผ่าครึ่ง เพื่อแยก อำนาจในการสั่งจ่าย (Master Priv) ออกจาก สูตรสร้างกุญแจลูก (Chain Code)
"Bitcoin seed" — มาตรฐาน BIP-32 กำหนดไว้ลองรัน Python เพื่อพิสูจน์ (DIY Verify):
import hmac, hashlib, binascii
master_seed = bytes.fromhex("— กด Start Simulation ก่อน —")
key = b"Bitcoin seed"
result = hmac.new(key, master_seed, hashlib.sha512).digest()
print("Master Private Key:", binascii.hexlify(result[:32]).decode())
print("Chain Code: ", binascii.hexlify(result[32:]).decode())
คัดลอกโค้ดนี้ไปรันใน python.org/shell แล้วเปรียบเทียบผลลัพธ์กับค่าที่แสดงด้านบน — ต้องตรงกัน 100%
จาก Master Key เดียว เราสามารถ แตกกุญแจลูกได้ไม่จำกัด ตามโครงสร้างที่กำหนดไว้ใน Derivation Path
แต่ละที่อยู่บิตคอยน์ที่คุณแชร์ให้ใครโอนเงินมา คือ ผลลัพธ์ปลายสายของการคำนวณตามเส้นทางนี้ — ทุกอย่างเชื่อมโยงกันหมดโดยไม่ต้องบันทึก
โครงสร้าง Derivation Path — อ่านค่าตัวเลขด้านล่างได้เลย:
ประเภทที่อยู่บิตคอยน์ — เปรียบเทียบ:
🔐 Elliptic Curve (secp256k1) คืออะไร?
เป็นสมการทางคณิตศาสตร์บนเส้นโค้งวงรี: y² = x³ + 7 (mod p)
การ "คูณ" Private Key กับ Generator Point G บนเส้นโค้งนี้ ให้ Public Key — ทำได้ทางเดียว ย้อนกลับไม่ได้ เพราะต้องแก้ ECDLP (Elliptic Curve Discrete Logarithm Problem) ซึ่งใช้เวลาเป็นพันล้านปีแม้กับ Quantum Computer ในยุคนี้
Child Private Key — ทำไมคำนวณตรงๆ ไม่ได้?
# Child Private Key = — กด Start ก่อน —
#
# ค่านี้ได้จากการ derive แบบซ้อนกัน 5 ชั้น:
# m → 84' → 0' → 0' → 0 → 0
# แต่ละชั้นใช้ HMAC-SHA512 กับ key และ chain code ของชั้นก่อนหน้า
# ไม่สามารถคำนวณตรงด้วย stdlib ได้ เพราะต้องทำ 5 รอบต่อเนื่อง
#
# วิธี Verify อิสระ: ใช้เว็บ https://iancoleman.io/bip39/
# → ใส่ Mnemonic → เลือก BIP84 → ดู Derived Addresses
# → Child Private Key ของ index 0 ต้องตรงกัน ✓
iancoleman.io ใช้งาน Offline ได้ — ควร Download และรันบนเครื่องตัวเองเพื่อความปลอดภัย
พิสูจน์ Public Key จาก Child Private Key (ไม่ต้องติดตั้ง library):
import hashlib
# Child Private Key จาก Simulator (ใส่ค่าจริง)
priv_hex = "— กด Start ก่อน —"
# secp256k1 parameters
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
Gx= 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
Gy= 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
def point_add(P, Q):
if P is None: return Q
if Q is None: return P
if P[0] == Q[0] and P[1] != Q[1]: return None
if P == Q:
lam = (3*P[0]*P[0] * pow(2*P[1], p-2, p)) % p
else:
lam = ((Q[1]-P[1]) * pow(Q[0]-P[0], p-2, p)) % p
x = (lam*lam - P[0] - Q[0]) % p
y = (lam*(P[0]-x) - P[1]) % p
return (x, y)
def scalar_mult(k, P):
R, Q = None, P
while k:
if k & 1: R = point_add(R, Q)
Q = point_add(Q, Q)
k >>= 1
return R
k = int(priv_hex, 16)
pub = scalar_mult(k, (Gx, Gy))
prefix = '02' if pub[1] % 2 == 0 else '03'
pub_hex = prefix + format(pub[0], '064x')
print("Public Key:", pub_hex)
# ต้องตรงกับที่แสดงในหน้า Simulator ✓
รันบน python.org/shell — ใช้แค่ stdlib ไม่ต้องติดตั้งอะไร
พิสูจน์ Bitcoin Address จาก Public Key (ไม่ต้องติดตั้ง library):
import hashlib
pub_hex = "— กด Start ก่อน —"
pub_bytes = bytes.fromhex(pub_hex)
# Hash160 = SHA256 → RIPEMD160
h160 = hashlib.new('ripemd160', hashlib.sha256(pub_bytes).digest()).digest()
# Bech32 encode (Native SegWit bc1q) — ไม่ต้องติดตั้ง library
CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
def bech32_polymod(values):
GEN = [0x3b6a57b2,0x26508e6d,0x1ea119fa,0x3d4233dd,0x2a1462b3]
chk = 1
for v in values:
b = chk >> 25
chk = (chk & 0x1ffffff) << 5 ^ v
for i in range(5): chk ^= GEN[i] if ((b >> i) & 1) else 0
return chk
def convertbits(data, frombits, tobits):
acc,bits,ret = 0,0,[]
for v in data:
acc = ((acc << frombits) | v) & 0xfff
bits += frombits
while bits >= tobits:
bits -= tobits
ret.append((acc >> bits) & ((1 << tobits)-1))
return ret
def bech32_encode(hrp, data):
combined = data + [0,0,0,0,0,0]
polymod = bech32_polymod([ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp] + combined) ^ 1
return hrp + '1' + ''.join([CHARSET[d] for d in data]) + ''.join([CHARSET[(polymod >> (5*(5-i))) & 31] for i in range(6)])
witness = [0] + convertbits(h160, 8, 5)
address = bech32_encode('bc', witness)
print("Bitcoin Address:", address)
# ต้องตรงกับที่แสดงในหน้า Simulator ✓
รันบน python.org/shell — ใช้แค่ stdlib ไม่ต้องติดตั้งอะไร ใช้ได้กับ Native SegWit (bc1q) เท่านั้น