Chao xìn mọi người lại là mình đây Nhabachoc KAD.
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.
Nếu đầu vào là một byte đơn trong phạm vi [0x00, 0x7f]
, thì chính nó là RLP.
Nếu đầu vào không phải là giá trị (uint(0), []byte{}, chuỗi(“”), con trỏ trống …), RLP là 0x80
.
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]
.
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]
0x0b
0x80 + 0x0b = **0x8b**
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:
0xb7
cộng với độ dài tính bằng byte của phần thứ hai. Dễ dàng nhận ra phạm vi của byte đầu [0xb8, 0xbf]
VD: **Một chuỗi có 1024 ký tự “a” ⇒ “aaa…” = [**0xb9**, **0x04**, **0x00**, 0x61, 0x61, …]
0xb9 =** 0xb7 + 0x02
vì phần 2 có độ dài là 20x04, 0x00
= ****0x0400
****là độ dài của “1024” - độ dài chuỗi ****0x61
là “a”Nếu đầu vào là một mảng trống, mã hóa RLP là một byte đơn 0xc0
.
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]
.
[0x85, 0x68, 0x65, 0x6c, 0x6c, 0x6f]
là mã hóa RLP của “hello”
[0x85, 0x77, 0x6f, 0x72, 0x6c, 0x64]
là mã hóa RLP của “world”
0xcc = 0xc0 + 0x0c
và 0x0c = 0x06 + 0x06
độ dài các phần tử sau chuyển sang dạng hex.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:
0xf7
cộng với độ dài tính bằng byte của phần thứ hai. Phạm vi của byte đầu tiên là [0xf8, 0xff]
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 = 0x01
và false = 0x80
.
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.