Implemented keva_group_join.

This commit is contained in:
Just Wonder 2020-06-15 21:34:11 -07:00
parent da100e7634
commit 9ad1e217b5
4 changed files with 97 additions and 11 deletions

View File

@ -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

View File

@ -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"} }
}; };

View File

@ -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;
}

View File

@ -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)