diff --git a/src/Makefile.am b/src/Makefile.am index edbf2936b0f38..ee32ddc5ed64c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -169,8 +169,10 @@ BITCOIN_CORE_H = \ cuckoocache.h \ ctpl_stl.h \ cxxtimer.hpp \ + evo/assetlocktx.h \ evo/dmn_types.h \ evo/cbtx.h \ + evo/creditpool.h \ evo/deterministicmns.h \ evo/dmnstate.h \ evo/evodb.h \ @@ -320,6 +322,7 @@ BITCOIN_CORE_H = \ util/underlying.h \ util/serfloat.h \ util/settings.h \ + util/skip_set.h \ util/sock.h \ util/string.h \ util/time.h \ @@ -384,7 +387,9 @@ libbitcoin_server_a_SOURCES = \ consensus/tx_verify.cpp \ dbwrapper.cpp \ dsnotificationinterface.cpp \ + evo/assetlocktx.cpp \ evo/cbtx.cpp \ + evo/creditpool.cpp \ evo/deterministicmns.cpp \ evo/dmnstate.cpp \ evo/evodb.cpp \ @@ -731,6 +736,7 @@ libbitcoin_util_a_SOURCES = \ util/message.cpp \ util/moneystr.cpp \ util/settings.cpp \ + util/skip_set.cpp \ util/spanparsing.cpp \ util/strencodings.cpp \ util/time.cpp \ diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 7152329f7acc3..c48eacf1c057c 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -95,6 +95,7 @@ BITCOIN_TESTS =\ test/dip0020opcodes_tests.cpp \ test/descriptor_tests.cpp \ test/dynamic_activation_thresholds_tests.cpp \ + test/evo_assetlocks_tests.cpp \ test/evo_deterministicmns_tests.cpp \ test/evo_instantsend_tests.cpp \ test/evo_simplifiedmns_tests.cpp \ diff --git a/src/bloom.cpp b/src/bloom.cpp index d8c2e6dac50cb..2c30ce4aaee1c 100644 --- a/src/bloom.cpp +++ b/src/bloom.cpp @@ -194,6 +194,10 @@ bool CBloomFilter::CheckSpecialTransactionMatchesAndUpdate(const CTransaction &t case(TRANSACTION_MNHF_SIGNAL): // No additional checks for this transaction types return false; + case(TRANSACTION_ASSET_LOCK): + case(TRANSACTION_ASSET_UNLOCK): + // TODO asset lock/unlock bloom? + return false; } LogPrintf("Unknown special transaction type in Bloom filter check.\n"); diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e2d563e84c859..523f38c8f8581 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -250,6 +250,7 @@ class CMainParams : public CChainParams { consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_60_75; consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_100_67; consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_400_85; + consensus.llmqTypeAssetLocks = Consensus::LLMQType::LLMQ_400_85; fDefaultConsistencyChecks = false; fRequireStandard = true; @@ -431,6 +432,7 @@ class CTestNetParams : public CChainParams { consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_60_75; consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_25_67; consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_50_60; + consensus.llmqTypeAssetLocks = Consensus::LLMQType::LLMQ_50_60; fDefaultConsistencyChecks = false; fRequireStandard = false; @@ -595,6 +597,7 @@ class CDevNetParams : public CChainParams { consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_60_75; consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_100_67; consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_50_60; + consensus.llmqTypeAssetLocks = Consensus::LLMQType::LLMQ_50_60; UpdateDevnetLLMQChainLocksFromArgs(args); UpdateDevnetLLMQInstantSendFromArgs(args); @@ -859,6 +862,7 @@ class CRegTestParams : public CChainParams { consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_TEST_DIP0024; consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_TEST_PLATFORM; consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_TEST; + consensus.llmqTypeAssetLocks = Consensus::LLMQType::LLMQ_TEST; UpdateLLMQTestParametersFromArgs(args, Consensus::LLMQType::LLMQ_TEST); UpdateLLMQTestParametersFromArgs(args, Consensus::LLMQType::LLMQ_TEST_INSTANTSEND); diff --git a/src/consensus/params.h b/src/consensus/params.h index b87cdba5dde05..d521988e9e0cf 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -126,6 +126,7 @@ struct Params { LLMQType llmqTypeDIP0024InstantSend{LLMQType::LLMQ_NONE}; LLMQType llmqTypePlatform{LLMQType::LLMQ_NONE}; LLMQType llmqTypeMnhf{LLMQType::LLMQ_NONE}; + LLMQType llmqTypeAssetLocks{LLMQType::LLMQ_NONE}; }; } // namespace Consensus diff --git a/src/consensus/tx_check.cpp b/src/consensus/tx_check.cpp index dff067b685a4c..5c54c4e4242a9 100644 --- a/src/consensus/tx_check.cpp +++ b/src/consensus/tx_check.cpp @@ -12,15 +12,20 @@ bool CheckTransaction(const CTransaction& tx, TxValidationState& state) { - bool allowEmptyTxInOut = false; + bool allowEmptyTxIn = false; + bool allowEmptyTxOut = false; if (tx.nType == TRANSACTION_QUORUM_COMMITMENT) { - allowEmptyTxInOut = true; + allowEmptyTxIn = true; + allowEmptyTxOut = true; + } + if (tx.nType == TRANSACTION_ASSET_UNLOCK) { + allowEmptyTxIn = true; } // Basic checks that don't depend on any context - if (!allowEmptyTxInOut && tx.vin.empty()) + if (!allowEmptyTxIn && tx.vin.empty()) return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-vin-empty"); - if (!allowEmptyTxInOut && tx.vout.empty()) + if (!allowEmptyTxOut && tx.vout.empty()) return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-vout-empty"); // Size limits if (::GetSerializeSize(tx, PROTOCOL_VERSION) > MAX_LEGACY_BLOCK_SIZE) diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp index 58f1b2fc0bd3f..e7fcc762d44c7 100644 --- a/src/consensus/tx_verify.cpp +++ b/src/consensus/tx_verify.cpp @@ -8,6 +8,7 @@ #include #include