區塊鏈之以太坊初探

vipshop_fin_dev發表於2018-06-19

最近幾年區塊鏈技術特別火,特此翻閱了一些資料,基本都是一些理論知識,最後總的感覺還是天馬行空,一片茫然。區塊鏈,到底是什麼技術,最後又能做什麼呢?只知道其代表專案有比特幣,但執行原理又是什麼?帶著這些疑惑,初步瞭解了一下區塊鏈之以太坊專案。

以太坊

  • 概念
    以太坊(英語:Ethereum)是一個開源的有智慧合約功能的公共區塊鏈平臺。通過其專用加密貨幣以太幣(Ether)提供去中心化的虛擬機器(“以太虛擬機器” Ethereum Virtual Machine)來處理點對點合約(去中心化賬本協議)。以太坊
    的理念基因中不僅含有比特幣基因,還含有BitTorrent、Java和Freenet的
    基因。從產品的角度而言,它是一個通用的全球性區塊鏈,可以管理金
    融和非金融型別應用的狀態。
    本質上,以太坊促成去中心化的商業邏輯(business logic)——也
    被稱為智慧合約,它是一個包含價值,當特定條件滿足會被自動開啟的
    加密“箱子”(boxes)。商業邏輯在區塊鏈雲上(不需要伺服器)執
    行,在多方之間自動執行給定協議的條款。它們是“去中心化應
    用”(DApp)的基本構件。從前端角度而言,以太坊擁有一個強大的專
    用瀏覽器,使使用者可以方便地安裝和使用DApp。
    這一新技術將促成Web3.0的基礎設施的建立,將會建立在三層部件
    之上:作為客戶端的先進瀏覽器,共享資源的區塊鏈賬本,以及以去中
    心化方式執行智慧商業邏輯程式的計算機虛擬網路。

  • 以太坊VS比特幣
    初看起來,比特幣和以太坊都是開源平臺,具有四項共同點:底層
    的密碼學貨幣、區塊鏈、去中心化的共識證明機制和維護網路的礦工。
    這一切使人們容易混淆比特幣和以太坊,覺得它們肯定是類似的事物。
    但是,當你深入探究時,會發現兩者的不同點多於相同點。四項共同點
    的每一項在以太坊和比特幣中的作用和目的都是不一樣的,出於這個原
    因,以太坊會朝著一個不同於比特幣的方向發展。
    比特幣最初被設計成一個用於交易貨幣價值的去中心化密碼學貨幣
    網路,比特幣區塊鏈的主要目的是:為這些金融交易提供信任支撐。只
    是到了最近,比特幣區塊鏈才開始在非金融應用中被發現使用的情景。
    因此,比特幣區塊鏈的可程式設計性只是事後的想法,並不是最初就有的設
    計,雖然側鏈的提議希望讓程式設計更加容易。與比特幣相反,以太坊從第
    一天起就被構想為一個去中心化應用軟體開發平臺,它的區塊鏈被設計
    為支援去中心化應用的執行。所以,以太坊的設計有幸從比特幣的經驗
    中學習,並改進了比特幣的缺點。例如,與比特幣10分鐘的區塊確認時
    間相比,以太坊區塊鏈執行確認的速度更加快速,確認時間在5~30秒範
    圍內。
    以太坊的目標是實現大規模的去中心化應用,這需要以太坊成為一
    個確定的、可審計的和可預測的計算平臺。這不同於比特幣的本質——
    計算是以貨幣為中心的。因此,為了全面理解以太坊,不能盲目地將比
    特幣的挖礦、密碼學貨幣用途和可程式設計性推及至以太坊。
    首先,以太坊的密碼學貨幣(被稱為以太幣)並不類似於比特幣,
    因為它的主要目的不是用於商品或者服務的支付,也不是“數字黃金”。
    這是比特幣的重要特性,但以太坊志不在此。以太幣更像一種“加密燃
    料”(crypto-fuel)形式的激勵,支付執行各種智慧商業邏輯程式所需的
    交易費用(關於“燃料貨幣”相關知識,請參見後面章節)。除了作為網
    絡燃料以外,以太幣也將作為一種數字貨幣在交易所交易,但是它的價
    值更多地受交易需求量影響,而不是貨幣投機者。
    以太幣類似於雲端計算費用。當你在雲中執行一個應用時,基於你的
    執行時間、佔用的儲存空間、資料轉移和計算速度,你需要向雲端計算公
    司支付相應的費用。以太幣費用的新穎之處在於你為執行在區塊鏈上的
    商業邏輯付費。
    其次,以太坊區塊鏈被設計為完全可程式設計,比比特幣更具有經濟效
    率。它具有更大的可擴充套件性,對於使用者可以低成本地使用區塊鏈而言,
    這是非常關鍵的要求。因為以太坊不只關注於實現金融交易,所以以太
    坊區塊鏈的目的不同於比特幣。從技術上而言,以太坊的區塊大小沒有
    上限,它可以動態地調整。

  • 開發語言
    以太坊的軟體開發語言是其最大特性之一,因為對區塊鏈進行程式設計
    是一項首要目標。以太坊具有四種專用語言:Serpent(受Python啟
    發)、Solidity(受JavaScript啟發)、Mutan(受Go啟發)和LLL(受
    Lisp啟發),都是為面向合約程式設計而從底層開始設計的語言。

    作為以太坊的高階程式語言,Serpent的設計非常類似於Python。它
    的設計目標為最大可能的簡潔和簡單,將低階語言的高效優勢與程式設計風
    格中的易用性相結合。

    Solidity是以太坊的首選語言,它內建了Serpent的所有特性,但是
    語法類似於JavaScript,這降低了學習門檻,易於被掌握和使用,因為
    JavaScript是Web開發者的常用語言。因此,Solidity充分利用了現有數
    以百萬程式設計師已掌握JavaScript這一現狀。

  • 去中心化應用
    以太坊支援多種開發語言是非常重要的,因為這使得開發者可以選
    用自己喜歡的語言,可以更加容易和高效地寫去中心化應用。
    一個DApp是由智慧合約和客戶端程式碼構成的。智慧合約就像加密
    的“箱子”,包含價值,只有當特定條件被滿足時,它才能被開啟。它封
    裝了一些邏輯、規則、處理步驟或者雙方間的協議。當它們被髮布在以
    太坊上時,網路會執行它們的分支(ramification)。

  • 以太坊客戶端
    以太坊包括一個專用的客戶端瀏覽器,使使用者可以執行各種各樣的
    DApp和釋出智慧合約。這一瀏覽器(以太坊瀏覽器被稱為Mist)易於
    使用,所以DApp和智慧合約能夠被大量使用者使用。從降低使用者使用門
    檻角度而言,Mist是一項突破性成就

  • 以太坊虛擬機器
    當你想到這些自足的邏輯指令碼——執行在區塊鏈上,在其上儲存數
    據,向發起人返回一些值時,就像執行在雲中的程式。簡單地說,這些
    智慧合約就是執行在以太坊虛擬機器(EVM)上的程式碼。因此,這類似
    於一個去中心化的虛擬計算服務,但是它不存在網站伺服器這樣的負
    擔,它被設計成點對點網路,所有參與者都可以執行,可以安全地(通
    過加密和數字簽名)向區塊鏈寫入資料和程式碼,讀取上面的資料和代
    碼。

