forked from Qortal/qortal
Separated computeNonce() from build() in the transaction builder.
This gives the option of the nonce to be computed elsewhere, such as in the UI, and also allows transaction unit tests to run much more quickly.
This commit is contained in:
parent
1b170c74c0
commit
af8d0a3965
@ -563,10 +563,11 @@ public class ArbitraryResource {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
ArbitraryDataTransactionBuilder transactionBuilder = new ArbitraryDataTransactionBuilder(
|
ArbitraryDataTransactionBuilder transactionBuilder = new ArbitraryDataTransactionBuilder(
|
||||||
publicKey58, Paths.get(path), name, null, service, identifier
|
repository, publicKey58, Paths.get(path), name, null, service, identifier
|
||||||
);
|
);
|
||||||
|
|
||||||
transactionBuilder.build();
|
transactionBuilder.build();
|
||||||
|
transactionBuilder.computeNonce();
|
||||||
ArbitraryTransactionData transactionData = transactionBuilder.getArbitraryTransactionData();
|
ArbitraryTransactionData transactionData = transactionBuilder.getArbitraryTransactionData();
|
||||||
return Base58.encode(ArbitraryTransactionTransformer.toBytes(transactionData));
|
return Base58.encode(ArbitraryTransactionTransformer.toBytes(transactionData));
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@ import org.qortal.data.transaction.BaseTransactionData;
|
|||||||
import org.qortal.group.Group;
|
import org.qortal.group.Group;
|
||||||
import org.qortal.repository.DataException;
|
import org.qortal.repository.DataException;
|
||||||
import org.qortal.repository.Repository;
|
import org.qortal.repository.Repository;
|
||||||
import org.qortal.repository.RepositoryManager;
|
|
||||||
import org.qortal.transaction.ArbitraryTransaction;
|
import org.qortal.transaction.ArbitraryTransaction;
|
||||||
import org.qortal.transaction.Transaction;
|
import org.qortal.transaction.Transaction;
|
||||||
import org.qortal.transform.Transformer;
|
import org.qortal.transform.Transformer;
|
||||||
@ -48,11 +47,14 @@ public class ArbitraryDataTransactionBuilder {
|
|||||||
private Method method;
|
private Method method;
|
||||||
private final Service service;
|
private final Service service;
|
||||||
private final String identifier;
|
private final String identifier;
|
||||||
|
private final Repository repository;
|
||||||
|
|
||||||
private ArbitraryTransactionData arbitraryTransactionData;
|
private ArbitraryTransactionData arbitraryTransactionData;
|
||||||
|
private ArbitraryDataFile arbitraryDataFile;
|
||||||
|
|
||||||
public ArbitraryDataTransactionBuilder(String publicKey58, Path path, String name,
|
public ArbitraryDataTransactionBuilder(Repository repository, String publicKey58, Path path, String name,
|
||||||
Method method, Service service, String identifier) {
|
Method method, Service service, String identifier) {
|
||||||
|
this.repository = repository;
|
||||||
this.publicKey58 = publicKey58;
|
this.publicKey58 = publicKey58;
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -134,8 +136,8 @@ public class ArbitraryDataTransactionBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void createTransaction() throws DataException {
|
private void createTransaction() throws DataException {
|
||||||
ArbitraryDataFile arbitraryDataFile = null;
|
arbitraryDataFile = null;
|
||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
try {
|
||||||
Long now = NTP.getTime();
|
Long now = NTP.getTime();
|
||||||
if (now == null) {
|
if (now == null) {
|
||||||
throw new DataException("NTP time not synced yet");
|
throw new DataException("NTP time not synced yet");
|
||||||
@ -201,17 +203,6 @@ public class ArbitraryDataTransactionBuilder {
|
|||||||
version, service, nonce, size, name, identifier, method,
|
version, service, nonce, size, name, identifier, method,
|
||||||
secret, compression, digest, dataType, chunkHashes, payments);
|
secret, compression, digest, dataType, chunkHashes, payments);
|
||||||
|
|
||||||
ArbitraryTransaction transaction = (ArbitraryTransaction) Transaction.fromData(repository, transactionData);
|
|
||||||
LOGGER.info("Computing nonce...");
|
|
||||||
transaction.computeNonce();
|
|
||||||
|
|
||||||
Transaction.ValidationResult result = transaction.isValidUnconfirmed();
|
|
||||||
if (result != Transaction.ValidationResult.OK) {
|
|
||||||
arbitraryDataFile.deleteAll();
|
|
||||||
throw new DataException(String.format("Arbitrary transaction invalid: %s", result));
|
|
||||||
}
|
|
||||||
LOGGER.info("Transaction is valid");
|
|
||||||
|
|
||||||
this.arbitraryTransactionData = transactionData;
|
this.arbitraryTransactionData = transactionData;
|
||||||
|
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
@ -223,6 +214,23 @@ public class ArbitraryDataTransactionBuilder {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void computeNonce() throws DataException {
|
||||||
|
if (this.arbitraryTransactionData == null) {
|
||||||
|
throw new DataException("Arbitrary transaction data is required to compute nonce");
|
||||||
|
}
|
||||||
|
|
||||||
|
ArbitraryTransaction transaction = (ArbitraryTransaction) Transaction.fromData(repository, this.arbitraryTransactionData);
|
||||||
|
LOGGER.info("Computing nonce...");
|
||||||
|
transaction.computeNonce();
|
||||||
|
|
||||||
|
Transaction.ValidationResult result = transaction.isValidUnconfirmed();
|
||||||
|
if (result != Transaction.ValidationResult.OK) {
|
||||||
|
arbitraryDataFile.deleteAll();
|
||||||
|
throw new DataException(String.format("Arbitrary transaction invalid: %s", result));
|
||||||
|
}
|
||||||
|
LOGGER.info("Transaction is valid");
|
||||||
|
}
|
||||||
|
|
||||||
public ArbitraryTransactionData getArbitraryTransactionData() {
|
public ArbitraryTransactionData getArbitraryTransactionData() {
|
||||||
return this.arbitraryTransactionData;
|
return this.arbitraryTransactionData;
|
||||||
}
|
}
|
||||||
|
@ -369,9 +369,10 @@ public class ArbitraryDataTests extends Common {
|
|||||||
Method method, Service service, PrivateKeyAccount account) throws DataException {
|
Method method, Service service, PrivateKeyAccount account) throws DataException {
|
||||||
|
|
||||||
ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder(
|
ArbitraryDataTransactionBuilder txnBuilder = new ArbitraryDataTransactionBuilder(
|
||||||
publicKey58, path, name, method, service, identifier);
|
repository, publicKey58, path, name, method, service, identifier);
|
||||||
|
|
||||||
txnBuilder.build();
|
txnBuilder.build();
|
||||||
|
txnBuilder.computeNonce();
|
||||||
ArbitraryTransactionData transactionData = txnBuilder.getArbitraryTransactionData();
|
ArbitraryTransactionData transactionData = txnBuilder.getArbitraryTransactionData();
|
||||||
Transaction.ValidationResult result = TransactionUtils.signAndImport(repository, transactionData, account);
|
Transaction.ValidationResult result = TransactionUtils.signAndImport(repository, transactionData, account);
|
||||||
assertEquals(Transaction.ValidationResult.OK, result);
|
assertEquals(Transaction.ValidationResult.OK, result);
|
||||||
|
Loading…
Reference in New Issue
Block a user