加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

行使C#编写本身的区块链挖矿算法

发布时间:2019-08-10 18:00:51 所属栏目:业界 来源:MyZony
导读:什么是加密钱币发掘? 一个加密钱币的代价表此刻它的稀缺性上,假如任何人都可以恣意结构一个比特币,那么比特币就毫无代价,以是比特币的区块链会让参加者完成一项事变,按照这个事变的最终功效还分发比特币,这个进程就被叫做挖矿。这就相同于一个黄金矿

我们起首添加一个新的要领来验证天生的散列值是否包括指定命量的前导 0 :

  1. /// <summary>  
  2. /// 校验 Hash 是否有用  
  3. /// </summary>  
  4. /// <param name="hashStr">Hash 值</param>  
  5. /// <param name="difficulty">难度</param>  
  6. /// <returns></returns>  
  7. public static bool IsHashValid(string hashStr, int difficulty)  
  8. {  
  9.             var bytes = Enumerable.Range(0, hashStr.Length)  
  10.                 .Where(n => n % 2 == 0)  
  11.                 .Select(n => Convert.ToByte(hashStr.Substring(n, 2), 16))  
  12.                 .ToArray();  
  13.             var bits = new BitArray(bytes);  
  14.             for (var i = 0; i < difficulty; i++)  
  15.             {  
  16.                 if (bits[i]) return false;  
  17.             }  
  18.             return true;  

然后我们变动了之前区块 Hash 的天生要领:

  1. /// <summary>  
  2. /// 计较区块 HASH 值  
  3. /// </summary>  
  4. /// <param name="block">区块实例</param>  
  5. /// <returns>计较完成的区块散列值</returns>  
  6. public static string CalculateHash(Block block)  
  7. {  
  8.     string calculationStr = $"{block.Index}{block.TimeStamp}{block.BPM}{block.PrevHash}{block.Nonce}";  
  9.     SHA256 sha256Generator = SHA256.Create();  
  10.     byte[] sha256HashBytes = sha256Generator.ComputeHash(Encoding.UTF8.GetBytes(calculationStr));  
  11.     StringBuilder sha256StrBuilder = new StringBuilder();  
  12.     foreach (byte @byte in sha256HashBytes)  
  13.     {  
  14.         sha256StrBuilder.Append(@byte.ToString("x2"));  
  15.     }  
  16.     return sha256StrBuilder.ToString();  

在这里我们新增新增了 Nonce 随机值作为散列天生的依据。

那么我们天生新区块的时辰就趁便来挖矿吧:

  1. /// <summary>  
  2. /// 天生新的区块  
  3. /// </summary>  
  4. /// <param name="oldBlock">旧的区块数据</param>  
  5. /// <param name="BPM">心率</param>  
  6. /// <returns>新的区块</returns>  
  7. public static Block GenerateBlock(Block oldBlock, int BPM)  
  8. {  
  9.     Block newnewBlock = new Block()  
  10.     {  
  11.         Index = oldBlock.Index + 1,  
  12.         TimeStamp = CalculateCurrentTimeUTC(),  
  13.         BPMBPM = BPM,  
  14.         PrevHash = oldBlock.Hash,  
  15.         DifficultyDifficulty = Difficulty  
  16.     };  
  17.     // 挖矿 ing...  
  18.     for (int i = 0; ; i++)  
  19.     {  
  20.         newBlock.Nonce = i.ToString("x2");  
  21.         if (!IsHashValid(CalculateHash(newBlock), Difficulty))  
  22.         {  
  23.             Console.WriteLine($"今朝功效:{CalculateHash(newBlock)} ,正在计较中...");  
  24.             Task.Delay(1);  
  25.             continue;  
  26.         }  
  27.         else  
  28.         {  
  29.             Console.WriteLine($"今朝功效:{CalculateHash(newBlock)} ,计较完毕...");  
  30.             newBlock.Hash = CalculateHash(newBlock);  
  31.             break;  
  32.         }  
  33.     }  
  34.     // 原有代码  
  35.     // newBlock.Hash = CalculateHash(newBlock);  
  36.     return newBlock;  

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读