以太坊中的账户、交易、Gas 和区块 Gas
来源:    发布时间: 2023-11-21 20:57   54 次浏览   大小:  16px  14px  12px
这篇文章是用来帮助人们理解以太坊网络上的一些基本概念和体系,包括账户体系、gas、矿工在区块大小设置机制里的角色等。

这篇文章是用来帮助人们理解以太坊网络上的一些基本概念和体系,包括账户体系、gas、矿工在区块大小设置机制里的角色等。

什么是账户?

外部拥有账户 vs 合约账户

以太坊中有两种账户


外部拥有账户(EOA)

合约账户

这个区别在即将到来的大都会升级中将会被抽象化,如:


外部拥有账户

一个外部拥有账户具有一下特性:


有一个以太币余额


还可以上传交易所(以太币各种转账也可以促活合同协议二维码)

通过私钥控制


无有关联关系的编号

合约账户

一个合约账户拥有一下特性:


有长个以太币余下的钱 有有关的联的二维码 编码施行是顺利通过进行交易或是任何合同规定发送信息的call来刺激启动 当被程序执行时 -- 使用在随即多样化度 (图灵完整性)-- 都可能操作使用其占有的特定的一直保存,列如 都可能占有其一直state -- 都可能call某个合同 一切以太坊板块链上的行动起来是由各银行帐户推送的买卖价格激话。老是一家合同规定银行帐户接到一家买卖价格,买卖价格自己带上的参数值一定会成了源源代码的导入值开机程序运行。合同规定源源代码会被以太坊虚似机(EVM)在每种家参入手机网络的点位上开机程序运行,以做为两者新板块的核验。

什么是交易和消息?

交易

"交易"这个术语在以太坊里被用来指代一个用来存储消息的被签名数据包在区块链上从一个外部拥有账户发送至另一个账户的过程。


转让涉及到: 这是最新消息的受到者 另一个亲笔签名,用作证明书发射者蓄意向经过区块链应用链向发收者发射消息报 价值量域 - 从发送到方移转到使用方的wei (ether/10^18) 的比例 一种自选的数据显示域,当做永久保存发给合同协议的消息提示 个GASLIMIT值,代表着了该合作的下达最小被禁止应用的核算过程 一款 GASPRICE值,主要了成交发送到者乐意付款的gas材料费。一款 行业的gas透露了审理一款 关键控制指令,譬如一款 算进行

消息

合约具有发送"消息"到其他合约的能力。消息是一个永不串行且只在以太坊执行环境中存在的虚拟对象。他们可以被理解为函数调用(function calls)。


一款 报道以及: 准确的话题发送给者 讯息的接收到者 一款可以的资料域,他是合同协议真实上的键盘输入资料 一位GASLIMIT值,常做束缚在这个消息报到达的源代码运行能用的 的最大程度gas比例 总的再说,一款 新信息就仿佛是一款 在线在线寄售,不仅它如果不是由外银行帐户提取,往往是合同银行帐户提取。当合同还在施行的编号中程序电脑运行了CALL 也就可以DELEGATECALL这俩个操作命令时,才会提取一款 新信息。新信息有的时间也被叫做"内控在线在线寄售"。与一款 在线在线寄售类似于,一款 新信息会帮助发送到的银行帐户程序电脑运行它的编号。因为,合同银行帐户就可以与别的合同银行帐户情况的关系,这些和外银行帐户似得。有大多数后会误用在线在线寄售这类词特指新信息,因而也许 新信息这类词就因为区域的精准医学而渐渐地脱离大家的眼界,已经被运用。

什么是 gas?

以太坊在区块链上实现了一个运行环境,被称为以太坊虚拟机(EVM)。每个参与到网络的节点都会运行都会运行EVM作为区块验证协议的一部分。他们会验证区块中涵盖的每个交易并在EVM中运行交易所触发的代码。每个网络中的全节点都会进行相同的计算并储存相同的值。合约执行会在所有节点中被多次重复,这个事实得使得合约执行的消耗变得昂贵,所以这也促使大家将能在链下进行的运算都不放到区块链上进行。对于每个被执行的命令都会有一个特定的消耗,用单位gas计数。每个合约可以利用的命令都会有一个相应的gas值。如这里: 列了一些命令的gas消耗。