看了這些理論知識,可能還是覺得很迷茫,但是首先要明確一點,不管是比特幣還是以太坊等區塊鏈專案,其中心思想就是取中心化,
點對點模型:
點對點模型

傳統的中心化模型:
中心化模型

下來通過搭建以太坊私有鏈,跟進一步瞭解其工作原理

進入go-ethereum-1.8.11目錄下執行 make命令開始進行編譯,
注意:golang版本一定要跟以太坊原碼版本對應,否則會提示編譯版本過低
目前網上很多例項用go-ethereum-1.4.12,但如果使用高版本的go,編譯
過程會出現“make: * [geth] Error 1” 錯誤。

編譯完成如下:
這裡寫圖片描述

編譯成功後,將在go-ethereum-1.8.11目錄下出現build/bin這樣的子目錄,並且在該子目錄下出現geth這樣的可執行檔案,

這樣,我們的以太坊就安裝完成了

4)、創世區塊檔案的準備
建立一個目錄,建立一個lw_init.json檔案,內容如下:
{
“nonce”:”0x0000000000000042”,
“mixhash”:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“difficulty”: “0x4000”,
“alloc”: {},
“coinbase”:”0x0000000000000000000000000000000000000000”,
“timestamp”: “0x00”,
“parentHash”:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“extraData”: “”,
“gasLimit”:”0x0000ffff”
}

