Skip to content

Commit b7deb36

Browse files
committed
Merge branch 'protocolResponseHandling' into 'main'
Protocol response handling See merge request flarenetwork/flare-system-client!54
2 parents 90498b9 + 8a2ba2f commit b7deb36

File tree

13 files changed

+188
-138
lines changed

13 files changed

+188
-138
lines changed

client/epoch/epoch_client.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,15 +238,15 @@ func (c *client) signRewards(epochId *big.Int) {
238238
return nil, nil
239239
}
240240

241-
logger.Info("Signing rewards for epoch %v, attempt %d", epochId, i)
241+
logger.Infof("Signing rewards for epoch %v, attempt %d", epochId, i)
242242

243243
data, err := fetchRewardData(epochId, c.rewardsConfig)
244-
if data == nil {
245-
return nil, errors.New("no reward data found")
246-
}
247244
if err != nil {
248245
return nil, errors.Wrapf(err, "unable to fetch reward data for epoch %d", epochId)
249246
}
247+
if data == nil {
248+
return nil, errors.New("no reward data found")
249+
}
250250
hash, weightClaims, err := verifyRewardData(epochId, c.identityAddress, data, c.rewardsConfig)
251251
if err != nil {
252252
return nil, errors.Wrapf(err, "reward data verification for epoch %d failed", epochId)
@@ -262,9 +262,9 @@ func (c *client) signRewards(epochId *big.Int) {
262262
go func() {
263263
status := <-res
264264
if status.Success {
265-
logger.Info("Signing rewards for epoch %v completed", epochId)
265+
logger.Infof("Signing rewards for epoch %v completed", epochId)
266266
} else {
267-
logger.Info("Signing rewards for epoch %v failed: %s", epochId, status.Message)
267+
logger.Infof("Signing rewards for epoch %v failed: %s", epochId, status.Message)
268268
}
269269
}()
270270
}

client/epoch/rewards_utils.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package epoch
33
import (
44
"bytes"
55
"encoding/json"
6-
"fmt"
76
"io"
87
"log"
98
"math/big"
109
"net/http"
10+
"net/url"
1111
"time"
1212

1313
"github.com/flare-foundation/flare-system-client/client/config"
@@ -23,6 +23,9 @@ import (
2323
"github.com/flare-foundation/go-flare-common/pkg/merkle"
2424
)
2525

26+
const timeout = 5 * time.Second // maximal duration for fetching of the reward data
27+
const maxRespSize = 100 * (1 << 20) // 100 MB for maximal response size of the reward
28+
2629
var (
2730
uint8Type, _ = abi.NewType("uint8", "", nil)
2831
uint64Type, _ = abi.NewType("uint64", "", nil)
@@ -121,11 +124,16 @@ func fetchRewardData(epochId *big.Int, config *config.RewardsConfig) (*rewardDis
121124
return nil, errors.New("reward data url prefix not set")
122125
}
123126

124-
url := fmt.Sprintf("%s/%d/reward-distribution-data.json", config.UrlPrefix, epochId)
127+
rewardsUrl, err := url.JoinPath(config.UrlPrefix, epochId.Text(10), "reward-distribution-data.json")
128+
if err != nil {
129+
return nil, errors.Errorf("cannot join url: %s", err)
130+
}
131+
132+
logger.Infof("Fetching reward data at: %s", rewardsUrl)
133+
result := <-shared.ExecuteWithRetryChan(func() (*rewardDistributionData, error) {
134+
client := &http.Client{Timeout: timeout}
125135

126-
logger.Info("Fetching reward data at: %s", url)
127-
result := <-shared.ExecuteWithRetryChan(func() ([]byte, error) {
128-
resp, err := http.Get(url)
136+
resp, err := client.Get(rewardsUrl)
129137
if err != nil {
130138
return nil, err
131139
}
@@ -138,23 +146,23 @@ func fetchRewardData(epochId *big.Int, config *config.RewardsConfig) (*rewardDis
138146
return nil, errors.Errorf("unexpected status code: %s", resp.Status)
139147
}
140148

141-
bytes, err := io.ReadAll(resp.Body)
149+
respLimited := &io.LimitedReader{R: resp.Body, N: maxRespSize}
150+
151+
decoder := json.NewDecoder(respLimited)
152+
153+
var rewardData rewardDistributionData
154+
err = decoder.Decode(&rewardData)
142155
if err != nil {
143156
return nil, err
144157
}
145-
return bytes, nil
158+
return &rewardData, nil
146159
}, 3, 1*time.Second)
147160

148161
if !result.Success {
149162
return nil, errors.Errorf("unable to fetch reward data")
150163
}
151164

152-
var rewardData rewardDistributionData
153-
err := json.Unmarshal(result.Value, &rewardData)
154-
if err != nil {
155-
return nil, errors.Wrap(err, "unable to parse reward data")
156-
}
157-
return &rewardData, nil
165+
return result.Value, nil
158166
}
159167

160168
func verifyRewardData(epochId *big.Int, identity common.Address, data *rewardDistributionData, rewardsConfig *config.RewardsConfig) (*common.Hash, int, error) {

client/epoch/system_manager_utils.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (s *systemsManagerContractClientImpl) sendSignNewSigningPolicy(rewardEpochI
127127
)
128128
if err != nil {
129129
if shared.ExistsAsSubstring(nonFatalSignNewSigningPolicyErrors, err.Error()) {
130-
logger.Infof("Non fatal error dry run sign new signing policy: %v", err)
130+
logger.Debugf("Non fatal error dry run sign new signing policy: %v", err)
131131
return nil
132132
}
133133
logger.Warnf("Dry run fail: %v", err)
@@ -138,7 +138,7 @@ func (s *systemsManagerContractClientImpl) sendSignNewSigningPolicy(rewardEpochI
138138
tx, err := s.flareSystemsManager.SignNewSigningPolicy(s.senderTxOpts, rewardEpochId, [32]byte(newSigningPolicyHash), signature)
139139
if err != nil {
140140
if shared.ExistsAsSubstring(nonFatalSignNewSigningPolicyErrors, err.Error()) {
141-
logger.Infof("Non fatal error sending sign new signing policy: %v", err)
141+
logger.Debugf("Non fatal error sending sign new signing policy: %v", err)
142142
return nil
143143
}
144144
return err
@@ -293,7 +293,7 @@ func (s *systemsManagerContractClientImpl) sendSignUptimeVote(rewardEpochId *big
293293
)
294294
if err != nil {
295295
if shared.ExistsAsSubstring(nonFatalSignUptimeVoteErrors, err.Error()) {
296-
logger.Infof("Non fatal error dryRun sign uptime vote: %v", err)
296+
logger.Debugf("Non fatal error dryRun sign uptime vote: %v", err)
297297
return nil
298298
}
299299
logger.Warnf("Dry run fail: %v", err)
@@ -304,7 +304,7 @@ func (s *systemsManagerContractClientImpl) sendSignUptimeVote(rewardEpochId *big
304304
tx, err := s.flareSystemsManager.SignUptimeVote(s.senderTxOpts, rewardEpochId, hash, *signature)
305305
if err != nil {
306306
if shared.ExistsAsSubstring(nonFatalSignUptimeVoteErrors, err.Error()) {
307-
logger.Infof("Non fatal error sending sign uptime vote: %v", err)
307+
logger.Debugf("Non fatal error sending sign uptime vote: %v", err)
308308
return nil
309309
}
310310
return err
@@ -418,7 +418,7 @@ func (s *systemsManagerContractClientImpl) sendSignRewards(epochId *big.Int, rew
418418
)
419419
if err != nil {
420420
if shared.ExistsAsSubstring(nonFatalSignRewardsErrors, err.Error()) {
421-
logger.Infof("Non fatal error dry run reward signature: %v", err)
421+
logger.Debugf("Non fatal error dry run reward signature: %v", err)
422422
return nil
423423
}
424424
logger.Warnf("Dry run fail: %v", err)
@@ -429,7 +429,7 @@ func (s *systemsManagerContractClientImpl) sendSignRewards(epochId *big.Int, rew
429429
tx, err := s.flareSystemsManager.SignRewards(s.senderTxOpts, epochId, numberOfWeightBasedClaims, *rewardHash, signature)
430430
if err != nil {
431431
if shared.ExistsAsSubstring(nonFatalSignRewardsErrors, err.Error()) {
432-
logger.Infof("Non fatal error sending reward signature: %v", err)
432+
logger.Debugf("Non fatal error sending reward signature: %v", err)
433433
return nil
434434
}
435435
return err

client/finalizer/finalization_storage.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func (fs *finalizationStorage) RemoveRoundsBefore(votingRoundID uint32) {
259259
defer fs.Unlock()
260260

261261
for i := fs.lowestRoundStored; i < votingRoundID; i++ {
262-
logger.Infof("Deleting round %d in finalization storage", i)
262+
logger.Debugf("Deleting round %d in finalization storage", i)
263263
delete(fs.stg, i)
264264
}
265265

client/finalizer/finalizer_queue.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,11 @@ func (p *finalizerQueueProcessor) Run(ctx context.Context) error {
131131
}
132132

133133
if p.isVoterForCurrentEpoch(item) {
134-
logger.Infof("Finalizer with address %v was selected for item %v", p.relayClient.senderAddress, item)
134+
logger.Infof("Finalizer with address %v was selected for voting round %v for protocol %v", p.relayClient.senderAddress, item.votingRoundID, item.protocolID)
135135

136136
p.processItem(ctx, item, false)
137137
} else {
138-
logger.Infof("Finalizer with address %v will send outside grace period for item %v", p.relayClient.senderAddress, item)
138+
logger.Infof("Finalizer with address %v will send outside grace period for voting round %v for protocol %v", p.relayClient.senderAddress, item.votingRoundID, item.protocolID)
139139

140140
_, exists := p.finalizationStorage.Get(item.votingRoundID, item.protocolID, item.msgHash)
141141
if exists {
@@ -144,11 +144,9 @@ func (p *finalizerQueueProcessor) Run(ctx context.Context) error {
144144
st := votingRoundStartTime.Add(p.finalizerContext.gracePeriodEndOffset)
145145

146146
if st.Before(time.Now()) {
147-
logger.Infof("Finalizer will send item %v now", item)
147+
logger.Debugf("Finalizer will send now for voting round %v for protocol %v", item.votingRoundID, item.protocolID)
148148
p.processItem(ctx, item, true)
149149
}
150-
151-
logger.Infof("Finalizer will send item %v at %v", item, st)
152150
p.delayedQueues.Add(st, item)
153151
} else {
154152
logger.Errorf("Finalizer missing finalization data for protocol %v in votingRound %v", item.protocolID, item.votingRoundID)
@@ -200,7 +198,7 @@ func (p *finalizerQueueProcessor) processItem(ctx context.Context, item *queueIt
200198
}
201199

202200
logger.Infof("Relaying for round %d for protocol %d", item.votingRoundID, item.protocolID)
203-
p.relayClient.SubmitPayloads(ctx, txInput, isDelayed)
201+
p.relayClient.SubmitPayloads(ctx, txInput, isDelayed, item.protocolID)
204202
}
205203

206204
func (p *finalizerQueueProcessor) processDelayedQueue(items []*queueItem) error {
@@ -217,7 +215,7 @@ func (p *finalizerQueueProcessor) processDelayedQueue(items []*queueItem) error
217215
if relayedItems[*item] {
218216
continue
219217
}
220-
logger.Infof("Finalizer processes delayed queue item %v", item)
218+
logger.Infof("Finalizer processes delayed queue item for round %v for protocol %v", item.votingRoundID, item.protocolID)
221219
p.processItem(context.TODO(), item, true)
222220
}
223221
return nil

client/finalizer/relay_client.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,27 +143,31 @@ func (r *relayContractClient) SigningPolicyInitializedListener(db finalizerDB, s
143143
}
144144

145145
// SubmitPayloads sends a transaction with input to Relay contract.
146-
func (r *relayContractClient) SubmitPayloads(ctx context.Context, input []byte, dryRun bool) {
146+
func (r *relayContractClient) SubmitPayloads(ctx context.Context, input []byte, dryRun bool, protocolID uint8) {
147147
if len(input) == 0 {
148148
return
149149
}
150150

151-
execStatusChan := shared.ExecuteWithRetryChan(func() (any, error) {
151+
execStatusChan := shared.ExecuteWithRetryChan(func() (string, error) {
152152
err := r.chainClient.SendRawTx(r.privateKey, r.address, input, r.gasConfig, chain.DefaultTxTimeout)
153153
if err != nil {
154154
if shared.ExistsAsSubstring(nonFatalRelayErrors, err.Error()) {
155-
logger.Infof("Non fatal error sending relay tx: %v", err)
155+
logger.Debugf("Non fatal error sending relay tx for protocol %d: %v", protocolID, err)
156+
return "non fatal error", nil
157+
156158
} else {
157-
return nil, errors.Wrap(err, "Error sending relay tx")
159+
return "", errors.Wrap(err, "Error sending relay tx")
158160
}
159161
}
160-
return nil, nil
162+
return "success", nil
161163
}, shared.MaxTxSendRetries, shared.TxRetryInterval)
162164

163165
select {
164166
case execStatus := <-execStatusChan:
165167
if execStatus.Success {
166-
logger.Info("Relaying finished")
168+
logger.Infof("Relaying finished for protocol %d with %s", protocolID, execStatus.Value)
169+
} else {
170+
logger.Warnf("Relaying failed with: %v", execStatus.Message)
167171
}
168172

169173
case <-ctx.Done():

client/protocol/protocol_client_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"golang.org/x/sync/errgroup"
2525

2626
"github.com/flare-foundation/go-flare-common/pkg/logger"
27+
"github.com/flare-foundation/go-flare-common/pkg/payload"
2728
)
2829

2930
const (
@@ -275,8 +276,8 @@ func (ep *testAPIEndpoint) ServeHTTP(w http.ResponseWriter, r *http.Request) {
275276
return
276277
}
277278

278-
rsp := dataProviderResponse{
279-
Status: "OK",
279+
rsp := payload.SubprotocolResponse{
280+
Status: payload.Ok,
280281
Data: "0x" + strings.Repeat("ff", 38),
281282
AdditionalData: "0x1234",
282283
}

0 commit comments

Comments
 (0)