Example #1
0
        public static Block CreateWithAddedTransactions(this Block block, params EncodedTx[] transactions)
        {
            // update transactions
            var updatedTxes = block.BlockTxes.AddRange(transactions.Select((tx, txIndex) =>
                                                                           new BlockTx(block.BlockTxes.Length + txIndex, tx)));

            // update merkle root
            var updatedHeader = block.Header.With(MerkleRoot: MerkleTree.CalculateMerkleRoot(updatedTxes));

            return(new Block(updatedHeader, updatedTxes));
        }
        private void BuildMerkleTree()
        {
            merkleTree = new MerkleTree();

            foreach (ITransaction txn in Transaction)
            {
                merkleTree.AppendLeaf(MerkleHash.Create(txn.CalculateTransactionHash()));
            }

            merkleTree.BuildTree();
        }
Example #3
0
        public void BuildMerkleTree()
        {
            merkleTreeObj = new MerkleTree();

            foreach (ITransaction transaction in Transaction)
            {
                merkleTreeObj.AppendLeaf(MerkleHash.Create(transaction.CalculateTransactionHash()));
            }

            merkleTreeObj.BuildTree();
        }
Example #4
0
        public void Tree_to_Array()
        {
            // Arrange
            var tree = MerkleTree.ComputeTree(_hashes);

            // Act
            var hasharray = tree.ToHashArray();

            // Assert
            CollectionAssert.AreEqual(_hashes, hasharray);
        }
Example #5
0
        public void CreateTree(MerkleTree tree, int numLeaves)
        {
            List <DemoMerkleNode> leaves = new List <DemoMerkleNode>();

            for (int i = 0; i < numLeaves; i++)
            {
                tree.AppendLeaf(DemoMerkleNode.Create(i.ToString()).SetText(i.ToString("X")));
            }

            tree.BuildTree();
        }
Example #6
0
        public void Search_Node()
        {
            // Act
            var tree     = MerkleTree.ComputeTree(_hashes);
            var node     = tree.Search(UInt256.Parse("d7578928d3ffde14619ce1ceaecbf0300b303a4f09916c0c62006625ba9d251a"));
            var nodeNone = tree.Search(UInt256.Parse("f6049de2a1ce95dc4fbff3c66af5900ff2733d78c0eaab7c723c92f0a1e62f23"));

            // Assert
            Assert.AreEqual("0xd7578928d3ffde14619ce1ceaecbf0300b303a4f09916c0c62006625ba9d251a", node.Hash.ToString());
            Assert.IsNull(nodeNone);
        }
Example #7
0
        public string GetPayloadHash()
        {
            var hashsBytes = this.Transactions.Select(tx => Base16.Decode(tx.Hash)).ToList();

            var bytes = MerkleTree.Hash(hashsBytes);

            return(Base16.Encode(
                       HashHelper.Hash(
                           bytes.ToArray()
                           )));
        }
Example #8
0
        public Archive CreateArchive(MerkleTree merkleTree, ArchiveFlags flags)
        {
            var archive = FindArchive(merkleTree.Root);

            if (archive != null)
            {
                return(archive);
            }

            throw new NotImplementedException();
        }
Example #9
0
 public void Can_calculate_sibling_index(uint level, uint indexAtLevel, uint?expectedSiblingIndex)
 {
     if (expectedSiblingIndex == null)
     {
         Assert.Throws <IndexOutOfRangeException>(() => MerkleTree.GetSiblingIndex(level, indexAtLevel));
     }
     else
     {
         MerkleTree.GetSiblingIndex(level, indexAtLevel).Should().Be(expectedSiblingIndex.Value);
         MerkleTree.GetSiblingIndex(level, expectedSiblingIndex.Value).Should().Be(indexAtLevel);
     }
 }
Example #10
0
 public Block EnsureHeader()
 {
     if (TransactionHashes == null)
     {
         return(null);
     }
     if (Block.MerkleRoot is null)
     {
         Block.MerkleRoot = MerkleTree.ComputeRoot(TransactionHashes);
     }
     return(Block);
 }
Example #11
0
        public string HashBlockTransactions(List <Transaction> transactions)
        {
            if (transactions == null || transactions.Count == 0)
            {
                return(string.Empty);
            }

            List <string> hashes = transactions.Select(x => x.TransactionId).ToList();
            MerkleTree    tree   = new MerkleTree(hashes);

            return(tree.Root.Hash);
        }
