Esempio n. 1
0
        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())));
                }
            }
        }
Esempio n. 2
0
        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()
                    });
                }
            }
        }
Esempio n. 3
0
        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();
        }