Exemple #1
0
 public static void MoveLeft(this IMerkleTreePruningCursor cursor)
 {
     if (!cursor.TryMoveLeft())
     {
         throw new InvalidOperationException();
     }
 }
 public static void MoveLeft <T>(this IMerkleTreePruningCursor <T> cursor)
     where T : IMerkleTreeNode <T>
 {
     if (!cursor.TryMoveLeft())
     {
         throw new InvalidOperationException();
     }
 }
Exemple #3
0
 public bool TryMoveLeft(out T leftNode)
 {
     if (pruningCursor.TryMoveLeft())
     {
         leftNode     = pruningCursor.ReadNode();
         currentIndex = leftNode.Index;
         return(true);
     }
     else
     {
         leftNode = null;
         return(false);
     }
 }
Exemple #4
0
        public static void PruneNode <T>(IMerkleTreePruningCursor <T> cursor, int index)
            where T : IMerkleTreeNode <T>
        {
            if (!cursor.TryMoveToIndex(index))
            {
                return;
            }

            var node = cursor.ReadNode();

            if (node.Depth != 0)
            {
                return;
            }

            if (!node.Pruned)
            {
                node = node.AsPruned();
                cursor.WriteNode(node);
            }

            bool didWork;

            do
            {
                didWork = false;

                if (node.IsLeft())
                {
                    if (cursor.TryMoveRight())
                    {
                        var rightNode = cursor.ReadNode();
                        if (node.Pruned && rightNode.Pruned && node.Depth == rightNode.Depth)
                        {
                            var newNode = node.PairWith(rightNode);

                            cursor.DeleteNode();
                            //TODO cursor.MoveLeft();
                            cursor.WriteNode(newNode);

                            node    = newNode;
                            didWork = true;
                        }
                    }
                    else
                    {
                        if (node.Index != 0 && node.Pruned)
                        {
                            var newNode = node.PairWithSelf();
                            //cursor.MoveLeft();
                            cursor.WriteNode(newNode);

                            node    = newNode;
                            didWork = true;
                        }
                    }
                }
                else
                {
                    if (cursor.TryMoveLeft())
                    {
                        var leftNode = cursor.ReadNode();
                        if (node.Pruned && leftNode.Pruned && node.Depth == leftNode.Depth)
                        {
                            var newNode = leftNode.PairWith(node);
                            cursor.WriteNode(newNode);
                            cursor.MoveRight();
                            cursor.DeleteNode();
                            //TODO cursor.MoveLeft();

                            node    = newNode;
                            didWork = true;
                        }
                    }
                }
            }while (didWork);
        }