Ejemplo n.º 1
0
        private void Engine_OnNewBlockCreated(object sender, BlockHead e)
        {
            var blk = this.selfNode.Engine.BlockChain.GetBlock(e.Hash);

            this.Broadcast(new BlockCommand {
                Block = blk
            });
        }
Ejemplo n.º 2
0
        private BlockHead GenerateBlock()
        {
            var finalTxs = this.BlockChain.DequeueTxs()
                           .Where(this.ValidateTx)
                           .ToList();

            var fee = CollectFee(finalTxs);

            this.MinerWallet.GenerateKeyPair();
            var minerTx = new Transaction
            {
                Outputs = new[] { new TxOutput {
                                      PublicKey = this.MinerWallet.PublicKey, Value = this.BlockChain.RewardOfBlock + fee
                                  } },
            };
            var allTxs = new[] { minerTx }.Concat(finalTxs).ToArray();

            var prevBlock  = this.BlockChain.Tail;
            var merkleRoot = MerkleTree.GetMerkleRoot(allTxs.Select(_ => _.Hash).ToArray());
            var blockHead  = new BlockHead
            {
                PreviousBlockHash = prevBlock.Hash,
                Time       = DateTime.Now,
                MerkleRoot = merkleRoot,
            };
            var block = this.BlockChain.AddBlock(new Block
            {
                Head = blockHead,
                Txs  = allTxs,
            });

            if (block == null)
            {
                foreach (var tx in finalTxs)
                {
                    this.BlockChain.SyncTx(tx);
                }
            }
            return(block);
        }