Skip to content

Commit 9deaabf

Browse files
committed
Added implementation of asset locks
1 parent 9010b81 commit 9deaabf

33 files changed

+1444
-26
lines changed

src/Makefile.am

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,9 @@ BITCOIN_CORE_H = \
160160
cuckoocache.h \
161161
ctpl_stl.h \
162162
cxxtimer.hpp \
163+
evo/assetlocktx.h \
163164
evo/cbtx.h \
165+
evo/creditpool.h \
164166
evo/deterministicmns.h \
165167
evo/dmnstate.h \
166168
evo/evodb.h \
@@ -371,7 +373,9 @@ libbitcoin_server_a_SOURCES = \
371373
consensus/tx_verify.cpp \
372374
dbwrapper.cpp \
373375
dsnotificationinterface.cpp \
376+
evo/assetlocktx.cpp \
374377
evo/cbtx.cpp \
378+
evo/creditpool.cpp \
375379
evo/deterministicmns.cpp \
376380
evo/dmnstate.cpp \
377381
evo/evodb.cpp \

src/Makefile.test.include

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ BITCOIN_TESTS =\
243243
test/dip0020opcodes_tests.cpp \
244244
test/descriptor_tests.cpp \
245245
test/dynamic_activation_thresholds_tests.cpp \
246+
test/evo_assetlocks_tests.cpp \
246247
test/evo_deterministicmns_tests.cpp \
247248
test/evo_instantsend_tests.cpp \
248249
test/evo_simplifiedmns_tests.cpp \

src/bloom.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ bool CBloomFilter::CheckSpecialTransactionMatchesAndUpdate(const CTransaction &t
212212
case(TRANSACTION_MNHF_SIGNAL):
213213
// No additional checks for this transaction types
214214
return false;
215+
case(TRANSACTION_ASSET_LOCK):
216+
case(TRANSACTION_ASSET_UNLOCK):
217+
// TODO asset lock/unlock bloom?
218+
return false;
215219
}
216220

217221
LogPrintf("Unknown special transaction type in Bloom filter check.\n");

src/chainparams.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,14 @@ class CMainParams : public CChainParams {
250250
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nThresholdMin = 2420; // 60% of 4032
251251
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nFalloffCoeff = 5; // this corresponds to 10 periods
252252

253+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].bit = 8;
254+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nStartTime = 999999999999ULL; // TODO ENABLE BEFORE FINAL RELEASE
255+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nTimeout = 999999999999ULL; // TODO ENABLE BEFORE FINAL RELEASE
256+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nWindowSize = 4032;
257+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdStart = 3226; // 80% of 4032
258+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdMin = 2420; // 60% of 4032
259+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nFalloffCoeff = 5; // this corresponds to 10 periods
260+
253261
// The best chain should have at least this much work.
254262
consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000076f91fbc02922ce2226e"); // 1718500
255263

