private bool VerifyBlock(BlockDetailedModel model) { foreach (var mod in model.Transactions) { mod.State = "Unverified"; } var transactionHash = MerkleTree <TransactionModel> .Compute(model.Transactions.OrderBy(x => x.Id).ToList()); var obj = new MiningBlock { Hash = transactionHash.TrimEnd('=') + model.PreviousHash.TrimEnd('='), PreviousBlockHash = model.PreviousHash.TrimEnd('='), Nonce = model.Nonce, Miner = model.Miner }; using (SHA256Managed sha = new SHA256Managed()) { using (MemoryStream ms = new MemoryStream()) { ms.Position = 0; BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); return(model.Hash == Convert.ToBase64String(sha.ComputeHash(ms.ToArray()))); } } }
private CreateBlockModel Mining() { if (Block.Transactions.Count == 0) { return(null); } var transactionHash = MerkleTree <TransactionModel> .Compute(Block.Transactions.OrderBy(x => x.Id).ToList()); var obj = new MiningBlock { Hash = transactionHash.TrimEnd('=') + Block.PreviousHash.TrimEnd('='), PreviousBlockHash = Block.PreviousHash.TrimEnd('='), Nonce = -1, Miner = User }; string blockResultHash; using (SHA256Managed sha = new SHA256Managed()) { using (MemoryStream ms = new MemoryStream()) { do { if (_miningTokenSource.IsCancellationRequested) { return(null); } obj.Nonce++; _hashCurr = obj.Nonce; ms.Position = 0; BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); blockResultHash = Convert.ToBase64String(sha.ComputeHash(ms.ToArray())); ThreadHelperClass.SetText(this, Output, blockResultHash); }while (!blockResultHash.Substring(0, 2).All(x => x == '0')); return(new CreateBlockModel { Date = DateTimeOffset.Now, Hash = blockResultHash, Miner = User, Nonce = obj.Nonce, PrevBlockHash = Block.PreviousHash, Transactions = Block.Transactions.Select(x => x.Id).ToList() }); } } }
private void SendDetails() { DetailData data = new DetailData(); data.EntityId = MiningBlock.EntityId; data.Details = m_syncDetails.ToString(); var bytes = ASCIIEncoding.ASCII.GetBytes(MyAPIGateway.Utilities.SerializeToXML(data)); var localSteamId = MyAPIGateway.Multiplayer.MyId; var distSq = MyAPIGateway.Session.SessionSettings.SyncDistance; distSq += 1000; // some safety padding, avoid desync distSq *= distSq; var players = new List <IMyPlayer>(); MyAPIGateway.Players.GetPlayers(players); foreach (var p in players) { var steamId = p.SteamUserId; if (steamId != localSteamId && Vector3D.DistanceSquared(p.GetPosition(), MiningBlock.GetPosition()) <= distSq) { MyAPIGateway.Multiplayer.SendMessageTo(8954, bytes, p.SteamUserId); } } players.Clear(); }