主页 > 华为怎么安装imtoken > 以太坊交易规则(以太坊最新交易指南)

以太坊交易规则(以太坊最新交易指南)

华为怎么安装imtoken 2023-05-06 07:05:20

ETH(Ethereum)以太坊钱包基本概念介绍:

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

以太坊交易规则(以太坊最新交易指南)

交易是以太坊区块链(或任何类似的区块链)的核心。 与以太坊区块链交互时,您正在执行交易并更新其状态。 你有没有想过当你在以太坊上执行交易时到底发生了什么? 让我们用一个交易例子来回答这个问题。 本文包括以下内容。

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

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

以太坊转账广播_以太坊转账3天没到怎么办_siteweiyangx.com 以太坊转账查询

}) })

以太坊交易规则(以太坊最新交易指南)

假设你在本地计算机上运行以太坊客户端(Geth 或 Parity),你的计算机连接到以太坊网络(测试网络或主网络),你可以访问合约地址和 ABI,从而执行交易。

如果您构建过分布式应用程序,那么您应该熟悉上面的代码。 这是一个名为“投票”的合约,已经部署在区块链上。 我们以这个合约为例,执行一个叫voteForCandidate的函数,输入候选人的名字,交易的gas limit,以及执行交易的账户。 顾名思义,这个功能可以用来给候选人投票,投票记录在区块链上。 在下文中,我们将尝试解构该调用并了解执行该 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',

siteweiyangx.com 以太坊转账查询_以太坊转账广播_以太坊转账3天没到怎么办

value: web3.toHex(0), data: '0xc7ed014952616d6100000000000000000000000000000000000000000000000000000000' };

让我们试着理解这个原始交易对象中的所有字段以及它们是如何设置的。

nonce(随机数):每个以太坊账户都有一个名为nonce的字段,用于记录该账户执行的交易总数。 随机数的值随着每笔新交易的执行而增加,这使网络能够理解交易需要执行的顺序。 Nonce 还用于重放保护。

gasPrice(gas价格):你愿意为交易支付的每单位gas的价格。 如果你在主网执行交易,恰好ETH Gas Station上有一个网站,你可以参考设置你的交易的gas price,以便在一定时间内成功执行交易。 gas价格目前以GWei为单位,范围为0.1->100+Gwei。 更多关于天然气价格及其影响的信息见下文。

gasLimit(gas上限):你愿意为交易支付的最高gas总量。 此上限可确保您的账户在出现交易执行问题(例如陷入无限循环)时不会耗尽资金。 交易执行后,所有剩余的气体将返回到您的帐户。

to:函数调用发送到的地址。 0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b 是我们案例中投票合约的地址。

值:您打算发送的以太币总量。 当我们执行 voteForCandidate 函数时,我们根本不发送以太币,所以值为零。 如果你想执行将以太币发送给另一个人或合同的交易,你将需要设置该值。

data(数据):让我们看看数据字段是如何计算的。

您首先从 voteForCandidate(bytes32 candidate) 的 ABI 中获取函数签名并对其进行哈希处理。

> web3.sha3('voteForCandidate(bytes32 candidate)')
'0xc7ed014922ff9493a686391b70ca0e8bb7e80f91c98a5cd3d285778ab2e245b3'

以太坊转账广播_以太坊转账3天没到怎么办_siteweiyangx.com 以太坊转账查询

取该散列的前 4 个字节,即:0xcc9ab267。

然后将参数'Nick'转换为32字节,得到52616d61000000000000000000000000000000000000000000000000000000000

结合两者以获得数据有效载荷。

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.交易广播到网络

siteweiyangx.com 以太坊转账查询_以太坊转账广播_以太坊转账3天没到怎么办

已签名的交易由您的 geth/parity 节点广播给它的对等节点,这些节点又将交易广播给它们的对等节点,依此类推。 一旦交易被广播到网络,您的本地节点也会输出交易 ID,您可以使用它来跟踪您的交易状态。 交易id是签名交易对象的哈希值。

transactionId = sha3(serializedTxn)

以太坊交易规则(以太坊最新交易指南)

如果您在公共以太坊网络上执行交易,跟踪交易状态的最佳方式是通过 etherscan.io。 如上图,你有没有注意到有几个节点被标记为 Etherscan 节点。 Etherscan 的团队运行几个节点,并有一个连接到 Etherscan 的优秀前端 Web 应用程序。 如果你的交易是由他们的节点选择的,你可以在他们的网站上查看你的待处理交易。

要记住的另一件事是,并非所有节点都会接受您的交易。 其中一些节点可能被设置为仅接受 gas 价格超过某个最小值的交易。 如果您将 gas 价格设置为低于此下限,节点将忽略您的交易。

