AddressEntryList save/load cycle works

This commit is contained in:
Mike Rosseel 2017-03-31 16:44:36 +02:00
parent f1ef154b61
commit ce6620a291
88 changed files with 348 additions and 281 deletions

View file

@ -1,4 +1,4 @@
package io.bisq.network.p2p; package io.bisq.common.persistance;
import io.bisq.common.Marshaller; import io.bisq.common.Marshaller;

View file

@ -15,13 +15,13 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bisq.network.p2p.network; package io.bisq.common.persistance;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg;
import java.util.Optional; import java.util.Optional;
public interface ProtobufferResolver { public interface ProtobufferResolver {
Optional<Msg> fromProto(PB.Envelope envelope); Optional<Msg> fromProto(PB.Envelope envelope);
Optional<Persistable> fromProto(PB.DiskEnvelope envelope);
} }

View file

@ -17,16 +17,20 @@
package io.bisq.common.storage; package io.bisq.common.storage;
import com.google.inject.Inject;
import com.google.protobuf.Message; import com.google.protobuf.Message;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.io.LookAheadObjectInputStream; import io.bisq.common.io.LookAheadObjectInputStream;
import io.bisq.common.persistance.Persistable; import io.bisq.common.persistance.Persistable;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.generated.protobuffer.PB;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.*; import java.io.*;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Optional;
import java.util.Random; import java.util.Random;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ScheduledThreadPoolExecutor;
@ -43,17 +47,17 @@ public class FileManager<T> {
private final long delay; private final long delay;
private final Callable<Void> saveFileTask; private final Callable<Void> saveFileTask;
private T serializable; private T serializable;
private boolean proto; private ProtobufferResolver protobufferResolver;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public FileManager(File dir, File storageFile, long delay) { @Inject
public FileManager(File dir, File storageFile, long delay, ProtobufferResolver protobufferResolver) {
this.dir = dir; this.dir = dir;
this.storageFile = storageFile; this.storageFile = storageFile;
proto = serializable instanceof Persistable; this.protobufferResolver = protobufferResolver;
executor = Utilities.getScheduledThreadPoolExecutor("FileManager", 1, 10, 5); executor = Utilities.getScheduledThreadPoolExecutor("FileManager", 1, 10, 5);
@ -106,13 +110,17 @@ public class FileManager<T> {
public synchronized T read(File file) throws IOException, ClassNotFoundException { public synchronized T read(File file) throws IOException, ClassNotFoundException {
log.debug("read" + file); log.debug("read" + file);
if (proto) { Optional<Persistable> persistable = Optional.empty();
log.info("it's proto");
try (final FileInputStream fileInputStream = new FileInputStream(file)) { try (final FileInputStream fileInputStream = new FileInputStream(file)) {
return (T) ((Persistable) serializable).getParser().parseFrom(fileInputStream); persistable = protobufferResolver.fromProto(PB.DiskEnvelope.parseFrom(fileInputStream));
} catch (Throwable t) { } catch (Throwable t) {
log.error("Exception at proto read: " + t.getMessage()); log.error("Exception at proto read: " + t.getMessage() + " " + file.getName());
} }
if(persistable.isPresent()) {
log.error("Persistable found");
return (T) persistable.get();
} }
try (final FileInputStream fileInputStream = new FileInputStream(file); try (final FileInputStream fileInputStream = new FileInputStream(file);
@ -192,7 +200,7 @@ public class FileManager<T> {
try { try {
message = ((Persistable) serializable).toProtobuf(); message = ((Persistable) serializable).toProtobuf();
} catch (Throwable e) { } catch (Throwable e) {
log.info("Not protobufferable: {} {}", serializable.getClass().getSimpleName(), e.getMessage()); log.info("Not protobufferable: {}, {}, {}", serializable.getClass().getSimpleName(), storageFile, e.getMessage());
} }
try { try {

View file

@ -17,11 +17,12 @@
package io.bisq.common.storage; package io.bisq.common.storage;
import com.google.inject.Inject;
import io.bisq.common.persistance.ProtobufferResolver;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -66,6 +67,8 @@ public class Storage<T extends Serializable> {
private T serializable; private T serializable;
private String fileName; private String fileName;
private int numMaxBackupFiles = 10; private int numMaxBackupFiles = 10;
@com.google.inject.Inject
private ProtobufferResolver protobufferResolver;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -73,21 +76,28 @@ public class Storage<T extends Serializable> {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@Inject @Inject
public Storage(@Named(DIR_KEY) File dir) { public Storage(@Named(DIR_KEY) File dir, ProtobufferResolver protobufferResolver) {
this.dir = dir; this.dir = dir;
this.protobufferResolver = protobufferResolver;
} }
/*
public Storage(@Named(DIR_KEY) File dir) {
this.dir = dir;
this.protobufferResolver = protobufferResolver;
}
*/
public void initWithFileName(String fileName) { public void initWithFileName(String fileName) {
this.fileName = fileName; this.fileName = fileName;
storageFile = new File(dir, fileName); storageFile = new File(dir, fileName);
fileManager = new FileManager<>(dir, storageFile, 300); fileManager = new FileManager<>(dir, storageFile, 300, protobufferResolver);
} }
@Nullable @Nullable
public T initAndGetPersistedWithFileName(String fileName) { public T initAndGetPersistedWithFileName(String fileName) {
this.fileName = fileName; this.fileName = fileName;
storageFile = new File(dir, fileName); storageFile = new File(dir, fileName);
fileManager = new FileManager<>(dir, storageFile, 300); fileManager = new FileManager<>(dir, storageFile, 300, protobufferResolver);
return getPersisted(); return getPersisted();
} }
@ -102,7 +112,7 @@ public class Storage<T extends Serializable> {
this.serializable = serializable; this.serializable = serializable;
this.fileName = fileName; this.fileName = fileName;
storageFile = new File(dir, fileName); storageFile = new File(dir, fileName);
fileManager = new FileManager<>(dir, storageFile, 600); fileManager = new FileManager<>(dir, storageFile, 600, protobufferResolver);
return getPersisted(); return getPersisted();
} }

View file

@ -776,12 +776,16 @@ message AddressEntry {
string offer_id = 7; string offer_id = 7;
Context context = 8; Context context = 8;
bytes pubkey = 9; bytes pub_key = 9;
bytes pub_key_hash = 10; bytes pub_key_hash = 10;
string param_id = 11; string param_id = 11;
Coin coin_locked_in_multi_sig = 12; Coin coin_locked_in_multi_sig = 12;
} }
message DeterministicKey {
bytes serialized = 1;
}
message AddressEntryList { message AddressEntryList {
repeated AddressEntry address_entry = 1; repeated AddressEntry address_entry = 1;
} }

View file

@ -10,8 +10,8 @@
<appender-ref ref="CONSOLE_APPENDER"/> <appender-ref ref="CONSOLE_APPENDER"/>
</root> </root>
<logger name="io.bisq.common.storage.Storage" level="WARN"/> <logger name="io.bisq.core.storage.Storage" level="WARN"/>
<logger name="io.bisq.common.storage.FileManager" level="WARN"/> <logger name="io.bisq.core.storage.FileManager" level="WARN"/>
<logger name="io.bisq.locale.BSResources" level="ERROR"/> <logger name="io.bisq.locale.BSResources" level="ERROR"/>
<!-- <logger name="io.bisq.p2p.peers.PeerGroup" level="TRACE"/> <!-- <logger name="io.bisq.p2p.peers.PeerGroup" level="TRACE"/>

View file

@ -22,6 +22,7 @@ import com.google.inject.name.Named;
import io.bisq.common.app.DevEnv; import io.bisq.common.app.DevEnv;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.crypto.PubKeyRing; import io.bisq.common.crypto.PubKeyRing;
import io.bisq.common.persistance.Msg;
import io.bisq.core.app.AppOptionKeys; import io.bisq.core.app.AppOptionKeys;
import io.bisq.network.p2p.*; import io.bisq.network.p2p.*;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;

View file

@ -3,7 +3,7 @@ package io.bisq.core.alert;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;

View file

@ -27,6 +27,8 @@ import io.bisq.common.crypto.PubKeyRing;
import io.bisq.common.handlers.FaultHandler; import io.bisq.common.handlers.FaultHandler;
import io.bisq.common.handlers.ResultHandler; import io.bisq.common.handlers.ResultHandler;
import io.bisq.common.locale.Res; import io.bisq.common.locale.Res;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.arbitration.messages.*; import io.bisq.core.arbitration.messages.*;
import io.bisq.core.btc.AddressEntry; import io.bisq.core.btc.AddressEntry;
@ -89,6 +91,7 @@ public class DisputeManager {
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
OpenOfferManager openOfferManager, OpenOfferManager openOfferManager,
KeyRing keyRing, KeyRing keyRing,
ProtobufferResolver protobufferResolver,
@Named(Storage.DIR_KEY) File storageDir) { @Named(Storage.DIR_KEY) File storageDir) {
this.p2PService = p2PService; this.p2PService = p2PService;
this.tradeWalletService = tradeWalletService; this.tradeWalletService = tradeWalletService;
@ -98,7 +101,7 @@ public class DisputeManager {
this.openOfferManager = openOfferManager; this.openOfferManager = openOfferManager;
this.keyRing = keyRing; this.keyRing = keyRing;
disputeStorage = new Storage<>(storageDir); disputeStorage = new Storage<>(storageDir, protobufferResolver);
disputes = new DisputeList(disputeStorage); disputes = new DisputeList(disputeStorage);
openDisputes = new HashMap<>(); openDisputes = new HashMap<>();

View file

@ -20,7 +20,7 @@ package io.bisq.core.arbitration.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.core.arbitration.Attachment; import io.bisq.core.arbitration.Attachment;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
@ -38,7 +38,7 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@EqualsAndHashCode @EqualsAndHashCode(callSuper = true)
@ToString @ToString
@Getter @Getter
@Slf4j @Slf4j

View file

@ -20,7 +20,7 @@ package io.bisq.core.arbitration.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.core.arbitration.DisputeResult; import io.bisq.core.arbitration.DisputeResult;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;

View file

@ -20,7 +20,7 @@ package io.bisq.core.arbitration.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.core.arbitration.Dispute; import io.bisq.core.arbitration.Dispute;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;

View file

@ -20,7 +20,7 @@ package io.bisq.core.arbitration.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.core.arbitration.Dispute; import io.bisq.core.arbitration.Dispute;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;

View file

@ -20,7 +20,7 @@ package io.bisq.core.arbitration.messages;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View file

@ -110,12 +110,14 @@ public final class AddressEntry implements Persistable {
String paramId, String paramId,
Context context, Context context,
@Nullable String offerId, @Nullable String offerId,
@Nullable Coin coinLockedInMultiSig,
@NotNull KeyBagSupplier keyBagSupplier) { @NotNull KeyBagSupplier keyBagSupplier) {
this.pubKey = pubKey; this.pubKey = pubKey;
this.pubKeyHash = pubKeyHash; this.pubKeyHash = pubKeyHash;
this.paramId = paramId; this.paramId = paramId;
this.context = context; this.context = context;
this.offerId = offerId; this.offerId = offerId;
this.coinLockedInMultiSig = coinLockedInMultiSig;
this.keyBagSupplier = keyBagSupplier; this.keyBagSupplier = keyBagSupplier;
} }
@ -210,7 +212,7 @@ public final class AddressEntry implements Persistable {
public Message toProtobuf() { public Message toProtobuf() {
PB.AddressEntry.Builder builder = PB.AddressEntry.newBuilder() PB.AddressEntry.Builder builder = PB.AddressEntry.newBuilder()
.setContext(PB.AddressEntry.Context.valueOf(context.name())) .setContext(PB.AddressEntry.Context.valueOf(context.name()))
.setPubkey(ByteString.copyFrom(pubKey)) .setPubKey(ByteString.copyFrom(pubKey))
.setPubKeyHash(ByteString.copyFrom(pubKeyHash)) .setPubKeyHash(ByteString.copyFrom(pubKeyHash))
.setParamId(paramId); .setParamId(paramId);
Optional.ofNullable(offerId).ifPresent(builder::setOfferId); Optional.ofNullable(offerId).ifPresent(builder::setOfferId);

View file

@ -22,6 +22,7 @@ import com.google.protobuf.Message;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.common.persistance.Persistable; import io.bisq.common.persistance.Persistable;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.btc.wallet.KeyBagSupplier;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import lombok.Getter; import lombok.Getter;
import org.bitcoinj.core.Wallet; import org.bitcoinj.core.Wallet;
@ -43,13 +44,16 @@ public final class AddressEntryList implements Persistable {
private static final Logger log = LoggerFactory.getLogger(AddressEntryList.class); private static final Logger log = LoggerFactory.getLogger(AddressEntryList.class);
final transient private Storage<AddressEntryList> storage; final transient private Storage<AddressEntryList> storage;
@Getter
final transient private KeyBagSupplier keyBagSupplier;
transient private Wallet wallet; transient private Wallet wallet;
@Getter @Getter
private List<AddressEntry> addressEntryList = new ArrayList<>(); private List<AddressEntry> addressEntryList = new ArrayList<>();
@Inject @Inject
public AddressEntryList(Storage<AddressEntryList> storage) { public AddressEntryList(Storage<AddressEntryList> storage, KeyBagSupplier keyBagSupplier) {
this.storage = storage; this.storage = storage;
this.keyBagSupplier = keyBagSupplier;
} }
public void onWalletReady(Wallet wallet) { public void onWalletReady(Wallet wallet) {

View file

@ -22,10 +22,7 @@ import com.google.inject.name.Names;
import io.bisq.common.app.AppModule; import io.bisq.common.app.AppModule;
import io.bisq.core.app.AppOptionKeys; import io.bisq.core.app.AppOptionKeys;
import io.bisq.core.btc.provider.squ.BsqUtxoFeedService; import io.bisq.core.btc.provider.squ.BsqUtxoFeedService;
import io.bisq.core.btc.wallet.BsqWalletService; import io.bisq.core.btc.wallet.*;
import io.bisq.core.btc.wallet.BtcWalletService;
import io.bisq.core.btc.wallet.TradeWalletService;
import io.bisq.core.btc.wallet.WalletsSetup;
import io.bisq.core.provider.fee.FeeService; import io.bisq.core.provider.fee.FeeService;
import io.bisq.core.provider.price.PriceFeedService; import io.bisq.core.provider.price.PriceFeedService;
import io.bisq.network.http.HttpClient; import io.bisq.network.http.HttpClient;
@ -64,6 +61,7 @@ public class BitcoinModule extends AppModule {
bind(AddressEntryList.class).in(Singleton.class); bind(AddressEntryList.class).in(Singleton.class);
bind(WalletsSetup.class).in(Singleton.class); bind(WalletsSetup.class).in(Singleton.class);
bind(BtcWalletService.class).in(Singleton.class); bind(BtcWalletService.class).in(Singleton.class);
bind(KeyBagSupplier.class).to(BtcWalletService.class);
bind(BsqWalletService.class).in(Singleton.class); bind(BsqWalletService.class).in(Singleton.class);
bind(TradeWalletService.class).in(Singleton.class); bind(TradeWalletService.class).in(Singleton.class);

View file

@ -17,7 +17,6 @@
package io.bisq.core.btc.wallet; package io.bisq.core.btc.wallet;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
@ -48,9 +47,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.*;
import static com.google.inject.internal.util.$Preconditions.checkArgument;
import static com.google.inject.internal.util.$Preconditions.checkState;
// TradeService handles all relevant transactions used in the trade process // TradeService handles all relevant transactions used in the trade process
/* /*
@ -336,7 +333,7 @@ public class TradeWalletService {
TransactionOutput makerOutput = null; TransactionOutput makerOutput = null;
// We don't support more then 1 optional change output // We don't support more then 1 optional change output
Preconditions.checkArgument(dummyTx.getOutputs().size() < 3, "dummyTx.getOutputs().size() >= 3"); checkArgument(dummyTx.getOutputs().size() < 3, "dummyTx.getOutputs().size() >= 3");
// Only save change outputs, the dummy output is ignored (that's why we start with index 1) // Only save change outputs, the dummy output is ignored (that's why we start with index 1)
if (dummyTx.getOutputs().size() > 1) if (dummyTx.getOutputs().size() > 1)

View file

@ -27,6 +27,7 @@ import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.handlers.ExceptionHandler; import io.bisq.common.handlers.ExceptionHandler;
import io.bisq.common.handlers.ResultHandler; import io.bisq.common.handlers.ResultHandler;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.FileUtil; import io.bisq.common.storage.FileUtil;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.btc.*; import io.bisq.core.btc.*;
@ -97,6 +98,7 @@ public class WalletsSetup {
UserAgent userAgent, UserAgent userAgent,
Preferences preferences, Preferences preferences,
Socks5ProxyProvider socks5ProxyProvider, Socks5ProxyProvider socks5ProxyProvider,
ProtobufferResolver protobufferResolver,
@Named(BtcOptionKeys.WALLET_DIR) File appDir, @Named(BtcOptionKeys.WALLET_DIR) File appDir,
@Named(BtcOptionKeys.SOCKS5_DISCOVER_MODE) String socks5DiscoverModeString) { @Named(BtcOptionKeys.SOCKS5_DISCOVER_MODE) String socks5DiscoverModeString) {
@ -111,7 +113,7 @@ public class WalletsSetup {
params = preferences.getBitcoinNetwork().getParameters(); params = preferences.getBitcoinNetwork().getParameters();
walletDir = new File(appDir, "bitcoin"); walletDir = new File(appDir, "bitcoin");
storage = new Storage<>(walletDir); storage = new Storage<>(walletDir, protobufferResolver);
Long nonce = storage.initAndGetPersistedWithFileName("BloomFilterNonce"); Long nonce = storage.initAndGetPersistedWithFileName("BloomFilterNonce");
if (nonce != null) { if (nonce != null) {
bloomFilterTweak = nonce; bloomFilterTweak = nonce;

View file

@ -20,6 +20,7 @@ package io.bisq.core.dao.vote;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.common.persistance.Persistable; import io.bisq.common.persistance.Persistable;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString; import lombok.ToString;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -27,12 +28,13 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
@ToString @ToString
@EqualsAndHashCode @EqualsAndHashCode(callSuper = true)
@Slf4j @Slf4j
public final class CompensationRequestVoteItemCollection extends VoteItem implements Persistable { public final class CompensationRequestVoteItemCollection extends VoteItem implements Persistable {
// That object is saved to disc. We need to take care of changes to not break deserialization. // That object is saved to disc. We need to take care of changes to not break deserialization.
private static final long serialVersionUID = Version.LOCAL_DB_VERSION; private static final long serialVersionUID = Version.LOCAL_DB_VERSION;
@Getter
private final List<CompensationRequestVoteItem> compensationRequestVoteItems = new ArrayList<>(); private final List<CompensationRequestVoteItem> compensationRequestVoteItems = new ArrayList<>();
/** constructor */ /** constructor */
@ -40,10 +42,6 @@ public final class CompensationRequestVoteItemCollection extends VoteItem implem
super(votingType, null, null); super(votingType, null, null);
} }
public List<CompensationRequestVoteItem> getCompensationRequestVoteItems() {
return compensationRequestVoteItems;
}
public List<CompensationRequestVoteItem> getCompensationRequestVoteItemsSortedByTxId() { public List<CompensationRequestVoteItem> getCompensationRequestVoteItemsSortedByTxId() {
ArrayList<CompensationRequestVoteItem> list = new ArrayList<>(compensationRequestVoteItems); ArrayList<CompensationRequestVoteItem> list = new ArrayList<>(compensationRequestVoteItems);
list.sort((o1, o2) -> o2.compensationRequest.getCompensationRequestPayload().feeTxId.compareTo(o1.compensationRequest.getCompensationRequestPayload().feeTxId)); list.sort((o1, o2) -> o2.compensationRequest.getCompensationRequestPayload().feeTxId.compareTo(o1.compensationRequest.getCompensationRequestPayload().feeTxId));

View file

@ -25,6 +25,8 @@ import io.bisq.common.app.Log;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.handlers.ErrorMessageHandler; import io.bisq.common.handlers.ErrorMessageHandler;
import io.bisq.common.handlers.ResultHandler; import io.bisq.common.handlers.ResultHandler;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.btc.AddressEntry; import io.bisq.core.btc.AddressEntry;
import io.bisq.core.btc.wallet.BtcWalletService; import io.bisq.core.btc.wallet.BtcWalletService;
@ -96,6 +98,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
ClosedTradableManager closedTradableManager, ClosedTradableManager closedTradableManager,
PriceFeedService priceFeedService, PriceFeedService priceFeedService,
Preferences preferences, Preferences preferences,
ProtobufferResolver protobufferResolver,
@Named(Storage.DIR_KEY) File storageDir) { @Named(Storage.DIR_KEY) File storageDir) {
this.keyRing = keyRing; this.keyRing = keyRing;
this.user = user; this.user = user;
@ -106,7 +109,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
this.closedTradableManager = closedTradableManager; this.closedTradableManager = closedTradableManager;
this.preferences = preferences; this.preferences = preferences;
openOffersStorage = new Storage<>(storageDir); openOffersStorage = new Storage<>(storageDir, protobufferResolver);
openOffers = new TradableList<>(openOffersStorage, "OpenOffers"); openOffers = new TradableList<>(openOffersStorage, "OpenOffers");
openOffers.forEach(e -> e.getOffer().setPriceFeedService(priceFeedService)); openOffers.forEach(e -> e.getOffer().setPriceFeedService(priceFeedService));

View file

@ -29,7 +29,7 @@ import io.bisq.core.offer.messages.OfferAvailabilityResponse;
import io.bisq.core.offer.messages.OfferMsg; import io.bisq.core.offer.messages.OfferMsg;
import io.bisq.core.util.Validator; import io.bisq.core.util.Validator;
import io.bisq.network.p2p.DecryptedDirectMessageListener; import io.bisq.network.p2p.DecryptedDirectMessageListener;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View file

@ -22,7 +22,7 @@ import io.bisq.common.app.Capabilities;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.core.offer.AvailabilityResult; import io.bisq.core.offer.AvailabilityResult;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.SupportedCapabilitiesMsg; import io.bisq.network.p2p.SupportedCapabilitiesMsg;
import javax.annotation.Nullable; import javax.annotation.Nullable;

View file

@ -1,19 +1,24 @@
package io.bisq.core.p2p.network; package io.bisq.core.p2p.network;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import io.bisq.common.crypto.PubKeyRing; import io.bisq.common.crypto.PubKeyRing;
import io.bisq.common.crypto.SealedAndSigned; import io.bisq.common.crypto.SealedAndSigned;
import io.bisq.common.locale.CountryUtil; import io.bisq.common.locale.CountryUtil;
import io.bisq.common.locale.CurrencyUtil; import io.bisq.common.locale.CurrencyUtil;
import io.bisq.common.monetary.Price; import io.bisq.common.monetary.Price;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.Persistable;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.core.alert.Alert; import io.bisq.core.alert.Alert;
import io.bisq.core.alert.PrivateNotificationMsg; import io.bisq.core.alert.PrivateNotificationMsg;
import io.bisq.core.alert.PrivateNotificationPayload; import io.bisq.core.alert.PrivateNotificationPayload;
import io.bisq.core.arbitration.*; import io.bisq.core.arbitration.*;
import io.bisq.core.arbitration.messages.*; import io.bisq.core.arbitration.messages.*;
import io.bisq.core.btc.AddressEntry; import io.bisq.core.btc.AddressEntry;
import io.bisq.core.btc.AddressEntryList;
import io.bisq.core.btc.data.RawTransactionInput; import io.bisq.core.btc.data.RawTransactionInput;
import io.bisq.core.btc.wallet.BtcWalletService;
import io.bisq.core.dao.compensation.CompensationRequestPayload; import io.bisq.core.dao.compensation.CompensationRequestPayload;
import io.bisq.core.filter.Filter; import io.bisq.core.filter.Filter;
import io.bisq.core.filter.PaymentAccountFilter; import io.bisq.core.filter.PaymentAccountFilter;
@ -27,10 +32,8 @@ import io.bisq.core.trade.messages.*;
import io.bisq.core.trade.statistics.TradeStatistics; import io.bisq.core.trade.statistics.TradeStatistics;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.CloseConnectionMsg; import io.bisq.network.p2p.CloseConnectionMsg;
import io.bisq.network.p2p.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.PrefixedSealedAndSignedMsg; import io.bisq.network.p2p.PrefixedSealedAndSignedMsg;
import io.bisq.network.p2p.network.ProtobufferResolver;
import io.bisq.network.p2p.peers.getdata.messages.GetDataResponse; import io.bisq.network.p2p.peers.getdata.messages.GetDataResponse;
import io.bisq.network.p2p.peers.getdata.messages.GetUpdatedDataRequest; import io.bisq.network.p2p.peers.getdata.messages.GetUpdatedDataRequest;
import io.bisq.network.p2p.peers.getdata.messages.PreliminaryGetDataRequest; import io.bisq.network.p2p.peers.getdata.messages.PreliminaryGetDataRequest;
@ -48,15 +51,11 @@ import io.bisq.network.p2p.storage.payload.ProtectedMailboxStorageEntry;
import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry; import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry;
import io.bisq.network.p2p.storage.payload.StoragePayload; import io.bisq.network.p2p.storage.payload.StoragePayload;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.output.WriterOutputStream;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.inject.Inject;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -76,12 +75,9 @@ import static io.bisq.generated.protobuffer.PB.Envelope.MessageCase.*;
*/ */
@Slf4j @Slf4j
public class CoreProtobufferResolver implements ProtobufferResolver { public class CoreProtobufferResolver implements ProtobufferResolver {
private BtcWalletService btcWalletService;
@Inject @Inject
public CoreProtobufferResolver(BtcWalletService btcWalletService) { private Provider<AddressEntryList> addressEntryList;
this.btcWalletService = btcWalletService;
}
@Override @Override
public Optional<Msg> fromProto(PB.Envelope envelope) { public Optional<Msg> fromProto(PB.Envelope envelope) {
@ -95,18 +91,6 @@ public class CoreProtobufferResolver implements ProtobufferResolver {
log.debug("Convert protobuffer envelope: {}", envelope.getMessageCase()); log.debug("Convert protobuffer envelope: {}", envelope.getMessageCase());
log.trace("Convert protobuffer envelope: {}", envelope.toString()); log.trace("Convert protobuffer envelope: {}", envelope.toString());
} }
StringWriter stringWriter = new StringWriter();
WriterOutputStream writerOutputStream = new WriterOutputStream(stringWriter);
try {
envelope.writeTo(writerOutputStream);
writerOutputStream.flush();
stringWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
// todo just for testing...
AddressEntry AddressEntry = new AddressEntry(null, null, null, null, null, btcWalletService);
Msg result = null; Msg result = null;
switch (envelope.getMessageCase()) { switch (envelope.getMessageCase()) {
@ -869,4 +853,56 @@ public class CoreProtobufferResolver implements ProtobufferResolver {
.stream() .stream()
.map(ByteString::toByteArray).collect(Collectors.toList())); .map(ByteString::toByteArray).collect(Collectors.toList()));
} }
//////////////////////////////// DISK /////////////////////////////////////
@Override
public Optional<Persistable> fromProto(PB.DiskEnvelope envelope) {
if (Objects.isNull(envelope)) {
log.warn("fromProtoBuf called with empty disk envelope.");
return Optional.empty();
}
log.debug("Convert protobuffer disk envelope: {}", envelope.getMessageCase());
Persistable result = null;
switch (envelope.getMessageCase()) {
case ADDRESS_ENTRY_LIST:
addToAddressEntryList(envelope);
result = addressEntryList.get();
break;
/*
case NAVIGATION:
result = getPing(envelope);
break;
case PERSISTED_PEERS:
result = getPing(envelope);
break;
case PREFERENCES:
result = getPing(envelope);
break;
case USER:
result = getPing(envelope);
break;
case PERSISTED_P2P_STORAGE_DATA:
result = getPing(envelope);
break;
case SEQUENCE_NUMBER_MAP:
result = getPing(envelope);
break;
*/
default:
log.warn("Unknown message case:{}:{}", envelope.getMessageCase());
}
return Optional.ofNullable(result);
}
private void addToAddressEntryList(PB.DiskEnvelope envelope) {
envelope.getAddressEntryList().getAddressEntryList().stream().map(addressEntry -> addressEntryList.get().addAddressEntry(
new AddressEntry(addressEntry.getPubKey().toByteArray(), addressEntry.getPubKeyHash().toByteArray(), addressEntry.getParamId(), AddressEntry.Context.valueOf(addressEntry.getContext().name()),
addressEntry.getOfferId(), Coin.valueOf(addressEntry.getCoinLockedInMultiSig().getValue()), addressEntryList.get().getKeyBagSupplier())));
}
} }

View file

@ -24,6 +24,8 @@ import io.bisq.common.crypto.KeyRing;
import io.bisq.common.handlers.ErrorMessageHandler; import io.bisq.common.handlers.ErrorMessageHandler;
import io.bisq.common.handlers.FaultHandler; import io.bisq.common.handlers.FaultHandler;
import io.bisq.common.handlers.ResultHandler; import io.bisq.common.handlers.ResultHandler;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.arbitration.ArbitratorManager; import io.bisq.core.arbitration.ArbitratorManager;
import io.bisq.core.btc.AddressEntry; import io.bisq.core.btc.AddressEntry;
@ -111,6 +113,7 @@ public class TradeManager {
PriceFeedService priceFeedService, PriceFeedService priceFeedService,
FilterManager filterManager, FilterManager filterManager,
TradeStatisticsManager tradeStatisticsManager, TradeStatisticsManager tradeStatisticsManager,
ProtobufferResolver protobufferResolver,
@Named(Storage.DIR_KEY) File storageDir) { @Named(Storage.DIR_KEY) File storageDir) {
this.user = user; this.user = user;
this.keyRing = keyRing; this.keyRing = keyRing;
@ -124,7 +127,7 @@ public class TradeManager {
this.filterManager = filterManager; this.filterManager = filterManager;
this.tradeStatisticsManager = tradeStatisticsManager; this.tradeStatisticsManager = tradeStatisticsManager;
tradableListStorage = new Storage<>(storageDir); tradableListStorage = new Storage<>(storageDir, protobufferResolver);
trades = new TradableList<>(tradableListStorage, "PendingTrades"); trades = new TradableList<>(tradableListStorage, "PendingTrades");
trades.forEach(e -> e.getOffer().setPriceFeedService(priceFeedService)); trades.forEach(e -> e.getOffer().setPriceFeedService(priceFeedService));

View file

@ -19,6 +19,7 @@ package io.bisq.core.trade.closed;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.offer.Offer; import io.bisq.core.offer.Offer;
import io.bisq.core.provider.price.PriceFeedService; import io.bisq.core.provider.price.PriceFeedService;
@ -38,9 +39,11 @@ public class ClosedTradableManager {
private final KeyRing keyRing; private final KeyRing keyRing;
@Inject @Inject
public ClosedTradableManager(KeyRing keyRing, PriceFeedService priceFeedService, @Named(Storage.DIR_KEY) File storageDir) { public ClosedTradableManager(KeyRing keyRing, PriceFeedService priceFeedService,
ProtobufferResolver protobufferResolver,
@Named(Storage.DIR_KEY) File storageDir) {
this.keyRing = keyRing; this.keyRing = keyRing;
final Storage<TradableList<Tradable>> tradableListStorage = new Storage<>(storageDir); final Storage<TradableList<Tradable>> tradableListStorage = new Storage<>(storageDir, protobufferResolver);
// The ClosedTrades object can become a few MB so we don't keep so many backups // The ClosedTrades object can become a few MB so we don't keep so many backups
tradableListStorage.setNumMaxBackupFiles(3); tradableListStorage.setNumMaxBackupFiles(3);
this.closedTrades = new TradableList<>(tradableListStorage, "ClosedTrades"); this.closedTrades = new TradableList<>(tradableListStorage, "ClosedTrades");

View file

@ -19,6 +19,7 @@ package io.bisq.core.trade.failed;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.core.offer.Offer; import io.bisq.core.offer.Offer;
import io.bisq.core.provider.price.PriceFeedService; import io.bisq.core.provider.price.PriceFeedService;
@ -38,9 +39,11 @@ public class FailedTradesManager {
private final KeyRing keyRing; private final KeyRing keyRing;
@Inject @Inject
public FailedTradesManager(KeyRing keyRing, PriceFeedService priceFeedService, @Named(Storage.DIR_KEY) File storageDir) { public FailedTradesManager(KeyRing keyRing, PriceFeedService priceFeedService,
ProtobufferResolver protobufferResolver,
@Named(Storage.DIR_KEY) File storageDir) {
this.keyRing = keyRing; this.keyRing = keyRing;
this.failedTrades = new TradableList<>(new Storage<>(storageDir), "FailedTrades"); this.failedTrades = new TradableList<>(new Storage<>(storageDir, protobufferResolver), "FailedTrades");
failedTrades.forEach(e -> e.getOffer().setPriceFeedService(priceFeedService)); failedTrades.forEach(e -> e.getOffer().setPriceFeedService(priceFeedService));
} }

View file

@ -21,7 +21,7 @@ import com.google.protobuf.ByteString;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.bouncycastle.util.encoders.Hex; import org.bouncycastle.util.encoders.Hex;

View file

@ -21,7 +21,7 @@ import com.google.protobuf.ByteString;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View file

@ -21,7 +21,7 @@ import com.google.protobuf.ByteString;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View file

@ -23,7 +23,7 @@ import io.bisq.common.crypto.PubKeyRing;
import io.bisq.core.btc.data.RawTransactionInput; import io.bisq.core.btc.data.RawTransactionInput;
import io.bisq.core.payment.payload.PaymentAccountPayload; import io.bisq.core.payment.payload.PaymentAccountPayload;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.bouncycastle.util.encoders.Hex; import org.bouncycastle.util.encoders.Hex;

View file

@ -21,7 +21,7 @@ import com.google.protobuf.ByteString;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View file

@ -24,7 +24,7 @@ import io.bisq.core.btc.data.RawTransactionInput;
import io.bisq.core.payment.payload.PaymentAccountPayload; import io.bisq.core.payment.payload.PaymentAccountPayload;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.bouncycastle.util.encoders.Hex; import org.bouncycastle.util.encoders.Hex;

View file

@ -33,7 +33,7 @@ import io.bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerSignPayoutTx
import io.bisq.core.trade.protocol.tasks.maker.*; import io.bisq.core.trade.protocol.tasks.maker.*;
import io.bisq.core.util.Validator; import io.bisq.core.util.Validator;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View file

@ -33,7 +33,7 @@ import io.bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerCreatesDepos
import io.bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSignAndPublishDepositTx; import io.bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSignAndPublishDepositTx;
import io.bisq.core.trade.protocol.tasks.taker.*; import io.bisq.core.trade.protocol.tasks.taker.*;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View file

@ -88,8 +88,11 @@ public class ProcessModel implements Model, Serializable {
@Getter @Getter
@Setter @Setter
private List<NodeAddress> takerAcceptedArbitratorNodeAddresses; private List<NodeAddress> takerAcceptedArbitratorNodeAddresses;
@Getter
@Setter
private List<NodeAddress> takerAcceptedMediatorNodeAddresses; private List<NodeAddress> takerAcceptedMediatorNodeAddresses;
// that is used to store temp. the peers address when we get an incoming message before the message is verified. // that is used to store temp. the peers address when we get an incoming message before the message is verified.
// After successful verified we copy that over to the trade.tradingPeerAddress // After successful verified we copy that over to the trade.tradingPeerAddress
@Getter @Getter
@ -196,10 +199,6 @@ public class ProcessModel implements Model, Serializable {
return payoutTxSignature; return payoutTxSignature;
} }
public void setPayoutTxSignature(byte[] payoutTxSignature) {
this.payoutTxSignature = payoutTxSignature;
}
@Override @Override
public void persist() { public void persist() {
} }
@ -212,62 +211,6 @@ public class ProcessModel implements Model, Serializable {
return keyRing.getPubKeyRing(); return keyRing.getPubKeyRing();
} }
public KeyRing getKeyRing() {
return keyRing;
}
public void setTakerAcceptedArbitratorNodeAddresses(List<NodeAddress> takerAcceptedArbitratorNodeAddresses) {
this.takerAcceptedArbitratorNodeAddresses = takerAcceptedArbitratorNodeAddresses;
}
public List<NodeAddress> getTakerAcceptedArbitratorNodeAddresses() {
return takerAcceptedArbitratorNodeAddresses;
}
public void setTakerAcceptedMediatorNodeAddresses(List<NodeAddress> takerAcceptedMediatorNodeAddresses) {
this.takerAcceptedMediatorNodeAddresses = takerAcceptedMediatorNodeAddresses;
}
public List<NodeAddress> getTakerAcceptedMediatorNodeAddresses() {
return takerAcceptedMediatorNodeAddresses;
}
public void setTempTradingPeerNodeAddress(NodeAddress tempTradingPeerNodeAddress) {
this.tempTradingPeerNodeAddress = tempTradingPeerNodeAddress;
}
public NodeAddress getTempTradingPeerNodeAddress() {
return tempTradingPeerNodeAddress;
}
public ArbitratorManager getArbitratorManager() {
return arbitratorManager;
}
public void setPreparedDepositTx(byte[] preparedDepositTx) {
this.preparedDepositTx = preparedDepositTx;
}
public byte[] getPreparedDepositTx() {
return preparedDepositTx;
}
public void setRawTransactionInputs(ArrayList<RawTransactionInput> rawTransactionInputs) {
this.rawTransactionInputs = rawTransactionInputs;
}
public ArrayList<RawTransactionInput> getRawTransactionInputs() {
return rawTransactionInputs;
}
public void setChangeOutputValue(long changeOutputValue) {
this.changeOutputValue = changeOutputValue;
}
public long getChangeOutputValue() {
return changeOutputValue;
}
public void setChangeOutputAddress(String changeOutputAddress) { public void setChangeOutputAddress(String changeOutputAddress) {
this.changeOutputAddress = changeOutputAddress; this.changeOutputAddress = changeOutputAddress;
} }

View file

@ -34,7 +34,7 @@ import io.bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx;
import io.bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesAndSignsDepositTx; import io.bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesAndSignsDepositTx;
import io.bisq.core.util.Validator; import io.bisq.core.util.Validator;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View file

@ -33,7 +33,7 @@ import io.bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerCreatesDep
import io.bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignAndPublishDepositTx; import io.bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignAndPublishDepositTx;
import io.bisq.core.trade.protocol.tasks.taker.*; import io.bisq.core.trade.protocol.tasks.taker.*;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View file

@ -26,7 +26,7 @@ import io.bisq.core.trade.TradeManager;
import io.bisq.core.trade.messages.TradeMsg; import io.bisq.core.trade.messages.TradeMsg;
import io.bisq.network.p2p.DecryptedDirectMessageListener; import io.bisq.network.p2p.DecryptedDirectMessageListener;
import io.bisq.network.p2p.DecryptedMsgWithPubKey; import io.bisq.network.p2p.DecryptedMsgWithPubKey;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View file

@ -39,7 +39,7 @@ import io.bisq.gui.common.view.CachingViewLoader;
import io.bisq.gui.main.overlays.notifications.NotificationCenter; import io.bisq.gui.main.overlays.notifications.NotificationCenter;
import io.bisq.network.crypto.EncryptionServiceModule; import io.bisq.network.crypto.EncryptionServiceModule;
import io.bisq.network.p2p.P2PModule; import io.bisq.network.p2p.P2PModule;
import io.bisq.network.p2p.network.ProtobufferResolver; import io.bisq.common.persistance.ProtobufferResolver;
import javafx.stage.Stage; import javafx.stage.Stage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View file

@ -21,6 +21,7 @@ import com.google.inject.Inject;
import io.bisq.common.locale.CryptoCurrency; import io.bisq.common.locale.CryptoCurrency;
import io.bisq.common.locale.FiatCurrency; import io.bisq.common.locale.FiatCurrency;
import io.bisq.common.locale.TradeCurrency; import io.bisq.common.locale.TradeCurrency;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.core.offer.OpenOfferManager; import io.bisq.core.offer.OpenOfferManager;
import io.bisq.core.payment.CryptoCurrencyAccount; import io.bisq.core.payment.CryptoCurrencyAccount;
import io.bisq.core.payment.PaymentAccount; import io.bisq.core.payment.PaymentAccount;
@ -49,15 +50,17 @@ class AltCoinAccountsDataModel extends ActivatableDataModel {
final ObservableList<PaymentAccount> paymentAccounts = FXCollections.observableArrayList(); final ObservableList<PaymentAccount> paymentAccounts = FXCollections.observableArrayList();
private final SetChangeListener<PaymentAccount> setChangeListener; private final SetChangeListener<PaymentAccount> setChangeListener;
private final String accountsFileName = "AltcoinPaymentAccounts"; private final String accountsFileName = "AltcoinPaymentAccounts";
private final ProtobufferResolver protobufferResolver;
@Inject @Inject
public AltCoinAccountsDataModel(User user, Preferences preferences, OpenOfferManager openOfferManager, public AltCoinAccountsDataModel(User user, Preferences preferences, OpenOfferManager openOfferManager,
TradeManager tradeManager, Stage stage) { TradeManager tradeManager, Stage stage, ProtobufferResolver protobufferResolver) {
this.user = user; this.user = user;
this.preferences = preferences; this.preferences = preferences;
this.openOfferManager = openOfferManager; this.openOfferManager = openOfferManager;
this.tradeManager = tradeManager; this.tradeManager = tradeManager;
this.stage = stage; this.stage = stage;
this.protobufferResolver = protobufferResolver;
setChangeListener = change -> fillAndSortPaymentAccounts(); setChangeListener = change -> fillAndSortPaymentAccounts();
} }
@ -126,10 +129,10 @@ class AltCoinAccountsDataModel extends ActivatableDataModel {
ArrayList<PaymentAccount> accounts = new ArrayList<>(user.getPaymentAccounts().stream() ArrayList<PaymentAccount> accounts = new ArrayList<>(user.getPaymentAccounts().stream()
.filter(paymentAccount -> paymentAccount instanceof CryptoCurrencyAccount) .filter(paymentAccount -> paymentAccount instanceof CryptoCurrencyAccount)
.collect(Collectors.toList())); .collect(Collectors.toList()));
GUIUtil.exportAccounts(accounts, accountsFileName, preferences, stage); GUIUtil.exportAccounts(accounts, accountsFileName, preferences, stage, protobufferResolver);
} }
public void importAccounts() { public void importAccounts() {
GUIUtil.importAccounts(user, accountsFileName, preferences, stage); GUIUtil.importAccounts(user, accountsFileName, preferences, stage, protobufferResolver);
} }
} }

View file

@ -21,6 +21,7 @@ import com.google.inject.Inject;
import io.bisq.common.locale.CryptoCurrency; import io.bisq.common.locale.CryptoCurrency;
import io.bisq.common.locale.FiatCurrency; import io.bisq.common.locale.FiatCurrency;
import io.bisq.common.locale.TradeCurrency; import io.bisq.common.locale.TradeCurrency;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.core.offer.OpenOfferManager; import io.bisq.core.offer.OpenOfferManager;
import io.bisq.core.payment.CryptoCurrencyAccount; import io.bisq.core.payment.CryptoCurrencyAccount;
import io.bisq.core.payment.PaymentAccount; import io.bisq.core.payment.PaymentAccount;
@ -49,15 +50,17 @@ class FiatAccountsDataModel extends ActivatableDataModel {
final ObservableList<PaymentAccount> paymentAccounts = FXCollections.observableArrayList(); final ObservableList<PaymentAccount> paymentAccounts = FXCollections.observableArrayList();
private final SetChangeListener<PaymentAccount> setChangeListener; private final SetChangeListener<PaymentAccount> setChangeListener;
private final String accountsFileName = "FiatPaymentAccounts"; private final String accountsFileName = "FiatPaymentAccounts";
private final ProtobufferResolver protobufferResolver;
@Inject @Inject
public FiatAccountsDataModel(User user, Preferences preferences, OpenOfferManager openOfferManager, public FiatAccountsDataModel(User user, Preferences preferences, OpenOfferManager openOfferManager,
TradeManager tradeManager, Stage stage) { TradeManager tradeManager, Stage stage, ProtobufferResolver protobufferResolver) {
this.user = user; this.user = user;
this.preferences = preferences; this.preferences = preferences;
this.openOfferManager = openOfferManager; this.openOfferManager = openOfferManager;
this.tradeManager = tradeManager; this.tradeManager = tradeManager;
this.stage = stage; this.stage = stage;
this.protobufferResolver = protobufferResolver;
setChangeListener = change -> fillAndSortPaymentAccounts(); setChangeListener = change -> fillAndSortPaymentAccounts();
} }
@ -127,10 +130,10 @@ class FiatAccountsDataModel extends ActivatableDataModel {
ArrayList<PaymentAccount> accounts = new ArrayList<>(user.getPaymentAccounts().stream() ArrayList<PaymentAccount> accounts = new ArrayList<>(user.getPaymentAccounts().stream()
.filter(paymentAccount -> !(paymentAccount instanceof CryptoCurrencyAccount)) .filter(paymentAccount -> !(paymentAccount instanceof CryptoCurrencyAccount))
.collect(Collectors.toList())); .collect(Collectors.toList()));
GUIUtil.exportAccounts(accounts, accountsFileName, preferences, stage); GUIUtil.exportAccounts(accounts, accountsFileName, preferences, stage, protobufferResolver);
} }
public void importAccounts() { public void importAccounts() {
GUIUtil.importAccounts(user, accountsFileName, preferences, stage); GUIUtil.importAccounts(user, accountsFileName, preferences, stage, protobufferResolver);
} }
} }

View file

@ -40,7 +40,8 @@ import org.bitcoinj.crypto.KeyCrypterScrypt;
import javax.inject.Inject; import javax.inject.Inject;
import static com.google.inject.internal.util.$Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
@FxmlView @FxmlView
public class PasswordView extends ActivatableView<GridPane, Void> { public class PasswordView extends ActivatableView<GridPane, Void> {

View file

@ -59,7 +59,7 @@ import java.time.ZoneId;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static com.google.inject.internal.util.$Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static io.bisq.gui.util.FormBuilder.*; import static io.bisq.gui.util.FormBuilder.*;
import static javafx.beans.binding.Bindings.createBooleanBinding; import static javafx.beans.binding.Bindings.createBooleanBinding;

View file

@ -26,6 +26,7 @@ import io.bisq.common.app.DevEnv;
import io.bisq.common.locale.CurrencyUtil; import io.bisq.common.locale.CurrencyUtil;
import io.bisq.common.locale.Res; import io.bisq.common.locale.Res;
import io.bisq.common.locale.TradeCurrency; import io.bisq.common.locale.TradeCurrency;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.core.payment.PaymentAccount; import io.bisq.core.payment.PaymentAccount;
@ -88,10 +89,11 @@ public class GUIUtil {
} }
} }
public static void exportAccounts(ArrayList<PaymentAccount> accounts, String fileName, Preferences preferences, Stage stage) { public static void exportAccounts(ArrayList<PaymentAccount> accounts, String fileName,
Preferences preferences, Stage stage, ProtobufferResolver protobufferResolver) {
if (!accounts.isEmpty()) { if (!accounts.isEmpty()) {
String directory = getDirectoryFromChooser(preferences, stage); String directory = getDirectoryFromChooser(preferences, stage);
Storage<ArrayList<PaymentAccount>> paymentAccountsStorage = new Storage<>(new File(directory)); Storage<ArrayList<PaymentAccount>> paymentAccountsStorage = new Storage<>(new File(directory), protobufferResolver);
paymentAccountsStorage.initAndGetPersisted(accounts, fileName); paymentAccountsStorage.initAndGetPersisted(accounts, fileName);
paymentAccountsStorage.queueUpForSave(); paymentAccountsStorage.queueUpForSave();
new Popup<>().feedback(Res.get("guiUtil.accountExport.savedToPath", Paths.get(directory, fileName).toAbsolutePath())).show(); new Popup<>().feedback(Res.get("guiUtil.accountExport.savedToPath", Paths.get(directory, fileName).toAbsolutePath())).show();
@ -100,7 +102,8 @@ public class GUIUtil {
} }
} }
public static void importAccounts(User user, String fileName, Preferences preferences, Stage stage) { public static void importAccounts(User user, String fileName, Preferences preferences, Stage stage,
ProtobufferResolver protobufferResolver) {
FileChooser fileChooser = new FileChooser(); FileChooser fileChooser = new FileChooser();
fileChooser.setInitialDirectory(new File(preferences.getDirectoryChooserPath())); fileChooser.setInitialDirectory(new File(preferences.getDirectoryChooserPath()));
fileChooser.setTitle(Res.get("guiUtil.accountExport.selectPath", fileName)); fileChooser.setTitle(Res.get("guiUtil.accountExport.selectPath", fileName));
@ -110,7 +113,7 @@ public class GUIUtil {
if (Paths.get(path).getFileName().toString().equals(fileName)) { if (Paths.get(path).getFileName().toString().equals(fileName)) {
String directory = Paths.get(path).getParent().toString(); String directory = Paths.get(path).getParent().toString();
preferences.setDirectoryChooserPath(directory); preferences.setDirectoryChooserPath(directory);
Storage<ArrayList<PaymentAccount>> paymentAccountsStorage = new Storage<>(new File(directory)); Storage<ArrayList<PaymentAccount>> paymentAccountsStorage = new Storage<>(new File(directory), protobufferResolver);
ArrayList<PaymentAccount> persisted = paymentAccountsStorage.initAndGetPersistedWithFileName(fileName); ArrayList<PaymentAccount> persisted = paymentAccountsStorage.initAndGetPersistedWithFileName(fileName);
if (persisted != null) { if (persisted != null) {
final StringBuilder msg = new StringBuilder(); final StringBuilder msg = new StringBuilder();

View file

@ -18,7 +18,7 @@
package io.bisq.network.crypto; package io.bisq.network.crypto;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import java.security.PublicKey; import java.security.PublicKey;

View file

@ -22,8 +22,8 @@ import io.bisq.common.Marshaller;
import io.bisq.common.crypto.*; import io.bisq.common.crypto.*;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.DecryptedMsgWithPubKey; import io.bisq.network.p2p.DecryptedMsgWithPubKey;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.network.ProtobufferResolver; import io.bisq.common.persistance.ProtobufferResolver;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;

View file

@ -1,4 +1,6 @@
package io.bisq.network.p2p; package io.bisq.network.p2p;
import io.bisq.common.persistance.Msg;
public interface AnonymousMsg extends Msg { public interface AnonymousMsg extends Msg {
} }

View file

@ -1,6 +1,7 @@
package io.bisq.network.p2p; package io.bisq.network.p2p;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.common.persistance.Msg;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
public final class CloseConnectionMsg implements Msg { public final class CloseConnectionMsg implements Msg {

View file

@ -18,6 +18,7 @@
package io.bisq.network.p2p; package io.bisq.network.p2p;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.Persistable; import io.bisq.common.persistance.Persistable;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;

View file

@ -17,5 +17,7 @@
package io.bisq.network.p2p; package io.bisq.network.p2p;
import io.bisq.common.persistance.Msg;
public interface DirectMsg extends Msg { public interface DirectMsg extends Msg {
} }

View file

@ -12,6 +12,8 @@ import io.bisq.common.app.Log;
import io.bisq.common.crypto.CryptoException; import io.bisq.common.crypto.CryptoException;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.crypto.PubKeyRing; import io.bisq.common.crypto.PubKeyRing;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.FileUtil; import io.bisq.common.storage.FileUtil;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
@ -198,11 +200,11 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
else else
seedNodeAddresses = seedNodesRepository.getSeedNodeAddresses(useLocalhostForP2P, networkId); seedNodeAddresses = seedNodesRepository.getSeedNodeAddresses(useLocalhostForP2P, networkId);
peerManager = new PeerManager(networkNode, maxConnections, seedNodeAddresses, storageDir, clock); peerManager = new PeerManager(networkNode, maxConnections, seedNodeAddresses, storageDir, clock, protobufferResolver);
broadcaster = new Broadcaster(networkNode, peerManager); broadcaster = new Broadcaster(networkNode, peerManager);
p2PDataStorage = new P2PDataStorage(broadcaster, networkNode, storageDir); p2PDataStorage = new P2PDataStorage(broadcaster, networkNode, storageDir, protobufferResolver);
p2PDataStorage.addHashMapChangedListener(this); p2PDataStorage.addHashMapChangedListener(this);
requestDataManager = new RequestDataManager(networkNode, p2PDataStorage, peerManager, seedNodeAddresses, this); requestDataManager = new RequestDataManager(networkNode, p2PDataStorage, peerManager, seedNodeAddresses, this);

View file

@ -1,6 +1,8 @@
package io.bisq.network.p2p; package io.bisq.network.p2p;
import io.bisq.common.persistance.Msg;
public interface SendersNodeAddressMsg extends Msg { public interface SendersNodeAddressMsg extends Msg {
NodeAddress getSenderNodeAddress(); NodeAddress getSenderNodeAddress();
} }

View file

@ -1,5 +1,7 @@
package io.bisq.network.p2p; package io.bisq.network.p2p;
import io.bisq.common.persistance.Msg;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -6,6 +6,8 @@ import com.google.common.util.concurrent.Uninterruptibles;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.util.Tuple2; import io.bisq.common.util.Tuple2;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;

View file

@ -1,5 +1,7 @@
package io.bisq.network.p2p.network; package io.bisq.network.p2p.network;
import io.bisq.common.persistance.ProtobufferResolver;
import java.net.Socket; import java.net.Socket;
public class InboundConnection extends Connection { public class InboundConnection extends Connection {

View file

@ -8,6 +8,7 @@ import com.msopentech.thali.java.toronionproxy.JavaOnionProxyContext;
import com.msopentech.thali.java.toronionproxy.JavaOnionProxyManager; import com.msopentech.thali.java.toronionproxy.JavaOnionProxyManager;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.nucleo.net.HiddenServiceDescriptor; import io.nucleo.net.HiddenServiceDescriptor;

View file

@ -1,6 +1,6 @@
package io.bisq.network.p2p.network; package io.bisq.network.p2p.network;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
public interface MessageListener { public interface MessageListener {
void onMessage(Msg msg, Connection connection); void onMessage(Msg msg, Connection connection);

View file

@ -4,8 +4,9 @@ import com.google.common.util.concurrent.*;
import com.runjva.sourceforge.jsocks.protocol.Socks5Proxy; import com.runjva.sourceforge.jsocks.protocol.Socks5Proxy;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty;

View file

@ -1,5 +1,6 @@
package io.bisq.network.p2p.network; package io.bisq.network.p2p.network;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import java.net.Socket; import java.net.Socket;

View file

@ -1,6 +1,7 @@
package io.bisq.network.p2p.network; package io.bisq.network.p2p.network;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.persistance.ProtobufferResolver;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View file

@ -1,7 +1,7 @@
package io.bisq.network.p2p.network; package io.bisq.network.p2p.network;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import javafx.beans.property.IntegerProperty; import javafx.beans.property.IntegerProperty;
import javafx.beans.property.LongProperty; import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleIntegerProperty;

View file

@ -10,6 +10,7 @@ import com.runjva.sourceforge.jsocks.protocol.Socks5Proxy;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.Utils; import io.bisq.network.p2p.Utils;

View file

@ -4,6 +4,7 @@ import io.bisq.common.Clock;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.network.*; import io.bisq.network.p2p.network.*;
@ -87,14 +88,14 @@ public class PeerManager implements ConnectionListener {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public PeerManager(NetworkNode networkNode, int maxConnections, Set<NodeAddress> seedNodeAddresses, public PeerManager(NetworkNode networkNode, int maxConnections, Set<NodeAddress> seedNodeAddresses,
File storageDir, Clock clock) { File storageDir, Clock clock, ProtobufferResolver protobufferResolver) {
setConnectionLimits(maxConnections); setConnectionLimits(maxConnections);
this.networkNode = networkNode; this.networkNode = networkNode;
this.clock = clock; this.clock = clock;
// seedNodeAddresses can be empty (in case there is only 1 seed node, the seed node starting up has no other seed nodes) // seedNodeAddresses can be empty (in case there is only 1 seed node, the seed node starting up has no other seed nodes)
this.seedNodeAddresses = new HashSet<>(seedNodeAddresses); this.seedNodeAddresses = new HashSet<>(seedNodeAddresses);
networkNode.addConnectionListener(this); networkNode.addConnectionListener(this);
dbStorage = new Storage<>(storageDir); dbStorage = new Storage<>(storageDir, protobufferResolver);
HashSet<Peer> persistedPeers = dbStorage.initAndGetPersistedWithFileName("PersistedPeers"); HashSet<Peer> persistedPeers = dbStorage.initAndGetPersistedWithFileName("PersistedPeers");
if (persistedPeers != null) { if (persistedPeers != null) {
log.debug("We have persisted reported peers. persistedPeers.size()=" + persistedPeers.size()); log.debug("We have persisted reported peers. persistedPeers.size()=" + persistedPeers.size());

View file

@ -6,7 +6,7 @@ import com.google.common.util.concurrent.SettableFuture;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.network.CloseConnectionReason; import io.bisq.network.p2p.network.CloseConnectionReason;
import io.bisq.network.p2p.network.Connection; import io.bisq.network.p2p.network.Connection;

View file

@ -3,7 +3,7 @@ package io.bisq.network.p2p.peers.getdata;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.network.*; import io.bisq.network.p2p.network.*;
import io.bisq.network.p2p.peers.PeerManager; import io.bisq.network.p2p.peers.PeerManager;

View file

@ -1,6 +1,6 @@
package io.bisq.network.p2p.peers.getdata.messages; package io.bisq.network.p2p.peers.getdata.messages;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import java.util.Set; import java.util.Set;

View file

@ -6,7 +6,7 @@ import com.google.common.util.concurrent.SettableFuture;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.network.Connection; import io.bisq.network.p2p.network.Connection;
import io.bisq.network.p2p.network.MessageListener; import io.bisq.network.p2p.network.MessageListener;
import io.bisq.network.p2p.network.NetworkNode; import io.bisq.network.p2p.network.NetworkNode;

View file

@ -6,7 +6,7 @@ import com.google.common.util.concurrent.SettableFuture;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.network.*; import io.bisq.network.p2p.network.*;
import io.bisq.network.p2p.peers.PeerManager; import io.bisq.network.p2p.peers.PeerManager;
import io.bisq.network.p2p.peers.keepalive.messages.Ping; import io.bisq.network.p2p.peers.keepalive.messages.Ping;

View file

@ -1,7 +1,7 @@
package io.bisq.network.p2p.peers.keepalive.messages; package io.bisq.network.p2p.peers.keepalive.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
public abstract class KeepAliveMsg implements Msg { public abstract class KeepAliveMsg implements Msg {
//TODO add serialVersionUID also in superclasses as changes would break compatibility //TODO add serialVersionUID also in superclasses as changes would break compatibility

View file

@ -2,7 +2,7 @@ package io.bisq.network.p2p.peers.keepalive.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
public final class Ping extends KeepAliveMsg { public final class Ping extends KeepAliveMsg {
// That object is sent over the wire, so we need to take care of version compatibility. // That object is sent over the wire, so we need to take care of version compatibility.

View file

@ -2,7 +2,7 @@ package io.bisq.network.p2p.peers.keepalive.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
public final class Pong extends KeepAliveMsg { public final class Pong extends KeepAliveMsg {
// That object is sent over the wire, so we need to take care of version compatibility. // That object is sent over the wire, so we need to take care of version compatibility.

View file

@ -6,7 +6,7 @@ import com.google.common.util.concurrent.SettableFuture;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.network.CloseConnectionReason; import io.bisq.network.p2p.network.CloseConnectionReason;
import io.bisq.network.p2p.network.Connection; import io.bisq.network.p2p.network.Connection;

View file

@ -4,7 +4,7 @@ import com.google.common.base.Preconditions;
import io.bisq.common.Timer; import io.bisq.common.Timer;
import io.bisq.common.UserThread; import io.bisq.common.UserThread;
import io.bisq.common.app.Log; import io.bisq.common.app.Log;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.network.*; import io.bisq.network.p2p.network.*;
import io.bisq.network.p2p.peers.PeerManager; import io.bisq.network.p2p.peers.PeerManager;

View file

@ -1,7 +1,7 @@
package io.bisq.network.p2p.peers.peerexchange.messages; package io.bisq.network.p2p.peers.peerexchange.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
abstract class PeerExchangeMsg implements Msg { abstract class PeerExchangeMsg implements Msg {
//TODO add serialVersionUID also in superclasses as changes would break compatibility //TODO add serialVersionUID also in superclasses as changes would break compatibility

View file

@ -9,6 +9,7 @@ import io.bisq.common.app.Version;
import io.bisq.common.crypto.CryptoException; import io.bisq.common.crypto.CryptoException;
import io.bisq.common.crypto.Sig; import io.bisq.common.crypto.Sig;
import io.bisq.common.persistance.Persistable; import io.bisq.common.persistance.Persistable;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.FileUtil; import io.bisq.common.storage.FileUtil;
import io.bisq.common.storage.ResourceNotFoundException; import io.bisq.common.storage.ResourceNotFoundException;
import io.bisq.common.storage.Storage; import io.bisq.common.storage.Storage;
@ -16,7 +17,7 @@ import io.bisq.common.util.Tuple2;
import io.bisq.common.util.Utilities; import io.bisq.common.util.Utilities;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.crypto.EncryptionService; import io.bisq.network.crypto.EncryptionService;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import io.bisq.network.p2p.network.*; import io.bisq.network.p2p.network.*;
import io.bisq.network.p2p.peers.BroadcastHandler; import io.bisq.network.p2p.peers.BroadcastHandler;
@ -68,14 +69,14 @@ public class P2PDataStorage implements MessageListener, ConnectionListener {
// Constructor // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public P2PDataStorage(Broadcaster broadcaster, NetworkNode networkNode, File storageDir) { public P2PDataStorage(Broadcaster broadcaster, NetworkNode networkNode, File storageDir, ProtobufferResolver protobufferResolver) {
this.broadcaster = broadcaster; this.broadcaster = broadcaster;
networkNode.addMessageListener(this); networkNode.addMessageListener(this);
networkNode.addConnectionListener(this); networkNode.addConnectionListener(this);
sequenceNumberMapStorage = new Storage<>(storageDir); sequenceNumberMapStorage = new Storage<>(storageDir, protobufferResolver);
persistedEntryMapStorage = new Storage<>(storageDir); persistedEntryMapStorage = new Storage<>(storageDir, protobufferResolver);
init(storageDir); init(storageDir);
} }

View file

@ -2,7 +2,7 @@ package io.bisq.network.p2p.storage.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.storage.payload.ProtectedMailboxStorageEntry; import io.bisq.network.p2p.storage.payload.ProtectedMailboxStorageEntry;
import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry; import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry;

View file

@ -1,7 +1,7 @@
package io.bisq.network.p2p.storage.messages; package io.bisq.network.p2p.storage.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
public abstract class BroadcastMsg implements Msg { public abstract class BroadcastMsg implements Msg {
//TODO add serialVersionUID also in superclasses as changes would break compatibility //TODO add serialVersionUID also in superclasses as changes would break compatibility

View file

@ -2,7 +2,7 @@ package io.bisq.network.p2p.storage.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry; import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry;
public final class RemoveDataMsg extends BroadcastMsg { public final class RemoveDataMsg extends BroadcastMsg {

View file

@ -2,7 +2,7 @@ package io.bisq.network.p2p.storage.messages;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.storage.payload.ProtectedMailboxStorageEntry; import io.bisq.network.p2p.storage.payload.ProtectedMailboxStorageEntry;

View file

@ -26,7 +26,7 @@ import io.bisq.common.crypto.PubKeyRing;
import io.bisq.common.storage.FileUtil; import io.bisq.common.storage.FileUtil;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.MailboxMsg; import io.bisq.network.p2p.MailboxMsg;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.After; import org.junit.After;

View file

@ -2,9 +2,11 @@ package io.bisq.network.p2p;
import io.bisq.common.Clock; import io.bisq.common.Clock;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.persistance.Msg;
import io.bisq.common.persistance.Persistable;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.crypto.EncryptionService; import io.bisq.network.crypto.EncryptionService;
import io.bisq.network.p2p.network.ProtobufferResolver; import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.network.p2p.seed.SeedNodesRepository; import io.bisq.network.p2p.seed.SeedNodesRepository;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -176,6 +178,11 @@ public class TestUtils {
public Optional<Msg> fromProto(PB.Envelope envelope) { public Optional<Msg> fromProto(PB.Envelope envelope) {
return Optional.empty(); return Optional.empty();
} }
@Override
public Optional<Persistable> fromProto(PB.DiskEnvelope envelope) {
return null;
}
}; };
} }
} }

View file

@ -2,7 +2,7 @@ package io.bisq.network.p2p.mocks;
import io.bisq.common.app.Version; import io.bisq.common.app.Version;
import io.bisq.generated.protobuffer.PB; import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.Msg; import io.bisq.common.persistance.Msg;
import io.bisq.network.p2p.storage.payload.ExpirablePayload; import io.bisq.network.p2p.storage.payload.ExpirablePayload;
import sun.reflect.generics.reflectiveObjects.NotImplementedException; import sun.reflect.generics.reflectiveObjects.NotImplementedException;

View file

@ -3,6 +3,7 @@ package io.bisq.network.p2p.storage;
import io.bisq.common.crypto.CryptoException; import io.bisq.common.crypto.CryptoException;
import io.bisq.common.crypto.KeyRing; import io.bisq.common.crypto.KeyRing;
import io.bisq.common.crypto.KeyStorage; import io.bisq.common.crypto.KeyStorage;
import io.bisq.common.persistance.ProtobufferResolver;
import io.bisq.common.storage.FileUtil; import io.bisq.common.storage.FileUtil;
import io.bisq.network.crypto.EncryptionService; import io.bisq.network.crypto.EncryptionService;
import io.bisq.network.p2p.NodeAddress; import io.bisq.network.p2p.NodeAddress;
@ -43,6 +44,8 @@ public class P2PDataStorageTest {
Broadcaster broadcaster; Broadcaster broadcaster;
@Mocked @Mocked
NetworkNode networkNode; NetworkNode networkNode;
@Mocked
ProtobufferResolver protobufferResolver;
@Before @Before
public void setup() throws InterruptedException, NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException, CryptoException, SignatureException, InvalidKeyException { public void setup() throws InterruptedException, NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException, CryptoException, SignatureException, InvalidKeyException {
@ -62,7 +65,7 @@ public class P2PDataStorageTest {
keyRing2 = new KeyRing(new KeyStorage(dir2)); keyRing2 = new KeyRing(new KeyStorage(dir2));
storageSignatureKeyPair2 = keyRing2.getSignatureKeyPair(); storageSignatureKeyPair2 = keyRing2.getSignatureKeyPair();
encryptionService2 = new EncryptionService(keyRing2, TestUtils.getProtobufferResolver()); encryptionService2 = new EncryptionService(keyRing2, TestUtils.getProtobufferResolver());
dataStorage1 = new P2PDataStorage(broadcaster, networkNode, dir1); dataStorage1 = new P2PDataStorage(broadcaster, networkNode, dir1, protobufferResolver);
} }
@After @After

10
pom.xml
View file

@ -122,7 +122,7 @@
<dependency> <dependency>
<groupId>com.google.inject</groupId> <groupId>com.google.inject</groupId>
<artifactId>guice</artifactId> <artifactId>guice</artifactId>
<version>3.0</version> <version>4.1.0</version>
</dependency> </dependency>
<!--crypto--> <!--crypto-->
@ -165,7 +165,7 @@
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>18.0</version> <version>19.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.fxmisc.easybind</groupId> <groupId>org.fxmisc.easybind</groupId>
@ -239,6 +239,12 @@
<groupId>com.google.protobuf</groupId> <groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId> <artifactId>protobuf-java-util</artifactId>
<version>3.2.0</version> <version>3.2.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -36,7 +36,7 @@ import io.bisq.core.user.Preferences;
import io.bisq.core.user.User; import io.bisq.core.user.User;
import io.bisq.network.crypto.EncryptionServiceModule; import io.bisq.network.crypto.EncryptionServiceModule;
import io.bisq.network.p2p.P2PModule; import io.bisq.network.p2p.P2PModule;
import io.bisq.network.p2p.network.ProtobufferResolver; import io.bisq.common.persistance.ProtobufferResolver;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;

View file

@ -36,7 +36,7 @@ import io.bisq.core.user.Preferences;
import io.bisq.core.user.User; import io.bisq.core.user.User;
import io.bisq.network.crypto.EncryptionServiceModule; import io.bisq.network.crypto.EncryptionServiceModule;
import io.bisq.network.p2p.P2PModule; import io.bisq.network.p2p.P2PModule;
import io.bisq.network.p2p.network.ProtobufferResolver; import io.bisq.common.persistance.ProtobufferResolver;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;