当前位置:主页 > 区块链 > 区块链技术 > 以太坊交易的生命周期

科普:以太坊交易的生命周期?

2021-12-08 17:25:33 | 来源: | 作者:佚名
这篇文章主要介绍了科普:以太坊交易的生命周期的相关资料,希望这篇关于以太坊交易的生命周期的文章,能够帮助各位朋友对以太坊有个更加深入的了解。

ETH(Ethereum)以太坊钱包基本概念介绍:http://www.jb51.net/blockchain/801260.html

了解以太坊交易是如何生成并在网络中广播的

科普:以太坊交易的生命周期?

交易是以太坊区块链(或任何类似的区块链)的核心。在与以太坊区块链进行交互之时,你是在执行交易并更新其状态。你有没有想过要了解当你在以太坊执行交易之时到底发生了什么?让我们通过一则交易例子来解答这一问题。本文包括如下内容。

以太坊交易的端到端遍历,即从你的浏览器/控制台出发进入以太坊网络,然后再回到你的浏览器/控制

了解当你使用 Metamask 或 Myetherwallet 等插件,而非运行自己的节点之时,交易是如何进行的

如果你比较偏执多疑,不信任任何插件,想自己执行交易,该怎么做?

本文读者需要对以太坊及其组成部分,如账户、gas 和合约等具备基础性了解。关于这些概念的详细解释可以参见这篇文章(编者注:中译本见文末《以太坊中的账户、交易、Gas和区块Gas Limit》超链接)。如果你是一个不熟悉以太坊的开发者,这篇文章或许对你很有帮助。你也可以从这篇文章中学习如何构建简单的分布式应用。如果你已经有过执行交易的亲身经历,本文对你的意义会更大。例如,可以是将一些以太币发送给另一个人或合约的交易。再比如,还可以是在与分布式应用进行交互的情况下,如果你在这个网站上买了一些代币,这就是一笔交易。如果你为一位候选人投票,这也是一笔交易。

一. 以太坊交易的端到端综述

让我们以下列合约调用为例,并遍历该函数调用/交易是如何执行及永久存储在区块链上的整体流程。点击此处可了解整个合约。从较高层次来说,这是一个投票合约,其中你可以预置一些候选人在选举中进行角逐,任何人都能为他们投票。这些投票将会记录在区块链上。

Voting.deployed().then(function(instance) {
  instance.voteForCandidate('Nick', {gas: 140000, from: web3.eth.accounts[0]}).then(function(r) {
    console.log("Voted successfully!")
  })
})

科普:以太坊交易的生命周期?

假设你在自己的计算机上本地运行了一个以太坊客户端(Geth 或 Parity),你的计算机连接到了某个以太坊网络(测试网络或是主网),你有权访问该合约地址和 ABI,从而执行该交易。

如果你构建过分布式应用,应该对上述代码并不陌生。这是一个名为“Voting(投票)”的合约,已经部署在了区块链上。我们以该合约为例,执行一个叫作 voteForCandidate 的函数,输入候选人的姓名、该交易的gas上限和执行该交易的账户。从名称中可以看出,该函数能够用来为候选人投票,选票记录在区块链上。在下文,我们将尝试解构该调用,了解你在执行该 javascript 函数时会发生的一切。

1. 构建原始交易对象

如下图所示,voteForCandidate 函数调用首先被转化成了原始交易(rawTxn)。Web3js库被用来构建原始交易对象。

txnCount = web3.eth.getTransactionCount(web3.eth.accounts[0])
var rawTxn = {
    nonce: web3.toHex(txnCount),
    gasPrice: web3.toHex(100000000000),
    gasLimit: web3.toHex(140000),
    to: '0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b',
    value: web3.toHex(0),
    data: '0xc7ed014952616d6100000000000000000000000000000000000000000000000000000000'
};

让我们试着了解下该原始交易对象中的所有字段,以及它们是如何设置的。

nonce(随机数):每个以太坊账户都有一个叫做 nonce 的字段,来记录该账户已执行的交易总数。Nonce 的值随着每个新交易的执行不断增加,这能让网络了解执行交易需要遵循的顺序。Nonce 也被用来进行重放保护。

gasPrice(gas价格):即你愿为该交易支付的每单位 gas 的价格。如果你正在主网上执行交易,ETH Gas Station上正好有一个网站,你可以参照其建议为你的交易设定 gas 价格,以便交易在一定时间内成功执行。Gas 价格目前以 GWei 为单位,其范围是0.1->100+Gwei。下文会进一步介绍 gas 价格及其影响。