gas和交易消耗的gas

每笔交易都被要求包括一个gas limit(有的时候被称为startGas: )和一个交易愿为单位gas支付的费用。矿工可以有选择的打包这些交易并收取这些费用。在现实中,今天所有的交易最终都是由矿工选择的,但是用户所选择支付的交易费用多少会影响到该交易被打包所需等待的时长。如果该交易由于计算,包括原始消息和一些触发的其他消息,需要使用的gas数量小于或等于所设置的gas limit,那么这个交易会被处理。如果gas总消耗超过gas limit,那么所有的操作都会被复原,但交易是成立的并且交易费任会被矿工收取。区块链会显示这笔交易完成尝试,但因为没有提供足够的gas导致所有的合约命令都被复原。所以交易里没有被使用的超量gas都会以以太币的形式打回给交易发起者。因为gas消耗一般只是一个大致估算,所以许多用户会超额支付gas来保证他们的交易会被接受。这没什么问题,因为多余的gas会被退回给你。


估算交易消耗

一个交易的交易费由两个因素组成:


gasUsed:该网上交易消费的总gas人数 gasPrice:该寄售中公司gas的价额(主要用于太币换算) 进行交易费 = gasUsed * gasPrice

gasUsed

每个EVM中的命令都被设置了相应的gas消耗值。gasUsed是所有被执行的命令的gas消耗值总和。


如何想推算gasUsed,能够 适用这款estimateGas的API:

gasPrice

一个用户可以构建和签名一笔交易,但每个用户都可以各自设置自己希望使用的gasPrice,甚至可以是0。然而,以太坊客户端的Frontier版本有一个默认的gasPrice,即0.05e12 wei。矿工为了最大化他们的收益,如果大量的交易都是使用默认gasPrice即0.05e12 wei,那么基本上就很难又矿工去接受一个低gasPrice交易,更别说0 gasPrice交易了。


交易费案例

在被允许后,我将使用这个MyEtherWallet团队的例子并借用他们的分析。请参考这里: 与gas相关的介绍。他们还有一个小页面方便大家把以太币转换成小单位的gas计数单位: 。


你以将gasLimit表达是什么只为客车邮箱的下限。时候将gasPrice表达是什么为汽油价格。

对于一辆车来说,油价可能是 2.5(价格)每升(单位)。在以太坊中,就是20GWei(价格)每gas(单位)。为了填满你的"油箱",需要10升2.5的油 = $25。同样的,21000个20 GWei的gas = 0.00042 ETH。


为此,总刷卡交易费早已是0.00042以太币。

发送代币通常需要消耗大约5万至10万的gas,所以总交易费会上升0.001至0.002个ETH。


什么是"区块gas limit"?

区块gas limit是单个区块允许的最多gas总量,以此可以用来决定单个区块中能打包多少笔交易。例如,我们有5笔交易的gas limit分别是10、20、30、40和50.如果区块gas limit是100,那么前4笔交易就能被成功打包进入这个区块。矿工有权决定将哪些交易打包入区块。所以,另一个矿工可以选择打包最后两笔交易进入这个区块(50+40),然后再将第一笔交易打包(10)。如果你尝试将一个会使用超过当前区块gas limit的交易打包,这个交易会被网络拒绝,你的以太坊客户端会反馈错误"交易超过区块gas limit"。以下例子是来自于以太坊StackExhcange的帖子: 。


近年区快链的gas limit是 4,712,357 gas,信息源于于ethstats.net: ,这数字代表着差不多224笔转帐刷卡交易(gas limit为21000)会被塞进个区快链(区快链日子差不多在15-20秒间冲击)。这点合同样本合法4个区快链的铁路工人调整区快链gas limit,任何加减 1/2024(0.0976%): 。

谁来决定

