关于Ethereum交易是如何从生成并在网络中广播的,如下总结七个步骤:

一、 构建原始交易对象

如下为原始交易对象字段,并对各字段进行展开说明

var rawTx = {nonce: '0x00',gasPrice: '0x09184e72a000', gasLimit: '0x2710',to: '0x0000000000000000000000000000000000000000', value: '0x00', data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'
}
nonce: 记录发起交易的账户已执行交易总数。Nonce的值随着每个新交易的执行不断增加,这能让网络了解执行交易需要遵循的顺序,并且作为交易的重放保护。gasPrice:该交易每单位gas的价格,Gas价格目前以Gwei为单位(即10^9wei),其范围是大于0.1Gwei,可进行灵活设置。gasLimit:该交易支付的最高gas上限。该上限能确保在出现交易执行问题(比如陷入无限循环)之时,交易账户不会耗尽所有资金。一旦交易执行完毕,剩余所有gas会返还至交易账户。to:该交易被送往的地址(调用的合约地址或转账对方的账户地址)。
value:交易发送的以太币总量。data: 若该交易是以太币交易,则data为空;若是部署合约,则data为合约的bytecode;若是合约调用,则需要从合约ABI中获取函数签名,并取函数签名hash值前4字节与所有参数的编码方式值进行拼接而成,具体参见文章https://github.com/linjie-1/guigulive-operation/wiki/Ethereum%E7%9A%84%E5%90%88%E7%BA%A6ABI%E6%8B%93%E5%B1%95

二、签署交易

需要使用交易账户的私钥对原始交易对象进行签名,下面介绍使用MetaMask以及硬编码两种方式:

MetaMask:私钥只会存储在你的浏览器上,因此你是唯一有权访问你的账户和私钥的人。当你在浏览器上执行交易之时,插件会将你的函数调用转化成原始交易,并用你的私钥签署交易。 Metamask运行Infura运营的节点,并且使用这些节点来广播交易。

硬编码:如下使用了ethereumjs-tx库对交易进行签名,当然硬编码私钥的方式签名交易,不实用,但可以使用一台没有联网的计算机签署该交易。之后,可以复制已签署交易串,并使用联网的计算机将其广播至网络。另一个安全之策是使用 Ledger 或 Trezor 等硬件钱包。这类钱包存储了私钥,而签署交易的私钥已经编程进了硬件本身。它们需要联网的原因只是为了发布你的已签署交易。

var Tx = require('ethereumjs-tx');
var privateKey = "私钥";var tx = new Tx(rawTx);
tx.sign(privateKey);var serializedTx = tx.serialize();web3.eth.sendRawTransaction(serializedTx.toString('hex'), function(err, hash) {doSomething()
});

三、节点验证

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

四、交易广播

节点验证通过后,会被广播至其对等节点,这些对等节点再将该交易广播给它们的对等节点,以此类推。一旦交易被广播至网络,会输出该交易的id,可以用它来追踪交易的状态。

五、 矿工节点接受交易

矿工节点的职责是将交易打包到区块上。矿工是交易池的维护者,交易先是被添加进交易池,再由矿工进行评估选择来打包。矿工一般将所有交易存储在根据gasPrice价格分类的池中。价格越高,该交易就越有可能被添加进下一个区块。这是矿工节点的常见设定。并且矿池可以容纳的交易数是有限的,gasPrice价格低的交易可能会被放弃。

对于释放阻塞在矿池中交易的方法是提高其gasPrice价格,并维持nonce值和from值不变,nonce和from可以确定标识一笔交易,并且提高的gasPrice必须大于原来价格的10%才可以。这样一来,当矿工接收到新交易时,价格更高的新交易会覆盖之前的交易,使得矿工更容易选择并挖中。

对于如何设置合理的gasPrice,可以参照网站https://ethgasstation.info/

六、矿工节点挖中有效区块并将它广播至网络

矿工将选中的全部交易一起包含进区块。矿工只能选择一定量的交易添加进区块,受限于以太坊设置的单个区块gasLimit,换言之,交易的所有gas总数不能超过区块的gasLimit。

一旦矿工选择将交易包含进区块,这些交易将被验证并包含进一个待处理区块,工作量证明开始。某个矿工节点最终会找到一个有效的区块,并将这一区块添加到区块链上。就像上面介绍的节点广播原始交易一样,矿工节点也会将这一有效区块广播给其他节点。

七、节点接收/同步新区块

最终,全网节点将接收这个新区块,并同步区块链。一旦接收到这个新区块,节点就会执行区块里的所有交易。结合我们使用的truffle调用合约代码, truffle会不断测验连接节点的区块链以求确认。一旦它发现交易被确认,就会执行 then()中的回调逻辑。

参考阅读
https://hudsonjameson.com/2017-06-27-accounts-transactions-gas-ethereum/

