+```
+
+Jetzt sind wir bereit, unseren Alchemy Web3-Endpunkt in unserer Dapp einzurichten! Kehren wir zu unserer `interact.js` zurück, die in unserem `util`-Ordner verschachtelt ist, und fügen Sie den folgenden Code am Anfang der Datei hinzu:
+
+```javascript
+// interact.js
+
+require("dotenv").config()
+const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(alchemyKey)
+
+//export const helloWorldContract;
+```
+
+Oben haben wir zuerst den Alchemy-Schlüssel aus unserer `.env`-Datei importiert und dann unseren `alchemyKey` an `createAlchemyWeb3` übergeben, um unseren Alchemy Web3-Endpunkt einzurichten.
+
+Mit diesem Endpunkt sind wir bereit, unseren Smart Contract zu laden!
+
+#### Ihren Hello World Smart Contract laden {#loading-your-hello-world-smart-contract}
+
+Um Ihren Hallo-Welt-Smart-Contract zu laden, benötigen Sie seine Vertragsadresse und ABI, die beide auf Etherscan zu finden sind, wenn Sie [Teil 3 dieses Tutorials abgeschlossen haben.](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan)
+
+#### Wie Sie Ihre Vertrags-ABI von Etherscan erhalten {#how-to-get-your-contract-abi-from-etherscan}
+
+Wenn Sie Teil 3 dieses Tutorials übersprungen haben, können Sie den HelloWorld-Vertrag mit der Adresse [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code) verwenden. Seine ABI finden Sie [hier](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code).
+
+Eine Vertrags-ABI ist notwendig, um festzulegen, welche Funktion ein Vertrag aufrufen wird, sowie um sicherzustellen, dass die Funktion Daten im erwarteten Format zurückgibt. Sobald wir unsere Vertrags-ABI kopiert haben, speichern wir sie als JSON-Datei namens `contract-abi.json` in Ihrem `src`-Verzeichnis.
+
+Ihre contract-abi.json sollte in Ihrem src-Ordner gespeichert sein.
+
+Bewaffnet mit unserer Vertragsadresse, ABI und dem Alchemy Web3-Endpunkt, können wir die [contract-Methode](https://docs.web3js.org/api/web3-eth-contract/class/Contract) verwenden, um eine Instanz unseres Smart Contracts zu laden. Importieren Sie Ihre Vertrags-ABI in die `interact.js`-Datei und fügen Sie Ihre Vertragsadresse hinzu.
+
+```javascript
+// interact.js
+
+const contractABI = require("../contract-abi.json")
+const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A"
+```
+
+Wir können nun endlich unsere `helloWorldContract`-Variable entkommentieren und den Smart Contract mit unserem AlchemyWeb3-Endpunkt laden:
+
+```javascript
+// interact.js
+export const helloWorldContract = new web3.eth.Contract(
+ contractABI,
+ contractAddress
+)
+```
+
+Zusammenfassend sollten die ersten 12 Zeilen Ihrer `interact.js` jetzt so aussehen:
+
+```javascript
+// interact.js
+
+require("dotenv").config()
+const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(alchemyKey)
+
+const contractABI = require("../contract-abi.json")
+const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A"
+
+export const helloWorldContract = new web3.eth.Contract(
+ contractABI,
+ contractAddress
+)
+```
+
+Jetzt, da wir unseren Vertrag geladen haben, können wir unsere `loadCurrentMessage`-Funktion implementieren!
+
+#### Implementierung von `loadCurrentMessage` in Ihrer `interact.js`-Datei {#implementing-loadCurrentMessage-in-your-interact-js-file}
+
+Diese Funktion ist super einfach. Wir werden einen einfachen asynchronen web3-Aufruf machen, um aus unserem Vertrag zu lesen. Unsere Funktion wird die im Smart Contract gespeicherte Nachricht zurückgeben:
+
+Aktualisieren Sie die `loadCurrentMessage` in Ihrer `interact.js`-Datei auf Folgendes:
+
+```javascript
+// interact.js
+
+export const loadCurrentMessage = async () => {
+ const message = await helloWorldContract.methods.message().call()
+ return message
+}
+```
+
+Da wir diesen Smart Contract in unserer Benutzeroberfläche anzeigen möchten, aktualisieren wir die `useEffect`-Funktion in unserer `HelloWorld.js`-Komponente auf Folgendes:
+
+```javascript
+// HelloWorld.js
+
+//wird nur einmal aufgerufen
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+}, [])
+```
+
+Beachten Sie, dass wir `loadCurrentMessage` nur einmal während des ersten Renderns der Komponente aufrufen wollen. Wir werden bald `addSmartContractListener` implementieren, um die Benutzeroberfläche automatisch zu aktualisieren, nachdem sich die Nachricht im Smart Contract geändert hat.
+
+Bevor wir uns mit unserem Listener befassen, schauen wir uns an, was wir bisher haben! Speichern Sie Ihre `HelloWorld.js`- und `interact.js`-Dateien und gehen Sie dann zu [http://localhost:3000/](http://localhost:3000/)
+
+Sie werden feststellen, dass die aktuelle Nachricht nicht mehr „Keine Verbindung zum Netzwerk“ lautet. Stattdessen spiegelt sie die im Smart Contract gespeicherte Nachricht wider. Klasse!
+
+#### Ihre Benutzeroberfläche sollte jetzt die im Smart Contract gespeicherte Nachricht widerspiegeln {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract}
+
+Apropos Listener...
+
+#### Implementieren Sie `addSmartContractListener` {#implement-addsmartcontractlistener}
+
+Wenn Sie an die `HelloWorld.sol`-Datei zurückdenken, die wir in [Teil 1 dieser Tutorial-Reihe](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract) geschrieben haben, werden Sie sich daran erinnern, dass es ein Smart-Contract-Ereignis namens `UpdatedMessages` gibt, das ausgegeben wird, nachdem die `update`-Funktion unseres Smart Contracts aufgerufen wurde (siehe Zeilen 9 und 27):
+
+```javascript
+// HelloWorld.sol
+
+// Gibt die Version von Solidity an, unter Verwendung von semantischer Versionierung.
+// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity ^0.7.3;
+
+// Definiert einen Vertrag namens `HelloWorld`.
+// Ein Vertrag ist eine Sammlung von Funktionen und Daten (seinem Zustand). Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse auf der Ethereum-Blockchain. Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ //Wird ausgegeben, wenn die update-Funktion aufgerufen wird
+ //Smart-Contract-Ereignisse sind eine Möglichkeit für Ihren Vertrag, Ihrer App-Frontend mitzuteilen, dass auf der Blockchain etwas passiert ist. Das Frontend kann auf bestimmte Ereignisse „hören“ und bei deren Eintreten Maßnahmen ergreifen.
+ event UpdatedMessages(string oldStr, string newStr);
+
+ // Deklariert eine Zustandsvariable `message` vom Typ `string`.
+ // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher gespeichert werden. Das Schlüsselwort `public` macht Variablen von außerhalb eines Vertrags zugänglich und erstellt eine Funktion, die andere Verträge oder Clients aufrufen können, um auf den Wert zuzugreifen.
+ string public message;
+
+ // Ähnlich wie in vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor eine spezielle Funktion, die nur bei der Erstellung des Vertrags ausgeführt wird.
+ // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. Mehr erfahren:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Akzeptiert ein String-Argument `initMessage` und setzt den Wert in die Speichervariable `message` des Vertrags).
+ message = initMessage;
+ }
+
+ // Eine öffentliche Funktion, die ein String-Argument akzeptiert und die Speichervariable `message` aktualisiert.
+ function update(string memory newMessage) public {
+ string memory oldMsg = message;
+ message = newMessage;
+ emit UpdatedMessages(oldMsg, newMessage);
+ }
+}
+```
+
+Smart-Contract-Ereignisse sind eine Möglichkeit für Ihren Vertrag, Ihrer Frontend-Anwendung mitzuteilen, dass auf der Blockchain etwas passiert ist (d. h. es gab ein _Ereignis_), die auf bestimmte Ereignisse „hören“ und bei deren Eintreten Maßnahmen ergreifen kann.
+
+Die `addSmartContractListener`-Funktion wird speziell auf das `UpdatedMessages`-Ereignis unseres Hallo-Welt-Smart-Contracts lauschen und unsere Benutzeroberfläche aktualisieren, um die neue Nachricht anzuzeigen.
+
+Ändern Sie `addSmartContractListener` in Folgendes:
+
+```javascript
+// HelloWorld.js
+
+function addSmartContractListener() {
+ helloWorldContract.events.UpdatedMessages({}, (error, data) => {
+ if (error) {
+ setStatus("😥 " + error.message)
+ } else {
+ setMessage(data.returnValues[1])
+ setNewMessage("")
+ setStatus("🎉 Ihre Nachricht wurde aktualisiert!")
+ }
+ })
+}
+```
+
+Lassen Sie uns aufschlüsseln, was passiert, wenn der Listener ein Ereignis erkennt:
+
+- Wenn ein Fehler auftritt, wenn das Ereignis ausgegeben wird, wird dies in der Benutzeroberfläche über unsere `status`-Zustandsvariable angezeigt.
+- Andernfalls verwenden wir das zurückgegebene `data`-Objekt. Das `data.returnValues` ist ein bei Null indiziertes Array, bei dem das erste Element im Array die vorherige Nachricht und das zweite Element die aktualisierte speichert. Insgesamt werden wir bei einem erfolgreichen Ereignis unseren `message`-String auf die aktualisierte Nachricht setzen, den `newMessage`-String leeren und unsere `status`-Zustandsvariable aktualisieren, um anzuzeigen, dass eine neue Nachricht in unserem Smart Contract veröffentlicht wurde.
+
+Schließlich rufen wir unseren Listener in unserer `useEffect`-Funktion auf, damit er beim ersten Rendern der `HelloWorld.js`-Komponente initialisiert wird. Insgesamt sollte Ihre `useEffect`-Funktion so aussehen:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+}, [])
+```
+
+Jetzt, da wir in der Lage sind, aus unserem Smart Contract zu lesen, wäre es großartig herauszufinden, wie wir auch in ihn schreiben können! Um jedoch in unsere Dapp zu schreiben, müssen wir zuerst eine Ethereum-Wallet damit verbunden haben.
+
+Als Nächstes werden wir uns also mit der Einrichtung unserer Ethereum-Wallet (MetaMask) befassen und sie dann mit unserer Dapp verbinden!
+
+### Schritt 4: Richten Sie Ihre Ethereum-Wallet ein {#step-4-set-up-your-ethereum-wallet}
+
+Um etwas in die Ethereum-Chain zu schreiben, müssen Benutzer Transaktionen mit den privaten Schlüsseln ihrer virtuellen Wallet signieren. Für dieses Tutorial verwenden wir [MetaMask](https://metamask.io/), eine virtuelle Wallet im Browser, die zur Verwaltung Ihrer Ethereum-Kontoadresse verwendet wird, da sie diese Transaktionssignierung für den Endbenutzer super einfach macht.
+
+Wenn Sie mehr darüber erfahren möchten, wie Transaktionen auf Ethereum funktionieren, sehen Sie sich [diese Seite](/developers/docs/transactions/) der Ethereum Foundation an.
+
+#### MetaMask herunterladen {#download-metamask}
+
+Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder bereits eines haben, stellen Sie sicher, dass Sie oben rechts zum „Goerli Test Network“ wechseln (damit wir nicht mit echtem Geld arbeiten).
+
+#### Ether aus einem Faucet hinzufügen {#add-ether-from-a-faucet}
+
+Um eine Transaktion auf der Ethereum-Blockchain zu signieren, benötigen wir einige gefälschte Eth. Um Eth zu erhalten, können Sie zu [FaucETH](https://fauceth.komputing.org) gehen und Ihre Goerli-Kontoadresse eingeben, auf „Geld anfordern“ klicken, dann im Dropdown-Menü „Ethereum Testnet Goerli“ auswählen und schließlich erneut auf die Schaltfläche „Geld anfordern“ klicken. Kurz darauf solltest du ETH in deinem MetaMask-Konto sehen!
+
+#### Überprüfen Sie Ihr Guthaben {#check-your-balance}
+
+Um zu überprüfen, ob unser Guthaben vorhanden ist, machen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Dies gibt den Betrag an ETH in unserer Wallet zurück. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten:
+
+```text
+{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
+```
+
+**HINWEIS:** Dieses Ergebnis ist in Wei, nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei in ETH ist: 1 ETH = 10¹⁸ Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl umwandeln, erhalten wir 1\*10¹⁸, was 1 ETH entspricht.
+
+Puh! Unser Falschgeld ist da! 🤑
+
+### Schritt 5: MetaMask mit Ihrer Benutzeroberfläche verbinden {#step-5-connect-metamask-to-your-UI}
+
+Nachdem unsere MetaMask-Wallet nun eingerichtet ist, verbinden wir unsere Dapp damit!
+
+#### Die `connectWallet`-Funktion {#the-connectWallet-function}
+
+In unserer `interact.js`-Datei implementieren wir die `connectWallet`-Funktion, die wir dann in unserer `HelloWorld.js`-Komponente aufrufen können.
+
+Lassen Sie uns `connectWallet` wie folgt ändern:
+
+```javascript
+// interact.js
+
+export const connectWallet = async () => {
+ if (window.ethereum) {
+ try {
+ const addressArray = await window.ethereum.request({
+ method: "eth_requestAccounts",
+ })
+ const obj = {
+ status: "👆🏽 Schreiben Sie eine Nachricht in das Textfeld oben.",
+ address: addressArray[0],
+ }
+ return obj
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Sie müssen MetaMask, eine virtuelle Ethereum-Wallet, in Ihrem
+ Browser installieren.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Also, was macht dieser riesige Codeblock genau?
+
+Zuerst prüft er, ob `window.ethereum` in Ihrem Browser aktiviert ist.
+
+`window.ethereum` ist eine globale API, die von MetaMask und anderen Wallet-Anbietern eingeschleust wird und es Websites ermöglicht, die Ethereum-Konten von Benutzern anzufordern. Wenn genehmigt, kann es Daten von den Blockchains lesen, mit denen der Benutzer verbunden ist, und dem Benutzer vorschlagen, Nachrichten und Transaktionen zu signieren. Weitere Informationen findest du in der [MetaMask-Dokumentation](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)!
+
+Wenn `window.ethereum` _nicht_ vorhanden ist, bedeutet das, dass MetaMask nicht installiert ist. Dies führt dazu, dass ein JSON-Objekt zurückgegeben wird, bei dem die zurückgegebene `address` eine leere Zeichenfolge ist und das `status`-JSX-Objekt meldet, dass der Benutzer MetaMask installieren muss.
+
+Wenn `window.ethereum` jedoch vorhanden _ist_, dann wird es interessant.
+
+Mithilfe einer try/catch-Schleife versuchen wir, eine Verbindung zu MetaMask herzustellen, indem wir [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts) aufrufen. Der Aufruf dieser Funktion öffnet MetaMask im Browser, woraufhin der Benutzer aufgefordert wird, seine Wallet mit deiner Dapp zu verbinden.
+
+- Wenn der Benutzer sich entscheidet, eine Verbindung herzustellen, gibt `method: "eth_requestAccounts"` ein Array zurück, das alle Konto-Adressen des Benutzers enthält, die mit der Dapp verbunden sind. Insgesamt gibt unsere `connectWallet`-Funktion ein JSON-Objekt zurück, das die _erste_ `address` in diesem Array (siehe Zeile 9) und eine `status`-Nachricht enthält, die den Benutzer auffordert, eine Nachricht an den Smart Contract zu schreiben.
+- Wenn der Benutzer die Verbindung ablehnt, enthält das JSON-Objekt eine leere Zeichenfolge für die zurückgegebene `address` und eine `status`-Nachricht, die widerspiegelt, dass der Benutzer die Verbindung abgelehnt hat.
+
+Nachdem wir diese `connectWallet`-Funktion geschrieben haben, ist der nächste Schritt, sie in unserer `HelloWorld.js`-Komponente aufzurufen.
+
+#### Die `connectWallet`-Funktion zu Ihrer `HelloWorld.js`-UI-Komponente hinzufügen {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component}
+
+Navigieren Sie zur `connectWalletPressed`-Funktion in `HelloWorld.js` und aktualisieren Sie sie wie folgt:
+
+```javascript
+// HelloWorld.js
+
+const connectWalletPressed = async () => {
+ const walletResponse = await connectWallet()
+ setStatus(walletResponse.status)
+ setWallet(walletResponse.address)
+}
+```
+
+Beachten Sie, wie der größte Teil unserer Funktionalität von unserer `HelloWorld.js`-Komponente aus der `interact.js`-Datei abstrahiert wird? Dies geschieht, damit wir dem M-V-C-Paradigma entsprechen!
+
+In `connectWalletPressed` machen wir einfach einen Await-Aufruf an unsere importierte `connectWallet`-Funktion, und mit ihrer Antwort aktualisieren wir unsere `status`- und `walletAddress`-Variablen über ihre State-Hooks.
+
+Lassen Sie uns nun beide Dateien (`HelloWorld.js` und `interact.js`) speichern und unsere bisherige Benutzeroberfläche testen.
+
+Öffnen Sie Ihren Browser auf der Seite [http://localhost:3000/](http://localhost:3000/) und drücken Sie die Schaltfläche „Wallet verbinden“ oben rechts auf der Seite.
+
+Wenn du MetaMask installiert hast, solltest du aufgefordert werden, deine Wallet mit deiner Dapp zu verbinden. Akzeptiere die Aufforderung, eine Verbindung herzustellen.
+
+Sie sollten sehen, dass die Wallet-Schaltfläche nun anzeigt, dass Ihre Adresse verbunden ist! Jaaaaa 🔥
+
+Als Nächstes versuche, die Seite neu zu laden ... Das ist seltsam. Unsere Wallet-Schaltfläche fordert uns auf, MetaMask zu verbinden, obwohl es bereits verbunden ist ...
+
+Aber keine Angst! Wir können das leicht adressieren (verstanden?) indem wir `getCurrentWalletConnected` implementieren, das prüft, ob eine Adresse bereits mit unserer Dapp verbunden ist, und unsere Benutzeroberfläche entsprechend aktualisiert!
+
+#### Die `getCurrentWalletConnected`-Funktion {#the-getcurrentwalletconnected-function}
+
+Aktualisieren Sie Ihre `getCurrentWalletConnected`-Funktion in der `interact.js`-Datei wie folgt:
+
+```javascript
+// interact.js
+
+export const getCurrentWalletConnected = async () => {
+ if (window.ethereum) {
+ try {
+ const addressArray = await window.ethereum.request({
+ method: "eth_accounts",
+ })
+ if (addressArray.length > 0) {
+ return {
+ address: addressArray[0],
+ status: "👆🏽 Schreiben Sie eine Nachricht in das Textfeld oben.",
+ }
+ } else {
+ return {
+ address: "",
+ status: "🦊 Verbinden Sie sich mit MetaMask über die Schaltfläche oben rechts.",
+ }
+ }
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Sie müssen MetaMask, eine virtuelle Ethereum-Wallet, in Ihrem
+ Browser installieren.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Dieser Code ist _sehr_ ähnlich der `connectWallet`-Funktion, die wir gerade im vorherigen Schritt geschrieben haben.
+
+Der Hauptunterschied besteht darin, dass wir anstelle der Methode `eth_requestAccounts`, die MetaMask für den Benutzer öffnet, um seine Wallet zu verbinden, hier die Methode `eth_accounts` aufrufen, die einfach ein Array zurückgibt, das die MetaMask-Adressen enthält, die derzeit mit unserer Dapp verbunden sind.
+
+Um diese Funktion in Aktion zu sehen, rufen wir sie in unserer `useEffect`-Funktion unserer `HelloWorld.js`-Komponente auf:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+}, [])
+```
+
+Beachte, dass wir die Antwort unseres Aufrufs an `getCurrentWalletConnected` verwenden, um unsere `walletAddress`- und `status`-Zustandsvariablen zu aktualisieren.
+
+Nachdem Sie diesen Code hinzugefügt haben, versuchen wir, unser Browserfenster zu aktualisieren.
+
+Nett! Die Schaltfläche sollte anzeigen, dass du verbunden bist, und eine Vorschau der Adresse deiner verbundenen Wallet anzeigen – auch nach dem Aktualisieren!
+
+#### Implementieren Sie `addWalletListener` {#implement-addwalletlistener}
+
+Der letzte Schritt in der Einrichtung unserer Dapp-Wallet ist die Implementierung des Wallet-Listeners, damit unsere Benutzeroberfläche aktualisiert wird, wenn sich der Zustand unserer Wallet ändert, z. B. wenn der Benutzer die Verbindung trennt oder das Konto wechselt.
+
+Ändern Sie in Ihrer `HelloWorld.js`-Datei Ihre `addWalletListener`-Funktion wie folgt:
+
+```javascript
+// HelloWorld.js
+
+function addWalletListener() {
+ if (window.ethereum) {
+ window.ethereum.on("accountsChanged", (accounts) => {
+ if (accounts.length > 0) {
+ setWallet(accounts[0])
+ setStatus("👆🏽 Schreiben Sie eine Nachricht in das Textfeld oben.")
+ } else {
+ setWallet("")
+ setStatus("🦊 Verbinden Sie sich mit MetaMask über die Schaltfläche oben rechts.")
+ }
+ })
+ } else {
+ setStatus(
+
+ {" "}
+ 🦊
+ Sie müssen MetaMask, eine virtuelle Ethereum-Wallet, in Ihrem Browser installieren.
+
+
+ )
+ }
+}
+```
+
+Ich wette, Sie brauchen an dieser Stelle nicht einmal mehr unsere Hilfe, um zu verstehen, was hier vor sich geht, aber aus Gründen der Vollständigkeit, lassen Sie es uns schnell aufschlüsseln:
+
+- Zuerst prüft unsere Funktion, ob `window.ethereum` aktiviert ist (d. h. MetaMask ist installiert).
+ - Wenn nicht, setzen wir einfach unsere `status`-Zustandsvariable auf eine JSX-Zeichenfolge, die den Benutzer auffordert, MetaMask zu installieren.
+ - Wenn es aktiviert ist, richten wir den Listener `window.ethereum.on("accountsChanged")` in Zeile 3 ein, der auf Zustandsänderungen in der MetaMask-Wallet lauscht. Dazu gehören, wenn der Benutzer ein zusätzliches Konto mit der Dapp verbindet, Konten wechselt oder ein Konto trennt. Wenn mindestens ein Konto verbunden ist, wird die Zustandsvariable `walletAddress` als das erste Konto im `accounts`-Array aktualisiert, das vom Listener zurückgegeben wird. Andernfalls wird `walletAddress` als leere Zeichenfolge festgelegt.
+
+Zu guter Letzt müssen wir sie in unserer `useEffect`-Funktion aufrufen:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+
+ addWalletListener()
+}, [])
+```
+
+Und das war's! Wir haben erfolgreich die gesamte Funktionalität unserer Wallet programmiert! Jetzt zu unserer letzten Aufgabe: die im Smart Contract gespeicherte Nachricht aktualisieren!
+
+### Schritt 6: Implementieren der `updateMessage`-Funktion {#step-6-implement-the-updateMessage-function}
+
+Also gut, Leute, wir sind auf der Zielgeraden! In `updateMessage` Ihrer `interact.js`-Datei werden wir Folgendes tun:
+
+1. Sicherstellen, dass die Nachricht, die wir in unserem Smart Contact veröffentlichen möchten, gültig ist
+2. Unsere Transaktion mit MetaMask signieren
+3. Diese Funktion aus unserer `HelloWorld.js`-Frontend-Komponente aufrufen
+
+Das wird nicht lange dauern; lassen Sie uns diese Dapp fertigstellen!
+
+#### Fehlerbehandlung bei der Eingabe {#input-error-handling}
+
+Natürlich ist es sinnvoll, am Anfang der Funktion eine Art Eingabefehlerbehandlung zu haben.
+
+Wir möchten, dass unsere Funktion frühzeitig zurückkehrt, wenn keine MetaMask-Erweiterung installiert ist, keine Wallet verbunden ist (d. h. die übergebene `address` ein leerer String ist) oder die `message` ein leerer String ist. Fügen wir die folgende Fehlerbehandlung zu `updateMessage` hinzu:
+
+```javascript
+// interact.js
+
+export const updateMessage = async (address, message) => {
+ if (!window.ethereum || address === null) {
+ return {
+ status:
+ "💡 Verbinden Sie Ihre MetaMask-Wallet, um die Nachricht auf der Blockchain zu aktualisieren.",
+ }
+ }
+
+ if (message.trim() === "") {
+ return {
+ status: "❌ Ihre Nachricht darf kein leerer String sein.",
+ }
+ }
+}
+```
+
+Jetzt, da wir eine ordnungsgemäße Eingabefehlerbehandlung haben, ist es Zeit, die Transaktion über MetaMask zu signieren!
+
+#### Unsere Transaktion signieren {#signing-our-transaction}
+
+Wenn Sie bereits mit traditionellen Web3-Ethereum-Transaktionen vertraut sind, wird Ihnen der Code, den wir als Nächstes schreiben, sehr bekannt vorkommen. Fügen Sie unterhalb Ihres Eingabefehlerbehandlungscodes Folgendes zu `updateMessage` hinzu:
+
+```javascript
+// interact.js
+
+//Transaktionsparameter einrichten
+const transactionParameters = {
+ to: contractAddress, // Erforderlich, außer bei der Veröffentlichung von Verträgen.
+ from: address, // muss mit der aktiven Adresse des Benutzers übereinstimmen.
+ data: helloWorldContract.methods.update(message).encodeABI(),
+}
+
+// Transaktion signieren
+try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ status: (
+
+ ✅{" "}
+
+ Sehen Sie sich den Status Ihrer Transaktion auf Etherscan an!
+
+
+ ℹ️ Sobald die Transaktion vom Netzwerk verifiziert ist, wird die Nachricht
+ automatisch aktualisiert.
+
+ ),
+ }
+} catch (error) {
+ return {
+ status: "😥 " + error.message,
+ }
+}
+```
+
+Schauen wir uns an, was hier passiert. Zuerst richten wir unsere Transaktionsparameter ein, wobei:
+
+- `to` gibt die Empfängeradresse an (unser Smart Contract)
+- `from` gibt den Unterzeichner der Transaktion an, die `address`-Variable, die wir in unsere Funktion übergeben haben
+- `data` enthält den Aufruf der `update`-Methode unseres Hallo-Welt-Smart-Contracts, der unsere `message`-String-Variable als Eingabe erhält
+
+Dann machen wir einen await-Aufruf, `window.ethereum.request`, bei dem wir MetaMask bitten, die Transaktion zu signieren. Beachten Sie, in den Zeilen 11 und 12 geben wir unsere eth-Methode `eth_sendTransaction` an und übergeben unsere `transactionParameters`.
+
+An diesem Punkt öffnet sich MetaMask im Browser und fordert den Benutzer auf, die Transaktion zu signieren oder abzulehnen.
+
+- Wenn die Transaktion erfolgreich ist, gibt die Funktion ein JSON-Objekt zurück, bei dem der `status`-JSX-String den Benutzer auffordert, Etherscan für weitere Informationen zu seiner Transaktion zu besuchen.
+- Wenn die Transaktion fehlschlägt, gibt die Funktion ein JSON-Objekt zurück, bei dem der `status`-String die Fehlermeldung weitergibt.
+
+Insgesamt sollte unsere `updateMessage`-Funktion so aussehen:
+
+```javascript
+// interact.js
+
+export const updateMessage = async (address, message) => {
+ //Eingabefehlerbehandlung
+ if (!window.ethereum || address === null) {
+ return {
+ status:
+ "💡 Verbinden Sie Ihre MetaMask-Wallet, um die Nachricht auf der Blockchain zu aktualisieren.",
+ }
+ }
+
+ if (message.trim() === "") {
+ return {
+ status: "❌ Ihre Nachricht darf kein leerer String sein.",
+ }
+ }
+
+ //Transaktionsparameter einrichten
+ const transactionParameters = {
+ to: contractAddress, // Erforderlich, außer bei der Veröffentlichung von Verträgen.
+ from: address, // muss mit der aktiven Adresse des Benutzers übereinstimmen.
+ data: helloWorldContract.methods.update(message).encodeABI(),
+ }
+
+ // Transaktion signieren
+ try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ status: (
+
+ ✅{" "}
+
+ Sehen Sie sich den Status Ihrer Transaktion auf Etherscan an!
+
+
+ ℹ️ Sobald die Transaktion vom Netzwerk verifiziert ist, wird die Nachricht
+ automatisch aktualisiert.
+
+ ),
+ }
+ } catch (error) {
+ return {
+ status: "😥 " + error.message,
+ }
+ }
+}
+```
+
+Zu guter Letzt müssen wir unsere `updateMessage`-Funktion mit unserer `HelloWorld.js`-Komponente verbinden.
+
+#### Verbinden Sie `updateMessage` mit dem `HelloWorld.js`-Frontend {#connect-updatemessage-to-the-helloworld-js-frontend}
+
+Unsere `onUpdatePressed`-Funktion sollte einen await-Aufruf an die importierte `updateMessage`-Funktion machen und die `status`-Zustandsvariable ändern, um anzuzeigen, ob unsere Transaktion erfolgreich war oder fehlgeschlagen ist:
+
+```javascript
+// HelloWorld.js
+
+const onUpdatePressed = async () => {
+ const { status } = await updateMessage(walletAddress, newMessage)
+ setStatus(status)
+}
+```
+
+Es ist super sauber und einfach. Und raten Sie mal... IHRE DAPP IST FERTIG!!!
+
+Probieren Sie die **Aktualisieren**-Schaltfläche aus!
+
+### Erstellen Sie Ihre eigene benutzerdefinierte Dapp {#make-your-own-custom-dapp}
+
+Wooooo, Sie haben es bis zum Ende des Tutorials geschafft! Zusammenfassend haben Sie gelernt, wie Sie:
+
+- Eine MetaMask-Wallet mit Ihrem Dapp-Projekt verbinden
+- Daten aus Ihrem Smart Contract mit der [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) API lesen
+- Ethereum-Transaktionen mit MetaMask signieren
+
+Jetzt sind Sie voll ausgestattet, um die Fähigkeiten aus diesem Tutorial anzuwenden, um Ihr eigenes benutzerdefiniertes Dapp-Projekt zu erstellen! Wie immer, wenn Sie Fragen haben, zögern Sie nicht, uns im [Alchemy Discord](https://discord.gg/gWuC7zB) um Hilfe zu bitten. 🧙♂️
+
+Sobald Sie dieses Tutorial abgeschlossen haben, lassen Sie uns wissen, wie Ihre Erfahrung war oder ob Sie Feedback haben, indem Sie uns auf Twitter [@alchemyplatform](https://twitter.com/AlchemyPlatform) taggen!
diff --git a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md
index 1519d397971..07e9a34ef7d 100644
--- a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md
+++ b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md
@@ -1,68 +1,71 @@
---
-title: Hello World-Smart Contract für Einsteiger
-description: Einführungstutorial zum Schreiben und Installieren eines einfachen Smart Contracts auf Ethereum
+title: "Hello World-Smart Contract für Einsteiger"
+description: "Einführungstutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum."
author: "elanh"
tags:
- - "Solidity"
- - "Hardhat"
- - "Alchemy"
- - "Smart Contracts"
- - "Erste Schritte"
- - "Bereitstellung"
+ [
+ "solidity",
+ "Hardhat",
+ "Alchemy",
+ "intelligente Verträge",
+ "Bereitstellung"
+ ]
skill: beginner
lang: de
published: 2021-03-31
---
-Wenn Sie neu in der Blockchain-Entwicklung sind und nicht wissen, wo Sie anfangen sollen, oder wenn Sie einfach nur verstehen wollen, wie man Smart Contracts einsetzt und mit ihnen interagiert, ist dieser Leitfaden genau das Richtige für Sie. Wir werden die Erstellung und den Einsatz eines einfachen Smart Contracts auf dem Ropsten-Testnet unter Verwendung einer virtuellen Wallet erläutern ([MetaMask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) and [Alchemy](https://alchemyapi.io/eth) (Machen Sie sich keine Sorgen, wenn Sie noch nicht verstehen, was das alles bedeutet. Wir werden es Ihnen erklären).
+Wenn Sie neu in der Blockchain-Entwicklung sind und nicht wissen, wo Sie anfangen sollen, oder wenn Sie einfach nur verstehen wollen, wie man Smart Contracts einsetzt und mit ihnen interagiert, ist dieser Leitfaden genau das Richtige für Sie. Wir werden die Erstellung und Bereitstellung eines einfachen Smart Contracts im Sepolia-Testnetz durchgehen. Dabei verwenden wir eine virtuelle Wallet ([MetaMask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) und [Alchemy](https://www.alchemy.com/eth) (keine Sorge, falls Sie noch nicht verstehen, was das alles bedeutet – wir werden es erklären).
-Im zweiten Teil dieses Tutorials werden wir erläutern, wie wir mit unserem Smart Contract interagieren können, sobald er bereitgestellt wurde. Im dritten Teil erläutern wir dann, wie er auf Etherscan veröffentlicht wird.
+In [Teil 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) dieses Tutorials gehen wir durch, wie wir mit unserem Smart Contract interagieren können, sobald er bereitgestellt wurde. In [Teil 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) behandeln wir dann, wie man ihn auf Etherscan veröffentlicht.
-Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, dann können Sie sich im [Alchemy Discord](https://discord.gg/gWuC7zB) melden.
+Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, können Sie sich gerne im [Alchemy Discord](https://discord.gg/gWuC7zB) melden!
-## Schritt 1: Verbindung mit dem Ethereum-Netzwerk {#step-1}
+## Schritt 1: Mit dem Ethereum-Netzwerk verbinden {#step-1}
-Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Chain zu stellen. Der Einfachheit halber verwenden wir ein kostenloses Konto bei Alchemy, eine Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne dass wir unseren eigenen Node betreiben müssen. Die Plattform verfügt auch über Entwickler-Tools für die Überwachung und Analyse, die wir in diesem Tutorial nutzen werden, um zu verstehen, was unter der Haube der Smart-Contract-Bereitstellung vor sich geht. Wenn Sie noch kein Alchemy-Konto haben, [können Sie sich hier kostenlos anmelden](https://dashboard.alchemyapi.io/signup).
+Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Chain zu stellen. Der Einfachheit halber verwenden wir ein kostenloses Konto bei Alchemy, eine Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne dass wir unsere eigenen Nodes betreiben müssen. Die Plattform verfügt auch über Entwickler-Tools für die Überwachung und Analyse, die wir in diesem Tutorial nutzen werden, um zu verstehen, was bei der Bereitstellung unseres Smart Contracts „unter der Haube“ passiert. Wenn Sie noch kein Alchemy-Konto haben, [können Sie sich hier kostenlos registrieren](https://dashboard.alchemy.com/signup).
-## Schritt 2: Anwendung (und den API-Schlüssel) erstellen {#step-2}
+## Schritt 2: Ihre App (und den API-Schlüssel) erstellen {#step-2}
-Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Darüber können wir Anfragen an das Ropsten-Testnet stellen. Wenn Sie mit Testnets nicht vertraut sind, lesen Sie [diese Seite](/developers/docs/networks/).
+Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Dies ermöglicht es uns, Anfragen an das Sepolia-Testnet zu senden. Wenn Sie mit Testnets nicht vertraut sind, sehen Sie sich [diese Seite](/developers/docs/networks/) an.
-1. Klicken Sie in Ihrem Alchemy-Dashboard in der Navigationsleiste unter "Apps" auf "Create App" (App erstellen), um auf die Seite "Create App" (App erstellen) zu gelangen.
+1. Navigieren Sie in Ihrem Alchemy-Dashboard zur Seite „Create new app“, indem Sie in der Navigationsleiste „Select an app“ auswählen und dann auf „Create new app“ klicken.
-
+
-2. Nennen Sie Ihre App "Hello World", geben Sie eine kurze Beschreibung an, wählen Sie "Staging" für die Umgebung (die für die Buchhaltung Ihrer App verwendet wird) und wählen Sie "Ropsten" als Netzwerk.
+2. Geben Sie Ihrer App den Namen „Hello World“, fügen Sie eine kurze Beschreibung hinzu und wählen Sie einen Anwendungsfall aus, z. B. „Infra & Tooling“. Suchen Sie als Nächstes nach „Ethereum“ und wählen Sie das Netzwerk aus.
-
+
-3. Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen.
+3. Klicken Sie zum Fortfahren auf „Next“, dann auf „Create app“ und das war's schon! Ihre App sollte im Dropdown-Menü der Navigationsleiste erscheinen, und ein API-Schlüssel steht zum Kopieren bereit.
## Schritt 3: Ethereum-Konto (Adresse) erstellen {#step-3}
-Wir benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Weitere Informationen zu [Transaktionen](/developers/docs/transactions/).
+Zum Versenden und Empfangen von Transaktionen benötigen Sie ein Ethereum-Konto. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Mehr zu [Transaktionen](/developers/docs/transactions/).
-Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie sicher, dass Sie oben rechts zum "Ropsten-Testnet" wechseln (damit wir nicht mit echtem Geld arbeiten).
+Sie können MetaMask herunterladen und [hier](https://metamask.io/download) kostenlos ein Ethereum-Konto erstellen. Wenn Sie ein Konto erstellen oder bereits eines haben, wechseln Sie über das Netzwerk-Dropdown-Menü unbedingt zum Testnetz „Sepolia“ (damit wir nicht mit echtem Geld arbeiten).
-
+Wenn Sepolia nicht aufgeführt ist, gehen Sie in das Menü, dann auf „Advanced“ und scrollen Sie nach unten, um „Show test networks“ zu aktivieren. Wählen Sie im Netzwerkauswahlmenü die Registerkarte „Custom“, um eine Liste von Testnets zu finden, und wählen Sie „Sepolia“ aus.
+
+
## Schritt 4: Ether von einem Faucet hinzufügen {#step-4}
-Um unseren Smart Contract im Testnet einzusetzen, benötigen wir einige Fake-ETH. Um ETH zu erhalten, können Sie auf den [Ropsten Faucet](https://faucet.dimensions.network/) gehen und Ihre Ropsten-Kontoadresse eingeben. Klicken Sie dann auf "Ropsten-ETH senden". Aufgrund des Netzwerkverkehrs kann es einige Zeit dauern, bis Sie Ihre Fake-ETH erhalten. Sie sollten kurz darauf ETH auf Ihrem MetaMask-Konto sehen.
+Um unseren Smart Contract im Testnetz bereitzustellen, benötigen wir etwas „Fake-ETH“. Um Sepolia-ETH zu erhalten, können Sie zu den [Details des Sepolia-Netzwerks](/developers/docs/networks/#sepolia) gehen, um eine Liste verschiedener Faucets anzuzeigen. Wenn einer nicht funktioniert, versuchen Sie einen anderen, da sie manchmal leer sein können. Aufgrund des Netzwerkverkehrs kann es einige Zeit dauern, bis Sie Ihre Fake-ETH erhalten. Sie sollten kurz darauf ETH auf Ihrem MetaMask-Konto sehen!
-## Schritt 5: Guthaben prüfen {#step-5}
+## Schritt 5: Ihr Guthaben überprüfen {#step-5}
-Um unser Guthaben zu überprüfen, müssen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [dem Composer-Tool von Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) stellen. Dadurch wird der Betrag der ETH in unsere Wallet zurückgegeben. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf "Anfrage senden" geklickt haben, sollten Sie eine Antwort wie diese erhalten:
+Um zu überprüfen, ob unser Guthaben vorhanden ist, stellen wir eine [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest). Das gibt den ETH-Betrag in unserem Wallet wieder. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten:
```json
{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
```
-> **HINWEIS:** Dieses Ergebnis ist in Wei und nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei auf ETH ist: 1 ETH = 1018 Wei. Wenn wir also 0x2B5E3AF16B1880000 in eine Dezimalzahl konvertieren, bekommen wir 5\*10¹⁸. Das entspricht 5 ETH.
+> **HINWEIS:** Dieses Ergebnis ist in Wei und nicht in ETH angegeben. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei in ETH lautet: 1 ETH = 1018 Wei. Wenn wir also 0x2B5E3AF16B1880000 in eine Dezimalzahl umwandeln, erhalten wir 5\*10¹⁸, was 5 ETH entspricht.
>
-> Puh! Unser Falschgeld ist da .
+> Puh! Unser Fake-Geld ist da .
-## Schritt 6: Projekt initialisieren {#step-6}
+## Schritt 6: Unser Projekt initialisieren {#step-6}
Zunächst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zur Befehlszeile und geben Sie Folgendes ein:
@@ -71,24 +74,24 @@ mkdir hello-world
cd hello-world
```
-Wir befinden uns nun in unserem Projektordner. Mit `npm init` starten wir das Projekt. Wenn Sie npm noch nicht installiert haben, befolgen Sie [diese Anleitung](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir brauchen auch Node.js, also laden Sie das auch herunter).
+Da wir uns nun in unserem Projektordner befinden, verwenden wir `npm init`, um das Projekt zu initialisieren. Wenn Sie npm noch nicht installiert haben, folgen Sie [dieser Anleitung](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir benötigen auch Node.js, also laden Sie das auch herunter!).
```
npm init
```
-Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten. Wir haben es folgendermaßen gemacht:
+Es spielt keine große Rolle, wie Sie die Installationsfragen beantworten. Zu Ihrer Orientierung zeigen wir Ihnen, wie wir es gemacht haben:
```
-package name: (hello-world)
-version: (1.0.0)
-description: hello world smart contract
-entry point: (index.js)
-test command:
-git repository:
-keywords:
-author:
-license: (ISC)
+Paketname: (hello-world)
+Version: (1.0.0)
+Beschreibung: hello world smart contract
+Einstiegspunkt: (index.js)
+Testbefehl:
+Git-Repository:
+Schlüsselwörter:
+Autor:
+Lizenz: (ISC)
About to write to /Users/.../.../.../hello-world/package.json:
{
@@ -104,29 +107,29 @@ About to write to /Users/.../.../.../hello-world/package.json:
}
```
-Genehmigen Sie die package.json und es kann losgehen.
+Bestätigen Sie die package.json und schon kann es losgehen!
-## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview){#step-7} installieren
+## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview) herunterladen {#step-7}
-Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern bei der lokalen Erstellung von Smart Contracts und dApps, bevor diese auf der Live-Chain bereitgestellt werden.
+Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern Smart Contracts und dApps lokal zu erstellen, bevor diese auf der Live-Chain bereitgestellt werden.
-Führen Sie innerhalb unseres `hello-world`-Projekts folgenden Befehl aus:
+Führen Sie in unserem `hello-world`-Projekt Folgendes aus:
```
npm install --save-dev hardhat
```
-Auf dieser Seite finden Sie weitere Informationen zur [Installationsanleitung](https://hardhat.org/getting-started/#overview).
+Weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview) finden Sie auf dieser Seite.
## Schritt 8: Hardhat-Projekt erstellen {#step-8}
-Führen Sie in unserem Projektordner folgenden Befehl aus:
+Führen Sie folgeden Befehl in unserem Projektordner aus:
```
npx hardhat
```
-Sie sollten eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwählen, was Sie tun möchten. Wählen Sie "create an empty hardhat.config.js" (Eine leere hardhat.config.js erstellen):
+Sie sollten dann eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwählen, wie Sie fortfahren möchten. Wählen Sie "create an empty hardhat.config.js" (Leere hardhat.config.js erstellen) aus:
```
888 888 888 888 888
@@ -138,114 +141,112 @@ Sie sollten eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwä
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
-👷 Welcome to Hardhat v2.0.11 👷?
+👷 Willkommen bei Hardhat v2.0.11 👷?
Was möchten Sie tun? …
-Create a sample project
-❯ Create an empty hardhat.config.js
-Quit
+Ein Beispielprojekt erstellen
+❯ Eine leere hardhat.config.js erstellen
+Beenden
```
-Darüber wird eine `hardhat.config.js`-Datei für uns erstellt, in der wir alle Einstellungen für unser Projekt angeben werden (in Schritt 13).
+Dadurch wird eine `hardhat.config.js`-Datei für uns generiert, in der wir alle Einstellungen für unser Projekt festlegen (in Schritt 13).
## Schritt 9: Projektordner hinzufügen {#step-9}
-Um unser Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in Ihrer Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie Folgendes ein:
+Um unser Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in der Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie Folgendes ein:
```
mkdir contracts
mkdir scripts
```
-- `contracts/` ist der Ort, an dem wir unseren hello world-Smart-Contract-Code ablegen
-- `scripts/` ist der Ort, an dem wir Skripte zum Einsatz und zur Interaktion mit unserem Vertrag aufbewahren
+- `contracts/` ist der Ort, an dem wir unsere `Hello-World-Smart-Contract`-Codedatei aufbewahren.
+- `scripts/` ist der Ort, an dem wir Skripte zur Bereitstellung und Interaktion mit unserem Vertrag aufbewahren.
-## Schritt 10: Vertrag schreiben {#step-10}
+## Schritt 10: Unseren Vertrag schreiben {#step-10}
-Sie fragen sich vielleicht, wann fangen wir endlich an, den Code zu schreiben? Jetzt! In Schritt 10.
+Sie fragen sich vielleicht, wann wir endlich anfangen, Code zu schreiben? Nun, hier sind wir, in Schritt 10.
-Öffnen Sie das hello-world-Projekt in Ihrem bevorzugten Editor (wir bevorzugen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben, die wir verwenden werden, um unseren Smart Contract namens HelloWorld.sol zu schreiben.
+Öffnen Sie das hello-world-Projekt in Ihrem bevorzugten Editor (wir mögen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben, die wir verwenden werden, um unseren Smart Contract HelloWorld.sol zu schreiben.
-1. Navigieren Sie zum Ordner "contracts" (Verträge) und erstellen Sie eine neue Datei namens HelloWorld.sol.
-2. Im Folgenden finden Sie ein Beispiel für einen Hello World-Smart Contract der Ethereum Foundation, den wir für dieses Tutorial verwenden. Kopieren Sie den folgenden Inhalt und fügen Sie ihn in Ihre Datei HelloWorld.sol ein. Lesen Sie die Kommentare, um zu verstehen, was dieser Vertrag bewirkt:
+1. Navigieren Sie zum Ordner „contracts“ und erstellen Sie eine neue Datei mit dem Namen HelloWorld.sol
+2. Unten finden Sie einen Beispiel-Smart-Contract „Hello World“ von der Ethereum Foundation, den wir für dieses Tutorial verwenden werden. Kopieren Sie den folgenden Inhalt und fügen Sie ihn in Ihre Datei HelloWorld.sol ein. Lesen Sie unbedingt die Kommentare, um zu verstehen, was dieser Vertrag bewirkt:
```solidity
-// Bestimmt die Version von Solidity mit semantischer Versionierung.
-// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+// Gibt die Version von Solidity an, unter Verwendung der semantischen Versionierung.
+// Erfahren Sie mehr: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity ^0.7.0;
-// Defines a contract named `HelloWorld`.
-// Ein Smart contract ist eine Sammlung von Funktionen und Daten (sein Zustand). Einmal in die Blockchain integriert, befindet sich ein Contract an einer bestimmten Adresse der Ethereum-Blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+// Definiert einen Vertrag mit dem Namen `HelloWorld`.
+// Ein Vertrag ist eine Sammlung von Funktionen und Daten (seinem Zustand). Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse in der Ethereum-Blockchain. Erfahren Sie mehr: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {
- // Declares a state variable `message` of type `string`.
- // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher hinterlegt werden. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value.
+ // Deklariert eine Zustandsvariable `message` vom Typ `string`.
+ // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher gespeichert werden. Das Schlüsselwort `public` macht Variablen von außerhalb eines Vertrags zugänglich und erstellt eine Funktion, die andere Verträge oder Clients aufrufen können, um auf den Wert zuzugreifen.
string public message;
- // Ähnlich wie viele Klassen-basierte objektorientierte Sprachen, ist ein Konstruktor
- // eine spezielle Funktion, die nur bei der Vertragserstellung ausgeführt wird.
- // Konstruktoren werden verwendet, um die Vertragsdaten zu initialisieren. Erfahre mehr: https://solidity.readthedocs.io/de/v0.5.10/contracts. tml#constructors
- constructor(string memory initMessage) public {
- // Akzeptiert ein String Argument `initMessage` und setzt den Wert
- // in die `message` Speichervariable des Contracts).
+ // Ähnlich wie bei vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor eine spezielle Funktion, die nur bei der Erstellung des Vertrags ausgeführt wird.
+ // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. Erfahren Sie mehr:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Akzeptiert ein String-Argument `initMessage` und legt den Wert in der Speichervariable `message` des Vertrags fest).
message = initMessage;
- }
+ }
- // Eine öffentliche Funktion, die ein String-Argument akzeptiert
- // und die Speichervariable `message` aktualisiert.
+ // Eine öffentliche Funktion, die ein String-Argument akzeptiert und die Speichervariable `message` aktualisiert.
function update(string memory newMessage) public {
- message = newMessage;
- }
+ message = newMessage;
+ }
}
```
-Das ist ein sehr einfacher Smart Contract, der eine Nachricht bei Erstellung speichert und durch den Aufruf der `update`-Funktion aktualisiert werden kann.
+Dies ist ein sehr einfacher Smart Contract, der beim Erstellen eine Nachricht speichert und durch den Aufruf der `update`-Funktion aktualisiert werden kann.
## Schritt 11: MetaMask und Alchemy mit Ihrem Projekt verbinden {#step-11}
Wir haben eine MetaMask-Wallet und ein Alchemy-Konto erstellt und unseren Smart Contract geschrieben. Jetzt ist es an der Zeit, die drei zu verbinden.
-Jede Transaktion, die von Ihrer virtuellen Wallet gesendet wird, erfordert eine Unterschrift mit Ihrem einzigartigen privaten Schlüssel. Um unser Programm mit dieser Berechtigung auszustatten, können wir unseren privaten Schlüssel (und den Alchemy-API-Schlüssel) sicher in einer Umgebungsdatei speichern.
+Jede Transaktion, die von Ihrer virtuellen Wallet gesendet wird, benötigt eine Signatur mit ihrem eindeutigen privaten Schlüssel. Um unser Programm mit dieser Berechtigung auszustatten, können wir unseren privaten Schlüssel (und Alchemy-API-Schlüssel) in einer Umgebungsdatei sicher abspeichern.
-> Weitere Informationen zum Senden von Transaktionen finden Sie in [diesem Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) zum Senden von Transaktionen mit web3.
+> Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich [dieses Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) über das Senden von Transaktionen mit web3 an.
-Installieren Sie zunächst das dotenv-Paket in Ihrem Projektverzeichnis:
+Installieren Sie zuerst das dotenv-Paket in Ihrem Projektverzeichnis:
```
npm install dotenv --save
```
-Erstellen Sie dann eine `.env`-Datei im Hauptverzeichnis unseres Projekts und fügen Sie Ihren privaten MetaMask-Schlüssel und die HTTP-API-URL von Alchemy hinzu.
+Erstellen Sie dann eine `.env`-Datei im Stammverzeichnis unseres Projekts und fügen Sie Ihren privaten MetaMask-Schlüssel und Ihre HTTP-Alchemy-API-URL hinzu.
-- Befolgen Sie [diese Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren privaten Schlüssel zu exportieren.
-- Unten sehen Sie, wie Sie die HTTP-Alchemy API-URL erhalten.
+- Befolgen Sie [diese Anweisungen](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/), um Ihren privaten Schlüssel zu exportieren
+- Siehe unten, um die HTTP Alchemy API-URL zu erhalten
-
+
Alchemy-API-URL kopieren
-Unser `.env` sollte dann so aussehen:
+Ihre `.env`-Datei sollte wie folgt aussehen:
```
-API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"
+API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"
```
-Um diese mit unserem Code zu verbinden, werden wir diese Variablen in unserer `hardhat.config.js`-Datei in Schritt 13 referenzieren.
+Um diese tatsächlich mit unserem Code zu verbinden, verweisen wir in Schritt 13 in unserer `hardhat.config.js`-Datei auf diese Variablen.
-Führen Sie keinen Commit für .env aus. Stellen Sie sicher, dass Sie Ihre .env-Datei niemals an andere weitergeben, denn damit würden Sie Ihre geheimen Daten weitergeben. Wenn Sie die Versionskontrolle verwenden, fügen Sie Ihre Env-Datei zu einer Datei gitignore hinzu.
+Führen Sie keinen Commit für .env aus! Bitte stellen Sie sicher, dass Sie Ihre .env-Datei niemals an Dritte weitergeben oder offenlegen, da Sie dadurch Ihre Geheimnisse preisgeben. Wenn Sie eine Versionskontrolle verwenden, fügen Sie Ihre .env-Datei einer gitignore-Datei hinzu.
## Schritt 12: Ethers.js installieren {#step-12-install-ethersjs}
-Ethers.js ist eine Bibliothek, die es einfacher macht, mit Ethereum zu interagieren und Anfragen zu stellen. Dafür schließt sie [Standard-JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden ein.
+Ethers.js ist eine Bibliothek, die die Interaktion und das Stellen von Anfragen an Ethereum erleichtert, indem sie [standardmäßige JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden verpackt.
-Hardhat macht es sehr einfach [Plug-ins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionen zu integrieren. Wir werden das [Ethers-Plug-in](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Bereitstellung von Verträgen nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) bietet einige sehr saubere Methoden zur Bereitstellung von Verträgen).
+Hardhat macht es sehr einfach, [Plugins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionalität zu integrieren. Wir werden das [Ethers-Plugin](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Vertragsbereitstellung nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) verfügt über einige sehr saubere Methoden zur Vertragsbereitstellung).
Geben Sie Folgendes in Ihrem Projektverzeichnis ein:
@@ -253,13 +254,13 @@ Geben Sie Folgendes in Ihrem Projektverzeichnis ein:
npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
```
-Im nächsten Schritt benötigen wir auch Ether in unserer `hardhat.config.js`.
+Im nächsten Schritt werden wir auch Ethers in unserer `hardhat.config.js` benötigen.
## Schritt 13: hardhat.config.js aktualisieren {#step-13-update-hardhatconfigjs}
-Wir haben bisher mehrere Abhängigkeiten und Plug-ins hinzugefügt. Jetzt müssen wir `hardhat.config.js` aktualisieren, damit unser Projekt über alle diese Abhängigkeiten informiert wird.
+Wir haben bisher mehrere Abhängigkeiten und Plugins hinzugefügt. Jetzt müssen wir `hardhat.config.js` aktualisieren, damit unser Projekt alle kennt.
-Aktualisieren Sie Ihre `hardhat.config.js` so, dass sie wie folgt aussieht:
+Aktualisieren Sie Ihre `hardhat.config.js`, sodass sie wie folgt aussieht:
```
require('dotenv').config();
@@ -272,10 +273,10 @@ const { API_URL, PRIVATE_KEY } = process.env;
*/
module.exports = {
solidity: "0.7.3",
- defaultNetwork: "ropsten",
+ defaultNetwork: "sepolia",
networks: {
hardhat: {},
- ropsten: {
+ sepolia: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
@@ -283,9 +284,9 @@ module.exports = {
}
```
-## Schritt 14: Vertragszusammenstellung {#step-14-compile-our-contracts}
+## Schritt 14: Unseren Vertrag kompilieren {#step-14-compile-our-contracts}
-Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Die Aufgabe `compile` ist eine der integrierten Hardhat-Aufgaben.
+Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Der `compile`-Task ist einer der integrierten Hardhat-Tasks.
Führen Sie folgenden Befehl in der Befehlszeile aus:
@@ -293,19 +294,19 @@ Führen Sie folgenden Befehl in der Befehlszeile aus:
npx hardhat compile
```
-Möglicherweise erhalten Sie eine Warnung über `SPDX license identifier not provided in source file` (SPDX-Lizenzkennung nicht in Quelldatei angegeben), aber darüber brauchen Sie sich keine Sorgen zu machen. Alles andere sieht hoffentlich gut aus. Falls nicht, können Sie jederzeit eine Nachricht im [Alchemy Discord](https://discord.gg/u72VCg3) hinterlassen.
+Möglicherweise erhalten Sie eine Warnung `SPDX license identifier not provided in source file`, aber darüber müssen Sie sich keine Sorgen machen – hoffentlich sieht alles andere gut aus! Wenn nicht, können Sie jederzeit eine Nachricht im [Alchemy-Discord](https://discord.gg/u72VCg3) schreiben.
-## Schritt 15: Bereitstellungsskript schreiben {#step-15-write-our-deploy-scripts}
+## Schritt 15: Unser Bereitstellungsskript schreiben {#step-15-write-our-deploy-scripts}
Nun, da unser Vertrag geschrieben und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, das Skript zur Bereitstellung des Vertrags zu schreiben.
-Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`. Fügen Sie folgende Inhalte hinzu:
+Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`, und fügen Sie ihr den folgenden Inhalt hinzu:
```
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
- // Start deployment, returning a promise that resolves to a contract object
+ // Startet die Bereitstellung und gibt ein Promise zurück, das in ein Vertragsobjekt aufgelöst wird
const hello_world = await HelloWorld.deploy("Hello World!");
console.log("Contract deployed to address:", hello_world.address);}
@@ -317,26 +318,26 @@ main()
});
```
-Hardhat erklärt in seinem [Vertragstutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) sehr gut, was die einzelnen Codezeilen bewirken. Wir haben diese Erklärungen hier übernommen.
+Hardhat erklärt in seinem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) hervorragend, was jede dieser Codezeilen bewirkt; wir haben die Erklärungen hier übernommen.
```
const HelloWorld = await ethers.getContractFactory("HelloWorld");
```
-Eine `ContractFactory` in ethers.js ist eine Abstraktion, die dazu dient, neue Smart Contracts einzusetzen. So ist `HelloWorld` eine Factory for Instances von unseren hello world-Vertrag. Wenn Sie das `hardhat-ethers`-Plug-in verwenden, werden die Instanzen `ContractFactory` und `Contract` standardmäßig mit dem ersten Unterzeichner verbunden.
+Eine `ContractFactory` in ethers.js ist eine Abstraktion, die zur Bereitstellung neuer Smart Contracts verwendet wird. `HelloWorld` ist hier also eine Factory für Instanzen unseres Hello-World-Vertrags. Bei Verwendung des `hardhat-ethers`-Plugins sind die Instanzen `ContractFactory` und `Contract` standardmäßig mit dem ersten Unterzeichner verbunden.
```
const hello_world = await HelloWorld.deploy();
```
-Der Aufruf eines `deploy()` im `ContractFactory` startet die Bereitstellung und gibt einen `Promise` zurück, was zum `Contract` führt. Das ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen enthält.
+Der Aufruf von `deploy()` auf einer `ContractFactory` startet die Bereitstellung und gibt ein `Promise` zurück, das zu einem `Contract` aufgelöst wird. Das ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen enthält.
-## Schritt 16: Vertragsbereitstellung {#step-16-deploy-our-contract}
+## Schritt 16: Unseren Vertrag bereitstellen {#step-16-deploy-our-contract}
-Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zur Befehlszeile und führen Sie folgenden Befehl aus:
+Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zur Befehlszeile und führen Sie Folgendes aus:
```
-npx hardhat run scripts/deploy.js --network ropsten
+npx hardhat run scripts/deploy.js --network sepolia
```
Sie sollten dann etwas sehen wie:
@@ -345,20 +346,22 @@ Sie sollten dann etwas sehen wie:
Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
```
-Wenn wir den [Ropsten etherscan](https://ropsten.etherscan.io/) aufrufen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Das Ergebnis sollte etwa wie folgt aussehen:
+Wenn wir zu [Sepolia Etherscan](https://sepolia.etherscan.io/) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Die Transaktion wird ungefähr so aussehen:

-Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und für die To-Adresse wird “Contract Creation” (Vertragserstellung) angezeigt. Doch wenn Sie die Transaktion aufrufen, erkennen Sie unsere Vertragsadresse im `To`-Feld:
+Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und die `To`-Adresse lautet „Contract Creation“. Wenn wir jedoch auf die Transaktion klicken, sehen wir unsere Vertragsadresse im `To`-Feld:

-Herzlichen Glückwunsch! Sie haben gerade einen Smart Contract in der Ethereum.Chain hinzugefügt 🎉.
+Glückwunsch! Sie haben gerade einen Smart Contract in der Ethereum-Chain bereitgestellt 🎉
-Um zu verstehen, was im Verborgenen vor sich geht, navigieren wir zur Explorer-Registerkarte in unserem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/explorer). Wenn Sie mehrere Alchemy-Anwendungen haben, stellen Sie sicher, dass Sie nach Anwendungen filtern und "Hello World" auswählen. 
+Um zu verstehen, was unter der Haube vor sich geht, navigieren wir zum Explorer-Tab in unserem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/explorer). Wenn Sie mehrere Alchemy-Apps haben, stellen Sie sicher, dass Sie nach App filtern und „Hello World“ auswählen.
+
-Hier sehen Sie eine Handvoll JSON-RPC-Befehle, die Hardhat/Ethers implementiert hat, als wir die `.deploy()`-Funktion aufgerufen haben. Zwei wichtige Befehle, die wir hier vorstellen möchten, sind [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), das ist die Aufforderung unseren Vertrag in die Ropsten-Chain zu schreiben, und [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), was eine Anfrage ist, Informationen über unsere Transaktion anhand des Hashs zu lesen (ein typisches Muster bei Transaktionen). Wenn Sie mehr über das Senden von Transaktionen erfahren möchten, lesen Sie dieses Tutorial über das [Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)
+Hier sehen Sie eine Handvoll JSON-RPC-Aufrufe, die Hardhat/Ethers für uns „unter der Haube“ gemacht hat, als wir die `.deploy()`-Funktion aufgerufen haben. Zwei wichtige, die hier zu nennen sind, sind [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), also die Anfrage, unseren Vertrag tatsächlich in die Sepolia-Chain zu schreiben, und [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash), eine Anfrage zum Lesen von Informationen über unsere Transaktion anhand des Hash (ein typisches Muster bei
+Transaktionen). Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich dieses Tutorial zum [Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) an.
-Damit sind wir am Ende des ersten Teils von diesem Tutorial. Im zweiten Teil werden wir [mit unserem Smart Contract interagieren](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract). Dafür aktualisieren wir unsere anfängliche Nachricht. Im dritten Teil werden wir [unseren Smart Contract auf Etherscan veröffentlichen](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan), damit jeder weiß, wie man mit ihm interagiert.
+Das ist alles für Teil 1 dieses Tutorials. In Teil 2 werden wir tatsächlich [mit unserem Smart Contract interagieren](https://www.alchemy.com/docs/interacting-with-a-smart-contract), indem wir unsere ursprüngliche Nachricht aktualisieren, und in Teil 3 werden wir [unseren Smart Contract auf Etherscan veröffentlichen](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), damit jeder weiß, wie man mit ihm interagiert.
-**Möchten Sie mehr über Alchemy erfahren? Besuchen Sie unsere [Website](https://alchemyapi.io/eth). Sie möchten kein Update verpassen? Dann abonnieren Sie [hier](https://www.alchemyapi.io/newsletter) unseren Newsletter. Folgen Sie uns auf [Twitter](https://twitter.com/alchemyplatform) und treten Sie unserer Community in [Discord](https://discord.com/invite/u72VCg3)** bei.
+**Möchten Sie mehr über Alchemy erfahren? Besuchen Sie unsere [Website](https://www.alchemy.com/eth). Möchten Sie nie ein Update verpassen? Abonnieren Sie unseren Newsletter [hier](https://www.alchemy.com/newsletter)! Treten Sie auch unserem [Discord](https://discord.gg/u72VCg3) bei.**.
diff --git a/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md
new file mode 100644
index 00000000000..ef0fa6f99d5
--- /dev/null
+++ b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md
@@ -0,0 +1,145 @@
+---
+title: Wie man einen ERC-721 Markt implementiert
+description: Wie man tokenisierte Assets auf einer dezentralen Pinnwand zum Verkauf anbietet
+author: "Alberto Cuesta Cañada"
+tags: [ "Smart Contracts", "erc-721", "Solidity", "Token" ]
+skill: intermediate
+lang: de
+published: 2020-03-19
+source: Hackernoon
+sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9
+---
+
+In diesem Artikel werde ich dir zeigen, wie du Craigslist für die Ethereum Blockchain programmieren kannst.
+
+Vor Ebay, Craigslist und Gumtree waren Kleinanzeigen vor allem aus Kork oder Papier gemacht. Es gab Kleinanzeigen in Schulkorridoren, Zeitungen, an Straßenbeleuchtungen und Schaufenstern.
+
+All das änderte sich mit dem Internet. Die Anzahl der Personen, die eine bestimmte Kleinanzeige sehen konnten, multiplizierte sich um ein Vielfaches. Damit wurden die Märkte, die sie repräsentieren, viel effizienter und skalierter auf globale Größe. Ebay ist ein massives Geschäft, dessen Ursprünge auf diese physikalischen Kleinanzeiger zurückgehen.
+
+Angesichts der Blockchain werden sich diese Märkte erneut ändern, lass mich dir zeigen, wie.
+
+## Monetisierung {#monetization}
+
+Das Geschäftsmodell einer öffentlichen Blockchain-Kleinanzeige muss sich von dem von Ebay und Unternehmen unterscheiden.
+
+Zuerst gibt es [den Dezentralisierungsaspekt](/developers/docs/web2-vs-web3/). Bestehende Plattformen müssen ihre eigenen Server unterhalten. Eine dezentrale Plattform wird von ihren Benutzern verwaltet, so dass die Kosten für den Betrieb der Kernplattform für die Plattform-Besitzer auf Null sinken.
+
+Dann gibt es das Front-End, die Website oder Schnittstelle, den Zugriff auf die Plattform. Hier gibt es viele Möglichkeiten. Die Besitzer der Plattform können den Zugang einschränken und jeden zwingen, ihr Interface zu verwenden und eine Gebühr zu verlangen. Die Plattformeigentümer können sich auch dazu entscheiden, den Zugang zu öffnen (Alle Macht dem Volk!) und jeden Schnittstellen zur Plattform bauen zu lassen. Oder die Eigentümer könnten sich bei jedem Ansatz für die Mitte dieser Extreme entscheiden.
+
+_Geschäftsführer mit mehr Vision als ich, wissen, wie man dies monetarisieren kann. Ich sehe lediglich, dass dies anders ist als der Status quo und wahrscheinlich gewinnbringend._
+
+Darüber hinaus gibt es den Automatisierungs- und Zahlungsverkehrsblickwinkel. Manche Dinge können sehr [effektiv tokenisiert](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) und auf einer Kleinanzeigen-Plattform gehandelt werden. Tokenisierte Assets werden einfach in einer Blockchain übertragen. Hochkomplexe Zahlungsmethoden lassen sich in einer Blockchain einfach umsetzen.
+
+Ich rieche hier nur eine Geschäftsgelegenheit. Eine Kleinanzeige ohne laufende Kosten lässt sich problemlos umsetzen, wobei bei jeder Transaktion komplexe Zahlungswege enthalten sind. Ich bin mir sicher, dass jemand eine gute Idee haben wird, wofür er dies nutzen sollte.
+
+Ich bin nur glücklich, es zu entwickeln. Werfen wir einen Blick auf den Code.
+
+## Implementierung {#implementation}
+
+Vor einiger Zeit haben wir ein [Open-Source-Repository](https://github.com/HQ20/contracts?ref=hackernoon.com) mit Implementierungsbeispielen für Geschäftsszenarien und anderen Goodies gestartet, schau es dir bitte an.
+
+Der Code für dieses [Ethereum Classifieds Board](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) ist dort zu finden, bitte benutze ihn und tobe dich damit aus. Sei dir bewusst, dass der Code noch nicht geprüft wurde und du deine Sorgfaltspflicht erledigen musst, bevor du Geld in den Code steckst.
+
+Die Grundlagen des Boards sind nicht komplex. Alle Anzeigen im Board werden nur ein Struct mit ein paar Feldern sein:
+
+```solidity
+struct Trade {
+ address poster;
+ uint256 item;
+ uint256 price;
+ bytes32 status; // Open, Executed, Cancelled
+}
+```
+
+Es gibt jemanden, der die Anzeige veröffentlicht. Ein Artikel zum Verkauf. Ein Preis für diesen Artikel. Der Status des Handels, der geöffnet, ausgeführt oder aufgehoben werden kann.
+
+Alle diese Geschäfte werden in einer Kartierung aufbewahrt. Weil alles in Solidity ein Mapping zu sein scheint. Auch weil es bequem ist.
+
+```solidity
+mapping(uint256 => Trade) public trades;
+```
+
+Die Verwendung eines Mappings bedeutet lediglich, dass wir eine ID für jedes Inserat erstellen müssen, bevor wir es veröffentlichen und wir werden die ID einer Anzeige wissen müssen, bevor wir daran arbeiten können. Es gibt mehrere Möglichkeiten, dies entweder im Smart-Contract oder im Front-end zu lösen. Bitte frage dich, ob du Pointer benötigst.
+
+Als nächstes stellt sich die Frage, mit welcher Währung wir uns befassen und mit welcher Währung wir die Transaktion finanzieren.
+
+Für die Gegenstände fordern wir lediglich, dass sie die [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com)-Schnittstelle implementieren, was eigentlich nur eine Methode ist, um reale Gegenstände in einer Blockchain darzustellen, obwohl sie am besten [mit digitalen Vermögenswerten funktioniert](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Wir werden unseren eigenen ERC721 Vertrag im Konstrukteur spezifizieren, was bedeutet, dass alle Vermögenswerte in unserem Kleinanzeigen-Board vorher tokenisiert werden müssen.
+
+Für die Zahlungen werden wir etwas Ähnliches machen. Die meisten Blockchain-Projekte definieren ihre eigene [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com) Kryptowährung. Einige andere ziehen es vor, eine Mainstream-Währung wie den DAI zu verwenden. In diesem Kleinanzeigen-Board musst du im Konstruktor über die Währung entscheiden. Einfach.
+
+```solidity
+constructor (
+ address _currencyTokenAddress, address _itemTokenAddress
+) public {
+ currencyToken = IERC20(_currencyTokenAddress);
+ itemToken = IERC721(_itemTokenAddress);
+ tradeCounter = 0;
+}
+```
+
+Wir haben es fast geschafft. Wir haben Werbung, Artikel für den Handel und eine Währung für Zahlungen. Eine Anzeige zu machen bedeutet, einen Gegenstand in das Treuhandkontol zu legen und zu zeigen, dass du ihn nicht zweimal gepostet hast, möglicherweise in einem anderen Board.
+
+Der folgende Code tut genau das. Legt den Gegenstand in escrow, erstellt die Werbung, macht ein wenig den Haushalt.
+
+```solidity
+function openTrade(uint256 _item, uint256 _price)
+ public
+{
+ itemToken.transferFrom(msg.sender, address(this), _item);
+ trades[tradeCounter] = Trade({
+ poster: msg.sender,
+ item: _item,
+ price: _price,
+ status: "Open"
+ });
+ tradeCounter += 1;
+ emit TradeStatusChange(tradeCounter - 1, "Open");
+}
+```
+
+Den Handel zu akzeptieren bedeutet, wähle eine Anzeige (Handel), zahle den Preis, erhalte den Artikel. Der untenstehende Code ruft einen Handel auf. Überprüft, ob er verfügbar ist. Bezahlt den Artikel. Erhält den Artikel. Aktualisiert die Anzeige.
+
+```solidity
+function executeTrade(uint256 _trade)
+ public
+{
+ Trade memory trade = trades[_trade];
+ require(trade.status == "Open", "Trade is not Open.");
+ currencyToken.transferFrom(msg.sender, trade.poster, trade.price);
+ itemToken.transferFrom(address(this), msg.sender, trade.item);
+ trades[_trade].status = "Executed";
+ emit TradeStatusChange(_trade, "Executed");
+}
+```
+
+Schließlich haben wir die Möglichkeit für Verkäufer, von einem Handel zurückzutreten, bevor ein Käufer ihn annimmt. In einigen Modellen würden Anzeigen statt dessen eine Zeitspanne lang live sein, bevor sie ablaufen. Deine Wahl, abhängig vom Design Ihres Marktes.
+
+Der Code ist sehr ähnlich wie bei der Handelsausführung nur dass keine Währung wechselt wird und der Artikel zurück zum Verkäufer geht.
+
+```solidity
+function cancelTrade(uint256 _trade)
+ public
+{
+ Trade memory trade = trades[_trade];
+ require(
+ msg.sender == trade.poster,
+ "Der Handel kann nur vom Ersteller storniert werden."
+ );
+ require(trade.status == "Open", "Der Handel ist nicht offen.");
+ itemToken.transferFrom(address(this), trade.poster, trade.item);
+ trades[_trade].status = "Cancelled";
+ emit TradeStatusChange(_trade, "Cancelled");
+}
+```
+
+Das wars. Du hast es bis zum Ende der Umsetzung geschafft. Es ist ziemlich überraschend, wie kompakt einige Geschäftskonzepte sind, wenn sie im Code ausgedrückt werden, und das ist einer dieser Fälle. Sieh dir den vollständigen Vertrag [in unserem Repo](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol) an.
+
+## Fazit {#conclusion}
+
+Kleinanzeigen sind eine gemeinsame Marktkonfiguration, die massiv mit dem Internet skaliert wurde und zu einem sehr beliebten Geschäftsmodell mit ein paar monopolistischen Gewinnern geworden ist.
+
+Kleinanzeigen sind auch ein einfaches Werkzeug zum Nachahmen in einer Blockchain-Umgebung mit sehr spezifischen Merkmalen, die eine Herausforderung für die bestehenden Marktführer ermöglichen.
+
+In diesem Artikel habe ich den Versuch unternommen, die Geschäftswirklichkeit eines Kleinanzeigen-Business mit der technologischen Umsetzung zu verbinden. Dieses Wissen sollte dir helfen, eine Vision und einen Fahrplan für die Umsetzung zu erstellen, wenn du über die richtigen Fähigkeiten verfügst.
+
+Wie immer gilt: Wenn du etwas Lustiges bauen willst und einen Ratschlag gebrauchen könntest, [schreib mir einfach eine Nachricht](https://albertocuesta.es/)! Ich helfe immer gerne.