|
|
@ -63,7 +63,6 @@ BOOST_AUTO_TEST_CASE(keva_scripts) |
|
|
|
BOOST_CHECK(opNew.getKevaOp() == OP_KEVA_NAMESPACE); |
|
|
|
BOOST_CHECK(opNew.getKevaOp() == OP_KEVA_NAMESPACE); |
|
|
|
BOOST_CHECK(opNew.getOpNamespace() == nameSpace); |
|
|
|
BOOST_CHECK(opNew.getOpNamespace() == nameSpace); |
|
|
|
|
|
|
|
|
|
|
|
//SelectParams(CBaseChainParams::MAIN);
|
|
|
|
|
|
|
|
const uint256 txId = uint256S("0x78f49add562dc33e4cd61aa45c54012509ed4a53308908dd07f5634437939273"); |
|
|
|
const uint256 txId = uint256S("0x78f49add562dc33e4cd61aa45c54012509ed4a53308908dd07f5634437939273"); |
|
|
|
valtype actualNamespace; |
|
|
|
valtype actualNamespace; |
|
|
|
script = CKevaScript::replaceKevaNamespace(script, txId, actualNamespace, Params()); |
|
|
|
script = CKevaScript::replaceKevaNamespace(script, txId, actualNamespace, Params()); |
|
|
@ -701,7 +700,7 @@ BOOST_AUTO_TEST_CASE (name_tx_verification) |
|
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************** */ |
|
|
|
/* ************************************************************************** */ |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(name_updates_undo) |
|
|
|
BOOST_AUTO_TEST_CASE(keva_updates_undo) |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* Enable name history to test this on the go. */ |
|
|
|
/* Enable name history to test this on the go. */ |
|
|
|
fNameHistory = true; |
|
|
|
fNameHistory = true; |
|
|
@ -777,148 +776,104 @@ BOOST_AUTO_TEST_CASE(name_updates_undo) |
|
|
|
BOOST_CHECK(undo.vkevaundo.empty()); |
|
|
|
BOOST_CHECK(undo.vkevaundo.empty()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************** */ |
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************** */ |
|
|
|
/* ************************************************************************** */ |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE (name_mempool) |
|
|
|
BOOST_AUTO_TEST_CASE(keva_mempool) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(mempool.cs); |
|
|
|
LOCK(mempool.cs); |
|
|
|
mempool.clear(); |
|
|
|
mempool.clear(); |
|
|
|
|
|
|
|
|
|
|
|
const valtype nameReg = ValtypeFromString ("name-reg"); |
|
|
|
const valtype nameSpace1 = ValtypeFromString ("namespace-dummy-1"); |
|
|
|
const valtype nameUpd = ValtypeFromString ("name-upd"); |
|
|
|
const valtype nameSpace2 = ValtypeFromString ("namespace-dummy-2"); |
|
|
|
const valtype value = ValtypeFromString ("value"); |
|
|
|
const valtype displayName = ValtypeFromString ("display name"); |
|
|
|
|
|
|
|
const valtype keyA = ValtypeFromString ("key-a"); |
|
|
|
|
|
|
|
const valtype keyB = ValtypeFromString ("key-b"); |
|
|
|
const valtype valueA = ValtypeFromString ("value-a"); |
|
|
|
const valtype valueA = ValtypeFromString ("value-a"); |
|
|
|
const valtype valueB = ValtypeFromString ("value-b"); |
|
|
|
const valtype valueB = ValtypeFromString ("value-b"); |
|
|
|
const CScript addr = getTestAddress(); |
|
|
|
const CScript addr = getTestAddress(); |
|
|
|
|
|
|
|
|
|
|
|
const valtype rand1(20, 'a'); |
|
|
|
|
|
|
|
const valtype rand2(20, 'b'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const uint160 hash1 = Hash160 (rand1); |
|
|
|
|
|
|
|
const uint160 hash2 = Hash160 (rand2); |
|
|
|
|
|
|
|
const valtype vchHash1(hash1.begin (), hash1.end ()); |
|
|
|
|
|
|
|
const valtype vchHash2(hash2.begin (), hash2.end ()); |
|
|
|
|
|
|
|
const CScript addr2 = (CScript (addr) << OP_RETURN); |
|
|
|
const CScript addr2 = (CScript (addr) << OP_RETURN); |
|
|
|
|
|
|
|
|
|
|
|
const CScript new1 |
|
|
|
const CScript new1 = CKevaScript::buildKevaNamespace(addr, nameSpace1, displayName); |
|
|
|
= CNameScript::buildNameNew (addr, hash1); |
|
|
|
const CScript new2 = CKevaScript::buildKevaNamespace(addr, nameSpace2, displayName); |
|
|
|
const CScript new1p |
|
|
|
const CScript upd1 = CKevaScript::buildKevaPut(addr, nameSpace1, keyA, valueA); |
|
|
|
= CNameScript::buildNameNew (addr2, hash1); |
|
|
|
const CScript upd2 = CKevaScript::buildKevaPut(addr, nameSpace2, keyB, valueB); |
|
|
|
const CScript new2 |
|
|
|
|
|
|
|
= CNameScript::buildNameNew (addr, hash2); |
|
|
|
|
|
|
|
const CScript first1 |
|
|
|
|
|
|
|
= CNameScript::buildNameFirstupdate (addr, nameReg, value, rand1); |
|
|
|
|
|
|
|
const CScript first2 |
|
|
|
|
|
|
|
= CNameScript::buildNameFirstupdate (addr, nameReg, value, rand2); |
|
|
|
|
|
|
|
const CScript upd1 = CNameScript::buildNameUpdate (addr, nameUpd, valueA); |
|
|
|
|
|
|
|
const CScript upd2 = CNameScript::buildNameUpdate (addr, nameUpd, valueB); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* The constructed tx needs not be valid. We only test
|
|
|
|
/* The constructed tx needs not be valid. We only test
|
|
|
|
the mempool acceptance and not validation. */ |
|
|
|
the mempool acceptance and not validation. */ |
|
|
|
|
|
|
|
|
|
|
|
CMutableTransaction txNew1; |
|
|
|
CMutableTransaction txNew1; |
|
|
|
txNew1.SetNamecoin (); |
|
|
|
txNew1.SetKevacoin(); |
|
|
|
txNew1.vout.push_back(CTxOut(COIN, new1)); |
|
|
|
txNew1.vout.push_back(CTxOut(COIN, new1)); |
|
|
|
CMutableTransaction txNew1p; |
|
|
|
|
|
|
|
txNew1p.SetNamecoin (); |
|
|
|
|
|
|
|
txNew1p.vout.push_back (CTxOut (COIN, new1p)); |
|
|
|
|
|
|
|
CMutableTransaction txNew2; |
|
|
|
CMutableTransaction txNew2; |
|
|
|
txNew2.SetNamecoin (); |
|
|
|
txNew2.SetKevacoin(); |
|
|
|
txNew2.vout.push_back(CTxOut(COIN, new2)); |
|
|
|
txNew2.vout.push_back(CTxOut(COIN, new2)); |
|
|
|
|
|
|
|
|
|
|
|
CMutableTransaction txReg1; |
|
|
|
|
|
|
|
txReg1.SetNamecoin (); |
|
|
|
|
|
|
|
txReg1.vout.push_back (CTxOut (COIN, first1)); |
|
|
|
|
|
|
|
CMutableTransaction txReg2; |
|
|
|
|
|
|
|
txReg2.SetNamecoin (); |
|
|
|
|
|
|
|
txReg2.vout.push_back (CTxOut (COIN, first2)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CMutableTransaction txUpd1; |
|
|
|
CMutableTransaction txUpd1; |
|
|
|
txUpd1.SetNamecoin (); |
|
|
|
txUpd1.SetKevacoin(); |
|
|
|
txUpd1.vout.push_back(CTxOut(COIN, upd1)); |
|
|
|
txUpd1.vout.push_back(CTxOut(COIN, upd1)); |
|
|
|
CMutableTransaction txUpd2; |
|
|
|
CMutableTransaction txUpd2; |
|
|
|
txUpd2.SetNamecoin (); |
|
|
|
txUpd2.SetKevacoin(); |
|
|
|
txUpd2.vout.push_back(CTxOut(COIN, upd2)); |
|
|
|
txUpd2.vout.push_back(CTxOut(COIN, upd2)); |
|
|
|
|
|
|
|
|
|
|
|
/* Build an invalid transaction. It should not crash (assert fail)
|
|
|
|
/* Build an invalid transaction. It should not crash (assert fail)
|
|
|
|
the mempool check. */ |
|
|
|
the mempool check. */ |
|
|
|
|
|
|
|
|
|
|
|
CMutableTransaction txInvalid; |
|
|
|
CMutableTransaction txInvalid; |
|
|
|
txInvalid.SetNamecoin (); |
|
|
|
txInvalid.SetKevacoin(); |
|
|
|
mempool.checkNameOps (txInvalid); |
|
|
|
mempool.checkKevaOps(txInvalid); |
|
|
|
|
|
|
|
|
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, new1)); |
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, new1)); |
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, new2)); |
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, new2)); |
|
|
|
txInvalid.vout.push_back (CTxOut (COIN, first1)); |
|
|
|
|
|
|
|
txInvalid.vout.push_back (CTxOut (COIN, first2)); |
|
|
|
|
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, upd1)); |
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, upd1)); |
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, upd2)); |
|
|
|
txInvalid.vout.push_back(CTxOut (COIN, upd2)); |
|
|
|
mempool.checkNameOps (txInvalid); |
|
|
|
mempool.checkKevaOps(txInvalid); |
|
|
|
|
|
|
|
|
|
|
|
/* For an empty mempool, all tx should be fine. */ |
|
|
|
/* For an empty mempool, all tx should be fine. */ |
|
|
|
BOOST_CHECK (!mempool.registersName (nameReg)); |
|
|
|
std::vector<std::tuple<valtype, valtype, uint256>> unconfirmedNamespace; |
|
|
|
BOOST_CHECK (!mempool.updatesName (nameUpd)); |
|
|
|
mempool.getUnconfirmedNamespaceList(unconfirmedNamespace); |
|
|
|
BOOST_CHECK (mempool.checkNameOps (txNew1) && mempool.checkNameOps (txNew1p) |
|
|
|
BOOST_CHECK(unconfirmedNamespace.size() == 0); |
|
|
|
&& mempool.checkNameOps (txNew2)); |
|
|
|
|
|
|
|
BOOST_CHECK (mempool.checkNameOps (txReg1) && mempool.checkNameOps (txReg2)); |
|
|
|
|
|
|
|
BOOST_CHECK (mempool.checkNameOps (txUpd1) && mempool.checkNameOps (txUpd2)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Add name_new's with "stealing" check. */ |
|
|
|
|
|
|
|
const LockPoints lp; |
|
|
|
|
|
|
|
const CTxMemPoolEntry entryNew1(MakeTransactionRef(txNew1), 0, 0, 100, |
|
|
|
|
|
|
|
false, 1, lp); |
|
|
|
|
|
|
|
const CTxMemPoolEntry entryNew2(MakeTransactionRef(txNew2), 0, 0, 100, |
|
|
|
|
|
|
|
false, 1, lp); |
|
|
|
|
|
|
|
BOOST_CHECK (entryNew1.isNameNew () && entryNew2.isNameNew ()); |
|
|
|
|
|
|
|
BOOST_CHECK (entryNew1.getNameNewHash () == vchHash1 |
|
|
|
|
|
|
|
&& entryNew2.getNameNewHash () == vchHash2); |
|
|
|
|
|
|
|
mempool.addUnchecked (entryNew1.GetTx ().GetHash (), entryNew1); |
|
|
|
|
|
|
|
mempool.addUnchecked (entryNew2.GetTx ().GetHash (), entryNew2); |
|
|
|
|
|
|
|
BOOST_CHECK (!mempool.checkNameOps (txNew1p)); |
|
|
|
|
|
|
|
BOOST_CHECK (mempool.checkNameOps (txNew1) && mempool.checkNameOps (txNew2)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Add a name registration. */ |
|
|
|
/* Add a name registration. */ |
|
|
|
const CTxMemPoolEntry entryReg(MakeTransactionRef(txReg1), 0, 0, 100, |
|
|
|
const LockPoints lp; |
|
|
|
|
|
|
|
const CTxMemPoolEntry entryReg(MakeTransactionRef(txNew1), 0, 0, 100, |
|
|
|
false, 1, lp); |
|
|
|
false, 1, lp); |
|
|
|
BOOST_CHECK (entryReg.isNameRegistration () && !entryReg.isNameUpdate ()); |
|
|
|
BOOST_CHECK(entryReg.isNamespaceRegistration() && !entryReg.isKeyUpdate()); |
|
|
|
BOOST_CHECK (entryReg.getName () == nameReg); |
|
|
|
BOOST_CHECK(entryReg.getNamespace() == nameSpace1); |
|
|
|
mempool.addUnchecked(entryReg.GetTx().GetHash(), entryReg); |
|
|
|
mempool.addUnchecked(entryReg.GetTx().GetHash(), entryReg); |
|
|
|
BOOST_CHECK (mempool.registersName (nameReg)); |
|
|
|
mempool.getUnconfirmedNamespaceList(unconfirmedNamespace); |
|
|
|
BOOST_CHECK (!mempool.updatesName (nameReg)); |
|
|
|
BOOST_CHECK(unconfirmedNamespace.size() == 1); |
|
|
|
BOOST_CHECK (!mempool.checkNameOps (txReg2) && mempool.checkNameOps (txUpd1)); |
|
|
|
BOOST_CHECK(std::get<0>(unconfirmedNamespace[0]) == nameSpace1); |
|
|
|
|
|
|
|
|
|
|
|
/* Add a name update. */ |
|
|
|
/* Add a name update. */ |
|
|
|
const CTxMemPoolEntry entryUpd(MakeTransactionRef(txUpd1), 0, 0, 100, |
|
|
|
const CTxMemPoolEntry entryUpd(MakeTransactionRef(txUpd1), 0, 0, 100, |
|
|
|
false, 1, lp); |
|
|
|
false, 1, lp); |
|
|
|
BOOST_CHECK (!entryUpd.isNameRegistration () && entryUpd.isNameUpdate ()); |
|
|
|
BOOST_CHECK(!entryUpd.isNamespaceRegistration() && entryUpd.isKeyUpdate()); |
|
|
|
BOOST_CHECK (entryUpd.getName () == nameUpd); |
|
|
|
BOOST_CHECK(entryUpd.getNamespace() == nameSpace1); |
|
|
|
mempool.addUnchecked (entryUpd.GetTx().GetHash(), entryUpd); |
|
|
|
mempool.addUnchecked (entryUpd.GetTx().GetHash(), entryUpd); |
|
|
|
BOOST_CHECK (!mempool.registersName (nameUpd)); |
|
|
|
valtype valResult; |
|
|
|
BOOST_CHECK (mempool.updatesName (nameUpd)); |
|
|
|
mempool.getUnconfirmedKeyValue(nameSpace1, keyA, valResult); |
|
|
|
BOOST_CHECK (!mempool.checkNameOps (txUpd2)); |
|
|
|
BOOST_CHECK(valResult == valueA); |
|
|
|
|
|
|
|
std::vector<std::tuple<valtype, valtype, valtype, uint256>> keyValueList; |
|
|
|
/* Check getTxForName. */ |
|
|
|
mempool.getUnconfirmedKeyValueList(keyValueList, nameSpace1); |
|
|
|
BOOST_CHECK (mempool.getTxForName (nameReg) == txReg1.GetHash ()); |
|
|
|
BOOST_CHECK(keyValueList.size() == 1); |
|
|
|
BOOST_CHECK (mempool.getTxForName (nameUpd) == txUpd1.GetHash ()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Run mempool sanity check. */ |
|
|
|
/* Run mempool sanity check. */ |
|
|
|
|
|
|
|
#if 0 |
|
|
|
CCoinsViewCache view(pcoinsTip.get()); |
|
|
|
CCoinsViewCache view(pcoinsTip.get()); |
|
|
|
const CNameScript nameOp(upd1); |
|
|
|
const CKevaScript nameOp(upd1); |
|
|
|
CNameData data; |
|
|
|
CKevaData data; |
|
|
|
data.fromScript(100, COutPoint (uint256(), 0), nameOp); |
|
|
|
data.fromScript(100, COutPoint (uint256(), 0), nameOp); |
|
|
|
view.SetName(nameUpd, data, false); |
|
|
|
view.SetName(nameUpd, data, false); |
|
|
|
mempool.checkNames(&view); |
|
|
|
mempool.checkNames(&view); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* Remove the transactions again. */ |
|
|
|
/* Remove the transactions again. */ |
|
|
|
|
|
|
|
mempool.removeRecursive(txNew1); |
|
|
|
mempool.removeRecursive (txReg1); |
|
|
|
std::vector<std::tuple<valtype, valtype, uint256>> unconfirmedNS; |
|
|
|
BOOST_CHECK (!mempool.registersName (nameReg)); |
|
|
|
mempool.getUnconfirmedNamespaceList(unconfirmedNS); |
|
|
|
BOOST_CHECK (mempool.checkNameOps (txReg1) && mempool.checkNameOps (txReg2)); |
|
|
|
BOOST_CHECK(unconfirmedNS.size() == 0); |
|
|
|
BOOST_CHECK (!mempool.checkNameOps (txUpd2)); |
|
|
|
#if 0 |
|
|
|
|
|
|
|
|
|
|
|
mempool.removeRecursive(txUpd1); |
|
|
|
mempool.removeRecursive(txUpd1); |
|
|
|
BOOST_CHECK(!mempool.updatesName (nameUpd)); |
|
|
|
BOOST_CHECK(!mempool.updatesName (nameUpd)); |
|
|
|
BOOST_CHECK(mempool.checkNameOps (txUpd1) && mempool.checkNameOps (txUpd2)); |
|
|
|
BOOST_CHECK(mempool.checkNameOps (txUpd1) && mempool.checkNameOps (txUpd2)); |
|
|
@ -984,10 +939,9 @@ BOOST_AUTO_TEST_CASE (name_mempool) |
|
|
|
} |
|
|
|
} |
|
|
|
BOOST_CHECK(!mempool.registersName (nameReg)); |
|
|
|
BOOST_CHECK(!mempool.registersName (nameReg)); |
|
|
|
BOOST_CHECK(mempool.mapTx.empty()); |
|
|
|
BOOST_CHECK(mempool.mapTx.empty()); |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* ************************************************************************** */ |
|
|
|
/* ************************************************************************** */ |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|