diff --git a/src/main/java/org/qortal/controller/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/ArbitraryDataManager.java
index 1b3311d0..8292d2a5 100644
--- a/src/main/java/org/qortal/controller/ArbitraryDataManager.java
+++ b/src/main/java/org/qortal/controller/ArbitraryDataManager.java
@@ -12,8 +12,6 @@ import org.qortal.data.transaction.TransactionData;
import org.qortal.repository.DataException;
import org.qortal.repository.Repository;
import org.qortal.repository.RepositoryManager;
-import org.qortal.storage.DataFile;
-import org.qortal.storage.DataFileChunk;
import org.qortal.transaction.ArbitraryTransaction;
import org.qortal.transaction.Transaction.TransactionType;
@@ -62,53 +60,9 @@ public class ArbitraryDataManager extends Thread {
final int index = new Random().nextInt(signatures.size());
byte[] signature = signatures.get(index);
- // Load the full transaction data so we can access the file hashes
- ArbitraryTransactionData transactionData = (ArbitraryTransactionData)repository.getTransactionRepository().fromSignature(signature);
- if (!(transactionData instanceof ArbitraryTransactionData)) {
- signatures.remove(signature);
- continue;
- }
-
- // Load hashes
- byte[] digest = transactionData.getData();
- byte[] chunkHashes = transactionData.getChunkHashes();
-
- // Load data file(s)
- DataFile dataFile = DataFile.fromDigest(digest);
- if (chunkHashes.length > 0) {
- dataFile.addChunkHashes(chunkHashes);
-
- // Now try and fetch each chunk in turn if we don't have them already
- for (DataFileChunk dataFileChunk : dataFile.getChunks()) {
- if (!dataFileChunk.exists()) {
- LOGGER.info("Requesting chunk {}...", dataFileChunk);
- boolean success = Controller.getInstance().fetchArbitraryDataFile(dataFileChunk.getHash());
- if (success) {
- LOGGER.info("Chunk {} received", dataFileChunk);
- }
- else {
- LOGGER.info("Couldn't retrieve chunk {}", dataFileChunk);
- }
- }
- }
- }
- else if (transactionData.getSize() < DataFileChunk.CHUNK_SIZE) {
- // Fetch the complete file, as it is less than the chunk size
- LOGGER.info("Requesting file {}...", dataFile.getHash58());
- boolean success = Controller.getInstance().fetchArbitraryDataFile(dataFile.getHash());
- if (success) {
- LOGGER.info("File {} received", dataFile);
- }
- else {
- LOGGER.info("Couldn't retrieve file {}", dataFile);
- }
- }
- else {
- // Invalid transaction (should have already failed validation)
- LOGGER.info(String.format("Invalid arbitrary transaction: %.8s", signature));
- }
-
- signatures.remove(signature);
+ // Ask our connected peers if they have files for this signature
+ // This process automatically then fetches the files themselves if a peer is found
+ Controller.getInstance().fetchArbitraryDataFileList(signature);
} catch (DataException e) {
LOGGER.error("Repository issue when fetching arbitrary transaction data", e);
diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java
index 9e3f8903..576356c4 100644
--- a/src/main/java/org/qortal/controller/Controller.java
+++ b/src/main/java/org/qortal/controller/Controller.java
@@ -14,7 +14,6 @@ import org.qortal.block.Block;
import org.qortal.block.BlockChain;
import org.qortal.block.BlockChain.BlockTimingByHeight;
import org.qortal.controller.Synchronizer.SynchronizationResult;
-import org.qortal.crypto.Crypto;
import org.qortal.data.account.MintingAccountData;
import org.qortal.data.account.RewardShareData;
import org.qortal.data.block.BlockData;
@@ -23,7 +22,6 @@ import org.qortal.data.network.OnlineAccountData;
import org.qortal.data.network.PeerChainTipData;
import org.qortal.data.network.PeerData;
import org.qortal.data.transaction.ArbitraryTransactionData;
-import org.qortal.data.transaction.ArbitraryTransactionData.DataType;
import org.qortal.data.transaction.ChatTransactionData;
import org.qortal.data.transaction.TransactionData;
import org.qortal.event.Event;
@@ -41,6 +39,7 @@ import org.qortal.repository.RepositoryManager;
import org.qortal.repository.hsqldb.HSQLDBRepositoryFactory;
import org.qortal.settings.Settings;
import org.qortal.storage.DataFile;
+import org.qortal.storage.DataFileChunk;
import org.qortal.transaction.ArbitraryTransaction;
import org.qortal.transaction.Transaction;
import org.qortal.transaction.Transaction.TransactionType;
@@ -167,7 +166,9 @@ public class Controller extends Thread {
*
we have forwarded the data payload (and maybe also saved it locally)
*
*/
- private Map> arbitraryDataRequests = Collections.synchronizedMap(new HashMap<>());
+ private Map> arbitraryDataFileListRequests = Collections.synchronizedMap(new HashMap<>());
+
+ private List