コード例 #1
0
        Types.Block Child(Types.Block bk, int addHours)
        {
            var nonce = new byte[10];

            new Random().NextBytes(nonce);
            //var nonce = new byte[] { };

            var timestamp = DateTime.Now.ToUniversalTime().AddHours(addHours).Ticks;

            var header = new Types.BlockHeader(
                0,
                Merkle.blockHeaderHasher.Invoke(bk.header),
                bk.header.blockNumber + 1,
                new byte[] { },
                new byte[] { },
                new byte[] { },
                ListModule.OfSeq <byte[]>(new List <byte[]>()),
                timestamp,
                0,
                nonce
                );

            var txs = new List <Types.Transaction>();

            txs.Add(Utils.GetTx());

            return(new Types.Block(header, ListModule.OfSeq(txs)));
        }
コード例 #2
0
        public static Types.Block Child(this Types.Block bk)
        {
            var nonce = new byte[10];

            new Random().NextBytes(nonce);
            //var nonce = new byte[] { };

            var header = new Types.BlockHeader(
                0,
                Merkle.blockHeaderHasher.Invoke(bk.header),
                bk.header.blockNumber + 1,
                new byte[] { },
                new byte[] { },
                new byte[] { },
                ListModule.OfSeq <byte[]>(new List <byte[]>()),
                DateTime.Now.ToUniversalTime().Ticks,
                0,
                nonce
                );

            var txs = new List <Types.Transaction>();

            txs.Add(Utils.GetCoinbaseTx(bk.header.blockNumber + 1));

            return(new Types.Block(header, ListModule.OfSeq(txs)));
        }
コード例 #3
0
        public static Types.Block AddTx(this Types.Block bk, Types.Transaction tx)
        {
            //var nonce = new byte[10];
            //new Random().NextBytes(nonce);
            var nonce = new byte[] { };

            var header = new Types.BlockHeader(
                0,
                new byte[] { },
                bk.header.blockNumber + 1,
                new byte[] { },
                new byte[] { },
                new byte[] { },
                ListModule.OfSeq <byte[]>(new List <byte[]>()),
                DateTime.Now.ToUniversalTime().Ticks,
                0,
                nonce
                );

            var txs = bk.transactions.ToList();

            txs.Add(tx);

            return(new Types.Block(bk.header, ListModule.OfSeq <Types.Transaction>(txs)));
        }
コード例 #4
0
        public static Types.Block GetGenesisBlock()
        {
            var nonce = new byte[10];

            new Random().NextBytes(nonce);

            var header = new Types.BlockHeader(
                0,
                new byte[] { },
                0,
                new byte[] { },
                new byte[] { },
                new byte[] { },
                ListModule.OfSeq <byte[]>(new List <byte[]>()),
                DateTime.Now.ToUniversalTime().Ticks,
                0,
                nonce
                );

            var txs = new List <Types.Transaction>();

            txs.Add(GetTx());

            return(new Types.Block(header, ListModule.OfSeq(txs)));
        }
コード例 #5
0
ファイル: Hasher.cs プロジェクト: zenprotocol/zen-wallet
		public void SetHeader(Types.BlockHeader header)
        {
            //Pause("setting header");
            _Header = header;
			var random = new Random();
			random.NextBytes(_Header.nonce);


            //Continue();
		}
コード例 #6
0
ファイル: Util.cs プロジェクト: zenprotocol/zen-wallet
        public static Types.Block GetBlock(Types.Block parent, Double difficulty)
        {
            UInt32 pdiff = Convert.ToUInt32(difficulty);

            byte[] parentKey = parent == null ? new byte[] {} : Merkle.blockHeaderHasher.Invoke(parent.header);

            Types.BlockHeader newBlockHeader = new Types.BlockHeader(1, parentKey, 0, new byte[] { }, new byte[] { }, new byte[] { }, ListModule.OfSeq(new List <byte[]>()), 0, pdiff, null);
            var transactions = new List <Types.Transaction>();
            FSharpList <Types.Transaction> newBlockTransactions = ListModule.OfSeq(transactions);

            Types.Block newBlock = new Types.Block(newBlockHeader, newBlockTransactions);

            return(newBlock);
        }
