Skip to content

Майнер, генерирующий блок

c-darwin edited this page Dec 9, 2015 · 3 revisions

Все майнеры делятся на уровни. Майнер, который находится на 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(). Между майнерами одного уровня происходит поиск блока с наименьшим хэшем, и найденный блок записывается в блокчейн.

Атака 51%

Уровни определяются на основе заголовка блока, в котором нет значения, которым можно манипулировать. Это значит, что невозможно сделать так, чтобы на 0-м уровне оказался какой-то конкретный miner_id. Атака 51% возможна в том случае, если злоумышленник захватит 51% приватных ключей майнеров. Если в DC-сети будет 100 000 майнеров, то злоумышленнику нужно будет получить контроль над более чем 50 000 приватными ключами.

См. также

Clone this wiki locally