【區塊鏈學習筆記】以太坊、智慧合約

2020-09-30 16:00:49

一、以太坊

以太坊是區塊鏈2.0時代的代表,也是全球第一個ICO專案。

1. 定義

以太坊(Ethereum):是一個開源的有智慧合約功能的公共區塊鏈平臺,通過其專用加密貨幣以太幣(Ether)提供去中心化的以太虛擬機器器(Ethereum Virtual Machine)來處理對等合約。

從上述的定義可以看出以太坊和位元幣相似,都是一個基於區塊鏈技術的分散式計算平臺。不過它更強調自己是一個智慧合約系統,其實它的本質和位元幣是一樣的。只不過可以在這個平臺裡任意生成多個不同的位元幣系統而已。

以太坊涉及到三個基本概念:

  • 以太幣:簡稱ETH,以太幣是以太坊的內部燃料,為以太坊上各種幣的自動交易提供主動的流動性,同時也適用於智慧合約執行的費用支付,它是以太坊內建的資產。
  • 以太坊虛擬機器器:簡稱EVM,支撐執行任何複雜的程式碼和演演算法的虛擬機器器。
  • 智慧合約:指的是由計算機程式定義、可自動執行的承諾和協定。簡單來說就是,指令碼程式碼。

2. 以太坊與位元幣的關係

位元幣存在的不足:

  • 位元幣區塊鏈缺少圖靈完備。圖靈完備是指一切可計算的問題都可以計算。
  • 位元幣區塊鏈的擴充套件性比較差,不能應用在除了位元幣以外的其它領域。

以太坊的優化:

  1. 建立了一個圖靈完備的底層系統,可以通過簡單的程式來實現各類數位資產的生產。
  2. 一個可程式化、圖靈完備的區塊鏈網路,可以實現更多的非資產類的功能型產品。

以太坊技術=區塊鏈技術+智慧合約

3. 以太坊的共識

下面三個版本的以太坊的共識機制均採用PoW,目前來看正在往混合共識機制轉換,以太坊的混合共識機制是PoW+POS,從而使礦工與持幣者的利益得到平衡。

二、智慧合約

1. 智慧合約的定義

智慧合約:指的是由計算機程式定義、可自動執行的承諾和協定。

以太坊智慧合約:程式碼(即合約功能)和資料(即合約狀態)的集合,存在於以太坊區塊鏈的特定地址。合約賬戶能夠在彼此之間傳遞資訊,進行圖靈完備的運算。合約依靠以太坊虛擬機器器(EVM)以位元組程式碼的二進位制格式在區塊鏈執行。

以太坊智慧合約可以分為5種:

  • 資料庫合約:僅用作資料儲存。允許其他合約寫入、更新和獲取資料,以及檢查呼叫者許可權。
  • 管理員合約:在資料庫合約上執行。執行批次讀/寫操作。
  • 合約管理合約(CMC):目的是管理其他合約。主要任務是跟蹤系統的所有合約/元件,處理這些元件之間的通訊,並簡化模組化設計。保持此功能與正常業務邏輯分離。
  • 應用邏輯合約(ALC):包含應用程式特定的程式碼。一般來說,如果合約使用控制器和其他合約來執行特定的任務,則它是ALC。
  • 公用合約:執行特定的任務,並且可以被其他合約無限制地呼叫。它可能使用某種演演算法雜湊字串,提供亂數字或其他東西。通常不需要太多儲存空間,而且只有很少或沒有依賴關係。

2. 智慧合約的編譯

智慧合約原始碼

在這裡插入圖片描述
在部署智慧合約之前,需要兩件事情:編譯程式碼和應用程式的二進位制介面,二進位制介面是一種參考模板,用於定義如何與合同進行互動。

智慧合約編譯工具的安裝

安裝智慧合約編譯工具solc,solc是一個Solidiy命令列編譯器,是Solidity編譯方法之一。
在ubuntu系統,在終端輸入命令列就可以成功安裝。

在Ubuntu系統
在終端中執行以下命令: 
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
which solc

在MAC OSX系統,也是在終端輸入命令列。

在Mac OSX系統中
在終端中執行以下命令:
brew tap ethereum/ethereum
brew install solidity
which solc

在Windows系統中,需要安裝chocolatey,該工具可以在windows上管理軟體,然後執行命令列就可以了。

在Windosw系統中
需要安裝chocolatey (https/chocolsteyorg/),該工具可以在windows上管理軟體。
在終端中執行以下命令:
cinst -pre solC-stable

