Skip to content

Commit

Permalink
lightningd/bitcoind: use json_scan.
Browse files Browse the repository at this point in the history
Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
rustyrussell authored and cdecker committed Jan 7, 2021
1 parent 11a4d46 commit 53582a0
Showing 1 changed file with 39 additions and 103 deletions.
142 changes: 39 additions & 103 deletions lightningd/bitcoind.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,31 +265,24 @@ static void sendrawtx_callback(const char *buf, const jsmntok_t *toks,
const jsmntok_t *idtok,
struct sendrawtx_call *call)
{
const jsmntok_t *resulttok, *successtok, *errtok;
const char *errmsg = NULL;
bool success = false;

resulttok = json_get_member(buf, toks, "result");
if (!resulttok)
if (!json_scan(buf, toks, "{result:{success:%}}",
JSON_SCAN(json_to_bool, &success))) {
bitcoin_plugin_error(call->bitcoind, buf, toks,
"sendrawtransaction",
"bad 'result' field");

successtok = json_get_member(buf, resulttok, "success");
if (!successtok || !json_to_bool(buf, successtok, &success))
bitcoin_plugin_error(call->bitcoind, buf, toks,
"sendrawtransaction",
"bad 'success' field");

errtok = json_get_member(buf, resulttok, "errmsg");
if (!success && !errtok)
bitcoin_plugin_error(call->bitcoind, buf, toks,
"sendrawtransaction",
"bad 'errmsg' field");
} else if (!success) {
if (!json_scan(buf, toks, "{result:{errmsg:%}}",
JSON_SCAN_TAL(tmpctx, json_strdup, &errmsg)))
bitcoin_plugin_error(call->bitcoind, buf, toks,
"sendrawtransaction",
"bad 'errmsg' field");
}

db_begin_transaction(call->bitcoind->ld->wallet->db);
call->cb(call->bitcoind, success,
errtok ? json_strdup(tmpctx, buf, errtok) : NULL,
call->cb_arg);
call->cb(call->bitcoind, success, errmsg, call->cb_arg);
db_commit_transaction(call->bitcoind->ld->wallet->db);

tal_free(call);
Expand All @@ -305,9 +298,6 @@ static void sendrawtx_compatv090_callback(const char *buf,
const jsmntok_t *idtok,
struct sendrawtx_call *call)
{
const jsmntok_t *errtok;
const jsmntok_t *codetok;
errcode_t code;
struct jsonrpc_request *req;

static bool warned = false;
Expand All @@ -321,19 +311,10 @@ static void sendrawtx_compatv090_callback(const char *buf,
* because it is an old plugin which does not support the
* new `allowhighfees` parameter.
*/
errtok = json_get_member(buf, toks, "error");
if (!errtok)
goto fallback;

codetok = json_get_member(buf, errtok, "code");
if (!codetok)
goto fallback;

if (!json_to_errcode(buf, codetok, &code))
goto fallback;

if (code != JSONRPC2_INVALID_PARAMS)
if (!json_scan(buf, toks, "{error:{code:"
stringify(JSONRPC2_INVALID_PARAMS)"}}")) {
goto fallback;
}

/* Possibly it is because `allowhighfees` is not understood
* by the plugin. */
Expand Down Expand Up @@ -426,42 +407,26 @@ getrawblockbyheight_callback(const char *buf, const jsmntok_t *toks,
const jsmntok_t *idtok,
struct getrawblockbyheight_call *call)
{
const jsmntok_t *resulttok, *blockhashtok, *blocktok;
const char *block_str, *blockhash_str;
const char *block_str;
struct bitcoin_blkid blkid;
struct bitcoin_block *blk;

resulttok = json_get_member(buf, toks, "result");
if (!resulttok)
bitcoin_plugin_error(call->bitcoind, buf, toks,
"getrawblockbyheight",
"bad 'result' field");

blockhashtok = json_get_member(buf, resulttok, "blockhash");
if (!blockhashtok)
bitcoin_plugin_error(call->bitcoind, buf, toks,
"getrawblockbyheight",
"bad 'blockhash' field");
/* If block hash is `null`, this means not found! Call the callback
* with NULL values. */
if (json_tok_is_null(buf, blockhashtok)) {
if (json_scan(buf, toks, "{result:{blockhash:null}}")) {
db_begin_transaction(call->bitcoind->ld->wallet->db);
call->cb(call->bitcoind, NULL, NULL, call->cb_arg);
db_commit_transaction(call->bitcoind->ld->wallet->db);
goto clean;
}
blockhash_str = json_strdup(tmpctx, buf, blockhashtok);
if (!bitcoin_blkid_from_hex(blockhash_str, strlen(blockhash_str), &blkid))
bitcoin_plugin_error(call->bitcoind, buf, toks,
"getrawblockbyheight",
"bad block hash");

blocktok = json_get_member(buf, resulttok, "block");
if (!blocktok)
if (!json_scan(buf, toks, "{result:{blockhash:%,block:%}}",
JSON_SCAN(json_to_sha256, &blkid.shad.sha),
JSON_SCAN_TAL(tmpctx, json_strdup, &block_str)))
bitcoin_plugin_error(call->bitcoind, buf, toks,
"getrawblockbyheight",
"bad 'block' field");
block_str = json_strdup(tmpctx, buf, blocktok);
"bad 'result' field");

blk = bitcoin_block_from_hex(tmpctx, chainparams, block_str,
strlen(block_str));
if (!blk)
Expand Down Expand Up @@ -534,39 +499,22 @@ static void getchaininfo_callback(const char *buf, const jsmntok_t *toks,
const jsmntok_t *idtok,
struct getchaininfo_call *call)
{
const jsmntok_t *resulttok, *chaintok, *headerstok, *blktok, *ibdtok;
u32 headers = 0;
u32 blocks = 0;
bool ibd = false;

resulttok = json_get_member(buf, toks, "result");
if (!resulttok)
const char *chain;
u32 headers, blocks;
bool ibd;

if (!json_scan(buf, toks,
"{result:{chain:%,headercount:%,blockcount:%,ibd:%}}",
JSON_SCAN_TAL(tmpctx, json_strdup, &chain),
JSON_SCAN(json_to_number, &headers),
JSON_SCAN(json_to_number, &blocks),
JSON_SCAN(json_to_bool, &ibd)))
bitcoin_plugin_error(call->bitcoind, buf, toks, "getchaininfo",
"bad 'result' field");

chaintok = json_get_member(buf, resulttok, "chain");
if (!chaintok)
bitcoin_plugin_error(call->bitcoind, buf, toks, "getchaininfo",
"bad 'chain' field");

headerstok = json_get_member(buf, resulttok, "headercount");
if (!headerstok || !json_to_number(buf, headerstok, &headers))
bitcoin_plugin_error(call->bitcoind, buf, toks, "getchaininfo",
"bad 'headercount' field");

blktok = json_get_member(buf, resulttok, "blockcount");
if (!blktok || !json_to_number(buf, blktok, &blocks))
bitcoin_plugin_error(call->bitcoind, buf, toks, "getchaininfo",
"bad 'blockcount' field");

ibdtok = json_get_member(buf, resulttok, "ibd");
if (!ibdtok || !json_to_bool(buf, ibdtok, &ibd))
bitcoin_plugin_error(call->bitcoind, buf, toks, "getchaininfo",
"bad 'ibd' field");

db_begin_transaction(call->bitcoind->ld->wallet->db);
call->cb(call->bitcoind, json_strdup(tmpctx, buf, chaintok), headers,
blocks, ibd, call->first_call, call->cb_arg);
call->cb(call->bitcoind, chain, headers, blocks, ibd,
call->first_call, call->cb_arg);
db_commit_transaction(call->bitcoind->ld->wallet->db);

tal_free(call);
Expand Down Expand Up @@ -622,33 +570,21 @@ static void getutxout_callback(const char *buf, const jsmntok_t *toks,
const jsmntok_t *idtok,
struct getutxout_call *call)
{
const jsmntok_t *resulttok, *amounttok, *scripttok;
struct bitcoin_tx_output txout;

resulttok = json_get_member(buf, toks, "result");
if (!resulttok)
bitcoin_plugin_error(call->bitcoind, buf, toks, "getutxout",
"bad 'result' field");

scripttok = json_get_member(buf, resulttok, "script");
if (!scripttok)
bitcoin_plugin_error(call->bitcoind, buf, toks, "getutxout",
"bad 'script' field");
if (json_tok_is_null(buf, scripttok)) {
if (json_scan(buf, toks, "{result:{script:null}}")) {
db_begin_transaction(call->bitcoind->ld->wallet->db);
call->cb(call->bitcoind, NULL, call->cb_arg);
db_commit_transaction(call->bitcoind->ld->wallet->db);
goto clean;
}
txout.script = json_tok_bin_from_hex(tmpctx, buf, scripttok);

amounttok = json_get_member(buf, resulttok, "amount");
if (!amounttok)
bitcoin_plugin_error(call->bitcoind, buf, toks, "getutxout",
"bad 'amount' field");
if (!json_to_sat(buf, amounttok, &txout.amount))
if (!json_scan(buf, toks, "{result:{script:%,amount:%}}",
JSON_SCAN_TAL(tmpctx, json_tok_bin_from_hex,
&txout.script),
JSON_SCAN(json_to_sat, &txout.amount)))
bitcoin_plugin_error(call->bitcoind, buf, toks, "getutxout",
"bad sats amount");
"bad 'result' field");

db_begin_transaction(call->bitcoind->ld->wallet->db);
call->cb(call->bitcoind, &txout, call->cb_arg);
Expand Down

0 comments on commit 53582a0

Please sign in to comment.