/
fetcher.go
153 lines (141 loc) · 4.21 KB
/
fetcher.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package everpay_sync
import (
"errors"
"fmt"
"github.com/everFinance/go-everpay/common"
"github.com/everFinance/goar"
"github.com/everFinance/goar/types"
"time"
)
var (
ErrNotNeedSync = errors.New("not need sync")
log = common.NewLog("example_everpay")
)
func (e *EverPaySync) fetchTxIds(processedArTxId string) (err error) {
// get ar tx
// processArParentId, err := getParentIdByTags(processedArTxId, e.arCli)
// if err != nil {
// return err
// }
// arOwnerLastTxId, err := getLastTxId(e.rollupOwner, processedArTxId, processArParentId, e.arCli)
// if err != nil {
// if err == ErrNotNeedSync {
// return nil
// }
// log.Warn("getLastTxId(arOwner, processedArTxId, c)", "err", err)
// return err
// }
if processedArTxId == "" {
processedArTxId, err = e.arCli.GetLastTransactionID(e.rollupOwner)
if err != nil {
return err
}
}
var (
parentTxId string
)
id := processedArTxId
for {
parentTxId, err = getParentIdByTags(id, e.arCli)
if err != nil {
return err
}
// if parentTxId == processedArTxId || parentTxId == processArParentId {
// break
// }
if parentTxId == "" {
break
}
id = parentTxId
e.arIdChan <- parentTxId
}
return nil
}
func getLastTxId(arOwner string, processedArTxId string, processedParentArTxId string, c *goar.Client) (string, error) {
var (
lastTxId string
err error
)
// 1. get owner last tx id
lastTxId, err = c.GetLastTransactionID(arOwner)
if err != nil {
log.Error("c.GetLastTransactionID(arOwner)", "err", err)
return "", err
}
log.Warn("get processedArTxId", "tracker processedArTxId", processedArTxId, "current lastTxId", lastTxId)
if len(lastTxId) == 0 {
return "", errors.New("get arOwner last txId nil")
}
// 2. check lastTxId is packaged ar tx
// 2.1 if same id, not need sync
if lastTxId == processedArTxId {
log.Debug("lastTxId == processedArTxId", "do not need sync rollup tx, processedArTxId", processedArTxId, "lastTxId", lastTxId)
return "", ErrNotNeedSync
}
// check lastTxId must more than 2 block confirms
lastTxStatus, err := c.GetTransactionStatus(lastTxId)
if err != nil {
log.Error("native-fetch c.GetTransactionStatus(lastTxId)", "err", err, "lastTxId", lastTxId)
return "", err
}
// if lastTx confirms block < 3, so we need use parentTxId as lastTxId
if lastTxStatus.NumberOfConfirmations < 3 {
// get parent txId as lastTxId
lastTxId, err = getParentIdByTags(lastTxId, c)
if err != nil {
log.Error("get lastTx parentId tags", "err", err, "lastTxId", lastTxId)
return "", err
}
// lastTxId must > processedArTxId,so can not == processedArTxId || processedParentArTxId
if lastTxId == processedArTxId || lastTxId == processedParentArTxId {
log.Debug("lastTxId == processedArTxId || lastTxId == processedParentArTxId; do not need sync rollup tx", "processedArTxId", processedArTxId, "lastTxId", lastTxId, "processedParentArTxId", processedParentArTxId)
return "", ErrNotNeedSync
}
}
// 2.2 lastTxId can not less than processedArTxId
if len(processedArTxId) != 0 {
lastTxStatus, err = c.GetTransactionStatus(lastTxId)
if err != nil {
log.Error("c.GetTransactionStatus(lastTxId)", "err", err, "lastTxId", lastTxId)
return "", err
}
processedArTxStatus, err := c.GetTransactionStatus(processedArTxId)
if err != nil {
log.Error("c.GetTransactionStatus(processedArTxId)", "err", err, "processedArTxId", processedArTxId)
return "", err
}
// lastTxHeight must >= processedArTxHeight
if lastTxStatus.BlockHeight < processedArTxStatus.BlockHeight {
return "", fmt.Errorf("lastTxId must more than processedArTxId; lastTxId: %s,processedArTxId: %s", lastTxId, processedArTxId)
}
}
return lastTxId, nil
}
func getParentIdByTags(arId string, c *goar.Client) (string, error) {
if arId == "" {
return "", nil
}
var (
tags []types.Tag
err error
)
for {
tags, err = c.GetTransactionTags(arId)
if err == nil || err != goar.ErrBadGateway {
break
}
time.Sleep(1 * time.Second)
}
if err != nil {
return "", err
}
// get parent id
mapTags := make(map[string]string)
for _, tag := range tags {
mapTags[tag.Name] = tag.Value
}
if parentId, ok := mapTags["parent_id"]; ok {
return parentId, nil
}
return "", errors.New("get rollup tx tags nil")
}