這篇文章是用來幫助人們理解以太坊網絡上的一些基本概念和體系距潘,包括賬戶體系、gas只搁、礦工在區(qū)塊大小設置機制里的角色等音比。
什么是賬戶?
以太坊中有兩種賬戶
外部擁有賬戶(EOA)
合約賬戶
外部擁有賬戶
一個外部擁有賬戶具有一下特性:
有一個以太幣余額
可以發(fā)送交易(以太幣轉賬或者激活合約代碼)
通過私鑰控制
沒有相關聯的代碼
合約賬戶
一個合約賬戶擁有一下特性:
有一個以太幣余額
有相關聯的代碼
代碼執(zhí)行是通過交易或者其他合約發(fā)送的call來激活
當被執(zhí)行時 -- 運行在隨機復雜度 (圖靈完備性)-- 只能操作其擁有的特定儲存氢惋,例如可以擁有其永久state -- 可以call其他合約
所有以太坊區(qū)塊鏈上的行動都是由各賬戶發(fā)送的交易激活洞翩。每次一個合約賬戶收到一個交易,交易自帶的參數都會成為代碼的輸入值運行焰望。合約代碼會被以太坊虛擬機(EVM)在每一個參與網絡的節(jié)點上運行骚亿,以作為它們新區(qū)塊的驗證。
什么是交易和消息熊赖?
交易
"交易"這個術語在以太坊里被用來指代一個用來存儲消息的被簽名數據包在區(qū)塊鏈上從一個外部擁有賬戶發(fā)送至另一個賬戶的過程来屠。
交易包括:
這個消息的接收者
一個簽名,用來證明發(fā)送者有意向通過區(qū)塊鏈向接收者發(fā)送消息
價值域 - 從發(fā)送方轉移到接受方的wei (ether/10^18) 的數量
一個可選的數據域震鹉,用來儲存發(fā)送給合約的消息
一個GASLIMIT值俱笛,代表了這個交易的執(zhí)行最多被允許使用的計算步驟
一個GASPRICE值,代表了交易發(fā)送者愿意支付的gas費用传趾。一個單位的gas表示了執(zhí)行一個基本指令迎膜,例如一個計算步驟
消息
合約具有發(fā)送"消息"到其他合約的能力。消息是一個永不串行且只在以太坊執(zhí)行環(huán)境中存在的虛擬對象浆兰。他們可以被理解為函數調用(function calls)磕仅。
一個消息包括:
明確的消息發(fā)送者
消息的接收者
一個可選的數據域,這是合約實際上的輸入數據
一個GASLIMIT值簸呈,用來限制這個消息出發(fā)的代碼執(zhí)行可用的最大gas數量
總的來說榕订,一個消息就像是一個交易,除了它不是由外部賬戶生成蜕便,而是合約賬戶生成劫恒。當合約正在執(zhí)行的代碼中運行了CALL
或者DELEGATECALL
這兩個命令時,就會生成一個消息玩裙。消息有的時候也被稱為"內部交易"兼贸。與一個交易類似,一個消息會引導接收的賬戶運行它的代碼吃溅。因此溶诞,合約賬戶可以與其他合約賬戶發(fā)生關系,這點和外部賬戶一樣决侈。有許多人會誤用交易這個詞指代消息螺垢,所以可能消息這個詞已經由于社區(qū)的共識而慢慢退出大家的視野,不再被使用赖歌。
什么是 gas枉圃?
以太坊在區(qū)塊鏈上實現了一個運行環(huán)境,被稱為以太坊虛擬機(EVM)庐冯。每個參與到網絡的節(jié)點都會運行EVM作為區(qū)塊驗證協議的一部分孽亲。他們會驗證區(qū)塊中涵蓋的每個交易并在EVM中運行交易所觸發(fā)的代碼。每個網絡中的全節(jié)點都會進行相同的計算并儲存相同的值展父。合約執(zhí)行會在所有節(jié)點中被多次重復返劲,這個事實得使得合約執(zhí)行的消耗變得昂貴,所以這也促使大家將能在鏈下進行的運算都不放到區(qū)塊鏈上進行栖茉。對于每個被執(zhí)行的命令都會有一個特定的消耗篮绿,用單位gas計數。每個合約可以利用的命令都會有一個相應的gas值吕漂。
gas和交易消耗的gas
每筆交易都被要求包括一個gas limit(有的時候被稱為startGas
)和一個交易愿為單位gas支付的費用亲配。礦工可以有選擇的打包這些交易并收取這些費用。在現實中惶凝,今天所有的交易最終都是由礦工選擇的吼虎,但是用戶所選擇支付的交易費用多少會影響到該交易被打包所需等待的時長。如果該交易由于計算苍鲜,包括原始消息和一些觸發(fā)的其他消息鲸睛,需要使用的gas數量小于或等于所設置的gas limit,那么這個交易會被處理坡贺。如果gas總消耗超過gas limit官辈,那么所有的操作都會被復原,但交易是成立的并且交易費仍會被礦工收取遍坟。區(qū)塊鏈會顯示這筆交易完成嘗試拳亿,但因為沒有提供足夠的gas導致所有的合約命令都被復原。所以交易里沒有被使用的超量gas都會以以太幣的形式打回給交易發(fā)起者愿伴。因為gas消耗一般只是一個大致估算肺魁,所以許多用戶會超額支付gas來保證他們的交易會被接受。這沒什么問題隔节,因為多余的gas會被退回給你鹅经。
估算交易消耗
一個交易的交易費由兩個因素組成:
gasUsed
:該交易消耗的總gas數量gasPrice
:該交易中單位gas的價格(用以太幣計算)
交易費 = gasUsed * gasPrice
gasUsed
每個EVM中的命令都被設置了相應的gas消耗值寂呛。gasUsed是所有被執(zhí)行的命令的gas消耗值總和。
gasPrice
一個用戶可以構建和簽名一筆交易瘾晃,但每個用戶都可以各自設置自己希望使用的gasPrice
贷痪,甚至可以是0。然而蹦误,以太坊客戶端的Frontier版本有一個默認的gasPrice
劫拢,即0.05e12 wei。礦工為了最大化他們的收益强胰,如果大量的交易都是使用默認gasPrice
即0.05e12 wei舱沧,那么基本上就很難有礦工去接受一個低gasPrice
交易,更別說0 gasPrice
交易了偶洋。
交易費案例
你可以將gasLimit理解為你汽車油箱的上限熟吏。同時將gasPrice理解為油價。
對于一輛車來說玄窝,油價可能是 $2.5(價格)每升(單位)分俯。在以太坊中,就是20 GWei(價格)每gas(單位)哆料。為了填滿你的"油箱"缸剪,需要 10升$2.5的油 = $25。同樣的东亦,21000個20 GWei的gas = 0.00042 ETH杏节。
因此,總交易費將會是0.00042以太幣典阵。
發(fā)送代幣通常需要消耗大約5萬至10萬的gas奋渔,所以總交易費會上升0.001至0.002個ETH。
什么是"區(qū)塊gas limit"?
區(qū)塊gas limit是單個區(qū)塊允許的最多gas總量壮啊,以此可以用來決定單個區(qū)塊中能打包多少筆交易嫉鲸。例如,我們有5筆交易的gas limit分別是10歹啼、20玄渗、30、40和50.如果區(qū)塊gas limit是100狸眼,那么前4筆交易就能被成功打包進入這個區(qū)塊藤树。礦工有權決定將哪些交易打包入區(qū)塊。所以拓萌,另一個礦工可以選擇打包最后兩筆交易進入這個區(qū)塊(50+40)岁钓,然后再將第一筆交易打包(10)。如果你嘗試將一個會使用超過當前區(qū)塊gas limit的交易打包,這個交易會被網絡拒絕屡限,你的以太坊客戶端會反饋錯誤"交易超過區(qū)塊gas limit"品嚣。
目前區(qū)塊的gas limit是 4,712,357 gas,數據來自于ethstats.net钧大,這表示著大約224筆轉賬交易(gas limit為21000)可以被塞進一個區(qū)塊(區(qū)塊時間大約在15-20秒間波動)翰撑。這個協議允許每個區(qū)塊的礦工調整區(qū)塊gas limit,任意加減 1/2024(0.0976%)拓型。
誰來決定
區(qū)塊的gas limit是由在網絡上的礦工決定的额嘿。與可調整的區(qū)塊gas limit協議不同的是一個默認的挖礦策略瘸恼,即大多數客戶端默認最小區(qū)塊gas limit為4,712,388劣挫。
區(qū)塊gas limit是怎樣改變的
以太坊上的礦工需要用一個挖礦軟件,例如ethminer东帅。它會連接到一個geth或者Parity以太坊客戶端压固。Geth和Pairty都有讓礦工可以更改配置的選項。
以太坊網絡上的"DoS"攻擊是什么靠闭?
最近有些評論表示以太坊網絡正在慢慢減速帐我,變得擁堵甚至無法使用。這些評論把這個減速的過程稱為對以太坊網絡的"DoS"攻擊愧膀。當以太坊網絡上持續(xù)地出現全滿區(qū)塊并且有大量交易在網絡上待處理時就會出現所謂的DoS情況拦键。同時,礦工有權利根據交易費選擇打包哪些交易檩淋。如果當時隊列中(交易池中)有上千筆交易正在等待打包芬为,那么就有可能造成幾個小時的非正常交易延遲。DDoS可能是惡意的也有可能是非惡意的蟀悦。
惡意的DoS
上個秋天媚朦,以太坊被某人或某個團體攻擊了,通過大量制造垃圾交易日戈。這次攻擊在如下博客有介紹:
攻擊者通過在他們的智能合約中反復的調用某些命令來讓客戶端難以處理這些計算询张,但是這些命令都只消耗少量的gas所以調用起來十分廉價。
在這次攻擊中浙炼,礦工被要求降低gas limit到150萬份氧,在后來的另一次事件中更改到了200萬。也有幾次其他的事件要求礦工在網絡被攻擊時降低區(qū)塊gas limit弯屈。
非惡意的DoS
非惡意的DoS其實就是當網絡面臨海量交易時需要比平常更多的時間來處理一筆交易半火。最近由于ICO的流行,以太坊網絡多次被交易填滿季俩。Infura的朋友們寫過一篇與此相關的技術分析文章钮糖。
為什么區(qū)塊gas limit在區(qū)塊被填滿時不會自動調整?
主要原因:礦工們沒有使用gas limit動態(tài)調整的功能。
以太坊協議中存在著讓礦工可以通過投票來決定gas limit的機制店归,所以區(qū)塊容量不需要經過硬分叉就可以調整阎抒。最初,這個機制和另一個默認策略是綁定在一起的消痛,即礦工默認投票使區(qū)塊gas limit至少有470萬且叁,并且趨向于最近1024個區(qū)塊gas使用量的1.5倍。這使得區(qū)塊容量會根據需求來自動上升秩伞,同時也有一個可用來防御垃圾交易的限制逞带。
就像"惡意的DoS"部分說的,在歷史上有幾次礦工因為攻擊的原因不得不使用非默認設置來幫助降低攻擊造成的影響纱新。但現在的問題是礦池在攻擊之后并沒有將設置改回默認設置展氓。大約一個月前,礦工被要求改變gas limit和gas price設置來再次加入gas limit動態(tài)調整功能脸爱。因為最近的代幣銷售火爆導致很多區(qū)塊被填滿并且區(qū)塊鏈交易堵塞遇汞。
ETH Gas Station是一個人們可以查閱最新區(qū)塊gas limit設置的網站。
礦工需要做什么才能修復這個問題簿废?
礦工可以在Geth或者Parity客戶端中更改設置來重啟動態(tài)gas limit調整空入。
Geth
推薦設置
--gasprice 4000000000 --targetgaslimit 4712388
解釋
--targetgaslimit Target gas limit sets the artificial target gas floor for the blocks to mine (default: “4712388”) --gasprice Minimal gas price to accept for mining a transactions (default: “20000000000”). Note: gasprice is listed in wei.
Parity
推薦設置
--gas-floor-target 4712388 --gas-cap 9000000 --gasprice 4000000000
解釋
--gas-floor-target Amount of gas per block to target when sealing a new block (default: 4700000).
--gas-cap A cap on how large we will raise the gas limit per block due to transaction volume (default: 6283184).
--gasprice Minimum amount of Wei per GAS to be paid for a transaction to be accepted for mining. Note: gasprice is listed in wei. Note 2: --gasprice is a “Legacy Option”
其他挖礦設置選項
可以參考CLI選項頁面來看看礦工還能如何調整優(yōu)化設置。
原文鏈接: http://hudsonjameson.com/2017-06-27-accounts-transactions-gas-ethereum/
作者: Hudson Jameson
翻譯&校對: 許昕