Ethereum 介紹

區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者彙集地算法

做者:吳壽鶴​數據庫

來源:區塊鏈兄弟編程

原文連接:www.blockchainbrother.com/article/5安全

著權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。網絡

以太坊是什麼?數據結構

以太坊是一個全新開放的區塊鏈平臺,它容許任何人在平臺中創建和使用經過區塊鏈技術運行的去中心化應用。就像比特幣同樣,以太坊不受任何人控制,也不歸任何人全部——它是一個開放源代碼項目,由全球範圍內的不少人共同建立。和比特幣協議有所不一樣的是,以太坊的設計十分靈活,極具適應性。在以太坊平臺上創立新的應用十分簡便,隨着Homestead的發佈,任何人均可以安全地使用該平臺上的應用。架構

下一代區塊鏈編程語言

區塊鏈技術是比特幣的底層技術,這一技術第一次被描述是在中本聰2008年發表的白皮書「比特幣:點對點電子現金系統」中。區塊鏈技術更多的通常性用途在原書中已經有所討論,但直到幾年後,區塊鏈技術才做爲通用術語出現。一個區塊鏈是一個分佈式計算架構,裏面的每一個網絡節點執行並記錄相同的交易,交易被分組爲區塊。一次只能增長一個區塊,每一個區塊有一個數學證實來保證新的區塊與以前的區塊保持前後順序。這樣一來,區塊鏈的「分佈式數據庫」就能和整個網絡保持一致。個體用戶與總帳的互動(交易)受到安全的密碼保護。由數學執行並編碼到協議中的經濟激勵因素刺激着維持和驗證網絡的節點。分佈式

在比特幣中,分佈式數據庫被設想爲一個帳戶餘額表,一個總帳,交易就是經過比特幣的轉移以實現個體之間無需信任基礎的金融活動。可是隨着比特幣吸引了愈來愈多開發者和技術專家的注意,新的項目開始將比特幣網絡用於有價代幣轉移以外的其餘用途。其中不少都採用了「代幣」的形式——以原始比特幣協議爲基礎,增長了新的特徵或功能,採用各自加密貨幣的獨立區塊鏈。在2013年底,以太坊的發明者Vitalik Buterin建議可以經過程序重組來運行任意複雜運算的單個區塊鏈應該包含其餘的程序。區塊鏈

2014年,以太坊的創始人Vitalik Buterin, Gavin Wood和Jeffrey Wilcke開始研究新一代區塊鏈,試圖實現一個整體上徹底無需信任基礎的智能合約平臺。

以太坊虛擬機

以太坊是可編程的區塊鏈。它並非給用戶一系列預先設定好的操做(例如比特幣交易),而是容許用戶按照本身的意願建立複雜的操做。這樣一來,它就能夠做爲多種類型去中心化區塊鏈應用的平臺,包括加密貨幣在內但並不只限於此。

以太坊狹義上是指一系列定義去中心化應用平臺的協議,它的核心是以太坊虛擬機(「EVM」),能夠執行任意複雜算法的編碼。在計算機科學術語中,以太坊是「圖靈完備的」。開發者可以使用現有的JavaScript和Python等語言爲模型的其餘友好的編程語言,建立出在以太坊模擬機上運行的應用。

和其餘區塊鏈同樣,以太坊也有一個點對點網絡協議。以太坊區塊鏈數據庫由衆多鏈接到網絡的節點來維護和更新。每一個網絡節點都運行着以太坊模擬機並執行相同的指令。所以,人們有時形象地稱以太坊爲「世界電腦」。

這個貫穿整個以太坊網絡的大規模並行運算並非爲了使運算更高效。實際上,這個過程使得在以太坊上的運算比在傳統「電腦」上更慢更昂貴。然而,每一個以太坊節點都運行着以太坊虛擬機是爲了保持整個區塊鏈的一致性。去中心化的一導致以太坊有極高的故障容錯性,保證零停機,並且可使存儲在區塊鏈上的數據保持永遠不變且抗審查。

以太坊平臺自己沒有特色,沒有價值性。和編程語言類似,它由企業家和開發者決定其用途。不過很明顯,某些應用類型較之其餘更能從以太坊的功能中獲益。以太坊尤爲適合那些在點與點之間自動進行直接交互或者跨網絡促進小組協調活動的應用。例如,協調點對點市場的應用,或是複雜財務合約的自動化。比特幣使個體可以不借助金融機構、銀行或政府等其餘中介來進行貨幣交換。以太坊的影響可能更爲深遠。理論上,任何複雜的金融活動或交易都能在以太坊上用編碼自動且可靠地進行。除金融類應用外,任何對信任、安全和持久性要求較高的應用場景——好比資產註冊、投票、管理和物聯網——都會大規模地受到以太坊平臺影響。

以太坊如何工做?

