Create Seed
Picture of Gracialo679

Gracialo679

การสร้างชุด Seed ด้วยตนเอง

Seed 24 คำ ในระบบบิตคอยน์ แท้จริงแล้ว มันคืออะไรกันแน่? ในเมื่อเรามีอุปกรณ์ที่สามารถสร้าง Seed ได้อย่างง่ายดายกันอยู่แล้ว ทำไมเรายังต้องรู้วิธีการสร้าง Seed ด้วยตัวเองอีกล่ะ ? บทความนี้จะพาคุณไปเรียนรู้วิธีสร้าง Seed ด้วยตัวเองกันครับ

Seed จำนวน 24 คำ (หรือ 12 คำ, 128 bit ก็ตาม) ที่หลายคนมักจะบอกว่าเป็นส่วนที่สำคัญที่สุดในการสร้างกระเป๋ารับเงินในระบบบิตคอยน์ พร้อมคำเตือนว่าสิ่งนี้ห้ามทำการถ่ายรูป และห้ามบันทึกวีดีโอ

 

คำแนะนำ คือ ควรอยู่ในห้องเปล่าๆ ที่ไม่มีกล้องทั้งกล้องวงจรปิดหรือกล้องจากอุปกรณ์อิเล็คทรอนิคใดๆ แล้วจดลงกระดาษ หรือตอกลงแผ่นเหล็ก จากนั้นนำไปเก็บไว้ในที่ปลอดภัยให้เหมือนกับเรากำลังเก็บทองคำแท่งอยู่ 

 

คำเหล่านี้ที่เรารู้จักกันในอีกชื่อหนึ่งว่า mnemonic phrase” เป็นกลุ่มคำ 24 ตัว ที่ใช้เพื่อให้เราจดจำรหัส เพื่อใช้สำหรับปลดล็อคเงินในระบบบิตคอยน์ 

 

คำเหล่านี้แท้จริงแล้ว มันเป็นเพียงชุดคำที่ใช้แทนตัวเลข 0 กับ 1 ที่เรียงกัน 256 ตัว (เนื่องจากมนุษย์เราจะจำ “ชุดคำ” ได้ง่ายกว่าตัวเลข 0 กับ 1 ที่เรียงกันถึง 256 จริงไหมครับ ?)

 

คำ 24 คำที่เราเห็นด้านล่างนี้..

“two clay pact much survey hair entry seat roast powder flight elephant sock defy envelope ship attack minute muffin sibling two library benefit nurse”

แท้จริงแล้ว มันก็คือ..

11101011101 00101010001 10011110101 10010001000 11011010101 01101000010 01001011101 11000010010 10111011000 10101001001 01011000111 01000111110 11001110000 00111001101 01001011110 11000110000 00001110011 10001101010 10010001001 11000111101 11101011101 10000001000 00010101001 100”

มันเป็นเทคนิคในการเปลี่ยน ตัวเลข 0 กับ 1 ที่เรียงกัน 256 ตำแหน่ง ไปเป็นคำ 24 คำ เพื่อให้ง่ายต่อการจดจำนั่นเอง

ในเมื่อเรามีอุปกรณ์ที่สามารถสร้าง Seed ได้อย่างง่ายดายแล้ว ทำไมเรายังต้องรู้วิธีการสร้าง Seed ด้วยตัวเองอีกล่ะ ?

ในโลกของบิตคอยน์นั้น เป็นโลกที่เราไม่จำเป็นต้องเชื่อใจใคร ไม่เว้นแม้กระทั่งการสร้าง Seed ซึ่งโดยปกติแล้วเราสามารถสร้าง Seed โดยใช้ Hardware Wallet หรือ ใช้ Application ในมือถือก็ได้ แม้เราอาจจะเชื่อว่าผู้สร้าง Hardware Wallet นั้นมีประวัติอันน่าเชื่อถือ เป็นบริษัทเก่าแก่ที่อยู่มาหลายปี มีผู้คนรับรองและให้ความไว้เนื้อเชื่อใจ นอกจากนี้พวกเขาบางส่วนก็ได้เปิดเผยตัวโปรแกรมที่ใช้ทั้งหมดเอาไว้ รวมไปถึงการเผยทุกส่วนประกอบที่ใช้ในการผลิตแล้วก็ตาม

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

แต่.. เราจะเชื่อใจพวกเขาไปทำไมกันล่ะ!?

ในเมื่อเราสามารถเลือกที่จะไม่เชื่อใจใคร แล้วเลือกจะสร้างมันขึ้นมาด้วยตัวเองก็ได้

