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 }