From b237a34d8b0ffd130a6fe805f57b2c8107cdbd11 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Wed, 5 Feb 2025 16:32:16 +0100 Subject: [PATCH] TransactionOutput: make field `scriptBytes` immutable --- core/src/main/java/org/bitcoinj/core/Transaction.java | 10 ++++++---- .../main/java/org/bitcoinj/core/TransactionOutput.java | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/Transaction.java b/core/src/main/java/org/bitcoinj/core/Transaction.java index 3071a29e5..a2d8b8376 100644 --- a/core/src/main/java/org/bitcoinj/core/Transaction.java +++ b/core/src/main/java/org/bitcoinj/core/Transaction.java @@ -1387,8 +1387,9 @@ public class Transaction extends BaseMessage { BigInteger.valueOf(output.getValue().getValue()), bosHashOutputs ); - bosHashOutputs.write(VarInt.of(output.getScriptBytes().length).serialize()); - bosHashOutputs.write(output.getScriptBytes()); + byte[] scriptBytes = output.getScriptBytes(); + bosHashOutputs.write(VarInt.of(scriptBytes.length).serialize()); + bosHashOutputs.write(scriptBytes); } hashOutputs = Sha256Hash.hashTwice(bosHashOutputs.toByteArray()); } else if (basicSigHashType == SigHash.SINGLE.value && inputIndex < outputs.size()) { @@ -1397,8 +1398,9 @@ public class Transaction extends BaseMessage { BigInteger.valueOf(this.outputs.get(inputIndex).getValue().getValue()), bosHashOutputs ); - bosHashOutputs.write(VarInt.of(this.outputs.get(inputIndex).getScriptBytes().length).serialize()); - bosHashOutputs.write(this.outputs.get(inputIndex).getScriptBytes()); + byte[] scriptBytes = this.outputs.get(inputIndex).getScriptBytes(); + bosHashOutputs.write(VarInt.of(scriptBytes.length).serialize()); + bosHashOutputs.write(scriptBytes); hashOutputs = Sha256Hash.hashTwice(bosHashOutputs.toByteArray()); } writeInt32LE(version, bos); diff --git a/core/src/main/java/org/bitcoinj/core/TransactionOutput.java b/core/src/main/java/org/bitcoinj/core/TransactionOutput.java index 046238991..d66172301 100644 --- a/core/src/main/java/org/bitcoinj/core/TransactionOutput.java +++ b/core/src/main/java/org/bitcoinj/core/TransactionOutput.java @@ -61,7 +61,7 @@ public class TransactionOutput { // A transaction output has a script used for authenticating that the redeemer is allowed to spend // this output. - private byte[] scriptBytes; + private final byte[] scriptBytes; // The script bytes are parsed and turned into a Script on demand. private Script scriptPubKey; @@ -308,7 +308,7 @@ public class TransactionOutput { * @return the scriptBytes */ public byte[] getScriptBytes() { - return scriptBytes; + return Arrays.copyOf(scriptBytes, scriptBytes.length); } /**