區塊鏈快速入門(八)——以太坊
一、以太坊簡介
以太坊(Ethereum)項目的最初目標是打造一個運行智能合約的平臺(Platform for Smart Contract),支持圖靈完備的應用,按照智能合約的約定邏輯自動執行,理想情況下將不存在故障停機、審查、欺詐以及第三方幹預等問題。
以太坊平臺目前支持Golang、C++、Python等多種語言實現的客戶端。由於核心實現上基於比特幣網絡的核心思想進行了拓展,因此在很多設計特性上都與比特幣網絡十分類似。
基於以太坊項目,以太坊團隊目前運營了一條公開的區塊鏈平臺——以太坊網絡。智能合約開發者使用官方提供的工具和以太坊專用應用開發語言Solidity,可以很容易開發出運行在以太坊網絡上的去中心化應用(Decentralized Application,DAPP)。DAPP應用將運行在以太坊的虛擬機(Ethereum Virtual Machine,EVM)裏。用戶通過以太幣(Ether)來購買燃料
以太坊項目官網:www.ethereum.org
以太坊項目代碼托管:www.github.com/ethereum
以太坊區塊鏈底層也是一個P2P網絡平臺,智能合約運行在網絡中的以太
坊虛擬機裏。網絡自身是公開可接入的,任何人都可以接入並參與網絡中數據的維護,提供運行以太坊虛擬機的資源。
以太坊區塊鏈的技術特點主要包括:
A、支持圖靈完備的智能合約,設計了編程語言Solidity和虛擬機EVM
B、選用內存需求較高的哈希函數,避免出現強算力礦機、礦池***
C、叔塊(Uncle Block)激勵機制,降低礦池的優勢,並減少區塊產生間隔
D、采用賬戶系統和世界狀態,而不是UTXO,容易支持更復雜的邏輯
F、支持POW共識算法,並計劃支持效率更高的POS算法
此外,開發團隊還計劃通過分片(Sharding)方式來解決網絡可擴展性問題。
二、以太坊核心概念
1、智能合約
智能合約(Smart Contract)是以太坊中最為重要的一個概念,即以計算機程序的方式來締結和運行各種合約。以太坊支持通過圖靈完備的高級語言(包括Solidity、Serpent、Viper)等來開發智能合約。
智能合約作為運行在以太坊虛擬機(Ethereum Virual Machine,EVM)中的應用,可以接受來自外部的交易請求和事件,通過觸發運行提前編寫好的代碼邏輯,進一步生成新的交易和事件,可以進一步調用其它智能合約。
2、賬戶
以太坊直接用賬戶來記錄系統狀態。每個賬戶存儲余額信息、智能合約代碼和內部數據存儲等。以太坊支持在不同的賬戶之間轉移數據,以實現更為復雜的邏輯。
以太坊賬戶分為兩種類型:合約賬戶(Contracts Accounts)和外部賬戶(Externally Owned Accounts,EOA)。
合約賬戶:存儲執行的智能合約代碼,只能被外部賬戶來調用激活。
外部賬戶:以太幣擁有者賬戶,對應到某公鑰。賬戶包括nonce、balance、
storageRoot、codeHash等字段,由個人來控制。
當合約賬戶被調用時,存儲其中的智能合約會在礦工處的虛擬機中自動執行,並消耗一定的燃料。燃料通過外部賬戶中的以太幣進行購買。
3、交易
交易(Transaction),在以太坊中是指從一個賬戶到另一個賬戶的消息數據。消息數據可以是以太幣或者合約執行參數。
以太坊采用交易作為執行操作的最小單位。每個交易包括如下字段:
To:目標賬戶地址。
Value:可以指定轉移的以太幣數量。
Nonce:交易相關的字串,用於防止交易被重放。
gasPrice:執行交易需要消耗的Gas價格。
Startgas:交易消耗的最大Gas值。
Signature:簽名信息。
在發送交易時,用戶需要繳納一定的交易費用,通過以太幣方式進行支付
和消耗。目前,以太坊網絡可以支持超過比特幣網絡的交易速率(可以達到每秒幾十筆)。
4、以太幣
以太幣(Ether)是以太坊網絡中的貨幣。
以太幣主要用於購買燃料,支付給礦工,以維護以太坊網絡運行智能合約的費用。以太幣最小單位是wei,一個以太幣等於 10^18個wei。
以太幣可以通過挖礦來生成,成功生成新區塊的以太坊礦工可以獲得5個以太幣的獎勵以及包含在區塊內交易的燃料費用。用戶也可以通過交易市場來直接購買以太幣。
目前每年大約可以通過挖礦生成超過一千萬個以太幣,單個以太幣的市場價格目前超過200美金。
5、燃料
燃料(Gas),控制某次交易執行指令的上限。每執行一條合約指令會消耗固定的燃料。當某個交易還未執行結束,而燃料消耗完時,合約執行終止並回滾狀態。
Gas可以跟以太幣進行兌換。以太幣的價格是波動的,但運行某段智能合約
的燃料費用可以是固定的,通過設定Gas價格等進行調節。
三、以太坊主要設計
1、智能合約
以太坊采用以太坊虛擬機(EVM)作為智能合約的運行環境。以太坊虛擬機是一個隔離的輕量級虛擬機環境,運行在其中的智能合約代碼無法訪問本地網絡、文件系統或其它進程。
對同一個智能合約來說,通常需要在多個以太坊虛擬機中同時運行多份,以確保整個區塊鏈數據的一致性和高度的容錯性,但也限制了整個網絡的容量。
以太坊為編寫智能合約設計了圖靈完備的高級編程語言,降低了智能合約開發的難度。目前Solidity是最常用的以太坊合約編寫語言之一。智能合約編寫完畢後,用編譯器編譯為以太坊虛擬機專用的二進制格式(EVM bytecode),由客戶端上傳到區塊鏈當中,在礦工的以太坊虛擬機中執行。
2、交易模型
以太坊采用了賬戶的模型,狀態可以實時的保存到賬戶裏,而無需像比特幣的UXTO模型去回溯整個交易歷史。
3、共識
以太坊目前采用基於成熟的POW共識的變種算法Ethash協議作為共識機制。
為了防止ASIC礦機礦池的算力***,跟原始POW 的計算密集型Hash 運算不同,Ethash 在執行時候需要消耗大量內存,反而跟計算效率關系不大。因此,很難制造出專門針對Ethash的芯片,反而通用機器可能更加有效。
雖然,Ethash相對原始的POW進行了改進,但仍然需要進行大量無效的運算,以太坊網絡社區已經有計劃在未來采用更高效的Proof-of-Stake(POS)作為共識機制。
4、降低***
以太坊網絡中的交易更加多樣化,也就更容易受到***。
以太坊網絡在降低***方面的核心設計思想仍然是通過經濟激勵機制防止少數人作惡:
A、所有交易都要提供交易費用,避免DDoS***
B、程序運行指令數通過Gas來限制,所消耗的費用超過設定上限時就會被取消,避免出現惡意合約。
確保***者試圖消耗網絡中虛擬機的計算資源時,需要付出經濟代價(支付大量的以太幣);同時難以通過構造惡意的循環或不穩定合約代碼來對網絡造成破壞。
5、提高擴展性
可擴展性是以太坊網絡承接更多業務量的最大制約。
以太坊項目未來希望通過分片(sharding)機制來提高整個網絡的擴展性。分片是一組維護和執行同一批智能合約的節點組成的子網絡,是整個網絡的子集。
支持分片功能前,以太坊整個網絡中的每個節點都需要處理所有的智能合約,造成了網絡的最大處理能力會受限於單個節點的處理能力。分片後,同一片內的合約處理是同步的,彼此達成共識,不同分片之間則可以是異步的,可以提高網絡整體的可擴展性。
四、以太坊相關工具
1、客戶端與開發庫
以太坊客戶端可用於接入以太坊網絡,進行賬戶管理、交易、挖礦、智能合約等各方面操作。
以太坊社區現在提供了多種語言實現的客戶端和開發庫,支持標準的JSON-RPC協議。用戶可根據自己熟悉的開發語言進行選擇。
go-ethereum:Go語言實現
parity:Rust語言實現
cpp-ethereum:C++語言實現
ethereumjs-lib:javascript語言實現
ethereum(J):Java語言實現
ethereumH:Haskell語言實現
pyethapp:Python語言實現
ruby-ethereum:Ruby語言實現
go-ethereum的獨立客戶端Geth是最常用的以太坊客戶端之一。用戶可通過安裝Geth來接入以太坊網絡並成為一個完整節點。Geth也可作為一個HTTP-RPC服務器,對外暴露JSON-RPC接口,供用戶與以太坊網絡交互。
Geth的使用需要基本的命令行基礎,其功能相對完整,源碼托管於github.com/ethereum/go-ethereum
2、以太坊錢包
對於只需進行賬戶管理、以太坊轉賬、DAPP使用等基本操作的用戶,則可選擇直觀易用的錢包客戶端。
Mist是官方提供的一套包含圖形界面的錢包客戶端,除了可用於進行交易,也支持直接編寫和部署智能合約。
所編寫的代碼編譯發布後,可以部署到區塊鏈上。使用者可通過發送調用相應合約方法的交易,來執行智能合約。
3、以太坊開發IDE
對於開發者,以太坊社區湧現出許多服務於編寫智能合約和DAPP的IDE,例如:
Truffle:一個功能豐富的以太坊應用開發環境
Embark:一個DAPP開發框架,支持集成以太坊、IPFS等
Remix:一個用於編寫Solidity的IDE,內置調試器和測試環境
區塊鏈快速入門(八)——以太坊