เลข Hash ของ Public Key เป็น Public Key ของคุณในเวอร์ชั่นที่ทำการ Hash แล้ว
มันเป็น Public Key ในเวอร์ชั่นที่คุณจะใช้ในการส่งให้คนที่ต้องการส่ง Bitcoin ให้คุณ เป็นเวอร์ชั่นที่สั้นกระชับกว่า Private Key เวอร์ชั่นดั้งเดิมและมันอาจจะช่วยเพิ่มความปลอดภัยขึ้นไปอีกขั้นให้กับ Bitcoin ของคุณเมื่อเทียบกับการให้ Public Key ของคุณกับผู้อื่นตรงๆ
นอกจากนั้น มันยังเป็นข้อมูลดิบของที่อยู่ (address) อีกด้วย
คุณจะสร้างเลข Hash ของ Public Key ได้อย่างไร?
แค่นำ Public Key ของคุณมาและใส่เข้าไปในฟังก์ชั่น Hash SHA256 และ RIPEMD160
ในบางครั้งก็ถูกเรียกว่า HASH160 (publickey) เพราะว่ามันง่ายกว่าการเขียน RIPEMD160 (SHA256(publickey))
เพียงเท่านี้ก็เสร็จแล้ว
ตัวอย่าง
publickey = 02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737
hash160(publickey) = 93ce48570b55c42c2af816aeaba06cfee1224fae
ทำไมเราต้องใช้ RIPEMD160?
เพราะว่า RIPEMD160 จะทำการย่อยข้อมูล 160 บิต (20 ไบต์) ซึ่งจะมีขนาดเล็กกว่า Public key แบบดั้งเดิม (65 ไบต์แบบไม่บีบอัดข้อมูล 33 ไบต์แบบบีบอัดข้อมูล)
หมายความว่าสุดท้ายแล้ว ที่อยู่ (address) ที่เราสร้างขึ้นมาจากข้อมูลนี้จะมีตัวอักษรน้อยกว่า Public Key แบบเต็ม ทำให้การส่งต่อข้อมูลง่ายขึ้น
เลข Hash ของ Public Key ใช้ใน Bitcoin ได้อย่างไร?
เมื่อคุณต้องการที่จะได้รับ Bitcoin คุณจะต้องมอบเลข Hash ของ Public Key ของคุณให้กับคนคนนั้นเสียก่อน จากนั้นคนที่ต้องการจะส่ง Bitcoin ให้คุณจะวางเลขดังกล่าวลงไปในโค้ดสำหรับล็อก (Locking Code) ของข้อมูล Output ของรายการธุรกรรม
นี้จะเป็นการสร้างสคริปต์สำหรับล็อก (Locking Script) P2PKH
จากนั้น เมื่อคุณต้องการที่จะปลดล็อก Bitcoin เหล่านี้ (เพื่อที่จะส่งให้ผู้อื่นในรายการธุรกรรมใหม่) คุณแค่วาง Public Key ดั้งเดิมของคุณไปกับลายเซ็นดิจิทัล(Digital Signature) เข้าไปในโค้ด (unlocking code) สำหรับปลดล็อกของข้อมูล Input
เพราะฉะนั้นเมื่อ Node ทำการอนุมัติรายการธุรกรรมนี้ มันจะ:
- ตรวจสอบว่า Public Key มอบเลข Hash ที่ถูกต้องให้กับเลข Hash ของ Public Key
- หากตรวจสอบเรียบร้อยแล้ว จากนั้น Node จะทำการตรวจสอบ signature คู่กับ public key ตามปกติ
เพราะฉะนั้น แทนที่จะตรวจสอบ signature คู่กับ public key (เมื่ออยู่ในล็อก P2PK) มีขั้นตอนพิเศษขั้นตอนหนึ่งที่ตรวจสอบเลข Hash ของ public key ล่วงหน้า
นี้คือสาเหตุว่าทำไมรูปแบบของระบบการล็อกนี้ถูกเรียกว่า P2PKH
Code
Ruby
require 'digest' # Hash Functions Library
publickey = '02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737'
binary = [publickey].pack("H*") # Convert to binary first before hashing
sha256 = Digest::SHA256.digest(binary)
ripemd160 = Digest::RMD160.digest(sha256)
hash160 = ripemd160.unpack("H*")[0] # Convert back to hex
puts hash160 # 93ce48570b55c42c2af816aeaba06cfee1224fae
คำถามที่พบบ่อย
ทำไมเราต้องทำการ Hash เลข Public Key?
เพราะว่ามันเป็นวิธีการทำงานของรายการธุรกรรมที่ถูกออกแบบมาตั้งแต่ตอนที่ Satoshi พัฒนา Bitcoin
คุณคงต้องถาม Satoshi ว่าอะไรคือเหตุผลที่แท้จริงว่าทำไมที่อยู่ (address) คือเลข Hash ของ Public Key – Pieter Wuille
มันอาจจะเป็นเพราะว่า Satoshi ไม่ได้ตระหนักตั้งแต่แรกว่าคุณสามารถใช้ Public Key ที่ถูกบีบอัดได้ (33 ไบต์แทนที่จะเป็น 65 ไบต์) เพราะฉะนั้นการ Hash เลข Public key จะช่วยให้ข้อมูลดังกล่าวอยู่ในเวอร์ชั่นที่สั้นกระชับขึ้น (20 ไบต์) เพื่อที่จะมอบให้กับคนอื่นได้สะดวกมากขึ้น
เพื่อที่จะทำให้ที่อยู่ (address) สำหรับรับส่ง Bitcoin สั้นลง พวกเขาจะต้อง Hash เลข public Key – Satoshi Nakamoto
ทฤษฎีทางเลือก : ความปลอดภัยขั้นพิเศษ
ทฤษฎีทางเลือกคือการเลือกใช้ Hash160 เพื่อเพิ่มความปลอดภัยขึ้นอีกขั้น
ยกตัวอย่างเช่น ถ้าเราส่ง Public Key ให้กับคนอื่นทันทีที่เราต้องการรับ Bitcoin สิ่งเดียวที่จะช่วยปกป้องไม่ให้ Private Key ของคุณถูกขโมยไปก็คือ elliptic curve
มันยากอย่างเป็นไปไม่ได้เลยทีเดียวที่จะทำการย้อนกลับกราฟเส้นโค้งพีชคณิต (elliptic curve) เพื่อหา Private Key แต่คุณจะลองทำดูก็ได้
อย่างไรก็ตาม หากเรามอบ Public key เวอร์ชั่นที่ผ่านการ Hash แทน ผู้ที่ต้องการขโมย Private Key ของคุณอาจจะทำการถอดรหัสฟังก์ชั่น Hash ทั้ง RIPEMD160 และ SHA256 พร้อมๆ กับที่ต้องแก้ไขโจทย์กราฟเส้นโค้งไปด้วย
ตอนนี้คุณมีฟังก์ชั่น Hash สองฟังก์ชั่นให้แก้ไขเช่นเดียวกัน
เพราะฉะนั้น โดยพื้นฐานแล้ว ขณะที่คุณมี Bitcoin อยู่บน Blockchain ฟังก์ชั่น Hash จะทำหน้าที่เหมือนกับอุปสรรคที่ผู้ที่ต้องการขโมย Private Key (เพื่อที่จะขโมย Bitcoin) จำเป็นที่จะต้องข้ามผ่านไปให้ได้เสียก่อน
แล้วกราฟเส้นโค้ง(elliptic curve) ยังปลอดภัยไม่พอหรือ?
จริงๆ แล้วมันมีความปลอดภัยสูงทีเดียว
ขอบคุณสำหรับประโยชน์ของกราฟเส้นโค้ง มันยากอย่างเหลือเชื่อทีเดียวที่จะย้อนกลับหา Private Key จาก Public Key โดยเป็นที่รู้จักในชื่อ “โจทย์เส้นโค้งทางคณิตศาสตร์ลอการิทึมที่แยกกันเป็นส่วนๆ”
อย่างไรก็ตาม หากโจทย์ดังกล่าวถูกแก้ได้ ก็ยังมีฟังก์ชั่น Hash สองฟังก์ชั่นที่จะเข้ามาช่วยปกป้อง Private Key ของคุณอีกแรง
แต่คุณยังต้องส่ง Public Key ให้ผู้อื่นไม่ใช่หรือ?
ใช่ แต่ในระบบนี้ Public Key ของคุณจะถูกส่งให้ผู้อื่นในตอนสุดท้ายเท่านั้น (เมื่อคุณต้องใช้ Bitcoin ในการใช้จ่าย)
ทฤษฎีก็คือหากมีใครสักคนต้องการคาดเดา Private Key ของคุณ พวกเขาจะมีเวลาน้อยมากก่อนที่ข้อมูลของรายการธุรกรรมของคุณจะถูกกระจายเข้าไปในเครือข่ายและถูกขุดเป็นบล็อก จากนั้นมันก็มีความปลอดภัยมากกว่าจะทิ้งให้ Public Key ของคุณถูกเปิดเผยเป็นสาธารณะตั้งแต่แรก
ต้องขอบคุณ Pieter Wuille ที่อธิบายว่าทำไมเราต้อง Hash Public Key ของเราแทนที่จะใช้ข้อมูล Public key ดั้งเดิม