最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C#編寫自己的區(qū)塊鏈挖礦算法

 更新時間:2019年08月12日 16:37:15   作者:MyZony  
這篇文章主要介紹了使用C#編寫自己的區(qū)塊鏈挖礦算法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

什么是加密貨幣挖掘?

一個加密貨幣的價值體現(xiàn)在它的稀缺性上,如果任何人都可以任意構(gòu)造一個比特幣,那么比特幣就毫無價值,所以比特幣的區(qū)塊鏈會讓參與者完成一項“工作”,根據(jù)這個工作的最終結(jié)果還分發(fā)比特幣,這個過程就被叫做“挖礦”。這就類似于一個黃金礦工花一些時間來工作,然后獲得一點黃金。

挖礦的原理

如果你百度/谷歌搜索 比特幣挖礦的原理 的話,都會給你說是計算一個復雜的數(shù)學問題而已,但是這么說的話太籠統(tǒng)而且也太簡單。采礦引擎如何工作這是一個重要的知識點,所以我們需要了解一些密碼學知識和哈希算法相關(guān)的知識,才能知道挖礦的基本原理。

哈希/散列介紹

單向加密人類能夠理解的輸入,例如 Hello World ,并將其扔到某個加密函數(shù)(即所謂的復雜的數(shù)學問題),加密函數(shù)的算法越復雜,逆向工程就越困難。

