通过node.js看看在以太坊交易中都发生了什么?

创业维艰
• 阅读 3495

在以太坊交易中都发生了什么?以太坊可以被认为是基于交易的状态机,其中交易可以改变状态,并且状态跟踪交互。在这里,我们从高层次上检查交易的组成部分,并解释大多数乱码十六进制值是如何确定的。

我们将在本教程中使用nodejs,因此我们首先安装依赖项。

$ npm install web3@0.19 ethereumjs-util@4.4 ethereumjs-tx@1.3

然后创建一个文件tx.js并要求依赖项。

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/'));
var util = require('ethereumjs-util');
var tx = require('ethereumjs-tx');

首先,我们从一个私钥开始。以太坊使用公钥加密进行身份验证。更具体地,使用具有secp256k1曲线的椭圆曲线数字签名算法(ECDSA)。除了一些限制外,私钥只是一个随机的256位数据。例如:

var privateKey = '0xc0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de';

导出相应的公钥:

var publicKey = util.bufferToHex(util.privateToPublic(privateKey));

如果你打印出publicKey,你应该得到以下内容:

0x4643bb6b393ac20a6175c713175734a72517c63d6f73a3ca90a15356f2e967da03d16431441c61ac69aeabb7937d333829d9da50431ff6af38536aa262497b27

与该私钥相关联的以太坊地址是公钥的SHA3-256(Keccak)哈希的最后160位。

var address = '0x' + util.bufferToHex(util.sha3(publicKey)).slice(26);
//0x53ae893e4b22d707943299a8d0c844df0e3d5557

通过node.js看看在以太坊交易中都发生了什么?

正如你所看到的,实际上多个私钥可能具有相同的地址。以太坊帐户与每个地址相关联,并且每个帐户都具有以下属性:

  • nonce从0开始的传出交易数的计数。
  • balance中的以太币数量。
  • storageRoot与帐户存储关联的哈希。
  • codeHash管理帐户的代码的哈希,如果这是空的,那么该帐户是可以使用其私钥访问的普通帐户,否则它是一个智能合约,其交互由其代码管理。

接下来我们来看一个交易,有6个输入字段:

  • nonce从0开始的传出交易数的计数。
  • gasPrice价格确定交易将花费的以太量。
  • gasLimit允许用于处理交易的最大gas。
  • to交易发送到的帐户,如果为空,交易将创建合约。
  • 估计要发送的以太网的value
  • data可以是对合约或代码的任意消息或函数调用以创建合约。

发送1000wei(1ether =10的18次方wei)的ether并留下0xc0de消息的交易可以构造如下:

var rawTx = {
    nonce: web3.toHex(0),
    gasPrice: web3.toHex(20000000000),
    gasLimit: web3.toHex(100000),
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
    value: web3.toHex(1000),
    data: '0xc0de'
};

请注意,未指定发件人from地址,使用私钥签名后将从签名派生。签署交易:

var p = new Buffer('c0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de', 'hex');
var transaction = new tx(rawTx);
transaction.sign(p);

通过node.js看看在以太坊交易中都发生了什么?

然后可以将交易发送到网络,并由256位交易id跟踪。此交易可在Etherscan查看。交易id是交易的哈希。

console.log(util.bufferToHex(transaction.hash(true)));
//0x8b69a0ca303305a92d8d028704d65e4942b7ccc9a99917c8c9e940c9d57a9662

通过node.js看看在以太坊交易中都发生了什么?

接下来,我们来看一下函数调用的数据data组成。以此交易的数据为例:

console.log(web3.eth.getTransaction('0xaf4a217f6cc6f8c79530203372f3fbec160da83d1abe048625a390ba1705dd57').input);
//0xa9059cbb0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e000000000000000000000000000000000000000000000000d02ab486cedbffff

为了知道它正在调用哪个函数,必须事先知道合约的函数以创建哈希表。第一个32位a9059cbb是函数哈希的第一个32位。在这种情况下,函数是transfer(address _to,uint256 _value),其哈希值是:

console.log(web3.sha3('transfer(address,uint256)'));
//0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b

每个参数后面跟256位,所以在这种情况下地址是:

0x0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e

和无符号整数是:

0x000000000000000000000000000000000000000000000000d02ab486cedbffff

通过node.js看看在以太坊交易中都发生了什么?

接下来,如上所述,通过省略to字段,将创建合约。但合约的地址是如何确定的?以此交易为例:

