Tilgangskontroll
Ownable og roller
Tilgangskontroll er en gratis leksjon i Grunnleggende om Web3- og DApp-utvikling på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Grunnleggende om Web3- og DApp-utvikling, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Grunnleggende om Web3- og DApp-utvikling inneholder totalt 4 leksjoner.
Hvorfor tilgangskontroll
Mange kontraktfunksjoner bør bare kunne kalles av bestemte kontoer — for å lage tokens, sette systemet på pause eller ta ut midler. Tilgangskontroll håndhever hvem som kan gjøre hva.
OpenZeppelin tilbyr to hovedmønstre: Ownable og AccessControl.
Ownable-mønsteret
Ownable gir en kontrakt én privilegert owner. Importer og arv fra den:
import "@openzeppelin/contracts/access/Ownable.sol";
contract Vault is Ownable {
constructor() Ownable(msg.sender) {}
}Den som distribuerer kontrakten, blir den første eieren.
import "@openzeppelin/contracts/access/Ownable.sol";
contract Vault is Ownable {
constructor() Ownable(msg.sender) {}
}onlyOwner-modifikatoren
Begrens en funksjon til eieren med onlyOwner-modifikatoren:
function withdraw() public onlyOwner {
payable(owner()).transfer(address(this).balance);
}Hvis noen andre kaller den, blir transaksjonen automatisk rullet tilbake.
function withdraw() public onlyOwner {
payable(owner()).transfer(address(this).balance);
}Overføre eierskap
Ownable lar Dem overføre kontrollen til en annen adresse:
// Give ownership to a new account
vault.transferOwnership(newOwner);
// Or give it up forever
vault.renounceOwnership();Hvis De gir avkall på eierskapet, blir onlyOwner-funksjoner permanent umulige å kalle — bruk dette med forsiktighet.
// Give ownership to a new account
vault.transferOwnership(newOwner);
// Or give it up forever
vault.renounceOwnership();Begrensninger ved én eier
Én eier er enkelt, men begrensende:
- Det finnes ingen måte å gi ulike personer ulike tillatelser på.
- Én enkelt nøkkel er et enkelt feilpunkt.
Bruk rollebasert tilgangskontroll for mer avanserte oppsett.
AccessControl-mønsteret
AccessControl støtter mange navngitte roller. Arv fra den, og definer rollene Deres:
import "@openzeppelin/contracts/access/AccessControl.sol";
contract Token is AccessControl {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
}Roller identifiseres ved hjelp av et hashet navn.
import "@openzeppelin/contracts/access/AccessControl.sol";
contract Token is AccessControl {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
}Tilordne roller
Den som distribuerer kontrakten, får vanligvis administratorrollen og tildeler deretter roller til andre:
constructor() {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(MINTER_ROLE, msg.sender);
}DEFAULT_ADMIN_ROLE kan tildele og tilbakekalle alle andre roller.
constructor() {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(MINTER_ROLE, msg.sender);
}onlyRole-modifikatoren
Begrens funksjoner til innehavere av en rolle:
function mint(address to, uint256 amount)
public onlyRole(MINTER_ROLE) {
_mint(to, amount);
}Bare kontoer som er tildelt MINTER_ROLE, kan lage tokens; alle andre får transaksjonen rullet tilbake.
function mint(address to, uint256 amount)
public onlyRole(MINTER_ROLE) {
_mint(to, amount);
}Administrere roller under kjøring
Administratorer kan tildele og tilbakekalle roller etter distribusjon:
token.grantRole(MINTER_ROLE, alice);
token.revokeRole(MINTER_ROLE, alice);
// Check membership
bool canMint = await token.hasRole(MINTER_ROLE, alice);En konto kan også gi avkall på sin egen rolle.
token.grantRole(MINTER_ROLE, alice);
token.revokeRole(MINTER_ROLE, alice);
// Check membership
bool canMint = await token.hasRole(MINTER_ROLE, alice);Velge et mønster
Hvilket bør De bruke?
- Ownable — enkle administratoroppgaver og én betrodd operatør.
- AccessControl — flere roller, arbeidsdeling og DAO-er.
I produksjon bør De vurdere å tildele eier-/administratorrollen til en multisig i stedet for én enkelt nøkkel.
Hver rolle har en administrator
I AccessControl har hver rolle en administratorrolle som bestemmer hvem som kan tildele eller tilbakekalle den. Som standard er dette DEFAULT_ADMIN_ROLE, men De kan endre det:
// Make MANAGER_ROLE the admin of MINTER_ROLE
_setRoleAdmin(MINTER_ROLE, MANAGER_ROLE);Dette lar Dem bygge hierarkier av tillatelser.
// Make MANAGER_ROLE the admin of MINTER_ROLE
_setRoleAdmin(MINTER_ROLE, MANAGER_ROLE);Kort kontroll
Test forståelsen Deres av tilgangskontroll.
Oppsummering
De har lært om OpenZeppelins mønstre for tilgangskontroll.
- Ownable gir én
owner; begrens tilgangen medonlyOwner, og overfør eller gi avkall på eierskapet. - AccessControl støtter mange roller som identifiseres med hashede navn.
- Tildel administratorrollen ved distribusjon, og beskytt funksjoner med
onlyRole. - Administratorer tildeler og tilbakekaller roller under kjøring; kontoer kan gi avkall på roller.
- Bruk Ownable i enkle tilfeller og AccessControl (helst bak en multisig) i komplekse tilfeller.
Lær deg Grunnleggende om Web3- og DApp-utvikling med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 29
- Leksjoner
- 105
Ofte stilte spørsmål
Er leksjonen «Tilgangskontroll» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Grunnleggende om Web3- og DApp-utvikling, inkludert «Tilgangskontroll», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Grunnleggende om Web3- og DApp-utvikling inneholder totalt 4 leksjoner.
Hva lærer jeg i «Tilgangskontroll»?
Ownable og roller Du øver på Grunnleggende om Web3- og DApp-utvikling med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Grunnleggende om Web3- og DApp-utvikling?
Ingen tidligere erfaring er nødvendig. Grunnleggende om Web3- og DApp-utvikling på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Tilgangskontroll»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Grunnleggende om Web3- og DApp-utvikling-leksjonen?
Ja. Alle Grunnleggende om Web3- og DApp-utvikling-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvorfor OpenZeppelin
- Tilgangskontroll
- Token-utvidelser
- Oppgraderbare kontrakter