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 }