#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.