Skip to content

Commit f2e9f3c

Browse files
authored
Merge pull request #176 from dai1975/lo7181b-1-impl
fix about lost blockchain state: 2nd PR: implements chain independent update
2 parents 835f5a6 + c6149b7 commit f2e9f3c

File tree

15 files changed

+1031
-548
lines changed

15 files changed

+1031
-548
lines changed

cmd/tx.go

Lines changed: 95 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package cmd
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
67
"strings"
78
"time"
89

910
"github.com/cosmos/cosmos-sdk/client/flags"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
1012
clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"
1113
chantypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
1214
"github.com/cosmos/ibc-go/v8/modules/core/exported"
@@ -15,6 +17,7 @@ import (
1517
"github.com/spf13/cobra"
1618
"github.com/spf13/pflag"
1719
"github.com/spf13/viper"
20+
"golang.org/x/sync/errgroup"
1821
)
1922

2023
// transactionCmd represents the tx command
@@ -411,6 +414,23 @@ func channelUpgradeCancelCmd(ctx *config.Context) *cobra.Command {
411414
return &cmd
412415
}
413416

417+
func relayMsgs(ctx context.Context, st core.StrategyI, src, dst *core.ProvableChain, isSrcToDst bool, packets core.PacketInfoList, sh core.SyncHeaders, doExecuteRelay, doExecuteAck, doRefresh bool) ([]sdk.Msg, error) {
418+
var msgs []sdk.Msg
419+
420+
if m, err := st.UpdateClients(ctx, src, dst, isSrcToDst, doExecuteRelay, doExecuteAck, sh, doRefresh); err != nil {
421+
return nil, err
422+
} else {
423+
msgs = append(msgs, m...)
424+
}
425+
426+
if m, err := st.RelayPackets(ctx, src, dst, isSrcToDst, packets, sh, doExecuteRelay); err != nil {
427+
return nil, err
428+
} else {
429+
msgs = append(msgs, m...)
430+
}
431+
return msgs, nil
432+
}
433+
414434
func relayMsgsCmd(ctx *config.Context) *cobra.Command {
415435
const (
416436
flagDoRefresh = "do-refresh"
@@ -458,22 +478,35 @@ func relayMsgsCmd(ctx *config.Context) *cobra.Command {
458478
}
459479

460480
msgs := core.NewRelayMsgs()
461-
462-
doExecuteRelaySrc := len(sp.Dst) > 0
463-
doExecuteRelayDst := len(sp.Src) > 0
464-
doExecuteAckSrc := false
465-
doExecuteAckDst := false
466-
467-
if m, err := st.UpdateClients(cmd.Context(), c[src], c[dst], doExecuteRelaySrc, doExecuteRelayDst, doExecuteAckSrc, doExecuteAckDst, sh, viper.GetBool(flagDoRefresh)); err != nil {
468-
return err
469-
} else {
470-
msgs.Merge(m)
471-
}
472-
473-
if m, err := st.RelayPackets(cmd.Context(), c[src], c[dst], sp, sh, doExecuteRelaySrc, doExecuteRelayDst); err != nil {
474-
return err
475-
} else {
476-
msgs.Merge(m)
481+
{
482+
var eg = new(errgroup.Group)
483+
484+
doExecuteRelaySrc := len(sp.Dst) > 0
485+
doExecuteRelayDst := len(sp.Src) > 0
486+
doExecuteAckSrc := false
487+
doExecuteAckDst := false
488+
doRefresh := viper.GetBool(flagDoRefresh)
489+
490+
eg.Go(func() error {
491+
m, err := relayMsgs(cmd.Context(), st, c[src], c[dst], true, sp.Src, sh, doExecuteRelayDst, doExecuteAckDst, doRefresh)
492+
if err != nil {
493+
return err
494+
}
495+
msgs.Dst = m
496+
return nil
497+
})
498+
eg.Go(func() error {
499+
m, err := relayMsgs(cmd.Context(), st, c[src], c[dst], false, sp.Dst, sh, doExecuteRelaySrc, doExecuteAckSrc, doRefresh)
500+
if err != nil {
501+
return err
502+
}
503+
msgs.Src = m
504+
return nil
505+
})
506+
507+
if err := eg.Wait(); err != nil {
508+
return err
509+
}
477510
}
478511

479512
st.Send(cmd.Context(), c[src], c[dst], msgs)
@@ -488,6 +521,23 @@ func relayMsgsCmd(ctx *config.Context) *cobra.Command {
488521
return cmd
489522
}
490523

524+
func relayAcks(ctx context.Context, st core.StrategyI, src, dst *core.ProvableChain, isSrcToDst bool, acks core.PacketInfoList, sh core.SyncHeaders, doExecuteRelay, doExecuteAck, doRefresh bool) ([]sdk.Msg, error) {
525+
var msgs []sdk.Msg
526+
527+
if m, err := st.UpdateClients(ctx, src, dst, isSrcToDst, doExecuteRelay, doExecuteAck, sh, doRefresh); err != nil {
528+
return nil, err
529+
} else {
530+
msgs = append(msgs, m...)
531+
}
532+
533+
if m, err := st.RelayAcknowledgements(ctx, src, dst, isSrcToDst, acks, sh, doExecuteAck); err != nil {
534+
return nil, err
535+
} else {
536+
msgs = append(msgs, m...)
537+
}
538+
return msgs, nil
539+
}
540+
491541
func relayAcksCmd(ctx *config.Context) *cobra.Command {
492542
const (
493543
flagDoRefresh = "do-refresh"
@@ -533,22 +583,35 @@ func relayAcksCmd(ctx *config.Context) *cobra.Command {
533583
}
534584

535585
msgs := core.NewRelayMsgs()
536-
537-
doExecuteRelaySrc := false
538-
doExecuteRelayDst := false
539-
doExecuteAckSrc := len(sp.Dst) > 0
540-
doExecuteAckDst := len(sp.Src) > 0
541-
542-
if m, err := st.UpdateClients(cmd.Context(), c[src], c[dst], doExecuteRelaySrc, doExecuteRelayDst, doExecuteAckSrc, doExecuteAckDst, sh, viper.GetBool(flagDoRefresh)); err != nil {
543-
return err
544-
} else {
545-
msgs.Merge(m)
546-
}
547-
548-
if m, err := st.RelayAcknowledgements(cmd.Context(), c[src], c[dst], sp, sh, doExecuteAckSrc, doExecuteAckDst); err != nil {
549-
return err
550-
} else {
551-
msgs.Merge(m)
586+
{
587+
var eg = new(errgroup.Group)
588+
589+
doExecuteRelaySrc := false
590+
doExecuteRelayDst := false
591+
doExecuteAckSrc := len(sp.Dst) > 0
592+
doExecuteAckDst := len(sp.Src) > 0
593+
doRefresh := viper.GetBool(flagDoRefresh)
594+
595+
eg.Go(func() error {
596+
m, err := relayAcks(cmd.Context(), st, c[src], c[dst], true, sp.Src, sh, doExecuteRelayDst, doExecuteAckDst, doRefresh)
597+
if err != nil {
598+
return err
599+
}
600+
msgs.Dst = m
601+
return nil
602+
})
603+
eg.Go(func() error {
604+
m, err := relayAcks(cmd.Context(), st, c[src], c[dst], false, sp.Dst, sh, doExecuteRelaySrc, doExecuteAckSrc, doRefresh)
605+
if err != nil {
606+
return err
607+
}
608+
msgs.Src = m
609+
return nil
610+
})
611+
612+
if err := eg.Wait(); err != nil {
613+
return err
614+
}
552615
}
553616

554617
st.Send(cmd.Context(), c[src], c[dst], msgs)

0 commit comments

Comments
 (0)