手机版
扫描查看手机站
首页 > 文章 > 加密世界 > 正文

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

时间:2022-12-13 阅读:
特战英豪官网版

特战英豪官网版

  • 类型:射击空战
  • 大小:61.82MB
  • 语言:中文版
  • 版本:v1.0.0

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 等硬件钱包。这类钱包存储了你的私钥,而签署交易的密钥已经编程进了硬件本身。它们需要联网的原因只是为了发布你的已签署交易。

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


英雄联盟劫S12怎么出装(英雄联盟劫怎么出装2020) 第五人格宿伞之魂天赋加点推荐(第五人格宿伞之魂人格搭配) 如何选择靠谱的去中心化交易所? (一个人单干暴利项目有哪些) 十大冷门暴利小生意排行 什么是区块链?区块链金融是什么意思? 优质好玩的网游游戏有哪些(有哪些好玩儿的网游) 和平精英怎么掷点数(和平精英投掷点数怎么弄的) 和平精英年龄限制是多少(和平精英的年龄限制是多少) 江南百景图猫爪怎么获得(江南百景图限时活动找小猫) 和平精英怎样使用信号枪 信号枪特殊使用说明(和平精英信号枪怎么用 位置) 消逝的光芒2区域分配能改吗(消逝的光芒2ign) 有什么好玩的角色扮演手机游戏(有啥好玩的角色扮演游戏) 诛仙手游灵阵最新搭配攻略(诛仙手游阵灵搭配推荐阵灵怎么搭配) 有什么安卓手游排行榜网游推荐(安卓网络游戏排行榜) imToken钱包WePiggy Optimism主网手机端操作教程 区块链IOTX是什么币?IOTX币官网总量及交易平台介绍 有哪款游戏是女生爱玩的(女生爱玩的游戏排行) 和平精英3周年工卡怎么获得(和平精英三周年什么时候上线) 玛娜希斯回响兑换码在哪用(玛娜希斯的回想) 第五人格比赛怎么计分(第五人格比赛规则) XEC是什么币种?XEC币未来价值深度分析 通俗解释元宇宙是什么概念?元宇宙的应用有哪些? 稳定币是什么 稳定币有什么作用? 王者荣耀如何跳过刷脸(王者荣耀如何跳过刷脸软件) 诛仙手游套装怎么获得(诛仙手游套装怎么获取) 简单阐述数字藏品清退流程是什么? 有什么人气高的大型国战类网游(大型国战类网络游戏) 英雄联盟大虫子最大能变多大(lol大虫子能有多大) 在昆明租房用什么软件找房会比较好?(网上租房app推荐) 比特币钱包app有哪些?2022年比特币交易软件app排行榜 黎明觉醒防空洞密码锁怎么开(黎明觉醒家园防御) 我的世界外设鼠标怎么跟随视角(我的世界如何让鼠标跟随视角移动?) 宝可梦传说阿尔宙斯能联机吗(宝可梦阿尔宙斯会好玩吗) IPFS/FIL挖矿与比特币挖矿的区别 消逝的光芒武器升级模组可以取下吗(消逝的光芒武器升级后可以摘除吗) 问道手游力法哪个好(问道手游法力有什么用) 消逝的光芒怎么装备紫外线手电(消逝的光芒怎么用紫外线手电) 消逝的光芒2等级怎么提升(消逝的光芒2有什么变化) Solana钱包教程:Solana钱包操作及新项目参与步骤教程 三国志幻想大陆初始刷什么(三国志幻想大陆初始武将和稀有武将) 苹果恢复出厂设置会删除所有数据吗?苹果按键强制恢复出厂设置操作 cf可以设置cf点消费密码吗(cf游戏里能设置消费密码么) 三国志幻想大陆开局怎么玩(三国志幻想大陆 开局) imToken是哪个国家的?imToken钱包在中国合法吗? 王者荣耀国服有几个名额(王者荣耀国服只有10个人吗) 在OKEx交易所用人民币购买泰达币USDT操作步骤教程 AT币是什么币种?Artfinity/AT币全面介绍 蜀门手游职业贫民推荐(蜀门手游职业选择攻略 哪个职业好) 比特币节点是什么意思?比特币节点有什么用? 王者荣耀怎么全部恢复默认(王者荣耀怎么全部恢复默认设置方法) 宝可梦阿尔宙斯起源形态怎么变(阿尔宙斯的进化) dnf下面的所有状态栏不见了怎么办(地下城状态栏都看不到了) NANO币怎么样?纳诺币(NANO)买卖交易使用教程 问道手游首饰属性怎么转换(问道手游首饰属性转换怎么得力量) 消逝的光芒望远镜任务望远镜在哪找(消逝的光芒无耐久神器望远镜) 以太坊将超越比特币?以太坊的持续上涨逻辑? 王者荣耀s27典韦怎么出装(王者s25典韦出装) 放开那三国3蜀国武将排行(放开那三国3蜀国质变的英雄) 洛克王国宠物性格怎么修改(洛克王国宠物性格修改在哪) PUSH币发行量多少?PUSH币发行总量介绍 区块链扫盲:比特币期权交割是什么意思? 诛仙手游爆伤爆减怎么提高(诛仙手游爆抗和爆伤减免怎么取舍) 王者荣耀绑了别人的身份证怎么改(王者荣耀绑定了别人的身份证怎么改) ANC是什么币种?ANC币前景和价值深度解析 以太坊Gas是什么意思?一文读懂以太坊Gas费用 英雄联盟手游信誉4级怎么升5级(英雄联盟手游信誉等级4到5要多久) 洛克王国火花怎么抓(洛克王国火花值得培养吗) 有哪些好玩的战斗类网游游戏(很好玩的战斗游戏) 天天拍车卖车靠谱不(天天拍车卖的高吗) 问道一点敏捷加多少速度(问道1点敏捷加多少速度) 消逝的光芒2隐藏区域什么意思(消逝的光芒2任务攻略) GCT是什么币?GCT什么时候上线,在哪里买? 抹茶ASS驴币如何买入和卖出? 币安合约支持哪个钱包进行交易?币安交易所优势有哪些? 科普:加密钱包的进阶用法基本概念 和平精英创作模式怎么开无敌(和平精英创作模式怎么开无敌效果) LATOKEN交易所怎么样?LATOKEN安全靠谱吗? BUT币是什么币?BUT币上架交易所及用途盘点 怎么投资数字货币赚钱?币安交易所买币卖币教程 IDEX交易所平台币是什么?IDEX交易所怎么样? 摩尔庄园手游感恩保温杯怎么获得(摩尔庄园菜品保温) 幻塔森林蜘蛛在哪(幻塔zhihu) 蜀门手游百花技能加点(蜀门手游百花怎么加血多) 买比特币的app哪个好?盘点十大比特币正规交易平台 魔兽世界直升110划算吗(魔兽世界直升120划算吗) 烟雨江湖怎么回档2022(烟雨江湖怎么回档刷天赋) Curve交易所怎么样?Curve交易所安全吗? Bybit交易所手续费多少?Bybit交易所费用明细 比特派怎么交易?比特派钱包交易使用教程 魔兽世界牧师最佳种族是什么(魔兽牧师哪个种族颜值最高) YFI币怎么获得?YFI币购买和交易操作教程 imtoken钱包被盗可以追回吗? 消逝的光芒2生存者还是治安者好(消逝的光芒2刷幸存者等级) 泰拉瑞亚工匠作坊怎么获得(泰拉瑞亚工匠作坊在哪获得) HTDF是什么币种?华特东方/HTDF币前景和价值分析 和平精英雪地恐龙乐园打法攻略(和平精英雪地恐龙乐园怎么玩过山车) 哪些手游适合非RMB玩家畅玩(非rmb手游排行榜推荐) AQT币在哪买?AQT币上线交易所盘点 和平精英第三人称怎么设置(和平精英第三人称怎么设置2022) 国产公链是什么意思?国产公链有哪些?

热门文章

推荐专题

更多>>

游戏推荐

更多>>