deal with p2wsh? maybe..?
This commit is contained in:
parent
f6cf4b87f0
commit
05590279b2
@ -25,10 +25,16 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// calcWitnessSignatureHash is the witnessified version of calcSignatureHash
|
// calcWitnessSignatureHash is the witnessified version of calcSignatureHash
|
||||||
|
// put your pkscripts in the sigscript slot before handing the tx to this
|
||||||
|
// function. Also you're clearly supposed to cache the 3 sub-hashes generated
|
||||||
|
// here, because they apply to the tx, not a txin. But this doesn't yet.
|
||||||
func calcWitnessSignatureHash(
|
func calcWitnessSignatureHash(
|
||||||
hashType txscript.SigHashType, tx *wire.MsgTx, idx int, amt int64) []byte {
|
hashType txscript.SigHashType, tx *wire.MsgTx, idx int, amt int64) []byte {
|
||||||
// in the script.go calcSignatureHash(), idx is assumed safe, so I guess
|
// in the script.go calcSignatureHash(), idx is assumed safe, so I guess
|
||||||
// that's OK here too...
|
// that's OK here too...? Nah I'm gonna check
|
||||||
|
if idx > len(tx.TxIn)-1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// first get hashPrevOuts, hashSequence, and hashOutputs
|
// first get hashPrevOuts, hashSequence, and hashOutputs
|
||||||
hashPrevOuts := calcHashPrevOuts(tx, hashType)
|
hashPrevOuts := calcHashPrevOuts(tx, hashType)
|
||||||
@ -51,10 +57,27 @@ func calcWitnessSignatureHash(
|
|||||||
pre = append(pre, buf4[:]...)
|
pre = append(pre, buf4[:]...)
|
||||||
|
|
||||||
// scriptCode which is some new thing
|
// scriptCode which is some new thing
|
||||||
sCode := []byte{0x19, 0x76, 0xa9, 0x14}
|
|
||||||
sCode = append(sCode, tx.TxIn[idx].SignatureScript[2:22]...)
|
// detect wpkh mode
|
||||||
sCode = append(sCode, []byte{0x88, 0xac}...)
|
if len(tx.TxIn[idx].SignatureScript) == 22 &&
|
||||||
pre = append(pre, sCode...)
|
tx.TxIn[idx].SignatureScript[0] == 0x00 &&
|
||||||
|
tx.TxIn[idx].SignatureScript[1] == 0x14 {
|
||||||
|
// wpkh mode .... recreate op_dup codes here
|
||||||
|
sCode := []byte{0x19, 0x76, 0xa9, 0x14}
|
||||||
|
sCode = append(sCode, tx.TxIn[idx].SignatureScript[2:22]...)
|
||||||
|
sCode = append(sCode, []byte{0x88, 0xac}...)
|
||||||
|
pre = append(pre, sCode...)
|
||||||
|
} else if len(tx.TxIn[idx].SignatureScript) == 34 &&
|
||||||
|
tx.TxIn[idx].SignatureScript[0] == 0x00 &&
|
||||||
|
tx.TxIn[idx].SignatureScript[1] == 0x20 {
|
||||||
|
// whs mode- need to remove codeseparators. this doesn't yet.
|
||||||
|
var buf bytes.Buffer
|
||||||
|
writeVarBytes(&buf, 0, tx.TxIn[idx].Witness[0])
|
||||||
|
pre = append(pre, buf.Bytes()...)
|
||||||
|
} else {
|
||||||
|
// ?? this is not witness tx! fail
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// amount being signed off
|
// amount being signed off
|
||||||
binary.LittleEndian.PutUint64(buf8[:], uint64(amt))
|
binary.LittleEndian.PutUint64(buf8[:], uint64(amt))
|
||||||
|
Loading…
Reference in New Issue
Block a user