diff --git a/bitcoin_tx.c b/bitcoin_tx.c index 3dde38194..87dffc39f 100644 --- a/bitcoin_tx.c +++ b/bitcoin_tx.c @@ -287,3 +287,27 @@ struct bitcoin_tx *bitcoin_tx_from_file(const tal_t *ctx, return tx; } + +/* . Bitcoind represents hashes as little-endian for RPC. This didn't + * stick for blockids (everyone else uses big-endian, eg. block explorers), + * but it did stick for txids. */ +static void reverse_bytes(u8 *arr, size_t len) +{ + unsigned int i; + + for (i = 0; i < len / 2; i++) { + unsigned char tmp = arr[i]; + arr[i] = arr[len - 1 - i]; + arr[len - 1 - i] = tmp; + } +} + +bool bitcoin_txid_from_hex(const char *hexstr, size_t hexstr_len, + struct sha256_double *txid) +{ + if (!hex_decode(hexstr, hexstr_len, txid, sizeof(*txid))) + return false; + reverse_bytes(txid->sha.u.u8, sizeof(txid->sha.u.u8)); + return true; +} + diff --git a/bitcoin_tx.h b/bitcoin_tx.h index 0590b6014..5e08fae45 100644 --- a/bitcoin_tx.h +++ b/bitcoin_tx.h @@ -50,4 +50,8 @@ struct bitcoin_tx *bitcoin_tx(const tal_t *ctx, varint_t input_count, struct bitcoin_tx *bitcoin_tx_from_file(const tal_t *ctx, const char *filename); +/* Parse hex string to get txid (reversed, a-la bitcoind). */ +bool bitcoin_txid_from_hex(const char *hexstr, size_t hexstr_len, + struct sha256_double *txid); + #endif /* LIGHTNING_BITCOIN_TX_H */ diff --git a/open-channel.c b/open-channel.c index e6381b7fa..67fe32f07 100644 --- a/open-channel.c +++ b/open-channel.c @@ -14,6 +14,7 @@ #include "pkt.h" #include "bitcoin_script.h" #include "bitcoin_address.h" +#include "bitcoin_tx.h" #include "pubkey.h" #include "shadouble.h" #include @@ -40,20 +41,6 @@ static void opt_show_bits(char buf[OPT_SHOW_LEN], const u64 *bits) opt_show_ulonglongval_si(buf, &ll); } -/* . Bitcoind represents hashes as little-endian for RPC. This didn't - * stick for blockids (everyone else uses big-endian, eg. block explorers), - * but it did stick for txids. */ -static void reverse_bytes(u8 *arr, size_t len) -{ - unsigned int i; - - for (i = 0; i < len / 2; i++) { - unsigned char tmp = arr[i]; - arr[i] = arr[len - 1 - i]; - arr[len - 1 - i] = tmp; - } -} - static BitcoinInput *parse_anchor_input(const tal_t *ctx, const char *spec) { BitcoinInput *in = tal(ctx, BitcoinInput); @@ -68,9 +55,8 @@ static BitcoinInput *parse_anchor_input(const tal_t *ctx, const char *spec) if (!slash) errx(1, "Expected / in ///"); - if (!hex_decode(spec, slash - spec, &txid, sizeof(txid))) + if (!bitcoin_txid_from_hex(spec, slash - spec, &txid)) errx(1, "Expected 256-bit hex txid before /"); - reverse_bytes(txid.sha.u.u8, sizeof(txid.sha.u.u8)); in->txid = sha256_to_proto(in, &txid.sha); in->output = l = strtol(slash + 1, &end, 10);