交易獎勵(交易中的Gas消耗)
以太坊的EVM是“圖靈完備”的梗掰,為了防止出現(xiàn)死循環(huán)而導(dǎo)致服務(wù)不可用,所以引入了Gas
嗅回。在程序的執(zhí)行過程中及穗,需要消耗Gas
.Gas
消耗完了,程序就不會繼續(xù)運行绵载。同時埂陆,以太坊還給每個區(qū)塊包含的程序消耗的總Gas設(shè)定了上限(Gas Limit
)苛白,以免區(qū)塊中包含的程序過多,影響一些性能比較弱的節(jié)點焚虱。每個區(qū)塊能消耗的Gas上限也是可以調(diào)整的购裙,由礦工們進行投票決定,目前是6725538Gas鹃栽。
每筆交易中花費的Gas
可以通過以下公式計算:
Gas = GasUsed * GasPrice
使用web3.js
實現(xiàn)
async function getGas(){
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));//初始化web3
var txhash = "0x0d34221ebb8ce885d7f1c56170f4bec8d9d9b7bc0bb2273580785ee02a3b2fd4";//交易hash
txResult = await web3.eth.getTransaction("txhash"); //獲取交易信息
txReceipt = await web3.eth.getTransactionReceipt("txhash");//獲取交易的`TransactionReceipt`
fee = (txReceipt.gasUsed)* (txResult.gasPrice); //獲取交易費
fee = web3.utils.fromWei(fee.toString());//將交易費的單位從`Wei`轉(zhuǎn)為`Ether`
return feel;
}
若是獲取一個區(qū)塊中消耗的交易費躏率,只要沒筆交易費,再乘上交易數(shù)量就可以了:
GasInBlock = GasUsed * GasPrice * Txsnum
async function getGasInBlock(){
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));//初始化web3
var TxsFee = 0;
var height = 2;//區(qū)塊高度
for(var i=0;i<txnum;i++){
txResult = await web3.eth.getTransactionFromBlock(height,i);
txReceipt = await web3.eth.getTransactionReceipt(txResult.hash);
fee = (txReceipt.gasUsed)* (txResult.gasPrice);
fee = web3.utils.fromWei(fee.toString());
TxsFee += parseFloat(fee);
}
return TxsFee;
}
區(qū)塊獎勵&數(shù)塊獎勵
以太坊創(chuàng)造了一個新的名詞叔塊(Uncle Block),不能成為主鏈一部分的孤兒區(qū)塊民鼓,如果有幸被后來的區(qū)塊通過uncles字段收留進區(qū)塊鏈就變成了叔塊禾锤。如果一個孤兒區(qū)塊沒有被任何區(qū)塊收留,這個孤兒區(qū)塊還是會被丟棄摹察,不會進入?yún)^(qū)塊鏈恩掷,也就是說孤兒區(qū)塊被收留后才會變成叔塊
在以太坊的設(shè)計中,數(shù)塊也可以獲得獎勵供嚎,而且以后的區(qū)塊鏈如果誰收留了叔塊黄娘,收留叔塊的區(qū)塊也可以獲得額外獎勵。收留叔塊也被稱為包含叔塊克滴。
以太坊為什么要這么設(shè)計呢逼争?因為以太坊的區(qū)塊時間是20秒左右,相對于比特幣劝赔,更容易出現(xiàn)臨時分叉和孤兒區(qū)塊誓焦。而且較短的區(qū)塊時間,也使得區(qū)塊在整個網(wǎng)絡(luò)中更難以充分傳播着帽,尤其是對那些網(wǎng)速慢的礦工杂伟,這是一種極大的不公平。為了平衡各方利益仍翰,才設(shè)計了這樣一個叔塊機制赫粥。叔塊在全部挖掘出來的區(qū)塊中占的比例叫叔塊率,目前叔塊率在9.7%左右予借。
叔塊獎勵的計算公式如下:
叔塊獎勵 = (叔塊高度 + 8 - 包含叔塊的區(qū)塊的高度 * 普通區(qū)塊的獎勵/8
區(qū)塊獎勵的計算公式如下:
區(qū)塊獎勵 = 固定獎勵 + 區(qū)塊內(nèi)包含交易的交易費的總和 + 包含叔塊的獎勵
在以太坊瀏覽器上實踐區(qū)塊獎勵的計算
實踐這邊直接引用了以太坊(Ethereum ETH)的獎勵機制的介紹:
查看以太坊瀏覽器中4222300的區(qū)塊越平,由于我們是在主鏈上看到它的,所以它是普通區(qū)塊灵迫。
它的獎勵包含三部分:
- 固定獎勵:5ETH
- Gas總花費(也有人稱之為交易費):0.281837168043699381ETH
- 將兩個叔塊包含進來的獎勵:5 * ( 1 / 32 ) * 2 = 0.3125ETH
在以太坊瀏覽器上實踐叔塊獎勵的計算
我們再來看一個叔塊0x1c2cbba0403f1079dcdb70e5971a87ce0fbc03d4572be30e2d17e4e4a0f136d5秦叛,是不是看著挺別扭,叔塊不方便用高度來表示瀑粥,因為同一個高度上已經(jīng)有了個主鏈區(qū)塊挣跋,就是這么慘。其實叔塊也是有高度的利凑,叔塊的父區(qū)塊的高度+1就是叔塊的高度浆劲。
直接代入公式:
( 4222271 + 8 - 4222272 ) * 5 / 8 = 4.375ETH
計算獎勵代碼實現(xiàn)(web3.js)
//獲取普通區(qū)塊獎勵嫌术,以太坊在4370000高度以前是5 ether,之后是3ether
function getConstReward(height) {
if (height >= 4370000) {
return 3;
}
return 5;
}
//包含一個數(shù)塊的獎勵
function getRewardForUncle(height,uncleNumber) {
var reward = getConstReward(height);
return (reward/32) * uncleNumber;
}
//獲取數(shù)塊獎勵,uHeight為數(shù)塊高度牌借,height為包含區(qū)塊高度
function getUncleReward(uHeight, height) {
var reward = getConstReward(height);
reward = (uHeight + 8 - height) * reward / 8;
return reward
}
//獲取區(qū)塊獎勵度气,TxsFee上面已經(jīng)提到如何獲得
function getBlockReward(web3,block,TxsFee) {
var reward = parseFloat(getConstReward(block.number));
reward += TxsFee;
ulen = block.uncles.length;
if(ulen >0){
reward += getRewardForUncle(block.number,ulen) ;
}
return reward;
}
這邊參考了兩篇文章:
以太坊(Ethereum ETH)的獎勵機制
以太坊的區(qū)塊獎勵
感興趣的同學(xué),可以看這兩篇文章膨报。講的挺清楚的磷籍。