หากคุณไม่เชื่อใจให้ผู้ผลิต Hardware Wallet  มาสร้าง Seed ให้กับคุณ หรือมองว่าการสร้าง Seed แบบนั้นมันง่ายเกินไป.. หรือคุณอาจจะต้องการความท้าทาย 

งั้นมาลองสุ่มตัวเลขหา Seed เพื่อใช้งานกันเองดีกว่าครับ!

Generate seed

อุปกรณ์ที่ใช้ในการสุ่ม

1. เหรียญกษาปณ์ 11 เหรียญ
2. เครื่องคอมพิวเตอร์ที่มีโปรแกรมสำหรับการแปลง ตัวเลขฐาน และ Hash function

(โดยเครื่องคอมพิวเตอร์ดังกล่าวต้องทำงานแบบไม่เชื่อมต่อกับอินเตอร์เน็ต และต้องมั่นใจได้ว่าเครื่องคอมพิวเตอร์นี้จะไม่เก็บข้อมูลที่เกี่ยวกับขั้นตอนการสร้าง Seed ของเราไว้ หรือไม่เช่นนั้นเราควรจะต้องล้างหรือทำลายเครื่องคอมพิวเตอร์นั้นทิ้งหลังเสร็จสิ้นกระบวนการ เพื่อให้มั่นใจว่าข้อมูลนี้จะไม่มีทางหลุดออกไปสู่สาธารณะในอนาคต )

*แต่เพื่อความสะดวกในการสาธิต ทางผู้เขียนจะขอใช้ Converter online ซึ่งไม่ควรนำ Seed ที่ขาดความปลอดภัยอย่างนี้ไปใช้เก็บเงินเด็ดขาด!*

วิธีการสุ่ม

สมมติว่าผมจะหา Seed จำนวน 24 คำ

ก่อนอื่นเราต้องเข้าใจก่อนว่า.. ในทุกคำของ Seed ทั้ง 24 คำนี้ แต่ละคำจะประกอบไปด้วย ตัวเลขฐานสอง (Binary) จำนวน 11 ตำแหน่ง หรือก็คือ “เลข 0 และ 1” จำนวน 11 ตัว 

ซึ่ง ตัวเลขฐานสอง จำนวน 11 หลัก เมื่อเราเปลี่ยนไปเป็น เลขฐานสิบ (Decimal) จะมีความเป็นไปได้ทั้งหมดจำนวน 2048 ตัว 

จากนั้นเมื่อเรานำ ตัวเลขฐานสิบ แต่ละตัว มาแทนด้วย คำ 1 คำ ก็จะได้คำออกมาทั้งหมดจำนวน “2048 คำ” และนี่ก็เป็นที่มาของ BIP39 word list ว่าทำไมต้องมี 2048 คำนั่นเอง..

ซึ่งคุณสามารถไปหารายชื่อคำทั้ง 2048 คำ ทั้งหมดนี้ได้ที่นี่ https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

**แต่เราต้อง +1 เข้าไปด้วยถึงจะไปเทียบใน BIP39 word list ได้ เพราะปกติมนุษย์เราจะเริ่มที่นับ 1 (1-2048) แต่ Computer จะเริ่มที่นับ 0 (0-2047)**

BIP39 word list
ส่วนหนึ่งของคำใน BIP39 word list 2048 คำ ที่ความเป็นไปได้ทั้งหมด โดยเราสร้างตัวเลขนั้นจากเลขฐานสอง คือ 0 กับ 1 จำนวน 11 หลัก

ผมจะกำหนดวิธีการสุ่มหาคำเหล่านี้แบบง่ายๆ โดยใช้วิธีโยนเหรียญ ครั้งละ 11 เหรียญ เพื่อหา Seed 1 คำ 

    ผมจะแทน หัว=1 และ ก้อย=0 

โดยผมจะสร้างกฎการนับลำดับของผมขึ้นมาเอง โดยจะนับจากบนลงล่างก่อน แล้วค่อยนับจากซ้ายไปขวา นั่นหมายถึง.. ผมจะต้องโยนเหรียญ 11 เหรียญ เป็นจำนวนทั้งหมด 24 ครั้ง 

แต่จะมีความพิเศษตรงที่ “คำที่ 24” ซึ่งเป็นคำสุดท้ายที่เราจะโยน “แค่ 3 เหรียญ” แล้วเราจะใช้การคำนวนหาคำที่ 24 (ซึ่งผมจะพูดถึงวิธีหาคำที่ 24 เจ้าปัญหานี้อย่างละเอียดในท้ายบทความนี้นะ)

เอาล่ะ.. ผมจะลองสุ่มหาคำแรกให้ดูก่อนนะ  ผมโยนเหรียญ หัว/ก้อย แล้วเปลี่ยนเป็น ตัวเลขฐานสอง จำนวน 11 หลัก ได้ว่า  

    “00000001010” 

