以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads
首頁 > 火必 > Info

以太坊的設計理念:叔塊獎勵、更新難度算法、Gas費等_GAS

Author:

Time:1900/1/1 0:00:00

叔塊獎勵

GHOST協議是一項不起的創新,由YonatanSompolinsky和AvivZohar在2013年10月首次提出的。它是解決快速出塊伴生問題的第一個認真嘗試。

GHOST的用意是解決這樣一個難題:更短的出塊時間會導致有更多區塊“過時”因而安全性會下降——因為區塊在網絡中傳播需要一定時間,如果礦工A挖到一個區塊并向全網廣播,在廣播的路上,B也挖出了區塊,那么B的區塊是過時的,且B的本次挖礦對網絡的安全沒有貢獻。

此外,還有一個中心化問題:如果A是一個礦池,有30%的算力,B有10%的算力。A有70%的時間產生過時的區塊,而B有90%的時間產生過時區塊。如果區塊的產出時間間隔很短,那么過時率就會變高,則A憑借其更大的算力使挖礦效率也更高。所以,區塊生成過快,容易導致網絡算力大的礦池在事實上壟斷挖礦過程。

根據Sompolinsky和Zohar的描述,GHOST解決了在計算哪個鏈是最長的鏈的過程中,因產生過時區塊而造成的網絡安全性下降的問題。也就是說,不僅是父區塊和更早的區塊,同時過時的旁支區塊也被添加到計算哪個塊具有最大的總工作量證明中去。

為了解決第二個問題:中心化問題,我們采用了另一種策略:對過時區塊也提供區塊獎勵:挖到過時區塊的獎勵是該區塊基礎獎勵的7/8;而包含過時區塊的侄子區塊將收到1/32的基礎獎勵作為賞金。但是,交易費不會獎勵給叔塊和侄塊。

在以太坊中,過時區塊只能被其兄弟區塊的7代以內的直系后代區塊包含為叔塊。之所以這樣限制是因為,首先,GHOST協議若不限制過時區塊的代際距離,將會花費大量開銷在計算過時區塊的有效性上;其次,無限制的過時區塊激勵政策會讓礦工失去在主鏈上挖礦的熱情;最后,計算表明,過時區塊獎勵政策限制在7層內提供了大部分所需的效果,而且不會帶來負面效應。

度量中心化風險的一個模擬器可見此處:https://github.com/ethereum/economic-modeling/blob/master/ghost.py

一個更高層次的討論可見此處:https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time/

校對注:此處的“包含”在技術上的形式是:侄塊在區塊頭中引用叔塊的區塊哈希值,然后把叔塊的區塊頭包含在區塊體內。

區塊時間算法的設計決策包括:

區塊時間12s:選擇12秒是因為這已經是長于網絡延遲的最短時間間隔了。在2013年的一份關于測量比特幣網絡延遲的論文中,確定了12.6秒是新產生的區塊傳播到95%節點的時間;然而,該論文還指出傳播時間與區塊大小成比例,因此在更快的貨幣中,我們可以期待傳播時間大大減少。傳播間隔時間是恒定的,約為2秒。然而,為了安全起見,在我們的分析中,我們假定區塊的傳播需要12秒

以太坊礦工地址余額突破1700萬:2月21日消息,據OKLink多鏈瀏覽器數據顯示,昨日鏈上以太坊礦工地址余額突破1700萬枚ETH,占以太坊當前總供應量的14.23%,較2023年年初增長了90.9萬枚 ETH。[2023/2/21 12:19:19]

7代祖先以內的限制:這樣設計的目的是希望只保留少量區塊,而將更早之前的區塊清除。已經證明7代的可引用范圍就可以提供大部分所需的效果。

1代后裔的限制::這也是出于簡潔性的設計目標,而且上述的模擬器顯示這不會帶來很大的中心化風險。

叔塊必須是有效的?:叔塊必須是有效的header,而不是有效的區塊。這樣做也是為了簡化,將區塊鏈模型保持為線性數據結構。不過,要求叔塊是有效的區塊也是有效的方法。

