以太坊介紹

以太坊:

  以太坊的目的是創建一種去中心化應用的協議,提供一套對大量的去中心化應用程序非常有用的新方案,特別強調快速開發,對小的和少數人使用的應用也非常安全(小而使用人少的應用容易被51%攻破),以及不同的應用程序之間能夠有效的互動。以太坊通過建立在本質上是抽象的基礎層來完成這一工作:一個區塊鏈其內置了圖靈完備的編程語言,允許任何人編寫智能合約和去中心化的應用程序,在這些應用程序中,他們可以創建任意的屬於他們自己的規則、交易格式和狀態轉換函數。名字幣的一個簡單版本在以太坊可以用兩行代碼來編寫完成,而其他協議如貨幣和信用系統則可以用不到20行的代碼來構建。智能合約-包含價值而且只有滿足某些條件才能打開的加密箱子-也能在我們的平臺上構建,並且因爲圖靈完備性、價值知曉(value-awareness)、區塊鏈知曉(blockchain-awareness)和多狀態所增加的力量,遠比特幣腳本所能提供的功能強大得多。

以太坊虛擬機:

  以太坊是一個可編程的區塊鏈,不僅僅是給用戶一些預定義操作(如比特幣只交易),以太坊允許用戶創建屬於他們自己的複雜的操作。以太坊作爲一個平臺爲不同的區塊鏈應用提供服務。
  狹義來說,以太坊是一系列協議,其核心就是一個以太坊虛擬機,能執行遵守協議的任何複雜的代碼。以太坊虛擬機是圖靈完備的,開發者可以在虛擬機上使用像javascript,python這樣的友好的編程語言來創建應用。
  和任何的區塊鏈一樣,以太坊包含了一個點對點的網絡協議。這以太坊區塊鏈是被鏈接着這個網絡的各個節點維護和更新的。網絡中的各個節點的虛擬機都執行相同的指令來共同維護區塊數據庫,因爲這個原因,以太坊有時候被人稱爲“世界計算機”。

  以太坊全網的大規模並行計算不是只爲了提計算效率,而是爲了保證全網的數據一致性。實際上,這使得在以太網上的 運算要比傳統的電腦慢的多,成本也昂貴得多。全網中的每一臺虛擬機的運行都是爲確保全網數據庫的一致性。去中心化的一致性給全網極端的容錯能力;抗審查能力和永不宕機能力等!

以太坊賬戶:

  以太坊的基本單元是賬號。每一個賬戶都有一個20個字節長度的地址 。以太坊區塊鏈跟蹤每一個賬號的狀態,區塊鏈上所有狀態的轉移都是賬戶之間的令牌(令牌即以太幣)和信息的轉移。以太坊有2種賬戶類型:

外部賬號,簡稱EOA,是由私鑰來控制的。
合約帳戶,由合約代碼來控制,且只能由一個EOA賬號來操作
  對於大多數用戶來說,最基本的區別在於,用戶掌握着EOA賬號,因爲用戶掌握着控制EOA賬號的私鑰。而合約賬號由內部程序代碼來控制的,當然掌控私鑰的EOA賬戶可以通過編寫特定的程序代碼來掌控合約賬戶。流行的術語“智能合約”就是合約賬號中的代碼,當一個交易被髮送到該賬戶時,合約中的代碼就會被執行。用戶可以通過把代碼部署到區塊鏈中來創建一個新合約,也即創建了一個新的合約賬戶。
  合約賬戶只有在EOA賬戶發出一個指令的時候纔會去執行一個操作。所以一個合約賬戶是不可能自己去執行一個操作的,如生產一個隨機數或執行一個API調用等,它只有在EOA賬戶作出確認的情況下才會去做這些事情。這是因爲以太坊要求節點能夠對計算的結果無論對錯都達成一致,這就對操作有了一個必定會執行的要求。

  在以太坊中,全網的狀態是由被“賬戶”的對象組成的,賬戶之間可以直接的進行價值和信息的轉移,一個以太坊的賬戶包含下面4個字段:

• 隨機數, 一個計數器,用以確保每個交易都只會被處理一次
• 賬戶當前的以太幣額度
• 賬戶的合約代碼, 如果有的話
• 這個賬戶的 存儲 (默認空)

  “以太幣” 是以太坊主要的內部加密燃料,並且被用來支付交易的費用。一般情況下,有2種類型的賬戶: 外部擁有的賬戶,被私鑰控制的,和合約賬戶, 被合約代碼控制的。外部擁有的賬戶沒有代碼,用戶可以通過一個外部賬戶來創建和簽名一個交易來送一個消息;合約賬戶中,每次當這個合約收到一個消息的時候,它的代碼就會被激活,允許它讀取這個消息,並且寫入到內部存儲中,然後按照一定順序發送其他的消息或創建合約等。

  消息和交易:

  名詞“交易”在以太坊中是指簽名的數據包,這個數據包中存儲了從外部賬戶發送的消息,交易包含以下內容:
• 消息的接收者
• 一個可以識別發送者的簽名
• 發送方給接收方的以太幣的數量
• 一個可選的數據字段
• 一個 STARTGAS 值, 表示執行這個交易允許消耗的最大計算步驟
• 一個 GASPRICE 值, 表示發送方的每個計算步驟的費用

