Esempio n. 1
0
        public string GetMiningWorkResult(BlockMsg block)
        {
            var listBytes = new List <Byte>();

            listBytes.AddRange(Base16.Decode(block.Header.PayloadHash));
            listBytes.AddRange(BitConverter.GetBytes(block.Header.Height));
            var genHash = Sha3Helper.Hash(listBytes.ToArray());
            //POC.CalculateScoopData(block.Header., block.Header.Nonce);



            var blockData = new List <byte>();

            foreach (var tx in block.Transactions)
            {
                blockData.AddRange(tx.Serialize());
            }

            var nonceBytes = BitConverter.GetBytes(block.Header.Nonce);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(nonceBytes);
            }

            blockData.AddRange(nonceBytes);
            var result = Base16.Encode(
                HashHelper.Hash(
                    blockData.ToArray()
                    ));

            return(result);
        }
Esempio n. 2
0
        public static byte[] GenHash(string payloadHash, long blockHeight)
        {
            var payloadBytes = Base16.Decode(payloadHash);
            var heightBytes  = BitConverter.GetBytes(blockHeight);
            var hashSeed     = new List <byte>();

            hashSeed.AddRange(payloadBytes);
            hashSeed.AddRange(heightBytes);
            return(Sha3Helper.Hash(hashSeed.ToArray()));
        }
Esempio n. 3
0
        public static byte[] CalculateGenerationSignature(string prevGenSig, string prevGenratorAddress)
        {
            if (string.IsNullOrWhiteSpace(prevGenSig) || string.IsNullOrWhiteSpace(prevGenratorAddress))
            {
                return(HashHelper.EmptyHash());
            }

            var genSigSeed = new List <byte>();

            genSigSeed.AddRange(Base16.Decode(prevGenSig));
            genSigSeed.AddRange(Base58.Decode(prevGenratorAddress));
            return(Sha3Helper.Hash(genSigSeed.ToArray()));
        }
Esempio n. 4
0
        public static byte[] GetMiningWorkResult(BlockMsg block)
        {
            var listBytes = new List <Byte>();

            listBytes.AddRange(Base16.Decode(block.Header.PayloadHash));
            listBytes.AddRange(BitConverter.GetBytes(block.Header.Height));
            var         genHash         = Sha3Helper.Hash(listBytes.ToArray());
            var         scoopNumber     = POC.GetScoopNumber(block.Header.PayloadHash, block.Header.Height);
            var         scoopData       = POC.CalculateScoopData(block.Header.GeneratorId, block.Header.Nonce, scoopNumber);
            List <byte> targetByteLists = new List <byte>();

            targetByteLists.AddRange(scoopData);
            targetByteLists.AddRange(genHash);
            var baseTarget = Sha3Helper.Hash(targetByteLists.ToArray());

            return(baseTarget);
        }
Esempio n. 5
0
        public static int GetScoopNumber(string payloadHash, long blockHeight)
        {
            var hashByte = Base16.Decode(payloadHash);
            var hashSeed = new List <byte>();

            hashSeed.AddRange(hashByte);
            var heightBytes = BitConverter.GetBytes(blockHeight);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(heightBytes);
            }

            hashSeed.AddRange(heightBytes);
            var genHash = Sha3Helper.Hash(hashSeed.ToArray());

            var bigScoopNumber = ConvertByesToBigInteger(genHash) % new BigInteger(MAX_SCOOP_NUMBER + 1);

            return((int)bigScoopNumber);
        }
Esempio n. 6
0
        public static NonceData GenerateNonceData(string walletAddress, long nonce)
        {
            var nonceData = new NonceData();

            nonceData.Nonce = nonce;
            var hashList = new List <ScoopDataItem>();

            var addressBytes = Base58.Decode(walletAddress);
            var nonceBytes   = BitConverter.GetBytes(nonce);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(nonceBytes);
            }

            var seed = new List <byte>();

            seed.AddRange(addressBytes);
            seed.AddRange(nonceBytes);
            var index = MAX_HASH_NUMBER;

            byte[] lastHash = null;

            while (index >= 0)
            {
                if (lastHash != null)
                {
                    seed.InsertRange(0, lastHash);
                }

                byte[] buffer;

                if (seed.Count > MAX_SEED_LENGTH)
                {
                    buffer = new byte[MAX_SEED_LENGTH];
                    Array.Copy(seed.ToArray(), buffer, buffer.Length);
                }
                else
                {
                    buffer = seed.ToArray();
                }

                var hash = Sha3Helper.Hash(buffer);
                hashList.Insert(0, new ScoopDataItem()
                {
                    Index = index, Hash = hash
                });

                lastHash = hash;
                index--;
            }

            for (var i = 0; i <= MAX_SCOOP_NUMBER; i++)
            {
                var scoopData = new ScoopData();
                scoopData.Index      = i;
                scoopData.FirstData  = hashList[i * 2];
                scoopData.SecondData = hashList[MAX_HASH_NUMBER - (i * 2)];

                nonceData.DataList.Add(scoopData);
            }

            //for(var i = 0; i<= MAX_SCOOP_NUMBER; i ++)
            //{
            //    nonceData.DataList[i].SecondData = hashList[MAX_HASH_NUMBER - (i * 2)];
            //}

            return(nonceData);
        }
Esempio n. 7
0
        public static byte[] CalculateScoopData(string walletAddress, long nonce, int scoopNumber)
        {
            var firstHashIndex  = scoopNumber * 2;
            var secondHashIndex = MAX_HASH_NUMBER - (scoopNumber * 2);

            byte[] firstHash  = null;
            byte[] secondHash = null;

            var addressBytes = Base58.Decode(walletAddress);
            var nonceBytes   = BitConverter.GetBytes(nonce);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(nonceBytes);
            }

            var seed = new List <byte>();

            seed.AddRange(addressBytes);
            seed.AddRange(nonceBytes);
            var index = MAX_HASH_NUMBER;

            byte[] lastHash = null;

            while (index >= Math.Min(firstHashIndex, secondHashIndex))
            {
                if (lastHash != null)
                {
                    seed.InsertRange(0, lastHash);
                }

                byte[] buffer;

                if (seed.Count > MAX_SEED_LENGTH)
                {
                    buffer = new byte[MAX_SEED_LENGTH];
                    Array.Copy(seed.ToArray(), buffer, buffer.Length);
                }
                else
                {
                    buffer = seed.ToArray();
                }

                var hash = Sha3Helper.Hash(buffer);
                lastHash = hash;

                if (index == secondHashIndex)
                {
                    secondHash = hash;
                }
                else if (index == firstHashIndex)
                {
                    firstHash = hash;
                }

                index--;
            }

            var data = new List <byte>();

            data.AddRange(firstHash);
            data.AddRange(secondHash);

            return(data.ToArray());
        }