diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java index ccbfb85c..681a5949 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataCombiner.java @@ -4,6 +4,7 @@ import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.arbitrary.metadata.ArbitraryDataMetadataPatch; +import org.qortal.utils.Base58; import org.qortal.utils.FilesystemUtils; import java.io.File; @@ -32,6 +33,7 @@ public class ArbitraryDataCombiner { try { this.preExecute(); this.validatePreviousSignature(); + this.validatePreviousHash(); this.process(); } finally { @@ -101,6 +103,24 @@ public class ArbitraryDataCombiner { } } + private void validatePreviousHash() throws IOException { + ArbitraryDataMetadataPatch metadata = new ArbitraryDataMetadataPatch(this.pathAfter); + metadata.read(); + byte[] previousHash = metadata.getPreviousHash(); + if (previousHash == null) { + throw new IllegalStateException("Unable to extract previous hash from patch metadata"); + } + + ArbitraryDataDigest digest = new ArbitraryDataDigest(this.pathBefore); + digest.compute(); + boolean valid = digest.isHashValid(previousHash); + if (!valid) { + String previousHash58 = Base58.encode(previousHash); + throw new IllegalStateException(String.format("Previous state hash mismatch. " + + "Patch prevHash: %s, actual: %s", previousHash58, digest.getHash58())); + } + } + private void process() throws IOException { ArbitraryDataMerge merge = new ArbitraryDataMerge(this.pathBefore, this.pathAfter); merge.compute();