gasLimit(gas上限):即你愿为该交易支付的最高 gas 总额。该上限能确保在出现交易执行问题(比如陷入无限循环)之时,你的账户不会耗尽所有资金。一旦交易执行完毕,剩余所有 gas 会返还至你的账户。

to:即该函数调用被送往的地址。0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b 是我们的案例中投票合约的地址。

Value(值):即你打算发送的以太币总量。当我们执行voteForCandidate函数时,我们根本没有发送以太币,因此 value 为零。如果你要执行一个交易,向另一个人或合约发送以太币,你会需要设置 value 值。

data(数据):让我们来看看data字段是如何计算出来的。

你先从 voteForCandidate(bytes32 candidate)(32字节的候选人)的 ABI 中获取函数签名,并得出它的哈希值。

> web3.sha3('voteForCandidate(bytes32 candidate)')
'0xc7ed014922ff9493a686391b70ca0e8bb7e80f91c98a5cd3d285778ab2e245b3'

取该哈希值的前4个字节,即:0xcc9ab267。

然后将参数‘Nick’转化为32字节,得到52616d6100000000000000000000000000000000000000000000000000000000

将二者结合,得到数据有效载荷。

2.签署交易

如果你记得的话,你使用了web3.eth.accounts[0]来执行该交易。以太坊网络需要知道你确实是该账户的所有者,从而确保其他人不能以你的名义执行该交易。要向网络证明这点的方法是使用该账户的相应私钥签署交易。签署过后的交易如下图所示:

const privateKey = Buffer.from('e331b6d69882b4ab4ea581s88e0b6s4039a3de5967d88dfdcffdd2270c0fd109', 'hex')

const txn = new EthereumTx(rawTxn)
txn.sign(privateKey)
const serializedTxn = txn.serialize()

3. 交易经由本地验证

签署过后的交易会提交至你的本地以太坊节点。然后你的本地节点会验证已签名的交易,确保它真的是由这个账户地址签署过的。

4. 交易被广播至网络

已签署交易经由你的geth/parity节点广播至其对等节点,这些对等节点再将该交易广播给它们的对等节点,以此类推。一旦交易被广播至网络,你的本地节点也会输出该交易的id,你可以用它来追踪你的交易的状态。该交易id就是已签署交易对象的哈希值。

transactionId = sha3(serializedTxn)

科普:以太坊交易的生命周期?

如果你是在公共的以太坊网络上执行该交易的话,追踪你的交易状态的最佳方式是通过etherscan.io。如上图所示,你是否注意到了有几个节点被标记为 Etherscan 节点。Etherscan 的团队运行了几个节点,并将一个很棒的前端网络应用连接到了 Etherscan上。如果你的交易被他们的节点选中,你可以在他们的网站上查看自己的待定交易。

还要记住的一点是,并非所有节点都会接受你的交易。其中一些节点可能被设置成了只接受 gas 价格超过某一最低值的交易。如果你设置的 gas 价格低于该下限,则节点会忽略你的交易。

5. 矿工节点接受交易

正如图中所示,以太坊网络同时拥有矿工节点和非矿工节点。可能你也知道,矿工的职责是将你的交易包含到区块上。矿工是交易池的维护者,你的交易先是被添加进交易池,再由矿工进行开始评估。

科普:以太坊交易的生命周期?

从上图中你会注意到矿工将所有交易存储在根据 gas 价格分类的池中。gas 价格越高,该交易就越有可能被添加进下一个区块。这是矿工节点的常见设定(为得到更高的报酬进行优化)。不过,矿工可以将自己的节点设置成根据自己的喜好对交易进行分类(例如,他们为了帮助网络只挖掘gas价格低的交易)。

从上图中,你看出我们的 voteForCandidate 交易是如何沉入矿池底端的吗?一旦所有gas价格高的交易都被挖出来包含进区块之后,矿工将挖掘我们的交易。

还有要注意的一点是,矿池可以容纳的交易数是有限的。比如,一场众筹正在火热进行中或是一个非常流行的分布式应用(如加密猫)横空出世。人们提交了 gas 价格高的交易,希望矿工能最先选中他们的交易。如果 gas 价格高的交易填满了矿池,gas 价格低的交易就会被放弃。我们的候选人 Nick 在一段时间内就别想收到任何选票了。在这种情况下,我们甚至得重新广播我们的交易。

