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

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

时间:2025-11-09 21:50:43来源:525游

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

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


游戏概念币有哪些?游戏板块币种大盘点 重返帝国值得培养的英雄有哪些(重返帝国能赚钱吗) GJ.COM是什么交易所?GJ.COM交易所怎么样? 瑞波币2021年价格预测,瑞波币2021年能涨到600吗? 即时战略类游戏有哪些好玩(即时战略游戏都有哪些) 比特派钱包使用教程:币安智能链BSC通过BITHD使用pancake 矿机算力能达到多少?矿机算力单位如何换算? 怪物猎人曙光dlc多少钱(怪物猎人 曙光) 创造与魔法里的猴子吃什么(创造与魔法猿猴) 公认的五大0氪金游戏(有没有0氪金的手游) 和平精英3周年工卡怎么获得(和平精英三周年什么时候上线) nfc是什么功能在手机上怎么打开?苹果nfc打开的详细步骤 电脑蓝屏怎么知道是哪里出故障了 电脑出现蓝屏怎么恢复 区块链QUN币是什么币?QUN币官网总量和上线交易所介绍 好玩热血的传奇手游哪里玩(热血传奇手游值得玩吗) win10怎么开启系统修复 window10如何进行系统修复 和平精英会员怎么没了(和平精英为什么没有vip等级) 梦幻西游笑里藏刀有什么效果(梦幻西游笑里藏刀特技) DeFi挖矿DODO教程,使用比特派钱包bitpie参与DODO挖矿(以太系) Halo Wallet是什么钱包?Halo Wallet使用教程 第五人格伞吹什么意思 宿伞之魂角色介绍(第五人格宿伞之魂怎么玩视频教学) 有没有耐玩不烧钱的传奇手游(好玩不烧钱的传奇手游) 我的世界怎么让准星跟随鼠标(我的世界准星怎么随鼠标移动) OEX交易平台合法吗是否可靠?OEX交易所app官方下载 中币ZB官方网站_中币网官方介绍-中币ZB比特币交易平台地址 CZ在币圈是什么意思?CZ在币圈代表的哪个人,CZ详细资料 雅币(YAC)是什么币?雅币官网总量及交易平台介绍 BBX合约交易平台注册、充值、提现教程及app软件下载方法 梦幻诛仙手游最强门派角色(梦幻诛仙手游门派推荐) imToken钱包EOS账户转账/收款操作教程 中本聪的真实身份是什么?比特币创始人中本聪的真实身份揭秘 十大耐玩手机单机游戏(十大耐玩手机单机游戏知乎) 消逝的光芒传奇250级要多少赈灾包裹(消逝的光芒一个赈灾包多少经验) 科普:比特币最强升级-Taproot 三国志战略版手游怎么玩(三国志战略版这么玩) 英雄联盟英雄名字外号有哪些(英雄联盟 英雄外号) Uniswap交易所官网APP下载优点特色,Uniswap交易所官网版app下载 大零币/ZEC怎么购买?ZEC币购买交易操作教程 数字货币钱包怎么安装?数字货币钱包新手使用教程 洛克王国威廉古堡在哪(洛克王国威廉古堡任务) YGG是什么币种?YGG币前景深度分析 有没有破解无敌版的修仙手游(修仙无限破解版) cf信誉积分怎么查询(cf官网) 和平精英体验服有防沉迷吗(和平精英体验服有防沉迷系统吗?) 如何将钱包中的BTM迁移到Bytom链全节点钱包 有没有不费流量的手机网游推荐(有没有不费流量的游戏) 抹茶app倒闭了吗?抹茶重新支持大陆用户了吗 苹果手机怎么下载手机铃声?两步教你轻松设置自己喜欢铃声 魔兽世界wlk黑铁条在哪(魔兽世界怀旧服黑铁图纸哪里买) 明日方舟干员年详解 干员年怎么培养 和平精英进不去游戏里面怎么回事(和平精英进不去游戏里面怎么回事) dnf剑魂白金徽章选什么技能(dnf剑魂白金徽章选什么技能) 什么是显卡挖矿? 免费转换YouTube影片为MP3或MP4的网站FREEDSOUND 王者荣耀召唤师技能有哪些(王者荣耀里面的召唤师技能详解) 电脑系统重装有几种方法,电脑系统重装步骤教程 我的世界怎么成为开发者(我的世界怎么成为开发者上传地图) 我的世界青色染料怎么做(mc青色染料制作方法) 我的世界狐狸吃什么才能驯服(我的世界狐狸吃什么食物驯服) 囤币是什么意思?为什么炒币不如囤币? 宝可梦传说阿尔宙斯黏黏宝怎么进化(宝可梦传说阿尔宙斯 pokemon legends arceus) 梦幻西游千年蛇魅怎么样(梦幻西游千年蛇魅剧情怎么过) 比特币交易OKCoin怎么样?OKCoin交易平台官网地址 有什么热门可玩性高的网络游戏(比较热门的网络游戏) 十大招聘网站(十大招聘网站排行榜) 王者荣耀全国大赛怎么参加(王者荣耀全国大赛怎么参加团队赛) TUSD币哪个交易所能买?TUSD币买入和交易操作步骤教程 中国最大的炒币平台,中国正规的炒币交易所排名 数字资产钱包有哪几种?如何正确选择数字资产钱包? trx币是什么币?trx币前景和价值分析 王者荣耀掉帧怎么解决(王者荣耀掉帧怎么解决安卓) 蜀门手游奇缘祈福怎么玩(蜀门手游+7女娲祈福袋) 比特儿交易平台排名第几?比特儿交易平台gate.io官方介绍登录入口 梦幻西游手游稀世藏宝图怎么获得(梦幻西游手游稀世珍品) cf山西一区属于北部吗(cf山西一区属于北部战区吗) 王者荣耀共享皮肤怎么设置(王者荣耀如何设置共享皮肤) 梦幻西游副本积分刷新时间是什么时候(梦幻副本积分奖励刷新时间) 生鲜app排行榜 生鲜蔬菜配送app有哪些 手机版有什么攻城守城游戏(攻城类手机单机游戏) 消逝的光芒荧光蘑菇怎么获得(消逝的光芒荧光蘑菇有什么用) 第五人格最黑求生者有哪些(第五人格求生者黑历史大全) 我的世界布吉岛怎么发全体(我的世界布吉岛怎么发全体消息手机版视频) 比特儿现在是跑路倒闭了吗?比特儿交易所最新情况官网消息分享 消逝的光芒2买了标准版能升级吗(消逝的光芒2标准版和豪华版) 消逝的光芒2怎么回贫民窟(消逝的光芒2怎么刷东西) pdf编辑工具哪个好用?精选3款PDF编辑工具! 王者荣耀甄姬铭文怎么搭配2022(王者荣耀甄姬铭文怎么搭配最厉害) bigone云币国际交易平台怎么样?bigone注册流程详细介绍 三国志战略版攻略哪些武将好用(三国志战略版哪些武将比较好) 宝可梦传说阿尔宙斯首领的区别是什么(阿尔宙斯gf) 区块链技术和YTBCOIN未来发展趋势 哈利波特魔法觉醒韦斯莱之家怎么获得(哈利波特韦斯莱家权利好大) 第五人格排位难玩吗(第五人格排位胜率低) 泰拉瑞亚熔炉怎么做(泰拉瑞亚熔炉怎么做不了) 宝可梦阿尔宙斯豪力怎么进化(阿尔宙斯之力) 国内比特币去哪里交易?中国比特币交易网官网地址 BRD钱包怎么样?BRD钱包怎么下载?详细教程(安卓及苹果版) dnf仗剑万里行怎么获得(dnf仗剑万里行光环怎么快速获得) 问道手游平民玩什么职业好(问道手游平民玩什么职业好2020) 区块链BNANA币是什么币种?BNANA币全面介绍

热门文章

推荐专题

更多>>

游戏推荐

更多>>