區塊鏈系列 — 以太坊工作原理 (中)

Gas and payment
以太坊中,費用是一個非常重要的概念。 由於以太坊網絡上的交易每次計算都會產生費用 — 天下沒有白吃的午餐! 這筆費用就是所謂的 "gas"。
Gas 是用於衡量特定計算所需費用的單位。 Gas price 是您願意在每單位 Gas 上花費的 Ether 數量,以 "gwei" 為單位。 "Wei" 是 Ether 的最小單位,其中 1^18 Wei 代表 1 Ether。 1 gwei = 1,000,000,000 wei。
每筆交易,sender 都會設置 gas limit 和 gas price。 gas price * gas limit 為 sender 願意為執行交易支付的最大 Wei 金額。
例如 sender 將 gas limit 設置為 50,000,將 gas price 設置為 20 gwei。 這意味著 sender 願意花費最多 50,000 x 20 gwei = 1,000,000,000,000,000 Wei = 0.001 Ether 來執行該交易。

gas limit 代表 sender 願意花費的最大 gas。 如果他們的賬戶餘額中有足夠的 Ether 來支付這個最大值,他們就可以走了。 在交易結束時,sender 將獲得退款 - 如果有任何交易中未使用的 gas ,並以原始匯率進行兌換。

如果 sender 沒有提供執行交易所需的gas,則交易會 "用盡gas" 並被視為無效交易。 在這種情況下,交易處理中止並且發生的任何狀態改變都被逆轉,這樣我們最終會回到交易發生之前的狀態。 此外,還會記錄交易失敗的記錄,顯示嘗試了哪些交易以及失敗的位置。 而且由於機器在用完 gas 之前已經花費了算力來運行計算,因此從邏輯上講,沒有任何 gas 會退還給發送者。

這些gas 跑到哪兒去了? sender 花在 gas 上的所有錢都會發送到 "受益人" 地址,該地址通常就是是礦工的地址。 由於礦工正在花費算力來運行計算和驗證交易,因此礦工會收到gas fee 作為獎勵。

通常,sender 願意支付的 gas price 越高,礦工從交易中獲得的收益就越大。 因此,礦工更有可能選擇它。 通過這種方式,礦工可以自由選擇他們想要驗證或忽略哪些交易。 為了指導發送者設置什麼 gas price,礦工可以選擇公佈他們將執行交易的最低 gas 價格。
區塊鏈中儲存也要費用
gas 不僅用於支付計算步驟,還用於支付存儲使用費用。 存儲的總費用與使用的 32 bytes 的最小倍數成正比。
存儲費用有一有趣的特性。 例如,由於增加的存儲會增加所有節點上的以太坊狀態數據庫的大小,因此有保持較小的數據存儲量是比較好的。 出於這個原因,如果交易有清除存儲中的資料的步驟,則免除執行該操作的費用,以釋放存儲空間並且退款。
費用的目的是什麼?
以太坊工作方式的一個重要面向是網絡執行的每一個操作都同時影響每個完整節點。 然而,以太坊虛擬機上的計算步驟非常昂貴。 因此,以太坊智能合約最適合用於簡單的任務,例如運行簡單的業務邏輯或驗證簽名,而不是更複雜的用途,例如文件存儲、電子郵件或機器學習,這會給網絡帶來壓力。 徵收費用可以防止用戶對網絡過度使用。
以太坊是圖靈完備的語言。 這允許迴圈並使以太坊容易受到影響,你無法確定程序是否會無限運行。如果沒有費用,惡意使用者可以很容易地嘗試通過在交易中執行無限迴圈來破壞網路。因此,費用可以保護網絡免受蓄意攻擊。
你可能會想,"那為什麼我們還要為存儲付費?" 嗯,就像計算一樣,以太坊網路上的存儲也是整個網路必須承擔的成本。
交易和訊息
我們之前提過以太坊是一個基於交易的狀態機。 換句話說,不同賬戶之間發生的交易會將以太坊的全局狀態轉移到另一種狀態。
從最基本的意義上說,交易是由外部賬戶生成、序列化、然後提交到區塊鏈的加密簽名指令。
有兩種類型的交易:消息調用和合約創建(即創建新的以太坊合約的交易)。
所有交易都包含以下部分:
- nonce: sender 發送的交易數量。
- gasPrice: sender 願意為執行交易付出的 wei 數量。
- gasLimit: sender 願意為執行此交易支付的最大 gas 量。 在完成任何計算之前,該金額已預先設定並支付。
- to: 收件人的地址。 在創建合約的交易中,合約賬戶地址尚不存在,因此為空值。
- value: 從 sender 轉移到接收方的 Wei 數量。 在創建合約的交易中,該值作為新創建合約賬戶中的起始餘額。
- v, r, s: 用於產生標識交易發送者的簽名。
- init: 僅存在於創建合約的交易中,用於初始化新合約賬戶的 EVM 代碼片段。 init 只運行一次,然後被丟棄。 首次運行 init 時,它會返回賬戶代碼的主體,這是與合約賬戶永久關聯的一段代碼。
- data: (僅存在於消息調用的可選參數):消息調用的輸入資料。 例如,如果智能合約用作域註冊服務,則對該合約的調用可能需要輸入字段,例如域和 IP 地址。

我們在 "賬戶" 部分了解到,交易 — 消息調用和合約創建交易 — 始終由外部賬戶發起並提交到區塊鏈。 另一種思考方式是,交易是外部世界與以太坊內部狀態的橋樑。

但這並不意味著合約不能與其他合約溝通。 存在於以太坊全局範圍內的合約可以與同一範圍內的其他合約進行溝通。 他們這樣通過 "消息" 或 "內部交易" 發送給其他合約。 我們可以將消息或內部交易視為類似於交易,主要區別在於它們不是由外部帳戶產生的。 相反,它們是由合約產生的。 它們是虛擬對象,與事務不同,它們沒有序列化,只存在於以太坊執行環境中。
當一個合約向另一個合約發送內部交易時,將執行存在於接收合約賬戶上的相關代碼。

需要注意的一件重要事情是內部交易或消息不包含 gas limit。 這是因為gas limit 是由原始交易的外部創建者(即一些外部賬戶)決定的。 外部賬戶設置的 gas limit 必須足夠以執行交易,包括由於該交易而發生的任何子執行,例如合約到合約的消息。 如果在交易和消息鏈中,特定的消息執行用盡了 gas,那麼該消息的執行將連同執行觸發的任何先前消息一起恢復。
區塊
所有交易都被組合成 "塊"。 區塊鏈包含一系列鏈接在一起的塊。
在以太坊中,一個塊包括:
- block header
- 此塊中包含的所有交易
- 當前區塊的 ommers - 其餘區塊的 block headers
下篇將會繼續解釋所有概念。