獎金分配:7/8的挖礦基礎獎勵分配給叔塊,1/32分給侄塊,它們交易費用都是0%。如果費用占多數,從中心化的角度看,這會使叔塊激勵機制無效;然而,這也是為什么只要我們繼續使用PoW,以太坊就會不斷發行以太幣的原因。

難度更新算法

目前以太坊通過以下規則進行難度更新:

難度更新規則的設計目標如下:

快速更新:區塊間的時間應該隨著hash算力的增減而快速調整;

低波動性:如果挖礦算力恒定,那么難度不應劇烈波動;

簡單:算法的實現應相對簡單;

低內存:算法不應依賴于過多的歷史區塊,要盡可能少的使用“內存變量”。假設有最新的十個區塊,將存儲在這十個區塊頭部的內存變量相加,這些區塊都可用于算法的計算;

不可爆破:算法不應讓礦工有過多篡改時間戳或者礦池反復添加或刪除算力的激勵

我們當前的算法在低波動性和抗爆破性上并不理想。最近,我們計劃把時間戳參數改為與父區塊和祖父區塊比較,所以礦工只有在連續挖2個區塊時,才有動力去修改時間戳。另一個更強大的模擬公式:?

https://github.com/ethereum/economic-modeling/blob/master/diffadjust/blkdiff.py?

Gas和費用

比特幣中所有交易大體相同,因此它們的網絡成本用單一一種單位來模擬。以太坊中的交易要更復雜,所以交易費用需要考慮到賬戶的許多方面,包括網絡帶寬費用、存儲費用和計算費用。尤其重要的是,以太坊編程語言是圖靈完備的,所以交易會使用任意數量的寬帶、存儲和計算成本;而最終會使用多少數量是無法可靠預測的。防止有人使用無限循環來實施拒絕服務式攻擊是我們的一個關鍵目標。

數據:以太坊橋TVL達到178.3億美元:金色財經報道,DuneAnalytics數據顯示,以太坊橋當前TVL達到178.3億美元。其中鎖倉量最高的5個橋分別是Ronin Bridge(80.12億美元)、AvalancheBridge(57.88億美元)、PolygonBridges(53.31億美元)、ArbitrumBridges(30.41億美元)、FantomAnyswapBridge(18.33億美元)。[2021/11/14 6:50:49]

以太坊交易費用的基本機制如下:

每筆交易必須指明自身愿意消耗的gas數量,以及愿意為每單元gas支付的費用,在交易執行開始時,startgas*gasprice價值的以太幣會從發送者賬戶中扣除;

交易執行期間的所有操作,包括讀寫數據庫、發送消息以及每一步的計算都會消耗一定數量的gas;

如果交易執行完畢,消耗的gas值小于指定的限制值,則交易執行正常,并將剩余的gas值賦予變量?gas_rem?;在交易完成后,發送者會收到返回的gas_rem*gasprice價值的以太幣,而給礦工的獎勵是*gasprice價值的以太幣;

如果交易執行中,gas消耗殆盡,則所有的執行恢復原樣,但交易仍然有效,只是交易的唯一結果是將startgas*gasprice價值的以太幣支付給礦工,其他不變;

當一個合約發送消息給另一個合約,可以對這個消息引起的子執行設置一個gas限制。如果子執行耗盡了gas,則子執行恢復原樣,但gas仍然消耗。,這一點還未改變,但它在未來有可能會改變。

上述提到的幾點都是必須滿足的,例如:

如果交易不需要指定gas限制,那么惡意用戶就會發送一個有數十億步循環的交易。沒有人能夠處理這樣的交易,因為處理這樣的交易花的時間可能很長很長;但是誰也無法預先告知網絡上的礦工,這就會導致拒絕服務的漏洞產生。

一種替代嚴格gas計數的方法是時間限制,但它不可能有用,因為它們太主觀了。

startgas*gasprice的整個值,在開始時就應該設置好,這樣不至于在交易執行中造成該賬戶“破產”、無力繼續支付gas費用。一邊執行一邊檢查余額也不行,因為賬戶可以把余額放到別的地方。

如果在gas不夠的情況下,交易執行不會完全復原,合約就必須采用強有力的安全措施來防止合約發生變化。