console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress);
//0x950041c1599529a9f64cf2be59ffb86072f00111

合约地址是发件人地址的最后160位hash,其nonce可以预先确定。对于此交易,可以通过以下方式找到发件人和nonce`:

var contractTx = web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5');
console.log(contractTx.from);
//0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f
console.log(contractTx.nonce);
//0

因此合约地址是:

console.log('0x' + util.bufferToHex(util.rlphash(['0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f', 0])).slice(26));
//0x950041c1599529a9f64cf2be59ffb86072f00111

通过node.js看看在以太坊交易中都发生了什么?

现在我们已经对这些十六进制了解了一点!

以太坊和智能合约具有破坏许多行业的巨大潜力。网上有很多资源,你可以在下面找到一些资源继续探索以太坊!

以太坊主站点:https://www.ethereum.org/
Mist以太坊的客户端之一:https://github.com/ethereum/m...
Solidity:http://solidity.readthedocs.i...
Web3 api:https://github.com/ethereum/w...
社区讨论:https://www.reddit.com/r/ethe...

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

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文在以太坊交易中都发生了什么?

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
ETH挖矿软件最新评测对比【2021】
以太坊近来高出天际的交易手续费对于DeFi等领域的以太坊开发人员而言并不全是坏消息——如果手头恰好有NVIDIA或AMD显卡,不妨利用这些闲置资源参与ETH挖矿,进而从高昂的gas手续费中获取一些额外的被动收益。在这个教程中,我们将对GMiner、TRex、EthMiner、lolMiner、PhoenixMiner、NBMiner、TeamRed
Stella981 Stella981
3年前
EIP712实现无Gas以太坊交易【含源码】
每个人都在讨论无gas以太坊交易,因为没有人喜欢支付gas费用。但是以太坊网络能够精准地运转恰恰是因为交易需要手续费。那么如何实现无gas交易呢?让我们一起学习无gas以太坊交易的魔法!在这篇文章中,我们将学习如何实现无gas交易模式。你会发现虽然在以太坊上没有免费的午餐,但可以用有趣的方式来转移gas成本。利用本文中学到的知识,你的DApp用户就可以省
Stella981 Stella981
3年前
Solidity合约安全漏洞分析教程【Mythril】
在这个教程中,我们将学习Mythril的安装与使用方法,了解Mythril的工作原理,掌握如何利用EtherThief和Suicide模块分析合约的安全漏洞,以及如何配置Mythril安全分析的交易数量参数和执行超时参数。用自己熟悉的语言学习以太坊DApp开发:Java(https://www.oschina.net/action/GoToLi
Stella981 Stella981
3年前
EthSnarks以太坊混币器【零知识证明】
Miximus是一个用于以太坊区块链的去中心化混币器和匿名转账应用,由EthSnarks作者开发,用于展示零知识证明在以太坊上的实用性。本文介绍Miximus以太坊混币应用的安装使用方法、工作原理和实现细节。用自己熟悉的语言学习以太坊DApp开发:Java(https://www.oschina.net/action/GoToLink?urlh
Wesley13 Wesley13
3年前
NEO从源码分析看UTXO交易
_0x00前言_社区大佬:“交易是操作区块链的唯一方式。”_0x01交易类型_在NEO中,几乎除了共识之外的所有的对区块链的操作都是一种“交易”,甚至在“交易”面前,合约都只是一个小弟。交易类型的定义在Core中的TransactionType中:源码位置:neo/Core/TransactionType
Stella981 Stella981
3年前
DeFi Compound开发REST API
在这个教程中,我们将学习如何为DeFi协议Compound的智能合约创建一个可以通过HTTP访问的API开发接口,并学习如何使用Infura作为以太坊网络和应用之间的桥梁。Compound是一个基于以太坊的数字资产借贷利率协议。Infura(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%
Stella981 Stella981
3年前
Solidity内联汇编简明指南
在用Solidity开发以太坊智能合约时,使用汇编可以直接与EVM交互,降低gas开销成本,更精细的控制智能合约的行为,因此值得Solidity开发者学习并加以利用。本文是Solidity汇编开发的简明教程,旨在帮助你快速熟悉如何在Solidity智能合约代码中嵌入汇编代码。以太坊教程链接:Dapp入门(https://www.oschina.n
创业维艰
创业维艰
Lv1
纸上得来终觉浅,绝知此事要躬行。
文章
6
粉丝
0
获赞
0