初識區塊鏈——區塊鏈到底是什麼

一、區塊鏈

1.1、概念概述

可以說,區塊鏈是比特幣概念的一個產物,在當時第一次提出比特幣這一概念的論文中,其實已經存在了 “區塊” 以及 “鏈” 這兩個詞,只不過並沒有把這兩個詞聯合起來而已。區塊鏈這一概念的第一次提出是在2016年。區塊鏈的英文名是Blockchain,從他的字面意思來理解的話,可以很輕鬆的知道這是塊和鏈的結合。比特幣也是區塊鏈的一個應用,而且是目前爲止規模最大、範圍最廣的一個應用。

目前爲止,對區塊鏈的定義並不是唯一的,不過結合區塊鏈的特徵,不難發現,區塊鏈其實就是基於比特幣區塊鏈技術的一個公共數據庫,不過這個數據庫的特別之處在於,這個數據庫是去中心化的。

1.2、核心算法概述

1.2.1、拜占庭協定

拜占庭協定來源於拜占庭問題:拜占庭帝國擁有巨大的財富,周圍10個鄰邦垂誕已久,但拜占庭高牆聳立,固若金湯,沒有一個單獨的鄰邦能夠成功入侵。任何單個鄰邦入侵的都會失敗,同時也有可能自身被其他9個鄰邦入侵。

他的核心思想在於每個將軍都有一份實時與其他將軍同步的消息賬本。賬本里有每個將軍的簽名都是可以驗證身份的。如果有哪些消息不一致,可以知道消息不一致的是哪些將軍。儘管有消息不一致的,只要超過半數同意進攻,少數服從多數,共識達成。

而區塊鏈也恰恰利用了這一核心思想,區塊鏈提供一個分佈式賬本平臺,區塊鏈所提供的賬本我們稱作超級賬本。一般地,多個交易被打包進區塊中,多個區塊構成一條區塊鏈。區塊鏈代表的是賬本狀態機發生變更的歷史過程。

1.2.2、非對稱加密

非對稱加密,其實也就是說,使用一對公私鑰來進行加密。使用私鑰加密的密文,只能通過公鑰來進行解密,這樣的話,可以用來驗證加密方的身份,可以作爲一個數字簽名。當然,使用公鑰加密的密文,也只有私鑰才能夠解密出相應的明文。

一般來說,如果你保存好自己的私鑰,不讓別人知道的話,那你所擁有的與私鑰有關的一切東西都是安全的。

非對稱加密舉例

非對稱加密的算法有很多種,例如,由麻省理工學院的三位學者提出的RSA加密算法、由揹包問題衍生出來的Knapsack算法、由離散對數難題衍生出來的Elgamal算法、以及基於橢圓曲線的橢圓曲線加密算法等。在本文中,我們採用的是以太坊的橢圓曲線加密算法。橢圓曲線加密算法是以太坊的核心,在以太坊上的所有通信,都需要發起者通過其私鑰簽發,而另外的通信者則需要使用發起者的公鑰進行解密。假設區塊鏈上的兩個用戶要進行通信,那麼他們是怎麼通信的呢?我們消息發起者爲A,消息接收者爲B。首先,A需要對他想要發送的消息使用私鑰加密,加密的過程如下:

1) 首先生成一個隨機數r0r_0,選取基點PP,然後求出隨機數和基點的乘積點:r0P=(X,Y)r_0P=(X,Y)
2) 根據明文mm、明文mm的哈希值hh以及AA自己的私鑰SKCSK_C生成ss:s=h+SKCXr0s=\frac {h+ SK_CX}{r_0}

3)在上述所有的工作完成之後,把ss、點r0Pr_0P、以及消息mm發送給B,其中ss以及r0Pr_0P起到的作用就是數字簽名。

那麼B接收到由A發來的信息後,是怎麼處理數據的呢?數據處理過程如下:

1) 使用A所發送的消息mm計算mm的哈希值hh
2) 利用A的公鑰PKCPK_C以及基點PsP、s計算出CCC=hsP+Xs(PKCP)C=\frac {h}{s}P +\frac{X}{s}(PK_CP)
3) 如果簽名是正確的,那麼將會得到結果:C=r0PC=r_0P

1.2.3、容錯問題

在消息傳輸的過程中,可能會丟失、損壞、延遲、重複發送,並且接受的順序與發送的順序不一致。

而節點的行爲也可以是多樣的,可以隨時加入、退出網絡,可以丟棄消息、僞造消息、停止工作等,還可能發生各種人爲或非人爲的故障。

區塊鏈上的算法對由共識節點組成的共識系統,提供的容錯能力,這種容錯能力同時包含安全性和可用性,並適用於任何網絡環境。