Example #12
0
        public void Get_Leafs()
        {
            // Arrange
            var tree = MerkleTree.ComputeTree(_hashes);

            // Act
            var leafs = tree.Root.GetLeafs().Select(u => u.Hash).ToArray();

            // Assert
            Assert.IsTrue(_hashes.SequenceEqual(leafs));
            Assert.AreEqual((tree.Depth - 1) * 2, leafs.Length);
        }
Example #13
0
 public MerkleTreeTests()
 {
     _subject = new MerkleTree();
     _hashes  = new[]
     {
         HashUtil.Blake256(new byte[] { 0x01 }),
         HashUtil.Blake256(new byte[] { 0x02 }),
         HashUtil.Blake256(new byte[] { 0x03 }),
         HashUtil.Blake256(new byte[] { 0x04 }),
         HashUtil.Blake256(new byte[] { 0x05 }),
     };
 }
Example #14
0
 public void Can_calculate_sibling_index(uint row, uint indexAtRow, uint?expectedSiblingIndex)
 {
     if (expectedSiblingIndex == null)
     {
         Assert.Throws <ArgumentOutOfRangeException>(() => MerkleTree.GetSiblingIndex(row, indexAtRow));
     }
     else
     {
         MerkleTree.GetSiblingIndex(row, indexAtRow).Should().Be(expectedSiblingIndex.Value);
         MerkleTree.GetSiblingIndex(row, expectedSiblingIndex.Value).Should().Be(indexAtRow);
     }
 }
Example #15
0
        public void Trim()
        {
            // Arrange
            var tree = MerkleTree.ComputeTree(_hashes);

            var bitarray = new BitArray(new byte[] { });

            // Act
            tree.Trim(bitarray);

            // Assert
            Assert.AreEqual("0x04948a9f4b7d5d1c7ed2cbd7f7034cfa095ce08d0b7a25959a083dc446aa8743", tree.Root.Hash.ToString());
        }
Example #16
0
        public void ProofListTest()
        {
            MerkleTree tree = new MerkleTree();

            tree.AddLeaves(CreateLeaves(new string[] { "a", "e", "l", "f", "2", "0", "1", "8" }));
            tree.GenerateMerkleTree();

            MerkleHash target    = new MerkleHash("e");
            var        prooflist = tree.GetProofList(target);

            Assert.True(prooflist[0].Hash.ToString() == new MerkleHash("a").ToString());
            Assert.True(prooflist[prooflist.Count - 1].Hash.ToString() == tree.MerkleRoot.Hash.ToString());
        }
Example #17
0
        public BlockWithTransactions Build()
        {
            if (_genesisBlock != null)
            {
                return(_genesisBlock);
            }

            var genesisConfig = _configManager.GetConfig <GenesisConfig>("genesis") ??
                                throw new InvalidOperationException("No genesis config found");

            var fromAddress = UInt160Utils.Zero; // mint initial tokens from zero address
            var balances    = genesisConfig !.Balances
                              .OrderBy(x => x.Key)
                              .ToArray();
            var genesisTransactions = balances.Select((t, i) => new Transaction
            {
                From     = fromAddress,
                Nonce    = (ulong)i,
                Value    = Money.Parse(t.Value).ToUInt256(),
                To       = t.Key.HexToUInt160(),
                GasPrice = 0,
            })
                                      .Select(tx => new TransactionReceipt
            {
                Transaction = tx,
                Hash        = HardforkHeights.IsHardfork_9Active(0) ? tx.FullHash(SignatureUtils.ZeroNew, true) : tx.FullHash(SignatureUtils.ZeroOld, false),
                Signature   = HardforkHeights.IsHardfork_9Active(0) ? SignatureUtils.ZeroNew : SignatureUtils.ZeroOld,
            })
                                      .ToList();

            var txHashes = genesisTransactions.Select(tx => tx.Hash).ToArray();

            var header = new BlockHeader
            {
                PrevBlockHash = UInt256Utils.Zero,
                MerkleRoot    = MerkleTree.ComputeRoot(txHashes) ?? UInt256Utils.Zero,
                Index         = 0,
                StateHash     = UInt256Utils.Zero,
                Nonce         = GenesisConsensusData
            };

            var result = new Block
            {
                Hash = header.Keccak(),
                TransactionHashes = { txHashes },
                Header            = header
            };

            _genesisBlock = new BlockWithTransactions(result, genesisTransactions.ToArray());
            return(_genesisBlock);
        }
