Mit Smart Contracts interagieren
Sie müssen nicht immer Ihren eigenen Smart Contract schreiben und bereitstellen. Meistens möchten Sie als Entwickler mit Smart Contracts interagieren, die andere bereits im Ethereum-Netzwerk bereitgestellt haben.
Diese Seite behandelt die zwei grundlegenden Möglichkeiten, mit einem Smart Contract zu interagieren – das Lesen von Daten und das Schreiben von Daten – sowie die Werkzeuge, die Sie für beides benötigen.
Voraussetzungen
Sie sollten Folgendes verstehen:
- Wie Smart Contracts funktionieren
- Ethereum-Konten und wie sie Transaktionen signieren
- Was eine Transaktion ist
Zwei Möglichkeiten, mit einem Smart Contract zu interagieren
Die Interaktion mit einem Smart Contract fällt in zwei Kategorien:
Aus einem Vertrag lesen
Das Lesen ist eine kostenlose Operation, die keine Transaktion erstellt und keinen Zustand auf der Blockchain ändert.
Wenn Sie aus einem Vertrag lesen, fragen Sie einfach Daten ab, die bereits existieren. Zum Beispiel:
- Überprüfen eines ERC-20-Token-Guthabens
- Lesen des aktuellen Preises von einer dezentralen Börse
- Ermitteln des Besitzers eines NFT
Da Lesezugriffe den Zustand nicht verändern, kosten sie kein Gas und können von jedem durchgeführt werden, ohne ETH zu benötigen.
In einen Vertrag schreiben
Das Schreiben ist eine zustandsändernde Operation, die eine Transaktion erfordert und Gas kostet.
Wenn Sie in einen Vertrag schreiben, lösen Sie eine Funktion aus, die den Blockchain-Zustand ändert. Zum Beispiel:
- Übertragen von Token
- Tauschen von Token an einer dezentralen Börse
- Prägen eines NFT
Das Schreiben erfordert immer:
- Ein externes Konto (Externally Owned Account, EOA) mit genügend ETH für Gas
- Eine Transaktion, die mit dem privaten Schlüssel des Kontos signiert ist
- Dass die Transaktion gemint und in einen Block aufgenommen wird
Mit Kontoabstraktion kann auch ein Smart-Contract-Konto Schreibvorgänge initiieren, und ein Paymaster kann das Gas im Namen des Benutzers übernehmen – ein EOA mit ETH ist also nicht zwingend erforderlich.
Vertrags-ABIs verstehen
Um mit einem Smart Contract zu interagieren, muss Ihre Anwendung wissen, was der Vertrag tun kann. Hier kommt die Application Binary Interface (ABI) ins Spiel.
Eine ABI ist ein JSON-Dokument, das Folgendes beschreibt:
- Jede Funktion, die der Vertrag bereitstellt (Name, Eingaben, Ausgaben)
- Jedes Ereignis, das der Vertrag auslösen kann
- Wie Daten beim Kommunizieren mit dem Vertrag kodiert und dekodiert werden
Stellen Sie sich die ABI als Bedienungsanleitung des Vertrags vor – ohne sie weiß Ihre Anwendung nicht, welche Funktionen existieren oder welche Parameter sie erwarten.
Wo man die ABI eines Vertrags findet
- Verifizierte Verträge auf Etherscan - Etherscan (öffnet in einem neuen Tab) stellt automatisch die ABI für verifizierten Quellcode bereit
- Vom Entwickler - viele Projekte veröffentlichen ihre ABIs in ihrer Dokumentation oder in npm-Paketen
- Aus dem Quellcode generieren - wenn Sie den Solidity-Quellcode haben, können Sie ihn kompilieren, um die ABI zu erstellen
Werkzeuge und Bibliotheken zur Interaktion mit Verträgen
Entwickler verwenden typischerweise eine JavaScript/TypeScript-Bibliothek, um von einer Web-App, einem Backend oder einem Skript aus mit Verträgen zu interagieren.
Client-Bibliotheken (JavaScript/TypeScript)
- Viem (öffnet in einem neuen Tab) - Moderne, leichtgewichtige TypeScript-Schnittstelle für Ethereum mit erstklassiger Typsicherheit
- ethers.js (öffnet in einem neuen Tab) - Praxiserprobte Bibliothek zur Interaktion mit der Ethereum-Blockchain
- Web3.js (öffnet in einem neuen Tab) - Die ursprüngliche Ethereum-JavaScript-API
Backend-Bibliotheken
- ethers.js (öffnet in einem neuen Tab) - Funktioniert auch in Node.js für serverseitige Skripte und Bots
- Web3.py (öffnet in einem neuen Tab) - Python-Bibliothek für die Ethereum-Interaktion
- go-ethereum (öffnet in einem neuen Tab) - Offizielle Go-Bibliothek vom Geth-Team
Beispiel: Lesen eines Token-Guthabens mit Viem
import { createPublicClient, http, formatUnits } from 'viem'
import { mainnet } from 'viem/chains'
// USDC-Vertragsadresse und ABI (teilweise, für balanceOf)
const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
const abi = [{
name: 'balanceOf',
type: 'function',
stateMutability: 'view',
inputs: [{ name: 'account', type: 'address' }],
outputs: [{ name: '', type: 'uint256' }],
}] as const
const client = createPublicClient({ chain: mainnet, transport: http() })
const balance = await client.readContract({
address: USDC,
abi,
functionName: 'balanceOf',
args: ['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'], // vitalik.eth
})
console.log(formatUnits(balance, 6)) // USDC hat 6 Dezimalstellen
Beispiel: Senden einer Transaktion mit ethers.js
const { ethers } = require('ethers')
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL)
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider)
// ERC-20-Transfer-ABI
const abi = ['function transfer(address to, uint256 amount) returns (bool)']
const contract = new ethers.Contract(tokenAddress, abi, wallet)
const tx = await contract.transfer(recipient, ethers.parseUnits('10', 18))
await tx.wait() // Warten, bis die Transaktion gemint wird
console.log(`Transferred! TX: ${tx.hash}`)
Ereignisse und Protokolle
Smart Contracts können Ereignisse auslösen, um zu signalisieren, dass etwas passiert ist. Ihre Anwendung kann auf diese Ereignisse lauschen, um in Echtzeit zu reagieren.
import { createPublicClient, http, parseAbiItem } from 'viem'
import { mainnet } from 'viem/chains'
const client = createPublicClient({ chain: mainnet, transport: http() })
// USDC-Transfer-Ereignisse beobachten
const unwatch = client.watchEvent({
event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'),
onLogs: (logs) => console.log(logs),
})
Transaktionen simulieren
Bevor Sie eine Transaktion senden, können Sie diese simulieren, um zu prüfen, ob sie erfolgreich wäre – und um ihren Rückgabewert zu sehen –, ohne Gas auszugeben. Dies ist nützlich, um Fehler frühzeitig zu erkennen und Ergebnisse im Voraus zu betrachten.
Die meisten Client-Bibliotheken unterstützen dies durch eth_call:
// Mit Viem
const result = await client.simulateContract({
address: contractAddress,
abi,
functionName: 'swap',
args: [amountIn],
account: userAddress,
})
Wallets und Signieren
In einer dezentralen Anwendung (Dapp) übernimmt die Wallet des Benutzers (wie MetaMask, Rainbow oder WalletConnect) das Signieren. Sie verwalten private Schlüssel nicht direkt.
Wallet-Bibliotheken und Verbindungstools abstrahieren dies, sodass Sie sich auf die Entwicklung Ihrer Anwendungslogik konzentrieren können.
Verwandte Tutorials
- Aufrufen eines Smart Contracts aus JavaScript
- Senden von Transaktionen mit Web3.js und Alchemy
- So zeigen Sie Ihr NFT in Ihrer Wallet an
Weiterführende Literatur
- Viem-Dokumentation: Lesen und Schreiben in Verträge (öffnet in einem neuen Tab)
- ethers.js-Dokumentation: Verträge (öffnet in einem neuen Tab)
- Solidity-ABI-Spezifikation (öffnet in einem neuen Tab)
- Was ist eine ABI? - Alchemy (öffnet in einem neuen Tab)