mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-03 18:57:06 +01:00
lightningd/bitcoind: use getrawblockatheight for getfilteredblock
This avoids the getblockhash+getblock, and more importantly that was the last functionality making use of bitcoind_getrawblock() and bitcoin_getblockhash(), so we can also get rid of them.
This commit is contained in:
parent
947f5ddde1
commit
78cb921b80
2 changed files with 22 additions and 138 deletions
|
@ -495,40 +495,6 @@ void bitcoind_estimate_fees_(struct bitcoind *bitcoind,
|
||||||
do_one_estimatefee(bitcoind, efee);
|
do_one_estimatefee(bitcoind, efee);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool process_rawblock(struct bitcoin_cli *bcli)
|
|
||||||
{
|
|
||||||
struct bitcoin_block *blk;
|
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
|
||||||
struct bitcoin_block *blk,
|
|
||||||
void *arg) = bcli->cb;
|
|
||||||
|
|
||||||
blk = bitcoin_block_from_hex(bcli, chainparams,
|
|
||||||
bcli->output, bcli->output_bytes);
|
|
||||||
if (!blk)
|
|
||||||
fatal("%s: bad block '%.*s'?",
|
|
||||||
bcli_args(tmpctx, bcli),
|
|
||||||
(int)bcli->output_bytes, bcli->output);
|
|
||||||
|
|
||||||
cb(bcli->bitcoind, blk, bcli->cb_arg);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void bitcoind_getrawblock_(struct bitcoind *bitcoind,
|
|
||||||
const struct bitcoin_blkid *blockid,
|
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
|
||||||
struct bitcoin_block *blk,
|
|
||||||
void *arg),
|
|
||||||
void *arg)
|
|
||||||
{
|
|
||||||
char hex[hex_str_size(sizeof(*blockid))];
|
|
||||||
|
|
||||||
bitcoin_blkid_to_hex(blockid, hex, sizeof(hex));
|
|
||||||
start_bitcoin_cli(bitcoind, NULL, process_rawblock, false,
|
|
||||||
BITCOIND_HIGH_PRIO,
|
|
||||||
cb, arg,
|
|
||||||
"getblock", hex, "false", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Our Bitcoin backend plugin gave us a bad response. We can't recover. */
|
/* Our Bitcoin backend plugin gave us a bad response. We can't recover. */
|
||||||
static void bitcoin_plugin_error(struct bitcoind *bitcoind, const char *buf,
|
static void bitcoin_plugin_error(struct bitcoind *bitcoind, const char *buf,
|
||||||
const jsmntok_t *toks, const char *method,
|
const jsmntok_t *toks, const char *method,
|
||||||
|
@ -885,50 +851,6 @@ static bool process_gettxout(struct bitcoin_cli *bcli)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool process_getblockhash(struct bitcoin_cli *bcli)
|
|
||||||
{
|
|
||||||
struct bitcoin_blkid blkid;
|
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
|
||||||
const struct bitcoin_blkid *blkid,
|
|
||||||
void *arg) = bcli->cb;
|
|
||||||
|
|
||||||
/* If it failed with error 8, call with NULL block. */
|
|
||||||
if (*bcli->exitstatus != 0) {
|
|
||||||
/* Other error means we have to retry. */
|
|
||||||
if (*bcli->exitstatus != 8)
|
|
||||||
return false;
|
|
||||||
cb(bcli->bitcoind, NULL, bcli->cb_arg);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bcli->output_bytes == 0
|
|
||||||
|| !bitcoin_blkid_from_hex(bcli->output, bcli->output_bytes-1,
|
|
||||||
&blkid)) {
|
|
||||||
fatal("%s: bad blockid '%.*s'",
|
|
||||||
bcli_args(tmpctx, bcli),
|
|
||||||
(int)bcli->output_bytes, bcli->output);
|
|
||||||
}
|
|
||||||
|
|
||||||
cb(bcli->bitcoind, &blkid, bcli->cb_arg);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void bitcoind_getblockhash_(struct bitcoind *bitcoind,
|
|
||||||
u32 height,
|
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
|
||||||
const struct bitcoin_blkid *blkid,
|
|
||||||
void *arg),
|
|
||||||
void *arg)
|
|
||||||
{
|
|
||||||
char str[STR_MAX_CHARS(height)];
|
|
||||||
snprintf(str, sizeof(str), "%u", height);
|
|
||||||
|
|
||||||
start_bitcoin_cli(bitcoind, NULL, process_getblockhash, true,
|
|
||||||
BITCOIND_HIGH_PRIO,
|
|
||||||
cb, arg,
|
|
||||||
"getblockhash", str, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void bitcoind_gettxout(struct bitcoind *bitcoind,
|
void bitcoind_gettxout(struct bitcoind *bitcoind,
|
||||||
const struct bitcoin_txid *txid, const u32 outnum,
|
const struct bitcoin_txid *txid, const u32 outnum,
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
void (*cb)(struct bitcoind *bitcoind,
|
||||||
|
@ -965,7 +887,7 @@ process_getfiltered_block_final(struct bitcoind *bitcoind,
|
||||||
const struct filteredblock_call *call);
|
const struct filteredblock_call *call);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_getfilteredblock_step3(struct bitcoind *bitcoind,
|
process_getfilteredblock_step2(struct bitcoind *bitcoind,
|
||||||
const struct bitcoin_tx_output *output,
|
const struct bitcoin_tx_output *output,
|
||||||
void *arg)
|
void *arg)
|
||||||
{
|
{
|
||||||
|
@ -980,25 +902,36 @@ process_getfilteredblock_step3(struct bitcoind *bitcoind,
|
||||||
if (call->current_outpoint < tal_count(call->outpoints)) {
|
if (call->current_outpoint < tal_count(call->outpoints)) {
|
||||||
o = call->outpoints[call->current_outpoint];
|
o = call->outpoints[call->current_outpoint];
|
||||||
bitcoind_gettxout(bitcoind, &o->txid, o->outnum,
|
bitcoind_gettxout(bitcoind, &o->txid, o->outnum,
|
||||||
process_getfilteredblock_step3, call);
|
process_getfilteredblock_step2, call);
|
||||||
} else {
|
} else {
|
||||||
/* If there were no more outpoints to check, we call the callback. */
|
/* If there were no more outpoints to check, we call the callback. */
|
||||||
process_getfiltered_block_final(bitcoind, call);
|
process_getfiltered_block_final(bitcoind, call);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_getfilteredblock_step2(struct bitcoind *bitcoind,
|
static void process_getfilteredblock_step1(struct bitcoind *bitcoind,
|
||||||
|
struct bitcoin_blkid *blkid,
|
||||||
struct bitcoin_block *block,
|
struct bitcoin_block *block,
|
||||||
struct filteredblock_call *call)
|
struct filteredblock_call *call)
|
||||||
{
|
{
|
||||||
struct filteredblock_outpoint *o;
|
struct filteredblock_outpoint *o;
|
||||||
struct bitcoin_tx *tx;
|
struct bitcoin_tx *tx;
|
||||||
|
|
||||||
/* If for some reason we couldn't get the block, just report a
|
/* If we were unable to fetch the block hash (bitcoind doesn't know
|
||||||
* failure. */
|
* about a block at that height), we can short-circuit and just call
|
||||||
if (block == NULL)
|
* the callback. */
|
||||||
|
if (!blkid)
|
||||||
return process_getfiltered_block_final(bitcoind, call);
|
return process_getfiltered_block_final(bitcoind, call);
|
||||||
|
|
||||||
|
/* So we have the first piece of the puzzle, the block hash */
|
||||||
|
call->result = tal(call, struct filteredblock);
|
||||||
|
call->result->height = call->height;
|
||||||
|
call->result->outpoints = tal_arr(call->result, struct filteredblock_outpoint *, 0);
|
||||||
|
call->result->id = *blkid;
|
||||||
|
|
||||||
|
/* If the plugin gave us a block id, they MUST send us a block. */
|
||||||
|
assert(block != NULL);
|
||||||
|
|
||||||
call->result->prev_hash = block->hdr.prev_hash;
|
call->result->prev_hash = block->hdr.prev_hash;
|
||||||
|
|
||||||
/* Allocate an array containing all the potentially interesting
|
/* Allocate an array containing all the potentially interesting
|
||||||
|
@ -1037,31 +970,10 @@ static void process_getfilteredblock_step2(struct bitcoind *bitcoind,
|
||||||
* call->result->outpoints. */
|
* call->result->outpoints. */
|
||||||
o = call->outpoints[call->current_outpoint];
|
o = call->outpoints[call->current_outpoint];
|
||||||
bitcoind_gettxout(bitcoind, &o->txid, o->outnum,
|
bitcoind_gettxout(bitcoind, &o->txid, o->outnum,
|
||||||
process_getfilteredblock_step3, call);
|
process_getfilteredblock_step2, call);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_getfilteredblock_step1(struct bitcoind *bitcoind,
|
|
||||||
const struct bitcoin_blkid *blkid,
|
|
||||||
struct filteredblock_call *call)
|
|
||||||
{
|
|
||||||
/* If we were unable to fetch the block hash (bitcoind doesn't know
|
|
||||||
* about a block at that height), we can short-circuit and just call
|
|
||||||
* the callback. */
|
|
||||||
if (!blkid)
|
|
||||||
return process_getfiltered_block_final(bitcoind, call);
|
|
||||||
|
|
||||||
/* So we have the first piece of the puzzle, the block hash */
|
|
||||||
call->result = tal(call, struct filteredblock);
|
|
||||||
call->result->height = call->height;
|
|
||||||
call->result->outpoints = tal_arr(call->result, struct filteredblock_outpoint *, 0);
|
|
||||||
call->result->id = *blkid;
|
|
||||||
|
|
||||||
/* Now get the raw block to get all outpoints that were created in
|
|
||||||
* this block. */
|
|
||||||
bitcoind_getrawblock(bitcoind, blkid, process_getfilteredblock_step2, call);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Takes a call, dispatches it to all queued requests that match the same
|
/* Takes a call, dispatches it to all queued requests that match the same
|
||||||
* height, and then kicks off the next call. */
|
* height, and then kicks off the next call. */
|
||||||
static void
|
static void
|
||||||
|
@ -1091,7 +1003,8 @@ next:
|
||||||
* pop here. */
|
* pop here. */
|
||||||
if (!list_empty(&bitcoind->pending_getfilteredblock)) {
|
if (!list_empty(&bitcoind->pending_getfilteredblock)) {
|
||||||
c = list_top(&bitcoind->pending_getfilteredblock, struct filteredblock_call, list);
|
c = list_top(&bitcoind->pending_getfilteredblock, struct filteredblock_call, list);
|
||||||
bitcoind_getblockhash(bitcoind, c->height, process_getfilteredblock_step1, c);
|
bitcoind_getrawblockbyheight(bitcoind, c->height,
|
||||||
|
process_getfilteredblock_step1, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1116,7 +1029,8 @@ void bitcoind_getfilteredblock_(struct bitcoind *bitcoind, u32 height,
|
||||||
|
|
||||||
list_add_tail(&bitcoind->pending_getfilteredblock, &call->list);
|
list_add_tail(&bitcoind->pending_getfilteredblock, &call->list);
|
||||||
if (start)
|
if (start)
|
||||||
bitcoind_getblockhash(bitcoind, height, process_getfilteredblock_step1, call);
|
bitcoind_getrawblockbyheight(bitcoind, height,
|
||||||
|
process_getfilteredblock_step1, call);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroy_bitcoind(struct bitcoind *bitcoind)
|
static void destroy_bitcoind(struct bitcoind *bitcoind)
|
||||||
|
|
|
@ -118,22 +118,6 @@ void bitcoind_sendrawtx_(struct bitcoind *bitcoind,
|
||||||
bool, const char *), \
|
bool, const char *), \
|
||||||
(arg))
|
(arg))
|
||||||
|
|
||||||
/* blkid is NULL if call fails. */
|
|
||||||
void bitcoind_getblockhash_(struct bitcoind *bitcoind,
|
|
||||||
u32 height,
|
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
|
||||||
const struct bitcoin_blkid *blkid,
|
|
||||||
void *arg),
|
|
||||||
void *arg);
|
|
||||||
#define bitcoind_getblockhash(bitcoind_, height, cb, arg) \
|
|
||||||
bitcoind_getblockhash_((bitcoind_), \
|
|
||||||
(height), \
|
|
||||||
typesafe_cb_preargs(void, void *, \
|
|
||||||
(cb), (arg), \
|
|
||||||
struct bitcoind *, \
|
|
||||||
const struct bitcoin_blkid *), \
|
|
||||||
(arg))
|
|
||||||
|
|
||||||
void bitcoind_getfilteredblock_(struct bitcoind *bitcoind, u32 height,
|
void bitcoind_getfilteredblock_(struct bitcoind *bitcoind, u32 height,
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
void (*cb)(struct bitcoind *bitcoind,
|
||||||
const struct filteredblock *fb,
|
const struct filteredblock *fb,
|
||||||
|
@ -148,20 +132,6 @@ void bitcoind_getfilteredblock_(struct bitcoind *bitcoind, u32 height,
|
||||||
const struct filteredblock *), \
|
const struct filteredblock *), \
|
||||||
(arg))
|
(arg))
|
||||||
|
|
||||||
void bitcoind_getrawblock_(struct bitcoind *bitcoind,
|
|
||||||
const struct bitcoin_blkid *blockid,
|
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
|
||||||
struct bitcoin_block *blk,
|
|
||||||
void *arg),
|
|
||||||
void *arg);
|
|
||||||
#define bitcoind_getrawblock(bitcoind_, blkid, cb, arg) \
|
|
||||||
bitcoind_getrawblock_((bitcoind_), (blkid), \
|
|
||||||
typesafe_cb_preargs(void, void *, \
|
|
||||||
(cb), (arg), \
|
|
||||||
struct bitcoind *, \
|
|
||||||
struct bitcoin_block *), \
|
|
||||||
(arg))
|
|
||||||
|
|
||||||
void bitcoind_getchaininfo_(struct bitcoind *bitcoind,
|
void bitcoind_getchaininfo_(struct bitcoind *bitcoind,
|
||||||
const bool first_call,
|
const bool first_call,
|
||||||
void (*cb)(struct bitcoind *bitcoind,
|
void (*cb)(struct bitcoind *bitcoind,
|
||||||
|
|
Loading…
Add table
Reference in a new issue