コード例 #7
0
        public void Render()
        {
            if (Value != null)
            {
                return;
            }

            var parentKey = new byte[] { };

            if (Parent != null)
            {
                Parent.Render();
                parentKey = Parent.Value.Key;
            }

            uint   version = 1;
            string date    = "2000-02-02";

            var blockHeader = new Types.BlockHeader(
                version,
                parentKey,
                0,
                new byte[] { },
                new byte[] { },
                new byte[] { },
                ListModule.OfSeq <byte[]>(new List <byte[]>()),
                DateTime.Parse(date).ToBinary(),
                1,
                new byte[] { }
                );

            //_TestTransactionPool.Render();

            //var block = new Types.Block(blockHeader, ListModule.OfSeq<Types.Transaction>(_TestTransactionPool.Values.Select(t => t.Value.Value)));
            var block = new Types.Block(blockHeader, ListModule.OfSeq <Types.Transaction>(_Transactions));

//			byte[] key = Merkle.blockHasher.Invoke(block);
            byte[] key = Merkle.blockHeaderHasher.Invoke(block.header);

            Value = new Keyed <Types.Block>(key, block);

            TestTrace.Transaction(Tag, key);
        }
コード例 #8
0
        public GenesisBlock()
        {
            Keys        = new Key[10];
            CoinbaseKey = Key.Create();

            for (int i = 0; i < 10; i++)
            {
                Keys[i] = Key.Create();
            }

            var nonce = new byte[10];

            new Random().NextBytes(nonce);

            var header = new Types.BlockHeader(
                0,
                new byte[] { },
                0,
                new byte[] { },
                new byte[] { },
                new byte[] { },
                ListModule.OfSeq <byte[]>(new List <byte[]>()),
                DateTime.Now.ToUniversalTime().Ticks,
                0,
                nonce
                );

            var txs = new List <Types.Transaction>();

            txs.Add(Utils.GetCoinbaseTx(0));

            for (int i = 0; i < 10; i++)
            {
                txs.Add(Utils.GetTx().AddOutput(Keys[i].Address, Consensus.Tests.zhash, (ulong)i * 1111));
            }

            Block = new Types.Block(header, ListModule.OfSeq(txs));
        }
コード例 #9
0
        void RecalculateHeader()
        {
            if (_BlockChain.Tip == null)
            {
                return;
            }

            if (_TransactionQueue.IsStuck)
            {
                MinerTrace.Information("Queue is stuck. count = " + _TransactionQueue.Count);
            }

            while (!_TransactionQueue.IsStuck && _ValidatedTxs.Count < TxsPerBlockLimit)
            {
                var ptx = _TransactionQueue.Take();

                if (IsTransactionValid(ptx))
                {
                    _ValidatedTxs.Add(ptx);

                    _TransactionQueue.Remove();

                    HandleTx(ptx);
                }
                else
                {
                    MinerTrace.Information("Tx invalid");
                    _TransactionQueue.Next();
                }
            }

            if (_ValidatedTxs.Count == 0)
            {
                MinerTrace.Information("No txs");
                return;                 // don't allow empty blocks
            }

            CalculateCoinbase();

            var txs = ListModule.OfSeq(FSharpList <Types.Transaction> .Cons(_Coinbase, ListModule.OfSeq(_ValidatedTxs.Select(TransactionValidation.unpoint))));

            _Header = new Types.BlockHeader(
                0,
                _BlockChain.Tip.Key,
                _BlockChain.Tip.Value.header.blockNumber + 1,
                Merkle.merkleRoot(
                    new byte[] { },
                    Merkle.transactionHasher,
                    txs
                    ),
                new byte[] { },
                new byte[] { },
                ListModule.Empty <byte[]>(),
                DateTime.Now.ToUniversalTime().Ticks,
                Difficulty,
                new byte[12]
                );

            MinerTrace.Information($"Mining block number {_BlockChain.Tip.Value.header.blockNumber + 1} with {_ValidatedTxs.Count()} txs");

            _Hasher.SetHeader(_Header);
            _Hasher.Continue();
        }
コード例 #10
0
ファイル: BlockStore.cs プロジェクト: zenprotocol/zen-wallet
        public bool IsCoinbaseTx(TransactionContext transactionContext, byte[] txHash, out Types.BlockHeader blockHeader)
        {
            var record = transactionContext.Transaction.Select <byte[], byte[]>(COINBASETX_BLOCK, txHash);

            blockHeader = record.Exists ? Get(transactionContext, record.Value).Value.BlockHeader : null;

            return(record.Exists);
        }