令人困惑的以太坊GAS機制暨曌鏈MIT全新智能合約代碼消耗解決方案區塊鏈
如果gas總消耗超過gaslimit,那么所有的操作都會被復原,但交易是成立的并且交易費任會被礦工收取。
什么是以太坊的 GAS?
以太坊在區塊鏈上實現了一個運行環境,被稱為以太坊虛擬機(EVM)。每個參與到網絡的節點都會運行都會運行EVM作為區塊驗證協議的一部分。他們會驗證區塊中涵蓋的每個交易并在EVM中運行交易所觸發的代碼。每個網絡中的全節點都會進行相同的計算并儲存相同的值。合約執行會在所有節點中被多次重復,這個事實得使得合約執行的消耗變得昂貴,所以這也促使大家將能在鏈下進行的運算都不放到區塊鏈上進行。對于每個被執行的命令都會有一個特定的消耗,用單位gas計數。每個合約可以利用的命令都會有一個相應的gas值。這里列了一些命令的gas消耗。
以太坊虛擬機(EVM)中運行的所有智能合約都使用 solidity進行編碼(以太坊計劃未來將從Solidity轉移到Viper。)每一行代碼都需要一定量的gas來計算,就好比汽車要用汽油。
下面圖片來自以太坊黃皮書(Yellow Paper),我們可以大致地了解以太坊代碼的成本。
圖1: 以太坊代碼行為和應付GAS數量
gas和交易消耗的gas
每筆交易都被要求包括一個gas limit(有的時候被稱為startGas)和一個交易愿為單位gas支付的費用。礦工可以有選擇的打包這些交易并收取這些費用。在現實中,今天所有的交易最終都是由礦工選擇的,但是用戶所選擇支付的交易費用多少會影響到該交易被打包所需等待的時長。如果該交易由于計算,包括原始消息和一些觸發的其他消息,需要使用的gas數量小于或等于所設置的gas limit,那么這個交易會被處理。如果gas總消耗超過gas limit,那么所有的操作都會被復原,但交易是成立的并且交易費任會被礦工收取。區塊鏈會顯示這筆交易完成嘗試,但因為沒有提供足夠的gas導致所有的合約命令都被復原。所以交易里沒有被使用的超量gas都會以以太幣的形式打回給交易發起者。因為gas消耗一般只是一個大致估算,所以許多用戶會超額支付gas來保證他們的交易會被接受。這沒什么問題,因為多余的gas會被退回給你的賬戶。
估算交易消耗
一個交易的交易費由兩個因素組成:
· gasUsed:該交易消耗的總gas數量
· gasPrice:該交易中單位gas的價格(用以太幣計算)
交易費 = gasUsed * gasPrice
gasUsed
每個EVM中的命令都被設置了相應的gas消耗值。gasUsed是所有被執行的命令的gas消耗值總和。如果希望估算gasUsed,可以使用這個estimateGas的API
gasPrice
一個用戶可以構建和簽名一筆交易,但每個用戶都可以各自設置自己希望使用的gasPrice,甚至可以是0。然而,以太坊客戶端的Frontier版本有一個默認的gasPrice,即0.05e12 wei。礦工為了最大化他們的收益,如果大量的交易都是使用默認gasPrice即0.05e12 wei,那么基本上就很難又礦工去接受一個低gasPrice交易,更別說0 gasPrice交易了。
圖2: 以太坊代碼gas消耗模式
gas limit
區塊gas limit是單個區塊允許的最多gas總量,以此可以用來決定單個區塊中能打包多少筆交易。例如,我們有5筆交易的gas limit分別是10、20、30、40和50.如果區塊gas limit是100,那么前4筆交易就能被成功打包進入這個區塊。礦工有權決定將哪些交易打包入區塊。所以,另一個礦工可以選擇打包最后兩筆交易進入這個區塊(50 40),然后再將第一筆交易打包(10)。如果你嘗試將一個會使用超過當前區塊gas limit的交易打包,這個交易會被網絡拒絕,你的以太坊客戶端會反饋錯誤"交易超過區塊gas limit"。以下例子是來自于以太坊StackExhcange的帖子。目前區塊的gas limit是 4,712,357 gas,數據來自于ethstats.net,這表示著大約224筆轉賬交易(gas limit為21000)可以被塞進一個區塊(區塊時間大約在15-20秒間波動)。這個協議允許每個區塊的礦工調整區塊gas limit,任意加減 1/2024(0.0976%)。
表1: 以太坊智能合約指令GAS價格
圖3: 以太坊GAS和ETH之間價格匯率
奇葩的ETH和GAS雙重機制
在同一個系統中為何要維持兩套token機制,這本身就很令人困惑,對于一些初學者常看到以下錯誤:
“您的交易中出現的gas與您的交易之間存在差異,沒有足夠高的費用來支持交易(out of gas)”。
gas和ETH是以太坊中兩種不同的計量單位,把它分開的目的是為了避免以太幣的價格波動進而影響gas價格的變化。從比特幣簡單明了的手續費浮動機制看,以太坊的gas交易費機制簡直就是在做無用功。
從經濟學的角度看,稀缺是價值的另一種說法。公有鏈的區塊空間是稀缺資源,使用必須付費。如果區塊鏈交易不付手續費,就會很快地被垃圾交易填滿。比特幣區塊空間滿了,手續費上升,滿而不堵。而ETH漲價,而讓交易者、礦工和智能合約設計者共同決定gas price,以達到穩定gas cost的價格,這種多余的設計似乎并不能改變用的人多了,要么擁堵要么交易費漲價的必然趨勢。
穩定gas cost的目的并沒達到,多余的設計倒是帶來了副作用。Gas price的價格可以由交易者、智能合約設計者、礦工三方分別設定,相對于比特幣手續費由交易者設定,礦工選擇高價打包的簡單模式。過于復雜,而使gas price的市場調節機制失靈。Status ICO的火爆,引爆了以太區塊鏈的一個漏洞。status的智能交易設定了手續費限制,大于50Gwei就會被彈回(rejected),因此,大量的投資者設定固定手續費不停的刷,18.1ETH,18.9ETH,18.8ETH這樣不停的投注,使以太網絡中充滿了大量的無效交易。造成了以太坊網絡堵而不滿的現象,正常交易無法被打包。就類似現在的房地產,政府限制開發商的備案價,不走關系根本搶不到房。智障合約的設計者充當了政府限價的角色。
另外,status設定了ICO開始和結束的區塊高度,由于投資者時間不可能準確到毫秒級,很多提前和滯后的交易也被彈回,也制造了不少垃圾交易。
從這個案例可以看出,智能合約設定者,作為市場的規則設定方。攪亂了交易費市場供給和需求的自動調節機制,這是以太類可編程區塊鏈的固有缺陷。你不知道下一個智能合約會設計出什么規則,又攪亂支付層的穩定性。越火爆參與的人越多,以太區塊鏈越脆弱。
還有去年可笑的漏洞事件,以太坊區塊鏈居然會被DDOS攻擊,去中心化的比特幣從來和DDOS攻擊沒有交集。最近,ETH暴漲掩蓋了以太去年出過的致命漏洞。2016年10月,黑客運行了一個智能合約DOS,調用了EXTCODESIZE 操作碼,使gas price的價格極低,攻擊交易調用此操作碼的頻率大約是50000次每區塊,使以太網絡的確認時間變長。為了防止硬分叉,以太坊采用了限制gas limited數量的臨時措施。一種治標不治本的措施。
以太坊純粹是將一個簡單地事情復雜化!
曌鏈MIT的全新智能合約代幣消耗機制
不同于以太坊智能合約中使用消耗GAS的復雜計算機制,MIT區塊鏈采用一種全新的解決方案,即錨定一個基本穩定的參照物比如USDT作為計算智能合約中代碼執行成本計算的方式,即定義每個指令的執行成本以法幣計,消耗代幣的數量=指令成本 ×指令數量 ×代幣市場價格,避免了的以太坊設計兩套ETH和GAS機制的復雜方案。
例如執行一個指令成本定義為0.00001個USDT,一個簡單智能合約代碼腳本中含有1000條指令,當前市場MIT對匯率價格是1個MIT對10個USDT,那么整個智能合約執行共需要:0.00001×1000×10=0.1USDT,約合0.01MIT,如果市場波動劇烈變為1個MIT對0.001USDT,執行同樣的智能合約對應的USDT幣成本不變,但是需要支付的MIT數量變為100個MIT(在實際執行中系統會給出當前腳本所需MIT數量,而且我們按1.2倍來建議用戶填寫代碼消耗成本防止token不夠而被強制終止運行)。
表2: MIT區塊鏈智能合約指令價格
對于想提升智能合約優先級的用戶,我們直接提供另外的一個變量transPriority,缺省值是0,可以填入任意正整數的MIT代幣來提高該合約的優先級。
聯系方式:
網址: mit.club
曌鏈MIT公眾號QR碼:
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。