void P2P_NewBlock_Handle(Session session, int opcode, object msg) { P2P_NewBlock p2p_Block = msg as P2P_NewBlock; Block blk = JsonHelper.FromJson <Block>(p2p_Block.block); if (!NodeManager.CheckNetworkID(p2p_Block.networkID)) { Log.Warning($"NewBlk:{blk.Address} H:{blk.height} ipEndPoint:{p2p_Block.ipEndPoint} RemoteAddress:{session.RemoteAddress}"); return; } //Log.Debug($"NewBlock IP:{session.RemoteAddress.ToString()} {blk.Address} hash:{blk.hash} "); Log.Debug($"NewBlk:{blk.Address} H:{blk.height} Pre:{blk.prehash} T:{blk.linkstran.Count}"); newBlockHeight = blk.height; // 有高度差的直接忽略 long.TryParse(levelDBStore.Get("UndoHeight"), out long transferHeight); if (transferHeight - 1 < blk.height) { AddBlock(blk); } //// 如果收到的是桶外的数据 , 向K桶内进行一次广播 //if (nodeManager.IsNeedBroadcast2Kad(p2p_Block.ipEndPoint)) //{ // p2p_Block.ipEndPoint = Entity.Root.GetComponent<ComponentNetworkInner>().ipEndPoint.ToString(); // nodeManager.Broadcast2Kad(p2p_Block); //} }
void P2P_NewBlock_Handle(Session session, int opcode, object msg) { P2P_NewBlock p2p_Block = msg as P2P_NewBlock; var newBlock = new P2P_NewBlock() { block = p2p_Block.block, ipEndPoint = p2p_Block.ipEndPoint }; newBlocks.RemoveAll((x) => { return(x.ipEndPoint == newBlock.ipEndPoint); }); newBlocks.Add(newBlock); }
void P2P_NewBlock_Handle(Session session, int opcode, object msg) { P2P_NewBlock p2p_Block = msg as P2P_NewBlock; if (!NodeManager.CheckNetworkID(p2p_Block.networkID)) { return; } //var newBlock = new P2P_NewBlock() { block = p2p_Block.block, networkID = BlockMgr.networkID,ipEndPoint = p2p_Block.ipEndPoint }; var newBlock = new P2P_NewBlock() { block = p2p_Block.block, networkID = NodeManager.networkIDBase, ipEndPoint = Entity.Root.GetComponent <ComponentNetworkInner>().ipEndPoint.ToString() }; relayNetworkInner.BroadcastToAll(newBlock); }
public async void Broadcast(P2P_NewBlock p2p_Block, Block block) { var myNodeId = GetMyNodeId(); for (int i = 0; i < nodes.Count; i++) { NodeData node = nodes[i]; if (node.nodeId != myNodeId) { Session session = await networkInner.Get(NetworkHelper.ToIPEndPoint(node.ipEndPoint)); if (session != null && session.IsConnect()) { session.Send(p2p_Block); } } } }
void P2P_NewBlock_Handle(Session session, int opcode, object msg) { P2P_NewBlock p2p_Block = msg as P2P_NewBlock; Block blk = JsonHelper.FromJson <Block>(p2p_Block.block); Log.Debug($"NewBlock IP:{session.RemoteAddress.ToString()} hash:{blk.hash} "); // 有高度差的直接忽略 long.TryParse(levelDBStore.Get("UndoHeight"), out long transferHeight); if (transferHeight - 1 < blk.height) { AddBlock(blk); } // 如果收到的是桶外的数据 , 向K桶内进行一次广播 if (nodeManager.IsNeedBroadcast2Kad(session.RemoteAddress)) { nodeManager.Broadcast2Kad(p2p_Block); } }
public async void Run() { //Entity.Root.GetComponent<LevelDBStore>().Undo(100); await Task.Delay(3000); long.TryParse(levelDBStore.Get("UndoHeight"), out height); Log.Debug($"Rule.Run at height {height}"); Wallet wallet = Wallet.GetWallet(); P2P_NewBlock p2p_NewBlock = new P2P_NewBlock() { networkID = NodeManager.networkIDBase }; Block blk = null; Block preblk = null; TimePass timePass = new TimePass(1); bool bBlkMining = true; if (httpRule == null) { broadcasttime = pooltime * 5 / 15; // 不挖矿就提前广播块 } state = 0xff; while (true) { try { if (state < 0xff) { await Task.Delay(1000); } long time = (nodeManager.GetNodeTime() / 1000) % pooltime; if (blk == null && time < broadcasttime && timePass.IsPassSet()) { preblk = GetLastMcBlock(); if (consensus.IsRule(preblk.height + 1, wallet.GetCurWallet().ToAddress())) { blk = CreateBlock(preblk, ref bBlkMining); if (blk != null && bBlkMining) { diff_max = 0; hashmining = blk.ToHashMining(); httpRule?.SetMinging(blk.height, hashmining, consensus.calculatePower.GetPower()); } } else { long.TryParse(levelDBStore.Get("UndoHeight"), out height); await Task.Delay(1000); } } if (blk != null && httpRule == null) { // 挖矿 if (httpRule == null && bBlkMining) { Mining(blk, hashmining); } } // 广播块 if (blk != null && time >= broadcasttime) { if (bBlkMining) { if (httpRule != null) { Dictionary <string, MinerTask> miners = httpRule.GetMiner(blk.height); if (miners != null) { double diff = miners.Values.Max(t => t.diff); var miner = miners.Values.FirstOrDefault(c => c.diff == diff); if (miner != null && miner.random != null && miner.random.Count > 0) { blk.random = miner.random[miner.random.Count - 1]; } httpRule.SetMinging(blk.height, "", consensus.calculatePower.GetPower()); } } height = blk.height; blk.hash = blk.ToHash(); blk.sign = blk.ToSign(Wallet.GetWallet().GetCurWallet()); blockMgr.AddBlock(blk); } p2p_NewBlock.block = JsonHelper.ToJson(blk); p2p_NewBlock.ipEndPoint = networkInner.ipEndPoint.ToString(); nodeManager.Broadcast(p2p_NewBlock, blk); relayNetwork?.Broadcast(p2p_NewBlock); Log.Debug($"Rule.Broadcast H:{blk.height} Mining:{bBlkMining} hash:{blk.hash} T:{blk.linkstran.Count}"); calculatePower.Insert(blk); hashmining = ""; diff_max = 0; blk = null; } await Task.Delay(10); } catch (Exception) { await Task.Delay(1000); } } }
public void Broadcast(P2P_NewBlock p2p_NewBlock) { relayNetworkInner.BroadcastToAll(p2p_NewBlock); }
public async void Run() { //Entity.Root.GetComponent<LevelDBStore>().Undo(100); await Task.Delay(3000); long.TryParse(levelDBStore.Get("UndoHeight"), out height); Log.Debug($"Rule.Run at height {height}"); Wallet wallet = Wallet.GetWallet(); P2P_NewBlock p2p_NewBlock = new P2P_NewBlock(); Block blk = null; Block preblk = null; TimePass timePass = new TimePass(1); var httpRule = Entity.Root.GetComponent <HttpPool>(); state = 0xff; while (true) { try { if (state < 0xff) { await Task.Delay(1000); } long time = (nodeManager.GetNodeTime() / 1000) % pooltime; if (blk == null && time < broadcasttime && timePass.IsPassSet()) { // 找到最新的Mc块 preblk = GetLastMcBlock(); // 是否在裁决节点列表中 if (consensus.IsRule(preblk.height + 1, wallet.GetCurWallet().ToAddress())) { // 生成主块 blk = CreateBlock(preblk); diff_max = 0; hashmining = blk.ToHashMining(); httpRule?.SetMinging(blk.height, hashmining, consensus.calculatePower.GetPower()); } else { long.TryParse(levelDBStore.Get("UndoHeight"), out height); await Task.Delay(1000); } } if (blk != null && httpRule == null) { // 挖矿 这里是提交算力 by sxh Mining(blk, hashmining); } // 广播块 if (blk != null && time >= broadcasttime) { if (httpRule != null) { Dictionary <string, MinerTask> miners = httpRule.GetMiner(blk.height); if (miners != null) { double diff = miners.Values.Max(t => t.diff); var miner = miners.Values.First(c => c.diff == diff); blk.random = miner.random; httpRule?.SetMinging(blk.height, "", consensus.calculatePower.GetPower()); } } height = blk.height; blk.hash = blk.ToHash(); blk.sign = blk.ToSign(Wallet.GetWallet().GetCurWallet()); blockMgr.AddBlock(blk); p2p_NewBlock.block = JsonHelper.ToJson(blk); p2p_NewBlock.ipEndPoint = networkInner.ipEndPoint.ToString(); nodeManager.Broadcast(p2p_NewBlock); diff_max = 0; Log.Debug($"Rule.Broadcast {blk.height} {blk.hash}"); calculatePower.Insert(blk); blk = null; hashmining = ""; } await Task.Delay(10); } catch (Exception) { await Task.Delay(1000); } } }