Skip to content

Commit

Permalink
Make daemons use WalletAppKit instead of PeerGroup (#47)
Browse files Browse the repository at this point in the history
* Make daemons use WalletAppKit instead of PeerGroup

* Remove redundant singleton code from WalletAppKit config
  • Loading branch information
JeremyRand authored and msgilligan committed Nov 5, 2018
1 parent 4eb45db commit 49ecb91
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 4 deletions.
Expand Up @@ -4,14 +4,18 @@
import com.msgilligan.bitcoinj.rpcserver.BitcoinJsonRpc;
import com.msgilligan.bitcoinj.json.conversion.RpcServerModule;
import com.msgilligan.bitcoinj.spring.service.PeerGroupService;
import com.msgilligan.bitcoinj.spring.service.WalletAppKitService;
import org.bitcoinj.core.Context;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.kits.WalletAppKit;
import org.bitcoinj.net.discovery.DnsDiscovery;
import org.bitcoinj.net.discovery.PeerDiscovery;
import org.bitcoinj.params.MainNetParams;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.Module;

import java.io.File;
import java.io.FileNotFoundException;

/**
Expand All @@ -32,6 +36,20 @@ public PeerDiscovery peerDiscovery(NetworkParameters params) throws FileNotFound
return pd;
}

@Bean
public Context getContext(NetworkParameters params) {
return new Context(params);
}

@Bean
public WalletAppKit getKit(Context context) throws Exception {
// TODO: make File(".") and filePrefix configurable
File directory = new File(".");
String filePrefix = "BitcoinJDaemon";

return new WalletAppKit(context, directory, filePrefix);
}

@Bean
public Module bitcoinJMapper() {
return new RpcServerModule();
Expand All @@ -42,10 +60,15 @@ public PeerGroupService peerGroupService(NetworkParameters params, PeerDiscovery
return new PeerGroupService(params, peerDiscovery);
}

@Bean
public WalletAppKitService walletAppKitService(NetworkParameters params, Context context, WalletAppKit kit) {
return new WalletAppKitService(params, context, kit);
}

@Bean(name="/")
public JsonServiceExporter bitcoinServiceExporter(PeerGroupService peerGroupService) {
public JsonServiceExporter bitcoinServiceExporter(WalletAppKitService walletAppKitService) {
JsonServiceExporter exporter = new JsonServiceExporter();
exporter.setService(peerGroupService);
exporter.setService(walletAppKitService);
exporter.setServiceInterface(BitcoinJsonRpc.class);
exporter.setBackwardsComaptible(true);
return exporter;
Expand Down
@@ -0,0 +1,95 @@
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.Context;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.PeerGroup;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.kits.WalletAppKit;
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 a WalletAppKit
*/
@Named
public class WalletAppKitService implements BitcoinJsonRpc {
private static final int version = 1;
private static final int protocolVersion = 1;
private static final int walletVersion = 0;

protected NetworkParameters netParams;
protected Context context;
protected WalletAppKit kit;

private int timeOffset = 0;
private BigDecimal difficulty = new BigDecimal(0);

@Inject
public WalletAppKitService(NetworkParameters params, Context context,
WalletAppKit kit) {
this.netParams = params;
this.context = context;
this.kit = kit;
}

@PostConstruct
public void start() {
kit.setBlockingStartup(false);
kit.startAsync();
}

public NetworkParameters getNetworkParameters() {
return this.netParams;
}

@Override
public Integer getblockcount() {
if(!kit.isRunning()) {
return null;
}
return kit.chain().getChainHead().getHeight();
}

@Override
public Integer getconnectioncount() {
if(!kit.isRunning()) {
return null;
}
return kit.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
);
}

}
Expand Up @@ -5,13 +5,17 @@
import com.msgilligan.bitcoinj.json.conversion.RpcServerModule;
import com.msgilligan.bitcoinj.rpcserver.BitcoinJsonRpc;
import com.msgilligan.bitcoinj.spring.service.PeerGroupService;
import com.msgilligan.bitcoinj.spring.service.WalletAppKitService;
import org.bitcoinj.core.Context;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.net.discovery.DnsDiscovery;
import org.bitcoinj.net.discovery.PeerDiscovery;
import org.bitcoinj.kits.WalletAppKit;
import org.libdohj.params.NamecoinMainNetParams;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.File;
import java.io.FileNotFoundException;

/**
Expand All @@ -35,6 +39,20 @@ public PeerDiscovery peerDiscovery(NetworkParameters params) throws FileNotFound
return pd;
}

@Bean
public Context getContext(NetworkParameters params) {
return new Context(params);
}

@Bean
public WalletAppKit getKit(Context context) throws Exception {
// TODO: make File(".") and filePrefix configurable
File directory = new File(".");
String filePrefix = "NamecoinJDaemon";

return new WalletAppKit(context, directory, filePrefix);
}

@Bean
public Module bitcoinJMapper() {
return new RpcServerModule();
Expand All @@ -45,10 +63,15 @@ public PeerGroupService peerGroupService(NetworkParameters params, PeerDiscovery
return new PeerGroupService(params, peerDiscovery);
}

@Bean
public WalletAppKitService walletAppKitService(NetworkParameters params, Context context, WalletAppKit kit) {
return new WalletAppKitService(params, context, kit);
}

@Bean(name="/")
public JsonServiceExporter bitcoinServiceExporter(PeerGroupService peerGroupService) {
public JsonServiceExporter bitcoinServiceExporter(WalletAppKitService walletAppKitService) {
JsonServiceExporter exporter = new JsonServiceExporter();
exporter.setService(peerGroupService);
exporter.setService(walletAppKitService);
exporter.setServiceInterface(BitcoinJsonRpc.class);
exporter.setBackwardsComaptible(true);
return exporter;
Expand Down

0 comments on commit 49ecb91

Please sign in to comment.