I create a mutisign address <3P31YGu1ni5qRZxUuj2WcxmQa1YHoZm1fU>
and then I transfer some btc to this address.
the follow is unspend outputs;
```json
{
"unspent_outputs": [
{
"tx_hash":
"918a88a829a694618e6e59e9f9db646a70004d6a57208fffb5ef9cec4397d644",
"tx_hash_big_endian":
"44d69743ec9cefb5ff8f20576a4d00706a64dbf9e9596e8e6194a629a8888a91",
"tx_index": 373878529,
"tx_output_n": 1,
"script": "a914ea22a3e3b5bd063f845522034adbe65a0d2254a887",
"value": 2700,
"value_hex": "0a8c",
"confirmations": 389
},
{
"tx_hash":
"92e7d3293a721b15e7129c666b22227fabdcf522da7be4dc3fe7118d648d439a",
"tx_hash_big_endian":
"9a438d648d11e73fdce47bda22f5dcab7f22226b669c12e7151b723a29d3e792",
"tx_index": 373881503,
"tx_output_n": 0,
"script": "a914ea22a3e3b5bd063f845522034adbe65a0d2254a887",
"value": 100000,
"value_hex": "0186a0",
"confirmations": 386
}
]
}
```
I intend spend <
92e7d3293a721b15e7129c666b22227fabdcf522da7be4dc3fe7118d648d439a > at index
0 UTXO;
But I get exception
```json
{
"result": null,
"error": {
"code": -26,
"message": "16: mandatory-script-verify-flag-failed (Signature must
be zero for failed CHECK(MULTI)SIG operation)"
},
"id": 1
}
```
Follow is java code
```java
package com.imx.codewallet.usdt;
import foundation.omni.tx.FeeCalculator;
import foundation.omni.tx.SimpleVariableFeeCalculator;
import org.bitcoinj.core.*;
import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.script.Script;
import org.bitcoinj.script.ScriptBuilder;
import javax.xml.bind.DatatypeConverter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.bitcoinj.core.Utils.HEX;
public class SpendMutiSignFounds {
public static void main(String[] args) throws
InsufficientMoneyException {
NetworkParameters params = MainNetParams.get();
Transaction spendTx = new Transaction(params);
/**
{
"tx_hash":
"92e7d3293a721b15e7129c666b22227fabdcf522da7be4dc3fe7118d648d439a",
"tx_hash_big_endian":
"9a438d648d11e73fdce47bda22f5dcab7f22226b669c12e7151b723a29d3e792",
"tx_index": 373881503,
"tx_output_n": 0,
"script": "a914ea22a3e3b5bd063f845522034adbe65a0d2254a887",
"value": 100000,
"value_hex": "0186a0",
"confirmations": 386
}
*/
TransactionOutPoint outPoint = new TransactionOutPoint(params,0L,
Sha256Hash.wrap("9a438d648d11e73fdce47bda22f5dcab7f22226b669c12e7151b723a29d3e792"));
Script script1 = new
Script(HEX.decode("a914ea22a3e3b5bd063f845522034adbe65a0d2254a887"));
TransactionInput input = new
TransactionInput(params,null,script1.getProgram(),
outPoint,Coin.valueOf(100000));
spendTx.addInput(input);
Address receiverAddress =
Address.fromBase58(params,"1HuG9QYfSNXmUPw3LXZoNj4EGc6EwMuzvv");
Address fromAddress =
Address.fromBase58(params,"3P31YGu1ni5qRZxUuj2WcxmQa1YHoZm1fU");
Script redeemScript = new
Script(HEX.decode("53210247bcf83ff152d7e2f2a6938f1d7b12b636d5799a00d947bdc901b1e5929c80dd21027fd38fe34f60c75ac26506e69f3f3cb63437e00253b4a107e5fcb007d073f4b62102acdba1eaadc6b34128bb04891705f3c5348198b5b95487dfca4fc639aed2807f2103d1887e2048d773cd829934d601a89f742716901411dc4b36e956ca903d2864dd2103f4135910871b02c49689e5965beb694dc76ade159456c4d78fce642c004da94155ae"));
Coin charge = Coin.valueOf(1000); // 0.1 mBTC
spendTx.addOutput(charge,receiverAddress);
FeeCalculator feeCalculator = new SimpleVariableFeeCalculator();
long amountOut = sum(spendTx.getOutputs()); // Sum of outputs,
this transaction
long fee = feeCalculator.calculateFee(spendTx).getValue();
long amountChange = sumInputs(spendTx.getInputs()) - amountOut -
fee;
// If change is negative, transaction is invalid
if (amountChange < 0) {
Coin missing = Coin.valueOf(-amountChange);
throw new InsufficientMoneyException(missing, "Insufficient
Bitcoin to build Omni Transaction");
}
// If change is positive, return it all to the sending address
if (amountChange > 0) {
// Add a change output
spendTx.addOutput(Coin.valueOf(amountChange),fromAddress);
}
System.out.println(spendTx);
ECKey key1 = ECKey.fromPrivate(HEX.decode("private key1 key hex"));
ECKey key2 = ECKey.fromPrivate(HEX.decode("private key2 key hex"));
ECKey key3 = ECKey.fromPrivate(HEX.decode("private key3 key hex"));
// ECKey key4 =
ECKey.fromPrivate(HEX.decode("6fde75bc61ecaf9955a668069cbe53a9217807b879a342f76cd90e5a2b37b6ce"));
// ECKey key5 =
ECKey.fromPrivate(HEX.decode("7b70e91b7d9a2591b51f23a2ddf59f068cac932f6294ad2d03e8949b9634f920"));
// Sign the first part of the transaction using private key #1
Sha256Hash sighash = spendTx.hashForSignature(0, redeemScript,
Transaction.SigHash.ALL, false);
List<ECKey> keyList = Arrays.asList(key1,key2,key3);
List<TransactionSignature> signatures = new ArrayList<>();
for(ECKey key : keyList){
ECKey.ECDSASignature ecdsaSignature = key.sign(sighash);
// System.out.println(HEX.encode(ecdsaSignature.encodeToDER()));
TransactionSignature transactionSignarture = new
TransactionSignature(ecdsaSignature, Transaction.SigHash.ALL, false);
signatures.add(transactionSignarture);
}
Script inputScript =
ScriptBuilder.createP2SHMultiSigInputScript(signatures, redeemScript);
// Add the script signature to the input
spendTx.getInputs().get(0).setScriptSig(inputScript);
System.out.println(spendTx);
byte[] data = spendTx.bitcoinSerialize();
String hex = DatatypeConverter.printHexBinary(data);
System.out.println(hex);
}
private static long sum(Collection<TransactionOutput> outputs) {
long sum = 0;
for (TransactionOutput output : outputs) {
sum += output.getValue().value;
}
return sum;
}
private static long sumInputs(Collection<TransactionInput> inputs) {
long sum = 0;
for (TransactionInput input : inputs) {
sum += input.getValue().value;
}
return sum;
}
}
```
then I get raw transaction data.
I use **btccoind** sendrawtransaction method to broadcast transaction
```curl
curl -X POST \
http://47.52.131.129:8890 \
-H 'Authorization: Basic
Yml0Y29pbjpNZVZ6NG1jVFlaZ3ZZNGZUM2JFQ2FmOFlrV0tZeGRoaFox' \
-H 'Content-Type: application/json' \
-d
'{"jsonrpc":"2.0","method":"sendrawtransaction","params":["010000000192E7D3293A721B15E7129C666B22227FABDCF522DA7BE4DC3FE7118D648D439A00000000FD890100473044022029E2192AFBCE717C9B171DF591CECA4CEE70B9091D4626F42A26387BB672D77B022031C9DC63422801CD4181FAA12A5D3F60BEA705C6939806AFBC6CE60B9A5EFA4F0147304402204F8C759D788F0E5389D73D13FC22238E7FF4066E433105F15519E45B3D93AB870220610D889CB2739C243CE902FD19F4FCF2D7D4DDF3855F180D7329A567C34D5F5001483045022100F9444501A7811CF6C2B0F5D203D32D852DBFF2EA55FFED3CFA18086597A2EB150220570D7F19E05534F774B4C1796C1BB0FB9DD9BA444B76332BF2AB213A1C93FBA3014CAD53210247BCF83FF152D7E2F2A6938F1D7B12B636D5799A00D947BDC901B1E5929C80DD21027FD38FE34F60C75AC26506E69F3F3CB63437E00253B4A107E5FCB007D073F4B62102ACDBA1EAADC6B34128BB04891705F3C5348198B5B95487DFCA4FC639AED2807F2103D1887E2048D773CD829934D601A89F742716901411DC4B36E956CA903D2864DD2103F4135910871B02C49689E5965BEB694DC76ADE159456C4D78FCE642C004DA94155AEFFFFFFFF02E8030000000000001976A914B96448EF842A2FD65FA2D4CFB574AD94AE9121AF88AC865901000000000017A914EA22A3E3B5BD063F845522034ADBE65A0D2254A88700000000"],"id":1}'
```
Follow is I create the mutisign address code
```java
private void createMutisignAddress(){
ECKey clientKey1 =
ECKey.fromPublicOnly(HEX.decode("02acdba1eaadc6b34128bb04891705f3c5348198b5b95487dfca4fc639aed2807f"));
ECKey clientKey2 =
ECKey.fromPublicOnly(HEX.decode("0247bcf83ff152d7e2f2a6938f1d7b12b636d5799a00d947bdc901b1e5929c80dd"));
ECKey clientKey3 =
ECKey.fromPublicOnly(HEX.decode("03f4135910871b02c49689e5965beb694dc76ade159456c4d78fce642c004da941"));
ECKey clientKey4 =
ECKey.fromPublicOnly(HEX.decode("03d1887e2048d773cd829934d601a89f742716901411dc4b36e956ca903d2864dd"));
ECKey clientKey5 =
ECKey.fromPublicOnly(HEX.decode("027fd38fe34f60c75ac26506e69f3f3cb63437e00253b4a107e5fcb007d073f4b6"));
List<ECKey> keys = ImmutableList.of(clientKey1,
clientKey2,clientKey3,clientKey4,clientKey5);
Script redeemScript = ScriptBuilder.createRedeemScript(3, keys);
Script script = ScriptBuilder.createP2SHOutputScript(redeemScript);
System.out.println("Redeem script: " +
HEX.encode(redeemScript.getProgram()));
Address address = Address.fromP2SHScript(params,script);
System.out.println(address);
}
```
**Final My question is How to spend founds from this mutisign address?**
--
You received this message because you are subscribed to the Google Groups
"bitcoinj" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.