private void Engine_OnNewBlockCreated(object sender, BlockHead e) { var blk = this.selfNode.Engine.BlockChain.GetBlock(e.Hash); this.Broadcast(new BlockCommand { Block = blk }); }
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); }