From 45776a0877d94acabe689249e68a51d56df7cb77 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sun, 15 Feb 2015 13:50:52 +0100 Subject: [PATCH] Removed debug panel. Is this a record, perhaps? --- alethzero/Main.ui | 242 ++++------------------------- alethzero/MainWin.cpp | 346 +----------------------------------------- alethzero/MainWin.h | 119 +++++++-------- 3 files changed, 92 insertions(+), 615 deletions(-) diff --git a/alethzero/Main.ui b/alethzero/Main.ui index 328b4acba..fe475bae9 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -117,7 +117,7 @@ 0 0 1617 - 25 + 24 @@ -140,11 +140,11 @@ - T&ools + &Tools - + @@ -160,11 +160,8 @@ - Deb&ug + &Special - - - @@ -185,42 +182,28 @@ - - - D&ebugger - - - - &Dump Trace - - - - - - - - - - - - - - - &Whisper + + + &Debug + + + + + - - + + @@ -987,171 +970,6 @@ - - - false - - - QDockWidget::DockWidgetFeatureMask - - - Debugger - - - 1 - - - - false - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - - 1 - 0 - - - - Qt::Vertical - - - - - 0 - 0 - - - - QFrame::NoFrame - - - 0 - - - - - - Ubuntu Mono - - - - QFrame::NoFrame - - - 0 - - - - - - - 1 - 0 - - - - Qt::Vertical - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - - QFrame::NoFrame - - - true - - - - - - - - - - 0 - 0 - - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Horizontal - - - - - - QDockWidget::DockWidgetFeatureMask @@ -1776,7 +1594,7 @@ font-size: 14pt true - Use &UPnP + &Use UPnP @@ -1800,7 +1618,7 @@ font-size: 14pt &Mine - + &New Address @@ -1834,7 +1652,7 @@ font-size: 14pt true - Mining &Paranoia + &Mining Paranoia @@ -1862,7 +1680,7 @@ font-size: 14pt true - Show Ancient &Blocks + &Show Ancient Blocks @@ -1870,7 +1688,7 @@ font-size: 14pt true - Show Anonymous &Accounts + Show &Anonymous Accounts @@ -1970,7 +1788,7 @@ font-size: 14pt false - Debu&g Current Transaction + &Debug Current Transaction @@ -1978,7 +1796,7 @@ font-size: 14pt false - D&ump Current Transaction State (post) + Dump &Current Transaction State (post) @@ -1986,7 +1804,7 @@ font-size: 14pt false - D&ump Current Transaction State (pre) + Dump Current &Transaction State (pre) @@ -2007,7 +1825,7 @@ font-size: 14pt true - &Use Private Chain... + Use &Private Chain... @@ -2015,7 +1833,7 @@ font-size: 14pt true - &Enable LLL &Optimizer + &Enable LLL Optimizer @@ -2023,7 +1841,7 @@ font-size: 14pt true - Reserved Debug 1 + &Reserved Debug 1 @@ -2031,7 +1849,7 @@ font-size: 14pt true - Enable Local Addresses + &Enable Local Addresses @@ -2044,7 +1862,7 @@ font-size: 14pt - Go! + &Go! @@ -2054,7 +1872,7 @@ font-size: 14pt - Clear Pe&nd&ing + &Clear Pending @@ -2112,10 +1930,6 @@ font-size: 14pt urlEdit webView nameReg - debugCode - debugStack - debugMemory - debugStorage diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 62bc5e069..f794f6758 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -1514,49 +1514,6 @@ void Main::on_debugDumpStatePre_triggered() on_debugDumpState_triggered(0); } -void Main::populateDebugger(dev::bytesConstRef _r) -{ - bool done = m_currentExecution->setup(_r); - if (!done) - { - debugFinished(); - vector levels; - m_codes.clear(); - bytes lastExtCode; - bytesConstRef lastData; - h256 lastHash; - h256 lastDataHash; - auto onOp = [&](uint64_t steps, Instruction inst, dev::bigint newMemSize, dev::bigint gasCost, VM* voidVM, ExtVMFace const* voidExt) - { - VM& vm = *voidVM; - ExtVM const& ext = *static_cast(voidExt); - if (ext.code != lastExtCode) - { - lastExtCode = ext.code; - lastHash = sha3(lastExtCode); - if (!m_codes.count(lastHash)) - m_codes[lastHash] = ext.code; - } - if (ext.data != lastData) - { - lastData = ext.data; - lastDataHash = sha3(lastData); - if (!m_codes.count(lastDataHash)) - m_codes[lastDataHash] = ext.data.toBytes(); - } - if (levels.size() < ext.depth) - levels.push_back(&m_history.back()); - else - levels.resize(ext.depth); - m_history.append(WorldState({steps, ext.myAddress, vm.curPC(), inst, newMemSize, vm.gas(), lastHash, lastDataHash, vm.stack(), vm.memory(), gasCost, ext.state().storage(ext.myAddress), levels})); - }; - m_currentExecution->go(onOp); - m_currentExecution->finalize(); - initDebugger(); - updateDebugger(); - } -} - void Main::on_contracts_currentItemChanged() { ui->contractInfo->clear(); @@ -1713,7 +1670,6 @@ string const Main::getFunctionHashes(dev::solidity::CompilerStack const &_compil void Main::on_data_textChanged() { - m_pcWarp.clear(); if (isCreation()) { string src = ui->data->toPlainText().toStdString(); @@ -1950,7 +1906,6 @@ void Main::on_send_clicked() for (auto i: m_myKeys) if (ethereum()->balanceAt(i.address(), 0) >= totalReq) { - debugFinished(); Secret s = i.secret(); if (isCreation()) { @@ -1966,8 +1921,7 @@ void Main::on_send_clicked() for (string& s: compiler.getContractNames()) { h256 contractHash = compiler.getContractCodeHash(s); - m_natspecDB.add(contractHash, - compiler.getMetadata(s, dev::solidity::DocumentationType::NatspecUser)); + m_natspecDB.add(contractHash, compiler.getMetadata(s, dev::solidity::DocumentationType::NatspecUser)); } } catch (...) @@ -1996,12 +1950,13 @@ void Main::on_debug_clicked() for (auto i: m_myKeys) if (ethereum()->balanceAt(i.address()) >= totalReq) { + State st(ethereum()->postState()); Secret s = i.secret(); Transaction t = isCreation() ? - Transaction(value(), gasPrice(), ui->gas->value(), m_data, m_executiveState.transactionsFrom(dev::toAddress(s)), s) : - Transaction(value(), gasPrice(), ui->gas->value(), fromString(ui->destination->currentText()), m_data, m_executiveState.transactionsFrom(dev::toAddress(s)), s); + Transaction(value(), gasPrice(), ui->gas->value(), m_data, st.transactionsFrom(dev::toAddress(s)), s) : + Transaction(value(), gasPrice(), ui->gas->value(), fromString(ui->destination->currentText()), m_data, st.transactionsFrom(dev::toAddress(s)), s); Debugger dw(this, this); - Executive e(m_executiveState, ethereum()->blockChain(), 0); + Executive e(st, ethereum()->blockChain(), 0); dw.populate(e, t); dw.exec(); return; @@ -2023,7 +1978,7 @@ bool beginsWith(Address _a, bytes const& _b) return true; } -void Main::on_create_triggered() +void Main::on_newAccount_triggered() { bool ok = true; enum { NoVanity = 0, FirstTwo, FirstTwoNextTwo, FirstThree, FirstFour, StringMatch }; @@ -2091,111 +2046,6 @@ void Main::on_killAccount_triggered() } } -void Main::on_debugStep_triggered() -{ - if (ui->debugTimeline->value() < m_history.size()) { - auto l = m_history[ui->debugTimeline->value()].levels.size(); - if ((ui->debugTimeline->value() + 1) < m_history.size() && m_history[ui->debugTimeline->value() + 1].levels.size() > l) - { - on_debugStepInto_triggered(); - if (m_history[ui->debugTimeline->value()].levels.size() > l) - on_debugStepOut_triggered(); - } - else - on_debugStepInto_triggered(); - } -} - -void Main::on_debugStepInto_triggered() -{ - ui->debugTimeline->setValue(ui->debugTimeline->value() + 1); - ui->callStack->setCurrentRow(0); -} - -void Main::on_debugStepOut_triggered() -{ - if (ui->debugTimeline->value() < m_history.size()) - { - auto ls = m_history[ui->debugTimeline->value()].levels.size(); - auto l = ui->debugTimeline->value(); - for (; l < m_history.size() && m_history[l].levels.size() >= ls; ++l) {} - ui->debugTimeline->setValue(l); - ui->callStack->setCurrentRow(0); - } -} - -void Main::on_debugStepBackInto_triggered() -{ - ui->debugTimeline->setValue(ui->debugTimeline->value() - 1); - ui->callStack->setCurrentRow(0); -} - -void Main::on_debugStepBack_triggered() -{ - auto l = m_history[ui->debugTimeline->value()].levels.size(); - if (ui->debugTimeline->value() > 0 && m_history[ui->debugTimeline->value() - 1].levels.size() > l) - { - on_debugStepBackInto_triggered(); - if (m_history[ui->debugTimeline->value()].levels.size() > l) - on_debugStepBackOut_triggered(); - } - else - on_debugStepBackInto_triggered(); -} - -void Main::on_debugStepBackOut_triggered() -{ - if (ui->debugTimeline->value() > 0 && m_history.size() > 0) - { - auto ls = m_history[min(ui->debugTimeline->value(), m_history.size() - 1)].levels.size(); - int l = ui->debugTimeline->value(); - for (; l > 0 && m_history[l].levels.size() >= ls; --l) {} - ui->debugTimeline->setValue(l); - ui->callStack->setCurrentRow(0); - } -} - -void Main::on_dumpTrace_triggered() -{ - QString fn = QFileDialog::getSaveFileName(this, "Select file to output EVM trace"); - ofstream f(fn.toStdString()); - if (f.is_open()) - for (WorldState const& ws: m_history) - f << ws.cur << " " << hex << toHex(dev::toCompactBigEndian(ws.curPC, 1)) << " " << hex << toHex(dev::toCompactBigEndian((int)(byte)ws.inst, 1)) << " " << hex << toHex(dev::toCompactBigEndian((uint64_t)ws.gas, 1)) << endl; -} - -void Main::on_dumpTracePretty_triggered() -{ - QString fn = QFileDialog::getSaveFileName(this, "Select file to output EVM trace"); - ofstream f(fn.toStdString()); - if (f.is_open()) - for (WorldState const& ws: m_history) - { - f << endl << " STACK" << endl; - for (auto i: ws.stack) - f << (h256)i << endl; - f << " MEMORY" << endl << dev::memDump(ws.memory); - f << " STORAGE" << endl; - for (auto const& i: ws.storage) - f << showbase << hex << i.first << ": " << i.second << endl; - f << dec << ws.levels.size() << " | " << ws.cur << " | #" << ws.steps << " | " << hex << setw(4) << setfill('0') << ws.curPC << " : " << instructionInfo(ws.inst).name << " | " << dec << ws.gas << " | -" << dec << ws.gasCost << " | " << ws.newMemSize << "x32"; - } -} - -void Main::on_dumpTraceStorage_triggered() -{ - QString fn = QFileDialog::getSaveFileName(this, "Select file to output EVM trace"); - ofstream f(fn.toStdString()); - if (f.is_open()) - for (WorldState const& ws: m_history) - { - if (ws.inst == Instruction::STOP || ws.inst == Instruction::RETURN || ws.inst == Instruction::SUICIDE) - for (auto i: ws.storage) - f << toHex(dev::toCompactBigEndian(i.first, 1)) << " " << toHex(dev::toCompactBigEndian(i.second, 1)) << endl; - f << ws.cur << " " << hex << toHex(dev::toCompactBigEndian(ws.curPC, 1)) << " " << hex << toHex(dev::toCompactBigEndian((int)(byte)ws.inst, 1)) << " " << hex << toHex(dev::toCompactBigEndian((uint64_t)ws.gas, 1)) << endl; - } -} - void Main::on_go_triggered() { if (!ui->net->isChecked()) @@ -2206,60 +2056,6 @@ void Main::on_go_triggered() web3()->connect(Host::pocHost()); } -void Main::on_callStack_currentItemChanged() -{ - updateDebugger(); -} - -void Main::alterDebugStateGroup(bool _enable) const -{ - ui->debugStep->setEnabled(_enable); - ui->debugStepInto->setEnabled(_enable); - ui->debugStepOut->setEnabled(_enable); - ui->debugStepBackInto->setEnabled(_enable); - ui->debugStepBackOut->setEnabled(_enable); - ui->dumpTrace->setEnabled(_enable); - ui->dumpTraceStorage->setEnabled(_enable); - ui->dumpTracePretty->setEnabled(_enable); - ui->debugStepBack->setEnabled(_enable); - ui->debugPanel->setEnabled(_enable); -} - -void Main::debugFinished() -{ - m_codes.clear(); - m_pcWarp.clear(); - m_history.clear(); - m_lastLevels.clear(); - m_lastCode = h256(); - ui->callStack->clear(); - ui->debugCode->clear(); - ui->debugStack->clear(); - ui->debugMemory->setHtml(""); - ui->debugStorage->setHtml(""); - ui->debugStateInfo->setText(""); - alterDebugStateGroup(false); -// ui->send->setEnabled(true); -} - -void Main::initDebugger() -{ -// ui->send->setEnabled(false); - if (m_history.size()) - { - alterDebugStateGroup(true); - ui->debugCode->setEnabled(false); - ui->debugTimeline->setMinimum(0); - ui->debugTimeline->setMaximum(m_history.size()); - ui->debugTimeline->setValue(0); - } -} - -void Main::on_debugTimeline_valueChanged() -{ - updateDebugger(); -} - QString Main::prettyU256(dev::u256 _n) const { unsigned inc = 0; @@ -2287,136 +2083,6 @@ QString Main::prettyU256(dev::u256 _n) const return QString::fromStdString(s.str()); } -void Main::updateDebugger() -{ - if (m_history.size()) - { - WorldState const& nws = m_history[min((int)m_history.size() - 1, ui->debugTimeline->value())]; - WorldState const& ws = ui->callStack->currentRow() > 0 ? *nws.levels[nws.levels.size() - ui->callStack->currentRow()] : nws; - - if (ui->debugTimeline->value() >= m_history.size()) - { - if (ws.gasCost > ws.gas) - ui->debugMemory->setHtml("

OUT-OF-GAS

"); - else if (ws.inst == Instruction::RETURN && ws.stack.size() >= 2) - { - unsigned from = (unsigned)ws.stack.back(); - unsigned size = (unsigned)ws.stack[ws.stack.size() - 2]; - unsigned o = 0; - bytes out(size, 0); - for (; o < size && from + o < ws.memory.size(); ++o) - out[o] = ws.memory[from + o]; - ui->debugMemory->setHtml("

RETURN

" + QString::fromStdString(dev::memDump(out, 16, true))); - } - else if (ws.inst == Instruction::STOP) - ui->debugMemory->setHtml("

STOP

"); - else if (ws.inst == Instruction::SUICIDE && ws.stack.size() >= 1) - ui->debugMemory->setHtml("

SUICIDE

0x" + QString::fromStdString(toString(right160(ws.stack.back())))); - else - ui->debugMemory->setHtml("

EXCEPTION

"); - - ostringstream ss; - ss << dec << "EXIT | GAS: " << dec << max(0, (dev::bigint)ws.gas - ws.gasCost); - ui->debugStateInfo->setText(QString::fromStdString(ss.str())); - ui->debugStorage->setHtml(""); - ui->debugCallData->setHtml(""); - m_lastData = h256(); - ui->callStack->clear(); - m_lastLevels.clear(); - ui->debugCode->clear(); - m_lastCode = h256(); - ui->debugStack->setHtml(""); - } - else - { - if (m_lastLevels != nws.levels || !ui->callStack->count()) - { - m_lastLevels = nws.levels; - ui->callStack->clear(); - for (unsigned i = 0; i <= nws.levels.size(); ++i) - { - WorldState const& s = i ? *nws.levels[nws.levels.size() - i] : nws; - ostringstream out; - out << s.cur.abridged(); - if (i) - out << " " << instructionInfo(s.inst).name << " @0x" << hex << s.curPC; - ui->callStack->addItem(QString::fromStdString(out.str())); - } - } - - if (ws.code != m_lastCode) - { - bytes const& code = m_codes[ws.code]; - QListWidget* dc = ui->debugCode; - dc->clear(); - m_pcWarp.clear(); - for (unsigned i = 0; i <= code.size(); ++i) - { - byte b = i < code.size() ? code[i] : 0; - try - { - QString s = QString::fromStdString(instructionInfo((Instruction)b).name); - ostringstream out; - out << hex << setw(4) << setfill('0') << i; - m_pcWarp[i] = dc->count(); - if (b >= (byte)Instruction::PUSH1 && b <= (byte)Instruction::PUSH32) - { - unsigned bc = b - (byte)Instruction::PUSH1 + 1; - s = "PUSH 0x" + QString::fromStdString(toHex(bytesConstRef(&code[i + 1], bc))); - i += bc; - } - dc->addItem(QString::fromStdString(out.str()) + " " + s); - } - catch (...) - { - cerr << "Unhandled exception!" << endl << - boost::current_exception_diagnostic_information(); - break; // probably hit data segment - } - } - m_lastCode = ws.code; - } - - if (ws.callData != m_lastData) - { - m_lastData = ws.callData; - if (ws.callData) - { - assert(m_codes.count(ws.callData)); - ui->debugCallData->setHtml(QString::fromStdString(dev::memDump(m_codes[ws.callData], 16, true))); - } - else - ui->debugCallData->setHtml(""); - } - - QString stack; - for (auto i: ws.stack) - stack.prepend("
" + prettyU256(i) + "
"); - ui->debugStack->setHtml(stack); - ui->debugMemory->setHtml(QString::fromStdString(dev::memDump(ws.memory, 16, true))); - assert(m_codes.count(ws.code)); - - if (m_codes[ws.code].size() >= (unsigned)ws.curPC) - { - int l = m_pcWarp[(unsigned)ws.curPC]; - ui->debugCode->setCurrentRow(max(0, l - 5)); - ui->debugCode->setCurrentRow(min(ui->debugCode->count() - 1, l + 5)); - ui->debugCode->setCurrentRow(l); - } - else - cwarn << "PC (" << (unsigned)ws.curPC << ") is after code range (" << m_codes[ws.code].size() << ")"; - - ostringstream ss; - ss << dec << "STEP: " << ws.steps << " | PC: 0x" << hex << ws.curPC << " : " << instructionInfo(ws.inst).name << " | ADDMEM: " << dec << ws.newMemSize << " words | COST: " << dec << ws.gasCost << " | GAS: " << dec << ws.gas; - ui->debugStateInfo->setText(QString::fromStdString(ss.str())); - stringstream s; - for (auto const& i: ws.storage) - s << "@" << prettyU256(i.first).toStdString() << "    " << prettyU256(i.second).toStdString() << "
"; - ui->debugStorage->setHtml(QString::fromStdString(s.str())); - } - } -} - void Main::on_post_clicked() { shh::Message m; diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index fa451b63f..d503a16dd 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -99,71 +99,85 @@ public slots: private slots: void eval(QString const& _js); - void on_connect_triggered(); - void on_mine_triggered(); - void on_send_clicked(); - void on_create_triggered(); - void on_killAccount_triggered(); + // Application + void on_about_triggered(); + void on_quit_triggered() { close(); } + + // Network + void on_go_triggered(); void on_net_triggered(); - void on_verbosity_valueChanged(); - void on_ourAccounts_doubleClicked(); - void ourAccountsRowsMoved(); - void on_accounts_doubleClicked(); - void on_destination_currentTextChanged(); - void on_data_textChanged(); + void on_connect_triggered(); void on_idealPeers_valueChanged(); + + // Mining + void on_mine_triggered(); + + // View + void on_refresh_triggered(); + void on_showAll_triggered() { refreshBlockChain(); } + void on_showAllAccounts_triggered() { refreshAccounts(); } + void on_preview_triggered(); + + // Transacting void on_value_valueChanged() { updateFee(); } void on_gas_valueChanged() { updateFee(); } void on_valueUnits_currentIndexChanged() { updateFee(); } void on_gasPriceUnits_currentIndexChanged() { updateFee(); } void on_gasPrice_valueChanged() { updateFee(); } - void on_log_doubleClicked(); - void on_blocks_currentItemChanged(); + void on_destination_currentTextChanged(); + void on_data_textChanged(); + void on_send_clicked(); + void on_debug_clicked(); + + // Account management + void on_newAccount_triggered(); + void on_killAccount_triggered(); + void on_importKey_triggered(); + void on_importKeyFile_triggered(); + void on_exportKey_triggered(); + + // Tools + void on_loadJS_triggered(); + + // Stuff concerning the blocks/transactions/accounts panels + void ourAccountsRowsMoved(); + void on_ourAccounts_doubleClicked(); + void on_accounts_doubleClicked(); void on_contracts_doubleClicked(); void on_contracts_currentItemChanged(); void on_transactionQueue_currentItemChanged(); - void on_about_triggered(); - void on_paranoia_triggered(); - void on_nameReg_textChanged(); - void on_preview_triggered(); - void on_quit_triggered() { close(); } + void on_blockChainFilter_textChanged(); + void on_blocks_currentItemChanged(); + + // Logging + void on_log_doubleClicked(); + void on_verbosity_valueChanged(); + + // Misc void on_urlEdit_returnPressed(); - void on_debugStep_triggered(); - void on_debugStepBack_triggered(); - void on_debug_clicked(); - void on_debugTimeline_valueChanged(); void on_jsInput_returnPressed(); + void on_nameReg_textChanged(); + + // Special (debug) stuff + void on_paranoia_triggered(); void on_killBlockchain_triggered(); void on_clearPending_triggered(); - void on_importKey_triggered(); - void on_exportKey_triggered(); void on_inject_triggered(); - void on_showAll_triggered() { refreshBlockChain(); } - void on_showAllAccounts_triggered() { refreshAccounts(); } - void on_loadJS_triggered(); - void on_blockChainFilter_textChanged(); void on_forceMining_triggered(); - void on_dumpTrace_triggered(); - void on_dumpTraceStorage_triggered(); - void on_dumpTracePretty_triggered(); - void on_debugStepInto_triggered(); - void on_debugStepOut_triggered(); - void on_debugStepBackOut_triggered(); - void on_debugStepBackInto_triggered(); - void on_callStack_currentItemChanged(); - void on_debugCurrent_triggered(); - void on_debugDumpState_triggered(int _add = 1); - void on_debugDumpStatePre_triggered(); - void on_refresh_triggered(); void on_usePrivate_triggered(); void on_enableOptimizer_triggered(); void on_turboMining_triggered(); - void on_go_triggered(); - void on_importKeyFile_triggered(); - void on_post_clicked(); - void on_newIdentity_triggered(); void on_jitvm_triggered(); + // Debugger + void on_debugCurrent_triggered(); + void on_debugDumpState_triggered(int _add = 1); + void on_debugDumpStatePre_triggered(); + + // Whisper + void on_newIdentity_triggered(); + void on_post_clicked(); + void refreshWhisper(); void refreshBlockChain(); void addNewId(QString _ids); @@ -178,13 +192,6 @@ private: dev::Address getNameReg() const; dev::Address getCurrencies() const; - void populateDebugger(dev::bytesConstRef r); - void initDebugger(); - void updateDebugger(); - void debugFinished(); - - void alterDebugStateGroup(bool _enable) const; - void updateFee(); void readSettings(bool _skipGeometry = false); void writeSettings(); @@ -249,16 +256,6 @@ private: unsigned m_backupGas; - dev::eth::State m_executiveState; - std::unique_ptr m_currentExecution; - dev::h256 m_lastCode; - dev::h256 m_lastData; - std::vector m_lastLevels; - - QMap m_pcWarp; - QList m_history; - std::map m_codes; // and pcWarps - bool m_enableOptimizer = true; QNetworkAccessManager m_webCtrl;