Läsa kontraktsdata
Anropa view-funktioner
Läsa kontraktsdata ä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.
Anropa view-funktioner
Det är kostnadsfritt att läsa data från ett kontrakt – det ändrar inte tillståndet, kostar ingen gas och kräver ingen signatur. Det här är view- och pure-funktioner.
Med ethers.js ansluter Ni till ett distribuerat kontrakt och anropar funktionerna som vanliga JavaScript-metoder.
Ni behöver ABI:t
För att kommunicera med ett kontrakt behöver ethers dess ABI – gränssnittet som beskriver varje funktion. Ni kan använda hela det kompilerade ABI:t eller ett minimalt läsbart ABI:
const abi = [
"function name() view returns (string)",
"function balanceOf(address) view returns (uint256)",
];const abi = [
"function name() view returns (string)",
"function balanceOf(address) view returns (uint256)",
];Skapa en kontraktsinstans
Kombinera adressen, ABI:t och en provider för att skapa ett kontraktsobjekt med endast läsbehörighet:
const contract = new ethers.Contract(
tokenAddress,
abi,
provider
);Eftersom det fick en provider (inte en signer) kan det bara läsa.
const contract = new ethers.Contract(
tokenAddress,
abi,
provider
);Anropa en läsmetod
Anropa valfri view-funktion och invänta resultatet:
const name = await contract.name();
const supply = await contract.totalSupply();
console.log(name, supply);Varje anrop returnerar ett Promise som löses till det avkodade värdet.
const name = await contract.name();
const supply = await contract.totalSupply();
console.log(name, supply);Skicka argument
View-funktioner kan ta parametrar. Skicka dem som vanliga funktionsargument:
const balance = await contract.balanceOf(
"0xUserAddress"
);
console.log(ethers.formatUnits(balance, 18));ethers kodar automatiskt argumenten enligt ABI-typerna.
const balance = await contract.balanceOf(
"0xUserAddress"
);
console.log(ethers.formatUnits(balance, 18));Hantera returnerade tal
Numeriska returvärden är BigInt i ethers v6. Om Ni vill visa tokenbelopp konverterar Ni dem med rätt antal decimaler:
const raw = await contract.balanceOf(user);
const human = ethers.formatUnits(raw, 18);Använd formatUnits/parseUnits för tokens och formatEther/parseEther för ETH (18 decimaler).
const raw = await contract.balanceOf(user);
const human = ethers.formatUnits(raw, 18);Returvärden med flera värden
Om en funktion returnerar flera värden får Ni en resultatarray från ethers som Ni kan destrukturera:
const [reserve0, reserve1, timestamp] =
await pair.getReserves();
console.log(reserve0, reserve1);Namngivna returvärden är också tillgängliga med namn på resultatobjektet.
const [reserve0, reserve1, timestamp] =
await pair.getReserves();
console.log(reserve0, reserve1);Läsning vid ett tidigare block
Ni kan hämta historiskt tillstånd genom att skicka en blocktagg som override:
const oldBalance = await contract.balanceOf(
user,
{ blockTag: 19000000 }
);Detta kräver en archive node, men gör att Ni kan återskapa tidigare tillstånd.
const oldBalance = await contract.balanceOf(
user,
{ blockTag: 19000000 }
);Statiska anrop på skrivfunktioner
Ibland vill Ni simulera en funktion som ändrar tillstånd utan att skicka den, för att läsa det förväntade resultatet eller kontrollera att den inte återställer:
const result = await contract.transfer
.staticCall(to, amount);
console.log("Would return:", result);Anropet körs lokalt utan att någon transaktion sänds.
const result = await contract.transfer
.staticCall(to, amount);
console.log("Would return:", result);Läsningar är kostnadsfria
Eftersom view-anrop körs på noden utan att ändra tillståndet gäller följande:
- De kostar ingen gas för den som anropar.
- De kräver ingen signer eller plånboksgodkännande.
- De returneras nästan omedelbart.
Det är endast tillståndsändringar som kräver en transaktion och gas.
Använda en Hardhat-ansluten instans
I Hardhat-skript kan Ni ansluta till en distribuerad adress utan att skriva ABI:t för hand, eftersom artefakterna redan är kompilerade:
const token = await ethers.getContractAt(
"MyToken",
deployedAddress
);
console.log(await token.totalSupply());ethers läser in ABI:t från artefakten åt Er.
const token = await ethers.getContractAt(
"MyToken",
deployedAddress
);
console.log(await token.totalSupply());Snabbtest
Testa Er förståelse av hur man läser kontraktsdata.
Sammanfattning
Ni har lärt Er att läsa data från blockkedjan.
- Skapa ett kontrakt med adress + ABI + provider för läsbehörighet.
- Anropa view-funktioner som vanliga metoder och invänta resultatet med
await. - Numeriska returvärden är BigInt; konvertera dem med
formatUnits/formatEther. - Destrukturera flera returvärden och hämta historik med
blockTag. - Använd
staticCallför att simulera skrivfunktioner; läsningar är kostnadsfria.
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 ”Läsa kontraktsdata” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Grunderna i Web3- och DApp-utveckling, inklusive ”Läsa kontraktsdata”, 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 ”Läsa kontraktsdata”?
Anropa view-funktioner 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 ”Läsa kontraktsdata”?
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
- Ansluta till en provider
- Läsa kontraktsdata
- Skicka transaktioner
- Lyssna på events