【系列】區塊鏈與以太坊實戰(1)-基礎知識

請掃描本文結尾的二維碼關注我的微信公衆號,或在微信搜索 極客起源 即可關注,每個工作日都有文章更新。

李寧老師的區塊鏈與以太坊系列文章開張了,本系列文章將全面闡述區塊鏈與以太坊的基本概念以及核心技術,包括挖礦、智能合約、以太坊、Solidity語言、Truffle、Ganache等技術,以及如何發佈自己的數字貨幣和編寫基於以太坊的雲筆記。


這篇文章將帶領大家進入區塊鏈的世界,區塊鏈是現今炙手可熱的技術之一。那麼到底什麼是區塊鏈呢?區塊鏈有什麼用呢?這些問題的答案將在本文揭曉。
本文的主要內容如下:
1. DApp的基本概念
2. 比特幣的基本概念
3. 掌握什麼是工作量證明(PoW)
4. 掌握什麼是股權證明(PoS)
5.瞭解什麼是51%攻擊
6.瞭解區塊鏈和以太坊的關係
7.瞭解超級賬本項目
8.瞭解區塊鏈的主要應用場景

基於區塊鏈的應用與其他類型的應用不同。區塊鏈應用涉及到很多概念,如果不瞭解這些概念,根本就無法理解相關代碼,更別提自己編寫程序了,因此,在正式探索區塊鏈之前,先要了解一些必要的概念。

1  去中心化應用(DApp)

對於傳統的網絡應用,都會有一個服務端程序,然後多個客戶端連接到這個服務端,這叫做中心化應用。中心化應用必須要保證服務端永遠處於可連接的狀態,一旦服務端掛掉,那麼也就意味着整個網絡應用將無法運行(客戶端無法連接服務端)。

爲了解決網絡應用中過分依賴服務端的狀況,出現了P2P應用,也就是點對點應用。在這類應用中並不存在對網絡完全控制的中心節點,其中部分節點掛掉,並不影響整個P2P網絡的運行,這類應用就稱爲去中心化應用(DApp)。在DApp網絡中,任何節點都有可能爲自己服務,而自己擁有的節點也可以爲任何其他節點服務,真正實現了人人爲我,我爲人人的互聯網精神。像迅雷下載客戶端就屬於這類應用。本系列文章主要介紹的區塊鏈就是實現DApp的一種重要方法,而比特幣就是實踐了區塊鏈技術的第一個成功案例。關於區塊鏈和比特幣的詳細描述會在稍後的部分介紹。

理想是美好的,現實是骨感的。DApp的想法是非常好的,網絡中所有的節點互爲客戶端和服務端。網絡中所使用的數據會根據一定的算法將全部或部分數據存儲在分佈在網絡中的各個節點上,在必要時會進行數據同步。但是,將數據保存到節點上,而非服務端統一管理,這就意味着數據有可能會遭到串改,某些節點也有可能會發布錯誤數據。如果是敏感數據,例如,比特幣交易數據,一旦被串改,將會給相關各方造成相當大的損失。因此,發現和防止節點對應用數據進行非法篡改或者與其他節點分享錯誤信息是一個重要挑戰,所以在節點之間需要對某個節點發布的數據是否正確達成共識。在DApp中並沒有中心服務器來協調節點,或者決定什麼是對、什麼是錯,因此,應對這個挑戰的難度非常大。通常的做法是採用一致性協議(concensus protocol)解決這個問題。不同的DApp通常使用不同的數據結構類型的共識協議,例如,比特幣使用工作量證明協議(PoW)來達成共識。

所有使用DApp的用戶都需要一個客戶端。不過客戶端不能直接連接DApp網絡,在使用DApp時,用戶首先需要運行DApp中自己的節點,然後將客戶端連接至節點。DApp的節點只提供應用程序編程接口,並允許開發者使用API開發多種客戶端。一些DApp開發人員會提供一個官方的客戶端。DApp官方客戶端通常是開源的,可以下載使用,否則去中心化的想法就失敗了。並且很多官方客戶端不僅可以用來操作DApp,還可以作爲服務,供像web3.js這樣的庫進行連接,通過這些庫,可以開發出更強大的DApp客戶端。

2. DApp的內部貨幣

對於中心化應用來說,所有者需要盈利才能長期維護應用的運行。這是因爲中心化應用需要支付服務器維護費用、帶寬費用、人員費用等。DApp雖然沒有所有者,但與中心化應用一樣,維持DApp節點的正常運行仍然需要一定的費用,如硬件、網絡支援等。因此,DApp節點需要一些回報來維持運行,於是內部貨幣登場了。大多數DApp都有內置的內部貨幣,或者說成功的DApp都有內部貨幣,如比特幣網絡中的比特幣就是最著名的內部貨幣。

那麼,每個節點到底應該收多少內部貨幣呢,這由共識協議決定。根據共識協議,只有爲維護DApp安全和運行做出貢獻的那些節點可以賺取內部貨幣,只進行數據讀取的節點沒有回報。例如,在比特幣網絡中,只有礦工(miner)成功挖礦才能賺取比特幣。

