getrawtransaction: Support for malleable public keys
authorCryptoManiac <balthazar@yandex.ru>
Fri, 19 Feb 2016 20:35:05 +0000 (23:35 +0300)
committerCryptoManiac <balthazar@yandex.ru>
Fri, 19 Feb 2016 20:35:05 +0000 (23:35 +0300)
doc/MalleableKeysRawTx.txt [new file with mode: 0644]
src/rpcrawtransaction.cpp

diff --git a/doc/MalleableKeysRawTx.txt b/doc/MalleableKeysRawTx.txt
new file mode 100644 (file)
index 0000000..66e08af
--- /dev/null
@@ -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
+}
index 4bcf911..c58170b 100644 (file)
@@ -286,16 +286,27 @@ Value createrawtransaction(const Array& params, bool fHelp)
     set<CBitcoinAddress> 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);