以太坊合併了不少對比特幣用戶來講十分熟悉的特徵和技術,同時本身也進行了不少修正和創新。比特幣區塊鏈純粹是一個關於交易的列表,而以太坊的基礎單元是帳戶。以太坊區塊鏈跟蹤每一個帳戶的狀態,全部以太坊區塊鏈上的狀態轉換都是帳戶之間價值和信息的轉移。帳戶分爲兩類:

  1.  外部帳戶(EOA),由私人密碼控制
  2.  合約帳戶,由它們的合約編碼控制,只能由外部帳戶「激活」

對於大部分用戶來講,二者基本的區別在於外部帳戶是由人類用戶掌控——由於他們可以控制私鑰,進而控制外部帳戶。而合約帳戶則是由內部編碼管控。若是他們是被人類用戶「控制」的,那也是由於程序設定它們被具備特定地址的外部帳戶控制,進而被持有私鑰控制外部帳戶的人控制着。「智能合約」這個流行的術語指的是在合約帳戶中編碼——交易被髮送給該帳戶時所運行的程序。用戶能夠經過在區塊鏈中部署編碼來建立新的合約。

只有當外部帳戶發出指令時,合約帳戶纔會執行相應的操做。因此合約帳戶不可能自發地執行諸如任意數碼生成或應用程序界面調用等操做—只有受外部帳戶提示時,它纔會作這些事。這是由於以太坊要求節點可以與運算結果保持一致,這就要求保證嚴格肯定執行。

和比特幣同樣,以太坊用戶必須向網絡支付少許交易費用。這可使以太坊區塊鏈免受可有可無或惡意的運算任務干擾,好比分佈式拒絕服務(DDoS)攻擊或無限循環 。交易的發送者必須在激活的「程序」每一步付款,包括運算和記憶儲存。費用經過以太坊自有的有價代幣,以太幣的形式支付。

交易費用由節點收集,節點使網絡生效。這些「礦工」就是以太坊網絡中收集、傳播、確認和執行交易的節點。礦工們將交易分組——包括許多以太坊區塊鏈中帳戶「狀態」的更新——分紅的組被稱爲「區塊」,礦工們會互相競爭,以使他們的區塊能夠添加到下一個區塊鏈上。礦工們每挖到一個成功的區塊就會獲得以太幣獎勵。這就爲人們帶來了經濟激勵,促令人們爲以太坊網絡貢獻硬件和電力。

和比特幣網絡同樣,礦工們有解決複雜數學問題的任務以便成功地「挖」到區塊。這被稱爲「工做量證實」。一個運算問題,若是在算法上解決,比驗證解決方法須要更多數量級的資源,那麼它就是工做證實的極佳選擇。爲防止比特幣網絡中已經發生的,專門硬件(例如特定用途集成電路)形成的中心化現象,以太坊選擇了難以存儲的運算問題。若是問題須要存儲器和CPU,事實上理想的硬件是普通的電腦。這就使以太坊的工做量證實具備抗特定用途集成電路性,和比特幣這種由專門硬件控制挖礦的區塊鏈相比,可以帶來更加去中心化的安全分佈。

以太坊核心概念

以太坊虛擬機(EVM)

以太坊虛擬機(EVM)是以太坊中智能合約的運行環境。它不只被沙箱封裝起來,事實上它被徹底隔離,也就是說運行在EVM內部的代碼不能接觸到網絡、文件系統或者其它進程。甚至智能合約之間也只有有限的調用。

帳戶(Accounts)

以太坊中有兩類帳戶,它們共用同一個地址空間。外部帳戶,該類帳戶被公鑰-私鑰對控制。合約帳戶,該類帳戶被存儲在帳戶中的代碼控制。 外部帳戶的地址是由公鑰決定的,合約帳戶的地址是在建立合約時肯定的(這個地址由合約建立者的地址和該地址發出過的交易數量計算獲得,地址發出過的交易數量也被稱做」nonce」)

兩類帳戶惟一的區別是:合約帳戶存儲了代碼,外部帳戶則沒有。

每一個帳戶有一個key-value形式的持久化存儲。key,value的長度都是256bit。

另外,每一個帳戶都有一個以太幣餘額(單位是「Wei」),該帳戶餘額能夠經過向它發送帶有以太幣的交易來改變。

交易(Transactions)

一筆交易是一條消息,從一個帳戶發送到另外一個帳戶。交易能夠包含二進制數據(payload)和以太幣。

若是目標帳戶包含代碼,該代碼和輸入數據會被執行。

若是目標帳戶是零帳戶(帳戶地址是0),交易將建立一個新合約。正如上文所講,這個合約地址不是零地址,而是由合約建立者的地址和該地址發出過的交易數量計算獲得。建立合約交易的payload被看成EVM字節碼執行。執行的輸出作爲合約代碼被永久存儲。這意味着,爲了建立一個合約,你不須要向合約發送真正的合約代碼,而是發送可以返回真正代碼的代碼。

Gas

以太坊上的每筆交易都會被收取必定數量的gas,gas的目的是限制執行交易所需的工做量,同時爲執行支付費用。當EVM執行交易時,gas將按照特定規則被逐漸消耗。

gas price(gas價格,以太幣計)是由交易建立者設置的,發送帳戶須要預付的交易費用 = gas price * gas amount。 若是執行結束還有gas剩餘,這些gas將被返還給發送帳戶。

