Skip to content

Commit 13727af

Browse files
committed
Spark Names V2.1: tweak expiration rules for renewal and transfer
1 parent 82e0001 commit 13727af

File tree

3 files changed

+32
-15
lines changed

3 files changed

+32
-15
lines changed

src/chainparams.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@ class CMainParams : public CChainParams {
504504
consensus.nSparkNamesStartBlock = 1104500; // ~ May 28th 2025
505505
consensus.nSparkNamesFee = standardSparkNamesFee;
506506
consensus.nSparkNamesV2StartBlock = SPARK_NAME_TRANSFER_MAINNET_START_BLOCK;
507+
consensus.nSparkNamesV21StartBlock = INT_MAX;
507508
}
508509
virtual bool SkipUndoForBlock(int nHeight) const override
509510
{
@@ -820,6 +821,7 @@ class CTestNetParams : public CChainParams {
820821
consensus.nSparkNamesStartBlock = 174000;
821822
consensus.nSparkNamesFee = standardSparkNamesFee;
822823
consensus.nSparkNamesV2StartBlock = SPARK_NAME_TRANSFER_TESTNET_START_BLOCK;
824+
consensus.nSparkNamesV21StartBlock = INT_MAX;
823825
}
824826
};
825827

@@ -1078,6 +1080,7 @@ class CDevNetParams : public CChainParams {
10781080
consensus.nSparkNamesStartBlock = 3500;
10791081
consensus.nSparkNamesFee = standardSparkNamesFee;
10801082
consensus.nSparkNamesV2StartBlock = SPARK_NAME_TRANSFER_DEVNET_START_BLOCK;
1083+
consensus.nSparkNamesV21StartBlock = INT_MAX;
10811084
}
10821085
};
10831086

@@ -1333,6 +1336,7 @@ class CRegTestParams : public CChainParams {
13331336
consensus.nSparkNamesStartBlock = 2000;
13341337
consensus.nSparkNamesFee = standardSparkNamesFee;
13351338
consensus.nSparkNamesV2StartBlock = 2500;
1339+
consensus.nSparkNamesV21StartBlock = 2700;
13361340
}
13371341

13381342
void UpdateBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)

src/consensus/params.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ struct Params {
278278

279279
int nSparkNamesStartBlock;
280280
int nSparkNamesV2StartBlock; // v2 enables spark name transfer
281+
int nSparkNamesV21StartBlock; // v2.1 tweaks rules for renewals and transfers
281282
std::array<int,21> nSparkNamesFee;
282283

283284
int nLelantusGracefulPeriod;

src/sparkname.cpp

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,35 @@ bool CSparkNameManager::CheckSparkNameTx(const CTransaction &tx, int nHeight, CV
174174
if (!IsSparkNameValid(sparkNameData.name))
175175
return state.DoS(100, error("CheckSparkNameTx: invalid name"));
176176

177+
int existingExpirationHeight = -1;
178+
bool fUpdateExistingRecord = false;
179+
bool fSparkNameTransfer = sparkNameData.nVersion >= 2 && sparkNameData.operationType == (uint8_t)CSparkNameTxData::opTransfer;
180+
181+
if (sparkNames.count(ToUpper(sparkNameData.name)) > 0) {
182+
// it's possible to change any metadata of the existing name but if the spark address is being
183+
// tranferred, new name shouldn't be already registered
184+
if (!fSparkNameTransfer && sparkNames[ToUpper(sparkNameData.name)].sparkAddress != sparkNameData.sparkAddress)
185+
return state.DoS(100, error("CheckSparkNameTx: name already exists"));
186+
187+
fUpdateExistingRecord = true;
188+
existingExpirationHeight = sparkNames[ToUpper(sparkNameData.name)].sparkNameValidityHeight;
189+
}
190+
177191
constexpr int nBlockPerYear = 365*24*24; // 24 blocks per hour
178-
int nYears = (sparkNameData.sparkNameValidityBlocks + nBlockPerYear-1) / nBlockPerYear;
192+
int validityBlocks = sparkNameData.sparkNameValidityBlocks;
193+
if (nHeight >= consensusParams.nSparkNamesV21StartBlock) {
194+
if (existingExpirationHeight != -1)
195+
validityBlocks = std::max(validityBlocks, existingExpirationHeight - nHeight + validityBlocks);
196+
// after nSparkNamesV21StartBlock, max validity is 15 years
197+
if (validityBlocks > nBlockPerYear * 15)
198+
return state.DoS(100, error("CheckSparkNameTx: can't be valid for more than 15 years"));
199+
}
200+
else {
201+
if (validityBlocks > nBlockPerYear * 10)
202+
return state.DoS(100, error("CheckSparkNameTx: can't be valid for more than 10 years"));
203+
}
179204

180-
if (sparkNameData.sparkNameValidityBlocks > nBlockPerYear * 10)
181-
return state.DoS(100, error("CheckSparkNameTx: can't be valid for more than 10 years"));
205+
int nYears = (validityBlocks + nBlockPerYear-1) / nBlockPerYear;
182206

183207
CAmount nameFee = consensusParams.nSparkNamesFee[sparkNameData.name.size()] * COIN * nYears;
184208

@@ -196,18 +220,6 @@ bool CSparkNameManager::CheckSparkNameTx(const CTransaction &tx, int nHeight, CV
196220
if (sparkNameData.additionalInfo.size() > 1024)
197221
return state.DoS(100, error("CheckSparkNameTx: additional info is too long"));
198222

199-
bool fUpdateExistingRecord = false;
200-
bool fSparkNameTransfer = sparkNameData.nVersion >= 2 && sparkNameData.operationType == (uint8_t)CSparkNameTxData::opTransfer;
201-
202-
if (sparkNames.count(ToUpper(sparkNameData.name)) > 0) {
203-
// it's possible to change any metadata of the existing name but if the spark address is being
204-
// tranferred, new name shouldn't be already registered
205-
if (!fSparkNameTransfer && sparkNames[ToUpper(sparkNameData.name)].sparkAddress != sparkNameData.sparkAddress)
206-
return state.DoS(100, error("CheckSparkNameTx: name already exists"));
207-
208-
fUpdateExistingRecord = true;
209-
}
210-
211223
{
212224
LOCK(cs_spark_name);
213225
if ((fSparkNameTransfer || !fUpdateExistingRecord) && sparkNameAddresses.count(sparkNameData.sparkAddress) > 0)

0 commit comments

Comments
 (0)