From ac7be422c9ecf17e881d07a501b55f31410671da Mon Sep 17 00:00:00 2001 From: CryptoManiac Date: Fri, 19 Feb 2016 23:35:05 +0300 Subject: [PATCH] getrawtransaction: Support for malleable public keys --- doc/MalleableKeysRawTx.txt | 91 ++++++++++++++++++++++++++++++++++++++++++++ src/rpcrawtransaction.cpp | 23 ++++++++--- 2 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 doc/MalleableKeysRawTx.txt diff --git a/doc/MalleableKeysRawTx.txt b/doc/MalleableKeysRawTx.txt new file mode 100644 index 0000000..66e08af --- /dev/null +++ b/doc/MalleableKeysRawTx.txt @@ -0,0 +1,91 @@ +> createrawtransaction '[{"txid" : "fe19e91308bc7d5e564d51d3401c40b47e18fb4abb713be2c75e517f9607e8c0","vout" : 0}, {"txid" : "ffb6281239fa8b882188aa9b53ce9c753592ce5db9ed360b95cf96fca14ff7c3","vout" : 0}, {"txid" : "fe9373cce4729f1e75092f9b85843bb5cad96e7fec4af728fb36f4f7d068044a","vout" : 0}]' '{"5GRatXVWnTHNjBaeLCw6TEqdYhMqDuej5n2aQJxoJj65bMMQvxDnnhCg6PEhCassbnSBrNpzWZu4YaLy13y8jLsUJz6ta5ad1c6" : 50, "5GRatXVWnTHNjBaeLCw6TEqdYhMqDuej5n2aQJxoJj65bMMQvxDnnhCg6PEhCassbnSBrNpzWZu4YaLy13y8jLsUJz6ta5ad1c6" : 50, "5GRatXVWnTHNjBaeLCw6TEqdYhMqDuej5n2aQJxoJj65bMMQvxDnnhCg6PEhCassbnSBrNpzWZu4YaLy13y8jLsUJz6ta5ad1c6" : 50, "5GRatXVWnTHNjBaeLCw6TEqdYhMqDuej5n2aQJxoJj65bMMQvxDnnhCg6PEhCassbnSBrNpzWZu4YaLy13y8jLsUJz6ta5ad1c6" : 50}' +01000000ec7ac75603c0e807967f515ec7e23b71bb4afb187eb4401c40d3514d565e7dbc0813e919fe0000000000ffffffffc3f74fa1fc96cf950b36edb95dce9235759cce539baa8821888bfa391228b6ff0000000000ffffffff4a0468d0f7f436fb28f74aec7f6ed9cab53b84859b2f09751e9f72e4cc7393fe0000000000ffffffff0480f0fa02000000004621023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df072102cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e99175ac80f0fa020000000046210286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a2102f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b75ac80f0fa02000000004621039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a902102b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd75ac80f0fa020000000046210227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af376821023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec075ac00000000 + +> signrawtransaction 01000000ec7ac75603c0e807967f515ec7e23b71bb4afb187eb4401c40d3514d565e7dbc0813e919fe0000000000ffffffffc3f74fa1fc96cf950b36edb95dce9235759cce539baa8821888bfa391228b6ff0000000000ffffffff4a0468d0f7f436fb28f74aec7f6ed9cab53b84859b2f09751e9f72e4cc7393fe0000000000ffffffff0480f0fa02000000004621023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df072102cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e99175ac80f0fa020000000046210286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a2102f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b75ac80f0fa02000000004621039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a902102b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd75ac80f0fa020000000046210227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af376821023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec075ac00000000 +{ +"hex" : "01000000ec7ac75603c0e807967f515ec7e23b71bb4afb187eb4401c40d3514d565e7dbc0813e919fe000000006a47304402206ae066f932568244b300207516941ec1ed3c1d1d073a64e73b030d648a873ba0022066cd2972fc33ccd72fbf2851926671cef3162a31c1b8d3fa54d5c1f48e64ddaa012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffffc3f74fa1fc96cf950b36edb95dce9235759cce539baa8821888bfa391228b6ff000000006b483045022100ac66cd8c20df9cf83efe16f0d5e8e4c120289b48d4599f74f240e75e63fabbf202207a479da48b723ca44ec7da49564642c53a01316be5e8e1f6faf54747df6cd471012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffff4a0468d0f7f436fb28f74aec7f6ed9cab53b84859b2f09751e9f72e4cc7393fe000000006a47304402202ecf35bf1aaa054db9cecbdb078a42a596bb58cfafe73a51910851799f6596fe022040dbae44820144d6c099fcdd077a29beb56ccbfa0be6a1173810bf7566981a8a012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffff0480f0fa02000000004621023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df072102cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e99175ac80f0fa020000000046210286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a2102f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b75ac80f0fa02000000004621039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a902102b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd75ac80f0fa020000000046210227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af376821023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec075ac00000000", +"complete" : true +} + +> sendrawtransaction 01000000ec7ac75603c0e807967f515ec7e23b71bb4afb187eb4401c40d3514d565e7dbc0813e919fe000000006a47304402206ae066f932568244b300207516941ec1ed3c1d1d073a64e73b030d648a873ba0022066cd2972fc33ccd72fbf2851926671cef3162a31c1b8d3fa54d5c1f48e64ddaa012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffffc3f74fa1fc96cf950b36edb95dce9235759cce539baa8821888bfa391228b6ff000000006b483045022100ac66cd8c20df9cf83efe16f0d5e8e4c120289b48d4599f74f240e75e63fabbf202207a479da48b723ca44ec7da49564642c53a01316be5e8e1f6faf54747df6cd471012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffff4a0468d0f7f436fb28f74aec7f6ed9cab53b84859b2f09751e9f72e4cc7393fe000000006a47304402202ecf35bf1aaa054db9cecbdb078a42a596bb58cfafe73a51910851799f6596fe022040dbae44820144d6c099fcdd077a29beb56ccbfa0be6a1173810bf7566981a8a012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffff0480f0fa02000000004621023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df072102cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e99175ac80f0fa020000000046210286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a2102f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b75ac80f0fa02000000004621039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a902102b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd75ac80f0fa020000000046210227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af376821023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec075ac00000000 +3835044e34803034aba65613925d424996237e97bc18a7649f550a5038bc3ce1 + +> getrawtransaction 3835044e34803034aba65613925d424996237e97bc18a7649f550a5038bc3ce1 1 +{ +"hex" : "01000000ec7ac75603c0e807967f515ec7e23b71bb4afb187eb4401c40d3514d565e7dbc0813e919fe000000006a47304402206ae066f932568244b300207516941ec1ed3c1d1d073a64e73b030d648a873ba0022066cd2972fc33ccd72fbf2851926671cef3162a31c1b8d3fa54d5c1f48e64ddaa012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffffc3f74fa1fc96cf950b36edb95dce9235759cce539baa8821888bfa391228b6ff000000006b483045022100ac66cd8c20df9cf83efe16f0d5e8e4c120289b48d4599f74f240e75e63fabbf202207a479da48b723ca44ec7da49564642c53a01316be5e8e1f6faf54747df6cd471012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffff4a0468d0f7f436fb28f74aec7f6ed9cab53b84859b2f09751e9f72e4cc7393fe000000006a47304402202ecf35bf1aaa054db9cecbdb078a42a596bb58cfafe73a51910851799f6596fe022040dbae44820144d6c099fcdd077a29beb56ccbfa0be6a1173810bf7566981a8a012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbeaffffffff0480f0fa02000000004621023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df072102cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e99175ac80f0fa020000000046210286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a2102f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b75ac80f0fa02000000004621039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a902102b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd75ac80f0fa020000000046210227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af376821023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec075ac00000000", +"txid" : "3835044e34803034aba65613925d424996237e97bc18a7649f550a5038bc3ce1", +"version" : 1, +"time" : 1455913708, +"locktime" : 0, +"vin" : [ +{ +"txid" : "fe19e91308bc7d5e564d51d3401c40b47e18fb4abb713be2c75e517f9607e8c0", +"vout" : 0, +"scriptSig" : { +"asm" : "304402206ae066f932568244b300207516941ec1ed3c1d1d073a64e73b030d648a873ba0022066cd2972fc33ccd72fbf2851926671cef3162a31c1b8d3fa54d5c1f48e64ddaa01 02a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbea", +"hex" : "47304402206ae066f932568244b300207516941ec1ed3c1d1d073a64e73b030d648a873ba0022066cd2972fc33ccd72fbf2851926671cef3162a31c1b8d3fa54d5c1f48e64ddaa012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbea" +}, +"sequence" : 4294967295 +}, +{ +"txid" : "ffb6281239fa8b882188aa9b53ce9c753592ce5db9ed360b95cf96fca14ff7c3", +"vout" : 0, +"scriptSig" : { +"asm" : "3045022100ac66cd8c20df9cf83efe16f0d5e8e4c120289b48d4599f74f240e75e63fabbf202207a479da48b723ca44ec7da49564642c53a01316be5e8e1f6faf54747df6cd47101 02a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbea", +"hex" : "483045022100ac66cd8c20df9cf83efe16f0d5e8e4c120289b48d4599f74f240e75e63fabbf202207a479da48b723ca44ec7da49564642c53a01316be5e8e1f6faf54747df6cd471012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbea" +}, +"sequence" : 4294967295 +}, +{ +"txid" : "fe9373cce4729f1e75092f9b85843bb5cad96e7fec4af728fb36f4f7d068044a", +"vout" : 0, +"scriptSig" : { +"asm" : "304402202ecf35bf1aaa054db9cecbdb078a42a596bb58cfafe73a51910851799f6596fe022040dbae44820144d6c099fcdd077a29beb56ccbfa0be6a1173810bf7566981a8a01 02a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbea", +"hex" : "47304402202ecf35bf1aaa054db9cecbdb078a42a596bb58cfafe73a51910851799f6596fe022040dbae44820144d6c099fcdd077a29beb56ccbfa0be6a1173810bf7566981a8a012102a277f7eece96158bb86879b887adb3d5ad1ae2caf333633f41931687a95cdbea" +}, +"sequence" : 4294967295 +} +], +"vout" : [ +{ +"value" : 50.00000000, +"n" : 0, +"scriptPubKey" : { +"asm" : "023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df07 02cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e991 OP_DROP OP_CHECKSIG", +"hex" : "21023465cd42efb1e62f0d74d4c968fa421fa900d46a87f91374a4f2cec16c61df072102cac2526421051d91daefa199277d2119ca0e447cff3a4136cb1e5326ea31e99175ac", +"type" : "pubkeydrop" +} +}, +{ +"value" : 50.00000000, +"n" : 1, +"scriptPubKey" : { +"asm" : "0286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a 02f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b OP_DROP OP_CHECKSIG", +"hex" : "210286ba58eef592aa6e883676445cb2e0797ebf221731caf57d5382f6ba7d04862a2102f1c4a308096f0484db4a5ca2297929f4c8b32a9e91d15d09c0c366f314835b7b75ac", +"type" : "pubkeydrop" +} +}, +{ +"value" : 50.00000000, +"n" : 2, +"scriptPubKey" : { +"asm" : "039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a90 02b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd OP_DROP OP_CHECKSIG", +"hex" : "21039c4ca9434cbcd65b0646b86302eadf2c22ba5e726a8c62bb413420a891f76a902102b5c6ad4ab2a017912bbb5923d3f00d0e93f486d6879bf1b284faca7c1e2f9fdd75ac", +"type" : "pubkeydrop" +} +}, +{ +"value" : 50.00000000, +"n" : 3, +"scriptPubKey" : { +"asm" : "0227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af3768 023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec0 OP_DROP OP_CHECKSIG", +"hex" : "210227f68a9f13dbba130c3930f0d2ce90138135d7bea038264500e2188803af376821023343909069b8520a3a362b2b6ce70d3cd651f2c2e0119eaf3c6b410d3bd7cec075ac", +"type" : "pubkeydrop" +} +} +], +"blockhash" : "00006b9e0ba9faadf6fdf86123789d58c828cbd61565edcf7a46b9eaf87086d2", +"confirmations" : 16, +"time" : 1455913743, +"blocktime" : 1455913743 +} diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 4bcf911..c58170b 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -286,16 +286,27 @@ Value createrawtransaction(const Array& params, bool fHelp) set setAddress; BOOST_FOREACH(const Pair& s, sendTo) { + // Create output destination script + CScript scriptPubKey; CBitcoinAddress address(s.name_); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid NovaCoin address: ")+s.name_); + { + CMalleablePubKey mpk(s.name_); + if (!mpk.IsValid()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid output destination: ")+s.name_); - if (setAddress.count(address)) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_); - setAddress.insert(address); + CPubKey keyVariant, R; + mpk.GetVariant(R, keyVariant); + scriptPubKey.SetDestination(R, keyVariant); + } + else + { + scriptPubKey.SetDestination(address.Get()); + if (setAddress.count(address)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_); + setAddress.insert(address); + } - CScript scriptPubKey; - scriptPubKey.SetDestination(address.Get()); int64_t nAmount = AmountFromValue(s.value_); CTxOut out(nAmount, scriptPubKey); -- 1.7.1