偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

這么多人聊比特幣,大部分人壓根不懂什么是“挖礦”?

區(qū)塊鏈
區(qū)塊鏈?zhǔn)巧叮繑?shù)據(jù)存在哪里?“挖礦”是啥?區(qū)塊鏈和比特幣是什么關(guān)系?今天,從技術(shù)的角度,聊聊這些問(wèn)題。

區(qū)塊鏈究竟是個(gè)什么系統(tǒng)?)》發(fā)布后,有童鞋問(wèn):區(qū)塊鏈是啥?數(shù)據(jù)存在哪里?“挖礦”是啥?區(qū)塊鏈和比特幣是什么關(guān)系?

今天,從技術(shù)的角度,聊聊上面這些問(wèn)題。

上一篇介紹了區(qū)塊鏈,那區(qū)塊鏈與比特幣是什么關(guān)系?

區(qū)塊鏈?zhǔn)欠植际酱鎯?chǔ),比特幣是基于該存儲(chǔ)的應(yīng)用,其他諸如萊特幣,以太幣都是基于區(qū)塊鏈的電子貨幣應(yīng)用。

如上圖,mysql是底層存儲(chǔ),wechat是上層應(yīng)用。

區(qū)塊鏈挖礦的本質(zhì)是啥?

生成一個(gè)區(qū)塊,鏈入?yún)^(qū)塊鏈的過(guò)程,就是挖礦。

挖礦的人,就是礦工。

什么是區(qū)塊(block)?

如上一篇文章介紹,區(qū)塊是一塊存儲(chǔ)空間,可以存儲(chǔ)數(shù)據(jù)。

如上圖,區(qū)塊分為區(qū)塊頭(header)和區(qū)塊體(body)。

區(qū)塊體(body)存了些什么?

想存什么存什么,和上層應(yīng)用有關(guān),就像mysql里存什么依賴(lài)于上層應(yīng)用。例如比特幣使用的區(qū)塊鏈,區(qū)塊體里存儲(chǔ)的是比特幣交易記錄。

區(qū)塊頭(header)存了些什么?

區(qū)塊頭里存儲(chǔ)了和這個(gè)區(qū)塊,以及區(qū)塊鏈相關(guān)的一些元數(shù)據(jù)。

如上圖,區(qū)塊頭里的三個(gè)常見(jiàn)屬性:

  • 前一個(gè)區(qū)塊的哈希值;
  • 區(qū)塊生成的時(shí)間戳;
  • 隨機(jī)數(shù);

什么是區(qū)塊鏈(blockchain)?區(qū)塊是怎么鏈起來(lái)的?

struct node{

         node* prev; // 前一個(gè)節(jié)點(diǎn)

         int time; // 時(shí)間戳

         int nonce; // 隨機(jī)數(shù)

         void* node_body; // 存儲(chǔ)數(shù)據(jù)

}node;

鏈表,節(jié)點(diǎn)指針可以作為這個(gè)節(jié)點(diǎn)的唯一標(biāo)識(shí),下一個(gè)節(jié)點(diǎn)通過(guò)存儲(chǔ)上一個(gè)節(jié)點(diǎn)的指針,將鏈表鏈起來(lái)。

與之類(lèi)似,區(qū)塊的哈??梢宰鳛閰^(qū)塊的唯一標(biāo)識(shí),下一個(gè)區(qū)塊通過(guò)存儲(chǔ)上一個(gè)區(qū)塊的哈希,將區(qū)塊鏈起來(lái),這就是區(qū)塊鏈。

講完區(qū)塊與區(qū)塊鏈的概念,接下來(lái)講挖礦,也就是區(qū)塊的生成。

在此之前,先說(shuō)說(shuō)區(qū)塊鏈的三個(gè)特性:

  • 歷史生成的區(qū)塊是無(wú)法改變的,即“區(qū)塊鏈只能像寫(xiě)日志一樣追加寫(xiě),不能像mysql一樣隨機(jī)寫(xiě)”;
  • 只能在最新的區(qū)塊后面生成新區(qū)塊,即“必須先完成同步全網(wǎng)最新的區(qū)塊鏈數(shù)據(jù)這項(xiàng)工作,才能啟動(dòng)新區(qū)塊生成這項(xiàng)工作”;
  • 新區(qū)塊的生成很難,必須滿(mǎn)足一定條件的新區(qū)塊才有效;

假如已經(jīng)同步了最新的區(qū)塊鏈數(shù)據(jù),要滿(mǎn)足什么條件,才算生成一個(gè)新的區(qū)塊,才算“挖礦”成功呢?

對(duì)最新的區(qū)塊頭進(jìn)行兩次SHA256計(jì)算,得到的256bit哈希結(jié)果,高位48bit必須是0x00000000FFFF,才算挖礦成功。

畫(huà)外音:這句話(huà)很重要,是這篇文章的核心。

為什么大家都說(shuō)“挖礦”很難?

由符合條件的哈希值,倒推出區(qū)塊頭,填入相應(yīng)的“前一塊區(qū)塊哈希值”“時(shí)間”“隨機(jī)數(shù)”不就可以了嗎?

哈希(SHA256是一個(gè)哈希算法)是不可逆的。

例如MD5:

md5(string) = md5_result

