在以太坊交易中都发生了什么?

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

attachments-2018-03-9MDlTgOS5aa74ab46b850.png

作者:编程狂魔

来源:汇智网

原来链接:http://t.cn/EGEUw9d

本文约3400字+,阅读(观看)需要20分钟

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


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

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

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

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

1
2
3
4
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';

导出相应的公钥:

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

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

1
0x4643bb6b393ac20a6175c713175734a72517c63d6f73a3ca90a15356f2e967da03d16431441c61ac69aeabb7937d333829d9da50431ff6af38536aa262497b27

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

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



a8d1e325f9384547888b6c6c01dcf80e



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

  • 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地址,使用私钥签名后将从签名派生。签署交易:

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


a0a97d5c789b426b8022d2a474298949



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

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

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



eaa6447f344f4ee5bcf3f9d0c8c2686b


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

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

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

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

0x0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e

和无符号整数是:

1
0x000000000000000000000000000000000000000000000000d02ab486cedbffff


94110a08afff421c92d2906c8cba918b



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

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

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

1
2
3
4
5
var contractTx = web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5');
console.log(contractTx.from);
//0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f
console.log(contractTx.nonce);
//0

因此合约地址是:

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


94110a08afff421c92d2906c8cba918b

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

文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。

attachments-2018-02-kL1zBfXx5a7ffd0b78798.jpg


  • 发表于 2019-01-17 10:33
  • 阅读 ( 799 )
  • 分类:以太坊

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
社区运营-小以

626 篇文章

作家榜 »

  1. 社区运营-小以 626 文章
  2. 社区运营-小链 243 文章
  3. 涂晶 81 文章
  4. 于中阳Mercina-zy 79 文章
  5. 李晓琼 44 文章
  6. 兄弟连区块链培训 42 文章
  7. 吴寿鹤 36 文章
  8. John-smith 25 文章