Contract Ownership
The following example implements access control to restrict functionality to a privileged user.
ABI
The interface
contains a function to set the owner and a function that only the owner can use.
abi Ownership {
#[storage(read, write)]
fn set_owner(owner: Option<Identity>);
#[storage(read)]
fn action();
}
Identity
We must keep track of the owner in storage and compare them against the caller via msg_sender()
.
Initially there is no owner so we'll set them to None
.
storage {
owner: Option<Identity> = None,
}
Implementation
To set the owner one of two conditions must be met:
- There is no owner
- The current owner is calling the function
To call our action()
function the caller must be the owner of the contract.
impl Ownership for Contract {
#[storage(read, write)]
fn set_owner(owner: Option<Identity>) {
assert(storage.owner.read().is_none() || storage.owner.read().unwrap() == msg_sender().unwrap());
storage.owner.write(owner);
}
#[storage(read)]
fn action() {
assert(storage.owner.read().unwrap() == msg_sender().unwrap());
// code
}
}