From 2587b2deb2226944eca4ba01e9a6c43b4925190d Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sun, 15 Feb 2015 22:20:20 +0100 Subject: [PATCH] Preview Natspec in New Transaction dialog. --- alethzero/MainWin.cpp | 2 +- alethzero/NatspecHandler.cpp | 13 ++++++------- alethzero/OurWebThreeStubServer.cpp | 1 - alethzero/Transact.cpp | 17 ++++++++++++++--- libdevcore/vector_ref.h | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 1d497cc0b..00fb29e2d 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -1491,7 +1491,7 @@ void Main::on_contracts_currentItemChanged() auto storage = ethereum()->storageAt(address); for (auto const& i: storage) s << "@" << showbase << hex << prettyU256(i.first).toStdString() << "    " << showbase << hex << prettyU256(i.second).toStdString() << "
"; - s << "

Body Code

" << disassemble(ethereum()->codeAt(address)); + s << "

Body Code (" << sha3(ethereum()->codeAt(address)).abridged() << ")

" << disassemble(ethereum()->codeAt(address)); s << Div(Mono) << toHex(ethereum()->codeAt(address)) << ""; ui->contractInfo->appendHtml(QString::fromStdString(s.str())); } diff --git a/alethzero/NatspecHandler.cpp b/alethzero/NatspecHandler.cpp index 25cc13d4a..bfdbaa178 100644 --- a/alethzero/NatspecHandler.cpp +++ b/alethzero/NatspecHandler.cpp @@ -50,16 +50,15 @@ NatspecHandler::~NatspecHandler() void NatspecHandler::add(dev::h256 const& _contractHash, string const& _doc) { - bytes k = _contractHash.asBytes(); - string v = _doc; - m_db->Put(m_writeOptions, ldb::Slice((char const*)k.data(), k.size()), ldb::Slice((char const*)v.data(), v.size())); + m_db->Put(m_writeOptions, _contractHash.ref(), _doc); + cdebug << "Registering NatSpec: " << _contractHash.abridged() << _doc; } string NatspecHandler::retrieve(dev::h256 const& _contractHash) const { - bytes k = _contractHash.asBytes(); string ret; - m_db->Get(m_readOptions, ldb::Slice((char const*)k.data(), k.size()), &ret); + m_db->Get(m_readOptions, _contractHash.ref(), &ret); + cdebug << "Looking up NatSpec: " << _contractHash.abridged() << ret; return ret; } @@ -69,8 +68,8 @@ string NatspecHandler::getUserNotice(string const& json, dev::bytes const& _tran Json::Value userNotice; string retStr; m_reader.parse(json, natspec); - bytes transactionFunctionPart(_transactionData.begin(), _transactionData.begin() + 4); - FixedHash<4> transactionFunctionHash(transactionFunctionPart); + + FixedHash<4> transactionFunctionHash((bytesConstRef(&_transactionData).cropped(0, 4).toBytes())); Json::Value methods = natspec["methods"]; for (Json::ValueIterator it = methods.begin(); it != methods.end(); ++it) diff --git a/alethzero/OurWebThreeStubServer.cpp b/alethzero/OurWebThreeStubServer.cpp index 06f5fc637..2d1dd0481 100644 --- a/alethzero/OurWebThreeStubServer.cpp +++ b/alethzero/OurWebThreeStubServer.cpp @@ -91,7 +91,6 @@ bool OurWebThreeStubServer::authenticate(TransactionSkeleton const& _t) return showSendNotice(_t); } - // TODO: include total cost in Ether string userNotice = m_main->natSpec()->getUserNotice(contractCodeHash, _t.data); if (userNotice.empty()) diff --git a/alethzero/Transact.cpp b/alethzero/Transact.cpp index 4ac0bbcbf..3031232c2 100644 --- a/alethzero/Transact.cpp +++ b/alethzero/Transact.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #ifndef _MSC_VER @@ -239,9 +240,18 @@ void Transact::rejigData() else { m_data = parseData(ui->data->toPlainText().toStdString()); - ui->code->setHtml(QString::fromStdString(dev::memDump(m_data, 8, true))); - if (ethereum()->codeAt(m_context->fromString(ui->destination->currentText()), 0).size()) + auto to = m_context->fromString(ui->destination->currentText()); + QString natspec; + if (ethereum()->codeAt(to, 0).size()) { + string userNotice = m_natSpecDB->getUserNotice(ethereum()->postState().codeHash(to), m_data); + if (userNotice.empty()) + natspec = "Destination contract unknown."; + else + { + NatspecExpressionEvaluator evaluator; + natspec = evaluator.evalExpression(QString::fromStdString(userNotice)); + } ui->gas->setMinimum((qint64)Interface::txGas(m_data, 1)); if (!ui->gas->isEnabled()) ui->gas->setValue(m_backupGas); @@ -249,11 +259,13 @@ void Transact::rejigData() } else { + natspec += "Destination not a contract."; if (ui->gas->isEnabled()) m_backupGas = ui->gas->value(); ui->gas->setValue((qint64)Interface::txGas(m_data)); ui->gas->setEnabled(false); } + ui->code->setHtml("

NatSpec

" + natspec + "

Dump

" + QString::fromStdString(dev::memDump(m_data, 8, true)) + "

Hex

" + Div(Mono) + QString::fromStdString(toHex(m_data)) + ""); } updateFee(); } @@ -312,7 +324,6 @@ void Transact::on_debug_clicked() Executive e(st, ethereum()->blockChain(), 0); dw.populate(e, t); dw.exec(); - close(); return; } QMessageBox::critical(this, "Transaction Failed", "Couldn't make transaction: no single account contains at least the required amount."); diff --git a/libdevcore/vector_ref.h b/libdevcore/vector_ref.h index f7ab4c14a..9039c3149 100644 --- a/libdevcore/vector_ref.h +++ b/libdevcore/vector_ref.h @@ -19,7 +19,7 @@ public: vector_ref(): m_data(nullptr), m_count(0) {} vector_ref(_T* _data, size_t _count): m_data(_data), m_count(_count) {} - vector_ref(std::string* _data): m_data((_T*)_data->data()), m_count(_data->size() / sizeof(_T)) {} + vector_ref(typename std::conditional::value, std::string const*, std::string*>::type _data): m_data((_T*)_data->data()), m_count(_data->size() / sizeof(_T)) {} vector_ref(typename std::conditional::value, std::vector::type> const*, std::vector<_T>*>::type _data): m_data(_data->data()), m_count(_data->size()) {} vector_ref(typename std::conditional::value, std::string const&, std::string&>::type _data): m_data((_T*)_data.data()), m_count(_data.size() / sizeof(_T)) {} #ifdef STORAGE_LEVELDB_INCLUDE_DB_H_