@@ -120,9 +120,31 @@ CreditPoolCb CCreditPoolManager::getCreditPool(const CBlockIndex* block_index, c
120120 blockUnlocked += unlocked;
121121 indexes.add (index);
122122 }
123- LogPrintf (" getCreditPool block %s unlocked %lld\n " , block_hash.ToString (), blockUnlocked);
124123
125- CreditPoolCb pool{cbTx.assetLockedAmount , prev.totalUnlocked + blockUnlocked, indexes};
124+ const CAmount locked = cbTx.assetLockedAmount ;
125+ const CAmount previousLimit = prev.currentLimit ;
126+ if (previousLimit < blockUnlocked) {
127+ throw std::runtime_error (strprintf (" %s: getCreditPool failed because previous block %s exceed limits" , __func__, block_hash.ToString ()));
128+ }
129+ // # max(100, min(.10 * assetlockpool, 1000))
130+ CAmount currentLimitCandidate = locked;
131+ if (currentLimitCandidate > LimitAmountLow) {
132+ currentLimitCandidate = std::max (LimitAmountLow, locked / 10 );
133+ }
134+ currentLimitCandidate = std::min (currentLimitCandidate, LimitAmountHigh);
135+
136+ CAmount currentLimit = previousLimit - blockUnlocked + currentLimitCandidate / LimitBlocksToTrace;
137+ if (currentLimit > locked) {
138+ currentLimit = locked;
139+ }
140+
141+ if (currentLimit || previousLimit || locked) {
142+ LogPrintf (" getCreditPool asset unlock limits on height: %d locked: %d.%08d limit: %d.%08d previous: %d.%08d\n " , block_index->nHeight , locked / COIN, locked % COIN,
143+ currentLimit / COIN, currentLimit % COIN,
144+ previousLimit / COIN, previousLimit % COIN);
145+ }
146+
147+ CreditPoolCb pool{locked, currentLimit, indexes};
126148 addToCache (block_hash, block_height, pool);
127149 return pool;
128150}
@@ -138,33 +160,6 @@ CreditPoolCbDiff::CreditPoolCbDiff(const CreditPoolCb& starter, const CBlockInde
138160, pindex(pindex)
139161{
140162 assert (pindex);
141- const CAmount prevLocked = pool.locked ;
142- CAmount latelyUnlocked = pool.totalUnlocked ;
143- const CBlockIndex* other_block = pindex;
144- for (size_t i = 0 ; i < CCreditPoolManager::LimitBlocksToTrace; ++i) {
145- other_block = other_block->pprev ;
146- if (other_block == nullptr ) break ;
147- }
148- if (other_block) {
149- CreditPoolCb agedPool = creditPoolManager->getCreditPool (other_block, consensusParams);
150- latelyUnlocked -= agedPool.totalUnlocked ;
151- }
152- sessionLimit = prevLocked;
153-
154- // # max(100, min(.10 * assetlockpool, 1000))
155- if ((sessionLimit + latelyUnlocked > (prevLocked + latelyUnlocked) / 10 ) && (sessionLimit + latelyUnlocked > CCreditPoolManager::LimitAmountLow)) {
156- sessionLimit = std::max<CAmount>(0 , (latelyUnlocked + prevLocked) / 10 - latelyUnlocked);
157- if (sessionLimit > prevLocked) sessionLimit = prevLocked;
158- }
159- if (sessionLimit + latelyUnlocked > CCreditPoolManager::LimitAmountHigh) {
160- sessionLimit = CCreditPoolManager::LimitAmountHigh - latelyUnlocked;
161- }
162-
163- if (prevLocked || latelyUnlocked || sessionLimit) {
164- LogPrintf (" CreditPoolCb init on height %d: %d.%08d %d.%08d limited by %d.%08d\n " , pindex->nHeight , prevLocked / COIN, prevLocked % COIN,
165- latelyUnlocked / COIN, latelyUnlocked % COIN,
166- sessionLimit / COIN, sessionLimit % COIN);
167- }
168163}
169164
170165
@@ -199,7 +194,7 @@ bool CreditPoolCbDiff::unlock(const CTransaction& tx, CValidationState& state)
199194 return state.Invalid (ValidationInvalidReason::CONSENSUS, false , REJECT_INVALID, " failed-creditpool-duplicated-index" );
200195 }
201196 pool.indexes .add (index);
202- if (sessionUnlocked + toUnlock > sessionLimit ) {
197+ if (sessionUnlocked + toUnlock > pool. currentLimit ) {
203198 return state.Invalid (ValidationInvalidReason::CONSENSUS, false , REJECT_INVALID, " failed-creditpool-unloock-too-much" );
204199 }
205200
0 commit comments