如果子限制不存在,則惡意賬戶可以對其他合約實施拒絕服務攻擊。攻擊者可以先與受害合約達成一致意見,然后在計算過程開始時插入一個無限循環,那么發送消息給受害合約或者受害合約的任何補救嘗試,都會使整個交易死鎖。

數據:以太坊鏈上NFT銷售總額突破70億美元:金色財經報道,根據Cryptoslam最新數據顯示,以太坊鏈上NFT銷售總額突破破70億美元,創下歷史新高,本文撰寫時為7,072,050,900美元,鏈上交易數量為3,207,359筆。[2021/10/8 20:13:25]

要求交易發送者而不是合約來支付gas,這樣大大增加了開發人員的可操作性。以太坊早期的版本是由合約來支付gas的,這導致了一個相當嚴重的問題:每個合約必須實現“門衛”代碼,確保每個傳入的消息為合約提供了足夠的以太幣供其消耗。

gas消耗計算有以下特點:

對于任何交易,都將收取21000gas的基本費用。這些費用可用于支付運行橢圓曲線算法所需的費用以及存儲交易所花費的硬盤和帶寬空間。

交易可以包括無限量的“數據”。虛擬機中的某些操作碼,可以讓收到這樣交易的合約訪問這些數據。數據的“固定消耗量”規則是:每個零字節4gas,非零字節68gas。這個公式的產生是因為用戶向合約發送的交易中,大部分的交易數據由一系列的32字節的參數組成,其中多數參數具有許多前導零字節。該結構看起來似乎效率不高,但由于壓縮算法的存在,實際上還是很有效率的。我們希望此結構能夠代替其他更復雜的機制:這些機制根據預期字節數嚴格包裝參數,從而導致編譯階段復雜性大增。這是三明治復雜模型的一個例外,但由于成本效益比,這也是合理的模型。

用于設置賬戶存儲項的操作碼SSTORE的消耗是:1)將零值改為非零值時,消耗20000gas;2)將零值變成零值,或非零值變非零值,消耗5000gas;3)將非零值變成零值,消耗5000gas;此外,交易執行成功后會退回15000gas。退款金額上限是交易消耗gas總額的50%。這給了人們小小激勵去清除存儲項。我們注意到,正因為缺乏這樣的激勵,許多合約的存儲空間沒有被有效使用,從而導致了存儲數據的快速膨脹。這一設計既能提供“為存儲項持續收取租金”模式的大部分好處,又不會失去合約一旦確立就可以永久存在的保證。延遲退款機制是必要的,因為可以阻止拒絕服務攻擊:攻擊者可以發送一筆含有少量gas的交易,循環清除大量的存儲項,直到用光gas,這樣消耗了大量的驗證算力,但實際并沒有真正清除存儲,也不需要付出很多gas。50%的上限的是為了確保打包交易的礦工依然能夠確定執行交易的計算時間的上限。