如圖:
這裡寫圖片描述
5)、創世區塊初始化

進入go-ethereum-1.8.11/build/bin,執行以下命令以完成創世區塊的建立

./geth –datadir “/app/yum/lw/chain” init lw_init.json

datadir後對應目錄自定義

執行完成會出現如下語句:successfully wrote genesis block and/or chain rule set: 244469eaad4c9c7a245fa4962a6ed7346e9925317f222b580e7f3113f97226

注意:如果出現類似錯誤:Fatal: invalid genesis file: json: cannot unmarshal hex string of odd length into Go struct field Genesis.extraData of type
是由於我們沒有定義初始的賬戶,去掉了創世區塊的extraData的內容

6)、以太坊啟動
./geth –rpc –rpccorsdomain “*” –datadir “/app/yum/lw/chain” –port “30303” –rpcapi “db,eth,net,web3” –networkid 100000 console

啟動入下:
這裡寫圖片描述

出現Welcome to the Geth JavaScript console! 句話,並自動進入geth的命令列則說明以太坊私有鏈安裝成功了。


  • 賬戶管理、挖礦與轉賬
    1)、賬戶管理
    以太坊的終端使用命令 personal.listAccounts 列出現存的賬號:

personal.listAccounts
[]
說明目前沒有賬號。我們使用personal.newAccount()這個命令建立一個賬號,重複輸入兩次密碼,則生成一個預設賬戶

這裡寫圖片描述

2)、挖礦
第一步中建立的第一個賬號是預設賬號,這裡是 0xe03e63c321999eef68cf111120a8bbfda41037b6,
我們使用web3.fromWei(eth.getBalance(eth.coinbase), “ether”)來查詢這個預設賬號餘額:

web3.fromWei(eth.getBalance(eth.coinbase), “ether”)
0

當前預設賬號的餘額是0。 使用miner.start(1)命令開始挖礦:

miner.start(1)
INFO [06-18|23:33:40] Commit new mining work number=1 txs=0 uncles=0 elapsed=1.211ms
INFO [06-18|23:33:42] Generating DAG in progress epoch=0 percentage=0 elapsed=827.896ms
INFO [06-18|23:33:43] Generating DAG in progress epoch=0 percentage=1 elapsed=1.649s
INFO [06-18|23:33:43] Generating DAG in progress epoch=0 percentage=2 elapsed=2.524s
INFO [06-18|23:33:44] Generating DAG in progress epoch=0 percentage=3 elapsed=3.353s

當出現“Mined block”這樣的字眼時,表明挖礦成功,此時,我們可以使用miner.stop()命令停止挖礦。

再次使用web3.fromWei(eth.getBalance(eth.coinbase), “ether”)來查詢這個預設賬號餘額:

web3.fromWei(eth.getBalance(eth.coinbase), “ether”)
15

3)、轉賬
本地建立另外一個賬號作為轉賬的接收方,

personal.newAccount(“wei.lu”)
“0x254f1f7952b5bc6111f55186ed093f2c99309d23”

執行轉賬指令eth.sendTransaction({from: ‘0xe03e63c321999eef68cf111120a8bbfda41037b6’, to: ‘0x254f1f7952b5bc6111f55186ed093f2c99309d23’, value: web3.toWei(1, “ether”)})

檢視這兩個賬戶的餘額,發現數量未變化, 那是因為我們的交易還未成功寫進區塊,寫進區塊的方式是挖礦,
我們再次開啟挖礦,挖礦成功後,並停止挖礦,檢視對應賬戶,發現金額出現變化。

目前搭建環境先到此,後續根據自己的學習儘快再進行補充。

相關文章