package com.msgilligan.bitcoinj.spring.service;
import com.msgilligan.bitcoinj.json.pojo.ServerInfo;
import com.msgilligan.bitcoinj.rpcserver.BitcoinJsonRpc;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.PeerGroup;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.net.discovery.PeerDiscovery;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import java.math.BigDecimal;
/**
* Implement a subset of Bitcoin JSON RPC using only a PeerGroup
*/
@Named
public class PeerGroupService implements BitcoinJsonRpc {
private static final String userAgentName = "PeerList";
private static final String appVersion = "0.1";
private static final int version = 1;
private static final int protocolVersion = 1;
private static final int walletVersion = 0;
protected NetworkParameters netParams;
protected PeerGroup peerGroup;
private int timeOffset = 0;
private BigDecimal difficulty = new BigDecimal(0);
@Inject
public PeerGroupService(NetworkParameters params,
PeerDiscovery peerDiscovery) {
this.netParams = params;
this.peerGroup = new PeerGroup(params);
peerGroup.setUserAgent(userAgentName, appVersion);
peerGroup.addPeerDiscovery(peerDiscovery);
}
@PostConstruct
public void start() {
peerGroup.startAsync();
}
public NetworkParameters getNetworkParameters() {
return this.netParams;
}
@Override
public Integer getblockcount() {
return peerGroup.getMostCommonChainHeight();
}
@Override
public Integer getconnectioncount() {
return peerGroup.numConnectedPeers();
}
@Override
public ServerInfo getinfo() {
// Dummy up a response for now.
// Since ServerInfo is immutable, we have to build it entirely with the constructor.
Coin balance = Coin.valueOf(0);
boolean testNet = !netParams.getId().equals(NetworkParameters.ID_MAINNET);
int keyPoolOldest = 0;
int keyPoolSize = 0;
return new ServerInfo(
version,
protocolVersion,
walletVersion,
balance,
getblockcount(),
timeOffset,
getconnectioncount(),
"proxy",
difficulty,
testNet,
keyPoolOldest,
keyPoolSize,
Transaction.REFERENCE_DEFAULT_MIN_TX_FEE,
Transaction.REFERENCE_DEFAULT_MIN_TX_FEE, // relayfee
"no errors" // errors
);
}
}