1.2.4、分佈式一致性算法

想要了解這個種類的算法,必須要先知道兩個定理:FLP不可能性以及CAP定理

FLP不可能性是指即使網絡通信完全可靠,只要產生了拜占庭錯誤,就不存在一個確定性的共識算法能夠爲異步分佈式系統提供一致性。

CAP定理是指在設計分佈式系統的過程中,“一致性”“可用性”“分區容忍性”三者中,我們只能選擇兩個作爲主要強化的點,另外一個必然會被弱化。

區塊鏈爲了保證每個節點執行相同的命令序列,需要在每一條指令上執行一個“一致性算法”以保證每個節點看到的指令一致。也就是說,每一個節點在相同狀態下,執行相同的命令之後,最終的狀態都是一致的。

1.2.5、共識機制

共識機制中,最重要的兩個證明分別是:工作量證明以及權益證明的相關算法。

工作量證明是指爲了選出一位參與者成爲領導者並選擇下一個加入區塊鏈的區塊,參與者必須解決一個特定的數學問題。

權益證明是指權益證明用權益替代了工作量證明在電力和算力方面的要求。權益指的是參與者在一段時間內願意鎖定的代幣量。作爲回報,他們成爲下一個領導者並選擇下一個區塊的可能性是與他們所下的賭注成正比的。

總之,區塊鏈的共識機制的核心思想就是讓攻擊的所能夠得到的收益遠遠小於他成功攻擊所需要的成本。

1.2.6、分佈式存儲

分佈式存儲的思想,如果通俗一點來說的話,其實他就是要把100個雞蛋分別放在不同的籃子裏。

分佈式存儲技術並不是每臺電腦都存放完整的數據,而是把數據切片後加密存放在不同的電腦裏。

而相應的信息存儲在哪裏呢?其實是存儲在了礦工的電腦裏。存儲時,有關切片文件的存儲信息會被記錄到區塊鏈上,以防止信息被篡改。

1.3、 零知識證明

1.3.1、概述

先看兩個是零知識的證明的例子:

1) 證明你有習題的答案?

 誰也別想看到我的答案本,要是想知道我真的有答案,那你就出題,讓我來給你結果。

2) 證明你有公司所有電腦的密碼?

 你說想讓我打開哪臺電腦,我都能打開。

再看一下同樣是解決方法,但並不是零知識證明的例子:

1) 證明你有習題的答案?

 把答案本直接拿給別人,讓他們驗證是不是正確的。

2) 證明你有公司所有電腦的密碼?

 我把密碼都告訴你,你去驗證吧。

通過上面的例子,其實就很容易理解零知識證明的核心思想了,其實就是說,你有相應的數據,但是別人讓你證明你有這個數據的時候,你不讓他們看到你所擁有的數據。

1.3.2、舉例

本來想使用DUBI車險數據的處理方法來舉例的,算了,太多公式了,等到下一篇文章單獨介紹一下吧。

二、區塊鏈1.0-比特幣

2.1、概述

比特幣與紙幣、黃金、白銀等交易貨幣不同的是,它只是一串數字,每個比特幣都是一串唯一的數字,在比特幣網絡中,決不可能存在兩段不同的代碼代表同一個比特幣的情況,而比特幣的擁有者則有自己的比特幣賬戶地址。

2009年1月3日,提出比特幣這一概念的匿名用戶便開始了實現自己想法的實踐之旅,他在Helsinki的一個服務器上創造了比特幣世界的第一個區塊,我們把這個區塊叫做“創世區塊”。顧名思義,這是衆多連接起來的區塊中的第一塊。

2.2、區塊信息

比特幣的每個區塊都包含了三個部分:區塊的基本情況、哈希值、交易詳細信息。區塊的基本情況中,又包含了許多信息:交易的數量、交易所產生的費用、對礦工所給予的比特幣數量、挖礦的難度、區塊的創建時間等。而在哈希值中,則包含了區塊的哈希值、礦工在區塊上添加的哈希值、在這個區塊之前的一個區塊的哈希值以及下一個區塊的哈希值等。這個區塊記錄的全部交易情況(每一次生成交易時的時間、輸入地址、輸出地址等)都被包含在交易詳細信息之中。

如果大家覺得描述的太抽象了的話,可以找找創世區塊,去看看具體結構是什麼樣子的。

三、區塊鏈2.0-以太坊

3.1、概述

以太坊是一個公開鏈,可以在以太坊上處理金融以及非金融類型應用的狀態。以太坊的計算機網絡顯得很創新且又吸引人心,它促成了一種真正的去中心化應用。使用以太坊進行應用的開發其實並不難,以太坊提供了許多能夠用來開發應用的框架,其中不免密碼學技術基礎框架。因此,使用以太坊進行應用的開發,不僅能夠降低開發的難度,更能對應用提供安全技術支持。從以太坊的發展來看,他帶來的改變將影響全球經濟的走向。

