Ethereum transaction hash: how to get in advance?
Asked Answered
S

4

5

Please tell me how can I get transactionHash in avance?

// I have these tx opts:
var txOpts = {
  "to":"0x345cA3e014Aaf5dcA488057592ee47305D9B3e10",
  "nonce":"0x8",
  "gasPrice":1,
  "gas":250000,
  "value":"0xde0b6b3a7640000",
  "data":"0xd0e30db0"
}

// I create and sign tx:
var tx = new ethereumjs.Tx(txOpts);
tx.sign(new ethereumjs.Buffer.Buffer("c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", "hex"));

// I've got raw tx:
var rawTx = tx.serialize().toString('hex');
"f86c08018303d09094345ca3e014aaf5dca488057592ee47305d9b3e10880de0b6b3a764000084d0e30db01ca0625e358100f4aacb9a65e6e054d963138565e3ceafb20eae4c9c8aaa583a29eea01d8f74faba33ab577ec36ac383dd5bd5298216bcf69fe2c09bba2d3003ecd008"

When I send this tx to ganache-cli, I receive this logs:

eth_sendRawTransaction
   > {
   >   "jsonrpc": "2.0",
   >   "id": 7,
   >   "method": "eth_sendRawTransaction",
   >   "params": [
   >     "0xf86c08018303d09094345ca3e014aaf5dca488057592ee47305d9b3e10880de0b6b3a764000084d0e30db01ca0625e358100f4aacb9a65e6e054d963138565e3ceafb20eae4c9c8aaa583a29eea01d8f74faba33ab577ec36ac383dd5bd5298216bcf69fe2c09bba2d3003ecd008"
   >   ],
   >   "external": true
   > }

  Transaction: 0x73d419e3a9a63aab7ee4f3be43c0df0175f4395615945d395c827bffb3bbfecc
  Gas usage: 29634
  Block Number: 9
  Block Time: Fri Jan 12 2018 23:21:22 GMT-0700

Transaction hash is 0x73d419e3a9a63aab7ee4f3be43c0df0175f4395615945d395c827bffb3bbfecc How to get it in advance?

// use ethereumjs.hash function (is that rlp-hash?):
var hash = tx.hash().toString('hex')
"**71ef26c4c1c1b01a5f87525e8e9b3ca7ffe5c9ae30ee1e70b353bf9b14db96be**"

This is not equal to 73d419e3a9a63aab7ee4f3be43c0df0175f4395615945d395c827bffb3bbfecc!

Is there any possibility to calculat CORRECT transaction hash in advance before mining? Please tell me what functions should I use.

Thanks a lot!

Suited answered 12/1, 2018 at 20:40 Comment(0)
J
7

I digged a little bit to get the answer.

Instead of just call tx.hash().toString('hex'), you need to call like this tx.hash(true).toString('hex'), in which true stands for includeSignature when computing the hash.

In case you're curious, this is the method(https://github.com/ethereumjs/ethereumjs-tx/blob/9a6324f64f4da1cb550a3eec4eaef95da4ab441b/src/transaction.ts#L177).

And you could also get the same result from rawTx like this:

import * as ethUtil from 'ethereumjs-util';
const rawTx = `0x${signedTx.serialize().toString('hex')}`;    // 0x is important
const res1 = `0x${ethUtil.keccak(rawTx).toString('hex')}`;
const res2 = `0x${signedTx.hash(true).toString('hex')}`;
res1 === res2; // true

I hope this will help.

Joellyn answered 24/8, 2019 at 12:38 Comment(0)
P
1

This is just an issue with ganache. queueRawTransaction uses a FakeTransaction, which ignores the actual signature on your transaction and instead fakes it. I'm not entirely sure why it works this way, but I believe your code will do the right thing for a transaction submitted to an actual Ethereum network.

If you want to get the same transaction hash ganache is computing, this does the trick, but it won't be the transaction hash you get from Ethereum proper:

const EthereumTx = require('ethereumjs-tx');
const FakeTx = require('ethereumjs-tx/fake.js');

var txOpts = {
  "to":"0x345cA3e014Aaf5dcA488057592ee47305D9B3e10",
  "nonce":"0x8",
  "gasPrice":1,
  "gas":250000,
  "value":"0xde0b6b3a7640000",
  "data":"0xd0e30db0"
}

var tx = new EthereumTx(txOpts);
tx.sign(Buffer.from("c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", "hex"));

const raw = tx.serialize().toString('hex');
const fake = new FakeTx(raw);
fake.from = tx.getSenderAddress();

console.log(fake.hash(true).toString('hex'));

// Output:
// 71ef26c4c1c1b01a5f87525e8e9b3ca7ffe5c9ae30ee1e70b353bf9b14db96be
Pica answered 13/1, 2018 at 22:41 Comment(0)
R
1

The actual tx hash we've got from ganache is:

0x73d419e3a9a63aab7ee4f3be43c0df0175f4395615945d395c827bffb3bbfecc

Both FakeTx and ethereumjs-tx returns the same hash for signed transaction:

71ef26c4c1c1b01a5f87525e8e9b3ca7ffe5c9ae30ee1e70b353bf9b14db96be

However if thransaction is not signed "tx.hash().toString('hex')" returns exactly the same value as ganache cli. Even without adding 'from' to txOpts.

Ruthful answered 14/1, 2018 at 17:16 Comment(0)
M
1

It is not possible to get transaction hash in advance, you can only get transaction hash just after performing transaction.

But whenever transaction not pick by any miner this transaction hash will temporary, there is possibility that if you send very less fees with your transaction then your transaction might be not picked by any miner.

Mincing answered 24/10, 2018 at 14:21 Comment(1)
This is not quite correct. Once all transaction input data are known (e.g. from address, to address (e.g. addr. of the dest. contract), signature of the a function to call + input parameters, nonce, amount of eth to transfer, nonce, etc. ...) all encoded in to raw transaction format AND this raw tx is signed, then you can get your Tx id (tx hash) - all of this BEFORE actually sending transaction to the network ...Aloisius

© 2022 - 2024 — McMap. All rights reserved.