From 8a63fbd0756d9c71c4187eb7ab0fdbcafabd4c01 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Fri, 26 Apr 2013 13:51:00 +0200 Subject: [PATCH] ScriptBuilder: add a method that creates a multisig input script. --- .../com/google/bitcoin/script/ScriptBuilder.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/google/bitcoin/script/ScriptBuilder.java b/core/src/main/java/com/google/bitcoin/script/ScriptBuilder.java index 99b1d083..c86273ad 100644 --- a/core/src/main/java/com/google/bitcoin/script/ScriptBuilder.java +++ b/core/src/main/java/com/google/bitcoin/script/ScriptBuilder.java @@ -18,6 +18,7 @@ package com.google.bitcoin.script; import com.google.bitcoin.core.Address; import com.google.bitcoin.core.ECKey; +import com.google.bitcoin.core.Transaction; import com.google.common.collect.Lists; import java.util.Arrays; @@ -49,7 +50,7 @@ public class ScriptBuilder { return this; } - public ScriptBuilder smallNum(byte num) { + public ScriptBuilder smallNum(int num) { checkArgument(num >= 0, "Cannot encode negative numbers with smallNum"); checkArgument(num <= 16, "Cannot encode numbers larger than 16 with smallNum"); chunks.add(new ScriptChunk(true, new byte[]{(byte)Script.encodeToOpN(num)})); @@ -102,7 +103,7 @@ public class ScriptBuilder { checkArgument(threshold <= pubkeys.size()); checkArgument(pubkeys.size() <= 16); // That's the max we can represent with a single opcode. ScriptBuilder builder = new ScriptBuilder(); - builder.smallNum((byte)threshold); + builder.smallNum((byte) threshold); for (ECKey key : pubkeys) { builder.data(key.getPubKey()); } @@ -110,4 +111,15 @@ public class ScriptBuilder { builder.op(OP_CHECKMULTISIG); return builder.build(); } + + /** Create a program that satisfies an OP_CHECKMULTISIG program. */ + public static Script createMultiSigInputScript(List signatures, + Transaction.SigHash sigHash, boolean anyoneCanPay) { + checkArgument(signatures.size() <= 16); // Max allowable. + ScriptBuilder builder = new ScriptBuilder(); + builder.smallNum(0); // Work around a bug in CHECKMULTISIG that is now a required part of the protocol. + for (ECKey.ECDSASignature signature : signatures) + builder.data(appendByte(signature.encodeToDER(),(byte) ((sigHash.ordinal() + 1) | (anyoneCanPay ? 0x80 : 0)))); + return builder.build(); + } }