Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
pokkst committed Jan 30, 2021
2 parents 67d4331 + 2119e01 commit a08b3b6
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 11 deletions.
1 change: 1 addition & 0 deletions core/src/main/java/org/bitcoinj/kits/MultisigAppKit.java
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@ public boolean signMultisigInputs(Transaction tx, Transaction.SigHash sigHashMod
}

input.setScriptSig(inputScript);
System.out.println(input.getScriptSig().toString());
needsMoreSigs = needsMoreSigs(input, utxo);
}
}
Expand Down
56 changes: 45 additions & 11 deletions core/src/main/java/org/bitcoinj/script/ScriptBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.bitcoinj.core.Utils;
import org.bitcoinj.crypto.SchnorrSignature;
import org.bitcoinj.crypto.TransactionSignature;
import org.bouncycastle.util.encoders.Hex;

import javax.annotation.Nullable;
import java.util.*;
Expand Down Expand Up @@ -485,14 +486,32 @@ public static Script updateScriptWithSchnorrSignature(Script redeemScript, Scrip
ScriptBuilder builder = new ScriptBuilder();
List<ScriptChunk> inputChunks = scriptSig.getChunks();
int totalChunks = inputChunks.size();
int checkbits = inputChunks.get(0).decodeOpN();
String currentDummy = getSchnorrMultisigDummy(checkbits, redeemScript.getPubKeys().size());
currentDummy = new StringBuilder(currentDummy).reverse().toString();
String updatedDummy = updateSchnorrMultisigDummy(currentDummy, checkbitsIndex);
updatedDummy = new StringBuilder(updatedDummy).reverse().toString();

//re-add dummy to script
builder.smallNum(Integer.parseInt(updatedDummy, 2));
ScriptChunk checkbitsChunk = inputChunks.get(0);
byte[] checkbitsData = checkbitsChunk.data;
int checkbits = 0;

if(checkbitsData != null) {
byte[] checkbitsDataCopy = Arrays.copyOf(checkbitsData, checkbitsData.length);
reverseSchnorrMultisigDummyBytes(checkbitsDataCopy);
String checkbitsHex = Hex.toHexString(checkbitsDataCopy);
if(!checkbitsHex.isEmpty())
checkbits = Integer.parseInt(checkbitsHex, 16);
else
checkbits = checkbitsChunk.decodeOpN();
} else {
checkbits = checkbitsChunk.decodeOpN();
}

String currentDummy = Integer.toBinaryString(checkbits);
String paddedDummy = getSchnorrMultisigDummy(currentDummy, redeemScript.getPubKeys().size());
String reversedPaddedDummy = new StringBuilder(paddedDummy).reverse().toString();
String updatedDummy = updateSchnorrMultisigDummy(reversedPaddedDummy, checkbitsIndex);
String reversedDummy = new StringBuilder(updatedDummy).reverse().toString();
checkbits = Integer.parseInt(reversedDummy, 2);

//re-add checkbits to script
builder.number(checkbits);

// copy the sigs
int pos = 0;
boolean inserted = false;
Expand Down Expand Up @@ -527,9 +546,24 @@ public static Script updateScriptWithSchnorrSignature(Script redeemScript, Scrip
return builder.build();
}

private static String getSchnorrMultisigDummy(int currentDummy, int totalCosigners) {
String binary = Integer.toBinaryString(currentDummy);
return StringUtils.leftPad(binary, totalCosigners, "0");
private static void reverseSchnorrMultisigDummyBytes(byte[] array) {
if (array == null) {
return;
}
int i = 0;
int j = array.length - 1;
byte tmp;
while (j > i) {
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
j--;
i++;
}
}

private static String getSchnorrMultisigDummy(String currentDummy, int totalCosigners) {
return StringUtils.leftPad(currentDummy, totalCosigners, "0");
}

private static String updateSchnorrMultisigDummy(String currentDummy, int index) {
Expand Down

0 comments on commit a08b3b6

Please sign in to comment.