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 }