По этой причине я полагал, что это может быть хорошей идеей, чтобы осуществить обработку цепи и метод getwork непосредственно в программное обеспечение пула, который уже в основном делается: http://code.google.com/p/bitcoinsharp/ Однако это, кажется, не имеет getwork реализовано и как таковой я смотрю на то, что обработка участвуют в получении различных частей данных работ.
До сих пор я нашел очень мало об этом, то, что я нашел до сих пор из исходного кода клиента:
Код:
если (params.size () == 0)
{
// блок обновления
Статический неподписанный INT nTransactionsUpdatedLast;
Статическая CBlockIndex * pindexPrev;
Статическая int64 nStart;
Статическая CBlock * pblock;
если (pindexPrev! = pindexBest ||
(NTransactionsUpdated! = NTransactionsUpdatedLast && GetTime () - nStart > 60))
{
если (pindexPrev! = pindexBest)
{
// DEALLOCATE старых блоков, так как они теперь вы устарели
mapNewBlock.clear ();
BOOST_FOREACH (CBlock * pblock, vNewBlock)
удалить pblock;
vNewBlock.clear ();
}
nTransactionsUpdatedLast = nTransactionsUpdated;
pindexPrev = pindexBest;
nStart = GetTime ();
// Создать новый блок
pblock = CreateNewBlock (reservekey);
если (! pblock)
бросить JSONRPCError (-7, "Недостаточно памяти");
vNewBlock.push_back (pblock);
}
// Обновление NTime
pblock->Ntime = макс (pindexPrev->GetMedianTimePast () + 1, GetAdjustedTime ());
pblock->nNonce = 0;
// Обновление nExtraNonce
статический беззнаковый INT nExtraNonce = 0;
статическая int64 nPrevTime = 0;
IncrementExtraNonce (pblock, pindexPrev, nExtraNonce, nPrevTime);
// Сохранить
mapNewBlock [pblock->hashMerkleRoot] = make_pair (pblock, nExtraNonce);
// Prebuild хэш-буфер
символ pmidstate [32];
символьный PDATA [128];
символ phash1 [64];
FormatHashBuffers (pblock, pmidstate, PDATA, phash1);
uint256 hashTarget = CBigNum (). SetCompact (pblock->Nbits) .getuint256 ();
Результат объекта;
result.push_back (пара ("Midstate", HexStr (НАЧАТЬ (pmidstate), конец (pmidstate))));
result.push_back (пара ("данные", HexStr (НАЧАТЬ (PDATA), конец (PDATA))));
result.push_back (пара ("hash1", HexStr (НАЧАТЬ (phash1), конец (phash1))));
result.push_back (пара ("цель", HexStr (НАЧАТЬ (hashTarget), END (hashTarget))));
возвращать результат;
}
еще
{
// параметры Разбор
вектор<неподписанные символ> vchData = ParseHex (PARAMS [0] .get_str ());
если (vchData.size ()! = 128)
бросить JSONRPCError (-8, "Неверный параметр");
CBlock * PDATA = (CBlock *)&vchData [0];
// Байт обратного
для (INT I = 0; я < 128/4; я ++)
((Беззнаковое INT *) PDATA) [I] = CryptoPP :: ByteReverse (((беззнаковое INT *) PDATA) [I]);
// Получить сохраняемый блок
если (! mapNewBlock.count (pdata->hashMerkleRoot))
вернуться ложным;
CBlock * pblock = mapNewBlock [pdata->hashMerkleRoot .first];
неподписанных INT nExtraNonce = mapNewBlock [pdata->hashMerkleRoot .second];
pblock->Ntime = pdata->NTime;
pblock->nNonce = pdata->nNonce;
pblock->VTX [0] .vin [0] = .scriptSig CScript () << pblock->Nbits << CBigNum (nExtraNonce);
pblock->hashMerkleRoot = pblock->BuildMerkleTree ();
вернуться CheckWork (pblock, * pwalletMain, reservekey);
}
{
// блок обновления
Статический неподписанный INT nTransactionsUpdatedLast;
Статическая CBlockIndex * pindexPrev;
Статическая int64 nStart;
Статическая CBlock * pblock;
если (pindexPrev! = pindexBest ||
(NTransactionsUpdated! = NTransactionsUpdatedLast && GetTime () - nStart > 60))
{
если (pindexPrev! = pindexBest)
{
// DEALLOCATE старых блоков, так как они теперь вы устарели
mapNewBlock.clear ();
BOOST_FOREACH (CBlock * pblock, vNewBlock)
удалить pblock;
vNewBlock.clear ();
}
nTransactionsUpdatedLast = nTransactionsUpdated;
pindexPrev = pindexBest;
nStart = GetTime ();
// Создать новый блок
pblock = CreateNewBlock (reservekey);
если (! pblock)
бросить JSONRPCError (-7, "Недостаточно памяти");
vNewBlock.push_back (pblock);
}
// Обновление NTime
pblock->Ntime = макс (pindexPrev->GetMedianTimePast () + 1, GetAdjustedTime ());
pblock->nNonce = 0;
// Обновление nExtraNonce
статический беззнаковый INT nExtraNonce = 0;
статическая int64 nPrevTime = 0;
IncrementExtraNonce (pblock, pindexPrev, nExtraNonce, nPrevTime);
// Сохранить
mapNewBlock [pblock->hashMerkleRoot] = make_pair (pblock, nExtraNonce);
// Prebuild хэш-буфер
символ pmidstate [32];
символьный PDATA [128];
символ phash1 [64];
FormatHashBuffers (pblock, pmidstate, PDATA, phash1);
uint256 hashTarget = CBigNum (). SetCompact (pblock->Nbits) .getuint256 ();
Результат объекта;
result.push_back (пара ("Midstate", HexStr (НАЧАТЬ (pmidstate), конец (pmidstate))));
result.push_back (пара ("данные", HexStr (НАЧАТЬ (PDATA), конец (PDATA))));
result.push_back (пара ("hash1", HexStr (НАЧАТЬ (phash1), конец (phash1))));
result.push_back (пара ("цель", HexStr (НАЧАТЬ (hashTarget), END (hashTarget))));
возвращать результат;
}
еще
{
// параметры Разбор
вектор<неподписанные символ> vchData = ParseHex (PARAMS [0] .get_str ());
если (vchData.size ()! = 128)
бросить JSONRPCError (-8, "Неверный параметр");
CBlock * PDATA = (CBlock *)&vchData [0];
// Байт обратного
для (INT I = 0; я < 128/4; я ++)
((Беззнаковое INT *) PDATA) [I] = CryptoPP :: ByteReverse (((беззнаковое INT *) PDATA) [I]);
// Получить сохраняемый блок
если (! mapNewBlock.count (pdata->hashMerkleRoot))
вернуться ложным;
CBlock * pblock = mapNewBlock [pdata->hashMerkleRoot .first];
неподписанных INT nExtraNonce = mapNewBlock [pdata->hashMerkleRoot .second];
pblock->Ntime = pdata->NTime;
pblock->nNonce = pdata->nNonce;
pblock->VTX [0] .vin [0] = .scriptSig CScript () << pblock->Nbits << CBigNum (nExtraNonce);
pblock->hashMerkleRoot = pblock->BuildMerkleTree ();
вернуться CheckWork (pblock, * pwalletMain, reservekey);
}
Я понимаю, почему это проверки количества параметров, однако у меня есть очень трудное время следующего остальной части коды, как это кажется довольно суматоха с другим лишь косвенно связанным с материалом, например, что делает высвобождение старых блоков нужно сделать с получением нового Работа?
Так что все во всем процессе получения работы по-прежнему в темноте для меня бы кто-нибудь обмена ума ссылки или их собственные знания об этом процессе?