BIP44 Multi-Account Hierarchy for Deterministic Wallets

ก่อนนี้ได้เล่าไปแล้ว ว่าการสร้างกระเป๋าให้เป็นลำดับขั้น หรือการสร้างกระเป๋าจำนวนมากแบบ running number นั้น ต้องใช้งาน BIP44 เป็นตัวอ้างอิง โดยจะมี Derivation path มาเป็นตัวกำกับ ดังที่แสดงให้เห็นเป็นต้วอย่างใน BIP32 Hierarchical Deterministic Wallets โครงสร้างของ Wallet

ก่อนเล่า BIP44 ขอพาด BIP43 นิดเดียว

หลังจากที่เราสร้าง master key ขึ้นมาจาก BIP32 แล้ว และกำลังจะเริ่ม implement Deterministic Wallet นั้น BIP43 ก็สร้างขึ้นมา เพื่อใช้อธิบายชั้นแรก ของ derivation path ซึ่งจะเรียกมันว่า ‘purpose’ เพื่อเป็นการกำหนดมาตรฐานการใช้งานร่วมกัน และความเข้ากันได้เวลาใช้งานในระบบต่างๆ (เพราะจริงๆ derivation path มันเป็นเพียงตัวเลข เลยต้องกำหนดนิยามของเลขแต่ละชั้นขึ้นมา เพื่อให้เข้าใจ และเลือกใช้งานกันได้อย่างถูกต้อง)

โดย first level นี้ จะใช้เพื่ออธิบายว่ากำลังทำงานอยู่บน ‘purpose’ อะไร และไม่ควรใช้เลขเดียวกับ BIP ต่างๆ เพราะ BIP จองไว้ใช้งานแล้วนั่นเอง รวมทั้ง 10001 to 19999 ก็ reserve สำหรับ SLIP ด้วยเช่นกัน 

BIP44 บอกอะไรเรา

BIP44 เป็น Standard ที่อธิบาย derivation path หรือ ลำดับชั้น และ ความหมายของตัวเลขกระเป๋าในแต่ละลำดับ ซึ่งจะมีทั้งหมด 5 ชั้นด้วยกัน ตามที่เราใช้งานกันใน BIP32 ที่อธิบายไปก่อนแล้ว จะประกอบไปด้วย 

m / purpose’ / coin_type’ / account’ / change / address_index

โดย ‘ หมายถึง hardened ที่อธิบายเอาไว้ใน BIP32 ซึ่งเราจะสามารถอธิบายได้ละเอียด ดังนี้ครับ

Purpose

ตอนนี้เรากำลังพูดถึง BIP44 ดังนั้นค่านี้ที่ได้อธิบายเอาไว้ใน BIP43 ก็จะเป็นตัวเลข 44 ( 0x8000002C ) นี่แหล่ะ 

โดยค่านี้เป็น hardened

Coin type

โดยปกติแล้ว seed (master key) นั้น จะสามารถใช้กับ blockchain network ใดก็ได้ อิสระต่อกัน เช่น bitcoin, eth, litecoin ETH ดังนั้น ค่านี้ ก็ถูกสร้างขึ้นมา เพื่อให้มันแยก wallet ออกจากกันได้อย่างชัดเจน เพื่อป้องกันความสับสน ว่าเป็นกระเป๋าที่กำลังทำงานกับ chain ใดกันแน่ และยังทำให้ address แยกออกจากกัน อันจะเป็นการเพิ่ม privacy ได้อีกทางหนึ่งด้วย 

โดยการเอาไปใช้งาน ก็จะเป็นค่าคงที่ ที่อ้างอิงกับ blockchain network นั้นๆ ซึ่งจะต้องมีการ register กันเอาไว้ก่อนแล้ว ตาม SLIP-0044 : Registered coin types for BIP-0044 ส่วน blockchain network อื่นที่ยังไม่ได้ register นั้น ก็สามารถใช้เลขอื่นได้ตามอิสระ ตราบใดที่ไม่ทับซ้อนกับ SLIP44 ครับ

โดยค่านี้เป็น hardened

Account

ขยายความเพิ่มอีกครั้ง โดยหน้าที่ Account นี้มีเพื่อการแยก identity ของ user ออกจากกัน หรือว่า สามารถใช้เพื่อแยกแยะกลุ่มงาน หรือ ส่วนงานออกจากกันก็ได้ เช่น ใช้เพื่อแบ่งแผนกในบริษัท , ใช้เพื่อแบ่งหน้าที่ กล่าวคือ กลุ่มรับเงินบริจาค หรือ กลุ่มเพื่อเป็นการเก็บออม เป็นต้น อันนี้ เราสามารถนิยามลงไปได้เองเลย โดยจะเริ่มตั้งแต่เลข 0 ไล่ไปทีละ 1 ไปเรื่อยๆ 