เมื่อผมแปลง ตัวเลขฐานสอง ชุดนี้ มาเป็น ตัวเลขฐานสิบ (Decimal) จะได้ค่าเท่ากับ 10 (**แต่เราต้อง +1 เข้าไปด้วยถึงจะไปเทียบในตารางได้นะ อย่าลืม!**)

    ดังนั้น 10+1 = 11 

เมื่อนำค่า 11 ไปเทียบกับตาราง BIP39 word list เราจะได้คำว่า “access” และคำที่เหลือ จากคำที่ 2 จนถึงคำที่ 23 ผมก็จะหาโดยใช้วิธีการเดียวกันนี้

Generate seed

เอาล่ะ! ผมโยนมาจนครบ 23 ครั้งแล้ว… เหลือแค่ “คำที่ 24” อีก 1 คำเท่านั้น!

**คุณอาจจะไม่ได้สุ่มตัวเลขฐานสองทั้ง 11 หลัก โดยการโยนเหรียญอย่างที่ผมแนะนำก็ได้นะครับ อาจจะใช้วิธีการโยนทีละเหรียญทั้ง 256 ครั้ง หรือ วิธีที่ประหลาดกว่านี้ก็ตามสะดวกนะ!**

คำที่ 24 (Checksum)

ในการหาคำสุดท้ายซึ่งเป็น “คำที่ 24” หรือที่เราเรียกอีกชื่อหนึ่งว่า “Checksum” จะมีความพิเศษต่างจาก 23 คำแรกที่เราสามารถใช้วิธีการโยนเหรียญสุ่มเอาแบบง่ายๆ แต่คำที่ 24 นี้เราจะใช้การโยนแค่ 3 เหรียญ เพื่อทำการสุ่มตัวเลขฐานสองจำนวน 3 หลัก แล้วเราจะนำมันไปรวมกับ ตัวเลขฐานสองอีก  8 ตำแหน่ง ซึ่งเราต้องใช้วิธีการคำนวณหา

สุดท้ายแล้ว.. เราจะมี ตัวเลข 3 ตัวที่เราได้จากการสุ่ม มารวมกับ อีก 8 ตัวที่เรากำลังจะทำการคำนวณ เมื่อนำมารวมกันแล้วก็จะครบ 11 หลักพอดี แล้วนำมันมาเปลี่ยนเป็น “คำที่ 24″  ใน  BIP39 word list ต่อไป

เห็นไหม.. มันไม่ได้ยากเกินไปเลยใช่ไหมครับ? 

วิธีการคำนวณ ขั้นแรก

เอาตัวเลขฐานสองทั้ง 256 ตำแหน่งที่เราสุ่มมาทั้งหมด นำตั้งแต่คำแรกมาเรียงต่อกันโดยไม่ต้องแปลงค่า (ผมได้สุ่มตัวเลข 3 ตัว ของ “คำที่ 24” จากการโยนเหรียญแล้วได้ค่าออกมาเป็น “010”  เราต้องรวมตัวเลข 3 ตัวนี้เข้าไปด้วยนะ)

(ตัวเลขฐานสิบ 23 คำแรก ซึ่ง 1 คำ จะได้เลขฐานสองจำนวน 11 หลัก (11 * 23 = 253 ) นำมารวมกับ คำที่ 24 อีกจำนวน 3 ตัว = 256 ตัวพอดี )

“0000000101010101001011000000000100000000001100000001111000000001010000000010000000000111000000100110000000100100000000110000000010111101111101100000001101000000011101000010110000000010000000000100010000001001000000000000010110000000000001010100000010110010

จากนั้นผมจะนำชุดตัวเลขฐานสองทั้งหมด 256 ตัว จากด้านบน มาแปลงเป็น ตัวเลขฐานสิบหก (Hexadecimal) ซึ่งจะได้ทั้งหมดจำนวน 64 ตัว [ Binary > Hexa (64) ] ดังนี้..

“1552C0100301E014020070260240300BDF60340742C020044090005800540B2”

Bi2Hex
รูปแสดงการแปลง เลขฐานสอง จำนวน 256 ตัวที่เราสุ่มได้ไปเป็น ตัวเลขฐานสิบหก

ขั้นที่สอง

นำเลขฐานสิบหกที่ได้จากขั้นตอนแรก ไปทำการ Hash ด้วย SHA256 โดยจากตัวเลขฐานสิบหกนี้

“1552C0100301E014020070260240300BDF60340742C020044090005800540B2”

เมื่อนำไปทำการ Hash ด้วย SHA256 (โดยเลือก input type เป็น Hex) จะได้ค่าออกมาเป็น..

