Grunnleggende om Web3- og DApp-utvikling · leksjon

Tilgangskontroll

Ownable og roller

Leksjon 2 av 413 trinn

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 med onlyOwner, 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.
Gratis å komme i gang

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

  1. Hvorfor OpenZeppelin
  2. Tilgangskontroll
  3. Token-utvidelser
  4. Oppgraderbare kontrakter
← Tilbake til Grunnleggende om Web3- og DApp-utvikling