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

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

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

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


2023耐玩的仙侠手游推荐(2020最受欢迎的仙侠手游) 送gm权限免费游戏怎么玩(游戏短信说的送gm号是什么意思) DNF105级装备还会融合吗(dnf105级还会保留打造吗) 和平精英局内快捷消息怎么改(和平精英局内快捷消息怎么改不了) 送元宝的放置手游有哪些(送元宝送vip的手游真的假的) 苹果手机小圆点怎么设置? 强烈推荐6个隐藏小功能 最好玩的网络游戏有哪些?2022好玩的网络游戏排行榜前十名 USDTOmni是什么意思?USDTOmni提现转账要多久? 王者荣耀小乔怎么出装伤害最高(王者小乔怎么出装最厉害) 冰原守卫者怎么更快提升龙的等级(冰原守卫者怎么快速升级) 荒野大镖客2背包满了怎么办(荒野大镖客2 背包满了) 2022即将结束(2022即将结束,明年十大赚钱项目,你准备好了吗英语) 我不允许还有人连接不上Steam!(steam不允许其他电脑登录) BRD钱包怎么样?BRD钱包怎么下载?详细教程(安卓及苹果版) PRV是什么币种?一文了解PRV币怎么样 Bitstamp这个交易所正规吗在中国合法吗?Bitstamp交易所官方网站登录入口地址 洛克王国石王技能怎么搭配(洛克王国石王技能搭配pvp) 抹茶交易所怎么买猪猪币PIG币?MXC抹茶交易所买猪猪币教程 洛克王国神圣青龙怎么获得(洛克王国神圣青龙现在可以超进化吗) 梦幻西游多少级能保住点卡钱(梦幻69单开每天赚50块) 冰原守卫者佣兵实力怎么升(冰原守卫者攻略) csgo怎么买装备(csgo怎么买装备快一点) 黑色沙漠手游艾格里斯祭坛钓鱼点在哪(黑色沙漠艾币) 宝可梦剑盾胆小性格加什么(剑盾胆小性格喜欢什么口味) DOTC去中心化交易平台使用教程:添加收付款方式 魔兽世界残忍角斗士怎么换(wow残忍角斗士板甲在哪买) 马斯克说SHIB可以涨到一美元是真的吗?马斯克最建议购买的7个币 创造与魔法章鱼刷新地在哪(创造与魔法章鱼刷新时间) 区块链MKR币怎么样?MKR币前景和价值分析 莱特币挖矿一天赚多少成本多少?莱特币挖矿收益计算器 dnf风暴逆鳞在哪里(DNF风暴逆鳞在哪里完成任务) YAG是什么币种?YAG币官网总量和发行价介绍 星之彼端强势阵容怎么搭配(星之彼端好玩吗) 哪些游戏不用登录账号也能玩(哪些游戏不用登录账号也能玩跑酷) WBTC是什么币?WBTC币全面介绍 和平精英怎么升级到20级(和平精英怎么升级到20级了) PandaFe交易所怎么样?PandaFe熊猫合约交易所合法吗? 揭开比特币的神秘面纱,比特币挖矿究竟是怎样的? 王者荣耀保存的视频在哪看(王者荣耀保存的视频在哪查看) Parity是什么钱包?Parity钱包怎么样? 消逝的光芒动态模糊怎么关闭(消逝的光芒 动态图) 荒野大镖客2可以联机吗(荒野大镖客2可以联机吗怎么玩) GOPAX是什么交易所?GOPAX交易所安全吗? 玩比特币合约能暴富吗是真的吗?币圈靠比特币期货合约发财的人 cf手游跨系统角色转移卡怎么买(cf手游跨系统角色转移卡在哪里买) 王者荣耀甄姬铭文怎么搭配2022(王者荣耀甄姬铭文怎么搭配最厉害) 加密货币交易所充值提币操作教程(加密货币钱包转账攻略) 破碎大陆武器的介绍 武器详解攻略 CHR币幻彩币怎么样?CHR币幻彩币未来价值如何 哪款角色扮演手游比较好玩(哪款角色扮演手游最火) 苹果手机小圆点怎么弄出来?苹果手机小圆点打不开怎么办 重返帝国武圣怎么加点(重返帝国怎么玩) 三国志幻想大陆灼烧可以叠加吗(三国志幻想大陆火烧阵容优先培养) 《传奇霸业手游》道士快速升级攻略(传奇霸业手游道士技能搭配) CSPR是什么币?CSPR币购买方法? 方舟生存进化快捷栏隐藏了怎么显示(方舟生存进化怎么显示快捷工具栏) 做空比特币教学:在加密货币熊市如何从空头赚币?看这一篇就够了 10u币圈合约最稳的玩法?加密货币合约永不爆仓方法 帝国战纪怎么获取羊皮(2021帝国战纪手游礼包兑换码) 电脑重装系统方法详细介绍(电脑重装系统方法详细介绍图) 币安交易所实名认证图解教程 手机上最火3个挖矿软件有哪些? 蜀门手游青城加点攻略(蜀门手游青城最强输出搭配) 为什么以太坊Gas费突然大幅下降? Pepe币在哪里买?用什么软件交易?Pepe币数字货币交易所App下载 为什么电脑连上wifi却显示无internet无线已连接 上不了网 放开那三国3红将阵容排名(放开那三国3阵容攻略) USDT交易软件app有哪些?全球最大USDT交易平台Binance币安评测 万圣节第五人格活动有哪些(第五人格万圣节活动持续多久) 猴币怎么购买?猴币MC买入和卖出教程 欧意KYC区咋认证?欧意交易所身份验证kyc认证最新教程 TP钱包的usdt怎么提到交易所?TP钱包usdt提币流程指南 GEAR币发行价多少?GEAR币发行价格介绍 2021年最可能涨的数字货币 2021年最值得投资加密货币 HNS是什么币种?HNS币未来价值深度分析 比特币做多好还是做空好?比特币如何做多做空? 和平精英如何全部退款(和平精英如何全部退款给队友) 对于imtoken你了解多少?imtoken是冷钱包吗? 魔兽世界巨龙之魂副本入口在哪(魔兽世界巨龙之魂怎么刷) 国内认可的数字货币交易所有哪些呢?主流数字货币交易所排名 诛仙手游云梦川钓鱼隐藏任务攻略(诛仙云梦川钓鱼点在哪里) 问道手游后期力金和法金哪个好(问道手游力金和法金哪个好组队) ios有什么免费大型游戏(iphone免费大型游戏) 三国志幻想大陆女团养谁(三国志幻想大陆女团队) 消逝的光芒2开局怎么跳(消逝的光芒2开局怎么跳过) 比特币交易网OKCoin是什么?比特币交易网络平台交易app.OKCoin中国官网入口 原神兽肉薄荷卷食谱怎么获得(元神里兽肉怎么获得) 合约地址是钱包地址吗?合约地址和钱包地址区别分析 JEX交易所究竟怎么样?JEX交易所安全吗? 哪款策略养成回合制游戏免费(策略回合制单机手游推荐) ADX是什么币种?ADX币前景和未来价值如何 有人靠比特币发财?币圈交易大神有哪些?币圈大佬排名 王者荣耀皮肤销量数据哪里看(王者皮肤累计销量排行榜) EGLD币在哪里买?EGLD币上线交易所前十盘点 安币是干什么的?安币网官网最新入口地址 冰原守卫者寒霜剑士领主怎么打(寒冰护卫者值得做吗) 3个有特色的兼职网络平台(兼职赚钱的正规软件) ETH永续合约如何收费?以太坊永续合约手续费介绍 Lbank交易所怎么样?lbank交易所官方网址 科普:去中心化钱包和银行的不同

热门文章

推荐专题

更多>>

游戏推荐

更多>>