Bad Block Reporting

Marian OANCΞA edited this page Jun 24, 2015 · 15 revisions
Clone this wiki locally

Send a JSONRPC request to https://badblocks.ethdev.com:

Call eth_badBlock(BADBLOCK), with BADBLOCK the object described below:

BADBLOCK Object Format

NOTE: All hex is lower-case.

Types

  • DATA: freeform byte array as a string of hex, no 0x prefix.
  • DATA_20: like DATA, always of length 40.
  • HEX: string of hex-encoded big-endian integer, used for VM stack/memory/storage items, no 0x prefix, no leading zeroes.
  • INT: simple JS integer.
  • BIGINT: string of decimal-encoded integer, used for potentially bigints.
  • TAG_ERROR: described later.
  • TAG_INST: string of an EVM instruction mnemonic, uppercase e.g. "PUSH4" or "STOP".
  • VMTRACE: described later.

Type modifiers

  • SOMETIMES: field is omitted under certain circumstances.
  • NONSTANDARD: field may safely be omitted.

BADBLOCKS object

{
    "block": DATA
    "errortype": TAG_ERROR
    "hints": { (all items OPTIONAL)
        "receipts": [ DATA, ... ], OPTIONAL
        "vmtrace": VMTRACE, OPTIONAL
    }, OPTIONAL
}

Where:

receipts is simply the array of RLP-encoded receipts.

TAG_ERROR is a string containing one of (specified roughly in order of ability to detect):

Generic:

  • RLPError: One of the following:
    • BadRLP: Generally invalid RLP (e.g. 0x8100).
    • BadCast: Given RLP is of an incorrect type (e.g. 0x00 being interpreted as an integer).
    • OversizeRLP: Additional bytes trailing an otherwise valid RLP fragment (e.g. 0x8000).
    • UndersizeRLP: Bytes missing from the end of an otherwise valid RLP fragment (e.g. 0x81).

Block-specific:

  • InvalidBlock: One of the following:
    • InvalidBlockFormat: Block format is wrong (!= array, != 3 items &c.).
    • TooManyUncles: More than 2 uncles mentioned.
    • InvalidTransactionsRoot: Transactions root is different to that derived from transactions given in block.
    • InvalidUnclesHash: Uncles hash is different to that derived from uncles given in block.
    • InvalidGasUsed: Gas used is not equal to the gasUsed in the last receipt (or previous block if no transactions).
    • InvalidStateRoot: State root mentioned is different to that calculated (i.e. reward application is incorrect).
    • InvalidReceiptsRoot: Receipts root mentioned is different to that calculated (i.e. appliaction of a transaction resulted in different logs, gas-used or state-root). "receipts" and "vmtrace" should be hinted.

Block-header-specific

  • InvalidHeader: One of the following:
    • InvalidBlockHeaderItemCount: Wrong item count in header.
    • TooMuchGasUsed: Header states gas used as bigger than gas limit.
    • ExtraDataTooBig: Header's extra data is greater than limit.
    • InvalidDifficulty: Difficulty is incorrect given previous block's difficulty and timestamp.
    • InvalidGasLimit: Gas limit does not fall within bounds given previous block's gas limit.
    • InvalidBlockNonce: Nonce does not result in a proof of work which satisfies the given difficulty.
    • InvalidNumber: Number is not equal to parent number + 1.
    • InvalidTimestamp: Timestamp is not greater than parent's.
    • InvalidLogBloom: LogBloom is not equal to the bitwise-OR of all receipts' LogBlooms.

Transaction-specific

  • InvalidTransaction: One of the following:
    • OutOfGasIntrinsic: GAS below amount required for any transaction.
    • BlockGasLimitReached: Too much gas being used for the transaction within this block.
    • InvalidSignature: Transaction's signature is invalid.
    • OutOfGasBase: GAS below amount required for this transaction.
    • NotEnoughCash: Balance of sender too low.
    • InvalidNonce: Transaction nonce is wrong.

Uncle-specific

  • InvalidUncle: One of the following:
    • UncleInChain: Uncle has already been included in the current chain (either as a direct ancestor or one of its included uncles).
    • UncleTooOld: Uncle is older than the 6th generation uncle.
    • UncleIsBrother: Uncle is newer than the 1st generation uncle.

and VMTRACE is the object:

[
    {
        "stack": [ HEX, ... ]
        "memory": HEX, SOMETIMES
        "sha3memory": DATA_32, SOMETIMES
        "storage": { HEX: HEX }, SOMETIMES
        "gas": BIGINT
        "pc": BIGINT
        "inst": INT
        "depth": INT, OPTIONAL
        "steps": INT
        "address": DATA_20, SOMETIMES
        "memexpand": BIGINT, NONSTANDARD
        "gascost": BIGINT, NONSTANDARD
        "instname": STRING, NONSTANDARD
    },
    ...
]
  • stack: The stack, prior to execution.
  • memory: The memory, prior to execution. Omitted when previous operation was not memory-dependent (MLOAD/MSTORE/MSTORE8/SHA3/CALL/CALLCODE/CREATE/CALLDATACOPY/CODECOPY/EXTCODECOPY), not first operation of CALL/CREATE context or when memory >= 1024 bytes large.
  • sha3memory: The Keccak hash of the memory, prior to execution. Omitted when previous operation was not memory-dependent (MLOAD/MSTORE/MSTORE8/SHA3/CALL/CALLCODE/CREATE/CALLDATACOPY/CODECOPY/EXTCODECOPY), not first operation of CALL/CREATE context or when memory < 1024 bytes large.
  • storage: The contents of storage that SSTOREs operate on (RE-READ THAT!), prior to execution. Omitted when previous operation is not storage-dependent (SLOAD/SSTORE) and not first operation of CALL/CREATE context.
  • gas: The amount of gas available prior to this instruction.
  • pc: The program counter, immediately prior to execution.
  • inst: The instruction opcode index that is to be executed (e.g. STOP would be 0).
  • depth: The depth of in present context in CALL/CREATE stack. Omitted when no change since previous operation and not first operation of CALL/CREATE context.
  • steps: The number of steps taken so far in present CALL/CREATE context prior to executing the current instruction.
  • address: The address of account that would be returned by MYADDRESS opcode. Omitted when no change since previous operation and not first operation of CALL/CREATE context.
  • memexpand: The size that memory is to be expanded by in words for this operation. Omitted when zero.
  • gascost: The total cost of gas for executing this instruction (technically the /maximum/ total cost of gas - CALL/CREATE may return gas).