[RPC] Split signrawtransaction into wallet and non-wallet RPC command #10579

pull achow101 wants to merge 3 commits into bitcoin:master from achow101:split-signraw changing 36 files +458 −282
  1. achow101 commented at 10:28 PM on June 12, 2017: member

    This PR is part of #10570. It also builds on top of #10571.

    This PR splits signrawtransaction into two commands, signrawtransactionwithkey and signrawtransactionwithwallet. signrawtransactionwithkey requires private keys to be passed in and does not use the wallet for any signing. signrawtransactionwithwallet uses the wallet to sign a raw transaction and does not have any parameters to take private keys.

    The signrawtransaction RPC has been marked as deprecated and will call the appropriate RPC command based upon the parameters given. A test was added to check this behavior is still consistent with the original behavior.

    All tests that used signrawtransaction have been updated to use one of the two new RPCs. Most uses were changed to signrawtransactionwithwallet. These were changed via a scripted diff.

  2. achow101 cross-referenced this on Jun 12, 2017 from issue [RPC] Split signrawtransaction into multiple distinct RPCs by achow101
  3. achow101 force-pushed on Jun 12, 2017
  4. achow101 cross-referenced this on Jun 12, 2017 from issue Remaining instances of ENABLE_WALLET in `libbitcoin_server.a` by laanwj
  5. achow101 cross-referenced this on Jun 12, 2017 from issue Deprecate wallet-less signrawtransaction? by sipa
  6. fanquake added the label RPC/REST/ZMQ on Jun 13, 2017
  7. sipa commented at 1:15 AM on June 13, 2017: member

    Incorrect scripted diff.

  8. achow101 force-pushed on Jun 13, 2017
  9. achow101 force-pushed on Jun 13, 2017
  10. jonasschnelli commented at 8:50 AM on June 13, 2017: contributor

    I'm not entirely sure if this is a good long term strategy. signrawtransactionwithwallet seems okay(ish) but I don't see a reason to pass around a private key (though RPC, TCP into the same process that runs the p2p/validation/node).

    Where are the differences betweenbitcoin-tx's sign command and the here proposed signrawtransactionwithkey? Wouldn't it make more sense to focus on bitcoin-tx for (offline) rawtx signing?

  11. achow101 commented at 6:23 PM on June 13, 2017: member

    @jonasschnelli signrawtransactionwithkey will lookup the UTXOs in order to sign whereas bitcoin-tx's `sign' command requires you to supply them. This is much easier to use.

  12. achow101 force-pushed on Jun 13, 2017
  13. sipa added the label Needs release notes on Jun 17, 2017
  14. achow101 force-pushed on Jun 19, 2017
  15. achow101 force-pushed on Jun 19, 2017
  16. laanwj added this to the milestone 0.15.0 on Jul 6, 2017
  17. jnewbery cross-referenced this on Jul 7, 2017 from issue [wallet] Remove Wallet dependencies from init.cpp by jnewbery
  18. achow101 force-pushed on Jul 7, 2017
  19. achow101 force-pushed on Jul 7, 2017
  20. achow101 force-pushed on Jul 8, 2017
  21. achow101 force-pushed on Jul 17, 2017
  22. laanwj commented at 3:21 PM on July 18, 2017: member

    This has missed the 0.15 feature freeze, moving to 0.16.

  23. laanwj added this to the milestone 0.16.0 on Jul 18, 2017
  24. laanwj removed this from the milestone 0.15.0 on Jul 18, 2017
  25. jnewbery commented at 2:33 PM on August 15, 2017: member

    needs rebase

  26. achow101 force-pushed on Aug 15, 2017
  27. achow101 commented at 9:33 PM on August 15, 2017: member

    rebased

  28. achow101 force-pushed on Aug 15, 2017
  29. in src/rpc/client.cpp:97 in 744c9a6a14 outdated
      94 | @@ -95,6 +95,9 @@ static const CRPCConvertParam vRPCConvertParams[] =
      95 |      { "createrawtransaction", 3, "replaceable" },
      96 |      { "signrawtransaction", 1, "prevtxs" },
      97 |      { "signrawtransaction", 2, "privkeys" },
      98 | +    { "signrawtransactionwithwallet", 1, "prevtxs" },
      99 | +    { "signrawtransactionwithkey", 2, "prevtxs" },
     100 | +    { "signrawtransactionwithkey", 1, "privkeys" },
    


    jnewbery commented at 6:49 PM on August 29, 2017:

    supernit: 1 usually comes before 2 :)


    promag commented at 8:44 PM on August 29, 2017:

    @jnewbery for me it's more "Sort please" :trollface:

  30. in src/Makefile.am:135 in 744c9a6a14 outdated
     131 | @@ -132,6 +132,7 @@ BITCOIN_CORE_H = \
     132 |    rpc/protocol.h \
     133 |    rpc/server.h \
     134 |    rpc/register.h \
     135 | +  rpc/rawtransaction.h \
    


    jnewbery commented at 6:59 PM on August 29, 2017:

    This should be in the first commit (6fded798a77e8a754fa9455afd3328aee0842274)


    promag commented at 8:45 PM on August 29, 2017:

    ... and sorted.


    instagibbs commented at 9:21 PM on February 8, 2018:

    following lines aren't sorted either, not sure if it matters to clean this up

  31. in test/functional/txn_clone.py:81 in 744c9a6a14 outdated
      73 | @@ -74,7 +74,7 @@ def run_test(self):
      74 |  
      75 |          # Use a different signature hash type to sign.  This creates an equivalent but malleated clone.
      76 |          # Don't send the clone anywhere yet
      77 | -        tx1_clone = self.nodes[0].signrawtransactionwithwallet(clone_raw, None, None, "ALL|ANYONECANPAY")
      78 | +        tx1_clone = self.nodes[0].signrawtransactionwithwallet(clone_raw, None, "ALL|ANYONECANPAY")
    


    jnewbery commented at 7:00 PM on August 29, 2017:

    Can you make this change before the scripted diff commit (to not break git bisect). You could change the args to be named args while you're doing that.

  32. in test/functional/signrawtransactions.py:41 in 744c9a6a14 outdated
      33 | @@ -34,7 +34,17 @@ def successful_signing_test(self):
      34 |          outputs = {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
      35 |  
      36 |          rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
      37 | -        rawTxSigned = self.nodes[0].signrawtransactionwithkey(rawTx, inputs, privKeys)
      38 | +        rawTxSigned = self.nodes[0].signrawtransactionwithkey(rawTx, privKeys, inputs)
      39 | +
      40 | +        # 1) The transaction has a complete set of signatures
      41 | +        assert 'complete' in rawTxSigned
      42 | +        assert_equal(rawTxSigned['complete'], True)
    


    jnewbery commented at 7:01 PM on August 29, 2017:

    no need for assert_equal(thing, True). Just use assert thing

  33. in test/functional/signrawtransactions.py:128 in 744c9a6a14 outdated
     119 | @@ -110,6 +120,32 @@ def script_verification_error_test(self):
     120 |          assert_equal(rawTxSigned['errors'][1]['vout'], inputs[2]['vout'])
     121 |          assert not rawTxSigned['errors'][0]['witness']
     122 |  
     123 | +        # Perform same test with signrawtransaction
     124 | +        rawTxSigned = self.nodes[0].signrawtransaction(rawTx, scripts, privKeys)
     125 | +
     126 | +        # 3) The transaction has no complete set of signatures
     127 | +        assert 'complete' in rawTxSigned
     128 | +        assert_equal(rawTxSigned['complete'], False)
    


    jnewbery commented at 7:01 PM on August 29, 2017:

    just use assert not thing

  34. in src/test/rpc_tests.cpp:72 in 744c9a6a14 outdated
      66 | @@ -67,14 +67,6 @@ BOOST_AUTO_TEST_CASE(rpc_rawparams)
      67 |      BOOST_CHECK_EQUAL(find_value(r.get_obj(), "locktime").get_int(), 0);
      68 |      BOOST_CHECK_THROW(r = CallRPC(std::string("decoderawtransaction ")+rawtx+" extra"), std::runtime_error);
      69 |  
      70 | -    BOOST_CHECK_THROW(CallRPC("signrawtransaction"), std::runtime_error);
    


    jnewbery commented at 7:03 PM on August 29, 2017:

    Remove these tests before the first commit.

  35. in src/wallet/rpcwallet.h:30 in 744c9a6a14 outdated
      22 | @@ -22,4 +23,6 @@ std::string HelpRequiringPassphrase(CWallet *);
      23 |  void EnsureWalletIsUnlocked(CWallet *);
      24 |  bool EnsureWalletIsAvailable(CWallet *, bool avoidException);
      25 |  
      26 | +UniValue signrawtransactionwithwallet(const JSONRPCRequest& request);
    


    jnewbery commented at 7:08 PM on August 29, 2017:

    I have a slight personal preference for walletsignrawtransaction. 4 keystrokes saved :)


    instagibbs commented at 9:42 PM on February 8, 2018:

    Although it's slightly more verbose, parallel structure with other version is nice.

    keysignrawtransaction doesn't quite roll off the tongue

  36. in src/wallet/rpcwallet.cpp:3219 in 744c9a6a14 outdated
    3215 | @@ -3147,6 +3216,7 @@ static const CRPCCommand commands[] =
    3216 |  { //  category              name                        actor (function)           okSafeMode
    3217 |      //  --------------------- ------------------------    -----------------------    ----------
    3218 |      { "rawtransactions",    "fundrawtransaction",       &fundrawtransaction,       false,  {"hexstring","options"} },
    3219 | +    { "rawtransactions",    "signrawtransactionwithwallet",       &signrawtransactionwithwallet,       false, {"hexstring","prevtxs","sighashtype"} },
    


    jnewbery commented at 7:13 PM on August 29, 2017:

    nit: alignment


    jnewbery commented at 7:17 PM on August 29, 2017:

    I think this should be "wallet" category.

  37. in src/wallet/rpcwallet.cpp:3012 in 744c9a6a14 outdated
    3007 | +
    3008 | +    LOCK2(cs_main, pwallet->cs_wallet);
    3009 | +    RPCTypeCheck(request.params, {UniValue::VSTR, UniValue::VARR, UniValue::VSTR}, true);
    3010 | +
    3011 | +    CMutableTransaction mtx;
    3012 | +    if (!DecodeHexTx(mtx, request.params[0].get_str(), true))
    


    jnewbery commented at 7:20 PM on August 29, 2017:

    style nit: braces for if statements please

  38. in src/rpc/rawtransaction.cpp:1051 in 744c9a6a14 outdated
    1046 | @@ -970,7 +1047,8 @@ static const CRPCCommand commands[] =
    1047 |      { "rawtransactions",    "decodescript",           &decodescript,           true,  {"hexstring"} },
    1048 |      { "rawtransactions",    "sendrawtransaction",     &sendrawtransaction,     false, {"hexstring","allowhighfees"} },
    1049 |      { "rawtransactions",    "combinerawtransaction",  &combinerawtransaction,  true,  {"txs"} },
    1050 | -    { "rawtransactions",    "signrawtransaction",     &signrawtransaction,     false, {"hexstring","prevtxs","privkeys","sighashtype"} }, /* uses wallet if enabled */
    1051 | +    { "rawtransactions",    "signrawtransaction",     &signrawtransaction,     true, {"hexstring","prevtxs","privkeys","sighashtype"} },
    1052 | +    { "rawtransactions",    "signrawtransactionwithkey", &signrawtransactionwithkey, true, {"hexstring","privkeys","prevtxs","sighashtype"} },
    


    jnewbery commented at 7:21 PM on August 29, 2017:

    nit: alignment

  39. in src/rpc/rawtransaction.cpp:650 in 744c9a6a14 outdated
     720 | -
     721 |      // Fetch previous transactions (inputs):
     722 |      CCoinsView viewDummy;
     723 |      CCoinsViewCache view(&viewDummy);
     724 |      {
     725 | +        LOCK(cs_main);
    


    jnewbery commented at 7:24 PM on August 29, 2017:

    This function is called by signrawtransactionwithwallet which calls LOCK2(cs_main, pwallet->cs_wallet);. Is it ok to call LOCK(main) on top of that?

    If not, you'll need to move this LOCK(main) into the calling signrawtransactionwithkey() function.

    If it's ok to call locks this way, then you can change this for LOCK2(cs_main, mempool.cs)


    achow101 commented at 10:57 PM on August 29, 2017:

    since cs_main isn't necessary in signrawtransactionwithwallet, I've removed it.


    achow101 commented at 11:27 PM on August 29, 2017:

    Actually it is needed, but locking twice in the same thread is fine since it is a recursive_mutex.


    jnewbery commented at 2:53 PM on August 31, 2017:

    looking at this some more, I don't think cs_main is required here. You could turn this back into LOCK(mempool.cs) and change the lock in signrawtransactionwithwallet to LOCK(pwallet->cs_wallet)


    achow101 commented at 2:56 PM on August 31, 2017:

    @jnewbery that's what I originally thought. Then when I removed it I got a bunch of AssertLockHeld problems that went away after I added it back in.


    jnewbery commented at 4:10 PM on August 31, 2017:

    You're right. Suhas points out to me that pcoinsTip requires cs_main. This should be left as LOCK2(cs_main, mempool.cs)

  40. in src/rpc/rawtransaction.cpp:944 in 744c9a6a14 outdated
     939 | +    JSONRPCRequest newRequest;
     940 | +    newRequest.id = request.id;
     941 | +    newRequest.params.setArray();
     942 | +
     943 | +    // For signing with private keys
     944 | +    if (request.params.size() > 2 && !request.params[2].isNull()) {
    


    jnewbery commented at 7:29 PM on August 29, 2017:

    I don't think request.params.size() > 2 is required. Univalue does the bounds checking for you.

  41. in src/rpc/rawtransaction.cpp:953 in 744c9a6a14 outdated
     948 | +        newRequest.params.push_back(request.params[3]);
     949 | +        return signrawtransactionwithkey(newRequest);
     950 | +    }
     951 | +    // Otherwise sign with the wallet
     952 | +#ifdef ENABLE_WALLET
     953 | +    else if (request.params[2].isNull()) {
    


    jnewbery commented at 7:31 PM on August 29, 2017:

    This should become an else, and remove the else below (if we drop down that far then we've failed and should throw the "No private keys available." error

  42. in src/rpc/rawtransaction.cpp:946 in 744c9a6a14 outdated
     941 | +    newRequest.params.setArray();
     942 | +
     943 | +    // For signing with private keys
     944 | +    if (request.params.size() > 2 && !request.params[2].isNull()) {
     945 | +        newRequest.params.push_back(request.params[0]);
     946 | +        newRequest.params.push_back(request.params[2]);
    


    jnewbery commented at 7:33 PM on August 29, 2017:

    suggestion: add comment here to say that order of prevtxs and privkeys is reversed in signrawtranactionwithkey

  43. in src/rpc/rawtransaction.cpp:955 in 744c9a6a14 outdated
     950 | +    }
     951 | +    // Otherwise sign with the wallet
     952 | +#ifdef ENABLE_WALLET
     953 | +    else if (request.params[2].isNull()) {
     954 | +        newRequest.params.push_back(request.params[0]);
     955 | +        newRequest.params.push_back(request.params[1]);
    


    jnewbery commented at 7:33 PM on August 29, 2017:

    suggestion: add a comment here to say that signrawtransactionwithwallet doesn't take a privkeys parameter.

  44. in src/rpc/rawtransaction.cpp:913 in 744c9a6a14 outdated
     866 | +    }
     867 | +
     868 | +    return signtransaction(mtx, request.params[2], &keystore, true, request.params[3]);
     869 | +}
     870 | +
     871 | +UniValue signrawtransaction(const JSONRPCRequest& request)
    


    jnewbery commented at 7:43 PM on August 29, 2017:

    Perhaps hide this RPC behind a deprecated command line argument (similar to #11031)

  45. in src/rpc/rawtransaction.cpp:851 in 744c9a6a14 outdated
     846 | +        );
     847 | +
     848 | +    RPCTypeCheck(request.params, {UniValue::VSTR, UniValue::VARR, UniValue::VARR, UniValue::VSTR}, true);
     849 | +
     850 | +    CMutableTransaction mtx;
     851 | +    if (!DecodeHexTx(mtx, request.params[0].get_str(), true))
    


    jnewbery commented at 7:45 PM on August 29, 2017:

    nit: I know these are moves, but there's so few of them that you might as well add braces to the ifs.

  46. in src/rpc/rawtransaction.cpp:939 in 744c9a6a14 outdated
     934 | +        );
     935 | +
     936 | +    RPCTypeCheck(request.params, {UniValue::VSTR, UniValue::VARR, UniValue::VARR, UniValue::VSTR}, true);
     937 | +
     938 | +    // Make a JSONRPCRequest to pass on to the right signrawtransaction* command
     939 | +    JSONRPCRequest newRequest;
    


    jnewbery commented at 7:46 PM on August 29, 2017:

    nit: use snake_case for variables in new functions.

  47. in src/rpc/rawtransaction.cpp:644 in 744c9a6a14 outdated
     640 | @@ -641,86 +641,13 @@ UniValue combinerawtransaction(const JSONRPCRequest& request)
     641 |      return EncodeHexTx(mergedTx);
     642 |  }
     643 |  
     644 | -UniValue signrawtransaction(const JSONRPCRequest& request)
     645 | +UniValue signtransaction(CMutableTransaction& mtx, const UniValue& prevTxsUnival, CBasicKeyStore *keystore, bool tempKeystore, const UniValue& hashType)
    


    jnewbery commented at 8:00 PM on August 29, 2017:

    nit: new function parameters should be snake_case

  48. jnewbery changes_requested
  49. jnewbery commented at 8:40 PM on August 29, 2017: member

    Some review comments inline. It's a shame that this doesn't remove the server->wallet dependency, but it's a good first step in that direction.

    I felt bad about asking you to rebase and then not actually reviewing before it got stale again, so I rebased it myself here: https://github.com/jnewbery/bitcoin/tree/pr10579 . Feel free to grab that branch if it helps.

  50. in test/functional/signrawtransactions.py:40 in 744c9a6a14 outdated
      33 | @@ -34,6 +34,16 @@ def successful_signing_test(self):
      34 |          outputs = {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
      35 |  
      36 |          rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
      37 | +        rawTxSigned = self.nodes[0].signrawtransactionwithkey(rawTx, privKeys, inputs)
      38 | +
      39 | +        # 1) The transaction has a complete set of signatures
      40 | +        assert 'complete' in rawTxSigned
    


    promag commented at 8:53 PM on August 29, 2017:

    Remove key asserts since below you assert the value, which fail in case the key is not defined? cc @jnewbery.


    MarcoFalke commented at 6:18 AM on August 30, 2017:

    Right. The line below should raise KeyError in that case.

  51. in src/rpc/rawtransaction.h:13 in 744c9a6a14 outdated
       8 | +class CBasicKeyStore;
       9 | +
      10 | +/** Sign a transaction with the given keystore and previous transactions */
      11 | +UniValue signtransaction(CMutableTransaction& mtx, const UniValue& prevTxs, CBasicKeyStore *keystore, bool tempKeystore, const UniValue& hashType);
      12 | +
      13 | +#endif
    


    promag commented at 9:02 PM on August 29, 2017:

    Missing comment.


    achow101 commented at 11:06 PM on August 29, 2017:

    Huh?


    promag commented at 11:13 PM on August 29, 2017:
    #endif // BITCOIN_RPC_RAWTRANSACTION_H
    
  52. in src/rpc/rawtransaction.h:8 in 744c9a6a14 outdated
       0 | @@ -0,0 +1,14 @@
       1 | +// Copyright (c) 2017 The Bitcoin Core developers
       2 | +// Distributed under the MIT software license, see the accompanying
       3 | +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4 | +
       5 | +#ifndef BITCOIN_RPC_RAWTRANSACTION_H
       6 | +#define BITCOIN_RPC_RAWTRANSACTION_H
       7 | +
       8 | +class CBasicKeyStore;
    


    promag commented at 9:03 PM on August 29, 2017:

    Unknown types below: CMutableTransaction and UniValue.


    jnewbery commented at 4:17 PM on August 31, 2017:

    Still not addressed in f5a3e0d4a3b4b359714b7d380d7784b7ca0524c0


    achow101 commented at 5:46 PM on August 31, 2017:

    Done


    promag commented at 8:52 AM on September 28, 2017:

    Still missing?


    achow101 commented at 4:34 PM on September 28, 2017:

    Hmm. It must have gotten lost somewhere.

  53. in src/wallet/rpcwallet.cpp:20 in 744c9a6a14 outdated
      17 | @@ -18,6 +18,7 @@
      18 |  #include "policy/rbf.h"
      19 |  #include "rpc/mining.h"
      20 |  #include "rpc/server.h"
      21 | +#include "rpc/rawtransaction.h"
    


    promag commented at 9:03 PM on August 29, 2017:

    Sort.

  54. in src/rpc/rawtransaction.cpp:791 in 744c9a6a14 outdated
     785 | @@ -888,6 +786,185 @@ UniValue signrawtransaction(const JSONRPCRequest& request)
     786 |      return result;
     787 |  }
     788 |  
     789 | +UniValue signrawtransactionwithkey(const JSONRPCRequest& request)
     790 | +{
     791 | +
    


    promag commented at 9:05 PM on August 29, 2017:

    Remove newline.

  55. in src/rpc/rawtransaction.cpp:856 in 744c9a6a14 outdated
     851 | +    if (!DecodeHexTx(mtx, request.params[0].get_str(), true))
     852 | +        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
     853 | +
     854 | +    CBasicKeyStore keystore;
     855 | +    UniValue keys = request.params[1].get_array();
     856 | +    for (unsigned int idx = 0; idx < keys.size(); idx++) {
    


    promag commented at 9:06 PM on August 29, 2017:

    ++idx.

  56. in src/rpc/rawtransaction.cpp:863 in 744c9a6a14 outdated
     858 | +        CBitcoinSecret vchSecret;
     859 | +        bool fGood = vchSecret.SetString(k.get_str());
     860 | +        if (!fGood)
     861 | +            throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
     862 | +        CKey key = vchSecret.GetKey();
     863 | +        if (!key.IsValid())
    


    promag commented at 9:08 PM on August 29, 2017:

    Braces.

  57. in src/rpc/rawtransaction.cpp:860 in 744c9a6a14 outdated
     855 | +    UniValue keys = request.params[1].get_array();
     856 | +    for (unsigned int idx = 0; idx < keys.size(); idx++) {
     857 | +        UniValue k = keys[idx];
     858 | +        CBitcoinSecret vchSecret;
     859 | +        bool fGood = vchSecret.SetString(k.get_str());
     860 | +        if (!fGood)
    


    promag commented at 9:08 PM on August 29, 2017:

    Take the opportunity to kill fGood:

    if (!vchSecret.SetString(k.get_str())) {
    
  58. in src/rpc/rawtransaction.cpp:960 in 744c9a6a14 outdated
     955 | +        newRequest.params.push_back(request.params[1]);
     956 | +        newRequest.params.push_back(request.params[3]);
     957 | +        return signrawtransactionwithwallet(newRequest);
     958 | +    }
     959 | +#endif
     960 | +    else
    


    promag commented at 9:11 PM on August 29, 2017:
    else {
    
  59. in src/rpc/rawtransaction.cpp:1050 in 744c9a6a14 outdated
    1046 | @@ -970,7 +1047,8 @@ static const CRPCCommand commands[] =
    1047 |      { "rawtransactions",    "decodescript",           &decodescript,           true,  {"hexstring"} },
    1048 |      { "rawtransactions",    "sendrawtransaction",     &sendrawtransaction,     false, {"hexstring","allowhighfees"} },
    1049 |      { "rawtransactions",    "combinerawtransaction",  &combinerawtransaction,  true,  {"txs"} },
    1050 | -    { "rawtransactions",    "signrawtransaction",     &signrawtransaction,     false, {"hexstring","prevtxs","privkeys","sighashtype"} }, /* uses wallet if enabled */
    1051 | +    { "rawtransactions",    "signrawtransaction",     &signrawtransaction,     true, {"hexstring","prevtxs","privkeys","sighashtype"} },
    


    promag commented at 9:12 PM on August 29, 2017:

    Ops, align this and above lines? 😞

  60. achow101 force-pushed on Aug 29, 2017
  61. achow101 commented at 11:52 PM on August 29, 2017: member

    Rebased and addressed many comments

  62. achow101 force-pushed on Aug 29, 2017
  63. achow101 force-pushed on Aug 30, 2017
  64. in test/functional/txn_clone.py:157 in 4f64ef9064 outdated
     153 | @@ -154,5 +154,4 @@ def run_test(self):
     154 |          assert_equal(self.nodes[1].getbalance("from0", 0), -(tx1["amount"] + tx2["amount"]))
     155 |  
     156 |  if __name__ == '__main__':
     157 | -    TxnMallTest().main()
     158 | -
     159 | +    TxnMallTest().main()
    


    MarcoFalke commented at 6:17 AM on August 30, 2017:

    Whitespace issue causing the scripted diff to fail

  65. in test/functional/signrawtransactions.py:101 in 4f64ef9064 outdated
     104 | +        # 4) Two script verification errors occurred
     105 | +        assert 'errors' in rawTxSigned
     106 | +        assert_equal(len(rawTxSigned['errors']), 2)
     107 | +
     108 | +        # 5) Script verification errors have certain properties
     109 | +        assert 'txid' in rawTxSigned['errors'][0]
    


    jnewbery commented at 1:56 PM on August 30, 2017:

    As above, you don't need to test presence of these keys if you're going to test the values below. Recommend you flip # 5 and # 6 sections, and only test presence of keys where you haven't tested the values.


    achow101 commented at 7:17 PM on August 30, 2017:

    These were copied from a previously existing test.


    jnewbery commented at 4:17 PM on August 31, 2017:

    ok, I don't think there's any need to copy bad patterns, but I'm not too concerned either way.


    promag commented at 4:25 PM on August 31, 2017:

    Agree with @jnewbery.

  66. in src/rpc/rawtransaction.h:13 in 4f64ef9064 outdated
       8 | +class CBasicKeyStore;
       9 | +
      10 | +/** Sign a transaction with the given keystore and previous transactions */
      11 | +UniValue sign_transaction(CMutableTransaction& mtx, const UniValue& prevTxs, CBasicKeyStore *keystore, bool tempKeystore, const UniValue& hashType);
      12 | +
      13 | +#endif
    


    promag commented at 2:02 PM on August 30, 2017:

    Missing comment

    #endif // BITCOIN_RPC_RAWTRANSACTION_H
    
  67. achow101 force-pushed on Aug 30, 2017
  68. achow101 force-pushed on Aug 30, 2017
  69. achow101 force-pushed on Aug 30, 2017
  70. achow101 force-pushed on Aug 30, 2017
  71. achow101 force-pushed on Aug 30, 2017
  72. in src/wallet/rpcwallet.cpp:3296 in f5a3e0d4a3 outdated
    3018 | +            "\nExamples:\n"
    3019 | +            + HelpExampleCli("signrawtransactionwithwallet", "\"myhex\"")
    3020 | +            + HelpExampleRpc("signrawtransactionwithwallet", "\"myhex\"")
    3021 | +        );
    3022 | +
    3023 | +    LOCK2(cs_main, pwallet->cs_wallet);
    


    jnewbery commented at 4:19 PM on August 31, 2017:

    suggest you move this lock down to immediately before the call to sign_transaction(). No need to hold the lock if the parameters are invalid and we're just going to throw.


    achow101 commented at 5:46 PM on August 31, 2017:

    Done


    instagibbs commented at 9:41 PM on February 8, 2018:

    I don't see the changes suggested?


    achow101 commented at 7:53 PM on February 16, 2018:

    It probably got lost in one of the billion rebases. I added it back in.

  73. in src/wallet/rpcwallet.cpp:3235 in f5a3e0d4a3 outdated
    3231 | @@ -3162,6 +3232,7 @@ static const CRPCCommand commands[] =
    3232 |  { //  category              name                        actor (function)           okSafeMode
    3233 |      //  --------------------- ------------------------    -----------------------    ----------
    3234 |      { "rawtransactions",    "fundrawtransaction",       &fundrawtransaction,       false,  {"hexstring","options"} },
    3235 | +    { "wallet",             "signrawtransactionwithwallet",       &signrawtransactionwithwallet,       false, {"hexstring","prevtxs","sighashtype"} },
    


    jnewbery commented at 4:19 PM on August 31, 2017:

    alignment


    achow101 commented at 5:06 PM on August 31, 2017:

    Aligning this is annoying to do


    jnewbery commented at 5:20 PM on August 31, 2017:

    why? Can be done in a whitespace only commit at the end if you're worried about the diff


    achow101 commented at 5:46 PM on August 31, 2017:

    Done

  74. in src/rpc/rawtransaction.cpp:977 in f5a3e0d4a3 outdated
     960 | +    }
     961 | +#endif
     962 | +    // If we have made it this far, then wallet is disabled and no private keys were given, so fail here.
     963 | +    throw JSONRPCError(RPC_INVALID_PARAMETER, "No private keys available.");
     964 | +
     965 | +    return NullUniValue;
    


    jnewbery commented at 4:21 PM on August 31, 2017:

    I don't think this is required (we can never get this far since we throw two lines above.


    achow101 commented at 5:46 PM on August 31, 2017:

    Done


    jnewbery commented at 2:07 PM on September 27, 2017:

    still not removed in ac4f385


    achow101 commented at 3:23 PM on September 27, 2017:

    I thought I did that already.. Should be done now.

  75. jnewbery commented at 4:43 PM on August 31, 2017: member

    A few more nits inline. I'm still not entirely convinced that this is the best approach. Would it be better to have a signrawtransaction RPC in the wallet and a different signrawtransaction RPC in the node? If signrawtransaction is called on the node without a prevkeys argument, then an error is returned telling the user to call signrawtransaction on the wallet endpoint.

    That would be a breaking API change, but we need to break the API at some point (to disallow calling signrawtransaction without keys). Having different signrawtransaction RPCs for wallet and node would mean that clients who call signrawtransaction with privkeys wouldn't need to change at all, and clients who call signrawtransaction for the wallet would simply need to change the endpoint that they send the RPC to. This change will eventually require all users to change the method they call (and the order/number of parameters)

    The downside is that having two different signrawtransaction RPCs could be confusing.

  76. achow101 force-pushed on Aug 31, 2017
  77. achow101 force-pushed on Sep 5, 2017
  78. achow101 force-pushed on Sep 5, 2017
  79. in test/functional/txn_clone.py:55 in f36d682822 outdated
      44 | @@ -45,11 +45,11 @@ def run_test(self):
      45 |          # Coins are sent to node1_address
      46 |          node1_address = self.nodes[1].getnewaddress("from0")
      47 |  
      48 | -        # Send tx1, and another transaction tx2 that won't be cloned 
    


    sipa commented at 10:05 PM on September 5, 2017:

    This change line and a few others aren't supposed to happen in a scripted diff.


    achow101 commented at 11:53 PM on September 5, 2017:

    Oops

  80. achow101 force-pushed on Sep 5, 2017
  81. achow101 force-pushed on Sep 26, 2017
  82. achow101 commented at 8:36 PM on September 26, 2017: member

    Rebased onto #11031 and put signrawtransaction behind IsDeprecatedRPCEnabled.

  83. achow101 force-pushed on Sep 26, 2017
  84. achow101 force-pushed on Sep 27, 2017
  85. achow101 commented at 2:45 AM on September 27, 2017: member

    I don't know why travis is failing here

  86. in src/rpc/rawtransaction.cpp:830 in f786efcc73 outdated
     792 | @@ -893,6 +793,190 @@ UniValue signrawtransaction(const JSONRPCRequest& request)
     793 |      return result;
     794 |  }
     795 |  
     796 | +UniValue signrawtransactionwithkey(const JSONRPCRequest& request)
    


    fanquake commented at 3:29 AM on September 27, 2017:

    Whitespace above this line seems to be causing the travis failure.

  87. fanquake commented at 3:29 AM on September 27, 2017: member

    @achow101 Looks like the whitespace linter. Commented inline.

    diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp
    @@ -895,0 +796,184 @@ UniValue signrawtransaction(const JSONRPCRequest& request)
    +
    ^---- failure generated from contrib/devtools/lint-whitespace.sh
    
  88. achow101 force-pushed on Sep 27, 2017
  89. achow101 commented at 3:40 AM on September 27, 2017: member

    @fanquake I figured that much. I think I found the line with the error and it is definitely not the one which the linter points to. That error message is super unhelpful.

  90. fanquake commented at 6:49 AM on September 27, 2017: member

    @achow101 is that the first time you've seen the linter masking/hiding another error? We definitely don't want a situation where the linter ends up being ignored because it's triggering miscellaneously (the whitespace here wasn't touched or introduced), when in actual fact it's hiding errors.

  91. in src/qt/rpcconsole.cpp:75 in ac4f385744 outdated
      71 | @@ -72,6 +72,8 @@ const QStringList historyFilter = QStringList()
      72 |      << "importmulti"
      73 |      << "signmessagewithprivkey"
      74 |      << "signrawtransaction"
      75 | +    << "signrawtransactionwithwallet"
    


    jnewbery commented at 2:04 PM on September 27, 2017:

    signrawtransactionwithwallet doesn't handle private keys, so I don't think it needs to be included here.


    achow101 commented at 3:23 PM on September 27, 2017:

    Done.

  92. achow101 commented at 2:17 PM on September 27, 2017: member

    @fanquake Yes.

  93. in test/functional/signrawtransactions.py:5 in ac4f385744 outdated
       1 | @@ -2,7 +2,7 @@
       2 |  # Copyright (c) 2015-2016 The Bitcoin Core developers
       3 |  # Distributed under the MIT software license, see the accompanying
       4 |  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5 | -"""Test transaction signing using the signrawtransaction RPC."""
       6 | +"""Test transaction signing using the signrawtransactionwithwallet RPC."""
    


    jnewbery commented at 2:40 PM on September 27, 2017:

    Test transaction signing using the signrawtransactionwithkey and signrawtransactionwithwallet RPCs.


    achow101 commented at 3:23 PM on September 27, 2017:

    Done.

  94. in test/functional/signrawtransactions.py:37 in ac4f385744 outdated
      33 | @@ -33,11 +34,19 @@ def successful_signing_test(self):
      34 |          outputs = {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
      35 |  
      36 |          rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
      37 | +        rawTxSigned = self.nodes[0].signrawtransactionwithkey(rawTx, privKeys, inputs)
    


    jnewbery commented at 2:49 PM on September 27, 2017:

    I don't think you need to repeat all these tests twice. Just add something like the following to the end of each section:

    rawTxSignedWithKey = self.nodes[0].signrawtransactionwithkey(rawTx, privKeys, inputs)
    assert_equal(rawTxSigned, rawTxSignedWithKey)
    

    achow101 commented at 3:23 PM on September 27, 2017:

    Done

  95. achow101 force-pushed on Sep 27, 2017
  96. achow101 commented at 3:24 PM on September 27, 2017: member

    Rebased to master. Addressed @jnewbery's comments.

  97. achow101 force-pushed on Sep 27, 2017
  98. achow101 force-pushed on Sep 27, 2017
  99. jnewbery commented at 8:42 PM on September 27, 2017: member

    scripted-diff failure

  100. achow101 commented at 11:11 PM on September 27, 2017: member

    scripted-diff failure

    Doesn't look like it...

  101. jnewbery commented at 11:31 PM on September 27, 2017: member

    Doesn't look like it...

    Sorry, I must've been seeing a cached result.

  102. in src/rpc/rawtransaction.cpp:852 in a7c824076b outdated
     813 | +            "    ]\n"
     814 | +            "3. \"prevtxs\"       (string, optional) An json array of previous dependent transaction outputs\n"
     815 | +            "     [               (json array of json objects, or 'null' if none provided)\n"
     816 | +            "       {\n"
     817 | +            "         \"txid\":\"id\",             (string, required) The transaction id\n"
     818 | +            "         \"vout\":n,                  (numeric, required) The output number\n"
    


    promag commented at 9:06 AM on September 28, 2017:

    Nit, fix alignment.


    achow101 commented at 4:37 PM on September 28, 2017:

    Alignment fixed

  103. in src/rpc/rawtransaction.cpp:855 in a7c824076b outdated
     816 | +            "       {\n"
     817 | +            "         \"txid\":\"id\",             (string, required) The transaction id\n"
     818 | +            "         \"vout\":n,                  (numeric, required) The output number\n"
     819 | +            "         \"scriptPubKey\": \"hex\",   (string, required) script key\n"
     820 | +            "         \"redeemScript\": \"hex\",   (string, required for P2SH or P2WSH) redeem script\n"
     821 | +            "         \"amount\": value            (numeric, required) The amount spent\n"
    


    promag commented at 9:06 AM on September 28, 2017:

    Nit, fix alignment.

  104. in src/rpc/rawtransaction.cpp:862 in a7c824076b outdated
     857 | +    if (!DecodeHexTx(mtx, request.params[0].get_str(), true)) {
     858 | +        throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
     859 | +    }
     860 | +
     861 | +    CBasicKeyStore keystore;
     862 | +    UniValue keys = request.params[1].get_array();
    


    promag commented at 9:08 AM on September 28, 2017:
    const UniValue& keys = ...
    

    achow101 commented at 4:37 PM on September 28, 2017:

    Done

  105. in src/rpc/rawtransaction.cpp:936 in a7c824076b outdated
     897 | +            "1. \"hexstring\"     (string, required) The transaction hex string\n"
     898 | +            "2. \"prevtxs\"       (string, optional) An json array of previous dependent transaction outputs\n"
     899 | +            "     [               (json array of json objects, or 'null' if none provided)\n"
     900 | +            "       {\n"
     901 | +            "         \"txid\":\"id\",             (string, required) The transaction id\n"
     902 | +            "         \"vout\":n,                  (numeric, required) The output number\n"
    


    promag commented at 9:09 AM on September 28, 2017:

    Fix alignment.

  106. in src/rpc/rawtransaction.cpp:939 in a7c824076b outdated
     900 | +            "       {\n"
     901 | +            "         \"txid\":\"id\",             (string, required) The transaction id\n"
     902 | +            "         \"vout\":n,                  (numeric, required) The output number\n"
     903 | +            "         \"scriptPubKey\": \"hex\",   (string, required) script key\n"
     904 | +            "         \"redeemScript\": \"hex\",   (string, required for P2SH or P2WSH) redeem script\n"
     905 | +            "         \"amount\": value            (numeric, required) The amount spent\n"
    


    promag commented at 9:09 AM on September 28, 2017:

    Fix alignment.

  107. promag commented at 9:39 AM on September 28, 2017: member

    Some comments, I'll test later today.

  108. achow101 force-pushed on Sep 28, 2017
  109. jnewbery commented at 6:01 PM on September 28, 2017: member

    ACK 03ca3abb6963bbf621337f2de59407b6dfb6c8f0

  110. achow101 force-pushed on Sep 29, 2017
  111. achow101 commented at 6:36 PM on September 29, 2017: member

    Rebased.

  112. achow101 force-pushed on Sep 30, 2017
  113. achow101 force-pushed on Oct 19, 2017
  114. achow101 commented at 3:33 AM on October 19, 2017: member

    n'th rebase

  115. achow101 force-pushed on Nov 30, 2017
  116. achow101 commented at 5:19 PM on November 30, 2017: member

    Rebased.

  117. in src/wallet/rpcwallet.cpp:3600 in 3f4351dbd4 outdated
    3562 | -    { "wallet",             "walletpassphrase",         &walletpassphrase,         {"passphrase","timeout"} },
    3563 | -    { "wallet",             "removeprunedfunds",        &removeprunedfunds,        {"txid"} },
    3564 | -    { "wallet",             "rescanblockchain",         &rescanblockchain,         {"start_height", "stop_height"} },
    3565 | -
    3566 | -    { "generating",         "generate",                 &generate,                 {"nblocks","maxtries"} },
    3567 | + { //  category              name                                actor (function)                argNames
    


    jnewbery commented at 8:08 PM on December 1, 2017:

    bad rebase: leading space character introduced.


    achow101 commented at 7:58 PM on February 16, 2018:

    Fixed.

  118. jnewbery commented at 8:10 PM on December 1, 2017: member

    utACK 3f4351dbd43a86c9197c30f13ce8b409c4a1548e

    Confirm rebase is good except for a stray space character introduced.

  119. promag cross-referenced this on Dec 7, 2017 from issue Moving listwallets out of the wallet category on rpc help by ruimarinho
  120. in src/rpc/client.cpp:98 in 3f4351dbd4 outdated
      94 | @@ -95,6 +95,9 @@ static const CRPCConvertParam vRPCConvertParams[] =
      95 |      { "createrawtransaction", 3, "replaceable" },
      96 |      { "signrawtransaction", 1, "prevtxs" },
      97 |      { "signrawtransaction", 2, "privkeys" },
      98 | +    { "signrawtransactionwithwallet", 1, "prevtxs" },
    


    jnewbery commented at 6:20 PM on December 7, 2017:

    nit: alphabetical sort please


    achow101 commented at 7:57 PM on December 7, 2017:

    Done.

  121. in src/wallet/rpcwallet.cpp:3515 in 3f4351dbd4 outdated
    3565 | -
    3566 | -    { "generating",         "generate",                 &generate,                 {"nblocks","maxtries"} },
    3567 | + { //  category              name                                actor (function)                argNames
    3568 | +    //  --------------------- ------------------------          -----------------------         ----------
    3569 | +    { "rawtransactions",    "fundrawtransaction",               &fundrawtransaction,            {"hexstring","options"} },
    3570 | +    { "wallet",             "signrawtransactionwithwallet",     &signrawtransactionwithwallet,  {"hexstring","prevtxs","sighashtype"} },
    


    jnewbery commented at 6:21 PM on December 7, 2017:

    nit: alphabetical sort please


    achow101 commented at 7:57 PM on December 7, 2017:

    Done.

  122. achow101 force-pushed on Dec 7, 2017
  123. achow101 commented at 7:57 PM on December 7, 2017: member

    Addressed @jnewbery's nits and rebased.

  124. achow101 force-pushed on Dec 11, 2017
  125. achow101 commented at 6:42 PM on December 11, 2017: member

    Fixed that test failure.

  126. achow101 force-pushed on Jan 10, 2018
  127. achow101 commented at 7:25 PM on January 10, 2018: member

    Rebased

  128. laanwj removed this from the milestone 0.16.0 on Jan 11, 2018
  129. laanwj added this to the milestone 0.17.0 on Jan 11, 2018
  130. achow101 force-pushed on Jan 11, 2018
  131. achow101 commented at 7:26 PM on January 11, 2018: member

    Rebased

  132. achow101 force-pushed on Feb 1, 2018
  133. achow101 commented at 9:08 PM on February 1, 2018: member

    Rebased

  134. achow101 force-pushed on Feb 1, 2018
  135. achow101 force-pushed on Feb 8, 2018
  136. achow101 commented at 8:43 PM on February 8, 2018: member

    Rebased yet again

  137. jnewbery commented at 7:39 PM on February 16, 2018: member
  138. achow101 force-pushed on Feb 16, 2018
  139. achow101 force-pushed on Feb 16, 2018
  140. achow101 commented at 7:53 PM on February 16, 2018: member

    Thanks @jnewbery for the rebase!

  141. achow101 force-pushed on Feb 16, 2018
  142. in src/rpc/rawtransaction.cpp:675 in 8c95521494 outdated
     671 | @@ -672,88 +672,13 @@ UniValue combinerawtransaction(const JSONRPCRequest& request)
     672 |      return EncodeHexTx(mergedTx);
     673 |  }
     674 |  
     675 | -UniValue signrawtransaction(const JSONRPCRequest& request)
     676 | +UniValue sign_transaction(CMutableTransaction& mtx, const UniValue& prevTxsUnival, CBasicKeyStore *keystore, bool tempKeystore, const UniValue& hashType)
    


    instagibbs commented at 9:08 PM on February 16, 2018:

    non blocking nit: if this stuff is being renamed we should follow snake case


    achow101 commented at 9:59 PM on February 16, 2018:

    I believe you meant CamelCase, not snake_case. I changed it to CanelCase.


    instagibbs commented at 10:05 PM on February 16, 2018:

    referring to "variable and namespace names are all lowercase, and may use _ to separate words (snake_case)." in https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md


    achow101 commented at 10:20 PM on February 16, 2018:

    Ah. Most of these aren't renamed (I think).


    jnewbery commented at 10:24 PM on February 16, 2018:

    Please no more renames! :)

  143. in src/rpc/rawtransaction.cpp:742 in 8c95521494 outdated
     737 | @@ -834,8 +738,8 @@ UniValue signrawtransaction(const JSONRPCRequest& request)
     738 |              }
     739 |  
     740 |              // if redeemScript given and not using the local wallet (private keys
     741 | -            // given), add redeemScript to the tempKeystore so it can be signed:
     742 | -            if (fGivenKeys && (scriptPubKey.IsPayToScriptHash() || scriptPubKey.IsPayToWitnessScriptHash())) {
     743 | +            // given), add redeemScript to the keystore so it can be signed:
     744 | +            if (tempKeystore && (scriptPubKey.IsPayToScriptHash() || scriptPubKey.IsPayToWitnessScriptHash())) {
    


    instagibbs commented at 9:11 PM on February 16, 2018:

    this is a bit confusing since previously tempKeystore was an actual keystore, now it's a bool. is_temp_keystore or something please


    achow101 commented at 9:59 PM on February 16, 2018:

    Done

  144. instagibbs commented at 9:26 PM on February 16, 2018: member

    looking pretty good, will do some testing

  145. achow101 force-pushed on Feb 16, 2018
  146. jnewbery commented at 10:09 PM on February 16, 2018: member

    reACK 3808129837f12482fcadd030d4e720ff2498b452. Only changes are:

    • renaming suggested by instagibbs
    • removing stray space character
    • moving LOCK2() down a few lines in signrawtransactionwithwallet()
  147. instagibbs commented at 10:47 PM on February 16, 2018: member

    Not pushing! :)

    On Fri, Feb 16, 2018, 5:25 PM John Newbery notifications@github.com wrote:

    @jnewbery commented on this pull request.

    In src/rpc/rawtransaction.cpp https://github.com/bitcoin/bitcoin/pull/10579#discussion_r168885756:

    @@ -672,88 +672,13 @@ UniValue combinerawtransaction(const JSONRPCRequest& request) return EncodeHexTx(mergedTx); }

    -UniValue signrawtransaction(const JSONRPCRequest& request) +UniValue sign_transaction(CMutableTransaction& mtx, const UniValue& prevTxsUnival, CBasicKeyStore *keystore, bool tempKeystore, const UniValue& hashType)

    Please no more renames! :)

    — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/bitcoin/bitcoin/pull/10579#discussion_r168885756, or mute the thread https://github.com/notifications/unsubscribe-auth/AFgC0xdQOxI6frA4Q39cT1VlA7ZPKX9vks5tVgBlgaJpZM4N3w_N .

  148. Split signrawtransaction into wallet and non-wallet
    Splits signrwatransaction into a wallet version (signrawtransactionwithwallet) and
    non-wallet version (signrawtransactionwithkey). signrawtransaction is marked as DEPRECATED
    and will call the right signrawtransaction* command as per the parameters in order to
    maintain compatibility.
    
    Updated signrawtransactions test to use new RPCs
    1e79c055cd
  149. scripted-diff: change signrawtransaction to signrawtransactionwithwallet in tests
    -BEGIN VERIFY SCRIPT-
    sed -i 's/\<signrawtransaction\>/signrawtransactionwithwallet/g' test/functional/*.py
    sed -i 's/\<signrawtransaction\>/signrawtransactionwithwallet/g' test/functional/test_framework/*.py
    -END VERIFY SCRIPT-
    eefff65a4b
  150. Add test for signrawtransaction
    Add a brief test for signrawtransaction to ensure that compatibility is maintained.
    d60234885b
  151. achow101 force-pushed on Feb 17, 2018
  152. achow101 commented at 5:06 PM on February 17, 2018: member

    Rebased again.

  153. in src/rpc/rawtransaction.h:9 in d60234885b
       0 | @@ -0,0 +1,15 @@
       1 | +// Copyright (c) 2017 The Bitcoin Core developers
       2 | +// Distributed under the MIT software license, see the accompanying
       3 | +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4 | +
       5 | +#ifndef BITCOIN_RPC_RAWTRANSACTION_H
       6 | +#define BITCOIN_RPC_RAWTRANSACTION_H
       7 | +
       8 | +class CBasicKeyStore;
       9 | +class CMutableTransaction;
    


    promag commented at 12:40 AM on February 18, 2018:

    Nit, gives compiler warning:

    In file included from rpc/rawtransaction.cpp:20:
    ./rpc/rawtransaction.h:9:1: warning: class 'CMutableTransaction' was previously declared as a struct [-Wmismatched-tags]
    class CMutableTransaction;
    ^
    ./primitives/transaction.h:362:8: note: previous use is here
    struct CMutableTransaction
           ^
    ./rpc/rawtransaction.h:9:1: note: did you mean struct here?
    class CMutableTransaction;
    ^~~~~
    struct
    

    achow101 commented at 2:27 AM on February 20, 2018:

    I don't see this on my machine..

  154. promag commented at 12:42 AM on February 18, 2018: member

    utACK d602348.

  155. jnewbery commented at 9:37 PM on February 19, 2018: member

    reACK d60234885bcc07b1a7f85ded7731549ec2fcfefa

  156. sipa commented at 2:25 AM on February 20, 2018: member

    utACK d60234885bcc07b1a7f85ded7731549ec2fcfefa

  157. sipa merged this on Feb 20, 2018
  158. sipa closed this on Feb 20, 2018

  159. sipa referenced this in commit ffc6e48b29 on Feb 20, 2018
  160. Empact cross-referenced this on Feb 20, 2018 from issue Declare CMutableTransaction a struct in rawtransaction.h by Empact
  161. MarcoFalke referenced this in commit e4ffcacc21 on Feb 21, 2018
  162. MarcoFalke cross-referenced this on Feb 22, 2018 from issue TODO for release notes 0.17.0 by laanwj
  163. lautarodragan cross-referenced this on Oct 10, 2018 from issue Deprecated signrawtransaction by lautarodragan
  164. moodmosaic referenced this in commit 0064a138d2 on Nov 28, 2018
  165. fanquake removed the label Needs release note on Mar 20, 2019
  166. PastaPastaPasta cross-referenced this on Apr 14, 2020 from issue Backports 0.16 pr17 by PastaPastaPasta
  167. PastaPastaPasta referenced this in commit 3f66e7da20 on Dec 11, 2020
  168. PastaPastaPasta referenced this in commit a320bf975e on Dec 11, 2020
  169. PastaPastaPasta referenced this in commit fc96339839 on Dec 12, 2020
  170. PastaPastaPasta referenced this in commit 0d87d008d8 on Dec 12, 2020
  171. PastaPastaPasta referenced this in commit 38ca3c214e on Dec 12, 2020
  172. PastaPastaPasta referenced this in commit 71d65d0a34 on Dec 12, 2020
  173. PastaPastaPasta referenced this in commit af917fedae on Dec 12, 2020
  174. PastaPastaPasta referenced this in commit b4f67a5e9e on Dec 15, 2020
  175. PastaPastaPasta referenced this in commit f51d1683b6 on Dec 15, 2020
  176. PastaPastaPasta referenced this in commit 5574b51570 on Dec 15, 2020
  177. PastaPastaPasta referenced this in commit a2f107424b on Dec 15, 2020
  178. PastaPastaPasta referenced this in commit 2bda82bdbe on Dec 15, 2020
  179. PastaPastaPasta referenced this in commit d72f7c86f9 on Dec 15, 2020
  180. PastaPastaPasta referenced this in commit d977daaff0 on Dec 18, 2020
  181. PastaPastaPasta referenced this in commit 9436fa23d5 on Dec 18, 2020
  182. PastaPastaPasta referenced this in commit 1d90698b6c on Dec 18, 2020
  183. bitcoin locked this on Dec 16, 2021
  184. gades referenced this in commit 78b6718141 on Mar 22, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-05-19 06:54 UTC