lnwallet: handle duplicate payment hashes in toChannelDelta()
This commit is contained in:
parent
fbf819062a
commit
4d03f60e40
@ -230,6 +230,10 @@ type commitment struct {
|
|||||||
// TODO(roasbeef): properly fill in refund timeouts
|
// TODO(roasbeef): properly fill in refund timeouts
|
||||||
func (c *commitment) toChannelDelta() (*channeldb.ChannelDelta, error) {
|
func (c *commitment) toChannelDelta() (*channeldb.ChannelDelta, error) {
|
||||||
numHtlcs := len(c.outgoingHTLCs) + len(c.incomingHTLCs)
|
numHtlcs := len(c.outgoingHTLCs) + len(c.incomingHTLCs)
|
||||||
|
|
||||||
|
// Save output indexes for RHash values found, so we don't return the
|
||||||
|
// same output index more than once.
|
||||||
|
dups := make(map[PaymentHash][]uint16)
|
||||||
delta := &channeldb.ChannelDelta{
|
delta := &channeldb.ChannelDelta{
|
||||||
LocalBalance: c.ourBalance,
|
LocalBalance: c.ourBalance,
|
||||||
RemoteBalance: c.theirBalance,
|
RemoteBalance: c.theirBalance,
|
||||||
@ -237,6 +241,16 @@ func (c *commitment) toChannelDelta() (*channeldb.ChannelDelta, error) {
|
|||||||
Htlcs: make([]*channeldb.HTLC, 0, numHtlcs),
|
Htlcs: make([]*channeldb.HTLC, 0, numHtlcs),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check to see if element (e) exists in slice (s)
|
||||||
|
contains := func(s []uint16, e uint16) bool {
|
||||||
|
for _, a := range s {
|
||||||
|
if a == e {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// As we also store the output index of the HTLC for continence
|
// As we also store the output index of the HTLC for continence
|
||||||
// purposes, we create a small helper function to locate the output
|
// purposes, we create a small helper function to locate the output
|
||||||
// index of a particular HTLC within the current commitment
|
// index of a particular HTLC within the current commitment
|
||||||
@ -244,9 +258,13 @@ func (c *commitment) toChannelDelta() (*channeldb.ChannelDelta, error) {
|
|||||||
locateOutputIndex := func(p *PaymentDescriptor) uint16 {
|
locateOutputIndex := func(p *PaymentDescriptor) uint16 {
|
||||||
var idx uint16
|
var idx uint16
|
||||||
for i, txOut := range c.txn.TxOut {
|
for i, txOut := range c.txn.TxOut {
|
||||||
// TODO(roasbeef): duplicated payment hashes...
|
|
||||||
if bytes.Equal(txOut.PkScript, p.pkScript) {
|
if bytes.Equal(txOut.PkScript, p.pkScript) {
|
||||||
|
if contains(dups[p.RHash], uint16(i)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
idx = uint16(i)
|
idx = uint16(i)
|
||||||
|
dups[p.RHash] = append(dups[p.RHash], idx)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user