Merge pull request #7464 from guggero/script-builder-capacity
input: reduce memory allocation for ScriptBuilder
This commit is contained in:
6 files changed
+269
-42
No files matched your search
+6
-23
@@ -22,6 +22,7 @@ import (
|
|||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/lightningnetwork/lnd/aliasmgr"
|
"github.com/lightningnetwork/lnd/aliasmgr"
|
||||||
"github.com/lightningnetwork/lnd/batch"
|
"github.com/lightningnetwork/lnd/batch"
|
||||||
|
"github.com/lightningnetwork/lnd/input"
|
||||||
"github.com/lightningnetwork/lnd/kvdb"
|
"github.com/lightningnetwork/lnd/kvdb"
|
||||||
"github.com/lightningnetwork/lnd/lnwire"
|
"github.com/lightningnetwork/lnd/lnwire"
|
||||||
"github.com/lightningnetwork/lnd/routing/route"
|
"github.com/lightningnetwork/lnd/routing/route"
|
||||||
@@ -3731,35 +3732,17 @@ func (c *ChannelGraph) IsPublicNode(pubKey [33]byte) (bool, error) {
|
|||||||
|
|
||||||
// genMultiSigP2WSH generates the p2wsh'd multisig script for 2 of 2 pubkeys.
|
// genMultiSigP2WSH generates the p2wsh'd multisig script for 2 of 2 pubkeys.
|
||||||
func genMultiSigP2WSH(aPub, bPub []byte) ([]byte, error) {
|
func genMultiSigP2WSH(aPub, bPub []byte) ([]byte, error) {
|
||||||
if len(aPub) != 33 || len(bPub) != 33 {
|
witnessScript, err := input.GenMultiSigScript(aPub, bPub)
|
||||||
return nil, fmt.Errorf("pubkey size error. Compressed " +
|
|
||||||
"pubkeys only")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap to sort pubkeys if needed. Keys are sorted in lexicographical
|
|
||||||
// order. The signatures within the scriptSig must also adhere to the
|
|
||||||
// order, ensuring that the signatures for each public key appears in
|
|
||||||
// the proper order on the stack.
|
|
||||||
if bytes.Compare(aPub, bPub) == 1 {
|
|
||||||
aPub, bPub = bPub, aPub
|
|
||||||
}
|
|
||||||
|
|
||||||
// First, we'll generate the witness script for the multi-sig.
|
|
||||||
bldr := txscript.NewScriptBuilder()
|
|
||||||
bldr.AddOp(txscript.OP_2)
|
|
||||||
bldr.AddData(aPub) // Add both pubkeys (sorted).
|
|
||||||
bldr.AddData(bPub)
|
|
||||||
bldr.AddOp(txscript.OP_2)
|
|
||||||
bldr.AddOp(txscript.OP_CHECKMULTISIG)
|
|
||||||
witnessScript, err := bldr.Script()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// With the witness script generated, we'll now turn it into a p2sh
|
// With the witness script generated, we'll now turn it into a p2wsh
|
||||||
// script:
|
// script:
|
||||||
// * OP_0 <sha256(script)>
|
// * OP_0 <sha256(script)>
|
||||||
bldr = txscript.NewScriptBuilder()
|
bldr := txscript.NewScriptBuilder(
|
||||||
|
txscript.WithScriptAllocSize(input.P2WSHSize),
|
||||||
|
)
|
||||||
bldr.AddOp(txscript.OP_0)
|
bldr.AddOp(txscript.OP_0)
|
||||||
scriptHash := sha256.Sum256(witnessScript)
|
scriptHash := sha256.Sum256(witnessScript)
|
||||||
bldr.AddData(scriptHash[:])
|
bldr.AddData(scriptHash[:])
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ https://github.com/lightningnetwork/lnd/pull/7359)
|
|||||||
* [Return `FEE_INSUFFICIENT` before checking balance for incoming low-fee
|
* [Return `FEE_INSUFFICIENT` before checking balance for incoming low-fee
|
||||||
HTLCs.](https://github.com/lightningnetwork/lnd/pull/7490).
|
HTLCs.](https://github.com/lightningnetwork/lnd/pull/7490).
|
||||||
|
|
||||||
|
* Optimize script allocation size in order to save
|
||||||
|
[memory](https://github.com/lightningnetwork/lnd/pull/7464).
|
||||||
|
|
||||||
## Spec
|
## Spec
|
||||||
|
|
||||||
* [Add test vectors for
|
* [Add test vectors for
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module github.com/lightningnetwork/lnd
|
|||||||
require (
|
require (
|
||||||
github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82
|
github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344
|
||||||
github.com/btcsuite/btcd v0.23.5-0.20230125025938-be056b0a0b2f
|
github.com/btcsuite/btcd v0.23.5-0.20230228185050-38331963bddd
|
||||||
github.com/btcsuite/btcd/btcec/v2 v2.3.2
|
github.com/btcsuite/btcd/btcec/v2 v2.3.2
|
||||||
github.com/btcsuite/btcd/btcutil v1.1.3
|
github.com/btcsuite/btcd/btcutil v1.1.3
|
||||||
github.com/btcsuite/btcd/btcutil/psbt v1.1.8
|
github.com/btcsuite/btcd/btcutil/psbt v1.1.8
|
||||||
|
|||||||
@@ -68,8 +68,8 @@ github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4/go.mod h1:7a
|
|||||||
github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
||||||
github.com/btcsuite/btcd v0.23.1/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
github.com/btcsuite/btcd v0.23.1/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
||||||
github.com/btcsuite/btcd v0.23.3/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
github.com/btcsuite/btcd v0.23.3/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
||||||
github.com/btcsuite/btcd v0.23.5-0.20230125025938-be056b0a0b2f h1:UJ/S/pV25+YsK0CJRJh8RDpTgy5h1oXWjOd4fp+opvY=
|
github.com/btcsuite/btcd v0.23.5-0.20230228185050-38331963bddd h1:v2Bs8yLhwv+8XYU96OOnhZ5BEj8ZlNGownexUO0e80I=
|
||||||
github.com/btcsuite/btcd v0.23.5-0.20230125025938-be056b0a0b2f/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
github.com/btcsuite/btcd v0.23.5-0.20230228185050-38331963bddd/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
|
||||||
github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
|
github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
|
||||||
github.com/btcsuite/btcd/btcec/v2 v2.1.1/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
|
github.com/btcsuite/btcd/btcec/v2 v2.1.1/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
|
||||||
github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
|
github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
|
||||||
|
|||||||
+45
-16
@@ -35,7 +35,9 @@ type Signature interface {
|
|||||||
// WitnessScriptHash generates a pay-to-witness-script-hash public key script
|
// WitnessScriptHash generates a pay-to-witness-script-hash public key script
|
||||||
// paying to a version 0 witness program paying to the passed redeem script.
|
// paying to a version 0 witness program paying to the passed redeem script.
|
||||||
func WitnessScriptHash(witnessScript []byte) ([]byte, error) {
|
func WitnessScriptHash(witnessScript []byte) ([]byte, error) {
|
||||||
bldr := txscript.NewScriptBuilder()
|
bldr := txscript.NewScriptBuilder(
|
||||||
|
txscript.WithScriptAllocSize(P2WSHSize),
|
||||||
|
)
|
||||||
|
|
||||||
bldr.AddOp(txscript.OP_0)
|
bldr.AddOp(txscript.OP_0)
|
||||||
scriptHash := sha256.Sum256(witnessScript)
|
scriptHash := sha256.Sum256(witnessScript)
|
||||||
@@ -47,7 +49,9 @@ func WitnessScriptHash(witnessScript []byte) ([]byte, error) {
|
|||||||
// paying to a version 0 witness program containing the passed serialized
|
// paying to a version 0 witness program containing the passed serialized
|
||||||
// public key.
|
// public key.
|
||||||
func WitnessPubKeyHash(pubkey []byte) ([]byte, error) {
|
func WitnessPubKeyHash(pubkey []byte) ([]byte, error) {
|
||||||
bldr := txscript.NewScriptBuilder()
|
bldr := txscript.NewScriptBuilder(
|
||||||
|
txscript.WithScriptAllocSize(P2WPKHSize),
|
||||||
|
)
|
||||||
|
|
||||||
bldr.AddOp(txscript.OP_0)
|
bldr.AddOp(txscript.OP_0)
|
||||||
pkhash := btcutil.Hash160(pubkey)
|
pkhash := btcutil.Hash160(pubkey)
|
||||||
@@ -58,7 +62,9 @@ func WitnessPubKeyHash(pubkey []byte) ([]byte, error) {
|
|||||||
// GenerateP2SH generates a pay-to-script-hash public key script paying to the
|
// GenerateP2SH generates a pay-to-script-hash public key script paying to the
|
||||||
// passed redeem script.
|
// passed redeem script.
|
||||||
func GenerateP2SH(script []byte) ([]byte, error) {
|
func GenerateP2SH(script []byte) ([]byte, error) {
|
||||||
bldr := txscript.NewScriptBuilder()
|
bldr := txscript.NewScriptBuilder(
|
||||||
|
txscript.WithScriptAllocSize(NestedP2WPKHSize),
|
||||||
|
)
|
||||||
|
|
||||||
bldr.AddOp(txscript.OP_HASH160)
|
bldr.AddOp(txscript.OP_HASH160)
|
||||||
scripthash := btcutil.Hash160(script)
|
scripthash := btcutil.Hash160(script)
|
||||||
@@ -70,7 +76,9 @@ func GenerateP2SH(script []byte) ([]byte, error) {
|
|||||||
// GenerateP2PKH generates a pay-to-public-key-hash public key script paying to
|
// GenerateP2PKH generates a pay-to-public-key-hash public key script paying to
|
||||||
// the passed serialized public key.
|
// the passed serialized public key.
|
||||||
func GenerateP2PKH(pubkey []byte) ([]byte, error) {
|
func GenerateP2PKH(pubkey []byte) ([]byte, error) {
|
||||||
bldr := txscript.NewScriptBuilder()
|
bldr := txscript.NewScriptBuilder(
|
||||||
|
txscript.WithScriptAllocSize(P2PKHSize),
|
||||||
|
)
|
||||||
|
|
||||||
bldr.AddOp(txscript.OP_DUP)
|
bldr.AddOp(txscript.OP_DUP)
|
||||||
bldr.AddOp(txscript.OP_HASH160)
|
bldr.AddOp(txscript.OP_HASH160)
|
||||||
@@ -96,7 +104,8 @@ func GenerateUnknownWitness() ([]byte, error) {
|
|||||||
// pubkeys.
|
// pubkeys.
|
||||||
func GenMultiSigScript(aPub, bPub []byte) ([]byte, error) {
|
func GenMultiSigScript(aPub, bPub []byte) ([]byte, error) {
|
||||||
if len(aPub) != 33 || len(bPub) != 33 {
|
if len(aPub) != 33 || len(bPub) != 33 {
|
||||||
return nil, fmt.Errorf("pubkey size error: compressed pubkeys only")
|
return nil, fmt.Errorf("pubkey size error: compressed " +
|
||||||
|
"pubkeys only")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swap to sort pubkeys if needed. Keys are sorted in lexicographical
|
// Swap to sort pubkeys if needed. Keys are sorted in lexicographical
|
||||||
@@ -107,7 +116,9 @@ func GenMultiSigScript(aPub, bPub []byte) ([]byte, error) {
|
|||||||
aPub, bPub = bPub, aPub
|
aPub, bPub = bPub, aPub
|
||||||
}
|
}
|
||||||
|
|
||||||
bldr := txscript.NewScriptBuilder()
|
bldr := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
MultiSigSize,
|
||||||
|
))
|
||||||
bldr.AddOp(txscript.OP_2)
|
bldr.AddOp(txscript.OP_2)
|
||||||
bldr.AddData(aPub) // Add both pubkeys (sorted).
|
bldr.AddData(aPub) // Add both pubkeys (sorted).
|
||||||
bldr.AddData(bPub)
|
bldr.AddData(bPub)
|
||||||
@@ -241,7 +252,9 @@ func SenderHTLCScript(senderHtlcKey, receiverHtlcKey,
|
|||||||
revocationKey *btcec.PublicKey, paymentHash []byte,
|
revocationKey *btcec.PublicKey, paymentHash []byte,
|
||||||
confirmedSpend bool) ([]byte, error) {
|
confirmedSpend bool) ([]byte, error) {
|
||||||
|
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
OfferedHtlcScriptSizeConfirmed,
|
||||||
|
))
|
||||||
|
|
||||||
// The opening operations are used to determine if this is the receiver
|
// The opening operations are used to determine if this is the receiver
|
||||||
// of the HTLC attempting to sweep all the funds due to a contract
|
// of the HTLC attempting to sweep all the funds due to a contract
|
||||||
@@ -484,7 +497,9 @@ func ReceiverHTLCScript(cltvExpiry uint32, senderHtlcKey,
|
|||||||
receiverHtlcKey, revocationKey *btcec.PublicKey,
|
receiverHtlcKey, revocationKey *btcec.PublicKey,
|
||||||
paymentHash []byte, confirmedSpend bool) ([]byte, error) {
|
paymentHash []byte, confirmedSpend bool) ([]byte, error) {
|
||||||
|
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
AcceptedHtlcScriptSizeConfirmed,
|
||||||
|
))
|
||||||
|
|
||||||
// The opening operations are used to determine if this is the sender
|
// The opening operations are used to determine if this is the sender
|
||||||
// of the HTLC attempting to sweep all the funds due to a contract
|
// of the HTLC attempting to sweep all the funds due to a contract
|
||||||
@@ -747,7 +762,9 @@ func ReceiverHtlcSpendTimeout(signer Signer, signDesc *SignDescriptor,
|
|||||||
func SecondLevelHtlcScript(revocationKey, delayKey *btcec.PublicKey,
|
func SecondLevelHtlcScript(revocationKey, delayKey *btcec.PublicKey,
|
||||||
csvDelay uint32) ([]byte, error) {
|
csvDelay uint32) ([]byte, error) {
|
||||||
|
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
ToLocalScriptSize,
|
||||||
|
))
|
||||||
|
|
||||||
// If this is the revocation clause for this script is to be executed,
|
// If this is the revocation clause for this script is to be executed,
|
||||||
// the spender will push a 1, forcing us to hit the true clause of this
|
// the spender will push a 1, forcing us to hit the true clause of this
|
||||||
@@ -815,7 +832,9 @@ func SecondLevelHtlcScript(revocationKey, delayKey *btcec.PublicKey,
|
|||||||
func LeaseSecondLevelHtlcScript(revocationKey, delayKey *btcec.PublicKey,
|
func LeaseSecondLevelHtlcScript(revocationKey, delayKey *btcec.PublicKey,
|
||||||
csvDelay, cltvExpiry uint32) ([]byte, error) {
|
csvDelay, cltvExpiry uint32) ([]byte, error) {
|
||||||
|
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
ToLocalScriptSize + LeaseWitnessScriptSizeOverhead,
|
||||||
|
))
|
||||||
|
|
||||||
// If this is the revocation clause for this script is to be executed,
|
// If this is the revocation clause for this script is to be executed,
|
||||||
// the spender will push a 1, forcing us to hit the true clause of this
|
// the spender will push a 1, forcing us to hit the true clause of this
|
||||||
@@ -998,7 +1017,9 @@ func CommitScriptToSelf(csvTimeout uint32, selfKey, revokeKey *btcec.PublicKey)
|
|||||||
// have divulged the revocation hash, allowing them to homomorphically
|
// have divulged the revocation hash, allowing them to homomorphically
|
||||||
// derive the proper private key which corresponds to the revoke public
|
// derive the proper private key which corresponds to the revoke public
|
||||||
// key.
|
// key.
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
ToLocalScriptSize,
|
||||||
|
))
|
||||||
|
|
||||||
builder.AddOp(txscript.OP_IF)
|
builder.AddOp(txscript.OP_IF)
|
||||||
|
|
||||||
@@ -1054,7 +1075,9 @@ func LeaseCommitScriptToSelf(selfKey, revokeKey *btcec.PublicKey,
|
|||||||
// have divulged the revocation hash, allowing them to homomorphically
|
// have divulged the revocation hash, allowing them to homomorphically
|
||||||
// derive the proper private key which corresponds to the revoke public
|
// derive the proper private key which corresponds to the revoke public
|
||||||
// key.
|
// key.
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
ToLocalScriptSize + LeaseWitnessScriptSizeOverhead,
|
||||||
|
))
|
||||||
|
|
||||||
builder.AddOp(txscript.OP_IF)
|
builder.AddOp(txscript.OP_IF)
|
||||||
|
|
||||||
@@ -1199,7 +1222,9 @@ func CommitSpendNoDelay(signer Signer, signDesc *SignDescriptor,
|
|||||||
// p2wkh output spendable immediately, requiring no contestation period.
|
// p2wkh output spendable immediately, requiring no contestation period.
|
||||||
func CommitScriptUnencumbered(key *btcec.PublicKey) ([]byte, error) {
|
func CommitScriptUnencumbered(key *btcec.PublicKey) ([]byte, error) {
|
||||||
// This script goes to the "other" party, and is spendable immediately.
|
// This script goes to the "other" party, and is spendable immediately.
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
P2WPKHSize,
|
||||||
|
))
|
||||||
builder.AddOp(txscript.OP_0)
|
builder.AddOp(txscript.OP_0)
|
||||||
builder.AddData(btcutil.Hash160(key.SerializeCompressed()))
|
builder.AddData(btcutil.Hash160(key.SerializeCompressed()))
|
||||||
|
|
||||||
@@ -1219,7 +1244,9 @@ func CommitScriptUnencumbered(key *btcec.PublicKey) ([]byte, error) {
|
|||||||
// <key> OP_CHECKSIGVERIFY
|
// <key> OP_CHECKSIGVERIFY
|
||||||
// 1 OP_CHECKSEQUENCEVERIFY
|
// 1 OP_CHECKSEQUENCEVERIFY
|
||||||
func CommitScriptToRemoteConfirmed(key *btcec.PublicKey) ([]byte, error) {
|
func CommitScriptToRemoteConfirmed(key *btcec.PublicKey) ([]byte, error) {
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
ToRemoteConfirmedScriptSize,
|
||||||
|
))
|
||||||
|
|
||||||
// Only the given key can spend the output.
|
// Only the given key can spend the output.
|
||||||
builder.AddData(key.SerializeCompressed())
|
builder.AddData(key.SerializeCompressed())
|
||||||
@@ -1248,7 +1275,7 @@ func CommitScriptToRemoteConfirmed(key *btcec.PublicKey) ([]byte, error) {
|
|||||||
func LeaseCommitScriptToRemoteConfirmed(key *btcec.PublicKey,
|
func LeaseCommitScriptToRemoteConfirmed(key *btcec.PublicKey,
|
||||||
leaseExpiry uint32) ([]byte, error) {
|
leaseExpiry uint32) ([]byte, error) {
|
||||||
|
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(45))
|
||||||
|
|
||||||
// Only the given key can spend the output.
|
// Only the given key can spend the output.
|
||||||
builder.AddData(key.SerializeCompressed())
|
builder.AddData(key.SerializeCompressed())
|
||||||
@@ -1310,7 +1337,9 @@ func CommitSpendToRemoteConfirmed(signer Signer, signDesc *SignDescriptor,
|
|||||||
// OP_16 OP_CSV
|
// OP_16 OP_CSV
|
||||||
// OP_ENDIF
|
// OP_ENDIF
|
||||||
func CommitScriptAnchor(key *btcec.PublicKey) ([]byte, error) {
|
func CommitScriptAnchor(key *btcec.PublicKey) ([]byte, error) {
|
||||||
builder := txscript.NewScriptBuilder()
|
builder := txscript.NewScriptBuilder(txscript.WithScriptAllocSize(
|
||||||
|
AnchorScriptSize,
|
||||||
|
))
|
||||||
|
|
||||||
// Spend immediately with key.
|
// Spend immediately with key.
|
||||||
builder.AddData(key.SerializeCompressed())
|
builder.AddData(key.SerializeCompressed())
|
||||||
|
|||||||
@@ -2034,3 +2034,215 @@ func TestSpecificationKeyDerivation(t *testing.T) {
|
|||||||
actualRevocationPrivKeyHex)
|
actualRevocationPrivKeyHex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BenchmarkScriptBuilderAlloc benchmarks the script builder's default
|
||||||
|
// allocation.
|
||||||
|
func BenchmarkScriptBuilderAlloc(t *testing.B) {
|
||||||
|
dummyData := []byte("dummy data")
|
||||||
|
randomPriv, err := btcec.NewPrivateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
randomPub := randomPriv.PubKey()
|
||||||
|
randomPubBytes := randomPub.SerializeCompressed()
|
||||||
|
|
||||||
|
t.ReportAllocs()
|
||||||
|
t.ResetTimer()
|
||||||
|
|
||||||
|
// We run each iteration 1000 times to make the script allocation stand
|
||||||
|
// out a bit more vs. the overhead of the rest of the function calls.
|
||||||
|
for i := 0; i < t.N*1000; i++ {
|
||||||
|
err := runScriptAllocTest(dummyData, randomPubBytes, randomPub)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestScriptBuilderAlloc makes sure the scripts generated by the utils have the
|
||||||
|
// correct length.
|
||||||
|
func TestScriptBuilderAlloc(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
dummyData := []byte("dummy data")
|
||||||
|
randomPriv, err := btcec.NewPrivateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
randomPub := randomPriv.PubKey()
|
||||||
|
randomPubBytes := randomPub.SerializeCompressed()
|
||||||
|
|
||||||
|
err = runScriptAllocTest(dummyData, randomPubBytes, randomPub)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// runScriptAllocTest runs the script size test. We don't use the "require"
|
||||||
|
// library to assert the length to not influence the benchmark too much.
|
||||||
|
func runScriptAllocTest(dummyData, randomPubBytes []byte,
|
||||||
|
randomPub *btcec.PublicKey) error {
|
||||||
|
|
||||||
|
const (
|
||||||
|
maxCLTV = 500000000
|
||||||
|
maxCSV = (1 << 31) - 1
|
||||||
|
)
|
||||||
|
script, err := WitnessScriptHash(dummyData)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != P2WSHSize {
|
||||||
|
return fmt.Errorf("expected script size of %d", P2WSHSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = WitnessPubKeyHash(randomPubBytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != P2WPKHSize {
|
||||||
|
return fmt.Errorf("expected script size of %d", P2WPKHSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = GenerateP2SH(dummyData)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != NestedP2WPKHSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
NestedP2WPKHSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = GenerateP2PKH(dummyData)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != P2PKHSize {
|
||||||
|
return fmt.Errorf("expected script size of %d", P2PKHSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = GenMultiSigScript(randomPubBytes, randomPubBytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != MultiSigSize {
|
||||||
|
return fmt.Errorf("expected script size of %d", MultiSigSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = SenderHTLCScript(
|
||||||
|
randomPub, randomPub, randomPub, dummyData, false,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != OfferedHtlcScriptSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
OfferedHtlcScriptSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = SenderHTLCScript(
|
||||||
|
randomPub, randomPub, randomPub, dummyData, true,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != OfferedHtlcScriptSizeConfirmed {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
OfferedHtlcScriptSizeConfirmed)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = ReceiverHTLCScript(
|
||||||
|
maxCLTV, randomPub, randomPub, randomPub, dummyData, false,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != AcceptedHtlcScriptSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
AcceptedHtlcScriptSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = ReceiverHTLCScript(
|
||||||
|
maxCLTV, randomPub, randomPub, randomPub, dummyData, true,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != AcceptedHtlcScriptSizeConfirmed {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
AcceptedHtlcScriptSizeConfirmed)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = SecondLevelHtlcScript(randomPub, randomPub, maxCSV)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != ToLocalScriptSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
ToLocalScriptSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = LeaseSecondLevelHtlcScript(
|
||||||
|
randomPub, randomPub, maxCSV, maxCLTV,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != ToLocalScriptSize+LeaseWitnessScriptSizeOverhead {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
ToLocalScriptSize+LeaseWitnessScriptSizeOverhead)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = CommitScriptToSelf(maxCSV, randomPub, randomPub)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != ToLocalScriptSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
ToLocalScriptSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = LeaseCommitScriptToSelf(
|
||||||
|
randomPub, randomPub, maxCSV, maxCLTV,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != ToLocalScriptSize+LeaseWitnessScriptSizeOverhead {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
ToLocalScriptSize+LeaseWitnessScriptSizeOverhead)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = CommitScriptUnencumbered(randomPub)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != P2WPKHSize {
|
||||||
|
return fmt.Errorf("expected script size of %d", P2WPKHSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = CommitScriptToRemoteConfirmed(randomPub)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != ToRemoteConfirmedScriptSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
ToRemoteConfirmedScriptSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = LeaseCommitScriptToRemoteConfirmed(randomPub, maxCSV)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) !=
|
||||||
|
ToRemoteConfirmedScriptSize+LeaseWitnessScriptSizeOverhead {
|
||||||
|
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
ToRemoteConfirmedScriptSize+
|
||||||
|
LeaseWitnessScriptSizeOverhead)
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err = CommitScriptAnchor(randomPub)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(script) != AnchorScriptSize {
|
||||||
|
return fmt.Errorf("expected script size of %d",
|
||||||
|
AnchorScriptSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Reference in new issue
Block a user