mirror of https://github.com/qortal/qortal
crowetic
2 weeks ago
committed by
GitHub
3 changed files with 148 additions and 17 deletions
@ -0,0 +1,89 @@ |
|||||||
|
package org.qortal.crosschain; |
||||||
|
|
||||||
|
import org.bitcoinj.crypto.DeterministicKey; |
||||||
|
import org.qortal.settings.Settings; |
||||||
|
|
||||||
|
import java.util.Optional; |
||||||
|
import java.util.Queue; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
import java.util.concurrent.ConcurrentLinkedDeque; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class BlockchainCache |
||||||
|
* |
||||||
|
* Cache blockchain information to reduce redundant RPCs to the ElectrumX servers. |
||||||
|
*/ |
||||||
|
public class BlockchainCache { |
||||||
|
|
||||||
|
/** |
||||||
|
* Keys With History |
||||||
|
* |
||||||
|
* Deterministic Keys with any transaction history. |
||||||
|
*/ |
||||||
|
private Queue<DeterministicKey> keysWithHistory = new ConcurrentLinkedDeque<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Transactions By Hash |
||||||
|
* |
||||||
|
* Transaction Hash -> Transaction |
||||||
|
*/ |
||||||
|
private ConcurrentHashMap<String, BitcoinyTransaction> transactionByHash = new ConcurrentHashMap<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Cache Limit |
||||||
|
* |
||||||
|
* If this limit is reached, the cache will be cleared or reduced. |
||||||
|
*/ |
||||||
|
private static final int CACHE_LIMIT = Settings.getInstance().getBlockchainCacheLimit(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Add Key With History |
||||||
|
* |
||||||
|
* @param key a deterministic key with a verified history |
||||||
|
*/ |
||||||
|
public void addKeyWithHistory(DeterministicKey key) { |
||||||
|
|
||||||
|
if( this.keysWithHistory.size() > CACHE_LIMIT ) { |
||||||
|
this.keysWithHistory.remove(); |
||||||
|
} |
||||||
|
|
||||||
|
this.keysWithHistory.add(key); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Key Has History? |
||||||
|
* |
||||||
|
* @param key the deterministic key |
||||||
|
* |
||||||
|
* @return true if the key has a history, otherwise false |
||||||
|
*/ |
||||||
|
public boolean keyHasHistory( DeterministicKey key ) { |
||||||
|
return this.keysWithHistory.contains(key); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add Transaction By Hash |
||||||
|
* |
||||||
|
* @param hash the transaction hash |
||||||
|
* @param transaction the transaction |
||||||
|
*/ |
||||||
|
public void addTransactionByHash( String hash, BitcoinyTransaction transaction ) { |
||||||
|
|
||||||
|
if( this.transactionByHash.size() > CACHE_LIMIT ) { |
||||||
|
this.transactionByHash.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
this.transactionByHash.put(hash, transaction); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get Transaction By Hash |
||||||
|
* |
||||||
|
* @param hash the transaction hash |
||||||
|
* |
||||||
|
* @return the transaction, empty if the hash is not in the cache |
||||||
|
*/ |
||||||
|
public Optional<BitcoinyTransaction> getTransactionByHash( String hash ) { |
||||||
|
return Optional.ofNullable( this.transactionByHash.get(hash) ); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue