Chao xìn mọi người lại là mình đây Nhabachoc KAD.

Bài viết này có dành cho bạn?

Hành trang cần chuẩn bị:

Cùng tắt đèn bật ý tưởng, gét go 🪄

RLP encoding

Trình tự hoá dữ liệu giúp biến dạng dữ liệu phức tap thành dạng byte để lưu trữ hoặc truyền đi. RLP là thuật toán mã hoá / giải mã giúp Ethereum serialize dữ liệu và đảo ngược lại chúng.

Định nghĩa:

  1. Nếu đầu vào là một byte đơn trong phạm vi [0x00, 0x7f] , thì chính nó là RLP.

  2. Nếu đầu vào không phải là giá trị (uint(0), []byte{}, chuỗi(“”), con trỏ trống …), RLP là 0x80.

  3. Nếu đầu vào là một byte đặc biệt trong phạm vi [0x80, 0xff], RLP sẽ nối 0x81 với byte [0x81, byte].

  4. Nếu đầu vào là một chuỗi có độ dài từ 2–55 byte, RLP bao gồm một byte đơn có giá trị 0x80 cộng với độ dài của chuỗi tính bằng byte và mảng giá trị hex của chuỗi. Dễ dàng thấy rằng byte đầu tiên nằm trong phạm vi [0x82, 0xb7]

    VD: **“hello world” = [**0x8b**, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]

  5. Nếu đầu vào là một chuỗi dài hơn 55 byte, RLP bao gồm 3 phần từ trái sang phải:

    VD: **Một chuỗi có 1024 ký tự “a” ⇒ “aaa…” = [**0xb9**, **0x04**, **0x00**, 0x61, 0x61, …]

  6. Nếu đầu vào là một mảng trống, mã hóa RLP là một byte đơn 0xc0.

  7. Nếu đầu vào là một mảng có độ dài phần tử từ 0–55 byte, RLP bao gồm một byte đơn có giá trị 0xc0 cộng với độ dài toàn bộ phần tử sau khi chuyển sang dạng hex và nối tất cả phần tử sau khi mã hoá RLP. Phạm vi của byte đầu tiên là [0xc1, 0xf7]

    VD: **[“hello”, “world”] = [0xcc, 0x85, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x85, 0x77, 0x6f, 0x72, 0x6c, 0x64].

  8. Nếu đầu vào là một mảng có độ dài phần tử lớn hơn 55 byte, RLP bao gồm 3 phần:

  9. Một điều nữa, nó không được đề cập trong wiki Ethereum nhưng trong mã nguồn Golang. Với kiểu boolean true = 0x01false = 0x80.

Compact encoding - Hex Prefix encoding

Bạn nên đọc về Patricia trie xong và quay lại đây đọc hoặc mình sẽ link đến đây lúc cần kiến thức này.