天天看點

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

有關區塊鍊的文章很多,但是我總感覺每一篇讀完之後了解的都不透徹。趁着剛學習完一些理論知識,來自己整理篇終極入門。

(可以收藏但不支援轉載)

區塊鍊的監管

區塊鍊并不是一個新技術,而是一堆已有技術的結合,包括分布式技術、密碼學等等。比特币誕生與2009年,區塊鍊作為其後端支撐,在2015年才掀起浪潮,大家逐漸發現區塊鍊的應用領域遠遠不止代币(代币這個詞很好了解,作為錢币的替代品,在特定的場合或者範圍内才有效。比如比特币萊特币以太币等等等等。)

我國對于代币的監管較嚴格,中國人民銀行宣布,發行初始代币(ICOs)是一種非法的融資手段。但同時,我國支援區塊鍊技術的發展,并在16年12月其歸為網際網路金融的一項技術(參考《北京市“十三五”時期金融業發展規劃》),在之前的8月,北京市金融工作局已經在推動中關村區塊鍊聯盟設立。

截止2018.5,北京、上海、廣州、深圳、浙江、貴州等地在内的十八個地區出台了相關區塊鍊項目鼓勵政策。各地區将區塊鍊研發及應用作為重要戰略發展目标,并出台詳細鼓勵政策。是以抛開代币這個概念,區塊鍊的未來還是值得期待的。

最近由于參加項目,收集了一些區塊鍊在各領域在2018-2023年市場價值的預測資料,做了個柱狀圖。

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

但是這個資料吧,我認為看看就好并不能當真 = =,畢竟現在區塊鍊的底層技術還不成熟,發展空間較大。由于供應鍊金融這塊很貼緊區塊鍊的運作方式,是以目前也在大力發展。

感覺說了一堆沒用的。其實是想大家先了解下這個領域,包括他的制度。

區塊鍊概述

Melanie Swan在《區塊鍊:新經濟藍圖及導讀》中将區塊鍊應用分為區塊鍊1.0、2.0和3.0

區塊鍊1.0:比特币,支撐虛拟貨币應用,轉賬、彙款和數字化支付相關的密碼學貨币應用。

區塊鍊2.0:支撐智能合約應用合約是經濟、市場和金融的區塊鍊應用的基石。應用包括股票、債券、期貨、貸款、抵押、産權、智能财産和智能合約。2.0的代表是以太坊,以智能合約為中心,使用者可以自己編輯智能合約(這當然存在一定的風險,比如TheDAO事件,黑客就是從智能合約中的漏洞入手。)

區塊鍊3.0:應用是超越貨币、金融和市場的範圍的去中心化應用,特别是政府、健康、科學、文藝和藝術領域。3.0的代表是EOS(so called 3.0),但是平台好像不是很穩定,速度并沒有他對外宣稱的那麼快。其實3.0可能還在發展中。

比特币分類:

1. 公有鍊(Public blockchain):對所有人開放,任何人都可以參與。

    應用包括:比特币、以太坊、虛拟貨币、面向大衆的電子商務、網際網路金融等B2C\C2C\C2B等場景

2. 私有鍊(Private blockchain):對單獨的個人或實體開放

    應用包括:資料庫管理、審計,防範内部和外部的對資料安全的攻擊,是許可鍊

3. 聯盟鍊(Consortium blockchain):對特定的組織團體開放

    應用包括:40多家銀行參與的區塊鍊聯盟R3,和Linux基金會支援的超級賬本Hyperledger,需要注冊許可,許可鍊

    用于機構間交易、結算或清算等B2B形式

4. 側鍊(sidechains):比特币平均每十分鐘出一個區塊,每個區塊1MB大小,使得大概每秒才能确認7筆交易。側鍊來提升效率。      閃電網絡把很多交易放在側鍊,隻有在做清算時才用上主鍊,大大提高交易速率,又不會增加主鍊的存儲負擔。

5. 互聯鍊(interchain):各自垂直領域的區塊鍊互聯互通,形成區塊鍊全球網絡。

區塊鍊行業架構:協定層、擴充層、應用層。

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

協定層

底層技術,完整的區塊鍊産品,維護網絡節點,提供API調用。通常提供簡單的用戶端。

建構了網絡環境,搭建了交易通道,指定了節點獎勵規則,

技術:網絡程式設計、分布式算法、加密簽名、資料存儲技術。

語言:網絡程式設計能力強的,對并發處理簡單的。比如Nodejs, Go

進一步分為存儲層和網絡層。

比特币選擇的是谷歌的LevelDB,讀寫性能好。

網絡層是編碼的重點和難點,包括點對點網絡中的分布式算法、加密簽名。《Nodejs開發加密貨币》

也有将點對點網絡的實作單獨分開:

節點查找、資料傳輸和驗證等邏輯獨立

共識算法、加密簽名、資料存儲等組成核心層

擴充層

類似電腦驅動,讓區塊鍊産品更加實用。

有兩類,一是各類交易市場,法币兌換加密貨币。

二是針對某個方向的擴充實作,例如智能合約,即達到某個條件,合約自動執行,比如證券轉移。

技術沒有限制,分布式存儲、機器學習、VR、物聯網、大資料等等。

任何需要第三方支付的産品都可以友善的使用區塊鍊

任何需要确權、征信和追溯的資訊,也可以借助區塊鍊。

應用層

各種用戶端(DAPP、錢包等)。

比特币協定層使用C++開發、官方用戶端錢包用Qt、第三方錢包用Python,共識算法采用PoW(Proof of work)工作量證明機制。

