diff --git a/ethutil/trie.go b/ethutil/trie.go
index 26a27a901c29142cfec1fdf145cbee1ef69be6e6..c669bdcb040e6655661b15895902af10381043e9 100644
--- a/ethutil/trie.go
+++ b/ethutil/trie.go
@@ -538,15 +538,13 @@ func (it *TrieIterator) fetchNode(key []int, node []byte, cb EachCallback) {
 }
 
 func (it *TrieIterator) iterateNode(key []int, currentNode *Value, cb EachCallback) {
-	//fmt.Println("node", currentNode)
-
 	if currentNode.Len() == 2 {
 		k := CompactDecode(currentNode.Get(0).Str())
 
-		if currentNode.Get(1).Str() == "" {
-			it.iterateNode(key, currentNode.Get(1), cb)
+		pk := append(key, k...)
+		if currentNode.Get(1).Len() != 0 && currentNode.Get(1).Str() == "" {
+			it.iterateNode(pk, currentNode.Get(1), cb)
 		} else {
-			pk := append(key, k...)
 
 			if k[len(k)-1] == 16 {
 				cb(DecodeCompact(pk), currentNode.Get(1))
@@ -560,7 +558,7 @@ func (it *TrieIterator) iterateNode(key []int, currentNode *Value, cb EachCallba
 			if i == 16 && currentNode.Get(i).Len() != 0 {
 				cb(DecodeCompact(pk), currentNode.Get(i))
 			} else {
-				if currentNode.Get(i).Str() == "" {
+				if currentNode.Get(i).Len() != 0 && currentNode.Get(i).Str() == "" {
 					it.iterateNode(pk, currentNode.Get(i), cb)
 				} else {
 					val := currentNode.Get(i).Str()
diff --git a/ethutil/trie_test.go b/ethutil/trie_test.go
index 3ee955b11458a1d06403adf9d027d2b2057f9fb3..d8db8a0d6a1e3b3615a8d2437222035a85197a01 100644
--- a/ethutil/trie_test.go
+++ b/ethutil/trie_test.go
@@ -261,13 +261,13 @@ func TestTrieReplay(t *testing.T) {
 
 		_, trie2 := New()
 		trie.NewIterator().Each(func(key string, v *Value) {
-			trie2.Update(key, string(v.Str()))
+			trie2.Update(key, v.Str())
 		})
 
 		a := NewValue(trie.Root).Bytes()
 		b := NewValue(trie2.Root).Bytes()
 		if bytes.Compare(a, b) != 0 {
-			t.Errorf("root %x %x\n", trie.Root, trie2.Root)
+			t.Errorf("%s %x %x\n", test.Name, trie.Root, trie2.Root)
 		}
 	})
 }