/
evm2cm.go
118 lines (103 loc) · 2.82 KB
/
evm2cm.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
package baseapp
import (
"encoding/json"
"fmt"
sdk "github.com/FiboChain/fbc/libs/cosmos-sdk/types"
)
var (
cmHandles = make(map[string]*CMHandle)
evmResultConverter func(txHash, data []byte) ([]byte, error)
evmConvertJudge func(msg sdk.Msg) ([]byte, bool)
evmParamParse func(msg sdk.Msg) ([]byte, error)
)
type MsgWrapper struct {
Name string `json:"type"`
Data json.RawMessage `json:"value"`
}
type CMHandle struct {
fn func(data []byte, signers []sdk.AccAddress) (sdk.Msg, error)
height int64
}
func NewCMHandle(fn func(data []byte, signers []sdk.AccAddress) (sdk.Msg, error), height int64) *CMHandle {
return &CMHandle{
fn: fn,
height: height,
}
}
func RegisterCmHandle(msgType string, create *CMHandle) {
if create == nil {
panic("Register CmHandle is nil")
}
if _, dup := cmHandles[msgType]; dup {
panic("Register CmHandle twice for same module and func " + msgType)
}
cmHandles[msgType] = create
}
func RegisterEvmResultConverter(create func(txHash, data []byte) ([]byte, error)) {
if create == nil {
panic("Register EvmResultConverter is nil")
}
evmResultConverter = create
}
func RegisterEvmParamParse(create func(msg sdk.Msg) ([]byte, error)) {
if create == nil {
panic("Register EvmParamParse is nil")
}
evmParamParse = create
}
func RegisterEvmConvertJudge(create func(msg sdk.Msg) ([]byte, bool)) {
if create == nil {
panic("Register EvmConvertJudge is nil")
}
evmConvertJudge = create
}
func ConvertMsg(msg sdk.Msg, height int64) (sdk.Msg, error) {
v, err := evmParamParse(msg)
if err != nil {
return nil, err
}
msgWrap, err := ParseMsgWrapper(v)
if err != nil {
return nil, err
}
if cmh, ok := cmHandles[msgWrap.Name]; ok && height >= cmh.height {
return cmh.fn(msgWrap.Data, msg.GetSigners())
}
return nil, fmt.Errorf("not find handle")
}
func ParseMsgWrapper(data []byte) (*MsgWrapper, error) {
cmt := &MsgWrapper{}
err := json.Unmarshal(data, cmt)
if err != nil {
return nil, err
}
if cmt.Name == "" {
return nil, fmt.Errorf("parse msg name field is empty")
}
if len(cmt.Data) == 0 {
return nil, fmt.Errorf("parse msg data field is empty")
}
return cmt, nil
}
func EvmResultConvert(txHash, data []byte) ([]byte, error) {
return evmResultConverter(txHash, data)
}
func (app *BaseApp) JudgeEvmConvert(ctx sdk.Context, msg sdk.Msg) bool {
if app.EvmSysContractAddressHandler == nil ||
evmConvertJudge == nil ||
evmParamParse == nil ||
evmResultConverter == nil {
return false
}
addr, ok := evmConvertJudge(msg)
if !ok || len(addr) == 0 {
return false
}
return app.EvmSysContractAddressHandler(ctx, addr)
}
func (app *BaseApp) SetEvmSysContractAddressHandler(handler sdk.EvmSysContractAddressHandler) {
if app.sealed {
panic("SetEvmSysContractAddressHandler() on sealed BaseApp")
}
app.EvmSysContractAddressHandler = handler
}