以太坊給出了Go(go-ethereum)\Java(Ethereum(J))\Python等多語言的實作。用戶端有Rust, Ruby, Javascript等。

大家對區塊鍊的定義都是分布式的公開資料庫,或者叫他賬本。是以功能明顯:存儲。存儲的是什麼?不可篡改的交易。

一段時間内産生的交易被打包進一個區塊中,這個區塊被挖出來之後(稱為挖礦),連接配接到最長的鍊條上(區塊數量最多),就構成了區塊鍊。

我們根據比特币區塊鍊來了解區塊鍊的工作方式。

比特币位址

首先我們來看一下比特币位址。作為交易的使用者,我們首先每個人要有個位址,這樣我才能給你轉賬。

比特币位址由數字和字母組成。生成過程如下:

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

公私鑰若是有問題參考密碼學。

非對稱加密:每個人有兩把鑰匙,其中一把隻有自己知道(私鑰),另一把可以公布于衆(公鑰);通過私鑰加密過的資訊,隻要公鑰才能解密,連私鑰都不能,公鑰可以通過私鑰生成很多把。

使用者随機生成私鑰,然後通過私鑰産生公鑰,對公鑰進行SHA256加密函數加密,再使用RIPEMD160加密,得到了公鑰HASH。再經過兩次SHA256加密,取前四位元組作為校驗碼加入到原公鑰HASH中,再添加相應的版本号(目前為0x00),将這些位元組合并後通過Base58,生成58位元組的比特币位址。

交易

對于每個賬戶,比特币存儲的不是其餘額(還剩多少比特币),而是交易記錄。比如A轉給我1個比特币,B轉給我2兩個比特币,存儲的是這些賬單。而比特币的創新在于UTXO(Unspent Transaction Output,未花費的交易輸出)。也就是說,我要發起一筆交易,轉賬給C兩個比特币,這時交易的輸入則是部分UTXO。我有一些别人轉賬給我的賬單,來自A的1個和B的兩個,那麼我轉給C的這個交易,使用的就可能是B轉給我的這筆錢。

我們來看看交易的輸入與輸出:

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

previous tx的值是即是一筆UTXO的哈希,在例子中則是選擇C轉給我的2個比特币,将這些錢給C。作為輸入的交易可以是多個。(比如我想轉D3個比特币。A與B的交易單個肯定不夠)

輸入腳本:也就是scriptSig是轉賬人私鑰生成的數字簽名,即需要轉賬人證明自己有與公鑰哈希對應的私鑰,這樣他才可以使用這筆UTXO。scriptSig下一行是轉賬人的公鑰。

Value就是轉賬的金額。

scriptPubKey:是輸出腳本,其中包含了若幹腳本指令,以及收款方的位址。

現在我們來看腳本的執行過程。

比特币的腳本基于堆棧,後進先出。

交易1 :A轉賬給B

輸入:A的簽名&公鑰

輸出:B的公鑰HASH

交易2:B轉賬給C

輸入:B的簽名&公鑰

輸出:C的公鑰HASH

先執行交易2的輸入腳本,從左向右,将簽名與公鑰入棧;然後執行交易1的輸出腳本OP_DUP——複制棧頂元素。

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

然後OP_HASH160計算棧頂元素的HASH,也就是A的公鑰HASH,即A的比特币位址。然後将交易1的輸出中的位址(A的位址)壓棧。

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

接下來OP_EQUALVERIFY判斷棧頂前兩個元素是否相等。如果相等繼續執行,如果不相等中斷。最後使用OP_CHECKSIG來進行簽名校驗,即公私鑰比對。

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

一串指令證明了想要花費該UTXO中比特币的人,是否有對應的私鑰,也就是這筆轉賬是否是轉給A的,或者是A是否有權限可以花。

挖礦

然後我們有必要來看一下挖礦。

先看一眼區塊頭部的資料結構。

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

其中Merkle樹是對交易的散列樹。兩兩合并最終形成根節點。來看一個更完整的圖:

區塊鍊概論(開發者入門篇區塊鍊的監管區塊鍊概述比特币位址交易 挖礦

我們常說挖礦就是尋找這個随機數Nonce,其實在區塊生成時的散列是固定的,Nonce的值從0開始。其中第一個交易是coinbase(挖礦交易),即挖礦交易會的輸出位址是你的獨一無二的位址,是以雖然區塊生成時的散列是固定的,但每個區塊的merkle tree根節點不同,是以對于每個礦工來說,被挖區塊的散列是不同的。

挖礦的目的就是改變這個Nonce的值,通常從0開始往上增加。每改變一次Nonce,我們就對區塊重新計算HASH,直到得出的HASH值滿足區塊頭中的目标值。這個目标值是一個标準,通常前n位為0,如果礦工計算出的HASH值小于等于該目标值,也就是至少前n位為0時,挖礦成功。目标值也叫難度值,比特币規定十分鐘挖出一個區塊,若是快于或者慢于十分鐘,目标值就會自動調整,使得挖礦更難或者更容易。保證十分鐘産出一個區塊。

當然區塊中的交易,就是這10分鐘内産生的交易。如果交易太多(因為每個區塊大小為1MB,存儲交易數量有限),則繼續由下一個區塊打包。

找到這個随機數不容易,因為散列函數的性質決定了不能一下就猜到數字,隻有一個一個試,因為通常從0開始一個一個往上加,是以說最後的Nonce值,就是礦工執行哈希散列的次數。

同時我們可以發現,找随機數不容易,但是驗證卻極其簡單,隻需要将随機數帶入區塊,其他節點一次散列即可對某個挖出區塊的礦工節點進行驗證。