Да нет, про наличие локальной копии базы - очевидно. Ее как-то трудно не заметить, учитывая ее размер и время ее скачки.
По моим прикидкам, эта база станет со временем довольно узким местом....
Я вот придумал еще 1 способ.
Итак, система устроена так, что выбирается самая длинна цепочка, при этом сложность подстраивается каждые сколько-то блоков.
Итак, если у нас есть приличная ферма, то мы можем сделать так:
1. подправляем код, так чтобы unixtime был не реальный, а тот, что мы нарисуем.
2. оттолкнувшись от момента, когда сложность была низкой, генерируем blockchain, при этом unixtime "мы рисуем" четко на каждый следующий блок так, чтобы сложность при пересчете не росла. Поскольку мы "рисуем" какое нам надо unixtime, то реально мы можем считать блок очень быстро - при минимальной-то сложности, да нынешними мощностями. Но unixtime ставить как будто каждый следующий блок сгенерировался через 10 минут. Так мы строим свой альтернативный blockchain до текущего времени. И дальше мы "догоняем" кол-во блоков до числа кратного 2016 минус 1 (чтобы длина нашего blockchain получилась больше официального). И отправляем свой blockchain в сеть, в надежде, что оно перекроет существующий как более длинная последовательность блоков.
То есть тут основная идея в том, что создать нынешними мощностями альтернативный blockchain легко, если мы при этом правильно "эмулируем" условия при которых сложность получается минимальной. При этом в среднем что у нас, что в официале будет 1 блок в 10 секунд, поэтому длина нашего blockchain и официального - сравнима.
ps.
Странно но в коде официального клиента числа 2016 нет, хотя пишут что сложность подстраивается каждые 2016 блоков. Есть такое:
if ((pindexNew->nHeight % 20160) == 0 || (!fIsInitialDownload && (pindexNew->nHeight % 144) == 0))
но там дальше по коду не похоже на пересчет сложности.