Стоит ли мне создание запроса тянуть для этого?
Прецедент является то, что я хочу, чтобы просмотреть транзакции в каждом блоке, как они приходят.
Я могу сделать это с getblock и кучей getrawtransaction вызовов, * если * txindex установлен в 1.
Но так как я не отрываясь сделок в произвольных позициях в блоке цепи, я не нужен полный индекс транзакции для этого.
Я знаю, что хэш-блок, который содержит операции, и он должен затем быть возможно получить информацию о транзакции из этого блока, без полного индекса сделки.
Код для новой команды очень проста, и это, по существу, только в следующем, а также несколько небольших изменений, чтобы сделать его доступным как команда RPC:
Код:
Значение getrawtransactionsinblock (сопз массив& PARAMS, BOOL fHelp)
{
если (fHelp || params.size () < 1)
бросить runtime_error (
"getrawtransactionsinblock\ п"
"Возвращает TXID и необработанные данные транзакции для всех операций в указанном блоке. \ П"
"\ NArguments: \ п"
"1. \"хэш \" (Строка, требуется) Блок-хэш \ N"
"\ NResult \ п"
"[(Массив объекта JSON) \ П"
" {\ П"
" \"TXID \" : \"TXID \"(Строка) ИД транзакции \ п"
" \"шестнадцатеричный \" : \"данные\", (Строка) сериализованные, гекс-кодированные данные для «TXID» \ п"
" } \ П"
" , ... \ п"
"] \ П"
"\ NПримеры: \ п"
+ HelpExampleCli ("getrawtransactionsinblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 \"")
+ HelpExampleRpc ("getrawtransactionsinblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 \"")
);
STD :: String strHash = PARAMS [0] .get_str ();
uint256 хэш (strHash);
если (mapBlockIndex.count (хэш) == 0)
бросить JSONRPCError (RPC_INVALID_ADDRESS_OR_KEY, "Блок не найден");
CBlock блок;
CBlockIndex * pblockindex = mapBlockIndex [хэш];
ReadBlockFromDisk (блок, pblockindex);
Массив;
BOOST_FOREACH (Const CTransaction &TX, block.vtx) {
Объект txEntry;
txEntry.push_back (пара ("TXID", Tx.GetHash () GetHex ())).
CDataStream ssTx (SER_NETWORK, protocol_version);
ssTx << ТХ;
Строка strHex = HexStr (ssTx.begin (), ssTx.end ());
txEntry.push_back (пара ("наговор", StrHex));
a.push_back (txEntry);
}
возвращать;
}
{
если (fHelp || params.size () < 1)
бросить runtime_error (
"getrawtransactionsinblock
"Возвращает TXID и необработанные данные транзакции для всех операций в указанном блоке. \ П"
"\ NArguments: \ п"
"1. \"хэш \" (Строка, требуется) Блок-хэш \ N"
"\ NResult \ п"
"[(Массив объекта JSON) \ П"
" {\ П"
" \"TXID \" : \"TXID \"(Строка) ИД транзакции \ п"
" \"шестнадцатеричный \" : \"данные\", (Строка) сериализованные, гекс-кодированные данные для «TXID» \ п"
" } \ П"
" , ... \ п"
"] \ П"
"\ NПримеры: \ п"
+ HelpExampleCli ("getrawtransactionsinblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 \"")
+ HelpExampleRpc ("getrawtransactionsinblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 \"")
);
STD :: String strHash = PARAMS [0] .get_str ();
uint256 хэш (strHash);
если (mapBlockIndex.count (хэш) == 0)
бросить JSONRPCError (RPC_INVALID_ADDRESS_OR_KEY, "Блок не найден");
CBlock блок;
CBlockIndex * pblockindex = mapBlockIndex [хэш];
ReadBlockFromDisk (блок, pblockindex);
Массив;
BOOST_FOREACH (Const CTransaction &TX, block.vtx) {
Объект txEntry;
txEntry.push_back (пара ("TXID", Tx.GetHash () GetHex ())).
CDataStream ssTx (SER_NETWORK, protocol_version);
ssTx << ТХ;
Строка strHex = HexStr (ssTx.begin (), ssTx.end ());
txEntry.push_back (пара ("наговор", StrHex));
a.push_back (txEntry);
}
возвращать;
}
Название довольно долго, но говорит, что он делает на поле.
(Может быть укорочен на что-то вроде «getblocktransactions», я думаю, но это менее ясно, что это делает именно.
Другая возможность могла бы добавить возможность пройти вмещающий blockhash, чтобы getrawtransaction, я думаю, и не требует полного индекса сделки в этом случае.
Это будет еще один способ, чтобы избежать необходимости полного индекса сделки в нашем случае использования, но намного менее эффективным, поскольку он требует намного больше RPC вызовы, чтобы получить все сделки.
Переключение с getblock + getrawtransaction вызовы getrawtransactionsinblock дал нам довольно значительное ускорение.
Сканирование всех сделок, как они приходят кажется, что это должно быть довольно распространенным примером использования таких вещей, как бумажники, которые используют bitcoind в качестве движка для управления сетью, а просто возвращаются все сделки, то это, кажется, как хорошее эффективным решение для такого рода вещей в Генеральная.
Для получения информации, мы используем этот специальный метод в опорном протоколе SwapBill клиента (объявление темы здесь:, клиент исходный код и ридй на GitHub здесь:https://github.com/crispweed/swapbill), Но кажется, что это довольно общее требование, и может быть полезно во многих других случаях!
Томас