spending witness inputs still doesn't work...
This commit is contained in:
parent
cb3b20ad6c
commit
57a34f0753
@ -11,6 +11,7 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/btcsuite/btcd/btcec"
|
||||||
"github.com/btcsuite/btcd/txscript"
|
"github.com/btcsuite/btcd/txscript"
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/lightningnetwork/lnd/uspv"
|
"github.com/lightningnetwork/lnd/uspv"
|
||||||
@ -22,6 +23,8 @@ const (
|
|||||||
|
|
||||||
inspk1 = "00141d0f172a0ecb48aee1be1f2687d2963ae33f71a1"
|
inspk1 = "00141d0f172a0ecb48aee1be1f2687d2963ae33f71a1"
|
||||||
inamt1 = int64(600000000)
|
inamt1 = int64(600000000)
|
||||||
|
|
||||||
|
xpecthash = "c37af31116d1b27caf68aae9e3ac82f1477929014d5b917657d0eb49478cb670"
|
||||||
)
|
)
|
||||||
|
|
||||||
// calcWitnessSignatureHash is the witnessified version of calcSignatureHash
|
// calcWitnessSignatureHash is the witnessified version of calcSignatureHash
|
||||||
@ -97,7 +100,7 @@ func calcWitnessSignatureHash(
|
|||||||
binary.LittleEndian.PutUint32(buf4[:], uint32(hashType))
|
binary.LittleEndian.PutUint32(buf4[:], uint32(hashType))
|
||||||
pre = append(pre, buf4[:]...)
|
pre = append(pre, buf4[:]...)
|
||||||
|
|
||||||
fmt.Printf("pre: %x\n", pre)
|
fmt.Printf("calcWitnessSignatureHash pre: %x\n", pre)
|
||||||
hsh := wire.DoubleSha256SH(pre)
|
hsh := wire.DoubleSha256SH(pre)
|
||||||
return hsh.Bytes()
|
return hsh.Bytes()
|
||||||
}
|
}
|
||||||
@ -119,7 +122,7 @@ func calcHashPrevOuts(tx *wire.MsgTx, hType txscript.SigHashType) wire.ShaHash {
|
|||||||
binary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index)
|
binary.LittleEndian.PutUint32(buf[:], in.PreviousOutPoint.Index)
|
||||||
pre = append(pre, buf[:]...)
|
pre = append(pre, buf[:]...)
|
||||||
}
|
}
|
||||||
fmt.Printf("pre: %x\n", pre)
|
fmt.Printf("calcHashPrevOuts pre: %x\n", pre)
|
||||||
return wire.DoubleSha256SH(pre)
|
return wire.DoubleSha256SH(pre)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +141,7 @@ func calcHashSequence(tx *wire.MsgTx, hType txscript.SigHashType) wire.ShaHash {
|
|||||||
binary.LittleEndian.PutUint32(buf[:], in.Sequence)
|
binary.LittleEndian.PutUint32(buf[:], in.Sequence)
|
||||||
pre = append(pre, buf[:]...)
|
pre = append(pre, buf[:]...)
|
||||||
}
|
}
|
||||||
fmt.Printf("pre: %x\n", pre)
|
fmt.Printf("calcHashSequence pre: %x\n", pre)
|
||||||
return wire.DoubleSha256SH(pre)
|
return wire.DoubleSha256SH(pre)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +166,7 @@ func calcHashOutputs(
|
|||||||
writeTxOut(&buf, 0, 0, out)
|
writeTxOut(&buf, 0, 0, out)
|
||||||
pre = append(pre, buf.Bytes()...)
|
pre = append(pre, buf.Bytes()...)
|
||||||
}
|
}
|
||||||
fmt.Printf("pre: %x\n", pre)
|
fmt.Printf("calcHashOutputs pre: %x\n", pre)
|
||||||
return wire.DoubleSha256SH(pre)
|
return wire.DoubleSha256SH(pre)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,6 +182,10 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
xpkt, err := hex.DecodeString(string(xpecthash))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
// load tx skeleton from local file
|
// load tx skeleton from local file
|
||||||
fmt.Printf("loading tx from file tx.hex\n")
|
fmt.Printf("loading tx from file tx.hex\n")
|
||||||
@ -207,9 +214,19 @@ func main() {
|
|||||||
|
|
||||||
fmt.Printf(uspv.TxToString(ttx))
|
fmt.Printf(uspv.TxToString(ttx))
|
||||||
|
|
||||||
|
priv, err := btcec.NewPrivateKey(btcec.S256())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sig, err := txscript.WitnessScript(ttx, 1, inamt1, in1spk,
|
||||||
|
txscript.SigHashAll, priv, true)
|
||||||
|
|
||||||
|
fmt.Printf("got sig %x\n", sig)
|
||||||
hxh := calcWitnessSignatureHash(txscript.SigHashAll, ttx, 1, inamt1)
|
hxh := calcWitnessSignatureHash(txscript.SigHashAll, ttx, 1, inamt1)
|
||||||
|
|
||||||
fmt.Printf("got sigHash %x\n", hxh)
|
fmt.Printf("got sigHash %x\n", hxh)
|
||||||
|
fmt.Printf("expect hash %x\n ", xpkt)
|
||||||
}
|
}
|
||||||
|
|
||||||
// pver can be 0, doesn't do anything in these. Same for msg.Version
|
// pver can be 0, doesn't do anything in these. Same for msg.Version
|
||||||
|
@ -167,6 +167,8 @@ func (s *SPVCon) SendCoins(adr btcutil.Address, sendAmt int64) error {
|
|||||||
|
|
||||||
// if wit utxo, convert address to generate pkscript
|
// if wit utxo, convert address to generate pkscript
|
||||||
if in.IsWit {
|
if in.IsWit {
|
||||||
|
// adding a witness input, so set the tx as witness tx
|
||||||
|
tx.Flags = 0x01
|
||||||
wa, err := btcutil.NewAddressWitnessPubKeyHash(
|
wa, err := btcutil.NewAddressWitnessPubKeyHash(
|
||||||
s.TS.Adrs[in.KeyIdx].PkhAdr.ScriptAddress(), s.TS.Param)
|
s.TS.Adrs[in.KeyIdx].PkhAdr.ScriptAddress(), s.TS.Param)
|
||||||
prevPKs, err = txscript.PayToAddrScript(wa)
|
prevPKs, err = txscript.PayToAddrScript(wa)
|
||||||
@ -187,6 +189,7 @@ func (s *SPVCon) SendCoins(adr btcutil.Address, sendAmt int64) error {
|
|||||||
|
|
||||||
// tx is ready for signing,
|
// tx is ready for signing,
|
||||||
sigStash := make([][]byte, len(ins))
|
sigStash := make([][]byte, len(ins))
|
||||||
|
witStash := make([][][]byte, len(ins))
|
||||||
for i, txin := range tx.TxIn {
|
for i, txin := range tx.TxIn {
|
||||||
// pick key
|
// pick key
|
||||||
child, err := s.TS.rootPrivKey.Child(
|
child, err := s.TS.rootPrivKey.Child(
|
||||||
@ -202,7 +205,7 @@ func (s *SPVCon) SendCoins(adr btcutil.Address, sendAmt int64) error {
|
|||||||
// This is where witness based sighash types need to happen
|
// This is where witness based sighash types need to happen
|
||||||
// sign into stash
|
// sign into stash
|
||||||
if ins[i].IsWit {
|
if ins[i].IsWit {
|
||||||
sigStash[i], err = txscript.WitnessSignatureScript(
|
witStash[i], err = txscript.WitnessScript(
|
||||||
tx, i, ins[i].Value, txin.SignatureScript,
|
tx, i, ins[i].Value, txin.SignatureScript,
|
||||||
txscript.SigHashAll, priv, true)
|
txscript.SigHashAll, priv, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -219,7 +222,14 @@ func (s *SPVCon) SendCoins(adr btcutil.Address, sendAmt int64) error {
|
|||||||
}
|
}
|
||||||
// swap sigs into sigScripts in txins
|
// swap sigs into sigScripts in txins
|
||||||
for i, txin := range tx.TxIn {
|
for i, txin := range tx.TxIn {
|
||||||
txin.SignatureScript = sigStash[i]
|
if sigStash[i] != nil {
|
||||||
|
txin.SignatureScript = sigStash[i]
|
||||||
|
}
|
||||||
|
if witStash[i] != nil {
|
||||||
|
txin.Witness = witStash[i]
|
||||||
|
txin.SignatureScript = nil
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("tx: %s", TxToString(tx))
|
fmt.Printf("tx: %s", TxToString(tx))
|
||||||
|
Loading…
Reference in New Issue
Block a user