-
Notifications
You must be signed in to change notification settings - Fork 37.5k
Refactor: separate gui from wallet and node #10244
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
ClientModel and WalletModel were already meant as abstraction layer for accessing the core from the GUI. What is your rationale for adding another layer? |
ClientModel and WalletModel might have been intended to be an abstraction layer, but they are not functioning like one. There are libbitcoin functions and global variables accessed all over Qt code right now. With this change, all of these calls (there are around 200 of them) are stripped out of Qt code and moved into a one file: src/ipc/local/interfaces.cpp. |
I once did a similar thing,.. but stopped at some point and now I know why. I also agree with @laanwj that the clientmodel (node) and the walletmodal (wallet) are originally though to be that layer. What would be the downsides of using the exiting layers (clientmodel / walletmodel) better? |
If you look at the Also, and in more concrete terms, the reason these interfaces live outside the src/qt directory is that with #10102, they need to be accessed not only by |
The general IPC interface makes sense to me. The main problem I see for any type of low latency IPC/RPC is the missing asynchronity. |
Not sure if you saw the comments about this in the other pr starting here: #10102 (comment) These changes are orthogonal to event processing / blocking issues in the UI. If UI blocked before, it will still block after these changes, if UI didn't block before, it won't start blocking now because of these changes. If remote calls are too slow because of socket/serialization overhead, we can process UI events in the background while they are being made. There are many ways to accomplish this, with one possible way described in that comment above. If anything, having calls get funnelled through an IPC framework makes it easier, not harder to add more asynchronicity. |
Also would point out that Node and Wallet interfaces in ipc/interfaces.h were mainly designed with goal of changing existing Qt code as little as possible. They aren't in any way set in stone, and I would expect them to evolve over time. Probably some calls will get consolidated, others will get broken up, calls that currently return big chunks of data will be made streaming, etc. |
Thinking again and discussing this with @sipa / @laanwj, I think we should use the existing client-/walletmodal as node/wallet abstraction (including a possible IPC abstraction). What's missing in the first place are better asynchronous messaging between the GUI and the wallet/node. IMO using a thread with queue for general node/wallet communication (and eventual additional threads for procedures that usually take longer) seems after a low hanging fruit with direct benefits. Using QT slots/signals for all(most?) communication would be required anyways and would be beneficial even without IPC and therefor should be done first. |
Again I think this is (and should be) an independent issue, but if you want to flesh out some more concrete suggestions and I would be happy to hear them.
This is exactly what the change I was suggesting in #10102 (comment) does. |
This was my point too. Making the GUI asynchronous would avoid ever hard-freezing the GUI. Modern operating systems assume that an application has crashed if its GUI thread is unresponsive. This is a priority for improving user experience. For example: Currently, if e.g. a transaction is sent while the cs_main lock is held the entire thing hangs for a moment. Ideally it would display a modal dialog with a status, or progress animation instead. There are similar issues at startup. Sure, this is only partially related to IPC work: When the GUI already would communicate with Qt signals and slots with the core backend (similar to how RPCConsole and RPCThread communicate, for example), it could be mostly oblivious whether this backend exists in-process or communicates over a pipe. Although it's laudable that you're working on this, it looks to me that what you are doing currently is simply replicating what we do now but replacing direct core calls with IPC calls. The drawback is that it calcifies some things that shouldn't have been designed that way in the first place (e.g. into multiple abstraction layers), making it harder to improve later. |
Could you be more concrete about this? I don't see how it is true. Direct calls before are still direct calls now. If we want to follow the RPCConsole / RPCExecutor model in other parts of Qt code, I don't see how any of the changes I've made for IPC make this more difficult. |
I had a look at discussion in IRC (https://botbot.me/freenode/bitcoin-core-dev/msg/84348426/) With respect, what I think you guys are missing on the However, I do see that it is kind of silly to have cases where Qt code calls a Also, if this PR will be too difficult to review because of its size (https://botbot.me/freenode/bitcoin-core-dev/msg/84348447/), I can easily decompose it into smaller PRs that could be gradually merged. It is already broken up into separate commits, and many of the individual commits could be further broken up (right now they try to group together related changes). |
3f77678
to
4c91131
Compare
ca542df
to
78be4d1
Compare
f31ecfc
to
89cad8e
Compare
Change gui code to use gArgs, Params() functions directly instead of going through interfaces::Node. Remotely accessing bitcoin-node ArgsManager from bitcoin-gui works fine in bitcoin#10102, when bitcoin-gui spawns a new bitcoin-node process and controls its startup, but for bitcoin-gui to support -ipcconnect option in bitcoin#19461 and connect to an existing bitcoin-node process, it needs ability to parse arguments itself before connecting out. This change also simplifies bitcoin#10102 a bit, by making the bitcoin-gui -> bitcoin-node startup sequence more similar to the bitcoin-node -> bitcoin-wallet startup sequence where the parent process parses arguments and passes them to the child process instead of the parent process using the child process to parse arguments.
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
…build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0
…windows gitian build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0 -BEGIN VERIFY SCRIPT- git mv src/interface src/interfaces ren() { git grep -l "$1" | xargs sed -i "s,$1,$2,g"; } ren interface/ interfaces/ ren interface:: interfaces:: ren BITCOIN_INTERFACE_ BITCOIN_INTERFACES_ ren "namespace interface" "namespace interfaces" -END VERIFY SCRIPT-
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
…windows gitian build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0 -BEGIN VERIFY SCRIPT- git mv src/interface src/interfaces ren() { git grep -l "$1" | xargs sed -i "s,$1,$2,g"; } ren interface/ interfaces/ ren interface:: interfaces:: ren BITCOIN_INTERFACE_ BITCOIN_INTERFACES_ ren "namespace interface" "namespace interfaces" -END VERIFY SCRIPT-
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
…windows gitian build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0 -BEGIN VERIFY SCRIPT- git mv src/interface src/interfaces ren() { git grep -l "$1" | xargs sed -i "s,$1,$2,g"; } ren interface/ interfaces/ ren interface:: interfaces:: ren BITCOIN_INTERFACE_ BITCOIN_INTERFACES_ ren "namespace interface" "namespace interfaces" -END VERIFY SCRIPT-
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
…windows gitian build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0 -BEGIN VERIFY SCRIPT- git mv src/interface src/interfaces ren() { git grep -l "$1" | xargs sed -i "s,$1,$2,g"; } ren interface/ interfaces/ ren interface:: interfaces:: ren BITCOIN_INTERFACE_ BITCOIN_INTERFACES_ ren "namespace interface" "namespace interfaces" -END VERIFY SCRIPT-
Suggested by John Newbery <john@johnnewbery.com> bitcoin#10244 (comment)
…windows gitian build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0 -BEGIN VERIFY SCRIPT- git mv src/interface src/interfaces ren() { git grep -l "$1" | xargs sed -i "s,$1,$2,g"; } ren interface/ interfaces/ ren interface:: interfaces:: ren BITCOIN_INTERFACE_ BITCOIN_INTERFACES_ ren "namespace interface" "namespace interfaces" -END VERIFY SCRIPT-
…windows gitian build 17780d6 scripted-diff: Avoid `interface` keyword to fix windows gitian build (Russell Yanofsky) Pull request description: Rename `interface` to `interfaces` Build failure reported by ken2812221 in bitcoin#10244 (comment) Tree-SHA512: e02c97c728540f344202c13b036f9f63af23bd25e25ed7a5cfe9e2c2f201a12ff232cc94a93fbe37ef6fb6bf9e036fe62210ba798ecd30de191d09338754a8d0 -BEGIN VERIFY SCRIPT- git mv src/interface src/interfaces ren() { git grep -l "$1" | xargs sed -i "s,$1,$2,g"; } ren interface/ interfaces/ ren interface:: interfaces:: ren BITCOIN_INTERFACE_ BITCOIN_INTERFACES_ ren "namespace interface" "namespace interfaces" -END VERIFY SCRIPT-
backport: bitcoin#10244, bitcoin#18123, bitcoin#12906 + Parts of bitcoin#11403
This is a refactoring PR that does not change behavior in any way. This change:
Node
andWallet
interfaces insrc/interface/
This change allows followup PR #10102 (makes
bitcoin-qt
controlbitcoind
over an IPC socket) to work without any significant updates to Qt code. Additionally:Other notes:
Commits:
ea73b84d2d
Add src/interface/README.md71e0d90876
Remove direct bitcoin calls from qt/bitcoin.cppc0f2756be5
Remove direct bitcoin calls from qt/optionsmodel.cpp3d619e9d36
Remove direct bitcoin calls from qt/bitcoingui.cppc2f672fb19
Remove direct bitcoin calls from qt/utilitydialog.cpp5fba3af21e
Remove direct bitcoin calls from qt/splashscreen.cppfe6f27e6ea
Remove direct bitcoin calls from qt/clientmodel.cppd7c2c95948
Remove direct bitcoin calls from qt/intro.cppe0b66a3b7c
Remove direct bitcoin calls from qt/peertablemodel.cpp3034a462a5
Remove direct bitcoin calls from qt/bantablemodel.cpp582daf6d22
Remove direct bitcoin calls from qt/rpcconsole.cpp90d4640b7e
Remove direct bitcoin calls from qt/optionsdialog.cppa0704a8996
Remove most direct bitcoin calls from qt/walletmodel.cpp827de038ab
Remove direct bitcoin calls from qt/coincontroldialog.cpp3ec2ebcd9b
Remove direct bitcoin calls from qt/addresstablemodel.cpp3cab2ce5f9
Remove direct bitcoin calls from qt/paymentserver.cpp58845587e1
Remove direct bitcoin calls from qt transaction table filese872c93ee8
Remove direct bitcoin access from qt/guiutil.cpp56f33ca349
Remove direct bitcoin calls from qt/sendcoinsdialog.cpp9a61eed1fc
Use WalletBalances struct in Qt9960137697
Add developer notes about blocking GUI code