smite: add is_standard_shutdown_script helper - #186
Conversation
f33051b to
22217d9
Compare
NishantBansal2003
left a comment
There was a problem hiding this comment.
Thanks! I was about to add this as a follow-up to #185, but it looks like I don’t have to now
| /// Feature bits that widen the set of standard `shutdown` scriptpubkeys. | ||
| #[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] | ||
| pub struct ShutdownScriptFeatures { | ||
| /// Additionally permits witness program versions 1..=16 with a 2..=40 byte | ||
| /// program. | ||
| pub option_shutdown_anysegwit: bool, | ||
| /// Additionally permits a single-push `OP_RETURN` script. | ||
| pub option_simple_close: bool, | ||
| } |
There was a problem hiding this comment.
I think this can be removed/simplified once #192 gets merged, so we can just use just use: negotiated_features.supports_feature(Features::OPTION_SHUTDOWN_ANYSEGWIT) or negotiated_features.supports_feature(Features::OPTION_SIMPLE_CLOSE)
There was a problem hiding this comment.
Sounds good, I will review #192 and then rebase this PR after merge
22217d9 to
220b1bf
Compare
220b1bf to
847c2f1
Compare
NishantBansal2003
left a comment
There was a problem hiding this comment.
Mostly, it looks good. Just a few small comments. I'm not sure how this follows the merge with #192, but if it's merged before, I'll add the updated feature check there
| /// Returns `true` if `spk` is a standard `shutdown` scriptpubkey per BOLT 2: P2WPKH or P2WSH. | ||
| /// Negotiated `features` widen the accepted set. | ||
| /// | ||
| /// Legacy P2PKH/P2SH are rejected. A receiver may accept them for backward compatibility, but this |
There was a problem hiding this comment.
In the oracle, we verify what the peer accepted (and whether it was valid), and then we check our side to ensure that the target is actually sending that.
So, when verifying a target-accepted open_channel, I need it to pass even if it contains the legacy script. However, for our received accept_channel, I need to ensure that it does not contain legacy scripts
There was a problem hiding this comment.
I didn't address this yet in 63fed11. I think we want to handle this in a similar way to enum Side.
|
|
||
| #[test] | ||
| #[allow(clippy::similar_names)] | ||
| fn is_standard_shutdown_script_rejects_legacy_accepts_witness_v0() { |
There was a problem hiding this comment.
nit: I think for testing semantic script types, we should use the bitcoin crate to create the scripts, eg: ScriptBuf::new_p2wpkh(&WPubkeyHash::all_zeros()).into_bytes();, but for testing non-standard cases, we can construct the raw bytes manually
There was a problem hiding this comment.
Mhh. If we used bitcoin::ScriptBuf to construct standard scripts via ScriptBuf::new_p2wpkh etc., I think we'd mostly be testing the bitcoin crate against itself, since is_standard_shutdown_script is implemented with bitcoin::Script::is_p2wpkh().
It would also make it less clear how we are testing. I think raw opcodes make it explicit which bytes we are testing. I think tests should be optimized for clear understanding of what we are testing how. This is why I think it's ok to use bitcoin::opcodes.
I think @morehouse mentioned something similar in a review, but I didn't find it.
Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
847c2f1 to
dd42b6b
Compare
BOLT-02 specifies sender requirements for shutdown scripts. They must be witness v0 (P2WPKH, P2WSH) or following features must be negotiated: * `option_shutdown_anysegwit`: witness v1-v16 with a 2..=40 byte program * `option_simple_close`: `OP_RETURN` with a single minimal data push of 6..=80 bytes Receivers may accept legacy scripts (P2PKH, P2SH), but we reject them since we're judging the sender's output (see TODO). This applies to the `shutdown` and `closing_complete` messages, and the `upfront_shutdown_script` TLV in the `open_channel`, `open_channel2`, `accept_channel` and `accept_channel2` messages. This commit adds a helper to catch targets that don't comply with the spec.
dd42b6b to
63fed11
Compare
|
I rebased this PR on top of #192 since I don't expect it to change much. I didn't address all feedback yet, see #186 (comment) and TODO in the code + commit message. |
From the commit message:
As per the note I added to the code, I'm not sure if the fuzzer should also reject legacy scripts, since a target must not send them.update: decided to reject them, see discussionI haven't wired this into existing code or #163 yet, but I thought the introduction of the helper might be worthwile to review itself, especially considering the question wrt legacy scripts.