github.com/Finschia/finschia-sdk@v0.48.1/x/staking/types/keys.go (about)

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