Địa chỉ định danh của một node ở trong Bitcoin network là một chuỗi gồm 25 ký tự, mỗi ký tự là 1 byte và được tạo thành từ khóa công khai của ECC (Elliptic Curve Cryptosystem).

Address Generation

Bước 1: tạo cặp khóa ECC gồm khóa công khai e và khóa cá nhân d. Khóa công khai e là một điểm P(x, y) trên nhóm đường cong Elliptic (E, +). Sử dụng kỹ thuật biểu diễn của SSL, ghép thêm 1 byte vào e để hình thành nên chuỗi 65 byte như sau:

PXY <- sparse(e) = [1 byte P | 32 bytes X | 32 bytes Y]

Trong đó:

  • Byte đầu tiên là để chỉ định kiểu lưu: nếu là 0x02 hoặc 0x03 thì chỉ lưu hoành độ x, tung độ y sẽ được tính từ x theo phương trình đường cong (E). Nếu là 0x04 thì lưu cả hoành độ x và tung độ y.
  • 32 byte tiếp theo lưu giá trị của hoành độ x.
  • 32 byte tiếp theo lưu giá trị của tung độ y.

Bước 2: chuỗi 65 byte trên sẽ được băm thành chuỗi 32 byte bằng thuật toán SHA-256:

Z <- SHA256(PXY) = [32 bytes Z]

Bước 3: chuỗi 32 byte ở bước trên sẽ được băm thành chuỗi 20 byte bằng thuật toán RIPE MD-160:

U <- RIPMD160(Z) = [ 20 byte U]

Bước 4: kết quả băm U được thêm vào 1 byte ở bên trái để chỉ định ý nghĩa của địa chỉ:

V <- [1 byte Q | 20 bytes U]

Các giá trị của byte đầu tiên được quy ước như sau:

  • 0: địa chỉ khóa công khai.
  • 5: địa chỉ script.
  • 111: địa chỉ khóa công khai trên testnet.
  • 196: địa chỉ script trên testnet.

Bước 5: chuỗi 21 byte ở trên lại được băm 2 lần bằng thuật toán SHA-256 để tạo thành một chuỗi 32 byte. Ta lấy 4 byte đầu của chuỗi này làm checksum

CS <- SHA256(SHA256(V)) = [4 bytes CS]

Bước 6: ghép 4 byte checksum vào bên phải của chuỗi V ở bước 4 ta thu được địa chỉ trung gian là một chuỗi 25 byte (200 bit):

TIA <- [1 byte T | 20 bytes RIPEMD | 4 bytes SHA-2]

Bước 7: chuyển chuỗi nhị phân trên sang dạng base 58 để dễ đọc và ghi chép.

Minh họa cho quá trình trên:

Resources