剛開始學習區塊鏈,主要是跟着談老師進行學習,以博客的形式整理思路,記錄下每一節學習的內容。算法
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%攻擊;
主要是以筆記的形式記錄的,列出的也只是一個框架,沒有很詳細,請見諒!