เทคโนโลยี, โพสต์บนบล็อก | เดือน/วัน/ปี
เข้าใจ Address ของคริปโต และ Derivation Path ในแอป Ledger Live
เมื่อคุณซื้อ Ledger Nano และใช้งานเป็นครั้งแรก ระบบจะขอให้คุณเลือกว่าจะนำเข้า Seed Phrase เดิมที่มีอยู่แล้ว หรือสร้างขึ้นมาใหม่โดยใช้การสุ่มโดยอัตโนมัติ ในบล็อกโพสต์นี้ เราจะมาอธิบายว่า Ledger สร้าง Address จาก Seed Phrase อย่างไรสำหรับสินทรัพย์คริปโตของคุณ
สรุปสาระสำคัญ: |
– Seed, Address และคีย์ – BIP32, BIP39 และ BIP44 – UTXO Model และ Account Model – LedgerJS |
HD Wallet – ใช้ Seed เดียวในการสร้างคีย์แบบลำดับชั้น
Address ของสินทรัพย์คริปโตจะเชื่อมโยงกับสคริปต์ ซึ่งระบุชุดเงื่อนไขในการใช้จ่าย เพื่อที่จะใช้คริปโตจากบัญชี เราจำเป็นต้องส่งธุรกรรมที่ตรงตามเงื่อนไขการใช้จ่ายเหล่านั้น ซึ่งกระบวนการนี้ต้องใช้ลายเซ็นจากอุปกรณ์ Ledger Nano
HD Wallet (Hierarchical Deterministic Wallet) ถูกเสนอขึ้นในชุมชนบิตคอยน์ราวปี 2013 ภายใต้ชื่อ BIP32 (Bitcoin Improvement Protocol) ข้อเสนอนี้แนะนำอัลกอริทึมสำหรับสร้างชุดกุญแจหลัก (Master Pair) ซึ่งประกอบด้วย Private Key และ Public Key แล้วใช้ Private Key นี้ในการสร้าง Address ที่ย่อยลงไปอีก (Children Address) อย่างไม่จำกัดจำนวน แต่ละ Address ย่อยก็จะประกอบด้วยชุด Private Key และ Public Key ที่สามารถสร้างชุด Address ที่ย่อยลงไปอีกตามลำดับ (Grandchildren)

คีย์แบบลำดับชั้น
ในโครงสร้างแบบลำดับชั้นข้างต้น ที่อยู่ลูก (Children Address) จะถูกสร้างขึ้นจากที่อยู่แม่โดยตรง (Ancestor) แต่จะไม่สามารถย้อนกลับไปที่อยู่แม่ได้ ซึ่งระบบนี้ได้รับการปกป้องด้วยการเข้ารหัสลับ นั่นคือเหตุผลที่ข้อเสนอของ HD Wallet ช่วยให้การจัดการคีย์ง่ายขึ้นอย่างมาก เพราะผู้ใช้วอลเล็ตต้องดูแลเพียง Seed เดียวเท่านั้น
BIP39 & BIP44 – Mnemonic และ Derivation Path
นอกจาก BIP32 แล้ว แอป Ledger Live ยังประกอบด้วยมาตรฐาน BIP39 และ BIP44
BIP39
BIP39 เป็นข้อเสนอที่กำหนดอัลกอริทึมสำหรับการแทน Master Private Key ขนาด 128 หรือ 256 บิต พร้อม Checksum ให้อยู่ในรูปแบบของคำ 12 หรือ 24 คำ ชุดคำนี้เรียกว่า Mnemonic หรือ Seed ผู้ใช้ Ledger จะต้องนำเข้าหรือสร้าง Mnemonic นี้ก่อนเริ่มใช้งาน Ledger Nano

