erigon-pulse/trie/trie_binary.go

60 lines
1.1 KiB
Go

package trie
import (
"github.com/ledgerwatch/turbo-geth/common"
)
// BinaryTrie is a binary trie represnentation.
// Extracted to simplify type checks, etc
type BinaryTrie Trie
func (b *BinaryTrie) Trie() *Trie {
return (*Trie)(b)
}
// HexToBin transforms a hexary trie into binary representation
// (where the keys can only contain symbols [0,1])
func HexToBin(hexTrie *Trie) *BinaryTrie {
binaryTrie := NewBinary(common.Hash{})
transformSubTrie(hexTrie.root, []byte{}, binaryTrie, keyHexToBin)
return (*BinaryTrie)(binaryTrie)
}
func keyHexToBin(hex []byte) []byte {
binLen := len(hex) * 4
if hex[len(hex)-1] == 16 {
binLen -= 3
}
bin := make([]byte, binLen)
qi := 0
for _, h := range hex {
qi += writeHexNibbleToBinary(bin[qi:], h)
}
return bin
}
func writeHexNibbleToBinary(buff []byte, nibble byte) int {
written := 0
if nibble == 16 {
buff[written] = 16
written++
} else {
for shift := 3; shift >= 0; shift-- {
buff[written] = normalize(nibble & (1 << uint(shift)))
written++
}
}
return written
}
func normalize(n byte) byte {
if n > 0 {
return 1
}
return 0
}