get and store fee rate histogram

This commit is contained in:
Craig Raw 2020-11-18 09:54:34 +02:00
parent 80b7ee803b
commit 43bf6ab265
7 changed files with 64 additions and 5 deletions

View file

@ -143,6 +143,8 @@ public class AppController implements Initializable {
private static Map<Integer, Double> targetBlockFeeRates;
private static Map<Long, Long> feeRateHistogram;
private static Double minimumRelayFeeRate;
private static CurrencyRate fiatCurrencyExchangeRate;
@ -650,6 +652,10 @@ public class AppController implements Initializable {
return targetBlockFeeRates;
}
public static Map<Long, Long> getFeeRateHistogram() {
return feeRateHistogram;
}
public static Double getMinimumRelayFeeRate() {
return minimumRelayFeeRate == null ? Transaction.DEFAULT_MIN_RELAY_FEE : minimumRelayFeeRate;
}
@ -1429,6 +1435,7 @@ public class AppController implements Initializable {
public void newConnection(ConnectionEvent event) {
currentBlockHeight = event.getBlockHeight();
targetBlockFeeRates = event.getTargetBlockFeeRates();
feeRateHistogram = event.getFeeRateHistogram();
minimumRelayFeeRate = event.getMinimumRelayFeeRate();
String banner = event.getServerBanner();
String status = "Connected to " + Config.get().getElectrumServer() + " at height " + event.getBlockHeight();
@ -1453,6 +1460,7 @@ public class AppController implements Initializable {
@Subscribe
public void feesUpdated(FeeRatesUpdatedEvent event) {
targetBlockFeeRates = event.getTargetBlockFeeRates();
feeRateHistogram = event.getFeeRateHistogram();
}
@Subscribe

View file

@ -12,8 +12,8 @@ public class ConnectionEvent extends FeeRatesUpdatedEvent {
private final BlockHeader blockHeader;
private final Double minimumRelayFeeRate;
public ConnectionEvent(List<String> serverVersion, String serverBanner, int blockHeight, BlockHeader blockHeader, Map<Integer, Double> targetBlockFeeRates, Double minimumRelayFeeRate) {
super(targetBlockFeeRates);
public ConnectionEvent(List<String> serverVersion, String serverBanner, int blockHeight, BlockHeader blockHeader, Map<Integer, Double> targetBlockFeeRates, Map<Long, Long> feeRateHistogram, Double minimumRelayFeeRate) {
super(targetBlockFeeRates, feeRateHistogram);
this.serverVersion = serverVersion;
this.serverBanner = serverBanner;
this.blockHeight = blockHeight;

View file

@ -4,12 +4,18 @@ import java.util.Map;
public class FeeRatesUpdatedEvent {
private final Map<Integer, Double> targetBlockFeeRates;
private final Map<Long, Long> feeRateHistogram;
public FeeRatesUpdatedEvent(Map<Integer, Double> targetBlockFeeRates) {
public FeeRatesUpdatedEvent(Map<Integer, Double> targetBlockFeeRates, Map<Long, Long> feeRateHistogram) {
this.targetBlockFeeRates = targetBlockFeeRates;
this.feeRateHistogram = feeRateHistogram;
}
public Map<Integer, Double> getTargetBlockFeeRates() {
return targetBlockFeeRates;
}
public Map<Long, Long> getFeeRateHistogram() {
return feeRateHistogram;
}
}

View file

@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicLong;
public class BatchedElectrumServerRpc implements ElectrumServerRpc {
@ -229,6 +230,24 @@ public class BatchedElectrumServerRpc implements ElectrumServerRpc {
}
}
@Override
public Map<Long, Long> getFeeRateHistogram(Transport transport) {
try {
JsonRpcClient client = new JsonRpcClient(transport);
Long[][] feesArray = new RetryLogic<Long[][]>(MAX_RETRIES, RETRY_DELAY, IllegalStateException.class).getResult(() ->
client.createRequest().returnAs(Long[][].class).method("mempool.get_fee_histogram").id(idCounter.incrementAndGet()).execute());
Map<Long, Long> feeRateHistogram = new TreeMap<>();
for(Long[] feePair : feesArray) {
feeRateHistogram.put(feePair[0], feePair[1]);
}
return feeRateHistogram;
} catch(Exception e) {
throw new ElectrumServerRpcException("Error getting fee rate histogram", e);
}
}
@Override
public Double getMinimumRelayFee(Transport transport) {
try {

View file

@ -610,6 +610,10 @@ public class ElectrumServer {
}
}
public Map<Long, Long> getFeeRateHistogram() throws ServerException {
return electrumServerRpc.getFeeRateHistogram(getTransport());
}
public Double getMinimumRelayFee() throws ServerException {
Double minFeeRateBtcKb = electrumServerRpc.getMinimumRelayFee(getTransport());
if(minFeeRateBtcKb != null) {
@ -760,6 +764,7 @@ public class ElectrumServer {
String banner = electrumServer.getServerBanner();
Map<Integer, Double> blockTargetFeeRates = electrumServer.getFeeEstimates(SendController.TARGET_BLOCKS_RANGE);
Map<Long, Long> feeRateHistogram = electrumServer.getFeeRateHistogram();
feeRatesRetrievedAt = System.currentTimeMillis();
Double minimumRelayFeeRate = electrumServer.getMinimumRelayFee();
@ -767,7 +772,7 @@ public class ElectrumServer {
blockTargetFeeRates.computeIfPresent(blockTarget, (blocks, feeRate) -> feeRate < minimumRelayFeeRate ? minimumRelayFeeRate : feeRate);
}
return new ConnectionEvent(serverVersion, banner, tip.height, tip.getBlockHeader(), blockTargetFeeRates, minimumRelayFeeRate);
return new ConnectionEvent(serverVersion, banner, tip.height, tip.getBlockHeader(), blockTargetFeeRates, feeRateHistogram, minimumRelayFeeRate);
} else {
if(reader.isAlive()) {
electrumServer.ping();
@ -775,8 +780,9 @@ public class ElectrumServer {
long elapsed = System.currentTimeMillis() - feeRatesRetrievedAt;
if(elapsed > FEE_RATES_PERIOD) {
Map<Integer, Double> blockTargetFeeRates = electrumServer.getFeeEstimates(SendController.TARGET_BLOCKS_RANGE);
Map<Long, Long> feeRateHistogram = electrumServer.getFeeRateHistogram();
feeRatesRetrievedAt = System.currentTimeMillis();
return new FeeRatesUpdatedEvent(blockTargetFeeRates);
return new FeeRatesUpdatedEvent(blockTargetFeeRates, feeRateHistogram);
}
} else {
resetConnection();

View file

@ -30,6 +30,8 @@ public interface ElectrumServerRpc {
Map<Integer, Double> getFeeEstimates(Transport transport, List<Integer> targetBlocks);
Map<Long, Long> getFeeRateHistogram(Transport transport);
Double getMinimumRelayFee(Transport transport);
String broadcastTransaction(Transport transport, String txHex);

View file

@ -246,6 +246,24 @@ public class SimpleElectrumServerRpc implements ElectrumServerRpc {
return result;
}
@Override
public Map<Long, Long> getFeeRateHistogram(Transport transport) {
try {
JsonRpcClient client = new JsonRpcClient(transport);
Long[][] feesArray = new RetryLogic<Long[][]>(MAX_RETRIES, RETRY_DELAY, IllegalStateException.class).getResult(() ->
client.createRequest().returnAs(Long[][].class).method("mempool.get_fee_histogram").id(idCounter.incrementAndGet()).execute());
Map<Long, Long> feeRateHistogram = new TreeMap<>();
for(Long[] feePair : feesArray) {
feeRateHistogram.put(feePair[0], feePair[1]);
}
return feeRateHistogram;
} catch(Exception e) {
throw new ElectrumServerRpcException("Error getting fee rate histogram", e);
}
}
@Override
public Double getMinimumRelayFee(Transport transport) {
try {