# 主要設計

以太坊項目的基本設計與比特幣網絡類似。為了支持更復雜的智能合約，以太坊在不少地方進行了改進，包括交易模型、共識、對攻擊的防護和可擴展性等。

## 智能合約相關設計

### 運行環境

以太坊採用以太坊虛擬機作為智能合約的運行環境。以太坊虛擬機是一個隔離的輕量級虛擬機環境，運行在其中的智能合約代碼無法訪問本地網絡、文件系統或其它進程。

對同一個智能合約來說，往往需要在多個以太坊虛擬機中同時運行多份，以確保整個區塊鏈數據的一致性和高度的容錯性。另一方面，這也限制了整個網絡的容量。

### 開發語言

以太坊為編寫智能合約設計了圖靈完備的高級編程語言，降低了智能合約開發的難度。

目前 Solidity 是最常用的以太坊合約編寫語言之一。

智能合約編寫完畢後，用編譯器編譯為以太坊虛擬機專用的二進制格式（EVM bytecode），由客戶端上傳到區塊鏈當中，之後在礦工的以太坊虛擬機中執行。

## 交易模型

出於智能合約的便利考慮，以太坊採用了賬戶的模型，狀態可以實時的保存到賬戶裡，而無需像比特幣的 UXTO 模型那樣去回溯整個歷史。

UXTO 模型和賬戶模型的對比如下。

| 特性      | UXTO 模型 | 賬戶模型         |
| ------- | ------- | ------------ |
| 狀態查詢和變更 | 需要回溯歷史  | 直接訪問         |
| 存儲空間    | 較大      | 較小           |
| 易用性     | 較難處理    | 易於理解和編程      |
| 安全性     | 較好      | 需要處理好重放攻擊等情況 |
| 可追溯性    | 支持歷史    | 不支持追溯歷史      |

## 共識

以太坊目前採用了基於成熟的 PoW 共識的變種算法 Ethash 協議作為共識機制。

為了防止 ASIC 礦機礦池的算力攻擊，跟原始 PoW 的計算密集型 Hash 運算不同，Ethash 在執行時候需要消耗大量內存，反而跟計算效率關係不大。這意味著很難製造出專門針對 Ethash 的芯片，反而是通用機器可能更加有效。

雖然，Ethash 相對原始的 PoW 進行了改進，但仍然需要進行大量無效的運算，這也為人們所詬病。

社區已經有計劃在未來採用更高效的 Proof-of-Stake（PoS）作為共識機制。相對 PoW 機制來講，PoS 機制無需消耗大量無用的 Hash 計算，但其共識過程的複雜度要更高一些，還有待進一步的檢驗。

## 降低攻擊

以太坊網絡中的交易更加多樣化，也就更容易受到攻擊。

以太坊網絡在降低攻擊方面的核心設計思想，仍然是通過經濟激勵機制防止少數人作惡：

* 所有交易都要提供交易費用，避免 DDoS 攻擊；
* 程序運行指令數通過 Gas 來限制，所消耗的費用超過設定上限時就會被取消，避免出現惡意合約。

這就確保了攻擊者試圖消耗網絡中虛擬機的計算資源時，需要付出經濟代價（支付大量的以太幣）；同時難以通過構造惡意的循環或不穩定合約代碼來對網絡造成破壞。

## 提高擴展性

可擴展性是以太坊網絡承接更多業務量的最大制約。

以太坊項目未來希望通過分片（sharding）機制來提高整個網絡的擴展性。

分片是一組維護和執行同一批智能合約的節點組成的子網絡，是整個網絡的子集。

支持分片功能之前，以太坊整個網絡中的每個節點都需要處理所有的智能合約，這就造成了網絡的最大處理能力會受限於單個節點的處理能力。

分片後，同一片內的合約處理是同步的，彼此達成共識，不同分片之間則可以是異步的，可以提高網絡整體的可擴展性。
