加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

使用C#编写自己的区块链挖矿算法

发布时间:2019-08-08 23:55:10 所属栏目:传媒 来源:MyZony
导读:副标题#e# 什么是加密货币挖掘? 一个加密货币的价值体现在它的稀缺性上,如果任何人都可以任意构造一个比特币,那么比特币就毫无价值,所以比特币的区块链会让参与者完成一项工作,根据这个工作的最终结果还分发比特币,这个过程就被叫做挖矿。这就类似于

我们首先添加一个新的方法来验证生成的散列值是否包含指定数量的前导 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;  

(编辑:云计算网_泰州站长网)

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

推荐文章
    热点阅读