(校對注:首先,SSTORE等狀態訪問操作碼的gas消耗量已經隨著以太坊的硬分叉而多次更改。截至2021年7月,最新的數值可見《柏林升級內容概覽》;在可預見的未來,這個操作碼的數值還會繼續變化;其次,這里的gasrefund機制,事后證明并沒有啟動緩解狀態數據的膨脹問題,反而惡化了該問題,因為人們可以在gasprice較低時寫入大量垃圾數據,在gasprice較高時清除這些數據來獲得gas,這就是“GasToken”的原理。當前已確定,在“倫敦”分叉中會改變gasrefund機制。

動態 | 以太坊鏈上交易數突破100萬:6月29日消息,以太坊鏈上交易數突破100萬,今日現為1004170。[2019/6/30]

合約提供的消息數據是沒有成本的。因為在消息調用期間不需要實質復制任何數據,調用數據可以簡單地視為指向父合約memory的指針,該指針在子進程執行時不會改變。

Memory是一個可以無限擴展的數組,然而,每擴展32字節的memory就會消耗1gas的成本,不足32字節以32字節計。

某些操作碼的計算時間極度依賴參數,gas開銷計算是動態變化的。例如,EXP的的開銷是指數級別的。復制操作碼的開銷是1gas+1gas/32字節。Memory擴展的開銷不包含在這里。如若包含,會變成一個平方攻擊向量。

如果值不是零,操作碼CALL會額外消耗9000gas。這是因為任何值傳輸都會引起歸檔節點的歷史存儲顯著增大。請注意,操作的?實際消耗?是6700;但是此基礎上,我們強制增加了一個自動給予接收者的gas值,這個值最小2300。這樣做是為了讓接受交易的錢包至少有足夠的gas來生成log。

Gas機制的另一個重要部分是gas價格本身體現出的經濟學原理。比特幣中,默認的方法是采取純粹自愿的收費方式,礦工扮演守門人的角色并且動態設置收費的最小值。以太坊中允許交易發送者設置任意數目的gas。這種方式在比特幣社區非常受歡迎,因為它是“市場經濟”的體現:允許礦工和交易者之間依據供需關系來決定價格。然而,這種方式的問題是,交易處理并不遵循市場原則。盡管可以將交易處理看作是礦工向發送者提供的服務,但實際上礦工所處理的每個交易都必須由網絡中的每個節點處理,所以交易處理的大部分成本都由第三方機構承擔,而不是決定是否處理它的礦工。因此,“公地悲劇”問題很有可能發生。

當前,因為缺乏礦工在實際中的行為的明確信息,所以我們將采取一個非常簡單公平的方法:投票系統,來設定單個區塊可消耗的gas總額。礦工有權將在最新區塊的gas上限基礎上變更0.0975%(1/1024),作為當前區塊的gas上限。所以最終的gas上限應該是礦工們設置的中間值。我們希望將來能夠采用軟分叉的方法來使用更加精確的算法。

虛擬機

以太坊虛擬機是執行交易代碼的引擎,也是以太坊與其他系統的核心區別。請注意,虛擬機應該同“合約與消息模型”分開考慮。例如,SIGNEXTEND操作碼是虛擬機的一個功能,但實際上“某個合約可以調用其他合約并指定子調用的gas限定值”是“合約與消息模型”的一部分。

EVM的設計目標如下:

簡單:操作碼盡可能的少并且低級;數據類型盡可能少;虛擬機的結構盡可能少;

行情 | 以太坊跌幅達到5%:根據huobipro數據顯示,目前以太坊價格出現大幅下跌,價格由早間的285.89美元,下跌至270.74美元,跌幅達到5%。[2018/8/21]

結果明確:在VM規范中,沒有任何可能產生歧義的空間,結果應該是完全確定的。此外,計算步驟應該是精確的,以便可以測量gas的消耗量;

節約空間:EVM組件應盡可能緊湊;

為預期用途而特化:在VM上構建的應用應能處理20字節的地址,以及32位的自定義加密值,擁有用于自定義加密的模數運算、讀取區塊和交易數據與狀態交互等能力;

簡單安全:為了讓VM不被利用,應該能夠容易地讓建立一套gas消耗成本模型的操作;

優化友好:應該易于優化,以便即時編譯和VM的加速版本能夠構建出來。

同時EVM也有如下特殊設計:

臨時/永久存儲的區別:我們先來看看什么是臨時存儲和永久存儲。臨時存儲:存在于VM的每個實例中,并在VM執行結束后消失。永久存儲:存在于區塊鏈狀態層。假設執行下面的樹:

A調用B;

B設置?B.S=5,B.M=9?;

B調用C;

C調用B。

此時,如果B試圖讀取?B.S?,它將得到B前面存入的數據,也就是5;但如果B試圖讀取?B.M?,它將得到0,因為B.M是臨時存儲,讀取它的時候是虛擬機的一個新的實例。在一個內部調用中,如果設置?B.M=13?和?B.S=17?,然后內部調用和C的調用都終止、回到了B的外部調用,此時讀取M,將會看到?B.M=9?,?B.S=17?。如果B的外部調用結束,然后A再次調用B,將看到?B.M=0,B.S=17?。這個區別的目的是:1.每個執行實例都分配有內存空間,不會因為循環調用而減損,這讓安全編程更加容易。2.提供一個能夠快速操作的內存形式:因為需要修改樹,所以存儲更新必然很慢。

棧/memory模式:早期,計算狀態有三種:棧,內存,存儲項。在臨時存儲端,棧和內存的替代方案是memory-only范式,或者是寄存器和內存的混合體。在這種情況下,每個指令都有三個參數,例如:?ADDR1R2R3:M=M+M?。選擇棧范式的原因很明顯,它使代碼縮小了4倍。

單詞大小32字節:在大多數結構中,如比特幣,單詞大小是4或8字節。4或8字節對存儲地址和加密計算來說局限性太大了。而不對大小作限制又很難建立相應安全的gas模型。32字節是一個理想大小,因為它足夠存儲下許多密碼算法所需要的大數值以及地址,又不會因為太大而導致效率低下。

我們有自己的虛擬機:我們的虛擬機使用java、Lisp和Lua等語言開發。我們認為開發一款專業的虛擬機是值得的,因為:1)我們的VM規范比其他許多虛擬機簡單的多,因為其他虛擬機為復雜性付出的代價更小,也就是說它們更容易變得復雜;然而,在我們的方案中每額外增加一點復雜性,都會給集約化發展帶來障礙,并帶來潛在的安全缺陷,比如共識錯誤,這就讓我們的復雜性成本很高;2)我們的VM更加專業化,如支持32字節;3)我們不會有復雜的外部依賴,復雜的外部依賴會導致我們安裝失敗;4)完善的審查機制,可以具體到特殊的安全需求;即使使用外部VM,也無法節省太多工作量。

