New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
p2wsh and p2sh-p2wsh address in decodescript #12321
Conversation
Again I'm only considering the edge cases after clicking "create pull request".. What if the script contains a checksig with an uncompressed pubkey? |
@fivepiece feel free to add [WIP] to the title of your PR if its work in progress :) It's usually fine to open up a PR before its completely ready because other contributors might like to give feedback on the approach or high level concept ACK/NACKs regardless. Thanks for helping out! |
Cheers, title changed |
Ideas welcome, returning a p2wsh for a p2pk or multisig with an uncompressed pubkey can result in fund loss, then again |
concept ACK I think returning garbage is fine. It can be something unprovably unspendable even, and I don't think it's the job of this tool to check. Wonder if it's worth it to have it also return a p2sh-p2wsh version, in other words interpreting the script as a witnessscript, if applicable? |
Agreed. Keeping the simple check that this is not a bare witness program seems to be in line with the check above it not letting p2sh be re-encoded into p2sh. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing tests for new keys.
Doesn't make sense to move this to ScriptPubKeyToUniv
?
@promag wouldn't moving this to I will be looking into adding tests as well. |
I've made some changes to this:
Various examples of the output can be seen here : Caveats :
|
03aefb2
to
d0164ba
Compare
This is pretty much a complete rewrite taking into account @sipa's suggestion (on irc) to use the same logic from
|
kicked travis.
hm? Your gist has examples that you could use. |
Specifically, I don't know how to assert that a value (say |
in python |
Ah, I was trying to bend |
Added tests for checking |
test/functional/rpc_decodescript.py
Outdated
|
||
# 3) multisig scriptPubKey | ||
# <m> <A pubkey> <B pubkey> <C pubkey> <n> OP_CHECKMULTISIG | ||
# just imagine that the pub keys used below are different. | ||
# for our purposes here it does not matter that they are the same even though it is unrealistic. | ||
rpc_result = self.nodes[0].decodescript('52' + push_public_key + push_public_key + push_public_key + '53ae') | ||
assert_equal('2 ' + public_key + ' ' + public_key + ' ' + public_key + ' 3 OP_CHECKMULTISIG', rpc_result['asm']) | ||
# multisig in P2WSH | ||
assert_equal('0 0f320decca000221b611117448134c78dd220cd22384ac80025b59e43c8698e8', rpc_result['segwit']['asm']) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could you generate this dynamically instead of hardcoding the long hex?
test/functional/rpc_decodescript.py
Outdated
@@ -103,6 +109,8 @@ def decodescript_script_pub_key(self): | |||
# lock until block 500,000 | |||
rpc_result = self.nodes[0].decodescript('63' + push_public_key + 'ad670320a107b17568' + push_public_key + 'ac') | |||
assert_equal('OP_IF ' + public_key + ' OP_CHECKSIGVERIFY OP_ELSE 500000 OP_CHECKLOCKTIMEVERIFY OP_DROP OP_ENDIF ' + public_key + ' OP_CHECKSIG', rpc_result['asm']) | |||
# CLTV script in P2WSH | |||
assert_equal('0 01f79ceb012cbcefb251f7843b827a3e285f40ddc5014d35e2486716cbacf5f1', rpc_result['segwit']['asm']) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could you generate this dynamically instead of hardcoding the long hex?
utACK 785bd02 I think you can squash almost all these commits. |
Cool, I'll squash it all into a single commit if this current change looks good, or two if it's better to separate work done on core from the tests. Let me know which is better. |
whatever's easier to you, 1 or 2 |
85a6a66
to
19272ef
Compare
Two commits now. No problem changing later on if needed. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
utACK
src/rpc/rawtransaction.cpp
Outdated
if ((which_type == TX_PUBKEY) || (which_type == TX_MULTISIG)) { | ||
for (const auto& solution : solutions_data) { | ||
if ((solution.size() != 1) && !CPubKey(solution).IsCompressed()) { | ||
fFoundUncompressedPubkeys = true; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just return r
here. then remove the conditional later?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah I see what you mean, looking into this.
1355786
to
4f933b3
Compare
Good call. All in a single commit now. |
re-utACK 4f933b3 |
src/rpc/rawtransaction.cpp
Outdated
@@ -563,6 +563,38 @@ UniValue decodescript(const JSONRPCRequest& request) | |||
// P2SH cannot be wrapped in a P2SH. If this script is already a P2SH, | |||
// don't return the address for a P2SH of the P2SH. | |||
r.pushKV("p2sh", EncodeDestination(CScriptID(script))); | |||
// P2SH and witness programs cannot be wrapped in P2WSH, if this script | |||
// is a witness program, don't return addresses for a segwit programs. | |||
if (type.get_str().find("witness") == std::string::npos) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Searching for a string in the type name seems brittle - if we have to work with strings here (there seems to be no other accessible way) let's explicitly list the options. e.g. according to current selection that would be
"nonstandard"
"pubkey"
"pubkeyhash"
"scripthash"
"multisig"
"nulldata"
Updated to address @laanwj's comment |
Thank you |
41ff967 list the types of scripts we should consider for a witness program (fivepiece) 4f933b3 p2wpkh, p2wsh and p2sh-nested scripts in decodescript (fivepiece) Pull request description: Attempts to address #12244 . `p2wsh` addresses are returned only for scripts that are neither `p2sh` nor any witness program. Tree-SHA512: eb47f094c1a4c2ad2bcf27a8032307e43cf787d50bf739281aeb4101d97316a2f307b05118bf138298c937fa34e15f91436443a9b313f809fad2c43e94cd1831
41ff967 list the types of scripts we should consider for a witness program (fivepiece) 4f933b3 p2wpkh, p2wsh and p2sh-nested scripts in decodescript (fivepiece) Pull request description: Attempts to address bitcoin#12244 . `p2wsh` addresses are returned only for scripts that are neither `p2sh` nor any witness program. Tree-SHA512: eb47f094c1a4c2ad2bcf27a8032307e43cf787d50bf739281aeb4101d97316a2f307b05118bf138298c937fa34e15f91436443a9b313f809fad2c43e94cd1831
Attempts to address #12244 .
p2wsh
addresses are returned only for scripts that are neitherp2sh
nor any witness program.