Kevacoin source tree
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

282 lines
6.2 KiB

// Copyright (c) 2018 the Kevacoin Core Developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef H_BITCOIN_SCRIPT_KEVA
#define H_BITCOIN_SCRIPT_KEVA
#include <uint256.h>
#include <chainparams.h>
#include <script/script.h>
class uint160;
/**
* A script parsed for keva operations. This can be initialised
* from a "standard" script, and will then determine if this is
* a name operation and which parts it consists of.
*/
class CKevaScript
{
private:
/** The type of operation. OP_NOP if no (valid) name op. */
opcodetype op;
/** The non-name part, i. e., the address. */
CScript address;
/** The operation arguments. */
std::vector<valtype> args;
public:
/**
* Default constructor. This enables us to declare a variable
* and initialise it later via assignment.
*/
inline CKevaScript()
: op(OP_NOP)
{}
/**
* The key pointing to the internal display name. This is the first
* key created when a namespace is registered.
*/
static const std::string KEVA_DISPLAY_NAME_KEY;
/**
* Parse a script and determine whether it is a valid name script. Sets
* the member variables representing the "picked apart" name script.
* @param script The ordinary script to parse.
*/
explicit CKevaScript(const CScript& script);
/**
* Return whether this is a (valid) name script.
* @return True iff this is a name operation.
*/
inline bool isKevaOp() const
{
switch (op) {
case OP_KEVA_PUT:
return true;
case OP_KEVA_NAMESPACE:
return true;
case OP_KEVA_DELETE:
return true;
case OP_NOP:
return false;
default:
assert(false);
}
}
/**
* Return the non-name script.
* @return The address part.
*/
inline const CScript& getAddress() const
{
return address;
}
/**
* Return the name operation. This returns OP_NAME_NEW, OP_NAME_FIRSTUPDATE
* or OP_NAME_UPDATE. Do not call if this is not a keva script.
* @return The name operation opcode.
*/
inline opcodetype getKevaOp() const
{
switch (op) {
case OP_KEVA_PUT:
return op;
case OP_KEVA_DELETE:
return op;
case OP_KEVA_NAMESPACE:
return op;
default:
assert (false);
}
}
/**
* Return whether this is a namespace registration.
* @return True iff this is OP_KEVA_NAMESPACE.
*/
inline bool isNamespaceRegistration() const
{
switch (op) {
case OP_KEVA_NAMESPACE:
return true;
case OP_KEVA_PUT:
return false;
case OP_KEVA_DELETE:
return false;
default:
assert(false);
}
}
/**
* Return whether this is a key/value update.
* @return True iff this is OP_KEVA_PUT.
*/
inline bool isAnyUpdate() const
{
switch (op) {
case OP_KEVA_NAMESPACE:
return false;
case OP_KEVA_PUT:
return true;
case OP_KEVA_DELETE:
return true;
default:
assert(false);
}
}
/**
* Return the name operation name. This call is only valid for
* OP_KEVA_NAMESPACE or OP_KEVA_PUT.
* @return The keva operation's namespace.
*/
inline const valtype& getOpNamespace() const
{
switch (op) {
case OP_KEVA_PUT:
return args[0];
case OP_KEVA_DELETE:
return args[0];
case OP_KEVA_NAMESPACE:
return args[0];
default:
assert(false);
}
}
/**
* Return namespace's display name. This call is only valid for
* OP_KEVA_NAMESPACE.
* @return The namespace's display name.
*/
inline const valtype& getOpNamespaceDisplayName() const
{
switch (op) {
case OP_KEVA_NAMESPACE:
return args[1];
default:
assert (false);
}
}
/**
* Return the keva operation key. This call is only valid for
* OP_KEVA_PUT.
* @return The keva operation's value.
*/
inline const valtype& getOpKey() const
{
switch (op) {
case OP_KEVA_PUT:
return args[1];
case OP_KEVA_DELETE:
return args[1];
default:
assert(false);
}
}
/**
* Return the keva operation value. This call is only valid for
* OP_KEVA_PUT.
* @return The keva operation's value.
*/
inline const valtype& getOpValue() const
{
switch (op) {
case OP_KEVA_PUT:
// args[0] is namespace, args[1] is key
return args[2];
default:
assert (false);
}
}
/**
* Return the keva operation value. This call is only valid for
* OP_KEVA_PUT.
* @return The keva operation's value.
*/
inline bool isDelete() const
{
return (op == OP_KEVA_DELETE);
}
/**
* Check if the given script is a keva script. This is a utility method.
* @param script The script to parse.
* @return True iff it is a name script.
*/
static inline bool
isKevaScript (const CScript& script)
{
const CKevaScript op(script);
return op.isKevaOp();
}
/**
* Build a keva namespace transaction.
* @param addr The address script to append.
* @param hash The hash to use.
* @return The full keva namespace script.
*/
static CScript buildKevaNamespace(const CScript& addr, const valtype& nameSpace,
const valtype& displayName);
/**
* Build a KEVA_PUT transaction.
* @param addr The address script to append.
* @param hash The hash to use.
* @return The full KEVA_PUT script.
*/
static CScript buildKevaPut(const CScript& addr, const valtype& nameSpace,
const valtype& key, const valtype& value);
/**
* Build a KEVA_DELETE transaction.
* @param addr The address script to append.
* @param hash The hash to use.
* @return The full KEVA_DELETE script.
*/
static CScript buildKevaDelete(const CScript& addr, const valtype& nameSpace, const valtype& key);
static void generateNamespace(const uint256& txId, int n, valtype& kaveNamespace, const CChainParams& params, bool nsFixEnabled);
static CScript replaceKevaNamespace(const CScript& oldScript, const uint256& txId, int n, valtype& kaveNamespace, const CChainParams& params, bool nsFixEnabled);
};
#endif // H_BITCOIN_SCRIPT_KEVA