github.com/MetalBlockchain/metalgo@v1.11.9/chains/atomic/prefixes.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package atomic
     5  
     6  import (
     7  	"bytes"
     8  
     9  	"github.com/MetalBlockchain/metalgo/database"
    10  	"github.com/MetalBlockchain/metalgo/database/prefixdb"
    11  	"github.com/MetalBlockchain/metalgo/ids"
    12  )
    13  
    14  var (
    15  	inboundSmallerValuePrefix = []byte{0}
    16  	inboundSmallerIndexPrefix = []byte{1}
    17  	inboundLargerValuePrefix  = []byte{2}
    18  	inboundLargerIndexPrefix  = []byte{3}
    19  
    20  	// note that inbound and outbound have their smaller and larger values
    21  	// swapped
    22  
    23  	// inbound specifies the prefixes to use for inbound shared memory
    24  	// ie. reading and deleting a message received from another chain.
    25  	inbound = prefixes{
    26  		smallerValuePrefix: inboundSmallerValuePrefix,
    27  		smallerIndexPrefix: inboundSmallerIndexPrefix,
    28  		largerValuePrefix:  inboundLargerValuePrefix,
    29  		largerIndexPrefix:  inboundLargerIndexPrefix,
    30  	}
    31  	// outbound specifies the prefixes to use for outbound shared memory
    32  	// ie. writing a message to another chain.
    33  	outbound = prefixes{
    34  		smallerValuePrefix: inboundLargerValuePrefix,
    35  		smallerIndexPrefix: inboundLargerIndexPrefix,
    36  		largerValuePrefix:  inboundSmallerValuePrefix,
    37  		largerIndexPrefix:  inboundSmallerIndexPrefix,
    38  	}
    39  )
    40  
    41  type prefixes struct {
    42  	smallerValuePrefix []byte
    43  	smallerIndexPrefix []byte
    44  	largerValuePrefix  []byte
    45  	largerIndexPrefix  []byte
    46  }
    47  
    48  func (p *prefixes) getValueDB(myChainID, peerChainID ids.ID, db database.Database) database.Database {
    49  	if bytes.Compare(myChainID[:], peerChainID[:]) == -1 {
    50  		return prefixdb.New(p.smallerValuePrefix, db)
    51  	}
    52  	return prefixdb.New(p.largerValuePrefix, db)
    53  }
    54  
    55  func (p *prefixes) getValueAndIndexDB(myChainID, peerChainID ids.ID, db database.Database) (database.Database, database.Database) {
    56  	var valueDB, indexDB database.Database
    57  	if bytes.Compare(myChainID[:], peerChainID[:]) == -1 {
    58  		valueDB = prefixdb.New(p.smallerValuePrefix, db)
    59  		indexDB = prefixdb.New(p.smallerIndexPrefix, db)
    60  	} else {
    61  		valueDB = prefixdb.New(p.largerValuePrefix, db)
    62  		indexDB = prefixdb.New(p.largerIndexPrefix, db)
    63  	}
    64  	return valueDB, indexDB
    65  }