LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 以太坊的具体运作原理【中】

以太坊的具体运作原理【中】

2020-06-03 蓝狐笔记 来源:区块链网络


(紫丁香花丛,梵高)

前言:本文主要阐述当前以太坊的具体运作原理,有助于我们理解以太坊背后的各种概念和*作,适合初学者阅读。本文作者是Preethi Kasireddy,来源于medium.com,由蓝狐笔记社群“Leo”翻译。

接上一篇:以太坊的具体运作原理【上】

Gas和支付

以太坊有一个非常重要的概念是费用的概念。因在以太坊网络上交易而消耗的计算都会产生费用,正所谓天下没有免费的午餐。支付的费用以“gas”来计算。

gas是用于衡量特定计算所需费用的单位。gas价格是你愿意花费在每单位gas上的Ether总量,用“gwei”来衡量。“Wei”是Ether的最小单位,1^018 Wei代表1 Ether。1gwei是1,000,000,000Wei。

每次交易,交易发送人(转账人)都会设置gas的limit和gas价格。gas价格和gas limit代表了发送人愿意为交易支付的最大数量的Wei。例如,我们假设发送人设置gas limit是50,000,gas价格是20gwei。这意味着交易发送者愿意支付最多50,000*20gwei=1,000,000,000,000,000Wei,也就是0.001Ether用来执行该交易。




请记住,gas limit代表了交易发送人愿意支付的最大费用。如果他们的账户余额可以覆盖这个最大值,就不会有问题。交易结束时,发送人会收到未被使用的gas资金退款,并按最初价格交易。



如果交易发送人没有提供足够的gas来执行交易,交易会用光gas,并且该交易无效。在这种情况下,交易过程中止,发生的任何状态更改都会被逆转,这样交易会结束,并回到交易前的以太坊状态。此外,还会记录交易失败,显示什么交易试图发起并在哪里失败。同时,既然在用光gas之前,机器已经花费了努力进行计算,逻辑上来说,这些花费的gas不会再退还给交易发送人。


gas资金到底去哪里了?交易发送人花费的所有gas资金都被发送到“受益人”地址,这通常是矿工的地址。既然矿工花费努力来计算和验证交易,矿工收取gas费用作为奖励。


通常,交易发送人愿意支付的gas价格越高,矿工从交易中获得价值越大。因此,矿工也会选择价格高的交易。这样,矿工自由选择他们愿意验证的交易。为了引导交易发送者设置gas价格,矿工可以选择宣传他们会执行交易的最低gas价格。

存储也需要费用。

gas不仅用于支付计算步骤,也用于支付存储费用。存储所需的总体费用跟使用32字节的最小倍数成正比。

存储的费用有一些细微差别。比如,既然不断增加的存储增大了所有节点的以太坊状态数据库的大小,那么有动机来保持小的数据存储量。因此,如果交易具有可以清除存储中的条目的步骤,则免除执行该*作的费用,并且为了释放存储空间还可以退还费用。

费用有什么目的?

以太坊运行的一个重要方面是网络执行的每个*作都同时受到每个全节点的影响。然而,在以太坊虚拟机上的计算步骤是非常昂贵的。

因此,以太坊智能合约最适用于简单任务,例如运行简单的商业逻辑或验证签名和其他加密对象,而不是更加复杂的用途,如文件存储、邮件、机器学习等,这些会给网络带来压力。征收费用可以防止用户过度使用网络。

以太坊是图灵完备的语言。简言之,图灵机是能够模拟任何计算机算法的机器。这允许循环,并使以太坊容易受到停顿问题的影响,这个问题让你无法确定程序是否会无限运行下去。如果没有费用,恶意行为者能够轻易尝试破坏网络,方式是通过在交易中执行无限循环却不用担心成本。因此,费用可以保护网络免受恶意攻击。你可能会想,“为什么我们还需要为存储付费?”好吧,就像计算一样,以太坊网络上的存储也有成本,整个网络不得不为此承受负担。

交易和消息

我们注意到以太坊是基于交易的状态机。换言之,发生在不同账户之间的交易推动着以太坊的全球状态从一个状态转换到另外一个状态。

在最基本的意义上,交易是加密签名的指令,它由外部账户生成,并序列化,然后提交到区块链上。有两类交易:消息调用和合约创建(即创建新的以太坊合约的交易)。

所有交易包含如下部分,无论其类型如何:

Nonce(随机数):交易发送人发送的交易数量的计数。(蓝狐笔记译注:跟比特币的Nonce概念不同。)

Gasprice:交易发送人愿意为执行交易所需的每单位gas支付的Wei的数量。

Gaslimit:交易发送人愿意为执行交易支付的最大gas数量。数量是设置并预付的,在任何计算完成之前确定。

To:接收人的地址。如是创建合约的交易,合约账户地址还不存在,所以使用的是空值。

Value:从发送人转移到接收人的Wei总量。在创建合约的交易中,这个值作为新创建合约账户的初始余额。

V,r,s:用于生成签名,该签名可以标识交易的发送人。

Init:仅用于创建合约的交易。它是EVM代码片段,可用来初始化新的合约账户。Init只允许一次,然后被抛弃。首次运行init时,它会返回账户代码的正文,这段代码与合约账户产生永久关联关系。

