學習區塊鏈 第一節 精通比特幣

剛開始學習區塊鏈,主要是跟着談老師進行學習,以博客的形式整理思路,記錄下每一節學習的內容。算法

1.創始比特幣的動機 安全

(1)現有銀行系統的缺點:框架

  中心化:數據中心、異地備災等,缺點易篡改,易產生災難,易沒法服務分佈式

  有帳戶系統:缺點易篡改函數

  貨幣發行:由央行負責,貨幣多發是政府對人民財富掠奪最簡單有效的方法工具

  隱私性:無政府主義者想要擁有更好的財富學習

(2)比特幣的優勢:區塊鏈

  去中心化,數萬(甚至更多)個節點上運行完整數據拷貝;加密

  無帳戶系統,發明UTXO,了不得的發明!spa

  發行機制:經過coinbase交易發行(coinbase是對礦工的獎勵),每4年減半,從50,目前已減至12.5。上限:2100萬個,永不超發,且沒法超發!

  隱私性:強。你只知道某個地址擁有多少比特幣,但並不知道它是誰的。但從監管角度來講多是一個缺點。

(3)比特幣的缺點:

  隱私性強,成爲犯罪分子的結算工具,目前販毒、洗錢等大量採用比特幣;

  分佈式系統,軟件更新困難,目前的擴容之爭就是個典型的例子。

2.比特幣交易:

Input包含:以前一個output的引用(經過txid和output index(從0開始計數))以及SigScript(簽名)

Output包含:pubScript(地址腳本),比特幣數量

 

 每一個交易擁有一個hash值,算法

dSHA256 = SHA256(SHA256(transactionbytes))

關於 hash: MD五、SHA-一、SHA-2(比特幣採用)、SHA-3(以太坊、hyperledger採用)

 每一個地址的餘額是經過每一個它所擁有的UTXO(沒有被花費的output)累加獲得的,並無一個值來講明該地址一共有多少餘額。

交易費用:

         全部的input btc總和都多於output btc總和,多於的部分就是交易費用

         一個交易最少的交易費用爲0.0001btc,低於此將被礦工拒絕

         交易費將被礦工得到(經過把它們加入coinbase交易中),全部節點會驗證這個信息

         礦工按字節和交易費用來優先打包哪些交易

 

3.礦工

  比特幣節點分爲:普通完整節點(peer)、礦工節點(miner)和SPV節點

    由礦工打包交易,造成區塊鏈:

        Transaction -> block -> blockchain

  礦工的3個問題:

  問題1:由誰來打包交易?(由於有不少礦工)

         由共識機制POW來決定

         規則:每一個區塊生成的hash值小於目標值,誰快誰來打包

         Hash的生成     

    算法:dSHA256(headerbytes)

      Header字段:version(4)、prev_block_hash(32)、merkle_root_hash(32)、time(4)、bits(4)、nonce(4):共80字節

   問題2:什麼時候打包交易?

 

         平均每10分鐘出一次塊

         礦工算出符合條件的hash就當即出塊

         每生成1026塊時根據平均出塊時間調整一次目標值(調整難度值)

         歷史最快出塊時間爲幾秒、最慢出塊時間爲1個多小時

         同時算出hash如何解決?

                   ·維護2條以上的blockchain,當多個節點認同其中一條就選擇那一條

                   ·對比以太坊的叔塊

  問題3:如何打包交易?

         礦工會包含儘可能多的交易;按交易給予的 交易費和大小 來排序;

   交易數量有上限,每一個block不能超過1MB;

  每一個塊的第一個交易爲coinbase交易,沒有input,output的地址是礦工的地址(礦工用來接收獎勵和交易費),數量是區塊獎勵(當前爲12.5)和全部交易費用的總和;

  用每一個交易的txhash生成merkle tree,並生成merkle root hash放在header中;

4.Merkle樹

       BT(點對點下載)神器:使用的是merkle樹

        爲何使用merkle樹?

              支持SPV

    SPV: Simple Payment Verification

      –      區塊太大,超過幾十G、將來更大;

      –      區塊header很小,每一個80byte,目前總大小30M+

      –      經過區塊頭和交易的merkle樹來驗證交易的一種方式

    SPV實現(完整的驗證過程)

      –      SPV客戶端持續從鏈接的節點(通常鏈接多個節點)上獲取新區塊的頭部,並加入到本地區塊鏈中;

      –      SPV客戶端從節點上獲取到一個跟本身相關的交易hash值;

      –      SPV客戶端從節點上下載包含該交易hash的完整交易merkle樹;

      –      從新計算並驗證merkle root和頭部中的是否一致,若一致則驗證經過;

    如何從節點上獲取和本身(錢包中管理的公私鑰對)相關的交易Hash

            經過 Bloom filter

      Bloom filter

        –      SPV節點在相連節點上註冊本身感興趣的地址(可多個)

        –      當節點經過bloom filter發現和該地址相關交易的時候便通知該SPV節點

 

5.密碼學原理

(1)地址生成

  私鑰(prikey)的生成:

    –      隨機數,或者經過隨機數seed生成;

  公鑰(pubkey)的生成:

    –      Pubkey=橢圓曲線函數(prikey,p,q),不可逆;

  比特幣地址的生成:

    –      Address=BASE58(RIPEMD160(SHA256(pubkey))),不可逆;

(2)簽名原理

  RSA非對稱加密原理:

    –      公私鑰對;

    –      公鑰加密僅私鑰能解;私鑰加密僅公鑰能解;

  比特幣交易簽名:SigScript

    –      源數據hash;

    –      私鑰加密後的密文;

    –      公鑰解密密文,與源數據hash比較;

(3)散列算法

  Hash函數特色:

    –      單向,不可逆;

    –      輸入改動一點,輸出面目全非;

    –      存在碰撞概率(不一樣公鑰地址映射到同一比特幣地址);

(4)安全性

  51%攻擊

               51%攻擊是無解攻擊,一半以上的礦工出現問題

  目前算力分佈:

  從圖中能夠看到,若是最大的三家算力加在一塊兒佔了51%以上,若是三家聯合起來破壞比特幣,將是一個災難。

 

(5)交易深度和安全性

         交易深度:

    Depth:0,狀態爲Pending,已處於礦工們的mempool中(即已經被驗證過了,能夠被接受),即將被打包入塊;

      什麼時候被打包入塊?取決於給交易給的fee,從幾秒到1天以上時間不等;

      交易費的多少和入塊速度請參考:http://bitcoinfees.21.co/

 

    Depth: 1-n ,狀態爲BUILDING;已經入塊,且深度爲1-n,n值越大越安全;

      官方建議信任depth爲6及以上的確認;到達6後要想再被推翻須要51%攻擊;

 

主要是以筆記的形式記錄的,列出的也只是一個框架,沒有很詳細,請見諒!

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息