不管執行到什麼位置,一旦gas被耗盡(好比降爲負值),將會觸發一個out-of-gas異常。當前調用幀所作的全部狀態修改都將被回滾。

存儲,主存和棧(Storage, Memory and the Stack)

每一個帳戶有一塊持久化內存區域被稱爲存儲。其形式爲key-value,key和value的長度均爲256比特。在合約裏,不能遍歷帳戶的存儲。相對於另外兩種,存儲的讀操做相對來講開銷較大,修改存儲更甚。一個合約只能對它本身的存儲進行讀寫。

第二個內存區被稱爲主存。合約執行每次消息調用時,都有一塊新的,被清除過的主存。主存能夠以字節粒度尋址,可是讀寫粒度爲32字節(256比特)。操做主存的開銷隨着其增加而變大(平方級別)。

EVM不是基於寄存器,而是基於棧的虛擬機。所以全部的計算都在一個被稱爲棧的區域執行。棧最大有1024個元素,每一個元素256比特。對棧的訪問只限於其頂端,方式爲:容許拷貝最頂端的16個元素中的一個到棧頂,或者是交換棧頂元素和下面16個元素中的一個。全部其餘操做都只能取最頂的兩個(或一個,或更多,取決於具體的操做)元素,並把結果壓在棧頂。固然能夠把棧上的元素放到存儲或者主存中。可是沒法只訪問棧上指定深度的那個元素,在那以前必需要把指定深度之上的全部元素都從棧中移除才行。

指令集(Instruction Set)

EVM的指令集被刻意保持在最小規模,以儘量避免可能致使共識問題的錯誤實現。全部的指令都是針對256比特這個基本的數據類型的操做。具有經常使用的算術,位,邏輯和比較操做。也能夠作到條件和無條件跳轉。此外,合約能夠訪問當前區塊的相關屬性,好比它的編號和時間戳。

消息調用(Message Calls)

合約能夠經過消息調用的方式來調用其它合約或者發送以太幣到非合約帳戶。消息調用和交易很是相似,它們都有一個源,一個目標,數據負載,以太幣,gas和返回數據。事實上每一個交易均可以被認爲是一個頂層消息調用,這個消息調用會依次產生更多的消息調用。

一個合約能夠決定剩餘gas的分配。好比內部消息調用時使用多少gas,或者指望保留多少gas。若是在內部消息調用時發生了out-of-gas異常(或者其餘異常),合約將會獲得通知,一個錯誤碼被壓在棧上。這種狀況只是內部消息調用的gas耗盡。在solidity中,這種狀況下發起調用的合約默認會觸發一我的工異常。這個異常會打印出調用棧。

就像以前說過的,被調用的合約(發起調用的合約也同樣)會擁有嶄新的主存並可以訪問調用的負載。調用負載被存儲在一個單獨的被稱爲calldata的區域。調用執行結束後,返回數據將被存放在調用方預先分配好的一塊內存中。

調用層數被限制爲1024,所以對於更加複雜的操做,咱們應該使用循環而不是遞歸。

代碼調用和庫(Delegatecall / Callcode and Libraries)

存在一種特殊類型的消息調用,被稱爲callcode。它跟消息調用幾乎徹底同樣,只是加載自目標地址的代碼將在發起調用的合約上下文中運行。

這意味着一個合約能夠在運行時從另一個地址動態加載代碼。存儲,當前地址和餘額都指向發起調用的合約,只有代碼是從被調用地址獲取的。

這使得Solidity能夠實現」庫「。可複用的庫代碼能夠應用在一個合約的存儲上,能夠用來實現複雜的數據結構。

日誌(Logs)

在區塊層面,能夠用一種特殊的可索引的數據結構來存儲數據。這個特性被稱爲日誌,Solidity用它來實現事件。合約建立以後就沒法訪問日誌數據,可是這些數據能夠從區塊鏈外高效的訪問。由於部分日誌數據被存儲在布隆過濾器(Bloom filter) 中,咱們能夠高效而且安全的搜索日誌,因此那些沒有下載整個區塊鏈的網絡節點(輕客戶端)也能夠找到這些日誌。

建立(Create)

合約甚至能夠經過一個特殊的指令來建立其餘合約(不是簡單的向零地址發起調用)。建立合約的調用跟普通的消息調用的區別在於,負載數據執行的結果被看成代碼,調用者/建立者在棧上獲得新合約的地址。

自毀(Selfdestruct)

只有在某個地址上的合約執行自毀操做時,合約代碼纔會從區塊鏈上移除。合約地址上剩餘的以太幣會發送給指定的目標,而後其存儲和代碼被移除。 注意,即便一個合約的代碼不包含自毀指令,依然能夠經過代碼調用(callcode)來執行這個操做。

文章發佈只爲分享區塊鏈技術內容,版權歸原做者全部,觀點僅表明做者本人,毫不表明區塊鏈兄弟贊同其觀點或證明其描述

相關文章
相關標籤/搜索