Кто может объяснить, как физически хранятся блоки биткоин в базе данных? Не входы-выходы, связи по хэшам, а именно как в базу данных записывается блок?
alxsmrn: Нет. Все блоки храниться одним большим блобом. Блоб поделен на файлы (по 2 гигабайта, если не ошибаюсь). В LevelDB храниться индексы - смещение блока в блобе. Необходимо для быстрого поиска.
При необходимости так же создается индекс транзакций - запись какая транзакция в каком блоке лежит. Так же необходимо для быстрого поиска в блобе, но уже транзакций.
alxsmrn: да. Только повторюсь - не номер, а смещение в байтах. Блок имеет переменную длину, ограниченную сверху, поэтому ни о каких индексах (как в массиве array[n]) не может идти речи. Это то, что на low-level. Ну а поверх блоба и DB уже можно накрутить всё, что угодно, в том числе и привычную индексацию.
fshp: а не могли бы уточнить откуда берется блоб? Кто его формирует? Получается, что он связан с leveldb только логически, но что у него за формат, я не могу понять, это тоже бд? И как хранятся строки которые непосредственно формируют блок?
alxsmrn: Подытожим.
Смещение первого блока мы знаем, оно всегда 0. В заголовке блока хранится его длина. Зная длину первого блока можно вычислить смещение второго блока. И т.д.
Но если нам нужно прочитать блок с номером 1000, необходимо прочитать все предыдущие блоки. Что бы этого не делать в LevelDB хранятся записи - какой блок где находится. Это просто лишь кэш для увеличения производительности.
bitcoin-core умеет строить индексы по транзакциям (включается через опцию) - так же делается проход по всему блобу, и сохраняются смещения каждой транзакции в LevelDB.
Сами блоки хранятся в бинарном виде, в том же, в каком рассылаются по сети (возможно с другим порядком байтов, не уверен).