推广传说
- 最后登录
- 2024-4-10
- 注册时间
- 2022-6-10
|
楼主
nime 发表于 2022-11-23 16:40:30
在以太坊,交易是区块链(或者任何一个相似区块链)的核心。当和以太坊区块链互动时,您正在进行交易,并且正在更新交易的状态。那么,你是否知道你所做的每一个动作都有可能导致区块链上产生错误的消息呢?您想过没有,想知道在以太坊进行交易时,是怎么回事?它又会对你的交易产生怎样的影响呢?我们用一个交易例子回答这个问题吧。当用户将物品放在一个区块链中的某一位置上,而不是放到另一个地方时,用户是否可以用这个方法对它做相应处理呢?本论文由以下几个部分组成。
据火币网统计,比特币的现货价格是9208.43美元,24小时成交量26374.82。它主要是为了满足社区居民对支付工具多样化需求而开发设计的一种新型代币制货币。比特币永续合约的价格是9209.3美元,24小时成交量18.03万。
欢迎加入欧易OKX,注册并登录App即可领取数字货币盲盒 最高可开出60,000元数字货币。 安卓下载APP教程: 下载安装5款App提示风险处理方法(大家按照自己手机功能尝试操作): 1.华为鸿蒙版:设置→搜索“纯净模式”→关闭 。 2.OPPO:设置→手机管家(自带)→支付保护→关闭所有软件的保护→成功下载安装APP之后再来打开保护 。 3.电信网络:打开飞行模式,用wifi下载安装APP 。 4.其他方法:关闭网络包括蓝牙、使用夸克浏览器或手机自带的浏览器下载安装、设置那里把病毒改成360等。 5.(华为手机等):设置→应用和通知→权限管理→安全和隐私→应用锁→信任此应用→再登录,就不再出现“风险”提示 。 6.下载好了APP,把数据流量都关掉再安装,出现无风险再打开流量继续安装即可! IOS下载APP教程: 欧易苹果APP下载:苹果手机下载APP需要海外苹果ID,可以在某宝上搜香港苹果ID,几块钱买一个然后登陆到商城去下载APP,下载完换回自己的苹果ID即可。 | 以太坊交易端到端的遍历是指由您的浏览器-控制台访问以太坊网络并返回到浏览器-控制台
了解当你使用Metamask或Myetherwallet等插件,而不是在运行其节点时,交易怎么做
假如你更加偏执多疑、不相信任何插件、想要独立完成交易的话,应该怎么办?
这篇文章的读者有必要就以太坊和它的构成部分比如账户、gas、合约等等都有基础性的知识。此外还包括一些相关术语,如比特币、以太坊货币、以太币协议以及区块链技术。对这些概念的详细解释可参见本文(编者注:中译本见文末《以太坊中的账户、交易、Gas和区块Gas Limit》超链接)。假如您是对以太坊陌生的开发者,本文可能会给大家带来很大的帮助。您还可在本文中学到构造简单分布式应用方法。本书所描述的方法不仅适用于以太坊,还能用于其他分布式对象环境。如果您有过亲身体验来实施交易,这篇文章对于您来说将更加重要。当分布式应用运行时,可能需要执行一些交易。比如可为发送部分以太币给对方或者合同进行交易。或者是与你所创建的分布式数据库进行通信,从而完成交易。又如也可在和分布式应用交互时,如购买本网站的代币若干,这是一笔生意。这些货币都可以被用来支付交易费用。如给候选人投了票,也算是一桩买卖。
一、以太坊交易的端到端概述
我们不妨用以下的合约调用来举例,以及遍历函数调用-交易如何被实现和永久保存到区块链中的总体过程。在这本书里,我们将展示一个完整的合约开发过程以及相关技术和工具。点击这里,就可以知道合同的全貌了。当用户输入了自己想要参加某一项活动时,系统就会自动地把它与该活动相关的所有信息保存到一个数据库文件之中。在更高的层次上,多了一份投票合约,其中,可预设部分人选参加大选竞争,谁都可以给自己投。如果你想参与投票,则必须先输入自己想要投票的选项,然后提交给投票人。这些表决将被记录到区块链中。
Voting.deployed ().then (function (instance) { Voting.deployed ( ).then (function (instance) {
instance.voteForCandidate ('Nick', {gas: 140000, from: web3.eth.accounts[0]}).then (function (r) { instance.voteForCandidate ('Nick', {gas: 140000, from: web3.eth.accounts[0]}).then (function (r) {
console.log ("Voted successfully!") console.log ( "Voted successfully!")
})
})
假设您已经在您的计算机中本地运行以太坊客户端(Geth或Parity),您的计算机与某以太坊网络相连(测试网络或是主网),您有获得合约地址及ABI的权利,由此进行交易。
如果您构造了一个分布式应用,对于上面的代码,大家应该都不会感到陌生。这些程序是如何将数据存储到分布式账本中?这是一份一个名为“Voting(投票)”的合同,已部署到区块链。该合约是一个用于选举候选人的程序。我们以这份合同为例,执行一个叫作voteForCandidate的函数,录入考生姓名、交易gas上限及实施交易帐户。通过计算出候选名单后,就能得到投票结果,而候选人则会被分配到相应的账户。由名可见,这个功能可以用于对候选人进行表决,选票被记录到区块链中。这个函数会让你知道,如果某个候选人不参加投票的话,他就会被淘汰出局。下面我们就试图对调用进行解构,知道当您执行这个javascript函数时,会出现什么情况。
1
下图是voteForCandidate函数调用先转换为原始交易(rawTxn)。为了将原始交易转化为可执行的代码,我们使用了一种新方法来实现该功能。利用Web3js库构造原始交易对象。
txnCount = web3.eth.getTransactionCount(web3.eth.accounts[0]) txnCount = web3.eth.getTransactionCount(web3.eth.accounts[0])
vary rawTxn = {
nonce: web3.toHex(txnCount), nonce: web3.toHex(txnCount),
gasPrice: web3.toHex(100000000000), gasPrice: web3.toHex(100000000000),
gasLimit: web3.toHex(140000), gasLimit: web3.toHex(140000),
to: '0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b', to: '0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b',
valuable: web3.toHex(0),
data: '0xc7ed014952616d6100000000000000000000000000000000000000000000000000000000' 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是0。如果你想发送以太币,则你可以使用这个值来计算交易金额。如果您想实施某项交易,将以太币发送到对方或者合同中,您将需要对value值进行设定。
data(数据):让我们看一下data字段怎么算。
你先从voteForCandidate(bytes32 candidate)(32字节的候选人)的ABI中获取函数签名,并且求出了其哈希值。
> web3.sha3('voteForCandidate(bytes32 candidate)') > web3.sha3('voteForCandidate(bytes32 candidate)')
'0xc7ed014922ff9493a686391b70ca0e8bb7e80f91c98a5cd3d285778ab2e245b3' '0xc7ed014922ff9493a686391b70ca0e8bb7e80f91c98a5cd3d285778ab2e245b3'
取哈希值前面四个字节分别为:0xcc9ab267。
然后将参数‘Nick’转化为32字节,得到52616d6100000000000000000000000000000000000000000000000000000000
两者组合获得数据有效载荷。
2
记住了就好,您是用web3.eth.accounts[0]进行交易的。你的帐户已经被注册到以太坊网络中。以太坊网络必须了解您的确是这个帐户的拥有者,这样就保证了别人不可能用自己的名字来完成这笔交易。如果你不清楚自己的身份,就可能会被要求去验证你是否为该账户的所有者。向网络证明这点的方法是使用帐户的相应私钥签署交易。在签署之前,你必须先把交易信息发送给网络中的第三方。签了字后,成交情况如下:
const privateKey = Buffer.from('e331b6d69882b4ab4ea581s88e0b6s4039a3de5967d88dfdcffdd2270c0fd109', 'hex') const privateKey = Buffer.from('e331b6d69882b4ab4ea581s88e0b6s4039a3de5967d88dfdcffdd2270c0fd109', 'hex')
const txn = new EthereumTx(rawTxn) const txn = new EthereumTx(rawTxn)
txn.sign(privateKey) txn.sign(privateKey)
const serializedTxn = txn.serialize() const serializedTxn = txn.serialize()
3
签名后的交易将提交到您本地以太坊节点上。当收到该消息后,你就可以在本地以太坊中进行签名。随后,您的本地节点将对签名后的事务进行认证,保证其确实被该账户地址所签名。
4
通过您的geth/parity节点向它的对等节点播送已经签好的交易,这些对等节点又向其对等节点播送交易,如此循环。如果你在一个或多个节点上都收到了该交易,那么你就知道这个交易是通过哪个节点传送的。交易一经播发到网络上,您的本地节点还将输出本次交易id,您可以利用它跟踪您的交易情况。在某些情况下,一个交易是通过一个或多个其他对等节点传送过来的。交易id是已经签了字的交易对象哈希。
transactionId = sha3(serializedTxn) 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进行了2次表决)。这就是为什么我们可以在矿池中发现一些不一样的交易。这里推荐一篇很好的文章(编者注:中译本见文末《科普|释放阻塞的以太坊交易》超链接),作者Jim McDonald对这一问题进行了透彻阐释。
|
|