Browse Source

Validation queuing.

cl-refactor
Gav Wood 10 years ago
parent
commit
1f0791b4bc
  1. 1
      alethzero/MainWin.cpp
  2. 59
      alethzero/OurWebThreeStubServer.cpp
  3. 20
      alethzero/OurWebThreeStubServer.h
  4. 34
      libweb3jsonrpc/WebThreeStubServerBase.cpp
  5. 2
      libweb3jsonrpc/WebThreeStubServerBase.h

1
alethzero/MainWin.cpp

@ -1167,6 +1167,7 @@ void Main::timerEvent(QTimerEvent*)
interval = 0; interval = 0;
refreshNetwork(); refreshNetwork();
refreshWhispers(); refreshWhispers();
poll();
} }
else else
interval += 100; interval += 100;

59
alethzero/OurWebThreeStubServer.cpp

@ -33,9 +33,11 @@ using namespace dev;
using namespace dev::eth; using namespace dev::eth;
OurWebThreeStubServer::OurWebThreeStubServer(jsonrpc::AbstractServerConnector& _conn, WebThreeDirect& _web3, OurWebThreeStubServer::OurWebThreeStubServer(jsonrpc::AbstractServerConnector& _conn, WebThreeDirect& _web3,
vector<KeyPair> const& _accounts, Main* main): vector<KeyPair> const& _accounts, Main* _main):
WebThreeStubServer(_conn, _web3, _accounts), m_web3(&_web3), m_main(main) WebThreeStubServer(_conn, _web3, _accounts), m_web3(&_web3), m_main(_main)
{} {
connect(_main, SIGNAL(poll()), this, SLOT(doValidations()));
}
string OurWebThreeStubServer::shh_newIdentity() string OurWebThreeStubServer::shh_newIdentity()
{ {
@ -44,7 +46,7 @@ string OurWebThreeStubServer::shh_newIdentity()
return toJS(kp.pub()); return toJS(kp.pub());
} }
bool OurWebThreeStubServer::showAuthenticationPopup(string const& _title, string const& _text) const bool OurWebThreeStubServer::showAuthenticationPopup(string const& _title, string const& _text)
{ {
if (!m_main->confirm()) if (!m_main->confirm())
{ {
@ -52,23 +54,30 @@ bool OurWebThreeStubServer::showAuthenticationPopup(string const& _title, string
return true; return true;
} }
int button; QMessageBox userInput;
QMetaObject::invokeMethod(m_main, "authenticate", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, button), Q_ARG(QString, QString::fromStdString(_title)), Q_ARG(QString, QString::fromStdString(_text))); userInput.setText(QString::fromStdString(_title));
return button == QMessageBox::Ok; userInput.setInformativeText(QString::fromStdString(_text));
userInput.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
userInput.button(QMessageBox::Ok)->setText("Allow");
userInput.button(QMessageBox::Cancel)->setText("Reject");
userInput.setDefaultButton(QMessageBox::Cancel);
return userInput.exec() == QMessageBox::Ok;
//QMetaObject::invokeMethod(m_main, "authenticate", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, button), Q_ARG(QString, QString::fromStdString(_title)), Q_ARG(QString, QString::fromStdString(_text)));
//return button == QMessageBox::Ok;
} }
bool OurWebThreeStubServer::showCreationNotice(TransactionSkeleton const& _t, bool _toProxy) const bool OurWebThreeStubServer::showCreationNotice(TransactionSkeleton const& _t, bool _toProxy)
{ {
return showAuthenticationPopup("Contract Creation Transaction", string("ÐApp is attemping to create a contract; ") + (_toProxy ? "(this transaction is not executed directly, but forwarded to another ÐApp) " : "") + "to be endowed with " + formatBalance(_t.value) + ", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is <b>" + formatBalance(_t.value + _t.gas * _t.gasPrice) + "</b>."); return showAuthenticationPopup("Contract Creation Transaction", string("ÐApp is attemping to create a contract; ") + (_toProxy ? "(this transaction is not executed directly, but forwarded to another ÐApp) " : "") + "to be endowed with " + formatBalance(_t.value) + ", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is " + formatBalance(_t.value + _t.gas * _t.gasPrice) + ".");
} }
bool OurWebThreeStubServer::showSendNotice(TransactionSkeleton const& _t, bool _toProxy) const bool OurWebThreeStubServer::showSendNotice(TransactionSkeleton const& _t, bool _toProxy)
{ {
return showAuthenticationPopup("Fund Transfer Transaction", "ÐApp is attempting to send " + formatBalance(_t.value) + " to a recipient " + m_main->pretty(_t.to).toStdString() + (_toProxy ? " (this transaction is not executed directly, but forwarded to another ÐApp)" : "") + return showAuthenticationPopup("Fund Transfer Transaction", "ÐApp is attempting to send " + formatBalance(_t.value) + " to a recipient " + m_main->pretty(_t.to).toStdString() + (_toProxy ? " (this transaction is not executed directly, but forwarded to another ÐApp)" : "") +
", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is <b>" + formatBalance(_t.value + _t.gas * _t.gasPrice) + "</b>."); ", with additional network fees of up to " + formatBalance(_t.gas * _t.gasPrice) + ".\n\nMaximum total cost is " + formatBalance(_t.value + _t.gas * _t.gasPrice) + ".");
} }
bool OurWebThreeStubServer::showUnknownCallNotice(TransactionSkeleton const& _t, bool _toProxy) const bool OurWebThreeStubServer::showUnknownCallNotice(TransactionSkeleton const& _t, bool _toProxy)
{ {
return showAuthenticationPopup("DANGEROUS! Unknown Contract Transaction!", return showAuthenticationPopup("DANGEROUS! Unknown Contract Transaction!",
"ÐApp is attempting to call into an unknown contract at address " + "ÐApp is attempting to call into an unknown contract at address " +
@ -84,11 +93,29 @@ bool OurWebThreeStubServer::showUnknownCallNotice(TransactionSkeleton const& _t,
"REJECT UNLESS YOU REALLY KNOW WHAT YOU ARE DOING!"); "REJECT UNLESS YOU REALLY KNOW WHAT YOU ARE DOING!");
} }
bool OurWebThreeStubServer::authenticate(TransactionSkeleton const& _t, bool _toProxy) void OurWebThreeStubServer::authenticate(TransactionSkeleton const& _t, bool _toProxy)
{
Guard l(x_queued);
m_queued.push(make_pair(_t, _toProxy));
}
void OurWebThreeStubServer::doValidations()
{
Guard l(x_queued);
while (!m_queued.empty())
{
auto q = m_queued.front();
m_queued.pop();
if (validateTransaction(q.first, q.second))
WebThreeStubServerBase::authenticate(q.first, q.second);
}
}
bool OurWebThreeStubServer::validateTransaction(TransactionSkeleton const& _t, bool _toProxy)
{ {
if (_t.creation) if (_t.creation)
{ {
// recipient has no code - nothing special about this transaction, show basic value transfer info // show notice concerning the creation code. TODO: this needs entering into natspec.
return showCreationNotice(_t, _toProxy); return showCreationNotice(_t, _toProxy);
} }
@ -116,8 +143,8 @@ bool OurWebThreeStubServer::authenticate(TransactionSkeleton const& _t, bool _to
(_t.value > 0 ? (_t.value > 0 ?
"In addition, ÐApp is attempting to send " + "In addition, ÐApp is attempting to send " +
formatBalance(_t.value) + " to said recipient, with additional network fees of up to " + formatBalance(_t.value) + " to said recipient, with additional network fees of up to " +
formatBalance(_t.gas * _t.gasPrice) + " = <b>" + formatBalance(_t.gas * _t.gasPrice) + " = " +
formatBalance(_t.value + _t.gas * _t.gasPrice) + "</b>." formatBalance(_t.value + _t.gas * _t.gasPrice) + "."
: :
"Additional network fees are at most" + "Additional network fees are at most" +
formatBalance(_t.gas * _t.gasPrice) + ".") formatBalance(_t.gas * _t.gasPrice) + ".")

20
alethzero/OurWebThreeStubServer.h

@ -19,7 +19,9 @@
* @date 2014 * @date 2014
*/ */
#include <queue>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <libdevcore/Guards.h>
#include <libethcore/CommonJS.h> #include <libethcore/CommonJS.h>
#include <libdevcrypto/Common.h> #include <libdevcrypto/Common.h>
#include <libweb3jsonrpc/WebThreeStubServer.h> #include <libweb3jsonrpc/WebThreeStubServer.h>
@ -35,16 +37,24 @@ public:
std::vector<dev::KeyPair> const& _accounts, Main* main); std::vector<dev::KeyPair> const& _accounts, Main* main);
virtual std::string shh_newIdentity() override; virtual std::string shh_newIdentity() override;
virtual bool authenticate(dev::eth::TransactionSkeleton const& _t, bool _toProxy); virtual void authenticate(dev::eth::TransactionSkeleton const& _t, bool _toProxy);
signals: signals:
void onNewId(QString _s); void onNewId(QString _s);
public slots:
void doValidations();
private: private:
bool showAuthenticationPopup(std::string const& _title, std::string const& _text) const; bool showAuthenticationPopup(std::string const& _title, std::string const& _text);
bool showCreationNotice(dev::eth::TransactionSkeleton const& _t, bool _toProxy) const; bool showCreationNotice(dev::eth::TransactionSkeleton const& _t, bool _toProxy);
bool showSendNotice(dev::eth::TransactionSkeleton const& _t, bool _toProxy) const; bool showSendNotice(dev::eth::TransactionSkeleton const& _t, bool _toProxy);
bool showUnknownCallNotice(dev::eth::TransactionSkeleton const& _t, bool _toProxy) const; bool showUnknownCallNotice(dev::eth::TransactionSkeleton const& _t, bool _toProxy);
bool validateTransaction(dev::eth::TransactionSkeleton const& _t, bool _toProxy);
std::queue<std::pair<dev::eth::TransactionSkeleton, bool>> m_queued;
dev::Mutex x_queued;
dev::WebThreeDirect* m_web3; dev::WebThreeDirect* m_web3;
Main* m_main; Main* m_main;

34
libweb3jsonrpc/WebThreeStubServerBase.cpp

@ -701,35 +701,31 @@ std::string WebThreeStubServerBase::eth_transact(Json::Value const& _json)
{ {
std::string ret; std::string ret;
TransactionSkeleton t = toTransaction(_json); TransactionSkeleton t = toTransaction(_json);
if (t.creation)
ret = right160(sha3(rlpList(t.from, client()->countAt(t.from))));;
if (!t.from) if (!t.from)
t.from = m_accounts->getDefaultTransactAccount(); t.from = m_accounts->getDefaultTransactAccount();
if (!t.gasPrice) if (!t.gasPrice)
t.gasPrice = 10 * dev::eth::szabo; t.gasPrice = 10 * dev::eth::szabo;
if (!t.gas) if (!t.gas)
t.gas = min<u256>(client()->gasLimitRemaining(), client()->balanceAt(t.from) / t.gasPrice); t.gas = min<u256>(client()->gasLimitRemaining(), client()->balanceAt(t.from) / t.gasPrice);
if (!m_accounts->isRealAccount(t.from))
{ if (m_accounts->isRealAccount(t.from))
if (m_accounts->isProxyAccount(t.from)) authenticate(t, false);
if (authenticate(t, true)) else if (m_accounts->isProxyAccount(t.from))
m_accounts->queueTransaction(t); authenticate(t, true);
return ret;
}
if (authenticate(t, false))
{
if (t.to)
// TODO: from qethereum, insert validification hook here.
client()->transact(m_accounts->secretKey(t.from), t.value, t.to, t.data, t.gas, t.gasPrice);
else
ret = toJS(client()->transact(m_accounts->secretKey(t.from), t.value, t.data, t.gas, t.gasPrice));
client()->flushTransactions();
}
return ret; return ret;
} }
bool WebThreeStubServerBase::authenticate(TransactionSkeleton const& _t, bool) void WebThreeStubServerBase::authenticate(TransactionSkeleton const& _t, bool _toProxy)
{ {
cwarn << "Silently signing transaction from address" << _t.from.abridged() << ": User validation hook goes here."; if (_toProxy)
return true; m_accounts->queueTransaction(_t);
else if (_t.to)
client()->transact(m_accounts->secretKey(_t.from), _t.value, _t.to, _t.data, _t.gas, _t.gasPrice);
else
client()->transact(m_accounts->secretKey(_t.from), _t.value, _t.data, _t.gas, _t.gasPrice);
} }
Json::Value WebThreeStubServerBase::eth_transactionByHash(std::string const& _hash, int _i) Json::Value WebThreeStubServerBase::eth_transactionByHash(std::string const& _hash, int _i)

2
libweb3jsonrpc/WebThreeStubServerBase.h

@ -136,7 +136,7 @@ public:
std::map<dev::Public, dev::Secret> const& ids() const { return m_ids; } std::map<dev::Public, dev::Secret> const& ids() const { return m_ids; }
protected: protected:
virtual bool authenticate(dev::eth::TransactionSkeleton const& _t, bool _toProxy); virtual void authenticate(dev::eth::TransactionSkeleton const& _t, bool _toProxy);
protected: protected:
virtual dev::eth::Interface* client() = 0; virtual dev::eth::Interface* client() = 0;

Loading…
Cancel
Save