Ethereum/Debug API/debug_getBadBlocks

debug_getBadBlocks

debug_getBadBlocks 方法返回以太坊节点观察到并拒绝的无效区块列表。此方法对于需要检测、分析和理解共识缺陷或网络不一致性的开发人员、网络运营商和安全研究人员特别有价值。

使用场景

  • 检测网络中的共识问题和协议违规
  • 分析分叉的发生及其根本原因
  • 调试节点同步问题和与重组相关的问题
  • 验证不同客户端之间的区块链完整性
  • 监控网络健康状况并识别潜在攻击
  • 调查链重组及其模式
  • 诊断客户端特定的验证问题
  • 审计客户端实现中的区块验证逻辑
  • 识别恶意区块生产者及其模式
  • 研究网络分区事件

方法详情

此方法不需要任何参数,并返回节点检测到的任何无效区块的信息。

参数:

参数为空
请求:
Curl
curl --request POST \
  --url "https://rpc.therpc.io/ethereum" \
  --header 'Content-Type: application/json' \
  --data '{
  "method": "debug_getBadBlocks",
  "id": 1,
  "jsonrpc": "2.0",
  "params": []
}'

返回值:

包含详细信息的无效区块数组

无效区块的哈希值

带有完整详情的区块对象

区块中的基础费用每单位 gas (EIP-1559 后)

区块的难度级别

区块中包含的额外数据

区块允许的最大 gas

区块中所有交易使用的总 gas

挖掘区块的矿工地址

区块中的交易对象数组

用于详细分析的 RLP 编码区块数据

响应示例

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": [
		{
			"hash": "0x4a62f91774346144245d80e21065ab1cbc807f43611b675966dced62a6e7f7a6",
			"block": {
				"parentHash": "0x825e81563696f5eb82fe94ad52526fec1c8937b28d36bd88051e33739281d85a",
				"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
				"miner": "0x3daeee3e90d51acd79fe4446fe6962c4e0e78e9977f39cf731ed0d5b5418269b",
				"stateRoot": "0xf2790a1421d95c8d3f3d1c8a8e2342a704aef457d3996a5df9a77a818f2c8fa5",
				"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
				"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
				"logsBloom": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
				"difficulty": "0x1",
				"number": "0xc9b44",
				"gasLimit": "0x1c9c380",
				"gasUsed": "0x0",
				"timestamp": "0x65b131e7",
				"extraData": "0xd983010a1d846765746888676f312e32312e30856c696e7578",
				"mixHash": "0x9a7ab7c6c8fde86c8b9d6f49cd579bb2e9a868b8ff53bc3c3b767deaacc21c0a",
				"nonce": "0x0000000000000000",
				"baseFeePerGas": "0x12a05f200",
				"transactions": []
			},
			"rlp": "0xf90226a0825e81563696f5eb82fe94ad52526fec1c8937b28d36bd88051e33739281d85aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943daeee3e90d51acd79fe4446fe6962c4e0e78e9977f39cf731ed0d5b5418269ba0f2790a1421d95c8d3f3d1c8a8e2342a704aef457d3996a5df9a77a818f2c8fa5a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083000c9b44831c9c38080846583135f11d983010a1d846765746888676f312e32312e30856c696e7578a09a7ab7c6c8fde86c8b9d6f49cd579bb2e9a868b8ff53bc3c3b767deaacc21c0a880000000000000000850212a05f200c0"
		}
	]
}

空响应示例

{
	"jsonrpc": "2.0",
	"id": 1,
	"result": []
}

常见区块验证错误

无效区块可能因各种原因而验证失败:

  1. 无效状态转换:结果状态与预期的状态根不匹配
  2. 无效区块头:nonce、难度或 gas 限制等字段违反共识规则
  3. 无效交易:包含无效交易(例如,签名问题)
  4. 叔块验证:叔块引用不遵循协议规则
  5. 时间戳问题:区块时间戳违反允许的偏差规则
  6. gas 限制违规:gas 限制调整超出允许范围
  7. PoW 验证失败:工作量证明不符合难度要求
  8. EIP 违规:违反已激活的以太坊改进提案引入的规则

分析 RLP 数据

RLP(递归长度前缀)编码数据提供了原始区块表示:

  • 使用 RLP 解码器分析确切结构
  • 与有效区块比较以识别差异
  • 提取可能导致验证问题的特定字段
  • 对共识问题的深入技术调查具有价值

性能考虑

  • 此方法对节点的性能影响最小
  • 响应大小取决于观察到多少个错误区块
  • 使用此方法不影响节点操作或同步状态
  • 节点可能会限制它们存储的错误区块数量以节省内存

重要说明

  • 此方法主要由调查共识问题的节点运营商和开发人员使用
  • 如果未检测到无效区块,则返回空数组
  • 该方法要求在以太坊节点上启用调试 API (--http.api=eth,debug,net,web3)
  • 并非所有以太坊客户端都支持此方法(主要在 Geth 中可用)
  • 为了内存效率,节点可能会在一段时间后丢弃无效区块
  • 在运行修剪模式的节点上,历史错误区块可能不可用
  • 错误区块通常在被拒绝后不会在网络中传播
  • 不同客户端在区块验证逻辑上可能有细微差异
  • RLP 编码数据对于详细的取证分析至关重要
  • 区块可能由于诚实的错误或恶意尝试而无效

另请参阅

帮助我们变得更好!
分享此页面并帮助我们为您创建更好的产品。
我们使用cookies收集有关网站访问的匿名数据,帮助我们改善您的体验。查看我们的 隐私政策.