use std::ascii;
use std::bcs;
use std::option;
use std::string;
use std::vector;
use sui::address;
use sui::hex;
use sui::object;
use sui::party;
use sui::transfer;
use sui::tx_context;
use sui::vec_map;
Struct `UnverifiedValidatorOperationCap`
The capability object is created when creating a new Validator or when the
validator explicitly creates a new capability object for rotation/revocation.
The holder address of this object can perform some validator operations on behalf of
the authorizer validator. Thus, if a validator wants to separate the keys for operation
(such as reference gas price setting or tallying rule reporting) from fund/staking, it
could transfer this capability object to another address.
To facilitate rotating/revocation, Validator stores the ID of currently valid
UnverifiedValidatorOperationCap. Thus, before converting
UnverifiedValidatorOperationCap
to
ValidatorOperationCap, verification needs to be done to make sure
the cap object is still valid.
public struct UnverifiedValidatorOperationCap has key, store
Fields
-
id: sui::object::UID
-
-
authorizer_validator_address: address
-
Struct `ValidatorOperationCap`
Privileged operations require
ValidatorOperationCap for permission check.
This is only constructed after successful verification.
public struct ValidatorOperationCap has drop
Fields
-
authorizer_validator_address: address
-
Function `unverified_operation_cap_address`
public(package) fun unverified_operation_cap_address(cap: &sui_system::validator_cap::UnverifiedValidatorOperationCap): &address
Implementation
public(package) fun unverified_operation_cap_address(
cap: &UnverifiedValidatorOperationCap,
): &address {
&cap.authorizer_validator_address
}
Function `verified_operation_cap_address`
public(package) fun verified_operation_cap_address(cap: &sui_system::validator_cap::ValidatorOperationCap): &address
Implementation
public(package) fun verified_operation_cap_address(cap: &ValidatorOperationCap): &address {
&cap.authorizer_validator_address
}
Function `new_unverified_validator_operation_cap_and_transfer`
Should be only called by the friend modules when adding a Validator
or rotating an existing validaotr's operation_cap_id.
public(package) fun new_unverified_validator_operation_cap_and_transfer(validator_address: address, ctx: &mut sui::tx_context::TxContext): sui::object::ID
Implementation
public(package) fun new_unverified_validator_operation_cap_and_transfer(
validator_address: address,
ctx: &mut TxContext,
): ID {
// This function needs to be called only by the validator itself, except
// 1. in genesis where all valdiators are created by @0x0
// 2. in tests where @0x0 could be used to simplify the setup
let sender_address = ctx.sender();
assert!(sender_address == @0x0 || sender_address == validator_address, 0);
let operation_cap = UnverifiedValidatorOperationCap {
id: object::new(ctx),
authorizer_validator_address: validator_address,
};
let operation_cap_id = object::id(&operation_cap);
transfer::public_transfer(operation_cap, validator_address);
operation_cap_id
}
Function `into_verified`
Convert an
UnverifiedValidatorOperationCap to
ValidatorOperationCap.
Should only be called by
validator_set module AFTER verification.
public(package) fun into_verified(cap: &sui_system::validator_cap::UnverifiedValidatorOperationCap): sui_system::validator_cap::ValidatorOperationCap
Implementation
public(package) fun into_verified(cap: &UnverifiedValidatorOperationCap): ValidatorOperationCap {
ValidatorOperationCap { authorizer_validator_address: cap.authorizer_validator_address }
}