Address คืออะไร?

address

Address เป็นสิ่งที่คุณจำเป็นจะต้องให้กับคนที่ต้องการจะ “ส่ง” Bitcoin ให้คุณ 

เมื่อมีคนได้รับมัน พวกเขาสามารถสร้างสคริปต์สำหรับล็อกข้อมูล (Locking script) เฉพาะขึ้นมาตามประเภทของ address ที่คุณได้มอบให้เขา

เราจะสร้างที่อยู่ (address) ได้อย่างไร?

เอาล่ะ มันขึ้นอยู่กับว่าคุณอยากจะล็อก Bitcoin ของคุณไว้แบบไหน 

แต่โดยรวมแล้ว address จะประกอบด้วย 

  1. ข้อมูลเฉพาะที่คุณต้องการที่จะรวมเข้าไปในล็อก ยกตัวอย่างเช่น เลข Hash public key (public key)
  2. Prefix (คำนำหน้า) เพื่อที่จะชี้ให้เห็นว่าจะสร้างล็อกแบบไหนขึ้นมา 
  3. และ Checksum เพื่อที่จะช่วยติดตามข้อมูลแต่ละรูปแบบ

และท้ายที่สุด ทั้งหมดนั้นจะถูกแปลงค่าเป็น Base58 ซึ่งจะทำให้ผู้ใช้งานสามารถทำงานง่ายยิ่งขึ้น

Pay To PubKey Hash (P2PKH)

ตามที่ได้ระบุไป เราผนวกข้อมูล Prefix และเพิ่ม checksum นำหน้าเลข Hash public key ของเรา จากนั้นก็เข้ารหัสทั้งหมดใน base58

02-encode-p2pkh

ตอนนี้เรามีที่อยู่สำหรับมอบให้คนอื่นแล้ว

ถอดรหัส (Decode)

เมื่อมีใครสักคนสร้างสคริปต์สำหรับล็อก (Locking Script) จากที่อยู่ (address) นี้ พวกเขาแค่ถอดรหัส base58 เพื่อที่จะกู้คืน Hash160 ที่อยู่ข้างใน จากนั้นก็สร้างล็อก P2PKH รอบๆ ตามนี้

03-decode-p2pkh

เพราะฉะนั้น Prefix จะระบุให้เห็นว่าจะสร้างล็อกแบบไหนและ hash160 จะบอกพวกมันว่าข้อมูลใดที่ใส่เข้าไปในนั้น

Pay To Script Hash (P2SH)

เช่นเดียวกันกับก่อนหน้านี้ ยกเว้นว่าครั้งนี้เราจะรวมเลข Hash ของสคริปต์และใช้ Prefix (คำนำหน้า) 05 เพื่อระบุ P2SH

04-encode-p2sh
ถอดรหัส (Decode)

และนี่ก็คือหน้าตาของ P2SH

04-decode-p2sh

Prefix (คำนำหน้า)

ตามที่ได้กล่าวไปข้างต้น Prefix (คำนำหน้า) ที่คุณใช้จะระบุชนิดของสคริปต์สำหรับล็อก (Locking Script) ที่จะทำการสร้าง 

นี้คือรายการของ Prefix (คำนำหน้า) address

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

นี้คือ Prefix (คำนำหน้า) ที่มักจะถูกใช้ใน Bitcoin

Mainnet

Prefix (hex)

Base58 Leading Character

Represents

Example

00

1

P2PKH Address

1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP

05

3

P2SH Address

34nSkinWC9rDDJiUY438qQN1JHmGqBHGW7

80

K / L

WIF Private Key

L4mee2GrpBSckB9SgC9WhHxvtEgKUvgvTiyYcGu38mr9CGKBGp93

80

5

WIF Private Key

5KXWNXeaVMwjzMsrKPv8dmdEZuVPmPay4nm5SfVZCjLHoy1B56w

0488ADE4

xprv

Extended Private Key

xprv9tuogRdb5YTgcL3P8Waj7REqDuQx4sXcodQaWTtEVFEp6yRKh1CjrWfXChnhgHeLDuXxo2auDZegMiVMGGxwxcrb2PmiGyCngLxvLeGsZRq

0488B21E

xpub

Extended Public Key

xpub67uA5wAUuv1ypp7rEY7jUZBZmwFSULFUArLBJrHr3amnymkUEYWzQJz13zLacZv33sSuxKVmerpZeFExapBNt8HpAqtTtWqDQRAgyqSKUHu

Testnet

Prefix (hex)

Base58 Leading Character

Represents

Example

6F

m / n

P2PKH Address

ms2qxPw1Q2nTkm4eMHqe6mM7JAFqAwDhpB

C4

2

P2SH Address

2MwSNRexxm3uhAKF696xq3ztdiqgMj36rJo

EF

C

WIF Private Key

cV8e6wGiFF8succi4bxe4cTzWTyj9NncXm81ihMYdtW9T1QXV5gS

EF

9

WIF Private Key

93J8xGU85b1sxRP8wjp3WNBCDZr6vZ8AQjd2XHr4YU5Lb21jS1L

04358394

tprv

Extended Private Key

tprv9tuogRdb5YTgcL3P8Waj7REqDuQx4sXcodQaWTtEVFEp6yRKh1CjrWfXChnhgHeLDuXxo2auDZegMiVMGGxwxcrb2PmiGyCngLxvLeGsZRq

043587CF

tpub

Extended Public Key

tpub67uA5wAUuv1ypp7rEY7jUZBZmwFSULFUArLBJrHr3amnymkUEYWzQJz13zLacZv33sSuxKVmerpZeFExapBNt8HpAqtTtWqDQRAgyqSKUHu

https://en.bitcoin.it/wiki/List_of_address_prefixes

ทำไมเราต้องใช้ address?

“address คือวิธีการที่ไม่ซับซ้อนที่จะเขียนสคริปต์สำหรับล็อก (Locking script) ในแบบที่มนุษย์สามารถอ่านได้ – echeveria (บน IRC)”

ถ้าเราไม่ได้ใช้ address เราจะต้องส่งสคริปต์สำหรับล็อก (Locking script) ที่สมบูรณ์ให้กับคนอื่น แบบนี้ 

76a914662ad25db00e7bb38bc04831ae48b4b446d1269888ac # P2PKH script

โดยการใช้ address เราสามารถส่งข้อมูลแบบนี้ให้แทนได้ 

1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP

ข้อมูลทั้งคู่จะได้ผลลัพธ์เช่นเดียวกัน แต่ address จะเป็นรูปแบบที่เป็นมิตรกับผู้ใช้งาน ให้สามารถส่งต่อได้สะดวกมากกว่า ยิ่งไปกว่านั้นยังประกอบด้วย checksum ซึ่งหมายความว่าจะมีการแจ้งเตือนทันทีหากมีใครเขียน address ผิด

Code

Note: Code นี้จะต้องใช้ checksum.rb และ base58_encode.rb.

Ruby

def hash160_to_address(hash160, type=:p2pkh)
  prefixes = {
    p2pkh: '00',         # 1address - For standard bitcoin addresses
    p2sh:  '05',         # 3address - For sending to an address that requires multiple signatures (multisig)
    p2pkh_testnet: '6F', # (m/n)address
    p2sh_testnet:  'C4'  # 2address
  }

  prefix = prefixes[type]
  checksum = checksum(prefix + hash160)
  address = base58_encode(prefix + hash160 + checksum)

  return address
end

hash160 = '662ad25db00e7bb38bc04831ae48b4b446d12698'
puts hash160_to_address(hash160) # 1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP