lnwallet: import badge's script utils in new file
This commit is contained in:
parent
f52f2fd26c
commit
30523d7db3
85
lnwallet/script_utils.go
Normal file
85
lnwallet/script_utils.go
Normal file
@ -0,0 +1,85 @@
|
||||
package lnwallet
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
"github.com/btcsuite/btcd/txscript"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/btcsuite/btcutil"
|
||||
)
|
||||
|
||||
// scriptHashPkScript...
|
||||
func scriptHashPkScript(scriptBytes []byte) ([]byte, error) {
|
||||
bldr := txscript.NewScriptBuilder()
|
||||
bldr.AddOp(txscript.OP_HASH160)
|
||||
bldr.AddData(btcutil.Hash160(scriptBytes))
|
||||
bldr.AddOp(txscript.OP_EQUAL)
|
||||
return bldr.Script()
|
||||
}
|
||||
|
||||
// getFundingPkScript generates the non-p2sh'd multisig script for 2 of 2
|
||||
// pubkeys.
|
||||
func genFundingPkScript(aPub, bPub []byte) ([]byte, error) {
|
||||
if len(aPub) != 33 || len(bPub) != 33 {
|
||||
return nil, fmt.Errorf("Pubkey size error. Compressed pubkeys only")
|
||||
}
|
||||
|
||||
if bytes.Compare(aPub, bPub) == -1 { // swap to sort pubkeys if needed
|
||||
aPub, bPub = bPub, aPub
|
||||
}
|
||||
|
||||
bldr := txscript.NewScriptBuilder()
|
||||
// Require 2 signatures, so from both of the pubkeys
|
||||
bldr.AddOp(txscript.OP_2)
|
||||
// add both pubkeys (sorted)
|
||||
bldr.AddData(aPub)
|
||||
bldr.AddData(bPub)
|
||||
// 2 keys total. In case that wasn't obvious.
|
||||
bldr.AddOp(txscript.OP_2)
|
||||
// Good ol OP_CHECKMULTISIG. Don't forget the zero!
|
||||
bldr.AddOp(txscript.OP_CHECKMULTISIG)
|
||||
// get byte slice
|
||||
return bldr.Script()
|
||||
}
|
||||
|
||||
// fundMultiSigOut creates a TxOut for the funding transaction.
|
||||
// Give it the two pubkeys and it'll give you the p2sh'd txout.
|
||||
// You don't have to remember the p2sh preimage, as long as you remember the
|
||||
// pubkeys involved.
|
||||
func fundMultiSigOut(aPub, bPub []byte, amt int64) ([]byte, *wire.TxOut, error) {
|
||||
if amt < 0 {
|
||||
return nil, nil, fmt.Errorf("Can't create FundTx script with negative coins")
|
||||
}
|
||||
|
||||
// p2shify
|
||||
redeemScript, err := genFundingPkScript(aPub, bPub)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
pkScript, err := scriptHashPkScript(redeemScript)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return redeemScript, wire.NewTxOut(amt, pkScript), nil
|
||||
}
|
||||
|
||||
// the scriptsig to put on a P2SH input
|
||||
func spendMultiSig(redeemScript, sigA, sigB []byte) ([]byte, error) {
|
||||
bldr := txscript.NewScriptBuilder()
|
||||
|
||||
// add a 0 for some multisig fun
|
||||
bldr.AddOp(txscript.OP_0)
|
||||
|
||||
// add sigA
|
||||
bldr.AddData(sigA)
|
||||
// add sigB
|
||||
bldr.AddData(sigB)
|
||||
|
||||
// preimage goes on AT THE ENDDDD
|
||||
bldr.AddData(redeemScript)
|
||||
|
||||
// that's all, get bytes
|
||||
return bldr.Script()
|
||||
}
|
Loading…
Reference in New Issue
Block a user