mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-01-14 00:58:09 +00:00
Validated unique namespace id.
This commit is contained in:
parent
e23a5a6fe8
commit
1d0a0efaeb
@ -82,27 +82,26 @@ CKevaMemPool::remove (const CTxMemPoolEntry& entry)
|
||||
}
|
||||
|
||||
void
|
||||
CKevaMemPool::removeConflicts (const CTransaction& tx)
|
||||
CKevaMemPool::removeConflicts(const CTransaction& tx)
|
||||
{
|
||||
AssertLockHeld (pool.cs);
|
||||
|
||||
if (!tx.IsKevacoin ())
|
||||
return;
|
||||
|
||||
for (const auto& txout : tx.vout)
|
||||
{
|
||||
const CKevaScript nameOp(txout.scriptPubKey);
|
||||
if (nameOp.isKevaOp () && nameOp.getKevaOp () == OP_KEVA_PUT) {
|
||||
const valtype& nameSpace = nameOp.getOpNamespace();
|
||||
const NamespaceTxMap::const_iterator mit = mapNamespaceRegs.find(nameSpace);
|
||||
if (mit != mapNamespaceRegs.end ()) {
|
||||
const CTxMemPool::txiter mit2 = pool.mapTx.find (mit->second);
|
||||
assert (mit2 != pool.mapTx.end ());
|
||||
pool.removeRecursive (mit2->GetTx (),
|
||||
MemPoolRemovalReason::KEVA_CONFLICT);
|
||||
}
|
||||
for (const auto& txout : tx.vout) {
|
||||
const CKevaScript nameOp(txout.scriptPubKey);
|
||||
if (nameOp.isKevaOp() && nameOp.getKevaOp() == OP_KEVA_PUT) {
|
||||
const valtype& nameSpace = nameOp.getOpNamespace();
|
||||
const NamespaceTxMap::const_iterator mit = mapNamespaceRegs.find(nameSpace);
|
||||
if (mit != mapNamespaceRegs.end()) {
|
||||
const CTxMemPool::txiter mit2 = pool.mapTx.find(mit->second);
|
||||
assert(mit2 != pool.mapTx.end());
|
||||
pool.removeRecursive (mit2->GetTx(),
|
||||
MemPoolRemovalReason::KEVA_CONFLICT);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -178,6 +177,13 @@ CKevaMemPool::check(const CCoinsView& coins) const
|
||||
}
|
||||
}
|
||||
|
||||
bool CKevaMemPool::validateNamespace(const CTransaction& tx, const valtype& nameSpace) const
|
||||
{
|
||||
valtype kevaNamespace = ToByteVector(Hash160(ToByteVector(tx.vin[0].prevout.hash)));
|
||||
kevaNamespace.insert(kevaNamespace.begin(), CKevaScript::NAMESPACE_PREFIX);
|
||||
return kevaNamespace == nameSpace;
|
||||
}
|
||||
|
||||
bool
|
||||
CKevaMemPool::checkTx (const CTransaction& tx) const
|
||||
{
|
||||
@ -190,20 +196,22 @@ CKevaMemPool::checkTx (const CTransaction& tx) const
|
||||
mempool at once (building upon each other). This is disallowed, though,
|
||||
since the current mempool implementation does not like it. (We keep
|
||||
track of only a single update tx for each name.) */
|
||||
|
||||
for (const auto& txout : tx.vout) {
|
||||
const CKevaScript nameOp(txout.scriptPubKey);
|
||||
if (!nameOp.isKevaOp ())
|
||||
continue;
|
||||
|
||||
switch (nameOp.getKevaOp ()) {
|
||||
case OP_KEVA_NAMESPACE:
|
||||
{
|
||||
const valtype& nameSpace = nameOp.getOpNamespace();
|
||||
std::map<valtype, uint256>::const_iterator mi;
|
||||
mi = mapNamespaceRegs.find(nameSpace);
|
||||
if (mi != mapNamespaceRegs.end ())
|
||||
if (mi != mapNamespaceRegs.end ()) {
|
||||
return false;
|
||||
}
|
||||
if (!validateNamespace(tx, nameSpace)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -136,6 +136,11 @@ private:
|
||||
*/
|
||||
NamespaceTxMap mapNamespaceUpdates;
|
||||
|
||||
/**
|
||||
* Validate that the namespace is the hash of the first TxIn.
|
||||
*/
|
||||
bool validateNamespace(const CTransaction& tx, const valtype& nameSpace) const;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
|
@ -98,7 +98,6 @@ CScript CKevaScript::replaceKevaNamespace(const CScript& oldScript, const uint25
|
||||
const valtype& displayName = kevaOp.getOpNamespaceDisplayName();
|
||||
kaveNamespace = ToByteVector(Hash160(ToByteVector(txId)));
|
||||
kaveNamespace.insert(kaveNamespace.begin(), NAMESPACE_PREFIX);
|
||||
//kaveNamespace = EncodeBase58(kaveNamespaceVal);
|
||||
return CKevaScript::buildKevaNamespace(kevaOp.getAddress(), kaveNamespace, displayName);
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,7 @@ UniValue keva_namespace(const JSONRPCRequest& request)
|
||||
|
||||
CKeyID keyId = pubKey.GetID();
|
||||
|
||||
// The namespace name is: Hash160("first txin" || displayName)
|
||||
// The namespace name is: Hash160("first txin")
|
||||
// For now we don't know the first txin, so use dummy name here.
|
||||
// It will be replaced later in CreateTransaction.
|
||||
valtype namespaceDummy = ToByteVector(std::string(DUMMY_NAMESPACE));
|
||||
|
Loading…
Reference in New Issue
Block a user