gas 是什么?

gas 是以太坊(Ethereum)的计量单位, 用以计算以太链上一个或一些动作所花费的工作量.
以太链上的任意交易或者智能合约的每一个操作都是需要消耗gas的, 需要耗费多计算量的操作肯定比耗费少计算量的操作所消耗的gas多 .

划重点:

  1. gas 是计算手续费的一种方法
  2. gas 是计量工作量的, 手续费是以Ether给付的.
  3. gasCost = gasPrice * gasUsed: gasCost为一个操作所需给付的手续费, gasUsed是这个操作所消耗的工作量, gasPrice为每个工作量的价格. 打个比方: 一个家政人员的每小时价格(gasPrice), 乘以其总共工作时间(gasUsed), 就是此次家政服务总共应付工资.
  4. 以太链上优先处理高gasPrice的操作, 如果你的价格太低了, 是没有人为你工作的, 你的交易可能永远不会被处理
  5. 不管你价格的高低, 如果你提交的交易所消耗的工作量超出预算了, 这笔交易会失败, 但是这笔交易还是会被提交到链上, 而且你给付的手续费是要不回来的, 因为矿工已经为你付出了工作量!
  6. gas确保了没有任何东西可以一直在运行着, 人们会仔细思考自己的代码, 确保其正常及正确的运行. 这也保证了矿工和用户不收恶劣代码的影响.

下面我们来验证下gas的计算:

一个普通Transaction

我们通过一个普通的交易来验证下gas的消耗 (测试环境是基于之前的 搭建私有链(Private Chain)并进行挖矿和交易) )

  1. 前期准备两个账户信息如下

    1
    2
    3
    4
    > eth.getBalance('0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f')
    210000000000000000000
    > eth.getBalance('0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562')
    0
  2. 产生交易
    账户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
  3. 转账后的账户余额:

    1
    2
    3
    4
    > eth.getBalance('0x8b323a1fada35f1a4d770f49d572e4f6f194cf3f')
    209999621999999999995
    > eth.getBalance('0xbf262a0eb1b105c06d6dfafcdecfd4ff8e037562')
    5
  4. 交易细节

    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
    }
  5. 计算交易手续费:
    通过转账前后账户的余额对比, 账户1在转账后, 除了转出了5Wei, 还有一部分差额:
    (210000000000000000000 - 209999621999999999995) - (5 - 0) = 378000000000000, 这里的差额378000000000000就是手续费.

    再通过从上面的交易详情, 我们可以看到gasUsed为21000, gasPrice为18000000000, 那么gasCost为: 21000 * 18000000000 = 378000000000000.

    OK, 验证完成, 数字上完全匹配:

    1
    gasCost = 账户1的减少资产 - 账户2的增加资产 = gasUsed * gasPrice

参考

  1. https://ethereum.stackexchange.com/questions/3/what-is-meant-by-the-term-gas
  2. https://www.cryptocompare.com/coins/guides/what-is-the-gas-in-ethereum/
  3. http://news.91.com/all/s594b1ce56e4c.html
  4. https://bitshuo.com/topic/58cb86e80a3de8932e6f7591
  5. https://zhuanlan.zhihu.com/p/26875541