-
Notifications
You must be signed in to change notification settings - Fork 8
Майнер, генерирующий блок
Все майнеры делятся на уровни. Майнер, который находится на 0-м уровне, т.е. имеет право сгенерировать Блок и добавить его в блокчейн раньше всех, определяется вот так:
$n = ceil( log($max_miner_id) / log(16) ); do { $hash = hash('sha256', $hash); $c = substr($hash, 0, $n); $level_0_miner_id = hexdec($c); } while( $level_0_miner_id > $max_miner_id || !$level_0_miner_id );Где $hash - sha256(sha256(user_id,block_id,prev_head_hash))), $max_miner_id - максимальный miner_id из таблицы miners
Если, например, сейчас на 0-м уровне miner_id 12689, то на 1-м уровне будут майнеры с ID 12690-12691 (2), на 2-м — 12692-126995 (4) и т.д. Если майнер на 0-м уровне не смог сгенерировать блок, то в работу включаются ноды 1-го уровня, если и они не смогли, то 2-го и т.д. При этом между уровнями должны быть задержки, которые определяются методом getGenSleep(). Между майнерами одного уровня происходит поиск блока с наименьшим хэшем, и найденный блок записывается в блокчейн.
Уровни определяются на основе заголовка блока, в котором нет значения, которым можно манипулировать. Это значит, что невозможно сделать так, чтобы на 0-м уровне оказался какой-то конкретный miner_id. Атака 51% возможна в том случае, если злоумышленник захватит 51% приватных ключей майнеров. Если в DC-сети будет 100 000 майнеров, то злоумышленнику нужно будет получить контроль над более чем 50 000 приватными ключами.