Я только подключить к известному хосту, поэтому я доверяю все, что исходит от него. Что я могу удалить, чтобы ускорить начальную синхронизацию с blockchain?
Я уже заметил несколько вещей в CheckBlock (main.cpp). Моя версия будет выглядеть так:
Код:
BOOL CheckBlock (Const CBlock& блок, CValidationState& состояние, BOOL fCheckPOW, BOOL fCheckMerkleRoot)
{
// Эти проверки, которые не зависят от контекста
// которые могут быть проверены перед сохранением блок-сироту.
/ *
// Ограничение размера
если (block.vtx.empty () || block.vtx.size () > MAX_BLOCK_SIZE || :: GetSerializeSize (блок, SER_NETWORK, protocol_version) > MAX_BLOCK_SIZE)
вернуться state.DoS (100, ошибка ("CheckBlock (): ограничения размера не удалось"),
REJECT_INVALID, "плохо-BLK-длина");
// Проверяем доказательство работы спичек заявленной суммы
если (fCheckPOW && ! CheckProofOfWork (block.GetHash (), block.nBits))
вернуться state.DoS (50, ошибка ("CheckBlock (): доказательство работы не удалось"),
REJECT_INVALID, "высокой хэш");
* /
// Проверяем метки
если (block.GetBlockTime () > GetAdjustedTime () + 2 * 60 * 60)
вернуться state.Invalid (ошибка ("CheckBlock (): блок временной метки слишком далеко в будущем"),
REJECT_INVALID, "время слишком новый");
/ *
// Первая сделка должна быть coinbase, остальные не должны быть
если (block.vtx.empty () ||! block.vtx [0] .IsCoinBase ())
вернуться state.DoS (100, ошибка ("CheckBlock (): первый ТХ не coinbase"),
REJECT_INVALID, "плохо центибар пропущенными");
для (беззнаковое INT I = 1; я < block.vtx.size (); я ++)
если (block.vtx [I] .IsCoinBase ())
вернуться state.DoS (100, ошибка ("CheckBlock (): более одного coinbase"),
REJECT_INVALID, "плохо центибар-множественный");
* /
/ *
// Проверка сделок
BOOST_FOREACH (Const CTransaction& ТХ, block.vtx)
если (! CheckTransaction (ТХ, состояние))
возвращать ошибку ("CheckBlock (): CheckTransaction не удалось");
* /
// Построить дерево Merkle уже. Нам нужно это в любом случае позже, и это делает
// кэш блок транзакции хэши, а это означает, что они не должны быть
// пересчитывается много раз во время проверки этого блока.
block.BuildMerkleTree ();
// Проверка на наличие дубликатов txids. Это улавливается ConnectInputs (),
// но поймать его раньше избежать потенциальной атаки DoS:
задаватьuniqueTx;
для (беззнаковое INT I = 0; я < block.vtx.size (); я ++) {
uniqueTx.insert (block.GetTxHash (я));
}
если (uniqueTx.size ()! = block.vtx.size ())
вернуться state.DoS (100, ошибка ("CheckBlock (): Дубликат сделка"),
REJECT_INVALID, "плохой-txns-дубликат", правда);
/ *
без знака INT nSigOps = 0;
BOOST_FOREACH (Const CTransaction& ТХ, block.vtx)
{
nSigOps + = GetLegacySigOpCount (ТХ);
}
если (nSigOps > MAX_BLOCK_SIGOPS)
вернуться state.DoS (100, ошибка ("CheckBlock (): недоступный SigOpCount"),
REJECT_INVALID, "плохо-BLK-sigops", правда);
// Проверка корень Merkle
если (fCheckMerkleRoot && block.hashMerkleRoot! = block.vMerkleTree.back ())
вернуться state.DoS (100, ошибка ("CheckBlock (): hashMerkleRoot несоответствие"),
REJECT_INVALID, "плохо txnmrklroot", правда);
* /
возвращает истину;
}
Какие изменения я могу сделать, чтобы ускорить его?