Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
501tr("detecting: peer could be v1 or v2"),502//: Explanatory text for v1 transport type.503tr("v1: unencrypted, plaintext transport protocol"),504//: Explanatory text for v2 transport type.505tr("v2: BIP324 encrypted transport protocol")};506const QString transport_types_list{"<ul><li>" + Join(TRANSPORT_TYPE_DOC, QString("</li><li>")) + "</li></ul>"};507ui->peerTransportTypeLabel->setToolTip(ui->peerTransportTypeLabel->toolTip().arg(transport_types_list));508const QString hb_list{"<ul><li>\""509+ ts.to + "\" – " + tr("we selected the peer for high bandwidth relay") + "</li><li>\""510+ ts.from + "\" – " + tr("the peer selected us for high bandwidth relay") + "</li><li>\""511+ ts.no + "\" – " + tr("no high bandwidth relay selected") + "</li></ul>"};512ui->peerHighBandwidthLabel->setToolTip(ui->peerHighBandwidthLabel->toolTip().arg(hb_list));513ui->dataDir->setToolTip(ui->dataDir->toolTip().arg(QString(nonbreaking_hyphen) + "datadir"));514ui->blocksDir->setToolTip(ui->blocksDir->toolTip().arg(QString(nonbreaking_hyphen) + "blocksdir"));515ui->openDebugLogfileButton->setToolTip(ui->openDebugLogfileButton->toolTip().arg(CLIENT_NAME));517if (platformStyle->getImagesOnButtons()) {518ui->openDebugLogfileButton->setIcon(platformStyle->SingleColorIcon(":/icons/export"));519}520ui->clearButton->setIcon(platformStyle->SingleColorIcon(":/icons/remove"));522ui->fontBiggerButton->setIcon(platformStyle->SingleColorIcon(":/icons/fontbigger"));523//: Main shortcut to increase the RPC console font size.524ui->fontBiggerButton->setShortcut(tr("Ctrl++"));525//: Secondary shortcut to increase the RPC console font size.526GUIUtil::AddButtonShortcut(ui->fontBiggerButton, tr("Ctrl+="));528ui->fontSmallerButton->setIcon(platformStyle->SingleColorIcon(":/icons/fontsmaller"));529//: Main shortcut to decrease the RPC console font size.530ui->fontSmallerButton->setShortcut(tr("Ctrl+-"));531//: Secondary shortcut to decrease the RPC console font size.532GUIUtil::AddButtonShortcut(ui->fontSmallerButton, tr("Ctrl+_"));534ui->promptIcon->setIcon(platformStyle->SingleColorIcon(QStringLiteral(":/icons/prompticon")));536// Install event filter for up and down arrow537ui->lineEdit->installEventFilter(this);538ui->lineEdit->setMaxLength(16_MiB);539ui->messagesWidget->installEventFilter(this);541connect(ui->hidePeersDetailButton, &QAbstractButton::clicked, this, &RPCConsole::clearSelectedNode);542connect(ui->clearButton, &QAbstractButton::clicked, [this] { clear(); });543connect(ui->fontBiggerButton, &QAbstractButton::clicked, this, &RPCConsole::fontBigger);544connect(ui->fontSmallerButton, &QAbstractButton::clicked, this, &RPCConsole::fontSmaller);545connect(ui->btnClearTrafficGraph, &QPushButton::clicked, ui->trafficGraph, &TrafficGraphWidget::clear);547// disable the wallet selector by default548ui->WalletSelector->setVisible(false);549ui->WalletSelectorLabel->setVisible(false);551setTrafficGraphRange(INITIAL_TRAFFIC_GRAPH_MINS);552updateDetailWidget();554consoleFontSize = settings.value(fontSizeSettingsKey, QFont().pointSize()).toInt();555clear();557GUIUtil::handleCloseWindowShortcut(this);559updateWindowTitle();560}562RPCConsole::~RPCConsole()563{564QSettings settings;565#ifdef ENABLE_WALLET566if (WalletModel::isWalletEnabled()) {567// RPCConsole widget is a window.568settings.setValue("RPCConsoleWindowGeometry", saveGeometry());569settings.setValue("RPCConsoleWindowPeersTabSplitterSizes", ui->splitter->saveState());570} else571#endif // ENABLE_WALLET572{573// RPCConsole is a child widget.574settings.setValue("RPCConsoleWidgetPeersTabSplitterSizes", ui->splitter->saveState());575}577settings.setValue("PeersTabPeerHeaderState", m_peer_widget_header_state);578settings.setValue("PeersTabBanlistHeaderState", m_banlist_widget_header_state);580delete ui;581}583bool RPCConsole::eventFilter(QObject* obj, QEvent *event)584{585if(event->type() == QEvent::KeyPress) // Special key handling586{587QKeyEvent *keyevt = static_cast<QKeyEvent*>(event);588int key = keyevt->key();589Qt::KeyboardModifiers mod = keyevt->modifiers();590switch(key)591{592case Qt::Key_Up: if(obj == ui->lineEdit) { browseHistory(-1); return true; } break;593case Qt::Key_Down: if(obj == ui->lineEdit) { browseHistory(1); return true; } break;594case Qt::Key_PageUp: /* pass paging keys to messages widget */595case Qt::Key_PageDown:596if (obj == ui->lineEdit) {597QApplication::sendEvent(ui->messagesWidget, keyevt);598return true;599}600break;601case Qt::Key_Return:602case Qt::Key_Enter:603// forward these events to lineEdit604if (obj == autoCompleter->popup()) {605QApplication::sendEvent(ui->lineEdit, keyevt);606autoCompleter->popup()->hide();607return true;608}609break;610default:611// Typing in messages widget brings focus to line edit, and redirects key there612// Exclude most combinations and keys that emit no text, except paste shortcuts613if(obj == ui->messagesWidget && (614(!mod && !keyevt->text().isEmpty() && key != Qt::Key_Tab) ||615((mod & Qt::ControlModifier) && key == Qt::Key_V) ||616((mod & Qt::ShiftModifier) && key == Qt::Key_Insert)))617{618ui->lineEdit->setFocus();619QApplication::sendEvent(ui->lineEdit, keyevt);620return true;621}622}623}624return QWidget::eventFilter(obj, event);625}627void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_t bestblock_date, double verification_progress)628{629clientModel = model;631bool wallet_enabled{false};632#ifdef ENABLE_WALLET633wallet_enabled = WalletModel::isWalletEnabled();634#endif // ENABLE_WALLET635if (model && !wallet_enabled) {636// Show warning, for example if this is a prerelease version637connect(model, &ClientModel::alertsChanged, this, &RPCConsole::updateAlerts);638updateAlerts(model->getStatusBarWarnings());639}641ui->trafficGraph->setClientModel(model);642if (model && clientModel->getPeerTableModel() && clientModel->getBanTableModel()) {643// Keep up to date with client644setNumConnections(model->getNumConnections());645connect(model, &ClientModel::numConnectionsChanged, this, &RPCConsole::setNumConnections);647setNumBlocks(bestblock_height, QDateTime::fromSecsSinceEpoch(bestblock_date), verification_progress, SyncType::BLOCK_SYNC);648connect(model, &ClientModel::numBlocksChanged, this, &RPCConsole::setNumBlocks);650updateNetworkState();651connect(model, &ClientModel::networkActiveChanged, this, &RPCConsole::setNetworkActive);653interfaces::Node& node = clientModel->node();654updateTrafficStats(node.getTotalBytesRecv(), node.getTotalBytesSent());655connect(model, &ClientModel::bytesChanged, this, &RPCConsole::updateTrafficStats);657connect(model, &ClientModel::mempoolSizeChanged, this, &RPCConsole::setMempoolSize);659// set up peer table660ui->peerWidget->setModel(model->peerTableSortProxy());661ui->peerWidget->verticalHeader()->hide();662ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows);663ui->peerWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);664ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu);666if (!ui->peerWidget->horizontalHeader()->restoreState(m_peer_widget_header_state)) {667ui->peerWidget->setColumnWidth(PeerTableModel::Address, ADDRESS_COLUMN_WIDTH);668ui->peerWidget->setColumnWidth(PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH);669ui->peerWidget->setColumnWidth(PeerTableModel::Ping, PING_COLUMN_WIDTH);670}671ui->peerWidget->horizontalHeader()->setSectionResizeMode(PeerTableModel::Age, QHeaderView::ResizeToContents);672ui->peerWidget->horizontalHeader()->setStretchLastSection(true);673ui->peerWidget->setItemDelegateForColumn(PeerTableModel::NetNodeId, new PeerIdViewDelegate(this));675// create peer table context menu676peersTableContextMenu = new QMenu(this);677//: Context menu action to copy the address of a peer.678peersTableContextMenu->addAction(tr("&Copy address"), [this] {679GUIUtil::copyEntryData(ui->peerWidget, PeerTableModel::Address, Qt::DisplayRole);680});681peersTableContextMenu->addSeparator();682peersTableContextMenu->addAction(tr("&Disconnect"), this, &RPCConsole::disconnectSelectedNode);683peersTableContextMenu->addAction(ts.ban_for + " " + tr("1 &hour"), [this] { banSelectedNode(60 * 60); });684peersTableContextMenu->addAction(ts.ban_for + " " + tr("1 d&ay"), [this] { banSelectedNode(60 * 60 * 24); });685peersTableContextMenu->addAction(ts.ban_for + " " + tr("1 &week"), [this] { banSelectedNode(60 * 60 * 24 * 7); });686peersTableContextMenu->addAction(ts.ban_for + " " + tr("1 &year"), [this] { banSelectedNode(60 * 60 * 24 * 365); });687connect(ui->peerWidget, &QTableView::customContextMenuRequested, this, &RPCConsole::showPeersTableContextMenu);689// peer table signal handling - update peer details when selecting new node690connect(ui->peerWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &RPCConsole::updateDetailWidget);691connect(model->getPeerTableModel(), &QAbstractItemModel::dataChanged, [this] { updateDetailWidget(); });693// set up ban table694ui->banlistWidget->setModel(model->getBanTableModel());695ui->banlistWidget->verticalHeader()->hide();696ui->banlistWidget->setSelectionBehavior(QAbstractItemView::SelectRows);697ui->banlistWidget->setSelectionMode(QAbstractItemView::SingleSelection);698ui->banlistWidget->setContextMenuPolicy(Qt::CustomContextMenu);700if (!ui->banlistWidget->horizontalHeader()->restoreState(m_banlist_widget_header_state)) {701ui->banlistWidget->setColumnWidth(BanTableModel::Address, BANSUBNET_COLUMN_WIDTH);702ui->banlistWidget->setColumnWidth(BanTableModel::Bantime, BANTIME_COLUMN_WIDTH);703}704ui->banlistWidget->horizontalHeader()->setSectionResizeMode(BanTableModel::Address, QHeaderView::ResizeToContents);705ui->banlistWidget->horizontalHeader()->setStretchLastSection(true);707// create ban table context menu708banTableContextMenu = new QMenu(this);709/*: Context menu action to copy the IP/Netmask of a banned peer.710IP/Netmask is the combination of a peer's IP address and its Netmask.711For IP address, see: https://en.wikipedia.org/wiki/IP_address. */712banTableContextMenu->addAction(tr("&Copy IP/Netmask"), [this] {713GUIUtil::copyEntryData(ui->banlistWidget, BanTableModel::Address, Qt::DisplayRole);714});715banTableContextMenu->addSeparator();716banTableContextMenu->addAction(tr("&Unban"), this, &RPCConsole::unbanSelectedNode);717connect(ui->banlistWidget, &QTableView::customContextMenuRequested, this, &RPCConsole::showBanTableContextMenu);719// ban table signal handling - clear peer details when clicking a peer in the ban table720connect(ui->banlistWidget, &QTableView::clicked, this, &RPCConsole::clearSelectedNode);721// ban table signal handling - ensure ban table is shown or hidden (if empty)722connect(model->getBanTableModel(), &BanTableModel::layoutChanged, this, &RPCConsole::showOrHideBanTableIfRequired);723showOrHideBanTableIfRequired();725// Provide initial values726ui->clientVersion->setText(model->formatFullVersion());727ui->clientUserAgent->setText(model->formatSubVersion());728ui->dataDir->setText(model->dataDir());729ui->blocksDir->setText(model->blocksDir());730ui->startupTime->setText(model->formatClientStartupTime());731ui->networkName->setText(QString::fromStdString(Params().GetChainTypeString()));733//Setup autocomplete and attach it734QStringList wordList;735std::vector<std::string> commandList = m_node.listRpcCommands();736for (size_t i = 0; i < commandList.size(); ++i)737{738wordList << commandList[i].c_str();739wordList << ("help " + commandList[i]).c_str();740}742wordList << "help-console";743wordList.sort();744autoCompleter = new QCompleter(wordList, this);745autoCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);746// ui->lineEdit is initially disabled because running commands is only747// possible from now on.748ui->lineEdit->setEnabled(true);749ui->lineEdit->setCompleter(autoCompleter);750autoCompleter->popup()->installEventFilter(this);
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.