public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext) { if (trieVisitContext.IsStorage) { Stats.StorageBranchCount++; } else { Stats.StateBranchCount++; } }
public void VisitExtension(TrieNode node, TrieVisitContext trieVisitContext) { if (trieVisitContext.IsStorage) { Stats.StorageExtensionCount++; } else { Stats.StateExtensionCount++; } }
public void VisitTree(Keccak rootHash, TrieVisitContext trieVisitContext) { if (rootHash == Keccak.EmptyTreeHash) { _builder.AppendLine("EMPTY TREEE"); } else { _builder.AppendLine(trieVisitContext.IsStorage ? "STORAGE TREE" : "STATE TREE"); } }
public void VisitMissingNode(Keccak nodeHash, TrieVisitContext trieVisitContext) { if (trieVisitContext.IsStorage) { Stats.MissingStorage++; } else { Stats.MissingState++; } }
public void VisitCode(Keccak codeHash, TrieVisitContext trieVisitContext) { byte[] code = _codeKeyValueStore[codeHash.Bytes]; if (code != null) { Stats.CodeCount++; } else { Stats.MissingCode++; } }
public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext) { if (trieVisitContext.IsStorage) { Stats.StorageSize += node.FullRlp?.Length ?? 0; Stats.StorageBranchCount++; } else { Stats.StateSize += node.FullRlp?.Length ?? 0; Stats.StateBranchCount++; } }
public void VisitExtension(TrieNode node, TrieVisitContext trieVisitContext) { if (trieVisitContext.IsStorage) { Stats.StorageSize += node.FullRlp?.Length ?? 0; Stats.StorageExtensionCount++; } else { Stats.StateSize += node.FullRlp?.Length ?? 0; Stats.StateExtensionCount++; } }
public void VisitLeaf(TrieNode node, TrieVisitContext trieVisitContext, byte[] value = null) { string leafDescription = trieVisitContext.IsStorage ? "LEAF " : "ACCOUNT "; _builder.AppendLine($"{GetPrefix(trieVisitContext)}{leafDescription} {Nibbles.FromBytes(node.Path).ToPackedByteArray().ToHexString(false)} -> {(node.Keccak?.Bytes ?? node.FullRlp)?.ToHexString()}"); if (!trieVisitContext.IsStorage) { Account account = decoder.Decode(new RlpStream(value)); _builder.AppendLine($"{GetPrefix(trieVisitContext)} NONCE: {account.Nonce}"); _builder.AppendLine($"{GetPrefix(trieVisitContext)} BALANCE: {account.Balance}"); _builder.AppendLine($"{GetPrefix(trieVisitContext)} IS_CONTRACT: {account.IsContract}"); } else { _builder.AppendLine($"{GetPrefix(trieVisitContext)} VALUE: {new RlpStream(value).DecodeByteArray().ToHexString(true, true)}"); } }
public void VisitLeaf(TrieNode node, TrieVisitContext trieVisitContext, byte[] value = null) { if (Stats.NodesCount - _lastAccountNodeCount > 100000) { _lastAccountNodeCount = Stats.NodesCount; _logger.Warn($"Collected info from {Stats.NodesCount} nodes. Missing CODE {Stats.MissingCode} STATE {Stats.MissingState} STORAGE {Stats.MissingStorage}"); } if (trieVisitContext.IsStorage) { Stats.StorageLeafCount++; } else { Stats.AccountCount++; } }
void VisitMultiThread(ITreeVisitor treeVisitor, ITrieNodeResolver trieNodeResolver, TrieVisitContext visitContext, TrieNode?[] children) { // multithreaded route Parallel.For(0, BranchesCount, i => { visitContext.Semaphore.Wait(); try { // we need to have separate context for each thread as context tracks level and branch child index TrieVisitContext childContext = visitContext.Clone(); VisitChild(i, children[i], trieNodeResolver, treeVisitor, childContext); } finally { visitContext.Semaphore.Release(); } }); }
internal void Accept(ITreeVisitor visitor, ITrieNodeResolver nodeResolver, TrieVisitContext trieVisitContext) { try { ResolveNode(nodeResolver); } catch (TrieException) { visitor.VisitMissingNode(Keccak, trieVisitContext); return; } ResolveKey(nodeResolver, trieVisitContext.Level == 0); switch (NodeType) { case NodeType.Branch: {
void VisitChild(int i, TrieNode?child, ITrieNodeResolver resolver, ITreeVisitor v, TrieVisitContext context) { if (child != null) { child.ResolveKey(resolver, false); if (v.ShouldVisit(child.Keccak !)) { context.BranchChildIndex = i; child.Accept(v, resolver, context); } if (child.IsPersisted) { UnresolveChild(i); } } }
public void VisitExtension(TrieNode node, TrieVisitContext trieVisitContext) { _builder.AppendLine($"{GetPrefix(trieVisitContext)}EXTENSION {Nibbles.FromBytes(node.Path).ToPackedByteArray().ToHexString(false)} -> {(node.Keccak?.Bytes ?? node.FullRlp)?.ToHexString()}"); }
public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext) { _builder.AppendLine($"{GetPrefix(trieVisitContext)}BRANCH | -> {(node.Keccak?.Bytes ?? node.FullRlp)?.ToHexString()}"); }
public void VisitMissingNode(Keccak nodeHash, TrieVisitContext trieVisitContext) { _builder.AppendLine($"{GetIndent(trieVisitContext.Level) }{GetChildIndex(trieVisitContext)}MISSING {nodeHash}"); }
private string GetChildIndex(TrieVisitContext context) => context.BranchChildIndex == null ? string.Empty : $"{context.BranchChildIndex:x2} ";
private string GetPrefix(TrieVisitContext context) => string.Concat($"{GetIndent(context.Level)}", context.IsStorage ? "STORAGE " : "", $"{GetChildIndex(context)}");
public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext) { }
public void VisitCode(Keccak codeHash, TrieVisitContext trieVisitContext) { _builder.AppendLine($"{GetPrefix(trieVisitContext)}CODE {codeHash}"); }
void VisitSingleThread(ITreeVisitor treeVisitor, ITrieNodeResolver trieNodeResolver, TrieVisitContext visitContext) { // single threaded route for (int i = 0; i < BranchesCount; i++) { VisitChild(i, GetChild(trieNodeResolver, i), trieNodeResolver, treeVisitor, visitContext); } }
public void VisitExtension(TrieNode node, TrieVisitContext trieVisitContext) { }
public void VisitTree(Keccak rootHash, TrieVisitContext trieVisitContext) { }
public void VisitCode(Keccak codeHash, TrieVisitContext trieVisitContext) { }
public void VisitLeaf(TrieNode node, TrieVisitContext trieVisitContext, byte[] value = null) { }
internal void Accept(ITreeVisitor visitor, ITrieNodeResolver nodeResolver, TrieVisitContext trieVisitContext) { try { ResolveNode(nodeResolver); } catch (TrieException) { visitor.VisitMissingNode(Keccak, trieVisitContext); return; } ResolveKey(nodeResolver, trieVisitContext.Level == 0); switch (NodeType) { case NodeType.Branch: { visitor.VisitBranch(this, trieVisitContext); trieVisitContext.Level++; for (int i = 0; i < 16; i++) { TrieNode child = GetChild(nodeResolver, i); if (child != null) { child.ResolveKey(nodeResolver, false); if (visitor.ShouldVisit(child.Keccak !)) { trieVisitContext.BranchChildIndex = i; child.Accept(visitor, nodeResolver, trieVisitContext); } if (child.IsPersisted) { UnresolveChild(i); } } } trieVisitContext.Level--; trieVisitContext.BranchChildIndex = null; break; } case NodeType.Extension: { visitor.VisitExtension(this, trieVisitContext); TrieNode child = GetChild(nodeResolver, 0); if (child == null) { throw new InvalidDataException($"Child of an extension {Key} should not be null."); } child.ResolveKey(nodeResolver, false); if (visitor.ShouldVisit(child.Keccak !)) { trieVisitContext.Level++; trieVisitContext.BranchChildIndex = null; child.Accept(visitor, nodeResolver, trieVisitContext); trieVisitContext.Level--; } break; } case NodeType.Leaf: { visitor.VisitLeaf(this, trieVisitContext, Value); if (!trieVisitContext.IsStorage && trieVisitContext.ExpectAccounts) // can combine these conditions { Account account = _accountDecoder.Decode(Value.AsRlpStream()); if (account.HasCode && visitor.ShouldVisit(account.CodeHash)) { trieVisitContext.Level++; trieVisitContext.BranchChildIndex = null; visitor.VisitCode(account.CodeHash, trieVisitContext); trieVisitContext.Level--; } if (account.HasStorage && visitor.ShouldVisit(account.StorageRoot)) { trieVisitContext.IsStorage = true; TrieNode storageRoot = new(NodeType.Unknown, account.StorageRoot); trieVisitContext.Level++; trieVisitContext.BranchChildIndex = null; storageRoot.Accept(visitor, nodeResolver, trieVisitContext); trieVisitContext.Level--; trieVisitContext.IsStorage = false; } } break; } default: throw new TrieException($"An attempt was made to visit a node {Keccak} of type {NodeType}"); } }
public void VisitMissingNode(Keccak nodeHash, TrieVisitContext trieVisitContext) { HasRoot = false; }