channeldb: read raw htlc attempt session key
This commit is contained in:
parent
eb068bf666
commit
8071ebb16a
@ -53,7 +53,7 @@ type duplicateHTLCAttemptInfo struct {
|
|||||||
attemptID uint64
|
attemptID uint64
|
||||||
|
|
||||||
// sessionKey is the ephemeral key used for this attempt.
|
// sessionKey is the ephemeral key used for this attempt.
|
||||||
sessionKey *btcec.PrivateKey
|
sessionKey [btcec.PrivKeyBytesLen]byte
|
||||||
|
|
||||||
// route is the route attempted to send the HTLC.
|
// route is the route attempted to send the HTLC.
|
||||||
route route.Route
|
route route.Route
|
||||||
|
@ -21,8 +21,10 @@ type HTLCAttemptInfo struct {
|
|||||||
// AttemptID is the unique ID used for this attempt.
|
// AttemptID is the unique ID used for this attempt.
|
||||||
AttemptID uint64
|
AttemptID uint64
|
||||||
|
|
||||||
// sessionKey is the ephemeral key used for this attempt.
|
// sessionKey is the raw bytes ephemeral key used for this attempt.
|
||||||
sessionKey *btcec.PrivateKey
|
// These bytes are lazily read off disk to save ourselves the expensive
|
||||||
|
// EC operations used by btcec.PrivKeyFromBytes.
|
||||||
|
sessionKey [btcec.PrivKeyBytesLen]byte
|
||||||
|
|
||||||
// Route is the route attempted to send the HTLC.
|
// Route is the route attempted to send the HTLC.
|
||||||
Route route.Route
|
Route route.Route
|
||||||
@ -43,18 +45,23 @@ func NewHtlcAttemptInfo(attemptID uint64, sessionKey *btcec.PrivateKey,
|
|||||||
route route.Route, attemptTime time.Time,
|
route route.Route, attemptTime time.Time,
|
||||||
hash *lntypes.Hash) *HTLCAttemptInfo {
|
hash *lntypes.Hash) *HTLCAttemptInfo {
|
||||||
|
|
||||||
|
var scratch [btcec.PrivKeyBytesLen]byte
|
||||||
|
copy(scratch[:], sessionKey.Serialize())
|
||||||
|
|
||||||
return &HTLCAttemptInfo{
|
return &HTLCAttemptInfo{
|
||||||
AttemptID: attemptID,
|
AttemptID: attemptID,
|
||||||
sessionKey: sessionKey,
|
sessionKey: scratch,
|
||||||
Route: route,
|
Route: route,
|
||||||
AttemptTime: attemptTime,
|
AttemptTime: attemptTime,
|
||||||
Hash: hash,
|
Hash: hash,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionKey returns the ephemeral key used for a htlc attempt.
|
// SessionKey returns the ephemeral key used for a htlc attempt. This function
|
||||||
|
// performs expensive ec-ops to obtain the session key.
|
||||||
func (h *HTLCAttemptInfo) SessionKey() *btcec.PrivateKey {
|
func (h *HTLCAttemptInfo) SessionKey() *btcec.PrivateKey {
|
||||||
return h.sessionKey
|
priv, _ := btcec.PrivKeyFromBytes(btcec.S256(), h.sessionKey[:])
|
||||||
|
return priv
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTLCAttempt contains information about a specific HTLC attempt for a given
|
// HTLCAttempt contains information about a specific HTLC attempt for a given
|
||||||
|
27
channeldb/mp_payment_test.go
Normal file
27
channeldb/mp_payment_test.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package channeldb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestLazySessionKeyDeserialize tests that we can read htlc attempt session
|
||||||
|
// keys that were previously serialized as a private key as raw bytes.
|
||||||
|
func TestLazySessionKeyDeserialize(t *testing.T) {
|
||||||
|
var b bytes.Buffer
|
||||||
|
|
||||||
|
// Serialize as a private key.
|
||||||
|
err := WriteElements(&b, priv)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Deserialize into [btcec.PrivKeyBytesLen]byte.
|
||||||
|
attempt := HTLCAttemptInfo{}
|
||||||
|
err = ReadElements(&b, &attempt.sessionKey)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Zero(t, b.Len())
|
||||||
|
|
||||||
|
sessionKey := attempt.SessionKey()
|
||||||
|
require.Equal(t, priv, sessionKey)
|
||||||
|
}
|
@ -37,17 +37,15 @@ func genInfo() (*PaymentCreationInfo, *HTLCAttemptInfo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rhash := sha256.Sum256(preimage[:])
|
rhash := sha256.Sum256(preimage[:])
|
||||||
|
attempt := NewHtlcAttemptInfo(
|
||||||
|
0, priv, *testRoute.Copy(), time.Time{}, nil,
|
||||||
|
)
|
||||||
return &PaymentCreationInfo{
|
return &PaymentCreationInfo{
|
||||||
PaymentIdentifier: rhash,
|
PaymentIdentifier: rhash,
|
||||||
Value: testRoute.ReceiverAmt(),
|
Value: testRoute.ReceiverAmt(),
|
||||||
CreationTime: time.Unix(time.Now().Unix(), 0),
|
CreationTime: time.Unix(time.Now().Unix(), 0),
|
||||||
PaymentRequest: []byte("hola"),
|
PaymentRequest: []byte("hola"),
|
||||||
},
|
}, attempt, preimage, nil
|
||||||
&HTLCAttemptInfo{
|
|
||||||
AttemptID: 0,
|
|
||||||
sessionKey: priv,
|
|
||||||
Route: *testRoute.Copy(),
|
|
||||||
}, preimage, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestPaymentControlSwitchFail checks that payment status returns to Failed
|
// TestPaymentControlSwitchFail checks that payment status returns to Failed
|
||||||
|
@ -68,13 +68,10 @@ func makeFakeInfo() (*PaymentCreationInfo, *HTLCAttemptInfo) {
|
|||||||
PaymentRequest: []byte(""),
|
PaymentRequest: []byte(""),
|
||||||
}
|
}
|
||||||
|
|
||||||
a := &HTLCAttemptInfo{
|
a := NewHtlcAttemptInfo(
|
||||||
AttemptID: 44,
|
44, priv, testRoute, time.Unix(100, 0), &hash,
|
||||||
sessionKey: priv,
|
)
|
||||||
Route: testRoute,
|
|
||||||
AttemptTime: time.Unix(100, 0),
|
|
||||||
Hash: &hash,
|
|
||||||
}
|
|
||||||
return c, a
|
return c, a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user