[Qt] RPC-Console: support nested commands and simple value queries#7783
Conversation
|
Isn't this going a bit overboard for debugging tools? (OTOH, it's only about 150 LOC...) |
|
I think this is useful. An alternative proposed was to use variables |
It is a "luxury extension", right. But given the time some of us have spent in the console repeating and copy-pasting commands out- and input, I think it worth taking this in. IMO we should also extend bitcoin-cli to support nested commands. It simply increases productivity with that tool. |
|
I like this concept. I initially had @luke-jr 's concern as well. But only a bit of code added, and it's well-contained. It's not just luxury: it's useful for cases like #7599 where someone wants to insert the output of a previous command into a new one, but it's too long for copy pasting.
Not sure there. For the GUI debug console, which is essentially it's own I'm all for a fancy ncurses-based interactive client, but that should not be |
|
On the other hand, many advices read 'Run getsomething' and so. This will bring another "fork" - you have to also add that you have to run this in Debug console or via Concept ACK (I'd also like to see this in |
|
Almost tempting to make it server-side, if we're using long output-inputs... but this seems fine (Concept ACK) as-is; further improvement can wait for another PR. |
|
Would it be possible to abstract out this functionality in a separate commit (including the existing RPC parsing logic from the Qt console) and move it to rpc/server.cpp, as an actual RPC call that just takes a string argument with a command to parse? That would make it both more usable (by exposing it as RPC, bitcoin-cli and other tools can use it too), and more testable (we can have RPC tests for it), without complicating the change much. |
|
I have though about that but I wasn't sure if we should delegate the parsing/executing of nested command to the server. This PR would do the parsing "client side". We could also factor out the parsing and use it client-side (Qt / bitcoin-cli). But I agree, it could be useful server-side. |
|
Yes, I agree having it client side is useful. My main reason for suggesting abstracting it out it because I don't think it's very hard, and would make the parsing logic much easier to test. |
|
This would save a hell lot of time and copy/pasting |
7018480 to
b5ba8fb
Compare
This could now be simply extended to the RPC server, although, nested commands could be resource and time hungry. |
src/test/rpc_tests.cpp
Outdated
There was a problem hiding this comment.
There is no whitespace at the end?
f05f9fd to
05a958e
Compare
|
Fixed nits. Had to add |
Sorry to be contrary, but IMO, functionality related to parsing and not dispatching should be in (another reason that it doesn't belong server-side is that it doesn't act on univalue/JSON objects, but on command line strings. Wouldn't want string parsing on the server side, as this makes the JSON-RPC API unclear, and introduces potential vulnerabilities and DoS possibilities etc) |
src/Makefile.am
Outdated
There was a problem hiding this comment.
client.cpp is part of libbitcoin_cli, which is "cli: shared between bitcoin-cli and bitcoin-qt" if you need access to that then link that library. Don't include the compilation unit in two libraries.
|
Having it in |
|
Server-side nested commands are not part of the JSON-RPC standard. It is an interesting thought but that would be a completely different proposal, and I don't think it would share any code with this. I'd imagine it would work something akin to batching (but w/ nested structures), not by parsing/formatting expression strings. Seeing how little even simple batching is used, I'm also not sure there is enough demand for that kind of advanced behavior, but that aside. Edit: Looked it up a bit, 'nested remote function call' in RPC protocols is commonly implemented in the form of 'promise pipelining', a strategy to reduce round-trips. A call can return a handle, which is essentially a temporary variable, which can be passed as argument to other calls before the result is known. This allows more versatile manipulation than just nesting (e.g. a DAG instead of a tree). In any case this is something to be found in the more advanced RPC frameworks, I couldn't find anyone having bolted it into JSON-RPC. As said, an issue for another time :) Edit.2: Had a try at a proposal here: #8457 (comment) |
|
Agreed with keeping parsing client-side. Let's not tangle up the dependencies. I really like this idea btw. |
05a958e to
7a38506
Compare
|
Removed all changes from the core classes. |
|
qt-test fail on travis, apparently. |
5f0e019 to
04a9485
Compare
Commands can be executed with bracket syntax, example: `getwalletinfo()`. Commands can be nested, example: `sendtoaddress(getnewaddress(), 10)`. Simple queries are possible: `listunspent()[0][txid]` Object values are accessed with a non-quoted string, example: [txid]. Fully backward compatible. `generate 101` is identical to `generate(101)` Result value queries indicated with `[]` require the new brackets syntax. Comma as argument separator is now also possible: `sendtoaddress,<address>,<amount>` Space as argument separator works also with the bracket syntax, example: `sendtoaddress(getnewaddress() 10) No dept limitation, complex commands are possible: `decoderawtransaction(getrawtransaction(getblock(getbestblockhash())[tx][0]))[vout][0][value]` Github-Pull: bitcoin#7783 Rebased-From: 1586044
c3055bb Add help-console command to Qt debug console (Luke Mlsna) Pull request description: This PR would close issue #9195 by adding documentation for the debug console features (mainly nested commands) which were added in [PR #7783](#7783). The following changes were made to QT debug console code: - Added a line to the initial message text at the top of the debug console: > For more information on using this console type **help-console**. - Added a pseudo-command `help-console` which is hooked after parsing the request, but before actually executing the RPC thread. It prints the following text to the console as if it were a valid RPC response. > This console accepts RPC commands using the standard syntax. > example: getblockhash 8 > This console can also accept RPC commands using bracketed syntax. > example: getblockhash(8) > A space or a comma can be used to separate arguments for either syntax. > example: sendtoaddress \<address\> \<amount\> > sendtoaddress,\<address\>,\<amount\> > Commands may be nested when specified with the bracketed syntax. > example: getblockinfo(getblockhash(0),true). > Result values can be queried with a non-quoted string in brackets. > example: getblock(getblockhash(0) true)[height] This seemed like a reasonably sane way to introduce a fake RPC help command, but Tree-SHA512: 35d73dcef9c4936b8be99e80978169f117c22b94f4400c91097bf7e0e1489060202dcd738d9debdf4c8a7bd10709e2c19d4f625f19e47c4a034f1d6019c0e0f2
…ple value queries 1586044 [Qt] RPC-Console: support nested commands and simple value queries (Jonas Schnelli)
…ple value queries 1586044 [Qt] RPC-Console: support nested commands and simple value queries (Jonas Schnelli)
f466c4c Add missing ECC_Stop(); in GUI rpcnestedtests.cpp (Jonas Schnelli) Pull request description: Fixes #16288 Was probably missing in #7783 ACKs for top commit: Sjors: ACK f466c4c. Tested by comparing `make check` on master and this PR with macOS 10.14.5. I also tried with and without `--enable-debug` / `--without-gui`. fanquake: ACK f466c4c. Tested running `make check` on macOS. Tree-SHA512: 648e10c2e35bd01fb92e63709169a6c185ac4b62c69af0109d2cd2d7db47e56ae804c788f9a1a1845746f818764799732f9e58e9dbfca3bffeea8f14683c8c7f
…ation c3055bb Add help-console command to Qt debug console (Luke Mlsna) Pull request description: This PR would close issue bitcoin#9195 by adding documentation for the debug console features (mainly nested commands) which were added in [PR bitcoin#7783](bitcoin#7783). The following changes were made to QT debug console code: - Added a line to the initial message text at the top of the debug console: > For more information on using this console type **help-console**. - Added a pseudo-command `help-console` which is hooked after parsing the request, but before actually executing the RPC thread. It prints the following text to the console as if it were a valid RPC response. > This console accepts RPC commands using the standard syntax. > example: getblockhash 8 > This console can also accept RPC commands using bracketed syntax. > example: getblockhash(8) > A space or a comma can be used to separate arguments for either syntax. > example: sendtoaddress \<address\> \<amount\> > sendtoaddress,\<address\>,\<amount\> > Commands may be nested when specified with the bracketed syntax. > example: getblockinfo(getblockhash(0),true). > Result values can be queried with a non-quoted string in brackets. > example: getblock(getblockhash(0) true)[height] This seemed like a reasonably sane way to introduce a fake RPC help command, but Tree-SHA512: 35d73dcef9c4936b8be99e80978169f117c22b94f4400c91097bf7e0e1489060202dcd738d9debdf4c8a7bd10709e2c19d4f625f19e47c4a034f1d6019c0e0f2
…ue queries 4fc2594 Build: Remove no-longer-needed Moc conflict workaround (Fuzzbawls) d763267 [Refactoring] Remove RPCExecutor code duplication between the 2 consoles (random-zebra) d4a9474 [Qt] RPC-Console: support nested commands and simple value queries (Jonas Schnelli) Pull request description: Backports a pretty cool feature for the GUI rpc-console from bitcoin#7783, which makes testing much faster, removing the need for copying/pasting the outputs of the commands. > Commands can be executed with bracket syntax, example: `getwalletinfo()`. > Commands can be nested, example: `sendtoaddress(getnewaddress(), 10)`. > Simple queries are possible: `listunspent()[0][txid]` > Object values are accessed with a non-quoted string, example: [txid]. > > Fully backward compatible. `generate 101` is identical to `generate(101)` > Result value queries indicated with `[]` require the new brackets syntax. > Comma as argument separator is now also possible: `sendtoaddress,<address>,<amount>` > Space as argument separator works also with the bracket syntax, example: `sendtoaddress(getnewaddress() 10) > > No dept limitation, complex commands are possible: > `decoderawtransaction(getrawtransaction(getblock(getbestblockhash())[tx][0]))[vout][0][value]` <br> <img src="proxy.php?url=https://user-images.githubusercontent.com/18186894/113241705-8304e400-92af-11eb-9624-87921bb13f0a.png"> ACKs for top commit: Fuzzbawls: ACK 4fc2594 furszy: ACK 4fc2594 Tree-SHA512: 94258fec0b0100a728ded06690b6fd456a0cf5756ef68a5cb1eb73c96abf9b268d350058469c85cd5614ee1f3fa114218d362cb8f346a626fa4a3082424f81c6
c3055bb Add help-console command to Qt debug console (Luke Mlsna) Pull request description: This PR would close issue #9195 by adding documentation for the debug console features (mainly nested commands) which were added in [PR #7783](bitcoin/bitcoin#7783). The following changes were made to QT debug console code: - Added a line to the initial message text at the top of the debug console: > For more information on using this console type **help-console**. - Added a pseudo-command `help-console` which is hooked after parsing the request, but before actually executing the RPC thread. It prints the following text to the console as if it were a valid RPC response. > This console accepts RPC commands using the standard syntax. > example: getblockhash 8 > This console can also accept RPC commands using bracketed syntax. > example: getblockhash(8) > A space or a comma can be used to separate arguments for either syntax. > example: sendtoaddress \<address\> \<amount\> > sendtoaddress,\<address\>,\<amount\> > Commands may be nested when specified with the bracketed syntax. > example: getblockinfo(getblockhash(0),true). > Result values can be queried with a non-quoted string in brackets. > example: getblock(getblockhash(0) true)[height] This seemed like a reasonably sane way to introduce a fake RPC help command, but Tree-SHA512: 35d73dcef9c4936b8be99e80978169f117c22b94f4400c91097bf7e0e1489060202dcd738d9debdf4c8a7bd10709e2c19d4f625f19e47c4a034f1d6019c0e0f2
…ts.cpp f466c4c Add missing ECC_Stop(); in GUI rpcnestedtests.cpp (Jonas Schnelli) Pull request description: Fixes bitcoin#16288 Was probably missing in bitcoin#7783 ACKs for top commit: Sjors: ACK f466c4c. Tested by comparing `make check` on master and this PR with macOS 10.14.5. I also tried with and without `--enable-debug` / `--without-gui`. fanquake: ACK f466c4c. Tested running `make check` on macOS. Tree-SHA512: 648e10c2e35bd01fb92e63709169a6c185ac4b62c69af0109d2cd2d7db47e56ae804c788f9a1a1845746f818764799732f9e58e9dbfca3bffeea8f14683c8c7f
…ation c3055bb Add help-console command to Qt debug console (Luke Mlsna) Pull request description: This PR would close issue bitcoin#9195 by adding documentation for the debug console features (mainly nested commands) which were added in [PR bitcoin#7783](bitcoin#7783). The following changes were made to QT debug console code: - Added a line to the initial message text at the top of the debug console: > For more information on using this console type **help-console**. - Added a pseudo-command `help-console` which is hooked after parsing the request, but before actually executing the RPC thread. It prints the following text to the console as if it were a valid RPC response. > This console accepts RPC commands using the standard syntax. > example: getblockhash 8 > This console can also accept RPC commands using bracketed syntax. > example: getblockhash(8) > A space or a comma can be used to separate arguments for either syntax. > example: sendtoaddress \<address\> \<amount\> > sendtoaddress,\<address\>,\<amount\> > Commands may be nested when specified with the bracketed syntax. > example: getblockinfo(getblockhash(0),true). > Result values can be queried with a non-quoted string in brackets. > example: getblock(getblockhash(0) true)[height] This seemed like a reasonably sane way to introduce a fake RPC help command, but Tree-SHA512: 35d73dcef9c4936b8be99e80978169f117c22b94f4400c91097bf7e0e1489060202dcd738d9debdf4c8a7bd10709e2c19d4f625f19e47c4a034f1d6019c0e0f2
this is currently limited to the QT RPC Console, but I'm happy to extend/refactor this to make it useable in bitcoin-cli
Commands can be executed with bracket syntax, example:
getwalletinfo().Commands can be nested, example:
sendtoaddress(getnewaddress(), 10).Simple queries are possible:
listunspent()[0][txid]Object values are accessed with a non-quoted string, example:
[txid].Fully backward compatible.
generate 101is identical togenerate(101)Result value queries indicated with
[]require the new brackets syntax.Comma as argument separator is now also possible:
sendtoaddress,<address>,<amount>Space as argument separator works also with the bracket syntax, example:
sendtoaddress(getnewaddress() 10)No dept limitation, complex commands are possible:
decoderawtransaction(getrawtransaction(getblock(getbestblockhash())[tx][0]))[vout][0][value]