Browse Source

bcli: Avoid tal_fmt when handling a raw hex block

We were using `tal_fmt` to truncate off the last byte of the
response (newline), which required an allocation, a call to `vsnprintf` and a
copy of the block contents. This being >2MB in size on mainnet was rather
expensive.

We now just signal the end of the string by overwriting the trailing newline,
and stealing directly onto the result.
bump-pyln-proto
Christian Decker 5 years ago
parent
commit
31c67f1392
  1. 6
      plugins/bcli.c

6
plugins/bcli.c

@ -618,9 +618,9 @@ static struct command_result *process_getrawblock(struct bitcoin_cli *bcli)
struct json_stream *response; struct json_stream *response;
struct getrawblock_stash *stash = bcli->stash; struct getrawblock_stash *stash = bcli->stash;
/* -1 to strip \n. */ /* -1 to strip \n and steal onto the stash. */
stash->block_hex = tal_fmt(stash, "%.*s", bcli->output[bcli->output_bytes-1] = 0x00;
(int)bcli->output_bytes-1, bcli->output); stash->block_hex = tal_steal(stash, bcli->output);
response = jsonrpc_stream_success(bcli->cmd); response = jsonrpc_stream_success(bcli->cmd);
json_add_string(response, "blockhash", stash->block_hash); json_add_string(response, "blockhash", stash->block_hash);

Loading…
Cancel
Save