การสร้าง Seed บน Ledger Nano
Address ของ Ledger ทั้งหมด รวมถึงคีย์ต่า ๆ จะถูกสร้างโดยใช้ Seed นี้ และจัดการในรูปแบบโครงสร้างแบบ “Tree of Key" ข้อเสนอ BIP44 กำหนดมาตรฐานสำหรับโครงสร้างการจัดการคีย์และ Address แบบลำดับชั้นนี้ มาตรฐานนี้ถูกใช้โดยแอป Ledger Live
Derivation Path มีหน้าตาดังนี้
m / purpose' / coin_type' / account' / change / address_index
โครงสร้างลำดับชั้นของ HD Wallet ที่มี 5 ระดับ ในพาธ BIP32 นี้เป็นกรณีพิเศษ Derivation Path เช่นนี้จะทำหน้าที่กำหนดตำแหน่งของแต่ละโหนดในโครงสร้างลำดับชั้นของคีย์ทั้งหมด
เครื่องหมายอัญประกาศที่อยู่ในพาธหมายความว่าคีย์นั้นถูกสร้างขึ้นด้วยวิธีที่เรียกว่า Hardened Derivation ตามมาตรฐาน BIP32 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอัลกอริทึม Derivation และ Hardened Derivation โปรดดู BIP32
BIP44
ข้อเสนอ BIP44 มีต้นกำเนิดจากชุมชนบิตคอยน์ แต่ปัจจุบันถูกนำไปใช้ในระบบนิเวศของบล็อกเชนอื่น ๆ อีกมากมาย
แต่ละระดับใน Derivation Path มีความหมายพิเศษเฉพาะ เช่น:
m / purpose' / coin_type' / account' / change / address_index
purpose
44 สำหรับบัญชี Bitcoin แบบดั้งเดิมและระบบนิเวศบล็อกเชนอื่น ๆ ที่ใช้มาตรฐาน BIP44, 49 สำหรับ SegWit, 84 สำหรับ Native SegWit และ 86 สำหรับ Bitcoin Taprootcoin_type
: สำหรับประเภทเหรียญที่ลงทะเบียนสำหรับ BIP44 ดูที่ SLIP44 คริปโตแต่ละสกุลจะมีค่าของตัวเอง ช่องข้อมูลนี้ช่วยให้บัญชีจากบล็อกเชนต่าง ๆ สามารถใช้โครงสร้างลำดับชั้นของคีย์ที่ต่างกันและเป็นอิสระต่อกันอย่างสิ้นเชิงได้ สิ่งนี้จะช่วยรับประกันความเป็นส่วนตัวและหลีกเลี่ยงการนำคีย์เดียวกันมาใช้ซ้ำ ซึ่งอาจทำให้ข้อมูลรั่วไหลได้account
: ดัชนีบัญชีของคริปโตเดียวกันในแอป Ledger Live- บัญชี Bitcoin ที่ 1:
account
= 0 - บัญชี Bitcoin ที่ 2:
account
= 1 - บัญชี Bitcoin ที่ 3:
account
= 2 - …
- บัญชี Bitcoin ที่ 1:
change
: 0 สำหรับ Address ที่ใช้รับ และ 1 สำหรับ Change addressaddress_index
: ดัชนี Address แบบเพิ่มค่าทีละลำดับสำหรับบัญชี ใช้สำหรับกำหนดหมายเลขให้กับ Address ภายในบัญชีของสินทรัพย์คริปโตโมเดล UTXO รายละเอียดเพิ่มเติมในส่วนถัดไป
ในหน้าบัญชีของแอป Ledger Live เราสามารถดู Derivation Path ในลักษณะนี้ได้โดยคลิกที่แก้ไขบัญชี -> ขั้นสูง -> freshAddressPath

Bitcoin – Derivation Path ในแอป Ledger Live
นี่คือfreshAddressPath
พาธ BIP44 เนื่องจาก HD Wallet ในระบบนิเวศของ Ledger ปฏิบัติตามมาตรฐาน BIP32 การใช้ Seed ร่วมกับพาธตามมาตรฐาน BIP44 จึงสามารถนำมาใช้สร้าง Public Key ได้ โดย Address ของสินทรัพย์คริปโตจะถูกจัดให้อยู่ในรูปแบบที่ต่างออกไปเท่านั้น Fresh Address Path ตามมาตรฐาน BIP44 นี้จะตรงกับ Address ที่แสดงในกระบวนการรับ (Receive Flow) ของบัญชีเดียวกันในแอป Ledger Live:

