diff --git a/src/main/java/org/qortal/api/resource/WebsiteResource.java b/src/main/java/org/qortal/api/resource/WebsiteResource.java index bf58492f..4db2ca71 100644 --- a/src/main/java/org/qortal/api/resource/WebsiteResource.java +++ b/src/main/java/org/qortal/api/resource/WebsiteResource.java @@ -27,12 +27,23 @@ import org.jsoup.select.Elements; import org.qortal.api.ApiError; import org.qortal.api.ApiExceptionFactory; import org.qortal.api.Security; +import org.qortal.block.BlockChain; +import org.qortal.data.PaymentData; import org.qortal.data.account.AccountData; +import org.qortal.data.transaction.ArbitraryTransactionData; +import org.qortal.data.transaction.BaseTransactionData; +import org.qortal.group.Group; import org.qortal.repository.DataException; import org.qortal.repository.Repository; import org.qortal.repository.RepositoryManager; import org.qortal.settings.Settings; import org.qortal.storage.DataFile; +import org.qortal.transaction.ArbitraryTransaction; +import org.qortal.transaction.Transaction; +import org.qortal.transform.TransformationException; +import org.qortal.transform.transaction.ArbitraryTransactionTransformer; +import org.qortal.utils.Base58; +import org.qortal.utils.NTP; import org.qortal.utils.ZipUtils; @@ -49,7 +60,7 @@ public class WebsiteResource { @POST @Path("/upload/creator/{address}") @Operation( - summary = "Build raw, unsigned, HASHED_DATA transaction, based on a user-supplied path to a static website", + summary = "Build raw, unsigned, ARBITRARY transaction, based on a user-supplied path to a static website", requestBody = @RequestBody( required = true, content = @Content( @@ -61,7 +72,7 @@ public class WebsiteResource { ), responses = { @ApiResponse( - description = "raw, unsigned, HASHED_DATA transaction encoded in Base58", + description = "raw, unsigned, ARBITRARY transaction encoded in Base58", content = @Content( mediaType = MediaType.TEXT_PLAIN, schema = @Schema( @@ -90,38 +101,44 @@ public class WebsiteResource { try (final Repository repository = RepositoryManager.getRepository()) { AccountData accountData = repository.getAccountRepository().getAccount(creatorAddress); - if (accountData == null) { + if (accountData == null || accountData.getPublicKey() == null) { + dataFile.deleteAll(); throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.ADDRESS_UNKNOWN); } byte[] creatorPublicKey = accountData.getPublicKey(); byte[] lastReference = accountData.getReference(); -// BaseTransactionData baseTransactionData = new BaseTransactionData(NTP.getTime(), Group.NO_GROUP, -// lastReference, creatorPublicKey, BlockChain.getInstance().getUnitFee(), null); -// int size = (int)dataFile.size(); -// byte[] digest = dataFile.digest(); -// byte[] chunkHashes = dataFile.chunkHashes(); -// -// HashedDataTransactionData transactionData = new HashedDataTransactionData(baseTransactionData, -// 1, 2, 0, size, digest, chunkHashes); -// -// HashedDataTransaction transaction = (HashedDataTransaction)Transaction.fromData(repository, transactionData); -// transaction.computeNonce(); -// -// Transaction.ValidationResult result = transaction.isValidUnconfirmed(); -// if (result != Transaction.ValidationResult.OK) -// throw TransactionsResource.createTransactionInvalidException(request, result); -// -// byte[] bytes = HashedDataTransactionTransformer.toBytes(transactionData); -// return Base58.encode(bytes); - return "true"; - -// } catch (TransformationException e) { -// throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.TRANSFORMATION_ERROR, e); + BaseTransactionData baseTransactionData = new BaseTransactionData(NTP.getTime(), Group.NO_GROUP, + lastReference, creatorPublicKey, BlockChain.getInstance().getUnitFee(), null); + int size = (int)dataFile.size(); + ArbitraryTransactionData.DataType dataType = ArbitraryTransactionData.DataType.DATA_HASH; + byte[] digest = dataFile.digest(); + byte[] chunkHashes = dataFile.chunkHashes(); + List payments = new ArrayList<>(); + + ArbitraryTransactionData transactionData = new ArbitraryTransactionData(baseTransactionData, + 5, 2, 0, size, digest, dataType, chunkHashes, payments); + + ArbitraryTransaction transaction = (ArbitraryTransaction) Transaction.fromData(repository, transactionData); + transaction.computeNonce(); + + Transaction.ValidationResult result = transaction.isValidUnconfirmed(); + if (result != Transaction.ValidationResult.OK) { + dataFile.deleteAll(); + throw TransactionsResource.createTransactionInvalidException(request, result); + } + + byte[] bytes = ArbitraryTransactionTransformer.toBytes(transactionData); + return Base58.encode(bytes); + + } catch (TransformationException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.TRANSFORMATION_ERROR, e); } catch (DataException e) { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); } } + // Something went wrong, so delete our copies of the data and chunks + dataFile.deleteAll(); } return "false"; }