3. 比特幣
比特幣(bitcoin)是一種去中心化的貨幣,是最熱門的DApp,它的成功充分展示了DApp的強大。比特幣的成功大大鼓勵了人們創建其他的DApp。在瞭解比特幣的細節以及爲什麼人們認爲它是一種貨幣之前,需要先了解兩個概念:賬本和區塊鏈。
(1)賬本
任何交易都需要記錄,而用於記錄比特幣交易的就是賬本(ledger)。那麼賬本與數據庫有什麼區別呢?在數據庫中,我們可以添加、修改和刪除交易。而在賬本中,只能添加新的交易,不能修改和刪除交易。數據庫可以用來實現賬本,反過來卻不可以。

(2)區塊鏈
區塊鏈(blockchain)是用於創建去中心化賬本的數據結構,也就是說,區塊鏈與數據庫類似,是用於存儲數據的。區塊鏈中的區塊按序號排列。每一個區塊都包含一個交易集合、前一個塊的哈希碼、時間戳(指明區塊被創建的時間),塊獎勵,塊序號等信息。由於每一個塊都包含了前一個塊的哈希碼,因此可以創建一個互相連接的塊鏈表,因此稱爲區塊鏈。網絡中每一個節點都會保存一份區塊鏈的副本。
爲了保證區塊鏈的安全,工作量證明(PoW,Proof-of-work)和股權證明(PoS,Proof-of-stake),以及其他的一致性協議被應用於區塊鏈。由於有這些協議的存在,在區塊鏈中添加新的區塊並不容易,例如,在PoW中,向區塊鏈中添加區塊的過程被稱爲挖礦,挖礦從技術上說就是解決複雜的計算難題,那麼爲什麼要解決複雜的計算難題呢?通過PoW以及其他一致性協議是如何阻止某些節點對整個區塊鏈進行攻擊的呢?請讀者繼續往下面看。 

4. 工作量證明(PoW)
工作量證明(PoW)就是在修改區塊鏈之前先證明你沒有對DApp網絡進行攻擊,那麼怎麼證明呢?就是在本地先完成一項艱鉅的任務,然後將完成的結果上傳到DApp網絡進行驗證。這項艱鉅任務的要求是沒有可以投機取巧的方式完成,必須用最原始、最暴力的方式一點一點完成,完全是拼體力。

那麼可能有很多讀者會問,完成任務和阻止攻擊有什麼關係呢?這就涉及到一個經濟學的概念了:經濟懲罰。大概的意思就是既然無法阻止攻擊,那麼就讓攻擊付出慘重的代價。

完成DApp網絡交給你的任務是要付出代價的。通常的任務是要解決計算難題,這種解決計算難題的過程被稱爲挖礦。
在PoW中要解決的難題通常是計算一個哈希值。例如,給定的一個基本的字符串"Hello, world!",我們的任務是,可以在這個字符串後面添加一個名爲nonce的整數值,對變更後的字符串進行SHA256哈希運算,如果得到的哈希結果(以十六進制的形式表示)是以"0000"開頭的,則驗證通過。爲了達到這個工作量證明的目標。我們需要不停的變化nonce值,對得到的新字符串進行SHA256哈希運算。按照這個規則,我們需要經過4251次計算才能找到恰好前4位爲0的哈希散列。我們會發現,隨着0的個數增加,計算難度會以指數級增加。而且並沒有算法可以一下子算出結果,但結果卻是非常好驗證的,所以要完成這項任務,就需要非常強的算力,也就是說,要想搞定這個任務,需要自己花錢買一大堆高性能的計算機。而且現在區塊鏈分派的任務越來越艱鉅,計算量越來越大,如果是以營利爲目的的攻擊,可能爲了價值幾百萬的比特幣,你要花幾千萬去購買計算機來完成相關的計算任務,完全是得不償失。所以就很少有人去做這樣的賠本攻擊,因爲攻擊成本會遠大於收益。

5. 股權證明(PoS)
PoS,簡單來說,就是一個根據你持有貨幣的量和時間,給你發利息的一個制度,在股權證明模式下,有一個名詞叫幣齡,每個幣每天產生1幣齡,例如,你持有100個幣,總共持有了30天,那麼,此時你的幣齡就爲3000,這個時候,如果你發現了一個PoS區塊,你的幣齡就會被減去一定的值。你每減少365個幣齡,你將會從區塊中獲得0.05個幣的利息(可理解爲年利率5%),那麼在這個案例中,利息 = 3000 * 5% / 365 = 0.41個幣。要注意的是, 5%的年利率僅僅是作者舉例,並非每個PoS模式的幣種都是5%,比如點點幣PPCoin就是1%年利率。 

