1. 程式人生 > >比特幣的發行和挖礦

比特幣的發行和挖礦

區塊鏈

概述

挖礦的用途

1. 搶奪區塊打包權
2. 驗證交易事務
3. 獎勵發行新幣
4. 廣播新區塊

大家約定一個規則,共同按照這個規則競爭,競爭成功誰就有數據打包權,打包完成後廣播給別人,別人驗證無問題就存入自己的數據文件中。

規則------->工作量證明

難度值: 一個門檻
        規定一個256位的證書,作為難度為1的目標值:
        X00000000FFFFFFF.......
        當時全網的算力,大約需要10分鐘左右的運算能得到一個符合這個難度為1的值。
    0號區塊的難度信息
        "nonce": 2083236893
        "bits": "1d00ffff"
        "difficulty": 1
    noce:一個隨機數,挖礦計算得到
    bits: 存儲難度的十六進制目標值,存儲在區塊頭部
        源碼中,用4字節,32位存儲256位長度的難度目標值(壓縮過)
    壓縮方法:
        1. 4個字節的高位字節用來存儲難度值得有效字節數
            有效字節數: 從第一個不全為0的字節開始的部分。
            約定:如果難度值有效位的最高位為1,則需要在前面補上0x00
            舉例:難度為1的目標值,X00000000FFFFFFF.......(十六進制計數,沒一位兩個字節,所以前8個0為4字節),有四個字節長度為0,減掉這些0的長度共計32bit,剩余256-32=224,也就是28個字節,因為F轉換為2進制為1111,第一位為1,所以補上0x00,因此有效位總計29個字節,29的十六進制為1D
        2. 另外3個字節中存儲的是目標值有效位的最高3個字節,此時目標 值有效位前面已經加上2個0,因此最高3個字節為0x00FFFF,合起來壓縮後的值就是0x1D00FFFF
    此4個字節前2位通常為冪或指數,後6位為系數:目標值 = 系數*2^(8*(指數-3))次方
        難度值:差不多兩周調整一下新的難度值,算力在增加。為了維持差不多10分鐘出一個區塊,難度要跟隨算力變化而調整。
        難度值會越來越大,目標值會越來越小,目標值越小越難挖礦。
    新的難度值 = 當前難度值*(最近的2016個區塊的實際出塊時間/2016分鐘)

挖礦計算

1.挖礦的計算公式:
    SHA256(
        SHA256(version + prev_hash + markle_root + ntime + nbits + nonce)
    ) < TARGET
    TARGET: 難度目標值,如果計算出來的值小於這個值,就算挖礦成功
    各名詞解釋:
        version : 區塊的版本號
        prev_hash: 前一個區塊的哈希值
        merkle_root: 準備打包的交易事務哈希樹,也就是梅克爾根
        ntime: 區塊時間戳
        nbits: 當前難度
        noce: 隨機數
    以上為去塊頭組成部分。

挖礦

  1. 概念
    挖礦就是重復計算區塊頭的哈希值,不斷修改該參數,直到與難度目標值匹配的一個過程,多個節點同時匹配,誰的鏈最長為準。
  2. cainbase交易
    挖礦獎勵作為一條交易事務包含在區塊的交易事務中的,相當於系統給礦工轉了一筆比特幣。一般位於區塊的第一條。
  3. 挖礦獎勵規則
    2019年1月創建出第一個區塊,每21萬區塊產量減半(大約4年),到2140年,所有比特幣(20999999.98)將全部發行完畢。
  4. 比特幣錢包
    比特幣地址生成過程:
    技術分享圖片
    核心錢包,輕錢包
    核心錢包: 完整交易驗證,是否有足夠余額,是否雙花。
    跟核心客戶端在一起,可以創建錢包地址,收發比特幣,加密錢包,備份錢包
  5. SPV錢包
    大致過程:
    1.下載完整區塊頭數據,區塊頭中包含區塊的梅克爾根------->SPV方式靠它實現
    2.算出待驗證支付的交易事務哈希值taHash
    3.找到taHash所在的區塊,驗證一下所有區塊的區塊頭是否包含在賬本數據中
    4.獲得所在區塊中計算梅克爾根所需要的哈希值
    5.計算出梅克爾根
    6.若計算結果與所在區塊的梅克爾根相等,則支付交易是存在的
    7.根據該區塊所處的高度位置,還可以確定該交易得到了多少個確認
    註:僅能看到當前支付的支付交易是否被發起而已,並不能保證這筆交易事務最終進入到主鏈中,需要等待核心節點進行全面的交易驗證,並且礦工打包到區塊後進入主鏈。
  6. 管理多個私鑰的錢包技術(分層確定性錢包(HD Wallets))
    特點:
    1. 用一個隨機數來生根私鑰,這與任何一個比特幣錢包生成私鑰沒區別
    2. 用一個確定的,不可逆的算法,基於根私鑰生成任意數量的子私鑰
  7. 未花費事務輸出,UTXO,(Unspent Transaction Output)

技術分享圖片

a.比特幣的交易不是通過賬戶的增減來實現的,而是一筆筆關聯的輸入/輸出交易事務
b.花費"輸入",產生"輸出",這個輸出就是"未花費過的交易輸出",也就是UTXO.每一筆交易事務都由一個唯一的編號,稱交易事務ID,通過哈希計算而來,引用"輸出",主要提供交易事務id和所處"輸出"獵豹中的序號就可以了。
c.由於沒有賬戶的概念,因此當"輸入"部分的金額大於所需"輸出",必須給自己找零,這個找零也是作為交易的一部分包含在"輸出中"

證明哪一條UTXO是屬於誰
1.輸入腳本,2.輸出腳本。也叫鎖定腳本和解鎖腳本。
1.用私鑰簽名解鎖自己的某一條UTXO(也是之前的輸出)
2.對方公鑰鎖定新的"輸出",成功後,這筆新的"輸出"就成了對方的UTXO通過輸入,輸出腳本實現轉賬。

比特幣的發行和挖礦