Browse Source

Validated unique namespace id.

cn
Jianping Wu 6 years ago
parent
commit
1d0a0efaeb
  1. 40
      src/keva/main.cpp
  2. 5
      src/keva/main.h
  3. 1
      src/script/keva.cpp
  4. 2
      src/wallet/rpckeva.cpp

40
src/keva/main.cpp

@ -82,27 +82,26 @@ CKevaMemPool::remove (const CTxMemPoolEntry& entry)
} }
void void
CKevaMemPool::removeConflicts (const CTransaction& tx) CKevaMemPool::removeConflicts(const CTransaction& tx)
{ {
AssertLockHeld (pool.cs); AssertLockHeld (pool.cs);
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(); const NamespaceTxMap::const_iterator mit = mapNamespaceRegs.find(nameSpace);
const NamespaceTxMap::const_iterator mit = mapNamespaceRegs.find(nameSpace); if (mit != mapNamespaceRegs.end()) {
if (mit != mapNamespaceRegs.end ()) { const CTxMemPool::txiter mit2 = pool.mapTx.find(mit->second);
const CTxMemPool::txiter mit2 = pool.mapTx.find (mit->second); assert(mit2 != pool.mapTx.end());
assert (mit2 != pool.mapTx.end ()); pool.removeRecursive (mit2->GetTx(),
pool.removeRecursive (mit2->GetTx (), MemPoolRemovalReason::KEVA_CONFLICT);
MemPoolRemovalReason::KEVA_CONFLICT);
}
} }
} }
}
} }
void 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 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;
} }

5
src/keva/main.h

@ -136,6 +136,11 @@ private:
*/ */
NamespaceTxMap mapNamespaceUpdates; NamespaceTxMap mapNamespaceUpdates;
/**
* Validate that the namespace is the hash of the first TxIn.
*/
bool validateNamespace(const CTransaction& tx, const valtype& nameSpace) const;
public: public:
/** /**

1
src/script/keva.cpp

@ -98,7 +98,6 @@ CScript CKevaScript::replaceKevaNamespace(const CScript& oldScript, const uint25
const valtype& displayName = kevaOp.getOpNamespaceDisplayName(); const valtype& displayName = kevaOp.getOpNamespaceDisplayName();
kaveNamespace = ToByteVector(Hash160(ToByteVector(txId))); kaveNamespace = ToByteVector(Hash160(ToByteVector(txId)));
kaveNamespace.insert(kaveNamespace.begin(), NAMESPACE_PREFIX); kaveNamespace.insert(kaveNamespace.begin(), NAMESPACE_PREFIX);
//kaveNamespace = EncodeBase58(kaveNamespaceVal);
return CKevaScript::buildKevaNamespace(kevaOp.getAddress(), kaveNamespace, displayName); return CKevaScript::buildKevaNamespace(kevaOp.getAddress(), kaveNamespace, displayName);
} }

2
src/wallet/rpckeva.cpp

@ -72,7 +72,7 @@ UniValue keva_namespace(const JSONRPCRequest& request)
CKeyID keyId = pubKey.GetID(); 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. // For now we don't know the first txin, so use dummy name here.
// It will be replaced later in CreateTransaction. // It will be replaced later in CreateTransaction.
valtype namespaceDummy = ToByteVector(std::string(DUMMY_NAMESPACE)); valtype namespaceDummy = ToByteVector(std::string(DUMMY_NAMESPACE));

Loading…
Cancel
Save