Example #18
0
        public void Can_get_leaf(uint nodesCount)
        {
            MerkleTree baselineTree = BuildATree();

            for (int i = 0; i < nodesCount; i++)
            {
                baselineTree.Insert(_testLeaves[0]);
            }

            for (int i = 0; i < nodesCount; i++)
            {
                baselineTree.GetLeaf((uint)i).Hash.Should().NotBe(Keccak.Zero);
            }
        }
Example #19
0
        protected virtual void BuildMerkleBranches()
        {
            var transactionHashes = BlockTemplate.Transactions
                                    .Select(tx => (tx.TxId ?? tx.Hash)
                                            .HexToByteArray()
                                            .ReverseArray())
                                    .ToArray();

            mt = new MerkleTree(transactionHashes);

            merkleBranchesHex = mt.Steps
                                .Select(x => x.ToHexString())
                                .ToArray();
        }
Example #20
0
        public Block CreateEmptyBlock(UInt256 previousBlockHash, UInt256?target = null)
        {
            var coinbaseTx = new Transaction
                             (
                version: 0,
                inputs: ImmutableArray.Create
                (
                    new TxInput
                    (
                        previousTxOutputKey: new TxOutputKey
                        (
                            txHash: 0,
                            txOutputIndex: 0
                        ),
                        scriptSignature: ImmutableArray.Create(random.NextBytes(100)),
                        sequence: 0
                    )
                ),
                outputs: ImmutableArray.Create
                (
                    new TxOutput
                    (
                        value: 50 * SATOSHI_PER_BTC,
                        scriptPublicKey: ImmutableArray.Create(this.txManager.CreatePublicKeyScript(coinbasePublicKey))
                    )
                ),
                lockTime: 0
                             );

            //Debug.WriteLine("Coinbase Tx Created: {0}".Format2(coinbaseTx.Hash.ToHexNumberString()));

            var transactions = ImmutableArray.Create(coinbaseTx);
            var merkleRoot   = MerkleTree.CalculateMerkleRoot(transactions);

            var block = new Block
                        (
                header: new BlockHeader
                (
                    version: 0,
                    previousBlock: previousBlockHash,
                    merkleRoot: merkleRoot,
                    time: 0,
                    bits: DataCalculator.TargetToBits(target ?? UnitTestRules.Target0),
                    nonce: 0
                ),
                transactions: transactions
                        );

            return(block);
        }
Example #21
0
        public void Can_restore_count_from_the_database(uint leafCount)
        {
            MemMerkleTreeStore memDb        = new MemMerkleTreeStore();
            MerkleTree         baselineTree = BuildATree(memDb);

            for (int i = 0; i < leafCount; i++)
            {
                baselineTree.Insert(_testLeaves[0]);
            }

            MerkleTree baselineTreeRestored = BuildATree(memDb);

            baselineTreeRestored.Count.Should().Be(leafCount);
        }
Example #22
0
        public void Test_Tree()
        {
            // Act
            var root = MerkleTree.ComputeRoot(_hashes);
            var tree = MerkleTree.ComputeTree(_hashes);

            // Assert
            Assert.AreEqual("0x04948a9f4b7d5d1c7ed2cbd7f7034cfa095ce08d0b7a25959a083dc446aa8743", root.ToString());
            Assert.AreEqual(root, tree.Root.Hash);
            Assert.AreEqual(tree.Depth, 3);
            Assert.IsTrue(tree.Root.IsRoot);
            Assert.AreEqual("0xe2a1ce95dc4fbff3c66af5900ff2733d78c0eaab7c723c92f0a1e62f23f6049d", tree.Root.LeftChild.Hash.ToString());
            Assert.AreEqual("0x6f143cb819dc8934ad357cb9b8185c084c7b82bbb173ef4d06b2acb09f70ad76", tree.Root.RightChild.Hash.ToString());
        }
Example #23
0
        private CreateBlockModel Mining()
        {
            if (Block.Transactions.Count == 0)
            {
                return(null);
            }
            var transactionHash = MerkleTree <TransactionModel> .Compute(Block.Transactions.OrderBy(x => x.Id).ToList());

            var obj = new MiningBlock
            {
                Hash = transactionHash.TrimEnd('=') + Block.PreviousHash.TrimEnd('='),
                PreviousBlockHash = Block.PreviousHash.TrimEnd('='),
                Nonce             = -1,
                Miner             = User
            };
            string blockResultHash;

            using (SHA256Managed sha = new SHA256Managed())
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    do
                    {
                        if (_miningTokenSource.IsCancellationRequested)
                        {
                            return(null);
                        }
                        obj.Nonce++;
                        _hashCurr   = obj.Nonce;
                        ms.Position = 0;
                        BinaryFormatter bf = new BinaryFormatter();
                        bf.Serialize(ms, obj);

                        blockResultHash = Convert.ToBase64String(sha.ComputeHash(ms.ToArray()));
                        ThreadHelperClass.SetText(this, Output, blockResultHash);
                    }while (!blockResultHash.Substring(0, 2).All(x => x == '0'));

                    return(new CreateBlockModel
                    {
                        Date = DateTimeOffset.Now,
                        Hash = blockResultHash,
                        Miner = User,
                        Nonce = obj.Nonce,
                        PrevBlockHash = Block.PreviousHash,
                        Transactions = Block.Transactions.Select(x => x.Id).ToList()
                    });
                }
            }
        }
