Как именно мне связать 2 блока, используя хэш предыдущего блока?

#c #pointers #hash #blockchain

#c #указатели #хэш #блокчейн

Вопрос:

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

Рассмотрим этот фрагмент реализации связанного списка на C :

 struct node
    {
        node *prev;
        string data;
    }

main()
{
    node *first=new node;
    node *second=new node;
    second->prev=first;
}
  

Теперь рассмотрим эту простую блочную структуру блокчейна:

 class block
    {
        string hash;
        string prev_hash;
        string data;

        public:
        string calc_hash();
    }

main()                       
{
    block genesis;
    genesis.data="name,gender,age";
    genesis.hash=calc_hash(data);
    genesis.prev_hash=0000;
    block second;
    second.data="name,gender,age";
    second.hash=calc_hash(data);
    second.prev_hash=genesis.hash;
}
  

Теперь, как именно мне связать эти блоки вместе, используя хэши вместо указателей? Или это просто должно быть реализовано как связанный список с указателями, но с некоторой функцией для проверки целостности блоков?

Ответ №1:

Блок содержит заголовок и некоторые данные (обычно транзакции). Единственная часть, которая используется для вычисления хэша, — это заголовок блока.

Заголовок блока содержит следующее:

Заголовок блока

{версия 4B} {хэш предыдущего блока 32B} {хэш корня merkle 32B} {время 4B} {биты 4B} {одноразовый номер 4B}

 version (4 Bytes) - Block format version.
previous block hash (32 Bytes) - The hash of the preceding block. This is important to include in the header because the hash of the block is calculated from the header, and thus depends on the value of the previous block, linking each new block to the last. This is the link in the chain of the blockchain.
merkle root hash (32 Bytes) - The hash of the merkle tree root of all transactions in the block. If any transaction is changed, removed, or reordered, it will change the merkle root hash. This is what locks all of the transactions in the block.
time (4 Bytes) - Timestamp in Unix Time (seconds). Since the clocks of each node around the world is not guaranteed to be synchronized, this is just required to be within of the rest of the network.
bits (4 Bytes) - Target hash value in Compact Format. The block hash must be equal to or less than this value in order to be considered valid.
nonce (4 Bytes) - Can be any 4 Byte value, and is continuously changed while mining until a valid block hash is found.
  

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

1. Нет, это не то, о чем я спрашивал. Пожалуйста, ознакомьтесь с моим обновленным описанием, это может помочь лучше понять мой вопрос.

2. second.prev_hash=genesis.hash; вот как вы их связываете, вы уже это сделали. Вы не хотите загружать все блоки в память как связанный список, у вас не хватило бы памяти. Вы бы сохранили их в базе данных, например, с их хэшем в качестве индекса. Затем, прежде чем добавлять какие-либо новые блоки в базу данных, вы проверяете их достоверность, проверяя их данные, заголовок и хэш на достоверность, в том числе на то, что хэш предыдущего блока существует и данные действительны (например, никаких двойных трат)

3. Хорошо, теперь понял. Большое спасибо 🙂