input: ensure sessionOpts is properly threaded through
This commit is contained in:
6 files changed
+74
-69
No files matched your search
@@ -2,6 +2,7 @@ package channeldb
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/hmac"
|
||||
"crypto/sha256"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
@@ -13,6 +14,7 @@ import (
|
||||
"sync"
|
||||
|
||||
"github.com/btcsuite/btcd/btcec/v2"
|
||||
"github.com/btcsuite/btcd/btcec/v2/schnorr/musig2"
|
||||
"github.com/btcsuite/btcd/btcutil"
|
||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
@@ -1381,6 +1383,65 @@ func (c *OpenChannel) SecondCommitmentPoint() (*btcec.PublicKey, error) {
|
||||
return input.ComputeCommitmentPoint(revocation[:]), nil
|
||||
}
|
||||
|
||||
var (
|
||||
// taprootRevRootKey is the key used to derive the revocation root for
|
||||
// the taproot nonces. This is done via HMAC of the existing revocation
|
||||
// root.
|
||||
taprootRevRootKey = []byte("taproot-rev-root")
|
||||
)
|
||||
|
||||
// DeriveMusig2Shachain derives a shachain producer for the taproot channel
|
||||
// from normal shachain revocation root.
|
||||
func DeriveMusig2Shachain(revRoot shachain.Producer) (shachain.Producer, error) { //nolint:lll
|
||||
// In order to obtain the revocation root hash to create the taproot
|
||||
// revocation, we'll encode the producer into a buffer, then use that
|
||||
// to derive the shachain root needed.
|
||||
var rootHashBuf bytes.Buffer
|
||||
if err := revRoot.Encode(&rootHashBuf); err != nil {
|
||||
return nil, fmt.Errorf("unable to encode producer: %w", err)
|
||||
}
|
||||
|
||||
revRootHash := chainhash.HashH(rootHashBuf.Bytes())
|
||||
|
||||
// For taproot channel types, we'll also generate a distinct shachain
|
||||
// root using the same seed information. We'll use this to generate
|
||||
// verification nonces for the channel. We'll bind with this a simple
|
||||
// hmac.
|
||||
taprootRevHmac := hmac.New(sha256.New, taprootRevRootKey)
|
||||
if _, err := taprootRevHmac.Write(revRootHash[:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
taprootRevRoot := taprootRevHmac.Sum(nil)
|
||||
|
||||
// Once we have the root, we can then generate our shachain producer
|
||||
// and from that generate the per-commitment point.
|
||||
return shachain.NewRevocationProducerFromBytes(
|
||||
taprootRevRoot,
|
||||
)
|
||||
}
|
||||
|
||||
// NewMusigVerificationNonce generates the local or verification nonce for
|
||||
// another musig2 session. In order to permit our implementation to not have to
|
||||
// write any secret nonce state to disk, we'll use the _next_ shachain
|
||||
// pre-image as our primary randomness source. When used to generate the nonce
|
||||
// again to broadcast our commitment hte current height will be used.
|
||||
func NewMusigVerificationNonce(pubKey *btcec.PublicKey, targetHeight uint64,
|
||||
shaGen shachain.Producer) (*musig2.Nonces, error) {
|
||||
|
||||
// Now that we know what height we need, we'll grab the shachain
|
||||
// pre-image at the target destination.
|
||||
nextPreimage, err := shaGen.AtIndex(targetHeight)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
shaChainRand := musig2.WithCustomRand(bytes.NewBuffer(nextPreimage[:]))
|
||||
pubKeyOpt := musig2.WithPublicKey(pubKey)
|
||||
|
||||
return musig2.GenNonces(pubKeyOpt, shaChainRand)
|
||||
}
|
||||
|
||||
// ChanSyncMsg returns the ChannelReestablish message that should be sent upon
|
||||
// reconnection with the remote peer that we're maintaining this channel with.
|
||||
// The information contained within this message is necessary to re-sync our
|
||||
|
||||
Reference in new issue
Block a user