2022 [11] Blockchain

Существует система хранения документов, построенная на основе связного списка блоков (блокчейн). Блоки состоят из транзакций и информации о предыдущем блоке цепочки. Структура блока описана в формате JSON и содержит следующую информацию:
– номер блока (_id),
– дата создания блока в формате “YYYY-MM-DD” (date),
– список транзакций, входящих в состав блока (storage),
– хеш-значение предыдущего блока (hash_prev),
– контрольная строка (nonce).
Для добавления блока в связный список необходимо вычислить значение контрольной строки (NONCE) такое, чтобы хеш-функция этого блока возвращала строку, начинающуюся с символов ‘00’. Хеш-функция блока вычисляется на основе значения хеш функции предыдущего блока, значения хеш-функции от списка идентификаторов транзакций блока и значения контрольной строки NONCE (см. листинги 1, 2 на языке C++).

Листинг 1 – Функция получения хеш-строки по массиву идентификаторов транзакций на языке программирования C++
// алфавит хеш-строки
const std::string ALPHABET = "0123456789@<=>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

// получение символа из алфавита хеш-строки по его индексу (по модулю длины алфавита)
char getHashChar(unsigned long long index) {
return ALPHABET[index % ALPHABET.length()];
}


// Получение хеш-строки по массиву из ID транзакций
// STORAGE - массив (вектор) чисел-идентификаторов транзакций
// SIZE    - длина получаемой хеш-строки
// RETURN
//   вычисленную хеш-строку длины SIZE
std::string StorageHash(std::vector<int> storage, int size) {
// строка - результат (резервируем необходимое количество символов)
std::string res(size, 0);

// необходимые константы
unsigned long long intHash;
unsigned long long sum = 42;
unsigned long long mul = 37;

// основной цикл
for (int i = 0; i < size; i += 2) {
// вычисление суммы с предыдущим вычисленным значением hash 
intHash = sum + i + (i > 0 ? res[i - 1] : 0);
// нормирование - получение символа хеш-строки
res[i] = getHashChar(intHash);
// вычисление произведения на основе суммы
intHash = (mul + i) * intHash;
// нормирование - получение символа хеш-строки
res[i + 1] = getHashChar(intHash);
}

// замешивание идентификаторов транзакций
for (int i = 0; i < storage.size(); i++) {
// сложение
intHash = res[i % size] + storage[i];
// нормирование - получение символа хеш-строки
res[i % size] = getHashChar(intHash);
// умножение
intHash = res[(i + 1) % size] * storage[i];
// нормирование - получение символа хеш-строки
res[(i + 1) % size] = getHashChar(intHash);
}
// возвращение результата
return res;
}

Листинг 2 – Функция получения хеш-строки по блоку в цепочке блокчейн на языке программирования C++
// алфавит хеш-строки
const std::string ALPHABET = "0123456789@<=>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

// получение символа из алфавита хеш-строки по его индексу (по модулю длины алфавита)
char getHashChar(unsigned long long index) {
return ALPHABET[index % ALPHABET.length()];
}

// Получение хеш-строки на блок
// PREVHASH   - хеш-строка предыдущего блока блокчейна
// STORAGEHASH - хеш-строка по массиву ID транзакций текущего блока
// NONCE       - контрольная строка
// SIZE        - длина получаемой хеш-строки
// RETURN
//   вычисленную хеш-строку
std::string BlockHash(std::string prevHash, std::string storageHash, std::string nonce, int size) {
// строка - результат (резервируем необходимое количество символов)
std::string res(size, 0);
// необходимые константы
unsigned long long intHash;
unsigned long long hash = 2139062143;
unsigned long long sum = 42;
unsigned long long mul = 37;

// склеивание prevHash и storageHash
for (int i = 0; i < size; i += 2) {
res[i] = unsigned char(prevHash[i] + storageHash[i]);
res[i + 1] = unsigned char(prevHash[i + 1] * storageHash[i + 1]);
}
// основной цикл - склеивание с NONCE 
for (int i = 0; i < size; i += 2) {
// сложение с очередным символом NONCE
intHash = sum + i + res[i] + nonce[i];
// нормирование - получение символа хеш-строки
res[i] = getHashChar(intHash);
// сложение и умножение с другим символом NONCE
intHash = (mul + i + 1) * hash + res[i + 1] + nonce[size/2 + i/2];
// нормирование - получение символа хеш-строки
res[i + 1] = getHashChar(intHash);
}
// возвращение результата
return res;
}

Один сотрудник решил добавить только что созданный документ (транзакция с идентификатором ID=33) в блок, сформированный в предыдущем месяце. Укажите, в какой блок необходимо добавить транзакцию и какое новое значение контрольной строки NONCE в этом блоке нужно задать, чтобы значение хеш-функции блока не изменилось, и модификация блока не была обнаружена в блокчейне?

К задаче прилагается: 
blockchain_v1.json – содержимое блокчейна в формате JSON.

Показать подсказку

Показать решение

Показать ответ




<< Назад в раздел (Все задания)

Ваше сообщение получено!