Felhantering med Revert/Require
Implementera effektiva strategier för felhantering med `require()`, `revert()` och `assert()` för robust körning av kontrakt.
Felhantering med Revert/Require är en gratis lektion i Smarta blockkedjekontrakt med Solidity på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Smarta blockkedjekontrakt med Solidity, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Smarta blockkedjekontrakt med Solidity innehåller totalt 4 lektioner.
Robusta kontrakt: felhantering
Välkommen till felhantering i Solidity! Att skriva smarta kontrakt kräver stor noggrannhet, eftersom de ofta hanterar värdefulla tillgångar och är oföränderliga när de väl har distribuerats.
Effektiv felhantering är avgörande för att skapa robusta och säkra decentraliserade applikationer (dApps). Den hjälper till att förhindra oväntat beteende och skyddar användarna.
`require()`: validera indata
Funktionen require() är ditt främsta verktyg för att validera villkor som måste vara sanna innan en funktion körs.
- Den kontrollerar förvillkor och användarindata.
- Om villkoret är falskt återställs alla tillståndsändringar som gjorts i den aktuella transaktionen.
- All återstående gas återbetalas till anroparen, vilket i praktiken avbryter transaktionen.
Använd require() för externa villkor och kontroller av data från användaren.
`require()` i praktiken
Vi tittar på require() i ett enkelt kontrakt. Den här funktionen tillåter endast användare över 18 år att registrera sig.
pragma solidity ^0.8.0;
contract UserRegistration {
uint public minAge = 18;
address[] public registeredUsers;
function registerUser(uint _age) public {
// Validate user input: age must be at least minAge
require(_age >= minAge, "Must be 18 or older to register.");
registeredUsers.push(msg.sender);
}
}`revert()`: flexibel felhantering
Satsen revert() erbjuder större flexibilitet än require(), särskilt när du behöver hantera komplex fellogik eller integrera anpassade feltyper.
- Precis som
require()återställer den alla tillståndsändringar och återbetalar gas. - Den används ofta i
if-satser för mer avancerade villkorskontroller. - Den kan anropas direkt eller med ett strängmeddelande, på liknande sätt som
require().
Anpassade fel med `revert()`
Solidity 0.8.4+ introducerade anpassade fel. De är mer gaseffektiva än strängmeddelanden och ger bättre tydlighet för applikationer utanför kedjan.
Du definierar anpassade fel på kontrakts- eller filnivå och använder dem sedan med revert(). De bidrar till att minska transaktionskostnaderna och förbättra kontraktets läsbarhet.
Demonstration av anpassade fel
Så här definierar och använder du ett anpassat fel med revert(). Lägg märke till nyckelordet error.
pragma solidity ^0.8.4;
contract Wallet {
address public owner;
uint public balance;
// Define a custom error
error InsufficientFunds(uint requested, uint available);
constructor() {
owner = msg.sender;
}
function deposit() public payable {
balance += msg.value;
}
function withdraw(uint _amount) public {
require(msg.sender == owner, "Only owner can withdraw.");
// Use revert() with the custom error
if (_amount > balance) {
revert InsufficientFunds(_amount, balance);
}
balance -= _amount;
payable(owner).transfer(_amount);
}
}`assert()`: interna invarianta villkor
Funktionen assert() används för ett mycket specifikt ändamål: att kontrollera interna invarianta villkor.
- Den verifierar villkor som aldrig borde vara falska om koden fungerar korrekt.
- Om en
assert()misslyckas tyder det på ett fel i kontraktets logik. - Viktigt: en misslyckad
assert()förbrukar all återstående gas, till skillnad frånrequire()ochrevert(), som återbetalar gas.
Använd assert() för eftervillkor eller interna konsekvenskontroller, inte för validering av användarindata.
När ska du använda vilken?
Det är viktigt att välja rätt felhanterare:
require(): För att validera användarindata, externa villkor eller tillståndsändringar före körning. Återbetalar gas.revert(): För mer komplex fellogik, ofta tillsammans med anpassade fel. Återbetalar också gas.assert(): För interna konsekvenskontroller och invarianta villkor. Ett misslyckande tyder på ett fel och förbrukar all gas.
Prioritera require() och revert() för förväntade fel och använd assert() endast för oväntade, interna fel.
Kontroll av felhantering
Du bygger en funktion som överför token. Innan överföringen måste du säkerställa att avsändaren har tillräckligt saldo. Om inte ska transaktionen misslyckas och all oanvänd gas återbetalas.
Sammanfattning: felhantering
Du har lärt dig att göra dina Solidity-kontrakt robusta med korrekt felhantering:
require()används för att validera externa villkor och användarindata.revert()ger flexibilitet och används ofta tillsammans med gaseffektiva anpassade fel.assert()används för interna invarianta villkor och signalerar ett fel om den misslyckas.
Genom att behärska detta blir dina smarta kontrakt säkra och förutsägbara. Bra jobbat!
Lär dig Smarta blockkedjekontrakt med Solidity 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
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Felhantering med Revert/Require” gratis?
Ja – hela texten till ”Felhantering med Revert/Require” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Smarta blockkedjekontrakt med Solidity, kan Ni uppgradera till CoddyKit PRO. Kursen i Smarta blockkedjekontrakt med Solidity innehåller totalt 4 lektioner.
Vad lär jag mig i ”Felhantering med Revert/Require”?
Implementera effektiva strategier för felhantering med `require()`, `revert()` och `assert()` för robust körning av kontrakt. Ni övar på Smarta blockkedjekontrakt med Solidity 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 Smarta blockkedjekontrakt med Solidity?
Du behöver inga förkunskaper. Utbildningen i Smarta blockkedjekontrakt med Solidity 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 3 av 4.
Hur lång tid tar lektionen ”Felhantering med Revert/Require”?
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 Smarta blockkedjekontrakt med Solidity-lektionen?
Ja. Varje Smarta blockkedjekontrakt med Solidity-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
- Arv och gränssnitt
- Bibliotek och abstrakta kontrakt
- Felhantering med Revert/Require
- Modifierare och mönstret Checks-Effects-Interactions