標籤:狀態 性問題 root 圖形介面 防止 lib ruby img rip
區塊鏈快速入門(八)——以太坊一、以太坊簡介
以太坊(Ethereum)項目的最初目標是打造一個運行智能合約的平台(Platform for Smart Contract),支援圖靈完備的應用,按照智能合約的約定邏輯自動執行,理想情況下將不存在故障停機、審查、欺詐以及第三方幹預等問題。
以太坊平台目前支援Golang、C++、Python等多種語言實現的用戶端。由於核心實現上基於比特幣網路的核心思想進行了拓展,因此在很多設計特性上都與比特幣網路十分類似。
基於以太坊項目,以太坊團隊目前運營了一條公開的區塊鏈平台——以太坊網路。智能合約開發人員使用官方提供的工具和以太坊專用應用開發語言Solidity,可以很容易開發出運行在以太坊網路上的去中心化應用(Decentralized Application,DAPP)。DAPP應用將運行在以太坊的虛擬機器(Ethereum Virtual Machine,EVM)裡。使用者通過以太幣(Ether)來購買燃料
(Gas),維持所部署應用的運行。
以太坊項目官網:www.ethereum.org
以太坊項目代碼託管:www.github.com/ethereum
以太坊區塊鏈底層也是一個P2P網路平台,智能合約運行在網路中的以太
坊虛擬機器裡。網路自身是公開可接入的,任何人都可以接入並參與網路中資料的維護,提供運行以太坊虛擬機器的資源。
以太坊區塊鏈的技術特點主要包括:
A、支援圖靈完備的智能合約,設計了程式設計語言Solidity和虛擬機器EVM
B、選用記憶體需求較高的雜湊函數,避免出現強算力礦機、礦池***
C、叔塊(Uncle Block)激勵機制,降低礦池的優勢,並減少區塊產生間隔
D、採用賬戶系統和世界狀態,而不是UTXO,容易支援更複雜的邏輯
E、通過Gas限制代碼執行指令數,避免迴圈執行***
F、支援POW共識演算法,並計劃支援效率更高的POS演算法
此外,Team Dev還計劃通過分區(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,內建調試器和測試環境
區塊鏈快速入門(八)——以太坊