-
Notifications
You must be signed in to change notification settings - Fork 181
/
display_state.go
132 lines (108 loc) · 3.68 KB
/
display_state.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"fmt"
"log"
"path/filepath"
ethcmn "github.com/ethereum/go-ethereum/common"
"github.com/okex/exchain/app"
"github.com/okex/exchain/libs/cosmos-sdk/server"
sdk "github.com/okex/exchain/libs/cosmos-sdk/types"
abci "github.com/okex/exchain/libs/tendermint/abci/types"
tmtypes "github.com/okex/exchain/libs/tendermint/types"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
const (
FlagDisplayVersion string = "version"
FlagDisplayAddress string = "address"
)
func displayStateCmd(ctx *server.Context) *cobra.Command {
cmd := &cobra.Command{
Use: "display-state",
Short: "display account or contract state",
}
cmd.AddCommand(
displayAccount(ctx),
displayContract(ctx),
)
return cmd
}
func displayAccount(ctx *server.Context) *cobra.Command {
cmd := &cobra.Command{
Use: "account",
Short: "display account info at given height",
Run: func(cmd *cobra.Command, args []string) {
log.Println("--------- display account start ---------")
displayAccountState(ctx)
log.Println("--------- display account end ---------")
},
}
cmd.Flags().String(FlagDisplayAddress, "", "target contract address to display")
cmd.Flags().Int64(FlagDisplayVersion, 0, "target state version to display")
cmd.Flags().String(sdk.FlagDBBackend, tmtypes.DBBackend, "Database backend: goleveldb | rocksdb")
return cmd
}
func displayContract(ctx *server.Context) *cobra.Command {
cmd := &cobra.Command{
Use: "contract",
Short: "display contract state info at given height",
Run: func(cmd *cobra.Command, args []string) {
log.Println("--------- display contract state start ---------")
displayContractState(ctx)
log.Println("--------- display contract state end ---------")
},
}
cmd.Flags().String(FlagDisplayAddress, "", "target contract address to display")
cmd.Flags().Int64(FlagDisplayVersion, 0, "target state version to display")
cmd.Flags().String(sdk.FlagDBBackend, tmtypes.DBBackend, "Database backend: goleveldb | rocksdb")
return cmd
}
func displayAccountState(ctx *server.Context) {
dispApp := newDisplayApp(ctx)
// load start version
displayVersion := viper.GetInt64(FlagDisplayVersion)
dispApp.EvmKeeper.SetTargetMptVersion(displayVersion)
err := dispApp.LoadHeight(displayVersion)
panicError(err)
accountAddr := viper.GetString(FlagDisplayAddress)
accAddr, err := sdk.AccAddressFromBech32(accountAddr)
if err != nil {
panic("Fail to parser AccAddress from : " + accountAddr)
}
// init deliver state
dispApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: displayVersion + 1}})
acc := dispApp.AccountKeeper.GetAccount(dispApp.GetDeliverStateCtx(), accAddr)
fmt.Println("account is: ", acc.String())
}
func displayContractState(ctx *server.Context) {
dispApp := newDisplayApp(ctx)
// load start version
displayVersion := viper.GetInt64(FlagDisplayVersion)
dispApp.EvmKeeper.SetTargetMptVersion(displayVersion)
err := dispApp.LoadHeight(displayVersion)
panicError(err)
contractAddr := viper.GetString(FlagDisplayAddress)
addr := ethcmn.HexToAddress(contractAddr)
// init deliver state
dispApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: displayVersion + 1}})
_ = dispApp.EvmKeeper.ForEachStorage(dispApp.GetDeliverStateCtx(), addr, func(key, value ethcmn.Hash) bool {
fmt.Println("Key is: ", key.String(), ", value is: ", value.String())
return false
})
}
func newDisplayApp(ctx *server.Context) *app.OKExChainApp {
rootDir := ctx.Config.RootDir
dataDir := filepath.Join(rootDir, "data")
db, err := sdk.NewDB(applicationDB, dataDir)
if err != nil {
panic("fail to open application db: " + err.Error())
}
return app.NewOKExChainApp(
ctx.Logger,
db,
nil,
false,
map[int64]bool{},
0,
)
}