大家都知道:

  • 由字符串,算出對(duì)應(yīng)的md5值很容易,但由md5值反推出字符串是不可能的;
  • 可以認(rèn)為哈希的結(jié)果是完全隨機(jī)的,要得出前48bit必須是0x00000000FFFF的哈希結(jié)果,就如同連續(xù)拋48次硬幣,每次都得到我們想要的結(jié)果,其概率為(1/2)^48;

可以看到,這就好比在一座山上隨手撿起一塊石頭,正好是一塊金子,我猜測(cè),這也正是把生成新區(qū)塊叫做“挖礦”的原因。

那應(yīng)該怎么找到符合條件的區(qū)塊頭呢,從而成功挖到礦呢?

窮舉法。

區(qū)塊頭里有個(gè)隨機(jī)屬性nonce,將這個(gè)屬性從0開(kāi)始,遍歷到2^32,來(lái)計(jì)算區(qū)塊頭的哈希值,如果得到的哈希結(jié)果符合條件,則挖礦成功。

其偽代碼如下:

byte[32] = PrevBlockHash; // 上一個(gè)區(qū)塊的哈希

for(int i=0 to 2^32){ // 遍歷所有整數(shù)

  int time=now(); // 時(shí)間戳

  blockHeader= new(byte[32], time, i); // 生成區(qū)塊頭

  hashResult= SHA256D(blockHeader); // 計(jì)算哈希值

  if(hashResult>>208 == 0x00000000FFFF){ //哈希符合預(yù)期

    echo“bingo”; // 挖到礦啦

}

}

看上面的算法,只要程序運(yùn)行時(shí)間足夠久,總能挖到礦呀?

錯(cuò),如果別人計(jì)算能力強(qiáng),在你挖到礦之前,如果別人先生成了新區(qū)塊,廣播到了區(qū)塊鏈網(wǎng)絡(luò),你本地不是最新的區(qū)塊鏈,你挖到的礦就作廢啦,此時(shí)你要放棄之前所有的工作,先向網(wǎng)絡(luò)同步最新的數(shù)據(jù),再重新開(kāi)始挖。

有什么方法可以提升挖礦的速度呢?

從架構(gòu)的角度出發(fā):

  • “緩存”是無(wú)效的:每個(gè)區(qū)塊的哈希值都不一樣,每個(gè)時(shí)間戳都不一樣,歷史計(jì)算過(guò)的值無(wú)法通過(guò)“查表”來(lái)節(jié)省時(shí)間;
  • scale up是有效的:增強(qiáng)單CPU的計(jì)算能力,使用GPU代替CPU,使用特殊的芯片計(jì)算SHA256D等優(yōu)化都是有效的,但scale up總是有極限的,單機(jī)總會(huì)遇到瓶頸;
  • scale out是有效的:?jiǎn)螜C(jī)不行,來(lái)并行,一臺(tái)機(jī)器不行,搞集群,這就是為什么會(huì)有這么多的礦場(chǎng);

如上圖,這是某高原上的一個(gè)比特幣礦場(chǎng),廉價(jià)的電力讓無(wú)數(shù)礦工趨之若鶩。

綜上,區(qū)塊鏈里,什么是挖礦?

在最新區(qū)塊鏈的數(shù)據(jù)上,生成一個(gè)符合條件的區(qū)塊,鏈入?yún)^(qū)塊鏈的過(guò)程,就是挖礦。

關(guān)于區(qū)塊鏈與挖礦,大家或許還有不少疑問(wèn):

  • 如何保證數(shù)據(jù)的一致性?
  • 這TM有病吧,挖這玩意有什么意義,不是純浪費(fèi)電嗎?
  • 這和比特幣有什么關(guān)系?
  • 比特幣怎么保證總量有限?

這些疑惑,未來(lái)再撰文和大家解釋。

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來(lái)源: 架構(gòu)師之路
相關(guān)推薦

2022-05-10 23:32:30

比特幣數(shù)字資產(chǎn)區(qū)塊鏈

2021-01-25 16:20:27

比特幣互聯(lián)網(wǎng)技術(shù)

2020-05-20 20:00:46

比特幣數(shù)字貨幣區(qū)塊鏈

2022-06-08 13:11:35

比特幣挖礦區(qū)塊鏈

2022-01-21 16:30:45

比特幣挖礦加密貨幣

2018-11-25 21:53:10

人工智能AI開(kāi)發(fā)者

2021-02-21 23:49:45

比特幣貨幣人民幣

2025-01-26 16:04:09

2019-11-20 08:30:07

架構(gòu)師軟件組織

2022-05-18 09:49:26

MySQLID數(shù)據(jù)庫(kù)

2012-06-07 16:16:43

JavaScript

2021-06-08 21:49:06

比特幣區(qū)塊鏈礦工

2022-07-11 14:23:09

加密貨幣比特幣以太坊

2024-05-16 20:48:23

ReactReact 19React 編譯器

2020-07-02 14:12:52

C++語(yǔ)言編程

2018-09-17 15:09:28

區(qū)塊鏈去中心化互聯(lián)網(wǎng)

2021-04-06 15:20:05

編程語(yǔ)言JavaIT

2016-10-26 10:23:42

2025-06-03 09:20:00

區(qū)塊鏈存儲(chǔ)比特幣

2019-01-31 10:15:14

群聊單聊消息
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)