“A6c77eaaa8bbc4251928a2d408e601082f3c42d5702289fd2d325d9459719bbc”

SHA256 Converter

ขั้นที่สาม

แปลงตัวเลขฐานสิบหกที่ได้จากการ Hash ด้วย SHA256 ให้กลับมาเป็น ตัวเลขฐานสอง (Hexadecimal > Binary) จาก..

“A6c77eaaa8bbc4251928a2d408e601082f3c42d5702289fd2d325d9459719bbc”

แปลงกลับเป็น ตัวเลขฐานสอง เราจะได้…

1010011011000111011111101010101010101000101110111100010000100101000110010010100010100010110101000000100011100110000000010000100000101111001111000100001011010101011100000010001010001001111111010010110100110010010111011001010001011001011100011001101110111100

สิ่งที่เราต้องการ คือ ตัวเลข 8 ตัวแรก เท่านั้น

จำได้ใหมครับ? ตัวเลข 3 ตัวสุดท้ายที่เราสุ่มได้ตั้งแต่ตอนต้น นั่นคือ “010” คราวนี้ก็นำตัวเลขฐานสอง (10100110) 8 หลักแรกที่เราพึ่งได้มาไปต่อท้ายได้เลยครับ 

    010 + first 8 bit = 01010100110 

ใกล้สำเร็จแล้วนะครับ.. ขั้นสุดท้ายแล้ว 🙂  นำตัวเลขฐานสอง 11 หลักที่ได้มา ไปแปลงเป็น ตัวเลขฐานสิบ (Binary > Decimal)

    ซึ่ง 01010100110  = 678

**อย่าลืมบวกหนึ่ง ด้วยล่ะ** ซึ่งเมื่อเทียบกับตาราง BIP39 word list จะได้คำที่ 679 = feel 

คำสุดท้ายที่เราตามหาได้มาแล้วครับ ก็คือคำว่า feel นั่นเอง.. เอามารวมกับอีก 23 คำแรกได้เลย ทีนี้ชุด Seed ทั้งหมดของเรา ก็คือ…

access practice able about acid absent above abstract act abuse absorb accident term accuse achieve machine acoustic acquire across abandon fix actor actress feel

เราสามารถนำทั้ง 24 คำที่ได้มานั้น มาทำการตรวจสอบความถูกต้องได้ใน HW wallet, Wallet app ทั้งหลาย ถ้าหากการคำนวณ Checksum ของเราถูกต้อง ก็จะสามารถ recovery seed เหล่านั้นได้

Checksum

แต่หากการคำนวณ Checksum ผิด Seed คำที่ 24 ก็จะผิดไปด้วย และเราจะไม่สามารถ recovery seed ได้

Bad Checksum

ดังนั้น “คำที่ 24” นี้มันไม่ได้มาแบบมั่วๆ นะครับ

เป็นอย่างไรกันบ้างครับ “การสร้าง Seed ด้วยตัวเอง” ไม่ใช่สิ่งที่ยากเกินไปเลยใช่ไหม? หากเพื่อนๆ ลองค่อยๆ อ่านทำความเข้าใจ แล้วลองพยายามทำตามทีละขั้นทีละตอน ผมเชื่อว่าทุกคนจะ “สร้าง Seed ด้วยตัวเอง” ได้อย่างแน่นอน

หากใครติดขัดในขั้นตอนไหน หรือมีข้อสงสัยประการใด สามารถทิ้งคำถามไว้ใต้บทความได้เลยครับ 🙂

Gracialo679

** ทุกบาทหรือทุกซาโตชิที่ donate จะถูกส่งเข้ากระเป๋าของผู้เขียนโดยตรงครับ :) **

Share this post

Leave a Reply

Connect with

Your email address will not be published. Required fields are marked *


Related Posts

Privacy & Security
Gracialo679

ความปลอดภัย และความเป็นส่วนตัวเบื้องต้นสำหรับผู้ใช้งานบิตคอยน์ (Basic of Security and Privacy for Bitcoin User)

HD wallet คืออะไร? มันทำงานอย่างไร? และทำไมเราจึงไม่ควรใช้ Address ซ้ำ ๆ บทความนี้เราจะมาไขข้อข้องใจของมือใหม่เหล่านี้กัน

Read More »
Privacy & Security
Gracialo679

การ Backup ชุด Seed

จากบทความก่อนที่คุณได้รู้วิธีการสร้างชุด Seed ด้วยตัวเองโดยไม่ต้องเชื่อใจผู้สร้าง Hardware Wallet คราวนี้ผมจะมาพูดถึงวิธีการเก็บ Seed ให้ปลอดภัย ว่าคุณต้องคำนึงถึงเรื่องอะไรบ้าง

Read More »