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); }
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())); }
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())); }
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); }
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); }
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); }
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()); }