|
|
@ -89,8 +89,7 @@ CKevaMemPool::removeConflicts (const CTransaction& tx) |
|
|
|
if (!tx.IsKevacoin ()) |
|
|
|
if (!tx.IsKevacoin ()) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
for (const auto& txout : tx.vout) |
|
|
|
for (const auto& txout : tx.vout) { |
|
|
|
{ |
|
|
|
|
|
|
|
const CKevaScript nameOp(txout.scriptPubKey); |
|
|
|
const CKevaScript nameOp(txout.scriptPubKey); |
|
|
|
if (nameOp.isKevaOp() && nameOp.getKevaOp() == OP_KEVA_PUT) { |
|
|
|
if (nameOp.isKevaOp() && nameOp.getKevaOp() == OP_KEVA_PUT) { |
|
|
|
const valtype& nameSpace = nameOp.getOpNamespace(); |
|
|
|
const valtype& nameSpace = nameOp.getOpNamespace(); |
|
|
@ -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 |
|
|
|
bool |
|
|
|
CKevaMemPool::checkTx (const CTransaction& tx) const |
|
|
|
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, |
|
|
|
mempool at once (building upon each other). This is disallowed, though, |
|
|
|
since the current mempool implementation does not like it. (We keep |
|
|
|
since the current mempool implementation does not like it. (We keep |
|
|
|
track of only a single update tx for each name.) */ |
|
|
|
track of only a single update tx for each name.) */ |
|
|
|
|
|
|
|
|
|
|
|
for (const auto& txout : tx.vout) { |
|
|
|
for (const auto& txout : tx.vout) { |
|
|
|
const CKevaScript nameOp(txout.scriptPubKey); |
|
|
|
const CKevaScript nameOp(txout.scriptPubKey); |
|
|
|
if (!nameOp.isKevaOp ()) |
|
|
|
if (!nameOp.isKevaOp ()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
switch (nameOp.getKevaOp ()) { |
|
|
|
switch (nameOp.getKevaOp ()) { |
|
|
|
case OP_KEVA_NAMESPACE: |
|
|
|
case OP_KEVA_NAMESPACE: |
|
|
|
{ |
|
|
|
{ |
|
|
|
const valtype& nameSpace = nameOp.getOpNamespace(); |
|
|
|
const valtype& nameSpace = nameOp.getOpNamespace(); |
|
|
|
std::map<valtype, uint256>::const_iterator mi; |
|
|
|
std::map<valtype, uint256>::const_iterator mi; |
|
|
|
mi = mapNamespaceRegs.find(nameSpace); |
|
|
|
mi = mapNamespaceRegs.find(nameSpace); |
|
|
|
if (mi != mapNamespaceRegs.end ()) |
|
|
|
if (mi != mapNamespaceRegs.end ()) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!validateNamespace(tx, nameSpace)) { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|