channeldb: expand the CommitDiff struct with the addition of LogUpdate
In this commit we finalized the structure of the CommitDiff struct by adding a set of LogUpdates, and also a valid CommitSig message. The LogUpdate struct houses a messages that were transmitted and locked-in with the new commitment state. We include the LogIndex along with the wire messages itself in order to be able to properly reconstruct the update log upon restart. The CommitSig message included should be transmitted after the set of LogUpdates, and fully covers the new commitment state and any new (or already present) HTLC’s that were included as part of the state.
This commit is contained in:
parent
3e3969eb66
commit
10a54a45fd
@ -746,71 +746,101 @@ func (h *HTLC) Copy() HTLC {
|
|||||||
return clone
|
return clone
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogUpdate represents a pending update to the remote commitment chain. The
|
||||||
|
// log update may be an add, fail, or settle entry. We maintain this data in
|
||||||
|
// order to be able to properly retransmit our proposed
|
||||||
|
// state if necessary.
|
||||||
|
type LogUpdate struct {
|
||||||
|
// LogIndex is the log index of this proposed commitment update entry.
|
||||||
|
LogIndex uint64
|
||||||
|
|
||||||
|
// UpdateMsg is the update message that was included within the our
|
||||||
|
// local update log. The LogIndex value denotes the log index of this
|
||||||
|
// update which will be used when restoring our local update log if
|
||||||
|
// we're left with a dangling update on restart.
|
||||||
|
UpdateMsg lnwire.Message
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommitDiff...
|
// CommitDiff represents the delta needed to apply the state transition between
|
||||||
|
// two subsequent commitment states. Given state N and state N+1, one is able
|
||||||
|
// to apply the set of messages contained within the CommitDiff to N to arrive
|
||||||
|
// at state N+1. Each time a new commitment is extended, we'll write a new
|
||||||
|
// commitment (along with the full commitment state) to disk so we can
|
||||||
|
// re-transmit the state in the case of a connection loss or message drop.
|
||||||
type CommitDiff struct {
|
type CommitDiff struct {
|
||||||
// PendingHeight...
|
// ChannelCommitment is the full commitment state that one would arrive
|
||||||
PendingHeight uint64
|
// at by applying the set of messages contained in the UpdateDiff to
|
||||||
|
// the prior accepted commitment.
|
||||||
|
Commitment ChannelCommitment
|
||||||
|
|
||||||
// PendingCommitment...
|
// LogUpdates is the set of messages sent prior to the commitment state
|
||||||
PendingCommitment *ChannelDelta
|
// transition in question. Upon reconnection, if we detect that they
|
||||||
|
// don't have the commitment, then we re-send this along with the
|
||||||
|
// proper signature.
|
||||||
|
LogUpdates []LogUpdate
|
||||||
|
|
||||||
// Updates...
|
// CommitSig is the exact CommitSig message that should be sent after
|
||||||
Updates []lnwire.Message
|
// the set of LogUpdates above has been retransmitted. The signatures
|
||||||
|
// within this message should properly cover the new commitment state
|
||||||
|
// and also the HTLC's within the new commitment state.
|
||||||
|
CommitSig *lnwire.CommitSig
|
||||||
}
|
}
|
||||||
|
|
||||||
// decode...
|
func serializeCommitDiff(w io.Writer, diff *CommitDiff) error {
|
||||||
func (d *CommitDiff) decode(w io.Writer) error {
|
if err := serializeChanCommit(w, &diff.Commitment); err != nil {
|
||||||
if err := binary.Write(w, byteOrder, d.PendingHeight); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := serializeChannelDelta(w, d.PendingCommitment); err != nil {
|
if err := diff.CommitSig.Encode(w, 0); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := binary.Write(w, byteOrder, uint16(len(d.Updates))); err != nil {
|
numUpdates := uint16(len(diff.LogUpdates))
|
||||||
|
if err := binary.Write(w, byteOrder, numUpdates); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, msg := range d.Updates {
|
for _, diff := range diff.LogUpdates {
|
||||||
if _, err := lnwire.WriteMessage(w, msg, 0); err != nil {
|
err := writeElements(w, diff.LogIndex, diff.UpdateMsg)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func deserializeCommitDiff(r io.Reader) (*CommitDiff, error) {
|
||||||
|
var (
|
||||||
|
d CommitDiff
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
// encode...
|
d.Commitment, err = deserializeChanCommit(r)
|
||||||
func (d *CommitDiff) encode(r io.Reader) error {
|
|
||||||
if err := binary.Read(r, byteOrder, &d.PendingHeight); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
delta, err := deserializeChannelDelta(r)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
d.PendingCommitment = delta
|
|
||||||
|
|
||||||
var length uint16
|
d.CommitSig = &lnwire.CommitSig{}
|
||||||
if err := binary.Read(r, byteOrder, &length); err != nil {
|
if err := d.CommitSig.Decode(r, 0); err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
d.Updates = make([]lnwire.Message, length)
|
|
||||||
|
|
||||||
for i, _ := range d.Updates {
|
var numUpdates uint16
|
||||||
msg, err := lnwire.ReadMessage(r, 0)
|
if err := binary.Read(r, byteOrder, &numUpdates); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.LogUpdates = make([]LogUpdate, numUpdates)
|
||||||
|
for i := 0; i < int(numUpdates); i++ {
|
||||||
|
err := readElements(r,
|
||||||
|
&d.LogUpdates[i].LogIndex, &d.LogUpdates[i].UpdateMsg,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
d.Updates[i] = msg
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return &d, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddCommitDiff...
|
// AddCommitDiff...
|
||||||
|
Loading…
Reference in New Issue
Block a user