Grunderna i Web3- och DApp-utveckling · Lektion

Åtkomstkontroll

Ownable och roller

Lektion 2 av 413 steg

Åtkomstkontroll är en gratis lektion i Grunderna i Web3- och DApp-utveckling på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Grunderna i Web3- och DApp-utveckling, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Grunderna i Web3- och DApp-utveckling innehåller totalt 4 lektioner.

Varför åtkomstkontroll

Många kontraktsfunktioner bör bara kunna anropas av vissa konton — till exempel för att skapa tokens, pausa systemet eller ta ut tillgångar. Åtkomstkontroll styr vem som får göra vad.

OpenZeppelin erbjuder två huvudmönster: Ownable och AccessControl.

Ownable-mönstret

Ownable ger ett kontrakt en enda privilegierad owner. Importera och ärv det:

import "@openzeppelin/contracts/access/Ownable.sol"; contract Vault is Ownable { constructor() Ownable(msg.sender) {} }

Den som distribuerar kontraktet blir den ursprungliga ägaren.

import "@openzeppelin/contracts/access/Ownable.sol";

contract Vault is Ownable {
    constructor() Ownable(msg.sender) {}
}

Modifieraren onlyOwner

Begränsa en funktion till ägaren med modifieraren onlyOwner:

function withdraw() public onlyOwner { payable(owner()).transfer(address(this).balance); }

Om någon annan anropar den återställs transaktionen automatiskt.

function withdraw() public onlyOwner {
    payable(owner()).transfer(address(this).balance);
}

Överför ägarskap

Med Ownable kan Ni överlåta kontrollen till en annan adress:

// Give ownership to a new account vault.transferOwnership(newOwner); // Or give it up forever vault.renounceOwnership();

Om Ni avstår från ägarskapet blir onlyOwner-funktioner permanent omöjliga att anropa — använd detta försiktigt.

// Give ownership to a new account
vault.transferOwnership(newOwner);

// Or give it up forever
vault.renounceOwnership();

Begränsningar med en enda ägare

En enda ägare är enkelt men begränsande:

  • Det går inte att ge olika personer olika behörigheter.
  • En enda nyckel utgör en enda felpunkt.

För mer avancerade upplägg använder Ni rollbaserad åtkomstkontroll.

AccessControl-mönstret

AccessControl stöder många namngivna roller. Ärv det och definiera Era roller:

import "@openzeppelin/contracts/access/AccessControl.sol"; contract Token is AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); }

Rollerna identifieras med ett hashat namn.

import "@openzeppelin/contracts/access/AccessControl.sol";

contract Token is AccessControl {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
}

Tilldela roller

Den som distribuerar kontraktet får vanligtvis adminrollen och tilldelar sedan roller till andra:

constructor() { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); }

DEFAULT_ADMIN_ROLE kan tilldela och återkalla alla andra roller.

constructor() {
    _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
    _grantRole(MINTER_ROLE, msg.sender);
}

Modifieraren onlyRole

Begränsa funktioner till innehavare av en roll:

function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { _mint(to, amount); }

Endast konton som tilldelats MINTER_ROLE kan skapa tokens; alla andra anrop återställs.

function mint(address to, uint256 amount)
    public onlyRole(MINTER_ROLE) {
    _mint(to, amount);
}

Hantera roller under körning

Administratörer kan tilldela och återkalla roller efter distributionen:

token.grantRole(MINTER_ROLE, alice); token.revokeRole(MINTER_ROLE, alice); // Check membership bool canMint = await token.hasRole(MINTER_ROLE, alice);

Ett konto kan även avstå från sin egen roll.

token.grantRole(MINTER_ROLE, alice);
token.revokeRole(MINTER_ROLE, alice);

// Check membership
bool canMint = await token.hasRole(MINTER_ROLE, alice);

Välj ett mönster

Vilket bör Ni använda?

  • Ownable — enkla administratörsuppgifter och en betrodd operatör.
  • AccessControl — flera roller, separerade ansvarsområden och DAO:er.

För produktion bör Ni överväga att ge ägar- eller adminrollen till en multisig i stället för en enda nyckel.

Varje roll har en administratör

I AccessControl har varje roll en adminroll som styr vem som kan tilldela eller återkalla den. Som standard är det DEFAULT_ADMIN_ROLE, men Ni kan ändra detta:

// Make MANAGER_ROLE the admin of MINTER_ROLE _setRoleAdmin(MINTER_ROLE, MANAGER_ROLE);

På så sätt kan Ni bygga hierarkier av behörigheter.

// Make MANAGER_ROLE the admin of MINTER_ROLE
_setRoleAdmin(MINTER_ROLE, MANAGER_ROLE);

Snabb kontroll

Testa Er förståelse av åtkomstkontroll.

Sammanfattning

Ni har lärt Er OpenZeppelins mönster för åtkomstkontroll.

  • Ownable ger ett owner; begränsa med onlyOwner och överför eller avstå från ägarskapet.
  • AccessControl stöder många roller som identifieras med hashade namn.
  • Tilldela adminrollen vid distributionen och skydda funktioner med onlyRole.
  • Administratörer tilldelar och återkallar roller under körning; konton kan avstå från roller.
  • Använd Ownable i enkla fall och AccessControl (helst bakom en multisig) i komplexa fall.
Gratis att börja

Lär dig Grunderna i Web3- och DApp-utveckling med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
29
Lektioner
105

Vanliga frågor

Är lektionen ”Åtkomstkontroll” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Grunderna i Web3- och DApp-utveckling, inklusive ”Åtkomstkontroll”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Grunderna i Web3- och DApp-utveckling innehåller totalt 4 lektioner.

Vad lär jag mig i ”Åtkomstkontroll”?

Ownable och roller Ni övar på Grunderna i Web3- och DApp-utveckling med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Grunderna i Web3- och DApp-utveckling?

Du behöver inga förkunskaper. Utbildningen i Grunderna i Web3- och DApp-utveckling på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Åtkomstkontroll”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Grunderna i Web3- och DApp-utveckling-lektionen?

Ja. Varje Grunderna i Web3- och DApp-utveckling-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Varför OpenZeppelin
  2. Åtkomstkontroll
  3. Tokenutökningar
  4. Uppgraderbara kontrakt
← Tillbaka till Grunderna i Web3- och DApp-utveckling