Наиболее эффективная реализация для поиска последнего блока в блокчейне

#java #algorithm #data-structures #blockchain

#java #алгоритм #структуры данных #блокчейн

Вопрос:

Итак, я создаю блокчейн-проект, и я столкнулся с проблемой, когда мне нужно получить последний блок. Теперь, кто не знает, как работает блокчейн, он в основном построен следующим образом:

БЛОК 0:

 Previous hash: 0

Hash: 104973
  

БЛОК 1:

 Previous hash: 104973

Hash: 859236
  

БЛОК 2:

 Previous hash: 859236

Hash: 523564
  

Таким образом, создается цепочка, связанная хэшами.
Теперь у каждого блока есть файл, представляющий блок, все в 1 папке, поэтому имя папки «Blocks», и она содержит 3 файла («BLOCK104973.bl», «BLOCK859236.bl», «BLOCK523564.bl»).

Теперь мне нужно получить последний блок, какой был бы наиболее эффективный способ сделать это? Что я думал о:

Переберите все блоки (файлы) в папке и составьте список их хэшей, затем повторите цикл для каждого хэша и посмотрите, у какого хэша нет соответствующего блока (блока, у которого предыдущий хэш равен текущему хэшу в цикле).

Но это кажется крайне неэффективным, и было интересно, есть ли у кого-нибудь идея получше (или есть ли способ, который люди обычно используют в блокчейне)? Обратите внимание, что получение блока по дате изменения файла для меня недостаточно надежно.

Комментарии:

1. Это просто двусвязный список… Вы всегда можете сохранить ссылку на самую последнюю ссылку

2. @OneCricketeer К сожалению, я не могу сохранить ссылку на самую последнюю ссылку, поскольку она недостаточно надежна, например, в случае полного изменения блокчейна.

3. Если все изменится, то у вас появится новый конечный блок, и вы сможете отбросить старую ссылку… Но цепочки блоков должны быть неизменяемыми, так что в любом случае это не должно быть разрешено

4. @OneCricketeer Да, вы правы, но это другой вид реализации блокчейна, и теоретически у вас может быть несколько блокчейнов одновременно.

Ответ №1:

Обход блокчейна, начиная с блока genesis, является довольно редкой задачей. Обычно узел блокчейна имеет последний блок либо из сети, либо генерирует его. Таким образом, намного проще двигаться в противоположном направлении, следуя ссылке на предыдущий хэш блока. И тогда единый связанный список можно поменять местами.

Также большинство, если не все, реализаций блокчейна используют некоторую базу данных для ускорения доступа к данным. Bitcoin core использует LevelDB. Один из индексов содержит ключ block has, а значением является запись индекса блока, которая содержит заголовок блока, высоту блока (номер блока) и некоторую другую информацию. Файлы LevelDB хранятся в каталоге.bitcoin/blocks/index.