区块的gas limit是由在网络上的矿工决定的。与可调整的区块gas limit协议不同的是一个默认的挖矿策略,即大多数客户端默认最小区块gas limit为4,712,388。


区块gas limit是怎样改变的

以太坊上的矿工需要用一个挖矿软件,例如ethminer。它会连接到一个geth或者Parity以太坊客户端。Geth和Pairty都有让矿工可以更改配置的选项。这里是geth挖矿命令行选项以及Parity的选项。


以太坊网络上的"DoS"攻击是什么?

最近有些评论表示以太坊网络正在慢慢减速,变得拥堵甚至无法使用。这些评论把这个减速的过程称为对以太坊网络的"DoS"攻击。当以太坊网络上持续地出现全满区块并且有大量交易在网络上待处理时就会出现所谓的DoS情况。同时,矿工有权利根据交易费选择打包哪些交易。如果当时队列中(交易池中)有上千笔交易正在等待打包,那么就有可能造成几个小时的非正常交易延迟。DDoS可能是恶意的也有可能是非恶意的。


恶意的DoS

上个秋天,以太坊被某人或某个团体攻击了,通过大量制造垃圾交易。这次攻击在如下博客有介绍:


攻击者通过在他们的智能合约中反复的调用某些命令来让客户端难以处理这些计算,但是这些命令都只消耗少量的gas所以调用起来十分廉价。

在这次攻击中,矿工被要求降低gas limit到150万,在后来的另一次事件中更改到了200万。也有几次其他的事件要求矿工在网络被攻击时降低区块gas limit。


非恶意的DoS

非恶意的DoS其实就是当网络面临海量交易时需要比平常更多的时间来处理一笔交易。最近由于ICO的流行,以太坊网络多次被交易填满。Infura的朋友们写过一篇与此相关的技术分析文章。


为什么区块gas limit在区块被填满时不会自动调整?

主要原因:矿工们没有使用gas limit动态调整的功能。


以太坊合同范本中会存在着让铁路工人应该采用网上选票来绝对gas limit的管理体制,故区域余量不要求进行硬分叉就应该调控。原来,这是管理体制和另个个初始管理策略是绑定帐号凑在一起来的,即铁路工人初始网上选票使区域gas limit不少有4七十万,有时候取向于近来1024个区域gas选用水量的1.5倍。这会让区域余量会通过消费需求来主动提高,同时还有的也可以来防护建筑废弃垃圾的交易的控制。 好似"他人的DoS"局部说的,在有史以来上有几回煤挖矿所以功击防御的原由严禁不用非同意设有来作用降低功击防御产生的的影响。但在的事情是矿池在功击防御接下来并不存在将设有改回同意设有。有可能一月前,煤挖矿被需求优化gas limit和gas price设有来再建立gas limit动态图片进行调节作用。所以最近几天的代币售销爆火引致诸多区域被填满而且区域链购买不通。 ETH Gas Station也是个体户们能能调阅最薪区块链gas limit设制的小程序。

矿工需要做什么才能修复这个问题?

矿工可以在Geth或者Parity客户端中更改设置来重启动态gas limit调整。注意:这些设置是在这个Reddit帖子找到的,其实可以被设置的更高(参考这个帖子)。


Geth

推荐设置


--gasprice 4000000000 --targetgaslimit 4712388 表达 --targetgaslimit Target gas limit sets the artificial target gas floor for the blocks to mine (default: “4712388”) --gasprice Minimal gas price to accept for mining a transactions (default: “20000000000”). Note: gasprice is listed in wei.

Parity

推荐设置

--gas-floor-target 4712388 --gas-cap 9000000 --gasprice 4000000000


回答 --gas-floor-target Amount of gas per block to target when sealing a new block (default: 4700000). --gas-cap A cap on how large we will raise the gas limit per block due to transaction volume (default: 6283184). --gasprice Minimum amount of Wei per GAS to be paid for a transaction to be accepted for mining. Note: gasprice is listed in wei. Note 2: --gasprice is a “Legacy Option”

其他挖矿设置选项

可以参考CLI选项页面来看看矿工还能如何调整优化设置。