@@ -309,6 +317,8 @@ class CMainParams : public CChainParams {
309317
consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_60_75;
310318
consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_100_67;
311319
consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_400_85;
320+
// TODO or which one?
321+
consensus.llmqTypeDIPCreditLocks = Consensus::LLMQType::LLMQ_400_85;
312322

313323
fDefaultConsistencyChecks = false;
314324
fRequireStandard = true;
@@ -475,6 +485,14 @@ class CTestNetParams : public CChainParams {
475485
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nThresholdMin = 60; // 60% of 100
476486
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nFalloffCoeff = 5; // this corresponds to 10 periods
477487

488+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].bit = 8;
489+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nStartTime = 999999999999ULL; // TODO ENABLE BEFORE INITIAL RC
490+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nTimeout = 999999999999ULL;
491+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nWindowSize = 100;
492+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdStart = 80; // 80% of 100
493+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdMin = 60; // 60% of 60
494+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nFalloffCoeff = 5; // this corresponds to 10 periods
495+
478496
// The best chain should have at least this much work.
479497
consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000027babbb45da9fa4"); // 771500
480498

@@ -527,6 +545,8 @@ class CTestNetParams : public CChainParams {
527545
consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_60_75;
528546
consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_100_67;
529547
consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_50_60;
548+
// TODO or which one?
549+
consensus.llmqTypeDIPCreditLocks = Consensus::LLMQType::LLMQ_50_60;
530550

531551
fDefaultConsistencyChecks = false;
532552
fRequireStandard = false;
@@ -671,6 +691,14 @@ class CDevNetParams : public CChainParams {
671691
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nThresholdMin = 60; // 60% of 100
672692
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nFalloffCoeff = 5; // this corresponds to 10 periods
673693

694+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].bit = 8;
695+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nStartTime = 999999999999ULL; // TODO ENABLE
696+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nTimeout = 999999999999ULL;
697+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nWindowSize = 100;
698+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdStart = 80; // 80% of 100
699+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdMin = 60; // 60% of 60
700+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nFalloffCoeff = 5; // this corresponds to 10 periods
701+
674702
// The best chain should have at least this much work.
675703
consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000000000000000");
676704

@@ -726,6 +754,8 @@ class CDevNetParams : public CChainParams {
726754
consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_60_75;
727755
consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_100_67;
728756
consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_50_60;
757+
// TODO or which one?
758+
consensus.llmqTypeDIPCreditLocks = Consensus::LLMQType::LLMQ_50_60;
729759

730760
UpdateDevnetLLMQChainLocksFromArgs(args);
731761
UpdateDevnetLLMQInstantSendFromArgs(args);
@@ -912,6 +942,14 @@ class CRegTestParams : public CChainParams {
912942
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nThresholdMin = 180; // 60% of 300
913943
consensus.vDeployments[Consensus::DEPLOYMENT_DIP0024].nFalloffCoeff = 5; // this corresponds to 10 periods
914944

945+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].bit = 8;
946+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nStartTime = 0;
947+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nTimeout = 999999999999ULL;
948+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nWindowSize = 100;
949+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdStart = 80; // 80% of 100
950+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nThresholdMin = 60; // 60% of 100
951+
consensus.vDeployments[Consensus::DEPLOYMENT_DIPCREDITLOCKS].nFalloffCoeff = 5; // this corresponds to 10 periods
952+
915953
// The best chain should have at least this much work.
916954
consensus.nMinimumChainWork = uint256S("0x00");
917955

@@ -995,6 +1033,8 @@ class CRegTestParams : public CChainParams {
9951033
consensus.llmqTypeDIP0024InstantSend = Consensus::LLMQType::LLMQ_TEST_DIP0024;
9961034
consensus.llmqTypePlatform = Consensus::LLMQType::LLMQ_TEST;
9971035
consensus.llmqTypeMnhf = Consensus::LLMQType::LLMQ_TEST;
1036+
// TODO or which one?
1037+
consensus.llmqTypeDIPCreditLocks = Consensus::LLMQType::LLMQ_TEST;
9981038

9991039
UpdateLLMQTestParametersFromArgs(args, Consensus::LLMQType::LLMQ_TEST);
10001040
UpdateLLMQTestParametersFromArgs(args, Consensus::LLMQType::LLMQ_TEST_INSTANTSEND);

src/consensus/params.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ enum DeploymentPos {
2323
DEPLOYMENT_REALLOC, // Deployment of Block Reward Reallocation
2424
DEPLOYMENT_DIP0020, // Deployment of DIP0020, DIP0021 and LMQ_100_67 quorums
2525
DEPLOYMENT_DIP0024, // Deployment of DIP0024 (Quorum Rotation) and decreased governance proposal fee
26+
DEPLOYMENT_DIPCREDITLOCKS, // Deployment of DIP00XX (Asset Locks)
2627
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in versionbits.cpp
2728
MAX_VERSION_BITS_DEPLOYMENTS
2829
};
@@ -123,6 +124,7 @@ struct Params {
123124
LLMQType llmqTypeDIP0024InstantSend{LLMQType::LLMQ_NONE};
124125
LLMQType llmqTypePlatform{LLMQType::LLMQ_NONE};
125126
LLMQType llmqTypeMnhf{LLMQType::LLMQ_NONE};
127+
LLMQType llmqTypeDIPCreditLocks{LLMQType::LLMQ_NONE};
126128
};
127129
} // namespace Consensus
128130

src/consensus/tx_check.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,20 @@
1212

1313
bool CheckTransaction(const CTransaction& tx, CValidationState& state)
1414
{
15-
bool allowEmptyTxInOut = false;
15+
bool allowEmptyTxIn = false;
16+
bool allowEmptyTxOut = false;
1617
if (tx.nType == TRANSACTION_QUORUM_COMMITMENT) {
17-
allowEmptyTxInOut = true;
18+
allowEmptyTxIn = true;
19+
allowEmptyTxOut = true;
20+
}
21+
if (tx.nType == TRANSACTION_ASSET_UNLOCK) {
22+
allowEmptyTxIn = true;
1823
}
1924

2025
// Basic checks that don't depend on any context
21-
if (!allowEmptyTxInOut && tx.vin.empty())
26+
if (!allowEmptyTxIn && tx.vin.empty())
2227
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-txns-vin-empty");
23-
if (!allowEmptyTxInOut && tx.vout.empty())
28+
if (!allowEmptyTxOut && tx.vout.empty())
2429
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-txns-vout-empty");
2530
// Size limits
2631
if (::GetSerializeSize(tx, PROTOCOL_VERSION) > MAX_LEGACY_BLOCK_SIZE)

src/consensus/tx_verify.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <primitives/transaction.h>
99
#include <script/interpreter.h>
1010
#include <consensus/validation.h>
11+
#include <evo/assetlocktx.h>
1112

1213
// TODO remove the following dependencies
1314
#include <chain.h>
@@ -160,6 +161,21 @@ unsigned int GetTransactionSigOpCount(const CTransaction& tx, const CCoinsViewCa
160161

161162
bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee)
162163
{
164+
165+
bool isAssetUnlockTx = (tx.nVersion == 3 && tx.nType == TRANSACTION_ASSET_UNLOCK);
166+
if (isAssetUnlockTx) {
167+
CAssetUnlockPayload assetUnlockTx;
168+
if (!GetTxPayload(tx, assetUnlockTx)) {
169+
return state.Invalid(ValidationInvalidReason::TX_BAD_SPECIAL, false, REJECT_INVALID, "bad-assetunlocktx-payload");
170+
}
171+
CAmount txfee_aux = assetUnlockTx.getFee();
172+
if (!MoneyRange(txfee_aux)) {
173+
return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-txns-assetunlock-fee-outofrange");
174+
}
175+
txfee = txfee_aux;
176+
return true;
177+
}
178+
163179
// are the actual inputs available?
164180
if (!inputs.HaveInputs(tx)) {
165181
return state.Invalid(ValidationInvalidReason::TX_MISSING_INPUTS, false, REJECT_INVALID, "bad-txns-inputs-missingorspent", strprintf("%s: inputs missing/spent", __func__));

src/core_write.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include <spentindex.h>
1818

19+
#include <evo/assetlocktx.h>
1920
#include <evo/cbtx.h>
2021
#include <evo/mnhftx.h>
2122
#include <evo/providertx.h>
@@ -310,6 +311,20 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
310311
mnhfTx.ToJson(obj);
311312
entry.pushKV("mnhfTx", obj);
312313
}
314+
} else if (tx.nType == TRANSACTION_ASSET_LOCK) {
315+
CAssetLockPayload assetLockTx;
316+
if (!GetTxPayload(tx, assetLockTx)) {
317+
UniValue obj;
318+
assetLockTx.ToJson(obj);
319+
entry.pushKV("assetLockTx", obj);
320+
}
321+
} else if (tx.nType == TRANSACTION_ASSET_UNLOCK) {
322+
CAssetUnlockPayload assetUnlockTx;
323+
if (!GetTxPayload(tx, assetUnlockTx)) {
324+
UniValue obj;
325+
assetUnlockTx.ToJson(obj);
326+
entry.pushKV("assetUnlockTx", obj);
327+
}
313328
}
314329

315330
if (!hashBlock.IsNull())

0 commit comments

Comments
 (0)