// getRawSigs iterates over the inputs of each transaction given, constructing the // raw signatures for them using the private keys available to us. // It returns a map of ntxids to signature lists. func getRawSigs(transactions []*withdrawalTx) (map[Ntxid]TxSigs, error) { sigs := make(map[Ntxid]TxSigs) for _, tx := range transactions { txSigs := make(TxSigs, len(tx.inputs)) msgtx := tx.toMsgTx() ntxid := tx.ntxid() for inputIdx, input := range tx.inputs { creditAddr := input.addr redeemScript := creditAddr.redeemScript() series := creditAddr.series() // The order of the raw signatures in the signature script must match the // order of the public keys in the redeem script, so we sort the public keys // here using the same API used to sort them in the redeem script and use // series.getPrivKeyFor() to lookup the corresponding private keys. pubKeys, err := branchOrder(series.publicKeys, creditAddr.Branch()) if err != nil { return nil, err } txInSigs := make([]RawSig, len(pubKeys)) for i, pubKey := range pubKeys { var sig RawSig privKey, err := series.getPrivKeyFor(pubKey) if err != nil { return nil, err } if privKey != nil { childKey, err := privKey.Child(uint32(creditAddr.Index())) if err != nil { return nil, newError(ErrKeyChain, "failed to derive private key", err) } ecPrivKey, err := childKey.ECPrivKey() if err != nil { return nil, newError(ErrKeyChain, "failed to obtain ECPrivKey", err) } log.Debugf("Generating raw sig for input %d of tx %s with privkey of %s", inputIdx, ntxid, pubKey.String()) sig, err = txscript.RawTxInSignature( msgtx, inputIdx, redeemScript, txscript.SigHashAll, ecPrivKey) if err != nil { return nil, newError(ErrRawSigning, "failed to generate raw signature", err) } } else { log.Debugf("Not generating raw sig for input %d of %s because private key "+ "for %s is not available: %v", inputIdx, ntxid, pubKey.String(), err) sig = []byte{} } txInSigs[i] = sig } txSigs[inputIdx] = txInSigs } sigs[ntxid] = txSigs } return sigs, nil }
// This stuff gets reversed!!! shaHash1Bytes, _ = hex.DecodeString("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") shaHash1, _ = wire.NewShaHash(shaHash1Bytes) outpoint1 = wire.NewOutPoint(shaHash1, 0) // echo | openssl sha256 // This stuff gets reversed!!! shaHash2Bytes, _ = hex.DecodeString("01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b") shaHash2, _ = wire.NewShaHash(shaHash2Bytes) outpoint2 = wire.NewOutPoint(shaHash2, 1) // create inputs from outpoint1 and outpoint2 inputs = []*wire.TxIn{wire.NewTxIn(outpoint1, nil, nil), wire.NewTxIn(outpoint2, nil, nil)} // Commitment Signature tx = wire.NewMsgTx() emptybytes = new([]byte) sigStr, _ = txscript.RawTxInSignature(tx, 0, *emptybytes, txscript.SigHashAll, privKey) commitSig, _ = btcec.ParseSignature(sigStr, btcec.S256()) // Funding TX Sig 1 sig1privKeyBytes, _ = hex.DecodeString("927f5827d75dd2addeb532c0fa5ac9277565f981dd6d0d037b422be5f60bdbef") sig1privKey, _ = btcec.PrivKeyFromBytes(btcec.S256(), sig1privKeyBytes) sigStr1, _ = txscript.RawTxInSignature(tx, 0, *emptybytes, txscript.SigHashAll, sig1privKey) commitSig1, _ = btcec.ParseSignature(sigStr1, btcec.S256()) // Funding TX Sig 2 sig2privKeyBytes, _ = hex.DecodeString("8a4ad188f6f4000495b765cfb6ffa591133a73019c45428ddd28f53bab551847") sig2privKey, _ = btcec.PrivKeyFromBytes(btcec.S256(), sig2privKeyBytes) sigStr2, _ = txscript.RawTxInSignature(tx, 0, *emptybytes, txscript.SigHashAll, sig2privKey) commitSig2, _ = btcec.ParseSignature(sigStr2, btcec.S256()) // Slice of Funding TX Sigs ptrFundingTXSigs = append(*new([]*btcec.Signature), commitSig1, commitSig2)