【译】Economics of Fees and Gas
今天我將特別討論氣體模型在特定條件下鼓勵什么樣的事情,以及這種事情的一些意想不到的后果。
存儲成本
因此,永久存儲是以太坊區塊鏈中最昂貴的資源。 將任何大量數據存儲在區塊鏈中是完全不切實際的。 在當前的網絡環境下,1Kb的數據大約是2.50美元,具體取決于您希望確認的速度。 這意味著1Mb超過$ 2,000。 因此,將任何重要數據存儲在區塊鏈中都是不切實際的。 但是,這是針對傳統存儲的。 Ethereum的框架有非傳統的替代方案。 我將介紹總共5種存儲方式,以及各種行為,成本和收益:
外部代碼
這基本上就是您在Ethereum中使用CREATE操作碼創建新合同帳戶的原因。 您可以將所需的任何數據存儲為新創建的合同的合同字節碼。 這可能是將數據存儲在區塊鏈上最浪費的方式,因為一旦存儲數據,就很少有動機在數據不再需要時包含數據。
這是一種半易失性存儲方法。 一旦數據被存儲,它就不能被更新,而不需要從新創建。 對于大型數據塊來說,最好不要在以后更新,或者只需要非常少地更新。 加載這些數據一次寫入就會非常便宜,將傳統存儲打了一個數量級。
內部代碼
對于某些用例而言,這是一個明顯的選擇,并在Solidity生成的字節碼內部使用。 基本上,如果有一些數據可以在構造函數和緩存中生成,那么計算它通常便宜得多,然后直接將其存儲在部署的合約字節碼中,而不是將大量數據包含在創建事務本身中。 假設數據不需要更新,這是最好的使用方法,因為它也是加載數據的最便宜方式。
存儲
這是由Ethereum提供的傳統存儲模型。 它細化,允許每個單獨的32字節字在存儲中更新,與寫入新存儲相比,降低了更新成本。 也有一些激勵措施來保持這個區域干凈整潔,因為清理倉庫實際上可以為合同提供天然氣津貼。 這個區域很容易更新,易于閱讀,但在大多數情況下是訪問和寫入最昂貴的方法。
交易
這是一種完全不穩定的數據存儲方法,盡管它實際上不存儲合同可直接訪問的持久數據。 不是將數據存儲在EVM本身內,而是通過發送合同數據將數據提供給合同。 合約然后散列數據以確保它是正確的并且匹配預期的合同狀態。 這種方法有一些缺點,最大的缺點是交易數據非常昂貴。 它是迄今為止“訪問”中最昂貴的,這要求將數據放在一個調用合同的交易中。 然而,它也是實際“寫入”和更新的最便宜的(除內部代碼之外),因為它實際上并不存儲在區塊鏈本身中。 此方法可以擴展為使用類似結構的散列樹,以便提供給合同的數據非常細化,從而減少浪費寶貴的交易空間。 但是,這種方法也有一個主要缺點。 數據競賽必須考慮在內。 如果另一個用戶向合同發送調用,導致數據更新,那么它會使任何未決事務中的數據無效。 這與數據訪問的大量昂貴成本一起嚴重限制了此方法的潛在用例。
那么,這些方法如何綜合成本呢?
請注意,“實際”交易成本與其他方法一起顯示。 這基本上是用多少數量的數據實際調用合同的成本。
這些圖表為我們清楚了一些事情:
- 對于任何大于128字節的數據,外部代碼都是可取的,這些數據永遠不需要更新
- 內部代碼應該隨時使用純粹的常量數據,并且在部署時已知
- 存儲應該用于任何通常更新的數據
- 交易數據在某些情況下是可用的,盡管有些比賽,但如果不止一次使用合同,總體成本很快就會變得非常高。
存儲經濟學
關于背后的博弈論和經濟學的話題,整體區塊鏈是否更好地將非易失性數據存儲在合同字節碼中而非存儲數據庫中? 我想這取決于幾個因素。 隨著更多賬戶被創建,訪問賬戶數據變得更加昂貴嗎? 我沒有答案,但我可以保證使用這種方法進行易失性存儲不僅更昂貴,而且有點浪費。 我的圖表包括基本上部署新合同的成本,但是從燃氣成本中扣除銷毀約19000天然氣的舊數據合同給出的退款。 這確實對圖表左側的圖形產生了可測量的影響,但在約320字節之后,除了成為一個好的區塊鏈公民之外,它變得毫無意義。
那么,合約存儲的缺點是如此昂貴? 主要缺點是它可能會鼓勵執行可能更便宜的數據計算,這些計算實際上需要更多時間來執行,以防止將存儲用作緩存層。
這些成本在某些情況下也會鼓勵在每筆交易中發送數據。 這可能是最有害的條件。 存儲合同數據的數據庫在某些方面實際上是協議級別的區塊鏈的免費資源。 除了SPV(Qtum)或“快速”(以太坊)同步方法之外,此數據庫的大小與實際區塊鏈的大小以及處理需要多長時間無關。 最后這個數據庫的大小被折疊成一個叫做stateRootHash的單個256位SHA3哈希。 可以說,區塊鏈最直接的資源成本不是這種存儲,而是所有附加到交易的數據。 如果沒有某些安全隱患,此交易數據不能被丟棄或忽略。
對于存在于Qtum中的輕量級錢包和節點,實際上對于整體用戶體驗而言,將數據存儲在帳戶字節碼數據中而不是直接存儲在存儲器中會更加不利。 檢索和驗證與單個帳戶關聯的所有存儲很容易。 但是,如果此合同為了數據目的而訪問多個單獨帳戶,那么這是一個完全不確定的過程,會造成嚴重的延遲。 在不下載所有合同字節碼的情況下,不可能一次性檢索和驗證這些數據。 所以,你必須開始執行合同,然后返回到網絡,檢索另一個帳戶,驗證它等等,然后最終繼續執行。 對于這樣的1份數據合同,可能沒有太大的影響,但由于這些數據的便宜性,除了固定的32,000天然氣平臺創建費外,沒有使用多個合同沒有明顯的好處。 事實上,在某個特定點之后,特別是對于半揮發性數據,我們極力鼓勵將這些數據保持在細粒度。
因此,基本上存儲的高成本源于保持區塊鏈易于與輕量級錢包進行交互的需要。 但是,合同開發人員可以使用這條路線來規避這種成本,并且傷害輕量級錢包比直接將大量數據直接存儲在存儲中更受影響。
計算成本
現在讓我們來談談以太坊天然氣模型的不太明顯的開支。 幾乎每個計算操作碼都有一些相關的成本。 這些成本遠遠低于存儲或直接資源,但是在EVM中執行基本操作需要多少操作碼,這些成本會快速增加。 我最喜歡的例子之一是比較兩個字符串以確定它們是否相等的代價。 所以,我構建了這個基本的測試合同:
contract GasTest{ using strings for *; function StringUtilsEqual(string tmp1, string tmp2) constant returns (bool){ return StringUtils.equal(tmp1, tmp2); } function SliceEquals(string tmp1, string tmp2) constant returns (bool){ return tmp1.toSlice().equals(tmp2.toSlice()); } function NaiveEquals(string tmp1, string tmp2) constant returns (bool){ if(bytes(tmp1).length != bytes(tmp2).length) return false; uint256 max=bytes(tmp1).length; for(uint256 i=0;i<max;i++){ if(bytes(tmp1)[i] != bytes(tmp2)[i]){ return false; } } return true; } function Sha3Equals(string tmp1, string tmp2) constant returns (bool){ return sha3(tmp1) == sha3(tmp2); } }這測量比較字符串的氣體成本4種方式:
在我進入圖表之前,普通計算機上最慢的方法是SHA3方法。 SHA3??價格便宜,但即使使用非常優化的庫和快速機器,它也會在0.028s或28ms內散列大約100個字節。這意味著2個散列大約需要64ms。 同時,比較(舊)64位處理器上的2個字符串大約需要0.00183s或0.0183ms。 如果我們基于天然氣成本計算和執行操作需要多長時間,則使用傳統方法比較2個字符串應該會更便宜。 所以,下面是這些不同方法的氣體成本圖:
外賣
所以,在這一點上,我認為預計我會談論以太坊的天然氣日程表是多么的可怕。 但是,不,問題不在于使用的值,而在于整個模型。 我不會假裝知道這個問題的一些完美答案。 這絕對是一個復雜的。
如果您曾經研究過英特爾手冊,這些手冊描述了臺式機x86處理器中各種操作碼的操作和時序,然后去測量這些操作碼的實際性能,那么記錄的時序和實際時序之間的比較就會變化。 。 很多。 這是因為現代處理器是非常復雜和優化的硅片。 有多個流水線,緩存級別,分支預測器,寄存器緩存集等?;旧?#xff0c;所有這些都允許一組可能需要1ms的操作碼,在緊密的循環中操作,并在2ms內執行100次操作,而是超過100ms。 這種復雜的緩存,管道和分支預測結構顯然不可能在孤立的虛擬機中表示。 氣體模型必須適用于各種處理器,包括不同體系結構的處理器,以及不同的位數(即64位與32位)。 所以,氣體模型最好是適用于所有處理器的近似值。
然而,盡管沒有可能的完美解決方案,但我肯定有一些想法可以改善這種情況,這些都是我將在為Qtum中x86虛擬機的氣體模型設計(2018年即將開始!
豐富和可預測的標準庫
提供豐富的標準庫和定價氣體可能是在沒有大量風險的情況下立即改善情況的最佳途徑之一。 這個標準庫不需要在沒有虛擬機的情況下實際執行,但如果虛擬機足夠有效,就沒有任何傷害。 重要的是執行該功能所需的氣體速率應該由合理的人來設定。 這允許測量分支預測和緩存等事情,并因此直接考慮到天然氣價格。 以太坊為一組非常有限的操作(如SHA3)執行此操作。 SHA3??的基本成本是30瓦斯,然后每個32字節數據字的3瓦斯散列。 所以,可以想象一個內置的StringEqual操作,它可能有5個氣體的基本氣體成本,然后每個字節比較1個氣體。
這種方法最大的問題是使用以太坊模式,這需要使用預編譯的合同或添加新的EVM操作碼。 在x86虛擬機中,我想能夠使用本地x86代碼(可能在內部進行預編譯),然后以某種方式檢測虛擬機何時進入這個“特殊氣體”內存區域。 這絕對是一個想法。 但是增加和改變這些操作的成本將需要分叉或其他網絡中斷。 Qtum在這方面的一大優勢是,我們可以擴展分散治理協議來涵蓋這一功能,以便輕松調整這些操作的基本成本和費率成本。 然而,在這種專門的天然氣成本模型下添加新功能的方式仍然是一個正在進行的問題。
分支和內存的成本,而不是操作碼
一種可能是前進方向的想法是不收取操作碼,而是收取分支和內存訪問費用。 這種方法背后的主要觀點是大多數操作速度非常快,時間差異不明顯,因此大多數操作可能具有固定成本或甚至零成本。 然后,唯一的代價是分支(可能只有后向分支)和內存分配。 現代處理器上最昂貴的操作不是明確的操作碼,而是緩存未命中和錯誤預測的分支。 因此,這種模式旨在在任何可能的時候為這些條件收取一筆攤銷成本。 這將極大地鼓勵循環展開,這在某些條件下更快......有時。 如果循環展開過多,則由于填充緩存而導致性能下降,但展開循環的額外存儲成本可能會超過此壓力。
這種方法需要大量的研究來確定它是否可行,哪些邊緣案例需要特別關注。 這種方法的主要優點是與當前的模型相比,可以使燃氣成本變得非常可預測。 我相信這種模式本身并不是一個可行的解決方案,但將這一概念與另一種天然氣概念相結合可以為智能合同開發人員帶來可預測性。
包括氣體模型中的宏觀操作
由于現代編譯器生成的代碼如此之多(即他們找出了編譯常見操作的最有效的方法),將不僅包括原始操作碼納入氣體模型,而且還包括一系列“宏觀操作”。 這些宏觀經營需要仔細評估和定價,并用一種??方法來預測其執行的時間成本。 困難的部分是,通用執行環境非常不穩定,完全預測時間成本可能幾乎不可能。 然而,這個模型中的任何漏洞都是潛在的攻擊者可用的DoS攻擊。
所有這一切的問題
在某個時候,通過在區塊鏈共識系統中放置越來越多的代碼,以便正確測量執行的真實資源成本,實際上您會比執行代碼花費更多的時間。 這是一般氣體模型中最難的問題之一。 您希望能夠在各種實現中保持一致的一致性,同時還能防止廉價的攻擊,并且最終對各種虛擬機優化(包括預編譯和JIT執行)都很友好。 這些方面聚集在一起,真正形成了整個話題中最困難的部分。 這絕對是它仍然是一個開放性研究問題的原因之一。 圖靈完備性的問題在于,在實際執行智能合約之前,不可能測量智能合約的成本。 最好的辦法是測量各種代碼,然后你至少可以知道一段代碼的天然氣價格,直到下一個分支。 這實際上是智能合約x86架構的弱點之一。 代碼是數據,可以被突變和覆蓋。 在最終的實現中,最終可能會有更好的混合氣體模型,這樣內部恒定的(即像EVM代碼那樣加載的)字節碼具有更強大的模型,但是隨后代碼將以讀寫方式動態加載和執行,執行內存使用的計算成本較低(盡管不太精確/經濟上較昂貴)可以即時使用的氣體模型。
結論
天然氣很難,沒有銀彈,區塊鏈很難。
筆記
燃氣成本計算:
memory(size) = 3 * (size/32) + (size/32) * (size/32) / 512 # Gas costs of loading existing data in EVM (assuming memory is already allocated) (not accounting for memory costs to store the data in) ## external code (semi-volatile) 200 + 700 + (3 * size) sload + extcodecopy + (copy * size) ## internal code (constant) 3 * size copy * size ## storage (mutable) 200 * size sload * size ## Transaction (mutable) 200 + (68 * (size * 32)) + 30 + (6 * size) ## note: zero data is only 4 gas sload + (txnonzeroByte * (size * 32)) + sha3 + (sha3word * size) # Gas costs of storing data initially to EVM (not accounting for memory costs data is initially stored in) ## external code (semi-volatile) 32000 + 20000 + (200 * size * 32) + memory(size) + 10 create + sstore + (createByte * (size * 32)) + memory(size) + overhead ## internal code (constant) (200 * (size * 32)) (createByte * (size * 32)) ## storage (mutable) 20000 * size sstore * size ## Transaction (mutable) 20000 + 30 + (6 * size) ## note: zero data is only 4 gas sstore + sha3 + (sha3word * size) # Gas costs of updating data in EVM (not accounting for memory costs of updated data to store) ## external code (semi-volatile) 32000 + 5000 + (200 * size * 32) + memory(size) + 10 create + sstoreReset + (createByte * (size * 32)) + memory(size) + overhead ## internal code (constant) N/A (technically could be possible, but would greatly complicated contract design) ## storage (mutable) 5000 * size sstoreReset * size ## Transaction (mutable) 5000 + 30 + (6 * size) ## note: zero data is only 4 gas sstoreReset + sha3 + (sha3word * size)測試合約字節碼,包括庫等:
6060604052341561000f57600080fd5b610f488061001e6000396000f30060606040523615610081576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633a96fdd71461008657806346bdca9a1461013a5780635d62fdf5146101f2578063674ff51b146102aa57806388ee0b2a146103625780638a0807b71461041a578063ef5a8374146104ce575b600080fd5b341561009157600080fd5b610124600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610586565b6040518082815260200191505060405180910390f35b341561014557600080fd5b6101d8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061084a565b604051808215151515815260200191505060405180910390f35b34156101fd57600080fd5b610290600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610860565b604051808215151515815260200191505060405180910390f35b34156102b557600080fd5b610348600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610874565b604051808215151515815260200191505060405180910390f35b341561036d57600080fd5b610400600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506108a1565b604051808215151515815260200191505060405180910390f35b341561042557600080fd5b6104b8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506109eb565b6040518082815260200191505060405180910390f35b34156104d957600080fd5b61056c600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610d17565b604051808215151515815260200191505060405180910390f35b6000610590610eee565b610598610eee565b6000808693508592508351915081835110156105b357825191505b600090505b818110156107f65782818151811015156105ce57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110151561064957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610840565b82818151811015156106f257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110151561076d57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611156107e95760019450610840565b80806001019150506105b8565b825184511015610828577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610840565b82518451111561083b5760019450610840565b600094505b5050505092915050565b6000806108578484610586565b14905092915050565b600061086c838361084a565b905092915050565b600061089961088283610df0565b61088b85610df0565b610e1e90919063ffffffff16565b905092915050565b6000806000835185511415156108ba57600092506109e3565b84519150600090505b818110156109de5783818151811015156108d957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916858281518110151561095457fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156109d157600092506109e3565b80806001019150506108c3565b600192505b505092915050565b60006109f5610eee565b6109fd610eee565b600080869350859250600184511080610a17575060018351105b80610a23575083518351115b15610a50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610d0d565b6fffffffffffffffffffffffffffffffff84511115610a91577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9450610d0d565b60009150600090505b8351811015610ce957826000815181101515610ab257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515610b2d57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610cdc57600191505b825182108015610bb757508351828201105b8015610cb857508282815181101515610bcc57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838301815181101515610c4957fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610cca578180600101925050610ba5565b8251821415610cdb57809450610d0d565b5b8080600101915050610a9a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b5050505092915050565b6000816040518082805190602001908083835b602083101515610d4f5780518252602082019150602081019050602083039250610d2a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191614905092915050565b610df8610f02565b600060208301905060408051908101604052808451815260200182815250915050919050565b600080610e2b8484610e34565b14905092915050565b60008060008060008060008060008a6000015197508a600001518a600001511015610e6157896000015197505b8a60200151965089602001519550600094505b87851015610ed25786519350855192508284141515610ebb57600185896020030160080260020a03199150818316828516039050600081141515610eba57809850610ee0565b5b602087019650602086019550602085019450610e74565b89600001518b600001510398505b505050505050505092915050565b602060405190810160405280600081525090565b6040805190810160405280600081526020016000815250905600a165627a7a72305820fcb471f7522e763de8c06e6eba885f81d32bc8128e364dc46a35fd7e6c960bb50029原料氣體測量值:
Gas used for string "x" 1 StringUtilsEqual 23884 SliceEquals 23928 NaiveEquals 23433 Sha3Equals 23708 Gas used for string "foobar123" 9 StringUtilsEqual 28268 SliceEquals 24952 NaiveEquals 26385 Sha3Equals 24732 Gas used for string "foobarxxx124529898453ifdf" 25 StringUtilsEqual 37036 SliceEquals 27000 NaiveEquals 32289 Sha3Equals 26780 Gas used for string "jhkfdfdsfsdgfdsgdsffgfdsgrsehsfrhfrdggewrrtrewgfdsaffvdsfgdsf" 61 StringUtilsEqual 57032 SliceEquals 32006 NaiveEquals 45841 Sha3Equals 31859 Gas used for string "hjfhjdskhjglkhdsjlkghjlkdshjkglhjdsfkhjglfdsjhgjhldsfhgjlkdsfhjkghjfdsklhgjlkfdsjhgfdsgfdshgfds" 95 StringUtilsEqual 75932 SliceEquals 36756 NaiveEquals 58655 Sha3Equals 36682 Gas used for string "hgjkghjdskhgjlserijhlktjiurewihuygtiuserhjkgfhfdsjkvgfhjklfdshjghfdsjghufdshgjlkfdshjlkghfdsjlkghjlkfdshgjlkhfdseulkghfdslkjhgulkijfdshg" 136 StringUtilsEqual 98936 SliceEquals 42801 NaiveEquals 74320 Sha3Equals 42872http://earlz.net/view/2017/10/02/1550/economics-of-fees-and-gas
總結
以上是生活随笔為你收集整理的【译】Economics of Fees and Gas的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊智能合约安全 Dasp Top10
- 下一篇: 【译】Thoughts and Goal