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

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

时间:2025-01-12

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

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


电脑打不开摄像头怎么办?摄像头没有禁用但打不开 Poloniex交易所怎么下载安装?Poloniex交易所APP下载方法分享 洛克王国迪莫属性是什么(洛克王国迪莫怎么得2020) 消逝的光芒2武器怎么修复(消逝的光芒2贫民窟武器) dnf史诗之路如何获得史诗套装(dnf史诗之路怎么刷划算) 如何使用Etherscan(快递查询工具) imToken钱包使用教程 如何做自媒体才能赚钱?自媒体赚钱月入8000方法大揭秘 对于imtoken你了解多少?imtoken是冷钱包吗? 王者荣耀道聚城买皮肤有贵族积分吗(王者荣耀道聚城消费能不能提升贵族) 烟雨江湖怎么回档2022(烟雨江湖怎么回档刷天赋) 如何下载和注册欧易APP?欧易APP下载和新手注册操作教程 有什么值得上手的卡牌网游(值得推荐的卡牌游戏) 宝可梦阿尔宙斯传说泥炭块怎么获得(宝可梦 阿尔宙斯传说) 和平精英头像右下角数字代表什么(和平精英头像右上角有个红点) 抹茶ass驴币怎么提币到钱包?抹茶ass提币手续费介绍 Chia挖矿教程:Chia挖矿成本与收益究竟如何? 有哪些经典人气高的武侠手游(2020年武侠手游排行榜前十名) 苹果手机小圆点怎么设置? 强烈推荐6个隐藏小功能 原神草种子有什么效果(原神草c) 魔兽世界锈水财阀声望怎么刷(锈水财阀战袍哪里买) 艾尔登法环怎么双持(艾尔登法环怎么双手拿一把武器) 传奇手游哪个好玩耐玩不烧钱的(传奇手游哪款好玩) ST概念币是什么意思?ST概念币种有哪些? 宝可梦传说阿尔宙斯伊布在哪(宝可梦传说阿尔宙斯伊布哪个好) 王者荣耀S27赛季战令皮肤是什么() 创造与魔法交易的货币怎么得到(创造与魔法交易所货币换算) 无聊猿游艇俱乐部是什么?无聊猿游艇俱乐部怎么样? bone币怎么获得?bone币什么时候上线? USDC如何提现?USDC币提现人民币详细教程 消逝的光芒2无法启动怎么解决(消逝的光芒2闪退) OTCBTC是什么交易所?OTCBTC交易所怎么样? 币安交易所绑定邮箱/手机安全设置操作图解教程 Ledger钱包怎么使用?Ledger钱包收发比特币教程 如何玩比特币赚钱?玩比特币赚钱吗? 永续合约资金费率是什么意思? 虚拟币交易app安币安卓版评测?安币网binance交易所官网入口 星露谷物语祝尼魔小屋有什么用(星露谷物语祝尼魔小屋作用介绍) cf黑机器处罚怎么解除(cf黑机器处罚去哪申诉) 冰原守卫者湿漉漉的靴子怎么用(冰原守卫者的游戏描述) 问道守护亲密度怎么刷的快(问道守护亲密有啥用) 狗狗币交易平台盘点,2021年可以买狗狗币交易平台排行 有上线送特权的卡牌手游吗(送vip的卡牌游戏) 有什么回合制网游搬砖游戏(回合制搬砖手游) 黑色沙漠手游怎么钓鱼(黑色沙漠手游钓鱼怎么挂机) 和平精英怎么送别人皮肤(和平精英怎么送别人皮肤衣服) 全球币圈三大数字货币交易所是哪三家?盘点三大数字货币交易所 蜀门手游土豪应该选择什么职业(蜀门手游月赚6000) 我的世界抢夺附魔最高等级多少(我的世界1.7.10抢夺附魔) 火币钱包助记词忘了怎么办?火币钱包备份助记词及导出私钥教程 聚美优品有假货吗,为什么比专柜发货便宜那么多 和平精英实名认证多久可以改一次(和平精英实名认证多久改一次2022) 欧易卖币能直接交易吗?欧易okx交易所卖币立即就能卖出吗? 我的世界怎么免费获得钻石买模组(我的世界手游怎么免费获取买模组的钻石) LUNC币怎么购买交易?LUNC币买卖交易操作教程 宝可梦阿尔宙斯传说皮丘怎么进化(皮神打阿尔宙斯) 和平精英创作模式怎么开无敌(和平精英创作模式怎么开无敌效果) 王者转区要多久才能转移成功(王者转区要多久才能转移成功在哪里看) 地下城堡3魂之诗沃夫加藏身在哪(地下城堡3沃尔加) binance官网在国内合法吗_全球领先的数字货币交易平台 《传奇霸业手游》道士快速升级攻略(传奇霸业手游道士技能搭配) 第五人格时装解锁卡怎么用(第五人格时装六折卡) 大型在线网游游戏哪一款免费(大型在线网络游戏) 诛仙手游衣服怎么染色(诛仙手游衣服染色攻略) 三国志幻想大陆铭文攻略(三国志幻想大陆符文) 比特派钱包使用教程:币安智能链BSC通过BITHD使用pancake 直接能交易的手游有哪些(可以直接交易的手游平台) 视频剪辑哪款软件好用(视频剪辑软件那款好用) 数字货币冷钱包有哪些?盘点数字货币冷钱包 和平精英如何标记地点和载具(和平精英怎么标记地点或载具) mulitibit无法导入blockchain钱包后怎么解决? MASK币是什么币?MASK币未来前景及价值分析 gate.io官网入口, gate.io官网最新登录网址 宝可梦传说阿尔宙斯伊布哪个厉害(精灵宝可梦阿尔宙斯厉害吗) 全球前十比特币交易所是哪几个?比特币交易平台排名 不需要实名认证的游戏有哪些(不需要实名认证的游戏有哪些2023) 有什么游戏是野外可以打怪的(野外打怪的端游) 黑色沙漠手游黑珍珠怎么获得(黑色沙漠珍珠先买什么) 百度网盘限速下载速度慢怎么办(百度网盘下载慢的最佳解决办法) 黑色沙漠手游料理师的风采知识怎么获得(黑色沙漠料理从零到道人) FTN是什么币种?FTN币前景怎么样? 宝可梦传说阿尔宙斯噩梦神怎么获得(阿尔宙斯梦特性) 王者荣耀张飞S26怎么出装(王者荣耀张飞出装及实战打法攻略) 上主网和上交易所有什么区别? 有什么带铭文的传奇手游推荐(好玩的铭文传奇) 蜀门手游武尊副法宝怎么加点(蜀门手游武尊技能加点怎么加?) HTMOON是什么币?HTMOON币前景怎么样 冰原守卫者60层塔怎么打(冰原守卫者怎么升级快) 角色扮演手游合集哪个好(角色扮演手游排行榜十大角色手游排行榜) 竖屏手游哪个好玩(竖屏手游排行榜2021前十名) 哪些大型3d网游游戏人气高(3d网游大型游戏排行榜) 英雄联盟亲密关系恋人怎么隐藏(英雄联盟如何隐藏亲密关系) OM币怎么买?OM币交易所购买教程 第五人格祭司使用技巧(第五人格祭司使用方法教程) BNX是什么币种?BNX币前景及价值深度分析 有哪款游戏是女生爱玩的(女生爱玩的游戏排行) cf多少级可以打排位2022(cf多少级能打排位) 人类一败涂地攻略(全关卡图文通关攻略详解) csgo怎么买装备(csgo怎么买装备快一点) usdt可以在交易平台之间互转吗?usdt转到另一个交易所步骤? 和平精英娱乐模式扣分吗(和平精英娱乐模式什么意思)

热门文章

推荐专题

更多>>

游戏推荐

更多>>