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.

Reply via email to