Åtkomstkontroll
Ownable och roller
Å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 medonlyOwneroch ö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.
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
- Varför OpenZeppelin
- Åtkomstkontroll
- Tokenutökningar
- Uppgraderbara kontrakt