5.矿工节点接受交易

如图所示,以太坊网络既有矿工节点,也有非矿工节点。 您可能知道,矿工的工作是将您的交易包含在一个区块中。 矿工是交易池的维护者。 您的交易首先被添加到交易池中,然后由矿工进行评估。

以太坊交易规则(以太坊最新交易指南)

从上图中,您会注意到矿工将所有交易存储在按 gas 价格排序的池中。 gas price 越高,交易被添加到下一个区块的可能性就越大。 这是矿工节点的常见设置(针对更高的奖励进行了优化)。 但是,矿工可以将他们的节点配置为根据自己的喜好对交易进行排序(例如,他们只挖掘 gas 价格低的交易以帮助网络)。

从上图中,你能看出我们的 voteForCandidate 交易是如何沉到池底的吗? 一旦所有具有高 gas 价格的交易都被开采并包含在区块中,矿工将开采我们的交易。

同样重要的是要注意,矿池可以容纳的交易数量是有限的。 例如,众筹活动如火如荼或非常流行的分布式应用程序(如 Cryptokitties)诞生。 人们以高 gas 价格提交交易,希望矿工首先选择他们的交易。 如果 gas 价格高的交易填满池,则 gas 价格低的交易将被放弃。 我们的候选人尼克暂时得不到任何选票。 在这种情况下,我们甚至必须重新广播我们的交易。

另一个让你的交易进入池中的技巧是重新提交你的交易,提高 gas 价格并保持 nonce 不变。 这样,当矿工收到一笔新交易时,gas price 更高的新交易会覆盖之前的交易。 如果改变了 nonce 值,则重新提交的交易将被视为不同的交易(最终会为 Nick 保留两票)。 在此推荐一篇好文章(编者注:中文翻译见文末“科普|释放被封锁的以太坊交易”超链接),作者Jim McDonald进行了深度解读。

6.矿工节点找到一个有效的区块并将其广播到网络

以太坊转账广播_siteweiyangx.com 以太坊转账查询_以太坊转账3天没到怎么办

矿工最终选择了我们的交易并将其与其他交易一起包含在区块中。 矿工只能选择一定数量的交易加入区块,因为以太坊设置了单个区块的gas limit,也就是说所有交易的总gas limit不能超过区块gas limit。 你可以在 ethstats.net 上查看当前的 gas 限制。

一旦矿工选择将交易包含在一个区块中,这些交易就会被验证并包含在一个待处理的区块中,然后开始工作证明。 一些矿工节点(通过解决工作量证明难题)最终会找到一个有效的区块并将该区块添加到区块链中。 就像你本地节点广播的原始交易会被其他节点接收到一样以太坊转账广播,矿工节点也会将这个有效区块广播给其他节点。

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

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

如果您使用 truffle 来执行您的交易,truffle 将不断轮询区块链以进行确认。 一旦发现交易已确认,它就会执行 then() 块中的代码并打印(对于我们的每个示例)控制台日志功能。

2.使用Metamask代替本地节点

以太坊交易规则(以太坊最新交易指南)

如果您安装了 MetaMask 浏览器插件,您将能够在浏览器中管理您的帐户。 密钥仅存储在您的浏览器中,因此您是唯一有权访问您的帐户和私钥的人。 当您在浏览器上执行交易时,插件会将您的函数调用转换为原始交易并使用您的私钥签署交易。 Metamask 运行自己的节点并使用它们来广播您的交易(Metamask 使用由 Infura 运行的节点)。 这样,您就不需要运行自己的以太坊节点。

3.离线签名

如果您不喜欢使用插件,或者担心您的本地 geth 节点可能受到损害(篡改)怎么办? 有一种安全的方法可以解决这个问题。

您是否注意到前两个步骤根本不需要联网。 如果你想确保你的交易绝对不可篡改,你可以使用未连接到互联网的计算机将此函数调用转换为原始交易并使用你的私钥签署交易。 然后,您可以复制已签名的交易字符串,并使用连接到网络的计算机将其广播到网络。 您可以使用 Etherscan 和 Infura 等服务将您签名的交易广播到网络。

另一个安全的选择是使用像 Ledger 或 Trezor 这样的硬件钱包。 这些钱包存储你的私钥,并且用于签署交易的密钥被编程到硬件本身。 他们需要在线的原因只是为了发布您签名的交易。

以上就是科普的详细内容:以太坊交易的生命周期? 更多以太坊相关信息,请关注脚本之家其他相关文章!

本站提示:投资有风险,入市需谨慎。 此内容不作为投资和财务建议。 标签:以太坊交易生命周期