Esempio n. 1
0
        public static Blockchain RandomBlockchain(RandomDataOptions options = default(RandomDataOptions))
        {
            //TODO blockCount algorithm isn't exact
            var blockCount       = random.Next((options != null ? options.BlockCount : null) ?? 100) + ((options != null ? options.MinimumBlockCount : null) ?? 1);
            var blockList        = new List <Block>(blockCount);
            var chainedBlockList = new List <ChainedBlock>(blockCount);

            var previousBlockHash = UInt256.Zero;
            var totalWork         = new BigInteger(0);

            for (var i = 0; i < blockCount; i++)
            {
                var block = RandomData.RandomBlock(options);
                block = block.With(Header: block.Header.With(PreviousBlock: previousBlockHash));
                blockList.Add(block);

                previousBlockHash = block.Hash;
                totalWork        += block.Header.CalculateWork();

                chainedBlockList.Add(new ChainedBlock(block.Hash, block.Header.PreviousBlock, i, totalWork));
            }

            var blockListHashes = blockList.Select(x => x.Hash).ToImmutableHashSet();
            var utxo            = blockList.SelectMany(block =>
                                                       block.Transactions.Select((tx, txIndex) =>
                                                                                 new UnspentTx(block.Hash, (UInt32)txIndex, tx.Hash, random.NextImmutableBitArray((options != null ? options.TxOutputCount : null) ?? 100))))
                                  .ToImmutableDictionary(unspentTx => unspentTx.TxHash, unspentTx => unspentTx);

            return(new Blockchain
                   (
                       chainedBlockList.ToImmutableList(),
                       blockListHashes,
                       utxo
                   ));
        }
Esempio n. 2
0
        public void TestBlockIsDefault()
        {
            var defaultBlock = default(Block);

            Assert.IsTrue(defaultBlock.IsDefault);

            var randomBlock = RandomData.RandomBlock();

            Assert.IsFalse(randomBlock.IsDefault);
        }
Esempio n. 3
0
        public void TestBlockEquality()
        {
            var randomBlock = RandomData.RandomBlock();

            var sameBlock = new Block
                            (
                header: new BlockHeader(randomBlock.Header.Version, randomBlock.Header.PreviousBlock, randomBlock.Header.MerkleRoot, randomBlock.Header.Time, randomBlock.Header.Bits, randomBlock.Header.Nonce),
                transactions: ImmutableArray.Create(randomBlock.Transactions.ToArray())
                            );

            var differentBlock = randomBlock.With(Header: randomBlock.Header.With(Bits: ~randomBlock.Header.Bits));

            Assert.IsTrue(randomBlock.Equals(sameBlock));
            Assert.IsTrue(randomBlock == sameBlock);
            Assert.IsFalse(randomBlock != sameBlock);

            Assert.IsFalse(randomBlock.Equals(differentBlock));
            Assert.IsFalse(randomBlock == differentBlock);
            Assert.IsTrue(randomBlock != differentBlock);
        }