Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f369f47
Bridge nonce issue fix (#715)
Aug 4, 2021
d4d6499
fix: check end block instead of latest which checkpoint (#718)
Aug 4, 2021
2191326
add: check for max gas price in tx builder (#720)
Aug 18, 2021
05f255e
Add min bor block confirmation check (#722)
reddyismav Aug 18, 2021
9c1f70f
Template for new selection algo height (#723)
Aug 23, 2021
93b88e8
Update linuxpackage.yml (#724)
jdkanani Aug 23, 2021
9ceee1a
Update: README (#725)
Aug 23, 2021
c5a1a06
add checkpoint-adjust (#730)
temaniarpit27 Oct 6, 2021
fa8d34d
fix: testcases for checkpoint side handler (#731)
jdkanani Oct 6, 2021
1cb8737
fix: Use default gas price in case of invalid value (#733)
0xKrishna Oct 27, 2021
7d03bfc
fix: msg broadcast delay && checkpointSyncACk msg broadcast
halibobo1205 Jan 10, 2022
23b64f5
fix: change CalculateTaskDelay URL
halibobo1205 Jan 10, 2022
1068413
Merge pull request #6 from halibobo1205/fix/msg_broadcast_delay
zhang0125 Jan 11, 2022
8d26c02
delay offset and del no use config
Jan 11, 2022
8bea633
Merge pull request #7 from blade-han/hotfix-conf
zhang0125 Jan 11, 2022
05287a3
Merge branch 'feat-matic' into feat-validate
bladehan1 Mar 4, 2022
1c73479
chg: small improvement !minor
bladehan1 Mar 4, 2022
858d9d5
chg: validator nonce strict verification
bladehan1 Mar 7, 2022
dba778a
chg:change default value of CheckpointerPollInterval and TronFeeLimit
Mar 9, 2022
7d122ea
Merge pull request #9 from bladehan1/feat-validate
zhang0125 Mar 9, 2022
c1f13a5
Merge branch 'develop' into feat/update_config_params
eodiandie Mar 9, 2022
38f4108
Merge pull request #11 from xq-lu/feat/update_config_params
zhang0125 Mar 9, 2022
9d19622
Merge pull request #12 from bttcprotocol/develop
lvs007 Mar 9, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 0 additions & 110 deletions .github/workflows/linuxpackage.yml

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Make sure your have go1.11+ already installed
### Install
```bash
$ make install
```
```

### Run-delivery
```bash
Expand Down
11 changes: 11 additions & 0 deletions bridge/setu/broadcaster/broadcaster.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"fmt"
"sync"
"time"

"github.com/cosmos/cosmos-sdk/client"
cliContext "github.com/cosmos/cosmos-sdk/client/context"
Expand Down Expand Up @@ -56,6 +57,16 @@ func NewTxBroadcaster(cdc *codec.Codec) *TxBroadcaster {
return &txBroadcaster
}

func (tb *TxBroadcaster) BroadcastToHeimdallWithDelay(msg sdk.Msg, delay time.Duration) error {
eta := time.Now().Add(delay)
timeAfterTrigger := time.After(delay)
tb.logger.Info("Tx sent on heimdall ", "msg", msg.Type(), "currentTime", time.Now(), "delayTime", eta)
select {
case <-timeAfterTrigger:
return tb.BroadcastToHeimdall(msg)
}
}

// BroadcastToHeimdall broadcast to heimdall
func (tb *TxBroadcaster) BroadcastToHeimdall(msg sdk.Msg) error {
tb.heimdallMutex.Lock()
Expand Down
10 changes: 5 additions & 5 deletions bridge/setu/listener/tron.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ func (tl *TronListener) queryAndBroadcastEvents(chainManagerParams *chainmanager
// topup has to be processed first before validator join. so adding delay.
delay := util.TaskDelayBetweenEachVal
tl.sendTaskWithDelay("sendValidatorJoinToHeimdall", selectedEvent.Name, logBytes, delay)
} else if isCurrentValidator, delay := util.CalculateTaskDelay(tl.cliCtx); isCurrentValidator {
} else if isCurrentValidator, delay := util.CalculateTaskDelayWithOffset(tl.cliCtx,1); isCurrentValidator {
// topup has to be processed first before validator join. so adding delay.
delay = delay + util.TaskDelayBetweenEachVal
tl.sendTaskWithDelay("sendValidatorJoinToHeimdall", selectedEvent.Name, logBytes, delay)
Expand All @@ -237,7 +237,7 @@ func (tl *TronListener) queryAndBroadcastEvents(chainManagerParams *chainmanager
}
if bytes.Equal(event.SignerPubkey, pubkeyBytes) {
tl.sendTaskWithDelay("sendSignerChangeToHeimdall", selectedEvent.Name, logBytes, 0)
} else if isCurrentValidator, delay := util.CalculateTaskDelay(tl.cliCtx); isCurrentValidator {
} else if isCurrentValidator, delay := util.CalculateTaskDelayWithOffset(tl.cliCtx,1); isCurrentValidator {
tl.sendTaskWithDelay("sendSignerChangeToHeimdall", selectedEvent.Name, logBytes, delay)
}

Expand All @@ -248,7 +248,7 @@ func (tl *TronListener) queryAndBroadcastEvents(chainManagerParams *chainmanager
}
if util.IsEventSender(tl.cliCtx, event.ValidatorId.Uint64()) {
tl.sendTaskWithDelay("sendUnstakeInitToHeimdall", selectedEvent.Name, logBytes, 0)
} else if isCurrentValidator, delay := util.CalculateTaskDelay(tl.cliCtx); isCurrentValidator {
} else if isCurrentValidator, delay := util.CalculateTaskDelayWithOffset(tl.cliCtx,1); isCurrentValidator {
tl.sendTaskWithDelay("sendUnstakeInitToHeimdall", selectedEvent.Name, logBytes, delay)
}

Expand All @@ -264,7 +264,7 @@ func (tl *TronListener) queryAndBroadcastEvents(chainManagerParams *chainmanager
}
if bytes.Equal(event.User.Bytes(), helper.GetAddress()) {
tl.sendTaskWithDelay("sendTopUpFeeToHeimdall", selectedEvent.Name, logBytes, 0)
} else if isCurrentValidator, delay := util.CalculateTaskDelay(tl.cliCtx); isCurrentValidator {
} else if isCurrentValidator, delay := util.CalculateTaskDelayWithOffset(tl.cliCtx,1); isCurrentValidator {
tl.sendTaskWithDelay("sendTopUpFeeToHeimdall", selectedEvent.Name, logBytes, delay)
}

Expand All @@ -280,7 +280,7 @@ func (tl *TronListener) queryAndBroadcastEvents(chainManagerParams *chainmanager
}
if util.IsEventSender(tl.cliCtx, event.ValidatorId.Uint64()) {
tl.sendTaskWithDelay("sendUnjailToHeimdall", selectedEvent.Name, logBytes, 0)
} else if isCurrentValidator, delay := util.CalculateTaskDelay(tl.cliCtx); isCurrentValidator {
} else if isCurrentValidator, delay := util.CalculateTaskDelayWithOffset(tl.cliCtx,1); isCurrentValidator {
tl.sendTaskWithDelay("sendUnjailToHeimdall", selectedEvent.Name, logBytes, delay)
}

Expand Down
32 changes: 19 additions & 13 deletions bridge/setu/processor/checkpointsync.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,15 @@ func (cp *CheckpointProcessor) handleCheckpointSync() {
msg := checkpointTypes.NewMsgCheckpointSync(hmTypes.BytesToHeimdallAddress(helper.GetAddress()),
proposer, nextCheckpointNumber, start, end, rootChain)
// return broadcast to heimdall
if err := cp.txBroadcaster.BroadcastToHeimdall(msg); err != nil {
cp.Logger.Error("Error while broadcasting checkpoint-sync to heimdall",
"root", rootChain, "number", nextCheckpointNumber, "start", start, "end", end, "error", err)
continue
if isCurrentValidator, delay := util.CalculateTaskDelay(cp.cliCtx); isCurrentValidator {
if err := cp.txBroadcaster.BroadcastToHeimdallWithDelay(msg, delay); err != nil {
cp.Logger.Error("Error while broadcasting checkpoint-sync to heimdall",
"root", rootChain, "number", nextCheckpointNumber, "start", start, "end", end, "error", err)
continue
}
cp.Logger.Info("checkpoint sync transaction sent successfully",
"root", rootChain, "number", nextCheckpointNumber, "start", start, "end", end)
}
cp.Logger.Info("checkpoint sync transaction sent successfully",
"root", rootChain, "number", nextCheckpointNumber, "start", start, "end", end)
}
}
}
Expand Down Expand Up @@ -183,13 +185,17 @@ func (cp *CheckpointProcessor) sendCheckpointSyncAckToHeimdall(eventName string,
)
// fetch checkpoint sync buffer
bufferedCheckpoint, err := util.GetBufferedCheckpointSync(cp.cliCtx, checkpointChain)
if err == nil {
bufferedTime := time.Unix(int64(bufferedCheckpoint.TimeStamp), 0)
currentTime := time.Now().UTC()
if currentTime.Sub(bufferedTime).Seconds() > checkpointParams.CheckpointBufferTime.Seconds()/5 {
cp.Logger.Debug("checkpoint sync buffer has expired, ignore this ack")
return nil
}

if err != nil {
cp.Logger.Debug("checkpoint sync buffer has been cleared, this ack already submitted.")
return nil
}

bufferedTime := time.Unix(int64(bufferedCheckpoint.TimeStamp), 0)
currentTime := time.Now().UTC()
if currentTime.Sub(bufferedTime).Seconds() > checkpointParams.CheckpointBufferTime.Seconds()/5 {
cp.Logger.Debug("checkpoint sync buffer has expired, ignore this ack")
return nil
}

// create msg checkpoint ack message
Expand Down
86 changes: 86 additions & 0 deletions bridge/setu/processor/staking.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package processor
import (
"context"
"encoding/json"
"fmt"
"time"

checkpointTypes "github.com/maticnetwork/heimdall/checkpoint/types"
Expand All @@ -22,6 +23,10 @@ import (
hmTypes "github.com/maticnetwork/heimdall/types"
)

const (
defaultDelayDuration = 10 * time.Second
)

// StakingProcessor - process staking related events
type StakingProcessor struct {
BaseProcessor
Expand Down Expand Up @@ -200,6 +205,17 @@ func (sp *StakingProcessor) sendUnstakeInitToHeimdall(eventName string, logBytes
return nil
}

validNonce, nonceDelay, err := sp.checkValidNonce(event.ValidatorId.Uint64(), event.Nonce.Uint64())
if err != nil {
sp.Logger.Error("Error while validating nonce for the validator", "error", err)
return err
}

if !validNonce {
sp.Logger.Info("Ignoring task to send unstake-init to heimdall as nonce is out of order")
return tasks.NewErrRetryTaskLater("Nonce out of order", defaultDelayDuration*time.Duration(nonceDelay))
}

sp.Logger.Info(
"✅ Received task to send unstake-init to heimdall",
"event", eventName,
Expand Down Expand Up @@ -327,6 +343,18 @@ func (sp *StakingProcessor) sendSignerChangeToHeimdall(eventName string, logByte
)
return nil
}

validNonce, nonceDelay, err := sp.checkValidNonce(event.ValidatorId.Uint64(), event.Nonce.Uint64())
if err != nil {
sp.Logger.Error("Error while validating nonce for the validator", "error", err)
return err
}

if !validNonce {
sp.Logger.Info("Ignoring task to send signer-change to heimdall as nonce is out of order")
return tasks.NewErrRetryTaskLater("Nonce out of order", defaultDelayDuration*time.Duration(nonceDelay))
}

sp.Logger.Info(
"✅ Received task to send signer-change to heimdall",
"event", eventName,
Expand Down Expand Up @@ -681,3 +709,61 @@ func (sp *StakingProcessor) getStakingContext(rootChain string) (*StakingContext
ChainmanagerParams: chainmanagerParams,
}, nil
}

func (sp *StakingProcessor) checkValidNonce(validatorId uint64, txnNonce uint64) (bool, uint64, error) {
currentNonce, currentHeight, err := util.GetValidatorNonce(sp.cliCtx, validatorId)
if err != nil {
sp.Logger.Error("Failed to fetch validator nonce and height data from API", "validatorId", validatorId)
return false, 0, err
}

if currentNonce+1 != txnNonce {
sp.Logger.Error("Nonce for the given event not in order", "validatorId", validatorId, "currentNonce", currentNonce, "txnNonce", txnNonce)
return false, txnNonce - currentNonce, nil
}

stakingTxnCount, err := queryTxCount(sp.cliCtx, validatorId, currentHeight)
if err != nil {
sp.Logger.Error("Failed to query stake txns by txquery for the given validator", "validatorId", validatorId)
return false, 0, err
}

if stakingTxnCount != 0 {
sp.Logger.Info("Recent staking txn count for the given validator is not zero", "validatorId", validatorId, "currentNonce", currentNonce, "txnNonce", txnNonce, "currentHeight", currentHeight)
return false, 1, nil
}

return true, 0, nil
}

func queryTxCount(cliCtx cliContext.CLIContext, validatorId uint64, currentHeight int64) (int, error) {
const (
defaultPage = 1
defaultLimit = 30 // should be consistent with tendermint/tendermint/rpc/core/pipe.go:19
)

stakingTxnMsgMap := map[string]string{
"validator-stake-update": "stake-update",
"validator-join": "validator-join",
"signer-update": "signer-update",
"validator-exit": "validator-exit",
}

for msg, action := range stakingTxnMsgMap {
events := []string{
fmt.Sprintf("%s.%s='%s'", sdk.EventTypeMessage, sdk.AttributeKeyAction, msg),
fmt.Sprintf("%s.%s=%d", action, "validator-id", validatorId),
fmt.Sprintf("%s.%s>%d", "tx", "height", currentHeight-3),
}

searchResult, err := helper.QueryTxsByEvents(cliCtx, events, defaultPage, defaultLimit)
if err != nil {
return 0, err
}

if searchResult.TotalCount != 0 {
return searchResult.TotalCount, nil
}
}
return 0, nil
}
Loading