15

I want to use debug.traceTransaction to get internal transactions from NodeJS using web3 API. I'm using web3 0.17 beta and I don't see any debug_traceTransaction on the code. Am I missing something or I have to call directly to the RPC?

2 Answers 2

12

As documented in debug.traceTransaction(...), you can only access this API call using the geth JavaScript console or the JSON-RPC API. There is no web3 API that I know of. There are some unofficial extension web3 APIs, but I don't know if debug.traceTransaction is supported by these. Looks like you have to use JSON-RPC to access this data.


geth JavaScript API

Start geth with the appropriate parameters to enable RPC and the debug module:

geth --cache=1024 --rpc --rpcapi "eth,net,web3,debug" console

We can trace the transaction 0x3684f071b34da1116282ee88a106a8f2a266d273ef7d8964957f65128fb58d77 in the geth console:

> debug.traceTransaction("0x3684f071b34da1116282ee88a106a8f2a266d273ef7d8964957f65128fb58d77")
{
  gas: 45480,
  returnValue: "0000000000000000000000000000000000000000000000000000000000000001",
  structLogs: [{
      depth: 1,
      error: "",
      gas: 76741,
      gasCost: 3,
      memory: null,
      op: "PUSH1",
      pc: 0,
      stack: [],
      storage: {}
    ...


JSON-RPC API

And here is an example trace using the JSON-RPC API:

curl localhost:8545 -X POST --header 'Content-type: application/json' --data '{"jsonrpc":"2.0", "method":"debug_traceTransaction", "params":["0x3684f071b34da1116282ee88a106a8f2a266d273ef7d8964957f65128fb58d77", {}], "id":1}'
{"jsonrpc":"2.0","id":1,"result":{"gas":45480,"returnValue":"0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"PUSH1","gas":76741,"gasCost":3,"depth":1,"error":"","stack":[],"memory":null,"storage":{}} ...


See also:



Update Dec 19 2016 Responding To @Avatar's Comment Below

(Including the comment below @Pablo Yabo's answer)

If I start geth using the following command line:

Iota:~ user$ geth --rpc console

And I try to execute the following curl command:

Iota:~ user$ curl localhost:8545 -X POST --header 'Content-type: application/json' --data '{"jsonrpc":"2.0", "method":"debug_traceTransaction", "params":["0x3684f071b34da1116282ee88a106a8f2a266d273ef7d8964957f65128fb58d77", {}], "id":1}'

I get the following result:

{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"The method debug_traceTransaction does not exist/is not available"}}

If instead I start geth with the following command:

Iota:~ user$  geth --rpc --rpcapi "eth,net,web3,debug" console

And I run the same curl command, I get the transaction trace as shown below:

{"jsonrpc":"2.0","id":1,"result":{"gas":45480,"returnValue":"0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"PUSH1","gas":76741,"gasCost":3,"depth":1,"error":null,"stack":[],"memory":null,"storage":{}},{"pc":2,"op":"PUSH1","gas":76738,"gasCost":3,"depth":1,"error":null,"stack":["0000000000000000000000000000000000000000000000000000000000000060"],"memory":null,"storage":{}},{ ...

Also note that you cannot get the debug_traceTransaction information from the section of the blockchain that you have --fast synced.

5
  • I get err == null but the result contains an error "Missing trie node fc764c15d494d80384b70d1eccf399af403eb7eb91f17da32bd1729d722374... (length: 82)". Does it mean that my blockchain is incomplete?
    – Pablo Yabo
    Commented Oct 20, 2016 at 15:39
  • 1
    I confirm that was the case. After restarting the blockchain without any --fast modificator it works perfect.
    – Pablo Yabo
    Commented Oct 20, 2016 at 17:10
  • 1
    Could we call debug.traceTransaction(...) through nodejs? The answer below confused my mind, thanks.
    – alper
    Commented Dec 19, 2016 at 9:58
  • @Avatar, see the update to my answer above. Commented Dec 19, 2016 at 12:24
  • debug.traceTransaction requires an archive node, a full node would raise an error saying the state is not available.
    – Esmailian
    Commented Oct 21 at 4:48
8

Just to ease things. In NodeJS:

var web3 = require('../tools/web3');
web3.web3.currentProvider.sendAsync({
    method: "debug_traceTransaction",
    params: ['0x3fac854179691e377fc1aa180b71a4033b6bb3bde2a7ef00bc8e78f849ad356e', {}],
    jsonrpc: "2.0",
    id: "2"
}, function (err, result) {
    ...
});

Works perfect! If your blockchain was downloaded with --fast you will have to download it again.

5
  • It gives the error as: "{ jsonrpc: '2.0', id: '2', error: { code: -32601, message: 'The method debug_traceTransaction does not exist/is not available' } }"
    – alper
    Commented Dec 19, 2016 at 9:56
  • Your blockchain was downloaded with --fast so it doesn't contain debug information. You should download it again without --fast.
    – Pablo Yabo
    Commented Jan 9, 2017 at 13:59
  • I did not use --fast to download the blockchain. @Pablo Yabo
    – alper
    Commented Jan 9, 2017 at 14:35
  • It looks the debug information isn't there. Maybe it was downloaded by an old version which didn't get debug information. I suggest downloading it again. You can do it in a VM and you can test if it works as soon as it downloads the first block, you don't need to wait until finishes it.
    – Pablo Yabo
    Commented Jan 10, 2017 at 15:42
  • i'm using infura instance and getting the same issue "The method debug_traceTransaction does not exist/is not available"
    – atul
    Commented Apr 17, 2020 at 15:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.