数据:仅用于消息调用的可选字段。它是指消息调用的输入数据(即参数)。比如,如果智能合约充当域名注册的服务,对合约的调用可能需要输入字段如域名或IP地址。


在账户的章节,我们了解到交易,如消息调用或创建合约的交易,这些交易总是由外部账户启动并提交到区块链。另外一个思考的方式是,正是这些交易在外部世界和内部以太坊之间起到桥梁作用。


但这不意味着这些合约不能跟其他合约沟通。存在于以太坊状态范围内的合约能够与其他同样范围内的合约进行对话。它们沟通的方式是通过“消息”或“内部交易”。我们可以将消息或内部交易看作与交易类似,主要区别在于它们不是由外部账户生成。相反,它们由合约生成。它们是虚拟对象,与交易不同,它们不会序列化并且只存在于以太坊执行环境中。

当一个合约发送内部交易到另外一个合约,接收人合约账户的关联代码就会执行。


需要注意的是,内部交易或消息并不包含gaslimit。因为gaslimit是由原始合约的外部创建者来确定的,即是一些外部账户。外部账户设置的gaslimit必须足够高,以执行交易,这些交易包括了任何子执行,子执行也是由交易导致的。比如,合约到合约的消息。

如果,在交易和消息的链中,特定的消息执行耗尽了gas,消息的执行会还原,同时还原的还包括任何由执行触发的后续消息。然而,父执行无需还原。

区块

所有的交易组成一起进入区块。区块链包含一系列链接在一起的区块。以太坊中,一个区块包含:

区块头

关于区块中包含的一组交易的信息

当前区块的ommers的一组其他区块头

关于Ommers

ommer到底是什么?ommer是一个区块,它的父区块相当于当前区块的父块的父块。快速了解一下ommer用于什么,为什么区块包含ommers的块头?

由于以太坊的构建方式,出块时间比其他区块链更短,比如它约15秒/区块,而比特币的出块时间是10分钟/区块。这让它拥有更快的交易速度。然而,更短出块时间的一个不足之处是矿工会发现有更多的竞争区块。这些竞争区块也称为“孤块”(即所挖出的区块并没有进入主链)。

ommers的目的是帮助奖励矿工包括这些孤块。矿工包含的ommers必须是“有效”的,意味着当前区块的六代之内或更小范围内。在六代之后,老旧的孤块不再被引用,因为包括较老的交易会让事情变复杂。

Ommer区块获得的奖励比全区块要少。尽管如此,对矿工来说,这依然有激励,让他们把这些孤块包括进来,由此收获奖励。

区块头

让我们回到区块。之前提到过每个区块都有区块头,它究竟是什么?

区块头是区块的一部分,包括:

parentHash:父区块头的哈希值(这也是让区块连成链的原因)

ommersHash:当前区块的ommers列表的哈希值

受益人:接收挖矿费用的账户地址

stateRoot:状态trie的根节点的哈希值(状态trie存储于区块头并且更方便于轻客户端验证状态的任何信息)

transactionsRoot:包含区块中列出来的所有交易的trie的根节点哈希值

receiptsRoot:包含区块中列出来的所有交易收据的trie的根节点哈希值

logsBloom:Bloom过滤器(数据结构),它包含日志信息

difficulty:区块的难度级别

number:当前区块的计数(创世区块的区块号是0,此后的每个后续区块都按顺序增加)

gasLimit:当前的每区块的gaslimint

timestamp:区块开始的unix时间戳

extraData:跟区块相关的额外数据

mixHash:也是一个哈希值,当它结合nonce时,证明该区块已经执行足够的计算

nonce:也是一个哈希值,当它结合mixHash时,证明该区块已经执行足够的计算




注意每个区块头是如何包含三种trie结构:

状态(stateRoot)

交易(transactionRoot)

收据(receiptsRoot)

这些trie结构只是之前提到过的Merkle Patricia tries。此外,以上的描述中一些术语需要澄清。

Logs

以太坊允许logs,以便于追溯各种交易和消息。合约可以通过定义“事件”来清晰生成日志,这里的“事件”则是想要记录日志。

log条目包含:

日志者的账户地址

一系列的主题,这些主题代表本次交易执行的不同事件

跟这些事件相关的任何数据

日志存储在bloom过滤器中,该过滤器以有效方式存储无尽的日志数据。

交易收据

存储在区块头的日志来自于包含在交易收据中的日志信息。正如你在商店购物会收到收据一样,以太坊也会为每笔交易生成收据。正如你所期望的,每张收据都包含交易相关的一些信息。收据包含如下内容:

区块编号

区块哈希

交易哈希

当前交易使用的gas

当前交易执行后当前区块所使用的累积gas

当执行目前交易创建的日志

......等等

--未完待续---

风险警示:蓝狐笔记所有文章都不能作为投资建议或推荐,投资有风险,投资应该考虑个人风险承受能力,建议对项目进行深入考察,慎重做好自己的投资决策。加入蓝狐笔记的知识星球:https://t.zsxq.com/iaQNnIq欢迎加入蓝狐笔记群微信:pacinoli

—-

编译者/作者:蓝狐笔记

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...