From dc69a419797d0f1796229518b4f74ede4bf2c3af Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sat, 9 Mar 2013 18:28:08 -0800 Subject: [PATCH 1/2] Renumber special ledger_indexes and move RPC ledger to new format. --- src/cpp/ripple/RPCHandler.cpp | 88 +++++++++++++++++++++++------------ src/cpp/ripple/RPCHandler.h | 4 ++ src/js/remote.js | 10 ++-- 3 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 6b121d68e4..3a2c8c2fbd 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -25,7 +25,7 @@ SETUP_LOG(); -static const int rpcCOST_DEFAULT = 10; +static const int rpcCOST_DEFAULT = 10; static const int rpcCOST_EXCEPTION = 20; static const int rpcCOST_EXPENSIVE = 50; @@ -1617,7 +1617,7 @@ Json::Value RPCHandler::doLedgerCurrent(Json::Value, int& cost) // } Json::Value RPCHandler::doLedger(Json::Value jvRequest, int& cost) { - if (!jvRequest.isMember("ledger")) + if (!jvRequest.isMember("ledger") && !jvRequest.isMember("ledger_hash") && !jvRequest.isMember("ledger_index")) { Json::Value ret(Json::objectValue), current(Json::objectValue), closed(Json::objectValue); @@ -1630,27 +1630,18 @@ Json::Value RPCHandler::doLedger(Json::Value jvRequest, int& cost) return ret; } - std::string strLedger = jvRequest["ledger"].asString(); - Ledger::pointer ledger; + Ledger::pointer lpLedger; + Json::Value jvResult = lookupLedger(jvRequest, lpLedger); - if (strLedger == "current") - ledger = theApp->getLedgerMaster().getCurrentLedger(); - else if (strLedger == "closed") - ledger = theApp->getLedgerMaster().getClosedLedger(); - else if (strLedger.size() > 12) - ledger = theApp->getLedgerMaster().getLedgerByHash(uint256(strLedger)); - else - ledger = theApp->getOPs().getLedgerBySeq(jvRequest["ledger"].asUInt()); - - if (!ledger) - return rpcError(rpcLGR_NOT_FOUND); + if (!lpLedger) + return jvResult; bool full = jvRequest.isMember("full") && jvRequest["full"].asBool(); Json::Value ret(Json::objectValue); ScopedUnlock(theApp->getMasterLock()); - ledger->addJson(ret, full ? LEDGER_JSON_FULL : 0); + lpLedger->addJson(ret, full ? LEDGER_JSON_FULL : 0); return ret; } @@ -2260,8 +2251,44 @@ Json::Value RPCHandler::lookupLedger(Json::Value jvRequest, Ledger::pointer& lpL { Json::Value jvResult; - uint256 uLedger = jvRequest.isMember("ledger_hash") ? uint256(jvRequest["ledger_hash"].asString()) : 0; - int32 iLedgerIndex = jvRequest.isMember("ledger_index") && jvRequest["ledger_index"].isNumeric() ? jvRequest["ledger_index"].asInt() : -2; + uint256 uLedger = jvRequest.isMember("ledger_hash") ? uint256(jvRequest["ledger_hash"].asString()) : 0; + int32 iLedgerIndex = jvRequest.isMember("ledger_index") && jvRequest["ledger_index"].isNumeric() ? jvRequest["ledger_index"].asInt() : LEDGER_CURRENT; + + std::string strLedger; + + if (jvRequest.isMember("ledger_index") && !jvRequest["ledger_index"].isNumeric()) + strLedger = jvRequest["ledger_index"].asString(); + + // Support for DEPRECATED "ledger". + if (!jvRequest.isMember("ledger")) + { + nothing(); + } + else if (jvRequest["ledger"].size() > 12) + { + uLedger = uint256(jvRequest["ledger"].asString()); + } + else if (jvRequest["ledger"].isNumeric()) + { + iLedgerIndex = jvRequest["ledger"].asInt(); + } + else + { + strLedger = jvRequest["ledger"].asString(); + } + + if (strLedger == "current") + { + iLedgerIndex = LEDGER_CURRENT; + } + else if (strLedger == "closed") + { + iLedgerIndex = LEDGER_CLOSED; + } + else if (strLedger == "validated") + { + iLedgerIndex = LEDGER_VALIDATED; + } if (!!uLedger) { @@ -2277,21 +2304,22 @@ Json::Value RPCHandler::lookupLedger(Json::Value jvRequest, Ledger::pointer& lpL iLedgerIndex = lpLedger->getLedgerSeq(); // Set the current index, override if needed. } - if (-1 == iLedgerIndex) - { - lpLedger = theApp->getLedgerMaster().getClosedLedger(); - iLedgerIndex = lpLedger->getLedgerSeq(); - } - if (-2 == iLedgerIndex) - { - // Default to current ledger. + + switch (iLedgerIndex) { + case LEDGER_CURRENT: lpLedger = mNetOps->getCurrentLedger(); iLedgerIndex = lpLedger->getLedgerSeq(); - } - if (-3 == iLedgerIndex) - { // Last fully-validated ledger + break; + + case LEDGER_CLOSED: + lpLedger = theApp->getLedgerMaster().getClosedLedger(); + iLedgerIndex = lpLedger->getLedgerSeq(); + break; + + case LEDGER_VALIDATED: lpLedger = mNetOps->getValidatedLedger(); - iLedgerIndex = lpLedger->getLedgerSeq(); + iLedgerIndex = lpLedger->getLedgerSeq(); + break; } if (iLedgerIndex <= 0) diff --git a/src/cpp/ripple/RPCHandler.h b/src/cpp/ripple/RPCHandler.h index 641687ccf1..63ba7b556b 100644 --- a/src/cpp/ripple/RPCHandler.h +++ b/src/cpp/ripple/RPCHandler.h @@ -9,6 +9,10 @@ #include "SerializedTypes.h" #include "Ledger.h" +#define LEDGER_CURRENT -1 +#define LEDGER_CLOSED -2 +#define LEDGER_VALIDATED -3 + // used by the RPCServer or WSDoor to carry out these RPC commands class NetworkOPs; class InfoSub; diff --git a/src/js/remote.js b/src/js/remote.js index 9b6bd4b5df..eea5b4c3ef 100644 --- a/src/js/remote.js +++ b/src/js/remote.js @@ -93,14 +93,14 @@ Request.prototype.ledger_index = function (ledger_index) { }; Request.prototype.ledger_select = function (ledger_spec) { - if (ledger_spec === 'closed') { - this.message.ledger_index = -1; + if (ledger_spec === 'current') { + this.message.ledger_index = ledger_spec; - } else if (ledger_spec === 'current') { - this.message.ledger_index = -2; + } else if (ledger_spec === 'closed') { + this.message.ledger_index = ledger_spec; } else if (ledger_spec === 'verified') { - this.message.ledger_index = -3; + this.message.ledger_index = ledger_spec; } else if (String(ledger_spec).length > 12) { // XXX Better test needed this.message.ledger_hash = ledger_spec; From 1479590af184dbf4ee7c83659f3560d2c0553712 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sun, 10 Mar 2013 15:18:35 -0700 Subject: [PATCH 2/2] Rework RPC ledger. --- src/cpp/ripple/Ledger.cpp | 10 ++++++---- src/cpp/ripple/Ledger.h | 3 ++- src/cpp/ripple/RPCHandler.cpp | 11 +++++++++-- src/js/remote.js | 36 ++++++++++++++++++++++------------- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index ed03fefb19..5ea9e318d4 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -861,9 +861,11 @@ Json::Value Ledger::getJson(int options) } } else + { ledger["closed"] = false; + } - if (mTransactionMap && (bFull || ((options & LEDGER_JSON_DUMP_TXRP) != 0))) + if (mTransactionMap && (bFull || isSetBit(options, LEDGER_JSON_DUMP_TXRP))) { Json::Value txns(Json::arrayValue); SHAMapTreeNode::TNType type; @@ -871,7 +873,7 @@ Json::Value Ledger::getJson(int options) for (SHAMapItem::pointer item = mTransactionMap->peekFirstItem(type); !!item; item = mTransactionMap->peekNextItem(item->getTag(), type)) { - if (bFull) + if (bFull || isSetBit(options, LEDGER_JSON_EXPAND)) { if (type == SHAMapTreeNode::tnTRANSACTION_NM) { @@ -904,14 +906,14 @@ Json::Value Ledger::getJson(int options) ledger["transactions"] = txns; } - if (mAccountStateMap && (bFull || ((options & LEDGER_JSON_DUMP_STATE) != 0))) + if (mAccountStateMap && (bFull || isSetBit(options, LEDGER_JSON_DUMP_STATE))) { Json::Value state(Json::arrayValue); ScopedLock l(mAccountStateMap->Lock()); for (SHAMapItem::pointer item = mAccountStateMap->peekFirstItem(); !!item; item = mAccountStateMap->peekNextItem(item->getTag())) { - if (bFull) + if (bFull || isSetBit(options, LEDGER_JSON_EXPAND)) { SerializerIterator sit(item->peekSerializer()); SerializedLedgerEntry sle(sit, item->getTag()); diff --git a/src/cpp/ripple/Ledger.h b/src/cpp/ripple/Ledger.h index 0744834602..e674bb8ac4 100644 --- a/src/cpp/ripple/Ledger.h +++ b/src/cpp/ripple/Ledger.h @@ -38,7 +38,8 @@ enum LedgerStateParms #define LEDGER_JSON_DUMP_TXRP 0x10000000 #define LEDGER_JSON_DUMP_STATE 0x20000000 -#define LEDGER_JSON_FULL 0x40000000 +#define LEDGER_JSON_EXPAND 0x40000000 +#define LEDGER_JSON_FULL 0x80000000 DEFINE_INSTANCE(Ledger); diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 3a2c8c2fbd..c100ecc3f4 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1636,12 +1636,19 @@ Json::Value RPCHandler::doLedger(Json::Value jvRequest, int& cost) if (!lpLedger) return jvResult; - bool full = jvRequest.isMember("full") && jvRequest["full"].asBool(); + bool bFull = jvRequest.isMember("full") && jvRequest["full"].asBool(); + bool bTransactions = jvRequest.isMember("transactions") && jvRequest["transactions"].asBool(); + bool bAccounts = jvRequest.isMember("accounts") && jvRequest["accounts"].asBool(); + bool bExpand = jvRequest.isMember("expand") && jvRequest["expand"].asBool(); + int iOptions = (bFull ? LEDGER_JSON_FULL : 0) + | (bExpand ? LEDGER_JSON_EXPAND : 0) + | (bTransactions ? LEDGER_JSON_DUMP_TXRP : 0) + | (bAccounts ? LEDGER_JSON_DUMP_STATE : 0); Json::Value ret(Json::objectValue); ScopedUnlock(theApp->getMasterLock()); - lpLedger->addJson(ret, full ? LEDGER_JSON_FULL : 0); + lpLedger->addJson(ret, iOptions); return ret; } diff --git a/src/js/remote.js b/src/js/remote.js index eea5b4c3ef..2f99748b2a 100644 --- a/src/js/remote.js +++ b/src/js/remote.js @@ -727,16 +727,37 @@ Remote.prototype.request_server_info = function () { // XXX This is a bad command. Some varients don't scale. // XXX Require the server to be trusted. -Remote.prototype.request_ledger = function (ledger, full) { +Remote.prototype.request_ledger = function (ledger, opts) { //utils.assert(this.trusted); var request = new Request(this, 'ledger'); if (ledger) + { + // DEPRECATED: use .ledger_hash() or .ledger_index() + console.log("request_ledger: ledger parameter is deprecated"); request.message.ledger = ledger; + } - if (full) + if ('object' == typeof opts) { + if (opts.full) + request.message.full = true; + + if (opts.expand) + request.message.expand = true; + + if (opts.transactions) + request.message.transactions = true; + + if (opts.accounts) + request.message.accounts = true; + } + // DEPRECATED: + else if (opts) + { + console.log("request_ledger: full parameter is deprecated"); request.message.full = true; + } return request; }; @@ -971,17 +992,6 @@ Remote.prototype.request_book_offers = function (gets, pays, taker) { return request; }; -Remote.prototype.request_ledger = function (ledger, full) { - var request = new Request(this, 'ledger'); - - request.message.ledger = ledger; - - if (full) - request.message.full = true; - - return request; -}; - Remote.prototype.request_wallet_accounts = function (seed) { utils.assert(this.trusted); // Don't send secrets.