另一个能让你的交易在矿池里上升的技巧是重新提交你的交易,提高 gas 价格并维持 nonce 值不变。这样一来,当矿工接收到新交易时,gas 价格更高的新交易会覆盖之前的交易。如果改变了 nonce 值,重新提交的交易就会被认为是不同的交易(最后会为Nick举行两次投票)。这里推荐一篇很好的文章(编者注:中译本见文末《科普 | 释放阻塞的以太坊交易》超链接),作者Jim McDonald 对此做出了深入的解释。

6. 矿工节点找到一个有效区块并将它广播至网络

矿工最后选中了我们的交易,与其他交易一起包含进区块。矿工只能选择一定量的交易添加进区块,因为以太坊已经设置了单个区块 gas 上限,换言之,交易的所有 gas 上限总数不能超过区块 gas 上限。你可以在 ethstats.net 上查看当前 gas 上限。

一旦矿工选择将交易包含进区块,这些交易将被验证并包含进一个待处理区块,工作量证明开始。某个矿工节点(通过解决工作量证明难题)最终会找到一个有效的区块,并将这一区块添加到区块链上。就像经由你的本地节点广播的原始交易会被其他节点接收那样,矿工节点也会将这一有效区块广播给其他节点。

7. 本地节点接收/同步新区块

最终,你的本地节点将接收这个新区块,并同步区块链在本地的副本。一旦接收到这个新区块,本地节点就会执行区块里的所有交易。

如果你使用 truffle 执行你的交易, truffle 会不断测验区块链以求确认。一旦它发现交易被确认,就会执行 then() 区块中的代码,并打印(我们每个例子的)控制台日志函数。

二. 使用Metamask而非本地节点

科普:以太坊交易的生命周期?

如果你安装了 MetaMask 浏览器插件,你就能在你的浏览器中管理你的账户。密钥只会存储在你的浏览器上,因此你是唯一一个有权访问你的账户和私钥的人。当你在浏览器上执行交易之时,插件会将你的函数调用转化成原始交易,并用你的私钥签署交易。 Metamask 运行自己的节点,并且使用这些节点来广播你的交易(Metamask 使用的是Infura 运营的节点)。如此一来,你就没必要运行自己的以太坊节点了。

三. 线下签名

如果你不喜欢用插件,或者担心你的本地 geth 节点有可能受损(遭篡改),该怎么办呢?要解决这一问题有一个安全之策。

你是否注意到了,前两个步骤根本不需要联网。如果你想确保自己的交易绝对不会受到篡改,你可以使用一台没有联网的计算机将这一函数调用转换成原始交易,并使用你的私钥签署该交易。之后,你可以复制已签署交易串,并使用联网的计算机将其广播至网络。你可以使用 Etherscan 和 Infura 等服务将你已签署的交易广播至网络。

另一个安全之策是使用 Ledger 或 Trezor 等硬件钱包。这类钱包存储了你的私钥,而签署交易的密钥已经编程进了硬件本身。它们需要联网的原因只是为了发布你的已签署交易。

以上就是科普:以太坊交易的生命周期?的详细内容,更多关于以太坊的资料请关注脚本之家其它相关文章!

声明:文章内容不代表本站观点及立场,不构成本平台任何投资建议。本文内容仅供参考,风险自担!

你可能感兴趣的文章