使用了可變、可擴展的memory大小:固定memory的大小是不必要的限制,太小或太大都不合適。如果內存大小是固定的,每次訪問內存都需要檢查訪問是否超出邊界,顯然這樣的效率并不高。

1024調用深度限制:許多編程語言在內存還沒有溢出時,就因為調用深度太深而崩潰了。所以僅使用區塊gas上限一種限制是不夠的。

無類型:只是為了簡潔。不過,DIV、SDIV、MOD、SMOD會使用有符號或無符號的操作碼;轉換成定點運算在所有情況下都很簡單,例如,在32位長度下,a*b->(a*b)/2^32,a/b->a*2^32/b?,+、-和*在整數下不變。

校對注:在原譯本中還有如下一段,但其對應段落在當前版本的原文中已經刪除了:?棧大小沒有限制:沒什么特別理由!許多情況下,該設計不是絕對必要的;因為,gas的開銷和區塊gas上限總是會充當每種資源消耗的上限。

這個VM中某些操作碼的功能和用意很容易理解,但也有一些不太好理解,以下是一些特殊的原因:

ADDMOD,MULMOD:大多數情況下,?mulmod(a,b,c)=a*b%c?,但在橢圓曲線算法中,使用的是32字節模數運算,直接執行?a*b%c?實際上是在執行?((a*b)%2^256)%c?,會得到完全不同的結果。在32字節的空間中執行32字節數值的?a*b%c?計算的共識非常困難且繁瑣。

SIGNEXTEND:SIGNEXTEND操作碼的作用是為了方便從大的有符號整數到小的有符號整數的類型轉換。小的有符號整數是很有用的,因為未來的即時編譯虛擬機也許有能力檢測主要處理32字節整數又長時間運行的代碼塊,小的有符號整數能加快處理。

SHA3:在以太坊代碼中,SHA3作為安全的、高強度的、不定長數據哈希映射方法,應用非常廣泛。通常,在使用存儲器時,需要使用Hash函數來防止惡意沖突,在驗證默克爾樹和類似的以太坊數據結構時也需要使用到Hash函數。重要的是,與SHA3的相似的哈希函數,如SHA256、ECRECVOR、RIPEM160,不是以操作碼的形式包含在里面,而是以偽合約的形式。這樣做的目的是將它們放在一個單獨的類別中,如果當我們以后提出適當的“原生插件”系統時,可以添加更多這樣的合約,而不需要擴展操作碼。

ORIGIN:ORIGIN操作碼由交易的發送者提供,主要的作用是允許合約退回支付的gas。

COINBASE:COINBASE的主要作用是:1)允許子貨幣對網絡安全作出貢獻;2)使礦工能夠作為一個去中心化的經濟體,來設置基于子共識的應用,如Schellingcoin。