以太坊包含了用來構建以及發佈應用的以太腳本,也包含了自己的數字貨幣,叫做以太幣。以太幣與比特幣非常相似,這兩種數字貨幣都不能被僞造,都以去中心化的方式來確保貨幣不會被某一方控制。而以太腳本提供了一個完整的編程語言環境,有了以太腳本後,我們便可以制訂不會產生二義性的合約了。

從以太坊設計的底層來看,以太坊其實是基於計算機密碼學的一個開源技術協議。以太坊有很多模塊,每個模塊分別實現了不同的功能,之後再把各個模塊整合起來,形成了以太坊這個整體。與此同時,以太坊可以被看作是智能合約以及區塊鏈的完美結合體,我們可以把已經寫好了的智能合約部署到以太坊上,通過以太坊虛擬機以及以太坊提供的RPC接口來訪問智能合約和實現與區塊鏈之間的交互。

以太坊虛擬機是以太坊中用來爲智能合約提供執行環境的重要部分。其實他是以太坊項目之中衆多創新的一部分。以太坊虛擬機是由衆多相互連接着的計算機構建而成的,每個人都可以在以太坊上定義智能合約,這些程序會按照虛擬機所定義的方式執行。以太坊上的賬戶(其實也就是以太坊地址)可以分爲兩大類:外部賬戶、合約賬戶。外部賬戶的以太坊地址其實是由它的公鑰來決定的,而合約賬戶的以太坊地址則是在創建這個合約的時候由這個合約的創建者的以太坊地址以及從這個地址中所產生的交易數量來決定的。這兩類賬戶的區別是:外部賬戶在以太坊中是沒有代碼的,人們可以通過生成以及簽名一筆交易而從一個外部賬戶發送信息。

3.2、以太坊錢包

比較常用的以太坊錢包有五種,分別是:Parity、MyEtherWallet、imToken、MetaMask、Legder。接下來,分別爲幾種以太坊錢包做個簡潔的介紹:

•Parity: 這個以太坊錢包是由Ethereum Foundation的一部分成員提出以及開發出來的,是一個全節點以太坊錢包並且其功能非常完善。這個錢包的安全度很高,且發起交易時並不會有第三方的參與。不過,也存在一些缺點,對網絡的要求比較高是它的缺點之一。
•MyEtherWallet: MyEtherWallet是一個輕錢包,如果想要使用這個錢包,並不需要下載,直接在網頁上就可以完成所有的操作且支持很多硬件錢包。不過,MyEtherWallet並不會幫用戶保存在MyEtherWallet上生成的密鑰,用戶需要自己保存密鑰,且在進行交易時需要輸入密鑰。
•imToken: imToken是一個移動端錢包,操作也很簡單,能夠讓用戶很快上手,在這個錢包生成的密鑰可以保存在手機本地上,平臺上是沒有備份的,另外,對於廣大開發者來說的一大優點便是,這個軟件現在已經開源了。imToken的缺點是隻有手機客戶端。
•MetaMask: MetaMask一開始的時候是作爲chrome瀏覽器的插件被大多數人認識的,在本文中,也使用了MetaMask錢包,只不過是作爲火狐瀏覽器的一部分來使用的,MetaMask支持各種硬件錢包,且操作簡單。不過,MetaMask需要我們自己添加代幣的智能合約地址。
•Legder: 這是一個硬件錢包,可以出色的保護用戶的賬戶安全,可以配合上述提到的除了移動端錢包之外的以太坊錢包使用,不過這個錢包的價格並不便宜。

3.3、以太坊客戶端

如果你還在爲自己只會一種編程語言,而不能進行以太坊開發而發愁的話,這些考慮是多餘的,以太坊官方正好爲你解決了這一問題。

爲了能夠使用各種語言爲以太坊的測試提供支持,以及爲了能夠讓更多人加入到以太坊的開發行列之中,目前出現了使用8種語言編寫的以太坊客戶端。他們分別是使用c++語言編寫的以太坊客戶端cpp-ethereum,用Go語言編寫的用於以太坊開發的客戶端go-ethereum,也就是本文所使用的geth客戶端。用javascript語言編寫的以太坊客戶端ethereumjs-lib,使用Java語言編寫的以太坊客戶端Ethereum(J),使用Ruby語言編寫的以太坊客戶端ruby-ethereum,使用Python語言編寫的客戶端pyethapp,使用Rust語言編寫的客戶端Parity,這個客戶端是目前最輕便的用於以太坊開發的客戶端,且在歷次以太坊攻擊中表現良好。使用Hashell語言編寫的客戶端,目前爲止這個客戶端的資料最少,因此不推薦使用該客戶端。上述的幾種客戶端中,本文推薦使用geth客戶端作爲以太坊開發的客戶端,因爲geth客戶端是目前爲止以太坊官方沒有停止維護且也是官方建議使用的客戶端。

