Browse Source

Bulk transaction injection.

Better error handling.
Modularisation of single transaction injection.
cl-refactor
Gav Wood 10 years ago
parent
commit
9cd46433bd
  1. 8
      alethzero/Main.ui
  2. 26
      alethzero/MainWin.cpp
  3. 1
      alethzero/MainWin.h
  4. 15
      alethzero/plugins/namers/OtherAccounts.cpp
  5. 87
      alethzero/plugins/special/InjectTransactions.cpp
  6. 48
      alethzero/plugins/special/InjectTransactions.h
  7. 95
      alethzero/plugins/special/InjectTransactions.ui

8
alethzero/Main.ui

@ -132,7 +132,7 @@
<x>0</x>
<y>0</y>
<width>1617</width>
<height>22</height>
<height>24</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -188,7 +188,6 @@
<addaction name="paranoia"/>
<addaction name="clearPending"/>
<addaction name="killBlockchain"/>
<addaction name="inject"/>
<addaction name="injectBlock"/>
<addaction name="forceMining"/>
<addaction name="separator"/>
@ -1387,6 +1386,11 @@ font-size: 14pt</string>
<string>Dump &amp;Block State as JSON...</string>
</property>
</action>
<action name="bulkTransactions">
<property name="text">
<string>&amp;Bulk Inject Transactions...</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>

26
alethzero/MainWin.cpp

