以太坊中的半字节(nibble)
date
Jan 11, 2023
slug
about-ethereum-nibble
status
Published
tags
Blockchain
Ethereum
summary
半字节用 4 位二进制表示。字面意思看,两个半字节(nibble)可以凑出一个字节(byte)。在 MPT 中,它可以用一位来标记节点类型。
type
Post
半字节(nibble)与字节(byte)的关系
用一个 ASCII 码举例。字符
A 的 ASCII 码十六进制是 0x41,二进制是 0100 0001。它由两个 nibble 组成,分别是 4 和 1 。而 4 和 1 的二进制表示分别是 0100 和 0001。大概可以感觉到,nibble 是一个用 4 位二进制表示的数。它的范围为 0 ~ 15。
判断一个数是否是 nibble
func IsNibble(nibble byte) bool {
n := int(nibble)
// 0-9 && a-f
return n >= 0 && n < 16
}一个 byte 可以分成两个 nibble
将 byte 的高 4 位作为一个 nibble,将 byte 的低 4 位作为一个 nibble。
func FromByte(b byte) []Nibble {
return []Nibble{
Nibble(byte(b >> 4)),
Nibble(byte(b % 16)),
}
}以太坊中中的半字节(nibble)
以太坊的 MPT 中需要一个半字节标记该节点是 extension 还是 leaf,是 odd 还是 even。具体可浏览 Patricia Merkle Trees 的官方文档,其中有详细的示例。表头为 hex char 就是一个 nibble。
hex char bits | node type partial path length
----------------------------------------------------------
0 0000 | extension even
1 0001 | extension odd
2 0010 | terminating (leaf) even
3 0011 | terminating (leaf) odd