gas
是以太坊(Ethereum)的计量单位, 用以计算以太链上一个或一些动作所花费的工作量.
以太链上的任意交易或者智能合约的每一个操作都是需要消耗gas的, 需要耗费多计算量的操作肯定比耗费少计算量的操作所消耗的gas多 .
划重点:
gas
是计算手续费的一种方法gas
是计量工作量的, 手续费是以Ether
给付的.gasCost = gasPrice * gasUsed
:gasCost
为一个操作所需给付的手续费,gasUsed
是这个操作所消耗的工作量,gasPrice
为每个工作量的价格. 打个比方: 一个家政人员的每小时价格(gasPrice), 乘以其总共工作时间(gasUsed), 就是此次家政服务总共应付工资.- 以太链上优先处理高
gasPrice
的操作, 如果你的价格太低了, 是没有人为你工作的, 你的交易可能永远不会被处理 - 不管你价格的高低, 如果你提交的交易所消耗的工作量超出预算了, 这笔交易会失败, 但是这笔交易还是会被提交到链上, 而且你给付的手续费是要不回来的, 因为矿工已经为你付出了工作量!
gas
确保了没有任何东西可以一直在运行着, 人们会仔细思考自己的代码, 确保其正常及正确的运行. 这也保证了矿工和用户不收恶劣代码的影响.
下面我们来验证下gas
的计算:
一个普通Transaction
我们通过一个普通的交易来验证下gas
的消耗 (测试环境是基于之前的 搭建私有链(Private Chain)并进行挖矿和交易) )
前期准备两个账户信息如下
1
2
3
4> eth.getBalance('0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f')
210000000000000000000
> eth.getBalance('0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562')
0产生交易
账户1给账户2转5Wei:1
2
3
4> eth.estimateGas({from:'0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f',to:'0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562',value: 5})
21000
> eth.sendTransaction({from:'0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f',to:'0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562',value: 5})
0x13a32a89c816879add2fa04b922dbb3b6fe50cae9ec294d7a2ba36c6e40df2b5转账后的账户余额:
1
2
3
4> eth.getBalance('0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f')
209999621999999999995
> eth.getBalance('0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562')
5交易细节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17> eth.getTransaction('0x13a32a89c816879add2fa04b922dbb3b6fe50cae9ec294d7a2ba36c6e40df2b5')
{
blockHash: "0x69dbda31332ff136942f62a4011052ce8265e8b408d9c939169d5ddc17b6b75b",
blockNumber: 198,
from: "0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f",
gas: 90000,
gasPrice: 18000000000,
hash: "0x13a32a89c816879add2fa04b922dbb3b6fe50cae9ec294d7a2ba36c6e40df2b5",
input: "0x",
nonce: 0,
r: "0x83c8ee2533f9d846667a4bcbe79016884ae4a434d747aa139cfbe2d1fb8855e8",
s: "0x5fb8995cd4fe6ea13d6b33a56d66c449bda6cfdccc5ac39d1981aab49ba34243",
to: "0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562",
transactionIndex: 0,
v: "0xb4",
value: 5
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15> eth.getTransactionReceipt('0x13a32a89c816879add2fa04b922dbb3b6fe50cae9ec294d7a2ba36c6e40df2b5')
{
blockHash: "0x69dbda31332ff136942f62a4011052ce8265e8b408d9c939169d5ddc17b6b75b",
blockNumber: 198,
contractAddress: null,
cumulativeGasUsed: 21000,
from: "0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f",
gasUsed: 21000,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
root: "0x6bf161294dff09f1da4e936d1a6b119825ab5b24532c89e645c30cb2edb5aad4",
to: "0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562",
transactionHash: "0x13a32a89c816879add2fa04b922dbb3b6fe50cae9ec294d7a2ba36c6e40df2b5",
transactionIndex: 0
}计算交易手续费:
通过转账前后账户的余额对比, 账户1在转账后, 除了转出了5Wei, 还有一部分差额:
(210000000000000000000 - 209999621999999999995) - (5 - 0) = 378000000000000
, 这里的差额378000000000000
就是手续费.再通过从上面的交易详情, 我们可以看到
gasUsed
为21000,gasPrice
为18000000000, 那么gasCost
为:21000 * 18000000000 = 378000000000000
.OK, 验证完成, 数字上完全匹配:
1
gasCost = 账户1的减少资产 - 账户2的增加资产 = gasUsed * gasPrice