@ -668,9 +668,10 @@ std::string Main::render(dev::Address const& _a) const
if (p.size() == 9 && p.find_first_not_of("QWERYUOPASDFGHJKLZXCVBNM1234567890") == string::npos)
p = ICAP(p, "XREG").encoded();
else
DEV_IGNORE_EXCEPTIONS(n = ICAP(_a).encoded());
if (n.empty())
n = _a.abridged();
DEV_IGNORE_EXCEPTIONS(n = ICAP(_a).encoded().substr(0, 8));
if (!n.empty())
n += " ";
n += _a.abridged();
return p.empty() ? n : (p + " " + n);
}
@ -1593,25 +1594,6 @@ void Main::on_transactionQueue_currentItemChanged()
ui->pendingInfo->moveCursor(QTextCursor::Start);
}
void Main::on_inject_triggered()
{
QString s = QInputDialog::getText(this, "Inject Transaction", "Enter transaction dump in hex");
try
{
bytes b = fromHex(s.toStdString(), WhenError::Throw);
ethereum()->injectTransaction(b);
}
catch (BadHexCharacter& _e)
{
cwarn << "invalid hex character, transaction rejected";
cwarn << boost::diagnostic_information(_e);
}
catch (...)
{
cwarn << "transaction rejected";
}
}
void Main::on_injectBlock_triggered()
{
QString s = QInputDialog::getText(this, "Inject Block", "Enter block dump in hex");

1
alethzero/MainWin.h

@ -180,7 +180,6 @@ private slots:
void on_paranoia_triggered();
void on_killBlockchain_triggered();
void on_clearPending_triggered();
void on_inject_triggered();
void on_injectBlock_triggered();
void on_forceMining_triggered();
void on_usePrivate_triggered();

15
alethzero/plugins/namers/OtherAccounts.cpp

@ -21,6 +21,7 @@
#include "OtherAccounts.h"
#include <QSettings>
#include <QMessageBox>
#include <libdevcore/Log.h>
#include <libethereum/Client.h>
#include <ui_OtherAccounts.h>
@ -46,13 +47,23 @@ void OtherAccounts::import()
if (d.exec() == QDialog::Accepted)
{
QStringList sl = u.accounts->toPlainText().split("\n");
unsigned line = 1;
for (QString const& s: sl)
{
Address addr = dev::eth::toAddress(s.section(QRegExp("[ \\0\\t]+"), 0, 0).toStdString());
string name = s.section(QRegExp("[ \\0\\t]+"), 1).toStdString();
try
{
Address addr = dev::eth::toAddress(s.section(QRegExp("[ \\0\\t]+"), 0, 0).trimmed().toStdString());
string name = s.section(QRegExp("[ \\0\\t]+"), 1).trimmed().toStdString();
m_toName[addr] = name;
m_toAddress[name] = addr;
}
catch (...)
{
if (QMessageBox::warning(&d, "Invalid Line Format", "Line format or address given on line " + QString::number(line) + " is invalid:\n" + s, QMessageBox::Abort, QMessageBox::Ignore) == QMessageBox::Abort)
break;
}
line++;
}
main()->noteSettingsChanged();
noteKnownChanged();
}

87
alethzero/plugins/special/InjectTransactions.cpp

@ -0,0 +1,87 @@
/*
This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file InjectTransactions.h
* @author Gav Wood <i@gavwood.com>
* @date 2015
*/
#include "InjectTransactions.h"
#include <QMessageBox>
#include <QInputDialog>
#include <libdevcore/Log.h>
#include <libethereum/Client.h>
#include "ui_InjectTransactions.h"
using namespace std;
using namespace dev;
using namespace az;
using namespace eth;
DEV_AZ_NOTE_PLUGIN(InjectTransactions);
InjectTransactions::InjectTransactions(MainFace* _m):
Plugin(_m, "InjectTransactions")
{
connect(addMenuItem("Inject Transaction...", "menuSpecial", true), SIGNAL(triggered()), SLOT(injectOne()));
connect(addMenuItem("Bulk Inject Transactions...", "menuSpecial", false), SIGNAL(triggered()), SLOT(injectBulk()));
}
InjectTransactions::~InjectTransactions()
{
}
void InjectTransactions::injectOne()
{
bool ok;
QString s = QInputDialog::getText(main(), "Inject Transaction", "Enter transaction dump in hex", QLineEdit::Normal, QString(), &ok);
if (ok)
doInject(s);
}
void InjectTransactions::injectBulk()
{
QDialog d;
Ui_InjectTransactions u;
u.setupUi(&d);
d.setWindowTitle("Bulk Inject Transactions");
if (d.exec() == QDialog::Accepted)
for (QString const& s: u.transactions->toPlainText().split("\n"))
doInject(s);
}
void InjectTransactions::doInject(QString _txHex)
{
try
{
bytes b = fromHex(_txHex.toStdString(), WhenError::Throw);
main()->ethereum()->injectTransaction(b);
}
catch (BadHexCharacter& _e)
{
if (QMessageBox::warning(main(), "Invalid Transaction Hex", "Invalid hex character in:\n" + _txHex + "\nTransaction rejected.", QMessageBox::Ignore, QMessageBox::Abort) == QMessageBox::Abort)
return;
}
catch (Exception& _e)
{
if (QMessageBox::warning(main(), "Transaction Rejected", "Invalid transaction; due to" + QString::fromStdString(_e.what()) + "\n" + _txHex + "\nTransaction rejected.", QMessageBox::Ignore, QMessageBox::Abort) == QMessageBox::Abort)
return;
}
catch (...)
{
// Should not happen under normal circumstances.
return;
}
}

48
alethzero/plugins/special/InjectTransactions.h

@ -0,0 +1,48 @@
/*
This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file InjectTransactions.h
* @author Gav Wood <i@gavwood.com>
* @date 2015
*/
#pragma once
#include "MainFace.h"
namespace dev
{
namespace az
{
class InjectTransactions: public QObject, public Plugin
{
Q_OBJECT
public:
InjectTransactions(MainFace* _m);
~InjectTransactions();
private slots:
void injectOne();
void injectBulk();
private:
void doInject(QString _txHex);
};
}
}

95
alethzero/plugins/special/InjectTransactions.ui

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>InjectTransactions</class>
<widget class="QDialog" name="InjectTransactions">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>511</width>
<height>508</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="transactions">
<property name="placeholderText">
<string>Write the transactions you wish to inject here, in hex, one per line.</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="inject">
<property name="text">
<string>&amp;Import</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>inject</sender>
<signal>clicked()</signal>
<receiver>InjectTransactions</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>462</x>
<y>484</y>
</hint>
<hint type="destinationlabel">
<x>449</x>
<y>504</y>
</hint>
</hints>
</connection>
<connection>
<sender>cancel</sender>
<signal>clicked()</signal>
<receiver>InjectTransactions</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>381</x>
<y>483</y>
</hint>
<hint type="destinationlabel">
<x>351</x>
<y>506</y>
</hint>
</hints>
</connection>
</connections>
</ui>
Loading…
Cancel
Save