Browse Source

Implemented keva_group_join.

views
Just Wonder 4 years ago
parent
commit
9ad1e217b5
  1. 10
      src/rpc/client.cpp
  2. 17
      src/rpc/rpckeva_nonwallet.cpp
  3. 76
      src/wallet/rpckeva.cpp
  4. 5
      src/wallet/rpcwallet.cpp

10
src/rpc/client.cpp

@ -150,9 +150,13 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "keva_filter", 3, "from"}, { "keva_filter", 3, "from"},
{ "keva_filter", 4, "nb"}, { "keva_filter", 4, "nb"},
{ "keva_show_group", 1, "maxage"}, { "keva_group_show", 1, "maxage"},
{ "keva_show_group", 2, "from"}, { "keva_group_show", 2, "from"},
{ "keva_show_group", 3, "nb"}, { "keva_group_show", 3, "nb"},
{ "keva_group_filter", 3, "maxage"},
{ "keva_group_filter", 4, "from"},
{ "keva_group_filter", 5, "nb"},
}; };
class CRPCConvertTable class CRPCConvertTable

17
src/rpc/rpckeva_nonwallet.cpp

@ -415,13 +415,18 @@ UniValue keva_group_filter(const JSONRPCRequest& request)
valtype key; valtype key;
CKevaData data; CKevaData data;
valtype displayKey = ValtypeFromString(CKevaScript::KEVA_DISPLAY_NAME_KEY);
for (auto iterNS = namespaces.begin(); iterNS != namespaces.end(); ++iterNS) { for (auto iterNS = namespaces.begin(); iterNS != namespaces.end(); ++iterNS) {
std::unique_ptr<CKevaIterator> iter(pcoinsTip->IterateKeys(*iterNS)); std::unique_ptr<CKevaIterator> iter(pcoinsTip->IterateKeys(*iterNS));
while (iter->next(key, data)) { while (iter->next(key, data)) {
if (key == displayKey) {
continue;
}
const int age = chainActive.Height() - data.getHeight(); const int age = chainActive.Height() - data.getHeight();
assert(age >= 0); assert(age >= 0);
if (maxage != 0 && age >= maxage) if (maxage != 0 && age >= maxage) {
continue; continue;
}
if (haveRegexp) { if (haveRegexp) {
const std::string keyStr = ValtypeToString(key); const std::string keyStr = ValtypeToString(key);
@ -643,11 +648,11 @@ getNamespaceInfo(const valtype& namespaceId, const valtype& name, const COutPoin
return obj; return obj;
} }
UniValue keva_show_group(const JSONRPCRequest& request) UniValue keva_group_show(const JSONRPCRequest& request)
{ {
if (request.fHelp || request.params.size() > 6 || request.params.size() == 0) if (request.fHelp || request.params.size() > 6 || request.params.size() == 0)
throw std::runtime_error( throw std::runtime_error(
"keva_show_group (\"namespaceId\" (\"regexp\" (\"from\" (\"nb\" (\"stat\")))))\n" "keva_group_show (\"namespaceId\" (\"regexp\" (\"from\" (\"nb\" (\"stat\")))))\n"
"\nList namespaces that are in the same group as the given namespace.\n" "\nList namespaces that are in the same group as the given namespace.\n"
"\nArguments:\n" "\nArguments:\n"
"1. \"namespace\" (string) namespace Id\n" "1. \"namespace\" (string) namespace Id\n"
@ -661,8 +666,8 @@ UniValue keva_show_group(const JSONRPCRequest& request)
" ...\n" " ...\n"
"]\n" "]\n"
"\nExamples:\n" "\nExamples:\n"
+ HelpExampleCli ("keva_show_group", "NamespaceId") + HelpExampleCli ("keva_group_show", "NamespaceId")
+ HelpExampleCli ("keva_show_group", "NamespaceId 96000 0 0 \"stat\"") + HelpExampleCli ("keva_group_show", "NamespaceId 96000 0 0 \"stat\"")
); );
RPCTypeCheck(request.params, { RPCTypeCheck(request.params, {
@ -822,7 +827,7 @@ static const CRPCCommand commands[] =
// --------------------- ------------------------ ----------------------- ---------- // --------------------- ------------------------ ----------------------- ----------
{ "kevacoin", "keva_get", &keva_get, {"namespace", "key"} }, { "kevacoin", "keva_get", &keva_get, {"namespace", "key"} },
{ "kevacoin", "keva_filter", &keva_filter, {"namespace", "regexp", "from", "nb", "stat"} }, { "kevacoin", "keva_filter", &keva_filter, {"namespace", "regexp", "from", "nb", "stat"} },
{ "kevacoin", "keva_show_group", &keva_show_group, {"namespace", "from", "nb", "stat"} }, { "kevacoin", "keva_group_show", &keva_group_show, {"namespace", "from", "nb", "stat"} },
{ "kevacoin", "keva_group_get", &keva_group_get, {"namespace", "key", "initiator"} }, { "kevacoin", "keva_group_get", &keva_group_get, {"namespace", "key", "initiator"} },
{ "kevacoin", "keva_group_filter", &keva_group_filter, {"namespace", "initiator", "regexp", "from", "nb", "stat"} } { "kevacoin", "keva_group_filter", &keva_group_filter, {"namespace", "initiator", "regexp", "from", "nb", "stat"} }
}; };

76
src/wallet/rpckeva.cpp

@ -460,3 +460,79 @@ UniValue keva_pending(const JSONRPCRequest& request)
return arr; return arr;
} }
UniValue keva_group_join(const JSONRPCRequest& request)
{
CWallet* const pwallet = GetWalletForJSONRPCRequest(request);
if (!EnsureWalletIsAvailable (pwallet, request.fHelp)) {
return NullUniValue;
}
if (request.fHelp || request.params.size() != 2) {
throw std::runtime_error (
"keva_group_join \"my_namespace\" \"other_namespace\"\n"
"\nInsert or update a key value pair in the given namespace.\n"
+ HelpRequiringPassphrase (pwallet) +
"\nArguments:\n"
"1. \"my_namespace\" (string, required) the namespace to join to <other_namespace>\n"
"2. \"other_namespace\" (string, required) the target namespace to join to\n"
"\nResult:\n"
"\"txid\" (string) the keva_put's txid\n"
"\nExamples:\n"
+ HelpExampleCli ("keva_group_join", "\"my_namespace\", \"other_namespace\"")
);
}
RPCTypeCheck(request.params, {UniValue::VSTR, UniValue::VSTR});
RPCTypeCheckArgument(request.params[0], UniValue::VSTR);
RPCTypeCheckArgument(request.params[1], UniValue::VSTR);
ObserveSafeMode ();
const std::string myNamespaceStr = request.params[0].get_str();
valtype myNamespace;
if (!DecodeKevaNamespace(myNamespaceStr, Params(), myNamespace)) {
throw JSONRPCError (RPC_INVALID_PARAMETER, "invalid namespace id for my_namespace");
}
const std::string otherNamespaceStr = request.params[1].get_str();
valtype otherNamespace;
if (!DecodeKevaNamespace(otherNamespaceStr, Params(), otherNamespace)) {
throw JSONRPCError (RPC_INVALID_PARAMETER, "invalid namespace id for other_namespace");
}
//TODO: check other_namespace exists.
EnsureWalletIsUnlocked(pwallet);
COutput output;
if (!pwallet->FindKevaCoin(output, myNamespaceStr)) {
throw JSONRPCError (RPC_TRANSACTION_ERROR, "this namespace can not be updated");
}
const COutPoint outp(output.tx->GetHash(), output.i);
const CTxIn txIn(outp);
CReserveKey keyName(pwallet);
CPubKey pubKeyReserve;
const bool ok = keyName.GetReservedKey(pubKeyReserve, true);
assert(ok);
CKeyID keyId = pubKeyReserve.GetID();
CScript redeemScript = GetScriptForDestination(WitnessV0KeyHash(keyId));
CScriptID scriptHash = CScriptID(redeemScript);
CScript addrName = GetScriptForDestination(scriptHash);
valtype dummy = ValtypeFromString(std::string("1"));
valtype key = ValtypeFromString(CKevaData::ASSOCIATE_PREFIX + otherNamespaceStr);
const CScript kevaScript = CKevaScript::buildKevaPut(addrName, myNamespace, key, dummy);
CCoinControl coinControl;
CWalletTx wtx;
valtype empty;
SendMoneyToScript(pwallet, kevaScript, &txIn, empty,
KEVA_LOCKED_AMOUNT, false, wtx, coinControl);
keyName.KeepKey();
UniValue obj(UniValue::VOBJ);
obj.pushKV("txid", wtx.GetHash().GetHex());
return obj;
}

5
src/wallet/rpcwallet.cpp

@ -3722,7 +3722,7 @@ extern UniValue keva_delete(const JSONRPCRequest& request);
extern UniValue keva_get(const JSONRPCRequest& request); extern UniValue keva_get(const JSONRPCRequest& request);
extern UniValue keva_list_namespaces(const JSONRPCRequest& request); extern UniValue keva_list_namespaces(const JSONRPCRequest& request);
extern UniValue keva_pending(const JSONRPCRequest& request); extern UniValue keva_pending(const JSONRPCRequest& request);
extern UniValue keva_filter(const JSONRPCRequest& request); extern UniValue keva_group_join(const JSONRPCRequest& request);
static const CRPCCommand commands[] = static const CRPCCommand commands[] =
{ // category name actor (function) argNames { // category name actor (function) argNames
@ -3787,7 +3787,8 @@ static const CRPCCommand commands[] =
{ "kevacoin", "keva_list_namespaces", &keva_list_namespaces, {} }, { "kevacoin", "keva_list_namespaces", &keva_list_namespaces, {} },
{ "kevacoin", "keva_put", &keva_put, {"namespace", "key", "value"} }, { "kevacoin", "keva_put", &keva_put, {"namespace", "key", "value"} },
{ "kevacoin", "keva_delete", &keva_delete, {"namespace", "key"} }, { "kevacoin", "keva_delete", &keva_delete, {"namespace", "key"} },
{ "kevacoin", "keva_pending", &keva_pending, {"namespace"} } { "kevacoin", "keva_pending", &keva_pending, {"namespace"} },
{ "kevacoin", "keva_group_join", &keva_group_join, {"my_namespace", "other_namespace"} }
}; };
void RegisterWalletRPCCommands(CRPCTable &t) void RegisterWalletRPCCommands(CRPCTable &t)

Loading…
Cancel
Save