Add support for descriptors to utxoupdatepsbt #15427

pull sipa wants to merge 4 commits into bitcoin:master from sipa:201902_utxoupdatepsbtdesc changing 10 files +148 −59
  1. sipa commented at 12:50 AM on February 17, 2019: member

    This adds a descriptors argument to the utxoupdatepsbt RPC. This means:

    • Input and output scripts and keys will be filled in when known.
    • P2SH-witness inputs will be filled in from the UTXO set when a descriptor is provided that shows they're spending segwit outputs.

    This also moves some (newly) shared code to separate functions: UpdatePSBTOutput (an analogue to SignPSBTInput), IsSegWitOutput, and EvalDescriptorStringOrObject (implementing the string or object notation parsing used in scantxoutset).

  2. sipa commented at 12:53 AM on February 17, 2019: member

    @achow101 @gwillen You may be interested in this.

  3. sipa force-pushed on Feb 17, 2019
  4. fanquake added the label RPC/REST/ZMQ on Feb 17, 2019
  5. DrahtBot commented at 1:26 PM on February 18, 2019: member

    <!--e57a25ab6845829454e8d69fc972939a-->

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    <!--174a7506f384e20aa4161008e828411d-->

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #16240 (JSONRPCRequest-aware RPCHelpMan by kallewoof)
    • #16227 (Refactor CWallet's inheritance chain by achow101)
    • #15996 (rpc: Deprecate totalfee argument in bumpfee by instagibbs)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  6. in src/script/sign.cpp:514 in cb085728f6 outdated
     503 | +bool IsSegWitOutput(const SigningProvider& provider, const CScript& script)
     504 | +{
     505 | +    std::vector<valtype> solutions;
     506 | +    auto whichtype = Solver(script, solutions);
     507 | +    if (whichtype == TX_WITNESS_V0_SCRIPTHASH || whichtype == TX_WITNESS_V0_KEYHASH || whichtype == TX_WITNESS_UNKNOWN) return true;
     508 | +    if (whichtype == TX_SCRIPTHASH) {
    


    promag commented at 6:26 PM on February 18, 2019:

    Commit cb085728f64a76fec48dee4e6432c199aa69a62a

    Isn't this new code?


    sipa commented at 7:01 PM on February 18, 2019:

    Yes?


    promag commented at 7:28 PM on February 18, 2019:

    That's fine, just that after reading commit message I thought this was move only commit.


    sipa commented at 3:46 PM on February 20, 2019:

    Ah, good point. I'll clarify in the commit message.


    sipa commented at 10:58 PM on February 24, 2019:

    Done.

  7. in src/rpc/rawtransaction.cpp:1723 in e90a5c753d outdated
    1719 | +                {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
    1720 | +                {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED_NAMED_ARG, "An array of either strings or objects", {
    1721 | +                    {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A descriptor"},
    1722 | +                    {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with a descriptor and extra information", {
    1723 | +                         {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "A descriptor"},
    1724 | +                         {"range", RPCArg::Type::NUM, "1000", "Up to what index HD chains should be explored"},
    


    achow101 commented at 6:33 PM on February 18, 2019:

    Instead of a single range value, this could be the start and end values of the range like what importmulti does?


    sipa commented at 10:52 PM on February 24, 2019:

    I'm copying the behavior of scantxoutset here. Maybe it makes sense to merge the two afterwards, and have all three (scantxoutset, utxoupdatepsbt, importmulti) support both start+end and range?


    sipa commented at 9:27 PM on March 2, 2019:

    This is now fixed by using the same parameter style as all through #15497.

  8. achow101 commented at 6:33 PM on February 18, 2019: member

    Conecpt ACK

  9. promag commented at 6:40 PM on February 18, 2019: member

    Concept ACK, beside comment below, abstracted code looks good. Could include release note.

  10. DrahtBot added the label Needs rebase on Feb 22, 2019
  11. sipa force-pushed on Feb 24, 2019
  12. sipa commented at 10:58 PM on February 24, 2019: member

    Rebased.

  13. DrahtBot removed the label Needs rebase on Feb 24, 2019
  14. DrahtBot added the label Needs rebase on Mar 1, 2019
  15. sipa force-pushed on Mar 2, 2019
  16. sipa commented at 9:27 PM on March 2, 2019: member

    Rebased after merge of #15497.

  17. DrahtBot removed the label Needs rebase on Mar 2, 2019
  18. meshcollider commented at 4:11 AM on April 14, 2019: contributor

    Concept ACK

  19. laanwj added this to the "Blockers" column in a project

  20. in src/psbt.h:557 in cdabfae36e outdated
     553 | @@ -554,6 +554,9 @@ bool PSBTInputSigned(PSBTInput& input);
     554 |  /** Signs a PSBTInput, verifying that all provided data matches what is being signed. */
     555 |  bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, int sighash = SIGHASH_ALL, SignatureData* out_sigdata = nullptr, bool use_dummy = false);
     556 |  
     557 | +/** Updates a PSBTOutput with information from provider. */
    


    jnewbery commented at 5:57 PM on May 2, 2019:

    I think this could comment could be a bit more detailed. How is the PSBTOutput updated? (Answer: the redeem_script, witness_script and hd_keypaths are filled in)


    sipa commented at 10:39 PM on May 9, 2019:

    Done.

  21. in src/psbt.cpp:219 in cdabfae36e outdated
     209 | @@ -210,6 +210,20 @@ bool PSBTInputSigned(PSBTInput& input)
     210 |      return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
     211 |  }
     212 |  
     213 | +void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
     214 | +{
    


    jnewbery commented at 6:00 PM on May 2, 2019:

    I know this is move-only, but I found this functionality pretty inscrutable, and think it could do with some additional commenting. Things that would be helpful:

    • explain why the caller is instantiating a HidingSigningProvider with nosign set to true
    • explain what the magic 0 and 1 values are in the call to ProduceSignature()
    • explain that ProduceSignature() isn't really signing (or if it does, then that signature gets thrown away)

    sipa commented at 10:39 PM on May 9, 2019:

    Added a bunch of comments. Better?

  22. in src/rpc/rawtransaction.cpp:1716 in cdabfae36e outdated
    1709 | @@ -1710,12 +1710,19 @@ UniValue converttopsbt(const JSONRPCRequest& request)
    1710 |  
    1711 |  UniValue utxoupdatepsbt(const JSONRPCRequest& request)
    1712 |  {
    1713 | -    if (request.fHelp || request.params.size() != 1) {
    1714 | +    if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
    1715 |          throw std::runtime_error(
    1716 |              RPCHelpMan{"utxoupdatepsbt",
    1717 | -            "\nUpdates a PSBT with witness UTXOs retrieved from the UTXO set or the mempool.\n",
    1718 | +            "\nUpdates a PSBT with data from descriptors and the UTXO set or the mempool (segwit outputs only)\n",
    


    jnewbery commented at 6:13 PM on May 2, 2019:

    The parentheses here are ambiguous - they could be interpreted as modifying the entire sentence or just the mempool part. Consider changing this to:

    "\nUpdates all segwit inputs and outputs in a PSBT with data from descriptors, the UTXO set or the mempool.\n",
    

    sipa commented at 10:40 PM on May 9, 2019:

    Done.

  23. in src/rpc/rawtransaction.cpp:1783 in cdabfae36e outdated
    1781 | -        if (which_type == TX_WITNESS_V0_SCRIPTHASH || which_type == TX_WITNESS_V0_KEYHASH || which_type == TX_WITNESS_UNKNOWN) {
    1782 | +        if (IsSegWitOutput(provider, coin.out.scriptPubKey)) {
    1783 |              input.witness_utxo = coin.out;
    1784 |          }
    1785 | +
    1786 | +        // Update the inputs using descriptor data.
    


    jnewbery commented at 6:14 PM on May 2, 2019:

    Comment could be expanded to say what is being updated (redeem_script, witness_script and hd_keypaths are being filled)

  24. in src/rpc/rawtransaction.cpp:1787 in cdabfae36e outdated
    1785 | +
    1786 | +        // Update the inputs using descriptor data.
    1787 | +        SignPSBTInput(HidingSigningProvider(&provider, /* nosign */ true, /* nobip32derivs */ false), psbtx, i, /* sighash_type */ 1);
    1788 | +    }
    1789 | +
    1790 | +    // Update the outputs
    


    jnewbery commented at 6:14 PM on May 2, 2019:

    Comment could be expanded to say what is being updated (redeem_script, witness_script and hd_keypaths are being filled)


    sipa commented at 10:40 PM on May 9, 2019:

    I'd rather not be specific here, as it may change over time.

  25. in src/rpc/rawtransaction.cpp:1784 in cdabfae36e outdated
    1782 | +        if (IsSegWitOutput(provider, coin.out.scriptPubKey)) {
    1783 |              input.witness_utxo = coin.out;
    1784 |          }
    1785 | +
    1786 | +        // Update the inputs using descriptor data.
    1787 | +        SignPSBTInput(HidingSigningProvider(&provider, /* nosign */ true, /* nobip32derivs */ false), psbtx, i, /* sighash_type */ 1);
    


    jnewbery commented at 6:15 PM on May 2, 2019:

    I found using SignPSBTInput() a bit jarring here, since nothing is actually being signed. Can you add a comment to say that SignPSBTInput() won't actually sign when provided with a HidingSigningProvider where nosign is true?


    jnewbery commented at 6:16 PM on May 2, 2019:

    Is there a reason not to create one HidingSigningProvider() for the entire function, rather than instantiate one for each call to SignPSBTInput() and UpdatePSBTOutput()


    sipa commented at 10:41 PM on May 9, 2019:

    Added some comments.


    sipa commented at 10:41 PM on May 9, 2019:

    Nope. Done that, that's much more readable.

  26. in test/functional/rpc_psbt.py:314 in cdabfae36e outdated
     310 | @@ -311,14 +311,21 @@ def run_test(self):
     311 |          # Bech32 inputs should be filled with witness UTXO. Other inputs should not be filled because they are non-witness
     312 |          psbt = self.nodes[1].createpsbt([{"txid":txid1, "vout":vout1},{"txid":txid2, "vout":vout2},{"txid":txid3, "vout":vout3}], {self.nodes[0].getnewaddress():32.999})
     313 |          decoded = self.nodes[1].decodepsbt(psbt)
     314 | -        assert "witness_utxo" not in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0]
     315 | -        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1]
     316 | -        assert "witness_utxo" not in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2]
     317 | +        assert "witness_utxo" not in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" not in decoded['inputs'][0]
    


    jnewbery commented at 6:49 PM on May 2, 2019:

    These lines are pretty hard to read, and don't give very useful output if they fail. Consider refactoring as follows:

    diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py
    index 20261f7b7..9b00fc767 100755
    --- a/test/functional/rpc_psbt.py
    +++ b/test/functional/rpc_psbt.py
    @@ -307,25 +307,32 @@ class PSBTTest(BitcoinTestFramework):
             vout3 = find_output(self.nodes[0], txid3, 11)
             self.sync_all()
     
    -        # Update a PSBT with UTXOs from the node
    -        # Bech32 inputs should be filled with witness UTXO. Other inputs should not be filled because they are non-witness
    +        def test_psbt_input_keys(psbt_input, keys):
    +            """Check that the psbt input has only the expected keys."""
    +            assert_equal(set(keys), set(psbt_input.keys()))
    +
    +        # Create a PSBT. None of the inputs are filled initially
             psbt = self.nodes[1].createpsbt([{"txid":txid1, "vout":vout1},{"txid":txid2, "vout":vout2},{"txid":txid3, "vout":vout3}], {self.nodes[0].getnewaddress():32.999})
             decoded = self.nodes[1].decodepsbt(psbt)
    -        assert "witness_utxo" not in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" not in decoded['inputs'][0]
    -        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1] and "bip32_derivs" not in decoded['inputs'][1]
    -        assert "witness_utxo" not in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2] and "redeem_script" not in decoded['inputs'][2]
    +        test_psbt_input_keys(decoded['inputs'][0], [])
    +        test_psbt_input_keys(decoded['inputs'][1], [])
    +        test_psbt_input_keys(decoded['inputs'][2], [])
    +
    +        # Update a PSBT with UTXOs from the node
    +        # Bech32 inputs should be filled with witness UTXO. Other inputs should not be filled because they are non-witness
             updated = self.nodes[1].utxoupdatepsbt(psbt)
             decoded = self.nodes[1].decodepsbt(updated)
    -        assert "witness_utxo" in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" not in decoded['inputs'][0]
    -        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1] and "bip32_derivs" not in decoded['inputs'][1]
    -        assert "witness_utxo" not in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2] and "redeem_script" not in decoded['inputs'][2]
    +        test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo'])
    +        test_psbt_input_keys(decoded['inputs'][1], [])
    +        test_psbt_input_keys(decoded['inputs'][2], [])
    +
             # Try again, now while providing descriptors, making P2SH-segwit work, and causing bip32_derivs and redeem_script to be filled in
             descs = [self.nodes[1].getaddressinfo(addr)['desc'] for addr in [addr1,addr2,addr3]]
             updated = self.nodes[1].utxoupdatepsbt(psbt, descs)
             decoded = self.nodes[1].decodepsbt(updated)
    -        assert "witness_utxo" in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" in decoded['inputs'][0]
    -        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1] and "bip32_derivs" not in decoded['inputs'][1]
    -        assert "witness_utxo" in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2] and "redeem_script" in decoded['inputs'][2]
    +        test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo', 'bip32_derivs'])
    +        test_psbt_input_keys(decoded['inputs'][1], [])
    +        test_psbt_input_keys(decoded['inputs'][2], ['witness_utxo', 'bip32_derivs', 'redeem_script'])
     
             # Two PSBTs with a common input should not be joinable
             psbt1 = self.nodes[1].createpsbt([{"txid":txid1, "vout":vout1}], {self.nodes[0].getnewaddress():Decimal('10.999')})
    

    sipa commented at 10:41 PM on May 9, 2019:

    Applied.

  27. jnewbery commented at 6:50 PM on May 2, 2019: member

    utACk cdabfae36e83f20c4728fcbbab0089e711cf3bc3

    I left a bunch of comments, mostly around comments.

  28. sipa force-pushed on May 9, 2019
  29. DrahtBot added the label Needs rebase on May 10, 2019
  30. Abstract out IsSegWitOutput from utxoupdatepsbt
    This is not a pure refactor; additional functionality is added in
    IsSegWitOutput which lets it recurse into P2SH when a
    SigningProvider is provided that knows about the inner script.
    eaf4f88734
  31. Abstract out EvalDescriptorStringOrObject from scantxoutset fb90ec3c33
  32. Abstract out UpdatePSBTOutput from FillPSBT 3135c1a2d2
  33. Add support for descriptors to utxoupdatepsbt
    This adds a descriptors argument to the utxoupdatepsbt RPC. This means:
    * Input and output scripts and keys will be filled in when known
    * P2SH-witness outputs will be filled in from the UTXO set when a descriptor
      is provided to show they're segwit outputs.
    26fe9b9909
  34. in src/rpc/rawtransaction.cpp:1723 in 535b649da4 outdated
    1721 | +                {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
    1722 | +                {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED_NAMED_ARG, "An array of either strings or objects", {
    1723 | +                    {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A descriptor"},
    1724 | +                    {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with a descriptor and extra information", {
    1725 | +                         {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "A descriptor"},
    1726 | +                         {"range", RPCArg::Type::NUM, "1000", "Up to what index HD chains should be explored"},
    


    jnewbery commented at 7:21 PM on May 10, 2019:

    I believe this needs to be a range type and have the description updated. You should just be able to copy it from the scantxoutset help text.

    Also consider refering to descriptors as output descriptors throughout, for consistency with other RPCs.


    sipa commented at 9:46 PM on May 10, 2019:

    Done.

  35. sipa force-pushed on May 10, 2019
  36. sipa commented at 9:46 PM on May 10, 2019: member

    Rebased.

  37. jnewbery commented at 10:19 PM on May 10, 2019: member

    utACK 26fe9b990995f9cb5eee21d40b4daaad19f7181f

  38. DrahtBot removed the label Needs rebase on May 13, 2019
  39. in src/rpc/rawtransaction.cpp:1527 in 26fe9b9909
    1520 | @@ -1514,6 +1521,17 @@ UniValue utxoupdatepsbt(const JSONRPCRequest& request)
    1521 |          throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
    1522 |      }
    1523 |  
    1524 | +    // Parse descriptors, if any.
    1525 | +    FlatSigningProvider provider;
    1526 | +    if (!request.params[1].isNull()) {
    1527 | +        auto descs = request.params[1].get_array();
    


    promag commented at 5:45 PM on May 13, 2019:

    Use range loop

    for (const UniValue& scanobject : request.params[1].get_array().getValues()) {
    

    Like here.

  40. in src/wallet/psbtwallet.cpp:47 in 26fe9b9909
      52 | -        psbt_out.FillSignatureData(sigdata);
      53 | -
      54 | -        MutableTransactionSignatureCreator creator(psbtx.tx.get_ptr(), 0, out.nValue, 1);
      55 | -        ProduceSignature(HidingSigningProvider(pwallet, true, !bip32derivs), creator, out.scriptPubKey, sigdata);
      56 | -        psbt_out.FromSignatureData(sigdata);
      57 | +        UpdatePSBTOutput(HidingSigningProvider(pwallet, true, !bip32derivs), psbtx, i);
    


    promag commented at 5:55 PM on May 13, 2019:

    Makes sense to instantiate HidingSigningProvider before the loop?

  41. in test/functional/rpc_psbt.py:337 in 26fe9b9909
     340 | +        test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo'])
     341 | +        test_psbt_input_keys(decoded['inputs'][1], [])
     342 | +        test_psbt_input_keys(decoded['inputs'][2], [])
     343 | +
     344 | +        # Try again, now while providing descriptors, making P2SH-segwit work, and causing bip32_derivs and redeem_script to be filled in
     345 | +        descs = [self.nodes[1].getaddressinfo(addr)['desc'] for addr in [addr1,addr2,addr3]]
    


    promag commented at 5:57 PM on May 13, 2019:

    nit, spaces after , - [addr1, addr2, addr3].

  42. in src/psbt.cpp:218 in 26fe9b9909
     214 | @@ -215,6 +215,25 @@ bool PSBTInputSigned(const PSBTInput& input)
     215 |      return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
     216 |  }
     217 |  
     218 | +void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
    


    promag commented at 6:00 PM on May 13, 2019:

    Could name this UpdatePSBT() and iterate outputs here? - which is what both callers do.


    Empact commented at 4:19 AM on May 29, 2019:

    Alternatively, seems this could be appropriate as PartiallySignedTransaction::UpdateOutput

  43. promag commented at 6:01 PM on May 13, 2019: member

    A couple of comments.

  44. laanwj commented at 2:29 PM on May 20, 2019: member

    utACK 26fe9b990995f9cb5eee21d40b4daaad19f7181f (will hold merging until response to promag's comments)

  45. in src/script/sign.h:235 in eaf4f88734 outdated
     231 | @@ -232,4 +232,7 @@ void UpdateInput(CTxIn& input, const SignatureData& data);
     232 |   * Solvability is unrelated to whether we consider this output to be ours. */
     233 |  bool IsSolvable(const SigningProvider& provider, const CScript& script);
     234 |  
     235 | +/** Check whether a scriptPubKey is known to be segwit. */
    


    ariard commented at 9:26 PM on May 20, 2019:

    nit: "native segwit or nested-segwit"?

  46. in src/rpc/rawtransaction.cpp:1508 in 26fe9b9909
    1506 | +                         {"range", RPCArg::Type::RANGE, "1000", "Up to what index HD chains should be explored (either end or [begin,end])"},
    1507 | +                    }},
    1508 | +                }},
    1509 |              },
    1510 |              RPCResult {
    1511 |                  "  \"psbt\"          (string) The base64-encoded partially signed transaction with inputs updated\n"
    


    ariard commented at 9:26 PM on May 20, 2019:

    nit: "with inputs and outputs updated"

  47. ariard commented at 9:36 PM on May 20, 2019: member

    @sipa I'm trying the RPC with the following command:

    bitcoin-cli utxoupdatepsbt 'cHNidP8BAFMCAAAAAYCdwVRx2X3o4KHx5tAMsN1ddp51MbfWsietjfMbl5HtAAAAAAD/////AQDh9QUAAAAAF6kUW+rtEOi4nk9rpw2F5XZl1dd8ehGHAAAAAAAAAA=='  '[{"desc":"sh(wpkh([bd50871a/0h/0h/0h]03895c66337b38699bfafff1084ad35bc347fac4f4e5e5fe5eb7dd81155280db53))"}]'

    With psbt built from createpsbt and a desc from listunspent but got a RPC_TYPE_ERROR Expected type array, got string. Is there somehting really basic I'm missing or a real parsing issue ? (given than descriptors hasn't been added as argNames)

  48. in src/rpc/rawtransaction.cpp:1493 in 26fe9b9909
    1489 | @@ -1490,12 +1490,19 @@ UniValue converttopsbt(const JSONRPCRequest& request)
    1490 |  
    1491 |  UniValue utxoupdatepsbt(const JSONRPCRequest& request)
    1492 |  {
    1493 | -    if (request.fHelp || request.params.size() != 1) {
    1494 | +    if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
    


    promag commented at 8:39 PM on June 2, 2019:

    26fe9b990995f9cb5eee21d40b4daaad19f7181f

    nit, could use the "new" way:

        if (request.fHelp || !help.IsValidNumArgs(request.params.size())) {
            throw std::runtime_error(help.ToString());
        }
    
  49. moneyball commented at 9:45 PM on June 6, 2019: contributor

    It seems like next steps for this PR are for @sipa to respond to @promag and @ariard comments, then probably back to @laanwj for merge consideration.

  50. promag commented at 1:58 PM on June 11, 2019: member

    My comments aren't blocking FWIW.

  51. promag commented at 9:20 PM on June 12, 2019: member

    @sipa my suggestions are in fb3540a87, and rebased here d7a8cf21f.

  52. promag commented at 9:23 PM on June 12, 2019: member

    ACK 26fe9b9, checked refactors and tests look comprehensive. Still missing a release note but can be added later.

  53. fanquake added the label Waiting for author on Jun 25, 2019
  54. laanwj removed the label Waiting for author on Jul 2, 2019
  55. laanwj merged this on Jul 2, 2019
  56. laanwj closed this on Jul 2, 2019

  57. laanwj commented at 2:54 PM on July 2, 2019: member

    Going to merge this, I think the comments are minor enough to be addressable afterward and don't really need to block the merge.

  58. laanwj referenced this in commit 2f717fb5cd on Jul 2, 2019
  59. jnewbery commented at 4:57 PM on July 2, 2019: member

    It's a shame that this got merged without a bunch of review comments being addressed. It seems to me that this: #15427#pullrequestreview-239730895 is a bug, and that the new functionality won't work with bitcoin-cli or using named arguments.

  60. jnewbery commented at 5:45 PM on July 2, 2019: member

    Fixed here: #16326

  61. MarcoFalke commented at 8:37 PM on July 2, 2019: member

    This had 3 ACKs. master is always expected to have bugs and if they are trivially fixed in a follow-up, why not?

  62. sidhujag referenced this in commit 6b86135a05 on Jul 3, 2019
  63. laanwj removed this from the "Blockers" column in a project

  64. fanquake added the label Needs release note on Jul 4, 2019
  65. fanquake removed the label Needs release note on Jul 5, 2019
  66. fanquake commented at 2:03 AM on July 5, 2019: member

    Release notes for this are being added as part of #16326.

  67. jnewbery commented at 9:45 AM on July 5, 2019: member

    This had 3 ACKs. master is always expected to have bugs and if they are trivially fixed in a follow-up, why not?

    Because comments should at least be acknowledged by the author, even if that's just to say "This can be addressed in a follow-up PR".

  68. vansergen referenced this in commit 0bf3e38d34 on Mar 26, 2020
  69. deadalnix referenced this in commit c8309573b9 on Jun 23, 2020
  70. deadalnix referenced this in commit 3264546a77 on Jun 23, 2020
  71. deadalnix referenced this in commit 4bfb19a4c3 on Jun 23, 2020
  72. DrahtBot locked this on Dec 16, 2021

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-04-30 12:15 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me