gaslimit以太坊設置
A. 以太坊GasLimit的計算方法
以太坊黃皮書上說的gasLimit的計算方法:
gasLimit = Gtransaction + Gtxdatanonzero × dataByteLength
需要注意的是這只是靜態的gas消耗,實際gas消耗還需要加上合約執行的開銷。
計算 IntrinsicGas的源碼位置 core/state_transition.go
相關源碼位置:internal/ethapi/api.go
EstimateGas 採用二分查找法獲取要評估交易的gas值。二分查找的下限是 param.TxGas , 如果 args 參數指定 Gas 大於 param.Gas ,那麼二分查找的上限就是 args.Gas ,否則以當前pending塊的block gas limit(後面簡稱BGL)作為二分查找的上限。 doCall 函數模擬智能合約的執行,經過多次嘗試找到智能合約能夠成功運行的最佳gas值。
由於二分查找的上限和BGL有關,而BGL和不是固定不變的,因此每次gas評估的結果不一定都是相同的,可能每個區塊周期就會變動一次。
在實際進行gas評估的時候,可能會出現類似下面的錯誤
該錯誤出現的最可能是合約執行中出錯。
How do you calculate gas limit for transaction with data in Ethereum?
B. 以太坊gas limit什麼意思
一、智能合約這么好,可不是白用的
智能合約,顧名思義,是指計算機代碼可以自動執行的合同;以太坊虛擬機是用來執行智能合約的;智能賬戶是智能合約能夠被執行的載體。換句話說,智能賬戶,這個「賬戶」是可以被以太坊虛擬機操控的,依據什麼操控呢,依據智能合約來操控。
天下沒有免費的午餐,智能合約這個功能這么好,可不是白用的,你在以太坊進行交易的時候也要付給礦工手續費的,那麼在以太坊系統上,你要付出的手續費是怎麼回事,
Gas和手續費之間又有什麼關聯呢?
二、以太坊 Gas 是怎麼回事?
以太坊Gas類似於汽車燃油,智能合約的驅動,需要以太坊Gas。Gas是一個英文單詞,中文意思是:瓦斯、汽油,這個東西在日常生活中,是一種消耗品。以太坊為什麼會產生「燃料」呢?
以太坊裡面的Gas是什麼意思呢?其實,以太坊的Gas和交易費息息相關。以太坊交易需要手續費,這個Gas就是以太坊手續費的計算模式。
在以太坊的設定中,交易費類似於一種加密的燃料,也就是Gas,這個東西可以驅動智能合約的運動。當以太坊在區塊鏈上執行交易時,燃料將按照特點的規則而逐漸被消耗。
從這一點看呢,Gas真的是和它的本意一樣,像汽車燃油一樣,想要發動汽車,必須需要燃油。
三、以太坊 Gas 和比特幣交易費有哪不同?
說到手續費,大家可能很熟悉。天下沒有免費的午餐,無論是以太坊,還是比特幣,都需要手續費,但是二者的手續費模式是不一樣的。比特幣是直接支付比特幣作為轉賬手續費的,以太坊卻不是這樣的。
以太坊本質上是一個虛擬機,這個虛擬機是去中心化的,全世界各國人民各自掌控的虛擬機,聯合起來形成一個「世界級的計算網路」。當你發送token,執行合約、轉移以太坊,或者在區塊上做其他事情時,計算機在處理這筆交易時,需要進行計算,這個計算過程需要消耗網路資源。這樣一來,你必須支付「燃料費」(也就是Gas),才能讓計算機為你工作,讓礦工為你處理交易。
通常情況下,發送方願意支付的Gas價格越高,礦工從交易中獲得的價值就越大,礦工們也就越有可能選擇這個交易。通過這種方式,礦工可以自由地選擇交易。為了給發送者設置Gas 價格做參考,礦工們可以直接提出他們執行交易所需的最低Gas 價格。
四、以太坊 Gas 的消耗量該如何計算?
以太坊虛擬機處理交易時,虛擬機會根據交易中確定的一個一個的操作指令進行逐個處理,而每個操作指令都有明文規定的Gas消耗量。
以太坊系統規定了兩個賬戶:一個是正常賬戶,一個是智能賬戶。
普通的轉賬交易,也就是調用「正常賬戶」,所需要的Gas是固定的21000;
而調用「智能賬戶」的的話,因為智能合約的復雜程度不同,使得所需要的Gas也不同。處理交易佔用的資源(計算量、內存等)越多,那麼所需要的Gas也就越多,比如:執行一次加法運算將消耗 3Gas,如果執行更復雜的運算,那麼消耗的Gas就更多。
那麼大家可能會問一個問題:當用戶的交易涉及一個惡意的智能合約,這個合約超級復雜,執行這個合約要消耗無限的燃料,怎麼辦呢?以太坊系統的方案是:為了避免惡意
智能合約引起無限的Gas消耗,用戶需要在發送交易時設定允許消耗的燃料上限,即
GasLimit,這樣一來,就算有惡意智能合約,最壞情況也只是消耗 GasLimit 所規定的燃料范圍之內。
五、以太坊 Gas 和交易手續費有什麼關系?
以太坊上,你所支付的手續費等於:GasPrice 乘以GasUsed。
你可以把 GasPrice 理解為是燃油單價, GasUsed 理解為汽車所需多少升燃油。
對於汽車,假如說每升汽油是20塊錢,一萬升汽油就是20萬塊錢。對於以太坊,每
Gas是20吉偉(吉偉是以太幣的數量單位),一萬個 Gas 就是:20乘以一萬,等於20 萬吉偉,2萬吉偉等於0.0002以太坊,也就是說,本次交易手續為 0.0002以太坊。
具體的兌換值見下表:
圖
(注釋:以太幣數量的基礎單位是「偉」,以太幣的數量單位有「偉、芬尼、以太」,其中,「以太」被用作普通交易;「芬尼」被用作微交易;「薩博」和「偉」被用作進行關於費用和合約實施。)由此我們可以發現,Gas並不是以太坊,它是一種單獨的體系,它的匯率與以太坊成一定的比例,經過了比例兌換,最終形成交易費。
具體的匯率查詢,可以查看以下網站:
https://jin10086.github.io/etherconVerter/
Gas價格和以太幣價格都是由市場自由調節的,但是二者是不一樣的,他們的不同之處在於:以太幣的價格是根據市場情況波動,而Gas的價格由礦工決定的,如果燃料價格低於礦工們的最低要求,礦工就會拒絕處理交易。Gas和以太坊分離,可以保護系統免受隨著以太坊價格的快速變化而可能出現的波動。
通常來講,大部分礦工都會選擇利益優先,處理交易時候,他們會按Gas價格從高到底排列,優先處理Gas價格高的,如果你很著急交易 ,就需要提高Gas價格,讓礦工早點看到你;如果你不著急呢,你只需要設定一個Gas價格,這個價格在礦工設置的Gas價格底線之上就行了。
六、Gas 是怎麼獲取的呢?
實際上,Gas就是從礦工那裡購買的以太幣,用戶自己賬戶中的以太幣就可以向礦工購買Gas,以太坊客戶端根據指定的交易最大支出限額,自動用以太坊購買Gas。
七、Gas 最後去了哪裡?
每筆交易,交易發起方都要設置交易的Gas限定和 Gas價格,不同的操作會產生不同的Gas成本,Gas用完時礦工將停止執行,使用的Gas會作為獎勵,獎勵給挖礦的礦工,這將涉及到幾下幾種情況:
第一種情況是,如果有剩餘Gas,那麼這些剩餘的Gas會退還給交易發起方或智能合約創建者,比如我發送1個以太坊給依依,我設置的 Gas limit 是 5萬,正常需要消耗的Gas是21000,,那麼,剩下沒有被消耗的29000會返還給我。
第二種情況是,如果我設置的Gas limit太低,或者我賬號中的以太坊不足以支付我的Gas消耗,那麼,這筆交易會因為Gas不足而被取消,並且用於計算的Gas不會退回到我的賬戶。
第三種情況是,如果交易失敗,我也必須為已經佔用的計算資源來支付手續費。
八、怎麼設置合理的 Gas 價格?
每次交易之前,可以查詢這個網站來確認需要設置的Gas價格: https://ethGasstation.info/總結一下,這篇文章我們主要介紹了以太坊的Gas和手續費:Gas相當於燃油,你在以太坊虛擬機上處理交易,會消耗計算資源,也就是Gas。在以太坊上,你所支付的手續費等於:GasPrice 乘以GasUsed,也就是:Gas的單價乘以消耗掉的Gas總量。操作的復雜程度不同,產生的Gas成本也不同,Gas用完時,礦工將停止執行,使用的Gas會作為獎勵,獎勵給挖礦的礦工,礦工會優先選擇Gas價格出的高的交易者。
C. 【ETH錢包開發03】web3j轉賬ETH
在之前的文章中,講解了創建、導出、導入錢包。
【ETH錢包開發01】創建、導出錢包
【ETH錢包開發02】導入錢包
本文主要講解以太坊轉賬相關的一些知識。交易分為ETH轉賬和ERC-20 Token轉賬,本篇先講一下ETH轉賬。
1、解鎖賬戶發起交易。錢包keyStore文件保存在geth節點上,用戶發起交易需要解鎖賬戶,適用於中心化的交易所。
2、錢包文件離線簽名發起交易。錢包keyStore文件保存在本地,用戶使用密碼+keystore的方式做離線交易簽名來發起交易,適用於dapp,比如錢包。
本文主要講一下第二種方式,也就是錢包離線簽名轉賬的方式。
交易流程
1、通過keystore載入轉賬所需的憑證Credentials
2、創建一筆交易RawTransaction
3、使用Credentials對象對交易簽名
4、發起交易
注意以下幾點:
1、Credentials
這里,我是通過獲取私鑰的方式來載入 Credentials
還有另外一種方式,通過密碼+錢包文件keystore方式來載入 Credentials
2、nonce
nonce是指發起交易的賬戶下的交易筆數,每一個賬戶nonce都是從0開始,當nonce為0的交易處理完之後,才會處理nonce為1的交易,並依次加1的交易才會被處理。
可以通過 eth_gettransactioncount 獲取nonce
3、gasPrice和gasLimit
交易手續費由gasPrice 和gasLimit來決定,實際花費的交易手續費是 gasUsed * gasPrice 。所有這兩個值你可以自定義,也可以使用系統參數獲取當前兩個值
關於 gas ,你可以參考我之前的一篇文章。
以太坊(ETH)GAS詳解
gasPrice和gasLimit影響的是轉賬的速度,如果gas過低,礦工會最後才打包你的交易。在app中,通常給定一個默認值,並且允許用戶自己選擇手續費。
如果不需要自定義的話,還有一種方式來獲取。獲取以太坊網路最新一筆交易的 gasPrice ,轉賬的話, gasLimit 一般設置為21000就可以了。
Web3j還提供另外一種簡單的方式來轉賬以太幣,這種方式的好處是不需要管理nonce,不需要設置gasPrice和gasLimit,會自動獲取最新一筆交易的gasPrice,gasLimit 為21000(轉賬一般設置成這個值就夠用了)。
這個問題,我想是很多朋友所關心的吧。但是到目前為止,我還沒有看到有講解這方面的博客。
之前問過一些朋友,他們說可以通過區塊號、區塊哈希來判斷,也可以通過Receipt日誌來判斷。但是經過我的一番嘗試,只有 BlockHash 是可行的,在web3j中根據 blocknumber 和 transactionReceipt 都會報空指針異常。
原因大致是這樣的:在發起一筆交易之後,會返回 txHash ,然後我們可以根據這個 txHash 去查詢這筆交易相關的信息。但是剛發起交易的時候,由於手續費問題或者乙太網絡擁堵問題,會導致你的這筆交易還沒有被礦工打包進區塊,因此一開始是查不到的,通常需要幾十秒甚至更長的時間才能獲取到結果。我目前的解決方案是輪詢的去刷 BlockHash ,一開始的時候 BlockHash 的值為0x00000000000,等到打包成功的時候就不再是0了。
這里我使用的是rxjava的方式去輪詢刷的,5s刷新一次。
正常情況下,幾十秒內就可以獲取到區塊信息了。
區塊確認數=當前區塊高度-交易被打包時的區塊高度。
D. 浜嗚В浠ュお鍧婁腑鐨 Gas 浠ュ強濡備綍浼樺寲鏅鴻兘鍚堢害
浠ュお鍧婏細鏅鴻兘鍚堢害鐨勭噧鏂欎笌浼樺寲絳栫暐
1. 寮曡█</
浠ュお鍧婏紝鍖哄潡閾懼壋鏂扮殑鐏濉旓紝鍑鍊熷叾鏅鴻兘鍚堢害鐨勫姏閲忥紝瀹炵幇浜嗚嚜鍔ㄥ寲浠誨姟鐨勬墽琛岋紝鐘瑰傝秴綰ц嫳闆勮埇瀹堟姢鐫鍘諱腑蹇冨寲鐨勬暟瀛椾笘鐣屻傚叾涓鐨勬牳蹇冨厓緔犫斺攇as錛屾槸浜ゆ槗鍏騫沖拰緗戠粶瀹夊叏鐨勪繚闅滄満鍒訛紝瀹冨湪鏅鴻兘鍚堢害鐨勮垶鍙頒笂鎵婕旂潃鑷沖叧閲嶈佺殑瑙掕壊銆
2. 鐞嗚ВGas</
鍦ㄤ互澶鍧婄殑浜ゆ槗涓錛実as灝卞儚琛楁満娓告垙涓鐨勪唬甯侊紝鏄鏈夐檺鐨勮祫婧愩傚畠鏄浜ゆ槗榪囩▼涓璁$畻鑳藉姏鐨勮閲忓崟浣嶏紝浠ETH錛圙wei鍗曚綅錛夊畾浠楓傚湪綣佸繖鐨勭綉緇滀腑錛実as闇奼傛縺澧烇紝絝炰簤璁$畻璧勬簮錛屼氦鏄撴垚鏈涔熼殢涔嬩笂娑ㄣ
3. 鏅鴻兘鍚堢害涓鐨凣as綆$悊</
鏅鴻兘鍚堢害涓鐨勬瘡涓涓鎿嶄綔錛屾棤璁烘槸璇誨彇銆佺畻鏈榪愮畻榪樻槸瀛樺偍錛岄兘鏈夊叾鐗瑰畾鐨刧as娑堣椼備氦鏄撳墠錛屽紑鍙戣呴渶瑕佸噯紜浼扮畻gas limit錛屽惁鍒欎竴鏃﹁秴鍑猴紝浜ゆ槗灝嗗洜鈥滄皵浣撲笉瓚斥濊屽け璐ワ紝灝卞儚椹鵑┒鏃舵湭棰勪及娌歸噺涓鏍峰叧閿銆
4. Gas鎴愭湰浼扮畻涓庡疄璺</ 鎯寵薄gas鎴愭湰涓哄叕璺鏃呰岀殑奼芥補錛屽埄鐢‥therscan銆丮etaMask絳夊伐鍏瘋繘琛屼及綆楋紝鎴栬呴氳繃web3.js鐨"estimateGas"鍑芥暟榪涜岀簿紜璁$畻銆備及綆楀彧鏄鎻愪緵涓涓澶ц嚧鐨勫弬鑰冿紝瀹為檯璐圭敤闇涔樹互褰撴椂鐨刧as浠鋒牸錛岀姽濡傚ぉ姘旈勬姤錛岄渶瑕佹彁鍓嶅仛濂藉噯澶囥 5. 鏅鴻兘鍚堢害浼樺寲縐樼睄</ 鎺㈢儲楂樻晥鍚堢害鐨勫ゥ縐橈紝浠ヤ笅鏄涓浜涘疄鐢ㄥ緩璁錛 鍊熷姪EthGasStation銆丟asNow絳夊伐鍏鳳紝浠ュ強Remix IDE銆乀ruffle Suite絳夊垎鏋愬櫒錛岃╀紭鍖栬繃紼嬫洿涓虹簿鍑嗐 浠ユ姇紲ㄥ悎綰︿負渚嬶細
楂樻晥鎶曠エ緋葷粺</
contract Voting {
mapping(address => bool) hasVoted;
uint256 totalVotes;
function vote() public {
require(!hasVoted[msg.sender], "You've already cast your vote!");
// 綆媧佺殑鎶曠エ閫昏緫
hasVoted[msg.sender] = true;
// 浼樺寲瀛樺偍鍜岃皟鐢ㄦ搷浣
}
鎬葷粨</
娣卞叆鐞嗚Вgas鍦ㄤ互澶鍧婁腑鐨勮繍琛屾満鍒訛紝鎺屾彙鏅鴻兘鍚堢害鐨刧as鎴愭湰浼扮畻錛屾槸瀹炵幇楂樻晥浜ゆ槗鐨勫叧閿銆傞氳繃浼樺寲瀛樺偍鍜岀畻娉曪紝鍙浠ユ樉钁楅檷浣巊as娑堣楋紝紜淇濆悎綰︾殑欏虹晠榪愯屻
榪涗竴姝ユ帰緔</
- 浠ュお鍧婄櫧鐨涔 - 娣卞叆鐮旂┒鍗忚鍘熺悊
- 浠ュお鍧婇粍鐨涔 - 璇︾粏浜嗚В鎶鏈緇嗚妭
- 瀹炴椂gas浠鋒牸 - 鏃跺埢鎺屾彙鎴愭湰鍔ㄦ
- Solidity鏂囨。 - 鏅鴻兘鍚堢害緙栧啓鎸囧崡
- Etherscan - 鏌ヨ浜ゆ槗淇℃伅
- Ethereum StackExchange - 瑙g瓟鐤戞儜涓庝氦嫻佸績寰
E. 以太坊轉賬,礦工費怎麼設置更省錢現在有什麼幣可以買的
1、以太坊轉賬的礦工費由「實際消耗的 Gas 數量」與「Gas Price」的乘積所得,前者是系統事先規定好的,後者我們可以自己調整從而減少不必要的礦工費開支。
2、調整「Gas Price」時,可以參考錢包給的推薦值,也可以參考實時性、准確性更強的 Gas Now 網址
3、另外,如果涉及更加復雜的操作,還需要調整 Gas Limit 的數值,以防止活還沒幹完就把 Gas 消耗完了的情況出現。
目前我比較看好的是eCell幣,eCell是通過以太坊網路智能合約實現的ERC20代幣(celletf.io),採用區塊鏈技術,鏈上的所有交易過程都需要網路中的各個節點的認可,整個過程都是透明公開的。
F. 以太坊的gas費被誰賺了
gas主要是被消耗了,收益比較少。
Gas費的組成主要有以下幾個要素:GasFeeCap、GasPremium、GasLimit、GasUsed、BaseFee。
GasLimit是消耗資源的最大限制,GasFeeCap是用戶所能支付給礦工的最大單價限額。在Filecoin鏈上,在打包前要檢查賬戶是否有足夠的余額,不然交易不會被打包。所以GasLimit和GasFeeCap可以得到用戶的最高能支付的費用,是用戶自主設置的。但要注意的是,GasLimit不要隨意設置,多餘的GasLimit會被燃燒一部分,這是和ETHGas費機制最大的不同點。
BaseFee相當於一個基礎價位,同樣用汽車燃料費來看,可以理解為政府根據整個市場的交易情況設置了一個油價,這個價位會浮動,因此這里起到的類似於一個宏觀調控的作用。同樣也可以比喻為計程車的起步價,如果用戶不願意支付起步價,司機就不願意載人,因此如果用戶想要乘車就必須接受起步價,而這個起步價在FilecoinGas費中就是BaseFee。當然在Filecoin中這個起步價是動態的,當總GasLimit超過某個區塊(網路擁塞信號)的GasLimit目標時,它將增加;低於GasLimit目標時將降低。換句話說,在區塊擁堵或者區塊交易不夠的情況下,BaseFee都會按照12.5%進行相應的調節。
GasPremium在這個機制里被描述為小費,即在網路擁堵的情況下支付給礦工的小費,這個也意味著礦工有優先選擇權。如果你支付了GasPremium,礦工就會優先打包你區塊的數據。最終給到礦工的酬勞是小費(GasPremium)*最大消耗量(GasLimit)
G. gasfee什麼意思
礦工殲敏費
礦工費(GasFee)就是支付給礦工的手續費,簡脊當你在以太坊區塊鏈上進行轉賬時,礦工要把你的交易打包並放上區塊鏈,才能使交易完成,在這過程中會消耗區塊鏈的運算資源,所以要氏咐枝支付費用。GasFee由GasLimit(限制)和GasPrice(價格)相乘得到。不同時期、不同的操作gaslimit默認值不同,而在執行操作時可以自行設置GasLimit。需要注意的是,完成一筆交易所需的Gas單位數量,取決於交易的復雜程度。當一筆交易越復雜,就必須要耗費較多的運算資源,因此需要花費較多Gas。