Example #24
0
        public void FixingOddNumberOfLeavesByAddingTreeTest()
        {
            MerkleTree tree = new MerkleTree();
            MerkleHash l1   = MerkleHash.Create("abc");
            MerkleHash l2   = MerkleHash.Create("def");
            MerkleHash l3   = MerkleHash.Create("123");

            tree.AppendLeaves(new MerkleHash[] { l1, l2, l3 });
            MerkleHash rootHash = tree.BuildTree();

            tree.AddTree(new MerkleTree());
            MerkleHash rootHashAfterFix = tree.BuildTree();

            Assert.IsTrue(rootHash == rootHashAfterFix);
        }
Example #25
0
        public void WriteArchiveBlock(Archive archive, byte[] content, int blockIndex)
        {
            Throw.IfNull(archive, nameof(archive));
            Throw.IfNull(content, nameof(content));
            Throw.If(blockIndex < 0 || blockIndex >= archive.BlockCount, "invalid block index");

            var hash = MerkleTree.CalculateBlockHash(content);

            if (!archive.MerkleTree.VerifyContent(hash, blockIndex))
            {
                throw new ArchiveException("Block content mismatch");
            }

            _archiveContents.Set(hash, content);
        }
Example #26
0
        public void FixingOddNumberOfLeavesManuallyTest()
        {
            MerkleTree tree = new MerkleTree();
            MerkleHash l1   = MerkleHash.Create("abc");
            MerkleHash l2   = MerkleHash.Create("def");
            MerkleHash l3   = MerkleHash.Create("123");

            tree.AppendLeaves(new MerkleHash[] { l1, l2, l3 });
            MerkleHash rootHash = tree.BuildTree();

            tree.FixOddNumberLeaves();
            MerkleHash rootHashAfterFix = tree.BuildTree();

            Assert.True(rootHash != rootHashAfterFix);
        }
Example #27
0
        public static MerkleBlockPayload Create(Block block, BitArray flags)
        {
            MerkleTree tree = new MerkleTree(block.Transactions.Select(p => p.Hash).ToArray());

            tree.Trim(flags);
            byte[] buffer = new byte[(flags.Length + 7) / 8];
            flags.CopyTo(buffer, 0);
            return(new MerkleBlockPayload
            {
                Header = block.Header,
                TxCount = block.Transactions.Length,
                Hashes = tree.ToHashArray(),
                Flags = buffer
            });
        }
Example #28
0
        public void FixingOddNumberOfLeavesManuallyTest()
        {
            MerkleTree tree = new MerkleTree();
            MerkleHash l1   = new MerkleHash("abc");
            MerkleHash l2   = new MerkleHash("def");
            MerkleHash l3   = new MerkleHash("123");

            tree.Append(new MerkleHash[] { l1, l2, l3 });
            MerkleHash rootHash = tree.BuildTree();

            tree.FixOddNumberLeaves();
            MerkleHash rootHashAfterFix = tree.BuildTree();

            (rootHash != rootHashAfterFix).Should().BeTrue();
        }
Example #29
0
        public string GetUnConsolidatedHash(List <string> unCons)
        {
            if (unCons.Count() == 0)
            {
                return(null);
            }

            var mt = new MerkleTree();

            foreach (var hash in unCons)
            {
                mt.AppendLeaf(MerkleHash.Create(hash));
            }

            return(mt.BuildTree().ToString());
        }
Example #30
0
        public Archive CreateArchive(MerkleTree merkleTree, BigInteger size, ArchiveFlags flags, byte[] key)
        {
            var archive = FindArchive(merkleTree.Root);

            if (archive != null)
            {
                return(archive);
            }

            archive = new Archive(merkleTree, size, flags, key);
            var archiveHash = merkleTree.Root;

            _archiveEntries.Set(archiveHash, archive);

            return(archive);
        }