Skip to content

Commit a4bb3f2

Browse files
committed
feat: add fallback
1 parent 8ac05cf commit a4bb3f2

File tree

2 files changed

+60
-26
lines changed

2 files changed

+60
-26
lines changed

actors/actors.go

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ type BuiltinActors struct {
3333
Metadata BuiltinActorsMetadata
3434
}
3535

36-
func NewBuiltinActors(networkName string, loadAllActorVersions bool, lotusApi api.FullNode) (*BuiltinActors, error) {
36+
func NewBuiltinActors(networkName string, lotusApi api.FullNode) (*BuiltinActors, error) {
3737
networkVersion, err := lotusApi.StateNetworkVersion(context.Background(), types.EmptyTSK)
3838
if err != nil {
3939
zap.S().Errorf("could not get lotus network version!: %s", err.Error())
4040
return nil, err
4141
}
4242

43-
actorCids, err := loadActorCids(networkVersion, loadAllActorVersions, lotusApi)
43+
actorCids, err := loadActorCids(lotusApi)
4444
if err != nil {
4545
zap.S().Errorf("could not get actors cids!: %s", err.Error())
4646
return nil, err
@@ -57,8 +57,8 @@ func NewBuiltinActors(networkName string, loadAllActorVersions bool, lotusApi ap
5757

5858
func (a *BuiltinActors) IsActor(actorCode cid.Cid, actorName string) bool {
5959
// Try the latest actors' version first
60-
for _, actors := range a.Metadata.ActorsNameCidMapByVersion {
61-
if cid, ok := actors[actorName]; ok {
60+
for _, actorCids := range a.Metadata.ActorsNameCidMapByVersion {
61+
if cid, ok := actorCids[actorName]; ok {
6262
if actorCode == cid {
6363
return true
6464
}
@@ -87,15 +87,17 @@ func (a *BuiltinActors) GetActorNameFromCid(actorCode cid.Cid) (string, error) {
8787
return name, nil
8888
}
8989

90-
return UnknownStr, fmt.Errorf("invalid actor code CID: %s", actorCode)
90+
// Fallback: Check all actors
91+
return a.getActorNameFromCidByVersionFallback(actorCode)
9192
}
9293

9394
func (a *BuiltinActors) GetActorCid(name string) (cid.Cid, error) {
9495
if cid, ok := a.Metadata.ActorsNameCidMapByVersion[a.Metadata.Version][name]; ok {
9596
return cid, nil
9697
}
9798

98-
return cid.Cid{}, fmt.Errorf("actor '%s' not found in metadata", name)
99+
// Fallback: Check all actors
100+
return a.getActorCidByVersionFallback(name)
99101
}
100102

101103
func (a *BuiltinActors) GetActorNameFromCidByVersion(actorCode cid.Cid, version network.Version) (string, error) {
@@ -112,37 +114,55 @@ func (a *BuiltinActors) GetActorNameFromCidByVersion(actorCode cid.Cid, version
112114
return name, nil
113115
}
114116

115-
return UnknownStr, fmt.Errorf("invalid actor code CID: %s", actorCode)
117+
// Fallback: Check all actors
118+
return a.getActorNameFromCidByVersionFallback(actorCode)
116119
}
117120

118121
func (a *BuiltinActors) GetActorCidByVersion(name string, version network.Version) (cid.Cid, error) {
119122
if cid, ok := a.Metadata.ActorsNameCidMapByVersion[version][name]; ok {
120123
return cid, nil
121124
}
125+
// Fallback: Check all actors
126+
return a.getActorCidByVersionFallback(name)
127+
}
122128

129+
func (a *BuiltinActors) getActorCidByVersionFallback(name string) (cid.Cid, error) {
130+
for _, actorCids := range a.Metadata.ActorsNameCidMapByVersion {
131+
for foundName, cid := range actorCids {
132+
if foundName == name {
133+
return cid, nil
134+
}
135+
}
136+
}
123137
return cid.Cid{}, fmt.Errorf("actor '%s' not found in metadata", name)
124138
}
125139

126-
func loadActorCids(currentNetworkVersion network.Version, loadAllActorVersions bool, lotusApi api.FullNode) (map[network.Version]ActorCidMap, error) {
140+
func (a *BuiltinActors) getActorNameFromCidByVersionFallback(actorCode cid.Cid) (string, error) {
141+
for _, actorCids := range a.Metadata.ActorsNameCidMapByVersion {
142+
for name, cid := range actorCids {
143+
if actorCode == cid {
144+
return name, nil
145+
}
146+
}
147+
}
148+
return UnknownStr, fmt.Errorf("invalid actor code CID: %s", actorCode)
149+
}
150+
151+
func loadActorCids(lotusApi api.FullNode) (map[network.Version]ActorCidMap, error) {
152+
zap.S().Info("loading all actor versions")
127153
var (
128154
numWorkers = 5
129-
networkVersions []network.Version
155+
networkVersions = make([]network.Version, LatestVersion+1)
130156
actorCidsMap = make(map[network.Version]ActorCidMap)
131157
)
132158

133-
if loadAllActorVersions {
134-
zap.S().Info("loading all actor versions")
135-
networkVersions = make([]network.Version, LatestVersion+1)
136-
for i := network.Version0; i <= LatestVersion; i++ {
137-
networkVersions[i] = i
138-
}
139-
} else {
140-
zap.S().Info("loading current actor version")
141-
networkVersions = []network.Version{currentNetworkVersion}
159+
for i := network.Version0; i <= LatestVersion; i++ {
160+
networkVersions[i] = i
142161
}
143162

144163
versionChannel := make(chan network.Version, len(networkVersions))
145164
actorCidsChannel := make(chan map[network.Version]ActorCidMap)
165+
errChannel := make(chan error)
146166

147167
for i := 0; i < numWorkers; i++ {
148168
go func(i int) {
@@ -151,7 +171,8 @@ func loadActorCids(currentNetworkVersion network.Version, loadAllActorVersions b
151171
actorCids, err := lotusApi.StateActorCodeCIDs(context.Background(), version)
152172
if err != nil {
153173
zap.S().Errorf("worker %d: error loading actor cids for version %d: %s", i, version, err.Error())
154-
actorCids = ActorCidMap{}
174+
errChannel <- err
175+
return
155176
}
156177
actorCidsChannel <- map[network.Version]ActorCidMap{version: actorCids}
157178
}
@@ -163,17 +184,31 @@ func loadActorCids(currentNetworkVersion network.Version, loadAllActorVersions b
163184
}
164185

165186
var received int
166-
for actorCids := range actorCidsChannel {
167-
for version, actors := range actorCids {
168-
actorCidsMap[version] = actors
187+
var err error
188+
for {
189+
select {
190+
case actorCids := <-actorCidsChannel:
191+
for version, actors := range actorCids {
192+
actorCidsMap[version] = actors
193+
}
194+
received++
195+
196+
case mErr := <-errChannel:
197+
err = mErr
169198
}
170-
received++
171-
if received == len(networkVersions) {
199+
200+
if received == len(networkVersions) || err != nil {
172201
break
173202
}
174203
}
204+
175205
close(versionChannel)
206+
close(errChannel)
176207
close(actorCidsChannel)
177208

209+
if err != nil {
210+
return nil, err
211+
}
212+
178213
return actorCidsMap, nil
179214
}

construction_impl.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ type RosettaConstructionFilecoin struct {
5252
type LotusRpcV1 api.FullNode
5353

5454
const EthAddressLength = 20
55-
const LoadAllActorVersions = true
5655

5756
// NewFilecoinRPCClient creates a new lotus rpc client
5857
func NewFilecoinRPCClient(url string, token string) (LotusRpcV1, error) {
@@ -85,7 +84,7 @@ func NewRosettaConstructionFilecoin(lotusApi api.FullNode) *RosettaConstructionF
8584
return nil
8685
}
8786

88-
builtinActors, err := actors.NewBuiltinActors(string(networkName), LoadAllActorVersions, lotusApi)
87+
builtinActors, err := actors.NewBuiltinActors(string(networkName), lotusApi)
8988
if err != nil {
9089
zap.S().Errorf("could not create builtin actors!: %s", err.Error())
9190
return nil

0 commit comments

Comments
 (0)