diff --git a/core/src/main/java/org/bitcoinj/script/Script.java b/core/src/main/java/org/bitcoinj/script/Script.java index ed222e97a2d..f2b134d6c96 100644 --- a/core/src/main/java/org/bitcoinj/script/Script.java +++ b/core/src/main/java/org/bitcoinj/script/Script.java @@ -247,9 +247,7 @@ public static Script of(List chunks) { * @return script that wraps the chunks */ public static Script of(List chunks, Instant creationTime) { - chunks = Collections.unmodifiableList(new ArrayList<>(chunks)); // defensive copy - Objects.requireNonNull(creationTime); - return new Script(null, chunks, creationTime); + return new Script(chunks, creationTime); } /** @@ -275,10 +273,7 @@ public static Script parse(byte[] program) throws ScriptException { * @throws ScriptException if the program could not be parsed */ public static Script parse(byte[] program, Instant creationTime) throws ScriptException { - Objects.requireNonNull(creationTime); - program = Arrays.copyOf(program, program.length); // defensive copy - List chunks = parseIntoChunks(program); - return new Script(program, chunks, creationTime); + return new Script(program, creationTime); } /** @@ -340,9 +335,22 @@ private static void parseIntoChunksPartial(byte[] program, List chu } } - private Script(byte[] programBytes, List chunks, Instant creationTime) { - this.program = programBytes; - this.chunks = chunks; + + // When constructing from a program, we store both program and chunks + private Script(byte[] program, Instant creationTime) { + Objects.requireNonNull(program); + Objects.requireNonNull(creationTime); + this.program = Arrays.copyOf(program, program.length); // defensive copy; + this.chunks = parseIntoChunks(this.program); + this.creationTime = creationTime; + } + + // When constructing from chunks, we store only chunks, and generate program when getter is called + private Script(List chunks, Instant creationTime) { + Objects.requireNonNull(chunks); + Objects.requireNonNull(creationTime); + this.program = null; + this.chunks = Collections.unmodifiableList(new ArrayList<>(chunks)); // defensive copy this.creationTime = creationTime; }