最後是通過原始碼安裝solc。

在終端中執行以下命令:。
git clone https://github.com/ethereum/cpp-ethereum.git
mkdir cpp-ethereum/build
cd cpp-ethereum/build
cmake -DISONRPC=OFF -DMINER=OFF -DETHKEY=OFF -DSERPENT=OFF-DGUI=OFF -DTESTS=OFF -DJSCONSOLE=OFF
make -j4
make install
which solc

在命令列輸入下面的bin命令進行智慧合約程式碼solc編譯:

solc --bin HelloWorld.sol

除了位元組碼資料,還需要一個abi介面,通過執行abi命令:

solc --bin HelloWorld.sol

得到abi資訊,在之後的測試部署中可能會用到。

3. 智慧合約的測試

以下是智慧合約範例

pragma solidity ^0.4.20;
contract Simplestorage {
	uint storedData;
	function set(uint x){
		storedData= x;
	}
	function get() constant returns(uint){
		return storedData;
	}
}

三種智慧合約測試的方式:
Remix+MetaMask
wallet +MetaMask
truffle

智慧合約測試工具安裝及使用

  1. Remix+MetaMask
    remix是一個瀏覽器版的solidity開發IDE(整合式開發環境),可以使用線上版,也可以安裝到本地。MetaMask是一個瀏覽器外掛,作用相當於一個輕型的以太坊錢包,谷歌或者火狐瀏覽器都可以使用。安裝方法是直接在瀏覽器應用商店中搜尋MetaMask,或者在MetaMask官網下載安裝。
    以太坊錢包安裝完成之後,首先使用Remix釋出智慧合約,釋出成功之後,右邊就會顯示已經發布成功的智慧合約以及合約相關的資訊,包含合約地址以及暴露到外部的介面。
  2. wallet +MetaMask
    如果已經安裝好了MetaMask,那麼直接開啟以太坊錢包的官網https://wallet.ethereum.org/
  3. truffle(首先需要自行安裝node環境以及cnpm )
    (1)安裝 truffle:
    cnpm i-g truffle
    (2)建立專案工程:
    mkdir truffle && cd truffle
    truffle init
    (3)專案結構:
    contracts目錄下存的是solidity合約程式碼,migrations中存的是js指令碼,test中存的是測試用例。
    (4)編寫程式碼、部署、偵錯
    contracts中新建Hello.sol檔案;
    注意:
    類名Hello需要跟檔名Hello.sol儲存一致
    Migrations.sol檔案不能刪除。
    在migrations目錄下新增對應的js指令碼2_depoly_hello.js
    程式碼新增完後,開啟終端,切換到專案所在路徑,執行程式碼。

三、以太坊虛擬機器器EVM

傳統意義上的虛擬機器器
虛擬機器器:實際上不是物理計算機,而是一個用來模仿物理計算機的軟體環境,但虛擬機器器可以像物理計算機一樣執行程式。用於託管虛擬機器器的物理計算機通常可以支援多臺虛擬機器器。另外,不僅在系統層上有虛擬機器器的概念,在程式語言上也有虛擬機器器的概念。

虛擬機器器是用來解決什麼問題呢?
為了抽象掉硬體底層。從系統層來說,硬體和作業系統都越來越多樣化了。
它可以自動相容所有硬體。總結一下,虛擬機器器技術實現基本上都是將硬體層或是系統層進行了一次抽象,以致對應用層遮蔽掉了底層的實現細節,有利於應用的快速實現和部署。

1. 虛擬機器器的分類

按層次來說可以分為三大類:

  • 高階語言虛擬機器器:是就一個程式碼直譯器,不需要二進位制程式碼,只需要中間程式碼,然後虛擬機器器處理後,再移交給CPU 和儲存結構。虛擬機器器模擬的是程式碼的執行。
  • 作業系統層的虛擬機器器:所有作業系統介面呼叫都會被該容器截獲,經過處理後,傳送到當前適當的平臺上。
  • 硬體層的虛擬機器器:是最複雜的工程,是虛擬化技術的一大重點,是對硬體層以及硬體驅動層的模擬。

然而它們的實現越往底層難度就越大。

2. 區塊鏈虛擬機器器

傳統的精簡指令集計算機:這種計算機CPU只提供了有限的執行指令和記憶體,但是各種型別的應用都能在這臺計算機上執行。

原理:因為系統存在一個「虛擬機器器」將高層語言的實現都轉換成了CPU的相關執行指令。高層語言提供語法,人們使用高階語言開發相關應用。

