github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/types/keys.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"fmt"
     7  	"time"
     8  
     9  	addresscodec "cosmossdk.io/core/address"
    10  	"cosmossdk.io/math"
    11  
    12  	sdk "github.com/cosmos/cosmos-sdk/types"
    13  	"github.com/cosmos/cosmos-sdk/types/address"
    14  	"github.com/cosmos/cosmos-sdk/types/kv"
    15  )
    16  
    17  const (
    18  	// ModuleName is the name of the staking module
    19  	ModuleName = "staking"
    20  
    21  	// StoreKey is the string store representation
    22  	StoreKey = ModuleName
    23  
    24  	// RouterKey is the msg router key for the staking module
    25  	RouterKey = ModuleName
    26  )
    27  
    28  var (
    29  	// Keys for store prefixes
    30  	// Last* values are constant during a block.
    31  	LastValidatorPowerKey = []byte{0x11} // prefix for each key to a validator index, for bonded validators
    32  	LastTotalPowerKey     = []byte{0x12} // prefix for the total power
    33  
    34  	ValidatorsKey             = []byte{0x21} // prefix for each key to a validator
    35  	ValidatorsByConsAddrKey   = []byte{0x22} // prefix for each key to a validator index, by pubkey
    36  	ValidatorsByPowerIndexKey = []byte{0x23} // prefix for each key to a validator index, sorted by power
    37  
    38  	DelegationKey                    = []byte{0x31} // key for a delegation
    39  	UnbondingDelegationKey           = []byte{0x32} // key for an unbonding-delegation
    40  	UnbondingDelegationByValIndexKey = []byte{0x33} // prefix for each key for an unbonding-delegation, by validator operator
    41  	RedelegationKey                  = []byte{0x34} // key for a redelegation
    42  	RedelegationByValSrcIndexKey     = []byte{0x35} // prefix for each key for an redelegation, by source validator operator
    43  	RedelegationByValDstIndexKey     = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator
    44  
    45  	UnbondingIDKey    = []byte{0x37} // key for the counter for the incrementing id for UnbondingOperations
    46  	UnbondingIndexKey = []byte{0x38} // prefix for an index for looking up unbonding operations by their IDs
    47  	UnbondingTypeKey  = []byte{0x39} // prefix for an index containing the type of unbonding operations
    48  
    49  	UnbondingQueueKey    = []byte{0x41} // prefix for the timestamps in unbonding queue
    50  	RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue
    51  	ValidatorQueueKey    = []byte{0x43} // prefix for the timestamps in validator queue
    52  
    53  	HistoricalInfoKey   = []byte{0x50} // prefix for the historical info
    54  	ValidatorUpdatesKey = []byte{0x61} // prefix for the end block validator updates key
    55  
    56  	ParamsKey = []byte{0x51} // prefix for parameters for module x/staking
    57  
    58  	DelegationByValIndexKey = []byte{0x71} // key for delegations by a validator
    59  )
    60  
    61  // UnbondingType defines the type of unbonding operation
    62  type UnbondingType int
    63  
    64  //nolint:revive // we want these underscores, they make life easier
    65  const (
    66  	UnbondingType_Undefined UnbondingType = iota
    67  	UnbondingType_UnbondingDelegation
    68  	UnbondingType_Redelegation
    69  	UnbondingType_ValidatorUnbonding
    70  )
    71  
    72  // GetUnbondingTypeKey returns a key for an index containing the type of unbonding operations
    73  func GetUnbondingTypeKey(id uint64) []byte {
    74  	bz := make([]byte, 8)
    75  	binary.BigEndian.PutUint64(bz, id)
    76  	return append(UnbondingTypeKey, bz...)
    77  }
    78  
    79  // GetUnbondingIndexKey returns a key for the index for looking up UnbondingDelegations by the UnbondingDelegationEntries they contain
    80  func GetUnbondingIndexKey(id uint64) []byte {
    81  	bz := make([]byte, 8)
    82  	binary.BigEndian.PutUint64(bz, id)
    83  	return append(UnbondingIndexKey, bz...)
    84  }
    85  
    86  // GetValidatorKey creates the key for the validator with address
    87  // VALUE: staking/Validator
    88  func GetValidatorKey(operatorAddr sdk.ValAddress) []byte {
    89  	return append(ValidatorsKey, address.MustLengthPrefix(operatorAddr)...)
    90  }
    91  
    92  // GetValidatorByConsAddrKey creates the key for the validator with pubkey
    93  // VALUE: validator operator address ([]byte)
    94  func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte {
    95  	return append(ValidatorsByConsAddrKey, address.MustLengthPrefix(addr)...)
    96  }
    97  
    98  // AddressFromValidatorsKey creates the validator operator address from ValidatorsKey
    99  func AddressFromValidatorsKey(key []byte) []byte {
   100  	kv.AssertKeyAtLeastLength(key, 3)
   101  	return key[2:] // remove prefix bytes and address length
   102  }
   103  
   104  // AddressFromLastValidatorPowerKey creates the validator operator address from LastValidatorPowerKey
   105  func AddressFromLastValidatorPowerKey(key []byte) []byte {
   106  	kv.AssertKeyAtLeastLength(key, 3)
   107  	return key[2:] // remove prefix bytes and address length
   108  }
   109  
   110  // GetValidatorsByPowerIndexKey creates the validator by power index.
   111  // Power index is the key used in the power-store, and represents the relative
   112  // power ranking of the validator.
   113  // VALUE: validator operator address ([]byte)
   114  func GetValidatorsByPowerIndexKey(validator Validator, powerReduction math.Int, valAc addresscodec.Codec) []byte {
   115  	// NOTE the address doesn't need to be stored because counter bytes must always be different
   116  	// NOTE the larger values are of higher value
   117  
   118  	consensusPower := sdk.TokensToConsensusPower(validator.Tokens, powerReduction)
   119  	consensusPowerBytes := make([]byte, 8)
   120  	binary.BigEndian.PutUint64(consensusPowerBytes, uint64(consensusPower))
   121  
   122  	powerBytes := consensusPowerBytes
   123  	powerBytesLen := len(powerBytes) // 8
   124  
   125  	addr, err := valAc.StringToBytes(validator.OperatorAddress)
   126  	if err != nil {
   127  		panic(err)
   128  	}
   129  	operAddrInvr := sdk.CopyBytes(addr)
   130  	addrLen := len(operAddrInvr)
   131  
   132  	for i, b := range operAddrInvr {
   133  		operAddrInvr[i] = ^b
   134  	}
   135  
   136  	// key is of format prefix || powerbytes || addrLen (1byte) || addrBytes
   137  	key := make([]byte, 1+powerBytesLen+1+addrLen)
   138  
   139  	key[0] = ValidatorsByPowerIndexKey[0]
   140  	copy(key[1:powerBytesLen+1], powerBytes)
   141  	key[powerBytesLen+1] = byte(addrLen)
   142  	copy(key[powerBytesLen+2:], operAddrInvr)
   143  
   144  	return key
   145  }
   146  
   147  // GetLastValidatorPowerKey creates the bonded validator index key for an operator address
   148  func GetLastValidatorPowerKey(operator sdk.ValAddress) []byte {
   149  	return append(LastValidatorPowerKey, address.MustLengthPrefix(operator)...)
   150  }
   151  
   152  // ParseValidatorPowerRankKey parses the validators operator address from power rank key
   153  func ParseValidatorPowerRankKey(key []byte) (operAddr []byte) {
   154  	powerBytesLen := 8
   155  
   156  	// key is of format prefix (1 byte) || powerbytes || addrLen (1byte) || addrBytes
   157  	operAddr = sdk.CopyBytes(key[powerBytesLen+2:])
   158  
   159  	for i, b := range operAddr {
   160  		operAddr[i] = ^b
   161  	}
   162  
   163  	return operAddr
   164  }
   165  
   166  // GetValidatorQueueKey returns the prefix key used for getting a set of unbonding
   167  // validators whose unbonding completion occurs at the given time and height.
   168  func GetValidatorQueueKey(timestamp time.Time, height int64) []byte {
   169  	heightBz := sdk.Uint64ToBigEndian(uint64(height))
   170  	timeBz := sdk.FormatTimeBytes(timestamp)
   171  	timeBzL := len(timeBz)
   172  	prefixL := len(ValidatorQueueKey)
   173  
   174  	bz := make([]byte, prefixL+8+timeBzL+8)
   175  
   176  	// copy the prefix
   177  	copy(bz[:prefixL], ValidatorQueueKey)
   178  
   179  	// copy the encoded time bytes length
   180  	copy(bz[prefixL:prefixL+8], sdk.Uint64ToBigEndian(uint64(timeBzL)))
   181  
   182  	// copy the encoded time bytes
   183  	copy(bz[prefixL+8:prefixL+8+timeBzL], timeBz)
   184  
   185  	// copy the encoded height
   186  	copy(bz[prefixL+8+timeBzL:], heightBz)
   187  
   188  	return bz
   189  }
   190  
   191  // ParseValidatorQueueKey returns the encoded time and height from a key created
   192  // from GetValidatorQueueKey.
   193  func ParseValidatorQueueKey(bz []byte) (time.Time, int64, error) {
   194  	prefixL := len(ValidatorQueueKey)
   195  	if prefix := bz[:prefixL]; !bytes.Equal(prefix, ValidatorQueueKey) {
   196  		return time.Time{}, 0, fmt.Errorf("invalid prefix; expected: %X, got: %X", ValidatorQueueKey, prefix)
   197  	}
   198  
   199  	timeBzL := sdk.BigEndianToUint64(bz[prefixL : prefixL+8])
   200  	ts, err := sdk.ParseTimeBytes(bz[prefixL+8 : prefixL+8+int(timeBzL)])
   201  	if err != nil {
   202  		return time.Time{}, 0, err
   203  	}
   204  
   205  	height := sdk.BigEndianToUint64(bz[prefixL+8+int(timeBzL):])
   206  
   207  	return ts, int64(height), nil
   208  }
   209  
   210  // GetDelegationKey creates the key for delegator bond with validator
   211  // VALUE: staking/Delegation
   212  func GetDelegationKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte {
   213  	return append(GetDelegationsKey(delAddr), address.MustLengthPrefix(valAddr)...)
   214  }
   215  
   216  // GetDelegationsByValKey creates the key for delegations by validator address
   217  // VALUE: staking/Delegation
   218  func GetDelegationsByValKey(valAddr sdk.ValAddress, delAddr sdk.AccAddress) []byte {
   219  	return append(GetDelegationsByValPrefixKey(valAddr), delAddr...)
   220  }
   221  
   222  // GetDelegationsByValPrefixKey builds a prefix key bytes with the given validator address bytes.
   223  func GetDelegationsByValPrefixKey(valAddr sdk.ValAddress) []byte {
   224  	return append(DelegationByValIndexKey, address.MustLengthPrefix(valAddr)...)
   225  }
   226  
   227  // ParseDelegationsByValKey parses given key and returns validator, delegator address bytes
   228  func ParseDelegationsByValKey(bz []byte) (sdk.ValAddress, sdk.AccAddress, error) {
   229  	prefixLength := len(DelegationByValIndexKey)
   230  	if prefix := bz[:prefixLength]; !bytes.Equal(prefix, DelegationByValIndexKey) {
   231  		return nil, nil, fmt.Errorf("invalid prefix; expected: %X, got: %x", DelegationByValIndexKey, prefix)
   232  	}
   233  
   234  	bz = bz[prefixLength:] // remove the prefix byte
   235  	if len(bz) == 0 {
   236  		return nil, nil, fmt.Errorf("no bytes left to parse: %X", bz)
   237  	}
   238  
   239  	valAddrLen := bz[0]
   240  	bz = bz[1:] // remove the length byte of validator address.
   241  	if len(bz) == 0 {
   242  		return nil, nil, fmt.Errorf("no bytes left to parse validator address: %X", bz)
   243  	}
   244  
   245  	val := bz[0:int(valAddrLen)]
   246  
   247  	bz = bz[int(valAddrLen):] // remove the delegator bytes
   248  	if len(bz) == 0 {
   249  		return nil, nil, fmt.Errorf("no bytes left to parse delegator address: %X", bz)
   250  	}
   251  
   252  	del := bz
   253  
   254  	return val, del, nil
   255  }
   256  
   257  // GetDelegationsKey creates the prefix for a delegator for all validators
   258  func GetDelegationsKey(delAddr sdk.AccAddress) []byte {
   259  	return append(DelegationKey, address.MustLengthPrefix(delAddr)...)
   260  }
   261  
   262  // GetUBDKey creates the key for an unbonding delegation by delegator and validator addr
   263  // VALUE: staking/UnbondingDelegation
   264  func GetUBDKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte {
   265  	return append(GetUBDsKey(delAddr.Bytes()), address.MustLengthPrefix(valAddr)...)
   266  }
   267  
   268  // GetUBDByValIndexKey creates the index-key for an unbonding delegation, stored by validator-index
   269  // VALUE: none (key rearrangement used)
   270  func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte {
   271  	return append(GetUBDsByValIndexKey(valAddr), address.MustLengthPrefix(delAddr)...)
   272  }
   273  
   274  // GetUBDKeyFromValIndexKey rearranges the ValIndexKey to get the UBDKey
   275  func GetUBDKeyFromValIndexKey(indexKey []byte) []byte {
   276  	kv.AssertKeyAtLeastLength(indexKey, 2)
   277  	addrs := indexKey[1:] // remove prefix bytes
   278  
   279  	valAddrLen := addrs[0]
   280  	kv.AssertKeyAtLeastLength(addrs, 2+int(valAddrLen))
   281  	valAddr := addrs[1 : 1+valAddrLen]
   282  	kv.AssertKeyAtLeastLength(addrs, 3+int(valAddrLen))
   283  	delAddr := addrs[valAddrLen+2:]
   284  
   285  	return GetUBDKey(delAddr, valAddr)
   286  }
   287  
   288  // GetUBDsKey creates the prefix for all unbonding delegations from a delegator
   289  func GetUBDsKey(delAddr sdk.AccAddress) []byte {
   290  	return append(UnbondingDelegationKey, address.MustLengthPrefix(delAddr)...)
   291  }
   292  
   293  // GetUBDsByValIndexKey creates the prefix keyspace for the indexes of unbonding delegations for a validator
   294  func GetUBDsByValIndexKey(valAddr sdk.ValAddress) []byte {
   295  	return append(UnbondingDelegationByValIndexKey, address.MustLengthPrefix(valAddr)...)
   296  }
   297  
   298  // GetUnbondingDelegationTimeKey creates the prefix for all unbonding delegations from a delegator
   299  func GetUnbondingDelegationTimeKey(timestamp time.Time) []byte {
   300  	bz := sdk.FormatTimeBytes(timestamp)
   301  	return append(UnbondingQueueKey, bz...)
   302  }
   303  
   304  // GetREDKey returns a key prefix for indexing a redelegation from a delegator
   305  // and source validator to a destination validator.
   306  func GetREDKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte {
   307  	// key is of the form GetREDsKey || valSrcAddrLen (1 byte) || valSrcAddr || valDstAddrLen (1 byte) || valDstAddr
   308  	key := make([]byte, 1+3+len(delAddr)+len(valSrcAddr)+len(valDstAddr))
   309  
   310  	copy(key[0:2+len(delAddr)], GetREDsKey(delAddr.Bytes()))
   311  	key[2+len(delAddr)] = byte(len(valSrcAddr))
   312  	copy(key[3+len(delAddr):3+len(delAddr)+len(valSrcAddr)], valSrcAddr.Bytes())
   313  	key[3+len(delAddr)+len(valSrcAddr)] = byte(len(valDstAddr))
   314  	copy(key[4+len(delAddr)+len(valSrcAddr):], valDstAddr.Bytes())
   315  
   316  	return key
   317  }
   318  
   319  // GetREDByValSrcIndexKey creates the index-key for a redelegation, stored by source-validator-index
   320  // VALUE: none (key rearrangement used)
   321  func GetREDByValSrcIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte {
   322  	REDSFromValsSrcKey := GetREDsFromValSrcIndexKey(valSrcAddr)
   323  	offset := len(REDSFromValsSrcKey)
   324  
   325  	// key is of the form REDSFromValsSrcKey || delAddrLen (1 byte) || delAddr || valDstAddrLen (1 byte) || valDstAddr
   326  	key := make([]byte, offset+2+len(delAddr)+len(valDstAddr))
   327  	copy(key[0:offset], REDSFromValsSrcKey)
   328  	key[offset] = byte(len(delAddr))
   329  	copy(key[offset+1:offset+1+len(delAddr)], delAddr.Bytes())
   330  	key[offset+1+len(delAddr)] = byte(len(valDstAddr))
   331  	copy(key[offset+2+len(delAddr):], valDstAddr.Bytes())
   332  
   333  	return key
   334  }
   335  
   336  // GetREDByValDstIndexKey creates the index-key for a redelegation, stored by destination-validator-index
   337  // VALUE: none (key rearrangement used)
   338  func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte {
   339  	REDSToValsDstKey := GetREDsToValDstIndexKey(valDstAddr)
   340  	offset := len(REDSToValsDstKey)
   341  
   342  	// key is of the form REDSToValsDstKey || delAddrLen (1 byte) || delAddr || valSrcAddrLen (1 byte) || valSrcAddr
   343  	key := make([]byte, offset+2+len(delAddr)+len(valSrcAddr))
   344  	copy(key[0:offset], REDSToValsDstKey)
   345  	key[offset] = byte(len(delAddr))
   346  	copy(key[offset+1:offset+1+len(delAddr)], delAddr.Bytes())
   347  	key[offset+1+len(delAddr)] = byte(len(valSrcAddr))
   348  	copy(key[offset+2+len(delAddr):], valSrcAddr.Bytes())
   349  
   350  	return key
   351  }
   352  
   353  // GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey
   354  func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte {
   355  	// note that first byte is prefix byte, which we remove
   356  	kv.AssertKeyAtLeastLength(indexKey, 2)
   357  	addrs := indexKey[1:]
   358  
   359  	valSrcAddrLen := addrs[0]
   360  	kv.AssertKeyAtLeastLength(addrs, int(valSrcAddrLen)+2)
   361  	valSrcAddr := addrs[1 : valSrcAddrLen+1]
   362  	delAddrLen := addrs[valSrcAddrLen+1]
   363  	kv.AssertKeyAtLeastLength(addrs, int(valSrcAddrLen)+int(delAddrLen)+2)
   364  	delAddr := addrs[valSrcAddrLen+2 : valSrcAddrLen+2+delAddrLen]
   365  	kv.AssertKeyAtLeastLength(addrs, int(valSrcAddrLen)+int(delAddrLen)+4)
   366  	valDstAddr := addrs[valSrcAddrLen+delAddrLen+3:]
   367  
   368  	return GetREDKey(delAddr, valSrcAddr, valDstAddr)
   369  }
   370  
   371  // GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey
   372  func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte {
   373  	// note that first byte is prefix byte, which we remove
   374  	kv.AssertKeyAtLeastLength(indexKey, 2)
   375  	addrs := indexKey[1:]
   376  
   377  	valDstAddrLen := addrs[0]
   378  	kv.AssertKeyAtLeastLength(addrs, int(valDstAddrLen)+2)
   379  	valDstAddr := addrs[1 : valDstAddrLen+1]
   380  	delAddrLen := addrs[valDstAddrLen+1]
   381  	kv.AssertKeyAtLeastLength(addrs, int(valDstAddrLen)+int(delAddrLen)+3)
   382  	delAddr := addrs[valDstAddrLen+2 : valDstAddrLen+2+delAddrLen]
   383  	kv.AssertKeyAtLeastLength(addrs, int(valDstAddrLen)+int(delAddrLen)+4)
   384  	valSrcAddr := addrs[valDstAddrLen+delAddrLen+3:]
   385  
   386  	return GetREDKey(delAddr, valSrcAddr, valDstAddr)
   387  }
   388  
   389  // GetRedelegationTimeKey returns a key prefix for indexing an unbonding
   390  // redelegation based on a completion time.
   391  func GetRedelegationTimeKey(timestamp time.Time) []byte {
   392  	bz := sdk.FormatTimeBytes(timestamp)
   393  	return append(RedelegationQueueKey, bz...)
   394  }
   395  
   396  // GetREDsKey returns a key prefix for indexing a redelegation from a delegator
   397  // address.
   398  func GetREDsKey(delAddr sdk.AccAddress) []byte {
   399  	return append(RedelegationKey, address.MustLengthPrefix(delAddr)...)
   400  }
   401  
   402  // GetREDsFromValSrcIndexKey returns a key prefix for indexing a redelegation to
   403  // a source validator.
   404  func GetREDsFromValSrcIndexKey(valSrcAddr sdk.ValAddress) []byte {
   405  	return append(RedelegationByValSrcIndexKey, address.MustLengthPrefix(valSrcAddr)...)
   406  }
   407  
   408  // GetREDsToValDstIndexKey returns a key prefix for indexing a redelegation to a
   409  // destination (target) validator.
   410  func GetREDsToValDstIndexKey(valDstAddr sdk.ValAddress) []byte {
   411  	return append(RedelegationByValDstIndexKey, address.MustLengthPrefix(valDstAddr)...)
   412  }
   413  
   414  // GetREDsByDelToValDstIndexKey returns a key prefix for indexing a redelegation
   415  // from an address to a source validator.
   416  func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) []byte {
   417  	return append(GetREDsToValDstIndexKey(valDstAddr), address.MustLengthPrefix(delAddr)...)
   418  }
   419  
   420  // GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects.
   421  func GetHistoricalInfoKey(height int64) []byte {
   422  	heightBytes := make([]byte, 8)
   423  	binary.BigEndian.PutUint64(heightBytes, uint64(height))
   424  	return append(HistoricalInfoKey, heightBytes...)
   425  }