6. 51%攻擊
可能有很多人會想對策,由於區塊鏈分配的任務難易程度不同,我不用那麼大的計算量,少買點計算機,是否可以找到一個盈利的平衡點呢?其實一開始我也是這麼想的,但根據PoW算法機制,如果你的計算量不夠大,是無法控制區塊鏈的走向的,也就是說,即使你投入了大量的成本用於完成任務,也不能保證自己成功。這就像花了數百萬購買彩票,你只能保證比只花兩元錢購買一張彩票的人的中獎機率要大,但並不能保證你一定能中獎。花幾十萬上百萬就中袋洗衣粉,花2元中500萬的也大有人在。彩票獎金的設置永遠要遠小於購買所有彩票的成本,所以你是無法採用窮舉的方式保證100%中獎率的。區塊鏈也是一樣,即使你的算力非常強,也不能保證100%成功,只是成功的可能性更大而已。
前面說過,誰的算力多,誰最先解決問題的概率就越大。當掌握超過全網一半算力時,從概率上就能控制網絡中鏈的走向。這就是所謂 51% 攻擊。這也是區塊鏈的弱點,如果誰掌握了超過全網一半的算力,誰就可以主導區塊鏈網絡,也就是說,區塊鏈並非100%安全,但如果要蓄意攻擊區塊鏈網絡,需要付出很大的代價,但從理論上來說,區塊鏈可能會受到攻擊。

7. 區塊鏈
在前面已經多次提到了區塊鏈,那麼區塊鏈到底是什麼東西呢?
區塊鏈是創建去中心化賬本的數據結構。一個區塊鏈由若干個序列化排列的區塊組成。每一個區塊都包含一個交易集合,前一個塊的哈希碼,時間戳(指明區塊被創建的時間),塊獎勵,塊序號等信息。由於每一個塊都包含了前一個塊的哈希碼,所以可以創建一個互相連接的塊鏈表,因此稱爲區塊鏈。網絡中每一個節點都會保存一份區塊鏈的副本。
爲了保證區塊鏈的安全,工作量證明(PoW,Proof-of-work)和股權證明(PoS,Proof-of-stake),以及其他的共識協議被應用於區塊鏈。由於有這些協議的存在,在區塊鏈中添加新的區塊並不容易,例如,在PoW中,向區塊鏈中添加區塊的過程被稱爲挖礦,挖礦從技術上說就是解決複雜的計算難題,這一點在前面已經講過了。

8. 以太坊

以太坊是一個去中心的平臺,允許在這個平臺上運行DApp。DApp需要依賴智能合約,而智能合約要使用Solidity語言編寫。一個或多個智能合約可以一起組成一個DApp。因此,運行在以太坊上的程序就是智能合約。

我們可以將以太坊比喻成Android系統,而智能合約就相當於運行在Android系統上的各種底層的庫。後面的章節會講解web3.js,這是用於調用智能合約的JavaScript接口,相當於Android SDK。也就是說,我們可以使用JavaScript編寫客戶端來調用智能合約程序。使用這個JavaScript接口編寫的區塊鏈客戶端就相當於Android系統上的App。

智能合約之所以要運行在以太坊網絡上,是因爲運行在以太坊網絡上的智能合約非常容易彼此交互,有了智能合約,開發人員並不需要爲集成各種共識協議和其他東西而操心,這些以太坊都可以輕鬆爲我們搞定。而開發人員只需要編寫應用邏輯代碼即可。

以太坊有一個內部貨幣,叫以太幣(ether)。爲了發佈智能合約或執行智能合約中的方法,需要一定數量的以太幣。

9. 超級賬本項目
超級賬本是一個項目,這個項目是首個面向企業應用場景的開源分佈式賬本平臺。在Linux基金會的支持下,超級賬本項目吸引了包括IBM、Intel、Cisco、摩根大通、騰訊等在內的衆多科技和金融巨頭的參與,以及在銀行、供應鏈等領域的積極應用實踐。超級賬本社區在成立一年多時間以來,也得到了廣泛的關注和飛速的發展,目經擁有超過140家企業會員。

加入超級賬本的有很多項目,Fabric項目就是最早加入超級賬本項目的頂級項目,Fabric由IBM、DAH等企業與2015年底提交到社區。項目用Go語言實現,在github上已經有超過5000次提交。該項目的定位是面向企業的分佈式賬本平臺,創新地引入了權限管理支持,設計上支持可插拔、可擴展,是首個面向聯盟鏈場景的開源項目。

聯盟區塊鏈是指其共識過程受到預選節點控制的區塊鏈。例如,不妨想象一個有15個金融機構組成的共同體,每個機構都運行着一個節點,而且爲了使每個區塊生效需要獲得其中10個機構的確認(2/3確認)。區塊鏈或許允許每個人都可讀取,或者只受限於參與者,或走混合型路線,例如區塊的根哈希及其API(應用程序接口)對外公開,API可允許外界用來作有限次數的查詢和獲取區塊鏈狀態的信息。這些區塊鏈可視爲“部分去中心化”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章