Что именно проверяется на различных -checklevel'ах?

Стандартный клиент bitcoin-qt/bitcoind имеет опцию -checklevel, предназначенную для выполнения различных проверок данных блока, хранящихся на диске. Существует ли текущая документация (кроме источника), конкретно описывающая, что проверяется на разных уровнях?

Функция VerifyDBв исходниках имеет краткие комментарии с описанием уровней:

// check level 0: read from disk
// check level 1: verify block validity
// check level 2: verify undo validity
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks

Было бы неплохо увидеть их объяснение с точки зрения протокола Биткойн. Например, проверены ли хэши блоков? Проверяем ли мы, что все блоки в цепочке правильно связаны друг с другом? Проверяются ли подписи транзакций? И так далее.

Ответы (2)

Другой ответ кажется устаревшим даже в то время, когда на него был дан ответ. Следующее кажется более актуальным объяснением :

  • 0: Проверить все заголовки блоков + сравнить (по хешу) с блоками на диске для последних блоков -checkblocks
  • 1: Кроме того, проверьте (автономно) действительность этих блоков -checkblocks
  • 2: Кроме того, убедитесь, что данные отмены совпадают с контрольными суммами.
  • 3: Кроме того, убедитесь, что совпадение текущего состояния цепочки может быть разумным результатом последних N блоков, где N ограничено как -checkblocks, так и объемом кэша в памяти (-dbcache); обычно это около 150.
  • 4: Кроме того, для последних N блоков (см. выше) выполните полную проверку (включая проверку подписи).

Обратите внимание, что новое значение по умолчанию (3) на самом деле является более сильной проверкой, чем предыдущий самый высокий уровень (6).

Проверьте комментарии в этом коммите https://gitorious.org/bitcoin/luke-jr-bitcoin/commit/4538e45c46d3829a21aed7685e6fbac7e8aafad3.

Add -checklevel and improve -checkblocks

-checkblocks now takes a numeric argument: the number of blocks that must be verified at the end of the chain. Default is 2500, and 0 means all blocks.

-checklevel specifies how thorough the verification must be:

    0: only check whether the block exists on disk
    1: verify block validity (default)
    2: verify transaction index validity
    3: check transaction hashes
    4: check whether spent txouts were spent within the main chain
    5: check whether all prevouts are marked spent
    6: check whether spent txouts were spent by a valid transaction that consumes them