以太坊交易的生命周期
来源:    发布时间: 2023-11-21 21:21   103 次浏览   大小:  16px  14px  12px
买卖是以太坊区快链(或丝毫比如的区快链)的本质。在与以太坊区快链采取可视化交互的同时,你是在连接程序买卖并更新软件其壮态。

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


买卖是以太坊区快链(或丝毫比如的区快链)的本质。在与以太坊区快链采取可视化交互的同时,你是在连接程序买卖并更新软件其壮态。你有木有有想过要详细了解当你在网上查询在以太坊连接程序买卖的同时究竟再次发生了些什么?令你们按照几则买卖事列来解疑这样困难。小编例如方式信息内容。

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

了解当你使用 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!")

})

})

2


统计假设当你自个儿的算机里地方运动了一大个以太坊用户端(Geth 或 Parity),你的算机连接方式到某一个以太坊线上(测试软件线上只是主网),你准许访问权限该协议具体地址和 ABI,可以执行力该的交易。 假设你共建太过于布式可能用,可能对给出码并不不太熟悉。这都是同另一个名是“Voting(票选)”的合同期,已召开会议在了区快链上。他们以该合同期为例子,程序下达同另一个称为 voteForCandidate 的变量,手机输入备选拔的称呼、该的消费的gas超出和程序下达该的消费的企业账户。从称呼中行查出,该变量要能用于为备选拔票选,选票统计在区快链上。在下文,他们将试穿解构该跳转,询问你是程序下达该 javascript 变量很容易再次发生的往往。

构建原始交易对象

如下图所示,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()


交易经由本地验证

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


交易被广播至网络

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


transactionId = sha3(serializedTxn)

3


假若你是在公共服务的以太坊电脑网络数据上执行工作该买卖的消费的,追查你的买卖的消费措施的极佳措施是完成etherscan.io。右上图图甲中,你有没有主意在了有几结点被符号为 Etherscan 结点。Etherscan 的微商团队开机运行了几结点,并将一名挺棒的web前端电脑网络数据使用衔接在了 Etherscan上。假若你的买卖的消费被孩子的结点全选,你以在孩子的网络上手机查看你的不确定买卖的消费。 更记得的1点是,因此任何结点一般会进行你的消费。在其中许多结点将被设计变为了只进行 gas 报价突破某个至少值的消费。若是 你设计的 gas 报价降到该低限,则结点会忽视你的消费。

矿工节点接受交易

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

4 从上图内你要特别注意到挖矿将所有的的的消费数据存储在表明 gas 成本多少分类管理整理的池中。gas 成本多少越高,该的的的消费就越有会被含有进下另一个区块链。这才是挖矿接点的分类管理快速设计(为得到了更为重要的劳务报酬去改善)。不过了,挖矿都可以将你的接点设计成表明你的习惯对的的的消费去分类管理整理(随后,他为着有所帮助手机网络只发现gas成本多少低的的的的消费)。 从上图内,你查而来让你们的 voteForCandidate 消费是怎么样才能沉在矿池下方的吗?当一切gas市场价高的消费都被挖开来主要包括进板块,,铁路工人将挖矿让你们的消费。 还在要需注意的些许是,矿池能够 可以容纳的转让数是比较有限的。打个比方,场众筹模式还在白热化进行中也是一两个是非常兴起的规划式软件(如数据加密猫)横多刚出生。朋友出具了 gas 产品报价高的转让,也希望工人能较早全选大家 的转让。如果 gas 产品报价高的转让填满了矿池,gas 产品报价低的转让就能被选择放弃。大家的侯选拔人才人 Nick 在一小最近几天间隔内你就想受到任何的选票了。在本身问题下,大家而且得如何电台广播大家的转让。 另个个能你会的刷卡寄售售价在矿池里回升的实用技巧是如何撤回你的刷卡寄售售价,提高了 gas 售价并保证 nonce 值不改。只要其一,当挖矿读取到新刷卡寄售售价时,gas 售价更好的新刷卡寄售售价会覆盖住以后的刷卡寄售售价。要是变换了 nonce 值,如何撤回的刷卡寄售售价就可以被而言不一定同的刷卡寄售售价(后会为Nick报名参加多次从投票)。这个举荐一些非常不错的短文(编者注:中译本见正文《普及 | 发挥拥塞的以太坊刷卡寄售售价》超的链接),小说作家Jim McDonald 对于这些画出了深层次的解答。

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

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

若是挖矿进行将转让包括进区域,那些转让将被安全验证并包括进一款待操作区域,做工做任务关系认定书开启。相应挖矿构件(可以通过应对做工做任务关系认定书薄弱环节)最终能够会选择一款有郊的区域,并将这种区域填加到区域链上。就好像途经你的本地服务构件电台的原来转让会被许多构件接收入这么,挖矿构件也会将这种有郊区域电台给许多构件。

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

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

若果你便用 truffle 运行你的买卖刷卡交易, truffle 会频频考查区域链言于确定。倘若它发觉买卖刷卡交易被确定,可能会运行 then() 区域中的代码怎么用,并彩打(我们大家每一位事件的)把控台工作日志指数函数。

二. 使用Metamask而非本地节点

5


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


三. 线下签名

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


你是否是留意等到,前两人环节完全不所需连接无线系统。若是你确定个人的购买所任何时候不懂收到篡改,你是否以便用一种不会有连接无线系统的求算的机将这些指数函数跳转转为成最初购买所,并便用你的私钥签署合同合同协议该购买所。,,你是否以复制到已签署合同合同协议购买所串,并便用连接无线系统的求算的机将其新闻广播网至无线系统。你是否以便用 Etherscan 和 Infura 等安全服务将你已签署合同合同协议的购买所新闻广播网至无线系统。

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


可能中心句能让他较好地体谅以太坊买卖的任务操作流程。假设发觉本文中有所有的有错事例,麻烦你下方留言,我要充分改正。 感谢领导 Jim McDonald为此文校对。