Browse Source

bitcoind: confirm chain with bitcoin-cli at the beginning

At the beginning of the lightningd, we use "echo" command to check if bitcoin-cli is running.
Now we raplace "echo" with "getblockchaininfo" for this check, and also check whether the "chain" field in response is same as the blockchain that  lightningd is on.
"getblockchaininfo" is also valid for litecoin-cli.
pull/2938/head
trueptolemy 6 years ago
committed by Christian Decker
parent
commit
6deed77d88
  1. 54
      lightningd/bitcoind.c

54
lightningd/bitcoind.c

@ -814,12 +814,57 @@ static void fatal_bitcoind_failure(struct bitcoind *bitcoind, const char *error_
exit(1);
}
/* This function is used to check "chain" field from
* bitcoin-cli "getblockchaininfo" API */
static char* check_blockchain_from_bitcoincli(const tal_t *ctx,
struct bitcoind *bitcoind,
char* output, const char **cmd)
{
size_t output_bytes;
const jsmntok_t *tokens, *valuetok;
bool valid;
if (!output)
return tal_fmt(ctx, "Reading from %s failed: %s",
bcli_args_direct(tmpctx, cmd), strerror(errno));
output_bytes = tal_count(output);
tokens = json_parse_input(cmd, output, output_bytes,
&valid);
if (!tokens)
return tal_fmt(ctx, "%s: %s response",
bcli_args_direct(tmpctx, cmd),
valid ? "partial" : "invalid");
if (tokens[0].type != JSMN_OBJECT)
return tal_fmt(ctx, "%s: gave non-object (%.*s)?",
bcli_args_direct(tmpctx, cmd),
(int)output_bytes, output);
valuetok = json_get_member(output, tokens, "chain");
if (!valuetok)
return tal_fmt(ctx, "%s: had no chain member (%.*s)?",
bcli_args_direct(tmpctx, cmd),
(int)output_bytes, output);
if(!json_tok_streq(output, valuetok,
bitcoind->chainparams->bip70_name))
return tal_fmt(ctx, "Error blockchain for bitcoin-cli?"
" Should be: %s",
bitcoind->chainparams->bip70_name);
return NULL;
}
void wait_for_bitcoind(struct bitcoind *bitcoind)
{
int from, status, ret;
pid_t child;
const char **cmd = cmdarr(bitcoind, bitcoind, "echo", NULL);
const char **cmd = cmdarr(bitcoind, bitcoind, "getblockchaininfo", NULL);
bool printed = false;
char *errstr;
for (;;) {
child = pipecmdarr(NULL, &from, &from, cast_const2(char **,cmd));
@ -831,9 +876,10 @@ void wait_for_bitcoind(struct bitcoind *bitcoind)
}
char *output = grab_fd(cmd, from);
if (!output)
fatal("Reading from %s failed: %s",
cmd[0], strerror(errno));
errstr = check_blockchain_from_bitcoincli(tmpctx, bitcoind, output, cmd);
if(errstr)
fatal("%s", errstr);
while ((ret = waitpid(child, &status, 0)) < 0 && errno == EINTR);
if (ret != child)

Loading…
Cancel
Save