例如一個 SHA - 256 的例子,這個網(wǎng)站(鏈接: http://tool.oschina.net/encrypt?type=2 )可以很快的計算散列值,讓我們來散列 “Hello World” 看看會得到什么結(jié)果:

不管你試驗幾次都會得到一樣的散列值,在編程中這種被稱之為冪等性。

加密算法的一個基本特性就是,它們很難通過逆向工程來得到明文結(jié)果,但是十分容易驗證他們的加密結(jié)果,例如這里的 “Hello World” 很難通過逆向工程得到他的原明文結(jié)果,比特幣采用的是 Double SHA-256 也就是將明文通過 SHA-256 計算過一次之后,再拿 SHA-256 針對散列值再次進行計算,在這里我們只使用 SHA-256 來進行加密。

工作證明

比特幣通過讓參與者散列隨機的字母與數(shù)字的組合,直到計算出來的散列包含前導 0。

例如我們計算 886 的散列值可以得到如下結(jié)果:

000f21ac06aceb9cdd0575e82d0d85fc39bed0a7a1d71970ba1641666a44f530

它返回了 3 個 0 作為前綴的散列值,但是我們怎么知道 886 計算出來的散列結(jié)果產(chǎn)生了 3 個 0呢?

答案是我并不需要知道。我需要知道礦工給我的散列值前導有幾個零就好了,并不需要復雜的算法來驗證整個散列值的有效性。

比特幣則稍微復雜一點,它每隔 10 分鐘生成一個新的區(qū)塊,新區(qū)塊的散列值的難度它可以動態(tài)調(diào)整,就類似于 CLR 的 GC 一樣,它可以根據(jù)目前挖礦的人數(shù)來進行難度動態(tài)調(diào)整,如果挖礦的人多的話,則調(diào)高難度,少則調(diào)低。

動手開發(fā)

1.項目配置

首先新建一個 Asp.Net Core 項目,然后選擇 Empty Project(空項目) 類型,建立完成后無需進行任何配置。

2.數(shù)據(jù)模型

這里我們來創(chuàng)建一個具體的區(qū)塊數(shù)據(jù)模型,使用的是 Struct 結(jié)構(gòu)體。

public struct Block 
{ 
  /// <summary> 
  /// 區(qū)塊位置 
  /// </summary> 
  public int Index { get; set; } 
  /// <summary> 
  /// 區(qū)塊生成時間戳 
  /// </summary> 
  public string TimeStamp { get; set; } 
  /// <summary> 
  /// 心率數(shù)值 
  /// </summary> 
  public int BPM { get; set; } 
  /// <summary> 
  /// 區(qū)塊 SHA-256 散列值 
  /// </summary> 
  public string Hash { get; set; } 
  /// <summary> 
  /// 前一個區(qū)塊 SHA-256 散列值 
  /// </summary> 
  public string PrevHash { get; set; } 
  /// <summary> 
  /// 下一個區(qū)塊生成難度 
  /// </summary> 
  public int Difficulty { get; set; } 
  /// <summary> 
  /// 隨機值 
  /// </summary> 
  public string Nonce { get; set; } 
}

Difficulty 是一個整形,他定義了我們希望得到哈希前導 0 的數(shù)量,前導 0 越多,生成正確的散列值就越困難,我們現(xiàn)在從 1 開始。

Nonce 則是每次計算塊散列值所需要的隨機值。

3. 工作證明

我們首先添加一個新的方法來驗證生成的散列值是否包含指定數(shù)量的前導 0 :

/// <summary> 
/// 校驗 Hash 是否有效 
/// </summary> 
/// <param name="hashStr">Hash 值</param> 
/// <param name="difficulty">難度</param> 
/// <returns></returns> 
public static bool IsHashValid(string hashStr, int difficulty) 
{ 
      var bytes = Enumerable.Range(0, hashStr.Length) 
        .Where(n => n % 2 == 0) 
        .Select(n => Convert.ToByte(hashStr.Substring(n, 2), 16)) 
        .ToArray(); 
      var bits = new BitArray(bytes); 
      for (var i = 0; i < difficulty; i++) 
      { 
        if (bits[i]) return false; 
      } 
      return true; 
}

然后我們更改了之前區(qū)塊 Hash 的生成方法:

/// <summary> 
/// 計算區(qū)塊 HASH 值 
/// </summary> 
/// <param name="block">區(qū)塊實例</param> 
/// <returns>計算完成的區(qū)塊散列值</returns> 
public static string CalculateHash(Block block) 
{ 
  string calculationStr = $"{block.Index}{block.TimeStamp}{block.BPM}{block.PrevHash}{block.Nonce}"; 
  SHA256 sha256Generator = SHA256.Create(); 
  byte[] sha256HashBytes = sha256Generator.ComputeHash(Encoding.UTF8.GetBytes(calculationStr)); 
  StringBuilder sha256StrBuilder = new StringBuilder(); 
  foreach (byte @byte in sha256HashBytes) 
  { 
    sha256StrBuilder.Append(@byte.ToString("x2")); 
  } 
  return sha256StrBuilder.ToString(); 
}

在這里我們新增新增了 Nonce 隨機值作為散列生成的依據(jù)。

那么我們生成新區(qū)塊的時候就順便來挖礦吧:

/// <summary> 
/// 生成新的區(qū)塊 
/// </summary> 
/// <param name="oldBlock">舊的區(qū)塊數(shù)據(jù)</param> 
/// <param name="BPM">心率</param> 
/// <returns>新的區(qū)塊</returns> 
public static Block GenerateBlock(Block oldBlock, int BPM) 
{ 
  Block newnewBlock = new Block() 
  { 
    Index = oldBlock.Index + 1, 
    TimeStamp = CalculateCurrentTimeUTC(), 
    BPMBPM = BPM, 
    PrevHash = oldBlock.Hash, 
    DifficultyDifficulty = Difficulty 
  }; 
  // 挖礦 ing... 
  for (int i = 0; ; i++) 
  { 
    newBlock.Nonce = i.ToString("x2"); 
    if (!IsHashValid(CalculateHash(newBlock), Difficulty)) 
    { 
      Console.WriteLine($"目前結(jié)果:{CalculateHash(newBlock)} ,正在計算中..."); 
      Task.Delay(1); 
      continue; 
    } 
    else 
    { 
      Console.WriteLine($"目前結(jié)果:{CalculateHash(newBlock)} ,計算完畢..."); 
      newBlock.Hash = CalculateHash(newBlock); 
      break; 
    } 
  } 
  // 原有代碼 
  // newBlock.Hash = CalculateHash(newBlock); 
  return newBlock; 
}

效果

結(jié)語

其實代碼并不復雜,但是這幾十行代碼表明了區(qū)塊鏈挖礦的本質(zhì),后面你可以參考原文實現(xiàn) P2P 與 股權(quán)權(quán)益證明方法與智能合約。

總結(jié)

以上所述是小編給大家介紹的使用C#編寫自己的區(qū)塊鏈挖礦算法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • c#實現(xiàn)萬年歷示例分享 萬年歷農(nóng)歷查詢

    c#實現(xiàn)萬年歷示例分享 萬年歷農(nóng)歷查詢

    這篇文章主要介紹了c#實現(xiàn)萬年歷的方法,可以顯示農(nóng)歷、節(jié)氣、節(jié)日、星座、星宿、屬相、生肖、閏年月、時辰,大家參考使用吧
    2014-01-01
  • C#登入實例

    C#登入實例

    本篇文章通過截圖的方式向大家展示C#程序登陸實現(xiàn)的全過程,利用了C#三層架構(gòu)的編寫方法,希望對大家今后編寫代碼有所幫助
    2016-11-11
  • C#中使用split分割字符串的幾種方法小結(jié)

    C#中使用split分割字符串的幾種方法小結(jié)

    C#中使用split分割字符串的幾種方法,特整理下, 方便需要的朋友
    2013-03-03
  • 使用C#實現(xiàn)將CSV文件內(nèi)容裝配成對象列表

    使用C#實現(xiàn)將CSV文件內(nèi)容裝配成對象列表

    這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)將CSV文件內(nèi)容裝配成對象列表,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • C# 中 “$” 符號的作用以及用法詳解

    C# 中 “$” 符號的作用以及用法詳解

    這篇文章主要介紹了C# 中 “$” 符號的作用以及用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • C#飛行棋小程序設計分析

    C#飛行棋小程序設計分析

    這篇文章主要為大家設計分析了C#飛行棋小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • unity實現(xiàn)流光效果

    unity實現(xiàn)流光效果

    這篇文章主要為大家詳細介紹了unity實現(xiàn)流光效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#拼圖游戲編寫代碼(2)

    C#拼圖游戲編寫代碼(2)

    這篇文章主要為大家詳細介紹了C#拼圖游戲的編寫代碼下篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • WCF分布式開發(fā)之MSMQ消息隊列

    WCF分布式開發(fā)之MSMQ消息隊列

    這篇文章介紹了WCF分布式開發(fā)之MSMQ消息隊列,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#通過IComparable實現(xiàn)ListT.sort()排序

    C#通過IComparable實現(xiàn)ListT.sort()排序

    這篇文章主要介紹了C#通過IComparable實現(xiàn)ListT.sort()排序的方法,可實現(xiàn)自定義的排序方法,是非常實用的技巧,需要的朋友可以參考下
    2014-09-09

最新評論

滕州市| 昌宁县| 称多县| 锡林郭勒盟| 武鸣县| 黄龙县| 大厂| 视频| 麻栗坡县| 阿克苏市| 曲周县| 五家渠市| 永善县| 三门峡市| 通化市| 贺兰县| 汉寿县| 张家港市| 噶尔县| 京山县| 庆安县| 芷江| 宜昌市| 榆社县| 古蔺县| 乌拉特中旗| 江孜县| 颍上县| 金沙县| 嘉荫县| 桃园县| 龙口市| 元谋县| 遂昌县| 铜梁县| 桦甸市| 治县。| 巴青县| 大化| 深州市| 武鸣县|