http://ethfans.org/posts/life-cycle-of-an-ethereum-transaction

https://medium.com/@jgm.orinoco/releasing-stuck-ethereum-transactions-1390149f297d

https://github.com/linjie-1/guigulive-operation/wiki/Ethereum%E4%BA%A4%E6%98%93%E8%AF%A6%E8%A7%A3

==============================================================

博主看到很多智能合约中有引入:ethereumjs-tx这么个东西,只知道是和签名相关的,但是在网上却找不到具体的定义。果然最后还得依靠google才知道,原来它是利用私钥进行签名的库。当我们通过web3.js的sendRawTransaction方法发起交易的时候,必须要用它来签名。

//安装
npm install ethereumjs-tx
//引入
var Tx = require('ethereumjs-tx');

补充:
第一条构建原始交易对象中的data:

其中data,若该交易是以太币交易,则data为空;若是部署合约,则data为合约的bytecode;如果是合约调用或者对函数调用,即是对函数签名以及参数编码的二进制字段。

一个函数调用data的前四个字节数据指定了要调用的函数签名。计算方式是使用函数签名的keccak256(即sha3)的哈希,并取4个字节。写法bytes4(keccak256(“foo()”))需要注意的是,如果有多个参数使用,隔开,要去掉表达式中的所有空格。

示例:

这里大家就能看到,当在调用合约中的函数的时候,必须要取前四个字节。以前看这段代码不太懂这句话是什么意思,现在才算是懂了。

end

【以太坊】Ethereum交易过程及ethereumjs-tx的应用相关推荐

  1. 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络

    Creating A Private Network With Two Syncing Nodes 本文是前面两篇文章的延续,链接分别为:Windows10安装Aleth和使用Ethereum C++ ...

  2. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境...

    ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境 前言 为了保证环境稳定,我从头开了一个虚拟机. 环境如下 xiaoyu@xiaoyu ...

  3. 使用web3和infura开发以太坊ethereum区块链

    web3 Github: https://github.com/ethereum/web3.js/ web3.js是以太坊提供的一个Javascript库,它封装了以太坊的RPC通信API,提供了一系 ...

  4. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境

    ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境 前言 为了保证环境稳定,我从头开了一个虚拟机. 环境如下 xiaoyu@xiaoyu ...

  5. 以太坊(Ethereum) - 让浏览器支持区块链(MetaMask)

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  6. 以太坊(Ethereum) - 什么是智能合约

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  7. 以太坊(Ethereum) - 网络节点

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  8. 以太坊(Ethereum) - Ganache本地区块链

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  9. 以太坊(Ethereum) - 分布式应用(DApp)

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  10. (转)以太坊(Ethereum)创世揭秘 以太坊(Ethereum)创世揭秘

    什么是以太坊(Ethereum) 以太坊(Ethereum)是一个基于区块链技术,允许任何人构建和使用去中心化应用的区块链平台.像比特币一样,以太坊是开源的,并由来自全世界的支持者们共同维护.与比特币 ...

最新文章

  1. JSON数据序列化与反序列化实战
  2. 一个奇怪的生产环境配置ldap服务引起的故障及解决过程分享
  3. 云原生产业联盟成立 蚂蚁金服当选为理事单位
  4. html怎么防止表单重复提交,js防止表单重复提交的解决方法
  5. 编写下载服务器。 第五部分:油门下载速度
  6. 上海德拓人工智能事业部招聘图像算法工程师
  7. 如何用 ASP.NET Core 实现熔断和降级?
  8. C++PrimerP104
  9. 10款国外知名杀软的免费试用版(三个月、半年或一年)
  10. 菩提心的修法-菩提心的修法
  11. 怎么用优动漫PAINT做出色彩的朦胧感?
  12. android webview静态方法,在android webview中加载静态页面
  13. [白话解析] 深入浅出极大似然估计 极大后验概率估计
  14. 神经网络程序设计课学习心得
  15. 基于深度学习的红外和可见光图像融合论文及代码整理
  16. fusionCharts属性集
  17. myisam和innodb区别
  18. ‘dict_keys‘ object does not support indexing错误解决
  19. 无线网络技术——星链——三两问
  20. 如何在Windows 10中管理UAC的教程

热门文章

  1. Crypto windows 安装
  2. No module named ‘fvcore.nn.distributed‘
  3. xface 远程桌面 无法使用tab键盘
  4. Can't create layer 289 of type Squeeze in function 'cv::dnn::dnn4_v20190902::LayerData::getLaye
  5. pytorch ShuffleNetV2 知识整理
  6. python yield与递归
  7. Softmax的理解与应用
  8. oracle存储过程调用游标例子
  9. 计算机投诉信英语作文,【回复投诉信英语作文】_英语投诉信回复范文
  10. java中scanner if用法_Java通过Scanner了解if...else if语句