以太坊中的半字节(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 组成,分别是 41 。而 41 的二进制表示分别是 01000001
大概可以感觉到,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

© therainisme 2025