// RLP를 디코딩하여 노드 상태를 완전하게 만든다. internal TrieNode DecodeRLP() { if (ReferenceEquals(rlp, null)) { throw new Exception("can't decode empty rlp"); } if (!Parsed) { var rlp = new RlpDecoder(this.rlp); if (Type == NodeType.FullNode) { if (rlp.Count != 17) { throw new Exception("can't decode rlp for full node"); } // child node chidrens = new TrieNode[16]; for (int i = 0; i < 16; i++) { byte[] node = trie.Read(rlp[i].Value); chidrens[i] = node != null ? new TrieNode(trie, node) : null; } // value value = rlp[16].Value; } else if (Type == NodeType.ShortNode) { if (rlp.Count != 2) { throw new Exception("can't decode rlp for short node"); } // key key = TrieKey.Decode(rlp[0].Value); // next node byte[] node = trie.Read(rlp[1].Value); next = node != null ? new TrieNode(trie, node) : null; } else if (Type == NodeType.ValueNode) { if (rlp.Count != 2) { throw new Exception("can't decode rlp for value node"); } // key key = TrieKey.Decode(rlp[0].Value); // value value = rlp[1].Value; } else { throw new Exception("can't decoded rlp for unknown node type"); } Parsed = true; } return(this); }