This repository has been archived by the owner on May 11, 2024. It is now read-only.
/
dial.go
74 lines (64 loc) 路 1.94 KB
/
dial.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
package rpc
import (
"context"
"time"
"github.com/cenkalti/backoff/v4"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/rpc"
)
// DialClientWithBackoff connects a ethereum RPC client at the given URL with
// a backoff strategy. Added a retry limit so it doesn't retry endlessly
func DialClientWithBackoff(
ctx context.Context,
url string,
retryInterval time.Duration,
maxRetrys uint64) (*ethclient.Client, error) {
var client *ethclient.Client
if err := backoff.Retry(
func() (err error) {
ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout)
defer cancel()
client, err = ethclient.DialContext(ctxWithTimeout, url)
if err != nil {
log.Error("Dial ethclient error", "url", url, "error", err)
return err
}
return nil
},
backoff.WithMaxRetries(backoff.NewConstantBackOff(retryInterval), maxRetrys),
); err != nil {
return nil, err
}
return client, nil
}
// DialEngineClientWithBackoff connects an ethereum engine RPC client at the
// given URL with a backoff strategy. Added a retry limit so it doesn't retry endlessly
func DialEngineClientWithBackoff(
ctx context.Context,
url string,
jwtSecret string,
retryInterval time.Duration,
maxRetry uint64,
) (*EngineClient, error) {
var engineClient *EngineClient
if err := backoff.Retry(
func() (err error) {
ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout)
defer cancel()
jwtAuth := node.NewJWTAuth(StringToBytes32(jwtSecret))
client, err := rpc.DialOptions(ctxWithTimeout, url, rpc.WithHTTPAuth(jwtAuth))
if err != nil {
log.Error("Dial engine client error", "url", url, "error", err)
return err
}
engineClient = &EngineClient{client}
return nil
},
backoff.WithMaxRetries(backoff.NewConstantBackOff(retryInterval), maxRetry),
); err != nil {
return nil, err
}
return engineClient, nil
}