Пример #1
0
 public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext)
 {
     if (trieVisitContext.IsStorage)
     {
         Stats.StorageBranchCount++;
     }
     else
     {
         Stats.StateBranchCount++;
     }
 }
Пример #2
0
 public void VisitExtension(TrieNode node, TrieVisitContext trieVisitContext)
 {
     if (trieVisitContext.IsStorage)
     {
         Stats.StorageExtensionCount++;
     }
     else
     {
         Stats.StateExtensionCount++;
     }
 }
Пример #3
0
 public void VisitTree(Keccak rootHash, TrieVisitContext trieVisitContext)
 {
     if (rootHash == Keccak.EmptyTreeHash)
     {
         _builder.AppendLine("EMPTY TREEE");
     }
     else
     {
         _builder.AppendLine(trieVisitContext.IsStorage ? "STORAGE TREE" : "STATE TREE");
     }
 }
Пример #4
0
 public void VisitMissingNode(Keccak nodeHash, TrieVisitContext trieVisitContext)
 {
     if (trieVisitContext.IsStorage)
     {
         Stats.MissingStorage++;
     }
     else
     {
         Stats.MissingState++;
     }
 }
Пример #5
0
 public void VisitCode(Keccak codeHash, TrieVisitContext trieVisitContext)
 {
     byte[] code = _codeKeyValueStore[codeHash.Bytes];
     if (code != null)
     {
         Stats.CodeCount++;
     }
     else
     {
         Stats.MissingCode++;
     }
 }
Пример #6
0
 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++;
     }
 }
Пример #7
0
 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++;
     }
 }
Пример #8
0
        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)}");
            }
        }
Пример #9
0
        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++;
            }
        }
Пример #10
0
 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();
             }
         });
 }
Пример #11
0
        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:
            {
Пример #12
0
                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);
                        }
                    }
                }
Пример #13
0
 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()}");
 }
Пример #14
0
 public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext)
 {
     _builder.AppendLine($"{GetPrefix(trieVisitContext)}BRANCH | -> {(node.Keccak?.Bytes ?? node.FullRlp)?.ToHexString()}");
 }
Пример #15
0
 public void VisitMissingNode(Keccak nodeHash, TrieVisitContext trieVisitContext)
 {
     _builder.AppendLine($"{GetIndent(trieVisitContext.Level) }{GetChildIndex(trieVisitContext)}MISSING {nodeHash}");
 }
Пример #16
0
 private string GetChildIndex(TrieVisitContext context) => context.BranchChildIndex == null ? string.Empty : $"{context.BranchChildIndex:x2} ";
Пример #17
0
 private string GetPrefix(TrieVisitContext context) => string.Concat($"{GetIndent(context.Level)}", context.IsStorage ? "STORAGE " : "", $"{GetChildIndex(context)}");
Пример #18
0
 public void VisitBranch(TrieNode node, TrieVisitContext trieVisitContext)
 {
 }
Пример #19
0
 public void VisitCode(Keccak codeHash, TrieVisitContext trieVisitContext)
 {
     _builder.AppendLine($"{GetPrefix(trieVisitContext)}CODE {codeHash}");
 }
Пример #20
0
 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);
     }
 }
Пример #21
0
 public void VisitExtension(TrieNode node, TrieVisitContext trieVisitContext)
 {
 }
Пример #22
0
 public void VisitTree(Keccak rootHash, TrieVisitContext trieVisitContext)
 {
 }
Пример #23
0
 public void VisitCode(Keccak codeHash, TrieVisitContext trieVisitContext)
 {
 }
Пример #24
0
 public void VisitLeaf(TrieNode node, TrieVisitContext trieVisitContext, byte[] value = null)
 {
 }
Пример #25
0
        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}");
            }
        }
Пример #26
0
 public void VisitMissingNode(Keccak nodeHash, TrieVisitContext trieVisitContext)
 {
     HasRoot = false;
 }