交易的过程一般需要支付一定量的手续费。矿工会优先打包交易手续费高的交易,如果没有支付交易手续费,你的交易可能要等很久才会被打包。创建一笔交易的时候不需要显式的指明支付多少交易手续费,它是根据你的 UTXO 额 - 交易额 - 找零 来计算的。

举例,A 有一个 10 BTC 的 UTXO (未花费的交易输出)的支配权,给 B 账户转 1 BTC,那么在创建交易的时候,需要指明交易额 1 BTC,和找零 8.995,那么(10-8.995-1 = 0.005)就是这笔交易的手续费,会奖励给打包包含这笔交易的区块的矿工,如果没有设置找零那么多余的 9 BTC 都会被当作交易手续费奖励给矿工,虽然你的交易会很快的被打包,但是这可能不是你想要的……另外,比特币没有智能合约的功能。

什么是 gas ,什么是 gas price 以及 data?

在以太坊上,发送代币或调用智能合约,在区块链上执行写入操作,需要支付矿工计算费用,计费是按照 gas 计算的,gas 使用 ETH 来支付。无论你的调用的方法是成功还是失败,都需要支付计算费用。即使失败,矿工也验证并执行你的交易(计算),因此必须和成功交易一样支付矿工费。

一笔转账需要花费矿工费 cost = gas Price × gas Limit,一笔标准的转账需要花费 21000 gas 和 0.00000002 ETH gas price,所以总的矿工费是 0.00042 Ether。通常情况下,如果有人只说 gas,指的就是 gas limit,gas limit 相当于汽车需要加多少汽油,gas price 相当于每升汽油的价格。

gas limit 之所以称为限额,因为它是你愿意在一笔交易中花费 gas 的最大数量。交易所需的 gas 是通过调用智能合约执行多少代码来定义。 如果你不想花太多的 gas,通过降低 gas limit 将不会有太大的帮助。 因为你必须包括足够的 gas 来支付的计算资源,否则由于 gas 不够报错 out of gas。所有未使用的 gas 将在转账结束时退还。

所以使用钱包打款,发送 1 ETH,并设置 gas limit 为 40 万,转账结束后你会收到 400000 - 21000 gas 退还。 但是,如果你发送 1 个 ETH 到智能合约中,智能合约调用失败,整个 40 万 gas 全部使用,不会退还。21000 是标准转账的 gas limit。

通过降低 gas price 可以节省矿工费用,但是也会减慢矿工打包的速度。矿工会优先打包 gas price。设置高的交易,如果你想加快转账,你可以把 gas price 设置得更高,这样你就可以排队靠前。如果不急,你只需要设置一个安全的 gas price,矿工也会打包你的交易查看矿工可以接受的最低 gas price : http://ethgasstation.info/

Data 是可选项,用来调用合约。你需要把对应字符串转换成 16 进制,工具:http://string-functions.com/string-hex.aspx,填入十六进制数据(0x 开头)比如 makoshan 转换成 16 进制是 0x6d616b6f7368616e

gas price 通常是 20 Gwei,填写 gas 200000,多余的会退回。

gas Limit 是由交易(或者是执行合约代码)的计算量来决定的,戳这里可以查看每一种操作所需要消耗的 gas 量,或者看下面这个简表

step    1    Default amount of gas to pay for an execution cycle.
stop     0    Nothing paid for the SUICIDE operation.
sha3     20     Paid for a SHA3 operation.
sload     20     Paid for a SLOAD operation.
sstore     100     Paid for a normal SSTORE operation (doubled or waived sometimes).
balance     20     Paid for a BALANCE operation
create     100     Paid for a CREATE operation
call     20     Paid for a CALL operation.
memory     1    Paid for every additional word when expanding memory
txdata     5     Paid for every byte of data or code for a transaction
transaction     500     Paid for every transaction

这样可以鼓励更加高效的合约代码,减少不必要的计算,避免系统遭受攻击,毕竟攻击者要为他们消耗的资源付出一定的代价,包括带宽、CPU、存储。

gas Price 是由交易的发起者来设置的,但是矿工可以选择先打包那些 gas 价格高的交易,gas 价格低的可能要等很久或者不会被打包。

例如一笔交易:{ from:web3.eth.accounts[0], data:tokenCompiled.token.code, gas: 1000000 },gas 参数设置这个交易最多能使用多少 gas。交易里面还可以再加一个参数 gasPrice,gasPrice 可以自己设置,具体设置戳这里,Geth 会默认设置一个大多数矿工可以接受的 gasPrice, 0.05e12 wei (当然这个值不是一直不变的,价格的演化可以戳这里),可以调 eth.gasPrice 来查看当前的 gasPrice。

矿工在启动 Geth 的时候可以设置两个参数 --ask 和 --bid,--ask 是设置一个最低的 gas 价格,低于这个价格的交易会被忽略,默认值是 500000000000,--bid 设置 gas 价格竞价,默认值是 500000000000。

所以 gasPrice 还是受整个市场的供求关系,即矿工和交易(合约也是一种交易)发起者的博弈去调控。

gas 和 Ether 有什么关系?

gas 和 Ether 是以太坊中两种不同的计量单位,把它分开的目的是为了避免以太币的价格波动进而影响 gas 价格的变化。