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.
This commit is contained in:
Christian Decker
2020-07-18 11:12:16 +02:00
parent e5e0ccaba0
commit 31c67f1392

View File

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