欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂區(qū)塊鏈培訓(xùn)簡(jiǎn)述如何使用C#編寫自己的區(qū)塊鏈挖礦算法

2019-09-20 10:43:04 4877瀏覽

本篇文章扣丁學(xué)堂區(qū)塊鏈培訓(xùn)小編給讀者們介紹一下使用C#編寫自己的區(qū)塊鏈挖礦算法,對(duì)區(qū)塊鏈挖礦算法感興趣的小伙伴就隨小編來(lái)了解一下吧,希望對(duì)小伙伴們有幫助。


扣丁學(xué)堂區(qū)塊鏈培訓(xùn)簡(jiǎn)述如何使用C#編寫自己的區(qū)塊鏈挖礦算法


什么是加密貨幣挖掘?


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



挖礦的原理


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



希/散列介紹


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


例如一個(gè) SHA - 256 的例子,可以很快的計(jì)算散列值,讓我們來(lái)散列 “Hello World” 看看會(huì)得到什么結(jié)果:


扣丁學(xué)堂區(qū)塊鏈視頻教程


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


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



工作證明


比特幣通過(guò)讓參與者散列隨機(jī)的字母與數(shù)字的組合,直到計(jì)算出來(lái)的散列包含前導(dǎo)0。


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


000f21ac06aceb9cdd0575e82d0d85fc39bed0a7a1d71970ba1641666a44f530

它返回了3個(gè)0作為前綴的散列值,但是我們?cè)趺粗?886 計(jì)算出來(lái)的散列結(jié)果產(chǎn)生了3個(gè)0呢?


答案是我并不需要知道。我需要知道礦工給我的散列值前導(dǎo)有幾個(gè)零就好了,并不需要復(fù)雜的算法來(lái)驗(yàn)證整個(gè)散列值的有效性。


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


動(dòng)手開發(fā)


1、項(xiàng)目配置


首先新建一個(gè) Asp.Net Core 項(xiàng)目,然后選擇 Empty Project(空項(xiàng)目) 類型,建立完成后無(wú)需進(jìn)行任何配置。



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


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


public struct Block 
{ 
  /// <summary> 
  /// 區(qū)塊位置 
  /// </summary> 
  public int Index { get; set; } 
  /// <summary> 
  /// 區(qū)塊生成時(shí)間戳 
  /// </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> 
  /// 前一個(gè)區(qū)塊 SHA-256 散列值 
  /// </summary> 
  public string PrevHash { get; set; } 
  /// <summary> 
  /// 下一個(gè)區(qū)塊生成難度 
  /// </summary> 
  public int Difficulty { get; set; } 
  /// <summary> 
  /// 隨機(jī)值 
  /// </summary> 
  public string Nonce { get; set; } 
}


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


Nonce 則是每次計(jì)算塊散列值所需要的隨機(jī)值。



3、工作證明


我們首先添加一個(gè)新的方法來(lái)驗(yàn)證生成的散列值是否包含指定數(shù)量的前導(dǎo)0:


/// <summary> 
/// 校驗(yàn) 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> 
/// 計(jì)算區(qū)塊 HASH 值 
/// </summary> 
/// <param name="block">區(qū)塊實(shí)例</param> 
/// <returns>計(jì)算完成的區(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ī)值作為散列生成的依據(jù)。


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


/// <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)} ,正在計(jì)算中..."); 
      Task.Delay(1); 
      continue; 
    } 
    else 
    { 
      Console.WriteLine($"目前結(jié)果:{CalculateHash(newBlock)} ,計(jì)算完畢..."); 
      newBlock.Hash = CalculateHash(newBlock); 
      break; 
    } 
  } 
  // 原有代碼 
  // newBlock.Hash = CalculateHash(newBlock); 
  return newBlock; 
}


效果


扣丁學(xué)堂區(qū)塊鏈在線學(xué)習(xí)


想要了解更多內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)咨詢。想要學(xué)好區(qū)塊鏈開發(fā)小編給大家推薦口碑良好的扣丁學(xué)堂,扣丁學(xué)堂有專業(yè)老師制定的區(qū)塊鏈學(xué)習(xí)路線圖輔助學(xué)員學(xué)習(xí),此外還有與時(shí)俱進(jìn)的區(qū)塊鏈課程體系和區(qū)塊鏈視頻教程供大家學(xué)習(xí),想要學(xué)好區(qū)塊鏈開發(fā)技術(shù)的小伙伴快快行動(dòng)吧??鄱W(xué)堂區(qū)塊鏈交流群:850351616。


                          【掃碼進(jìn)入HTML5VIP免費(fèi)公開課】  


     【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】        【掃碼進(jìn)入HTML5前端開發(fā)VIP免費(fèi)公開課】  



查看更多關(guān)于“區(qū)塊鏈培訓(xùn)技術(shù)資訊”的相關(guān)文章>>

標(biāo)簽: 區(qū)塊鏈培訓(xùn) 區(qū)塊鏈技術(shù) 區(qū)塊鏈開發(fā) 區(qū)塊鏈視頻教程 比特幣 以太坊

熱門專區(qū)

暫無(wú)熱門資訊

課程推薦

微信
微博
15311698296

全國(guó)免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠(chéng)科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部