币圈快讯

  • OpenAI已谈论制造一款人形机器人

    2024-12-25 01:22
    在过去的一年里,OpenAI对机器人重新产生了兴趣:投资于开发机器人硬件和软件的初创公司,如Figure和PhysicalIntelligence,并重启了四年前解散的内部机器人软件团队。现在,OpenAI可能会将这种兴趣提升到一个新层次。根据两名直接了解讨论的人士的说法,该公司最近考虑开发一种类人机器人。不过,不要过于兴奋,其中一位知情人士表示:任何潜在的类人机器人似乎对OpenAI的优先级低于其许多其他技术和产品,例如其备受赞誉的推理模型和能帮助自动化各种软件工程和分析任务的代理人。然而,OpenAI甚至考虑开发类人机器人这一事实,突显了其日益增长的雄心,旨在涉足从搜索和网络浏览器到服务器芯片和数据中心规划的各个领域。
  • 交易员Eugene:近期做多SOL亏损,未能果断止损以及过度加仓是导致损失的关键错误

    2024-12-25 00:50
    交易员EugeneNgAhSio分享近期交易总结,揭示其在做多SOL时的重大亏损。Eugene在BTC盈利后转向SOL和其生态系统的多单,原本设定中等风险回报比。然而,SOL价格未能按预期上涨,Eugene未及时止损,在SOL跌至200美元时加仓,最终导致亏损达到620万美元,约为账户总额的10.2%。他反思称,未能果断止损以及过度加仓是导致损失的关键错误。幸运的是,最终他成功通过一系列获利交易弥补亏损,并总结出避免沉没成本思维的重要性。
  • 分析:目前BTC最大痛点为8.4万美元,ETH为3000美元

    2024-12-25 00:43
    Greeks.live宏观研究员Adam在X平台发文指出,欧美进入圣诞假期,传统市场休市,但比特币带动下的加密市场出现明显上涨。由于假期流动性较差,市场涨跌所需动力较小。期权方面,短期隐含波动率继续下降,做市商移仓接近尾声,预计年底前波动率将以稳定为主。目前BTC的最大痛点为84,000美元,ETH为3,000美元,但年度最大痛点可能失效,这与往年情况类似。
  • 顶级交易员Eugene:6000万美元做多SOL,经历账户单笔最大亏损

    2024-12-25 00:40
    ChainCatcher消息,顶级交易员EugeneNgAhSio发表近期交易总结,在完美地从10.2万美元至10.7万美元做多BTC后,我决定将这笔盈利转移到SOL和SOL生态系统的多单上。当时的入场点提供了一个中等的风险回报比(r/r),具体为:做多220美元的SOL、2.75美元的WIF和0.037美元的BONK。这是基于SOL在低时间框架(LTF)上的强势表现,以及之前几笔交易成功带来的信心。当BTC市场在108k开始转向时,我不喜欢一些meme币的交易表现,于是果断平掉了表现较差的资产,接受了一个可以接受的亏损(这是正确的操作)。然而我并没有平掉SOL的仓位,反而选择将仓位从2000万美元加码到3000万美元。这导致了第一个错误的形成。 错误1没有及时止损: 通常,我的强项之一是能够在仓位开始失去强势时及时退出,以避免更大的损失。然而这次,我选择不在SOL跌至215美元时止损,尽管我认为市场在FOMC议息会议前后会出现下行波动。我的偏见压倒了逻辑,我用来安慰自己的心理借口是,200美元是SOL的一个关键支撑位,而且距离很近,我不想因为试图抓住5%的波动而被市场“割韭菜”。当SOL跌至200美元支撑位时,我进一步加码,将仓位从3000万美元增加到4500万美元,理由是高时间框架(HTF)支撑位的风险回报比最佳。我不认为这是一个错误,但这确实让本已复杂的局面更加危险。 错误2无视止损点: 当SOL跌破200美元时,明确的操作应该是按照计划平仓。然而,我选择继续持有,因为仓位规模已经如此之大,如果我在此时平仓,可能会引发SOL价格瀑布式下跌至190美元并破坏整个图表。此时,我开始抱有“希望主义”(hopium),想着“或许会有一个下影线跌破支撑,然后重新站上去”。这种心理状态绝对是一个红色警告信号,我会特别注意。此外,当价格跌破200美元后,我在187美元至193美元区间加了杠杆,将仓位规模扩大到接近6000万美元(总账户杠杆达到1.2倍)。这显然是错误的操作,但正如你所见,错误开始不断叠加。幸运的是,没有发生完全的“黑天鹅”事件,我没有因此受到更大的惩罚。 做对的地方: 在浮亏达到700-800万美元时,我决定“够了”,并果断止损。我在193美元平掉了70%的仓位,这让我释放了现金,用于在最终的底部重新建仓,包括ETH、ENA、PEPE和WIF,几乎抄到了最低点。最终这笔交易的实际损益(rPNL)为亏损620万美元,约为-10.2%。自那以后,我执行了13笔交易,全部获利,基本上弥补了这笔亏损。我认为这是一个很好的例子,展示了一个交易如何从一开始就出错,然后错误不断叠加,最终可能变得非常糟糕,尤其是在“沉没成本心态”占据上风时。幸运的是,我能够从这种心态中走出来,这让我在市场底部时能够冷静且精准地交易。这是我在这个账户上单笔仓位的最大亏损,我会记住这次教训很久。 圣诞快乐,朋友们。
  • HumanityProtocol:已注意到测试网私钥存储问题,将尽快解决

    2024-12-25 00:29
    区块链身份认证平台HumanityProtocol于X平台回复慢雾创始人余弦称,感谢反馈测试网明文私钥直接浏览器存储的问题,已注意到这个问题,将尽快解决并向用户通报。此前消息,慢雾创始人余弦于X发文表示,“HumanityProtocol项目方将明文私钥直接在浏览器sessionStorage里存储,为低级高风险错误。还好目前只是测试网,并未造成实际危害。”
  • 查看更多