และเลขนี้จะถูกใช้เป็น child index ที่ต้องป้อนให้ BIP32 นั่นแหล่ะ เค้ามีข้อแนะนำว่า เราไม่ควรสร้าง account ลำดับใหม่ หากลำดับก่อนหน้ายังไม่ได้ถูกใช้งาน และเราควรมีส่วนที่สามารถทำ “Account discovery” ได้ด้วย หมายถึงระบบการทำงานที่ เรียก account ทั้งหมดที่เคยใช้งานกลับขึ้นมาได้ หลังจากการ import seed เข้าไปแล้ว

โดยค่านี้จะเป็น hardened

Change

อันนี้ง่ายเลย ก็คือเป็นค่า 0 เมื่อเป็น external chain (public chain) และเป็น 1 สำหรับ internal chain (private chain) หรืออีกชื่อที่เค้าเรียกกันก็คือ กระเป๋ารับเงินทอน (change addresses) ซึ่งถ้าคนที่มีกระเป๋า bitcoin และเคยใช้งาน transaction บน bitcoin จะเข้าใจว่าระบบจะสร้าง change address ขึ้นมาอัตโนมัติจากการทำงานของ UTXO 

หรือในอีกความหมายก็คือ 0 เมื่อ เราต้องใช้ address นี้ไปแสดงต่อสาธารณะได้ และ 1 สำหรับการปกปิดไม่แสดงต่อสาธารณะ เพียงใช้เพื่อรับเงินทอนเท่านั้น

โดยค่านี้เป็น public derivation 

Index

ก็เป็นตัวเลขที่บอกลำดับของกระเป๋า โดยใบแรกจะเริ่มที่ 0 แล้วก็ไล่เพิ่มทีละ 1 ไปเรื่อยๆเลย อันนี้ก็คือ child index ที่อธิบายไปใน BIP32 แล้วนั่นเอง

โดยค่านี้เป็น public derivation

Account discovery

เป็นกระบวนการที่บอกว่า หลังจากที่ user import master seed เข้ามาแล้ว ระบบควรจะฉลาดมากพอที่จะทำการค้นหาได้ว่า กระเป๋าใดบ้าง ที่เคยถูกใช้งานไปแล้ว โดยมีขั้นตอนตามนี้

  1. เริ่มต้นที่ Index = 0
  2. กำหนด Change = 0 เพื่อระบุว่าค้นหาจาก external chain 
  3. Scan กระเป๋าใน external chain โดยกำหนด gap limit เอาไว้ (อธิบายด้านล่างอีกที)
  4. ถ้าไม่มี transaction เลยในกระเป๋า จนไปถึง gap limit ก็ให้หยุดค้นหา
  5. ถ้ามีพบ transaction ก็ขยาย gap limit แล้วเพิ่ม account index แล้วเริ่มทำ step 1 ใหม่อีกรอบ

โดยกระบวนการค้นหานี้จะ work ถ้าเราไม่ใช้กระเป๋าแบบกระโดดไปกระโดดมา โดยกระบวนการนี้จะดูจาก transaction เท่านั้น ไม่ได้ดูจาก balance คงเหลือ ก็คือแม้ว่า coin = 0 แต่เคยมี transaction ก็ถือได้ว่าเคยถูกใช้งานแล้วนั่นเอง

กระบวนการค้นหาทำที่ external chain ก็เป็นเพราะว่ามันเป็นกระเป๋าที่จะได้รับโอนมาจากคนอื่นอันเป็นข้อมูล public นั่นเอง

Address gap limit

ตอนนี้กำหนดค่าเอาไว้ที่ 20 ถ้าค้นแล้วไม่พบ transaction 20 กระเป๋าต่อเนื่องกัน ก็จะถือว่าไม่มีกระเป๋าที่ถูกใช้งานต่อจากนั้นแล้ว ก็หยุดค้นหากระเป๋าใหม่ได้

Coint type

ตัวอย่างการกำหนด Derivation path ตาม use case ต่างๆ

สร้างกระเป๋าได้จำนวนเท่าไร

ถ้าเรารัน index อย่างเดียว เพื่อสร้างกระเป๋าในแบบประเภทเดียวกันเท่านั้น (หมายความว่า สร้างจาก seed word เดียวกัน โดยใช้ m / purpose / coin type / account / change เดียวกัน เปลี่ยนแค่เลข index สุดท้ายเท่านั้น) เราจะสามารถสร้างได้ 231 หรือ 2,147,483,648 กระเป๋าครับ เรียกได้ว่าเหลือเฟือสุดๆเลยล่ะ

Leave a Reply