github.com/leovct/zkevm-bridge-service@v0.4.4/bridgectrl/bridgectrl.go (about)

     1  package bridgectrl
     2  
     3  import (
     4  	"context"
     5  	"math"
     6  
     7  	"github.com/0xPolygonHermez/zkevm-bridge-service/etherman"
     8  	"github.com/0xPolygonHermez/zkevm-bridge-service/log"
     9  	"github.com/0xPolygonHermez/zkevm-bridge-service/utils/gerror"
    10  	"github.com/jackc/pgx/v4"
    11  )
    12  
    13  const (
    14  	// KeyLen is the length of key and value in the Merkle Tree
    15  	KeyLen = 32
    16  )
    17  
    18  // BridgeController struct
    19  type BridgeController struct {
    20  	exitTrees   []*MerkleTree
    21  	rollupsTree *MerkleTree
    22  	networkIDs  map[uint]uint8
    23  }
    24  
    25  // NewBridgeController creates new BridgeController.
    26  func NewBridgeController(ctx context.Context, cfg Config, networks []uint, mtStore interface{}) (*BridgeController, error) {
    27  	var (
    28  		networkIDs = make(map[uint]uint8)
    29  		exitTrees  []*MerkleTree
    30  	)
    31  
    32  	for i, network := range networks {
    33  		networkIDs[network] = uint8(i)
    34  		mt, err := NewMerkleTree(ctx, mtStore.(merkleTreeStore), cfg.Height, network)
    35  		if err != nil {
    36  			return nil, err
    37  		}
    38  		exitTrees = append(exitTrees, mt)
    39  	}
    40  	rollupsTree, err := NewMerkleTree(ctx, mtStore.(merkleTreeStore), cfg.Height, math.MaxInt32)
    41  	if err != nil {
    42  		log.Error("error creating rollupsTree. Error: ", err)
    43  		return nil, err
    44  	}
    45  
    46  	return &BridgeController{
    47  		exitTrees:   exitTrees,
    48  		rollupsTree: rollupsTree,
    49  		networkIDs:  networkIDs,
    50  	}, nil
    51  }
    52  
    53  func (bt *BridgeController) GetNetworkID(networkID uint) (uint8, error) {
    54  	tID, found := bt.networkIDs[networkID]
    55  	if !found {
    56  		return 0, gerror.ErrNetworkNotRegister
    57  	}
    58  	return tID, nil
    59  }
    60  
    61  // AddDeposit adds deposit information to the bridge tree.
    62  func (bt *BridgeController) AddDeposit(ctx context.Context, deposit *etherman.Deposit, depositID uint64, dbTx pgx.Tx) error {
    63  	leaf := hashDeposit(deposit)
    64  	tID, err := bt.GetNetworkID(deposit.NetworkID)
    65  	if err != nil {
    66  		return err
    67  	}
    68  	return bt.exitTrees[tID].addLeaf(ctx, depositID, leaf, deposit.DepositCount, dbTx)
    69  }
    70  
    71  // ReorgMT reorg the specific merkle tree.
    72  func (bt *BridgeController) ReorgMT(ctx context.Context, depositCount uint, networkID uint, dbTx pgx.Tx) error {
    73  	tID, err := bt.GetNetworkID(networkID)
    74  	if err != nil {
    75  		return err
    76  	}
    77  	return bt.exitTrees[tID].resetLeaf(ctx, depositCount, dbTx)
    78  }
    79  
    80  // GetExitRoot returns the dedicated merkle tree's root.
    81  // only use for the test purpose
    82  func (bt *BridgeController) GetExitRoot(ctx context.Context, networkID int, dbTx pgx.Tx) ([]byte, error) {
    83  	return bt.exitTrees[networkID].getRoot(ctx, dbTx)
    84  }
    85  
    86  func (bt *BridgeController) AddRollupExitLeaf(ctx context.Context, rollupLeaf etherman.RollupExitLeaf, dbTx pgx.Tx) error {
    87  	err := bt.rollupsTree.addRollupExitLeaf(ctx, rollupLeaf, dbTx)
    88  	if err != nil {
    89  		log.Error("error adding rollupleaf. Error: ", err)
    90  		return err
    91  	}
    92  	return nil
    93  }