以太坊官方還提供了一個特殊的客戶端瀏覽器——Mist,利用這個瀏覽器,用戶可以運行各式各樣的以太坊應用。Mist這一瀏覽器,對新手非常友好,用戶使用時並不需要太多的專業知識,因此用戶可以輕鬆上手使用這一瀏覽器,再加上Mist由出色的安全機制、公私鑰管理機制以及與區塊鏈相關的組件組成,使得他成爲了不懂編程或不精通區塊鏈的用戶用來運行去中心化應用以及管理區塊鏈相關應用中非常重要的一部分,因爲不懂編程或不精通區塊鏈的用戶並不需要去了解以太坊的底層設計。

3.4、智能合約

其實智能合約這一概念很早就被提出來了,智能合約這一概念是由Nick Szabo在90年代提出的,智能合約的歷史幾乎與互聯網一樣長。智能合約其實是一段可執行代碼,不過這段代碼實現的是傳統意義上的合約,雙方或多方可以通過智能合約來簽訂都認可的協議。由於在當時缺少值得信賴的執行環境,把智能合約用到實際生活中便顯得天方夜譚。但是在比特幣這一概念被提出了之後,人們便意識到比特幣的核心技術——區塊鏈技術正好能夠作爲執行智能合約的可信賴的運行環境,以太坊這一公開鏈則首先實施了智能合約與區塊鏈完美結合的工作。

在以太坊的內部,配備了圖靈完整性編程語言的區塊鏈,我們可以通過這一特性構建抽象的應用基礎層,以便所有想要通過以太坊構建合約的人構建合約以及基於以太坊的應用,並在以太坊中定義屬於他們自己的規則。要是想編寫智能合約,solidity語言將會是我們的首選編程語言,我們可以通過truffle框架輕鬆的編譯由solidity編寫的智能合約,並通過truffle進行智能合約的部署,整個過程並不需要開發者動手編程,只需要依靠truffle框架就可以很方便的編譯和部署智能合約了。

3.5、怎麼創建DAPP

我們可以結合以太坊來進行DAPP的開發,具體的開發步驟我留在以後講吧。

四、區塊鏈開發指導

4.1、以太坊環境搭建

在linux系統下配置以太坊開發環境:
輸入以下命令安裝solc:

sudo npm install -g solc

我們需要在geth控制檯使用solc編譯器,那麼我們仍然需要安裝solc二進制包。輸入以下命令安裝solc二進制包:

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
which solc可以用來驗證一下環境是否安裝成功

4.2、以太坊客戶端安裝

本文使用的是geth搭建的私有鏈,因此需要安裝geth客戶端:
輸入以下命令安裝geth客戶端:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

4.3、truffle框架安裝

安裝NodeJs,想要使用truffle框架對智能合約進行操作,需要NodeJs環境,且NodeJs版本不能低於5.0
輸入以下命令安裝NodeJS:

sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash 
sudo apt-get install -y nodejs

爲了更快捷的進行以太坊開發,我們需要安裝truffle框架:
輸入以下命令安裝truffle框架:

sudo npm install -g truffle

4.4、以太坊客戶端geth安裝

本文使用的是geth搭建的私有鏈,因此需要安裝geth客戶端:
輸入以下命令安裝geth客戶端:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

4.5、 私鏈搭建

本次文使用的是自己搭建的私鏈,當然,也可以使用Ganache本地私鏈,ganache的私鏈很簡單,只需要安裝ganache以後,開啓他就會成爲一個私鏈。

使用geth客戶端搭建私鏈的方法就我所知道的有兩種,在這裏,我推薦一個鏈接:
私鏈搭建方法

如果有任何疑問,可以通過私信來聯繫我,也可以評論。

4.4、挖礦

使用以下命令來啓動挖礦以及停止挖礦:
挖礦命令:

miner.start()

停止挖礦的命令:

miner.stop()

4.5、常用的truffle框架命令

初始化文件:

truffle init

進行智能合約的編譯:

truffle compile

進行智能合約的部署:

truffle migrate

當然,truffle還有更多的高逼格命令,我不可能在這裏一一列出的,想知道的同學可以去truufle官網看看。

五、區塊鏈開發視頻分享

想要區塊鏈開發的學習文檔以及區塊鏈開發視頻教程的同學可以評論也可以私聊我,我看到的話,會聯繫你的。

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