กระบวนการรับในแอป Ledger Live
– UTXO Model และ Account Model
UTXO Model
สกุลเงินคริปโตที่รองรับโดยแอป Ledger Live (bitcoin, bitcoinCash, bitcoinGold, dash, digibyte, dogecoin, komodo, litecoin, peercoin, pivx, qtum, vertcoin, viacoin, zcash, zencash, decred) ใช้โมเดล UTXO (Unspent Transaction Output)
UTXO คือหน่วยแยกของสินทรัพย์คริปโต โดยจะแสดจำนวนของสกุลเงินดิจิทัลที่ผูกอยู่กับ Address บางส่วน เพื่อปกป้องความเป็นส่วนตัว บัญชี Bitcoin จะสร้าง Fresh Address ให้แก่ผู้ส่งทุกครั้งที่มีการรับธุรกรรม Fresh Address คือที่อยู่ใหม่ที่ยังไม่มีประวัติธุรกรรม ซึ่งทำให้ไม่สามารถติดตามธุรกรรมที่ผ่านมาทั้งหมดของบัญชีได้จากธุรกรรมหรือ Address ใด (ที่พบใน Crypto Explorer) ได้
Change Address ใช้กลไกที่คล้ายกับ Fresh Address เนื่องจากไม่สามารถใช้บางส่วนของ UTXO ได้โดยตรง UTXO ใหม่วอลเล็ตของผู้ส่งจึงเลือกชุดของ UTXO ที่มีมูลค่ารวมอย่างน้อยเท่ากับจำนวนที่ต้องการส่ง (รวมค่าธรรมเนียมเครือข่ายที่จำเป็น) และส่งเงินส่วนที่เหลือกลับไปยังผู้ส่งในรูปแบบของ UTXO ใหม่. UTXO นี้จะถูกส่งกลับไปหาผู้ส่งโดยใช้ Change Address ใหม่ทุกครั้ง

Change Address ในธุรกรรม Bitcoin
เช่น สำหรับบัญชี Bitcoin Taproot บัญชีแรกในแอป Ledger Live ผู้ใช้จะได้รับ:
- ธุรกรรมครั้งที่ 1 ด้วย Fresh Address จาก Derivation Path
m/86’/0’/0’/0/0
- ธุรกรรมครั้งที่ 2 ด้วย Fresh Address จาก Derivation Path
m/86’/0’/0’/0/1
- ธุรกรรมครั้งที่ 3 ด้วย Fresh Address จาก Derivation Path
m/86’/0’/0’/0/2
เมื่อเจ้าของบัญชีส่ง Bitcoin จากบัญชีนี้ จะได้รับเงินทอน ณ Address ที่มี Derivation Path m/86’/0’/0’/1/0
จากนั้น m/86’/0’/0’/1/1
และต่อด้วย m/86’/0’/0’/1/2
เป็นต้น
Account Model
คริปโตส่วนใหญ่ที่รองรับในแอป Ledger Live (Ethereum, Solana, Cosmos, Polkadot, Tron…) จะใช้ Account Model
ซึ่งแตกต่างจาก UTXO Model ตรงที่สินทรัพย์คริปโตที่ใช้ Account Model จะมีเพียง Address เดียวในแต่ละบัญชี และไม่ว่าใครก็สามารถใช้ Address นั้นบน Blockchain Explorer เพื่อติดตามประวัติธุรกรรมทั้งหมดของบัญชีได้ ดังนั้น เพื่อปกป้องความเป็นส่วนตัว ผู้ใช้ควรระมัดระวังเป็นพิเศษในการแยกบัญชีสาธารณะออกจากบัญชีส่วนตัวที่ไม่เชื่อมโยงกับตัวตนของตนเอง สินทรัพย์คริปโตชนิดนี้จะไม่มี Change Address
ดังนั้น ใน Derivation Path ของ BIP44 ตัวเลขสองลำดับสุดท้ายมักจะเป็นเลข “0”
m / purpose' / coin_type' / account' / 0 / 0
Derivation Path ของบัญชี Ethereum ในแอป Ledger Live มีลักษณะดังนี้

