debug_traceBadBlock
curl --request POST \
--url https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154 \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "debug_traceBadBlock",
"params": [
"0x0000000000000000000000000000000000000000000000000000000000000000",
{
"tracer": "callTracer"
}
]
}
'import requests
url = "https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "debug_traceBadBlock",
"params": ["0x0000000000000000000000000000000000000000000000000000000000000000", { "tracer": "callTracer" }]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 1,
jsonrpc: '2.0',
method: 'debug_traceBadBlock',
params: [
'0x0000000000000000000000000000000000000000000000000000000000000000',
{tracer: 'callTracer'}
]
})
};
fetch('https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => 1,
'jsonrpc' => '2.0',
'method' => 'debug_traceBadBlock',
'params' => [
'0x0000000000000000000000000000000000000000000000000000000000000000',
[
'tracer' => 'callTracer'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154"
payload := strings.NewReader("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBadBlock\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n {\n \"tracer\": \"callTracer\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154")
.header("Content-Type", "application/json")
.body("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBadBlock\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n {\n \"tracer\": \"callTracer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBadBlock\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n {\n \"tracer\": \"callTracer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "<string>",
"id": 123,
"result": [
{}
]
}Arbitrum node API
debug_traceBadBlock | Arbitrum
Arbitrum API method that traces all transactions in a block that has been marked as “bad” by the node. Chainstack Arbitrum reference.
POST
/
66f812de2a6724a75a51f60dd6f2a154
debug_traceBadBlock
curl --request POST \
--url https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154 \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "debug_traceBadBlock",
"params": [
"0x0000000000000000000000000000000000000000000000000000000000000000",
{
"tracer": "callTracer"
}
]
}
'import requests
url = "https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "debug_traceBadBlock",
"params": ["0x0000000000000000000000000000000000000000000000000000000000000000", { "tracer": "callTracer" }]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 1,
jsonrpc: '2.0',
method: 'debug_traceBadBlock',
params: [
'0x0000000000000000000000000000000000000000000000000000000000000000',
{tracer: 'callTracer'}
]
})
};
fetch('https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => 1,
'jsonrpc' => '2.0',
'method' => 'debug_traceBadBlock',
'params' => [
'0x0000000000000000000000000000000000000000000000000000000000000000',
[
'tracer' => 'callTracer'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154"
payload := strings.NewReader("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBadBlock\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n {\n \"tracer\": \"callTracer\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154")
.header("Content-Type", "application/json")
.body("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBadBlock\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n {\n \"tracer\": \"callTracer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://nd-954-882-037.p2pify.com/66f812de2a6724a75a51f60dd6f2a154")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"debug_traceBadBlock\",\n \"params\": [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n {\n \"tracer\": \"callTracer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "<string>",
"id": 123,
"result": [
{}
]
}Arbitrum API method that traces all transactions in a block that has been marked as “bad” by the node. Bad blocks are blocks that failed validation during import. This method works similarly to
debug_traceBlockByHash but looks up the block from the bad blocks cache instead of the canonical chain. It is primarily used for diagnosing why a block was rejected.
Learn how to deploy a node with the debug and trace API methods enabled.
This method is available for post-Nitro blocks only (block 22,207,815 and later). For pre-Nitro blocks, use the
arbtrace_* methods instead.Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.
Parameters
hash— the hash of the bad block to trace.object— (optional) an object identifying the type of tracer and its configuration:tracer— the name of the tracer to use (callTracer,prestateTracer,4byteTracer, or a custom JS tracer).timeout— the timeout for the tracing operation. Defaults to5s.reexec— the number of blocks to re-execute to reconstruct historical state. Defaults to 128.
Response
result— an array of trace results, one per transaction in the block:txHash— the hash of the transaction.result— the trace output for the transaction (format depends on the tracer used).error— an error message if the transaction trace failed.
debug_traceBadBlock code examples
const ethers = require('ethers');
const NODE_URL = "YOUR_CHAINSTACK_ENDPOINT";
const provider = new ethers.JsonRpcProvider(NODE_URL);
const debugTraceBadBlock = async (blockHash) => {
const result = await provider.send("debug_traceBadBlock", [
blockHash,
{ tracer: "callTracer" }
]);
console.log(result);
};
debugTraceBadBlock("0x0000000000000000000000000000000000000000000000000000000000000000");
from web3 import Web3
node_url = "YOUR_CHAINSTACK_ENDPOINT"
web3 = Web3(Web3.HTTPProvider(node_url))
block_hash = "0x0000000000000000000000000000000000000000000000000000000000000000"
result = web3.provider.make_request('debug_traceBadBlock', [block_hash, {"tracer": "callTracer"}])
print(result)
Use case
Thedebug_traceBadBlock method is essential for diagnosing block validation failures. When a node rejects a block, this method allows developers and node operators to re-execute and trace the transactions in the rejected block to identify the specific transaction or state transition that caused the validation failure. This is particularly useful for debugging consensus issues and understanding chain reorganization events.Body
application/json
Last modified on June 22, 2026
Was this page helpful?