由低到高的層次結構分別為:硬體指令,虛擬機器器,高階語言和應用層。

如果要在區塊鏈裡支援各種應用,也需要有這樣的層次結構,因此需要區塊鏈提供一套指令,並且區塊鏈裡的虛擬機器器可以對這些指令作相關的解釋。另外,高階語言的實現需要有一個編譯器將實現編譯成虛擬機器器支援的指令。這樣,區塊鏈就完美支援了語言和業務的分離,從而可以在區塊鏈裡開發各種業務應用。

虛擬機器器架構的組成部分:

  • 指令∶區塊鏈系統底層支援的原子操作指令
  • 虛擬機器器∶對原子操作指令的解釋
  • 編譯器:將高階語言轉換為虛擬機器器支援的指令
  • 高階語言:用於實現在區塊鏈裡執行業務應用

還有兩個重要的組成部分∶

  • 區塊鏈系統提供的原始API,用於在編寫智慧合約需要時,獲取系統相關資料或是狀態;
  • ABI,一個智慧合約釋出後,其他的應用需要知道這個合約提供了什麼功能介面以及資料結構。

當所有的部分都就緒後,我們就可以用高階語言和API編寫符合業務邏輯的智慧合約,然後用相關編譯器將智慧合約編譯成 byte codes,並且也會生成相關的ABI描述。經過嚴格測試後,就可以將智慧合約的byte codes和ABI以交易的形式釋出到區塊鏈中。

礦工會驗證你交易的合法性,如果入塊成功,將會返回智慧合約地址。使用者會呼叫這個合約地址來獲取 ABI,再根據 ABI 裡對功能介面的描述來發起—筆對功能介面呼叫的交易,從而實現相關功能或是獲取相關結果。礦工同樣也會對這筆交易進行合法性驗證及入塊處理。

將經過嚴格測試的智慧合約程式碼釋出到區塊鏈上可以理解為一個特殊的交易——包括了可執行程式碼的交易,然後會被礦工記錄在某個塊中。當需要呼叫這個智慧合約時,只需向這個智慧合約的地址傳送一個交易即可。因為每個節點都需要安裝以太坊使用者端,而每個使用者端都自帶了一個EVM(以太坊虛擬機器器)。通過交易觸發智慧合約後,智慧合約的程式碼就能在EVM上被執行。

這種方式相當於把程式部署到了很多的電腦上,隨時都可以通過交易來觸發這些智慧合約的執行,從而也完成了去中心化程式的部署和呼叫。
DAPP就是基於以太坊執行的去中心化應用,這種應用涉及到傳統行業的方方面面。

四、以太坊的共識機制與挖礦原理

1. 共識機制

以太坊為什麼需要共識機制呢?
分散式系統中多個主機通過非同步通訊的方式組成網路叢集,在這樣的一個非同步系統中需要主機之間進行狀態複製,以保證每個主機達成一致的狀態共識。在執行的過程中,可能出現主機故障導致無法通訊,也有可能主機效能下降、網路擁塞這些都可能導致錯誤資訊在系統內傳播,因此需要在不可靠的非同步網路中定義容錯協定以保證各主機達成安全可靠的狀態共識。

以太坊共識機制的版本
在這裡插入圖片描述
如果單純根據代幣餘額來決定記賬者,必然使富有者勝出,導致記賬權的中心化,降低共識的公正性。因此,如何解決記賬權中心化問題?不同的PoS機制在權益證明的基礎上,採用了不同的方式來增加記賬權的隨機性,來闢負中心化。
在這裡插入圖片描述

2. 以太坊的挖礦原理

挖礦流程
共識機制:PoW(工作量證明)
演演算法:Ethash (Dagger-Hashimoto演演算法的改良版本)

對於每個塊,首先計算一個種子,該種子僅和當前塊的資訊有關,然後根據種子生成一個32M的亂資料集,根據亂資料集生成一個1G大小的DAG(有向無環圖)。
在這裡插入圖片描述
挖礦的過程就是從DAG中隨機選擇元素(類似於位元幣挖礦中查詢合適Nonce),再進行雜湊運算,可以從Cache快速計算DAG指定位置的元素,進而雜湊驗證。

挖礦步驟

  • 生成一個錢包
  • 有一臺電腦,把電腦調成挖礦的最高效狀態
  • 下載個挖礦軟體開始挖礦,挖到礦後,挖到的幣會發到錢包裡面。