diff --git a/trie/encoding.go b/trie/encoding.go
index 5f120de638ce630babe0a18d281c9152ec95013d..1955a3e664f52142fbb52d6954fdf018873361db 100644
--- a/trie/encoding.go
+++ b/trie/encoding.go
@@ -52,6 +52,9 @@ func hexToCompact(hex []byte) []byte {
 }
 
 func compactToHex(compact []byte) []byte {
+	if len(compact) == 0 {
+		return compact
+	}
 	base := keybytesToHex(compact)
 	// delete terminator flag
 	if base[0] < 2 {
diff --git a/trie/trie_test.go b/trie/trie_test.go
index f9d6029c997a79e7d14fe837a80fabd339cf3da3..4d84aa96cf4500348746d19f83a0861b66139f00 100644
--- a/trie/trie_test.go
+++ b/trie/trie_test.go
@@ -614,3 +614,16 @@ func updateString(trie *Trie, k, v string) {
 func deleteString(trie *Trie, k string) {
 	trie.Delete([]byte(k))
 }
+
+func TestDecodeNode(t *testing.T) {
+	t.Parallel()
+	var (
+		hash  = make([]byte, 20)
+		elems = make([]byte, 20)
+	)
+	for i := 0; i < 5000000; i++ {
+		rand.Read(hash)
+		rand.Read(elems)
+		decodeNode(hash, elems, 1)
+	}
+}