以太坊在区块链上的的执行环境的实现称为以太坊虚拟机(EVM)。 参与网络的每个节点都运行EVM作为区块验证协议的一部分。 他们会检查正在验证的块中列出的交易,并运行由EVM中的事务触发的代码。 网络中的每个全节点执行相同的计算并存储相同的值。 显然,以太坊不是要优化计算效率。,因为它的并行处理是冗余的。在不需要可信的第三方,权威或暴力垄断的情况下,以太坊提供一种有效的方式来达成系统状态的共识。但是很明显,这不是最优的计算方式。合约执行是跨节点冗余复制的事实自然会使它们变得昂贵,这通常会产生不使用区块链进行离线计算的动机。0 C3 @ A- N8 r Q
当你运行一个去中心化应用(dapp)时,它会与区块链交互以读取和修改其状态,但是dapps通常只会放置对达成共识至关重要的业务逻辑和状态到区块链上。
当由于消息或事务触发而执行合约时,每个指令都在网络的每个节点上执行。 这具有一定的成本:对于每个执行的操作都有指定的成本,以一定gas单位表示。
Gas是交易发起人需要为以太坊区块链上的每项操作支付的执行费的名称。 gas这个名称的灵感来源于这种费用可以作为加密燃料,驱动智能合约的运动。 gas可以从执行代码的矿工那里购买。 由于gas单位与具有自然成本的计算单元对齐,因此gas和ether有意地解耦,而ether(以太)的价格通常是随市场波动的。 这两者是由自由市场调节的:gas的价格实际上是由矿工决定的,他们可以拒绝处理gas价格低于最低限额的交易。 你只需在你的账户中添加一定的以太币就可以获得gas。 以太坊客户端会自动为你的以太币购买gas,金额为您指定的金额,作为交易的最大支出。
根据以太坊协议,在合约或交易中执行的每个计算步骤都要收取费用,以防止在以太坊网络上的恶意攻击和滥用。每笔交易都必须包含gas limit和愿意为gas支付的费用。矿工可以选择是否打包交易和收取费用。如果由交易产生的计算步骤所使用的gas总量(gas used ),包括原始消息和可能被触发的任何子消息,小于或等于gas limit,则处理该交易。如果gas总量超过gas limit,那么所有的改变都会回退,除非交易仍然有效并且矿工接受了这个费用。交易执行中未使用的所有多余的gas将以Ether返还给交易发起人。你不必担心超支,因为你只需支付消耗的gas费用。这意味着发送高于估计值gas limit的交易是有用的,也是安全的。
估算交易成本
交易中花费的总共的ether成本取决于2个因素: B* w% t$ w, ]1 X- U E
gasUsed:是交易中消耗的总共的gas
gasPrice:在交易中指定一个单位gas的价格(ether)
总费用 = gasUsed * gasPrice2 }( z. Z" l) q8 a/ t; d7 B
gasUsed' x9 U7 W" O8 r, E4 @. }
EVM中的每个操作都指定了要消耗的gas量。 gasUsed是执行所有操作的所有gas的总和。 有一个电子表格,提供了这背后的一些分析。
为了估算gasUsed,这里有一个可以使用的estimateGas API,但有一些注意事项。
gasPrice
用户构造并签名交易时,每个用户都可以指定他们希望的任何gasPrice,它甚至可以是零。 然而,Frontier推出的以太坊客户端的默认gasPrice为0.05e12 wei。 由于矿工优化了他们的收入,如果大多数交易都是以0.05e12 wei的gas价格提交的,那么很难说服矿工接受指定较低或零的gas价格的交易。/ B' ]8 i- h" G; Z; q# r
估算交易成本的例子& m$ c5 q7 A4 b+ ^
举个例子,一个合约只是添加2个数字,EVM OPCODE ADD消耗3gas。, |3 L7 o' G" g
使用默认gas价格(截至2016年1月)的大致成本为:- ]: F5 R x. r4 W* _
3 * 0.05e12 = 1.5e11 wei5 i& p! v1 S B- O8 l
注意:gas的最小单位为wei,1ether = 10^18wei
换算成以太的话,就是0.00000015 Ether.& N1 v7 y6 B9 f) g$ h
question6 p- x$ P9 X8 ~ z5 R3 y
gas fees
gas cost calculator6 U2 E: I! H& i# q, X+ O0 P
Ethereum Gas Prices" \3 L* s' o( l0 j( A3 s7 a
step 1 default amount per execution cycle+ E# _+ M! Z- H9 Y7 \. ] I3 h7 \
stop 0 free
suicide 0 free! m$ {- Z1 B8 g' `% {3 f
sha3 20 ; C6 K. r& {* f( Q6 [0 {" \% ]
sload 20 get from permanent storage: T) m& w" d( Z! D
sstore 100 put into permanent storage9 j1 ^) W- V a* v4 e
balance 20 o6 a$ S- u" p( ]
create 100 contract creation0 |1 I4 i, i! Q D# D3 }7 L1 v
call 20 initiating a read-only call
memory 1 every additional word when expanding memory
txdata 5 every byte of data or code for a transaction5 T0 X$ `8 x9 m
transaction 500 base fee transaction8 Y/ F& `+ B$ S7 N9 w
contract creation 53000 changed in homestead from 21000
成为第一个吐槽的人