mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
script: enhance is_p2sh/is_p2pkh/is_p2wsh/is_p2wpkh to extract addr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -368,7 +368,7 @@ u8 *p2wpkh_scriptcode(const tal_t *ctx, const struct pubkey *key)
|
|||||||
return script;
|
return script;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_p2pkh(const u8 *script)
|
bool is_p2pkh(const u8 *script, struct bitcoin_address *addr)
|
||||||
{
|
{
|
||||||
size_t script_len = tal_len(script);
|
size_t script_len = tal_len(script);
|
||||||
|
|
||||||
@@ -384,10 +384,12 @@ bool is_p2pkh(const u8 *script)
|
|||||||
return false;
|
return false;
|
||||||
if (script[24] != OP_CHECKSIG)
|
if (script[24] != OP_CHECKSIG)
|
||||||
return false;
|
return false;
|
||||||
|
if (addr)
|
||||||
|
memcpy(addr, script+3, 20);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_p2sh(const u8 *script)
|
bool is_p2sh(const u8 *script, struct ripemd160 *addr)
|
||||||
{
|
{
|
||||||
size_t script_len = tal_len(script);
|
size_t script_len = tal_len(script);
|
||||||
|
|
||||||
@@ -399,10 +401,12 @@ bool is_p2sh(const u8 *script)
|
|||||||
return false;
|
return false;
|
||||||
if (script[22] != OP_EQUAL)
|
if (script[22] != OP_EQUAL)
|
||||||
return false;
|
return false;
|
||||||
|
if (addr)
|
||||||
|
memcpy(addr, script+2, 20);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_p2wsh(const u8 *script)
|
bool is_p2wsh(const u8 *script, struct sha256 *addr)
|
||||||
{
|
{
|
||||||
size_t script_len = tal_len(script);
|
size_t script_len = tal_len(script);
|
||||||
|
|
||||||
@@ -412,10 +416,12 @@ bool is_p2wsh(const u8 *script)
|
|||||||
return false;
|
return false;
|
||||||
if (script[1] != OP_PUSHBYTES(sizeof(struct sha256)))
|
if (script[1] != OP_PUSHBYTES(sizeof(struct sha256)))
|
||||||
return false;
|
return false;
|
||||||
|
if (addr)
|
||||||
|
memcpy(addr, script+2, sizeof(struct sha256));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_p2wpkh(const u8 *script)
|
bool is_p2wpkh(const u8 *script, struct bitcoin_address *addr)
|
||||||
{
|
{
|
||||||
size_t script_len = tal_len(script);
|
size_t script_len = tal_len(script);
|
||||||
|
|
||||||
@@ -425,6 +431,8 @@ bool is_p2wpkh(const u8 *script)
|
|||||||
return false;
|
return false;
|
||||||
if (script[1] != OP_PUSHBYTES(sizeof(struct ripemd160)))
|
if (script[1] != OP_PUSHBYTES(sizeof(struct ripemd160)))
|
||||||
return false;
|
return false;
|
||||||
|
if (addr)
|
||||||
|
memcpy(addr, script+2, sizeof(*addr));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -125,17 +125,17 @@ u8 *bitcoin_wscript_htlc_tx(const tal_t *ctx,
|
|||||||
const struct pubkey *revocation_pubkey,
|
const struct pubkey *revocation_pubkey,
|
||||||
const struct pubkey *local_delayedkey);
|
const struct pubkey *local_delayedkey);
|
||||||
|
|
||||||
/* Is this a pay to pubkey hash? */
|
/* Is this a pay to pubkey hash? (extract addr if not NULL) */
|
||||||
bool is_p2pkh(const u8 *script);
|
bool is_p2pkh(const u8 *script, struct bitcoin_address *addr);
|
||||||
|
|
||||||
/* Is this a pay to script hash? */
|
/* Is this a pay to script hash? (extract addr if not NULL) */
|
||||||
bool is_p2sh(const u8 *script);
|
bool is_p2sh(const u8 *script, struct ripemd160 *addr);
|
||||||
|
|
||||||
/* Is this (version 0) pay to witness script hash? */
|
/* Is this (version 0) pay to witness script hash? (extract addr if not NULL) */
|
||||||
bool is_p2wsh(const u8 *script);
|
bool is_p2wsh(const u8 *script, struct sha256 *addr);
|
||||||
|
|
||||||
/* Is this (version 0) pay to witness pubkey hash? */
|
/* Is this (version 0) pay to witness pubkey hash? (extract addr if not NULL) */
|
||||||
bool is_p2wpkh(const u8 *script);
|
bool is_p2wpkh(const u8 *script, struct bitcoin_address *addr);
|
||||||
|
|
||||||
/* Are these two scripts equal? */
|
/* Are these two scripts equal? */
|
||||||
bool scripteq(const tal_t *s1, const tal_t *s2);
|
bool scripteq(const tal_t *s1, const tal_t *s2);
|
||||||
|
|||||||
@@ -1620,8 +1620,8 @@ static void peer_got_shutdown(struct peer *peer, const u8 *msg)
|
|||||||
*
|
*
|
||||||
* A receiving node SHOULD fail the connection if the `scriptpubkey`
|
* A receiving node SHOULD fail the connection if the `scriptpubkey`
|
||||||
* is not one of those forms. */
|
* is not one of those forms. */
|
||||||
if (!is_p2pkh(scriptpubkey) && !is_p2sh(scriptpubkey)
|
if (!is_p2pkh(scriptpubkey, NULL) && !is_p2sh(scriptpubkey, NULL)
|
||||||
&& !is_p2wpkh(scriptpubkey) && !is_p2wsh(scriptpubkey)) {
|
&& !is_p2wpkh(scriptpubkey, NULL) && !is_p2wsh(scriptpubkey, NULL)) {
|
||||||
char *str = tal_fmt(peer, "Bad shutdown scriptpubkey %s",
|
char *str = tal_fmt(peer, "Bad shutdown scriptpubkey %s",
|
||||||
tal_hex(peer, scriptpubkey));
|
tal_hex(peer, scriptpubkey));
|
||||||
peer_fail_permanent_str(peer, take(str));
|
peer_fail_permanent_str(peer, take(str));
|
||||||
|
|||||||
@@ -1086,7 +1086,7 @@ static int match_htlc_output(const struct bitcoin_tx *tx,
|
|||||||
u8 **htlc_scripts)
|
u8 **htlc_scripts)
|
||||||
{
|
{
|
||||||
/* Must be a p2wsh output */
|
/* Must be a p2wsh output */
|
||||||
if (!is_p2wsh(tx->output[outnum].script))
|
if (!is_p2wsh(tx->output[outnum].script, NULL))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (size_t i = 0; i < tal_count(htlc_scripts); i++) {
|
for (size_t i = 0; i < tal_count(htlc_scripts); i++) {
|
||||||
|
|||||||
@@ -195,9 +195,9 @@ bool wallet_can_spend(struct wallet *w, const u8 *script,
|
|||||||
u32 i;
|
u32 i;
|
||||||
|
|
||||||
/* If not one of these, can't be for us. */
|
/* If not one of these, can't be for us. */
|
||||||
if (is_p2sh(script))
|
if (is_p2sh(script, NULL))
|
||||||
*output_is_p2sh = true;
|
*output_is_p2sh = true;
|
||||||
else if (is_p2wpkh(script))
|
else if (is_p2wpkh(script, NULL))
|
||||||
*output_is_p2sh = false;
|
*output_is_p2sh = false;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user