PREVHASH:PREVHASH可用作一個半安全的隨機來源。此外,允許合約求值上一個區塊的默克爾樹狀態證明,而不需要高度復雜的“以太坊輕客戶端”遞歸結構。

EXTCODESIZE,EXTCODECOPY:主要的作用是讓合約依據模板檢查其他合約的代碼,甚至是在與其他合約交互前,模擬它們。見:https://lesswrong.com/lw/aq9/decision_theories_a_less_wrong_primer/

JUMPDEST:當跳轉目的地限制在幾個索引時,JIT虛擬機實現起來更簡單。于是,我們需要:1)對有效變量跳轉目的地做限制;2)激勵使用靜態而不是動態跳轉。為了達到這兩個目標,我們定下了以下規則:1)緊接著push后的跳轉可以跳到任何地方,而不僅是另一個jump;2)其他的jump只能跳轉到JUMPDEST。對跳轉的限制是必須的,這樣就可通過查看代碼中的前一個操作來確定當前是一個靜態跳轉還是動態跳轉。缺乏對靜態跳轉的需求是激勵使用它們的原因。禁止跳轉進入push數據也會加快JIT虛擬機的編譯和執行。

LOG:LOG是事件的日志。

CALLCODE:該操作碼允許合約使用自己的存儲項,在單獨的棧空間和memory中調用其他合約的“函數”。這樣可以在區塊鏈上靈活實現標準庫代碼。

SELFDESTRUCT:允許合約刪除它自己,前提是它已經不需要存在了。SELFDESTRUCT并非立即執行,而是在交易執行完之后執行。這是因為如果允許SELFDESTRUCT在執行之后回滾,將會極大地提高緩存的復雜度,不利于高效的VM實現。

PC:盡管理論上不需要PC操作碼,因為所有PC操作碼的實例都可以根據將push操作的索引加入實際程序計數器來代替實現,但使用PC可以創建獨立代碼的位置。

原文鏈接:

https://eth.wiki/en/fundamentals/design-rationale

作者:?Vitalik

翻譯&校對:?kim?&?阿劍

Tags:GAS以太坊MOREMONAGASWAP以太坊銀行幣值錢嗎MORPH幣FREEMOON幣

火必
金融時報:全球監管壓力下新加坡成為加密行業避風港_比特幣

英國《金融時報》報道,隨著美國、英國和中國在內的全球監管方收緊監管,新加坡正成為加密行業的避風港。目前,包括以太坊創始人V神和幣安創始人趙長鵬在內的行業大佬均已常駐或移居新加坡.

1900/1/1 0:00:00
Mint Ventures深度研報:Liquity穩定幣市場的后起之秀_USD

第一節研報要點 LUSD具有超額抵押穩定幣里最優秀的機制,雖然上線時間不足3個月,但是其機制的有效性已經完全得到驗證.

1900/1/1 0:00:00
金色前哨丨軟銀擁有的LINE進軍CBDC 推出開源央行數字貨幣平臺_數字貨幣

金色財經?區塊鏈7月11日訊??日本跨國企業集團軟銀旗下的韓國軟件和技術服務公司LINEPLUS發布了一個區塊鏈平臺,旨在幫助中央銀行啟動自己的央行數字貨幣.

1900/1/1 0:00:00
逆勢火爆的Axie 能否持續_AXI

大家好,我是佩佩,最近屬于市場冷靜期,如果沒有太多可以講的更新會放慢一點,另外說明下后面根據內容情況,可能有部分更新會選擇只放在幣乎上(搜:風火輪區塊鏈),微信端就不同步更新.

1900/1/1 0:00:00
元宇宙:后互聯網時代的新紀元_元宇宙

元宇宙的曙光初現 元宇宙概念的出現:科幻小說《雪崩》中描繪了一個稱為元宇宙的多人在線虛擬世界,用戶以自定義的“化身”在其中進行活動.

1900/1/1 0:00:00
7.8晚間行情:行情出現暴挫 布局機會再來_BTC

7月8日BTC再次出現大幅下挫,后期行情如何分析?目前行情能否逢低布局呢? ETH跌破3100美元關口 日內跌幅為7.83%:火幣全球站數據顯示,ETH短線下跌,跌破3100美元關口.

1900/1/1 0:00:00
ads