前面三個是每一個加密貨幣都有的標準字段。默認情況下第四個數據字段沒有任何功能,但是合約可以訪問這裏的數據;舉個例子,如果一個合約是在一個區塊鏈上提供域名註冊服務的,那麼它就會想把這數據字段中的數據解析成2個字段,第一個字段是域名,第二個字段是域名對應的IP地址。這個合約會從數據字段中讀取這些值,然後適當把它們保存下來。

  這個 STARTGAS 和 GASPRICE 字段 是以太坊的預防拒絕式攻擊用的,非常重要。爲了防止在代碼中出現意外或敵對的無限循環或其他計算浪費,每個交易都需要設置一個限制,以限制它的計算總步驟是一個明確的值。這計算的基本單位是“汽油(gas)”; 通常,一個計算成本是一個1 滴汽油,但是一些操作需要消耗更多的汽油,因爲它們的計算成本更高。在交易數據中每一個字節需要消耗5滴汽油。這樣做的目的是爲了讓攻擊者爲他們所消耗的每一種資源,包括計算,帶寬和存儲支付費用;所以消耗網絡資源越多,則交易成本就越大。

消息:

  合約有能力向其他合約發生“消息”。消息是虛擬的對象,它從來不會被序列化,而且只存在於以太坊的執行環境中。一個消息包含以下內容:
• 消息的發送者 (隱式)
• 消息的接收者
• 與消息一起傳送的以太幣的數量
• 一個可選的數據字段
• 一個 STARTGAS 值
從本質上說,一個消息就像一個交易, 只是它是由一個合約產生的而不是一個外部用戶。一個正在執行代碼的合約,當執行到 CALL 代碼時,會產生並執行一個消息。就像一個交易,一個消息會導致接收方的賬戶運行它的代碼。因此,合約之間是可以互相發生作用的。

以太坊狀態轉移函數:

  

  以太坊的狀態轉移函數 APPLY(S,TX) -> S' 可以被定義成下面的:
1. 檢查這個交易是不是合法的 ,簽名是不是合法的, 這隨機數是不是匹配這個發送者的賬戶,如果答案是否定的,那返回錯誤。
2. 用 STARTGAS * GASPRICE 計算交易的費用,並且從簽名中確定這個發送者的地址。 從發送者的餘額中減去費用,並且增加發送者的隨機值。如果餘額不夠,則返回錯誤。
3. 初始化 GAS = STARTGAS, 並根據這交易中的字節數拿走一定量的汽油。
4. 把交易的值從發送的賬戶轉移到接收者的賬戶。如果接收者的賬戶還不存在,就創建一個。如果這個接收者的賬戶是一個合約,那麼就運行合約的代碼直到完成,或者報汽油消耗光的異常。
5. 如果值轉移失敗了,因爲發送者沒有足夠多的餘額,或代碼執行消耗光了汽油,恢復除了支付的費用外的所有的狀態,並且把這個費用添加到礦工的賬戶上。

6. 另外,把所有剩下的汽油退還給發送者,然後把用於支付費用的汽油發送給礦工。

代碼執行:

  以太坊的合約代碼是用底層的基於堆棧的字節碼語言來編寫的,被稱爲 “以太坊虛擬機代碼” or “EVM 代碼”。這代碼有一系列的字節組成,其中每一個字節都標識一個操作。在一般情況下,代碼的執行是一個無限循環,直到代碼運行結束或遇到錯誤,或檢測到 STOP 或 RETURN 指令。這些操作有三種類型的空間可用於存儲數據:
• 堆棧, 一種後進先出的容器
• 內存, 一種無線擴展的字節數組
• 合約的持久化 存儲, 一種鍵值對的方式. 不像堆棧和內存,計算結束後將會被重置, 存儲將長期保存。
代碼還可以訪問值(以太幣),發送者,傳入的消息的數據,以及區塊的頭信息,並且也可以返回一組字節數組當做輸出。

區塊鏈和挖礦:

  這以太坊的區塊鏈和比特幣的區塊鏈有很多相似的地方,也有很多不同的地方。這個以太坊和比特幣在區塊鏈體系中最重要的不同點是 :以太坊的區塊同時包含了交易列表和最近區塊的狀態。除此之外,2個其他的值,區塊的編號和難度值也存在在區塊中。以太坊中最基本的區塊驗證算法如下:
1. 檢查上一個區塊是否存在和其有效性。
2. 檢測這區塊的時間戳,是不是比上一個區塊的大,並且小於15分鐘
3. 檢查這區塊編號,難度值,交易根(transaction root) , 叔根(uncle root)和汽油限制是否有效
4. 檢查這區塊的工作證明是否有效
5. 把 S[0] 設置成上一個區塊的末端的狀態
6. 讓 TX 成爲這區塊的交易列表,如果有 n 個交易。則做for循環 For i in 0...n-1, 設置 S[i+1] = APPLY(S[i],TX[i]). 如果任何一個應用發生錯誤,或這區塊中汽油的總的消耗達到了 GASLIMIT, 則返回一個錯誤.
7. 讓 S_FINAL 等於 S[n], 但是把支付給礦工的獎勵添加到這區塊裏。

8. 檢查這個狀態 S_FINAL 的默克爾樹樹根是不是和區塊頭信息中所提供的狀態根是一樣的。如果是,則區塊有效,不然則無效。

  以太坊網絡中交易會被驗證這網絡的節點收集起來。這些“礦工”在以太坊網絡中收集、傳播、驗證和執行交易,然後整理歸檔這些交易,打包成一個區塊,與別的礦工競爭將區塊添加到區塊鏈中,添加成功的礦工將收到獎勵。通過這樣的措施,鼓勵人們爲區塊鏈全網提供更多的硬件和電力支持。



主要參考:以太坊官方網站和以太坊白皮書的內容


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章