編者按:本文系位元大陸的姜家志講師,在掘金技術社群主辦的《給開發者的區塊鏈技術指南 | JTalk 掘金線下活動第五期》 活動上的分享整理。掘金 JTalk 目前已舉辦5期,每期 JTalk 會邀請垂直行業的優秀工程師來分享優秀的實踐經驗,技巧方法。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。
姜家志,位元大陸哥白尼專案負責人;BCH 社群資深開發者;10年後端技術及互聯開發經驗,比太錢包Android 和 iOS 客戶端的開發者; 從事區塊鏈底層協議的研究,關注高效能、分散式系統的研發。
區塊鏈現在所有的專案都有一個很大的效能問題,需要從技術方面去克服,這是我們團隊關注的一個方向,另外整個區塊鏈產業發展很大一部分推動力是來自於密碼學。 我們還有一個任務是把密碼學上的一些思路和研究,在工程上進行實現。
我是2013年開始接觸比特幣,最早接觸比特幣時,我接近兩個星期每晚都處於睡不著覺的狀態 。我本想著2015、2016年的時候比特幣就應該能普及到很多人了,但經歷了14、15年的熊市,覺得可能要再延後幾年。出乎意料的是,2017年區塊鏈大規模普及。
今天跟大家分享一下區塊鏈的基本原理及技術方面的實現。
1. 區塊鏈是什麼?
什麼是區塊鏈?
給區塊鏈一個完整定義是很難的,原因有如下兩方面:
現在區塊鏈涉及的行業太多,很難給它一個很明確的定義。 區塊鏈基本上每隔一段時間都會發生很大的改變,大家可以在上面作出更多有意思、好玩的東西。
- 去中心化
比特幣最大的特點是去中心化。
採用POW,比如早期的比特幣、以太坊等都是使用POW,經過長達十年證明之後,POW在去中心化的實現上是最好的證明。
現在出現POS、DPOS,都是在一定程度上犧牲了去中心化。DPOS採用選舉制度,你所投票的人能代表你自己的想法,但並不意味著任何人能夠隨意的加入網路。
去中心化有幾個很鮮明的特點:- 抗審查能力。 在整個網路活動中,對應到整個區塊鏈裡就是所發生的一筆交易,不會因為個人原因就會被拒絕,就是抗審查能力。整個網路裡,即使一個礦池拒絕了你的交易,也會有其他礦池幫你打包。
- 當某一個網路掛了或某一些不可抗拒原因導致某個節點掛了,不會影響整個網路運轉。
POW、BCH、BTC、以太坊都具有這樣的能力,任意一個礦池掛了,其他節點依然正常在運轉,如果把所有礦池都掛了,在執行節點中的節點會重新搭建起一個全新的狂吃,這樣有可能會出現整個網路處理能力的下降,但網路是不可摧毀的。
DPOS這種方式肯定會犧牲以上說的兩點特性,如果21節點全部被封禁了,恢復就有一定的困難性(備用節點的設計方案還有待確認)。21節點也同樣的具有審查交易的能力,任何人想進入這個網路也很困難(需要通過選舉)。我稱這種方式為弱中心化,畢竟還是有21節點的,不是一個完全的中心化。弱中心化的設計是為了提高效能上一些指標,為了能做更多事情,犧牲了去中心化的特點。
- 數字化賬本
整個區塊鏈都是執行在網際網路上 - 不可更改
這個特性在比特幣裡比較明顯,在以太坊裡,會出現能更改的可能性。如果一個合約在定義好之後,之後通過交易是可以改變它的狀態。但這個可更改性也是之前定義好的,也就是說大家知道你的合約就是這樣寫的。 - 確定性的複製狀態機
簡單來說就是整個網路所有節點能夠拿到所有的資料。 - 可程式設計性
在比特幣中就有體現。在以太坊上,可程式設計性被進一步放大,他使用的語言是solidity,它是一種類似於JavaScript的語言。 - 匿名性
因為每個地址/賬戶在整個網路裡,不和真實世界中人物對應。但是因為比特幣這種交易是鏈式的結構,如果你知道這個幣給誰了,反向追蹤是可以找到源頭。匿名性是如果不帶入真實世界裡,不和真實身份的進行交易的話,是有一定的匿名性。反之,這種匿名性就會消失。這也是為什麼交易所會強制做KYC嚴格身份認證的原因。
區塊鏈工作原理
- 公私鑰體系
- 數字簽名認可
- 全網廣播
- 區塊記錄交易以交易為單位,每個交易會記錄在區塊鏈上,不會記錄真實結果,這些交易本身會影響結果。
- 鏈式結構整個交易、區塊都是鏈式結構,大家一直會往一個方向不斷延伸下去,不會出現迴路或分叉。
- 參與者確認有效性在比特幣中是礦工確認交易,在EOS中是由超級節點確認交易。
區塊鏈特徵
區塊鏈是資產型網路。無論現在看到什麼樣的區塊鏈專案,都執行著一個資產網路。
- 強規則網路有如加密、簽名、驗證、交易和確認等操作。任何一塊不符合規則的話,整個塊就會被拒絕。在網際網路專案中,出現不一致的情況時,後續是有修復和解決的機會;但是在區塊鏈裡,這種可能性非常低。如果出現一個很小Bug,整個網路執行都會出現問題,會對整個網路影響很大。在早期,比特幣出現過幾次的Bug造成了分叉,全網暫停後重新執行。但現在如果再出現類似Bug,就很嚴重了,因為當時比特幣網路參與人員少,比特幣價格低,造成的影響較小。
- 弱信任每個節點都有對等的,把整個區塊鏈理解為資料庫,每個節點在系統內都有寫入的許可權 。在對等的前提下,比特幣是通過算力來決定誰能寫入的更多。如果你有更大資源,能調動更大的算力,寫入的概率就會很大。
- 信任來自於共識機制,非第三方共識機制包括POW、POS、DPOS和DAG。DAG是一種共識機制,它經過了密碼學家的認可。
- 去中心化現在很多區塊鏈專案在向弱中心化方向發展,弱中心化的好處也能帶來對等信任的關係,這種信任網路可能產生的經濟價值會有可能大於以前中心化網路帶來的價值。
區塊鏈使用
- 數字化資產
- 像比特幣,都是對標一種交易系統。轉帳。股權。融資。數字版權。遊戲。儲存。如果儲存解決了,上面的版權、遊戲都有可能會在裡面,包括新的一些應用或新的網路產生新的價值。目前都處在摸索階段,整個業內也都有人朝這幾個方向去做。
EatBCH,是一個委內瑞拉的專案。目前委內瑞拉法幣已經崩潰,委內瑞拉和其他國家關係也不好,再加上國內有封鎖,美元很難進入。現在面臨很重要的問題是沒有法幣能做交易,委內瑞拉現在存在嚴重的饑荒,但黑市中有食物 。 他們國內有一個專案叫EatBCH,就是通過捐贈BCH給他們購買食物。整個比特幣是跨國界的,只需要知道他的地址,就可以把比特幣直接打給他,省去了中間環節。
利用BCH 低成本網路的特點,省去手續費,幾美元就可以讓他們吃很久。這是一種價值網路的轉移。這個專案估計讓委內瑞拉400、500人受益。非洲也類似的專案。
2. 區塊鏈技術實現
公私鑰
我們使用的加密網路、VPN等都是公私鑰體系,比特幣私鑰本質上是隨機數,只不過這個隨機數很大,有2的256次方個私鑰,不可能遍歷所有的私鑰的。 在一個錢包裡生成私鑰以後,這個私鑰理論上有可能被別人撞到,但實際上不可能,概率非常小。整個網路採用的是secp256k1演算法。中本聰當年設計比特幣時,一些加密庫的實現裡是美國政府認可的,他認為不是特別靠譜。
Hash
Hash是一種雜湊演算法,相當於一個資料的指紋,我們無法從Hash裡推算出原始資料是什麼,因此可以實現對原始資料進行保護。如果原始資料是一致的話,Hash就是一致。不同的原始資料Hash值衝突的概率很小,基本上可以認為是不一致的。數字簽名
從一個原始資料裡算出對應Hash,用私鑰進行簽名,到了驗證方那裡他拿到原始資料,簽名資料,從原始資料中是可以算出Hash的,拿到Hash和公鑰、簽名之後把資料一起做驗證 。這在網際網路裡也比較常用,郵件裡使用PGP加密也是採用類似方式。在整個區塊鏈裡,簽名是一個所有權認證方式。在整個區塊鏈裡,最重要的東西就是私鑰,如果以後大家在使用錢包的時候一定要保證好自己的私鑰。但是這面臨一個很麻煩的東西,大部分人對公私鑰有可能瞭解的比較少,小額有可能還是放到線上錢包比較好,線上錢包提供方也有很多,比如交易所就是一個很大的線上錢包。由於私鑰是要自己保護的,私鑰問題從早期一直存在到現在,即密碼無法找回,或者沒有備份等。在早期時,有人在比特幣上挖礦,電腦上面有5000個、8000個都放著,電腦過了一段以後不用了,所有東西都有可能丟失了。整個比特幣網路上是2100萬個幣,據估算找不到的就有五六百萬個。
地址
現在很多區塊鏈專案都在用地址,地址是經過Hash演算法算出來的。在沒有傳送出去幣的時候,地址能保證你的公鑰不被外界看到,只是拿地址做收幣使用,公鑰不會暴露在網路上,只有當傳送幣時才會暴露公鑰。這樣帶來的好處是有一天有人破了演算法,能從公鑰反推出私鑰了 ,如果不暴露公鑰,還是無法算出私鑰,多了一層保護。交易
比特幣交易分為輸入和輸出,輸入是這個幣是那裡給你的,輸出是你的幣要發到那裡。每一個交易必須有輸入,因為沒有輸入的話,相當於不知道這個錢是從哪裡來的。除了挖礦產生的交易,這個交易是由整個共識規則產生的獎勵, 這個交易是沒有輸入的,這個就是比特幣的發行。交易本身有鎖定和解鎖指令碼,網路上並不存地址,只關心鎖定指令碼,根據鎖定條件有對應的解鎖條件,兩個加在一起才能動用你的幣。指令碼執行
指令碼執行在一個堆疊上,遇到一個指令碼操作符,就會執行對應操作,如果碰到資料,又會把資料要到棧裡,最終結果是保證整個棧執行出來是對的, 中間任何一個條件不滿足的話,整個交易就無法執行。這是為什麼整個比特幣的協議, 只關心鎖定條件是什麼,能否拿出對應解鎖條件這些的原因。如果解鎖條件能夠滿足的話,就能動用裡面的資產,如果滿足不了就不能動用。UTXO和賬戶
每個交易都有一個輸入和輸出,但是每一個輸出有可能暫時不用,也可能一年之後用,如果不用,就會存在整個系統中,這種結構就叫做UTXO,這是比特幣採用UTXO的概念,UTXO能在整個系統設計上更容易實現去中心化的特點,但是以太坊採用不是UTXO的概念,採用的是我們容易理解的賬戶概念,相當於你的私鑰產生地址,就是你的賬戶,可以一直用這個賬戶,所有操作、所有記錄都在賬戶下。為什麼有一個UTXO和賬戶的概念,這裡牽涉到UTXO和賬戶兩個系統帶來的一些好處。
- UTXO無需維護餘額,因為不關心你的餘額是什麼,只關心它的鎖定指令碼是什麼,有沒有輸入對應的解鎖指令碼,所以整個系統不用維護一個地址,當使用一個錢包時,顯示地址裡有多少餘額時,都是錢包算出來的,拿到這個地址下面有多少未發生交易,加在一起就是你的餘額。
- 每個UTXO都是獨立的資料記錄,提升驗證交易的速度。
- UTXO本身不用關心事務問題,只關心鎖定指令碼和解鎖指令碼。UTXO能夠在實現上、編碼上給整個系統帶來很大的優化,所以比特幣在實現去中心化時就非常容易。 在以太坊裡要執行智慧合約,相應要讓每個賬戶有獨立的存資料和取資料能力,使用UTXO這個概念的話,一個資料存了,不太容易找到他存在哪了。賬戶體系能解決這個問題,現在每一個賬戶下面都有一個kv儲存,自己可以存任何想存的東西, 這樣使用智慧合約時更加容易實現。
Block
Block Header包括基本資料,交易列表,交易確認是由礦工把對應交易打到塊上,這就是交易的確認,所以Block概念在整個系統中運用也是很廣泛的。所有塊加在一起形成Blockchain的概念。3. 比特幣
佈雷頓森林體系解體之後,美元的購買力下降98%左右。在辛巴威發生著我們小時候看課本上的事,推一車錢去買東西,最後把錢扔了,車推走了。辛巴威現在就處於這個狀態,持續通貨膨脹,導致法幣體系基本崩潰。俄羅斯前幾年也出現過貨幣大面積貶值,一段時間貶值50%左右,還有委內瑞拉。印度去年用新的貨幣系統替換了舊的貨幣系統,通過這個事情,GDP都下降了一點 。在整個世界歷史上有很多國家正在發生類似這樣的事情。
比特幣是什麼?
- A Peer-to-Peer Electronic Cash System
- 2008年11月1日,由Satoshi Nakamoto發表論文
- 2009年1月3日,創世塊誕生 (The Times 03/Jan/2009 Chancellor on brink of second bailout for banks),寫了一段諷刺的話,當時英國第二次救助銀行系統
- 2010年之後,Satoshi本人逐漸消失並人間蒸發
- 總量固定2100萬枚
- 比特幣發行(Coinbase)挖礦
數學保護的財富
- 財產的絕對控制,私鑰是唯一的憑據,失去私鑰將失去一切。
- 非對稱加密演算法,Hash摘要演算法。
- 海量賬戶,以地址(公鑰)登記所有權,數量幾乎無限供應。
- 全球無縫流通,有網路就有比特幣。
- 無偽鈔,天然審計。
比特幣系統三大特徵
- 工作量證明POW,體現在算出來這個Hash值要小於給定的那個值,這個目標值就是全網去維護的,如果算力大了,還是這個目標值的話,肯定不能滿足10分鐘出一個塊了,這個時候就要提高目標值,目標值越來越大,需要的算力就越來越多,這也是為什麼現在全網算力這麼大,比特幣還是保持10分鐘左右出塊。
- 鏈式結構,體現在Block和交易上。
- 去中心化系統,沒有一個組織能完全封殺掉整個網路或控制整個網路。
挖礦
挖礦也是比特幣的一種發行方式,發行交易是Coinbase交易
- 大量嘗試隨機數找到符合要求數字的過程。
- 工作量證明(POW)的體現。
- 比特幣的發行(Coinbase)。
- 高額收益。
- 維繫比特幣的支付功能,打包交易。
- 大算力保證比特幣系統安全。在整個產業鏈中,付出成本最大的其實是礦工,礦工要有基礎建設,要買礦機,成本比較大。
挖礦是利益驅動
- 解決自生長問題,利益驅動,不依賴道德和感情。
- 消除比特幣安全威脅。
- 在算力博弈塊鏈的過程中,作惡導致受益下降。
- 利益繫結,擁有巨大算力的組織,會自發的維護系統安全。
- 比特幣的長久發展更有利於礦工交易。
- 大算力保證比特幣系統安全。挖礦是一個利益繫結,擁有最大的算力組織會自發維護整個系統的安全,比特幣長久發展有利於礦工交易,因為礦工在這塊投入的成本很高。
挖礦的歷史
早期是拿CPU挖礦,因為挖礦的人很少,也很少有人會在上面進行改進;後面有一些新玩家進來之後,發現顯示卡算力更快,就採用顯示卡;再後面用上了EPGA,在2012年之後就是ASIC的時代 。比特幣現狀
- 極具有顛覆性的創新產物,但仍然是處於試驗階段
- 幣值劇烈波動,還不是穩定結算單位
- 缺乏多數商家的支援
- 受眾人數仍然很小
- 系統吞吐能力仍然很小,尚無法支撐全球大規模交易(需要擴容) 比特幣極具創新性,目前還處於實驗階段,價格不穩定,現在不是穩定的結算單位。比特幣缺少大部分商家支援,而且受眾人群少。系統吞吐能力小,無法支撐全球大規模交易,所以需要擴容。比特幣擴容歷史很艱難,現在分為BCT和BCH。現在不會在擴容問題上繼續爭吵。
比特幣擴容歷史
- 2014年Gavin提出擴容問題
- Bitcoin XT (20M,太過於激進)
- 2016年Bitcoin Classic (2M)
- 2016年香港共識,礦工只執行Core的程式碼,SW第一次出現
- 禁止討論區塊擴容,路線圖中只有SW沒有直接區塊擴容
- Bitcoin Unlimited出現,最高有50%算力支援
- UASH和UAHF
以太坊
以太坊市值一直在不斷地漲。在以太坊上存在擴容問題嗎?其實以太坊區塊大小一直在不斷增加,以太坊隨著使用增加,整個網路能處理的交易也不斷增加,現在要執行以太坊節點,是必須使用SSD的硬碟的 。 以太坊不斷在提高自己GPSLimit。上次以太坊因為加密貓的出現,導致大面積擁堵,這是因為以太坊已經沒有辦法通過簡單的擴容方式解決TPS問題了,所以要採用一些新的技術演進來解決。比特幣如果遇到像以太坊一樣擁堵問題,無法通過簡單技術方案進行解決的話,大概需要到每秒100-500筆交易才會出現。 上圖是BTC全節點。以太坊全節點現在執行已經很困難了,比特幣全節點只有1萬多個,但是以太坊全節點依然有2萬多個。以太坊能給很多人提供智慧合約,可以在上面做更加有創造力的事情,所以大家才願意執行以太坊的節點。4. 以太坊的智慧合約
智慧合約
- 1990s年代尼克薩博提出
- 一個可以自動執行的計算機程式
- 接收和回應資訊,接收和儲存價值,向外傳送資訊和價值
- 圖靈完備的語言
以太坊
- 智慧合約
- 公共區塊鏈平臺
- 以太幣是其代幣
- Ethereum Virtual Machine
- 點對點的合約
- Vitalik Buterin 在2013提出
- 2014年ICO眾籌得以發展
EVM
- 外部賬戶和合約賬戶
- 每個賬戶有一個持久的KV儲存
- 交易從一個賬戶發往另一個賬戶
- 包含程式碼程式碼,就會執行,交易相關的資料作為引數
- EVM執行交易的過程中,會消耗Gas
- 堆疊機器stack EVM虛擬機器分為外部賬戶和合約賬戶,外部賬戶專門用來轉帳 。合約賬戶包含一些程式碼,能在每個節點被執行,交易相關資料是它的引數。如果在合約裡面執行一個很長的程式碼, 允許它一直執行的話,會有可能把整個系統資源耗死,所以它有一個Gas的概念,要是想執行東西,就必須付錢,當付的錢消耗完了,這個合約就執行完了, 如果Gas消耗完了就不執行了,有沒有結果就不關心了,這樣能保證了保證整個系統安全。
Solidity
- Solidity是以太坊使用的類似JavaScript的高階語言
- 以編譯的方式生成以太坊虛擬機器程式碼
- 資料的每一個狀態都可以永久儲存
- 強調合約或者函式執行的呼叫方式
- 一旦出現異常,所有的執行都將被回撤
- Gas消耗完合約停止
- Remix無需安裝的瀏覽器編譯器
ERC 2.0
- ICO
- ERC20是一套標準介面
- 錢包自動支援代幣
- 把ETH打到對應的合約地址上,自動獲得代幣 ERC2.0本質是一套對應的介面,適應這個介面,就能完成ICO的過程。好處是把以太坊打到對應ICO合約地址上,就能自動獲取代幣,這對使用者來講比較簡單,所以有人在網上說5分鐘教你怎麼發token。
CryptoKitties 加密貓
- ERC721 Token
- 每一隻貓都是一種代幣
- 每一隻貓都是獨一無二的
- 每一隻貓都有自己的基因 加密貓也是一種代幣,加密貓最高成交的價格好像是1億多,每一個貓都獨一無二,因為天然是一種代幣,和token一樣,它還有自己的基因,這是遊戲的玩法了。
5. 如何開始
區塊鏈行業構成
- 底層協議
- 礦池製造
- 礦池
- 交易所
- 錢包
- 媒體 其中底層協議最關鍵。有一個說法,現在底層協議架構類似於98年的網際網路,當時大家做各種網路協議,HTTP協議等很多,現在的區塊鏈其實也是。
技術方向上
• 優秀的程式設計能力 • Go,C/C• 分散式協議 • 資料庫 • 編譯器 • 作業系統,核心 • 密碼學演算法
加入區塊鏈企業是瞭解和學習區塊鏈的最好方式
早期區塊鏈專案都是以開源為主,很少看到有閉源方式執行的,整個區塊鏈其實是執行在開源社群基礎上的,而區塊鏈專案本身又是一個開源的專案,希望區塊鏈專案未來能夠給開源社群做更多貢獻, 我們做的東西很多也都是開源的 。希望未來在能夠形成正向迴圈,開源社群給區塊鏈行業提供貢獻,區塊鏈行業產生更多的區塊鏈專案,區塊鏈專案本身又是開源的,又能給開源社群提供貢獻。以上是《給開發者的區塊鏈技術指南 | JTalk 掘金線下活動第五期》 講師姜家志的分享,如果你對掘金的 JTalk 線下活動感興趣,可以關注掘金活動頁面的 JTalk 活動報名。掘金 JTalk 目前已舉辦5期,每月一期的 JTalk 會邀請垂直行業的優秀工程師來分享優秀的實踐經驗,技巧方法。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。
JTalk 預告
JTalk 第六期即將在杭州舉辦。
- 主題:從前端到“後端”
- 時間:5.20