Ethereum – Derivation Path ในธุรกรรม Ledger Live
LedgerJS – รับ Address จากอุปกรณ์ Ledger
LedgerJS คือชุดไลบรารี JavaScript ที่ให้ API ระดับสูงสำหรับใช้สื่อสารกับอุปกรณ์ Ledger ไลบรารีนี้ถูกใช้โดยแอป Ledger Live และแอปภายนอกอื่น ๆ ที่ต้องการเชื่อมต่อกับอุปกรณ์ Ledger เพราะไลบรารีเหล่านี้ นักพัฒนาจึงสามารถสื่อสารกับอุปกรณ์ Ledger ได้ โดยไม่ต้องจัดการกับโพรโทคอลระดับล่างด้วยตนเอง
หนึ่งใน API ที่ LedgerJS มีให้ใช้งานคือ getAddress
สำหรับสินทรัพย์คริปโตที่ใช้ Account Model เช่น Ethereum การดึง Address จากอุปกรณ์ Ledger ด้วย Derivation Path 44'/60'/0'/0/0
จะทำได้ง่ายแค่ไหน? นี่คือโค้ด Javascript:
import Eth from "@ledgerhq/hw-app-eth";
import eip55 from "eip55";
const eth = new Eth(transport);
const r = await eth.getAddress("44'/60'/0'/0/0");
const address = eip55.encode(r.address);
สำหรับสินทรัพย์คริปโตที่ใช้ UTXO Model เช่น Bitcoin อาจมีความซับซ้อนกว่าเล็กน้อย:
import Btc from "@ledgerhq/hw-app-btc";
const btc = new Btc(transport);
const xpub = await btc.getWalletXpub({ path: "84'/0'/0'", xpubVersion });
เราขอแนะนำสองแนวคิดในที่นี้ ได้แก่ xpubVersion
และ xpub
:
xpub
ย่อมาจาก “Extended Public Key”และเป็นรูปแบบหนึ่งของการแปลงค่าจาก Public Key ของโหนดใน Derivation Tree xpub ช่วยให้สามารถเข้าถึง Public Key และ Address ของโหนดย่อยในโครงสร้างต้นไม้ตาม BIP32 ได้ ในโค้ดตัวอย่างข้างต้น84’/0’/0’
หมายถึง สามระดับแรกของ Derivation Path BIP44 (purpose = 84, coin_type = 0, account = 0)xpub
จะสอดคล้องกับโหนดนี้ ดังนั้นเราจึงดึงxpub
จาก API ของ LedgerJSxpubVersion
เป็นพารามิเตอร์ของ BIP32 ขนาด 4 ไบต์ ซึ่งจะแตกต่างกันไปตามสินทรัพย์คริปโตและเครือข่าย
เช่น สำหรับ Bitcoin Mainnet, xpubVersion
= 0x0488b21e
สำหรับ Bitcoin Testnet, xpubVersion
= 0x043587cf
สำหรับ Dogecoin, xpubVersion
= 0x02facafd
ในแอป Ledger Live บัญชีแต่ละบัญชีจะมี xpub
เฉพาะ ซึ่งสามารถดูได้ในหน้าแก้ไขบัญชี

xpub ในแอป Ledger Live
แอป Ledger Live สร้าง Address ทั้งหมดของบัญชีจาก xpub
ของตัวเอง
customGetAddress(
derivationMode: string,
xpub: string,
account: number,
index: number
): Promise<string>;
สำหรับสินทรัพย์คริปโตที่ใช้ UTXO Model เช่น Bitcoin สินทรัพย์แต่ละตัวจะมีการใช้งาน Method Interface นี้
- พารามิเตอร์
derivationMode
parameter จะต้องเป็นหนึ่งใน 4 ค่าที่รองรับ ได้แก่ “Legacy”, “SegWit”, “Native SegWit” หรือ “Taproot” - พารามิเตอร์
account
จะตรงกับระดับที่ 4 ของ Derivation Path จาก BIP44 - พารามิเตอร์
index
จะตรงกับระดับที่ 5
เช่น สำหรับพาธ BIP44 84'/0'/1'/3/9
, account
=3 และ index
= 9 ฟังก์ชันนี้จะส่งคืน Address ของคริปโตที่แอป Ledger Live และบล็อกเชนใช้ในรูปแบบสตริง
เพื่อปกป้องความเป็นส่วนตัว Ledger จึงขอให้ผู้ใช้อย่าเปิดเผย xpub
เพราะใคร ๆ ก็สามารถติดตามดูประวัติธุรกรรมย้อนหลังและในอนาคตของบัญชีได้ด้วย xpub
ของคุณ
บทสรุป
Ledger ไม่ได้เป็นเพียงผู้พัฒนาซอฟต์แวร์เท่านั้น แต่ยังเป็นผู้สร้างระบบนิเวศด้วย ในฐานะนักพัฒนาที่ Ledger เรามุ่งมั่นปรับปรุงแอป Ledger Live ตามมาตรฐานใหม่ ๆ จากชุมชนนักพัฒนาบล็อกเชนอยู่เสมอ นอกจากนี้ เรายังมีไลบรารีอย่าง LedgerJS เพื่อให้นักพัฒนาทั่วโลกสามารถผสานรวมผลิตภัณฑ์ของ Ledger เข้ากับเว็บไซต์ แอปมือถือ หรือ DApp ได้อย่างง่ายดาย ดูเอกสารเพิ่มเติมได้ใน https://developers.ledger.com/
ยินดีต้อนรับสู่ระบบนิเวศของเรา!
อ้างอิง
