diff --git a/AGENTS.md b/AGENTS.md index f7169949639..2b544c490a2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -68,6 +68,7 @@ This is the official Ethereum.org website - a Next.js application that serves as - Use `interface` for object shapes, `type` for unions/intersections - Prefer explicit typing over `any` (ESLint enforces `fixToUnknown`) +- **NEVER leave unused variables or parameters** - ESLint `unused-imports/no-unused-vars` will fail the Netlify build. The only allowed unused arg pattern is a single underscore `_`. Do NOT use `_prefixedNames` (e.g., `_foo`) - either use the variable or remove it from the signature entirely. - Use generic constraints for reusable components - Export types from dedicated files in `@/lib/types` diff --git a/docs/solutions/integration-issues/sanitizer-test-research.md b/docs/solutions/integration-issues/sanitizer-test-research.md index 2a010c35157..8b901cfe12f 100644 --- a/docs/solutions/integration-issues/sanitizer-test-research.md +++ b/docs/solutions/integration-issues/sanitizer-test-research.md @@ -59,6 +59,8 @@ | 47 | Unquoted frontmatter value with YAML-special characters | it #17841 | `description: Una spiegazione degli account di Ethereum: le loro strutture dati...` -- colon-space (`: `) inside unquoted YAML value triggers `YAMLParseError: Nested mappings are not allowed`; existing `quoteFrontmatterNonAscii` only quotes values with non-ASCII chars, missing pure-ASCII values with YAML-special sequences | Critical -- breaks build | | 48 | `collapseInlineHtmlFromEnglish` matches across code fences and newlines | it #17841 | Inside ````tsx` fence: `
{error?.message}
\n \n` -- regex `\s*` crosses the blank line and collapses a separate `` onto the previous line, producing `
{error?.message}
`. Two bugs: (1) no code fence protection, (2) `\s*` matches newlines allowing cross-line grabs | High -- corrupts code examples | +| 49 | Lowercased MDX component name | de #17842 | `` instead of `` -- translation pipeline lowercases the PascalCase MDX component tag; MDX component names are case-sensitive, so the lowercased tag won't resolve to the registered component | Critical -- breaks rendering | +| 50 | `removeOrphanedClosingTags` strips valid cross-line `` | de #17842 | `\ntext` -- `` is on line N, `` is on line N+1; line-by-line counting sees no opener on line N+1 and strips `` as orphaned, breaking MDX compilation. Regression from sanitizer's own orphan removal logic. | Critical -- breaks MDX compilation | ## Patterns Already Handled by Sanitizer (Confirmed Working) @@ -103,6 +105,7 @@ These patterns are covered by existing fix functions and should have regression - **Translated inline code warning** (`warnTranslatedInlineCode`) — warns when inline code span count drops significantly OR when orphaned backticks are detected on a line; signals Crowdin translated content inside backticks (pt-br PR #17122) - **LLM artifact token stripping** (`stripLlmArtifactTokens`) — strips ``, ``, ``, ``, ``, ``, `` tokens from prose; these leak from machine translation pipelines and break MDX compilation (mr PR #17730) - **Block HTML inline usage preserved** (`normalizeBlockHtmlLines`) — no longer splits `
content
` when both tags are on the same line; only splits multi-line block closing tags to their own line. Fixes MDX "Expected a closing tag before end of paragraph" error (id i18n/id-03-23T2228, pattern #46) +- **Lowercased MDX component names** (`fixLowercasedMdxComponents`) — `` → `` restores PascalCase from English source; translation pipelines occasionally lowercase custom component tags, and MDX component names are case-sensitive (de PR #17842, pattern #49) ## Recommendations for Future Sanitizer Iteration diff --git a/public/content/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/developers/docs/nodes-and-clients/node-architecture/index.md index a52ab204acc..3b3848dc4b9 100644 --- a/public/content/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/developers/docs/nodes-and-clients/node-architecture/index.md @@ -6,7 +6,7 @@ lang: en An Ethereum node is composed of two clients: an [execution client](/developers/docs/nodes-and-clients/#execution-clients) and a [consensus client](/developers/docs/nodes-and-clients/#consensus-clients). For a node to propose a new block, it must also run a [validator client](#validators). -When Ethereum was using [proof-of-work](/developers/docs/consensus-mechanisms/pow/), an execution client was enough to run a full Ethereum node. However, since implementing [proof-of-stake](/developers/docs/consensus-mechanisms/pow/), the execution client must be used alongside another piece of software called a [consensus client](/developers/docs/nodes-and-clients/#consensus-clients). +When Ethereum was using [proof-of-work](/developers/docs/consensus-mechanisms/pow/), an execution client was enough to run a full Ethereum node. However, since implementing [proof-of-stake](/developers/docs/consensus-mechanisms/pos/), the execution client must be used alongside another piece of software called a [consensus client](/developers/docs/nodes-and-clients/#consensus-clients). The diagram below shows the relationship between the two Ethereum clients. The two clients connect to their own respective peer-to-peer (P2P) networks. Separate P2P networks are needed as the execution clients gossip transactions over their P2P network, enabling them to manage their local transaction pool, whilst the consensus clients gossip blocks over their P2P network, enabling consensus and chain growth. diff --git a/public/content/ethereum-forks/index.md b/public/content/ethereum-forks/index.md index a85de7d8951..aa80a97c0b2 100644 --- a/public/content/ethereum-forks/index.md +++ b/public/content/ethereum-forks/index.md @@ -314,7 +314,7 @@ The Altair upgrade was the first scheduled upgrade for the [Beacon Chain](/roadm - [Read the Altair upgrade specification](https://github.com/ethereum/consensus-specs/tree/master/specs/altair) -#### Fun fact! {#altair-fun-fact} +#### Fun fact! {#altair-fun-fact} Altair was the first major network upgrade that had an exact rollout time. Every upgrade prior had been based on a declared block number on the proof-of-work chain, where block times vary. The Beacon Chain does not require solving for proof-of-work, and instead works on a time-based epoch system consisting of 32 twelve-second "slots" of time where validators can propose blocks. This is why we knew exactly when we would hit epoch 74,240 and Altair became live! diff --git a/public/content/social-networks/index.md b/public/content/social-networks/index.md index b462bea54c3..30fceb87c49 100644 --- a/public/content/social-networks/index.md +++ b/public/content/social-networks/index.md @@ -11,7 +11,7 @@ summaryPoint2: Decentralized social media networks protect user privacy and enha summaryPoint3: Tokens and NFTs create new ways to monetize content. --- -Social networks play a massive role in our daily communications and interactions. However, centralized control of these platforms has created many problems: data breaches, server outages, de-platforming, censorship, and privacy violations are some of the trade-offs social media often make. To combat these issues, developers are building social networks on [Ethereum](). Decentralized social networks can fix many of the problems of traditional social networking platforms and improve users' overall experience. +Social networks play a massive role in our daily communications and interactions. However, centralized control of these platforms has created many problems: data breaches, server outages, de-platforming, censorship, and privacy violations are some of the trade-offs social media often make. To combat these issues, developers are building social networks on [Ethereum](/). Decentralized social networks can fix many of the problems of traditional social networking platforms and improve users' overall experience. ## What are decentralized social networks? {#what-are-decentralized-social-networks} diff --git a/public/content/translations/de/about/index.md b/public/content/translations/de/about/index.md index 04755506c11..363a4b787a1 100644 --- a/public/content/translations/de/about/index.md +++ b/public/content/translations/de/about/index.md @@ -1,66 +1,134 @@ --- -title: Über uns -description: Über das Team, die Community und die Mission von ethereum.org +title: "Über uns" +description: "Über das Team, die Community und die Mission von ethereum.org" lang: de --- -# Über Ethereum.org {#about-ethereumorg} +# Über ethereum.org {#about-ethereumorg} -ethereum.org ist eine öffentliche Open-Source-Ressource für die Ethereum-Community, zu der jeder beitragen kann. Wir haben ein kleines Team, dass sich der Pflege und Entwicklung der Seite widmet, die von der [Ethereum Foundation](/foundation/) finanziert wird. +ethereum.org ist eine öffentliche Open-Source-Ressource für die [Ethereum](/)-Community, zu der jeder beitragen kann. Wir haben ein kleines Kernteam, das sich der Pflege und Entwicklung der Website widmet, mit Beiträgen von Tausenden von Community-Mitgliedern auf der ganzen Welt. -## Unsere Vision {#our-vision} +**Niemand von ethereum.org wird Sie jemals kontaktieren. Antworten Sie nicht.** -### ethereum.orgs Mission ist es, das beste Portal für die wachsende Ethereum-Community zu sein {#mission} +## Eine Anmerkung zu Namen {#a-note-on-names} -Wir sind eine Wissensdatenbank, die mit dem Gedanken der Wissensvermittlung rund um Ethereum und seine Kernkonzepte gebaut wurde. Unsere Ziele: +Es kommt häufig vor, dass Menschen Namen innerhalb der Ethereum-Landschaft verwechseln, was zu falschen Vorstellungen darüber führen kann, wie Ethereum funktioniert. Hier ist eine kurze Erklärung, um die Dinge zu klären: -- jedem Einsteiger Ethereum erklären -- neuen Benutzern den Einstieg mit ETH und Ethereum erleichtern -- neuen Entwicklern den Einstieg in das Programmieren erleichtern -- Updates in der Welt von Ethereum bereitstellen -- von der Community erstellte Ressourcen teilen -- in so vielen Sprachen wie möglich über Ethereum informieren +### Ethereum {#ethereum} -Wir haben einige Kernprinzipien, die uns dabei helfen. +Ethereum ist ein öffentliches Netzwerk, eine Blockchain und ein Open-Source-Protokoll – betrieben, verwaltet, gesteuert und im Besitz einer globalen Community von Zehntausenden von Entwicklern, Blockchain-Knoten-Betreibern, ETH-Haltern und Nutzern. -## Kernprinzipien {#core-principles} +[Mehr über Ethereum](/what-is-ethereum/) -### 1. ethereum.org ist ein Portal zu Ethereum 🌏 {#core-principles-1} +[Mehr über Ethereum-Governance](/governance/) + +### Ether (ETH) {#ether-or-eth} + +Ether (auch bekannt unter seinem Tickersymbol ETH) ist die native Währung, die auf Ethereum gehandelt wird. ETH wird benötigt, um für die Nutzung des Ethereum-Netzwerks (in Form von Transaktionsgebühren) zu bezahlen. ETH wird auch verwendet, um das Netzwerk durch Staking abzusichern. Wenn Leute über den Preis von Ethereum sprechen, beziehen sie sich auf den Vermögenswert ETH. + +[Mehr über ETH](/what-is-ether/) + +[Mehr über das Staking von ETH](/staking/) + +### Ethereum Foundation {#ethereum-foundation} + +Eine gemeinnützige Organisation, die ursprünglich durch den Crowdsale von ETH finanziert wurde und sich der Unterstützung des Ethereum-Netzwerks und -Ökosystems widmet. + +[Mehr über die Ethereum Foundation](/foundation/) + +### ethereum.org {#ethereum-org} + +Eine öffentliche Open-Source-Website und Bildungsressource für die Ethereum-Community. ethereum.org wird von einem kleinen Kernteam geleitet, das von der Ethereum Foundation finanziert wird, mit Beiträgen von Tausenden von Community-Mitgliedern auf der ganzen Welt. + +Diese Seite enthält weitere Informationen über ethereum.org. + +## Unsere Mission {#our-mission} + +**Die Mission von ethereum.org ist es, das beste Portal für die wachsende Ethereum-Community zu sein** + +Wir bemühen uns, eine leicht verständliche Bildungsressource für alle Themen rund um Ethereum aufzubauen, die neuen Nutzern helfen soll, sich mit Ethereum und seinen Schlüsselkonzepten vertraut zu machen. Wir möchten: + +- Ethereum jedem erklären, der neu in der Technologie ist +- neuen Nutzern den Einstieg in ETH und Ethereum erleichtern +- neuen Entwicklern helfen, mit dem Bauen zu beginnen +- über Neuigkeiten in der Ethereum-Welt berichten +- von der Community erstellte Ressourcen präsentieren +- Ethereum-Bildung in so viele Sprachen wie möglich bringen -Wir möchten, dass das Interesse unserer Nutzer geweckt und ihre Fragen beantwortet werden. Deshalb muss unser Portal Informationen, "magische Momente" und Links zu den genialen Community-Ressourcen, die es dort draußen gibt, kombinieren. Der Zweck unseres Inhalts ist es, ein Onboarding-Portal und kein Ersatz für die bereits vorhandenen, umfangreichen Ressourcen zu sein. Wir sind sehr daran interessiert, die Ressourcen der Community zu unterstützen und zu integrieren, um diese sichtbarer und besser auffindbar zu machen. +Um diese Mission zu erfüllen, konzentriert sich unser Team auf zwei Hauptziele auf ethereum.org: -Die [ Ethereum Community](/community/) steht für uns dabei im Mittelpunkt: Wir wollen die Community nicht nur unterstützen, sondern auch im aktiven Austausch mit ihr stehen. Die Website ist nicht nur für die Community, die wir jetzt haben, sondern auch für die Community, in die wir hoffentlich hineinwachsen. Wir müssen uns daran erinnern, dass unsere Gemeinschaft global ist und Menschen mit vielen verschiedenen Sprachen, aus unterschiedlichen Regionen und Kulturen umfasst. +### 1. Die Benutzererfahrung für Besucher von ethereum.org verbessern {#visitors} + +- Inhalte erweitern, verbessern und aktuell halten +- Benutzerfreundlichkeit und Barrierefreiheit durch Lokalisierung und Best Practices der Webentwicklung verbessern +- Das Nutzerengagement durch Funktionen wie Umfragen, Quizze und Web3-Integrationen steigern +- Die Website schlank und leistungsstark halten + +### 2. Unsere Community von Mitwirkenden vergrößern, stärken und befähigen {#community} + +- Die Gesamtzahl der Mitwirkenden an der Website erhöhen +- Die Bindung der Mitwirkenden durch Engagement, Anerkennung und Belohnungen verbessern +- Community-Mitglieder befähigen, zunehmend bedeutendere Beiträge zu leisten +- Eine größere Vielfalt an Beiträgen fördern: Code, Inhalt, Design, Übersetzung, Moderation +- Die Codebasis modern, sauber und gut dokumentiert halten + +## Grundprinzipien {#core-principles} + +Wir haben einige Grundprinzipien, die uns dabei helfen, unsere Mission zu erfüllen. + +### 1. ethereum.org ist ein Portal zu Ethereum 🌏 {#core-principles-1} + +Wir möchten das Interesse unserer Nutzer wecken und ihre Fragen beantworten. Daher muss unser Portal Informationen, „magische Momente“ und Links zu den hervorragenden Community-Ressourcen kombinieren, die es da draußen gibt. Der Zweck unserer Inhalte ist es, ein „Onboarding-Portal“ zu sein und kein Ersatz für die bereits vorhandenen umfangreichen Ressourcen. Wir sind bestrebt, von der Community erstellte Ressourcen zu unterstützen und zu integrieren, um ihnen mehr Sichtbarkeit zu verleihen und sie leichter auffindbar zu machen. +Die [Ethereum-Community](/community/) steht dabei im Mittelpunkt: Wir müssen der Community nicht nur dienen, sondern mit ihr zusammenarbeiten und ihr Feedback einbeziehen. Die Website ist nicht nur für die Community gedacht, die wir jetzt haben, sondern für die Community, in die wir hineinwachsen möchten. Wir müssen bedenken, dass unsere Community global ist und Menschen aus vielen Sprachen, Regionen und Kulturen umfasst. ### 2. ethereum.org entwickelt sich ständig weiter 🛠 {#core-principles-2} -Ethereum und die Community entwickeln sich stetig weiter, was sich auch hier, auf ethereum.org, zeigen soll. Aus diesem Grund hat die Website auch ein einfaches Designsystem und eine modulare Struktur. Wir machen interaktive Änderungen, während wir mehr darüber lernen, wie Besucher die Website nutzen und was die Community von ihr erwartet. +Ethereum und die Community entwickeln sich ständig weiter, und das wird auch ethereum.org tun. Deshalb hat die Website ein einfaches Designsystem und eine modulare Struktur. Wir nehmen iterative Änderungen vor, während wir mehr darüber erfahren, wie die Leute die Website nutzen und was die Community von ihr erwartet. +Wir sind Open-Source, mit einer Community von Mitwirkenden, sodass auch Sie Änderungen vorschlagen oder uns helfen können. +[Erfahren Sie mehr über das Mitwirken](/contributing/) -Wir sind Open Source, mit einer Gemeinschaft von Mitwirkenden, so dass jeder Änderungen vorschlagen oder uns auch helfen kann. +### 3. ethereum.org ist keine typische Produkt-Website 🦄 {#core-principles-3} -[Erfahre, wie du einen Beitrag leisten kannst](/contributing/) +Ethereum ist eine große Sache: Es umfasst eine Community, eine Technologie, eine Reihe von Ideen und Ideologien und mehr. +Das bedeutet, dass die Website viele verschiedene Nutzerreisen abdecken muss, von „einem Entwickler, der ein bestimmtes Tool möchte“ bis hin zu „einem Neuling, der gerade etwas ETH gekauft hat und nicht weiß, was ein Wallet ist“. +„Was ist die beste Website für eine Blockchain-Plattform?“ bleibt eine offene Frage – wir sind Pioniere. Der Aufbau erfordert Experimentierfreudigkeit. -### 3. ethereum.org ist keine typische Produktwebsite 🦄 {#core-principles-3} +## Produkt-Roadmap {#roadmap} -Ethereum ist eine große Sache: Es beinhaltet eine Community, eine Technologie, eine Reihe von Ideen und Ideologien und vieles mehr. Das bedeutet, dass die Website mit vielen verschiedene Anforderungen umgehen muss, von “einem Entwickler, der ein bestimmtes Tool sucht” bis zu “einem Neuankömmling, der gerade ein paar ETH gekauft hat und nicht weiß, was ein 'Wallet' ist”. +Um unsere Arbeit zugänglicher zu machen und mehr Zusammenarbeit in der Community zu fördern, veröffentlicht das Kernteam von ethereum.org eine Übersicht unserer Roadmap-Ziele im [Shape-Up-Zyklus](https://www.productplan.com/glossary/shape-up-method/). -"Was ist die beste Website für eine Blockchain-Plattform?" Dies bleibt eine offene Frage – wir sind Pioniere. Um dies herauszufinden, müssen wir experimentieren. +[Sehen Sie sich unsere Produkt-Roadmap für Zyklus 1 2025 an](https://github.com/ethereum/ethereum-org-website/issues/14726) + +**Wie klingt das?** Wir freuen uns immer über Feedback zu unserer Roadmap – wenn Sie der Meinung sind, dass wir an etwas arbeiten sollten, lassen Sie es uns bitte wissen! Wir begrüßen Ideen und PRs von jedem in der Community. + +**Möchten Sie sich einbringen?** [Erfahren Sie mehr über das Mitwirken](/contributing/), [kontaktieren Sie uns auf Twitter](https://x.com/ethdotorg) oder nehmen Sie an den Community-Diskussionen auf [unserem Discord-Server](https://discord.gg/ethereum-org) teil. ## Designprinzipien {#design-principles} -Wir verwenden eine Reihe von [Designprinzipien](/contributing/design-principles/), um unsere Inhalte zu strukturieren und Entscheidungen auf unserer Website zu entwerfen. +Wir verwenden eine Reihe von [Designprinzipien](/contributing/design-principles/), um unsere Inhalts- und Designentscheidungen auf der Website zu leiten. + +## Designsystem {#design-system} + +Wir haben ein [Designsystem](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) entwickelt und veröffentlicht, um Funktionen schneller bereitzustellen und Community-Mitgliedern die Teilnahme am offenen Design von ethereum.org zu ermöglichen. + +Möchten Sie sich einbringen? [Verfolgen Sie es in Figma](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), dem [GitHub-Issue](https://github.com/ethereum/ethereum-org-website/issues/6284) und nehmen Sie an der Unterhaltung in unserem [#design Discord-Kanal](https://discord.gg/ethereum-org) teil. ## Styleguide {#style-guide} -Wir haben einen [Styleguide](/contributing/style-guide/), um bestimmte Aspekte des Schreibens von Inhalten zu standardisieren und den Beitragsprozess so reibungsloser zu gestalten. +Wir haben einen [Styleguide](/contributing/style-guide/), um bestimmte Aspekte des Schreibens von Inhalten zu standardisieren und den Beitragsprozess reibungsloser zu gestalten. + +Stellen Sie sicher, dass Sie [unsere Prinzipien](/contributing/design-principles/) und [unseren Styleguide](/contributing/style-guide/) lesen, wenn Sie [zur Website beitragen](/contributing/) möchten. + +Wir freuen uns über Feedback zu unseren Designprinzipien, unserem Designsystem und dem Styleguide. Denken Sie daran: ethereum.org ist für die Community, von der Community. -Wir freuen uns über Feedback sowohl zu den Designprinzipien als auch zum Styleguide. Denke daran: ethereum.org ist für die Community, von der Community. +## Lizenz {#license} -Stelle sicher, dass du [unsere Prinzipien](/contributing/design-principles/) und [unseren Styleguide](/contributing/style-guide/) durchgehst, wenn du [zur Website](/contributing/) beitragen möchten. +Die Website ethereum.org ist Open-Source und wird unter einer [MIT-Lizenz](https://github.com/ethereum/ethereum-org-website/blob/dev/LICENSE) erstellt, sofern nicht anders angegeben. Mehr zu den [Nutzungsbedingungen](/terms-of-use/) von ethereum.org. ## Offene Stellen {#open-jobs} -Auch wenn dies eine Open-Source-Website ist und jeder daran arbeiten kann, haben wir ein Team, das sich speziell mit ethereum.org und anderen Ethereum-Foundation-Webprojekten befasst. +Obwohl diese Website Open-Source ist und jeder daran arbeiten kann, haben wir ein Team, das sich ethereum.org und anderen Webprojekten der Ethereum Foundation widmet. -Wir werden alle Stellenangebote hier veröffentlichen. Wenn dir keine dieser Rollen zusagt, gehe zu [Discord](https://discord.gg/ethereum-org) und lass uns wissen, wie du mit uns arbeiten möchtest! +Wir werden alle offenen Stellen hier veröffentlichen. Wenn Sie hier keine passende Rolle für sich sehen, besuchen Sie [unseren Discord-Server](https://discord.gg/ethereum-org) und lassen Sie uns wissen, wie Sie mit uns zusammenarbeiten möchten! -Siehst du über das ethereum.org-Team hinaus? [Schau dir andere Jobs im Zusammenhang mit Ethereum an](/community/get-involved/#ethereum-jobs/). +Suchen Sie über das ethereum.org-Team hinaus? [Sehen Sie sich andere Ethereum-bezogene Jobs an](/community/get-involved/#ethereum-jobs/). \ No newline at end of file diff --git a/public/content/translations/de/ai-agents/index.md b/public/content/translations/de/ai-agents/index.md new file mode 100644 index 00000000000..178cc89244e --- /dev/null +++ b/public/content/translations/de/ai-agents/index.md @@ -0,0 +1,143 @@ +--- +title: KI-Agenten +metaTitle: KI-Agenten | KI-Agenten auf Ethereum +description: "Ein Überblick über KI-Agenten auf Ethereum" +lang: de +template: use-cases +emoji: ":robot:" +sidebarDepth: 2 +image: /images/ai-agents/hero-image.png +alt: Menschen versammelt an einem Terminal-Tisch +summaryPoint1: "KI, die mit der Blockchain interagiert und unabhängig handelt" +summaryPoint2: Kontrolliert Wallets und Gelder auf der Blockchain +summaryPoint3: "Stellt Menschen oder andere Agenten für Arbeiten ein" +buttons: + - content: Was sind KI-Agenten? + toId: what-are-ai-agents + - content: Agenten entdecken + toId: ai-agents-on-ethereum + isSecondary: false +--- + +Stellen Sie sich vor, Sie navigieren durch Ethereum mit einem KI-Assistenten, der rund um die Uhr Markttrends auf der Blockchain studiert, Fragen beantwortet und sogar Transaktionen in Ihrem Namen ausführt. Willkommen in der Welt der KI-Agenten – intelligente Systeme, die entwickelt wurden, um Ihr digitales Leben zu vereinfachen. + +Auf Ethereum sehen wir Innovationen von KI-Agenten, die von virtuellen Influencern und autonomen Content-Erstellern bis hin zu Echtzeit-Marktanalyseplattformen reichen. Sie stärken die Nutzer, indem sie Einblicke, Unterhaltung und betriebliche Effizienz bieten. + +## Was sind KI-Agenten? {#what-are-ai-agents} + +KI-Agenten sind Softwareprogramme, die künstliche Intelligenz nutzen, um Aufgaben auszuführen oder eigene Entscheidungen zu treffen. Sie lernen aus Daten, passen sich an Veränderungen an und bewältigen komplexe Aufgaben. Sie arbeiten ununterbrochen und können Gelegenheiten sofort erkennen. + +### Wie KI-Agenten mit Blockchains arbeiten {#how-ai-agents-work-with-blockchains} + +Im traditionellen Finanzwesen agieren KI-Agenten oft in zentralisierten Umgebungen mit begrenzten Dateneingaben. Dies behindert ihre Fähigkeit, autonom zu lernen oder Vermögenswerte zu verwalten. + +Im Gegensatz dazu bietet das dezentralisierte Ökosystem von Ethereum mehrere entscheidende Vorteile: + +- Transparente Daten: Zugriff auf Echtzeit-Blockchain-Informationen. +- Echter Besitz von Vermögenswerten: Digitale Vermögenswerte sind vollständig im Besitz von KI-Agenten. +- Robuste Funktionalität auf der Blockchain: Ermöglicht es KI-Agenten, Transaktionen auszuführen, mit Smart Contracts zu interagieren, Liquidität bereitzustellen und über Protokolle hinweg zusammenzuarbeiten. + +Diese Faktoren verwandeln KI-Agenten von einfachen Bots in dynamische, sich selbst verbessernde Systeme, die in mehreren Sektoren erheblichen Mehrwert bieten: + + + + + + + +## Verifizierbare KI {#verifiable-ai} + +KI-Agenten, die Off-Chain laufen, verhalten sich oft wie „Black Boxes“ – ihre Argumentation, Eingaben und Ausgaben können nicht unabhängig verifiziert werden. Ethereum ändert das. Durch die Verankerung des Agentenverhaltens auf der Blockchain können Entwickler Agenten bauen, die _vertrauenslos_, _transparent_ und _wirtschaftlich autonom_ sind. Die Aktionen solcher Agenten können geprüft, eingeschränkt und nachgewiesen werden. + +### Verifizierbare Inferenz {#verifiable-inference} + +KI-Inferenz findet traditionell Off-Chain statt, wo die Ausführung günstig, aber die Modellausführung undurchsichtig ist. Auf Ethereum können Entwickler Agenten mit verifizierbarer Berechnung unter Verwendung mehrerer Techniken koppeln: + +- [**zkML (Zero-Knowledge Machine Learning)**](https://opengradient.medium.com/a-gentle-introduction-to-zkml-8049a0e10a04) lässt Agenten beweisen, dass ein Modell korrekt ausgeführt wurde, ohne das Modell oder die Eingaben preiszugeben +- [**TEE-Bestätigungen (Trusted Execution Environment)**](https://en.wikipedia.org/wiki/Trusted_execution_environment) ermöglichen hardwaregestützte Beweise, dass ein Agent ein bestimmtes Modell oder einen bestimmten Codepfad ausgeführt hat +- **Unveränderlichkeit auf der Blockchain** stellt sicher, dass diese Beweise und Bestätigungen von jedem Vertrag oder Agenten referenziert, wiederholt und vertraut werden können + +## Zahlungen und Handel mit x402 {#x402} + +Das [x402-Protokoll](https://www.x402.org/), das auf Ethereum und L2s bereitgestellt wird, bietet Agenten eine native Möglichkeit, für Ressourcen zu bezahlen und ohne menschliches Eingreifen wirtschaftlich zu interagieren. Agenten können: + +- Für Rechenleistung, Daten und API-Aufrufe mit Stablecoins bezahlen +- Bestätigungen von anderen Agenten oder Diensten anfordern oder verifizieren +- Am Agent-zu-Agent-Handel teilnehmen und Rechenleistung, Daten oder Modellausgaben kaufen und verkaufen + +x402 verwandelt Ethereum in eine programmierbare wirtschaftliche Ebene für autonome Agenten und ermöglicht Pay-per-Use-Interaktionen anstelle von Konten, Abonnements oder zentralisierter Abrechnung. + +### Sicherheit im agentenbasierten Finanzwesen {#agentic-finance-security} + +Autonome Agenten benötigen Leitplanken. Ethereum bietet diese auf Wallet- und Vertragsebene: + +- [Smart Accounts (EIP-4337)](https://eips.ethereum.org/EIPS/eip-4337) ermöglichen es Entwicklern, Ausgabenlimits, Whitelists, Sitzungsschlüssel und granulare Berechtigungen durchzusetzen +- Programmierte Einschränkungen in Smart Contracts können beschränken, was ein Agent tun darf +- Inferenzbasierte Limits (z. B. die Anforderung eines zkML-Beweises vor der Ausführung einer risikoreichen Aktion) fügen eine weitere Sicherheitsebene hinzu + +Diese Kontrollen ermöglichen den Einsatz von autonomen Agenten, die nicht unbegrenzt handeln können. + +### Register auf der Blockchain: ERC-8004 {#erc-8004} + +[ERC-8004](https://eips.ethereum.org/EIPS/eip-8004) definiert Register auf der Blockchain für Agentenidentität, Reputation und Validierung. Es wurde von Mitwirkenden von MetaMask, der Ethereum Foundation, Google und Coinbase mitverfasst und ist in 16 Netzwerken im Einsatz, darunter das Ethereum-Mainnet, Base, Polygon, Arbitrum und andere. + +Es bietet: + +- Ein **Identitätsregister** für portable, zensurresistente Agenten-Identifikatoren +- Ein **Reputationsregister** für standardisierte Feedback-Signale über Anwendungen hinweg +- Ein **Validierungsregister** zur Anforderung unabhängiger Verifizierung (zkML, TEE, gestakte Neuausführung) + +ERC-8004 macht es für Agenten einfacher, einander in einer vollständig dezentralisierten Umgebung zu entdecken, zu verifizieren und miteinander zu handeln. + +## KI-Agenten auf Ethereum {#ai-agents-on-ethereum} + +Wir fangen gerade erst an, das volle Potenzial von KI-Agenten zu erkunden, und Projekte nutzen bereits die Synergie zwischen KI und Blockchain – insbesondere bei Transparenz und Monetarisierung. + + + +Lunas erster Auftritt als Podcast-Gast + + + +## Von Agenten kontrollierte Wallets {#agent-controlled-wallets} + +Agenten wie Luna oder AIXBT kontrollieren ihr eigenes Wallet auf der Blockchain ([AIXBTs Wallet](https://clusters.xyz/aixbt), [Lunas Wallet](https://zapper.xyz/account/0x0d177181e3763b20d47dc3a72dd584368bd8bf43)), was es ihnen ermöglicht, Fans Trinkgeld zu geben und an wirtschaftlichen Aktivitäten teilzunehmen. + +Während Lunas X-Social-Kampagne #LunaMuralChallenge wählte und belohnte Luna die Gewinner über ihr Base-Wallet – dies markiert das erste Mal, dass eine KI Menschen für eine Krypto-Belohnung einstellt. + + + + +

Gut zu wissen

+

KI-Agenten und verwandte Tools befinden sich noch in einer frühen Entwicklungsphase und sind sehr experimentell – mit Vorsicht verwenden.

+
+
+ +## Steuern Sie Ihr Wallet mit Chat-Befehlen {#control-your-wallet-using-chat-commands} + +Sie können die komplizierten Schnittstellen von DeFi überspringen und Ihre Kryptowährungen mit einfachen Chat-Befehlen verwalten. + +Dieser intuitive Ansatz macht Transaktionen schneller, einfacher und weniger fehleranfällig, wie z. B. das Senden von Geldern an die falsche Adresse oder das Überbezahlen von Gebühren. + + + +## KI-Agenten vs. KI-Bots {#ai-agents-vs-ai-bots} + +Die Unterscheidung zwischen KI-Agenten und KI-Bots kann manchmal verwirrend sein, da beide automatisierte Aktionen basierend auf Eingaben ausführen. + +- KI-Bots sind wie automatisierte Assistenten – sie befolgen spezifische, vorprogrammierte Anweisungen, um Routineaufgaben auszuführen. +- KI-Agenten sind eher wie intelligente Begleiter – sie lernen aus Erfahrung, passen sich an neue Informationen an und treffen eigene Entscheidungen. + +| | KI-Agenten | KI-Bots | +| ------------------- | ---------------------------------------------------------------------- | ------------------------------------------- | +| **Interaktionen** | Komplex, anpassungsfähig, autonom | Einfach, vordefinierter Umfang, fest codiert | +| **Lernen** | Lernt kontinuierlich, kann experimentieren und sich in Echtzeit an neue Daten anpassen | Arbeitet mit vortrainierten Daten oder festen Regeln | +| **Aufgabenerfüllung** | Zielt darauf ab, umfassendere Ziele zu erreichen | Konzentriert sich nur auf spezifische Aufgaben | + +## Tiefer eintauchen {#dive-deeper} + + + +## Sie können Ihren eigenen KI-Agenten bauen {#you-can-build-your-own-ai-agent} + + \ No newline at end of file diff --git a/public/content/translations/de/bridges/index.md b/public/content/translations/de/bridges/index.md index b297e44adcb..30a88fa3954 100644 --- a/public/content/translations/de/bridges/index.md +++ b/public/content/translations/de/bridges/index.md @@ -1,133 +1,144 @@ --- -title: Einführung in Blockchain-Brücken -description: Brücken erlauben es Benutzern, ihr Guthaben über verschiedene Blockchains zu verschieben +title: "Einführung in Blockchain-Brücken" +description: "Kettenübergreifende Brücken ermöglichen es Benutzern, ihre Geldmittel über verschiedene Blockchains hinweg zu bewegen" lang: de --- # Blockchain-Brücken {#prerequisites} -_Web3 hat sich zu einem Ökosystem von L1 Blockchains und L2 Skalierungslösungen entwickelt, die jeweils mit einzigartigen Fähigkeiten und Gegenleistungen entwickelt wurden. Mit zunehmender Zahl der Blockchain-Protokolle steigt auch das Bedürfnis danach, Assets über Blockchains hinweg zu verschieben. Um diesem Bedürfnis gerecht zu werden, brauchen wir Brücken._ +_Web3 hat sich zu einem Ökosystem aus L1-Blockchains und L2-Skalierungslösungen entwickelt, die jeweils mit einzigartigen Fähigkeiten und Kompromissen entworfen wurden. Mit der steigenden Anzahl von Blockchain-Protokollen wächst auch die Nachfrage, Vermögenswerte über verschiedene Chains hinweg zu bewegen. Um diese Nachfrage zu befriedigen, benötigen wir kettenübergreifende Brücken._ -## Was sind Brücken? {#what-are-bridges} +## Was sind kettenübergreifende Brücken? {#what-are-bridges} -Blockchain-Brücken funktionieren genau wie Brücken in der realen Welt. Genau wie eine Brücke zwei Orte in der realen Welt verbindet, verbindet eine Blockchain-Brücke zwei Blockchain-Ökosysteme. **Brücken vereinfachen die Kommunikation zwischen Blockchains durch die Übertragung von Informationen und Assets**. +Blockchain-Brücken funktionieren genau wie die Brücken, die wir aus der physischen Welt kennen. So wie eine physische Brücke zwei physische Orte verbindet, verbindet eine Blockchain-Brücke zwei Blockchain-Ökosysteme. **Kettenübergreifende Brücken erleichtern die Kommunikation zwischen Blockchains durch die Übertragung von Informationen und Vermögenswerten**. -Sehen wir uns ein Beispiel an: +Betrachten wir ein Beispiel: -Sie kommen aus den USA und planen eine Reise nach Europa. Sie haben USD aber benötigen zum Bezahlen EUR. Um Ihre USD in EUR umzutauschen, können Sie gegen eine geringe Gebühr einen Währungstausch durchführen. +Sie kommen aus den USA und planen eine Reise nach Europa. Sie haben USD, benötigen aber EUR für Ihre Ausgaben. Um Ihre USD in EUR umzutauschen, können Sie gegen eine kleine Gebühr eine Wechselstube nutzen. -Aber was tun Sie, wenn Sie einen ähnlichen Austausch durchführen möchten, um eine andere [Blockchain](/glossary/#blockchain) zu benutzen? Angenommen, Sie möchten [ETH](/glossary/#ether) auf dem Ethereum Mainnet gegen ETH auf [Arbitrum](https://arbitrum.io/) tauschen. Genau wie der Währungstausch, den wir bei EUR durchgeführt haben, brauchen wir einen Mechanismus, um ETH von Ethereum zu Arbitrum umzutauschen. Brücken machen so eine Transaktion möglich. In diesem Fall hat [Arbitrum eine lokale Brücke](https://bridge.arbitrum.io/), welche ETH vom Hauptnetzwerk zu Arbitrum transferieren kann. +Aber was tun Sie, wenn Sie einen ähnlichen Tausch vornehmen möchten, um eine andere [Blockchain](/glossary/#blockchain) zu nutzen? Angenommen, Sie möchten [ETH](/glossary/#ether) im [Ethereum](/)-Mainnet gegen ETH auf [Arbitrum](https://arbitrum.io/) tauschen. Wie beim Währungstausch für EUR benötigen wir einen Mechanismus, um unsere ETH von Ethereum zu Arbitrum zu bewegen. Kettenübergreifende Brücken machen eine solche Transaktion möglich. In diesem Fall [verfügt Arbitrum über eine native Brücke](https://portal.arbitrum.io/bridge), die ETH vom Mainnet zu Arbitrum übertragen kann. -## Warum brauchen wir Brücken? {#why-do-we-need-bridges} +## Warum brauchen wir kettenübergreifende Brücken? {#why-do-we-need-bridges} -Alle Blockchains haben ihre Grenzen. Damit Ethereum mit der Nachfrage mithalten und skalieren kann, sind [Rollups](/glossary/#rollups) erforderlich. Alternativ sind L1s wie Solana und Avalanche anders konzipiert worden, um einen höheren Durchsatz zu ermöglichen. Dies geschieht aber auf Kosten der Dezentralität. +Alle Blockchains haben ihre Grenzen. Damit Ethereum skalieren und mit der Nachfrage Schritt halten kann, waren [Rollups](/glossary/#rollups) erforderlich. Alternativ sind L1s wie Solana und Avalanche anders konzipiert, um einen höheren Durchsatz zu ermöglichen, jedoch auf Kosten der Dezentralisierung. -Jedoch entwickeln sich alle Blockchains in isolierten Umgebungen und haben verschiedene Regeln und [Konsens](/glossary/#consensus)-Mechanismen. Das bedeutet, dass sie in Ihrer Urform nicht miteinander kommunizieren können, und Token können sich nicht frei zwischen den Blockchains bewegen. +Allerdings werden alle Blockchains in isolierten Umgebungen entwickelt und haben unterschiedliche Regeln und [Konsensmechanismen](/glossary/#consensus). Das bedeutet, dass sie nicht nativ kommunizieren können und Token sich nicht frei zwischen Blockchains bewegen können. -Brücken existieren, um Blockchains miteinander zu verbinden. Sie erlauben den Transfer von Informationen und Token zwischen den Blockchains. +Kettenübergreifende Brücken existieren, um Blockchains zu verbinden und die Übertragung von Informationen und Token zwischen ihnen zu ermöglichen. -**Brücken ermöglichen**: +**Kettenübergreifende Brücken ermöglichen**: -- der Chain-übergreifende Transfer von Assets und Informationen. -- den Zugriff auf die Stärken verschiedener Blockchains durch [DApps](/glossary/#dapp) – wodurch sich ihre Fähigkeiten verbessern (da Protokolle nun mehr Gestaltungsspielraum für Innovationen haben). -- Benutzer können auf neue Plattformen zugreifen, und die Vorteile verschiedener Blockchains zu nutzen. -- Entwickler aus verschiedenen Blockchain-Ökosystemen können zusammenarbeiten, um neue Plattformen für die Benutzer zu erschaffen. +- die kettenübergreifende Übertragung von Vermögenswerten und Informationen. +- [Dapps](/glossary/#dapp), auf die Stärken verschiedener Blockchains zuzugreifen – und so ihre Fähigkeiten zu verbessern (da Protokolle nun mehr Gestaltungsspielraum für Innovationen haben). +- Benutzern den Zugang zu neuen Plattformen und die Nutzung der Vorteile verschiedener Chains. +- Entwicklern aus verschiedenen Blockchain-Ökosystemen die Zusammenarbeit und den Aufbau neuer Plattformen für die Benutzer. -[Wie man Token auf die Layer 2 überträgt](/guides/how-to-use-a-bridge/) +[So übertragen Sie Token über eine Brücke auf Ebene 2](/guides/how-to-use-a-bridge/) -## Anwendungsfälle für Brücken {#bridge-use-cases} +## Anwendungsfälle für kettenübergreifende Brücken {#bridge-use-cases} -Für die folgenden Szenarien können Brücken verwendet werden: +Im Folgenden finden Sie einige Szenarien, in denen Sie eine kettenübergreifende Brücke verwenden können: ### Niedrigere Transaktionsgebühren {#transaction-fees} -Nehmen wir an, Sie haben ETH auf dem Ethereum-Hauptnetzwerk, wollen aber günstigere Transaktionsgebühren, um verschiedene dApps auszuprobieren. Wenn Sie Ihr ETH vom Hauptnetzwerk zu einem Ethereum L2 Rollup überbrücken, können Sie günstigere Transaktionsgebühren nutzen. +Angenommen, Sie haben ETH im Ethereum-Mainnet, möchten aber günstigere Transaktionsgebühren, um verschiedene Dapps zu erkunden. Indem Sie Ihre ETH über eine Brücke vom Mainnet zu einem Ethereum-L2-Rollup übertragen, können Sie von niedrigeren Transaktionsgebühren profitieren. -### dApps auf anderen Blockchains {#dapps-other-chains} +### Dapps auf anderen Blockchains {#dapps-other-chains} -Wenn Sie Aave auf dem Ethereum-Hauptnetzwerk verwenden, um USDT zu leihen, aber der Zinssatz für USDT mit Aave auf Polygon höher ist. +Wenn Sie Aave im Ethereum-Mainnet verwendet haben, um USDT bereitzustellen, aber der Zinssatz, den Sie für die Bereitstellung von USDT über Aave auf Polygon erhalten können, höher ist. -### Entdecken Sie Blockchain-Ökosysteme {#explore-ecosystems} +### Blockchain-Ökosysteme erkunden {#explore-ecosystems} -Wenn Sie ETH auf dem Ethereum-Hauptnetzwerk haben und ein alternatives L1 erkunden möchten, um dessen native dApps auszuprobieren. Sie können eine Brücke benutzen, um Ihr ETH vom Ethereum-Hauptnetzwerk auf die alternative L1 zu übertragen. +Wenn Sie ETH im Ethereum-Mainnet haben und eine alternative L1 erkunden möchten, um deren native Dapps auszuprobieren. Sie können eine kettenübergreifende Brücke verwenden, um Ihre ETH vom Ethereum-Mainnet zur alternativen L1 zu übertragen. -### Erhalten Sie native Krypto-Vermögenswerte {#own-native} +### Eigene native Krypto-Vermögenswerte besitzen {#own-native} -Nehmen wir an, Sie möchten native Bitcoin (BTC) besitzen, aber Sie haben nur Geld auf dem Ethereum-Hauptnetzwerk. Um Bitcoin auf Ethereum zu besitzen, können Sie Wrapped Bitcoin (WBTC) kaufen. Jedoch ist WBTC ein [ERC-20](/glossary/#erc-20)-Token, das im Ethereum-Netzwerk nativ ist, d. h. es ist eine Ethereum-Version von Bitcoin und nicht das originale Asset auf der Bitcoin-Blockchain. Um ursprüngliche BTC zu besitzen, muss eine Brücke zwischen Ethereum und Bitcoin genutzt werden. Mit dieser Brücke lässt sich WBTC in ursprüngliche BTC umwandeln. Alternativ besitzen Sie vielleicht BTC und möchten diese in Ethereum-[DeFi](/glossary/#defi)-Protokollen nutzen. Dann müssten Sie Ihre BTC in WBTC umwandeln, welche Sie dann als Vermögenswert in Ethereum nutzen können. +Angenommen, Sie möchten nativen Bitcoin (BTC) besitzen, haben aber nur Geldmittel im Ethereum-Mainnet. Um auf Ethereum in BTC zu investieren, können Sie Wrapped Bitcoin (WBTC) kaufen. WBTC ist jedoch ein [ERC-20](/glossary/#erc-20)-Token, der im Ethereum-Netzwerk nativ ist, was bedeutet, dass es sich um eine Ethereum-Version von Bitcoin handelt und nicht um den ursprünglichen Vermögenswert auf der Bitcoin-Blockchain. Um nativen BTC zu besitzen, müssten Sie Ihre Vermögenswerte mithilfe einer kettenübergreifenden Brücke von Ethereum zu Bitcoin übertragen. Dadurch wird Ihr WBTC überbrückt und in nativen BTC umgewandelt. Alternativ besitzen Sie vielleicht BTC und möchten diesen in Ethereum-[DeFi](/glossary/#defi)-Protokollen verwenden. Dies würde eine Überbrückung in die andere Richtung erfordern, von BTC zu WBTC, der dann als Vermögenswert auf Ethereum verwendet werden kann. - Sie können all dies auch mit [zentralisierten Krypto-Börsen](/get-eth/) tun. Wenn Ihr Guthaben jedoch nicht bereits auf einer Krypto-Börse ist, würde dies mehrere Schritte erfordern, und es wäre wahrscheinlich besser, eine Brücke zu benutzen. + Sie können all dies auch über eine [zentralisierte Börse](/get-eth) tun. Wenn sich Ihre Geldmittel jedoch nicht bereits auf einer Börse befinden, wären mehrere Schritte erforderlich, und Sie wären wahrscheinlich besser dran, eine kettenübergreifende Brücke zu verwenden. -## Arten von Brücken {#types-of-bridge} +## Arten von kettenübergreifenden Brücken {#types-of-bridge} -Brücken haben viele Arten von Entwürfen und Verkomplizierungen. Im Allgemeinen fallen Brücken in zwei Kategorien: vertrauenswürdige und vertrauenslose Brücken. +Kettenübergreifende Brücken weisen viele Arten von Designs und Feinheiten auf. Im Allgemeinen fallen Brücken in zwei Kategorien: vertrauenswürdige (trusted) und vertrauenslose (trustless) Brücken. -| Vertrauenswürdige Brücken | Vertrauenslose Brücken | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| Vertrauenswürdige Brücken sind für ihre Operationen von einer zentralen Einheit oder einem zentralen System abhängig. | Vertrauenslose Brücken arbeiten mit intelligenten Verträgen und Algorithmen. | -| Sie haben Vertrauen in die Verwahrung der Mittel und die Sicherheit der Brücke. Die Benutzer sind meist auf den Ruf des Brückenbetreibers angewiesen. | Sie sind vertrauenslos, d. h. die Sicherheit der Brücke ist die gleiche wie die der zugrunde liegenden Blockchain. | -| Benutzer müssen die Kontrolle über ihre Krypto-Assets aufgeben. | Vertrauenslose Brücken ermögliches es Nutzern via [Smart Contracts](/glossary/#smart-contract), die Kontrolle über ihre Finanzmittel zu behalten. | +| Vertrauenswürdige Brücken (Trusted Bridges) | Vertrauenslose Brücken (Trustless Bridges) | +| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| Vertrauenswürdige Brücken sind für ihren Betrieb auf eine zentrale Entität oder ein zentrales System angewiesen. | Vertrauenslose Brücken arbeiten mit Smart Contracts und Algorithmen. | +| Sie haben Vertrauensannahmen in Bezug auf die Verwahrung von Geldmitteln und die Sicherheit der Brücke. Benutzer verlassen sich meist auf den Ruf des Brückenbetreibers. | Sie sind vertrauenslos, d. h. die Sicherheit der Brücke entspricht der der zugrunde liegenden Blockchain. | +| Benutzer müssen die Kontrolle über ihre Krypto-Vermögenswerte aufgeben. | Durch [Smart Contracts](/glossary/#smart-contract) ermöglichen vertrauenslose Brücken den Benutzern, die Kontrolle über ihre Geldmittel zu behalten. | -Kurz gesagt, wir können sagen, dass vertrauenswürdige Brücken auf Vertrauensannahmen beruhen, während vertrauenslose Brücken vertraulich minimiert werden und keine neuen Vertrauensannahmen treffen, die über die der zugrunde liegenden Domain hinausgehen. So können diese Begriffe beschrieben werden: +Kurz gesagt können wir sagen, dass vertrauenswürdige Brücken Vertrauensannahmen haben, während vertrauenslose Brücken vertrauensminimiert sind und keine neuen Vertrauensannahmen über die der zugrunde liegenden Domänen hinaus treffen. So lassen sich diese Begriffe beschreiben: -- **Vertrauenslos**: äquivalente Sicherheit zu den zugrunde liegenden Domains. Wie von [Arjun Bhuptani in diesem Artikel beschrieben.](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) -- **Vertrauensannahmen:** weg von der Sicherheit der zugrunde liegenden Domains durch Hinzufügen externer Prüfer im System und somit weniger krypto-ökonomisch sicher. +- **Vertrauenslos (Trustless)**: Sie weisen eine gleichwertige Sicherheit wie die zugrunde liegenden Domänen auf. Wie von [Arjun Bhuptani in diesem Artikel](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) beschrieben. +- **Vertrauensannahmen (Trust assumptions):** Abkehr von der Sicherheit der zugrunde liegenden Domänen durch Hinzufügen externer Prüfer im System, wodurch es kryptoökonomisch weniger sicher wird. -Um ein besseres Verständnis der wichtigsten Unterschiede zwischen den beiden Ansätzen zu entwickeln, betrachten wir ein Beispiel: +Um ein besseres Verständnis für die Hauptunterschiede zwischen den beiden Ansätzen zu entwickeln, nehmen wir ein Beispiel: -Stellen Sie sich vor, Sie sind am Sicherheitskontrollpunkt eines Flughafens. Es gibt zwei Arten von Kontrollpunkten: +Stellen Sie sich vor, Sie befinden sich an der Sicherheitskontrolle am Flughafen. Es gibt zwei Arten von Kontrollpunkten: -1. Manuelle Checkpoints – betrieben von Beamten, die alle Details Ihres Tickets und Ihrer Identität vor der Übergabe der Bordkarte manuell überprüfen. -2. Self Check-In — betrieben von einer Maschine, in der Sie Ihre Flugdaten eintragen und die Bordkarte erhalten, wenn alles korrekt ist. +1. Manuelle Kontrollpunkte — betrieben von Beamten, die alle Details Ihres Tickets und Ihrer Identität manuell überprüfen, bevor sie die Bordkarte aushändigen. +2. Selbst-Check-in — betrieben von einem Automaten, in den Sie Ihre Flugdaten eingeben und die Bordkarte erhalten, wenn alles in Ordnung ist. -Ein manueller Checkpoint ist ähnlich wie ein vertrauenswürdiges Modell, da sein Funktionieren von einer Drittpartei, z. B. den Officials, abhängig ist. Als Benutzer vertrauen Sie den Beamten, die richtigen Entscheidungen zu treffen und Ihre persönlichen Daten korrekt zu verwenden. +Ein manueller Kontrollpunkt ähnelt einem vertrauenswürdigen Modell, da er für seinen Betrieb von einer dritten Partei, d. h. den Beamten, abhängig ist. Als Benutzer vertrauen Sie darauf, dass die Beamten die richtigen Entscheidungen treffen und Ihre privaten Informationen korrekt verwenden. -Self Check-in ist ähnlich einem vertrauenslosen Modell, da es die Rolle des Betreibers entfernt und die Technologie für seine Operationen verwendet. Benutzer behalten immer die Kontrolle über ihre Daten und müssen Dritten keine privaten Informationen anvertrauen. +Der Selbst-Check-in ähnelt einem vertrauenslosen Modell, da er die Rolle des Betreibers beseitigt und Technologie für seinen Betrieb nutzt. Benutzer behalten stets die Kontrolle über ihre Daten und müssen ihre privaten Informationen keiner dritten Partei anvertrauen. -Viele Brückenlösungen übernehmen Modelle zwischen diesen beiden Extremen mit unterschiedlichem Grad an Vertrauenslosigkeit. +Viele Brückenlösungen übernehmen Modelle zwischen diesen beiden Extremen mit unterschiedlichen Graden an Vertrauenslosigkeit. -## Risiken von Brücken {#bridge-risk} +## Kettenübergreifende Brücken nutzen {#use-bridge} -Brücken befinden sich in der Anfangsphase der Entwicklung. Es ist wahrscheinlich, dass das optimale Brückenkonzept noch nicht entdeckt wurde. Die Interaktion mit jeder Art von Brücke birgt eine gewisse Gefahr: +Die Verwendung von kettenübergreifenden Brücken ermöglicht es Ihnen, Ihre Vermögenswerte über verschiedene Blockchains hinweg zu bewegen. Hier sind einige Ressourcen, die Ihnen helfen können, Brücken zu finden und zu nutzen: -- **Smart-Contract-Risiko —** das Risiko eines Fehlers im Code, sodass Benutzergelder verloren gehen könnten -- **Technologierisiko —** Softwarefehler, fehlerhafter Code, menschlicher Fehler, Spam und böswillige Angriffe können möglicherweise Benutzeroperationen stören +- **[L2BEAT Bridges Summary](https://l2beat.com/bridges/summary) & [L2BEAT Bridges Risk Analysis](https://l2beat.com/bridges/summary)**: Eine umfassende Zusammenfassung verschiedener Brücken, einschließlich Details zu Marktanteil, Brückentyp und Ziel-Chains. L2BEAT bietet auch eine Risikoanalyse für Brücken, die Benutzern hilft, fundierte Entscheidungen bei der Auswahl einer Brücke zu treffen. +- **[DefiLlama Bridge Summary](https://defillama.com/bridges/Ethereum)**: Eine Zusammenfassung der Brückenvolumina über Ethereum-Netzwerke hinweg. -Und da vertrauenswürdige Brücken Vertrauensannahmen hinzufügen, tragen sie zusätzliche Risiken wie: + + +## Risiken bei der Nutzung von kettenübergreifenden Brücken {#bridge-risk} + +Kettenübergreifende Brücken befinden sich in einem frühen Entwicklungsstadium. Es ist wahrscheinlich, dass das optimale Brückendesign noch nicht entdeckt wurde. Die Interaktion mit jeder Art von Brücke birgt Risiken: + +- **Smart-Contract-Risiko —** das Risiko eines Fehlers im Code, der zum Verlust von Benutzergeldern führen kann +- **Technologierisiko —** Softwarefehler, fehlerhafter Code, menschliches Versagen, Spam und böswillige Angriffe können möglicherweise den Benutzerbetrieb stören + +Da vertrauenswürdige Brücken zudem Vertrauensannahmen hinzufügen, bergen sie zusätzliche Risiken wie: - **Zensurrisiko —** Brückenbetreiber können Benutzer theoretisch daran hindern, ihre Vermögenswerte über die Brücke zu übertragen -- **Verwahrungsrisiko —** Brückenbetreiber können sich zusammentun, um die Gelder der Benutzer zu stehlen +- **Verwahrungsrisiko —** Brückenbetreiber können sich absprechen, um die Geldmittel der Benutzer zu stehlen -Das Guthaben des Benutzers ist gefährdet, wenn: +Die Geldmittel der Benutzer sind gefährdet, wenn: -- es einen Fehler im Smart Contract gibt +- ein Fehler im Smart Contract vorliegt - der Benutzer einen Fehler macht -- die zugrunde liegende Blockchain gehackt wurde -- die Brückenbetreiber böswillige Absichten in einer vertrauenswürdigen Brücke haben +- die zugrunde liegende Blockchain gehackt wird +- die Brückenbetreiber bei einer vertrauenswürdigen Brücke böswillige Absichten haben - die Brücke gehackt wird -Ein kürzlicher Hack war der von Solanas Wormhole-Brücke, [wo 120T wETH (325 Millionen USD) während des Angriffs gestolen wurden](https://rekt.news/wormhole-rekt/). Bei vielen der [größten Blockchain-Hacks waren Brücken involviert](https://rekt.news/leaderboard/). +Ein kürzlicher Hack betraf die Wormhole-Brücke von Solana, [bei dem während des Hacks 120.000 wETH (325 Millionen USD) gestohlen wurden](https://rekt.news/wormhole-rekt/). Viele der [größten Hacks bei Blockchains betrafen Brücken](https://rekt.news/leaderboard/). -Brücken sind von entscheidender Bedeutung für Benutzer, die Ethereum L2s und sogar verschiedene Ökosysteme erkunden wollen. Angesichts der Risiken, die mit der Interaktion mit Brücken verbunden sind, müssen die Benutzer jedoch verstehen, welche Kompromisse die Brücken eingehen. Dies sind einige [Strategien für die Crosschain-Sicherheit](https://blog.debridge.finance/10-strategies-for-cross-chain-security-8ed5f5879946). +Kettenübergreifende Brücken sind entscheidend für das Onboarding von Benutzern auf Ethereum-L2s und auch für Benutzer, die verschiedene Ökosysteme erkunden möchten. Angesichts der Risiken, die mit der Interaktion mit Brücken verbunden sind, müssen Benutzer jedoch die Kompromisse verstehen, die die Brücken eingehen. Dies sind einige [Strategien für kettenübergreifende Sicherheit](https://debridge.com/learn/blog/10-strategies-for-cross-chain-security/). -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [EIP-5164: Cross-Chain-Ausführung](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) _18. Juni 2022 - Brendan Asselstine_ -- [L2Bridge Risiko-Framework](https://gov.l2beat.com/t/l2bridge-risk-framework/31) _5. Juli 2022 - Bartek Kiepuszewski_ -- [„Warum die Zukunft eine Multi-Chain, aber keine Cross-Chain sein wird."](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) _8. Januar 2022 - Vitalik Buterin_ +- [EIP-5164: Cross-Chain Execution](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) – _18. Juni 2022 – Brendan Asselstine_ +- [L2Bridge Risk Framework](https://gov.l2beat.com/t/l2bridge-risk-framework/31) – _5. Juli 2022 – Bartek Kiepuszewski_ +- ["Why the future will be multi-chain, but it will not be cross-chain."](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) – _8. Januar 2022 – Vitalik Buterin_ +- [Harnessing Shared Security For Secure Cross-Chain Interoperability: Lagrange State Committees And Beyond](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) – _12. Juni 2024 – Emmanuel Awosika_ +- [The State Of Rollup Interoperability Solutions](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) – _20. Juni 2024 – Alex Hook_ \ No newline at end of file diff --git a/public/content/translations/de/community/code-of-conduct/index.md b/public/content/translations/de/community/code-of-conduct/index.md index 6de08c9fef4..38a0e5d1678 100644 --- a/public/content/translations/de/community/code-of-conduct/index.md +++ b/public/content/translations/de/community/code-of-conduct/index.md @@ -1,6 +1,6 @@ --- title: Verhaltenskodex -description: Die grundlegenden Standards, die wir für alle Bereiche von ethereum.org anstreben. +description: Die grundlegenden Standards, die wir in allen Bereichen von ethereum.org anstreben. lang: de --- @@ -8,70 +8,70 @@ lang: de ## Mission {#mission} -Die Entwicklung und Pflege der umfassendsten und barrierefreien Wissensplattform für Ethereum. +Die Entwicklung und Pflege des umfassendsten und zugänglichsten Wissenszentrums für Ethereum. ## Werte {#values} -Die ethereum.org-Community strebt nach folgenden Werten: +Die Community von ethereum.org strebt danach, Folgendes zu sein: -- Lehrreich, um jedem zu helfen, Ethereum zu verstehen -- Inklusiv -- Barrierefrei -- Community-basiert -- Fokussiert auf die Ethereum zugrunde liegende Technologie und Anwendungsfälle -- Fokussiert auf Ethereum-Konzepte und -Gestaltungsprinzipien +- lehrreich, mit dem Ziel, jedem zu helfen, Ethereum zu verstehen +- inklusiv +- zugänglich +- von der Community getragen +- fokussiert auf die zugrunde liegende Technologie und die Anwendungsfälle von Ethereum +- fokussiert auf Ethereum-Konzepte und Designprinzipien ## Was wir nicht sind {#what-we-are-not} - Die Website der Ethereum Foundation -- Eine Plattform zur Werbung für Investitionen oder Gewinnstreben jeglicher Art -- Eine Plattform zur Förderung oder Unterstützung einzelner Projekte oder Organisationen -- Eine DEX, CEX oder eine andere Form von Finanzplattform +- Eine Plattform zur Förderung von Investitionen oder Profitmacherei jeglicher Art +- Eine Plattform zur Hervorhebung oder Unterstützung einzelner Projekte oder Organisationen +- Eine dezentralisierte Börse (DEX), zentralisierte Börse (CEX) oder jegliche andere Form einer Finanzplattform - Eine Plattform, die finanzielle oder rechtliche Beratung jeglicher Art anbietet ## Verhaltenskodex {#code-of-conduct} ### Versprechen {#pledge} -Offene Beteiligung ist der Kern des Ethos von ethereum.org. Wir sind eine Website und eine Community, die von Tausenden von Mitwirkenden unterhalten wird. Und das ist nur möglich, wenn wir ein einladendes, partizipatives Umfeld aufrechterhalten. Zu diesem Zweck verpflichten sich die Mitwirkenden dieser Website, eine Umgebung frei von Belästigung für alle Teilnehmenden auf allen ethereum.org-Plattformen und den Community-Bereichen zu schaffen. Die ethereum.org-Community begrüßt und schätzt jeden, der sich konstruktiv und freundlich beteiligen möchte, unabhängig von Alter, Behinderung, ethnischer Zugehörigkeit, Geschlechtsmerkmalen, geschlechtlicher Identität, Erfahrungsstand, Fachgebiet, Bildung, sozioökonomischem Status, Nationalität, persönlichem Aussehen, Rasse, Religion oder anderen Aspekten der Vielfalt. +Offene Teilnahme ist der Kern des Ethos von ethereum.org. Wir sind eine Website und Community, die von Tausenden von Mitwirkenden gepflegt wird, und dies ist nur möglich, wenn wir ein einladendes, partizipatives Umfeld aufrechterhalten. Zu diesem Zweck verpflichten sich die Mitwirkenden dieser Website, ein belästigungsfreies Umfeld für alle Teilnehmer auf allen Plattformen und in allen Community-Bereichen von ethereum.org aufrechtzuerhalten. Die Community von ethereum.org heißt jeden willkommen und schätzt jeden, der sich auf konstruktive und freundliche Weise beteiligen möchte, unabhängig von Alter, Behinderung, ethnischer Zugehörigkeit, Geschlechtsmerkmalen, Geschlechtsidentität, Erfahrungsniveau, Fachgebiet, Bildung, sozioökonomischem Status, Nationalität, persönlichem Erscheinungsbild, Rasse, Religion oder jeder anderen Dimension von Vielfalt. ### Geltungsbereich {#scope} -Dieser Verhaltenskodex gilt für alle ethereum.org-Bereiche (wie z. B. GitHub, Discord, Figma Crowdin, Twitter und andere Online-Plattformen). Er gilt auch, wenn die Gemeinschaft in der realen Welt in der Öffentlichkeit vertreten ist, wie z. B. bei Meetings, Konferenzen und Veranstaltungen. +Dieser Verhaltenskodex gilt für alle Bereiche von ethereum.org (wie GitHub, Discord, Figma, Crowdin, X (ehemals Twitter) und andere Online-Plattformen) und er gilt auch, wenn die Community in realen öffentlichen Räumen wie bei Meetups, Konferenzen und Veranstaltungen vertreten ist. ### Unsere Standards {#our-standards} -Beispiele für Verhaltensweisen, die ein positives Umfeld fördern: +Beispiele für Verhaltensweisen, die zur Schaffung eines positiven Umfelds beitragen, sind: -- Verwendung einer einladenden und integrativen Sprache -- Respekt gegenüber unterschiedlichen Standpunkten und Erfahrungen -- Konstruktive Kritik akzeptieren und/oder einfühlsam äußern -- Ruhiges und professionelles Verhalten bei der Lösung von Konflikten oder Meinungsverschiedenheiten -- Einfühlungsvermögen und Toleranz gegenüber anderen Mitgliedern der Gemeinschaft zeigen -- Ermutigung und Verstärkung neuer Stimmen in der Gemeinschaft +- Verwendung einer einladenden und inklusiven Sprache +- Respektvoller Umgang mit unterschiedlichen Standpunkten und Erfahrungen +- Konstruktive Kritik wohlwollend annehmen und/oder einfühlsam äußern +- Ruhiges und professionelles Handeln bei der Lösung von Konflikten oder Meinungsverschiedenheiten +- Empathie und Toleranz gegenüber anderen Community-Mitgliedern zeigen +- Ermutigung und Verstärkung neuer Stimmen in der Community -Beispiele für inakzeptables Verhalten von Teilnehmenden: +Beispiele für inakzeptables Verhalten von Teilnehmern sind: -- Körperliche Gewalt, Androhung körperlicher Gewalt oder Aufforderung zu körperlicher Gewalt jeglicher Art -- Verwendung einer sexualisierten Sprache oder Bildsprache oder Signalisierung unerwünschter sexueller Aufmerksamkeit -- Sich als eine andere Person auszugeben oder auf andere Weise unredlich zu behaupten, eine Verbindung zu einer Person oder Organisation zu haben -- Trolling, beleidigende/abwertende Kommentare und persönliche oder politische Angriffe +- Physische Gewalt, Androhung physischer Gewalt oder Ermutigung zu physischer Gewalt jeglicher Art +- Verwendung sexualisierter Sprache oder Bilder oder das Aufdrängen unerwünschter sexueller Aufmerksamkeit +- Sich als eine andere Person ausgeben oder auf andere Weise unehrlich eine Zugehörigkeit zu einer Person oder Organisation behaupten +- Trolling, beleidigende/abfällige Kommentare sowie persönliche oder politische Angriffe - Belästigung anderer Community-Mitglieder in öffentlichen oder privaten Kanälen - Veröffentlichung privater Informationen anderer, wie z. B. einer physischen oder elektronischen Adresse, ohne ausdrückliche Erlaubnis -- Social Engineering, Scamming oder sonstige Manipulation anderer Community-Mitglieder -- Werbung für Investitionen, Token, Projekte oder andere Dinge zum persönlichen, finanziellen oder nicht-monetären Vorteil -- Spamming von Servern mit themenfremden Inhalten -- Missachtung von Aufforderungen oder Warnungen der Community-Moderatoren -- Anderes Verhalten, das in einem professionellen Umfeld als unangemessen angesehen werden könnte +- Social Engineering, Betrug oder anderweitige Manipulation anderer Community-Mitglieder +- Förderung von Investitionen, Token, Projekten oder allem anderen zum persönlichen monetären oder nicht-monetären Vorteil +- Spammen von Servern mit themenfremden Inhalten +- Missachtung von Bitten oder Warnungen von Community-Moderatoren +- Beteiligung an anderem Verhalten, das in einem professionellen Umfeld vernünftigerweise als unangemessen angesehen werden könnte ### Meldung {#reporting} -Verstöße gegen den Verhaltenskodex werden in der Regel für die Community sichtbar, da wir versuchen, alles in offenen bzw. öffentlichen Kanälen zu kommunizieren, damit die Community-Mitglieder sich selbst überprüfen können. +Verstöße gegen den Verhaltenskodex sind normalerweise für die Community sichtbar, da wir versuchen, alles in offenen, öffentlichen Kanälen zu tun, was es den Community-Mitgliedern ermöglicht, sich selbst zu kontrollieren. -Wenn jedoch etwas passiert, das Ihrer Meinung nach Aufmerksamkeit erfordert, können Sie es einer Person melden, die eine Moderationsrolle innehat (z. B. dem Discord-Guide), damit diese bei der Untersuchung helfen und die angemessene Reaktion ausführen kann. +Wenn jedoch etwas passiert, das Ihrer Meinung nach Aufmerksamkeit erfordert, können Sie dies bei jemandem mit einer Moderationsrolle (z. B. Discord-Guide) ansprechen, damit dieser bei der Untersuchung helfen und die entsprechende Reaktion ausführen kann. -Wenn Sie etwas melden, geben Sie bitte so viele Details wie möglich an, einschließlich spezifischer Beispiele und Zeitstempel. Das trägt dazu bei, ein faires Ergebnis zu gewährleisten. +Bitte geben Sie bei der Meldung so viele Details wie möglich an, einschließlich spezifischer Beispiele und Zeitstempel. Dies wird dazu beitragen, ein faires Ergebnis zu gewährleisten. ### Durchsetzung {#enforcement} -Je nach Schwere des Verstoßes können Personen, die gegen den Verhaltenskodex verstoßen, verwarnt bzw. vorübergehend oder dauerhaft aus der ethereum.org-Community verbannt werden. +Je nach Schweregrad können Personen, die gegen den Verhaltenskodex verstoßen, Verwarnungen, vorübergehende Sperren oder dauerhafte Sperren aus den ethereum.org-Communitys erhalten. \ No newline at end of file diff --git a/public/content/translations/de/community/events/organizing/index.md b/public/content/translations/de/community/events/organizing/index.md new file mode 100644 index 00000000000..a69a355f163 --- /dev/null +++ b/public/content/translations/de/community/events/organizing/index.md @@ -0,0 +1,220 @@ +--- +title: Ein Ethereum-Event organisieren +description: Wie man ein Ethereum-Event organisiert +lang: de +hideEditButton: true +--- + +# Wie man ein Ethereum-Event organisiert {#how-to-organize-an-ethereum-event} + +Der Aufbau einer starken und lebendigen Community ist das Herzstück des Wachstums des Ethereum-Ökosystems. Egal, ob du planst, Meetups, Workshops oder eine ausgewachsene Konferenz zu organisieren, der Erfolg deines Events hängt von den Verbindungen und dem Engagement innerhalb deines lokalen Netzwerks ab. Dieser Leitfaden wird dir helfen, den Grundstein für eine aktive Ethereum-Community zu legen, und dich Schritt für Schritt durch den Prozess der Organisation einer unvergesslichen und wirkungsvollen Konferenz führen. + +## Frage dich: Gibt es eine Ethereum-Community? {#ask-yourself-is-there-an-ethereum-community} + +Eine erfolgreiche Ethereum-Konferenz baut auf einer aktiven und engagierten Community auf. Wenn du bereits eine hast, bist du im Vorteil – aber wenn nicht, ist der wesentliche erste Schritt, dieses Fundament aufzubauen. Es ist wichtig, zwischen einer Szene und einer Community zu unterscheiden: Eine Szene kann Unternehmen und Einzelpersonen umfassen, die in einem bestimmten Bereich präsent sind, aber sie agieren oft unabhängig voneinander mit nur gelegentlichen gemeinsamen Initiativen – wie das traditionelle Web2-Ökosystem an vielen Orten. Eine Community hingegen ist ein Netzwerk miteinander verbundener Menschen und Organisationen, die zusammenarbeiten und sich gegenseitig unterstützen, was oft in Web3-Ökosystemen zu sehen ist. + +**Deine ersten Schritte sollten sein:** + +- Erkunde lokale Start-ups und Unternehmen – starke, aktive Unternehmen in deiner Stadt oder deinem Land zu haben, ist oft die wichtigste Voraussetzung für den Aufbau einer Community. +- Prüfe, ob es bereits einige Meetups gibt – ethereum.org [Events-Seite](https://ethereum.org/community/events/) +- [Die ethereum.org-Website](https://ethereum.org/community/events/) und der ethereum.org-Discord – um zu prüfen, ob es lokale Ethereum-Events, Entwickler und Mitwirkende gibt. +- Luma und Meetup.com – um zu sehen, ob in deiner Gegend Ethereum-bezogene Events oder breitere Web3-Events stattfinden. +- X – Versuche, lokale Fürsprecher oder Influencer in diesem Bereich zu finden. + +Wenn du die meisten dieser Elemente findest, ist das ein starkes Zeichen dafür, dass die Bedingungen für den Aufbau einer Community gegeben sind – aber nicht unbedingt, dass bereits eine Community existiert. Der nächste Schritt ist die entscheidende Arbeit, diese Akteure zu organisieren, einzubinden und zu fördern, um Möglichkeiten für Zusammenarbeit und langfristiges Wachstum zu schaffen. + +### Wenn nicht, wie man sie aufbaut {#if-not-how-to-build-it} + +Wenn du feststellst, dass viele dieser Elemente fehlen, mach dir keine Sorgen – der Aufbau einer Community von Grund auf ist ein herausfordernder, aber zutiefst lohnender Prozess. Eine starke Ethereum-Community entsteht nicht über Nacht; sie erfordert Geduld, Beständigkeit und eine klare Vision. So kannst du anfangen: + +- **Richte einen Kommunikationskanal ein** – das könnte Telegram, Signal, WhatsApp, WeChat oder ein Discord-Server sein, was auch immer dort, wo du bist, beliebter ist, damit sich die Leute vernetzen, Fragen stellen und Ressourcen teilen können. +- **Finde deine Early Adopter.** Identifiziere ein paar Leute, die sich für Ethereum und Web3 begeistern. Sie werden zu deinen wichtigsten Unterstützern und Mitarbeitern. +- **Veranstalte kleine, beständige Events.** Beginne mit informellen Meetups, Lerngruppen oder Workshops. Beständigkeit ist der Schlüssel – auch wenn die Gruppe anfangs klein ist, bauen regelmäßige Events Vertrauen und Dynamik auf. +- **Versuche, lokale Unternehmen**, Bildungseinrichtungen oder Coworking-Spaces zu kontaktieren, damit sie dir kostenlos Räumlichkeiten zur Verfügung stellen. Wenn du keine Redner aus deinem Land finden kannst, lade Online-Redner ein, aber versammle die Leute physisch. Es ist entscheidend, dein Publikum physisch an einem Ort zu haben. +- **Arbeite mit bestehenden Tech-Communities zusammen.** Wenn es bereits etablierte Entwicklergruppen, Start-up-Ökosysteme oder Blockchain-Meetups gibt, gehe Partnerschaften mit ihnen ein, um Ethereum-Themen vorzustellen und deine Reichweite zu vergrößern. +- **Teile Bildungsinhalte** über das Potenzial von Ethereum. +- **Nimm Kontakt zu globalen Communities auf.** Vernetze dich mit etablierten Ethereum-Gruppen und -Projekten weltweit für Unterstützung, Mentoring und mögliche Zusammenarbeit. Ethereum-Communities auf der ganzen Welt haben mindestens eines gemeinsam: Sie sind alle sehr hilfsbereit. +- **Versuche, Finanzierung zu sichern** – sei es von lokalen Web3-Unternehmen oder durch ein Förderprogramm wie [ESP](https://esp.ethereum.foundation/). + +### Wenn ja, wie man sie pflegt und vergrößert {#if-yes-how-to-maintain-and-grow-it} + +Sobald du eine etablierte Community hast, hört die Arbeit nicht auf – tatsächlich fängt sie gerade erst an. Eine Community aktiv, engagiert und wachsend zu halten, erfordert kontinuierliche Anstrengung und Kreativität. Eines der Schlüsselelemente, um die Community einzubinden, ist, dass du ständig mit neuen Formaten und Ideen experimentieren solltest. + +Hier sind einige Strategien zur Aufrechterhaltung einer lebendigen Ethereum-Community: + +- **Diversifiziere deine Event-Formate:** Bleibe nicht nur bei einer Art von Zusammenkunft. Bringe Abwechslung rein mit Meetups, kurzen Hackathons, Podiumsdiskussionen und Networking-Events. Du kannst versuchen, Co-Working-Tage oder Bildungskurse zu organisieren. +- **Diversifiziere die Themen:** Ethereum ist nicht nur eine Technologie; es ist auch ein Wertekanon, der rechtliche, Marketing- und geschäftliche Aspekte umfasst. +- **Bitte deine Community** um Feedback und Ideen. +- **Interagiere mit verschiedenen Zielgruppen-Segmenten.** Passe Inhalte und Events an unterschiedliche Erfahrungsstufen an – von Anfängern, die Ethereum zum ersten Mal erkunden, bis hin zu erfahrenen Entwicklern und Unternehmern. + +Indem du vielfältige Möglichkeiten zum Lernen, zur Zusammenarbeit und zum Wachstum bietest, stellst du sicher, dass deine Community aktiv bleibt und bereit für größere Initiativen wie die Organisation einer Konferenz ist. + +## Event {#event} + +### Wann ist der richtige Zeitpunkt, um ein Event zu organisieren? {#when-is-the-right-time-to-organize-an-event} + +Die Organisation einer erfolgreichen Ethereum-Konferenz oder eines Community-Events erfordert sorgfältiges Timing und Überlegung. Der richtige Moment hängt von einer Vielzahl von Faktoren ab, die zum Gesamterfolg des Events beitragen. + +Du solltest die Reife der Community, die Marktbedingungen, ob du ein Team hast und ob es eine lokale Szene gibt (z. B. potenzielle Sponsoren), berücksichtigen. + +### KYC — Kenne deine Community {#kyc-know-your-community} + +Einer der wichtigsten Schritte bei der Organisation eines Events ist es, deine Community zu verstehen. Genau wie Know Your Customer (KYC) bei Finanzdienstleistungen bedeutet Know Your Community (KYC), sich die Zeit zu nehmen, um die spezifischen Bedürfnisse, Vorlieben und Eigenschaften deines lokalen Publikums zu verstehen. Dieses Verständnis wird dir helfen, die Konferenz so anzupassen, dass ihr Erfolg und ihre Relevanz sichergestellt sind. + +Es ist verlockend, sofort ein groß angelegtes Event anzustreben, aber klein anzufangen ist oft der beste Ansatz. Du wirst wissen, was die beste Lösung für dich ist, wenn du objektiv den Zustand deiner Community und einige andere Aspekte betrachtest, die dir vielleicht irrelevant erscheinen, wie z. B.: Ist dein Land ein beliebtes Touristenziel oder wie hoch sind die Unterkunftskosten. + +Im ersten Jahr wird der größte Teil deines Publikums eine lokale Community sein, daher sollte alles, was du im ersten Jahr bei der Organisation eines größeren Events tust, auf die Bedürfnisse und die Größe dieser Community zugeschnitten sein. + +### Wo man anfangen soll {#where-to-start} + +Wenn es darum geht, eine Konferenz zu organisieren, können sich die ersten Schritte überwältigend anfühlen. Aber mit einem klaren Plan und einer Struktur kannst du den Prozess in überschaubare Aufgaben unterteilen. Wir werden jede davon aufschlüsseln. + +Mit einem strukturierten Ansatz zu beginnen, wird dir helfen, organisiert zu bleiben und Stress abzubauen, während du die verschiedenen Phasen der Organisation deines Events durchläufst. Jede Entscheidung, die du triffst, sollte dich dem Ziel näher bringen, ein Erlebnis zu bieten, das den Bedürfnissen deiner Community entspricht. + +**Das Erste ist, ein Organisationsteam mit klaren Rollen und Verantwortlichkeiten aufzubauen.** + +Ein weiterer wichtiger Schritt, bevor du anfängst, ein Programm zu erstellen oder Sponsoren zu kontaktieren, ist die Wahl eines Datums. Obwohl das nach einem einfachen Schritt klingt, gibt es einige wichtige Faktoren, die du vorher berücksichtigen solltest. Einige davon sind: + +- **Vermeide Terminüberschneidungen mit großen Konferenzen** oder Events +- **Berücksichtige lokale Bedingungen und Umstände** (wie Jahreszeit, wichtige Feiertage usw.) +- **Berücksichtige die Marktbedingungen** +- **Gib dir genug Zeit, um alles zu organisieren** – mindestens neun Monate + +### Wie man ein Team zusammenstellt {#how-to-assemble-a-team} + +Wähle Leute, die deine Vision teilen und deine Fähigkeiten ergänzen. Einige Teams arbeiten als Kollektive, während andere definierte Rollen haben – finde heraus, was für dich am besten funktioniert. Regelmäßige Kommunikation und klare Erwartungen sind unerlässlich. Obwohl es verlockend ist, sich bei der Eventplanung auf Kommunikationsplattformen zu verlassen, empfehlen wir, eine Aufgabenmanagement-Plattform (wie Notion, Basecamp, Trello, Asana oder sogar die guten alten Google Sheets) zu wählen, um zu organisieren und zu verfolgen, was erledigt werden muss. Es ist entscheidend, ein gut funktionierendes und gut organisiertes Team zu haben. + +Verschiedene Ethereum-Organisationsteams haben unterschiedliche Rollen in ihren Teams, aber sie alle haben gemeinsam, dass Leute an Logistik, Budgetierung, Marketing, Programm, Design und Partnerschaften arbeiten. + +### Das Programm: Ein Schlüsselelement eines erfolgreichen Events {#the-program-a-key-element-of-a-successful-event} + +Wenn es darum geht, eine wirklich wertvolle und unvergessliche Konferenz zu organisieren, **ist das Programm alles**. Dies ist kein Bereich, in dem du dir Kompromisse leisten kannst. Während Sponsoren wichtig und oft entscheidend für die Finanzierung des Events sind, müssen das Erlebnis des Publikums und der Wert, den sie erhalten, immer Vorrang haben. Ein Programm, das mit Werbeinhalten und endlosen Sponsoren-Pitches überladen ist, wird deine Teilnehmer abschrecken und die Glaubwürdigkeit deines Events untergraben. + +Jede Session, jedes Panel und jeder Workshop sollte die Community informieren, inspirieren und einbinden. Höre deinem Publikum zu – verstehe seine Interessen, Bedürfnisse und Herausforderungen. Welche Themen finden bei ihnen Anklang? Bringe gleichzeitig frische Perspektiven und innovative Formate ein, um das Programm dynamisch zu halten. Finde ein Gleichgewicht zwischen vertrauten und trendigen Themen und bahnbrechenden Ideen, um eine abgerundete Agenda zu gewährleisten, die verschiedene Aspekte des Ethereum-Ökosystems abdeckt – von technischen Deep Dives und Community-Building-Sessions bis hin zu politischen Diskussionen und praktischen Workshops. Berücksichtige außerdem die Sprache der Konferenz – während Englisch bei den meisten Ethereum-Events der Standard ist, kann das Anbieten von Sessions in der Landessprache das Event für regionale Entwickler und Enthusiasten zugänglicher machen. + +**Wenn du Redner auswählst, öffne den Call for Speakers mindestens sechs Monate vor der Konferenz, um qualitativ hochwertige Einreichungen anzuziehen und genügend Zeit für die Kuratierung der Agenda zu haben.** Die für die Rednerauswahl verantwortliche Person sollte über beträchtliche Erfahrung in der Branche und ein tiefes Verständnis des Ökosystems verfügen. Dies stellt sicher, dass sie wertvolle, aufschlussreiche Beiträge identifizieren und einen hohen inhaltlichen Standard aufrechterhalten kann. + +### Wo man finanzielle Unterstützung findet {#where-to-find-financial-support} + +Die Organisation einer hochwertigen Konferenz ist mit erheblichen Kosten verbunden – Miete für den Veranstaltungsort, Werbematerialien, Speisen und Getränke, Produktion und unzählige andere Ausgaben. Die frühzeitige Sicherung finanzieller Unterstützung ist unerlässlich, um sicherzustellen, dass dein Event professionellen Standards entspricht und deinen Teilnehmern ein großartiges Erlebnis bietet. + +#### Wie erstellt man ein Sponsoring-Deck? {#how-to-create-a-sponsorship-deck} + +Zuerst wirst du ein Deck (Präsentation) benötigen. **Bitte andere Konferenzorganisatoren um Rat**, sogar darum, ihre Decks zu teilen, damit du deine Pakete darauf basierend erstellen kannst. Du solltest realistisch sein, wenn es um die Preisgestaltung der Pakete geht, und darauf abzielen, die Kosten zu decken, nicht Geld zu verdienen, besonders am Anfang. + +**Jedes Sponsoring-Deck sollte einen klaren und überzeugenden Überblick über das Event bieten**, um sicherzustellen, dass potenzielle Sponsoren dessen Umfang, Fokus und Wert verstehen. Beginne mit den Grundlagen – Veranstaltungsort, Datum und Details zum Organisationsteam –, um Glaubwürdigkeit aufzubauen. Hebe dann den Hauptfokus des Events hervor, da verschiedene Ethereum-Konferenzen unterschiedliche Zielgruppen ansprechen. Einige sind stark auf Entwickler (Builder) ausgerichtet und bieten tiefgehende technische Diskussionen, während andere sich mehr auf DeFi, Dezentrale Autonome Organisationen oder politische Themen konzentrieren. + +Setze über die bloße Beschreibung des Events hinaus klare Erwartungen. **Skizziere die erwartete Anzahl der Teilnehmer und alle bereits bestätigten Hauptredner**, da dies den Sponsoren hilft, ihre potenzielle Reichweite einzuschätzen. Am wichtigsten ist es, klar zu definieren, was sie im Gegenzug für ihr Sponsoring erhalten – Standfläche, Redemöglichkeiten, Social-Media-Promotion, Markenpräsenz oder exklusiven Networking-Zugang. Ein gut strukturiertes Deck informiert nicht nur, sondern begeistert potenzielle Sponsoren auch für die Möglichkeit, Teil deines Events zu sein. + +#### Wer könnte dein Event unterstützen? {#who-might-support-your-event} + +Beginne damit, Unternehmen innerhalb des Ethereum- und des breiteren Tech-Ökosystems in deiner Stadt oder deinem Land zu kontaktieren. Diese **Organisationen haben oft ein starkes Interesse daran, lokale Events zu unterstützen**, die das Wachstum der Community und Innovationen fördern. Sie erkennen auch eher den Wert von Investitionen in das lokale Ökosystem und sehen deine Konferenz als Gelegenheit, sich mit Talenten, Partnern und Nutzern zu vernetzen. + +Sobald du lokale Unterstützung erschlossen hast, weite deine Kontaktaufnahme auf globale Akteure im Web3-Bereich aus. **Etablierte Protokolle, Dezentrale Autonome Organisationen und Ökosystem-Fonds stellen oft Budgets für Community-gesteuerte Events bereit**. Dies kann für Erstorganisatoren etwas herausfordernd sein, da sie noch keine Erfolgsbilanz vorweisen können, aber versuche, ein überzeugendes Sponsoring-Paket zu schnüren, das die Vorteile der Unterstützung deines Events klar umreißt – Markenpräsenz, Redemöglichkeiten und sinnvolles Engagement mit einer gezielten Zielgruppe. Versuche, deinen einzigartigen Wert zu finden, den andere vielleicht nicht haben. + +#### Alternative Formen der Finanzierung deines Events {#alternative-forms-of-funding-your-event} + +Zuschüsse (Grants) sind eine weitere potenzielle Finanzierungsquelle, die viele Organisatoren übersehen. Programme wie das [Ecosystem Support Program](https://esp.ethereum.foundation/) (ESP) der Ethereum Foundation und [andere Förderinitiativen](https://ethereum.org/community/grants/#ethereum-grants) existieren, um Community-gesteuerte Events zu unterstützen. + +Ziehe neben finanziellen Sponsorings auch Sachpartnerschaften in Betracht, insbesondere für Speisen und Getränke. Marken, die zur lokalen Kultur oder Tech-Community passen, können großartige Partner für dein Event sein. Kaffeemarken, Getränkehersteller oder sogar lokale Pizzerien könnten bereit sein, Produkte im Austausch für Sichtbarkeit auf dem Event bereitzustellen. Diese Kooperationen können helfen, Kosten zu senken und gleichzeitig das Erlebnis der Teilnehmer zu verbessern. + +Da wir über Finanzen sprechen, denke daran: Jeder Dollar, den du in die Schaffung eines außergewöhnlichen Teilnehmererlebnisses investierst, wird sich exponentiell auszahlen. Hochwertige Produktion, komfortable Veranstaltungsorte, durchdachte Werbegeschenke (Swag) und gut organisierte Side-Events tragen zu einem unvergesslichen Erlebnis bei, über das die Teilnehmer noch lange nach Ende der Konferenz sprechen werden. Zufriedene Teilnehmer werden zu deinen größten Fürsprechern und sichern den langfristigen Erfolg deines Events. + +### Logistik {#logistics} + +Parallel zur Sicherung der Finanzierung sollte dein Hauptaugenmerk auf der Logistik liegen. Eine gut organisierte Konferenz erfordert eine akribische Planung in mehreren Bereichen, vom Aufbau des Veranstaltungsortes bis zum Teilnehmererlebnis. Jemanden mit fundierter Erfahrung in der Eventorganisation zu haben – nicht unbedingt Web3-Events, sondern Events im Allgemeinen – kann einen großen Unterschied machen. Ein erfahrener Logistikleiter kann potenzielle Probleme vorhersehen und lösen, bevor sie zu Problemen werden, was Zeit, Geld und Stress spart. + +Eine für die Logistik verantwortliche Person sollte einen Veranstaltungsort, eine Produktionsfirma und verschiedene Anbieter für Speisen, Getränke und Merch auswählen, sowie ein einfach zu bedienendes Online-Ticketing-System, das es den Teilnehmern ermöglicht, sich zu registrieren und auch in Krypto zu bezahlen. + +### Infrastruktur des Standorts {#location-infrastructure} + +Bei der Auswahl eines Standorts für deine Konferenz ist es wichtig, über den Veranstaltungsort selbst hinauszudenken und die breitere Infrastruktur der Stadt und des Landes zu berücksichtigen. Faktoren wie Wetter, Mobilität, Sicherheit und das politische Umfeld spielen eine große Rolle bei der Gestaltung des Teilnehmererlebnisses. + +Für weniger bekannte Standorte wird dies besonders wichtig. Teilnehmer und Sponsoren aus der ganzen Welt müssen darauf vertrauen können, dass sie einfach und sicher reisen können. Untersuche Aspekte wie Flughafenanbindung, öffentliche Verkehrsmittel und Unterkunftsmöglichkeiten. Es ist auch ratsam, das kulturelle und politische Klima der Region zu berücksichtigen, um Komplikationen zu vermeiden, die internationale Teilnehmer abschrecken könnten, wie z. B. die Visapolitik. + +### Wie man das Event bewirbt {#how-to-promote-the-event} + +Dein Event effektiv zu bewerben, ist der Schlüssel, um das richtige Publikum anzuziehen und Begeisterung aufzubauen. Eine gut durchdachte Werbestrategie stellt sicher, dass deine Konferenz die Sichtbarkeit und das Engagement erhält, die sie verdient. Design spielt auch eine wichtige Rolle für deine Marke, also solltest du dafür definitiv auch ein Budget einplanen. + +#### Social Media {#social-media} + +X.com wird das Rückgrat deiner Social-Media-Promotion sein. Versuche, dort aktiv und beständig zu posten, aber beteilige dich auch an verschiedenen Unterhaltungen, sowohl mit deinem persönlichen Konto als auch mit dem Konto deiner Organisation. + +Obwohl LinkedIn nicht nach der offensichtlichsten Wahl für Werbung klingt, kannst du dort ein völlig anderes Publikum oder sogar einige Sponsoren erreichen. + +#### Partnerschaften mit anderen Ethereum-Communities {#partnerships-with-other-ethereum-communities} + +Partnerschaften mit verschiedenen Ethereum-Organisatoren können helfen, deine Reichweite zu vergrößern, indem du auf bestehende Netzwerke zurückgreifst, besonders wenn du ganz von vorn anfängst. Biete Community-Rabatte an, mache Cross-Promotion mit anderen Events und lade Partner ein, Side-Events oder Workshops mitzuveranstalten. + +#### Kontaktaufnahme mit Universitäten {#university-outreach} + +Nimm Kontakt zu technischen und wirtschaftswissenschaftlichen Fakultäten in der Stadt über Studentenclubs oder Professoren auf, um das Event zu bewerben. Die Zusammenarbeit mit Universitäten kann helfen, junge Talente, Forscher und zukünftige Branchenexperten anzuziehen und eine stärkere Verbindung zwischen der Wissenschaft und dem Ethereum-Ökosystem zu fördern. Dies ist besonders großartig, wenn du einen Hackathon organisierst, da Studenten oft frische Ideen, Enthusiasmus und ein starkes technisches Fundament mitbringen. + +#### Medien {#media} + +Wende dich an Web3-fokussierte Medien und Newsletter für die Berichterstattung über das Event. Obwohl Web3-Medien erwarten, für ihre PR-Artikel bezahlt zu werden, kannst du ihnen Freitickets oder Interviews mit einigen hochkarätigen Rednern und Sponsoren anbieten, wenn du kein Budget für bezahlte Werbung hast. Erstelle ein PR-Paket mit einer Pressemitteilung und einigen visuellen Elementen, die für die Promotion in sozialen Medien oder auf einer Website in verschiedenen Formaten bereit sind. Erweitere den Fokus auch auf lokale Journalisten oder sogar Content-Ersteller (solange sie einen guten Ruf haben), die über Tech berichten können, da dies entscheidend sein kann, um das Event einem größeren Publikum zu präsentieren. Dies hilft, die Lücke zwischen der Krypto-Branche und der breiteren Öffentlichkeit zu schließen und das Interesse von Mainstream-Tech- und Business-Communities zu wecken. + +### Solltest du auch einen Hackathon organisieren? {#should-you-organize-a-hackathon-as-well} + +Die Organisation eines Hackathons kann vorteilhaft sein, da Hackathons eine großartige Möglichkeit sein können, die Entwickler-Community einzubinden und Innovationen zu fördern. Er bietet auch praktische Möglichkeiten zur Zusammenarbeit und zum Aufbau von Projekten, was zu greifbaren Ergebnissen für das Ökosystem führen könnte. Hackathons ziehen Entwickler an, die normalerweise vielleicht nicht an Konferenzen teilnehmen, aber an der Herausforderung interessiert sind, neue Ideen zu entwickeln und zu testen. Wenn sich deine Konferenz an Entwickler, Innovation und praktische Projekte richtet, ist die Ausrichtung eines Hackathons eine natürliche Ergänzung. + +Aber bevor du einen organisierst, überlege, ob du genug Ressourcen und Zeit hast. **Ein Hackathon erfordert erhebliche Ressourcen in Bezug auf Zeit, Arbeitskräfte und finanzielle Investitionen**. Stelle sicher, dass du ein engagiertes Team hast, das sich darum kümmert, besonders wenn du auch eine Konferenz leitest. Prüfe auch, ob in deiner Community Interesse besteht. Wenn deine Community eher auf Entwickler (Builder) ausgerichtet ist, dann macht es wahrscheinlich Sinn, ihn zu organisieren. + +Obwohl die Organisation viele Vorteile bietet, solltest du berücksichtigen, dass das Hinzufügen eines Hackathons je nach Größe der Konferenz überwältigend sein könnte. Du solltest abwägen, ob die Verwaltung beider Events die Qualität eines der beiden mindert. Du kannst dich für einen kleineren, fokussierten Hackathon entscheiden oder die Events auf verschiedene Monate verteilen. + +### (Fast unvermeidliche) Herausforderungen, denen du dich stellen musst {#almost-inevitable-challenges-that-you-will-face} + +Eine der größten Herausforderungen bei der Organisation einer Konferenz, insbesondere im Ethereum-Bereich, ist die Sicherung ausreichender Finanzierung. **Viele Eventorganisatoren haben Schwierigkeiten, das nötige Kapital aufzubringen, um die Kosten für den Veranstaltungsort**, das Catering und andere logistische Ausgaben zu decken. Sponsoring ist oft unerlässlich, aber der Aufbau von Beziehungen und die Überzeugung von Unternehmen, in dein Event zu investieren, kann Zeit in Anspruch nehmen. Darüber hinaus kann die Schwierigkeit, Sponsoren zu gewinnen, während Marktabschwüngen zunehmen, da Unternehmen möglicherweise weniger bereit sind, in Nicht-Kernaktivitäten zu investieren. + +Das Budget effektiv zu verwalten, ist der Schlüssel. **Unvorhergesehene Ausgaben**, wie kurzfristige Änderungen des Veranstaltungsortes und zusätzliche Anforderungen an die Veranstaltungstechnik, können dein Budget schnell sprengen. + +Für neue Events kann es **besonders schwierig sein, hochkarätige Redner zu gewinnen**. Etablierte Vordenker oder Influencer im Ethereum-Bereich haben möglicherweise bereits volle Terminkalender und zögern vielleicht, sich für ein neues Event ohne nachgewiesene Erfolgsbilanz zu verpflichten. Sei darauf vorbereitet, lange vor dem Event Zeit mit Networking und der Kontaktaufnahme zu potenziellen Rednern zu verbringen. + +Außerdem solltest du, wenn es um Redner geht, eine klare und ständige Kommunikation mit ihnen pflegen – lege die Frist für das Einsenden von Präsentationen fest und vermeide kurzfristige Änderungen. + +Eine erfolgreiche Konferenz erfordert ein engagiertes Team, das Logistik, Marketing, Sponsoring, technischen Support und Teilnehmermanagement bewältigen kann. Personen mit Erfahrung in der Organisation von Tech-Events zu finden, kann eine Herausforderung sein, besonders wenn du mit einem kleinen Budget oder, in den meisten Fällen, ganz ohne Budget, sondern auf ehrenamtlicher Basis arbeitest. + +### Du solltest es nicht allein tun. Du brauchst Freiwillige. {#you-shouldnt-do-it-alone-you-need-volunteers} + +Die Organisation eines Ethereum-Events erfordert ein vielfältiges und engagiertes Team, um die Logistik, Registrierungen, Rednerkoordination, Teilnehmerbetreuung und vieles mehr zu bewältigen. Bei Teamgrößen von nur 3 bis 15 Personen wird deutlich, dass Freiwillige für den reibungslosen Ablauf des Events unerlässlich sind. + +Freiwillige sind oft das Rückgrat vieler Konferenzen und bieten entscheidende Unterstützung, besonders wenn du mit einem begrenzten Budget arbeitest. Sie können alles übernehmen, von der Besetzung der Registrierungsschalter bis hin zur Unterstützung beim Aufbau des Events, und stellen sicher, dass das Event so reibungslos wie möglich abläuft. + +Während es eine Herausforderung ist, Freiwilligen eine finanzielle Entschädigung anzubieten, ist es unerlässlich, ihnen etwas Wertvolles zu bieten, das ihre Erfahrung lohnenswert macht. Erwäge, ihnen Networking-Möglichkeiten, Kompetenzentwicklung, einige exklusive Vorteile, Zertifikate oder Empfehlungsschreiben anzubieten. + +### Compliance-Grundlagen für Eventorganisatoren {#compliance-essentials-for-event-organizers} + +Bei der Organisation eines Events gibt es mehrere wesentliche rechtliche und logistische Überlegungen zu beachten: + +- **Sponsoring-Vereinbarung** – Stelle sicher, dass du einen klaren Vertrag für Sponsoren hast, einschließlich einer gut definierten Stornierungsrichtlinie. +- **Verhaltenskodex** – Bereite einen Verhaltenskodex (Code of Conduct) vor, der auf die spezifische Art des Events zugeschnitten ist (Konferenz/Hackathon, Hacker Houses usw.). +- **Datenschutzrichtlinie** – Entwirf eine Datenschutzrichtlinie für deine Website, um den Datenschutzbestimmungen und Bildrechten zu entsprechen. +- **Benachrichtigung der lokalen Behörden** – Auch wenn dein Event eine geschlossene Veranstaltung ist, ist es ratsam, es bei der örtlichen Polizeidienststelle zu melden. +- **Ticketing-Vereinbarung** – Schließe eine formelle Vereinbarung mit deinem Ticketing-Dienstleister ab, um Bedingungen und Verantwortlichkeiten zu klären. +- **Einhaltung von Vorschriften** – Prüfe im Voraus, ob das Land, in dem du die Konferenz veranstaltest, spezifische Vorschriften oder Einschränkungen für die Krypto-Branche hat. +- **Zollabfertigung für Merchandise** – Wenn du Sponsoren-Merchandise importierst, wird empfohlen, einen Zollagenten zu beauftragen, um den Prozess effizient abzuwickeln. +- **Fotografie- und Medienrichtlinie** – Definiere klare Richtlinien für Fotografie und Medienberichterstattung und stelle sicher, dass die Teilnehmer über die Einwilligung und Opt-out-Möglichkeiten informiert sind. + +## Nach dem Event: Wie geht es weiter? {#after-the-event-whats-next} + +Nach Abschluss des Events ist es entscheidend, Feedback von Teilnehmern, Rednern und Sponsoren einzuholen und einen internen Bericht zu erstellen, damit du besser auf zukünftige Events vorbereitet bist. Dies hilft zu erkennen, was gut gelaufen ist und wo Verbesserungen vorgenommen werden können. Nutze Umfragen oder Einzelinterviews, um wertvolle Erkenntnisse zu sammeln, die zukünftige Iterationen leiten werden. Nimm dir die Zeit, Fehler oder ineffiziente Bereiche zu überprüfen, da diese bei der nächsten Konferenz vermieden werden können, was den Prozess reibungsloser macht. + +Der Schlüssel ist, die Dynamik am Leben zu erhalten. Interagiere weiterhin mit deiner Community, teile Updates über die Fortschritte, die du basierend auf ihrem Feedback machst, und baue Vorfreude auf das nächste Event auf. Indem du diese Verbindung aufrechterhältst, stellst du sicher, dass die Wirkung der Konferenz über das Event selbst hinausgeht, Beziehungen stärkt und die Weichen für zukünftigen Erfolg stellt. + +## Danksagung {#acknowledgement} + +Ein großes Dankeschön an alle, die zu diesem Artikel beigetragen haben, indem sie ihre Erkenntnisse geteilt haben: Slavo Fabisik von ETHBratislava; Lola von ETH Kipu und ETH Latam; Tanja Mladenovic von ETH Belgrade, Juan David von Ethereum Bogota; Monika Zając von ETHWarsaw; Raffaele Orefice von NapulETH; Xiao Wu(Ling) von ETH Riyadh; Marco von urbe.eth; Caolán Walsh von ETH Dublin; Alex Males von ETHCluj; und Stanko Devic von ETH Slovenia. + +## Ressourcen {#resources} + +Podcast: Wie man ein ETH-Event von A bis Z organisiert und bewirbt: + +- [Die ETHWarsaw-Fallstudie, von Out of Ordinary](https://www.youtube.com/watch?v=io2Dx1ouz8o) + +Twitter Space: + +- [ETH Community AMA](https://x.com/NapulETH/status/1905732699094151623) + +Artikel: + +- [Aufbau von ETHKL, von Danny H.](https://sekto.tech/ethkl24) \ No newline at end of file diff --git a/public/content/translations/de/community/get-involved/index.md b/public/content/translations/de/community/get-involved/index.md index a42599b8472..1e185035d72 100644 --- a/public/content/translations/de/community/get-involved/index.md +++ b/public/content/translations/de/community/get-involved/index.md @@ -1,132 +1,132 @@ --- title: Wie kann ich mich einbringen? -description: So können Sie sich in der Ethereum-Community engagieren +description: Wie man sich in der Ethereum-Community engagieren kann. lang: de --- # Wie kann ich mich einbringen? {#get-involved} -Die Ethereum-Community besteht aus vielen unterschiedlichen Menschen mit verschiedensten Hintergründen und Fähigkeiten. Egal, ob Programmierer, Künstler oder Buchhalter, es gibt immer Wege, sich zu beteiligen. Im Folgenden finden Sie eine Liste mit Vorschlägen, die Sie vielleicht dabei unterstützt, durchzustarten. +Die Ethereum-Community besteht aus Menschen mit vielen verschiedenen Hintergründen und Fähigkeiten. Egal, ob Sie Entwickler, Künstler oder Buchhalter sind, es gibt Möglichkeiten, sich einzubringen. Hier ist eine Liste mit Vorschlägen, die Ihnen den Einstieg erleichtern könnten. -Machen Sie sich zunächst mit der Mission und den Grundsätze von ethereum.org in unserem [Verhaltenskodex](/community/code-of-conduct) vertraut. +Lesen Sie zunächst über die Mission und die Werte von ethereum.org in unserem [Verhaltenskodex](/community/code-of-conduct). -## Entwickler {#developers} +## Entwickler ‍ {#developers} -- Erfahren Sie mehr über Ethereum auf [ethereum.org/developers/](/developers/) -- Besuchen Sie ein [ETHGlobal](http://ethglobal.co/)-Hakathon in Ihrer Nähe. -- Schauen Sie sich an, welche [Projekte im Zusammenhang mit Ihrem Fachgebiet oder der Programmiersprache Ihrer Wahl](/developers/docs/programming-languages/) es gibt -- Sehen Sie sich die [Konsens- und Ausführungsebenen-Anrufe](https://www.youtube.com/@EthereumProtocol/streams) an oder nehmen Sie an ihnen teil -- [Wunschliste des Ethereum Ecosystem-Supportprogramms](https://esp.ethereum.foundation/wishlist/) – Tools, Dokumentation und Infrastrukturbereiche, für die das Ethereum Ecosystem-Supportprogramm aktiv nach Förderern sucht -- [Web3Bridge](https://www.web3bridge.com/) – beteiligen Sie sich an der Initiative der aufstrebenden web3-Community, Hunderte von Entwicklern und Mitgliedern der Community in ganz Afrika zu finden, zu schulen und zu unterstützen +- Erfahren Sie mehr über Ethereum und probieren Sie es aus unter [ethereum.org/developers/](/developers/) +- Nehmen Sie an einem [ETHGlobal](http://ethglobal.co/)-Hackathon in Ihrer Nähe teil! +- Sehen Sie sich [Projekte an, die mit Ihrem Fachgebiet oder Ihrer bevorzugten Programmiersprache zu tun haben](/developers/docs/programming-languages/) +- Verfolgen Sie die [Calls der Konsens- und Ausführungsebene](https://www.youtube.com/@EthereumProtocol/streams) oder nehmen Sie daran teil +- [Wunschliste des Ecosystem Support Program](https://esp.ethereum.foundation/wishlist/) – Bereiche für Tools, Dokumentation und Infrastruktur, in denen das Ethereum Ecosystem Support Program aktiv nach Förderanträgen sucht +- [Web3Bridge](https://www.web3bridgeafrica.com) – schließen Sie sich der aufstrebenden Web3-Community bei ihrer Initiative an, Hunderte von Entwicklern und Community-Mitgliedern in ganz Afrika zu identifizieren, auszubilden und zu unterstützen - Treten Sie dem [Eth R&D Discord](https://discord.com/invite/VmG7Uxc) bei - Treten Sie dem [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei -## Wissenschaftler und Akademiker {#researchers-and-academics} +## Forscher und Akademiker ‍ {#researchers-and-academics} -Haben Sie einen Hintergrund in Mathematik, Kryptographie oder Wirtschaftswissenschaften? Vielleicht interessieren Sie sich für einige der innovativen Arbeiten, die im Ethereum-Ökosystem durchgeführt werden: +Haben Sie einen Hintergrund in Mathematik, Kryptografie oder Wirtschaft? Vielleicht interessieren Sie sich für einige der bahnbrechenden Arbeiten, die innerhalb des Ethereum-Ökosystems durchgeführt werden: - Treten Sie dem [Eth R&D Discord](https://discord.com/invite/VmG7Uxc) bei -- Ethereum-Verbesserungsvorschläge formulieren oder prüfen - - Ein EIP schreiben - 1. Reichen Sie Ihre Idee auf [Ethereum Magicians](https://ethereum-magicians.org) ein. - 2. Lesen Sie [EIP-1](https://eips.ethereum.org/EIPS/eip-1) – **Ja, das ist das _ganze_ Dokument**. - 3. Folgen Sie den Anweisungen in EIP-1. Beziehen Sie sich auf die darin enthaltenen Informationen, während Sie Ihren Entwurf schreiben. - - Erfahren Sie, wie Sie ein [EIP Editor](https://eips.ethereum.org/EIPS/eip-5069) werden. - - Sie können direkt in das Peer-Review von EIPs einsteigen. Sehen Sie [Öffnen von PRs mit dem `e-review`-Tag](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Geben Sie technisches Feedback über den `discussion-to`-Link. - - Beteiligen Sie sich an der [EIP-Verwaltung](https://github.com/ethereum-cat-herders/EIPIP). +- Schreiben oder überprüfen Sie einen Ethereum-Verbesserungsvorschlag + - Schreiben Sie einen EIP + 1. Reichen Sie Ihre Idee bei den [Ethereum Magicians](https://ethereum-magicians.org) ein + 2. Lesen Sie [EIP-1](https://eips.ethereum.org/EIPS/eip-1) – **Ja, das ist das _gesamte_ Dokument.** + 3. Befolgen Sie die Anweisungen in EIP-1. Beziehen Sie sich darauf, während Sie Ihren Entwurf schreiben. + - Erfahren Sie, wie Sie ein [EIP-Editor](https://eips.ethereum.org/EIPS/eip-5069) werden + - Sie können EIPs sofort einem Peer-Review unterziehen! Sehen Sie sich [offene PRs mit dem Tag `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review) an. Geben Sie technisches Feedback über den Link `discussion-to`. + - Nehmen Sie an der [EIP-Governance](https://github.com/ethereum-cat-herders/EIPIP) teil - Treten Sie dem [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei - [Mehr zu EIPs](/eips/) -- [Challenges.ethereum.org](https://challenges.ethereum.org/) – eine Reihe hochwertiger Forschungsprämien, bei denen Sie >100.000 USD verdienen können +- [Challenges.ethereum.org](https://challenges.ethereum.org/) – eine Reihe von hochdotierten Forschungsprämien, bei denen Sie >100.000 USD verdienen können - [Ethresear.ch](https://ethresear.ch) – Ethereums primäres Forum für Forschung und das weltweit einflussreichste Forum für Kryptoökonomie -- [EF Research AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) – Eine fortlaufende Q&A-Reihe mit Wissenschaftlern. Während sich die weiteren Teile öffnen, können alle Fragen stellen. -- [Wunschliste des Ethereum Ecosystem-Supportprogrramms](https://esp.ethereum.foundation/wishlist/) – Forschungsbereiche, für die das Ethereum Ecosystem-Supportprogramm aktiv Förderer sucht -- [AllWalletDevs](https://allwallet.dev) – ein Forum für Ethereum-Entwickler, -Designer und interessierte Benutzer, um regelmäßig zusammenzukommen und Wallets zu besprechen +- [EF Research AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) – Eine fortlaufende Q&A-Serie mit Forschern. Sobald der nächste Teil eröffnet wird, kann jeder Fragen stellen. +- [Wunschliste des Ecosystem Support Program](https://esp.ethereum.foundation/wishlist/) – Forschungsbereiche, in denen das Ethereum Ecosystem Support Program aktiv nach Förderanträgen sucht +- [AllWalletDevs](https://allwallet.dev) – ein Forum für Ethereum-Entwickler, Designer und interessierte Nutzer, um regelmäßig zusammenzukommen und über Wallets zu diskutieren -[Erkunden Sie weitere aktive Forschungsbereiche](/community/research/). +[Entdecken Sie weitere aktive Forschungsbereiche](/community/research/). -## Nicht-technische Kompetenzen {#non-technical} +## Nicht-technische Fähigkeiten ‍ {#non-technical} -Wenn Sie kein Entwickler sind, ist es nicht ganz so einfach, herauszufinden, wo es bei Ethereum etwas für Sie zu tun gibt. Im Folgenden finden Sie einige Vorschläge sowie Ressourcen für bestimmte berufliche Hintergründe. +Wenn Sie kein Entwickler sind, kann es schwierig sein zu wissen, wo Sie bei Ethereum anfangen sollen. Hier sind einige Vorschläge sowie Ressourcen für bestimmte berufliche Hintergründe. -### Organisieren Sie ein Treffen in Ihrer Stadt {#meetups} +### Organisieren Sie ein Meetup in Ihrer Stadt {#meetups} -- Sie wissen nicht, wie Sie anfangen sollen? Das [BUIDL-Netz](https://consensys.net/developers/buidlnetwork/) kann helfen. +- Sie sind sich nicht sicher, wie Sie anfangen sollen? Das [BUIDL-Netzwerk](https://consensys.net/developers/buidlnetwork/) kann helfen. -### Inhalte zu Ethereum verfassen {#write-content} +### Schreiben Sie Inhalte über Ethereum {#write-content} -- Ethereum braucht gute Autoren, die seinen Wert in einfacher Sprache erklären können. -- Sie Sie noch nicht bereit, Ihre eigenen Artikel zu veröffentlichen? Sie könnten in Betracht ziehen, einen Beitrag zu den bestehenden Inhalten auf Community-Ressourcen zu leisten oder [neue Inhalte für ethereum.org vorzuschlagen](/contributing/). +- Ethereum braucht gute Autoren, die seinen Wert in einfacher Sprache erklären können +- Noch nicht bereit, eigene Artikel zu veröffentlichen? Erwägen Sie, zu den bestehenden Inhalten auf Community-Ressourcen beizutragen, oder [schlagen Sie neue Inhalte für ethereum.org vor](/contributing/)! -### Protokollerstellung für Community-Gespräche anbieten {#take-notes} +### Bieten Sie an, Notizen für Community-Anrufe zu machen {#take-notes} -- Es gibt viele Open-Source-Community-Calls. Dabei Notizen zu machen, ist eine große Hilfe. Wenn Sie interessiert sind, treten Sie dem [Ethereum Cat Herders-Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei und stellen Sie sich vor. +- Es gibt viele Open-Source-Community-Anrufe, und Protokollanten zu haben, ist eine große Hilfe. Wenn Sie interessiert sind, treten Sie dem [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei und stellen Sie sich vor! -### Ethereum-Inhalte in Ihre Muttersprache übersetzen {#translate-ethereum} +### Übersetzen Sie Ethereum-Inhalte in Ihre Muttersprache {#translate-ethereum} -- ethereum.org unterhält ein Übersetzungsprogramm, über das die Website und andere Ressourcen in viele verschiedene Sprachen übersetzt werden. -- Wie Sie sich beteiligen können, erfahren Sie [hier](/Beitrag/Übersetzungsprogramm). +- ethereum.org unterhält ein Übersetzungsprogramm, das die Website und andere Ressourcen in viele verschiedene Sprachen übersetzt +- Erfahren Sie [hier](/contributing/translation-program), wie Sie sich einbringen können -### Einen Knoten ausführen {#run-a-node} +### Betreiben Sie einen Blockchain-Knoten {#run-a-node} -Schließen Sie sich Tausenden von Knotenbetreibern an und leisten Sie einen Beitrag zur weiteren Dezentralisierung von Ethereum. +Schließen Sie sich Tausenden von Betreibern von Blockchain-Knoten an und helfen Sie dabei, Ethereum weiter zu dezentralisieren. -- [Mehr zum Betrieb eines Knotens](/developers/docs/nodes-and-clients/run-a-node/) +- [Mehr darüber, wie man einen Blockchain-Knoten betreibt](/developers/docs/nodes-and-clients/run-a-node/) -### Eigene ETH staken {#staking} +### Staken Sie Ihre ETH {#staking} -Durch das Staking Ihrer eigenen ETH können Sie Belohnungen verdienen und gleichzeitig dazu beitragen, das Ethereum-Netzwerk zu sichern. +Durch das Staking Ihrer ETH können Sie Belohnungen verdienen und gleichzeitig helfen, das Ethereum-Netzwerk zu sichern. -- [Mehr zum Staking](/staking/) +- [Mehr über Staking](/staking/) -### Projekte unterstützen {#support-projects} +### Unterstützen Sie Projekte {#support-projects} -Das Ethereum-Ökosystem hat es sich zur Aufgabe gemacht, das Allgemeinwohl und wirkungsvolle Projekte zu finanzieren. Mit sehr kleinen Spenden können Sie Ihre Unterstützung zeigen und wichtige Arbeiten ermöglichen. +Das Ethereum-Ökosystem hat es sich zur Aufgabe gemacht, öffentliche Güter und wirkungsvolle Projekte zu finanzieren. Mit sehr kleinen Spenden können Sie Ihre Unterstützung zeigen und die Umsetzung wichtiger Arbeiten ermöglichen. - [Gitcoin](https://gitcoin.co/fund) - [clr.fund](https://clr.fund/#/about) -## Finanzfachleute und Buchhalter:innen {#financial-professionals} +## Finanzexperten und Buchhalter ‍ {#financial-professionals} -- Ethereum beherbergt das Ökosystem „Decentralized Finance“ – ein Netzwerk aus Protokollen und Anwendungen, die ein alternatives Finanzsystem bieten. Finanzexperten legen wir einige DeFi-Apps ans Herz: [DeFi Llama](https://defillama.com/) oder [DeFiPrime](https://defiprime.com) -- Fit in Buchhaltung? Ethereum-Vermögenswerte – ETH, Token, DeFi usw. – bringen viele neue Buchhaltungsprobleme mit sich. Sie könnten sich einige Projekte anzusehen, die darauf abzielen, den Nutzern von Kryptowährungen bei der Lösung ihrer Buchhaltungs- und Rechnungslegungsprobleme zu helfen, wie [Rotki](https://rotki.com/). +- Ethereum ist die Heimat des „Decentralized Finance“-Ökosystems – ein Netzwerk von Protokollen und Anwendungen, die ein alternatives Finanzsystem bieten. Wenn Sie ein Finanzexperte sind, sehen Sie sich einige DeFi-Apps auf [DeFi Llama](https://defillama.com/) oder [DeFiPrime](https://defiprime.com) an +- Buchhalter? Vermögenswerte auf Ethereum – ETH, Token, DeFi usw. – bringen viele neuartige Buchhaltungsprobleme mit sich. Sie könnten damit beginnen, sich einige Projekte anzusehen, die Nutzern von Kryptowährungen helfen sollen, ihre Herausforderungen in der Buchhaltung und Rechnungslegung zu lösen, wie z. B. [Rotki](https://rotki.com/) -## Produktmanager {#product-managers} +## Produktmanager ‍ {#product-managers} -- Das Ethereum-Ökosystem braucht Ihr Talent. Viele Unternehmen stellen Produktmanager ein. Wenn Sie anfangen möchten, indem Sie zu einem Open-Source-Projekt beitragen, dann kontaktieren Sie die [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) oder [RaidGuild](https://www.raidguild.org/) +- Das Ethereum-Ökosystem braucht Ihre Talente! Viele Unternehmen stellen Produktmanager ein. Wenn Sie zunächst zu einem Open-Source-Projekt beitragen möchten, wenden Sie sich an die [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) oder die [RaidGuild](https://www.raidguild.org/) -## Marketing {#marketing} +## Marketing ‍ {#marketing} -- Im Ethereum-Ökosystem gibt es viele Marketing- und Kommunikationspositionen. +- Es gibt viele Marketing- und Kommunikationspositionen im Ethereum-Ökosystem! -## Arbeitsplätze bei Ethereum {#ethereum-jobs} +## Ethereum-Jobs {#ethereum-jobs} -**Möchten Sie einen Job bei Ethereum finden?** +**Möchten Sie einen Job im Ethereum-Bereich finden?** -- [Jobs auf ethereum.org](/about/#open-jobs) -- [Ethereum Foundation-Stellenportal](https://jobs.ashbyhq.com/ethereum-foundation) +- [ethereum.org-Jobs](/about/#open-jobs) +- [Stellenbörse der Ethereum Foundation](https://jobs.ashbyhq.com/ethereum-foundation) - [JobStash](https://jobstash.xyz) -- [Jobs im Zusammenhang mit Kryptowährung](https://cryptocurrencyjobs.co/ethereum/) +- [Ethereum Job Board](https://www.ethereumjobboard.com/) +- [Cryptocurrency Jobs](https://cryptocurrencyjobs.co/ethereum/) - [Karriere bei ConsenSys](https://consensys.net/careers/) -- [Liste mit Jobs in der Krypto-Welt](https://cryptojobslist.com/ethereum-jobs) -- [Stellenportal für Jobs ohne Bankbezug](https://pallet.xyz/list/bankless/jobs) -- [Jobs bei Web3](https://web3.career) +- [Crypto Jobs List](https://cryptojobslist.com/ethereum-jobs) +- [Bankless-Stellenbörse](https://pallet.xyz/list/bankless/jobs) +- [Web3 Jobs](https://web3.career) - [Web3 Army](https://web3army.xyz/) -- [Jobs im Crypto Valley](https://cryptovalley.jobs/) -- [Arbeitsplätze bei Ethereum](https://startup.jobs/ethereum-jobs) +- [Crypto Valley Jobs](https://cryptovalley.jobs/) +- [Ethereum Jobs](https://startup.jobs/ethereum-jobs) -## Einer DAO beitreten {#decentralized-autonomous-organizations-daos} +## Treten Sie einer DAO bei {#decentralized-autonomous-organizations-daos} -„DAOs" sind dezentralisierte, autonome Organisationen. Diese Gruppen nutzen die Ethereum-Technologie, um die Organisation und Zusammenarbeit zu erleichtern. Zum Beispiel für die Kontrolle der Mitgliedschaft, die Abstimmung über Vorschläge oder die Verwaltung von gepooltem Vermögen. DAOs befinden sich zwar noch im Experimentierstadium, aber sie bieten viele Möglichkeiten, Gruppen und Gleichgesinnte zu finden, mit denen Sie sich identifizieren und über die Sie Ihren Einfluss auf die Ethereum-Community vergrößern können. [Mehr zu DAOs](/dao/) +„DAOs“ sind Dezentrale Autonome Organisationen. Diese Gruppen nutzen die Ethereum-Technologie, um Organisation und Zusammenarbeit zu erleichtern. Zum Beispiel zur Kontrolle der Mitgliedschaft, zur Abstimmung über Vorschläge oder zur Verwaltung gemeinsamer Vermögenswerte. Obwohl DAOs noch experimentell sind, bieten sie Ihnen die Möglichkeit, Gruppen zu finden, mit denen Sie sich identifizieren, Mitarbeiter zu finden und Ihren Einfluss auf die Ethereum-Community zu vergrößern. [Mehr zu DAOs](/dao/) -- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare) – _verbreiten Sie das DAO-Konzept in nichttechnischen Bereichen und helfen Sie anderen bei der Wertschöpfung durch DAO_ -- [Entwickler-DAO](https://www.developerdao.com/) [@entwickler_dao](https://twitter.com/developer_dao) – _Gemeinschaft aus Erstellern, die an das kollektive Eigentum am Internet glauben_ -- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) – _Web3-Entwicklungskollektiv aus Freiberuflern, das als DAO arbeitet_ -- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _Gemeinschaftsverwaltung von DAOHaus_ -- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO) – _Rechtstechnik_ -- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) – _Venture für vorinstallierte Kryptoprojekte_ -- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) – _MMORPG-Spielmechanismen für das echte Leben_ -- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) – _Digi-physische Modemarken_ -- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) – _Gemeinschaft zur Finanzierung der Entwicklung von Ethereum_ -- [Raid-Gilde](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) – _Kollektiv von Web3-Erstellern_ +- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare) – _Fördert das DAO-Konzept im nicht-technischen Bereich und hilft Menschen, durch DAOs Werte zu schaffen_ +- [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) – _Community von Entwicklern, die an das kollektive Eigentum des Internets glauben_ +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) – _Kollektiv für Web3-Entwicklung von Freiberuflern, das als DAO arbeitet_ +- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) – _Community-Governance von DAOhaus_ +- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO) – _Legal Engineering_ +- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) – _Venture für Pre-Seed-Kryptoprojekte_ +- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) – _Digiphysische Bekleidungsmarken_ +- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) – _Community, die sich auf die Finanzierung der Ethereum-Entwicklung konzentriert_ +- [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) – _Kollektiv von Web3-Entwicklern_ -Denken Sie daran, sich an den [Verhaltenskodex](/community/code-of-conduct) von ethereum.org zu halten, wann und wie auch immer Sie zu ethereum.org beitragen. +Bitte denken Sie daran, sich an den [Verhaltenskodex](/community/code-of-conduct) von ethereum.org zu halten, wann und wie auch immer Sie zu ethereum.org beitragen! \ No newline at end of file diff --git a/public/content/translations/de/community/grants/index.md b/public/content/translations/de/community/grants/index.md index a93096da6b9..b6c28c18917 100644 --- a/public/content/translations/de/community/grants/index.md +++ b/public/content/translations/de/community/grants/index.md @@ -1,46 +1,66 @@ --- -title: Ethereum Foundation und Förderprogramme der Community -description: Eine Auflistung der Förderprogramme im gesamten Ethereum-Ökosystem. +title: "Förderprogramme der Ethereum Foundation und der Community" +description: "Eine Auflistung der Förderprogramme im gesamten Ethereum-Ökosystem." lang: de --- -# Ethereum-Finanzierungshilfen {#ethereum-grants} +# Ethereum-Förderprogramme {#ethereum-grants} -Die unten aufgelisteten Programme bieten eine Vielzahl von Finanzierungshilfen für Projekte, die den Erfolg und das Wachstum des Ethereum-Ökosystems fördern. Nutzen Sie die Liste als Leitfaden, um Finanzierungsmöglichkeiten zu finden und zu beantragen, die Ihr nächstes Ethereum-Projekt zu einem Erfolg machen. +Die unten aufgeführten Programme bieten eine Vielzahl von Fördergeldern (Grants) für Projekte, die den Erfolg und das Wachstum des [Ethereum](/)-Ökosystems fördern. Nutzen Sie dies als Leitfaden, um Gelder zu finden und zu beantragen, die dazu beitragen, Ihr nächstes Ethereum-Projekt zu einem Erfolg zu machen. -Diese Liste wird von unserer Community verwaltet. Wenn Informationen fehlen oder falsch sind, bearbeiten Sie diese Seite gerne. +Diese Liste wird von unserer Community gepflegt. Wenn etwas fehlt oder falsch ist, bearbeiten Sie bitte diese Seite! -## Das weitere Ethereum-Ökosystem {#broad-ethereum-ecosystem} + + +
Gründer, benötigen Sie Hilfe bei der Beschleunigung Ihres Unternehmens? [Besuchen Sie den Founders Support](/founders/)
+
-Diese Programme unterstützen das breit gefächerte Ethereum-Ökosystem, indem sie Finanzierungen für zahlreiche Projekte bereitstellen. Dazu gehören unter anderem Lösungen zu Skalierbarkeit, Community-Aufbau, Sicherheit und Privatsphäre. Diese Fördermaßnahmen sind nicht spezifisch für eine bestimmte Ethereum-Plattform und sind ein guter Ausgangspunkt, wenn Sie unsicher sind. +## Breites Ethereum-Ökosystem {#broad-ethereum-ecosystem} -- [EF-Ökosystem Unterstützungsprogramm](https://esp.ethereum.foundation) - _Finanzierung von Open-Source-Projekten, die Ethereum zugutekommen, mit besonderem Fokus auf universelle Werkzeuge, Infrastruktur, Forschung und öffentliche Güter_ -- [ESP Grant Explorer](https://esp.ethereum.foundation/funded-projects) - _Durchsuchbares Verzeichnis von über 1.000 Projekten, die vom Ecosystem Support Program unterstützt werden_ -- [Moloch DAO](https://www.molochdao.com/) – _Datenschutz, Layer-2-Skalierung, Client-Sicherheit und mehr_ -- [DAO-Zuschüsse](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _Google-Tabelle der Organisationen, die Zuschüsse anbieten_ -- [Akademische Stipendien](https://esp.ethereum.foundation/academic-grants) – _Stipendien zur Untstützung akademischer Arbeiten in Bezug auf Ethereum_ +Diese Programme unterstützen das breite Ethereum-Ökosystem, indem sie Fördergelder für ein breites Spektrum von Projekten anbieten. Dazu gehören Lösungen für Skalierbarkeit, Community-Aufbau, Sicherheit, Datenschutz und mehr. Diese Förderprogramme sind nicht auf eine bestimmte Ethereum-Plattform beschränkt und ein guter Ausgangspunkt, wenn Sie sich unsicher sind. -## Projektspezifisch {#project-specific} +- [EF Ecosystem Support Program](https://esp.ethereum.foundation) – _Förderung von Open-Source-Projekten, die Ethereum zugutekommen, mit besonderem Fokus auf universelle Tools, Infrastruktur, Forschung und öffentliche Güter_ +- [ESP Grant Explorer](https://esp.ethereum.foundation/funded-projects) – _Durchsuchbares Verzeichnis von über 1.000 Projekten, die durch das Ecosystem Support Program unterstützt werden_ +- [Academic Grants](https://esp.ethereum.foundation/academic-grants) – _Fördergelder zur Unterstützung von Ethereum-bezogener akademischer Arbeit_ -Diese Projekte haben ihre eigenen Zuschüsse für Projektvorhaben zur Entwicklung und Erprobung ihrer eigenen Technologie geschaffen. +## Aggregatoren und Plattformen für Förderprogramme {#grant-list-aggregators} -- [Aave-Zuschussprogramm](https://aavegrants.org/) – _[Aave](https://aave.com/) Grants DAO_ -- [Balancer](https://grants.balancer.community/) – _[Balancer](https://balancer.fi/)-Ökosystemfonds_ -- [Decentraland-Zuschussprogramm](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/)-DAO-Metaverse_ -- [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/)-Finanzökosystem_ -- [MetaMask-Programm](https://metamaskgrants.org/) – _Mitarbeitergeleitete DAO für[MetaMask](https://metamask.io/)-Zuschüsse_ -- [SKALE-Network-Förderprogramm](https://skale.space/developers#grants) – _[SKALE-Network](https://skale.space/)-Ökosystem_ -- [Swarm Foundation-Förderprogramm](https://www.ethswarm.org/grants) – _[Swarm Foundation](https://www.ethswarm.org/)-Ökosystem_ -- [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/)-Ökosystem_ -- [Uniswap-Förderprogramm](https://www.uniswapfoundation.org/grants) – _[Uniswap](https://uniswap.org/)-Community_ +Diese Ressourcen sammeln und organisieren verschiedene Fördermöglichkeiten im gesamten Ethereum-Ökosystem und erleichtern so die Entdeckung von Finanzierungsmöglichkeiten, die den Anforderungen Ihres Projekts entsprechen. Wir haben sie nach Zielgruppen geordnet, um Ihnen den Einstieg in die Suche nach den relevantesten Ressourcen basierend auf Ihrem spezifischen Finanzierungsbedarf zu erleichtern. -## Quadratische Finanzierung {#quadratic-funding} +### Für alle Fördersuchenden: Umfassende Verzeichnisse {#comprehensive-directories} -Die Open-Source-Wurzeln von Ethereum haben zur Entwicklung eines interessanten neuen Finanzierungsmodells geführt: die quadratische Finanzierung. Dieses Modell hat das Potenzial die Art und Weise zu verbessern, wie wir in Zukunft alle Arten von öffentlichen Gütern finanzieren. Die quadratische Finanzierung stellt sicher, dass die Projekte mit dem größten individuellen Bedarf auch die meisten Mittel erhalten. Mit anderen Worten: Projekte, die das Leben der meisten Menschen verbessern können. [Mehr zur quadratischen Finanzierung.](/defi/#quadratic-funding) +Diese allgemeinen Plattformen bieten eine breite Abdeckung von Förderprogrammen im gesamten Web3-Bereich und sind nützliche Ausgangspunkte für jeden, der nach Finanzierung sucht: -- [Gitcoin](https://gitcoin.co/grants) -- [clr.fund](https://clr.fund/) +- [Karma Funding Map](https://gap.karmahq.xyz/funding-map) – Verzeichnis aller Web3-Förderprogramme, das wöchentlich aktualisiert wird -## Arbeiten in Ethereum {#work-in-ethereum} +### Für Entwickler und Builder {#for-developers-and-builders} -Sind Sie noch nicht bereit, Ihr eigenes Projekt zu starten? Es gibt Hunderte von Unternehmen, die aktiv nach engagierten Personen suchen, die im Ethereum-Ökosystem arbeiten und einen Beitrag dazu leisten wollen. Sind Sie an weiteren Informationen interessiert? [Suche nach Jobs mit Bezug zu Ethereum](/community/get-involved/#ethereum-jobs) +- [Grant Programs Viewer](https://airtable.com/shr86elKgWTSCP4AY) – _Öffentliche Airtable-Datenbank für Förderprogramme_ +- [Web3 Grants Spreadsheet](https://docs.google.com/spreadsheets/d/1c8koZCI-GLnD8MG-eFcXPOBCNu1v8-aXIfwAAvc7AMc/edit#gid=0) – _Google-Tabelle mit Web3-Fördermöglichkeiten_ +- [Arbitrum Grants](https://arbitrum.foundation/grants) — Arbitrum DAO und [The Arbitrum Foundation](https://arbitrum.foundation/) + +### Für DeFi-Projekte und Finanzanwendungen {#for-defi-projects} + +- [AlphaGrowth Grants](https://alphagrowth.io/crypto-web3-grants-list) – _Umfassende Liste von Krypto- und Web3-Förderprogrammen_ +- [Uniswap Foundation Grants](https://www.uniswapfoundation.org/build) – _Unichain- und Uniswap v4-Fördergelder sowie Unterstützung für DeFi-Entwickler_ + +### Für DAO-Mitwirkende und Governance-Innovatoren {#for-dao-contributors} + +Ressourcen für Community-gesteuerte Projekte und Governance-Experimente: + +- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _Google-Tabelle von Organisationen, die Fördergelder anbieten_ +- [MetaGov Database](https://docs.google.com/spreadsheets/d/1e5g-dlWWsK2DZoZGBgfxyfGNSddLk-V7sLEgfPjEhbA/edit#gid=780420708) – _Umfassende Karte für Web3-Förderprogramme_ + +### Öffentliche Güter und Impact {#public-goods-and-impact} + +Diese Programme konzentrieren sich auf die Finanzierung von Projekten, die der breiteren Community, öffentlichen Gütern und Impact-Initiativen zugutekommen. Dazu gehören Fördergeber sowie Spendenplattformen, die Zuweisungsmechanismen für Finanzierungen auf der Blockchain nutzen, einschließlich [Quadratic Funding](/defi/#quadratic-funding): + +- [Gitcoin](https://www.gitcoin.co/program) – _Gitcoin Grants nutzt mehrere Kapitalzuweisungsmechanismen, um Open-Source-Projekte und öffentliche Güter im Ethereum-Ökosystem zu finanzieren_ +- [Octant](https://octant.app/home) – _Ökosystem zur Finanzierung öffentlicher Güter, das das Gemeinwohl und die individuelle finanzielle Stärkung in Einklang bringt_ +- [Giveth](https://giveth.io/) – _Krypto-Spendenplattform, die direkte Spenden für gemeinnützige Projekte ohne zusätzliche Gebühren ermöglicht_ +- [Artizen](https://artizen.fund/) – _Hilft Kreativen bei der Mitfinanzierung neuer Projekte an der Grenze von Kunst, Wissenschaft, Technologie und Kultur_ +- [Quadratic Accelerator](https://qacc.giveth.io/) – _Start-up-Accelerator-Programm, das Quadratic Funding nutzt, um Projekte zu unterstützen, die dem Gemeinwohl dienen_ + +## Arbeiten im Ethereum-Ökosystem {#work-in-ethereum} + +Noch nicht bereit, ein eigenes Projekt zu starten? Es gibt Hunderte von Unternehmen, die aktiv nach leidenschaftlichen Personen suchen, die im Ethereum-Ökosystem arbeiten und dazu beitragen möchten. Suchen Sie nach weiteren Informationen? [Sehen Sie sich Ethereum-bezogene Jobs an](/community/get-involved/#ethereum-jobs) \ No newline at end of file diff --git a/public/content/translations/de/community/language-resources/index.md b/public/content/translations/de/community/language-resources/index.md index d05fcbf39c9..4277d222082 100644 --- a/public/content/translations/de/community/language-resources/index.md +++ b/public/content/translations/de/community/language-resources/index.md @@ -1,153 +1,152 @@ --- title: Sprachressourcen -description: Ressourcen in nicht englischer Sprache, um mehr über Ethereum zu erfahren +description: "Nicht-englischsprachige Ressourcen, um mehr über Ethereum zu erfahren" lang: de --- # Sprachressourcen {#language-resources} -Die Ethereum-Community ist global und hat Millionen Mitglieder, die kein Englisch sprechen. +Die Ethereum-Community ist global und besteht aus Millionen von Menschen, die nicht Englisch sprechen. -Unser Ziel ist es, Bildungsinhalte in allen Sprachen bereitzustellen und die Sprachbarrieren zu überwinden, die Menschen aus aller Welt den in Ethereum erschweren. +Unser Ziel ist es, Bildungsinhalte in allen Sprachen bereitzustellen und dabei zu helfen, die Sprachbarrieren zu überwinden, die das Onboarding von Menschen aus der ganzen Welt zu Ethereum zu einer Herausforderung machen. -Wenn Sie Inhalte lieber in Ihrer Muttersprache lesen oder jemanden kennen, der kein Englisch spricht, finden Sie unten eine Liste nützlicher Ressourcen, die nicht in Englisch sind. Hunderttausende von Ethereum-Enthusiasten treffen sich in diesen Online-Foren, um Neuigkeiten auszutauschen, über aktuelle Entwicklungen zu sprechen, technische Fragen zu diskutieren und Bilder der Zukunft zu zeichnen. +Wenn Sie lieber in Ihrer Muttersprache lesen oder jemanden kennen, der kein Englisch spricht, finden Sie unten eine Liste nützlicher nicht-englischsprachiger Ressourcen. Hunderttausende von Ethereum-Enthusiasten versammeln sich in diesen Online-Foren, um Neuigkeiten auszutauschen, über aktuelle Entwicklungen zu sprechen, technische Probleme zu diskutieren und sich die Zukunft vorzustellen. -Kennen Sie eine Bildungsressource in Ihrer Sprache? [Eröffnen Sie ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new/choose), um die Ressource in die Liste aufzunehmen. +Kennen Sie eine Bildungsressource in Ihrer Sprache? [Eröffnen Sie ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose), um sie zur Liste hinzuzufügen! -## Ressourcen von Ethereum.org {#ethereum-org} +## Ressourcen auf ethereum.org {#ethereum-org} -Ethereum.org wird muttersprachlich in über 40 Sprachen übersetzt. Diese können Sie in unserem Sprachauswahlmenü am oberen Rand auf jeder Seite finden. +Ethereum.org wird nativ in über 40 Sprachen übersetzt, die Sie über unser Sprachauswahlmenü oben auf jeder Seite finden können. ![Sprachauswahlmenü](./language-selector-menu.png) -Wenn Sie zweisprachig sind und uns helfen möchten, mehr Menschen zu erreichen, können Sie sich auch am [Übersetzungprogramm von ethereum.org](/contributing/translation-program/#translation-program) beteiligen und uns bei der Übersetzung der Website helfen. +Wenn Sie zweisprachig sind und uns helfen möchten, mehr Menschen zu erreichen, können Sie sich auch am [ethereum.org-Übersetzungsprogramm](/contributing/translation-program/#translation-program) beteiligen und uns bei der Übersetzung der Website helfen. ## Community-Ressourcen {#community} ### Brasilianisches Portugiesisch {#br-pt} -**Nachrichten** +**Neuigkeiten** -- [BeInCrypto](http://www.beincrypto.com.br) – Nachrichten und Artikel über Kryptowährungen, einschließlich einer Liste von verfügbaren Handelsplätzen in Brasilien -- [Cointelegraph](http://cointelegraph.com.br/category/analysis) – brasilianische Version von Cointelegraph, einer wichtigen Nachrichtenquelle für Kryptowährungen -- [Livecoins](http://www.livecoins.com.br/ethereum) – Nachrichten zu Kryptowährungen und Tools -- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) – Nachrichten und Berichte über Kryptowährungen -- [Modular Crypto](https://modularcrypto.xyz/) – Nachrichten und informative Artikel über Kryptowährungen +- [BeInCrypto](http://www.beincrypto.com.br) – Neuigkeiten und Artikel zu Kryptowährungen, einschließlich einer Liste von Börsen, die in Brasilien verfügbar sind +- [Cointelegraph](http://cointelegraph.com.br/category/analysis) – Brasilianische Version von Cointelegraph, einem großen Nachrichtenportal für Kryptowährungen +- [Livecoins](http://www.livecoins.com.br/ethereum) – Neuigkeiten und Tools zu Kryptowährungen +- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) – Neuigkeiten und Berichte zu Kryptowährungen +- [Modular Crypto](https://modularcrypto.xyz/) – Neuigkeiten und Bildungsartikel zu Kryptowährungen **Bildung** -- [web3dev](https://www.web3dev.com.br/) – Inhalts-Hub und Discord-Community für Web3-Entwickler +- [web3dev](https://www.web3dev.com.br/) – Content-Hub und Discord-Community für Web3-Entwickler. - [Web3Brasil](https://github.com/web3brasil/web3brasil) – Ressourcen zum Erlernen von Web3 und DeFi -- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) – Nachrichten zu Kryptowährungen und Bildung, einschließlich „Ethereum für Einsteiger“ und „DeFi für Einsteiger“ -- [CriptoAtivos](http://www.criptoativos.wiki.br/) – Einblicke in die Welt der Kryptowährungen, Bildung und Blog -- [Cointimes](http://www.cointimes.com.br/) – Nachrichten zu Kryptowährungen und Bildung -- [Web3-Starterpaket](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) – ein Leitfaden mit Antworten auf die am häufigsten gestellten und grundlegenden Kryptofragen +- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) – Neuigkeiten und Bildung zu Kryptowährungen, einschließlich „Ethereum für Anfänger“ und „DeFi für Anfänger“ +- [CriptoAtivos](http://www.criptoativos.wiki.br/) – Einblicke in den Kryptowährungsbereich, Bildung und Blog +- [Cointimes](http://www.cointimes.com.br/) – Neuigkeiten und Bildung zu Kryptowährungen +- [Web3 starter pack](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) – ein Leitfaden, der die am häufigsten gestellten und grundlegenden Krypto-Fragen beantwortet ### Chinesisch {#zh} **Allgemeine Ressourcen** -- [Ethereum.cn](https://www.ethereum.cn/) – von der Community gepflegte Inhalte, die das Upgrade der Konsensschicht, alle Notizen zu den Kernentwicklungssitzungen, Layer 2 usw. umfassen -- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) – Lernen Sie alles von den Grundlagen bis zu Ethereum-Themen für Fortgeschrittene -- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) – von der Community gepflegte Inhalte, die Ethereum, DeFi, NFT, Web3-bezogenes Wissen abdecken -- [123ETH](https://123eth.org/) – ein Portal für das Ethereum-Ökosystem -- [Zhen Xiao](http://zhenxiao.com/blockchain/) – kostenlose Online-Kurse über Kryptowährungen und ihre Anwendungen -- [Ethereum Whitepaper](https://ethereum.org/whitepaper//[%E4%B8%AD%E6%96%87]-%E4%BB%A5%E5%A4%AA%E5%9D%8A%E7%99%BD%E7%9A%AE%E4%B9%A6) – Chinesische Version des Ethereum-Whitepapers +- [Ethereum.cn](https://www.ethereum.cn/) – von der Community gepflegte Inhalte, die das Upgrade der Konsensebene, alle Notizen zu Core-Dev-Meetings, Ebene 2 usw. abdecken. +- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) – lernen Sie alles von den Grundlagen bis hin zu fortgeschrittenen Ethereum-Themen +- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) – von der Community gepflegte Inhalte, die Wissen zu Ethereum, DeFi, NFT und Web3 abdecken +- [123ETH](https://123eth.org/) – ein Portal zum Ethereum-Ökosystem +- [Zhen Xiao](http://zhenxiao.com/blockchain/) – kostenlose Online-Kurse über Kryptowährungen und deren Anwendungen **Ethereum-Ökosystem** -- [ETHPlanet](https://www.ethplanet.org/) – Online- und persönliche Hackathons, die Schulungen für Universitätsstudenten anbieten -- [PrimitivesLane](https://www.primitiveslane.org/) – eine gemeinnützige Forschungsgruppe, die sich mit der Blockchain-Technologie beschäftigt +- [ETHPlanet](https://www.ethplanet.org/) – Online- und Präsenz-Hackathons, die Schulungen für Universitätsstudenten anbieten +- [PrimitivesLane](https://www.primitiveslane.org/) – eine gemeinnützige Forschungsgruppe, die sich auf Blockchain-Technologie konzentriert - [Ethereum Translation Community CN](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) – eine Community, die sich der Übersetzung von Ethereum-Bildungsinhalten widmet **Für Entwickler** -- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - eine Lerngruppe, um Mainstream-Dapp-Projekte zu studieren und jede Woche Gedanken und Anmerkungen auszutauschen -- [LearnBlockchain](https://learnblockchain.cn/) – eine Community für Entwickler, die Informationen über die Blockchain-Technologie austauschen +- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) – eine Lerngruppe, um Mainstream-Dapp-Projekte zu studieren und jede Woche Gedanken und Kommentare auszutauschen +- [LearnBlockchain](https://learnblockchain.cn/) – eine Community für Entwickler, die Informationen über Blockchain-Technologie austauscht -**Für Kryptographieforscher** +**Für Kryptografie-Forscher** -- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw) – ein WeChat-Account, in dem Kryptographie, Sicherheit usw. erklärt werden -- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ) – ein WeChat-Account, in dem die zk-Technologie erklärt wird +- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw) – ein WeChat-Konto, das Kryptografie, Sicherheit usw. erklärt. +- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ) – ein WeChat-Konto, das ZK-Technologie erklärt ### Tschechisch {#cs} -- [Gwei.cz](https://gwei.cz) - Lokale Gemeinschaft für Web3, die akademische Inhalte erstellt und Veranstaltungen organisiert, sowohl online als auch persönlich -- [Gwei.cz Leitfaden](https://prirucka.gwei.cz/) - Ethereum Leitfaden für Anfänger -- [DAO Leitfaden](https://dao.gwei.cz/) - Leitfaden über DAOs für Anfänger -- [Ethereum meistern](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Ethereum meistern auf Tschechisch +- [Gwei.cz](https://gwei.cz) – lokale Community rund um Web3, erstellt Bildungsinhalte, organisiert Online- und Präsenzveranstaltungen +- [Gwei.cz Příručka](https://prirucka.gwei.cz/) – Ethereum-Leitfaden für Anfänger +- [DAO Příručka](https://dao.gwei.cz/) – Anfängerleitfaden zu DAOs +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Mastering Ethereum auf Tschechisch ### Französisch {#fr} -- [Ethereum Frankreich](https://www.ethereum-france.com/) – Ethereum Frankreich organisiert Veranstaltungen, erstellt Inhalte und fördert Diskussionen rund um Ethereum -- [Ethereum.fr](https://ethereum.fr/) – Ethereum-Nachrichten und -Bildung +- [Ethereum France](https://www.ethereum-france.com/) – Ethereum France organisiert Veranstaltungen, erstellt Inhalte und fördert Diskussionen rund um Ethereum +- [Ethereum.fr](https://ethereum.fr/) – Ethereum-Neuigkeiten und -Bildung - [BanklessFR](https://banklessfr.substack.com/) – Bankless-Newsletter auf Französisch - [CryptoFR](https://cryptofr.com/category/44/ethereum-general) – Kryptowährungsforum mit einer Ethereum-Unterseite ### Deutsch {#de} -- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) – Solidity nutzen -- [Microsoft Learn (Intelligente Verträge)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – Intelligente Verträge von Ethereum mit Solidity schreiben -- [Microsoft Learn (Ethereum-Netzwerke)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) – Verbindung zu Ethereum-Netzwerken herstellen und diese einsetzen +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) – Verwendung von Solidity +- [Microsoft Learn (Smart Contracts)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – Schreiben von Ethereum Smart Contracts mit Solidity +- [Microsoft Learn (Ethereum-Netzwerke)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) – Verbinden mit und Bereitstellen von Ethereum-Netzwerken - [Microsoft Learn (Blockchains)](https://docs.microsoft.com/de-de/learn/paths/ethereum-blockchain-development/) – Einstieg in die Blockchain-Entwicklung ### Hebräisch {#he} -- [Udi Wertheimer: Was Bitcoiner von Ethereum lernen können](https://www.cryptojungle.co.il/udi-wertheimer-what-bitcoiners-can-learn-from-ethereum/) -- [Omer Greismen (OpenZeppelin): Wie wir einen 15-Milliarden-Dollar-Smart-Contract-Hack verhindert haben](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) -- [Shy Datika (INX): Tokenisierung und die Zukunft von Sicherheiten – und ob Ethereum eine Sicherheit ist](https://www.cryptojungle.co.il/shy-datika-tokenization/) -- [Roy Confino (Lemonade): Versicherung bei Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) -- [Idan Ofrat (Fireblocks): Institutionelle Einführung](https://www.cryptojungle.co.il/idan-ofrat-fireblocks/) -- [Gal Weizman (MetaMask): Was ist MetaMask](https://www.cryptojungle.co.il/gal-weizman-metamask/) -- [Dror Aviely (Consensys): Das Zentrum von Ethereum](https://www.cryptojungle.co.il/dror-aviely-ethereum-center/) -- [Nir Rozin: Was es bedeutet, ein Cryptopunk zu sein](https://www.cryptojungle.co.il/nir-rozin-cryptopunk/) -- [Adan Kedem: Gaming & Metaversum](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) -- [Uri Kolodny (Starkware): Ethereum- und Blockchainebenen](https://www.cryptojungle.co.il/uri-kolodny-starkware/) -- [Udi Wertheimer: Ethereum 2.0 und seine Konkurrenz](https://www.cryptojungle.co.il/udi-on-eth2/) -- [Ben Samocha (ich selbst): Ethereum 2.0 – eine Gelegenheit?](https://www.cryptojungle.co.il/etherurm2-week-summary/) -- [Alon Muroch (Bloxstaking): Was ist Ethereum 2.0?](https://www.cryptojungle.co.il/alon-moroch-eth2/) -- [Eilon Aviv (Collider Ventures): Was mit Ethereum 2.0 schiefgehen kann](https://www.cryptojungle.co.il/eilon-aviv-eth2-0/) -- [Eilon Aviv (Collider Ventures): Warum wir Ethereum 2.0 brauchen](https://www.cryptojungle.co.il/eilon-aviv-ethereum-2-0/) +- [Udi Wertheimer – Was Bitcoiner von Ethereum lernen können](https://www.cryptojungle.co.il/udi-wertheimer-what-bitcoiners-can-learn-from-ethereum/) +- [Omer Greismen (OpenZeppelin) – Wie wir einen Smart-Contract-Hack in Höhe von 15 Milliarden Dollar verhindert haben](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) +- [Shy Datika (INX) – Tokenisierung und die Zukunft von Wertpapieren, einschließlich der Frage, ob Ethereum ein Wertpapier ist](https://www.cryptojungle.co.il/shy-datika-tokenization/) +- [Roy Confino (Lemonade) – Versicherungen @ Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) +- [Idan Ofrat (Fireblocks) – Institutionelle Akzeptanz](https://www.cryptojungle.co.il/idan-ofrat-fireblocks/) +- [Gal Weizman (MetaMask) – Was ist MetaMask](https://www.cryptojungle.co.il/gal-weizman-metamask/) +- [Dror Aviely (Consensys) – Das Zentrum von Ethereum](https://www.cryptojungle.co.il/dror-aviely-ethereum-center/) +- [Nir Rozin – Ein Cryptopunk sein](https://www.cryptojungle.co.il/nir-rozin-cryptopunk/) +- [Adan Kedem – Gaming & Metaverse](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) +- [Uri Kolodny (Starkware) – Ethereum und Blockchain-Ebenen](https://www.cryptojungle.co.il/uri-kolodny-starkware/) +- [Udi Wertheimer – Ethereum 2.0 vs. Konkurrenz](https://www.cryptojungle.co.il/udi-on-eth2/) +- [Ben Samocha (ich selbst) – Ethereum 2.0 – eine Chance?](https://www.cryptojungle.co.il/etherurm2-week-summary/) +- [Alon Muroch (Bloxstaking) – Was ist Ethereum 2.0?](https://www.cryptojungle.co.il/alon-moroch-eth2/) +- [Eilon Aviv (Collider Ventures) – Was bei Ethereum 2.0 schiefgehen kann](https://www.cryptojungle.co.il/eilon-aviv-eth2-0/) +- [Eilon Aviv (Collider Ventures) – Warum brauchen wir Ethereum 2.0](https://www.cryptojungle.co.il/eilon-aviv-ethereum-2-0/) ### Italienisch {#it} -- [Ethereum Italia](https://www.ethereum-italia.it/) – Ethereum-Ausbildung, Veranstaltungen und Nachrichten mit Schwerpunkt auf intelligente Verträge und Blockchain-Technologie +- [Ethereum Italia](https://www.ethereum-italia.it/) – Ethereum-Bildung, -Veranstaltungen und -Neuigkeiten mit Schwerpunkt auf Smart Contracts und Blockchain-Technologie - [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) – Ethereum-Podcast auf Italienisch -- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) – Lernen, wie man Solidity verwendet -- [Microsoft Learn (Intelligente Verträge)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – Lernen, wie man mit Solidity intelligente Verträge schreibt -- [Microsoft Learn (dApps)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) - Erstelle eine Benutzeroberfläche mit dezentralen Anwendungen +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) – lernen Sie, wie man Solidity verwendet +- [Microsoft Learn (Smart Contracts)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – lernen Sie das Schreiben von Smart Contracts mit Solidity +- [Microsoft Learn (Dapps)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) – erstellen Sie eine Benutzeroberfläche mit dezentralisierten Anwendungen ### Japanisch {#ja} -- [Japan Virtual and Crypto Assets Exchange Association](https://jvcea.or.jp/) -- [Japan Crypto Asset Business Association](https://cryptocurrency-association.org/) -- [Einstieg in die Blockchain-Entwicklung – Mehr erfahren | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) – Dieser Lernpfad führt Sie in die Blockchain und die Entwicklung auf der Ethereum-Plattform ein -- [Ethereum meistern](https://www.oreilly.co.jp/books/9784873118963/) – „Ethereum meistern" auf Japanisch -- [Ethereum meistern](https://www.oreilly.co.jp/books/9784873118963/) – „Ethereum meistern" auf Japanisch +- [Japan Virtual and Crypto assets Exchange Association](https://jvcea.or.jp/) +- [Japan Cryptoasset Business Association](https://cryptocurrency-association.org/) +- [Erste Schritte mit der Blockchain-Entwicklung – Learn | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) – Dieser Lernpfad führt Sie in die Blockchain und die Entwicklung auf der Ethereum-Plattform ein +- [Mastering Ethereum](https://www.oreilly.co.jp/books/9784873118963/) – Mastering Ethereum auf Japanisch +- [Hands-On Smart Contract Development with Solidity and Ethereum](https://www.oreilly.co.jp/books/9784873119342/) – Hands-On Smart Contract Development with Solidity and Ethereum auf Japanisch ### Russisch {#ru} -- [Cyber Academy](https://cyberacademy.dev) – Bildungsbereich für Web3-Entwickler -- [Forklog](https://forklog.com) – Nachrichten und informative Artikel über Krypto im Allgemeinen, vorhandene Technologien und zukünftige Upgrades verschiedener Blockchains -- [BeInCrypto](https://ru.beincrypto.com) – Nachrichten, Kryptopreisanalyse und nichttechnische Artikel mit einfachen Erklärungen zu allen Aspekten von Krypto +- [Cyber Academy](https://cyberacademy.dev) – Bildungsraum für Web3-Entwickler +- [Forklog](https://forklog.com) – Neuigkeiten und Bildungsartikel über Krypto im Allgemeinen, bestehende Technologien und zukünftige Upgrades verschiedener Blockchains +- [BeInCrypto](https://ru.beincrypto.com) – Neuigkeiten, Krypto-Preisanalyse und nicht-technische Artikel mit einfachen Erklärungen zu allem rund um Krypto ### Spanisch {#es} -- [Ethereum Madrid](https://ethereummadrid.com/) – Blockchain-, DeFi- und Verwaltungskurse, Veranstaltungen und Blog +- [Ethereum Madrid](https://ethereummadrid.com/) – Kurse zu Blockchain, DeFi und Governance, Veranstaltungen und Blog - [Cointelegraph](https://es.cointelegraph.com/ethereum-for-beginners) – Ethereum-Leitfaden für Anfänger auf Spanisch -- [Online-Tutorials](https://tutoriales.online/curso/solidity) – Solidity und Programmieren auf Ethereum lernen -- [Einführungskurs zur Ethereum-Entwicklung](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) – Solidity-Grundlagen, Testen und Einsatz Ihres ersten intelligenten Vertrags -- [Einführungskurs in Sicherheit und Hacking bei Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) – Allgemeine Schwachstellen und Sicherheitsprobleme in echten intelligenten Verträgen verstehen -- [Einführungskurs zur DeFi-Entwicklung](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) – Lernen, wie intelligente Verträge von DeFi in Solidity funktionieren und einen eigenen Automated Market Maker erstellen -- [Krypto-Universität](https://www.youtube.com/c/Cryptoversidad) – Nicht-technische Blockchain Bildung vom Anfänger bis zum Fortgeschrittenen. Lernen Sie alles über Krypto und Ethereum. +- [Tutoriales online](https://tutoriales.online/curso/solidity) – lernen Sie Solidity und das Programmieren auf Ethereum +- [Curso Introducción a Ethereum Development](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) – Solidity-Grundlagen, Testen und Bereitstellung Ihres ersten Smart Contracts +- [Curso Introducción a Seguridad y Hacking en Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) – verstehen Sie häufige Schwachstellen und Sicherheitsprobleme in echten Smart Contracts +- [Curso Introducción a DeFi Development](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) – lernen Sie, wie DeFi Smart Contracts in Solidity funktionieren, und erstellen Sie Ihren eigenen Automated Market Maker +- [Cryptoversidad](https://www.youtube.com/c/Cryptoversidad) – Nicht-technische Blockchain-Bildung vom Anfänger bis zum Fortgeschrittenen. Lernen Sie alles über Krypto und Ethereum. ### Türkisch {#tr} -- [BTK-Akademie](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) – Kurs mit Schwerpunkt auf Blockchain und Kryptowährungen -- [Die große Umbenennung: Was ist mit Eth2 passiert?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) – Türkische Übersetzung des großen Umbenennungs-Blogeintrags, erklärt die Abkehr von der Terminologie „Eth2“ +- [BTK Akademi](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) – Kurs mit Schwerpunkt auf Blockchain und Kryptowährungen +- [The great renaming: what happened to Eth2?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) – Türkische Übersetzung des Blogbeitrags zur großen Umbenennung, der die Abkehr von der „Eth2“-Terminologie erklärt ### Vietnamesisch {#vi} -- [Tino Gruppe](https://wiki.tino.org/ethereum-la-gi/) – Übersicht zu Ethereum, dApps, Wallets und häufig gestellte Fragen -- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) – Webplattform mit Unterseiten für Ethereum-Nachrichten und -Bildung -- [Coin68](https://coin68.com/ethereum-tieu-diem/) – Kryptowährungsportal mit Ethereum-Nachrichten und Bildungsinhalten +- [Tino Group](https://wiki.tino.org/ethereum-la-gi/) – Überblick über Ethereum, Dapps, Wallets und FAQs +- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) – Webplattform mit Unterseiten für Ethereum-Neuigkeiten und -Bildung +- [Coin68](https://coin68.com/ethereum-tieu-diem/) – Kryptowährungsportal mit Ethereum-Neuigkeiten und Bildungsinhalten \ No newline at end of file diff --git a/public/content/translations/de/community/online/index.md b/public/content/translations/de/community/online/index.md index 4d487d8c402..1f40875c066 100644 --- a/public/content/translations/de/community/online/index.md +++ b/public/content/translations/de/community/online/index.md @@ -1,50 +1,75 @@ --- -title: Online-Gemeinschaften -description: Eine Auflistung der Förderprogramme im gesamten Ethereum-Ökosystem. +title: Online-Communitys +description: Entdecken Sie Online-Foren, Chatrooms und Social-Media-Communitys, in denen sich Ethereum-Enthusiasten treffen, um zu diskutieren und zusammenzuarbeiten. lang: de --- -# Online-Gemeinschaften {#online-communities} +# Online-Communitys {#online-communities} + +Hunderttausende von [Ethereum](/)-Enthusiasten versammeln sich in diesen Online-Foren, um Neuigkeiten auszutauschen, über aktuelle Entwicklungen zu sprechen, technische Probleme zu diskutieren und sich die Zukunft vorzustellen. + +## Aufnahmerichtlinien {#listing-policy} + +Um die Integrität und den Wert der aufgeführten Communitys zu wahren, befolgt ethereum.org strenge Richtlinien zur Bestimmung der Eignung: + +### Eignungskriterien {#eligibility-criteria} + +- **Relevanz**: Die Community muss in direktem Zusammenhang mit Ethereum und seinem Ökosystem stehen. +- **Aktivitätsniveau**: Die Community sollte aktiv sein, mit regelmäßigen Interaktionen, Beiträgen oder Diskussionen. Ruhende oder inaktive Communitys können entfernt werden. +- **Inklusivität**: Die Community sollte ein einladendes Umfeld fördern, das Vielfalt respektiert und die Teilnahme von Menschen aller Hintergründe ermutigt. +- **Nicht-kommerzieller Fokus**: Die Einträge sind für von der Community getragene Räume gedacht und nicht für kommerzielle oder werbliche Plattformen. + +### Inhaltsrichtlinien {#content-guidelines} + +- **Angemessene Inhalte**: Communitys müssen über eigene Moderationsrichtlinien verfügen und Spam, Hassreden, Belästigung oder jegliche Inhalte, die illegale Aktivitäten fördern, vermeiden. +- **Sprache**: Obwohl Englisch die Hauptsprache ist, werden Communitys in anderen Sprachen ermutigt, sich einzutragen, solange sie eine inklusive und respektvolle Atmosphäre aufrechterhalten. +- **Transparenz**: Klare Informationen über den Zweck, die Regeln und die Moderatoren der Community sollten für die Mitglieder verfügbar sein. + +### Weitere Empfehlungen {#other-recommendations} + +- **Zugänglichkeit**: Community-Foren sollten für jeden lesbar sein, ohne dass eine Anmeldung oder Registrierung erforderlich ist. +- **Discord-Server-Einladungen**: Es wird empfohlen, dass nur zuverlässige Discord-Server-Einladungen zu ethereum.org hinzugefügt werden. Idealerweise sollten diese Einladungen auf eine Community-Seite auf der Website verlinken (z. B. [ethglobal.com/discord](https://ethglobal.com/discord)) oder von einer offiziellen URL stammen (z. B. [discord.gg/ethstaker](https://discord.gg/ethstaker) oder [discord.com/invite/ethstaker](https://discord.com/invite/ethstaker)). + +Wenn Sie der Meinung sind, dass eine Community basierend auf diesen Richtlinien hinzugefügt oder entfernt werden sollte, [eröffnen Sie bitte ein Issue in unserem GitHub-Repository](https://github.com/ethereum/ethereum-org-website/issues). -Hunderttausende von Ethereum-Enthusiasten treffen sich in diesen Online-Foren, um Neuigkeiten auszutauschen, über aktuelle Entwicklungen zu sprechen, technische Fragen zu diskutieren und Bilder der Zukunft zu zeichnen. ## Foren {#forums} -r/ethereum - Alles über Ethereum -r/ethfinance - Die finanzielle Seite von Ethereum, einschließlich DeFi -r/ethdev - Fokus auf die Entwicklung von Ethereum -r/ethtrader - Trends & Marktanalyse -r/ethstaker - Ein herzliches Willkommen an alle Interessierten, die auf Ethereum setzen möchten -Gemeinschaft der Ethereum-Zauberer - gemeinschaftsorientiert über technische Standards bei Ethereum -Ethereum Stackexchange - Diskussionen und Hilfe für Ethereum-Entwickler -Ethereum-Research - die einflussreichste Nachrichtentafel für kryptoökonomische Forschung - -## Chat-Räume {#chat-rooms} - -Ethereum Cat Herders - Gemeinschaft orientiert am Angebot von Projekt-Management-Unterstützung für Ethereum-Entwickler -Ethereum-Hacker - Von ETHGlobal geführter Discord Chat: Eine Online-Gemeinschaft für Ethereum-Hacker auf der ganzen Welt -CryptoDevs - Auf Ethereum Entwicklung fokussierte Discord-Community -EthStaker Discord – Beratung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker auf Community-Ebene -Ethereum.org Website-Team - Kommen Sie vorbei and schreiben Sie mit dem Team und anderen aus der Gemeinschaft über Ethereum.org Web-Entwicklung und Design -Matos Discord - Web3-Creator-Community, wo sich Entwickler, industrielle Führer, und Ethereum Enthusiasten aufhalten. Wir sind begeistert von Web3-Entwicklung, Design und Kultur. Kommen Sie mit uns bauen. -Solidity-Gitter - Unterhaltungen über Solidity-Entwicklung (Gitter) -Solidity-Matrix - Unterhaltungen über Solidity-Entwicklung (Matrix) -Ethereum Stack Exchange *– Forum für Fragen und Antworten* -Peeranha *– dezentrales Forum für Fragen und Antworten* - -## YouTube und Twitter {#youtube-and-twitter} - -Ethereum Foundation - Bleiben Sie auf dem Laufenden mit den neuesten Informationen der Ethereum Foundation -@ethereum – offizielles Konto der Ethereum Foundation -@ethdotorg - Das Portal zu Ethereum, für unsere wachsende globale Gemeinschaft geschaffen -Liste von einflussreichen Ethereum Twitter-Accounts +r/ethereum – alles rund um Ethereum +r/ethfinance – die finanzielle Seite von Ethereum, einschließlich DeFi +r/ethdev – fokussiert auf die Ethereum-Entwicklung +r/ethtrader – Trends & Marktanalyse +r/ethstaker – willkommen an alle, die am Staking auf Ethereum interessiert sind +Fellowship of Ethereum Magicians – Community, die sich an technischen Standards in Ethereum orientiert +Ethereum Stackexchange – Diskussion und Hilfe für Ethereum-Entwickler +Ethereum Research – das einflussreichste Forum für kryptoökonomische Forschung + +## Chatrooms {#chat-rooms} + +Ethereum Cat Herders – Community, die sich darauf konzentriert, Projektmanagement-Unterstützung für die Ethereum-Entwicklung anzubieten +Ethereum Hackers – Discord-Chat, betrieben von ETHGlobal: eine Online-Community für Ethereum-Hacker auf der ganzen Welt +CryptoDevs – auf Ethereum-Entwicklung fokussierte Discord-Community +EthStaker Discord – von der Community betriebene Anleitung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker +Ethereum.org website team – schauen Sie vorbei und chatten Sie über Webentwicklung und Design von ethereum.org mit dem Team und Leuten aus der Community +Matos Discord – Web3-Ersteller-Community, in der sich Entwickler, Branchenführer und Ethereum-Enthusiasten aufhalten. Wir haben eine Leidenschaft für Web3-Entwicklung, Design und Kultur. Kommen Sie und bauen Sie mit uns. +Solidity Matrix – Chat für Solidity-Entwicklung (Matrix) +Ethereum Stack Exchange – Frage-und-Antwort-Forum +Peera Community Forum – dezentralisiertes Frage-und-Antwort-Forum + +## YouTube und X (ehemals Twitter) {#youtube-and-twitter} + +Ethereum Foundation – Bleiben Sie auf dem Laufenden mit den neuesten Informationen der Ethereum Foundation +@ethereum – Haupt-Ethereum-Konto für die Community +@ethereumfndn – Offizielles Konto der Ethereum Foundation +@ethdotorg – Das Portal zu Ethereum, gebaut für unsere wachsende globale Community
- Erfahren Sie mehr über DAO's + Erfahren Sie mehr über DAOs -
-
+ + + \ No newline at end of file diff --git a/public/content/translations/de/community/research/index.md b/public/content/translations/de/community/research/index.md index c897a4e6d22..a6cd171a797 100644 --- a/public/content/translations/de/community/research/index.md +++ b/public/content/translations/de/community/research/index.md @@ -1,290 +1,290 @@ --- title: Aktive Bereiche der Ethereum-Forschung -description: Machen Sie sich mit den verschiedenen Bereichen der offenen Forschung vertraut und erfahren Sie, wie auch Sie sich beteiligen können. +description: "Erkunden Sie verschiedene Bereiche der offenen Forschung und erfahren Sie, wie Sie sich einbringen können." lang: de --- # Aktive Bereiche der Ethereum-Forschung {#active-areas-of-ethereum-research} -Eine der Hauptstärken von Ethereum ist, dass es von einer aktiven Forschungs- und Technik-Community ständig verbessert wird. Viele begeisterte und kompetente Menschen aus aller Welt würden sich gern bei aktuellen Problemstellungen rund um Ethereum einbringen. Doch es ist nicht immer einfach, herauszufinden, was diese Probleme sind. Auf dieser Seite finden Sie die wichtigsten aktiven Forschungsgebiete. So erhalten Sie einen groben Überblick über Innovationen bei Ethereum. +Eine der Hauptstärken von Ethereum ist, dass eine aktive Forschungs- und Entwicklungs-Community es ständig verbessert. Viele enthusiastische, fähige Menschen weltweit würden sich gerne den noch offenen Problemen bei Ethereum widmen, aber es ist nicht immer einfach herauszufinden, welche das sind. Diese Seite skizziert die wichtigsten aktiven Forschungsbereiche als groben Leitfaden für den neuesten Stand der Technik bei Ethereum. -## Wie Ethereum-Forschung funktioniert {#how-ethereum-research-works} +## Wie die Ethereum-Forschung funktioniert {#how-ethereum-research-works} -Ethereum-Forschung ist öffentlich und transparent und verkörpert damit die Prinzipien [dezentralisierter Wissenschaft (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science). Die Idee dahinter ist es, Forschungswerkzeuge und Ergebnisse so offen und interaktiv wie möglich zu gestalten – etwa durch ausführbare Notizhefte. Ethereum-Forschung schreitet schnell voran, da neue Erkenntnisse öffentlich in Foren wie [ethresear.ch](https://ethresear.ch/) gepostet und besprochen werden, anstatt sich nach mehreren Peer-Review-Runden durch traditionelle Veröffentlichungen an die Community zu wenden. +Die Ethereum-Forschung ist offen und transparent und verkörpert die Prinzipien der [dezentralisierten Wissenschaft (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science). Die Kultur besteht darin, Forschungswerkzeuge und -ergebnisse so offen und interaktiv wie möglich zu gestalten, beispielsweise durch ausführbare Notebooks. Die Ethereum-Forschung bewegt sich schnell; neue Erkenntnisse werden offen in Foren wie [ethresear.ch](https://ethresear.ch/) veröffentlicht und diskutiert, anstatt die Community erst nach mehreren Runden von Peer-Reviews durch traditionelle Publikationen zu erreichen. ## Allgemeine Forschungsressourcen {#general-research-resources} -Unabhängig vom jeweiligen Thema findet sich auf [ethresear.ch](https://ethresear.ch) und dem [Eth R&D-Discord-Kanal](https://discord.gg/qGpsxSA) eine Fülle an Informationen zur Ethereum-Forschung. Das sind die wichtigsten Orte, an denen die Ethereum-Forscher die neuesten Ideen und Entwicklungsmöglichkeiten diskutieren. +Unabhängig vom spezifischen Thema gibt es auf [ethresear.ch](https://ethresear.ch) und im [Eth R&D Discord-Kanal](https://discord.gg/qGpsxSA) eine Fülle von Informationen zur Ethereum-Forschung. Dies sind die wichtigsten Orte, an denen Ethereum-Forscher die neuesten Ideen und Entwicklungsmöglichkeiten diskutieren. -Dieser Bericht wurde im Mai 2022 von [DelphiDigital](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) veröffentlicht und verschafft einen guten Überblick über die Ethereum-Roadmap. +Dieser im Mai 2022 von [DelphiDigital](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) veröffentlichte Bericht bietet einen guten Überblick über die Ethereum-Roadmap. ## Finanzierungsquellen {#sources-of-funding} -Sie können sich an der Forschung um Ethereum beteiligen und Geld dafür erhalten! Zum Beispiel veranstaltete [die Ethereum Foundation](/foundation/) vor Kurzem eine [Finanzierungsrunde für akademische Stipendien](https://esp.ethereum.foundation/academic-grants). Informationen über aktive und bevorstehende Finanzierungsmöglichkeiten finden Sie auf der [Ethereum-Finanzierungseite](/community/grants/) finden. +Sie können sich an der Ethereum-Forschung beteiligen und dafür bezahlt werden! Zum Beispiel hat [die Ethereum Foundation](/foundation/) kürzlich eine [Finanzierungsrunde für akademische Stipendien (Academic Grants)](https://esp.ethereum.foundation/academic-grants) durchgeführt. Informationen zu aktiven und kommenden Finanzierungsmöglichkeiten finden Sie auf [der Ethereum-Zuschussseite](/community/grants/). ## Protokollforschung {#protocol-research} -Protokollforschung beschäftigt sich mit der Grundebene von Ethereum – dem Regelsatz, der definiert, wie sich Knoten verbinden, miteinander kommunizieren, Ethereum-Daten austauschen und speichern und zu einem Konsens zum aktuellen Stand der Blockchain kommen. Protokollforschung wird auf oberster Ebene in zwei Kategorien geteilt: Konsens und Ausführung. +Die Protokollforschung befasst sich mit der Basisebene von Ethereum – dem Regelwerk, das definiert, wie Blockchain-Knoten sich verbinden, kommunizieren, Ethereum-Daten austauschen und speichern und zu einem Konsens über den Zustand der Blockchain gelangen. Die Protokollforschung wird in zwei Hauptkategorien unterteilt: Konsens und Ausführung. ### Konsens {#consensus} -Konsensforschung beschäftigt sich mit [Ethereums Proof-of-Stake-Mechanismus](/developers/docs/consensus-mechanisms/pos/). Einige Beispiele zu Konsensforschungsgebieten: +Die Konsensforschung befasst sich mit dem [Proof-of-Stake-Mechanismus von Ethereum](/developers/docs/consensus-mechanisms/pos/). Einige beispielhafte Themen der Konsensforschung sind: -- Schwachstellen identifizieren und beheben -- Die kryptoökonomische Sicherheit quantifizieren -- Die Sicherheit oder Leistung bei der Implementierung der Clients verbessern -- Leichte Clients entwickeln +- Identifizierung und Behebung von Schwachstellen; +- Quantifizierung der kryptografischen und wirtschaftlichen Sicherheit; +- Erhöhung der Sicherheit oder Leistung von Client-Implementierungen; +- und Entwicklung von Light-Clients. -Genau wie zukunftsorientierte Forschung werden einige fundamentale Neugestaltungen des Protokolls, wie beispielsweise die Entgültigkeit von Einzelslots (Single Slot Finality), erforscht, damit signifikante Verbesserungen von Ethereum möglich sind. Wichtige Forschungsgebiete sind außerdem Effizienz, Sicherheit und Überwachung von Peer-to-Peer-Netzwerken zwischen Konsens-Clients. +Neben zukunftsweisender Forschung werden auch einige grundlegende Neugestaltungen des Protokolls, wie z. B. die Single-Slot-Finalität, erforscht, um signifikante Verbesserungen für Ethereum zu ermöglichen. Darüber hinaus sind die Effizienz, Sicherheit und Überwachung der Peer-to-Peer-Vernetzung zwischen Konsens-Clients ebenfalls wichtige Forschungsthemen. #### Hintergrundlektüre {#background-reading} - [Einführung in Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -- [Casper-FFG-Artikel](https://arxiv.org/abs/1710.09437) +- [Casper-FFG-Paper](https://arxiv.org/abs/1710.09437) - [Casper-FFG-Erklärung](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) -- [Casper-Artikel](https://arxiv.org/abs/2003.03052) +- [Gasper-Paper](https://arxiv.org/abs/2003.03052) #### Aktuelle Forschung {#recent-research} -- [Ethresear.ch – Konsens](https://ethresear.ch/c/consensus/29) -- [Verfügbarkeits-/Endgültigkeitsdilemma](https://arxiv.org/abs/2009.04987) -- [Einzelslot-Finalität](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) -- [Proposer-Builder-Trennung](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) +- [Ethresear.ch Konsens](https://ethresear.ch/c/consensus/29) +- [Verfügbarkeits-/Finalitäts-Dilemma](https://arxiv.org/abs/2009.04987) +- [Single-Slot-Finalität](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) +- [Trennung von Block-Vorschlagenden und -Erstellern (Proposer-Builder Separation)](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) ### Ausführung {#execution} -Die Ausführungsebene beschäftigt sich damit, Transaktionen auszuführen, die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) zu betreiben und Ausführungsnutzlasten zu generieren, die an die Konsensebene übergeben werden. Es gibt viele Bereiche der aktiven Forschung, dazu gehören: +Die Ausführungsebene befasst sich mit der Ausführung von Transaktionen, dem Betrieb der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) und der Generierung von Ausführungs-Payloads zur Weitergabe an die Konsensebene. Es gibt viele aktive Forschungsbereiche, darunter: -- Unterstützung von leichten Clients etablieren -- Gas-Limits untersuchen -- Neue Datenstrukturen (z. B. Verkle-Bäume) etablieren +- Ausbau der Unterstützung für Light-Clients; +- Erforschung von Gaslimits; +- und Einbindung neuer Datenstrukturen (z. B. Verkle Tries). #### Hintergrundlektüre {#background-reading-1} - [Einführung in die EVM](/developers/docs/evm) -- [Ethresear.ch – Ausführungsebene](https://ethresear.ch/c/execution-layer-research/37) +- [Ethresear.ch Ausführungsebene](https://ethresear.ch/c/execution-layer-research/37) #### Aktuelle Forschung {#recent-research-1} -- [Datenbankoptimierung](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) -- [Statusverfall](https://notes.ethereum.org/@vbuterin/state_expiry_eip) -- [Wege zum Statusverfall](https://hackmd.io/@vbuterin/state_expiry_paths) -- [Verkle und Vorschlag zum Statusverfall](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) -- [Verlaufsmanagement](https://eips.ethereum.org/EIPS/eip-4444) -- [Verkle-Bäume](https://vitalik.eth.limo/general/2021/06/18/verkle.html) -- [Datenverfügbarkeits-Sampling](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) +- [Datenbankoptimierungen](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) +- [Ablauf des Zustands (State Expiry)](https://notes.ethereum.org/@vbuterin/state_expiry_eip) +- [Wege zum Ablauf des Zustands](https://hackmd.io/@vbuterin/state_expiry_paths) +- [Vorschlag zu Verkle und Ablauf des Zustands](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) +- [Verwaltung der Historie](https://eips.ethereum.org/EIPS/eip-4444) +- [Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) +- [Datenverfügbarkeits-Sampling (Data Availability Sampling)](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## Client-Entwicklung {#client-development} -Ethereum-Clients sind Implementationen des Ethereum-Protokolls. Die Entwicklung von Clients realisiert die Ergebnisse der Protokollforschung, indem sie in diese Clients einfließen. Die Entwicklung von Clients beinhaltet das Aktualisieren der Client-Spezifikationen sowie den Aufbau spezifischer Implementationen. +Ethereum-Clients sind Implementierungen des Ethereum-Protokolls. Die Client-Entwicklung setzt die Ergebnisse der Protokollforschung in die Realität um, indem sie diese in die Clients integriert. Die Client-Entwicklung umfasst sowohl die Aktualisierung der Client-Spezifikationen als auch die Erstellung spezifischer Implementierungen. -Ein Ethereum-Knoten wird benötigt, um zwei Arten von Software zu betreiben: +Ein Ethereum-Blockchain-Knoten muss zwei Softwarekomponenten ausführen: -1. einen Konsens-Client, um die Spitze der Blockchain zu verfolgen, Blöcke zu übermitteln und die Konsenslogik zu verarbeiten -2. einen Ausführungs-Client, um die virtuelle Ethereum Virtual Machine (EVM) zu unterstützen und Transaktionen sowie Smart Contracts auszuführen +1. einen Konsens-Client, um die Spitze der Blockchain zu verfolgen, Blöcke zu verbreiten (Gossip) und die Konsenslogik zu handhaben +2. einen Ausführungs-Client, um die Ethereum Virtual Machine zu unterstützen und Transaktionen sowie Smart Contracts auszuführen -Besuchen Sie die [Knoten- und Clients-Seite](/developers/docs/nodes-and-clients/), um mehr Details zu Knoten und Clients zu erfahren und eine Liste aller aktuellen Client-Implementationen einzusehen. Auf der [Verlaufsseite](/ethereum-forks/) können Sie auch den Verlauf aller Ethereum-Upgrades finden. +Weitere Details zu Blockchain-Knoten und Clients sowie eine Liste aller aktuellen Client-Implementierungen finden Sie auf der Seite [Knoten und Clients](/developers/docs/nodes-and-clients/). Eine Historie aller Ethereum-Upgrades finden Sie auf der [Historienseite](/ethereum-forks/). ### Ausführungs-Clients {#execution-clients} -- [Ausführungs-Client-Spezifikation](https://github.com/ethereum/execution-specs) -- [Ausführungs-API-Spezifikation](https://github.com/ethereum/execution-apis) +- [Spezifikation für Ausführungs-Clients](https://github.com/ethereum/execution-specs) +- [Spezifikation der Ausführungs-API](https://github.com/ethereum/execution-apis) ### Konsens-Clients {#consensus-clients} -- [Konsens-Client-Spezifikation](https://github.com/ethereum/consensus-specs) -- [Beacon-API-Spezifikation](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) +- [Spezifikation für Konsens-Clients](https://github.com/ethereum/consensus-specs) +- [Spezifikation der Beacon-API](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) ## Skalierung und Leistung {#scaling-and-performance} -Das Skalieren von Ethereum ist ein äußerst wichtiger Bereich für Ethereum-Forscher. Die aktuellen Ansätze beschäftigen sich damit, Transaktionen auf Rollups auszulagen und diese durch Daten-Blobs so günstig wie möglich zu machen. Einführende Informationen zur Ethereum-Skalierung sind auf unserer [Skalierungsseite](/developers/docs/scaling) verfügbar. +Die Skalierung von Ethereum ist ein großer Schwerpunkt für Ethereum-Forscher. Aktuelle Ansätze umfassen die Auslagerung von Transaktionen auf Rollups und deren größtmögliche Verbilligung durch Daten-Blobs. Einführende Informationen zur Skalierung von Ethereum finden Sie auf unserer [Skalierungsseite](/developers/docs/scaling). ### Ebene 2 {#layer-2} -Es gibt jetzt mehrere Ebene-2-Protokolle, die Ethereum skalieren und dabei verschiedene Techniken für die Stapelverarbeitung von Transaktionen nutzen und sie auf Ebene 1 von Ethereum sichern. Dieser Bereich entwickelt sich rasant und bietet enormes Forschungs- und Entwicklungspotenzial. +Es gibt mittlerweile mehrere Ebene-2-Protokolle, die Ethereum skalieren, indem sie verschiedene Techniken zur Bündelung von Transaktionen und zu deren Absicherung auf der Ethereum-Ebene 1 verwenden. Dies ist ein sehr schnell wachsendes Thema mit viel Forschungs- und Entwicklungspotenzial. #### Hintergrundlektüre {#background-reading-2} - [Einführung in Ebene 2](/layer-2/) -- [Polynya: Rollups, DA und Modularketten](https://polynya.medium.com/rollups-data-availability-layers-modular-blockchains-introductory-meta-post-5a1e7a60119d) +- [Polynya: Rollups, Datenverfügbarkeit und modulare Blockchains](https://polynya.medium.com/rollups-data-availability-layers-modular-blockchains-introductory-meta-post-5a1e7a60119d) #### Aktuelle Forschung {#recent-research-2} -- [Das Fair-Ordering für Sequencer von Arbitrum](https://eprint.iacr.org/2021/1465) -- [ethresear.ch – Ebene 2](https://ethresear.ch/c/layer-2/32) +- [Arbitrums faire Reihenfolge für Sequencer](https://eprint.iacr.org/2021/1465) +- [Ethresear.ch Ebene 2](https://ethresear.ch/c/layer-2/32) - [Rollup-zentrierte Roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) - [L2Beat](https://l2beat.com/) -### Brücken {#bridges} +### Kettenübergreifende Brücken {#bridges} -Sichere und leistungsfähige Brücken sind ein spezifischer Bereich der Ebene 2, für den mehr Forschung und Entwicklung erforderlich sind. Das beinhaltet Brücken zwischen verschiedenen Ebenen 2 und Brücken zwischen Ebene 1 und Ebene 2. Dieser Forschungsbereich ist besonders wichtig, da Hacker sich häufig auf Brücken konzentrieren. +Ein besonderer Bereich von Ebene 2, der mehr Forschung und Entwicklung erfordert, sind sichere und leistungsstarke kettenübergreifende Brücken. Dies umfasst Brücken zwischen verschiedenen Ebene-2-Lösungen sowie Brücken zwischen Ebene 1 und Ebene 2. Dies ist ein besonders wichtiges Forschungsgebiet, da Brücken häufig das Ziel von Hackern sind. #### Hintergrundlektüre {#background-reading-3} -- [Einführung in Blockchain-Brücken](/bridges/) -- [Vitalik zum Thema Brücken](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) -- [Artikel zum Thema Blockchain-Brücken](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Gesperrter Wert in Brücken](https://dune.com/eliasimos/Bridge-Away-\(from-Ethereum\)) +- [Einführung in kettenübergreifende Brücken](/bridges/) +- [Vitalik über Brücken](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) +- [Artikel über Blockchain-Brücken](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) +- [In Brücken gebundener Wert]() #### Aktuelle Forschung {#recent-research-3} -- [Validierung von Brücken] (https://stonecoldpat.github.io/images/validatingbridges.pdf) +- [Validierung von Brücken](https://stonecoldpat.github.io/images/validatingbridges.pdf) ### Sharding {#sharding} -Das Sharding der Ethereum-Blockchain war lange Teil des Entwicklungsfahrplans. Es gibt jedoch neue Skalierungsansätze wie das „Danksharding“, die zuzeit im Mittelpunkt stehen. +Das Sharding der Ethereum-Blockchain ist seit langem Teil der Entwicklungs-Roadmap. Neue Skalierungslösungen wie „Danksharding“ rücken jedoch derzeit in den Mittelpunkt. -Die Vorstufe zum vollständigen Danksharding, das sogenannte Proto-Danksharding, wurde mit der Upgrade des Netzwerks Cancun-Deneb („Dencun“) in Betrieb genommen. +Der Vorläufer des vollständigen Dankshardings, bekannt als Proto-Danksharding, ging mit dem Netzwerk-Upgrade Cancun-Deneb („Dencun“) live. -[Mehr zum Dencun-Upgrade](/roadmap/dencun/) +[Mehr über das Dencun-Upgrade](/roadmap/dencun/) #### Hintergrundlektüre {#background-reading-4} -- [Proto-Danksharding – Hinweise](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) -- [Bankless Danksharding – Video](https://www.youtube.com/watch?v=N5p0TB77flM) -- [Forschungskompendium zu Ethereum-Sharding](https://notes.ethereum.org/@serenity/H1PGqDhpm?type=view) +- [Notizen zu Proto-Danksharding](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) +- [Bankless-Video zu Danksharding](https://www.youtube.com/watch?v=N5p0TB77flM) +- [Kompendium zur Ethereum-Sharding-Forschung](https://notes.ethereum.org/@serenity/H1PGqDhpm?type=view) - [Danksharding (Polynya)](https://polynya.medium.com/danksharding-36dc0c8067fe) #### Aktuelle Forschung {#recent-research-4} - [EIP-4844: Proto-Danksharding](https://eips.ethereum.org/EIPS/eip-4844) -- [Vitalik zum Thema Sharding und Datenverfügbarkeitsstichproben](https://hackmd.io/@vbuterin/sharding_proposal) +- [Vitalik über Sharding und Datenverfügbarkeits-Sampling](https://hackmd.io/@vbuterin/sharding_proposal) ### Hardware {#hardware} -[Der Betrieb von Knoten](/developers/docs/nodes-and-clients/run-a-node/) auf schichter Hardware ist für die Dezentralität von Ethereum von entscheidender Bedeutung. Deshalb ist die aktive Forschung zum Abbau der Voraussetzungen an die Hardware für das Betreiben von Knoten ein wichtiger Bereich. +[Das Betreiben von Blockchain-Knoten](/developers/docs/nodes-and-clients/run-a-node/) auf bescheidener Hardware ist grundlegend, um Ethereum dezentralisiert zu halten. Daher ist die aktive Forschung zur Minimierung der Hardwareanforderungen für den Betrieb von Knoten ein wichtiges Forschungsgebiet. #### Hintergrundlektüre {#background-reading-5} -- [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) +- [Ethereum auf ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) #### Aktuelle Forschung {#recent-research-5} -- [ecdsa auf FPGAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [ECDSA auf FPGAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Sicherheit {#security} -Sicherheit ist ein großes Feld, das Spam-/Scam-Prävention, Sicherheit von Wallets, Hardwaresicherheit, krypto-ökonomische Sicherheit, Fehlersuche und das Testen von Anwendungen und Client-Software sowie die Schlüsselverwaltung umfasst. Beiträge zu Erkenntnissen in diesen Bereichen werden dabei helfen, die Bereitschaft zur Annahme in der Öffentlichkeit zu fördern. +Sicherheit ist ein weites Thema, das Spam-/Betrugsprävention, Wallet-Sicherheit, Hardware-Sicherheit, kryptografische und wirtschaftliche Sicherheit, Fehlersuche (Bug Hunting) sowie das Testen von Anwendungen und Client-Software und Schlüsselverwaltung umfassen kann. Ein Beitrag zum Wissen in diesen Bereichen wird dazu beitragen, die breite Akzeptanz zu fördern. -### Kryptographie und ZKP {#cryptography--zkp} +### Kryptografie & ZKP {#cryptography--zkp} -Zero-Knowledge-Proofs (ZKP) und Kryptographie sind entscheidend, wenn es darum geht, Datenschutz und Sicherheit bei Ethereum und seinen Anwendungen zu etablieren. Zero-Knowledge ist ein relativ junger, aber sich schnell entwickelnder Bereich mit vielen offenen Forschungs- und Entwicklungsmöglichkeiten. Zu den Möglichkeiten gehören die Entwicklung effizienterer Implementierungen des [Keccak-Hashing-Algorithmus](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview), die Suche nach besseren Polynomverpflichtungen, als es sie derzeit gibt, die Senkung der Kosten für die Generierung öffentlicher ECDSA-Schlüssel und Signaturverifizierungsschaltungen. +Zero-Knowledge-Beweise (ZKP) und Kryptografie sind entscheidend, um Datenschutz und Sicherheit in Ethereum und seine Anwendungen zu integrieren. Zero-Knowledge ist ein relativ junger, aber schnelllebiger Bereich mit vielen offenen Forschungs- und Entwicklungsmöglichkeiten. Einige Möglichkeiten umfassen die Entwicklung effizienterer Implementierungen des [Keccak-Hashing-Algorithmus](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview), das Finden besserer polynomieller Commitments als die derzeit existierenden oder die Reduzierung der Kosten für die Generierung von ECDSA-Public-Keys und Signaturverifizierungsschaltungen. #### Hintergrundlektüre {#background-reading-6} - [0xparc-Blog](https://0xparc.org/blog) - [zkp.science](https://zkp.science/) -- [Zero Knowledge-Podcast](https://zeroknowledge.fm/) +- [Zero-Knowledge-Podcast](https://zeroknowledge.fm/) #### Aktuelle Forschung {#recent-research-6} -- [Jüngste Fortschritte in der Kryptographie mit elliptischen Kurven](https://ethresear.ch/t/the-ec-fft-algorithm-without-elliptic-curve-and-isogenies/11346) -- [Ethresear.ch – ZK](https://ethresear.ch/c/zk-s-nt-arks/13) +- [Jüngste Fortschritte in der Kryptografie mit elliptischen Kurven](https://ethresear.ch/t/the-ec-fft-algorithm-without-elliptic-curve-and-isogenies/11346) +- [Ethresear.ch ZK](https://ethresear.ch/c/zk-s-nt-arks/13) ### Wallets {#wallets} -Ethereum-Wallets können Browsererweiterungen, Desktop- und Handyapps oder Smart Contracts auf Ethereum sein. Es gibt auch aktive Forschung, die sich mit Social-Recovery-Wallets befasst, die einige Risiken in Zusammenhang mit der Schlüsselverwaltung bei individuellen Benutzern minimieren. Verbunden mit der Wallet-Entwicklung ist die Forschung für alternative Formen der Kontoabstraktion, was ein wichtiges zukünftiges Forschungsfeld darstellt. +Ethereum-Wallets können Browser-Erweiterungen, Desktop- und mobile Apps oder Smart Contracts auf Ethereum sein. Es gibt aktive Forschung zu Social-Recovery-Wallets, die einige der Risiken verringern, die mit der Schlüsselverwaltung durch einzelne Benutzer verbunden sind. Verbunden mit der Entwicklung von Wallets ist die Erforschung alternativer Formen der Kontoabstraktion (Account Abstraction), was ein wichtiges Gebiet der aufkommenden Forschung ist. #### Hintergrundlektüre {#background-reading-7} - [Einführung in Wallets](/wallets/) -- [Einführung in die Sicherheit von Wallets](/security/) -- [ethresear.ch – Sicherheit](https://ethresear.ch/tag/security) +- [Einführung in die Wallet-Sicherheit](/security/) +- [Ethresear.ch Sicherheit](https://ethresear.ch/tag/security) - [EIP-2938 Kontoabstraktion](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 Kontoabstraktion](https://eips.ethereum.org/EIPS/eip-4337) #### Aktuelle Forschung {#recent-research-7} -- [Validierungsorientierte Smart-Contract-Wallets] (https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [Validierungsfokussierte Smart-Contract-Wallets](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) - [Die Zukunft von Konten](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) -- [EIP-3074: AUTH- und AUTHCALL-Opcodes](https://eips.ethereum.org/EIPS/eip-3074) -- [Veröffentlichung von Code unter einer EOA-Adresse](https://eips.ethereum.org/EIPS/eip-5003) +- [EIP-3074 AUTH- und AUTHCALL-Opcodes](https://eips.ethereum.org/EIPS/eip-3074) +- [Veröffentlichung von Code an einer EOA-Adresse](https://eips.ethereum.org/EIPS/eip-5003) -## Community, Aufklärung und Reichweite {#community-education-and-outreach} +## Community, Bildung und Öffentlichkeitsarbeit {#community-education-and-outreach} -Damit sich neue Benutzer mit Ethereum vertraut machen können, braucht es informative Ressourcen und Ansätze, um Reichweite zu schaffen. Das kann Blogeinträge, Artikel, Bücher, Podcasts, Memes, Lehrmittel, Ereignisse und alles Weitere, was Communitys bildet, Neuanfänger begrüßt und Personen über Ethereum aufklärt, beinhalten. +Das Onboarding neuer Benutzer bei Ethereum erfordert neue Bildungsressourcen und Ansätze für die Öffentlichkeitsarbeit. Dies kann Blogbeiträge und Artikel, Bücher, Podcasts, Memes, Lehrmaterialien, Veranstaltungen und alles andere umfassen, was Communities aufbaut, Neueinsteiger willkommen heißt und Menschen über Ethereum aufklärt. ### UX/UI {#uxui} -Um mehr Menschen mit Ethereum vertraut zu machen, muss das Ökosystem die UX/UI verbessern. Dafür braucht es Designer und Produktexperten, die das Design von Wallets und Anwendungen prüfen. +Um mehr Menschen für Ethereum zu gewinnen, muss das Ökosystem die UX/UI verbessern. Dies erfordert, dass Designer und Produktexperten das Design von Wallets und Apps neu überdenken. #### Hintergrundlektüre {#background-reading-8} -- [Ethresear.ch – UX/UI](https://ethresear.ch/c/ui-ux/24) +- [Ethresear.ch UX/UI](https://ethresear.ch/c/ui-ux/24) #### Aktuelle Forschung {#recent-research-8} -- [Web3-Design-Discord](https://discord.gg/FsCFPMTSm9) -- [Web3-Design-Prinzipien](https://www.web3designprinciples.com/) -- [Ethereum Magicians-UX-Diskussion](https://ethereum-magicians.org/t/og-council-ux-follow-up/9032/3) +- [Web3 Design Discord](https://discord.gg/FsCFPMTSm9) +- [Web3-Designprinzipien](https://www.web3designprinciples.com/) +- [Ethereum Magicians UX-Diskussion](https://ethereum-magicians.org/t/og-council-ux-follow-up/9032/3) ### Wirtschaft {#economics} -Die Wirtschaftsforschung rund um Ethereum verfolgt im Großen und Ganzen zwei Ansätze: das Validieren der Sicherheit von Mechanismen, die von wirtschaftlichen Anreizen („Mikroökonomie“) abhängig sind, und das Analysieren des Wertflusses zwischen Protokollen, Anwendungen und Benutzern („Makroökonomie“). Es gibt komplexe krypto-ökonomische Faktoren, die mit dem nativen Ethereum-Asset (Ether) und den darauf aufbauenden Token (z. B. NFTs und ERC20-Token) zusammenhängen. +Die Wirtschaftsforschung bei Ethereum verfolgt im Wesentlichen zwei Ansätze: die Validierung der Sicherheit von Mechanismen, die auf wirtschaftlichen Anreizen beruhen („Mikroökonomie“), und die Analyse der Wertströme zwischen Protokollen, Anwendungen und Benutzern („Makroökonomie“). Es gibt komplexe kryptografische und wirtschaftliche Faktoren in Bezug auf den nativen Vermögenswert von Ethereum (Ether) und die darauf aufgebauten Token (zum Beispiel NFTs und ERC-20-Token). #### Hintergrundlektüre {#background-reading-9} - [Robust Incentives Group](https://rig.ethereum.org/) -- [ETHconomics-Workshop bei Devconnect](https://www.youtube.com/playlist?list=PLTLjFJ0OQOj5PHRvA2snoOKt2udVsyXEm) +- [ETHconomics-Workshop auf der Devconnect](https://www.youtube.com/playlist?list=PLTLjFJ0OQOj5PHRvA2snoOKt2udVsyXEm) #### Aktuelle Forschung {#recent-research-9} -- [Empirische Analyse von EIP1559](https://arxiv.org/abs/2201.05574) -- [Balance in der zirkulierenden Versorgung](https://ethresear.ch/t/circulating-supply-equilibrium-for-ethereum-and-minimum-viable-issuance-during-the-proof-of-stake-era/10954) -- [MEV-Quantifizierung: Wie dunkel ist der Wald?](https://arxiv.org/abs/2101.05511) +- [Empirische Analyse von EIP-1559](https://arxiv.org/abs/2201.05574) +- [Gleichgewicht des zirkulierenden Angebots](https://ethresear.ch/t/circulating-supply-equilibrium-for-ethereum-and-minimum-viable-issuance-during-the-proof-of-stake-era/10954) +- [Quantifizierung von MEV: Wie dunkel ist der Wald?](https://arxiv.org/abs/2101.05511) -### Blockaum- und Gebührenmärkte {#blockspace-fee-markets} +### Blockspace und Gebührenmärkte {#blockspace-fee-markets} -Blockraum-Märkte regeln die Aufnahme von Endbenutzertransaktionen, entweder direkt auf Ethereum (Ebene 1) oder auf Brückennetzwerken, wie zum Beispiel Rollups (Ebene 2). Auf Ethereum werden Transaktionen zum Gebührenmarkt übermittelt – im Protokoll als EIP-1599 bereitgestellt. Das schützt die Blockchain vor Spam und Preisstau. Auf beiden Ebenen können Transaktionen Externalitäten bedingen, bekannt als maximal extrahierbarer Wert (MEV – Maximal Extractable Value), die neue Marktstrukturen zur Erfassung oder Verwaltung dieser Externalitäten auslösen. +Blockspace-Märkte regeln die Aufnahme von Endbenutzer-Transaktionen, entweder direkt auf Ethereum (Ebene 1) oder auf überbrückten Netzwerken, z. B. Rollups (Ebene 2). Auf Ethereum werden Transaktionen an den Gebührenmarkt übermittelt, der im Protokoll als EIP-1559 implementiert ist und die Chain vor Spam schützt sowie Überlastungen bepreist. Auf beiden Ebenen können Transaktionen externe Effekte erzeugen, die als Maximal extrahierbarer Wert (MEV) bekannt sind und neue Marktstrukturen hervorrufen, um diese externen Effekte zu erfassen oder zu verwalten. #### Hintergrundlektüre {#background-reading-10} -- [Transaktionsgebührenmechanismus-Design für die Ethereum-Blockchain: Eine wirtschaftliche Analyse von EIP-1559 (Tim Roughgarden, 2020)](https://timroughgarden.org/papers/eip1559.pdf) +- [Design von Transaktionsgebührenmechanismen für die Ethereum-Blockchain: Eine wirtschaftliche Analyse von EIP-1559 (Tim Roughgarden, 2020)](https://timroughgarden.org/papers/eip1559.pdf) - [Simulationen von EIP-1559 (Robust Incentives Group)](https://ethereum.github.io/abm1559) -- [Rollup-Wirtschaft von Grund auf](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) -- [Flash Boys 2.0: Frontrunning, Neuordnung von Transaktionen und Konsensinstabilität in dezentralen Börsen](https://arxiv.org/abs/1904.05234) +- [Rollup-Ökonomie aus ersten Prinzipien](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) +- [Flash Boys 2.0: Frontrunning, Transaktionsumordnung und Konsensinstabilität an dezentralisierten Börsen](https://arxiv.org/abs/1904.05234) #### Aktuelle Forschung {#recent-research-10} -- [Multidimensionale EIP-1559-Videopräsentation](https://youtu.be/QbR4MTgnCko) -- [Domänenübergreifendes MEV](http://arxiv.org/abs/2112.01472) +- [Videopräsentation zu multidimensionalem EIP-1559](https://youtu.be/QbR4MTgnCko) +- [Domänenübergreifender MEV](http://arxiv.org/abs/2112.01472) - [MEV-Auktionen](https://ethresear.ch/t/mev-auction-auctioning-transaction-ordering-rights-as-a-solution-to-miner-extractable-value/6788) ### Proof-of-Stake-Anreize {#proof-of-stake-incentives} -Validatoren nutzen Ethereums natives Asset (Ether) als Sicherheit vor unehrlichem Verhalten. Die Kryptoökonomie dahinter entscheidet über die Sicherheit des Netzwerks. Ausgefeilte Validatoren könnten Teile der Anreizebene ausnutzen, um explizite Angriffe zu starten. +Validatoren verwenden den nativen Vermögenswert von Ethereum (Ether) als Sicherheit gegen unehrliches Verhalten. Die Kryptowirtschaft dahinter bestimmt die Sicherheit des Netzwerks. Ausgeklügelte Validatoren könnten in der Lage sein, die Nuancen der Anreizebene auszunutzen, um gezielte Angriffe zu starten. #### Hintergrundlektüre {#background-reading-11} -- [Meisterkurs zur Ethereum-Ökonomie und Wirtschaftsmodell](https://github.com/CADLabs/ethereum-economic-model) +- [Ethereum-Wirtschafts-Masterclass und Wirtschaftsmodell](https://github.com/CADLabs/ethereum-economic-model) - [Simulationen von PoS-Anreizen (Robust Incentives Group)](https://ethereum.github.io/beaconrunner/) #### Aktuelle Forschung {#recent-research-11} -- [Erhöhung der Zensurresistenz von Transaktionen im Rahmen der Proposer-Builder-Trennung (PBS)](https://notes.ethereum.org/s3JToeApTx6CKLJt8AbhFQ) -- [Drei Angriffe auf PoS-Ethereum] (https://arxiv.org/abs/2110.10086) +- [Erhöhung der Zensurresistenz von Transaktionen unter der Trennung von Block-Vorschlagenden und -Erstellern (PBS)](https://notes.ethereum.org/s3JToeApTx6CKLJt8AbhFQ) +- [Drei Angriffe auf PoS-Ethereum](https://arxiv.org/abs/2110.10086) ### Liquid Staking und Derivate {#liquid-staking-and-derivatives} -Liquid Staking erlaubt Benutzern mit weniger als 32 ETH Stakingerträge zu erhalten, indem sie Ether für einen Token austauschen, der gestaktes Ether darstellt und in DeFi verwendet werden kann. Jedoch müssen die Anreize und Marktdynamiken, die mit Liquid Staking verbunden sind, noch erkundet werden. Es müssen zudem noch die Effekte, die Liquid Staking auf Ethereums Sicherheit hat (z. B. Zentralisierungsrisiken), gefunden werden. +Liquid Staking ermöglicht es Benutzern mit weniger als 32 ETH, Staking-Renditen zu erhalten, indem sie Ether gegen einen Token tauschen, der gestakten Ether repräsentiert und in DeFi verwendet werden kann. Die Anreize und Marktdynamiken im Zusammenhang mit Liquid Staking werden jedoch noch erforscht, ebenso wie dessen Auswirkungen auf die Sicherheit von Ethereum (z. B. Zentralisierungsrisiken). #### Hintergrundlektüre {#background-reading-12} -- [Ethresear.ch – Liquid Staking](https://ethresear.ch/search?q=liquid%20staking) +- [Ethresear.ch Liquid Staking](https://ethresear.ch/search?q=liquid%20staking) - [Lido: Der Weg zum vertrauenslosen Ethereum-Staking](https://blog.lido.fi/the-road-to-trustless-ethereum-staking/) - [Rocket Pool: Einführung in das Staking-Protokoll](https://medium.com/rocket-pool/rocket-pool-staking-protocol-part-1-8be4859e5fbd) #### Aktuelle Forschung {#recent-research-12} -- [Abwicklung von Abhebungen von Lido] (https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) -- [Anmeldeinformationen für Abhebungen](https://ethresear.ch/t/withdrawal-credential-rotation-from-bls-to-eth1/8722) -- [Die Risiken von Liquid Staking-Derivaten](https://notes.ethereum.org/@djrtwo/risks-of-lsd) +- [Umgang mit Abhebungen von Lido](https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) +- [Abhebungsberechtigungen](https://ethresear.ch/t/withdrawal-credential-rotation-from-bls-to-eth1/8722) +- [Die Risiken von Liquid-Staking-Derivaten](https://notes.ethereum.org/@djrtwo/risks-of-lsd) -## Tests {#testing} +## Testen {#testing} ### Formale Verifizierung {#formal-verification} -Bei der formalen Verifizierung wird Code geschrieben, um zu überprüfen, ob die Konsensspezifikationen von Ethereum korrekt und fehlerfrei sind. Es gibt eine ausführbare Version der Spezifikation, die in Python geschrieben ist und sowohl Wartung als auch Entwicklung erfordert. Weitere Forschung kann dabei helfen, die Python-Implementierung der Spezifikationen zu verbessern und Tools für die sicherere Verifizierung von Korrektheits- und Identitätsproblemen einzuführen. +Formale Verifizierung bedeutet, Code zu schreiben, um zu überprüfen, ob die Konsensspezifikationen von Ethereum korrekt und fehlerfrei sind. Es gibt eine ausführbare Version der Spezifikation, die in Python geschrieben ist und Wartung sowie Weiterentwicklung erfordert. Weitere Forschung kann dazu beitragen, die Python-Implementierung der Spezifikation zu verbessern und Werkzeuge hinzuzufügen, die die Korrektheit robuster verifizieren und Probleme identifizieren können. #### Hintergrundlektüre {#background-reading-13} @@ -296,26 +296,26 @@ Bei der formalen Verifizierung wird Code geschrieben, um zu überprüfen, ob die - [Formale Verifizierung des Einzahlungsvertrags](https://github.com/runtimeverification/deposit-contract-verification) - [Formale Verifizierung der Beacon Chain-Spezifikation](https://github.com/runtimeverification/deposit-contract-verification) -## Datenwissenschaft und -analyse {#data-science-and-analytics} +## Datenwissenschaft und Analytik {#data-science-and-analytics} -Es werden mehr Tools für die Datenanalyse benötigt. Außerdem braucht es Dashboards mit detaillierten Informationen zur Aktivität auf Ethereum und zum Zustand des Netzwerks. +Es besteht Bedarf an mehr Datenanalyse-Tools und Dashboards, die detaillierte Informationen über die Aktivitäten auf Ethereum und den Zustand des Netzwerks liefern. ### Hintergrundlektüre {#background-reading-14} - [Dune Analytics](https://dune.com/browse/dashboards) -- [Dashboard zur Client-Diversität](https://clientdiversity.org/) +- [Dashboard zur Client-Vielfalt](https://clientdiversity.org/) #### Aktuelle Forschung {#recent-research-14} -- [Datenanalyse von Robust Incentives Group](https://rig.ethereum.org/) +- [Datenanalyse der Robust Incentives Group](https://rig.ethereum.org/) ## Apps und Tools {#apps-and-tooling} -Die Anwendungsebene unterstützt ein diverses Ökosystem von Programmen, die Transaktionen auf der Grundebene von Ethereum regeln. Entwicklungsteams finden ständig neue Wege, Ethereum zu nutzen, um zusammensetzbare, berechtigungsfreie und zensurresistente Versionen von wichtigen Web2-Apps oder völlig neue Web3-native Konzepte zu erstellen. Gleichzeitig werden neue Tools entwickelt, die die Entwicklung von dApps auf Ethereum weniger komplex machen. +Die Anwendungsebene unterstützt ein vielfältiges Ökosystem von Programmen, die Transaktionen auf der Basisebene von Ethereum abwickeln. Entwicklungsteams finden ständig neue Wege, Ethereum zu nutzen, um zusammensetzbare, erlaubnisfreie und zensurresistente Versionen wichtiger Web2-Apps zu erstellen oder völlig neue Web3-native Konzepte zu entwickeln. Gleichzeitig werden neue Tools entwickelt, die das Erstellen von Dapps auf Ethereum weniger komplex machen. ### DeFi {#defi} -Dezentralisierte Finanzen (DeFi) ist eine der Hauptanwendungsklassen, die auf Ethereum aufbauen. DeFi zielt darauf ab, zusammensetzbare „Geld-Legosteine“ zu entwickeln, mit denen Benutzer Krypto-Assets mithilfe von Smart Contracts speichern, übertragen, ausleihen, leihen und investieren können. DeFi ist ein Bereich, der sich beständig rasant entwickelt. Forschung zu sicheren, effizienten und zugänglichen Protokollen wird stets benötigt. +Dezentralisierte Finanzen (DeFi) sind eine der Hauptklassen von Anwendungen, die auf Ethereum aufbauen. DeFi zielt darauf ab, zusammensetzbare „Geld-Legos“ zu schaffen, die es Benutzern ermöglichen, Krypto-Assets mithilfe von Smart Contracts zu speichern, zu übertragen, zu verleihen, zu leihen und zu investieren. DeFi ist ein schnelllebiger Bereich, der sich ständig aktualisiert. Die Erforschung sicherer, effizienter und zugänglicher Protokolle ist kontinuierlich erforderlich. #### Hintergrundlektüre {#background-reading-15} @@ -324,12 +324,12 @@ Dezentralisierte Finanzen (DeFi) ist eine der Hauptanwendungsklassen, die auf Et #### Aktuelle Forschung {#recent-research-15} -- [Dezentrale Finanzen, zentrales Eigentum?](https://arxiv.org/pdf/2012.09306.pdf) +- [Dezentralisierte Finanzen, zentralisiertes Eigentum?](https://arxiv.org/pdf/2012.09306.pdf) - [Optimism: Der Weg zu Transaktionen unter einem Dollar](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) ### DAOs {#daos} -Ein bedeutender Anwendungsfall von Ethereum ist die Möglichkeit der Organisierung auf eine dezentrale Art, durch die Nutzung von DAOs. Es wird intensiv daran geforscht, wie DAOs auf Ethereum entwickelt und eingesetzt werden können, um verbesserte Governance-Formen als vertrauensminimiertes Koordinationsinstrument zu realisieren. Dadurch werden die Möglichkeiten über traditionelle Unternehmen und Organisationen hinaus erheblich erweitert. +Ein wirkungsvoller Anwendungsfall für Ethereum ist die Möglichkeit, sich durch den Einsatz von DAOs dezentralisiert zu organisieren. Es gibt viel aktive Forschung darüber, wie DAOs auf Ethereum entwickelt und genutzt werden können, um verbesserte Formen der Governance als vertrauensminimiertes Koordinationswerkzeug auszuführen, was die Möglichkeiten der Menschen weit über traditionelle Unternehmen und Organisationen hinaus erweitert. #### Hintergrundlektüre {#background-reading-16} @@ -338,31 +338,31 @@ Ein bedeutender Anwendungsfall von Ethereum ist die Möglichkeit der Organisieru #### Aktuelle Forschung {#recent-research-16} -- [Zuordnung des DAO-Ökosystems] (https://www.researchgate.net/publication/358694594_Mapping_out_the_DAO_Ecosystem_and_Assessing_DAO_Autonomy) +- [Kartierung des DAO-Ökosystems](https://www.researchgate.net/publication/358694594_Mapping_out_the_DAO_Ecosystem_and_Assessing_DAO_Autonomy) -### Entwicklerwerkzeuge {#developer-tools} +### Entwickler-Tools {#developer-tools} -Die Tools für Ethereum-Entwickler verbessern sich rasant. Dieser Bereich bietet viel Raum für eine aktive Forschung und Entwicklung. +Tools für Ethereum-Entwickler verbessern sich rasant. In diesem allgemeinen Bereich gibt es viel aktive Forschung und Entwicklung zu leisten. #### Hintergrundlektüre {#background-reading-17} - [Tools nach Programmiersprache](/developers/docs/programming-languages/) - [Entwickler-Frameworks](/developers/docs/frameworks/) -- [Toolliste für Konsensentwickler](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [Liste der Konsens-Entwickler-Tools](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Token-Standards](/developers/docs/standards/tokens/) - [CryptoDevHub: EVM-Tools](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Aktuelle Forschung {#recent-research-17} -- [Eth R&D – Discord-Kanal zu Konsenstools](https://discordapp.com/channels/595666850260713488/746343380900118528) +- [Eth R&D Discord-Kanal für Konsens-Tools](https://discordapp.com/channels/595666850260713488/746343380900118528) ### Orakel {#oracles} -Orakel importieren Off-Chain-Daten in die Blockchain auf eine genehmigungsfreie und dezentrale Art. Diese Daten auf die Chain zu bekommen, schafft für dApps die Grundlage, auf Phänomene aus der realen Welt zu reagieren. Dazu gehören Preisveränderungen von Assets der echten Welt, Ereignisse in Off-Chain-Apps und sogar Wetterveränderungen. +Orakel importieren Off-Chain-Daten auf erlaubnisfreie und dezentralisierte Weise auf die Blockchain. Diese Daten auf der Blockchain verfügbar zu machen, ermöglicht es Dapps, auf reale Phänomene wie Preisschwankungen bei realen Vermögenswerten, Ereignisse in Off-Chain-Apps oder sogar Wetteränderungen zu reagieren. #### Hintergrundlektüre {#background-reading-18} -- [Einführung in Oracles](/Entwickler/Dok/Orakel/) +- [Einführung in Orakel](/developers/docs/oracles/) #### Aktuelle Forschung {#recent-research-18} @@ -371,29 +371,29 @@ Orakel importieren Off-Chain-Daten in die Blockchain auf eine genehmigungsfreie ### App-Sicherheit {#app-security} -Bei Angriffen auf Ethereum werden meist Schwachstellen von bestimmten Anwendungen und nicht Schwachstellen des Protokolls selbst ausgenutzt. Angreifer und Anwendungsentwickler befinden sich dabei in einem Wettbewerb bei der Entwicklung neuer Angriffe und Verteidigungsmöglichkeiten. Das bedeutet, dass es immer wichtige Forschung und Entwicklung benötigt, um Anwendungen vor Angriffen zu schützen. +Hacks auf Ethereum nutzen im Allgemeinen Schwachstellen in einzelnen Anwendungen aus und nicht im Protokoll selbst. Hacker und App-Entwickler befinden sich in einem Wettrüsten, um neue Angriffe und Verteidigungen zu entwickeln. Das bedeutet, dass immer wichtige Forschung und Entwicklung erforderlich ist, um Apps vor Hacks zu schützen. #### Hintergrundlektüre {#background-reading-19} -- [Bericht zur Wormhole-Sicherheitslücke](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) -- [Liste der Nachbetrachtungen von Ethereum-Vertrags-Hacks](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) -- [Rekt News](https://twitter.com/RektHQ?s=20\&t=3otjYQdM9Bqk8k3n1a1Adg) +- [Bericht zum Wormhole-Exploit](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) +- [Liste von Post-Mortems zu Ethereum-Contract-Hacks](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) +- [Rekt News](https://x.com/RektHQ?s=20&t=3otjYQdM9Bqk8k3n1a1Adg) #### Aktuelle Forschung {#recent-research-19} -- [ethresear.ch – Anwendungen](https://ethresear.ch/c/applications/18) +- [Ethresear.ch Anwendungen](https://ethresear.ch/c/applications/18) ### Technologie-Stack {#technology-stack} -Den gesamten Technologie-Stack von Ethereum zu dezentralisieren, ist ein wichtiger Forschungsbereich. Derzeit weisen dApps auf Ethereum für gewöhnlich eine Form der Zentralisierung auf, da sie sich auf zentralisierte Tools oder Infrastrukturen verlassen. +Die Dezentralisierung des gesamten Ethereum-Technologie-Stacks ist ein wichtiges Forschungsgebiet. Derzeit weisen Dapps auf Ethereum häufig einige Zentralisierungspunkte auf, da sie auf zentralisierte Tools oder Infrastrukturen angewiesen sind. #### Hintergrundlektüre {#background-reading-20} - [Ethereum-Stack](/developers/docs/ethereum-stack/) - [Coinbase: Einführung in den Web3-Stack](https://blog.coinbase.com/a-simple-guide-to-the-web3-stack-785240e557f0) - [Einführung in Smart Contracts](/developers/docs/smart-contracts/) -- [Einführung in die dezentrale Speicherung](/developers/docs/storage/) +- [Einführung in dezentralisierte Speicherung](/developers/docs/storage/) #### Aktuelle Forschung {#recent-research-20} -- [Smart Contract-Zusammensetzbarkeit](/developers/docs/smart-contracts/composability/) +- [Zusammensetzbarkeit von Smart Contracts](/developers/docs/smart-contracts/composability/) \ No newline at end of file diff --git a/public/content/translations/de/community/support/faq/index.md b/public/content/translations/de/community/support/faq/index.md index 6cdd27e1b78..81e2ea15e7b 100644 --- a/public/content/translations/de/community/support/faq/index.md +++ b/public/content/translations/de/community/support/faq/index.md @@ -1,6 +1,6 @@ --- title: "Häufig gestellte Fragen" -description: "Häufige Fragen zu Ethereum rund um Wallets, Transaktionen, Staking und mehr." +description: "Häufige Fragen zu Ethereum über Wallets, Transaktionen, Staking und mehr." lang: de --- @@ -8,70 +8,71 @@ lang: de ## Ich habe Krypto an die falsche Adresse gesendet {#wrong-wallet} -Eine auf Ethereum gesendete Transaktion ist unumkehrbar. Wenn Sie ETH oder Token an die falsche Wallet gesendet haben, gibt es leider keine Möglichkeit, die Transaktion rückgängig zu machen. +Eine auf Ethereum gesendete Transaktion ist irreversibel. Wenn Sie ETH oder Token an die falsche Wallet gesendet haben, gibt es leider keine Möglichkeit, die Transaktion rückgängig zu machen. **Was Sie tun können:** -- **Wenn Sie den Eigentümer der Adresse kennen**, kontaktieren Sie ihn direkt und bitten Sie ihn, die Gelder zurückzugeben -- **Wenn die Adresse zu einer Börse oder einem bekannten Dienst gehört**, kontaktieren Sie deren Support-Team, da es Ihnen möglicherweise helfen kann +- **Wenn Sie den Besitzer der Adresse kennen**, kontaktieren Sie ihn direkt und bitten Sie ihn, das Geld zurückzusenden +- **Wenn die Adresse zu einer Börse oder einem bekannten Dienst gehört**, kontaktieren Sie deren Support-Team, da dieses möglicherweise helfen kann - **Wenn Sie Token an eine Vertragsadresse gesendet haben**, prüfen Sie, ob der Vertrag über eine Auszahlungs- oder Wiederherstellungsfunktion verfügt (dies ist selten) -In den meisten Fällen gibt es keine Möglichkeit, das Geld wiederzuerlangen. Keine zentrale Organisation, Entität oder Person ist Eigentümer von Ethereum. Das bedeutet, dass auch niemand Transaktionen rückgängig machen kann. Überprüfen Sie die Empfängeradresse immer doppelt, bevor Sie bestätigen. +In den meisten Fällen gibt es keine Möglichkeit, das Geld zurückzuerhalten. Keine zentrale Organisation, Einrichtung oder Person besitzt Ethereum, was bedeutet, dass niemand Transaktionen rückgängig machen kann. Überprüfen Sie immer die Empfängeradresse, bevor Sie bestätigen. ## Ich habe den Zugriff auf meine Wallet verloren {#lost-wallet-access} -Ihre Wiederherstellungsoptionen hängen von der Art der von Ihnen verwendeten Wallet ab. +Ihre Wiederherstellungsoptionen hängen von der Art der Wallet ab, die Sie verwenden. ### Wenn Sie Ihre Seed-Phrase (Wiederherstellungsphrase) haben -Sie können Ihre Wallet in jeder kompatiblen Wallet-App mit Ihrer Seed-Phrase wiederherstellen. Deshalb ist es so wichtig, Ihre Seed-Phrase sicher offline aufzubewahren. Anweisungen zur Wiederherstellung finden Sie in der Dokumentation Ihres Wallet-Anbieters. +Sie können Ihre Wallet in jeder kompatiblen Wallet-App mithilfe Ihrer Seed-Phrase wiederherstellen. Aus diesem Grund ist es von entscheidender Bedeutung, dass Sie Ihre Seed-Phrase sicher offline aufbewahren. Überprüfen Sie die Dokumentation Ihres Wallet-Anbieters auf Anweisungen zur Wiederherstellung. ### Wenn Sie Ihre Seed-Phrase verloren haben -Ohne Ihre Seed-Phrase oder Ihre privaten Schlüssel können Ihre Gelder nicht wiederhergestellt werden. Niemand, auch nicht ethereum.org, kann Ihr Passwort zurücksetzen oder den Zugang zu einer selbstverwalteten Wallet wiederherstellen. +Ohne Ihre Seed-Phrase oder Ihre Private-Keys kann Ihr Geld nicht wiederhergestellt werden. Niemand, einschließlich ethereum.org, kann Ihr Passwort zurücksetzen oder den Zugriff auf eine selbstverwaltete Wallet wiederherstellen. ### Wenn sich Ihr Konto bei einer Börse befindet -Wenn sich Ihr Konto bei einer zentralisierten Börse wie Coinbase, Binance oder Kraken befindet, wenden Sie sich direkt an das Support-Team der Börse. Diese kontrollieren die Konten auf ihrer Plattform und können möglicherweise bei der Rücksetzung von Passwörtern oder der Wiederherstellung von Konten helfen. +Wenn sich Ihr Konto bei einer zentralisierten Börse wie Coinbase, Binance oder Kraken befindet, kontaktieren Sie das Support-Team der Börse direkt. Sie kontrollieren die Konten auf ihrer Plattform und können möglicherweise beim Zurücksetzen des Passworts oder bei der Kontowiederherstellung helfen. -**Teilen Sie Ihre Seed-Phrase niemals mit jemandem**, der behauptet, Ihnen bei der Wiederherstellung Ihrer Wallet zu helfen. Dies ist eine der häufigsten Betrugsmaschen. Kein seriöser Dienst wird Sie jemals nach Ihrer Seed-Phrase fragen. +**Teilen Sie Ihre Seed-Phrase niemals mit jemandem**, der behauptet, Ihnen bei der Wiederherstellung Ihrer Wallet zu helfen. Dies ist eine der häufigsten Betrugstaktiken. Kein seriöser Dienst wird Sie jemals nach Ihrer Seed-Phrase fragen. + - Wie Sie eine Wallet benutzen + Wie man eine Wallet verwendet -## Meine Transaktion hängt fest oder ist ausstehend {#stuck-transaction} +## Meine Transaktion steckt fest oder ist ausstehend {#stuck-transaction} -Transaktionen auf Ethereum können hängen bleiben, wenn die von Ihnen festgelegte Gasgebühr niedriger ist als die, die das Netzwerk derzeit erfordert. Die meisten Wallets ermöglichen es Ihnen, dies zu beheben: +Transaktionen auf Ethereum können stecken bleiben, wenn die von Ihnen festgelegte Gasgebühr niedriger war als das, was das Netzwerk derzeit erfordert. Die meisten Wallets ermöglichen es Ihnen, dies zu beheben: -- **Beschleunigen:** Senden Sie die gleiche Transaktion mit einer höheren Gasgebühr erneut -- **Abbrechen:** Senden Sie eine 0-ETH-Transaktion an Ihre eigene Adresse und verwenden Sie dabei dieselbe Nonce wie bei der ausstehenden Transaktion +- **Beschleunigen:** Senden Sie dieselbe Transaktion mit einer höheren Gasgebühr erneut +- **Abbrechen:** Senden Sie eine Transaktion über 0 ETH an Ihre eigene Adresse und verwenden Sie dabei dieselbe Nonce wie bei der ausstehenden Transaktion -### Hilfreiche Anleitungen +### Hilfreiche Leitfäden - [Wie man eine ausstehende Transaktion auf MetaMask beschleunigt oder abbricht](https://support.metamask.io/transactions-and-gas/transactions/how-to-speed-up-or-cancel-a-pending-transaction/) - [Wie man ausstehende Ethereum-Transaktionen abbricht](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) -## Wie kann ich mein Ethereum-Giveaway erhalten? {#giveaway-scam} +## Wie kann ich mein Ethereum-Giveaway beanspruchen? {#giveaway-scam} -Ethereum-Giveaways sind Betrugsmaschen, die darauf abzielen, Ihr ETH zu stehlen. Lassen Sie sich nicht von Angeboten verleiten, die zu gut scheinen, um wahr zu sein. Wenn Sie ETH an eine Giveaway-Adresse senden, werden Sie kein Giveaway erhalten und Sie werden Ihre Gelder nicht wiedererlangen können. +Ethereum-Giveaways sind Betrugsmaschen, die darauf abzielen, Ihre ETH zu stehlen. Lassen Sie sich nicht von Angeboten verleiten, die zu gut klingen, um wahr zu sein. Wenn Sie ETH an eine Giveaway-Adresse senden, erhalten Sie kein Giveaway und können Ihr Geld nicht zurückerhalten. [Mehr zur Betrugsprävention](/security/#common-scams) ## Wie stake ich ETH? {#how-to-stake} -Um ein Validator zu werden, müssen Sie 32 ETH in den Einlagenvertrag von Ethereum einzahlen und einen Validator-Knoten aufbauen. Sie können auch mit weniger ETH über Staking-Pools teilnehmen. +Um ein Validator zu werden, müssen Sie 32 ETH im Ethereum-Einzahlungsvertrag staken und einen Validator-Blockchain-Knoten einrichten. Sie können auch mit weniger ETH über Staking-Pools teilnehmen. -Weitere Informationen finden Sie auf unseren [Staking-Seiten](/staking/) und auf dem [Staking-Launchpad](https://launchpad.ethereum.org/). +Weitere Informationen finden Sie auf unseren [Staking-Seiten](/staking/) und auf dem [Staking Launchpad](https://launchpad.ethereum.org/). -## Wie kann ich Ethereum minen? {#mining-ethereum} +## Wie mine ich Ethereum? {#mining-ethereum} -Ethereum-Mining ist nicht mehr möglich. Das Mining wurde abgeschaltet, als Ethereum im September 2022 während [The Merge](/roadmap/merge/) von [Proof-of-Work](/glossary/#pow) auf [Proof-of-Stake](/glossary/#pos) umgestellt wurde. Anstatt Miner hat Ethereum jetzt Validatoren. Jeder kann ETH [staken](/glossary/#staking) und Staking-Belohnungen für das Ausführen von Validator-Software zur Sicherung des Netzwerks erhalten. +Ethereum-Mining ist nicht mehr möglich. Das Mining wurde abgeschaltet, als Ethereum während [des Merge](/roadmap/merge/) im September 2022 von [Proof-of-Work](/glossary/#pow) zu [Proof-of-Stake](/glossary/#pos) wechselte. Jetzt hat Ethereum anstelle von Minern Validatoren. Jeder kann ETH [staken](/glossary/#staking) und Staking-Belohnungen für das Ausführen von Validator-Software zur Sicherung des Netzwerks erhalten. \ No newline at end of file diff --git a/public/content/translations/de/community/support/misconceptions/index.md b/public/content/translations/de/community/support/misconceptions/index.md index d11783caacf..3e390831aec 100644 --- a/public/content/translations/de/community/support/misconceptions/index.md +++ b/public/content/translations/de/community/support/misconceptions/index.md @@ -1,6 +1,6 @@ --- title: "Häufige Missverständnisse über Ethereum" -description: "Aufklärung der häufigsten Missverständnisse über die Funktionsweise von Ethereum." +description: "Aufklärung der häufigsten Missverständnisse darüber, wie Ethereum funktioniert." lang: de --- @@ -8,66 +8,66 @@ lang: de ## Ist Ethereum ein Unternehmen? {#not-a-company} -Ethereum ist eine dezentralisierte Open-Source-Technologie, die von Tausenden von Mitwirkenden weltweit gepflegt wird. Es gibt kein Unternehmen namens "Ethereum", das Konten verwaltet, Gelder hält oder Kundensupport anbietet. +Ethereum ist eine quelloffene, dezentralisierte Technologie, die von Tausenden von Mitwirkenden weltweit gepflegt wird. Es gibt kein Unternehmen namens „Ethereum“, das Konten verwaltet, Gelder hält oder Kundensupport anbietet. -Die [Ethereum Foundation](https://ethereum.foundation/) ist eine gemeinnützige Organisation, die die Entwicklung von Ethereum unterstützt, aber sie besitzt oder kontrolliert das Netzwerk nicht. Keine einzelne Entität tut dies. +Die [Ethereum Foundation](https://ethereum.foundation/) ist eine gemeinnützige Organisation, die die Entwicklung von Ethereum unterstützt, aber sie besitzt oder kontrolliert das Netzwerk nicht. Keine einzelne Instanz tut dies. -**[ethereum.org](/)** ist eine von der Community betriebene Bildungsressource. Es ist keine Börse, Wallet oder Finanzinstitut. Es hält keine Benutzergelder und kann nicht auf Konten zugreifen. +**[ethereum.org](/)** ist eine von der Community betriebene Bildungsressource. Es ist keine Börse, Wallet oder Finanzinstitution. Es hält keine Nutzergelder und hat keinen Zugriff auf Konten. Was ist Ethereum? -## Kann jemand mein Geld wiederherstellen oder einfrieren? {#no-fund-access} +## Kann jemand meine Gelder wiederherstellen oder einfrieren? {#no-fund-access} -Im Gegensatz zu einer Bank gibt es bei Ethereum keine zentrale Behörde, die Gelder einfrieren, beschlagnahmen oder wiederherstellen kann. Die Person, die die privaten Schlüssel (oder die Seed-Phrase) besitzt, hat die volle und alleinige Kontrolle über eine Wallet. +Im Gegensatz zu einer Bank gibt es bei Ethereum keine zentrale Autorität, die Gelder einfrieren, beschlagnahmen oder wiederherstellen kann. Die Person, die die Private-Keys (oder die Seed-Phrase) besitzt, hat die volle und alleinige Kontrolle über eine Wallet. Das bedeutet: - **Niemand kann Gelder wiederherstellen**, die Sie an die falsche Adresse gesendet haben -- **Niemand kann** eine Transaktion rückgängig machen, nachdem sie bestätigt wurde -- **Niemand kann** Ihre Wallet einfrieren oder Ihre Transaktionen blockieren +- **Niemand kann eine Transaktion rückgängig machen**, nachdem sie bestätigt wurde +- **Niemand kann Ihre Wallet einfrieren** oder Ihre Transaktionen blockieren - **Niemand kann Ihr Passwort zurücksetzen**, wenn Sie Ihre Seed-Phrase verlieren -Deshalb ist der Schutz Ihrer Seed-Phrase entscheidend. Es ist der einzige Weg, um auf Ihre Wallet zuzugreifen. Wenn sie verloren geht oder gestohlen wird, gibt es keine Wiederherstellungsoption. +Deshalb ist der Schutz Ihrer Seed-Phrase von entscheidender Bedeutung. Sie ist der einzige Weg, um auf Ihre Wallet zuzugreifen. Wenn sie verloren geht oder gestohlen wird, gibt es keine Möglichkeit zur Wiederherstellung. Ethereum-Sicherheit und Betrugsprävention -## Kann ich noch Ethereum minen? {#no-mining} +## Kann ich Ethereum noch minen? {#no-mining} -Ethereum ist im September 2022 während [The Merge](/roadmap/merge/) von [Proof-of-Work](/glossary/#pow) auf [Proof-of-Stake](/glossary/#pos) umgestiegen. Mining ist auf Ethereum nicht mehr möglich. +Ethereum ist während [The Merge](/roadmap/merge/) im September 2022 von [Proof-of-Work](/glossary/#pow) zu [Proof-of-Stake](/glossary/#pos) gewechselt. Mining ist auf Ethereum nicht mehr möglich. -Das Netzwerk wird jetzt von Validatoren gesichert, die ETH [staken](/glossary/#staking). Jeder kann teilnehmen: +Das Netzwerk wird nun durch Validatoren gesichert, die ETH [staken](/glossary/#staking). Jeder kann teilnehmen: -- **Solo-Staking:** Betreiben Sie Ihren eigenen Validator mit 32 ETH – [erfahren Sie mehr](/staking/solo/) -- **Staking as a Service:** Delegieren Sie den Betrieb des Nodes, während Sie Ihre Schlüssel behalten – [erfahren Sie mehr](/staking/saas/) -- **Gepooltes Staking:** Staken Sie mit weniger als 32 ETH, indem Sie einem Pool beitreten – [erfahren Sie mehr](/staking/pools/) +- **Solo-Staking:** Betreiben Sie Ihren eigenen Validator mit 32 ETH – [mehr erfahren](/staking/solo/) +- **Staking as a Service:** Delegieren Sie den Betrieb des Blockchain-Knotens, während Sie Ihre Keys behalten – [mehr erfahren](/staking/saas/) +- **Gepooltes Staking:** Staken Sie mit weniger als 32 ETH, indem Sie einem Pool beitreten – [mehr erfahren](/staking/pools/) Mehr über Staking erfahren -## Gibt es ein Ethereum-Supportteam? {#no-support-team} +## Gibt es ein Ethereum-Support-Team? {#no-support-team} -Die Suche nach "offiziellem Ethereum-Support" ist ähnlich wie die Suche nach "offiziellem Internet-Support". Diesen gibt es natürlich nicht, aber je nach Problem können Sie möglicherweise Unterstützung von Ihrem Internetdienstanbieter, dem Hersteller Ihrer Router-Hardware oder einem der Unternehmen erhalten, die hinter dem von Ihnen verwendeten Gerät, der App oder der Website stehen. +Die Suche nach einem „offiziellen Ethereum-Support“ ist vergleichbar mit der Suche nach einem „offiziellen Internet-Support“. Diesen gibt es natürlich nicht, aber je nach Problem können Sie möglicherweise Unterstützung von Ihrem Internetdienstanbieter, dem Hersteller Ihrer Router-Hardware oder einem der Unternehmen hinter dem Gerät, der App oder der Website, die Sie nutzen, erhalten. -Bei Ethereum ist es ähnlich. Es gibt kein Unternehmen, kein Support-Team und keinen Helpdesk hinter Ethereum als Ganzes, aber je nach Problem können Sie Hilfe finden, indem Sie sich an Ihren _Wallet-Anbieter_, _Staking-Dienst_, Ihre _Börse_, Ihr _Finanzinstitut_ oder das _Team, das eine von Ihnen verwendete App pflegt_, wenden. +Bei Ethereum ist es ähnlich. Es gibt kein Unternehmen, kein Support-Team und keinen Helpdesk hinter Ethereum als Ganzes, aber je nach Problem finden Sie möglicherweise Hilfe, indem Sie sich an Ihren _Wallet-Anbieter_, _Staking-Dienst_, Ihre _Börse_, _Finanzinstitution_ oder das _Team, das eine von Ihnen genutzte App pflegt_, wenden. -Da Ethereum standardmäßig öffentlich transparent ist, können Sie auch [Block-Explorer](/developers/docs/data-and-analytics/block-explorers/), [Analyse-Tools](/developers/tools/analytics/) und andere [Online-Rechercheressourcen](/community/support/scams/#analyze) als nützlich empfinden, um ein Problem direkt zu untersuchen. +Da Ethereum standardmäßig öffentlich transparent ist, können Sie auch [Blocksuchmaschinen](/developers/docs/data-and-analytics/block-explorers/), [Analysetools](/developers/tools/analytics/) und andere [Online-Untersuchungsressourcen](/community/support/scams/#analyze) nützlich finden, um einem Problem direkt auf den Grund zu gehen. -Abgesehen davon wird Sie niemals jemand von Ethereum oder ethereum.org: +Dennoch wird niemand von Ethereum oder ethereum.org jemals: -- per Direktnachricht kontaktieren -- nach Ihrer Seed-Phrase oder Ihren privaten Schlüsseln fragen +- Sie per Direktnachricht kontaktieren +- Nach Ihrer Seed-Phrase oder Ihren Private-Keys fragen - Sie bitten, ETH zu senden, um Ihre Wallet zu verifizieren -- anbieten, Ihnen gegen eine Gebühr bei der Wiederherstellung von Geldern zu helfen +- Anbieten, Ihnen gegen eine Gebühr bei der Wiederherstellung von Geldern zu helfen -**Jeder, der etwas davon tut, versucht, Sie zu betrügen.** +**Jeder, der eines der oben genannten Dinge tut, versucht, Sie zu betrügen.** -Wenn Sie Hilfe benötigen, sind die echten Communities, die Ihnen helfen können, auf der [Support-Seite](/community/support/) aufgeführt. Dies sind von Freiwilligen betriebene, offene Communities – keine offiziellen Support-Kanäle. +Wenn Sie Hilfe benötigen, finden Sie die echten Communities, die Ihnen helfen können, auf der [Support-Seite](/community/support/). Dies sind ehrenamtlich geführte, offene Communities – keine offiziellen Support-Kanäle. Ethereum-Sicherheit und Betrugsprävention - + \ No newline at end of file diff --git a/public/content/translations/de/community/support/scams/index.md b/public/content/translations/de/community/support/scams/index.md index 3edab09e1a1..75350da9eac 100644 --- a/public/content/translations/de/community/support/scams/index.md +++ b/public/content/translations/de/community/support/scams/index.md @@ -1,102 +1,103 @@ --- -title: Hilfe bei Betrug & Meldung -description: "Was Sie tun können, wenn Sie betrogen wurden, wie Sie Ihre verbleibenden Vermögenswerte sichern und wo Sie Betrug melden können." +title: Hilfe und Meldung von Betrug +description: "Was Sie tun können, wenn Sie betrogen wurden, wie Sie Ihr verbleibendes Vermögen sichern und wo Sie Betrug melden können." lang: de --- # Ich wurde betrogen oder habe Geld verloren {#scam-help} -Betrügereien mit Kryptowährungen zielen auf Menschen aller Erfahrungsstufen ab, einschließlich Fachleuten aus dem Finanz- und Technologiebereich. Sie sind nicht allein, und hier zu sein ist der richtige erste Schritt. +Kryptowährungsbetrug zielt auf Menschen aller Erfahrungsstufen ab, einschließlich Fachleuten aus den Bereichen Finanzen und Technologie. Sie sind nicht allein, und hier zu sein, ist der richtige erste Schritt. -**Niemand kann Blockchain-Transaktionen rückgängig machen.** Wenn Sie jemand kontaktiert und behauptet, er könne Ihr Geld gegen eine Gebühr wiederbeschaffen, handelt es sich mit ziemlicher Sicherheit um einen zweiten Betrug. Siehe [Wiederherstellungsbetrug](#recovery-scams) unten. +**Niemand kann Blockchain-Transaktionen rückgängig machen.** Wenn Sie jemand kontaktiert und behauptet, er könne Ihr Geld gegen eine Gebühr zurückholen, handelt es sich mit an Sicherheit grenzender Wahrscheinlichkeit um einen zweiten Betrug. Siehe [Wiederherstellungsbetrug](#recovery-scams) unten. + -## Sichern Sie Ihre verbleibenden Vermögenswerte {#secure-assets} +## Sichern Sie Ihr verbleibendes Vermögen {#secure-assets} -Wenn Sie mit einem Betrüger interagiert haben oder vermuten, dass Ihre Wallet kompromittiert ist, führen Sie sofort die folgenden Schritte aus: +Wenn Sie mit einem Betrüger interagiert haben oder vermuten, dass Ihr Wallet kompromittiert ist, ergreifen Sie sofort diese Schritte: -1. **Übertragen Sie verbleibende Gelder** in eine neue, sichere Wallet, auf die der Betrüger keinen Zugriff hat -2. **Widerrufen Sie Token-Genehmigungen.** Betrüger bringen Sie oft dazu, unbegrenzte Token-Ausgaben zu genehmigen. Der Widerruf dieser Berechtigungen verhindert, dass Ihre Wallet weiter leergeräumt wird -3. **Ändern Sie die Passwörter** für alle verknüpften Börsenkonten -4. **Aktivieren Sie die Zwei-Faktor-Authentifizierung (2FA)** für alle Konten, die mit Kryptowährungen zu tun haben +1. **Verschieben Sie das verbleibende Geld** in ein neues, sicheres Wallet, auf das der Betrüger keinen Zugriff hat. +2. **Widerrufen Sie Token-Freigaben.** Betrüger verleiten Sie oft dazu, unbegrenzte Token-Ausgaben zu genehmigen. Der Widerruf dieser Berechtigungen verhindert, dass Ihr Wallet weiter geleert wird. +3. **Ändern Sie die Passwörter** für alle Börsenkonten, die möglicherweise verknüpft sind. +4. **Aktivieren Sie die Zwei-Faktor-Authentifizierung (2FA)** für alle Krypto-bezogenen Konten. -### So widerrufen Sie Token-Genehmigungen {#revoke-approvals} +### So widerrufen Sie Token-Freigaben {#revoke-approvals} -Wenn Sie mit einer Dapp oder einem Smart Contract interagieren, haben Sie ihm möglicherweise die Erlaubnis erteilt, Ihre Token auszugeben. Wenn ein Betrüger Sie dazu gebracht hat, einen bösartigen Vertrag zu genehmigen, kann er auch nach dem ursprünglichen Betrug weiterhin Ihre Token abziehen. +Wenn Sie mit einer Dapp oder einem Smart Contract interagieren, haben Sie diesen möglicherweise die Erlaubnis erteilt, Ihre Token auszugeben. Wenn ein Betrüger Sie dazu verleitet hat, einen bösartigen Vertrag zu genehmigen, kann er Ihre Token auch nach dem anfänglichen Betrug weiter abziehen. -Verwenden Sie diese Tools, um Genehmigungen zu überprüfen und zu widerrufen: +Verwenden Sie diese Tools, um Freigaben zu überprüfen und zu widerrufen: -- [Revoke.cash](https://revoke.cash/): Verbinden Sie Ihre Wallet, um alle aktiven Genehmigungen zu sehen und sie zu widerrufen -- [Revokescout](https://revoke.blockscout.com/): Genehmigungen über Blockscout prüfen und widerrufen -- [Etherscan Token Approval Checker](https://etherscan.io/tokenapprovalchecker): Genehmigungen über Etherscan prüfen und widerrufen +- [Revoke.cash](https://revoke.cash/): Verbinden Sie Ihr Wallet, um alle aktiven Freigaben zu sehen und sie zu widerrufen. +- [Revokescout](https://revoke.blockscout.com/): Überprüfen und widerrufen Sie Freigaben über Blockscout. +- [Etherscan Token Approval Checker](https://etherscan.io/tokenapprovalchecker): Überprüfen und widerrufen Sie Freigaben über Etherscan. Schritt-für-Schritt-Anleitung: So widerrufen Sie den Token-Zugriff -## Melden Sie Betrugsadressen und Websites {#report} +## Melden Sie Betrugsadressen und -websites {#report} -Meldungen helfen, andere Benutzer zu warnen und können bei Ermittlungen der Strafverfolgungsbehörden helfen. Dokumentieren Sie alles: Transaktions-Hashes, Wallet-Adressen, Screenshots und jede Kommunikation mit dem Betrüger. +Das Melden hilft, andere Benutzer zu warnen, und kann strafrechtliche Ermittlungen unterstützen. Dokumentieren Sie alles: Transaktions-Hashes, Wallet-Adressen, Screenshots und jegliche Kommunikation mit dem Betrüger. ### Eine Betrugsadresse melden {#report-address} -- [Chainabuse](https://www.chainabuse.com/): Community-basierte Datenbank zur Meldung von Betrug und Schwindel. Senden Sie Berichte und suchen Sie nach bekannten Betrugsadressen -- [Etherscan-Bericht](https://info.etherscan.com/report-address/): eine Adresse auf dem meistgenutzten Ethereum-Block-Explorer markieren -- [CryptoScamDB](https://cryptoscamdb.org/): Open-Source-Datenbank zur Verfolgung von Betrügereien mit Kryptowährungen +- [Chainabuse](https://www.chainabuse.com/): Community-gesteuerte Datenbank zur Meldung von Betrug. Reichen Sie Berichte ein und suchen Sie nach bekannten Betrugsadressen. +- [Etherscan-Meldung](https://info.etherscan.com/report-address/): Markieren Sie eine Adresse in der am häufigsten genutzten Ethereum-Blocksuchmaschine. +- [CryptoScamDB](https://cryptoscamdb.org/): Open-Source-Datenbank zur Verfolgung von Kryptowährungsbetrug. -### Melden Sie eine betrügerische Website oder ein Social-Media-Konto {#report-website} +### Eine Betrugswebsite oder ein Social-Media-Konto melden {#report-website} -- [PhishTank](https://phishtank.org/): Phishing-URLs einreichen und verifizieren -- [Google Safe Browsing](https://safebrowsing.google.com/safebrowsing/report_phish/): Melden Sie Phishing-Seiten an Google, damit diese in Chrome und anderen Browsern blockiert werden -- [Netcraft](https://report.netcraft.com/report/mistake): bösartige und betrügerische Websites melden -- Melden Sie es direkt auf der Social-Media-Plattform, auf der der Betrug stattgefunden hat (Twitter/X, Discord, Telegram haben alle Meldefunktionen) +- [PhishTank](https://phishtank.org/): Phishing-URLs einreichen und überprüfen. +- [Google Safe Browsing](https://safebrowsing.google.com/safebrowsing/report_phish/): Melden Sie Phishing-Websites an Google, damit sie in Chrome und anderen Browsern blockiert werden. +- [Netcraft](https://report.netcraft.com/report/mistake): Melden Sie bösartige und betrügerische Websites. +- Melden Sie es direkt auf der Social-Media-Plattform, auf der der Betrug stattgefunden hat (Twitter/X, Discord, Telegram haben alle Meldefunktionen). -### Bei der Strafverfolgung melden {#report-law-enforcement} +### Bei den Strafverfolgungsbehörden melden {#report-law-enforcement} - **Vereinigte Staaten:** [FBI Internet Crime Complaint Center (IC3)](https://www.ic3.gov/) - **Vereinigtes Königreich:** [Action Fraud](https://www.actionfraud.police.uk/) - **Europäische Union:** [Europol](https://www.europol.europa.eu/report-a-crime) -- **Andere Länder:** erstatten Sie Anzeige bei Ihrer örtlichen Polizei. Betrug mit Kryptowährungen ist in den meisten Rechtsordnungen eine Straftat +- **Andere Länder:** Erstatten Sie Anzeige bei Ihrer örtlichen Polizei. Kryptowährungsbetrug ist in den meisten Gerichtsbarkeiten eine Straftat. ## Analysieren Sie, was passiert ist {#analyze} -Zu verstehen, wohin Ihr Geld geflossen ist, kann bei Berichten helfen und Wiederherstellungsbemühungen unterstützen, wenn das Geld auf einer zentralisierten Börse landet. +Zu verstehen, wohin Ihr Geld geflossen ist, kann bei Meldungen helfen und Wiederherstellungsbemühungen unterstützen, falls das Geld auf einer zentralisierte Börse landet. -- [Blockscout](https://eth.blockscout.com/): Open-Source-Block-Explorer, um jeden Transaktions-Hash oder jede Wallet-Adresse nachzuschlagen und zu sehen, wohin Gelder gesendet wurden -- [Etherscan](https://etherscan.io/): Suchen Sie nach einem beliebigen Transaktions-Hash oder einer Wallet-Adresse, um zu sehen, wohin Gelder gesendet wurden -- [Chainabuse lookup](https://www.chainabuse.com/): prüfen, ob eine Adresse bereits von anderen Opfern gemeldet wurde -- [MetaSleuth](https://metasleuth.io/) von BlockSec: visuelles Transaktionsverfolgungstool, das Geldflüsse abbildet +- [Blockscout](https://eth.blockscout.com/): Open-Source-Blocksuchmaschine, um jeden Transaktions-Hash oder jede Wallet-Adresse nachzuschlagen und zu sehen, wohin Gelder gesendet wurden. +- [Etherscan](https://etherscan.io/): Schlagen Sie jeden Transaktions-Hash oder jede Wallet-Adresse nach, um zu sehen, wohin Gelder gesendet wurden. +- [Chainabuse-Suche](https://www.chainabuse.com/): Überprüfen Sie, ob eine Adresse bereits von anderen Opfern gemeldet wurde. +- [MetaSleuth](https://metasleuth.io/) von BlockSec: Visuelles Tool zur Transaktionsverfolgung, das Geldflüsse abbildet. -**Wenn Gelder an eine zentralisierte Börse** (wie Coinbase, Binance, Kraken) gesendet wurden, kontaktieren Sie sofort deren Support-Team mit den Transaktionsdetails. Börsen können manchmal Konten, die wegen Betrugs gemeldet wurden, einfrieren. +**Wenn Gelder an eine zentralisierte Börse gesendet wurden** (wie Coinbase, Binance, Kraken), kontaktieren Sie sofort deren Support-Team mit den Transaktionsdetails. Börsen können manchmal Konten einfrieren, die wegen Betrugs markiert wurden. ## Die harte Wahrheit {#hard-truth} -Da Ethereum dezentralisiert ist, kann keine zentrale Behörde Transaktionen rückgängig machen oder gestohlene Gelder wiederbeschaffen. Sobald eine Transaktion in der Blockchain bestätigt ist, ist sie endgültig. +Da Ethereum dezentralisiert ist, kann keine zentrale Autorität Transaktionen rückgängig machen oder gestohlene Gelder zurückholen. Sobald eine Transaktion auf der Blockchain bestätigt ist, ist sie endgültig. -Eine Meldung ist dennoch wertvoll. Berichte helfen den Strafverfolgungsbehörden, organisierte Betrugsringe aufzuspüren, und das Markieren von Adressen auf Chainabuse und Etherscan warnt zukünftige potenzielle Opfer. +Das Melden ist dennoch wertvoll. Berichte helfen den Strafverfolgungsbehörden, organisierte Betrügerringe aufzuspüren, und das Markieren von Adressen auf Chainabuse und Etherscan warnt zukünftige potenzielle Opfer. -## Arten von Betrug, auf die man achten sollte {#scam-types} +## Arten von Betrug, auf die Sie achten sollten {#scam-types} -Betrüger erstellen gefälschte Giveaways, die versprechen, Ihre ETH zu vervielfachen oder Ihnen kostenlose Token zu geben. Sie geben sich oft als bekannte Persönlichkeiten wie Vitalik Buterin aus. Wenn Sie ETH an eine "Giveaway"-Adresse senden, erhalten Sie nichts zurück. +Betrüger erstellen gefälschte Giveaways, die versprechen, Ihr ETH zu vervielfachen oder Ihnen kostenlose Token zu geben. Sie geben sich oft als bekannte Persönlichkeiten wie Vitalik Buterin aus. Wenn Sie ETH an eine „Giveaway“-Adresse senden, erhalten Sie nichts zurück. + +**Denken Sie daran:** Vitalik und andere prominente Persönlichkeiten werden Sie niemals bitten, ihnen ETH zu senden. -**Denken Sie daran:** Vitalik und andere prominente Persönlichkeiten werden Sie niemals bitten, ihnen ETH zu schicken. +[Mehr zu häufigen Betrugsmaschen](/security/#common-scams) -[Mehr zu gängigen Betrugsmaschen](/security/#common-scams) -Betrüger geben sich auf Discord, Telegram und in den sozialen Medien als Mitglieder des Ethereum-Teams, als Moderatoren oder als Support-Mitarbeiter aus. Sie können Ihnen Direktnachrichten schicken, in denen sie Hilfe anbieten oder behaupten, dass es ein Problem mit Ihrem Konto gibt. +Betrüger geben sich auf Discord, Telegram und in sozialen Medien als Ethereum-Teammitglieder, Moderatoren oder Support-Mitarbeiter aus. Sie senden Ihnen möglicherweise Direktnachrichten, in denen sie Hilfe anbieten oder behaupten, es gäbe ein Problem mit Ihrem Konto. **Denken Sie daran:** -- Es gibt kein "Ethereum-Support-Team" -- Echte Moderatoren werden Ihnen niemals zuerst eine Direktnachricht senden -- Geben Sie Ihre Seed-Phrase oder Ihre privaten Schlüssel niemals und aus keinem Grund an Dritte weiter -- Klicken Sie niemals auf Links, die in unaufgefordert zugesandten Nachrichten enthalten sind +- Es gibt kein „Ethereum-Support-Team“. +- Echte Moderatoren werden Ihnen niemals zuerst eine Direktnachricht (DM) senden. +- Teilen Sie niemals Ihre Seed-Phrase oder Ihre Private-Keys mit irgendjemandem, aus welchem Grund auch immer. +- Klicken Sie niemals auf Links, die in unaufgeforderten Nachrichten gesendet werden. + -Wiederherstellungsbetrügereien zielen speziell auf Personen ab, die bereits Geld verloren haben. Betrüger überwachen soziale Medien nach Personen, die darüber sprechen, betrogen worden zu sein, und geben sich dann als "Blockchain-Ermittler" oder "Krypto-Wiederherstellungsexperten" aus. +Wiederherstellungsbetrug zielt speziell auf Personen ab, die bereits Geld verloren haben. Betrüger überwachen soziale Medien auf Personen, die darüber sprechen, betrogen worden zu sein, und melden sich dann als „Blockchain-Ermittler“ oder „Krypto-Wiederherstellungsexperten“. + +Sie versprechen, Ihre gestohlenen Kryptowährungen gegen eine Vorabgebühr aufzuspüren und wiederherzustellen. Nachdem Sie bezahlt haben, verschwinden sie. -Sie versprechen, Ihre gestohlene Kryptowährung gegen eine Vorauszahlung aufzuspüren und wiederzubeschaffen. Nachdem Sie bezahlt haben, verschwinden sie. +**Kein legitimer Dienst kann Blockchain-Transaktionen rückgängig machen.** Jeder, der dies verspricht, lügt. Dies ist einer der häufigsten Folgebetrüge. -**Kein seriöser Dienst kann Blockchain-Transaktionen rückgängig machen.** Jeder, der dies verspricht, lügt. Dies ist einer der häufigsten Folgebetrügereien. -Phishing-Websites sehen identisch aus wie echte Wallet-Apps, Börsen oder DeFi-Plattformen. Sie bringen Sie dazu, Ihre Seed-Phrase einzugeben oder Ihre Wallet zu verbinden, und ziehen dann Ihr Geld ab. +Phishing-Seiten sehen identisch aus wie echte Wallet-Apps, Börsen oder DeFi-Plattformen. Sie verleiten Sie dazu, Ihre Seed-Phrase einzugeben oder Ihr Wallet zu verbinden, und leeren dann Ihr Guthaben. **Schützen Sie sich:** -- Überprüfen Sie immer die URL, bevor Sie Ihre Wallet verbinden -- Setzen Sie ein Lesezeichen für die offiziellen Websites, die Sie regelmäßig nutzen -- Geben Sie Ihre Seed-Phrase niemals auf einer Website ein. Legitime Apps fragen niemals danach -- Verwenden Sie [PhishTank](https://phishtank.org/), um verdächtige URLs zu überprüfen +- Überprüfen Sie immer die URL, bevor Sie Ihr Wallet verbinden. +- Setzen Sie Lesezeichen für die offiziellen Websites, die Sie regelmäßig nutzen. +- Geben Sie niemals Ihre Seed-Phrase auf einer Website ein. Legitime Apps fragen niemals danach. +- Verwenden Sie [PhishTank](https://phishtank.org/), um verdächtige URLs zu überprüfen. - So erkennen Sie betrügerische Token + So erkennen Sie Betrugs-Token + Vollständiger Leitfaden zur Ethereum-Sicherheit und Betrugsprävention - + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-desci-projects/index.md b/public/content/translations/de/contributing/adding-desci-projects/index.md index 2d5091c7a30..e80ad4edceb 100644 --- a/public/content/translations/de/contributing/adding-desci-projects/index.md +++ b/public/content/translations/de/contributing/adding-desci-projects/index.md @@ -1,6 +1,6 @@ --- -title: DeSci-Projekte hinzufügen -description: Richtlinien, die wir beim Hinzufügen von Links zu Projekten auf der DeSci-Seite auf ethereum.org verwenden +title: "Hinzufügen von DeSci-Projekten" +description: "Die Richtlinie, die wir anwenden, wenn wir einen Link zu Projekten auf der DeSci-Seite auf ethereum.org hinzufügen" lang: de --- @@ -8,37 +8,37 @@ lang: de Wir möchten sicherstellen, dass wir eine Vielzahl von Projekten zeigen und einen guten Überblick über die DeSci-Landschaft geben. -Es steht jedem frei, ein Projekt vorzuschlagen, das auf der DeSci-Seite auf ethereum.org gelistet werden soll. Ebenso kann jeder, dem ein Projekt auffällt, das nicht mehr relevant ist oder unsere Auswahlkriterien nicht mehr erfüllt, vorschlagen, dass es entfernt wird. +Jeder kann ein Projekt vorschlagen, das auf der DeSci-Seite auf ethereum.org aufgeführt werden soll. Ebenso kann jeder, dem ein Projekt auffällt, das nicht mehr relevant ist oder unsere Aufnahmekriterien nicht mehr erfüllt, dessen Entfernung vorschlagen. ## Der Entscheidungsrahmen {#the-decision-framework} -### Aufnahmekriterien: die Must-haves {#the-must-haves} +### Kriterien für die Aufnahme: die Must-haves {#the-must-haves} -- **Open Source Code/data** – Die Transparenz von Code und Daten ist ein zentrales DeSci-Prinzip, daher dürfen DeSci-Projekte grundsätzlich nicht Closed Source sein. Die Codebasis sollte zugänglich und idealerweise offen für PRs sein. -- **DeSci-Projekte sollten nachweislich dezentralisiert sein** – Das könnte bedeuten, dass sie von einer DAO verwaltet werden oder dass sie mit einem dezentralen Tech-Stack einschließlich nicht-pfändbarer Wallets aufgebaut werden. Dabei handelt es sich höchstwahrscheinlich um prüfbare Smart Contracts auf Ethereum. -- **Ehrliche und genaue Angaben**: Es wird erwartet, dass alle vorgeschlagenen Projektangebote ehrliche und genaue Angaben enthalten. Produkte, die falsche Angaben machen, z. B. Ihr Produkt als "Open Source" deklarieren, obwohl es das nicht ist, werden entfernt. -- **Nachweisliches Engagement für die Erweiterung des Zugangs zur Wissenschaft** – Ein DeSci-Projekt sollte in der Lage sein, darzulegen, wie es die Teilnahme an der Wissenschaft auf die breite Öffentlichkeit ausweitet, nicht nur auf Inhaber von Token/NFT. -- **Global zugänglich** – Ihr Projekt hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu Ihrer Dienstleistung ausschließen. -- **Informative Website und Dokumentation** – Es ist wichtig, dass die Besucher der Projektwebsite verstehen können, was das Projekt eigentlich tut, wie es zur Dezentralisierung der wissenschaftlichen Infrastruktur beiträgt und wie sie sich beteiligen können. -- **Das Projekt sollte Teil des Ethereum-Ökosystems sein** – Bei ethereum.org glauben wir, dass Ethereum (und seine Layer 2) die geeignete Basis für die DeSci-Bewegung ist. -- **Das Projekt ist relativ gut etabliert** – Das Projekt hat echte Nutzer, die seit einigen Monaten auf die Dienste des Projekts zugreifen können. +- **Open-Source-Code/Daten** - Die Offenheit von Code und Daten ist ein Kernprinzip von DeSci, daher dürfen DeSci-Projekte nicht Closed Source sein. Die Codebasis sollte zugänglich und idealerweise offen für PRs sein. +- **DeSci-Projekte sollten nachweislich dezentralisiert sein** - Dies könnte beinhalten, dass sie von einer DAO verwaltet werden oder mit einem dezentralisierten Tech-Stack einschließlich Non-Custodial Wallets aufgebaut sind. Es beinhaltet wahrscheinlich überprüfbare Smart Contracts auf Ethereum. +- **Ehrliche und genaue Listungsinformationen** - Es wird erwartet, dass alle vorgeschlagenen Listungen von Projekten mit ehrlichen und genauen Informationen versehen sind. Produkte, die Listungsinformationen fälschen, wie z. B. die Angabe, dass Ihr Produkt „Open Source“ ist, wenn dies nicht der Fall ist, werden entfernt. +- **Nachweisliches Engagement für die Erweiterung des Zugangs zur Wissenschaft** - Ein DeSci-Projekt sollte in der Lage sein zu artikulieren, wie es die Teilnahme an der Wissenschaft für die breite Öffentlichkeit erweitert, nicht nur für Token-/NFT-Inhaber. +- **Weltweit zugänglich** - Ihr Projekt hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugriff auf Ihren Dienst ausschließen. +- **Informative Website und Dokumentation** - Es ist wichtig, dass Besucher der Projekt-Website verstehen können, was das Projekt tatsächlich tut, wie es zur Dezentralisierung der wissenschaftlichen Infrastruktur beiträgt und wie man sich daran beteiligen kann. +- **Das Projekt sollte Teil des Ethereum-Ökosystems sein** - Wir bei ethereum.org glauben, dass Ethereum (und seine Ebene-2-Lösungen) die geeignete Basisschicht für die DeSci-Bewegung ist. +- **Das Projekt ist ziemlich gut etabliert** - Das Projekt hat echte Nutzer, die seit mehreren Monaten auf die Dienste des Projekts zugreifen können. -### Nice-to-Haves +### Nice-to-haves -- **Verfügbar in mehreren Sprachen** – Ihr Projekt wird in mehrere Sprachen übersetzt, so dass Nutzer in aller Welt darauf zugreifen können. -- **Lehrmittel** – Ihr Produkt sollte über ein gut gestaltetes Onboarding-Erlebnis bieten, um den Benutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. -- **Überprüfungen durch Dritte** – Ihr Produkt wurde von einer vertrauenswürdigen dritten Partei professionell auf Schwachstellen geprüft. -- **Kontaktstelle** – Eine Kontaktstelle für das Projekt (z. B. ein Vertreter einer DAO oder einer Gemeinschaft) hilft uns sehr, genaue Informationen zu erhalten, wenn Änderungen vorgenommen werden. Somit bleibt die Aktualisierung von ethereum.org bei der Erfassung künftiger Informationen überschaubar. +- **In mehreren Sprachen verfügbar** - Ihr Projekt ist in mehrere Sprachen übersetzt, sodass Nutzer auf der ganzen Welt darauf zugreifen können. +- **Bildungsressourcen** - Ihr Produkt sollte über eine gut gestaltete Onboarding-Erfahrung verfügen, um Nutzern zu helfen und sie weiterzubilden. Oder Nachweise von Anleitungen wie Artikeln oder Videos. +- **Audits durch Dritte** - Ihr Produkt wurde von einer vertrauenswürdigen dritten Partei professionell auf Schwachstellen geprüft. +- **Ansprechpartner** - Ein Ansprechpartner für das Projekt (dies könnte ein Vertreter einer DAO oder der Community sein) wird uns sehr helfen, genaue Informationen zu erhalten, wenn Änderungen vorgenommen werden. Dies hält die Aktualisierung von ethereum.org bei der zukünftigen Informationsbeschaffung überschaubar. ## Wartung {#maintenance} -Ethereum befindet sich in der Entwicklung. Daher kommen und gehen Teams und Produkte und Innovationen finden täglich statt, so dass wir unsere Inhalte regelmäßig überprüfen: +Aufgrund der dynamischen Natur von Ethereum kommen und gehen Teams und Produkte, und Innovationen finden täglich statt. Daher werden wir routinemäßige Überprüfungen unserer Inhalte durchführen, um: -- sicherstellen, dass alle aufgelisteten Projekte weiterhin unsere Kriterien erfüllen -- Überprüfen, ob Produkte vorgeschlagen wurden, die unsere Kriterien besser erfüllen als die derzeit aufgeführten +- Sicherzustellen, dass alle aufgeführten Projekte weiterhin unsere Kriterien erfüllen +- Zu überprüfen, ob keine Produkte vorgeschlagen wurden, die mehr unserer Kriterien erfüllen als die derzeit aufgeführten -Ethereum.org wird von der Open-Source-Community gepflegt; wir sind auf die Hilfe der Community angewiesen, um diese Seite auf dem neuesten Stand zu halten. Wenn Sie bemerken, dass Informationen zu den aufgelisteten Projekten aktualisiert werden müssen, öffnen Sie bitte ein Ticket oder einen Pull-Request in unserem Github-Repository. +Ethereum.org wird von der Open-Source-Community gepflegt und wir verlassen uns auf die Community, um dies auf dem neuesten Stand zu halten. Wenn Ihnen Informationen zu aufgeführten Projekten auffallen, die aktualisiert werden müssen, eröffnen Sie bitte ein Issue oder einen Pull Request in unserem GitHub-Repository. ## Nutzungsbedingungen {#terms-of-use} -Bitte beachten Sie auch unsere[Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. +Bitte beachten Sie auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-developer-tools/index.md b/public/content/translations/de/contributing/adding-developer-tools/index.md index d6bee16bace..703fdae2bb2 100644 --- a/public/content/translations/de/contributing/adding-developer-tools/index.md +++ b/public/content/translations/de/contributing/adding-developer-tools/index.md @@ -1,61 +1,61 @@ --- -title: Entwicklertools hinzufügen +title: "Entwicklertools hinzufügen" lang: de -description: Unsere Kriterien für die Auflistung von Entwicklertools auf ethereum.org +description: "Unsere Kriterien für die Auflistung von Entwicklertools auf ethereum.org" --- # Entwicklertools hinzufügen {#contributing-to-ethereumorg-} -Wir möchten sicherstellen, dass wir nur die besten Entwicklerressourcen auflisten, damit andere vertrauensvoll damit arbeiten können und die Unterstützung bekommen, die sie benötigen. +Wir möchten sicherstellen, dass wir die bestmöglichen Entwicklerressourcen auflisten, damit die Leute mit Zuversicht entwickeln können und die Unterstützung erhalten, die sie benötigen. -Wenn es ein hilfreiches Entwicklungstool gibt, das wir vergessen haben, dann schlagen Sie es gerne an geeigneter Stelle vor. +Wenn es ein hilfreiches Entwicklertool gibt, das wir übersehen haben, kannst du es gerne an einer passenden Stelle vorschlagen. -Derzeit listen wir Entwicklertools in unserem [Entwicklerportal](/developers/). +Wir listen derzeit Entwicklertools in unserem gesamten [Entwicklerportal](/developers/) auf. -**Sie können gerne neue Ergänzungen zu den entsprechenden Seiten vorschlagen.** +**Fühle dich frei, neue Ergänzungen für die entsprechenden Seiten vorzuschlagen.** -## So treffen wir Entscheidungen {#ways-to-contribute} +## Wie wir entscheiden {#ways-to-contribute} -Die eingereichten Entwicklertools werden anhand der folgenden Kriterien bewertet: +Einreichungen von Entwicklertools werden nach den folgenden Kriterien bewertet: -**Unterscheidet es sich wesentlich von den bereits aufgelisteten Tools?** +**Unterscheidet es sich sinnvoll von bereits gelisteten Tools?** -- Neue Toolkategorien oder -typen -- Neue Funktionen im Vergleich zu bestehenden, ähnlichen Tools -- Konzipiert für einen bestimmten Anwendungsfall, der von bestehenden, ähnlichen Tools nicht abgedeckt wird +- Neue Kategorien oder Arten von Tools +- Neue Funktionen im Vergleich zu bestehenden ähnlichen Tools +- Ausgerichtet auf einen bestimmten Anwendungsfall, der von bestehenden ähnlichen Tools nicht abgedeckt wird **Ist das Tool gut dokumentiert?** -- Gibt es eine Dokumentation? -- Reicht es aus, das Werkzeug zu benutzen? -- Sind kürzlich Aktualisierungen erfolgt? +- Ist eine Dokumentation vorhanden? +- Ist sie ausreichend, um das Tool zu nutzen? +- Wurde sie in letzter Zeit aktualisiert? -**Ist das Tool gängig?** +**Ist das Tool weit verbreitet?** -- Wir berücksichtigen Kennzahlen wie GitHub-Sterne, Downloadstatistiken und die Frage, ob es von bekannten Unternehmen oder Projekten eingesetzt wird. +- Wir berücksichtigen Metriken wie GitHub-Sterne, Download-Statistiken und ob es von bekannten Unternehmen oder Projekten verwendet wird. -**Ist die Toolqualität ausreichend?** +**Ist das Tool von ausreichender Qualität?** -- Treten wiederkehrend Fehler auf? +- Gibt es wiederkehrende Fehler? - Ist das Tool zuverlässig? -- Wird das Tool aktiv gewartet? +- Wird das Tool aktiv gepflegt? **Ist das Tool Open Source?** -Viele Projekte im Bereich Ethereum sind Open Source. Wir führen mit höherer Wahrscheinlichkeit Open-Source-Projekte auf, die es Entwicklern aus der Community ermöglichen, den Code einzusehen und dazu beizutragen. +Viele Projekte im Ethereum-Bereich sind Open Source. Wir listen eher Open-Source-Projekte auf, die es Community-Entwicklern ermöglichen, den Code zu überprüfen und dazu beizutragen. --- -## Produktanordnung {#product-ordering} +## Produktreihenfolge {#product-ordering} -Sofern die Produkte nicht ausdrücklich anders geordnet sind, z. B. alphabetisch, werden sie in der Reihenfolge der Hinzufügung angezeigt. Die neuesten Produkte erscheinen also am Ende der Liste. +Sofern Produkte nicht ausdrücklich anders geordnet sind, z. B. alphabetisch, werden sie in der Reihenfolge vom ältesten zum neuesten hinzugefügten Produkt auf der Seite angezeigt. Mit anderen Worten: Die neuesten Produkte werden am Ende der Liste hinzugefügt. --- -## Ihr Entwicklertool hinzufügen {#how-decisions-about-the-site-are-made} +## Füge dein Entwicklertool hinzu {#how-decisions-about-the-site-are-made} -Wenn Sie ein Entwicklertool zu ethereum.org hinzufügen möchten, das die Kriterien erfüllt, erstellen Sie einen Eintrag auf GitHub. +Wenn du ein Entwicklertool zu ethereum.org hinzufügen möchtest und es die Kriterien erfüllt, erstelle ein Issue auf GitHub. - Ticket erstellen - + Issue erstellen + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-exchanges/index.md b/public/content/translations/de/contributing/adding-exchanges/index.md index 5d9c9aad1a6..e5c6c14a630 100644 --- a/public/content/translations/de/contributing/adding-exchanges/index.md +++ b/public/content/translations/de/contributing/adding-exchanges/index.md @@ -1,40 +1,40 @@ --- -title: Handelsplätze hinzufügen -description: Richtlinien für das Hinzufügen von Handelsplätzen auf ethereum.org +title: "Börsen hinzufügen" +description: "Die Richtlinie, die wir beim Hinzufügen von Börsen zu ethereum.org anwenden" lang: de --- -# Ethereum-Handelsplätze hinzufügen {#adding-ethereum-exchanges} +# Hinzufügen von Ethereum-Börsen {#adding-ethereum-exchanges} -Jeder kann neue Handelsplätze auf ethereum.org vorschlagen. +Jeder kann neue Börsen auf ethereum.org vorschlagen. Wir listen sie derzeit auf: - [ethereum.org/get-eth](/get-eth/) -Benutzer können auf dieser Seite Handelsplätze auf Grundlage des Wohnorts suchen. So lassen sich etwaige geografische Beschränkungen frühzeitig erkennen. +Auf dieser Seite können Benutzer eingeben, wo sie leben, und sehen, welche Börsen sie nutzen können. Dies hilft dabei, geografische Einschränkungen frühzeitig zu erkennen. -Daher sind für den Vorschlag eines Handeslplatzes einige bestimmte Informationen erforderlich. +Aufgrund dieses Kontexts benötigen wir einige spezifische Informationen, wenn Sie eine Börse vorschlagen. -**HINWEIS:** Wenn Sie einen dezentrale Handelsplatz auflisten möchten, machen Sie sich mit unserer [Richtlinie zum Auflisten von Wallets und Dapps](/contributing/adding-products/) vertraut. +**HINWEIS:** Wenn Sie eine dezentralisierte Börse auflisten möchten, werfen Sie einen Blick auf unsere [Richtlinie für die Auflistung von Wallets und Dapps](/contributing/adding-products/). -## Folgende Informationen sind erforderlich {#what-we-need} +## Was wir benötigen {#what-we-need} -- Die geografischen Beschränkungen, die für Handelsplätze gelten -- Die Währungen, mit denen Benutzer ETH kaufen können -- Nachweis, dass der Handelsplatz ein rechtmäßiges Handelsunternehmen ist -- Alle zusätzlichen Informationen, die Sie haben, wie beispielsweise Informationen über das Unternehmen wie Betriebsjahre, finanzielle Situation usw. +- Die geografischen Einschränkungen, die für die Börse gelten. Geografische Einschränkungen im Zusammenhang mit der Börse sollten auf einer speziellen Seite oder in einem Abschnitt der Website der Börse detailliert beschrieben werden. +- Die Währungen, die Benutzer verwenden können, um ETH zu kaufen +- Einen Nachweis, dass die Börse ein legitimes Handelsunternehmen ist +- Alle zusätzlichen Informationen, die Sie möglicherweise haben – dies können Informationen über das Unternehmen sein, wie z. B. die Anzahl der Betriebsjahre, finanzielle Unterstützung usw. -Wir benötigen diese Informationen, damit wir [den Nutzern helfen können, einen passenden Handelsplatz zu finden](/get-eth/#country-picker). +Wir benötigen diese Informationen, damit wir [Benutzern genau helfen können, eine Börse zu finden, die sie nutzen können](/get-eth/#country-picker). -Außerdem sind diese Informationen die Grundlage, dass ethereum.org darauf vertrauen kann, dass ein Handelsplatz ein legitimer und sicherer Dienst ist. +Und damit ethereum.org sicherer sein kann, dass die Börse ein legitimer und sicherer Dienst ist. --- -## Ihre Börse hinzufügen {#add-exchange} +## Fügen Sie Ihre Börse hinzu {#add-exchange} -Wenn Sie eine Börse zu ethereum.org hinzufügen möchten, erstellen Sie einen Eintrag auf GitHub. +Wenn Sie eine Börse zu ethereum.org hinzufügen möchten, erstellen Sie ein Issue auf GitHub. - Ein Thema erstellen - + Issue erstellen + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-glossary-terms/index.md b/public/content/translations/de/contributing/adding-glossary-terms/index.md index 96a378257d0..0a511acfdd7 100644 --- a/public/content/translations/de/contributing/adding-glossary-terms/index.md +++ b/public/content/translations/de/contributing/adding-glossary-terms/index.md @@ -1,26 +1,26 @@ --- -title: Begriffe zum Glossar hinzufügen +title: "Hinzufügen von Glossarbegriffen" lang: de -description: Unsere Kriterien für die Aufnahme neuer Begriffe in das Glossar von ethereum.org +description: "Unsere Kriterien für das Hinzufügen neuer Begriffe zum ethereum.org-Glossar" --- -# Begriffe zum Glossar hinzufügen {#contributing-to-ethereumorg-} +# Hinzufügen von Glossarbegriffen {#contributing-to-ethereumorg-} -Dieser Bereich verändert sich jeden Tag. Im Lexikon der Ethereum-Nutzerschaft tauchen fortlaufend neue auf und wir benötigen Ihre Unterstützung, um eine genaue, aktuelle Referenz für alle Themen zu erstellen, die mit Ethereum zu tun haben. Machen Sie sich mit dem aktuellen [Glossar](/glossary/) vertraut und sehen Sie unten, ob Sie mithelfen können. +Dieser Bereich verändert sich jeden Tag. Ständig nehmen Ethereum-Nutzer neue Begriffe in ihren Wortschatz auf, und wir brauchen deine Hilfe, um eine genaue, aktuelle Referenz für alles rund um Ethereum bereitzustellen. Sieh dir das aktuelle [Glossar](/glossary/) an und lies weiter unten, wenn du helfen möchtest! ## Kriterien {#criteria} -Die Bewertungen euer Glossarbegriffe erfolgt anhand der folgenden Kriterien: +Neue Glossarbegriffe werden nach den folgenden Kriterien bewertet: -- Ist der Begriff/die Definition auf dem neuesten Stand und derzeit relevant? -- Ist ein ähnlicher Begriff im Wörterbuch bereits vorhanden? (Falls ja, überlegen Sie, welche Vorteile es hätte, einen neuen Begriffs hinzuzufügen anstatt den bestehenden Begriff zu aktualisieren.) -- Enthält der Begriff/die Definition keine Produktwerbung oder andere verkaufsfördernde Inhalte? -- Ist der Begriff/die Definition für Ethereum direkt relevant? -- Ist die Definition objektiv, genau und frei von subjektiven Beurteilungen oder Meinungen? -- Ist die Quelle vertrauenswürdig? Werden die Quellen angegeben? +- Ist der Begriff/die Definition aktuell und derzeit relevant? +- Gibt es bereits einen ähnlichen Begriff im Wörterbuch? (Wenn ja, wäge die Vorteile eines neuen Begriffs gegenüber der Aktualisierung eines bestehenden Begriffs ab) +- Ist der Begriff/die Definition frei von Produktwerbung oder anderen werblichen Inhalten? +- Ist der Begriff/die Definition direkt relevant für Ethereum? +- Ist die Definition objektiv, genau und frei von subjektiven Urteilen oder Meinungen? +- Ist die Quelle glaubwürdig? Werden die Quellen angegeben? --- -## Ihren Begriff hinzufügen {#how-decisions-about-the-site-are-made} +## Füge deinen Begriff hinzu {#how-decisions-about-the-site-are-made} -Wenn Sie einen Glossarbegriff zu ethereum.org hinzufügen möchten und er die Kriterien erfüllt, [erstellen Sie einen Eintrag auf GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). +Wenn du einen Glossarbegriff zu ethereum.org hinzufügen möchtest und dieser die Kriterien erfüllt, [erstelle ein Issue auf GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-layer-2s/index.md b/public/content/translations/de/contributing/adding-layer-2s/index.md index 8bfbd18d5c3..aff86176f96 100644 --- a/public/content/translations/de/contributing/adding-layer-2s/index.md +++ b/public/content/translations/de/contributing/adding-layer-2s/index.md @@ -1,97 +1,97 @@ --- -title: Layer 2s hinzufügen -description: Regeln zum Hinzufügen einer Ebene 2 zu ethereum.org +title: "Ebene 2 hinzufügen" +description: "Die Richtlinie, die wir beim Hinzufügen einer Ebene 2 zu ethereum.org anwenden" lang: de --- -# Ebene 2s hinzufügen {#adding-layer-2} +# Ebene 2 hinzufügen {#adding-layer-2} -Wir möchten sicherstellen, dass die bestmöglichen Ressourcen vorhanden sind, damit Benutzer sich sicher und informiert in der Ebene 2 bewegen können. +Wir möchten sicherstellen, dass wir die bestmöglichen Ressourcen auflisten, damit Benutzer sicher und souverän im Bereich der Ebene 2 navigieren können. -Jeder kann vorschlagen, eine Ebene 2 auf ethereum.org hinzuzufügen. Wenn es eine Layer 2 gibt, die wir vergessen haben, **[schlagen Sie sie gerne vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml).** +Jeder kann vorschlagen, eine Ebene 2 auf ethereum.org hinzuzufügen. Wenn wir eine Ebene 2 übersehen haben, **[schlagen Sie diese bitte vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml)!** Wir listen derzeit L2s auf den folgenden Seiten auf: -- [Optimistische Rollups](/developers/docs/scaling/optimistic-rollups/) +- [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/) - [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) - [Ebene 2](/layer-2/) -Ebene 2 ist ein relativ neues Thema für Ethereum und bietet eine spannende Entwicklung. Wir haben versucht, ein gerechtes Framework für Überlegungen auf ethereum.org zu schaffen. Allerdings werden sich die Kriterien für die Auflistung im Laufe der Zeit verändern und weiterentwickeln. +Ebene 2 ist ein relativ neues und aufregendes Paradigma für Ethereum. Wir haben versucht, einen fairen Rahmen für die Berücksichtigung auf ethereum.org zu schaffen, aber die Kriterien für die Auflistung werden sich im Laufe der Zeit ändern und weiterentwickeln. ## Der Entscheidungsrahmen {#decision-framework} -### Aufnahmekriterien: die Must-haves {#criteria-for-inclusion-the-must-haves} +### Kriterien für die Aufnahme: die Must-haves {#criteria-for-inclusion-the-must-haves} **Auflistung auf L2BEAT** -- Damit ein Projekt berücksichtigt werden kann, muss es auf [L2BEAT](https://l2beat.com) aufgelistet sein. L2BEAT bietet eine solide Risikobewertung von Ebene-2-Projekten, die wir für die Beurteilung von L2-Projekten nutzen. **Wird ein Projekt nicht auf L2BEAT vorgestellt, erfolgt keine Auflistung als L2 auf ethereum.org.** +- Um berücksichtigt zu werden, muss dieses Projekt auf [L2BEAT](https://l2beat.com) gelistet sein. L2BEAT bietet eine robuste Risikobewertung von Ebene-2-Projekten, auf die wir uns bei der Bewertung von L2-Projekten stützen. **Wenn das Projekt nicht auf L2BEAT aufgeführt ist, werden wir es nicht als L2 auf ethereum.org auflisten.** - [Erfahren Sie, wie Sie Ihr L2-Projekt zu L2BEAT hinzufügen](https://github.com/l2beat/l2beat/blob/master/CONTRIBUTING.md). **Open Source** -- Ihr Code muss zugänglich sein und Sie sollten PRs von der weiteren Community akzeptieren. +- Ihr Code muss zugänglich sein und Sie sollten PRs aus der breiteren Community akzeptieren. -**Ebene-2-Kategorie** +**Kategorie der Ebene 2** -Derzeit berücksichtigen wir Folgendes für Ebene-2-Lösungen: +Wir betrachten derzeit die folgenden als Ebene-2-Lösungen: -- Optimistische Rollups +- Optimistic Rollup - Zero-Knowledge Rollup -_Wir betrachten andere Skalierungslösungen, die nicht Ethereum für Datenverfügbarkeit oder -sicherheit nutzen, nicht als Ebene 2._ +_Wir betrachten andere Skalierungslösungen, die Ethereum nicht für die Datenverfügbarkeit oder Sicherheit nutzen, nicht als Ebene 2._ **Ethereum für Datenverfügbarkeit** -- Datenverfügbarkeit ist ein wichtiger Differenzierungsfaktor zwischen anderen Skalierungslösungen und Ebene 2. Ein Projekt **muss** das Ethereum Mainnet für Datenverfügbarkeit nutzen, um für ein Listing berücksichtigt zu werden. +- Datenverfügbarkeit ist ein wichtiges Unterscheidungsmerkmal zwischen anderen Skalierungslösungen und Ebene 2. Ein Projekt **muss** das Ethereum-Mainnet für die Datenverfügbarkeit nutzen, um für eine Auflistung in Betracht gezogen zu werden. -**Bridges** +**Kettenübergreifende Brücken** -- Wie können Benutzer auf Ebene 2 einsteigen? +- Wie können Benutzer in die Ebene 2 einsteigen? -**Datum der Inbetriebnahme des Projekts** +**Datum, an dem das Projekt live ging** -- Eine Layer 2, die seit über 6 Monaten auf dem Mainnet "live" ist +- Eine Ebene 2, die seit über 6 Monaten auf dem Mainnet „live“ ist -- Neuere Projekte, die noch nicht von Nutzern getestet wurden, werden seltener aufgeführt. +- Neuere Projekte, die sich noch nicht in der Praxis bei Benutzern bewährt haben, werden mit geringerer Wahrscheinlichkeit gelistet. **Externes Sicherheitsaudit** -- Die Sicherheit Ihres Produkts muss zuverlässig getestet werden, ob durch ein Audit, ein internes Sicherheitsteam oder eine andere Methode. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen dafür, dass Sie Sicherheit ernst nehmen. +- Ob durch ein Audit, ein internes Sicherheitsteam oder eine andere Methode, die Sicherheit Ihres Produkts muss zuverlässig getestet werden. Dies verringert das Risiko für unsere Benutzer und zeigt uns, dass Sie Sicherheit ernst nehmen. -**Dauerhafte Nutzerbasis** +**Nachhaltige Nutzerbasis** -- Wir berücksichtigen Kennzahlen wie den TVL-Verlauf, Transaktionsstatistiken und die Frage, ob eine Nutzung durch bekannte Unternehmen oder Projekte erfolgt +- Wir berücksichtigen Metriken wie den TVL-Verlauf, Transaktionsstatistiken und ob es von bekannten Unternehmen oder Projekten genutzt wird. **Aktives Entwicklungsteam** -- Es wird keine Ebene 2 aufgelistet, für die kein Team aktiv am Projekt arbeitet. +- Wir werden keine Ebene 2 auflisten, an der kein aktives Team arbeitet. -**Block Explorer** +**Blocksuchmaschine** -- Für aufgelistete Projekte ist ein funktionierender Block Explorer erforderlich, um Benutzern die Navigation in der Chain zu erleichtern. +- Gelistete Projekte erfordern eine funktionierende Blocksuchmaschine, damit Benutzer problemlos auf der Chain navigieren können. -### Weitere Kriterien: optionale Aspekte {#nice-to-haves} +### Weitere Kriterien: die Nice-to-haves {#nice-to-haves} -**Unterstützung des Projekts durch einen Handelsplatz** +**Börsenunterstützung für das Projekt** -- Können Nutzer direkt an einem Handelsplatz einzahlen und/oder abheben? +- Können Benutzer direkt von einer Börse einzahlen und/oder abheben? -**Links zu dApps im Ebene-2-Ökosystem** +**Links zu Dapps im Ökosystem der Ebene 2** -- Wir möchten unseren Benutzern Informationen bieten, was sie auf dieser Ebene 2 erwarten können. (z. B. https://portal.arbitrum.io/, https://www.optimism.io/apps) +- Wir möchten Informationen darüber bereitstellen können, was Benutzer auf dieser Ebene 2 erwarten können. (z. B. https://portal.arbitrum.io/, https://www.optimism.io/apps) -**Token-Vertragslisten** +**Listen von Token-Verträgen** -- Da die Vermögenswerte eine neue Adresse auf Ebene 2 erhalten, bitten wir um Mitteilung, falls eine Token-Liste verfügbar ist. +- Da Vermögenswerte auf der Ebene 2 eine neue Adresse haben werden, teilen Sie uns bitte mit, falls eine Token-Listen-Ressource verfügbar ist. -**Unterstützung systemeigener Wallet** +**Native Wallet-Unterstützung** -- Gibt es Wallets, die eine native Unterstützung für L2 bieten? +- Unterstützen irgendwelche Wallets die L2 nativ? -## Eigene Ebene 2 hinzufügen {#add-exchange} +## Fügen Sie Ihre Ebene 2 hinzu {#add-exchange} -Wenn Sie eine Ebene 2 zu ethereum.org hinzufügen möchten, erstellen Sie einen Eintrag auf GitHub. +Wenn Sie eine Ebene 2 zu ethereum.org hinzufügen möchten, erstellen Sie ein Issue auf GitHub. - Eintrag erstellen - + Ein Issue erstellen + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-products/index.md b/public/content/translations/de/contributing/adding-products/index.md index 42ed5e47c5f..b7b520dc60d 100644 --- a/public/content/translations/de/contributing/adding-products/index.md +++ b/public/content/translations/de/contributing/adding-products/index.md @@ -1,100 +1,100 @@ --- -title: Produkte hinzufügen -description: Die Richtlinie, die wir beim Hinzufügen von dApps zu ethereum.org verwenden +title: "Produkte hinzufügen" +description: "Die Richtlinie, die wir beim Hinzufügen von Dapps zu ethereum.org anwenden" lang: de --- # Ethereum-Produkte hinzufügen {#adding-products} -Jedem steht es frei, neue dApps für den Inhalt von ethereum.org vorzuschlagen, insofern das angemessen ist. **Nein, wir werden Ihre dApp nicht auf unserer Homepage auflisten** 😜 +Jeder kann neue Dapps für die Inhalte auf ethereum.org vorschlagen, sofern dies angemessen ist. **Nein, wir werden deine Dapp nicht auf unserer Startseite auflisten** 😜 -dApps sind derzeit hier aufgelistet: +Dapps werden derzeit hier aufgelistet: - ethereum.org/dapps - ethereum.org/get-eth -**Bitte schlagen Sie nur neue Ergänzungen auf diesen Seiten vor.** +**Bitte schlage neue Ergänzungen nur für diese Seiten vor.** -Obwohl wir neue Ergänzungen begrüßen, haben wir die aktuellen Apps auf der Grundlage der Erfahrung ausgewählt, die wir für unsere Nutzer schaffen wollen. Diese beruhen auf einigen unserer Designprinzipien: +Obwohl wir neue Ergänzungen begrüßen, haben wir die aktuellen Dapps basierend auf der Erfahrung ausgewählt, die wir für unsere Nutzer schaffen möchten. Diese basieren auf einigen unserer Designprinzipien: -- _Inspirierend_: Alles, was auf ethereum.org zu finden ist, sollte den Nutzern etwas Neues bieten. -- _Eine gute Geschichte_: Das, was aufgelistet ist, sollte einen "Aha"-Moment auslösen. -- _Glaubwürdig_: Alle aufgeführten Inhalte sollten legitime Unternehmen/Projekte sein, um das Risiko für die Nutzer zu minimieren. +- _Inspirierend_: Alles auf ethereum.org sollte den Nutzern etwas Neues bieten. +- _Eine gute Geschichte_: Was aufgelistet ist, sollte für einen „Aha“-Moment sorgen. +- _Glaubwürdig_: Alles sollte legitime Unternehmen/Projekte sein, um das Risiko für die Nutzer zu minimieren. -Insgesamt will **ethereum.org ein "nahtloses Einführungserlebnis" für neue Nutzer/innen bieten**. Aus diesem Grund werden folgende Kriterien für das Hinzufügen von dApps berücksichtigt: +Insgesamt **möchte ethereum.org neuen Nutzern ein „nahtloses Onboarding-Erlebnis“ bieten**. Aus diesem Grund fügen wir Dapps basierend auf folgenden Kriterien hinzu: -- Anwenderfreundlichkeit +- Benutzerfreundlichkeit - Interoperabilität mit anderen Produkten - Sicherheit - Langlebigkeit -Hier ist unser Entscheidungsrahmen im Detail. Sie können uns gerne Feedback geben oder Änderungen vorschlagen. +Hier ist unser Entscheidungsrahmen im Detail. Du kannst gerne Feedback geben oder Änderungen vorschlagen. ## Der Entscheidungsrahmen {#decision-framework} -### Aufnahmekriterien: die Must-haves {#criteria-for-inclusion-the-must-haves} +### Kriterien für die Aufnahme: die Must-haves {#criteria-for-inclusion-the-must-haves} -- **Ein sicherheitsgeprüftes Produkt**: Ob durch ein Audit, ein internes Sicherheitsteam oder eine andere Methode, die Sicherheit Ihres Produktes muss zuverlässig getestet werden. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen für die Ernsthaftigkeit eines Produkts. -- **Ein Produkt, das seit mehr als 6 Monaten "live" ist**: Das ist ein weiterer Hinweis auf Sicherheit. 6 Monate sind ein guter Zeitraum, um kritische Bugs und Exploits zu finden. -- **Bearbeitung durch ein aktives Team**: Das trägt dazu bei, die Qualität zu gewährleisten und sicherzustellen, dass Benutzer bei Fragen Unterstützung erhalten. -- **Ehrliche und genaue Angaben**: Es wird erwartet, dass alle vorgeschlagenen Projektangebote ehrliche und genaue Angaben enthalten. Produkte mit falschen Informationen, wie zum Beispiel die Angabe, dass es sich um ein "Open-Source-Produkt" handelt, obwohl dies nicht der Fall ist, werden entfernt. +- **Ein sicherheitsgeprüftes Produkt** – ob durch ein Audit, ein internes Sicherheitsteam oder eine andere Methode, die Sicherheit deines Produkts muss zuverlässig getestet sein. Dies verringert das Risiko für unsere Nutzer und zeigt uns, dass du Sicherheit ernst nimmst. +- **Ein Produkt, das seit über 6 Monaten „live“ ist** – dies ist ein weiteres Indiz für Sicherheit. 6 Monate sind ein guter Zeitrahmen, in dem kritische Fehler und Schwachstellen gefunden werden können. +- **Wird von einem aktiven Team betreut** – dies hilft, die Qualität sicherzustellen und dass ein Nutzer bei seinen Anfragen Unterstützung erhält. +- **Ehrliche und genaue Auflistungsinformationen** – es wird erwartet, dass alle vorgeschlagenen Auflistungen von Projekten mit ehrlichen und genauen Informationen versehen sind. Produkte, die Auflistungsinformationen fälschen, wie z. B. die Angabe, dass dein Produkt „Open-Source“ ist, wenn dies nicht der Fall ist, werden entfernt. -### Kriterien für die Rangfolge: optionale Aspekte {#criteria-for-ranking-the-nice-to-haves} +### Kriterien für das Ranking: die Nice-to-haves {#criteria-for-ranking-the-nice-to-haves} -Auf Grundlage folgender Kriterien wird bestimmt, wie die Listung von dApps auf ethereum.org erfolgt. +Deine Dapp wird aufgrund der folgenden Kriterien möglicherweise nicht so prominent auf ethereum.org gelistet wie andere. -**dApps** +**Dapps** -- **Der Zugriff ist über die meisten gelisteten Wallets möglich**: dApps sollten mit den meisten Wallets funktionieren, die auf ethereum.org gelistet sind. -- **Benutzer können es selbst ausprobieren**: Ein einzelner Benutzer sollte Ihre dApp benutzen und ein reales Ergebnis damit realisieren können. -- **Onboarding**: Ihr Produkt sollte eine gut gestaltete Onboarding-Erfahrung bieten, um den Benutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. -- **Keine Verwahrung**: Nutzer kontrollieren ihr Geld. Wenn Ihr Produkt verschwindet, können die Nutzer weiterhin auf ihr Guthaben zugreifen und es bewegen. -- **Global zugänglich**: Ihr Produkt ist nicht mit geografischen Einschränkungen oder KYC-Anforderungen verbunden, die bestimmte Personen vom Zugang zu Ihrer Dienstleistung ausschließen. -- **Open Source**: Ihr Code sollte zugänglich sein und Sie sollten PRs von der breiten Gemeinschaft akzeptieren. -- **Community**: Sie haben eine eigene Community, vielleicht ein Discord, in der Benutzer mit Ihrem Team interagieren können, wenn sie Hilfe benötigen oder neue Funktionen vorschlagen möchten. +- **Zugriff über die Mehrheit der gelisteten Wallets möglich** – Dapps sollten mit der Mehrheit der Wallets funktionieren, die auf ethereum.org gelistet sind. +- **Nutzer können es selbst ausprobieren –** ein einzelner Nutzer sollte in der Lage sein, deine Dapp zu nutzen und etwas Greifbares zu erreichen. +- **Onboarding** – dein Produkt sollte ein gut durchdachtes Onboarding-Erlebnis bieten, um Nutzern zu helfen und sie aufzuklären. Oder Nachweise von How-to-Inhalten wie Artikeln oder Videos. +- **Nicht-verwahrend (Non-custodial)** – Nutzer kontrollieren ihre Gelder. Wenn dein Produkt verschwindet, können Nutzer weiterhin auf ihre Gelder zugreifen und sie bewegen. +- **Weltweit zugänglich** – dein Produkt hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugriff auf deinen Dienst ausschließen. +- **Open-Source** – dein Code sollte zugänglich sein und du solltest PRs aus der breiteren Community akzeptieren. +- **Community** – du hast eine engagierte Community, vielleicht einen Discord, in dem Nutzer mit deinem Team interagieren können, um Hilfe zu erhalten oder neue Funktionen vorzuschlagen. ## Kriterien in der Praxis {#criteria-in-practice} -Je mehr der Kriterien Sie erfüllen, desto wahrscheinlicher ist es, dass Ihr Produkt seinen Weg auf ethereum.org finden wird. +Je mehr Kriterien du erfüllst, desto wahrscheinlicher ist es, dass dein Produkt seinen Weg auf ethereum.org findet. -Ein gelistetes Produkt, das nur die "Must-haves" erfüllt, kann gestrichen werden, wenn ein neues Produkt vorgeschlagen wird, das die "Must-haves" und einige der "optionalen Aspekte" erfüllt. +Ein gelistetes Produkt, das nur die Must-haves erfüllt, kann entfernt werden, wenn ein neues Produkt vorgeschlagen wird, das die Must-haves und mehrere der Nice-to-haves erfüllt. -Weitere Aspekte, die bei der Entscheidung eine Rolle spielen: +Weitere Dinge, die in diese Entscheidung einfließen: -- Wenn Elemente hinzugefügt anstatt ersetzt zu werden, kommt es dann zu einer Beeinträchtigung der Benutzererfahrung? - - Unsere Seite ist primär dazu gedacht, um Informationen zu Ethereum und den relevanten Konzepten zu bieten. Wenn zu viele Optionen für die Benutzer hinzugefügt werden, leidet darunter die Lesbarkeit und infolge der Nutzen. -- Lähmen die Auswahlmöglichkeiten auf der Seite nun die Benutzer? - - So wie auf Netflix, wenn Sie stundenlang das ganze Angebot durchgehen, weil Sie sich nicht enscheiden können, was Sie sich anschauen sollen. Es ist riskant, neue Benutzer mit zu viel Auswahl zu verwirren. +- Wird das Hinzufügen anstelle des Ersetzens die UX der Seite beeinträchtigen? + - Unsere Website ist in erster Linie lehrreich und der Hauptzweck besteht darin, Ethereum und seine relevanten Konzepte zu erklären. Durch das Hinzufügen zu vieler Optionen für Nutzer können Seiten weniger lesbar und somit weniger nützlich werden. +- Lähmt diese Seite den Nutzer nun mit Auswahlmöglichkeiten? + - Wie wenn man stundenlang auf Netflix stöbert, weil man sich nicht für etwas entscheiden kann, das man sich ansehen möchte. Neue Nutzer mit zu viel Auswahl zu überfordern, ist ein Risiko. -Das ist eine Designentscheidung, für die ethereum.org verantwortlich ist. +Dies ist eine Designentscheidung, für die ethereum.org verantwortlich ist. -Aber seien Sie versichert, **dass es Links zu anderen Websites geben wird, die mehr dApps bewerten** +Aber sei versichert, **es wird Links zu anderen Websites geben, die mehr Dapps bewerten** -### Produktanordnung {#product-ordering} +### Produktreihenfolge {#product-ordering} -Sofern die Produkte nicht ausdrücklich anders geordnet sind, z. B. alphabetisch, werden sie in der Reihenfolge der Hinzufügung angezeigt, von neu zu alt. Die neuesten Produkte erscheinen also am Ende der Liste. +Sofern Produkte nicht ausdrücklich anders geordnet sind, z. B. alphabetisch, werden Produkte in der Reihenfolge vom ältesten zum neuesten auf der Seite angezeigt. Mit anderen Worten, die neuesten Produkte werden am Ende der Liste hinzugefügt. ### Nutzungsbedingungen {#terms-of-use} -Beachten Sie auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. +Bitte beachte auch unsere [Nutzungsbedingungen](/terms-of-use/). Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. ## Wartung {#maintenance} -Ethereum befindet sich in der Entwicklung. Daher kommen und gehen Teams und Produkte und Innovationen finden täglich statt, so dass wir unsere Inhalte regelmäßig überprüfen: +Aufgrund der dynamischen Natur von Ethereum kommen und gehen Teams und Produkte, und Innovationen finden täglich statt. Daher werden wir routinemäßige Überprüfungen unserer Inhalte durchführen, um: -- sicherstellen, dass alle gelisteten dApps weiterhin unsere Kriterien erfüllen -- Überprüfen, ob Produkte vorgeschlagen wurden, die unsere Kriterien besser erfüllen als die derzeit aufgeführten +- sicherzustellen, dass alle gelisteten Dapps weiterhin unsere Kriterien erfüllen +- zu überprüfen, ob keine Produkte vorgeschlagen wurden, die mehr unserer Kriterien erfüllen als die derzeit gelisteten -Sie können uns dabei helfen, indem Sie das hier überprüfen und uns Bescheid geben. [Erstellen Sie ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) oder senden Sie eine E-Mail an [website@ethereum.org](mailto:website@ethereum.org) +Du kannst dabei helfen, indem du dies überprüfst und uns Bescheid gibst. [Erstelle ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) oder sende eine E-Mail an [website@ethereum.org](mailto:website@ethereum.org) -_Wir untersuchen auch Optionen für Abstimmungen, damit die Community ihre Präferenzen angeben und die besten Produkte hervorheben kann, die wir dann empfehlen können._ +_Wir prüfen auch Optionen für Abstimmungen, damit die Community ihre Präferenzen angeben und die besten Produkte hervorheben kann, die wir empfehlen sollten._ --- -## Ihr Produkt hinzufügen {#add-your-product} +## Füge dein Produkt hinzu {#add-your-product} -Wenn Sie eine dApp zu ethereum.org hinzufügen möchten und sie die Kriterien erfüllt, erstellen Sie einen Eintrag auf GitHub. +Wenn du eine Dapp zu ethereum.org hinzufügen möchtest und sie die Kriterien erfüllt, lass es uns bitte wissen. - Eintrag erstellen - + Eine App vorschlagen + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-resources/index.md b/public/content/translations/de/contributing/adding-resources/index.md new file mode 100644 index 00000000000..09202e0b1e5 --- /dev/null +++ b/public/content/translations/de/contributing/adding-resources/index.md @@ -0,0 +1,53 @@ +--- +title: "Ressourcen hinzufügen" +description: "Die Richtlinie, die wir beim Hinzufügen von Ressourcen zu ethereum.org anwenden" +lang: de +--- + +# Ressourcen hinzufügen {#adding-resources} + +Wir möchten sicherstellen, dass wir die bestmöglichen Ressourcen auflisten und gleichzeitig die Sicherheit und das Vertrauen der Nutzer wahren. + +Jeder kann neue Ressourcen vorschlagen, die dem Ressourcen-Dashboard auf ethereum.org hinzugefügt werden sollen, das derzeit unter [ethereum.org/resources](/resources/) zu finden ist. + +Obwohl wir neue Ergänzungen begrüßen, wurden die aktuellen Ressourcen basierend auf einer Erfahrung ausgewählt, die wir für unsere Nutzer schaffen möchten. Diese basieren auf einigen unserer Designprinzipien: + +- _Inspirierend_: Alles auf ethereum.org sollte den Nutzern etwas Neues bieten +- _Eine gute Geschichte_: Was aufgelistet ist, sollte einen „Aha“-Moment bieten +- _Glaubwürdig_: Alles sollten legitime Unternehmen/Projekte sein, um das Risiko für die Nutzer zu minimieren + +Insgesamt **zielt ethereum.org darauf ab, neuen Nutzern ein nahtloses Onboarding-Erlebnis zu bieten**. Aus diesem Grund fügen wir Ressourcen basierend auf folgenden Kriterien hinzu: + +- Benutzerfreundlichkeit +- Genauigkeit +- Wartung + +## Der Entscheidungsrahmen {#decision-framework} + +### Kriterien {#criteria} + +- **Ehrliche und genaue Auflistungsinformationen** – Alle vorgeschlagenen Einträge müssen ehrliche und genaue Informationen enthalten. Produkte, die Informationen fälschen, werden entfernt. +- **Aktives Projekt** – Die Ressource sollte von einem aktiven Team gepflegt werden, um Qualität und Support für die Nutzer sicherzustellen. Veraltete Ressourcen können entfernt werden. + +### Produktreihenfolge {#product-ordering} + +Wir behalten uns das Recht vor, Produkte basierend auf ihrer Wirkung anzuordnen. Neue Produkte werden in der Regel am Ende der Liste hinzugefügt, sofern nicht anders angegeben. + +## Wartung {#maintenance} + +Da sich das Ethereum-Ökosystem weiterentwickelt, werden wir unsere Inhalte routinemäßig überprüfen, um: + +- Sicherzustellen, dass alle aufgelisteten Ressourcen weiterhin unsere Kriterien erfüllen +- Zu überprüfen, ob keine Produkte vorgeschlagen wurden, die mehr unserer Kriterien erfüllen als die derzeit aufgelisteten + +Du kannst dabei helfen, indem du dies überprüfst und uns Bescheid gibst. [Erstelle ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?template=bug_report.yaml) oder sende eine E-Mail an [website@ethereum.org](mailto:website@ethereum.org). + +--- + +## Füge deine Ressource hinzu {#add-your-resource} + +Wenn du eine Ressource zu ethereum.org hinzufügen möchtest und diese die Kriterien erfüllt, erstelle ein Issue auf GitHub. + + + Erstelle ein Issue + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-staking-products/index.md b/public/content/translations/de/contributing/adding-staking-products/index.md index 027a3c0e100..57bf8909c5a 100644 --- a/public/content/translations/de/contributing/adding-staking-products/index.md +++ b/public/content/translations/de/contributing/adding-staking-products/index.md @@ -1,176 +1,176 @@ --- -title: Staking-Produkte oder -Services hinzufügen -description: Richtlinien, die wir beim Hinzufügen von Staking-Produkten oder -Dienstleistungen zu ethereum.org anwenden +title: "Hinzufügen von Staking-Produkten oder -Diensten" +description: "Die Richtlinie, die wir beim Hinzufügen von Staking-Produkten oder -Diensten zu ethereum.org anwenden" lang: de --- -# Staking-Produkte oder -Services hinzufügen {#adding-staking-products-or-services} +# Hinzufügen von Staking-Produkten oder -Diensten {#adding-staking-products-or-services} -Wir möchten sicherstellen, dass wir die bestmöglichen Ressourcen auflisten und gleichzeitig die Sicherheit und das Vertrauen der Nutzer gewährleisten. +Wir möchten sicherstellen, dass wir die bestmöglichen Ressourcen auflisten und gleichzeitig die Sicherheit und das Vertrauen der Nutzer wahren. -Jeder kann ein Staking-Produkt oder einen Service zur Hinzufügung auf ethereum.org vorschlagen. Wenn wir ein Produkt übersehen haben, **[dann schlagen Sie es bitte vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml).** +Jeder kann vorschlagen, ein Staking-Produkt oder einen Staking-Dienst auf ethereum.org hinzuzufügen. Wenn wir eines übersehen haben, **[schlagen Sie es bitte vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** -Auf den folgenden Seiten finden Sie eine Liste der Staking-Produkte und Services, die wir derzeit anbieten: +Wir listen derzeit Staking-Produkte und -Dienste auf den folgenden Seiten auf: - [Solo-Staking](/staking/solo/) -- [Staking als Dienstleistung](/staking/saas/) -- [Staking-Pool](/staking/pools/) +- [Staking-as-a-Service](/staking/saas/) +- [Staking-Pools](/staking/pools/) -Der Proof-of-Stake wurde am 1. Dezember 2020 auf der Beacon Chain eingeführt. Das Staking ist ein noch relativ neues Verfahren. Dennoch haben wir versucht, einen fairen und transparenten Rahmen für die Berücksichtigung auf ethereum.org zu schaffen. Die Kriterien für die Auflistung werden sich jedoch im Laufe der Zeit ändern und weiterentwickeln und liegen letztendlich im Ermessen des ethereum.org-Website-Teams. +Proof-of-Stake auf der Beacon Chain ist seit dem 1. Dezember 2020 live. Obwohl Staking noch relativ neu ist, haben wir versucht, einen fairen und transparenten Rahmen für die Berücksichtigung auf ethereum.org zu schaffen. Die Kriterien für die Auflistung werden sich jedoch im Laufe der Zeit ändern und weiterentwickeln und liegen letztendlich im Ermessen des Website-Teams von ethereum.org. ## Der Entscheidungsrahmen {#the-decision-framework} -Die Entscheidung, ein Produkt auf ethereum.org zu listen, ist von mehrern Faktoren abhängig. Mehrer Kriterien werden bei der Entscheidung über die Aufnahme eines Produkts oder einer Dienstleistung gemeinsam berücksichtigt. Je mehr dieser Kriterien erfüllt sind, umso wahrscheinlicher ist eine Aufnahme in die Liste. +Die Entscheidung, ein Produkt auf ethereum.org aufzulisten, hängt nicht von einem einzigen Faktor ab. Bei der Entscheidung, ein Produkt oder einen Dienst aufzulisten, werden mehrere Kriterien zusammen berücksichtigt. Je mehr dieser Kriterien erfüllt sind, desto wahrscheinlicher ist eine Auflistung. -**Erstens: Um welche Art von Produkt oder Dienstleistung handelt es sich?** +**Erstens: Um welche Kategorie von Produkt oder Dienst handelt es sich?** -- Node- oder Client-Tool +- Blockchain-Knoten- oder Anwendungs-Tools - Schlüsselverwaltung -- Staking als Dienstleistung (SaaS) +- Staking-as-a-Service (SaaS) - Staking-Pool -Derzeit sind nur Produkte oder Dienstleistungen in diesen Kategorien aufgeführt. +Derzeit listen wir nur Produkte oder Dienste in diesen Kategorien auf. -### Aufnahmekriterien {#criteria-for-inclusion} +### Kriterien für die Aufnahme {#criteria-for-inclusion} -Die eingereichten Staking-Produkte oder Services werden anhand von folgenden Kriterien bewertet: +Einreichungen von Staking-Produkten oder -Diensten werden nach den folgenden Kriterien bewertet: -**Wann wurde das Projekt oder der Service gestartet?** +**Wann wurde das Projekt oder der Dienst gestartet?** -- Gibt es Belege dafür, wann das Produkt oder der Service der Öffentlichkeit zugänglich gemacht wurde? -- Auf dieser Grundlage wird ermittelt, wie bewährt ein Produkt ist. +- Gibt es Belege dafür, wann das Produkt oder der Dienst der Öffentlichkeit zugänglich gemacht wurde? +- Dies wird verwendet, um die „Praxiserprobung“ (Battle-Tested-Score) des Produkts zu bestimmen. -**Wird das Projekt aktiv verwaltet?** +**Wird das Projekt aktiv gepflegt?** -- Gibt es ein aktives Team, das aktuell an der Entwicklung des Projekts arbeitet? Wer sind die Beteiligten? -- Es werden nur aktiv verwaltete Produkte berücksichtigt. +- Gibt es ein aktives Team, das das Projekt entwickelt? Wer ist daran beteiligt? +- Es werden nur aktiv gepflegte Produkte berücksichtigt. -**Ist das Produkt oder der Service frei von vertrauenswürdigen/menschlichen Vermittlern?** +**Ist das Produkt oder der Dienst frei von vertrauenswürdigen/menschlichen Vermittlern?** -- Für welche Schritte der Benutzererfahrung ist es erforderlich, dass Vertrauen in die Menschen gesetzt wird, die entweder die Schlüssel zu ihren Geldern halten oder die Belohnungen richtig verteilen? -- Damit wird die "Vertrauenswürdigkeit" des Produkts oder Services ermittelt. +- Welche Schritte in der Nutzererfahrung erfordern das Vertrauen in Menschen, die entweder die Schlüssel zu ihren Geldern aufbewahren oder Belohnungen ordnungsgemäß verteilen? +- Dies wird verwendet, um den „Vertrauenslosigkeits“-Score (Trustless-Score) des Produkts oder Dienstes zu bestimmen. -**Liefert das Projekt genaue und zuverlässige Informationen?** +**Stellt das Projekt genaue und zuverlässige Informationen bereit?** - Es ist von entscheidender Bedeutung, dass die Website des Produkts aktuelle, genaue und nicht irreführende Informationen enthält, insbesondere wenn sie sich auf das Ethereum-Protokoll oder andere verwandte Technologien beziehen. -- Beiträge, die Fehlinformationen, veraltete Details oder potenziell irreführende Aussagen über Ethereum oder andere relevante Themen enthalten, werden nicht aufgelistet oder werden entfernt, wenn sie bereits aufgelistet sind. +- Einreichungen, die Fehlinformationen, veraltete Details oder potenziell irreführende Aussagen über Ethereum oder andere relevante Themen enthalten, werden nicht aufgelistet oder entfernt, falls sie bereits aufgelistet sind. **Welche Plattformen werden unterstützt?** -- z. B. Linux, macOS, Windows, iOS, Android +- d. h. Linux, macOS, Windows, iOS, Android #### Software und Smart Contracts {#software-and-smart-contracts} -Für jegliche benutzerdefinierte Software oder Smart Contracts: +Für jede beteiligte benutzerdefinierte Software oder Smart Contracts: **Ist alles Open Source?** - Open-Source-Projekte sollten über ein öffentlich zugängliches Quellcode-Repository verfügen. -- Das wird verwendet, um die "Open-Source"-Bewertung des Produkts zu bestimmen. +- Dies wird verwendet, um den „Open-Source“-Score des Produkts zu bestimmen. -**Ist die _Beta-Entwicklung_ für das Produkt abgeschlossen?** +**Hat das Produkt die _Beta_-Entwicklungsphase verlassen?** - Wo befindet sich das Produkt in seinem Entwicklungszyklus? -- Produkte in der Betaphase werden nicht für die Aufnahme auf ethereum.org berücksichtigt. +- Produkte in der Beta-Phase werden für die Aufnahme auf ethereum.org nicht berücksichtigt. **Wurde die Software einem externen Sicherheitsaudit unterzogen?** -- Wenn nicht, ist eine externe Prüfung geplant? -- Auf diese Weise wird die "Prüfungsbewertung" des Produkts ermittelt. +- Wenn nicht, gibt es Pläne, ein externes Audit durchzuführen? +- Dies wird verwendet, um den „Audit“-Score des Produkts zu bestimmen. -**Hat das Projekt ein Bug-Bounty-Programm?** +**Verfügt das Projekt über ein Bug-Bounty-Programm?** -- Wenn nicht, ist die Zahlung einer Prämie für entdeckte Sicherheitslücken geplant? -- Das wird verwendet, um die "Bug Bounty"-Punktzahl des Produkts zu ermitteln. +- Wenn nicht, gibt es Pläne, ein Sicherheits-Bug-Bounty-Programm einzurichten? +- Dies wird verwendet, um den „Bug-Bounty“-Score des Produkts zu bestimmen. -#### Node- oder Client-Tool {#node-or-client-tooling} +#### Blockchain-Knoten- oder Anwendungs-Tools {#node-or-client-tooling} -Für Softwareprodukte im Zusammenhang mit der Einrichtung, Verwaltung oder Migration von Nodes oder Clients: +Für Softwareprodukte im Zusammenhang mit der Einrichtung, Verwaltung oder Migration von Blockchain-Knoten oder Anwendungen: -**Welche Clients auf Konsensebene (d. h. Lighthouse, Teku, Nimbus, Prysm) werden unterstützt?** +**Welche Konsens-Clients (d. h. Lighthouse, Teku, Nimbus, Prysm, Grandine) werden unterstützt?** -- Welche Clients werden unterstützt? Kann der Nutzer wählen? -- Das wird zur Ermittlung der "Multi-Client"-Bewertung des Produkts verwendet. +- Welche Anwendungen werden unterstützt? Kann der Nutzer wählen? +- Dies wird verwendet, um den „Multi-Client“-Score des Produkts zu bestimmen. -#### Staking als Service {#staking-as-a-service} +#### Staking-as-a-Service {#staking-as-a-service} -Für [Staking-as-a-Service-Listings](/staking/saas/) (d. h. delegierter Node-Betrieb): +Für [Staking-as-a-Service-Einträge](/staking/saas/) (d. h. delegierter Betrieb von Blockchain-Knoten): -**Wie hoch sind die Gebühren für die Nutzung des Services?** +**Welche Gebühren fallen für die Nutzung des Dienstes an?** -- Wie ist die Gebührenstruktur, gibt es z. B. eine monatliche Gebühr für den Service? +- Wie ist die Gebührenstruktur, gibt es z. B. eine monatliche Gebühr für den Dienst? - Gibt es zusätzliche Staking-Anforderungen? -**Müssen sich die Nutzer für ein Konto registrieren?** +**Müssen sich Nutzer für ein Konto registrieren?** -- Kann jemand den Service ohne Genehmigung oder KYC nutzen? -- Auf diese Weise wird der Aspekt der "Berechtigungsfreiheit" für das Produkt bewertet. +- Kann jemand den Dienst erlaubnisfrei oder ohne KYC nutzen? +- Dies wird verwendet, um den „Erlaubnisfreiheits“-Score (Permissionless-Score) des Produkts zu bestimmen. -**Wer hat die Singatur- und Abhebungsschlüssel?** +**Wer besitzt die Signaturschlüssel und die Auszahlungsschlüssel?** -- Auf welche Schlüssel hat der Benutzer Zugriff? Auf welche Schlüssel hat der Service Zugriff? -- Das wird zur Ermittlung der "Vertrauenswürdigkeit" des Produkts herangezogen. +- Auf welche Schlüssel behält der Nutzer Zugriff? Auf welche Schlüssel erhält der Dienst Zugriff? +- Dies wird verwendet, um den „Vertrauenslosigkeits“-Score (Trustless-Score) des Produkts zu bestimmen. -**Wie groß ist die Kundenvielfalt der betriebenen Knoten?** +**Wie ist die Client-Vielfalt der betriebenen Blockchain-Knoten?** -- Wie viel Prozent der Validierungsschlüssel werden von einem Client der Konsensebene (CL) ausgeführt? -- Seit der letzten Bearbeitung wird vowiegend Prysm als Konsensebenen-Client von den Knotenbetreibern verwendet. Das ist gefährlich für Netzwerk. Wenn ein CL-Client derzeit von mehr als 33 % des Netzes genutzt wird, fordern wir Daten zur Nutzung an. -- Auf dieser Grundlage wird für das Produkt der Aspekt "Diverse Clients" bewertet. +- Wie viel Prozent der Validator-Schlüssel werden von einem mehrheitlich genutzten Konsensebenen-Client (CL) ausgeführt? +- Zum Zeitpunkt der letzten Bearbeitung ist Prysm der Konsensebenen-Client, der von der Mehrheit der Betreiber von Blockchain-Knoten ausgeführt wird, was für das Netzwerk gefährlich ist. Wenn ein CL-Client derzeit von über 33 % des Netzwerks verwendet wird, fordern wir Daten zu seiner Nutzung an. +- Dies wird verwendet, um den „Client-Vielfalt“-Score (Diverse-Clients-Score) des Produkts zu bestimmen. #### Staking-Pool {#staking-pool} -Für [Staking-Services im Pool](/staking/pools/): +Für [gepoolte Staking-Dienste](/staking/pools/): -**Wie hoch ist die Mindest-ETH, die für einen Einsatz erforderlich ist?** +**Was ist das Minimum an ETH, das für das Staking erforderlich ist?** - z. B. 0,01 ETH -**Wie hoch sind die Gebühren oder die Anforderungen für bzw. an das Staking?** +**Welche Gebühren oder Staking-Anforderungen sind damit verbunden?** -- Wie viel Prozent der Prämien werden als Gebühren abgezogen? +- Wie viel Prozent der Belohnungen werden als Gebühren abgezogen? - Gibt es zusätzliche Staking-Anforderungen? **Gibt es einen Liquiditäts-Token?** -- Um welche Token handelt es sich? Wie funktionieren sie? Wie lauten die Vertragsadressen? -- Das wird zur Ermittlung der "Liquiditäts-Token"-Bewertung des Produkts verwendet. +- Welche Token sind beteiligt? Wie funktionieren sie? Wie lauten die Vertragsadressen? +- Dies wird verwendet, um den „Liquiditäts-Token“-Score des Produkts zu bestimmen. -**Können Nutzer als Knotenbetreiber teilnehmen?** +**Können Nutzer als Betreiber eines Blockchain-Knotens teilnehmen?** -- Was ist erforderlich, um Validator-Clients mit den gepoolten Mitteln zu betreiben? -- Ist hierfür die Genehmigung einer Einzelperson, eines Unternehmens oder einer DAO erforderlich? -- Auf diese Weise wird der Aspekt "berechtigungsfreie Knoten" für das Produkt bewertet. +- Was ist erforderlich, um Validator-Anwendungen mit den gepoolten Geldern auszuführen? +- Ist dafür die Erlaubnis einer Einzelperson, eines Unternehmens oder einer DAO erforderlich? +- Dies wird verwendet, um den „Erlaubnisfreie Blockchain-Knoten“-Score (Permissionless-Nodes-Score) des Produkts zu bestimmen. -**Wie groß ist die Kundenvielfalt bei den Betreibern der Poolknoten?** +**Wie ist die Client-Vielfalt der Pool-Blockchain-Knoten-Betreiber?** -- Wie viel Prozent der Knotenbetreiber verwenden einen Mehrheits-Client der Konsensebene (CL)? -- Seit der letzten Bearbeitung wird vowiegend Prysm als Konsensebenen-Client von den Knotenbetreibern verwendet. Das ist gefährlich für Netzwerk. Wenn ein CL-Client derzeit von mehr als 33 % des Netzes genutzt wird, fordern wir Daten zur Nutzung an. -- Auf dieser Grundlage wird für das Produkt der Aspekt "Diverse Clients" bewertet. +- Wie viel Prozent der Betreiber von Blockchain-Knoten führen einen mehrheitlich genutzten Konsensebenen-Client (CL) aus? +- Zum Zeitpunkt der letzten Bearbeitung ist Prysm der Konsensebenen-Client, der von der Mehrheit der Betreiber von Blockchain-Knoten ausgeführt wird, was für das Netzwerk gefährlich ist. Wenn ein CL-Client derzeit von über 33 % des Netzwerks verwendet wird, fordern wir Daten zu seiner Nutzung an. +- Dies wird verwendet, um den „Client-Vielfalt“-Score (Diverse-Clients-Score) des Produkts zu bestimmen. -### Weitere Kriterien: optionale Aspekte {#other-criteria} +### Weitere Kriterien: Nice-to-haves {#other-criteria} **Welche Benutzeroberflächen werden unterstützt?** -- z. B. Browser-Anwendung, Desktop-Anwendung, mobile Anwendung, CLI +- d. h. Browser-App, Desktop-App, Mobile-App, CLI -**Bietet die Software für das Knoten-Tooling eine einfache Möglichkeit, zwischen den Clients zu wechseln?** +**Bietet die Software bei Blockchain-Knoten-Tools eine einfache Möglichkeit, zwischen Anwendungen zu wechseln?** -- Kann der Benutzer mit dem Tool einfach und sicher zwischen Clients wechseln? +- Kann der Nutzer mit dem Tool einfach und sicher die Anwendungen wechseln? -**Bei SaaS: Wie viele Validatoren werden derzeit von dem Service betrieben?** +**Wie viele Validatoren werden bei SaaS derzeit von dem Dienst betrieben?** -- Das gibt uns einen Eindruck von der bisherigen Reichweite Ihres Services. +- Dies gibt uns eine Vorstellung von der bisherigen Reichweite Ihres Dienstes. -## So erfolgt die Anzeige von Ergebnissen {#product-ordering} +## Wie wir Ergebnisse anzeigen {#product-ordering} -Die [Kriterien für die Aufnahme](#criteria-for-inclusion) werden verwendet, um eine kumulative Punktzahl für jedes Produkt oder jeden Service zu berechnen. Das dient dazu, Produkte, die bestimmte objektive Kriterien erfüllen, zu sortieren und zu präsentieren. Je mehr Kriterien belegt werden, desto höher fällt die Bewertung eines Produkts aus. Gleichstände werden dabei nach dem Zufallsprinzip gewertet. +Die oben genannten [Kriterien für die Aufnahme](#criteria-for-inclusion) werden verwendet, um einen kumulativen Score für jedes Produkt oder jeden Dienst zu berechnen. Dies dient als Mittel zum Sortieren und Präsentieren von Produkten, die bestimmte objektive Kriterien erfüllen. Je mehr Kriterien nachgewiesen werden, desto höher wird ein Produkt einsortiert, wobei bei Gleichstand beim Laden eine zufällige Reihenfolge gewählt wird. Die Codelogik und die Gewichtungen für diese Kriterien sind derzeit in [dieser JavaScript-Komponente](https://github.com/ethereum/ethereum-org-website/blob/dev/src/components/Staking/StakingProductsCardGrid/index.tsx#L350) in unserem Repo enthalten. -## Ihr Produkt oder Ihren Service hinzufügen {#add-product} +## Fügen Sie Ihr Produkt oder Ihren Dienst hinzu {#add-product} -Wenn Sie ein Staking-Produkt oder einen Staking-Service zu ethereum.org hinzufügen möchten, erstellen Sie einen Eintrag auf GitHub. +Wenn Sie ein Staking-Produkt oder einen Staking-Dienst zu ethereum.org hinzufügen möchten, erstellen Sie ein Issue auf GitHub. - Eintrag erstellen - + Issue erstellen + \ No newline at end of file diff --git a/public/content/translations/de/contributing/adding-wallets/index.md b/public/content/translations/de/contributing/adding-wallets/index.md index 3562146eab2..e7afe45ec36 100644 --- a/public/content/translations/de/contributing/adding-wallets/index.md +++ b/public/content/translations/de/contributing/adding-wallets/index.md @@ -1,75 +1,81 @@ --- -title: Wallets hinzufügen -description: Richtlinien, die wir verwenden, wenn wir eine Wallet zu ethereum.org hinzufügen +title: "Wallets hinzufügen" +description: "Die Richtlinie, die wir beim Hinzufügen einer Wallet zu ethereum.org anwenden" lang: de --- # Wallets hinzufügen {#adding-wallets} -Wir wollen sicherstellen, dass wir eine Vielzahl von Wallets zeigen, die die funktionsreiche Landschaft der Wallets abdecken, so dass die Nutzer sich sicher auf Ethereum bewegen können. +Wir möchten sicherstellen, dass wir eine Vielzahl von Wallets zeigen, die die funktionsreiche Landschaft der Wallets abdecken, damit Benutzer sicher in Ethereum navigieren können. -Jeder kann einen Vorschlag zum Hinzufügen einer Wallet auf ethereum.org machen. Sollten wir eine Wallet übersehen haben, schlagen Sie sie bitte vor! +Jeder kann vorschlagen, eine Wallet auf ethereum.org hinzuzufügen. Wenn wir eine Wallet übersehen haben, schlage sie bitte vor! -Jeder kann eine neue Wallet vorschlagen. Wallets sind derzeit hier aufgelistet: +Wallets sind derzeit hier aufgelistet: - [ethereum.org/wallets/find-wallet/](/wallets/find-wallet/) -- [ethereum.org/wallets/](/wallets/) -Wallets verändern sich auf Ethereum rasch. Wir haben versucht, ein gerechtes Framework für Überlegungen auf ethereum.org zu schaffen. Allerdings werden sich die Kriterien für die Auflistung im Laufe der Zeit verändern und weiterentwickeln. +Wallets verändern sich in Ethereum rasant. Wir haben versucht, einen fairen Rahmen für die Berücksichtigung auf ethereum.org zu schaffen, aber die Kriterien für die Auflistung werden sich im Laufe der Zeit ändern und weiterentwickeln. ## Der Entscheidungsrahmen {#the-decision-framework} -### Aufnahmekriterien: die Must-haves {#the-must-haves} - -- **Ein sicherheitsgeprüftes Produkt** – ob durch ein Audit, ein internes Sicherheitsteam, einen offenen Source-Code oder eine andere Methode, die Sicherheit Ihrer Wallet muss zuverlässig sein. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen für die Ernsthaftigkeit eines Produkts. -- **Eine Wallet, die seit mehr als sechs Monaten "live" ist ODER von einer Gruppe mit einer seriösen Erfolgsbilanz herausgegeben wurde** – das ist ein weiterer Hinweis auf Sicherheit. Sechs Monate sind ein guter Zeitraum, in dem kritische Fehler und Sicherheitslücken gefunden werden könnten. Wir bitten um sechs Monate, um Forks herauszufiltern, die schnell als Projekte aufgegeben werden. -- **Bearbeitung durch ein aktives Team** – das trägt dazu bei, die Qualität zu gewährleisten und sicherzustellen, dass ein Nutzer Unterstützung für seine Fragen erhält. -- **Ehrliche und genaue Angaben**: Es wird erwartet, dass alle vorgeschlagenen Projektangebote ehrliche und genaue Angaben enthalten. Produkte, die falsche Angaben machen, z. B. Ihr Produkt als "Open Source" deklarieren, obwohl es das nicht ist, werden entfernt. -- **Ansprechpartner** – Ein Ansprechpartner für die Wallet hilft uns erheblich, genaue Informationen zu erhalten, wenn Änderungen vorgenommen werden. Somit bleibt die Aktualisierung von ethereum.org bei der Erfassung künftiger Informationen überschaubar. - -### Weitere Kriterien: optionale Aspekte {#the-nice-to-haves} - -- **Globaler Zugang** – Ihre Wallet hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu Ihrem Service ausschließen. -- **Verfügbarkeit in mehreren Sprachen** – Ihre Wallet wird in mehrere Sprachen übersetzt, so dass Nutzer auf der ganzen Welt darauf zugreifen können. -- **Open source** – die gesamte Code-Basis Ihres Projekts (nicht nur die Module) sollte zugänglich sein und Sie sollten PRs von der größeren Gemeinschaft akzeptieren. -- **Keine Verwahrung** – Nutzer kontrollieren ihr Geld. Wenn Ihr Produkt verschwindet, können die Nutzer weiterhin auf ihr Guthaben zugreifen und es bewegen. -- **Unterstützung von Hardware-Wallets** – Nutzer können ihre Hardware-Wallets anschließen, um Transaktionen zu signieren. -- **WalletConnect** – Nutzer können sich über WalletConnect mit dApps verbinden. -- **Importieren von Ethereum RPC-Endpunkten** – Benutzer können Knoten-RPC-Daten importieren, so dass sie sich mit einem Knoten ihrer Wahl oder anderen EVM-kompatiblen Netzwerken verbinden können. -- **NFTs** – Nutzer können ihre NFTs in der Wallet einsehen und mit ihnen interagieren. -- **Verbindung zu Ethereum-Anwendungen** – Nutzer können sich mit Ethereum-Anwendungen verbinden und diese nutzen. -- **Staking** – Nutzer können ihre Investitionen direkt über die Wallet tätigen. -- **Swaps** – Nutzer können Token über die Wallet tauschen. -- **Multichain-Netzwerke** – Ihre Wallet unterstützt standardmäßig den Zugriff auf mehrere Blockchain-Netzwerke. -- **Layer-2-Netzwerke** – Ihre Wallet unterstützt standardmäßig den Zugang zu Layer-2-Netzwerken. -- **Anpassen der Gasgebühren** – Ihre Wallet ermöglicht es den Nutzern, die Gasgebühren für ihre Transaktionen anzupassen (Grundgebühr, Prioritätsgebühr, maximale Gebühr). -- **ENS-Unterstützung** – Ihre Wallet erlaubt es Benutzern, Transaktionen an ENS-Namen zu senden. -- **ERC-20-Unterstützung** – Ihre Wallet ermöglicht es Nutzern, ERC-20-Token-Verträge zu importieren, oder ERC-20-Token automatisch abzufragen und anzuzeigen. -- **EIP-1559 (Typ 2)-Transaktionen** – Ihre Wallet unterstützt EIP-1559 (Typ 2)-Transaktionen. -- **Krypto kaufen** – Ihre Wallet unterstützt Nutzer beim direkten Kauf und Onboarding von Krypto. -- **Verkauf für Geldwerte** – Ihre Wallet unterstützt den Verkauf und die Abhebung von Geldwerten direkt auf eine Karte oder ein Bankkonto. -- **Multisig** – Ihre Wallet unterstützt mehrere Signaturen, um eine Transaktion zu signieren. -- **Social Recovery** – Ihre Wallet unterstützt Guardians und ein Nutzer kann seine Wallet mithilfe dieser Guardians wiederherstellen, wenn er seine Seed-Phrase verliert. -- **Eigenes Support-Team** – Ihre Wallet hat ein eigenes Support-Team, an das sich die Nutzer bei Problemen wenden können. -- **Lehrreiche Ressourcen/Dokumentation** – Ihr Produkt sollte über ein gut gestaltetes Onboarding-System verfügen, um den Benutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. +### Kriterien für die Aufnahme: die Must-haves {#the-must-haves} + +- **Ein sicherheitsgeprüftes Produkt** – ob durch ein Audit, ein internes Sicherheitsteam, Open-Source-Code oder eine andere Methode, die Sicherheit deiner Wallet muss zuverlässig sein. Dies verringert das Risiko für unsere Benutzer und zeigt uns, dass du Sicherheit ernst nimmst. +- **Eine Wallet, die seit über sechs Monaten „live“ ist ODER von einer Gruppe mit einer seriösen Erfolgsbilanz veröffentlicht wurde** – dies ist ein weiteres Indiz für Sicherheit. Sechs Monate sind ein guter Zeitrahmen, um kritische Fehler und Schwachstellen zu finden. Wir verlangen sechs Monate, um Forks herauszufiltern, die als Projekte schnell wieder aufgegeben werden. +- **Wird von einem aktiven Team bearbeitet** – dies trägt zur Qualitätssicherung bei und stellt sicher, dass ein Benutzer Unterstützung bei seinen Anfragen erhält. +- **Ehrliche und genaue Informationen zum Eintrag** – es wird erwartet, dass alle vorgeschlagenen Einträge von Projekten mit ehrlichen und genauen Informationen versehen sind. Produkte, die Informationen zum Eintrag fälschen, wie z. B. die Angabe, dass dein Produkt „Open Source“ ist, obwohl dies nicht der Fall ist, werden entfernt. +- **Ansprechpartner** – Ein Ansprechpartner für die Wallet wird uns sehr helfen, genaue Informationen zu erhalten, wenn Änderungen vorgenommen werden. Dies hält die Aktualisierung von ethereum.org bei der zukünftigen Informationsbeschaffung überschaubar. +- **EIP-1559 (Typ 2) Transaktionen** – deine Wallet muss EIP-1559 (Typ 2) Transaktionen für Transaktionen im Ethereum-Mainnet unterstützen. +- **Gute Benutzererfahrung** – Obwohl UX subjektiv ist, behalten wir uns das Recht vor, die Wallet abzulehnen, wenn mehrere Kernteammitglieder das Produkt testen und es als schwierig zu bedienen empfinden. Stattdessen werden wir nützliche Verbesserungsvorschläge machen. Dies geschieht zum Schutz unserer Benutzerbasis, die hauptsächlich aus Anfängern besteht. +- **Fokus auf Ethereum** – Eine Wallet muss in erster Linie eine auf Ethereum ausgerichtete Erfahrung bieten. Das bedeutet, dass Ethereum (oder eine beliebige Ebene 2) als Standardnetzwerk festgelegt ist, ERC-Assets ordnungsgemäß unterstützt werden und die Funktionen auf das Ethereum-Ökosystem abgestimmt sind. Wallets, die in der Benutzeroberfläche alternative Layer 1 priorisieren, werden nicht aufgelistet. + +### Produktentfernungen {#product-removals} + +- **Aktualisierte Informationen** – Wallet-Anbieter sind dafür verantwortlich, ihre Wallet-Informationen alle 6 Monate erneut einzureichen, um die Gültigkeit und Relevanz der bereitgestellten Informationen sicherzustellen (auch wenn es keine Änderungen an ihrem Produkt gibt). Wenn das Produktteam dies versäumt, kann ethereum.org das Projekt von der Seite entfernen. + +### Weitere Kriterien: die Nice-to-haves {#the-nice-to-haves} + +- **Weltweit zugänglich** – deine Wallet hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugriff auf deinen Dienst ausschließen. +- **In mehreren Sprachen verfügbar** – deine Wallet ist in mehrere Sprachen übersetzt, sodass Benutzer auf der ganzen Welt darauf zugreifen können. +- **Open Source** – die Codebasis deines gesamten Projekts (nicht nur Module) sollte zugänglich sein und du solltest PRs aus der breiteren Community akzeptieren. +- **Nicht-verwahrend (Non-custodial)** – Benutzer kontrollieren ihr Geld. Wenn dein Produkt verschwindet, können Benutzer weiterhin auf ihr Geld zugreifen und es bewegen. +- **Unterstützung für Hardware-Wallets** – Benutzer können ihre Hardware-Wallet anschließen, um Transaktionen zu signieren. +- **WalletConnect** – Benutzer können sich über WalletConnect mit Dapps verbinden. +- **Importieren von Ethereum-RPC-Endpunkten** – Benutzer können RPC-Daten von Blockchain-Knoten importieren, sodass sie sich mit einem Blockchain-Knoten ihrer Wahl oder anderen EVM-kompatiblen Netzwerken verbinden können. +- **NFTs** – Benutzer können ihre NFTs in der Wallet anzeigen und mit ihnen interagieren. +- **Verbindung zu Ethereum-Anwendungen** – Benutzer können sich mit Ethereum-Anwendungen verbinden und diese nutzen. +- **Staking** – Benutzer können direkt über die Wallet Staking betreiben. +- **Tauschen (Swaps)** – Benutzer können Token über die Wallet tauschen. +- **Multichain-Netzwerke** – deine Wallet unterstützt standardmäßig den Zugriff von Benutzern auf mehrere Blockchain-Netzwerke. +- **Ebene-2-Netzwerke** – deine Wallet unterstützt standardmäßig den Zugriff von Benutzern auf Ebene-2-Netzwerke. +- **Gasgebühren anpassen** – deine Wallet ermöglicht es Benutzern, ihre Transaktions-Gasgebühren anzupassen (Grundgebühr, Prioritätsgebühr, maximale Gebühr). +- **ENS-Unterstützung** – deine Wallet ermöglicht es Benutzern, Transaktionen an ENS-Namen zu senden. +- **ERC-20-Unterstützung** – deine Wallet ermöglicht es Benutzern, ERC-20-Token-Verträge zu importieren, oder fragt ERC-20-Token automatisch ab und zeigt sie an. +- **Krypto kaufen** – deine Wallet unterstützt Benutzer beim direkten Kauf und Einstieg in Krypto. +- **Verkauf gegen Fiat** – deine Wallet unterstützt Benutzer beim Verkauf und der Auszahlung in Fiat direkt auf eine Karte oder ein Bankkonto. +- **Mehrfachsignatur** – deine Wallet unterstützt mehrere Signaturen zum Signieren einer Transaktion. +- **Soziale Wiederherstellung** – deine Wallet unterstützt Wächter (Guardians) und ein Benutzer kann seine Wallet mithilfe dieser Wächter wiederherstellen, wenn er seine Seed-Phrase verliert. +- **Dediziertes Support-Team** – deine Wallet verfügt über ein dediziertes Support-Team, an das sich Benutzer bei Problemen wenden können. +- **Bildungsressourcen/Dokumentation** – dein Produkt sollte über eine gut gestaltete Onboarding-Erfahrung verfügen, um Benutzern zu helfen und sie zu schulen. Oder Nachweise von How-to-Inhalten wie Artikeln oder Videos. ## Eine Wallet hinzufügen {#adding-a-wallet} -Wenn Sie eine Wallet zu ethereum.org hinzufügen möchten, erstellen Sie ein Ticket auf GitHub. +Wenn du eine Wallet zu ethereum.org hinzufügen möchtest, erstelle ein Issue auf GitHub. - Ein Thema erstellen + Ein Issue erstellen ## Wartung {#maintenance} -Ethereum befindet sich in der Entwicklung. Daher kommen und gehen Teams und Produkte und Innovationen finden täglich statt, so dass wir unsere Inhalte regelmäßig überprüfen: +Aufgrund der dynamischen Natur von Ethereum kommen und gehen Teams und Produkte, und Innovationen finden täglich statt. Daher werden wir routinemäßige Überprüfungen unserer Inhalte durchführen, um: -- Sicherstellen, dass alle aufgeführten Wallets und dApps weiterhin unsere Kriterien erfüllen -- Überprüfen, ob Produkte vorgeschlagen wurden, die unsere Kriterien besser erfüllen als die derzeit aufgeführten +- sicherzustellen, dass alle aufgelisteten Wallets und Dapps weiterhin unsere Kriterien erfüllen +- zu überprüfen, ob keine Produkte vorgeschlagen wurden, die mehr unserer Kriterien erfüllen als die derzeit aufgelisteten + +ethereum.org wird von der Open-Source-Community gepflegt und wir verlassen uns auf die Community, um dies auf dem neuesten Stand zu halten. Wenn dir Informationen zu aufgelisteten Wallets auffallen, die aktualisiert werden müssen, [erstelle bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) oder einen [Pull Request](https://github.com/ethereum/ethereum-org-website/pulls)! -Ethereum.org wird von der Open-Source-Community gepflegt; wir sind auf die Hilfe der Community angewiesen, um diese Seite auf dem neuesten Stand zu halten. Wenn Ihnen Informationen zu den aufgelisteten Wallets auffallen, die aktualisiert werden müssen, öffnen Sie bitte [ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) oder [Pull Request](https://github.com/ethereum/ethereum-org-website/pulls)! ## Nutzungsbedingungen {#terms-of-use} -Bitte beachten Sie auch unsere[Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. +Bitte beachte auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. \ No newline at end of file diff --git a/public/content/translations/de/contributing/content-resources/index.md b/public/content/translations/de/contributing/content-resources/index.md index 4120f3ee93d..b74459210b4 100644 --- a/public/content/translations/de/contributing/content-resources/index.md +++ b/public/content/translations/de/contributing/content-resources/index.md @@ -1,32 +1,32 @@ --- -title: Inhaltsressourcen hinzufügen +title: "Hinzufügen von Inhaltsressourcen" lang: de -description: Unsere Kriterien für die Auflistung von Inhaltsressourcen auf ethereum.org +description: "Unsere Kriterien für die Auflistung von Inhaltsressourcen auf ethereum.org" --- -# Inhaltsressourcen hinzufügen {#adding-content-resources} +# Hinzufügen von Inhaltsressourcen {#adding-content-resources} -Ethereum vollständig abzubilden, ist wegen des Umfangs nicht möglich. Daher versuchen wir, einige der großartigen Artikel, Tutorials, Newsletter, Jobbörsen und verschiedene Inhaltsressourcen vorzustellen, die die Community erstellt. Sie bieten oft tiefergreifende Informationen zu Themen, die für die Nutzer von Interesse sind. +Wir können unmöglich alles rund um Ethereum abdecken, daher versuchen wir, einige der brillanten Artikel, Tutorials, Newsletter, Jobbörsen und verschiedenen Inhaltsressourcen zu präsentieren, die die Community erstellt. Diese bieten oft tiefergehende Informationen zu Themen, an denen Benutzer interessiert sein könnten. -Wenn Sie eine Ressource kennen, die Ihrer Meinung nach nützlich ist, können Sie sie an geeigneter Stelle zur Hinzufügung vorschlagen. +Wenn es eine Inhaltsressource gibt, von der Sie der Meinung sind, dass sie zu einer Seite hinzugefügt werden sollte, können Sie diese gerne an einer geeigneten Stelle vorschlagen. -## Die Entscheidungsfindung {#how-we-decide} +## Wie wir entscheiden {#how-we-decide} -Die Lernressourcen werden anhand der folgenden Kriterien bewertet: +Lernressourcen werden nach den folgenden Kriterien bewertet: -- Ist der Inhalt auf dem neuesten Stand? -- Befindet sich der Inhalt hinter einer Bezahlschranke? -- Sind die Informationen korrekt? Werden Tatsachen oder Meinungen präsentiert? -- Ist der Autor glaubwürdig? Werden Quellen angegeben? -- Bietet dieser Inhalt einen eindeutigen Mehrwert, der von bestehenden Ressourcen/Links nicht abgedeckt wird? -- Ist der Inhalt für eine unserer [Nutzergruppen](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c) nützlich? +- Ist der Inhalt aktuell? +- Befindet sich der Inhalt hinter einer Paywall? +- Sind die Informationen korrekt? Sind sie sachlich oder meinungsbasiert? +- Ist der Autor glaubwürdig? Verweist er auf seine Quellen? +- Bietet dieser Inhalt einen deutlichen Mehrwert, der von bestehenden Ressourcen/Links nicht abgedeckt wird? +- Bedient dieser Inhalt eine unserer [Benutzer-Personas](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c)? --- -## Ihre Inhaltsressource hinzufügen {#add-your-content-resource} +## Fügen Sie Ihre Inhaltsressource hinzu {#add-your-content-resource} -Wenn Sie eine Inhaltsressource zu ethereum.org hinzufügen möchten und diese die Kriterien erfüllt, erstellen Sie einen Eintrag auf GitHub. +Wenn Sie eine Inhaltsressource zu ethereum.org hinzufügen möchten und diese die Kriterien erfüllt, erstellen Sie ein Issue auf GitHub. - Eintrag erstellen - + Issue erstellen + \ No newline at end of file diff --git a/public/content/translations/de/contributing/design-principles/index.md b/public/content/translations/de/contributing/design-principles/index.md index c00e6623998..2a2c569ef1e 100644 --- a/public/content/translations/de/contributing/design-principles/index.md +++ b/public/content/translations/de/contributing/design-principles/index.md @@ -1,93 +1,93 @@ --- -title: Designgrundsätze +title: Designprinzipien lang: de -description: Die Grundsätze hinter den Entscheidungen über Design und Inhalt von ethereum.org +description: Die Prinzipien hinter den Design- und Inhaltsentscheidungen von ethereum.org --- -# Unsere Designgrundsätze {#contributing-to-ethereumorg-} +# Unsere Designprinzipien {#contributing-to-ethereumorg-} - Hallo und herzlich willkommen bei den Designgrundsätzen für ethereum.org. Die Informationen sind Teil eines laufenden Prozesses zur Weiterentwicklung und Verbesserung von ethereum.org. + Hallo und willkommen bei den Designprinzipien für ethereum.org. Dies ist Teil eines fortlaufenden Prozesses zur Weiterentwicklung und Verbesserung von ethereum.org. -Unsere Grundsätze prägen das Erscheinungsbild der Website und den Inhalt. +Unsere Prinzipien prägen das Erscheinungsbild der Website und die darauf enthaltenen Inhalte. -Machen Sie sich mit den Informationen vertraut, bevor Sie einen [Beitrag zu ethereum.org](/contributing/) leisten. +Du solltest diese lesen, bevor du [zu ethereum.org beiträgst](/contributing/). -## Was sind Designgrundsätze? {#ways-to-contribute} +## Was sind Designprinzipien? {#ways-to-contribute} -Keine Sorge, das ist ziemlich einfach. **Designgrundsätze** sind eine Reihe von Richtlinien, auf die wir uns beziehen, wenn wir etwas entwerfen (d. h. erstellen, pflegen oder aktualisieren). +Keine Sorge, sie sind ziemlich einfach! **Designprinzipien** sind eine Reihe von Richtlinien, auf die wir uns beim Designen (d. h. beim Erstellen, Pflegen oder Aktualisieren) von etwas beziehen. -In Zusammenhang mit ethereum.org bilden diese Designgrundsätze die Basis für das, was wir mit der Website darstellen und der Welt zeigen wollen. Sie sind ambitioniert **und** funktional. Es geht nicht nur darum, wie die Website _aussieht_, sondern auch darum, wie sie _funktioniert_, und sogar darum, welche _Gefühle_ sie bei jemanden auslöst. Alles, von den Farben über die Seitenlayouts bis hin zur Art und Weise, wie wir auf der Website über Ethereum sprechen, sollte von diesen Grundsätzen geprägt sein. +Im Kontext von ethereum.org bilden diese Designprinzipien die Grundlage dafür, was die Website repräsentieren und der Welt vermitteln soll. Sie sind sowohl erstrebenswert **als auch** funktional. Es geht nicht nur darum, wie die Website _aussieht_, sondern auch darum, wie sie _funktioniert_ und sogar, welches _Gefühl_ sie bei jemandem auslöst. Alles, von den Farben über die Seitenlayouts bis hin zur Art und Weise, wie wir auf der Website über Ethereum sprechen, sollte von diesen Prinzipien geleitet sein. -## Die Grundsätze in der Praxis {#how-decisions-about-the-site-are-made} +## Die Prinzipien in der Praxis {#how-decisions-about-the-site-are-made} -Sehen wir uns ein Beispiel an. Einer der Grundsätze ist "Glaubwürdig". Das bedeutet, dass Besucher der Site von der Vertrauenswürdigkeit _überzeugt_ _sind_ – genau wie vom breiteren Ethereum-Ökosystem. Dieser Grundsätz gliedert sich in drei funktionale "Unterprinzipien", die wir als umsetzbar erachten, um die Glaubwürdigkeit der Website zu verbessern: +Schauen wir uns ein Beispiel an. Eines der Prinzipien ist „Glaubwürdig“, was bedeutet, dass wir möchten, dass Besucher der Website _fühlen_ und _wissen_, dass die Website vertrauenswürdig ist – genau wie das breitere Ethereum-Ökosystem. Innerhalb dieses Prinzips haben wir 3 funktionale „Unterprinzipien“, von denen wir glauben, dass sie umsetzbare Schritte sind, die wir ergreifen können, um die Website glaubwürdig zu machen: -- _"Frisch"_ d. h. Inhalte auf aktuellem Stand -- _"Sozial durchdacht"_ d. h. Darstellung der Größe, Vielfalt und Aktivität des Ökosystems (also Ethereum-Upgrade-Fortschritt, DeFi, Gaming, alle Hackathons usw.) -- _"Einheitlich"_ d. h. Konsistenz im Seitendesign und der Wortwahl sowie präzise Inhalte +- _„Aktuell“_ d. h., die Inhalte auf dem neuesten Stand halten. +- _„Social Proof“_ d. h., die Größe, Vielfalt und Aktivität des Ökosystems zeigen (du weißt schon: Fortschritt bei Ethereum-Upgrades, DeFi, Gaming, all die Hackathons usw.). +- _„Konsistent“_ d. h., Konsistenz im Design der Website sowie im Ton und in der Genauigkeit der Texte. -Wenn wir Entscheidungen in puncto Design oder Werbetexte tätigen, ziehen wir den Grundsatz "Glaubwürdigkeit" heran und stellen folgende Fragen: +Wenn wir also Design- oder Textentscheidungen treffen, können wir uns auf das Prinzip „Glaubwürdig“ beziehen und fragen: -- _"Gibt die Seite aktuelle Informationen wieder?"_ -- _"Wie und wo zeigen wir die Größe und Aktivität des Ökösystems?"_ -- _"Sind die vorgeschlagenen Beiträge eines Mitglieds der Community, die ich überprüfe, konsistent mit dem aktuellen Design und Inhalten auf der Seite?"_ +- _„Spiegelt die Website aktuelle Informationen wider?“_ +- _„Wie und wo zeigen wir die Größe und Aktivität des Ökosystems?“_ +- _„Sind die neu vorgeschlagenen Beiträge eines Community-Mitglieds, die ich überprüfe, konsistent mit dem aktuellen Design und den Texten auf der Website?“_ -## Designgrundsätze von ethereum.org {#contributors} +## Die Designprinzipien von ethereum.org {#contributors} ### 1. Inspirierend {#1-inspirational} -Die Seite sollte Nutzer dazu anregen, sich vorzustellen, welche Veränderungen Ethereum für die Welt brignen könnte. Menschen sollen sich motiviert fühlen, die Tools des Ethereum-Ökösystems zu erkunden, damit zu experimentieren und zu basteln. +Die Website sollte Nutzer dazu inspirieren, davon zu träumen, wie Ethereum die Welt verändern kann. Sie sollte Menschen motivieren, die Tools und Apps des Ethereum-Ökosystems zu erkunden, damit zu spielen und zu basteln. -- **Fundamental:** Die Seite sollte vermitteln, wie Ethereum ambitioniert versucht, die Welt zu verändern. Es sollte klar werden, dass Ethereum nicht nur eine weitere technische Errungenschaft ist, sondern eine transformative Technologie. -- **Fördern durch Bildung:** Die Informationen sollten so gestaltet sein, dass Besucher das Potenzial von Ethereum verstehen, einen Platz im Ökösystem finden und sich befähigt fühlen, sich zu beteiligen. +- **Radikal:** Die Website sollte die ehrgeizigen Ziele von Ethereum kommunizieren, die Welt bedeutsam zu verändern. Es sollte klar sein, dass Ethereum nicht nur ein neuer Tech-Stack ist – es ist eine transformative Technologie. +- **Befähigung durch Bildung:** Die Website sollte Menschen aufklären, damit sie das Potenzial von Ethereum verstehen, ihren Platz im Ökosystem finden und sich befähigt fühlen, daran teilzunehmen. Visuelle Ausrichtung • Inhalt -### 2. Allgemein {#2-universal} +### 2. Universell {#2-universal} -Ethereum ist ein globales, dezentralisiertes Projekt und das zeigt sich auch in unserer Zielgruppe. Ziel ist es, die Site jedem zugänglich zu machen und die Kulturen der Welt zu begrüßen. +Ethereum ist ein globales, dezentralisiertes Projekt und unser Publikum spiegelt dies wider. Die Website sollte den Anspruch haben, für jeden zugänglich zu sein und sensibel für die vielen Kulturen der Welt zu sein. -- **Barrierefrei:** Die Site sollte Richtlinien zur Barrierefreiheit berücsichtigen, auch Anforderungen für Verbindungen mit geringer Bandbreite. -- **Einfach:** Die Site sollte einfach und unmissverständlich sein. Texte sollten so formuliert sein, dass sie nicht falsch interpretiert werden oder die Beteudung in der Übersetzung verloren gehen könnte. -- **Ethereum ist facettenreich:** Ethereum ist ein Projekt, eine Codebasis, eine Community und eine Vision. Ethereum ist für unterschiedliche Menschen aus verschiedenen Gründen wertvoll. Es gibt viele Möglichkeiten zur Beteiligung. +- **Zugänglich:** Die Website sollte den Richtlinien für Barrierefreiheit folgen – auch für Menschen mit langsamen Internetverbindungen. +- **Einfach:** Die Website sollte einfach und unmissverständlich sein. Texte sollten keine Sprache verwenden, die falsch interpretiert werden könnte oder bei der Übersetzung verloren geht. +- **Ethereum ist facettenreich:** Ethereum ist ein Projekt, eine Codebasis, eine Community und eine Vision. Ethereum ist für verschiedene Menschen aus unterschiedlichen Gründen wertvoll, und es gibt viele Möglichkeiten, sich zu beteiligen. -Schriftsystem • Benutzung der Farben • Optische Ausrichtung • Inhalt +Schriftsysteme • Farbverwendung • Visuelle Ausrichtung • Inhalt ### 3. Eine gute Geschichte {#3-a-good-story} -Die Website sollte eine gute Geschichte erzählen. Besucher sind auf einer Reise und der Inhalt, den Sie beitragen, ist ein Teil davon. Ihre Beiträge sollten sich mit einer klaren Erzählung einfügen: mit einem Anfang (Einleitung/Einstiegspunkt), Mittelteil (eine Reihe von Erkenntnissen und Einsichten) und ein Schlussteil (ein Link zu relevanten Ressourcen oder nächsten Schritten). +Die Website sollte wie eine gute Geschichte funktionieren. Besucher befinden sich auf einer Reise, und die Inhalte, die du beisteuerst, sind ein Teil davon. Deine Beiträge sollten in eine klare Erzählung passen: eine mit einem Anfang (Einführung/Einstiegspunkt), einer Mitte (Reihe von Erkenntnissen und Einblicken) und einem Ende (ein Link/Links zu relevanten Ressourcen oder nächsten Schritten). -- **Hierarchisch**: Eine klare hierarchische strukturierte Informationsarchitektur hilft den Besuchern von ethereum.org bei der Navigation durch die "Geschichte", die die Website erzählt, um ihre Ziele zu erreichen. -- **Ein Sprungbrett:** Wir sind ein Sprungbrett für alle, die nach Antworten suchen. Wir möchten die vielen, bereits vorhandenen Ressourcen nicht ersetzen. Wir geben eine Antwort und zeigen zuverlässige nächste Schritte auf. +- **Hierarchisch**: Eine klare, hierarchisch strukturierte Informationsarchitektur hilft Besuchern von ethereum.org, auf der Website „wie in einer Geschichte“ zu navigieren, während sie versuchen, ihre Ziele zu erreichen. +- **Ein Sprungbrett:** Wir sind ein Sprungbrett für jeden, der nach Antworten sucht. Wir wollen die vielen bereits existierenden Ressourcen nicht ersetzen oder ein Ersatz dafür werden. Wir geben eine Antwort und bieten zuverlässige nächste Schritte. -Benutzererfahrung • Inhalt +Nutzerreisen • Inhalt ### 4. Glaubwürdig {#4-credible} -Besucher sind entweder auf der Suche nach einem Einstieg in das Ethereum-Ökosystem oder sie stehen der Sache skeptisch gegenüber. Seien Sie sich dieser Verantwortung bewusst und kommunizieren Sie in einer entsprechenden Art und Weise. Stellen Sie sicher, dass die Inhalte das Vertrauen der Besucher in das Ethereum-Ökosystem stärken. +Menschen suchen vielleicht nach ihrem Einstieg in das Ethereum-Ökosystem oder sie sind Skeptiker. Erkenne diese Verantwortung in deiner Kommunikation an. Stelle sicher, dass beide mit größerem Vertrauen in das Ethereum-Ökosystem gehen. -- **Neu:** immer auf aktuellem Stand. -- **Soziale durchdacht:** Stellen Sie die Größe, Vielfalt und Aktivität des Ökösystems dar. -- **Konsistenz:** einheitlich im Desing und glaubwürdige Inhalte. +- **Aktuell:** Immer auf dem neuesten Stand. +- **Social Proof:** Zeige die Größe, Vielfalt und Aktivität des Ökosystems. +- **Konsistent:** Konsistenz in Design und Inhalt vermittelt Glaubwürdigkeit. -Gestaltung • Inhalt +Visuelle Ausrichtung • Inhalt -### 5. Gemeinsame Verbesserung {#5-collaborative-improvement} +### 5. Kollaborative Verbesserung {#5-collaborative-improvement} -Die Website ist ein Produkt von vielen Mitwirkenden, genau wie das ganze Ökösystem. +Die Website ist das Produkt vieler Mitwirkender, genau wie das Ökosystem als Ganzes. -- **Offen:** Stellen sie die Transparenz in den Vordergrund, die den Source Code, die Prozesse und Projekte kennzeichnet und sich durch das ganze Ökösystem zieht. -- **Erweiterbar:** Das Baukastensystem ist ein zentraler Aspekt, der alles prägt, as wir tun. Mitwirkende sollen diesen Anspruch ebenfalls berücksichtigen. Das Kerndesign, Codekomponenten und Implementatierungen der Site sollten für die Zukunft möglichst austauschbar sein. -- **Experimentell:** Wir experiementieren, testen und iterieren fortlaufend. -- **Gemeinschaftlich:** Das Projekt bringt uns alle zusammen. -- **Nachhaltig:** Treffen Sie Vorbereitungen für die langfristige Verwaltung durch die Community. +- **Offen:** Feiere die Transparenz von Quellcode, Prozessen und Projekten im gesamten Ökosystem. +- **Erweiterbar:** Modularität ist ein Hauptfokus bei allem, was wir tun, und daher sollten auch Beiträge modular sein. Das Kerndesign, der Komponentencode und die Implementierung der Website sollten es ermöglichen, sie in Zukunft leicht zu erweitern. +- **Experimentell:** Wir experimentieren, testen und iterieren ständig. +- **Kollaborativ:** Dieses Projekt bringt uns alle zusammen. +- **Nachhaltig:** Vorbereitung auf eine langfristige Pflege durch die Community. -Sie können unsere Designgrundsätze in Aktion sehen, und zwar [überall auf unserer Site](/). +Du kannst unsere Designprinzipien [auf unserer gesamten Website](/) in Aktion sehen. -## Wir sind an Feedback interessiert {#give-feedback} +## Gib Feedback {#give-feedback} -**Teilen Sie uns Ihr Feedback zu diesem Dokument mit.** Einer unserer Grundsätze ist "**Gemeinsame Verbesserung**" und das bedeutet, dass die Website ein Produkt aus der Beteiligung vieler Mitwirkenden ist. Daher möchen wir diese Designgrundsätze mit der Ethereum-Community teilen. +**Teile dein Feedback zu diesem Dokument!** Eines unserer vorgeschlagenen Prinzipien ist „**Kollaborative Verbesserung**“, was bedeutet, dass wir möchten, dass die Website das Produkt vieler Mitwirkender ist. Im Sinne dieses Prinzips möchten wir diese Designprinzipien mit der Ethereum-Community teilen. -Obwohl diese Grundsätze auf die ethereum.org-Website ausgerichtet sind, hoffen wir, dass große Teile davon repräsentativ für die Werte des Ethereum-Ökosystems insgesamt stehen. Vielleicht möchten Sie sogar einige davon für Ihr eigenes Projekt berücksichtigen. +Obwohl sich diese Prinzipien auf die Website ethereum.org konzentrieren, hoffen wir, dass viele von ihnen repräsentativ für die Werte des gesamten Ethereum-Ökosystems sind. Vielleicht möchtest du sogar einige davon in dein eigenes Projekt integrieren! -Teilen Sie uns Ihre Gedanken mit auf unserem [Discord-Server](https://discord.gg/ethereum-org) oder indem Sie [ein Thema erstellen](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). +Lass uns deine Gedanken auf unserem [Discord-Server](https://discord.gg/ethereum-org) wissen oder indem du [ein Issue erstellst](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). \ No newline at end of file diff --git a/public/content/translations/de/contributing/design/adding-design-resources/index.md b/public/content/translations/de/contributing/design/adding-design-resources/index.md index 6cc547b3500..c719e265d0c 100644 --- a/public/content/translations/de/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/de/contributing/design/adding-design-resources/index.md @@ -1,69 +1,69 @@ --- -title: Design-Ressourcen hinzufügen -description: Richtlinien und Anforderungen zur Gewährleistung der Qualität von Designmaterialien auf ethereum.org +title: "Design-Ressourcen hinzufügen" +description: "Richtlinien und Anforderungen zur Sicherstellung der Qualität von Design-Materialien auf ethereum.org" lang: de --- # Design-Ressourcen hinzufügen {#adding-design-resources} -Jeder kann neue Designmaterialien für die Seite [Design und UX in web3](/developers/docs/design-and-ux/) vorschlagen. +Jeder kann neue Design-Materialien für die Seite [Design und UX im Web3](/developers/docs/design-and-ux/) vorschlagen. -Seien Sie sich bewusst, dass der Schwerpunkt dieser Seite darauf liegt, angehenden web3-Designern einen Mehrwert zu bieten. Der Designbereich ist nicht dazu da, um für Ihre Dienstleistungen, Produkte oder Plattformen zu werben. +Bitte beachte, dass der Fokus dieser Seite darauf liegt, angehenden Web3-Designern einen Mehrwert zu bieten. Der Design-Bereich ist nicht dazu da, für deine Dienstleistungen, Produkte oder Plattformen zu werben. -Um sicherzustellen, dass wir einen hohen Informationsstandard aufrechterhalten und wertvolle Einblicke fördern, haben wir eine Listing-Policy eingeführt: +Um sicherzustellen, dass wir einen hohen Informationsstandard aufrechterhalten und wertvolle Erkenntnisse fördern, haben wir eine Auflistungsrichtlinie festgelegt: -## Research-Studien und Dashboards {#Research-studies} +## Forschungsstudien und Dashboards {#Research-studies} 1. Solide Methodik -a. Aus der Methodik sollte klar hervorgehen, wie die Daten erhoben wurden. +a. Die Methodik sollte klar definieren, wie die Daten erhoben wurden. -b. Die Anzahl der an der Untersuchung beteiligten Personen sollte angegeben werden. +b. Die Anzahl der an der Forschung beteiligten Teilnehmer sollte angegeben werden. -c. Die verwendeten Forschungsmethoden sollten beschrieben werden. +c. Die angewandten Forschungsmethoden sollten beschrieben werden. -2. Relevanz für Web3-Designer und allgemeine Designanwendungsfälle +2. Relevanz für Web3-Designer und gängige Design-Anwendungsfälle -a. Das Forschungsthema sollte für Web3-Designer relevant sein und gängige Designanwendungsfälle behandeln. +a. Das Thema der Forschung sollte für Web3-Designer relevant sein und gängige Design-Anwendungsfälle behandeln. -3. Fokus auf Erkenntnisgewinn +3. Fokus auf die Vermittlung von Erkenntnissen -a. Das primäre Ziel des Textes sollte die Vermittlung von Erkenntnissen sein und nicht die Werbung für ein bestimmtes Projekt oder Unternehmen. +a. Das Hauptziel des Textes sollte der Austausch von Erkenntnissen sein und nicht die Werbung für ein bestimmtes Projekt oder Unternehmen. ## Artikel {#Articles} -1. Relevanz für Web3-Designer/-Forscher und bekannte Web3-Designanwendungsfälle +1. Relevanz für Web3-Designer/-Forscher und gängige Web3-Design-Anwendungsfälle -a. Das Thema des Artikels sollte für Web3-Designer und -Forscher relevant sein und sich auf gängige Anwendungsfälle von Web3-Design konzentrieren. +a. Das Thema des Artikels sollte für Web3-Designer und -Forscher relevant sein und sich auf gängige Web3-Design-Anwendungsfälle konzentrieren. -2. Qualität der Beiträge +2. Grundlegende Schreibqualität a. Der Artikel sollte frei von Grammatik- und Rechtschreibfehlern sein. -b. Der Schwerpunkt sollte auf der Vermittlung der wichtigsten Erkenntnisse und Erfahrungen liegen. +b. Der Schwerpunkt sollte auf der Vermittlung von wichtigen Erkenntnissen und Lernerfahrungen liegen. -c. Der Text sollte prägnant und auf den Punkt gebracht sein. +c. Der Schreibstil sollte prägnant und auf den Punkt gebracht sein. 3. Ziel des Textes -a. Das Hauptziel des Artikels sollte die Vermittlung von Erkenntnissen und nicht die Werbung für ein bestimmtes Projekt oder Unternehmen sein. +a. Das Hauptziel des Artikels sollte der Austausch von Erkenntnissen sein und nicht die Werbung für ein bestimmtes Projekt oder Unternehmen. -## Communities/DAOs {#Communities-and-DAOs} +## Communitys / DAOs {#Communities-and-DAOs} 1. Die Website muss klar angeben, wie man der DAO/Community beitreten kann 2. Klare Vorteile der Mitgliedschaft -a. Die Vorteile einer Mitgliedschaft sollten an prominenter Stelle stehen. +a. Die Vorteile einer Mitgliedschaft sollten gut sichtbar dargestellt werden. **Beispiele**: Feedback zur Arbeit erhalten, Zugang zu Jobangeboten oder Bounties, Austausch von Design- und Forschungserkenntnissen. 3. Aktive und lebendige Kommunikation auf Discord -a. Die Discord-Community sollte sich durch eine lebendige und engagierte Kommunikation auszeichnen. +a. Die Discord-Community sollte eine lebendige und engagierte Kommunikation aufweisen. -b. Die Moderatoren sollten sich aktiv an der Pflege der Gemeinschaft beteiligen und Diskussionen leiten. +b. Moderatoren sollten aktiv an der Pflege der Community und der Moderation von Diskussionen beteiligt sein. -c. Die Community sollte in den letzten zwei Wochen wertvolle und produktive Unterhaltungen geführt haben. +c. Die Community sollte in den letzten zwei Wochen eine Erfolgsbilanz wertvoller und produktiver Gespräche vorweisen können. -Durch die Einhaltung dieser Kriterien wollen wir ein lebendiges und lehrreiches Umfeld innerhalb unserer Gemeinschaft fördern. Wir sind davon überzeugt, dass diese Zulassungsrichtlinie unseren Nutzern den Zugang zu zuverlässigen, relevanten und aufschlussreichen Ressourcen ermöglicht. Wir danken Ihnen für Ihr Verständnis und Ihre Mitarbeit bei der Aufrechterhaltung der Qualität der Inhalte auf unserer Plattform. +Durch die Einhaltung dieser Kriterien möchten wir ein florierendes und wissensaustauschendes Umfeld innerhalb unserer Community fördern. Wir glauben, dass diese Whitelisting-Richtlinie sicherstellt, dass unsere Nutzer Zugang zu zuverlässigen, relevanten und aufschlussreichen Ressourcen haben. Vielen Dank für dein Verständnis und deine Kooperation bei der Aufrechterhaltung der Inhaltsqualität auf unserer Plattform. \ No newline at end of file diff --git a/public/content/translations/de/contributing/design/index.md b/public/content/translations/de/contributing/design/index.md index 9a0bd796860..a3317625ce2 100644 --- a/public/content/translations/de/contributing/design/index.md +++ b/public/content/translations/de/contributing/design/index.md @@ -1,77 +1,77 @@ --- -title: Mitarbeit am Design -description: Mitarbeit am Design bei ethereum.org +title: "Design-Beiträge" +description: "Design-Beiträge zu ethereum.org" lang: de --- -# Mitarbeit am Design bei ethereum.org {#design-contributions} +# Design-Beiträge zu ethereum.org {#design-contributions} -Design ist ein wichtiger Bestandteil eines jeden Projekts. Wenn Sie Ihre Zeit und Ihre Design-Fähigkeiten für Ethereum.org einsetzen, können Sie dazu beitragen, die Benutzerfreundlichkeit für unsere Besucher zu verbessern. Die Mitarbeit an einem Open-Source-Projekt bietet Ihnen die Möglichkeit, relevante Erfahrungen zu sammeln und Ihre Fähigkeiten in einer kollaborativen Umgebung zu entwickeln. Sie werden die Chance haben, mit anderen Designern, Entwicklern und Community-Mitgliedern zusammenzuarbeiten, die alle ihre eigenen Perspektiven und Einsichten miteinbringen. +Design ist eine entscheidende Komponente jedes Projekts. Indem Sie Ihre Zeit und Ihre Designfähigkeiten für ethereum.org einsetzen, können Sie dazu beitragen, die Benutzererfahrung für unsere Besucher zu verbessern. Die Mitarbeit an einem Open-Source-Projekt bietet die Möglichkeit, relevante Erfahrungen zu sammeln und Ihre Fähigkeiten in einer kollaborativen Umgebung weiterzuentwickeln. Sie haben die Chance, mit anderen Designern, Entwicklern und Community-Mitgliedern zusammenzuarbeiten, die alle ihre eigenen einzigartigen Perspektiven und Erkenntnisse einbringen. -Letztendlich ist das eine großartige Möglichkeit, ein vielfältiges und beeindruckendes Portfolio aufzubauen, das Ihre Designfähigkeiten unter Beweis stellt. +Letztendlich ist dies eine großartige Möglichkeit, ein vielfältiges und beeindruckendes Portfolio aufzubauen, das Ihre Designfähigkeiten präsentiert. -## Wie kann ich etwas beitragen? +## Wie kann ich beitragen? -###  Geben Sie Feedback zu frühen Design-Prototypen {#design-critique} +###  Feedback zu frühen Design-Prototypen geben {#design-critique} -Manchmal brauchen wir Hilfe beim Testen unserer "rohen" Ideen. Das ist eine großartige Möglichkeit, auch ohne technische Kenntnisse einen Beitrag zu leisten. +Manchmal benötigen wir Hilfe beim Testen unserer ersten Ideen. Dies ist eine großartige Möglichkeit, ohne technisches Wissen einen Beitrag zu leisten. -1. Das Design-Team wird ein Mockup-Design auf [Discord](https://discord.com/invite/CetY6Y4) und auf [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) veröffentlichen. -2. Sie werden durch die Entwürfe geführt und können über die Kommentarfunktion Feedback geben. -3. Das Ergebnis wird in einem GitHub-Issue geteilt und dann vom Team abgeschlossen. +1. Das Design-Team teilt einen Mockup-Entwurf auf [Discord](https://discord.com/invite/ethereum-org) und auf [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). +2. Sie werden durch die Designs geführt, um über die Kommentarfunktion Feedback zu geben. +3. Das Ergebnis wird im GitHub-Issue geteilt und anschließend vom Team geschlossen. -###  Teilnahme an Umfragen {#answer-surveys} +###  An Umfragen teilnehmen {#answer-surveys} -Geben Sie Feedback zu unserer Website: +Geben Sie Feedback zu unserer Website, indem Sie: -1. Besuchen Sie ethereum.org und lesen Sie die Seiten durch. -2. Klicken Sie auf das Feedback-Widget in der rechten unteren Ecke und beantworten Sie Fragen zum Design und zum Inhalt. -3. Konzentrieren Sie sich auf die Fragen zum freien Format. +1. ethereum.org besuchen und sich die Seiten durchlesen. +2. Auf das Feedback-Widget in der unteren rechten Ecke klicken und design- sowie inhaltsbezogene Fragen beantworten. +3. Sich auf die Freitextfragen konzentrieren. -###  Finden Sie designbezogene Probleme auf der Website und melden Sie diese. {#report-design-issues} +###  Designbezogene Probleme auf der Website finden und melden {#report-design-issues} -Ethereum.org ist eine schnell wachsende Website mit vielen Funktionen und Inhalten. Einige der Benutzeroberflächen können leicht veraltet sein oder verbessert werden. Wenn Ihnen ein solches Problem auffällt, melden Sie es bitte, damit wir darauf aufmerksam werden. +ethereum.org ist eine schnell wachsende Website mit vielen Funktionen und Inhalten. Teile der Benutzeroberfläche (UI) können leicht veralten oder könnten verbessert werden. Wenn Ihnen so etwas auffällt, melden Sie es bitte, damit wir darauf aufmerksam werden. -1. Gehen Sie durch die Website und achten Sie auf ihr Design. -2. Machen Sie Screenshots und Notizen, wenn Sie visuelle oder UX-Probleme sehen. -3. Melden Sie die gefundenen Probleme in einem [Fehlerbericht](https://github.com/ethereum/ethereum-org-website/issues/new/choose). +1. Gehen Sie die Website durch und achten Sie auf das Design. +2. Machen Sie Screenshots und Notizen, wenn Sie visuelle oder UX-Probleme feststellen. +3. Melden Sie die gefundenen Probleme über einen [Fehlerbericht (Bug Report)](https://github.com/ethereum/ethereum-org-website/issues/new/choose). ###  Designänderungen vorschlagen {#propose-design-changes} -Wenn Sie sich mit Design-Herausforderungen wohlfühlen, können Sie unser GitHub Issues Board besuchen und nach [designbezogenen Issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtern. +Wenn Sie sich bereit fühlen, Design-Herausforderungen anzunehmen, können Sie unser GitHub-Issues-Board besuchen und nach [designbezogenen Issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtern. -1. Schauen Sie sich unsere Website an und achten Sie auf das Design, oder gehen Sie zu unserem GitHub-Repository und überprüfen Sie Issues, die mit dem Tag ["Design required"](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) gekennzeichnet sind. -2. Machen Sie sich Gedanken über die Lösung und entwerfen Sie sie. (Idealerweise unter Verwendung unseres [Designsystems](https://www.figma.com/community/file/1134414495420383395)). -3. Schlagen Sie die Lösung in dem entsprechenden GitHub-Thema vor oder erstellen Sie ein [neues Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). -4. Warten Sie auf die Überprüfung durch das Designteam. +1. Gehen Sie unsere Website durch und achten Sie auf das Design oder besuchen Sie unser GitHub-Repository und überprüfen Sie Issues, die mit dem Tag [„Design required“](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) markiert sind. +2. Entwickeln Sie Ideen für die Lösung und entwerfen Sie diese (idealerweise unter Verwendung unseres [Design-Systems](https://www.figma.com/community/file/1134414495420383395)). +3. Schlagen Sie die Lösung im entsprechenden GitHub-Issue vor oder [erstellen Sie ein neues.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) +4. Warten Sie auf die Überprüfung durch das Design-Team. -###  Das Designsystem gemeinsam aufbauen {#Contribute-to-design-system} +###  Gemeinsam am Design-System bauen {#Contribute-to-design-system} -Mit unserem Designsystem macht das Entwerfen von ethereum.org Spaß und ist einfach. Wenn Sie ein erfahrener Designer sind, können Sie uns helfen, viele Komponenten für die Website vorzubereiten. +Unser Design-System macht das Entwerfen für ethereum.org einfach und unterhaltsam. Wenn Sie ein erfahrener Designer sind, können Sie uns helfen, viele Komponenten für die Website vorzubereiten. -1. Wählen Sie ein Thema aus dem [Design-System-Board](https://github.com/ethereum/ethereum-org-website/labels/design%20system) auf GitHub aus, an dem Sie arbeiten möchten, oder erstellen Sie ein neues. -2. Fordern Sie an, dass Ihnen das ausgewählte Thema zugewiesen wird. -3. Beginnen Sie mit dem Design der gewünschten Komponente in figma. -4. Teilen Sie es dem Designteam auf GitHub mit, sobald Sie eine Überprüfung oder Hilfe benötigen. -5. Das Designteam wird es dann überprüfen. -6. Das Designteam wird die Änderungen in die Hauptdatei einarbeiten und die Datei in der Community veröffentlichen. +1. Wählen Sie ein Issue zur Bearbeitung aus dem [Design-System-Board](https://github.com/ethereum/ethereum-org-website/labels/design%20system) auf GitHub aus oder erstellen Sie ein neues. +2. Bitten Sie darum, dass Ihnen das ausgewählte Issue zugewiesen wird. +3. Beginnen Sie mit dem Entwurf der angeforderten Komponente in Figma. +4. Teilen Sie es mit dem Design-Team auf GitHub, sobald Sie eine Überprüfung oder Anleitung benötigen. +5. Das Design-Team wird es überprüfen. +6. Das Design-Team wird die Änderungen in die Hauptdatei übernehmen und die Datei für die Community veröffentlichen. -###  Verfassen Sie designbezogene Inhalte auf der Website. {#write-design-articles} +###  Designbezogene Inhalte für die Website schreiben {#write-design-articles} -Die Ethereum-Entwickler-Community ist stark, aber die Design-Community hinkt etwas hinterher. Wenn Sie ein Designer mit Web3-Kenntnissen sind, ziehen Sie bitte in Erwägung, Ihre Erkenntnisse mit der größeren Community zu teilen, damit wir alle gemeinsam wachsen und uns verbessern können; wir haben eine [Seite über Design für Ethereum](/developers/docs/design-and-ux/), zu der Sie beitragen können. Sie können auch unsere [Richtline zur Listung](/contributing/design/adding-design-resources) ansehen. +Die Ethereum-Entwickler-Community ist stark, aber die Design-Community hinkt etwas hinterher. Wenn Sie ein Designer mit Web3-Kenntnissen sind, ziehen Sie bitte in Betracht, Ihre Erkenntnisse mit der größeren Community zu teilen, damit wir alle gemeinsam wachsen und uns verbessern können; wir haben [eine Seite über das Designen für Ethereum](/developers/docs/design-and-ux/), zu der Sie beitragen können. Sie können auch unsere [Richtlinien für die Auflistung](/contributing/design/adding-design-resources) überprüfen. -1. Machen Sie sich Gedanken über Designthemen, die auf ethereum.org behandelt werden sollten und die für die Designer in diesem Bereich von Nutzen wären. -2. Gehen Sie zu unserem GitHub-Repository und [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new), um ein Thema vorzuschlagen (schreiben Sie den Inhalt noch nicht). -3. Warten Sie auf die Freigabe durch das Designteam. -4. Sobald die Anfrage genehmigt ist, schreiben Sie den Inhalt. -5. Reichen Sie ihn im entsprechenden GH-Thema ein. +1. Entwickeln Sie Ideen für Design-Themen, die auf ethereum.org behandelt werden sollten und für Designer in diesem Bereich von Nutzen wären. +2. Gehen Sie zu unserem GitHub-Repository und [erstellen Sie ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new), um ein Thema vorzuschlagen (schreiben Sie den Inhalt noch nicht). +3. Warten Sie auf die Genehmigung durch das Design-Team. +4. Sobald es genehmigt ist, schreiben Sie den Inhalt. +5. Reichen Sie ihn im entsprechenden GitHub-Issue ein. -###  Gestalten Sie neue Illustrationen. {#prepare-illustrations} +###  Neue Illustrationen zeichnen {#prepare-illustrations} -Visualisierungen sind eines der wirkungsvollsten Instrumente zur Erklärung abstrakter Themen. Der Einsatz von Diagrammen und Infografiken birgt ein enormes Potenzial. Schließlich kann ein Bild mehr als tausend Worte sagen. +Visualisierungen sind eines der mächtigsten Werkzeuge, um abstrakte Themen zu erklären. Es gibt ein enormes Potenzial durch das Hinzufügen von Diagrammen und Infografiken. Schließlich sagt ein Bild mehr als tausend Worte. 1. Gehen Sie auf unsere Website und suchen Sie nach Seiten, auf denen neue Infografiken hinzugefügt werden könnten. -2. Vergewissern Sie sich, dass der Illustrationsstil mit unseren [Assets](/assets/) übereinstimmt. -3. Gehen Sie zu unserem GitHub-Repository und [machen Sie einen Vorschlag](https://github.com/ethereum/ethereum-org-website/issues/new) für die Illustration. -4. Das Designteam wird sie dann prüfen. -5. Wir erstellen ein neues Thema, um einen Entwickler zu bitten, das neue Bild zu implementieren. +2. Stellen Sie sicher, dass der Illustrationsstil unseren [Assets](/assets/) entspricht. +3. Gehen Sie zu unserem GitHub-Repository und [erstellen Sie ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new), um die Illustration vorzuschlagen. +4. Das Design-Team wird es überprüfen. +5. Wir erstellen ein neues Issue, um einen Entwickler zu bitten, das neue Bild zu implementieren. \ No newline at end of file diff --git a/public/content/translations/de/contributing/index.md b/public/content/translations/de/contributing/index.md index 3c98d599e9c..8d6897a6c1c 100644 --- a/public/content/translations/de/contributing/index.md +++ b/public/content/translations/de/contributing/index.md @@ -1,65 +1,76 @@ --- title: Mitwirken -description: Mehr erfahren über die verschiedenen Wege, um einen Beitrag zu ethereum.org zu leisten +description: "Erfahren Sie mehr über die verschiedenen Möglichkeiten, wie Sie zu ethereum.org beitragen können" lang: de --- -# Mitwirken bei ethereum.org 🦄 {#contributing-to-ethereumorg} +# Mitwirken an ethereum.org 🦄 {#contributing-to-ethereumorg} -Die ethereum.org-Website, wie Ethereum im Großen und Ganzen, ist ein Open-Source-Projekt. Möchten Sie helfen, [den Zugang zu Ethereum zu verbessern](/about/), dann finden Sie hier Informationen, was Sie tun können. +Ethereum.org ist ein Open-Source-Projekt mit über **12.000** Mitwirkenden, die dabei helfen, die Website zu übersetzen, zu schreiben, zu gestalten und zu pflegen. - - - - - Beanspruchen Sie Ihren POAP-Token an. Haben Sie 2022 einen Beitrag zu ethereum.org geleistet, dann wartet ein einzigartiger POAP auf Sie.{" "}Mehr zu POAPs. - - - +Wir sind eine einladende Community, die Ihnen hilft, im [Ethereum](/)-Ökosystem zu wachsen und sich weiterzubilden, während Sie gleichzeitig einen sinnvollen Beitrag leisten und relevante praktische Erfahrungen sammeln können! -## Möglichkeiten zum Mitwirken {#ways-to-contribute} +## Möglichkeiten zur Mitwirkung {#ways-to-contribute} -- [Arbeiten an offenen Themen](https://github.com/ethereum/ethereum-org-website/issues) _ – Arbeit, die wir als notwendig erachten_ -- [Beitrag zum Überstzungsprogramm](/contributing/translation-program/)_ – Helfen Sie uns, ethereum.org in neuen Sprachen verfügbar zu machen_ -- [Hilfe bei der Gestaltung der Website](/contributing/design/) _ – Designer aller Stufen können zur Verbesserung der Website beitragen_ -- [Community-Ressourcen hinzufügen](/contributing/content-resources/) _ – Fügen Sie eine(n) hilfreiche(n) Artikel oder Ressource zu einer relevanten Seite hinzu_ -- [Produkt hinzufügen](/contributing/adding-products/) _ – Fügen Sie eine dApp oder eine Wallet zu einer relvanten Seite hinzu_ -- [Entwicklungstools hinzufügen](/contributing/adding-developer-tools/) _ – Fügen Sie Entwicklungstools zu einer relvanten Seite hinzu_ -- [Handelsplatz hinzufügen](/contributing/adding-exchanges/) _ – Fügen Sie einen Handelsplatz zu unserer [Börsensuche hinzu](/get-eth/#country-picker)_ -- [ Unsere Forschung verbessern](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c) _ – Geben Sie uns Feedback zu unserer Forschung oder betreiben Sie Ihre eigene_ -- [Ein Feature vorschlagen](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) _ – Lassen Sie uns wissen, wenn Sie irgendwelche Ideen für ein neues Feature oder Design haben_ -- [Glossarbegriff hinzufügen](/contributing/adding-glossary-terms) _ – Helfen Sie uns, das Ethereum-[Wörterbuch](/glossary/) zu vergrößern_ -- [Inhalt erstellen/bearbeiten](/contributing/#how-to-update-content) _ – Neue Seiten vorschlagen oder bereits vorhandene Seiten verbessern_ -- [Eine layer 2 hinzufügen](/contributing/adding-layer-2s/) _ – Eine Layer 2 einer relevanten Seite hinzufügen_ -- [Hinzufügen eines Staking-Produkts oder einer Dienstleistung](/contributing/adding-staking-products/)_ – Fügen Sie ein Projekt hinzu, das die Solo-, Pool-Staking oder Staking als Dienstleistung unterstützt._ -- [Ein Wallet hinzufügen](/contributing/adding-wallets/) _ – Eine Wallet zur Seite [der Wallet-Suche](/wallets/find-wallet/) hinzufügen_ -- [Schlagen Sie ein Projekt für unsere DeSci Seite vor](/contributing/adding-desci-projects/) _ – Fügen Sie ein Projekt hinzu, das auf Ethereum gebaut wurde und zur dezentralen Wissenschaft beiträgt_ -- [Quizfragen](/contributing/quizzes/) _ – Hinzufügen, Aktualisieren und Löschen von Quizfragen für eine bestimmte Seite_ -- [Designressourcen vorschlagen](/contributing/design/adding-design-resources/) _ – Hilfreiche Designressourcen hinzufügen, aktualisieren und löschen_ +**Übersetzungen** +- [Nehmen Sie am Übersetzungsprogramm teil](/contributing/translation-program/) – Helfen Sie uns, ethereum.org in neue Sprachen zu übersetzen -_Haben Sie Fragen?_ 🤔 Sie erreichen uns auf unserem [Discord-Server](https://discord.gg/ethereum-org). +**Entwicklung** +- [Arbeiten Sie an einem offenen Issue](https://github.com/ethereum/ethereum-org-website/issues) – Aufgaben, die wir identifiziert haben und die erledigt werden müssen -## So funktioniert die Arbeit an ethereum.org {#how-to-update-content} +**Design** +- [Helfen Sie bei der Gestaltung der Website](/contributing/design/) – Designer aller Erfahrungsstufen können dazu beitragen, die Website zu verbessern -Ganz gleich, ob Sie Inhalte zur Site hinzufügen, Inhalte erstellen oder an offenen Themen arbeiten, Sie benötigen ein[GitHub](https://github.com)-Konto. +**Inhalt** +- [Inhalte erstellen/bearbeiten](/contributing/#how-to-update-content) – Schlagen Sie neue Seiten vor oder nehmen Sie Anpassungen an bestehenden Inhalten vor +- [Community-Ressourcen hinzufügen](/contributing/content-resources/) – Fügen Sie einer relevanten Seite einen hilfreichen Artikel oder eine Ressource hinzu +- [Eine Design-Ressource vorschlagen](/contributing/design/adding-design-resources/) – Fügen Sie hilfreiche Design-Ressourcen hinzu, aktualisieren oder löschen Sie diese +- [Quizze](/contributing/quizzes/) – Fügen Sie Fragenkataloge für Quizze auf einer relevanten Seite hinzu, aktualisieren oder löschen Sie diese -Alle Updates erfolgen über den GitHub PR-Prozess. Das bedeutet, Sie erstellen eine lokale Kopie der Website, nehmen Ihre Änderungen vor und stellen eine Anfrage, um Ihre Änderungen einzufügen. Wenn Sie so etwas bis dato noch nicht gemacht haben, befolgen Sie die Anweisungen unten in unserem [GitHub-Repository](https://github.com/ethereum/ethereum-org-website). +**Ideen für neue Funktionen** +- [Eine Funktion anfragen](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) – Teilen Sie uns Ihre Ideen für eine neue Funktion oder ein neues Design mit -Sie können ohne unsere Erlaubnis an Themen arbeiten. Allerdings ist es immer besser, uns wissen zu lassen, was Sie umsetzen möchten. Dafür haben Sie folgende Möglichkeiten: +**Produktlistungen** +- [Eine Börse hinzufügen](/contributing/adding-exchanges/) – Fügen Sie eine Börse zu unserer [Börsensuche](/get-eth/#country-picker) hinzu +- [Ein Produkt hinzufügen](/contributing/adding-products/) – Fügen Sie eine Dapp oder ein Wallet zu einer relevanten Seite hinzu +- [Entwicklertools hinzufügen](/contributing/adding-developer-tools/) – Fügen Sie ein Entwicklertool zu einer relevanten Seite hinzu +- [Eine Ebene 2 hinzufügen](/contributing/adding-layer-2s/) – Fügen Sie eine Ebene 2 zu einer relevanten Seite hinzu +- [Ein Staking-Produkt oder einen Service hinzufügen](/contributing/adding-staking-products/) – Fügen Sie ein Projekt hinzu, das Solo-Staking, gepooltes Staking oder Staking-as-a-Service erleichtert +- [Ein Wallet hinzufügen](/contributing/adding-wallets/) – Fügen Sie ein Wallet für die Seite [Wallets finden](/wallets/find-wallet/) hinzu +- [Ein Projekt für unsere DeSci-Seite vorschlagen](/contributing/adding-desci-projects/) – Fügen Sie ein auf Ethereum basierendes Projekt hinzu, das zur dezentralisierten Wissenschaft beiträgt +- [Eine Ressource hinzufügen](/contributing/adding-resources/) – Fügen Sie eine nützliche Ressource zu einer relevanten Seite hinzu -- Einen Fehler oder einen PR auf [GitHub](https://github.com/ethereum/ethereum-org-website) kommentieren -- Uns auf unserem [Discord-Server](https://discord.gg/ethereum-org) schreiben +Haben Sie Fragen? 🤔 Treten Sie unserem [Discord-Server](https://discord.gg/ethereum-org) bei -Bevor Sie einen Beitrag leisten, sollten Sie sich mit folgenden Themen vertraut machen: +## Gute erste Aufgaben für den Einstieg -- die sich entwickelnde [Vision von ethereum.org](/about/) -- unsere [Designgrundsätze](/contributing/design-principles/) -- unser [Styleguide](/contributing/style-guide/) -- unser [Verhaltenskodex](/community/code-of-conduct) +Dies sind einige aktuelle Aufgaben, bei deren Lösung Sie uns helfen und für die Sie Verantwortung übernehmen können. Für die meisten benötigen Sie ein GitHub-Konto, da die meisten Änderungen an der Website über GitHub vorgenommen werden. -## So werden Entscheidungen für die Site getroffen {#how-decisions-about-the-site-are-made} + -Entscheidungen zu individuellen PRs, zur Designentwicklung und zu großen Upgrades werden von einem Team aus dem Ethereum-Ökösystem getroffen. In diesem Team finden sich Projektmanager, Entwickler, Designer, Marketing-, Kommunikations- und Fachexperten. Der Input der Community fließt in jede Entscheidung ein: Stellen Sie also Fragen zu Problmen, reichen Sie PRs ein oder kontaktieren Sie das Team: +Alle Aufgaben ansehen + +## Wie man an ethereum.org mitarbeitet {#how-to-update-content} + +Wenn Sie im [Übersetzungsprogramm](/contributing/translation-program/) mitwirken möchten, bitten wir Sie, ein Konto bei [Crowdin](https://crowdin.com/project/ethereum-org) zu erstellen. Für alles andere – das Hinzufügen oder Bearbeiten von Inhalten oder visuellen Elementen auf der Website, das Beheben von Fehlern, die Arbeit an offenen Aufgaben – benötigen Sie ein [GitHub](https://github.com/)-Konto. + +Alle Aktualisierungen erfolgen über den GitHub-PR-Prozess. Das bedeutet, dass Sie eine lokale Kopie der Website erstellen, Ihre Änderungen vornehmen und eine Anfrage stellen, um Ihre Änderungen zusammenzuführen. Wenn Sie dies noch nie gemacht haben, folgen Sie den Anweisungen am Ende unseres [GitHub-Repositorys](https://github.com/ethereum/ethereum-org-website). + +Sie benötigen keine Erlaubnis, um an etwas zu arbeiten, aber es ist immer am besten, uns mitzuteilen, was Sie vorhaben. Sie können dies tun, indem Sie: + +- Einen Kommentar zu einem Issue oder PR auf [GitHub](https://github.com/ethereum/ethereum-org-website) hinterlassen +- Eine Nachricht auf unserem [Discord-Server](https://discord.gg/ethereum-org) schreiben + +Bevor Sie mitwirken, stellen Sie sicher, dass Sie vertraut sind mit: + +- der sich entwickelnden [Vision von ethereum.org](/about/) +- unseren [Designprinzipien](/contributing/design-principles/) +- unserem [Styleguide](/contributing/style-guide/) +- unserem [Verhaltenskodex](/community/code-of-conduct) + +## Wie Entscheidungen über die Website getroffen werden {#how-decisions-about-the-site-are-made} + +Entscheidungen über einzelne PRs, die Weiterentwicklung des Designs und größere Upgrades werden von einem Team aus dem gesamten Ethereum-Ökosystem getroffen. Dieses Team umfasst Projektmanager, Entwickler, Designer, Marketing- und Kommunikationsexperten sowie Fachexperten. Der Input der Community fließt in jede Entscheidung ein: Stellen Sie also bitte Fragen in Issues, reichen Sie PRs ein oder kontaktieren Sie das Team: - [website@ethereum.org](mailto:website@ethereum.org) - [@ethdotorg](https://twitter.com/ethdotorg) @@ -67,27 +78,39 @@ Entscheidungen zu individuellen PRs, zur Designentwicklung und zu großen Upgrad ### Ein Hinweis zu Plagiaten {#plagiarism} -Verwenden Sie nur Ihre eigene(n) Arbeit oder Inhalte, zu deren Verwendung Sie berechtigt sind, wenn Sie Inhalte oder Artefakte zu ethereum.org beitragen. Viele Projekte innerhalb des Ethereum-Ökosystems nutzen Open-Source-Linzenzen, die den freien Austausch von Informationen ermöglichen. Wenn Sie diese Informationen jedoch nicht finden können, versuchen Sie nicht, Sie zu ethereum.org hinzuzufügen. Jede Pull-Anfrage, die als Plagiat angesehen wird, wird zurückgewiesen. +Verwenden Sie nur Ihre eigenen Originalarbeiten oder Inhalte, für deren Nutzung Sie die Erlaubnis haben, wenn Sie Inhalte oder Artefakte zu ethereum.org beitragen. Viele Projekte innerhalb des Ethereum-Ökosystems verwenden Open-Source-Lizenzen, die den freien Austausch von Informationen ermöglichen. Wenn Sie diese Informationen jedoch nicht finden können, versuchen Sie nicht, sie zu ethereum.org hinzuzufügen. Alle Pull Requests, die als Plagiat eingestuft werden, werden abgelehnt. ## Neu bei Open-Source? {#new-to-open-source} -Ein Einstieg in unser GitHub-Repository sollte kein großes Hindernis darstellen und wurde speziell für Entwickler entworfen, die mit Open Source noch nicht vertraut sind. Es nennt sich [Gutes erstes Thema](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). +Wir haben in unserem GitHub-Repository Issues mit niedrigen Einstiegshürden, die speziell für Entwickler gedacht sind, die neu im Bereich Open-Source sind. Diese sind mit [good first issue](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) gekennzeichnet. -## POAP als Mitwirkender beanspruchen {#poap} +## Fordern Sie Ihren Onchain Achievement Token (OAT) an {#oat} -Wenn Ihr Beitrag in ethereum.org eingebunden wird, prägen wir Ihnen einen einzigartigen POAP für Mitwirkende. Ein Proof of Attendance Protokoll- Token (POAP) ist ein On-Chain-Nachweis, dass Sie geholfen haben, das Ökosystem noch besser zu machen. +Wenn Ihr Beitrag in ethereum.org zusammengeführt wird, haben Sie die Möglichkeit, ein spezielles Abzeichen auf [Galxe](https://app.galxe.com/quest/ethereumorg) anzufordern. Ein Onchain Achievement Token (OAT) ist ein Nachweis dafür, dass Sie geholfen haben, das Ökosystem ein wenig großartiger zu machen. -[Mehr zu POAPs](https://www.poap.xyz/) +[Mehr über OATs](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) -### So werden sie beansprucht {#how-to-claim} +### So fordern Sie ihn an 1. Treten Sie unserem [Discord-Server](https://discord.gg/ethereum-org) bei. -2. Fügen Sie einen Link zu Ihrem Beitrag in den `#🥇 | proof-of-contribution` [Kanal](https://discord.com/channels/714888181740339261/1212737737916948530) ein. -3. Warten Sie, bis ein Mitglied unseres Teams Ihnen einen Link zu Ihrem POAP schickt. -4. Beanspruchen Sie Ihren POAP. +2. Fügen Sie einen Link zu Ihrem Beitrag im Kanal `#🥇 | proof-of-contribution` ein. +3. Warten Sie, bis ein Mitglied unseres Teams Ihnen einen Link zu Ihrem OAT sendet. +4. Fordern Sie Ihren OAT an! + +Sie sollten nur Self-Custody-Wallets verwenden, um OATs anzufordern. Verwenden Sie keine Börsenkonten oder andere Konten, für die Sie nicht die Private-Keys besitzen, da Sie mit diesen nicht auf Ihre OATs zugreifen und diese verwalten können. + +## Fordern Sie Ihren GitPOAP an {#claim-gitpoap} + +GitPOAP erkennt Ihren zusammengeführten Beitrag ebenfalls automatisch und ermöglicht es Ihnen, einen separaten, einzigartigen Mitwirkenden-POAP direkt auf ihrer Plattform zu prägen! + + +### So fordern Sie ihn an {#how-to-claim} -Sie sollten nur Wallets zur Selbstaufbewahrung verwenden, um Ihre POAPs zu beanspruchen. Verwenden Sie keine Konten von Handelspläten oder andere Konten, für die Sie nicht als einziger den Private Key besitzen, da Sie darüber keinen Zugang und keine Möglichkeit zur Verwaltung der POAPs erhalten. +1. Besuchen Sie [GitPOAP](https://www.gitpoap.io). +2. Verbinden Sie sich mit Ihrem Wallet oder sogar mit Ihrer E-Mail über die Anmeldeoption. +3. Suchen Sie nach Ihrem GitHub-Benutzernamen, Ihrer ETH-Adresse, ENS-Namen oder einem beliebigen GitPOAP, um zu prüfen, ob Sie berechtigt sind. +4. Wenn Ihr GitHub-Konto berechtigt ist, können Sie einen GitPOAP prägen! ## Mitwirkende {#contributors} - + \ No newline at end of file diff --git a/public/content/translations/de/contributing/quizzes/index.md b/public/content/translations/de/contributing/quizzes/index.md index 3617caf1bd3..67bd09aedee 100644 --- a/public/content/translations/de/contributing/quizzes/index.md +++ b/public/content/translations/de/contributing/quizzes/index.md @@ -1,62 +1,62 @@ --- -title: Quiz hinzufügen -description: Die Richtlinie, die wir beim Hinzufügen von Quiz zu ethereum.org anwenden +title: "Hinzufügen eines Quiz" +description: "Die Richtlinie, die wir beim Hinzufügen von Quizzen zu ethereum.org verwenden" lang: de --- # Quizze {#quizzes} -Quizfragen bieten den Nutzern die Möglichkeit, sich selbst zu testen. So können sie feststellen, ob sie den Inhalt der Seite, die sie gerade gelesen haben, verstanden haben. Die Fragen sollten sich nur auf den Inhalt der Seite beziehen und nicht nach Informationen fragen, die nicht auf der Seite erwähnt werden. +Quizze bieten Benutzern die Möglichkeit, sich selbst zu testen, um zu sehen, ob sie den Inhalt der gerade gelesenen Seite verstanden haben. Die Fragen sollten nur auf dem auf der Seite bereitgestellten Inhalt basieren und nicht nach Informationen fragen, die auf der Seite nicht erwähnt werden. -Die Fragen sind wie folgt aufgebaut: Die Frage, 1 richtige Antwort mit einer Erklärung, warum sie richtig ist, 3 falsche Antworten mit einer Erklärung, warum sie falsch sind. +Die Fragen sind wie folgt strukturiert: Die Fragestellung, 1 richtige Antwort mit einer Erklärung, warum sie richtig ist, 3 falsche Antworten mit einer Erklärung, warum sie falsch sind. -Einige Beispiele für aktuelle Quizfragen finden Sie hier: +Einige Beispiele für aktuelle Quizze finden Sie hier: -- [Layer 2](/layer-2) +- [Ebene 2](/layer-2) - [NFT](/nft/) - [Was ist Ethereum?](/what-is-ethereum/) - [Was ist ETH?](/what-is-ether/) -## Lernquiz hinzufügen +## Hinzufügen eines Lern-Quiz -Wenn es eine Seite gibt, für die noch kein Lernquiz erstellt wurde, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) für diese Seite. +Wenn es eine Seite gibt, für die noch kein Lern-Quiz erstellt wurde, [eröffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) dafür. -Geben Sie die folgenden Informationen an: +Bitte geben Sie die folgenden Informationen an: -- Die Seite, zu der Sie ein Quiz hinzufügen möchten +- Die Seite, auf der Sie ein Quiz hinzufügen möchten - 5 Fragen mit den folgenden Informationen: - - Der Abschnitt der Seite, auf den sich die Frage bezieht - - Die Frage selbst + - Der Abschnitt der Seite, auf dem die Frage basiert + - Fragestellung - 1 richtige Antwort mit einer Erklärung, warum sie richtig ist - 3 falsche Antworten, jeweils mit einer Erklärung, warum sie falsch sind -## Quizfrage hinzufügen +## Hinzufügen einer Quizfrage -Wenn Sie eine Frage zur Fragensammlung für ein Quiz hinzufügen möchten, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und geben Sie die folgenden Informationen an: +Wenn es eine Frage gibt, die Sie der Fragendatenbank für ein Quiz hinzufügen möchten, [eröffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und geben Sie die folgenden Informationen an: -- Die Seite, zu der Sie eine Quizfrage hinzufügen möchten +- Die Seite, auf der Sie eine Quizfrage hinzufügen möchten - Geben Sie für jede Frage die folgenden Informationen an: - - Der Abschnitt der Seite, auf den sich die Frage bezieht - - Die Frage selbst + - Der Abschnitt der Seite, auf dem die Frage basiert + - Fragestellung - 1 richtige Antwort mit einer Erklärung, warum sie richtig ist - 3 falsche Antworten, jeweils mit einer Erklärung, warum sie falsch sind -## Quizfrage aktualisieren +## Aktualisieren einer Quizfrage -Wenn Sie eine Frage in einer Fragensammlung für ein Quiz aktualisieren möchten, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und geben Sie die folgenden Informationen an: +Wenn es eine Frage gibt, die Sie in einer Fragendatenbank für ein Quiz aktualisieren möchten, [eröffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und geben Sie die folgenden Informationen an: - Die Seite, auf der Sie eine Quizfrage aktualisieren möchten - Geben Sie für jede zu aktualisierende Frage die folgenden Informationen an: - - Der Abschnitt der Seite, auf den sich die Frage bezieht - - Wortlaut der Frage, die Sie aktualisieren möchten - - Aktualisierter Wortlaut + - Der Abschnitt der Seite, auf dem die Frage basiert + - Fragestellung der Frage, die Sie aktualisieren möchten + - Aktualisierte Fragestellung - 1 richtige Antwort mit einer Erklärung, warum sie richtig ist - 3 falsche Antworten, jeweils mit einer Erklärung, warum sie falsch sind -## Quizfrage entfernen +## Entfernen einer Quizfrage -Wenn der Inhalt einer Frage nicht mehr auf der Seite vorhanden ist und sie entfernt werden soll, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml), um die Frage zu entfernen, und geben Sie die folgenden Informationen an: +Wenn der Inhalt für eine Frage auf der Seite nicht mehr existiert und sie entfernt werden muss, [eröffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml), um die Frage zu entfernen, und geben Sie die folgenden Informationen an: - Die Seite, auf der Sie eine Quizfrage löschen möchten - Die Frage, die Sie löschen möchten -- Gegebenenfalls eine Erläuterung, warum die Frage entfernt werden soll +- Gegebenenfalls eine Erklärung, warum die Frage entfernt werden sollte \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/faq/index.md b/public/content/translations/de/contributing/translation-program/faq/index.md index e5f2d152b6f..0456c01c50e 100644 --- a/public/content/translations/de/contributing/translation-program/faq/index.md +++ b/public/content/translations/de/contributing/translation-program/faq/index.md @@ -1,119 +1,119 @@ --- -title: Häufig gestellte Fragen zum Übersetzungsprogramm (FAQ) +title: "Häufig gestellte Fragen (FAQ) zum Übersetzungsprogramm" lang: de -description: Häufig gestellte Fragen zum Übersetzungprogramm von ethereum.org +description: "Häufig gestellte Fragen zum Übersetzungsprogramm von ethereum.org" --- -# Übersetzungsanleitung für ethereum.org {#translating-ethereum-guide} +# Leitfaden zur Übersetzung von ethereum.org {#translating-ethereum-guide} -Wenn Sie neu im Übersetzungsprogramm sind und zögern, sich einzubringen, finden Sie hier einige FAQs, die Ihnen den Einstieg erleichtern können. Sie finden in diesem Leitfaden Antworten auf häufig gestellte Fragen. +Wenn du neu im Übersetzungsprogramm bist und zögerst, direkt einzusteigen, findest du hier einige FAQs, die dir den Einstieg erleichtern können. Nutze diesen Leitfaden, um Antworten auf die häufigsten Fragen zu finden. -## Werde ich dafür bezahlt, wenn ich für ethereum.org übersetze? {#compensation} +## Kann ich für die Übersetzung von ethereum.org vergütet werden? {#compensation} -Ethereum.org ist eine Open-Source-Website. Das bedeutet das jeder mitmachen und einen Beitrag dazu leisten kann. +Ethereum.org ist eine Open-Source-Website, was bedeutet, dass sich jeder beteiligen und einen Beitrag leisten kann. -Das Übersetzungprogramm von ethereum.org ist eine Ergänzung dazu. Dahinter steht eine ähnliche Philosophie. +Das Übersetzungsprogramm von ethereum.org ist eine Erweiterung davon und wird mit einer ähnlichen Philosophie organisiert. -Ziel des Übersetzungsprogramms ist es, Ethereum für jeden zugänglich zu machen, unabhängig davon welche Sprache man spricht. Zudem haben Personen, die mehrere Sprachen sprechen, damit die Möglichkeit, sich in das Ethereum-Ökosystem einzubringen und einen Beitrag zur Barrierefreiheit zu leisten. +Das Ziel des Übersetzungsprogramms ist es, Ethereum-Inhalte für jeden zugänglich zu machen, unabhängig davon, welche Sprachen er spricht. Es ermöglicht auch jeder zweisprachigen Person, sich im Ethereum-Ökosystem zu engagieren und auf zugängliche Weise einen Beitrag zu leisten. -Daher ist das Übersetzungsprogramm offen zugänglich. Die Mitarbeit erfolgt auf freiwilliger Basis und unbezahlt. Würden Übersetzer für die von ihnen übersetzten Wörter bezahlt, könnten wir nur Übersetzer mit ausreichend Erfahrung (also professionelle Übersetzer) dazu einladen, an dem Übersetzungsprogramm teilzunehmen. Damit würde das Übersetzungsprogramm Personen ausschließen und das steht der allgemeinen Zielsetzung entgegen: Jeder soll die Möglichkeit haben, teilzunehmen und sich am Ökosystem zu beteiligen. +Aus diesem Grund ist das Übersetzungsprogramm offen und freiwillig, und die Teilnahme wird nicht vergütet. Wenn wir Übersetzer für die Anzahl der übersetzten Wörter vergüten würden, könnten wir nur diejenigen mit ausreichender Übersetzungserfahrung (professionelle Übersetzer) einladen, dem Übersetzungsprogramm beizutreten. Dies würde das Übersetzungsprogramm exklusiv machen und uns daran hindern, die skizzierten Ziele zu erreichen, insbesondere: jedem die Teilnahme und das Engagement im Ökosystem zu ermöglichen. -Wir setzen alles daran, unseren Mitwirkenden eine erfolgreiche Teilnahme am Ethereum-Ökosystem zu ermöglichen. Es gibt viele nicht-monetäre Anreize wie: [angebotene POAPs](/contributing/translation-program/acknowledgements/#poap) und ein [Übersetzungszertifikat](/contributing/translation-program/acknowledgements/#certificate) sowie [Übersetzungsranglisten](/contributing/translation-program/acknowledgements/) und [die Nennung all unserer Übersetzer auf der Site](/contributing/translation-program/contributors/). +Wir unternehmen alle Anstrengungen, um unseren Mitwirkenden den Erfolg im Ethereum-Ökosystem zu ermöglichen; es gibt viele nicht-monetäre Anreize, wie zum Beispiel: [das Anbieten von POAPs](/contributing/translation-program/acknowledgements/#poap) und einem [Übersetzerzertifikat](/contributing/translation-program/acknowledgements/#certificate), sowie die Organisation der [Übersetzungs-Bestenlisten](/contributing/translation-program/acknowledgements/) und [die Auflistung all unserer Übersetzer auf der Website](/contributing/translation-program/contributors/). -## Wie kann ich Strings mit `` übersetzen? {#tags} +## Wie übersetze ich Zeichenfolgen mit ``? {#tags} -Nicht jeder String wird in reiner Textform geschrieben. Einige Strings bestehen aus gemischten Skripten wie HTML-Tags (`<0>`, ``). Diese werden in der Regel für Hyperlinks oder alternative Formatierungen in der Mitte eines Satzes verwendet. +Nicht jede Zeichenfolge ist in reiner Textform geschrieben. Es gibt einige Zeichenfolgen, die aus gemischten Skripten wie HTML-Tags (`<0>`, ``) bestehen. Dies ist normalerweise für Hyperlinks oder alternative Formatierungen in der Mitte eines Satzes der Fall. -- Übersetzen Sie den Text innerhalb der Tags, aber nicht die Tags selbst. Alles, was zwischen `<` und `>` steht, darf nicht übersetzt oder entfernt werden. -- Um die Strings zu schützen, empfehlen wir, unten links auf die Schaltfläche "Copy Source" (Quelle kopieren) zu klicken. Damit wird der ursprüngliche String kopiert und in das Textfeld zur Übersetzung eingefügt. Auf diese Weise können Sie die Tags sehen. Das hilft dabei, Fehler zu vermeiden. +- Übersetze den Text innerhalb der Tags, aber nicht die Tags selbst. Alles in den `<` und `>` darf nicht übersetzt oder entfernt werden. +- Um die Zeichenfolge sicher zu halten, empfehlen wir dir, unten links auf die Schaltfläche „Copy Source“ (Quelle kopieren) zu klicken. Dadurch wird die ursprüngliche Zeichenfolge kopiert und in das Textfeld eingefügt. So kannst du klären, wo sich die Tags befinden, und Fehler vermeiden. -![Crowdin-Oberfläche mit hervorgehobener Schaltfläche "Copy Source" (Quelle kopieren)](./html-tag-strings.png) +![Crowdin-Benutzeroberfläche mit hervorgehobener Schaltfläche zum Kopieren der Quelle](./html-tag-strings.png) -Sie können die Position der Tags innerhalb der Zeichenkette verschieben, um sie an die richtige Position für Ihre Sprache zu bringen. Achten Sie dabei aber darauf, dass das ganze Tag an andere Stelle gebracht wird. +Du kannst die Position der Tags innerhalb der Zeichenfolge verschieben, damit es in deiner Sprache natürlicher klingt – achte nur darauf, das gesamte Tag zu verschieben. -Ausführlichere Informationen zum Umgang mit Tags und Code-Ausschnitten finden Sie im [Übersetzungsleitfaden von ethereum.org](/contributing/translation-program/translators-guide/#dealing-with-tags). +Weitere detaillierte Informationen zum Umgang mit Tags und Code-Snippets findest du im [Übersetzungs-Styleguide von ethereum.org](/contributing/translation-program/translators-guide/#dealing-with-tags). -## Woher kommen die Strings? {#strings} +## Wo befinden sich die Zeichenfolgen? {#strings} -Oft reichen die Quelltexte allein nicht aus, um eine genaue Übersetzung zu erstellen. +Oft reichen die Quellzeichenfolgen allein möglicherweise nicht aus, um eine genaue Übersetzung zu liefern. -- Weitere Informationen finden Sie unter "Screenshots" und "Context". Im Quelltext-Abschnitt sehen Sie einen Screenshot. Darauf können Sie sehen, in welchem Kontext der String verwendet wird. -- Wenn Sie immer noch unsicher sind, setzen Sie eine Kennzeichnung im Bereich "Comment Section". [Sind Sie unsicher, wie Sie einen Kommentar hinterlassen?](#comment) +- Sieh dir „Screenshots“ und „Context“ (Kontext) für weitere Informationen an. Im Abschnitt der Quellzeichenfolge siehst du das angehängte Screenshot-Bild, das dir zeigt, wie wir die Zeichenfolge im Kontext verwenden. +- Wenn du dir immer noch unsicher bist, melde dies im „Comment section“ (Kommentarbereich). [Du bist dir nicht sicher, wie man einen Kommentar hinterlässt?](#comment) -![Zeigt, wie Kontext per Screenshot für einen String bereitgestellt werden kann](./source-string.png) +![Zeigt, wie Kontext für eine Zeichenfolge mit einem Screenshot bereitgestellt werden kann](./source-string.png) -![Ein Beispiel-Screenshot, der zu Kontextzwecken hinzugefügt wurde](./source-string-2.png) +![Ein Beispiel-Screenshot, der als Kontext hinzugefügt wurde](./source-string-2.png) -## Wie kann ich Kommentare hinterlassen oder Fragen stellen? Ich möchte ein Problem oder einen Tippfehler melden... {#comment} +## Wie kann ich Kommentare hinterlassen oder Fragen stellen? Ich möchte ein Problem oder Tippfehler melden... {#comment} -Wenn Sie eine bestimmte Zeichenfolge markieren möchten, die Aufmerksamkeit erfordert, können Sie einen Kommentar dazu verfassen. +Wenn du auf eine bestimmte Zeichenfolge aufmerksam machen möchtest, die Beachtung erfordert, kannst du gerne einen Kommentar abgeben. -- Klicken Sie oben rechts auf die zweite Schaltfläche. Die versteckte Registerkarte erscheint auf der rechten Seite. Hinterlassen Sie einen neuen Kommentar und aktivieren Sie unten das Kontrollkästchen "Issue" (Probleme). Sie können die Art des Problems angeben, indem Sie eine der Optionen aus dem Dropdown-Menü auswählen. -- Wenn Sie das Problem übermittelt haben, wird es unserem Team gemeldet. Wir werden das Problem beheben und Sie darüber informieren, indem wir auf Ihren Kommentar antworten und das Problem schließen. -- Wenn Sie eine fehlerhafte Übersetzung melden, werden die Übersetzung und die von Ihnen vorgeschlagene Alternative bei der nächsten Prüfung von einem Muttersprachler überprüft. +- Klicke auf die zweite Schaltfläche in der oberen rechten Leiste. Die versteckte Registerkarte wird auf der rechten Seite angezeigt. Hinterlasse einen neuen Kommentar und aktiviere unten das Kontrollkästchen „Issue“ (Problem). Du kannst die Art des Problems angeben, indem du eine der Optionen aus dem Dropdown-Menü auswählst. +- Sobald es eingereicht wurde, wird es unserem Team gemeldet. Wir werden das Problem beheben und dich informieren, indem wir auf deinen Kommentar antworten und das Problem schließen. +- Wenn du eine falsche Übersetzung meldest, werden die Übersetzung und deine vorgeschlagene Alternative bei der nächsten Überprüfung von einem Muttersprachler überprüft. -![Zeigt, wie Kommentare geschrieben und Probleme gemeldet werden können](./comment-issue.png) +![Zeigt, wie man Kommentare und Probleme erstellt](./comment-issue.png) -## Was ist Translation Memory (TM)? {#translation-memory} +## Was ist ein Translation Memory (TM)? {#translation-memory} -Translation Memory (TM) ist eine Funktion von Crowdin, die alle zuvor übersetzten Zeichenketten in [ethereum.org](https://ethereum.org/) speichert. Wenn eine Zeichenkette übersetzt wird, wird sie automatisch in unserem Projekt-TM gespeichert. Das ist ein nützliches Werkzeug, mit dem sich beim Übersetzen Zeit sparen lässt. +Das Translation Memory (TM) ist eine Funktion von Crowdin, die alle zuvor übersetzten Zeichenfolgen auf ethereum.org speichert. Wenn eine Zeichenfolge übersetzt wird, wird sie automatisch in unserem Projekt-TM gespeichert. Dies kann ein nützliches Werkzeug sein, um dir Zeit zu sparen! -- Im Abschnitt "TM and MT Suggestions" (TM und maschinell übersetzte Vorschläge) können Sie sehen, wie andere Übersetzer den gleichen oder einen ähnlichen Satz übersetzt haben. Wenn Sie einen Vorschlag mit einer hohen Übereinstimmungsrate finden, können Sie diese Übersetzung verwenden, indem Sie darauf klicken. -- Wenn die Liste keine Einträge zeigt, können Sie den Übersetzungsspeicher nach bereits erstellten Übersetzungen durchsuchen und sie wiederverwenden, um Einheitlichkeit zu gewährleisten. +- Schau dir den Abschnitt „TM and MT Suggestions“ (TM- und MT-Vorschläge) an und du wirst sehen, wie andere Übersetzer dieselbe oder eine ähnliche Zeichenfolge übersetzt haben. Wenn du einen Vorschlag mit einer hohen Übereinstimmungsrate findest, kannst du die Übersetzung gerne übernehmen, indem du darauf klickst. +- Wenn nichts auf der Liste steht, kannst du das TM nach zuvor erstellten Übersetzungen durchsuchen und diese aus Gründen der Konsistenz wiederverwenden. -![Ein Screenshot des Übersetzungsspeichers](./translation-memory.png) +![Ein Screenshot des Translation Memory](./translation-memory.png) -## Wie benutze ich das Crowdin-Glossar? {#glossary} +## Wie verwende ich das Crowdin-Glossar? {#glossary} -Die Terminologie von Ethereum ist ein weiterer entscheidender Bestandteil unserer Übersetzungsarbeit, da neue technologische Begriffe in anderen Sprachen häufig noch nicht lokalisiert sind. Außerdem gibt es Begriffe, die in verschiedenen Kontexten unterschiedliche Bedeutungen haben. [Weitere Informationen zur Übersetzung der Ethereum-Terminologie](#terminology). +Die Ethereum-Terminologie ist ein weiterer entscheidender Teil unserer Übersetzungsarbeit, da neue technische Begriffe oft noch nicht in viele Sprachen lokalisiert sind. Außerdem gibt es Begriffe, die in verschiedenen Kontexten unterschiedliche Bedeutungen haben. [Mehr zur Übersetzung der Ethereum-Terminologie](#terminology) -Das Crowding-Glossar ist der beste Ort, um Begriffe und Definitionen besser zu verstehen. Es gibt zwei Wege, um das Glossar zu nutzen. +Das Crowdin-Glossar ist der beste Ort zur Klärung von Begriffen und Definitionen. Es gibt zwei Möglichkeiten, auf das Glossar zuzugreifen. -- Erste Möglichkeit: Wenn ein Begriff im Quelltext unterstrichen ist, können Sie mit der Maus darüberfahren. Daraufhin wird eine kurze Definition angezeigt. +- Erstens: Wenn du in der Quellzeichenfolge einen unterstrichenen Begriff findest, kannst du mit der Maus darüber fahren und eine kurze Definition davon sehen. -![Beispiel einer Glossardefinition](./glossary-definition.png) +![Eine beispielhafte Glossardefinition](./glossary-definition.png) -- Zweite Möglichkeit: Wenn Sie einen Begriff sehen, der nicht unterstrichen und der Ihnen nicht geläufig ist, können Sie ihn über die Registerkarte "Glossary" (Glossar) (die dritte Schaltfläche in der rechten Spalte) suchen. Dort finden Sie Erklärungen zu bestimmten Begriffen, die im Rahmen des Projekts häufig verwendet werden. +- Zweitens: Wenn du einen Begriff siehst, der dir nicht vertraut ist, aber nicht unterstrichen ist, kannst du in der Registerkarte „Glossary“ (die dritte Schaltfläche in der rechten Spalte) danach suchen. Dort findest du Erklärungen zu bestimmten Begriffen und solchen, die im Projekt häufig verwendet werden. -![Ein Screenshot, der zeigt, wo die Registerkarte "Glossary" (Glossar) in Crowdin zu finden ist](./glossary-tab.png) +![Ein Screenshot, der zeigt, wo die Registerkarte Glossar in Crowdin zu finden ist](./glossary-tab.png) -- Wenn Sie jedoch nichts finden können, dann ist das die Chance, einen neuen Begriff hinzuzufügen. Wir möchten Sie dazu ermuntern, den Begriff in einer Suchmaschine nachzuschlagen und die Beschreibung im Glossar hinzuzufügen. Das ist anderen Übersetzern eine große Hilfe, den Begriff besser zu verstehen. +- Wenn du ihn immer noch nicht finden kannst, ist das deine Chance, einen neuen Begriff hinzuzufügen! Wir ermutigen dich, ihn in einer Suchmaschine nachzuschlagen und die Beschreibung zum Glossar hinzuzufügen. Es wird anderen Übersetzern eine große Hilfe sein, den Begriff besser zu verstehen. -![Ein Screenshot, der zeigt, wie Glossarbegriffe zu Crowdin hinzugefügt werden](./add-glossary-term.png) +![Ein Screenshot, der zeigt, wie man einen Glossarbegriff zu Crowdin hinzufügt](./add-glossary-term.png) -### Übersetzungsrichtlinie für Eigennamen und Fachbegriffe {#terminology} +### Richtlinie zur Übersetzung von Terminologie {#terminology} -_Für Namen (Marken, Unternehmen, Personen) und neue technische Begriffe (Beacon Chain, Shard Chains etc.)_ +_Für Namen (Marken, Unternehmen, Personen) und neue technische Begriffe (Beacon Chain, Shard-Ketten usw.)_ -Ethereum nutzt viele neue Begriffe, die erst in jüngster Zeit geprägt wurden. Einige Begriffe variieren von Übersetzer zu Übersetzer, da sich in ihrer jeweiligen Sprache noch keine offizielle Übersetzung etabliert hat. Diese Uneinheitlichkeit kann zu Missverständnissen führen und die Lesbarkeit beeinträchtigen. +Ethereum präsentiert viele neue Begriffe, die erst kürzlich geprägt wurden. Einige Begriffe variieren von Übersetzer zu Übersetzer, da es in ihrer jeweiligen Sprache keine offizielle Übersetzung gibt. Solche Inkonsistenzen können zu Missverständnissen führen und die Lesbarkeit verringern. -Aufgrund der sprachlichen Vielfalt und unterschiedlichen Standardisierungen in jeder Sprache, ist es nahezu unmöglich eine einheitliche Übersetzungsrichtlinie für Terminologie zu entwickeln, die für alle unterstützten Sprachen angewendet werden kann. +Aufgrund der sprachlichen Vielfalt und der unterschiedlichen Standardisierungen in jeder Sprache war es nahezu unmöglich, eine einheitliche Richtlinie zur Übersetzung von Terminologie zu entwickeln, die in allen unterstützten Sprachen angepasst werden kann. -Nach sorgfältiger Überlegung haben wir die Entscheidung getroffen, die am häufigsten verwendete Begriffe den Übersetzern zu überlassen. +Nach reiflicher Überlegung sind wir zu dem Entschluss gekommen, die am häufigsten verwendete Terminologie euch, den Übersetzern, zu überlassen. -Im Folgenden finden Sie die von uns vorgeschlagene Vorgehensweise, wenn Sie auf einen Begriff stoßen, der Ihnen nicht geläufig ist: +Hier ist unser Vorschlag, wenn du einen Begriff findest, der dir unbekannt ist: -- Sehen Sie im [Glossar der Begriffe](#glossary) nach, wie andere Übersetzer den Begriff bereits übersetzt haben. Wenn Sie der Meinung sind, dass die Übersetzung des Begriffes nicht zutreffend ist, können Sie Ihre Übersetzung für den Begriff zum Crowdin-Glossar hinzufügen. -- Falls im Glossar noch keine Übersetzung vorhanden ist, empfehlen wir, den Begriff über eine Suchmaschine in öffentlichen Artikeln zu recherchieren, um herauszufinden, wie der Begriff in der Community tatsächlich verwendet wird. -- Wenn Sie keine Referenzen finden, vertrauen Sie auf Ihre Intuition und schlagen Sie eine neue Übersetzung in Ihrer Sprache vor. -- Wenn Sie sich das nicht zutrauen, dann belassen Sie den Begriff unübersetzt. Manchmal sind die englischen Begriffe für eine genaue Definition am passendsten. +- Konsultiere das [Glossar der Begriffe](#glossary), dort findest du möglicherweise, wie andere Übersetzer ihn zuvor übersetzt haben. Wenn du der Meinung bist, dass der zuvor übersetzte Begriff nicht angemessen ist, kannst du gerne deine Übersetzung wiederherstellen, indem du einen neuen Begriff zum Crowdin-Glossar hinzufügst. +- Wenn eine solche vorherige Übersetzung im Glossar nicht existiert, ermutigen wir dich, in einer Suchmaschine oder einem Medienartikel nachzuschlagen, der zeigt, wie der Begriff in deiner Community tatsächlich verwendet wird. +- Wenn du überhaupt keine Referenzen findest, vertraue ruhig deiner Intuition und schlage eine neue Übersetzung für deine Sprache vor! +- Wenn du dich dabei weniger sicher fühlst, lass den Begriff unübersetzt. Manchmal sind englische Begriffe mehr als ausreichend, um genaue Definitionen zu liefern. -Wir empfehlen, Namen von Marken, Unternehmen und Personen nicht zu übersetzen, da eine Übersetzung unnötige Verwirrung stiften und zu SEO-Schwierigkeiten führen kann. +Wir empfehlen dir, Namen von Marken, Unternehmen und Personen unübersetzt zu lassen, da eine Übersetzung unnötige Verwirrung und SEO-Schwierigkeiten verursachen könnte. ## Wie funktioniert der Überprüfungsprozess? {#review-process} -Um ein bestimmtes Niveau und Konsistenz in unseren Überstzungen zu gewährleisten, arbeiten wir mit [Acolad](https://www.acolad.com/), einem der weltweit größten Übersetzungsdienstleister, zusammen. Acolad arbeitet mit mehr als 20.000 professionellen Sprachexperten zusammen. Das bedeutet, dass sie für jede Sprache und jede Art von Inhalten, die wir benötigen, professionelle Prüfer bereitstellen können. +Um ein gewisses Maß an Qualität und Konsistenz in unseren Übersetzungen zu gewährleisten, arbeiten wir mit [Acolad](https://www.acolad.com/) zusammen, einem der weltweit größten Sprachdienstleister. Acolad verfügt über 20.000 professionelle Linguisten, was bedeutet, dass sie für jede Sprache und Art von Inhalten, die wir benötigen, professionelle Prüfer bereitstellen können. -Der Überprüfungsprozess ist unkompliziert. Sobald ein bestimmtes [Inhaltsgebiet](/contributing/translation-program/) vollständig übersetzt ist, beauftragen wir die eine die Überprüfung dieser Inhalte. Der Überprüfungsprozess erfolgt direkt in Crowdin. Sobald die Überprüfung abgeschlossen ist aktualisieren wir die Website mit dem übersezten Inhalt. +Der Überprüfungsprozess ist unkompliziert; sobald eine Reihe von Inhalten zu 100 % übersetzt ist, geben wir eine Überprüfung für diesen Inhaltsbereich in Auftrag. Der Überprüfungsprozess findet direkt in Crowdin statt. Sobald die Überprüfung abgeschlossen ist, aktualisieren wir die Website mit den übersetzten Inhalten. -## Wie kann ich Inhalte in meiner Sprache hinzufügen? {#adding-foreign-language-content} +## Wie füge ich Inhalte in meiner Sprache hinzu? {#adding-foreign-language-content} -Derzeit werden alle nicht-englischen Inhalte direkt vom englischen Quelltext übersetzt. Inhalte, die es nicht auf Englisch gibt, können nicht zu anderen Sprachen hinzugefügt werden. +Derzeit werden alle nicht-englischen Inhalte direkt aus den englischen Quellinhalten übersetzt, und Inhalte, die nicht auf Englisch existieren, können nicht in anderen Sprachen hinzugefügt werden. -Wenn Sie neue Inhalte für ethereum.org vorschlagen möchten, [erstellen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues) auf GitHub. Wenn Sie hinzugefügt werden, dann wird der Inhalt auf Englisch geschrieben und über Crowdin in andere Sprachen übersetzt. +Um neue Inhalte für ethereum.org vorzuschlagen, kannst du ein [Issue auf GitHub erstellen](https://github.com/ethereum/ethereum-org-website/issues). Wenn der Inhalt hinzugefügt wird, wird er auf Englisch verfasst und über Crowdin in andere Sprachen übersetzt. -Wir planen, in naher Zukunft Unterstützung für nicht-englische Inhalte hinzuzufügen. +Wir planen, in naher Zukunft Unterstützung für das Hinzufügen nicht-englischer Inhalte anzubieten. -## Kontakt {#contact} +## Nimm Kontakt auf {#contact} -Vielen Dank, dass Sie sich die Inhalte oben angesehen haben. Wir hoffen, dass das hilfreich war, damit Sie sich an unserem Programm beteiligen können. Sie können unserem [Discord-Übersetzungskanal](https://discord.gg/ethereum-org) beitreten, um Fragen zu stellen und mit anderen Übersetzern zusammenzuarbeiten. Sie können sich aber auch unter translations@ethereum.org an uns wenden. +Vielen Dank, dass du dir das alles durchgelesen hast. Wir hoffen, dass dir dies den Einstieg in unser Programm erleichtert. Tritt gerne unserem [Discord-Übersetzungskanal](https://discord.gg/ethereum-org) bei, um Fragen zu stellen und mit anderen Übersetzern zusammenzuarbeiten, oder kontaktiere uns unter translations@ethereum.org! \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/how-to-translate/index.md b/public/content/translations/de/contributing/translation-program/how-to-translate/index.md index 6db08093ee5..105cee0cf97 100644 --- a/public/content/translations/de/contributing/translation-program/how-to-translate/index.md +++ b/public/content/translations/de/contributing/translation-program/how-to-translate/index.md @@ -1,92 +1,92 @@ --- -title: Übersetzen – so geht's +title: "Wie man übersetzt" lang: de -description: Anweisungen für die Verwendung von Crowdin zur Übersetzung von ethereum.org +description: "Anweisungen zur Verwendung von Crowdin für die Übersetzung von ethereum.org" --- -# Übersetzen – so geht's {#how-to-translate} +# Wie man übersetzt {#how-to-translate} -## Ein visueller Leitfaden {#visual-guide} +## Visueller Leitfaden {#visual-guide} -Für visuell Lernende: Luka führt Sie durch die Einrichtung von Crowdin. Alternativ können Sie die gleichen Schritte auch im nächsten Abschnitt nachlesen. +Für visuelle Lerner zeigt Luka in diesem Video, wie man sich bei Crowdin einrichtet. Alternativ findest du die gleichen Schritte im nächsten Abschnitt in schriftlicher Form. ## Schriftlicher Leitfaden {#written-guide} -### Beteiligen Sie sich an unserem Projekt auf Crowdin {#join-project} +### Tritt unserem Projekt in Crowdin bei {#join-project} -Sie müssen sich bei Ihrem Crowdin-Konto anmelden oder sich registrieren, wenn Sie noch kein Konto haben. Für die Anmeldung benötigen Sie lediglich ein E-Mail-Konto und ein Passwort. +Du musst dich in deinem Crowdin-Konto anmelden oder dich registrieren, falls du noch keines hast. Für die Registrierung benötigst du lediglich eine E-Mail-Adresse und ein Passwort. - Am Projekt teilnehmen + Projekt beitreten -### Wählen Sie Ihre Sprache {#open-language} +### Öffne deine Sprache {#open-language} -Nachdem Sie sich bei Crowdin angemeldet haben, sehen Sie eine Projektbeschreibung und eine Liste aller verfügbaren Sprachen. Jede Sprache enthält außerdem Informationen über die Gesamtzahl der übersetzbaren Wörter und einen Überblick darüber, wie viele Inhalte in einer bestimmten Sprache bereits übersetzt und genehmigt wurden. +Nach der Anmeldung bei Crowdin siehst du eine Projektbeschreibung und eine Liste aller verfügbaren Sprachen. +Jede Sprache enthält zudem Informationen über die Gesamtanzahl der übersetzbaren Wörter sowie eine Übersicht darüber, wie viel Inhalt in einer bestimmten Sprache bereits übersetzt und genehmigt wurde. -Wählen Sie die Sprache, in die Sie übersetzen möchten, um die Liste der Dateien anzuzeigen, die für die Übersetzungen zur Verfügung stehen. +Öffne die Sprache, in die du übersetzen möchtest, um die Liste der für die Übersetzung verfügbaren Dateien zu sehen. -![Liste von Sprachen auf Crowdin](./list-of-languages.png) +![Liste der Sprachen in Crowdin](./list-of-languages.png) -### Suchen Sie ein Dokument, an dem Sie arbeiten möchten {#find-document} +### Finde ein Dokument zur Bearbeitung {#find-document} -Der Inhalt der Website ist in eine Reihe von Dokumenten und Inhaltsbereichen unterteilt. Sie können den Fortschritt jedes Dokuments auf der rechten Seite überprüfen. Wenn der Übersetzungsfortschritt unter 100 % liegt, können Sie daran mitarbeiten. +Der Inhalt der Website ist in eine Reihe von Dokumenten und Inhaltskategorien (Content Buckets) unterteilt. Du kannst den Fortschritt jedes Dokuments auf der rechten Seite überprüfen – wenn der Übersetzungsfortschritt unter 100 % liegt, trage bitte dazu bei! -Ist Ihre Sprache nicht aufgeführt? [Eröffnen Sie ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new/choose) oder fragen Sie in unserem [Discord](https://discord.gg/ethereum-org) nach. +Ist deine Sprache nicht aufgeführt? [Eröffne ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose) oder frage in unserem [Discord](https://discord.gg/ethereum-org) nach. -![Übersetzte und nicht übersetzte Dateien auf Crowdin](./crowdin-files.png) +![Übersetzte und unübersetzte Dateien in Crowdin](./crowdin-files.png) -Ein Hinweis zu den Inhaltsbereichen: Wir nutzen 'Inhaltsbereiche' in Crowdin, um den Inhalt mit der höchsten Priorität zuerst zu veröffentlichen. Wenn Sie sich eine Sprache ansehen, zum Beispiel [Philippinisch](https://crowdin.com/project/ethereum-org/fil#), sehen Sie Ordner für Inhaltsbereiche ("1. Startseite", "2. Grundlagen", "3. Exploring", usw.). +Ein Hinweis zu Inhaltskategorien (Content Buckets): Wir verwenden „Content Buckets“ in Crowdin, um Inhalte mit der höchsten Priorität zuerst zu veröffentlichen. Wenn du dir eine Sprache ansiehst, zum Beispiel [Filipino](https://crowdin.com/project/ethereum-org/fil#), siehst du Ordner für die Inhaltskategorien („1. Homepage“, „2. Essentials“, „3. Exploring“ usw.). -Wir empfehlen Ihnen, in dieser numerischen Reihenfolge zu übersetzen (1 → 2 → 3 → ⋯), um sicherzustellen, dass die Seiten mit der größten Wirkung zuerst übersetzt werden. - -[Mehr zu ethereum.org-Inhaltsbereichen](/contributing/translation-program/) +Wir empfehlen dir, in dieser numerischen Reihenfolge (1 → 2 → 3 → ⋯) zu übersetzen, um sicherzustellen, dass die wichtigsten Seiten zuerst übersetzt werden. ### Übersetzen {#translate} -Nachdem Sie die zu übersetzende Datei ausgewählt haben, wird sie im Online-Editor geöffnet. Wenn Sie noch nicht mit Crowdin gearbeitet haben, finden Sie in dieser Kurzanleitung eine Erläuterung der Grundlagen. +Nachdem du die Datei ausgewählt hast, die du übersetzen möchtest, wird sie im Online-Editor geöffnet. Wenn du Crowdin noch nie benutzt hast, kannst du diese Kurzanleitung nutzen, um dich mit den Grundlagen vertraut zu machen. -![Online-Crowdin-Editor](./online-editor.png) +![Crowdin Online-Editor](./online-editor.png) **_1 – Linke Seitenleiste_** -- Nicht übersetzt (rot) – Text, an dem noch nicht gearbeitet wurde. Das sind die Zeichenfolgen, die übersetzt werden sollten. -- Übersetzt (grün) – Text, der bereits übersetzt, aber noch nicht überprüft wurde. Gerne können Sie alternative Übersetzungen vorschlagen oder über die Schaltflächen ''+'' und ''-'' im Editor über bestehende Übersetzungen abstimmen. +- Unübersetzt (rot) – Text, der noch nicht bearbeitet wurde. Dies sind die Zeichenfolgen (Strings), die du übersetzen solltest. +- Übersetzt (grün) – Text, der bereits übersetzt, aber noch nicht überprüft wurde. Du kannst gerne alternative Übersetzungen vorschlagen oder über bestehende abstimmen, indem du die Schaltflächen „+“ und „-“ im Editor verwendest. - Genehmigt (Häkchen) – Text, der bereits überprüft wurde und derzeit auf der Website live ist. -Sie können auch die Schaltflächen oben verwenden, um nach bestimmten Zeichenfolgen zu suchen, sie nach Status zu filtern oder die Ansicht zu ändern. +Du kannst auch die Schaltflächen oben verwenden, um nach bestimmten Zeichenfolgen zu suchen, sie nach Status zu filtern oder die Ansicht zu ändern. **_2 – Editor-Bereich_** -Der Hauptübersetzungsbereich – der Ausgangstext wird oben angezeigt, mit zusätzlichem Kontext und Screenshots, falls verfügbar. Um eine neue Übersetzung vorzuschlagen, geben Sie Ihre Übersetzung in das Feld ''Enter translation here" (Übersetzung hier eingeben') ein und klicken Sie auf "Save" (Speichern). +Der Hauptübersetzungsbereich – der Quelltext wird oben angezeigt, mit zusätzlichem Kontext und Screenshots, falls verfügbar. +Um eine neue Übersetzung vorzuschlagen, gib deine Übersetzung in das Feld „Enter translation here“ (Übersetzung hier eingeben) ein und klicke auf Speichern. -In diesem Abschnitt finden Sie auch vorhandene Übersetzungen der Zeichenfolge und Übersetzungen in andere Sprachen sowie Translation-Memory-Übereinstimmungen und Vorschläge für maschinelle Übersetzungen. +In diesem Abschnitt findest du auch bestehende Übersetzungen der Zeichenfolge und Übersetzungen in andere Sprachen sowie Übereinstimmungen aus dem Translation Memory und Vorschläge für maschinelle Übersetzungen. **_3 – Rechte Seitenleiste_** -Hier können Sie Kommentare finden, Einträge aus dem Übersetzungsspeicher (Translation Memory, TM) oder dem Glossar. In der Standardansicht werden die Kommentare angezeigt und Übersetzer haben die Möglichkeit, zu kommunizieren, Probleme aufzuwerfen oder falsche Übersetzungen zu melden. +Hier findest du Kommentare, Einträge aus dem Translation Memory und Glossareinträge. Die Standardansicht zeigt die Kommentare und ermöglicht es Übersetzern, zu kommunizieren, Probleme anzusprechen oder falsche Übersetzungen zu melden. -Über die Schaltflächen oben können Sie auch zum Übersetzungsspeicher wechseln, wo Sie nach bereits existierenden Übersetzungen suchen können, oder zum Glossar, das Beschreibungen und Standardübersetzungen von zentralen Begriffen beinhaltet. +Über die Schaltflächen oben kannst du auch zum Translation Memory wechseln, wo du nach bestehenden Übersetzungen suchen kannst, oder zum Glossar, das Beschreibungen und Standardübersetzungen von Schlüsselbegriffen enthält. -Möchten Sie mehr erfahren? Sehen Sie sich die [Dokumentation zur Verwendung des Online-Crowdin-Editors](https://support.crowdin.com/online-editor/) an. +Möchtest du mehr erfahren? Schau dir gerne die [Dokumentation zur Nutzung des Crowdin Online-Editors](https://support.crowdin.com/online-editor/) an. ### Überprüfungsprozess {#review-process} -Sobald Sie die Übersetzung abgeschlossen haben (d.h. alle Dateien für einen Inhaltsbereich 100% anzeigen), wird unser professioneller Übersetzungsdienst den Inhalt überprüfen (und möglicherweise bearbeiten). Sobald die Überprüfung abgeschlossen ist (d. h. der Überprüfungsfortschritt beträgt 100%), werden wir sie zur Website hinzufügen. +Sobald du die Übersetzung abgeschlossen hast (d. h. alle Dateien für eine Inhaltskategorie zeigen 100 % an), wird unser professioneller Übersetzungsdienst den Inhalt überprüfen (und möglicherweise bearbeiten). Sobald die Überprüfung abgeschlossen ist (d. h. der Überprüfungsfortschritt liegt bei 100 %), werden wir ihn zur Website hinzufügen. - Verwenden Sie keine maschinell erstellten Übersetzungen für das Projekt. Alle Übersetzungen werden vor der Veröffentlichung auf der Website überprüft. Wenn sich herausstellt, dass die von Ihnen vorgeschlagenen Übersetzungen maschinell erstellt wurden, werden sie abgelehnt und Übersetzerinnen und Übersetzer, die häufig maschinelle Übersetzungen verwenden, werden aus dem Projekt entfernt. + Bitte verwende keine maschinelle Übersetzung, um das Projekt zu übersetzen. Alle Übersetzungen werden überprüft, bevor sie zur Website hinzugefügt werden. Wenn festgestellt wird, dass deine vorgeschlagenen Übersetzungen maschinell übersetzt wurden, werden sie abgelehnt, und Mitwirkende, die häufig maschinelle Übersetzungen verwenden, werden aus dem Projekt entfernt. -### Kontakt {#get-in-touch} +### Nimm Kontakt auf {#get-in-touch} -Haben Sie noch Fragen? Oder möchten Sie mit unserem Team und anderen Übersetzern zusammenarbeiten? Verfassen Sie Ihre Beiträge im Kanal #translations unseres[Discord-Servers von ethereum.org](https://discord.gg/ethereum-org) +Hast du Fragen? Oder möchtest du mit unserem Team und anderen Übersetzern zusammenarbeiten? Bitte poste im Kanal #translations auf unserem [ethereum.org Discord-Server](https://discord.gg/ethereum-org). -Sie können uns auch unter translations@ethereum.org kontaktieren. +Du kannst uns auch unter translations@ethereum.org erreichen. -Vielen Dank für Ihre Teilnahme am ethereum.org-Übersetzungsprogramm. +Vielen Dank für deine Teilnahme am ethereum.org-Übersetzungsprogramm! \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/index.md b/public/content/translations/de/contributing/translation-program/index.md index d89d018f5bc..40010567a6d 100644 --- a/public/content/translations/de/contributing/translation-program/index.md +++ b/public/content/translations/de/contributing/translation-program/index.md @@ -1,26 +1,26 @@ --- -title: Übersetzungsprogramm +title: "Übersetzungsprogramm" lang: de -description: Informationen zum Übersetzungsprogramm von ethereum.org +description: "Informationen über das ethereum.org-Übersetzungsprogramm" --- # Übersetzungsprogramm {#translation-program} -Das Übersetzungsprogramm ist ein gemeinsamer Versuch, ethereum.org in verschiedene Sprachen zu übersetzen, um die Website für Milliarden von Menschen zugänglich zu machen, die kein Englisch sprechen. +Das Übersetzungsprogramm ist ein gemeinschaftliches Projekt zur Übersetzung von ethereum.org in verschiedene Sprachen, um die Website für Milliarden von nicht englischsprachigen Menschen auf der ganzen Welt zugänglicher zu machen. ![](./enterprise-eth.png) -## Helfen Sie uns bei der Übersetzung {#help-us-translate} +## Hilf uns beim Übersetzen {#help-us-translate} -Das ethereum.org Übersetzungsprogramm ist offen und jeder kann dazu beitragen! +Das ethereum.org-Übersetzungsprogramm ist offen und jeder kann dazu beitragen! -1. Sie müssen sich bei Ihrem Crowdin-Konto anmelden oder sich registrieren. -2. Wählen Sie die Sprache aus, zu der Sie beitragen möchten. -3. Bevor Sie beginnen, schauen Sie sich bitte die [Wie übersetzen](/contributing/translation-program/how-to-translate/) Anleitung an, um zu erfahren, wie Sie Crowdin verwenden, und der [Übersetzungsstil-Leitfaden](/contributing/translation-program/translators-guide/) für Tipps und Best Practices. +1. Du musst dich in deinem Crowdin-Konto anmelden oder dich registrieren. +2. Wähle die Sprache aus, zu der du beitragen möchtest. +3. Bevor du beginnst, sieh dir bitte den Leitfaden [Wie man übersetzt](/contributing/translation-program/how-to-translate/) an, um zu erfahren, wie man Crowdin nutzt, sowie den [Übersetzungs-Styleguide](/contributing/translation-program/translators-guide/) für Tipps und bewährte Methoden. 4. Maschinelle Übersetzungen werden nicht genehmigt. -5. Alle Übersetzungen werden überprüft, bevor sie zur Seite hinzugefügt werden. Daher gibt es eine kurze Verzögerung, bevor Ihre Übersetzungen veröffentlicht werden. +5. Alle Übersetzungen werden überprüft, bevor sie der Website hinzugefügt werden. Es gibt also eine kurze Verzögerung, bevor deine Übersetzungen live gehen. -_Treten Sie dem [ethereum.org-Discord](https://discord.gg/ethereum-org) bei, um an Übersetzungen mitzuarbeiten, Fragen zu stellen, Feedback und Ideen zu teilen oder einer Übersetzungsgruppe beizutreten._ +_Tritt dem [ethereum.org Discord](https://discord.gg/ethereum-org) bei, um bei Übersetzungen zusammenzuarbeiten, Fragen zu stellen, Feedback und Ideen zu teilen oder einer Übersetzungsgruppe beizutreten._ Mit dem Übersetzen beginnen @@ -28,63 +28,64 @@ _Treten Sie dem [ethereum.org-Discord](https://discord.gg/ethereum-org) bei, um ## Über das Übersetzungsprogramm {#about-us} -Die Ethereum-Community hat das Ziel, global und inklusiv zu sein. Doch ein Großteil des Inhalts richtet sich nur an englischsprachige Personen und lässt die weltweit 6 Milliarden Menschen, die kein Englisch sprechen, außen vor. Damit ethereum.org für die weltweite Community als Zugang zu Ethereum fungieren kann, ist es unserer Meinung nach wichtig, den nicht englisch sprechenden Menschen Ethereum-Inhalte in ihrer Muttersprache zur Verfügung zu stellen. +Die [Ethereum](/)-Community strebt danach, global und inklusiv zu sein, doch ein Großteil ihrer Inhalte richtet sich nur an englischsprachige Personen, wodurch die 6 Milliarden nicht englischsprachigen Menschen der Welt ausgeschlossen werden. Damit ethereum.org als Portal zu Ethereum für die weltweite Community fungieren kann, glauben wir, dass es unerlässlich ist, nicht englischsprachigen Personen Ethereum-Inhalte in ihren Muttersprachen zur Verfügung zu stellen. -Das Übersetzungsprogramm von ethereum.org zielt darauf ab, Ethereum jedermann zugänglich zu machen, indem ethereum.org und andere Ethereum-Inhalte in so viele Sprachen wie möglich übersetzt werden. +Das ethereum.org-Übersetzungsprogramm zielt darauf ab, Ethereum für jeden zugänglich zu machen, indem ethereum.org und andere Ethereum-Inhalte in so viele Sprachen wie möglich übersetzt werden. -Lesen Sie mehr über [Mission und Vision](/contributing/translation-program/mission-and-vision) des Übersetzungsprogramms auf ethereum.org. +Lies mehr über die [Mission und Vision](/contributing/translation-program/mission-and-vision) des ethereum.org-Übersetzungsprogramms. -### Unsere bisherigen Fortschritte {#our-progress} +### Unser bisheriger Fortschritt {#our-progress} -- [**5.100 +** Übersetzer](/contributing/translation-program/contributors/) -- Die Seite ist in **54** Sprachen verfügbar -- [**3 Millionen** Wörter übersetzt im Jahr 2022](/contributing/translation-program/acknowledgements/) +- [**6.900 +** Übersetzer](/contributing/translation-program/contributors/) +- **68** Sprachen live auf der Website +- [**2,89 Millionen** übersetzte Wörter im Jahr 2024](/contributing/translation-program/acknowledgements/) -### Danksagungen {#acknowledgements} +### Anerkennungen {#acknowledgements} -Ethereum.org wird von Tausenden von Community-Mitgliedern übersetzt und sie bilden den wichtigsten Teil des Übersetzungsprogramms. Wir wollen unseren Übersetzern Anerkennung entgegenbringen und sie auf ihrem Karriereweg unterstützen. Hier sind einige der Auszeichnungen für unsere Übersetzer: +Ethereum.org wird von Tausenden von Community-Mitgliedern übersetzt, und sie sind der wichtigste Teil des Übersetzungsprogramms. +Wir möchten unsere Übersetzer anerkennen und sie auf ihren Karrierewegen unterstützen. Hier sind einige unserer Anerkennungen für Übersetzer: #### Zertifikat {#certificate} -Wenn Sie zum Übersetzungsprogramm beigetragen haben und mindestens 5.000 Ihrer übersetzten Wörter genehmigt wurden, haben Sie Anspruch auf ein ethereum.org-Übersetzerzertifikat. [Mehr über Zertifikate](/contributing/translation-program/acknowledgements/#certificate) +Wenn du zum Übersetzungsprogramm beigetragen hast und mindestens 5.000 deiner übersetzten Wörter genehmigt wurden, hast du Anspruch auf ein ethereum.org-Übersetzerzertifikat. [Mehr zu Zertifikaten](/contributing/translation-program/acknowledgements/#certificate) -#### POAPs {#poaps} +#### OATs {#oats} -Alle unsere Übersetzer haben Anspruch auf ein POAP (Proof of Attendance Protocol) – ein NFT, das ihren Beitrag zum Übersetzungsprogramm von ethereum.org belegt. [Mehr über POAPs](/contributing/translation-program/acknowledgements/#poap) +Mitwirkende am Übersetzungsprogramm haben Anspruch auf verschiedene OATs (Leistungs-Token auf der Blockchain), basierend auf der Anzahl ihrer übersetzten Wörter im Jahr 2024. OATs sind NFTs, die deinen Beitrag zum ethereum.org-Übersetzungsprogramm belegen. [Mehr zu OATs](/contributing/translation-program/acknowledgements/#oats) -#### Danksagungen an die Übersetzer {#translator-acknowledgements} +#### Anerkennungen für Übersetzer {#translator-acknowledgements} -Öffentliche Anerkennungen unserer besten Übersetzer durch [Leaderboards](/contributing/translation-program/acknowledgements/) und eine [Liste aller Übersetzer, die zum Übersetzungsprogramm beitragen](/contributing/translation-program/contributors/). +Öffentliche Anerkennungen unserer Top-Übersetzer durch [Bestenlisten](/contributing/translation-program/acknowledgements/) und eine [Liste aller Mitwirkenden am Übersetzungsprogramm](/contributing/translation-program/contributors/). #### Belohnungen {#rewards} -In der Vergangenheit haben wir unsere aktivsten Beitragenden rückwirkend mit Tickets für Ethereum-Konferenzen wie [Devcon](https://devcon.org/en/) und [Devconnect](https://devconnect.org/) sowie mit exklusiven ethereum.org-Artikeln belohnt. +In der Vergangenheit haben wir unsere aktivsten Mitwirkenden rückwirkend mit Tickets für Ethereum-Konferenzen wie [Devcon](https://devcon.org/en/) und [Devconnect](https://devconnect.org/) sowie exklusivem ethereum.org-Merchandise belohnt. -Wir denken ständig über neue und innovative Möglichkeiten nach, unsere Mitwirkenden zu belohnen, also bleiben Sie dran! +Wir denken ständig über neue und innovative Wege nach, um unsere Mitwirkenden zu belohnen, also bleib dran! -### Anleitungen und Ressourcen {#guides-and-resources} +### Leitfäden und Ressourcen {#guides-and-resources} -Wenn Sie zum Übersetzungsprogramm beitragen oder daran denken, sich zu beteiligen, sollten Sie sich die folgenden Übersetzungsanleitungen ansehen: +Wenn du zum Übersetzungsprogramm beiträgst oder darüber nachdenkst, dich zu engagieren, solltest du dir die folgenden Übersetzungsleitfäden ansehen: -- [Übersetzungsleitfaden](/contributing/translation-program/translators-guide/)_ – Anleitungen und Tipps für ethereum.org-Übersetzer_ -- [Übersetzungs-FAQs](/contributing/translation-program/faq/)_ – häufig gestellte Fragen und Antworten zum Übersetzungsprogramm von ethereum.org_ -- [Editorleitfaden für Crowdin-Online](https://support.crowdin.com/online-editor/)_ – ein ausführlicher Ratgeber für die Nutzung des Online-Crowdin-Editors und seiner umfangreichen Funktionen_ -- [Inhaltsbereich](/contributing/translation-program/)_ – welche Seiten gehören zu welchen Inhaltsbereichen von ethereum.org_ +- [Übersetzungs-Styleguide](/contributing/translation-program/translators-guide/) _– Anweisungen und Tipps für ethereum.org-Übersetzer_ +- [Übersetzungs-FAQs](/contributing/translation-program/faq/) _– Häufig gestellte Fragen und Antworten zum ethereum.org-Übersetzungsprogramm_ +- [Leitfaden für den Crowdin-Online-Editor](https://support.crowdin.com/online-editor/) _– ein ausführlicher Leitfaden zur Nutzung des Crowdin-Online-Editors und einiger erweiterter Funktionen von Crowdin_ -Für andere nützliche Übersetzungstools, Übersetzergemeinschaften und Blog-Einträge des Übersetzungsprogramms besuchen Sie bitte die [Ressourcenseite](/contributing/translation-program/resources/). +Für weitere nützliche Übersetzungstools, Übersetzer-Communitys und Blogbeiträge zum Übersetzungsprogramm besuche bitte die [Ressourcenseite](/contributing/translation-program/resources/). -## Kontaktieren Sie uns {#get-in-touch} +## Kontakt aufnehmen {#get-in-touch} -Haben Sie noch Fragen? Oder möchten Sie mit unserem Team und anderen Übersetzern zusammenarbeiten? Verfassen Sie Ihre Beiträge im Kanal #translations unseres[Discord-Servers von ethereum.org](https://discord.gg/ethereum-org) +Hast du Fragen? Oder möchtest du mit unserem Team und anderen Übersetzern zusammenarbeiten? Bitte poste im Kanal #translations auf unserem [ethereum.org Discord-Server](https://discord.gg/ethereum-org) -Sie können uns auch unter translations@ethereum.org kontaktieren. +Du kannst uns auch unter translations@ethereum.org erreichen. -## Ihr eigenes Übersetzungsprogramm starten {#starting-a-translation-program} +## Ein eigenes Übersetzungsprogramm starten {#starting-a-translation-program} -Wir sind bestrebt, Ethereum-Inhalte in so viele Sprachen wie möglich zu übersetzen und Bildungsinhalte für alle zugänglich zu machen. Im Rahmen unserer Übersetzungsbemühungen möchten wir andere Ethereum-Projekte dabei unterstützen, ihre eigenen Übersetzungsbemühungen zu organisieren, zu verwalten und zu verbessern. +Wir widmen uns der Übersetzung von Ethereum-Inhalten in so viele Sprachen wie möglich und machen Bildungsinhalte für jeden zugänglich. +Im Einklang mit unserem Fokus auf Übersetzungen möchten wir anderen Ethereum-Projekten helfen, ihre eigenen Übersetzungsbemühungen zu organisieren, zu verwalten und zu verbessern. -Daher haben wir ein [Playbook für Übersetzungsprogramme](/contributing/translation-program/playbook/) erstellt, das einige Tipps und Best Practices enthält, die wir während der Übersetzung von ethereum.org gesammelt haben. +Aus diesem Grund haben wir ein [Playbook für Übersetzungsprogramme](/contributing/translation-program/playbook/) erstellt, das einige Tipps und bewährte Methoden enthält, die wir bei der Übersetzung von ethereum.org gesammelt haben. -Möchten Sie Ihre Zusammenarbeit fortführen oder einige unserer Übersetzungsressourcen nutzen? Haben Sie Feedback zum Playbook? Wir würden uns freuen, von Ihnen zu hören: translations@ethereum.org. +Möchtest du weiter zusammenarbeiten oder einige unserer Übersetzungsressourcen nutzen? Hast du Feedback zum Playbook? Wir würden uns freuen, von dir unter translations@ethereum.org zu hören. \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/mission-and-vision/index.md b/public/content/translations/de/contributing/translation-program/mission-and-vision/index.md index e5a2c8124af..d57dd675838 100644 --- a/public/content/translations/de/contributing/translation-program/mission-and-vision/index.md +++ b/public/content/translations/de/contributing/translation-program/mission-and-vision/index.md @@ -1,25 +1,25 @@ --- title: Mission und Vision lang: de -description: Aufgabe und Vision des Übersetzungsprogramms von ethereum.org +description: "Mission und Vision des Übersetzungsprogramms von ethereum.org" --- # Mission und Vision {#mission-and-vision} -Die Ethereum-Community hat das Ziel, global und inklusiv zu sein. Doch ein Großteil des Inhalts richtet sich nur an englischsprachige Personen und lässt die weltweit 6 Milliarden Menschen, die kein Englisch sprechen, außen vor. Damit ethereum.org für die weltweite Community als Zugang zu Ethereum fungieren kann, ist es unserer Meinung nach wichtig, den nicht englisch sprechenden Menschen Ethereum-Inhalte in ihrer Muttersprache zur Verfügung zu stellen. +Die Ethereum-Community strebt danach, global und inklusiv zu sein, doch ein Großteil ihrer Inhalte richtet sich nur an englischsprachige Personen, wodurch die 6 Milliarden nicht-englischsprachigen Menschen weltweit ausgeschlossen werden. Damit ethereum.org als Portal zu Ethereum für die weltweite Community fungieren kann, halten wir es für unerlässlich, nicht-englischsprachigen Personen Ethereum-Inhalte in ihren Muttersprachen zur Verfügung zu stellen. -Das Übersetzungsprogramm von ethereum.org zielt darauf ab, Ethereum jedermann zugänglich zu machen, indem ethereum.org und andere Ethereum-Inhalte in so viele Sprachen wie möglich übersetzt werden. +Das Übersetzungsprogramm von ethereum.org zielt darauf ab, Ethereum für jeden zugänglich zu machen, indem ethereum.org und andere Ethereum-Inhalte in so viele Sprachen wie möglich übersetzt werden. ## Unsere Mission {#our-mission} -- Übersetzte Versionen der Website bereitstellen, um Besuchern weltweit die Möglichkeit zu geben, in ihrer Muttersprache mehr über Ethereum zu erfahren -- Mehr Mitgliedern die Teilnahme an der globalen Ethereum-Community erleichtern -- Den Austausch von Ethereum-Informationen und Wissen zugänglicher und inklusiver gestalten -- Mitglieder der Community dazu ermuntern, Übersetzungen zu Ethereum und so zum Ökosystem beizutragen -- Leidenschaftliche Mitwirkende identifizieren, die sich am Ökosystem beteiligen möchten, sich mit ihnen verbinden und Orientierungshilfen bieten +- Bereitstellung übersetzter Versionen der Website, um Besuchern weltweit die Möglichkeit zu geben, in ihrer Muttersprache mehr über Ethereum zu erfahren +- Erleichterung des Onboardings weiterer Mitglieder in die globale Ethereum-Community +- Ermöglichung eines zugänglicheren und inklusiveren Austauschs von Informationen und Wissen über Ethereum +- Befähigung von Community-Mitgliedern, Übersetzungen zu Ethereum beizutragen und das Ökosystem aktiv mitzugestalten +- Identifizierung, Vernetzung und Anleitung von leidenschaftlichen Mitwirkenden, die sich im Ökosystem engagieren möchten ## Unsere Vision {#our-vision} -- Wichtige Inhalte für Mitglieder der Ethereum-Community aus so vielen Ländern und Teilen der Welt wie möglich übersetzen -- Den wissensaustausch über Sprachen hinweg unterstützen, um eine besser informierte und gebildete Ethereum-Community zu schaffen -- Inklusivität und Zugänglichkeit von Ethereum verbessern, indem Sprachbarrieren beseitigt werden, die nicht englischsprachige Personen daran hindern, dem Ökosystem beizutreten +- Übersetzung wesentlicher Inhalte für Mitglieder der Ethereum-Community aus so vielen Ländern und Teilen der Welt wie möglich +- Unterstützung des sprachübergreifenden Wissensaustauschs, um eine besser informierte und gebildete Ethereum-Community zu schaffen +- Erhöhung der Inklusivität und Zugänglichkeit von Ethereum durch den Abbau von Sprachbarrieren, die nicht-englischsprachige Personen daran hindern, dem Ökosystem beizutreten \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/playbook/index.md b/public/content/translations/de/contributing/translation-program/playbook/index.md new file mode 100644 index 00000000000..f449fa8f8b6 --- /dev/null +++ b/public/content/translations/de/contributing/translation-program/playbook/index.md @@ -0,0 +1,317 @@ +--- +title: "Playbook für Übersetzungsprogramme" +lang: de +description: "Eine Sammlung von Tipps und wichtigen Überlegungen zur Einrichtung eines Übersetzungsprogramms" +--- + +# Playbook für Übersetzungsprogramme {#translation-program-playbook} + +Englisch ist eine der meistgesprochenen Sprachen der Welt und mit Abstand die am häufigsten gelernte Sprache. Da Englisch die am häufigsten im Internet verwendete Sprache ist – insbesondere in den sozialen Medien – und mehrsprachige Programmiersprachen rar sind, wird der Großteil der Inhalte im Blockchain-Bereich nativ auf Englisch verfasst. + +Da jedoch über 6 Milliarden Menschen auf der Welt (mehr als 75 % der Bevölkerung) überhaupt kein Englisch sprechen, stellt dies für die überwiegende Mehrheit der Weltbevölkerung eine massive Eintrittsbarriere zu Ethereum dar. + +Aus diesem Grund versuchen immer mehr Projekte in diesem Bereich, ihre Inhalte in verschiedene Sprachen übersetzen und für globale Communitys lokalisieren zu lassen. + +Die Bereitstellung mehrsprachiger Inhalte ist eine einfache und effektive Möglichkeit, Ihre globale Community zu vergrößern, Nicht-Muttersprachlern Bildung zu bieten, sicherzustellen, dass Ihre Inhalte und Kommunikation ein breiteres Publikum erreichen, und mehr Menschen in den Bereich einzuführen. + +Dieser Leitfaden zielt darauf ab, die häufigsten Herausforderungen und Missverständnisse bei der Lokalisierung von Inhalten anzugehen. Er bietet eine Schritt-für-Schritt-Anleitung zur Verwaltung von Inhalten, zum Übersetzungs- und Überprüfungsprozess, zur Qualitätssicherung, zur Kontaktaufnahme mit Übersetzern und zu anderen wichtigen Aspekten des Lokalisierungsprozesses. + +## Content-Management {#content-management} + +Das Content-Management für Übersetzungen bezieht sich auf den Prozess der Automatisierung des Übersetzungs-Workflows, wodurch sich wiederholende manuelle Arbeiten entfallen, die Effizienz und Qualität verbessert werden, eine bessere Kontrolle ermöglicht und die Zusammenarbeit gefördert wird. + +Es gibt viele verschiedene Ansätze für das Content-Management im Lokalisierungsprozess, abhängig von den Inhalten und Ihren Anforderungen. + +Die grundlegende Methode zur Verwaltung von Inhalten besteht darin, zweisprachige Dateien zu erstellen, die den Ausgangs- und Zieltext enthalten. Dies wird bei Übersetzungen selten verwendet, da es abgesehen von der Einfachheit keine wesentlichen Vorteile bietet. + +Übersetzungsagenturen gehen das Übersetzungsmanagement in der Regel durch den Einsatz von Übersetzungsmanagement-Software oder Lokalisierungstools an, die Projektmanagementfunktionen bieten und eine viel größere Kontrolle über die Dateien, Inhalte und Linguisten ermöglichen. + +Lesen Sie mehr über Content-Management: + +[Trados darüber, was Übersetzungsmanagement ist](https://www.trados.com/solutions/translation-management/) + +[Phrase über mehrsprachiges Content-Management](https://phrase.com/blog/posts/multilingual-content-management/) + +### Übersetzungsmanagement-Software {#translation-management-software} + +Es gibt viele Übersetzungsmanagementsysteme und Lokalisierungstools, und die Wahl der Software hängt hauptsächlich von Ihren Anforderungen ab. + +Während sich einige Projekte gegen den Einsatz von Übersetzungsmanagementsystemen entscheiden und es vorziehen, Übersetzungen manuell zu handhaben – entweder direkt in zweisprachigen Dateien oder auf Hosting-Diensten wie GitHub –, verringert dies die Kontrolle, Produktivität, Qualität, Skalierbarkeit und Möglichkeiten zur Zusammenarbeit drastisch. Ein solcher Ansatz könnte für kleine oder einmalige Übersetzungsprojekte am vorteilhaftesten sein. + +Ein kurzer Blick auf einige der leistungsstärksten und am weitesten verbreiteten Übersetzungsmanagement-Tools: + +**Am besten für Crowdsourcing und Zusammenarbeit** + +[Crowdin](https://crowdin.com/) + +- Kostenlos für Open-Source-Projekte (unbegrenzte Anzahl von Strings und Projekten) +- TM und Glossar in allen Plänen verfügbar +- Über 60 unterstützte Dateiformate, über 70 API-Integrationen + +[Lokalise](https://lokalise.com/) + +- Kostenlos für 2 Teammitglieder, kostenpflichtige Pläne für mehr Mitwirkende (begrenzte Anzahl von Strings für die meisten Pläne) +- TM und Glossar in einigen kostenpflichtigen Plänen verfügbar +- Über 30 unterstützte Dateiformate, über 40 API-Integrationen + +[Transifex](https://www.transifex.com/) + +- Nur kostenpflichtige Pläne (begrenzte Anzahl von Strings für die meisten Pläne) +- TM und Glossar in allen kostenpflichtigen Plänen verfügbar +- Über 30 unterstützte Dateiformate, über 20 API-Integrationen + +[Phrase](https://phrase.com/) + +- Nur kostenpflichtige Pläne (unbegrenzte Anzahl von Strings für alle Pläne, begrenzte Anzahl von Projekten und Teammitgliedern) +- TM und Glossar in einigen kostenpflichtigen Plänen verfügbar +- Über 40 unterstützte Dateiformate, über 20 API-Integrationen + +[Smartcat](https://www.smartcat.com/) + +- Kostenloser Basisplan mit kostenpflichtigen erweiterten Funktionen (unbegrenzte Anzahl von Strings und Projekten für alle Pläne) +- TM und Glossar in allen Plänen verfügbar +- Über 60 unterstützte Dateiformate, über 20 API-Integrationen + +[POEditor](https://poeditor.com/) + +- Kostenlos für Open-Source-Projekte (begrenzte Anzahl von Strings für alle Projekte, unbegrenzt für Open-Source-Projekte) +- TM und Glossar für kostenpflichtige Pläne verfügbar +- Über 20 unterstützte Dateiformate, über 10 API-Integrationen + +und viele andere... + +**Professionelle Übersetzungstools** + +[SDL Trados Studio](https://www.trados.com/products/trados-studio/) + +- Kostenpflichtige Pläne für freiberufliche Übersetzer und Teams +- Sehr leistungsstarkes Tool für computerunterstützte Übersetzung (CAT) und Produktivitätssoftware für Übersetzer + +[MemoQ](https://www.memoq.com/) + +- Eingeschränkte kostenlose Version verfügbar mit mehreren kostenpflichtigen Plänen für erweiterte Funktionen +- Übersetzungsmanagement-Software für Unternehmen, Sprachdienstleister und Übersetzer + +[Memsource](https://www.memsource.com/) + +- Kostenlos für einzelne Übersetzer mit mehreren kostenpflichtigen Plänen für Teams +- Cloud-basiertes System für computerunterstützte Übersetzung und Übersetzungsmanagement + +und viele andere... + +Lesen Sie mehr über Übersetzungsmanagement-Software: + +[Wikipedia-Definition von Übersetzungsmanagementsystemen](https://en.wikipedia.org/wiki/Translation_management_system) + +[Phrase über 7 Dinge, die jede Übersetzungsmanagement-Software haben sollte](https://phrase.com/blog/posts/7-things-every-translation-management-software-should-have/) + +[MemoQ darüber, was ein Übersetzungsmanagementsystem ist](https://www.memoq.com/tools/what-is-a-translation-management-system) + +[Gengos Liste der 16 besten Übersetzungsmanagementsysteme](https://gengo.com/translator-product-updates/16-best-translation-management-systems/) + +## Workflow {#workflow} + +Im Übersetzungsbereich kann der Übersetzungs-Workflow verschiedene Dinge bedeuten, die beide in gewisser Weise miteinander zusammenhängen und wichtige Überlegungen für Ihr Projekt darstellen. + +Wir werden beide im Folgenden untersuchen. + +**Bedeutung 1** + +Dies ist wahrscheinlich die häufigste Art, über Übersetzungs-Workflows nachzudenken, und etwas, das einem normalerweise in den Sinn kommt, wenn man das Wort Workflow hört. + +Im Wesentlichen ist es der „Arbeitsfluss“ von den ersten Gedanken über Übersetzungen bis hin zur Verwendung der übersetzten Inhalte in Ihrem Produkt. + +Ein beispielhafter Workflow in diesem Fall wäre: + +1. **Vorbereitung der Dateien für die Übersetzung** – Es klingt einfach; Sie müssen jedoch einige wichtige Dinge beachten. In diesem Schritt sollten Sie einen klaren Plan haben, wie der gesamte Prozess ablaufen soll. + +- _Welche Dateitypen werden Sie verwenden? In welchem Format möchten Sie Ihre übersetzten Dateien erhalten?_ + - Wenn Ihre Inhalte im DOCX- oder MD-Format vorliegen, ist der Ansatz viel unkomplizierter, als wenn Sie eine PDF-Version Ihres Whitepapers oder anderer Dokumente übersetzen. +- _Welche Lokalisierungstools unterstützen diesen Dateityp? Kann die Datei so übersetzt werden, dass die ursprüngliche Formatierung erhalten bleibt?_ + - Nicht alle Dateitypen unterstützen eine direkte Lokalisierung (z. B. PDF-Dateien, Bilddateien), und nicht alle Lokalisierungstools unterstützen alle Dateitypen. +- _Wer wird die Inhalte übersetzen? Werden Sie professionelle Übersetzungen in Auftrag geben oder sich auf Freiwillige verlassen?_ + - Dies wirkt sich auf eine Reihe anderer Entscheidungen aus, die Sie treffen müssen. Beispielsweise arbeiten professionelle Übersetzer lieber mit fortschrittlichen Lokalisierungstools als Freiwillige. +- _Was sind Ihre Erwartungen an die Linguisten? Wenn Sie einen Sprachdienstleister beauftragen, was erwartet dieser von Ihnen?_ + - Dies ist der Schritt, um sicherzustellen, dass Ihre Ziele, Erwartungen und Zeitpläne aufeinander abgestimmt sind. +- _Sind alle zu übersetzenden Inhalte gleich wichtig? Sollten einige Inhalte zuerst übersetzt werden?_ + - Es gibt einige Möglichkeiten, bestimmte Inhalte zu priorisieren, die zuerst übersetzt und implementiert werden sollten. Wenn Sie beispielsweise viele Inhalte zur Übersetzung haben, können Sie die Versionskontrolle verwenden, um sicherzustellen, dass die Übersetzer wissen, welche sie priorisieren sollten. + +2. **Freigabe der Dateien zur Übersetzung** – Dieser Schritt erfordert ebenfalls etwas langfristiges Denken und ist nicht so unkompliziert wie das Senden der Quelldateien an einen Sprachdienstleister. + +- _Wer wird die Inhalte übersetzen? Wie viele Personen werden an diesem Prozess beteiligt sein?_ + - Wenn Sie planen, ein Lokalisierungstool zu verwenden, wird dieser Schritt vereinfacht, da Sie die Quelldateien direkt in das Tool hochladen können. Dies gilt auch, wenn der Übersetzungsprozess auf dem Hosting-Dienst stattfindet, da die Quelldateien nirgendwohin exportiert werden müssen. +- _Werden die Quelldateien manuell verarbeitet oder kann dieser Prozess automatisiert werden?_ + - Die meisten Lokalisierungstools ermöglichen eine Art Integration oder Automatisierung des Dateiverwaltungsprozesses. Wenn Sie hingegen mit einzelnen Übersetzern arbeiten und kein Lokalisierungstool verwenden, ist das manuelle Senden von Quelldateien an Hunderte oder Tausende von Übersetzern kein skalierbarer Prozess. +- _Welche Tools werden für die Lokalisierung verwendet?_ + - Die Antwort auf diese Frage bestimmt, wie Sie alles andere angehen. Die Auswahl des richtigen Tools kann Ihnen helfen, das Content-Management, die Verwaltung von Translation Memory und Glossar, die Verwaltung von Übersetzern, die Verfolgung des Übersetzungs-/Überprüfungsfortschritts usw. zu automatisieren. Nehmen Sie sich also etwas Zeit und recherchieren Sie, welches Tool Sie verwenden möchten. Wenn Sie nicht planen, ein Lokalisierungstool zu verwenden, müssen alle oben genannten Schritte manuell durchgeführt werden. +- _Wie lange wird der Übersetzungsprozess dauern? Wie viel wird er kosten?_ + - Zu diesem Zeitpunkt sollten Sie bereit sein, die Quelldateien mit dem Sprachdienstleister oder dem Übersetzerpool zu teilen. Der Sprachdienstleister kann Ihnen helfen, die Wortzahl zu analysieren und ein Angebot zu erstellen, das die Preise und den Zeitplan für den Übersetzungsprozess enthält. +- _Planen Sie, während dieses Prozesses Änderungen an den Quellinhalten vorzunehmen oder diese zu aktualisieren?_ + - Wenn Ihre Inhalte dynamisch sind und sich häufig ändern, können Änderungen oder Aktualisierungen den Übersetzungsfortschritt stören. Die Verwendung eines Translation Memory kann helfen, dies erheblich abzumildern, obwohl es dennoch wichtig ist, darüber nachzudenken, wie der Prozess ablaufen wird und wie Sie verhindern können, dass der Fortschritt der Übersetzer zurückgeworfen wird. + +3. **Verwaltung des Übersetzungsprozesses** – Ihre Arbeit ist nicht erledigt, sobald die Quellinhalte an den Sprachdienstleister oder die Übersetzer übergeben wurden. Um eine optimale Qualität der Übersetzungen zu gewährleisten, sollten die Ersteller von Inhalten so stark wie möglich in den Übersetzungsprozess eingebunden sein. + +- _Wie planen Sie, mit den Übersetzern zu kommunizieren?_ + - Wenn Sie planen, ein Lokalisierungstool zu verwenden, kann die Kommunikation direkt im Tool stattfinden. Die Einrichtung eines alternativen Kommunikationskanals mit den Übersetzern wird ebenfalls empfohlen, da sie möglicherweise weniger zögern, sich zu melden, und Messaging-Tools eine fließendere Kommunikation ermöglichen. +- _Wie geht man mit Fragen von Übersetzern um? Wer sollte diese Fragen beantworten?_ + - Übersetzer (sowohl professionelle als auch nicht-professionelle) melden sich oft mit Fragen und Bitten um Klärung oder zusätzlichen Kontext sowie mit Feedback und Ideen für Verbesserungen. Die Beantwortung dieser Anfragen kann oft zu einem besseren Engagement und einer höheren Qualität der übersetzten Inhalte führen. Es ist auch wertvoll, ihnen so viele Ressourcen wie möglich zur Verfügung zu stellen (z. B. Leitfäden, Tipps, Terminologierichtlinien, FAQs usw.). +- _Wie geht man mit dem Überprüfungsprozess um? Möchten Sie ihn auslagern oder haben Sie die Kapazität, Überprüfungen intern durchzuführen?_ + - Obwohl nicht immer notwendig, sind Überprüfungen ein wesentlicher Bestandteil eines optimalen Übersetzungsprozesses. In der Regel ist es am einfachsten, den Überprüfungsprozess an professionelle Prüfer auszulagern. Wenn Sie jedoch über ein großes internationales Team verfügen, können die Überprüfungen oder die Qualitätssicherung (QA) auch intern durchgeführt werden. + +4. **Implementierung der übersetzten Inhalte** – Der letzte Teil des Workflows, der jedoch im Voraus bedacht werden sollte. + +- _Werden alle Übersetzungen gleichzeitig abgeschlossen sein?_ + - Wenn nicht, sollten Sie darüber nachdenken, welche Übersetzungen priorisiert werden sollten, wie Sie den Überblick über die laufenden Übersetzungen behalten und wie die Implementierung gehandhabt wird, während die Übersetzungen durchgeführt werden. +- _Wie werden Ihnen die übersetzten Inhalte geliefert? In welchem Format werden sie vorliegen?_ + - Dies ist eine wichtige Überlegung, unabhängig davon, welchen Ansatz Sie verwenden. Lokalisierungstools ermöglichen es Ihnen, die Kontrolle über das Zieldateiformat und den Exportprozess zu behalten, und unterstützen in der Regel die Automatisierung, z. B. durch die Ermöglichung der Integration mit dem Hosting-Dienst. +- _Wie werden Sie die Übersetzungen in Ihrem Projekt implementieren?_ + - In einigen Fällen könnte dies so einfach sein wie das Hochladen der übersetzten Datei oder das Hinzufügen zu Ihren Dokumenten. Bei komplexeren Projekten wie Website- oder App-Übersetzungen sollten Sie jedoch sicherstellen, dass der Code die Internationalisierung unterstützt, und im Voraus festlegen, wie der Implementierungsprozess gehandhabt wird. +- _Was passiert, wenn die Formatierung von der Quelle abweicht?_ + - Ähnlich wie oben beschrieben, ist die Formatierung bei der Übersetzung einfacher Textdateien wahrscheinlich nicht von entscheidender Bedeutung. Bei komplexeren Dateien, wie Inhalten für eine Website oder Anwendung, müssen Formatierung und Code jedoch mit der Quelle identisch sein, um in Ihrem Projekt implementiert werden zu können. Wenn nicht, müssen die Zieldateien entweder von den Übersetzern oder Ihren Entwicklern bearbeitet werden. + +**Bedeutung 2** + +Ein alternativer Übersetzungs-Workflow, der interne Entscheidungen und Ansätze nicht berücksichtigt. Das Hauptaugenmerk liegt hier auf dem Fluss der Inhalte selbst. + +Ein beispielhafter Workflow in diesem Fall wäre: + +1. _Übersetzung → Implementierung_ + +- Der einfachste Workflow, bei dem die Übersetzung wahrscheinlich eine menschliche Übersetzung sein wird, da es keinen Überprüfungs- oder QA-Prozess gibt, um die Qualität zu bewerten und die Übersetzungen vor der Implementierung zu bearbeiten. +- Bei diesem Workflow ist es wichtig, dass die Übersetzer ein gewisses Qualitätsniveau aufrechterhalten können, was angemessene Ressourcen und Kommunikation zwischen den Projektmanagern und Übersetzern erfordert. + +2. _Übersetzung → Überprüfung → Implementierung_ + +- Ein fortschrittlicherer Workflow, der einen Überprüfungs- und Bearbeitungsprozess umfasst, um sicherzustellen, dass die Qualität der Übersetzungen akzeptabel und konsistent ist. +- Es gibt eine Reihe von Ansätzen für diesen Workflow, bei denen die Übersetzungen von professionellen Übersetzern oder Freiwilligen durchgeführt werden könnten, während der Überprüfungsprozess wahrscheinlich von professionellen Prüfern gehandhabt wird, die mit allen Grammatik- und Orthografieregeln vertraut sind, die in der Zielsprache beachtet werden müssen. + +3. _Übersetzung → Überprüfung → QA → Implementierung_ + +- Der optimale Workflow, um das höchste Qualitätsniveau zu gewährleisten. Obwohl QA nicht immer notwendig ist, könnte sie nützlich sein, um Ihnen ein besseres Gefühl für die Qualität des übersetzten Textes nach der Übersetzung und Überprüfung zu geben. +- Bei diesem Workflow könnten Übersetzungen ausschließlich von Freiwilligen oder sogar durch maschinelle Übersetzung durchgeführt werden. Der Überprüfungsprozess sollte von professionellen Übersetzern durchgeführt werden, während die QA von einem Sprachdienstleister oder intern durchgeführt werden kann, wenn Sie Mitarbeiter haben, die Muttersprachler der Zielsprachen sind. + +Lesen Sie mehr über Übersetzungs-Workflows: + +[Content Rules über die fünf Phasen des Übersetzungs-Workflows](https://contentrules.com/creating-translation-workflow/) + +[Smartling darüber, was Übersetzungs-Workflow-Management ist](https://www.smartling.com/resources/101/what-is-translation-workflow-management/) + +[RixTrans über den Übersetzungs-Workflow](https://www.rixtrans.com/translation-workflow) + +## Terminologiemanagement {#terminology-management} + +Die Erstellung eines klaren Plans zum Umgang mit Terminologie ist einer der wichtigsten Schritte, um die Qualität und Konsistenz Ihrer Übersetzungen sicherzustellen und Ihren Übersetzern Zeit zu sparen. + +Im Übersetzungsbereich ist dies als Terminologiemanagement bekannt und gehört zu den wichtigsten Dienstleistungen, die Sprachdienstleister ihren Kunden anbieten, zusätzlich zum Zugang zu ihrem Pool von Linguisten und zum Content-Management. + +Terminologiemanagement bezieht sich auf den Prozess der Identifizierung, Sammlung und Verwaltung von Terminologie, die für Ihr Projekt wichtig ist und immer korrekt und konsistent übersetzt werden sollte. + +Es gibt einige Schritte, die Sie befolgen sollten, wenn Sie anfangen, über Terminologiemanagement nachzudenken: + +- Identifizieren Sie Schlüsselbegriffe, die in die Terminologiedatenbank aufgenommen werden sollten. +- Erstellen Sie ein Glossar mit Begriffen und deren Definitionen. +- Übersetzen Sie die Begriffe und fügen Sie sie dem Glossar hinzu. +- Überprüfen und genehmigen Sie die Übersetzungen. +- Pflegen Sie das Glossar und aktualisieren Sie es mit neuen Begriffen, sobald diese wichtig werden. + +Lesen Sie mehr über Terminologiemanagement: + +[Trados darüber, was Terminologiemanagement ist](https://www.trados.com/solutions/terminology-management/translation-101-what-is-terminology-management.html) + +[Language Scientific darüber, warum Terminologiemanagement wichtig ist](https://www.languagescientific.com/terminology-management-why-it-matters/#:~:text=Terminology%20management%20is%20the%20process,are%20related%20to%20each%20other.) + +[Clear Words Translation darüber, was Terminologiemanagement ist und warum es wichtig ist](http://clearwordstranslations.com/language/en/what-is-terminology-management/) + +### Translation Memory und Glossar {#tm-and-glossary} + +Das Translation Memory und das Glossar sind wichtige Werkzeuge in der Übersetzungsbranche und etwas, worauf sich die meisten Sprachdienstleister verlassen. + +Schauen wir uns an, was diese Begriffe bedeuten und wie sie sich voneinander unterscheiden: + +**Translation Memory (TM)** – Eine Datenbank, die automatisch Segmente oder Strings speichert, einschließlich längerer Textblöcke, vollständiger Sätze, Absätze und einzelner Begriffe, sowie deren aktuelle und frühere Übersetzungen in jeder Sprache. + +Die meisten Lokalisierungstools, Übersetzungsmanagementsysteme und Tools für computerunterstützte Übersetzung verfügen über integrierte Translation Memorys, die in der Regel exportiert und auch in anderen ähnlichen Tools verwendet werden können. + +Zu den Vorteilen der Verwendung eines Translation Memory gehören schnellere Übersetzungen, eine bessere Übersetzungsqualität, die Möglichkeit, bestimmte Übersetzungen bei der Aktualisierung oder Änderung von Quellinhalten beizubehalten, und geringere Übersetzungskosten für sich wiederholende Inhalte. + +Translation Memorys arbeiten basierend auf einer prozentualen Übereinstimmung zwischen verschiedenen Segmenten und sind in der Regel am nützlichsten, wenn zwei Segmente zu über 50 % denselben Inhalt enthalten. Sie werden auch verwendet, um sich wiederholende Segmente, die zu 100 % übereinstimmen, automatisch zu übersetzen, wodurch die Notwendigkeit entfällt, sich wiederholende Inhalte jemals mehr als einmal zu übersetzen. + +Lesen Sie mehr über Translation Memorys: + +[Memsource über Translation Memorys](https://www.memsource.com/translation-memory/) + +[Smartling darüber, was ein Translation Memory ist](https://www.smartling.com/resources/101/what-is-translation-memory/) + +**Glossar –** Eine Liste wichtiger oder sensibler Begriffe, ihrer Definitionen, Funktionen und etablierten Übersetzungen. Der Hauptunterschied zwischen einem Glossar und einem Translation Memory besteht darin, dass ein Glossar nicht automatisch erstellt wird und keine Übersetzungen ganzer Sätze enthält. + +Die meisten Lokalisierungstools, Übersetzungsmanagementsysteme und Tools für computerunterstützte Übersetzung verfügen über integrierte Glossare, die Sie pflegen können, um sicherzustellen, dass sie für Ihr Projekt wichtige Terminologie enthalten. Wie das TM kann das Glossar in der Regel exportiert und in anderen Lokalisierungstools verwendet werden. + +Bevor Sie Ihr Übersetzungsprojekt starten, wird dringend empfohlen, sich etwas Zeit zu nehmen und ein Glossar für Ihre Übersetzer und Prüfer zu erstellen. Die Verwendung eines Glossars stellt sicher, dass wichtige Begriffe korrekt übersetzt werden, bietet Übersetzern den dringend benötigten Kontext und garantiert Konsistenz bei den Übersetzungen. + +Während Glossare meistens etablierte Übersetzungen in den Zielsprachen enthalten, sind sie auch ohne diese nützlich. Auch ohne etablierte Übersetzungen kann ein Glossar Definitionen von Fachbegriffen enthalten, Begriffe hervorheben, die nicht übersetzt werden sollten, und Übersetzer darüber informieren, ob ein bestimmter Begriff als Substantiv, Verb, Eigenname oder als ein anderer Wortart verwendet wird. + +Lesen Sie mehr über Glossare: + +[Lionbridge darüber, was ein Übersetzungsglossar ist](http://info.lionbridge.com/rs/lionbridge/images/Lionbridge%20FAQ_Glossary_2013.pdf) + +[Transifex über Glossare](https://docs.transifex.com/glossary/glossary) + +Wenn Sie nicht planen, ein Lokalisierungstool für Ihr Projekt zu verwenden, werden Sie wahrscheinlich kein Translation Memory und Glossar verwenden können (Sie könnten ein Glossar oder eine Terminologiedatenbank in einer Excel-Datei erstellen, jedoch entfällt bei automatisierten Glossaren die Notwendigkeit für Übersetzer, manuell nach Begriffen und deren Definitionen zu suchen). + +Dies bedeutet, dass alle sich wiederholenden und ähnlichen Inhalte jedes Mal manuell übersetzt werden müssten. Darüber hinaus müssten sich Übersetzer mit Fragen melden, ob ein bestimmter Begriff übersetzt werden muss oder nicht, wie er im Text verwendet wird und ob es für einen Begriff bereits eine etablierte Übersetzung gibt. + +_Möchten Sie das Translation Memory und Glossar von ethereum.org in Ihrem Projekt verwenden? Kontaktieren Sie uns unter translations@ethereum.org._ + +## Kontaktaufnahme mit Übersetzern {#translator-outreach} + +**Zusammenarbeit mit einem Sprachdienstleister** + +Wenn Sie mit einem Sprachdienstleister und dessen professionellen Übersetzern zusammenarbeiten, ist dieser Abschnitt für Sie möglicherweise nicht allzu relevant. + +In diesem Fall ist es wichtig, einen Sprachdienstleister auszuwählen, der über die Kapazität verfügt, alle von Ihnen benötigten Dienstleistungen (z. B. Übersetzung, Überprüfung, QA) in vielen Sprachen anzubieten. + +Obwohl es verlockend sein mag, einen Sprachdienstleister ausschließlich aufgrund seiner angebotenen Preise auszuwählen, ist es wichtig zu beachten, dass die größten Sprachdienstleister aus gutem Grund höhere Preise haben. + +- Sie haben Zehntausende von Linguisten in ihrer Datenbank, was bedeutet, dass sie Ihrem Projekt Übersetzer mit ausreichender Erfahrung und Kenntnissen in Ihrem speziellen Sektor (d. h. technische Übersetzer) zuweisen können. +- Sie verfügen über umfangreiche Erfahrung in der Arbeit an verschiedenen Projekten und der Erfüllung der vielfältigen Bedürfnisse ihrer Kunden. Dies bedeutet, dass sie sich eher an Ihren speziellen Workflow anpassen, wertvolle Vorschläge und potenzielle Verbesserungen für Ihren Übersetzungsprozess anbieten und Ihre Bedürfnisse, Anforderungen und Fristen erfüllen können. +- Die meisten der größten Sprachdienstleister verfügen auch über eigene Lokalisierungstools, Translation Memorys und Glossare, die Sie verwenden können. Wenn nicht, haben sie zumindest genügend Linguisten in ihrem Pool, um sicherzustellen, dass ihre Übersetzer mit jedem Lokalisierungstool, das Sie verwenden möchten, vertraut sind und damit arbeiten können. + +Einen detaillierten Vergleich der größten Sprachdienstleister der Welt, einige Details zu jedem von ihnen und Aufschlüsselungen nach den von ihnen angebotenen Dienstleistungen, geografischen Daten usw. finden Sie im [Nimdzi 100-Bericht 2021](https://www.nimdzi.com/nimdzi-100-top-lsp/). + +**Zusammenarbeit mit nicht-professionellen Übersetzern** + +Möglicherweise arbeiten Sie mit nicht-professionellen Übersetzern zusammen und suchen nach Freiwilligen, die Ihnen bei der Übersetzung helfen. + +Es gibt verschiedene Möglichkeiten, Menschen zu erreichen und sie einzuladen, sich Ihrem Projekt anzuschließen. Dies hängt weitgehend von Ihrem Produkt ab und davon, wie groß Ihre Community bereits ist. + +Einige Möglichkeiten zum Onboarding von Freiwilligen sind im Folgenden aufgeführt: + +**Kontaktaufnahme –** Obwohl dies in den folgenden Punkten teilweise behandelt wird, kann die Kontaktaufnahme mit potenziellen Freiwilligen und die Sicherstellung, dass sie von Ihrer Übersetzungsinitiative wissen, an sich schon effektiv sein. + +Viele Menschen möchten sich engagieren und zu ihren Lieblingsprojekten beitragen, sehen aber oft keinen klaren Weg, dies zu tun, ohne Entwickler zu sein oder über spezielle technische Fähigkeiten zu verfügen. Wenn Sie das Bewusstsein für Ihr Projekt schärfen können, werden wahrscheinlich viele Zweisprachige daran interessiert sein, sich zu engagieren. + +**Suche innerhalb Ihrer Community –** Die meisten Projekte in diesem Bereich haben bereits große und aktive Communitys. Viele Ihrer Community-Mitglieder würden wahrscheinlich die Möglichkeit schätzen, auf einfache Weise zum Projekt beizutragen. + +Während der Beitrag zu Open-Source-Projekten oft auf intrinsischer Motivation beruht, ist es auch eine fantastische Lernerfahrung. Jeder, der daran interessiert ist, mehr über Ihr Projekt zu erfahren, würde sich wahrscheinlich gerne als Freiwilliger an einem Übersetzungsprogramm beteiligen, da es ihm ermöglichen würde, die Tatsache, dass er zu etwas beigetragen hat, das ihm wichtig ist, mit einer intensiven praktischen Lernerfahrung zu verbinden. + +**Erwähnung der Initiative in Ihrem Produkt –** Wenn Ihr Produkt beliebt ist und von einer großen Anzahl von Menschen genutzt wird, kann es äußerst effektiv sein, Ihr Übersetzungsprogramm hervorzuheben und Benutzer während der Nutzung des Produkts zum Handeln aufzurufen. + +Dies könnte so einfach sein wie das Hinzufügen eines Banners oder Pop-ups mit einem CTA (Call-to-Action) zu Ihrem Produkt für Anwendungen und Websites. Dies ist effektiv, da Ihre Zielgruppe Ihre Community ist – die Menschen, die sich am ehesten engagieren werden. + +**Soziale Medien –** Soziale Medien können eine effektive Möglichkeit sein, das Bewusstsein für Ihr Übersetzungsprogramm zu schärfen und Ihre Community-Mitglieder sowie andere Personen zu erreichen, die noch nicht Mitglied Ihrer Community sind. + +Wenn Sie einen Discord-Server oder Telegram-Kanal haben, können Sie diesen ganz einfach für die Kontaktaufnahme, die Kommunikation mit Ihren Übersetzern und die Anerkennung Ihrer Mitwirkenden nutzen. + +Plattformen wie X (ehemals Twitter) können auch hilfreich sein, um neue Community-Mitglieder an Bord zu holen und Ihre Mitwirkenden öffentlich anzuerkennen. + +Die Linux Foundation hat einen ausführlichen [Bericht über die FOSS-Mitwirkenden-Umfrage 2020](https://www.linuxfoundation.org/wp-content/uploads/2020FOSSContributorSurveyReport_121020.pdf) erstellt, in dem Open-Source-Mitwirkende und ihre Motivationen analysiert werden. + +## Fazit {#conclusion} + +Dieses Dokument enthält einige wichtige Überlegungen, die jedem Übersetzungsprogramm bekannt sein sollten. Es ist keineswegs ein erschöpfender Leitfaden, kann aber jedem ohne Erfahrung in der Übersetzungsbranche helfen, ein Übersetzungsprogramm für sein Projekt zu organisieren. + +Wenn Sie nach detaillierteren Anweisungen und Aufschlüsselungen verschiedener Tools, Prozesse und kritischer Aspekte der Verwaltung eines Übersetzungsprogramms suchen, pflegen einige der größten Sprachdienstleister Blogs und veröffentlichen häufig Artikel zu verschiedenen Aspekten des Lokalisierungsprozesses. Dies sind die besten Ressourcen, wenn Sie tiefer in eines der oben genannten Themen eintauchen und verstehen möchten, wie der Lokalisierungsprozess professionell abläuft. + +Einige relevante Links sind am Ende jedes Abschnitts enthalten; Sie können jedoch viele weitere Ressourcen online finden. + +Für Kooperationsvorschläge oder zusätzliche Informationen, Erkenntnisse und Best Practices, die wir durch die Pflege des Übersetzungsprogramms von ethereum.org gesammelt haben, können Sie uns gerne unter translations@ethereum.org kontaktieren. \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/resources/index.md b/public/content/translations/de/contributing/translation-program/resources/index.md index b364ac9fba2..ae260496456 100644 --- a/public/content/translations/de/contributing/translation-program/resources/index.md +++ b/public/content/translations/de/contributing/translation-program/resources/index.md @@ -1,44 +1,49 @@ --- -title: Ressourcen für Übersetzer/Innen +title: "Ressourcen für Übersetzer" lang: de -description: Nützliche Ressourcen für ethereum.org-Übersetzer +description: "Nützliche Ressourcen für Übersetzer von ethereum.org" --- # Ressourcen {#resources} -Nachfolgend finden Sie einige nützliche Anleitungen und Tools für ethereum.org-Übersetzer sowie Übersetzergemeinschaften und Updates. +Nachfolgend finden Sie einige nützliche Leitfäden und Werkzeuge für Übersetzer von ethereum.org sowie Übersetzungs-Communitys und Neuigkeiten. ## Leitfäden {#guides} -- [Leitfaden für die Übersetzung](/contributing/translation-program/translators-guide/) _ – Anweisungen und Tipps für ethereum.org-Übersetzer_ -- [Übersetzungs-FAQs](/contributing/translation-program/faq/)_ – häufig gestellte Fragen und Antworten zum Übersetzungsprogramm von ethereum.org_ -- [Editorleitfaden für Crowdin-Online](https://support.crowdin.com/online-editor/)_ – ein ausführlicher Ratgeber für die Nutzung des Online-Crowdin-Editors und seiner umfangreichen Funktionen_ -- [Inhaltsbereich](/contributing/translation-program/)_ – welche Seiten gehören zu welchen Inhaltsbereichen von ethereum.org_ +- [Übersetzungs-Styleguide](/contributing/translation-program/translators-guide/) _– Anweisungen und Tipps für Übersetzer von ethereum.org_ +- [Häufig gestellte Fragen (FAQ) zur Übersetzung](/contributing/translation-program/faq/) _– häufig gestellte Fragen und Antworten zum Übersetzungsprogramm von ethereum.org_ +- [Leitfaden für den Crowdin-Online-Editor](https://support.crowdin.com/online-editor/) _– ein ausführlicher Leitfaden zur Verwendung des Crowdin-Online-Editors und einiger der erweiterten Funktionen von Crowdin_ -## Tools {#tools} +## Werkzeuge {#tools} -- [Linguee](https://www.linguee.com/) _ – Suchmaschine für Übersetzungen und ein Wörterbuch, in dem Sie nach Wörtern und auch nach Phrasen suchen können_ -- [Proz-Begriffssuche](https://www.proz.com/search/) _ – Datenbank für Übersetzungen, Wörterbücher und Glossare für Fachbegriffe_ -- [Eurotermbank](https://www.eurotermbank.com/) _ – Sammlungen von Terminologie zu europäischen Themen in 42 Sprachen_ +- [Linguee](https://www.linguee.com/) + _– Suchmaschine für Übersetzungen und Wörterbuch, das die Suche nach Wörtern oder Phrasen ermöglicht_ +- [Proz-Begriffssuche](https://www.proz.com/search/) + _– Datenbank mit Übersetzungswörterbüchern und Glossaren für Fachbegriffe_ +- [Eurotermbank](https://www.eurotermbank.com/) + _– Sammlungen europäischer Terminologie in 42 Sprachen_ -## Communities {#communities} +## Communitys {#communities} -- [Sprachenspezifische Discord-Übersetzungsgruppen](https://discord.gg/ethereum-org) _ – eine Initiative zur Verbindung von ethereum.org-Übersetzern mit Übersetzungsgruppen_ -- [Chinesische Übersetzergruppe](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171) _ – Begriffsseite für die einfachere Koordination zwischen den chinesischen Übersetzern_ +- [Sprachspezifische Discord-Übersetzungsgruppen](https://discord.gg/ethereum-org) + _– eine Initiative, um Übersetzer von ethereum.org mit Übersetzungsgruppen zu verbinden_ +- [Chinesische Übersetzergruppe](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171) + _– Notion-Seite zur einfacheren Koordination zwischen chinesischen Übersetzern_ -## Letzte Aktualisierungen {#latest-updates} +## Neueste Updates {#latest-updates} -Damit Sie beim aktuellen Fortschritt des Übersetzungsprogramms auf dem Laufenden bleiben, folgen Sie dem [Ethereum Foundation-Blog](https://blog.ethereum.org/): +Um über die neuesten Fortschritte des Übersetzungsprogramms auf dem Laufenden zu bleiben, können Sie dem [Blog der Ethereum Foundation](https://blog.ethereum.org/) folgen: -- [Oktober 2021, Updates für Meilensteine](https://blog.ethereum.org/2021/10/04/translation-program-update) -- [Dezember 2020, Updates für Meilensteine](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20) -- [Juli 2020, Updates für Meilensteine](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone) -- [August 2019, Start des Übersetzungsprogramms](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community) +- [Meilenstein-Update vom Oktober 2021](https://blog.ethereum.org/2021/10/04/translation-program-update) +- [Meilenstein-Update vom Dezember 2020](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20) +- [Meilenstein-Update vom Juli 2020](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone) +- [Start des Übersetzungsprogramms im August 2019](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community) -## Sprechstunde für Übersetzerinnen und Übersetzer {#office-hours} +## Sprechstunden für Übersetzer {#office-hours} -Jeden zweiten Mittwoch im Monat haben wir Sprechstunde für Übersetzer. Diese finden im Sprachkanal #office-hours auf dem [ethereum.org-Discord](https://discord.gg/ethereum-org) statt, wo Sie auch die genauen Zeiten und weitere Details finden. +Wir bieten an jedem zweiten Mittwoch im Monat Sprechstunden für Übersetzer an. Diese finden im Sprachkanal #office-hours auf dem [Discord von ethereum.org](https://discord.gg/ethereum-org) statt, wo Sie auch die genauen Zeiten und weitere Details finden. -Während der Geschäftszeiten haben unsere Übersetzer die Möglichkeit, Fragen zum Übersetzungsprozess zu stellen, Feedback zum Programm zu geben, ihre Ideen mitzuteilen oder einfach mit dem ethereum.org-Kernteam zu plaudern. Schließlich wollen wir diese Zusammentreffen nutzen, um die neuesten Entwicklungen im Übersetzungsprogramm mitzuteilen und wichtige Tipps und Anleitungen an unsere Mitwirkenden weiterzugeben. +Die Sprechstunden ermöglichen es unseren Übersetzern, Fragen zum Übersetzungsprozess zu stellen, Feedback zum Programm zu geben, ihre Ideen zu teilen oder einfach mit dem Kernteam von ethereum.org zu plaudern. +Schließlich möchten wir diese Anrufe nutzen, um aktuelle Entwicklungen im Übersetzungsprogramm zu kommunizieren und wichtige Tipps und Anweisungen mit unseren Mitwirkenden zu teilen. -Wenn Sie ethereum.org-Übersetzerin und -Übersetzer sind oder werden möchten, können Sie gerne an einer dieser Sitzungen teilnehmen. +Wenn Sie ein Übersetzer für ethereum.org sind oder einer werden möchten, können Sie gerne an einer dieser Sitzungen teilnehmen. \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/translatathon/details/index.md b/public/content/translations/de/contributing/translation-program/translatathon/details/index.md new file mode 100644 index 00000000000..65bbb5d54b4 --- /dev/null +++ b/public/content/translations/de/contributing/translation-program/translatathon/details/index.md @@ -0,0 +1,90 @@ +--- +title: Details und Regeln +lang: de +template: translatathon +--- + +![](./participate.png) + +Der Translatathon ist eröffnet und jeder kann teilnehmen, indem er das Anmeldeformular ausfüllt und dem Projekt in Crowdin beitritt. + +Übersetzer sammeln Punkte, indem sie während des Übersetzungszeitraums im Crowdin-Editor Übersetzungen für unübersetzte Zeichenfolgen in ihrer Sprache vorschlagen. + +Die Endpunktzahl jedes Teilnehmers wird durch seine Position auf der Rangliste bestimmt, basierend auf der Anzahl der Wörter, die er während des Übersetzungszeitraums übersetzt hat, sowie auf eventuell gesammelten Bonuspunkten. + +## Erste Schritte {#getting-started} + +Der Übersetzungsprozess findet im ethereum.org-Projekt in Crowdin statt. Übersetzer schlagen ihre Übersetzungen für unübersetzte Zeichenfolgen vor, die fast den gesamten Inhalt der ethereum.org-Website ausmachen. + +Übersetzungen werden direkt im Online-Editor vorgeschlagen, sodass keine Dateien oder Ergebnisse herunter- oder hochgeladen werden müssen. Jedes übersetzte Wort wird erfasst und gezählt. + +**1) Dem Projekt beitreten** + +- Um mitzuwirken, treten Sie dem [ethereum.org-Projekt in Crowdin](https://crowdin.com/project/ethereum-org) bei. +- Sie müssen sich anmelden oder ein Konto erstellen – alles, was Sie benötigen, ist eine E-Mail-Adresse und ein Passwort. + +**2) Ihre Sprache auswählen** + +- Suchen Sie Ihre Sprache in der Liste der Zielsprachen und öffnen Sie sie, indem Sie auf ihren Namen oder ihre Flagge klicken. +- Wenn Sie in eine Sprache übersetzen möchten, die nicht verfügbar ist, wenden Sie sich an das [Ethereum.org-Team](https://crowdin.com/profile/ethdotorg) auf Crowdin oder senden Sie uns eine E-Mail an translations@ethereum.org, und wir werden auf Anfrage weitere Zielsprachen hinzufügen. + +**3) Eine unübersetzte Datei öffnen** + +- Suchen Sie die erste unübersetzte Datei, um mit der Übersetzung zu beginnen. Die Ordner mit den Quelldateien sind nach Priorität geordnet, daher sollten Sie mit der Übersetzung des ersten Ordners beginnen, der unübersetzte Dateien enthält. +- Jede Datei verfügt über eine Fortschrittsanzeige, die zeigt, wie viel des übersetzbaren Inhalts in der Datei übersetzt und genehmigt wurde... wenn der Übersetzungsfortschritt für eine Datei unter 100 % liegt, übersetzen Sie diese bitte. + +**4) Die unübersetzten Zeichenfolgen übersetzen** + +- Wenn Sie eine Datei zum Übersetzen öffnen, stellen Sie sicher, dass Sie nur unübersetzte Zeichenfolgen übersetzen! +- Jede Zeichenfolge hat eine Statusanzeige, die zeigt, ob sie _Translated_ (Übersetzt), _Untranslated_ (Unübersetzt) oder _Approved_ (Genehmigt) ist. Wenn für eine Quellzeichenfolge bereits eine Übersetzung in Ihrer Sprache vorgeschlagen wurde, muss sie nicht übersetzt werden. +- Sie können Zeichenfolgen im Editor auch filtern, um _Untranslated first_ (Unübersetzte zuerst) oder _Untranslated only_ (Nur unübersetzte) anzuzeigen. + +Für eine detaillierte Anleitung zur Navigation und Nutzung des Crowdin-Editors empfehlen wir allen Translatathon-Teilnehmern, unseren Leitfaden [Wie man übersetzt](/contributing/translation-program/how-to-translate/) zu lesen. + +Einige Tipps und bewährte Methoden finden Sie auch in unserem [Übersetzungs-Styleguide](/contributing/translation-program/translators-guide/). + +**Wie die Punktevergabe funktioniert** + +Jeder Translatathon-Teilnehmer sammelt Punkte für seine Endpunktzahl, indem er Inhalte im ethereum.org-Crowdin-Projekt und anderen teilnahmeberechtigten Projekten übersetzt (die vollständige Liste der teilnahmeberechtigten Projekte finden Sie unten). + +Die Punktevergabe ist einfach: **1 übersetztes Wort = 1 Punkt** + +Um Ihre endgültige Punktezuweisung zu erhalten, müssen Ihre vorgeschlagenen Übersetzungen den Bewertungsprozess durchlaufen. Dabei prüfen professionelle Prüfer die Übersetzungen jedes Teilnehmers, um sicherzustellen, dass sie den Mindestqualitätsanforderungen entsprechen und keine maschinellen oder KI-Übersetzungen verwendet wurden. + +## Ökosystem-Inhalte {#ecosystem-content} + +Da das Übersetzungsprogramm von ethereum.org ständig aktiv ist, ist der Übersetzungsfortschritt in einigen Zielsprachen auf der Website deutlich höher als in anderen. + +Um sicherzustellen, dass alle Translatathon-Teilnehmer die gleiche Chance haben, so viele Inhalte wie möglich zu übersetzen und um die Hauptpreise zu konkurrieren, sind die Quellinhalte, die Teil des Translatathons sind, nicht nur auf die Inhalte der ethereum.org-Website beschränkt. + +Teilnehmer, die eines der teilnahmeberechtigten Projekte übersetzen, erhalten die gleiche Anzahl an Punkten: 1 übersetztes Wort in einem beliebigen Projekt = 1 Punkt. + +Hier ist eine Liste aller teilnahmeberechtigten Projekte, die Teil des Translatathons 2025 sind: + +- [Ethereum.org](https://crowdin.com/project/ethereum-org) + +- [Ethereum.org Entwickler-Tutorials](https://crowdin.com/project/33388446abbe9d7aa21e42e49bba7f97) + +- [EthStaker deposit CLI](https://crowdin.com/project/ethstaker-deposit-cli) + +- [Eth Docker-Dokumentation](https://crowdin.com/project/eth-docker-docs) + +- [Remix IDE-Dokumentation](https://crowdin.com/project/remix-translation) + +- [Remix LearnEth](https://crowdin.com/project/remix-learneth) + +- [web3.py](https://crowdin.com/project/web3py) + +## Bewertungsprozess {#evaluation-process} + +Alle Übersetzungen unterliegen einer Qualitätssicherung (QA) und Feedback, bei der professionelle Linguisten die Einreichungen auf Qualität und Genauigkeit prüfen. + +Wir werden auch **Maßnahmen gegen maschinelle Übersetzungen** durchführen, indem wir Tools verwenden, die maschinelle oder KI-Übersetzungen automatisch erkennen. + +Obwohl die Übersetzungsqualität keine entscheidende Rolle bei der Punktevergabe spielt, sind **Teilnehmer, die maschinelle oder KI-Übersetzungen verwenden** oder qualitativ minderwertige und ungenaue Übersetzungen vorschlagen, von den Preisen ausgeschlossen! + +Der Bewertungszeitraum findet im gesamten September statt und die Ergebnisse werden im ethereum.org Community Call am 25. September bekannt gegeben. + +Alle Übersetzungen werden zudem vollständig überprüft, bevor sie der Website hinzugefügt werden. + + \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/translatathon/index.md b/public/content/translations/de/contributing/translation-program/translatathon/index.md new file mode 100644 index 00000000000..0b4a629677b --- /dev/null +++ b/public/content/translations/de/contributing/translation-program/translatathon/index.md @@ -0,0 +1,100 @@ +--- +title: 2025 ethereum.org Translatathon +lang: de +template: translatathon +--- + + + + + + + +## Einführung {#introduction} + +Wir glauben, dass [Ethereum](/)-Inhalte und Onboarding-Ressourcen für jeden zugänglich sein sollten, unabhängig davon, welche Sprache er spricht. +Um diesem Ziel näher zu kommen, ist das Übersetzungsprogramm von ethereum.org eine Initiative, um die Website in so viele Sprachen wie möglich zu übersetzen. + +Als Teil des Übersetzungsprogramms organisieren wir die 3. Ausgabe des Translatathons, unseres Übersetzungswettbewerbs, der darauf abzielt, Übersetzungsbeiträge in weniger aktiven Sprachen zu fördern, die Anzahl der Sprachen und die Menge der auf der Website verfügbaren Inhalte zu erhöhen, neue Mitwirkende an Bord zu holen und unsere bestehenden zu belohnen. + +Wenn du Muttersprachler einer anderen Sprache als Englisch bist und dabei helfen möchtest, Ethereum-Inhalte zugänglicher zu machen, während du um Preise wetteiferst, lies weiter, um mehr zu erfahren! + +[Erfahre mehr über das Übersetzungsprogramm von ethereum.org](/contributing/translation-program/) + +## Zeitplan {#timeline} + +Hier sind die wichtigen Daten für den Translatathon 2025: + + + + + +## Teilnehmen {#participate} + +![Bild der Community und des Globus](./participate.png) + + + +

Wer kann teilnehmen?

+ Jeder, der älter als 18 Jahre ist, Muttersprachler mindestens einer nicht-englischen Sprache ist und über gute Englischkenntnisse verfügt. +
+ +

Muss ich Übersetzer sein?

+ Nein. Du musst lediglich zweisprachig sein und nach bestem Wissen und Gewissen menschliche Übersetzungen vorschlagen (die Verwendung von maschineller Übersetzung ist verboten!), es ist keine professionelle Erfahrung erforderlich. +
+
+ + + +

Wie viel Zeit muss ich investieren?

+ So viel du möchtest. Die Mindestgrenze, um für Preise in Frage zu kommen, liegt bei 1.000 übersetzten Wörtern, was etwa 2 Stunden in Anspruch nehmen sollte. Der Wettbewerb um die Hauptpreise erfordert jedoch einen größeren Zeitaufwand. +
+ +

Muss ich mich mit Ethereum auskennen?

+ Nein. Obwohl es für deine Produktivität und Qualität hilfreich sein kann, mit Ethereum vertraut zu sein, ist der Translatathon auch eine Lernerfahrung, und jeder ist eingeladen, teilzunehmen und dabei mehr über Ethereum zu lernen. +
+
+ +Für weitere Details [siehe die vollständigen Allgemeinen Geschäftsbedingungen](/contributing/translation-program/translatathon/terms-and-conditions) + +### Schritt-für-Schritt-Anleitung {#step-by-step-instructions} + + + +## Preise {#prizes} + +| Platzierung | Preisgeld | +|---------------------|--------------| +| 1. Platz | $4000 | +| 2. Platz | $2500 | +| 3. Platz | $1500 | +| 4. Platz | $1100 | +| 5. Platz | $1000 | +| 6. Platz | $600 | +| 7. Platz | $550 | +| 8. Platz | $500 | +| 9. Platz | $450 | +| 10. Platz | $400 | +| 11. - 20. Platz | $240 | +| 21. - 50. Platz | $120 | +| 51. - 100. Platz | $60 | +| 101. - 150. Platz | $40 | +| Rest | $20 | + +Alle Preise werden in ETH ausgezahlt. + + + + \ No newline at end of file diff --git a/public/content/translations/de/contributing/translation-program/translators-guide/index.md b/public/content/translations/de/contributing/translation-program/translators-guide/index.md index 718e6300c14..4f3a0ec9f4c 100644 --- a/public/content/translations/de/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/de/contributing/translation-program/translators-guide/index.md @@ -1,70 +1,70 @@ --- -title: Übersetzungsleitfaden +title: "Leitfaden für Übersetzer" lang: de -description: Anweisungen und Tipps für ethereum.org-Übersetzer +description: "Anweisungen und Tipps für Übersetzer von ethereum.org" --- -# Übersetzungsleitfaden von ethereum.org {#style-guide} +# Ethereum.org Übersetzungs-Styleguide {#style-guide} -Der Übersetzungsleitfaden von ethereum.org enthält die wichtigsten Richtlinien, Anweisungen und Tipps für Übersetzer, die uns bei der Lokalisierung der Website helfen. +Der Übersetzungs-Styleguide von ethereum.org enthält einige der wichtigsten Richtlinien, Anweisungen und Tipps für Übersetzer, die uns bei der Lokalisierung der Website helfen. -Dieses Dokument dient als allgemeiner Leitfaden und ist nicht spezifisch für eine bestimmte Sprache. +Dieses Dokument dient als allgemeiner Leitfaden und ist nicht auf eine bestimmte Sprache beschränkt. -Wenn Sie Fragen, Vorschläge oder Feedback haben, wenden Sie sich bitte an translations@ethereum.org, senden Sie eine Nachricht an @ethdotorg auf Crowdin oder treten Sie [unserem Discord](https://discord.gg/ethereum-org) bei. Dort können Sie uns im Kanal #translations eine Nachricht senden oder sich an eines der Teammitglieder wenden. +Wenn Sie Fragen, Vorschläge oder Feedback haben, können Sie uns gerne unter translations@ethereum.org kontaktieren, eine Nachricht an @ethdotorg auf Crowdin senden oder [unserem Discord beitreten](https://discord.gg/ethereum-org), wo Sie uns im Kanal #translations eine Nachricht schreiben oder sich an ein beliebiges Teammitglied wenden können. ## Crowdin verwenden {#using-crowdin} -Auf der Seite [Übersetzungsprogramm](/contributing/translation-program/#how-to-translate) finden Sie grundlegende Anweisungen, wie Sie dem Projekt in Crowdin beitreten und den Crowdin-Online-Editor verwenden können. +Grundlegende Anweisungen zur Teilnahme am Projekt in Crowdin und zur Verwendung des Crowdin-Online-Editors finden Sie auf der Seite [Übersetzungsprogramm](/contributing/translation-program/#how-to-translate). -Wenn Sie mehr über Crowdin und die Nutzung der erweiterten Funktionen erfahren möchten, finden Sie in der [Crowdin-Wissensdatenbank](https://support.crowdin.com/online-editor/) viele ausführliche Anleitungen und eine Übersicht über alle Crowdin-Funktionen. +Wenn Sie mehr über Crowdin und die Nutzung einiger seiner erweiterten Funktionen erfahren möchten, enthält die [Crowdin-Wissensdatenbank](https://support.crowdin.com/online-editor/) viele ausführliche Leitfäden und Übersichten über alle Crowdin-Funktionen. -## Das Wesentliche der Botschaft erfassen {#capturing-the-essence} +## Die Essenz der Nachricht erfassen {#capturing-the-essence} -Vermeiden Sie bei der Übersetzung von ethereum.org-Inhalten wörtliche Übersetzungen. +Vermeiden Sie bei der Übersetzung von Inhalten auf ethereum.org wörtliche Übersetzungen. -Es ist wichtig, dass die Übersetzung das Wesentliche einer Botschaft wiedergibt. Dazu gehört, dass bestimmte Formulierungen umformuliert oder beschreibende Übersetzungen verwendet werden, anstatt den Inhalt Wort für Wort zu übersetzen. +Es ist wichtig, dass die Übersetzungen die Essenz der Nachricht erfassen. Dies könnte bedeuten, bestimmte Phrasen umzuformulieren oder beschreibende Übersetzungen zu verwenden, anstatt den Inhalt Wort für Wort zu übersetzen. -Verschiedene Sprachen haben unterschiedliche Grammatikregeln, Konventionen und Wortfolgen. Achten Sie bei der Übersetzung darauf, wie die Sätze in den Zielsprachen aufgebaut sin. Vermeiden Sie eine wörtliche Übersetzung des englischen Quelltextes, da das zu einer ungewohnten Satzstruktur und schlechteren Lesbarkeit führen kann. +Verschiedene Sprachen haben unterschiedliche Grammatikregeln, Konventionen und Wortstellungen. Achten Sie beim Übersetzen bitte darauf, wie Sätze in den Zielsprachen strukturiert sind, und vermeiden Sie es, den englischen Ausgangstext wörtlich zu übersetzen, da dies zu einer schlechten Satzstruktur und Lesbarkeit führen kann. -Anstatt den Ausgangstext Wort für Wort zu übersetzen, empfiehlt es sich, den gesamten Satz zu lesen und ihn an die Konventionen der Zielsprache anzupassen. +Anstatt den Ausgangstext Wort für Wort zu übersetzen, wird empfohlen, den gesamten Satz zu lesen und ihn an die Konventionen der Zielsprache anzupassen. ## Formell vs. informell {#formal-vs-informal} -Wir verwenden die förmliche Anrede, die für alle Besucher stets höflich und angemessen ist. +Wir verwenden die formelle Anrede (Siezen), die immer höflich und für alle Besucher angemessen ist. -Durch die förmliche Anrede lässt sich vermeiden, dass Formulierungen inoffiziell oder beleidigend klingen. Zudem funktioniert sie unabhängig von Alter und Geschlecht des Besuchers. +Die Verwendung der formellen Anrede ermöglicht es uns, nicht inoffiziell oder anstößig zu klingen, und funktioniert unabhängig von Alter und Geschlecht des Besuchers. -Die meisten indoeuropäischen und afroasiatischen Sprachen verwenden geschlechtsspezifische Personalpronomen der zweiten Person, die zwischen männlich und weiblich unterscheiden. Bei der Anrede von Benutzerinnen und Benutzern oder der Verwendung von Possessivpronomen können wir vermeiden, das Geschlecht anzunehmen, da die formale Anrede im Allgemeinen anwendbar und konsistent ist, unabhängig davon, wie er/sie/es sich identifiziert. +Die meisten indogermanischen und afroasiatischen Sprachen verwenden geschlechtsspezifische Personalpronomen der zweiten Person, die zwischen männlich und weiblich unterscheiden. Wenn wir den Benutzer ansprechen oder Possessivpronomen verwenden, können wir vermeiden, das Geschlecht des Besuchers vorauszusetzen, da die formelle Anrede allgemein anwendbar und konsistent ist, unabhängig davon, wie er sich identifiziert. ## Einfaches und klares Vokabular und Bedeutung {#simple-vocabulary} -Unser Ziel ist es, die Inhalte der Website für so viele Menschen wie möglich verständlich zu machen. +Unser Ziel ist es, die Inhalte auf der Website für so viele Menschen wie möglich verständlich zu machen. -In den meisten Fällen lässt sich das ganz einfach durch die Verwendung kurzer und einfacher Worte erreichen, die leicht verständlich sind. Wenn es für ein bestimmtes Wort in Ihrer Sprache mehrere mögliche Übersetzungen mit der gleichen Bedeutung gibt, ist die beste Option meist das kürzeste Wort, das die Bedeutung klar wiedergibt. +In den meisten Fällen lässt sich dies leicht durch die Verwendung kurzer und einfacher Wörter erreichen, die leicht verständlich sind. Wenn es in Ihrer Sprache mehrere mögliche Übersetzungen für ein bestimmtes Wort mit derselben Bedeutung gibt, ist die beste Option meistens das kürzeste Wort, das die Bedeutung klar widerspiegelt. -## Schreibsystem {#writing-system} +## Schriftsystem {#writing-system} -Ethereum.org ist in einer Reihe von Sprachen verfügbar, die alternative Schriftsysteme (oder Schreibschriften) zum Lateinischen verwenden. +Ethereum.org ist in einer Reihe von Sprachen verfügbar, die alternative Schriftsysteme (oder Schriften) zum Lateinischen verwenden. -Der gesamte Inhalt sollte unter Verwendung des korrekten Schriftsystems für Ihre Sprache übersetzt werden und keine Wörter enthalten, die mit lateinischen Buchstaben geschrieben sind. +Der gesamte Inhalt sollte mit dem korrekten Schriftsystem für Ihre Sprache übersetzt werden und keine Wörter enthalten, die mit lateinischen Zeichen geschrieben sind. -Wenn Sie den Inhalt übersetzen, sollten Sie sicherstellen, dass die Übersetzungen einheitlich sind und keine lateinischen Zeichen enthalten. +Bei der Übersetzung der Inhalte sollten Sie sicherstellen, dass die Übersetzungen konsistent sind und keine lateinischen Zeichen enthalten. -Ein gängiger Irrtum ist, dass Ethereum immer in Latein geschrieben werden sollte. Das ist meistens falsch. Nutzen Sie die Schreibweise von Ethereum in Ihrer Muttersprache (z. B. 以太坊 in Chinesisch, إيثيريوم in Arabisch usw.). +Ein weit verbreiteter Irrglaube ist, dass Ethereum immer in lateinischer Schrift geschrieben werden sollte. Dies ist meistens falsch. Bitte verwenden Sie die Schreibweise von Ethereum, die in Ihrer Sprache üblich ist (z. B. 以太坊 auf Chinesisch, إيثيريوم auf Arabisch usw.). -**Die obigen Ausführungen gelten nicht für Sprachen, in denen Eigennamen in der Regel nicht übersetzt werden sollten.** +**Das Obige gilt nicht für Sprachen, in denen Eigennamen in der Regel nicht übersetzt werden sollten.** -## Metadaten der Seite übersetzen {#translating-metadata} +## Seiten-Metadaten übersetzen {#translating-metadata} -Einige Seiten enthalten Metadaten wie "title", "lang", "description", "sidebar" usw. auf der Seite. +Einige Seiten enthalten Metadaten auf der Seite, wie 'title', 'lang', 'description', 'sidebar' usw. -Wir blenden beim Hochladen neuer Seiten in Crowdin die Inhalte aus, die Übersetzer nicht übersetzen sollen. Das bedeutet, dass alle Metadaten, die für Übersetzer in Crowdin sichtbar sind, auch übersetzt werden sollen. +Wir verbergen die Inhalte, die Übersetzer niemals übersetzen sollten, wenn wir neue Seiten auf Crowdin hochladen. Das bedeutet, dass alle Metadaten, die für Übersetzer in Crowdin sichtbar sind, übersetzt werden sollten. -Seien Sie besonders aufmerksam, wenn Sie eine Zeichenfolgen übersetzen, deren Ausgangstext mit 'en' gekennzeichnet ist. Das steht für die Sprache, in der die Seite verfügbar ist. Das sollte mit dem [ISO-Sprachcode für Ihre Sprache](https://www.andiamo.co.uk/resources/iso-language-codes/) übersetzt werden. Diese Zeichenfolgen sollten immer mit lateinischen Buchstaben übersetzt werden, nicht mit der Schreibschrift der Zielsprache. +Bitte seien Sie besonders achtsam, wenn Sie Zeichenfolgen übersetzen, bei denen der Ausgangstext 'en' lautet. Dies stellt die Sprache dar, in der die Seite verfügbar ist, und sollte in den [ISO-Sprachcode für Ihre Sprache](https://www.andiamo.co.uk/resources/iso-language-codes/) übersetzt werden. Diese Zeichenfolgen sollten immer mit lateinischen Zeichen übersetzt werden, nicht mit der in der Zielsprache üblichen Schrift. -Wenn Sie sich nicht sicher sind, welchen Sprachcode Sie verwenden sollten, können Sie das Translation Memory in Crowdin überprüfen oder den Sprachcode für Ihre Sprache auf der URL-Seite im Crowdin-Online-Editor finden. +Wenn Sie sich nicht sicher sind, welchen Sprachcode Sie verwenden sollen, können Sie das Translation Memory in Crowdin überprüfen oder den Sprachcode für Ihre Sprache in der URL der Seite im Crowdin-Online-Editor finden. -Einige Beispiele für Sprachcodes für die am weitesten verbreiteten Sprachen: +Einige Beispiele für Sprachcodes der am weitesten verbreiteten Sprachen: - Arabisch - ar - Vereinfachtes Chinesisch - zh @@ -72,169 +72,175 @@ Einige Beispiele für Sprachcodes für die am weitesten verbreiteten Sprachen: - Hindi - hi - Spanisch - es -## Titel von externen Artikeln {#external-articles} +## Titel externer Artikel {#external-articles} -Einige Strings enthalten Titel externer Artikel. Die meisten unserer Dokumentationsseiten für Entwickler enthalten Links zu externen Artikeln, um weiterführende Informationen zu bieten. Die Zeichenketten, die die Titel der Artikel enthalten, müssen unabhängig von der Sprache des Artikels übersetzt werden, um eine einheitliche Benutzererfahrung für die Besucher zu gewährleisten, die die Seite in ihrer Sprache ansehen. +Einige Zeichenfolgen enthalten Titel externer Artikel. Die meisten unserer Seiten mit Entwicklerdokumentationen enthalten Links zu externen Artikeln zum Weiterlesen. Die Zeichenfolgen, die Titel von Artikeln enthalten, müssen unabhängig von der Sprache des Artikels übersetzt werden, um den Besuchern, die die Seite in ihrer Sprache betrachten, ein konsistenteres Benutzererlebnis zu bieten. -Im Folgenden finden Sie einige Beispiele dafür, wie diese Zeichenfolgen für Übersetzer aussehen und wie sie zu erkennen sind (Links zu den Artikeln finden Sie meist am Ende dieser Seiten im Abschnitt "Weiterführende Literatur"): +Nachfolgend finden Sie einige Beispiele dafür, wie diese Zeichenfolgen für Übersetzer aussehen und wie Sie sie identifizieren können (Links zu Artikeln finden Sie meistens unten auf diesen Seiten im Abschnitt 'Weiterführende Literatur'): -![Titel von Artikeln in sidebar.png](./article-titles-in-sidebar.png) ![Titel von Artikeln in editor.png](./article-titles-in-editor.png) +![Article titles in sidebar.png](./article-titles-in-sidebar.png) +![Article titles in editor.png](./article-titles-in-editor.png) ## Crowdin-Warnungen {#crowdin-warnings} -Crowdin verfügt über eine eingebaute Funktion, die Übersetzer warnt, wenn sie im Begriff sind, einen Fehler zu machen. Crowdin warnt Sie automatisch, bevor Sie Ihre Übersetzung speichern, wenn Sie vergessen, ein Tag aus der Quelle einzubinden, Elemente übersetzen, die nicht übersetzt werden sollten, mehrere aufeinander folgende Leerzeichen hinzufügen, Ende-Satzzeichen vergessen usw. Wenn Sie eine solche Warnung sehen, gehen Sie zurück und überprüfen Sie die vorgeschlagene Übersetzung nochmals. +Crowdin verfügt über eine integrierte Funktion, die Übersetzer warnt, wenn sie im Begriff sind, einen Fehler zu machen. Crowdin warnt Sie automatisch davor, bevor Sie Ihre Übersetzung speichern, wenn Sie vergessen, ein Tag aus dem Ausgangstext einzufügen, Elemente übersetzen, die nicht übersetzt werden sollten, mehrere aufeinanderfolgende Leerzeichen hinzufügen, Satzzeichen am Ende vergessen usw. +Wenn Sie eine solche Warnung sehen, gehen Sie bitte zurück und überprüfen Sie die vorgeschlagene Übersetzung noch einmal. -**Ignorieren Sie diese Warnungen nicht, denn sie bedeuten in der Regel, dass etwas falsch ist oder dass in der Übersetzung ein wichtiger Teil des Ausgangstextes fehlt.** +**Ignorieren Sie diese Warnungen niemals, da sie normalerweise bedeuten, dass etwas nicht stimmt oder dass in der Übersetzung ein wichtiger Teil des Ausgangstextes fehlt.** -Ein Beispiel für eine Crowdin-Warnung, wenn Sie vergessen, ein Tag zur Übersetzung hinzuzufügen: ![Beispiel für eine Crowdin-Warnung](./crowdin-warning-example.png) +Ein Beispiel für eine Crowdin-Warnung, wenn Sie vergessen, Ihrer Übersetzung ein Tag hinzuzufügen: +![Example of a Crowdin warning](./crowdin-warning-example.png) -## Umgang mit Tags und Codeausschnitten {#dealing-with-tags} +## Umgang mit Tags und Code-Snippets {#dealing-with-tags} -Ein großer Teil des Quellinhalts enthält Tags und Variablen, die im Crowdin-Editor gelb hervorgehoben sind. Diese haben unterschiedliche Funktionen und sollten richtig angegangen werden. +Ein Großteil des Ausgangsinhalts enthält Tags und Variablen, die im Crowdin-Editor gelb hervorgehoben sind. Diese erfüllen unterschiedliche Funktionen und sollten richtig behandelt werden. **Crowdin-Einstellungen** -Um die Verwaltung von Tags zu erleichtern und diese direkt aus der Quelle zu kopieren, empfehlen wir Ihnen, Ihre Einstellungen im Crowdin-Editor zu ändern. +Um die Verwaltung von Tags zu erleichtern und sie direkt aus der Quelle zu kopieren, empfehlen wir, Ihre Einstellungen im Crowdin-Editor zu ändern. -1. Einstellungen öffnen ![Einstellungen im Editor öffnen](./editor-settings.png) +1. Öffnen Sie die Einstellungen + ![How to open settings in the editor](./editor-settings.png) -2. Scrollen Sie nach unten zum Abschnitt „HTML-Tags Anzeige" +2. Scrollen Sie nach unten zum Abschnitt 'HTML tags displaying' (HTML-Tags anzeigen) -3. Wählen Sie „Verstecken" ![Bitte „Verstecken" auswählen](./hide-tags.png) +3. Wählen Sie 'Hide' (Verbergen) + ![Please select 'Hide'](./hide-tags.png) -4. Klicken Sie auf „Speichern" +4. Klicken Sie auf 'Save' (Speichern) -Durch Auswahl dieser Option wird der vollständige Tag-Text nicht mehr angezeigt und durch eine Zahl ersetzt. Beim Übersetzen wird der exakte Tag automatisch in das Übersetzungsfeld kopiert, wenn der Tag angeklickt wird. +Wenn Sie diese Option auswählen, wird der vollständige Tag-Text nicht mehr angezeigt und durch eine Zahl ersetzt. +Beim Übersetzen wird durch Klicken auf dieses Tag automatisch das genaue Tag in das Übersetzungsfeld kopiert. **Links** -Sie finden möglicherweise vollständige Links zu Seiten auf ethereum.org oder anderen Websites. +Möglicherweise bemerken Sie vollständige Links zu Seiten auf ethereum.org oder anderen Websites. -Diese sollten mit der Quelle identisch sein und nicht verändert oder übersetzt werden. Wenn Sie einen Link übersetzen oder ihn in irgendeiner Weise verändern, selbst wenn Sie nur einen Teil davon entfernen, wie z. B. einen Schrägstrich (/), führt das zu fehlerhaften und unbrauchbaren Links. +Diese sollten mit der Quelle identisch sein und nicht geändert oder übersetzt werden. Wenn Sie einen Link übersetzen oder in irgendeiner Weise ändern, selbst wenn Sie nur einen Teil davon entfernen, wie z. B. einen Schrägstrich (/), führt dies zu fehlerhaften und unbrauchbaren Links. -Am besten ist es, Links direkt aus der Quelle zu kopieren, entweder durch Anklicken oder mit der Schaltfläche „Copy Source" (Quelle kopieren) (Alt+C). +Der beste Weg, mit Links umzugehen, besteht darin, sie direkt aus der Quelle zu kopieren, entweder indem Sie darauf klicken oder die Schaltfläche „Copy Source“ (Quelle kopieren) (Alt+C) verwenden. -![Beispiel für einen Link.png](./example-of-link.png) +![Example of link.png](./example-of-link.png) -Links erscheinen im Quelltext auch in Form von Tags (z. B. \<0> \). Wenn Sie mit dem Mauszeiger über das Tag fahren, zeigt der Editor den vollständigen Inhalt an. Manchmal stellen diese Tags auch Links dar. +Links erscheinen im Ausgangstext auch in Form von Tags (d. h. `<0>` ``). Wenn Sie mit der Maus über das Tag fahren, zeigt der Editor seinen vollständigen Inhalt an – manchmal stellen diese Tags Links dar. -Es ist sehr wichtig, die Links aus der Quelle zu kopieren und die Reihenfolge nicht zu verändern. +Es ist sehr wichtig, die Links aus der Quelle zu kopieren und ihre Reihenfolge nicht zu ändern. -Wird die Reihenfolge der Tags geändert, wird damit die Verbindung, die sie darstellen, aufgebrochen. +Wenn die Reihenfolge der Tags geändert wird, ist der Link, den sie darstellen, fehlerhaft. -![Beispiel für Links in Tags.png](./example-of-links-inside-tags.png) +![Example of links inside tags.png](./example-of-links-inside-tags.png) **Tags und Variablen** -Der Quelltext enthält viele verschiedene Arten von Tags, die immer aus der Quelle kopiert und nicht verändert werden sollten. Ähnlich wie oben sollte auch die Reihenfolge dieser Tags in der Übersetzung mit der Quelle übereinstimmen. +Der Ausgangstext enthält viele verschiedene Arten von Tags, die immer aus der Quelle kopiert und niemals geändert werden sollten. Ähnlich wie oben sollte auch die Reihenfolge dieser Tags in der Übersetzung mit der Quelle übereinstimmen. -Tags enthalten immer einen öffnenden und einen schließenden Tag. In den meisten Fällen sollte der Text zwischen öffnenden und schließenden Tags übersetzt werden. +Tags enthalten immer ein öffnendes und ein schließendes Tag. In den meisten Fällen sollte der Text zwischen öffnenden und schließenden Tags übersetzt werden. -Beispiel: ``Dezentralisiert`` +Beispiel: ``dezentralisiert`` -`` - _Öffnender Tag, der eine Fettformatierung bedingt_ +`` - _Öffnendes Tag, das den Text fett macht_ -Dezentralisiert – _Übersetzbarer Text_ +dezentralisiert - _Übersetzbarer Text_ -`` – _Schließender Tag_ +`` - _Schließendes Tag_ -![Beispiel für „starke" Tags.png](./example-of-strong-tags.png) +![Example of 'strong' tags.png](./example-of-strong-tags.png) -CodeAusschnitte sollten etwas anders behandelt werden als die anderen Tags, da sie Code enthalten, der nicht übersetzt werden sollte. +Code-Snippets sollten etwas anders behandelt werden als die anderen Tags, da sie Code enthalten, der nicht übersetzt werden sollte. Beispiel: ``Nonce`` -`` – _Öffnender Tag, der einen Code-Ausschnitt enthält_ +`` - _Öffnendes Tag, das ein Code-Snippet enthält_ -Nonce – _Nicht übersetzbarer Text_ +Nonce - _Nicht übersetzbarer Text_ -`` – _Schließender Tag_ +`` - _Schließendes Tag_ -![Beispiel für Code-Ausschnitte.png](./example-of-code-snippets.png) +![Example of code snippets.png](./example-of-code-snippets.png) -Der Quelltext enthält auch verkürzte Tags, die nur Zahlen enthalten. Ihre Funktion ist dadurch nicht direkt ersichtlich. Sie können mit dem Mauszeiger über diese Tags fahren, um genau zu sehen, welche Funktion sie haben. +Der Ausgangstext enthält auch verkürzte Tags, die nur Zahlen enthalten, was bedeutet, dass ihre Funktion nicht sofort ersichtlich ist. Sie können mit der Maus über diese Tags fahren, um genau zu sehen, welche Funktion sie erfüllen. -Im folgenden Beispiel können Sie sehen, dass der Mauszeiger über dem \<0> Tag zeigt, dass er `` darstellt und einen Code-Ausschnitt enthält. Daher sollte der Inhalt innerhalb dieser Tags nicht übersetzt werden. +Im folgenden Beispiel können Sie sehen, dass das Bewegen der Maus über das `<0>`-Tag zeigt, dass es `` darstellt und ein Code-Snippet enthält. Daher sollte der Inhalt innerhalb dieser Tags nicht übersetzt werden. -![Beispiel für mehrdeutige Tags.png](./example-of-ambiguous-tags.png) +![Example of ambiguous tags.png](./example-of-ambiguous-tags.png) -## Kurze vs. vollständige Formulierungen/Abkürzungen {#short-vs-full-forms} +## Kurz- vs. Vollformen/Abkürzungen {#short-vs-full-forms} -Auf der Website werden viele Abkürzungen verwendet, z. B. dApps, NFT, DAO, DeFi etc. Diese Abkürzungen werden im Englischen häufig verwendet und sind den meisten Besuchern der Website bekannt. +Auf der Website werden viele Abkürzungen verwendet, z. B. Dapps, NFT, DAO, DeFi usw. Diese Abkürzungen werden im Englischen häufig verwendet und die meisten Besucher der Website sind damit vertraut. -Da es für diese und ähnliche Begriffe in der Regel keine etablierten Übersetzungen in anderen Sprachen gibt, ist es am besten, eine beschreibende Übersetzung der vollständigen Form anzugeben und die englische Abkürzung in Klammern hinzuzufügen. +Da es für sie in anderen Sprachen normalerweise keine etablierten Übersetzungen gibt, ist der beste Weg, mit diesen und ähnlichen Begriffen umzugehen, eine beschreibende Übersetzung der Vollform bereitzustellen und die englische Abkürzung in Klammern hinzuzufügen. -Übersetzen Sie diese Abkürzungen nicht, da die meisten Menschen damit nicht vertraut sind und die lokalisierten Versionen für die meisten Besucher nicht viel Sinn ergeben würden. +Übersetzen Sie diese Abkürzungen nicht, da die meisten Menschen nicht damit vertraut wären und die lokalisierten Versionen für die meisten Besucher keinen großen Sinn ergeben würden. -Beispiel für die Übersetzung von dApps: +Beispiel für die Übersetzung von Dapps: -- Dezentrale Anwendungen (dApps) → _Übersetzte Vollform (englische Abkürzung in Klammern)_ +- dezentralisierte Anwendungen (Dapps) → _Übersetzte Vollform (englische Abkürzung in Klammern)_ ## Begriffe ohne etablierte Übersetzungen {#terms-without-established-translations} -Für einige Begriffe gibt es möglicherweise keine etablierten Übersetzungen in anderen Sprachen und sie sind weithin unter dem englischen Originalbegriff bekannt. Diese Begriffe umfassen meist neuere Konzepte wie Proof-of-Work, Proof-of-Stake, Beacon Chain, Staking usw. +Einige Begriffe haben möglicherweise keine etablierten Übersetzungen in anderen Sprachen und sind unter dem ursprünglichen englischen Begriff weithin bekannt. Solche Begriffe umfassen meist neuere Konzepte wie Proof-of-Work, Proof-of-Stake, Beacon Chain, Staking usw. -Die Übersetzung dieser Begriffe kann zwar unnatürlich klingen, da aber die englische Version auch in anderen Sprachen häufig verwendet wird, ist es sehr empfehlenswert, sie zu übersetzen. +Obwohl die Übersetzung dieser Begriffe unnatürlich klingen kann, da die englische Version auch in anderen Sprachen häufig verwendet wird, wird dringend empfohlen, sie zu übersetzen. -Wenn Sie sie übersetzen, können Sie kreativ sein, beschreibende Übersetzungen verwenden oder einfach wörtlich übersetzen. +Fühlen Sie sich bei der Übersetzung frei, kreativ zu werden, beschreibende Übersetzungen zu verwenden oder sie einfach wörtlich zu übersetzen. -**Es ist sinnvoll, die meisten Begriffe zu übersetzen, anstatt sie auf Englisch zu belassen, da diese neue Terminologie sich zukünftig stärker verbreitet, wenn mehr Menschen Ethereum und zugehörige Technologien nutzen. Wenn wir mehr Menschen aus der ganzen Welt für diesen Bereich gewinnen wollen, müssen wir eine verständliche Terminologie in so vielen Sprachen wie möglich anbieten, auch wenn wir sie selbst erstellen müssen.** +**Der Grund, warum die meisten Begriffe übersetzt werden sollten, anstatt einige auf Englisch zu belassen, ist die Tatsache, dass diese neue Terminologie in Zukunft weiter verbreitet sein wird, wenn mehr Menschen anfangen, Ethereum und verwandte Technologien zu nutzen. Wenn wir mehr Menschen aus der ganzen Welt in diesen Bereich einführen wollen, müssen wir verständliche Terminologie in so vielen Sprachen wie möglich bereitstellen, auch wenn wir sie selbst erstellen müssen.** -## Schaltflächen und CTAs (Call to Action) {#buttons-and-ctas} +## Schaltflächen & CTAs {#buttons-and-ctas} Die Website enthält zahlreiche Schaltflächen, die anders übersetzt werden sollten als andere Inhalte. -Schaltflächentext kann identifiziert werden, indem Sie sich die zugehörigen Kontext-Screenshots ansehen oder den Kontext im Editor überprüfen, der den Ausdruck „Button“ enthält. +Schaltflächentext kann identifiziert werden, indem man sich die Kontext-Screenshots ansieht, die mit den meisten Zeichenfolgen verbunden sind, oder indem man den Kontext im Editor überprüft, der das Wort „button“ enthält. -Die Übersetzungen für Schaltflächen sollten so kurz wie möglich sein, um Formatierungsfehler zu vermeiden. Außerdem sollten die Schaltflächenübersetzungen als Anweisung formuliert sein, d. h. einen Befehl oder eine Aufforderung darstellen. +Die Übersetzungen für Schaltflächen sollten so kurz wie möglich sein, um Formatierungsfehler zu vermeiden. Darüber hinaus sollten Schaltflächenübersetzungen im Imperativ stehen, d. h. einen Befehl oder eine Aufforderung darstellen. -![Wie man eine Schaltfläche.png findet](./how-to-find-a-button.png) +![How to find a button.png](./how-to-find-a-button.png) -## Übersetzen für Inklusion {#translating-for-inclusivity} +## Inklusiv übersetzen {#translating-for-inclusivity} -Die Besucher von ethereum.org kommen aus der ganzen Welt und haben ganz unterschiedliche Hintergründe. Die Sprache auf der Website sollte daher neutral, einladend für alle und nicht ausschließend sein. +Besucher von ethereum.org kommen aus der ganzen Welt und haben unterschiedliche Hintergründe. Die Sprache auf der Website sollte daher neutral, für alle einladend und nicht exklusiv sein. -Ein wichtiger Aspekt dabei ist die Geschlechterneutralität. Das lässt sich leicht erreichen, indem die formale Anrede benutzt und geschlechtsspezifische Wörter in den Übersetzungen vermieden werden. +Ein wichtiger Aspekt dabei ist die Geschlechtsneutralität. Dies lässt sich leicht erreichen, indem man die formelle Anrede verwendet und geschlechtsspezifische Wörter in den Übersetzungen vermeidet. -Eine andere Möglichkeit der Inklusion ist der Versuch, für ein globales Publikum zu übersetzen, das nicht auf ein Land, eine Rasse oder eine Region festgelegt ist. +Eine weitere Form der Inklusivität ist der Versuch, für ein globales Publikum zu übersetzen, das nicht auf ein bestimmtes Land, eine bestimmte Ethnie oder Region beschränkt ist. -Schließlich sollte die Sprache für jedes Publikum und Alter geeignet sein. +Schließlich sollte die Sprache für alle Zielgruppen und Altersgruppen geeignet sein. ## Sprachspezifische Übersetzungen {#language-specific-translations} -Bei der Übersetzung ist es wichtig, die Grammatikregeln, Konventionen und die Formatierung in Ihrer Sprache zu befolgen und diese nicht von der Quelle zu übernehmen. Der Ausgangstext folgt den englischen Grammatikregeln und -konventionen, die in vielen anderen Sprachen nicht gelten. +Beim Übersetzen ist es wichtig, die Grammatikregeln, Konventionen und Formatierungen zu befolgen, die in Ihrer Sprache verwendet werden, anstatt sie aus der Quelle zu kopieren. Der Ausgangstext folgt den englischen Grammatikregeln und Konventionen, was auf viele andere Sprachen nicht anwendbar ist. -Sie sollten mit den Regeln für Ihre Sprache vertraut sein und entsprechend übersetzen. Wenn Sie Hilfe benötigen, wende Sie sich an uns. Wir unterstützen Sie dabei, Ressourcen zu finden, wie diese Elemente in Ihrer Sprache einzusetzen sind. +Sie sollten sich der Regeln für Ihre Sprache bewusst sein und entsprechend übersetzen. Wenn Sie Hilfe benötigen, wenden Sie sich an uns, und wir helfen Ihnen, einige Ressourcen darüber zu finden, wie diese Elemente in Ihrer Sprache verwendet werden sollten. -Einige Beispiele dafür, worauf besonders zu achten ist: +Einige Beispiele dafür, worauf Sie besonders achten sollten: ### Zeichensetzung, Formatierung {#punctuation-and-formatting} -**Groß-/Kleinschreibung** +**Groß- und Kleinschreibung** -- Es gibt große Unterschiede in der Groß- und Kleinschreibung in verschiedenen Sprachen. -- Im Englischen ist es üblich, alle Wörter in Titeln und Namen, Monaten und Tagen, Sprachnamen, Feiertagen usw. groß zu schreiben. In vielen anderen Sprachen ist das grammatikalisch nicht korrekt, da es abweichende Regeln für die Groß- und Kleinschreibung gibt. -- Einige Sprachen haben auch Regeln für die Großschreibung von Personalpronomen, Substantiven und bestimmten Adjektiven, die im Englischen nicht großgeschrieben werden. +- Es gibt große Unterschiede bei der Groß- und Kleinschreibung in verschiedenen Sprachen. +- Im Englischen ist es üblich, alle Wörter in Titeln und Namen, Monaten und Tagen, Sprachnamen, Feiertagen usw. großzuschreiben. In vielen anderen Sprachen ist dies grammatikalisch falsch, da sie andere Regeln für die Groß- und Kleinschreibung haben. +- Einige Sprachen haben auch Regeln zur Großschreibung von Personalpronomen, Substantiven und bestimmten Adjektiven, die im Englischen nicht großgeschrieben werden. **Abstände** -- Die Rechtschreibregeln legen die Verwendung von Leerzeichen für jede Sprache fest. Leerzeichen werden überall verwendet und folgen in jeder Sprache anderen Regeln. Leerzeichen gehören zu den am häufigsten falsch übersetzten Elementen. -- Einige häufige Unterschiede in den Abständen zwischen dem Englischen und anderen Sprachen: +- Orthografieregeln definieren die Verwendung von Leerzeichen für jede Sprache. Da Leerzeichen überall verwendet werden, gehören diese Regeln zu den unterschiedlichsten, und Leerzeichen gehören zu den am häufigsten falsch übersetzten Elementen. +- Einige häufige Unterschiede bei den Abständen zwischen Englisch und anderen Sprachen: - Leerzeichen vor Maßeinheiten und Währungen (z. B. USD, EUR, kB, MB) - Leerzeichen vor Gradzeichen (z. B. °C, ℉) - - Leerzeichen vor einigen Satzzeichen, insbesondere vor der Ellipse (...) + - Leerzeichen vor einigen Satzzeichen, insbesondere den Auslassungspunkten (…) - Leerzeichen vor und nach Schrägstrichen (/) **Listen** -- Jede Sprache hat vielfältige und komplexe Regeln für die Erstellung von Listen. Diese können sich erheblich vom Englischen unterscheiden. -- In einigen Sprachen muss das erste Wort jeder neuen Zeile groß geschrieben werden, während in anderen Sprachen neue Zeilen mit Kleinbuchstaben beginnen sollten. Viele Sprachen haben auch unterschiedliche Regeln für die Groß- und Kleinschreibung in Listen, je nach Länge der einzelnen Zeilen. -- Das Gleiche gilt für die Interpunktion von Zeilenelementen. Das Endzeichen in Listen kann, je nach Sprache, ein Punkt (**.**), ein Komma (**,**) oder ein Semikolon (**;**) sein. +- Jede Sprache hat vielfältige und komplexe Regeln für das Schreiben von Listen. Diese können sich erheblich vom Englischen unterscheiden. +- In einigen Sprachen muss das erste Wort jeder neuen Zeile großgeschrieben werden, während in anderen neue Zeilen mit Kleinbuchstaben beginnen sollten. Viele Sprachen haben auch unterschiedliche Regeln zur Groß- und Kleinschreibung in Listen, abhängig von der Länge jeder Zeile. +- Das Gleiche gilt für die Zeichensetzung von Listenelementen. Das Satzzeichen am Ende von Listen kann je nach Sprache ein Punkt (**.**), ein Komma (**,**) oder ein Semikolon (**;**) sein. **Anführungszeichen** -- In den Sprachen werden viele verschiedene Anführungszeichen verwendet. Das einfache Kopieren der englischen Anführungszeichen aus der Quelle ist oft nicht korrekt. -- Zu den gängigsten Arten von Anführungszeichen gehören: +- Sprachen verwenden viele verschiedene Anführungszeichen. Das einfache Kopieren der englischen Anführungszeichen aus der Quelle ist oft falsch. +- Zu den häufigsten Arten von Anführungszeichen gehören: - „Beispieltext“ - ‚Beispieltext’ - »Beispieltext« @@ -244,50 +250,50 @@ Einige Beispiele dafür, worauf besonders zu achten ist: **Bindestriche und Gedankenstriche** -- Im Englischen wird ein Bindestrich (-) verwendet, um Wörter oder verschiedene Teile eines Wortes zu verbinden, während ein Gedankenstrich (–) verwendet wird, um einen Bereich abzugrenzen oder eine Pause zu signalisieren. -- Viele Sprachen haben unterschiedliche Regeln für die Verwendung von Bindestrichen und Gedankenstrichen, die es zu beachten gilt. +- Im Englischen wird ein Bindestrich (-) verwendet, um Wörter oder verschiedene Teile eines Wortes zu verbinden, während ein Gedankenstrich (–) verwendet wird, um einen Bereich oder eine Pause anzuzeigen. +- Viele Sprachen haben unterschiedliche Regeln für die Verwendung von Bindestrichen und Gedankenstrichen, die beachtet werden sollten. ### Formate {#formats} **Zahlen** -- Der Hauptunterschied bei der Schreibweise von Zahlen in verschiedenen Sprachen ist das Trennzeichen für Dezimalstellen und Tausender. Als Tausendertrennzeichen kann das ein Punkt, ein Komma oder ein Leerzeichen verwendet werden. Ebenso verwenden einige Sprachen einen Dezimalpunkt, andere ein Dezimalkomma. +- Der Hauptunterschied beim Schreiben von Zahlen in verschiedenen Sprachen ist das Trennzeichen, das für Dezimalstellen und Tausender verwendet wird. Für Tausender kann dies ein Punkt, ein Komma oder ein Leerzeichen sein. Ebenso verwenden einige Sprachen einen Dezimalpunkt, während andere ein Dezimalkomma verwenden. - Einige Beispiele für große Zahlen: - Englisch – **1,000.50** - Spanisch – **1.000,50** - Französisch – **1 000,50** -- Ebenfalls wichtig bei der Übersetzung von Zahlen ist das Prozentzeichen. Es kann auf verschiedene Weise geschrieben werden: **100%**, **100 %** oder **%100**. -- Und abschließend können auch negative Zahlen je nach Sprache unterschiedlich dargestellt werden: -100, 100-, (100) oder [100]. +- Ein weiterer wichtiger Aspekt bei der Übersetzung von Zahlen ist das Prozentzeichen. Es kann auf verschiedene Arten geschrieben werden: **100%**, **100 %** oder **%100**. +- Schließlich können negative Zahlen je nach Sprache unterschiedlich dargestellt werden: -100, 100-, (100) oder [100]. -**Datumsangaben** +**Daten** -- Bei der Übersetzung von Datumsangaben gibt es eine Reihe von Unterschieden und Überlegungen, die von der jeweiligen Sprache abhängen. Dazu gehören das Datumsformat, das Trennzeichen, die Großschreibung und führende Nullen. Es gibt auch Unterschiede zwischen den Datumsangaben in voller Länge und den numerischen Daten. +- Bei der Übersetzung von Daten gibt es je nach Sprache eine Reihe von Überlegungen und Unterschieden. Dazu gehören das Datumsformat, das Trennzeichen, die Groß- und Kleinschreibung und führende Nullen. Es gibt auch Unterschiede zwischen ausgeschriebenen und numerischen Daten. - Einige Beispiele für verschiedene Datumsformate: - - Englisch UK (dd/mm/yyyy) – 1st January, 2022 - - Englisch US (mm/dd/yyyy) – January 1st, 2022 - - Chinesisch (yyyy-mm-dd) – 2022 年 1 月 1 日 - - Französisch (dd/mm/yyyy) – 1er janvier 2022 - - Italienisch (dd/mm/yyyy) – 1º gennaio 2022 - - Deutsch (dd/mm/yyyy) – 1. Januar 2022 + - Englisch UK (TT/MM/JJJJ) – 1st January, 2022 + - Englisch US (MM/TT/JJJJ) – January 1st, 2022 + - Chinesisch (JJJJ-MM-TT) – 2022 年 1 月 1 日 + - Französisch (TT/MM/JJJJ) – 1er janvier 2022 + - Italienisch (TT/MM/JJJJ) – 1º gennaio 2022 + - Deutsch (TT/MM/JJJJ) – 1. Januar 2022 **Währungen** -- Die Übersetzung von Währungen kann aufgrund der unterschiedlichen Formate, Konventionen und Umrechnungen eine Herausforderung darstellen. In der Regel sollten die Währungen mit der Quelle übereinstimmen. Sie können Ihre Landeswährung und die Umrechnung in Klammern hinzufügen, um dem Leser mehr Informationen zu bieten. -- Zu den wichtigsten Unterschieden bei der Schreibweise von Währungen in verschiedenen Sprachen gehören die Platzierung von Symbolen, Kommas und Dezimalpunkten, Abstände und Abkürzungen oder die Verwendung von Symbolen. - - Symbolplatzierung: $100 oder 100$ - - Dezimal-Kommas vs. Dezimal-Punkte: 100,50$ oder 100.50$ +- Die Übersetzung von Währungen kann aufgrund der unterschiedlichen Formate, Konventionen und Umrechnungen eine Herausforderung sein. Als allgemeine Regel gilt: Bitte behalten Sie die Währungen wie in der Quelle bei. Sie können Ihre lokale Währung und die Umrechnung in Klammern hinzufügen, um dem Leser zu helfen. +- Die Hauptunterschiede beim Schreiben von Währungen in verschiedenen Sprachen umfassen die Platzierung von Symbolen, Dezimalkommas vs. Dezimalpunkte, Abstände und Abkürzungen vs. Symbole. + - Platzierung von Symbolen: $100 oder 100$ + - Dezimalkommas vs. Dezimalpunkte: 100,50$ oder 100.50$ - Abstände: 100$ oder 100 $ - - Abkürzungen oder Symbole: 100 $ oder 100 USD + - Abkürzungen vs. Symbole: 100 $ oder 100 USD **Maßeinheiten** -- Als allgemeine Regel gilt, dass die Maßeinheiten aus der Quelle beibehalten werden sollten. Wenn in Ihrem Land ein anderes System verwendet wird, können Sie die Umrechnung in Klammern angeben. -- Abgesehen von der Lokalisierung von Maßeinheiten sollte ebenfalls beachtet werden, wie unterschiedlich die Herangehensweise bei diesen Einheiten in den verschiedenen Sprachen ist. Der Hauptunterschied ist der Abstand zwischen der Zahl und der Einheit, der je nach Sprache unterschiedlich sein kann. Beispiele hierfür sind 100kB vs. 100 kB oder 50ºF vs. 50 ºF. +- Als allgemeine Regel gilt: Bitte behalten Sie die Maßeinheiten gemäß der Quelle bei. Wenn Ihr Land ein anderes System verwendet, können Sie die Umrechnung in Klammern angeben. +- Abgesehen von der Lokalisierung von Maßeinheiten ist es auch wichtig, die Unterschiede in der Herangehensweise von Sprachen an diese Einheiten zu beachten. Der Hauptunterschied ist der Abstand zwischen der Zahl und der Einheit, der je nach Sprache unterschiedlich sein kann. Beispiele hierfür sind 100kB vs. 100 kB oder 50ºF vs. 50 ºF. -## Zusammenfassung {#conclusion} +## Fazit {#conclusion} -Das Übersetzen von ethereum.org ist eine gute Gelegenheit, die verschiedenen Aspekte von Ethereum kennenzulernen. +Die Übersetzung von ethereum.org ist eine großartige Gelegenheit, mehr über die verschiedenen Aspekte von Ethereum zu erfahren. -Versuchen Sie, beim Übersetzen langsam vorzugehen. Bleiben Sie locker und haben Sie Spaß dabei. +Versuchen Sie beim Übersetzen, sich nicht zu beeilen. Lassen Sie es ruhig angehen und haben Sie Spaß! -Vielen Dank, dass Sie sich am Übersetzungsprogramm beteiligen und uns helfen, die Website einem breiteren Publikum zugänglich zu machen. Die Ethereum-Community ist global, und wir freuen uns, dass Sie ein Teil davon sind. +Vielen Dank, dass Sie sich am Übersetzungsprogramm beteiligen und uns helfen, die Website einem breiteren Publikum zugänglich zu machen. Die Ethereum-Community ist global, und wir freuen uns, dass Sie ein Teil davon sind! \ No newline at end of file diff --git a/public/content/translations/de/dao/index.md b/public/content/translations/de/dao/index.md index f7922d74baf..d5538fcedea 100644 --- a/public/content/translations/de/dao/index.md +++ b/public/content/translations/de/dao/index.md @@ -1,166 +1,169 @@ --- -title: Dezentrale autonome Organisationen (DAOs) -description: Eine Übersicht über DAOs auf Ethereum +title: Was ist eine DAO? +metaTitle: Was ist eine DAO? | Dezentrale Autonome Organisation +description: "Ein Überblick über DAOs auf Ethereum" lang: de template: use-cases emoji: ":handshake:" sidebarDepth: 2 image: /images/use-cases/dao-2.png -alt: Eine Repräsentation einer DAO, wie sie über einen Vorschlag abstimmt. -summaryPoint1: Communitys im Besitz ihrer Mitglieder ohne zentralisierte Führung. -summaryPoint2: Eine sichere Möglichkeit der Zusammenarbeit mit Fremden im Internet. -summaryPoint3: Ein Ort, an dem sich Geldmittel für einen bestimmten Zweck sicher bereitstellen lassen. +alt: "Eine Darstellung einer DAO, die über einen Vorschlag abstimmt." +summaryPoint1: "Communities im Besitz der Mitglieder ohne zentralisierte Führung." +summaryPoint2: Ein sicherer Weg, um mit Unbekannten im Internet zusammenzuarbeiten. +summaryPoint3: "Ein sicherer Ort, um Gelder für einen bestimmten Zweck bereitzustellen." --- ## Was sind DAOs? {#what-are-daos} -Eine DAO ist eine Organisation im kollektiven Besitz, die auf eine gemeinsame Mission hinarbeitet. +Eine DAO ist eine Organisation in kollektivem Besitz, die auf eine gemeinsame Mission hinarbeitet. -DAOs ermöglichen es uns, mit Gleichgesinnten rund um den Globus zusammenzuarbeiten, ohne auf das Wohlwollen einer Führungskraft vertrauen zu müssen, die unsere Geldmittel oder die Operationen verwaltet. Es gibt keinen CEO, der Geldmittel nach Lust und Laune ausgibt, und keinen Finanzchef, der die Buchhaltung manipulieren kann. Stattdessen bestimmen die in den Code eingebauten, Blockchain-basierten Regeln, wie die Organisation funktioniert und wie Geldmittel ausgegeben werden. +DAOs ermöglichen es uns, mit Gleichgesinnten auf der ganzen Welt zusammenzuarbeiten, ohne einem wohlwollenden Anführer vertrauen zu müssen, der die Gelder oder den Betrieb verwaltet. Es gibt keinen CEO, der nach Lust und Laune Gelder ausgeben kann, oder einen CFO, der die Bücher manipulieren kann. Stattdessen definieren Blockchain-basierte Regeln, die in den Code integriert sind, wie die Organisation funktioniert und wie Gelder ausgegeben werden. -Die Finanzverwaltung ist integriert und niemand kann ohne die Zustimmung der Gruppe auf die Mittel zugreifen. Entscheidungen werden nach Vorschlägen und Abstimmungen getroffen. So wird sichergestellt, dass jeder in der Organisation eine Stimme hat und dass alles transparent [on-Chain](/glossary/#on-chain) abläuft. +Sie verfügen über integrierte Kassen, auf die niemand ohne die Zustimmung der Gruppe zugreifen darf. Entscheidungen werden durch Vorschläge und Abstimmungen geregelt, um sicherzustellen, dass jeder in der Organisation eine Stimme hat, und alles geschieht transparent [auf der Blockchain](/glossary/#onchain). -## Wofür brauchen wir DAOs? {#why-dao} +## Warum brauchen wir DAOs? {#why-dao} -Um gemeinsam mit anderen Personen eine Organisation zu gründen und dafür Gelder und Finanzierungsmöglichkeiten bereitzustellen ist viel Vertrauen in die Menschen vonnöten, mit denen Sie arbeiten. Doch es ist alles andere als leicht, jemandem zu vertrauen, mit dem Sie immer nur über das Internet interagiert haben. Dank DAOs müssen Sie niemand anderem in der Gruppe vertrauen, sondern nur dem DAO-Code. Dieser ist zu 100 % transparent und von jedem überprüfbar. +Die Gründung einer Organisation mit jemandem, bei der es um Finanzierung und Geld geht, erfordert viel Vertrauen in die Personen, mit denen man zusammenarbeitet. Aber es ist schwer, jemandem zu vertrauen, mit dem man nur im Internet interagiert hat. Bei DAOs müssen Sie niemandem in der Gruppe vertrauen, sondern nur dem Code der DAO, der zu 100 % transparent und für jeden überprüfbar ist. -Das eröffnet so viele neue Möglichkeiten der globalen Zusammenarbeit und Koordination. +Dies eröffnet so viele neue Möglichkeiten für die globale Zusammenarbeit und Koordination. ### Ein Vergleich {#dao-comparison} -| DAO | Eine herkömmliche Organisation | -| ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| In der Regel flache Strukturen und vollständig demokratisiert | In der Regel hierarchisch strukturiert | -| Abstimmung durch die Mitglieder erforderlich, damit Veränderungen implementiert werden können | Veränderungen können je nach Struktur von einzelnen Parteien verlangt oder durch offene Abstimmungen beschlossen werden | -| Nach der Stimmenauszählung wird das Ergebnis automatisch ohne vertrauenswürdige Vermittlungsinstanz implementiert | Sofern Abstimmungen erlaubt sind, werden die Stimmen intern gezählt und das Ergebnis muss manuell umgesetzt werden | -| Angebotene Dienste werden automatisch auf dezentrale Weise abgewickelt (etwa die Verteilung von Geldmitteln für einen guten Zweck) | Erfordert die Abwicklung durch Personen oder zentral kontrollierte automatische Abläufe, die anfällig für Manipulation sind | -| Alle Aktivitäten sind transparent und vollständig öffentlich | Aktivitäten sind normalerweise organisationsintern, begrenzte Einsicht für die Öffentlichkeit | +| DAO | Eine traditionelle Organisation | +| ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| Meist flach und vollständig demokratisiert. | Meist hierarchisch. | +| Abstimmungen durch die Mitglieder sind erforderlich, damit Änderungen umgesetzt werden. | Je nach Struktur können Änderungen von einer einzigen Partei gefordert oder Abstimmungen angeboten werden. | +| Stimmen werden ausgezählt und das Ergebnis automatisch ohne vertrauenswürdigen Vermittler umgesetzt. | Wenn Abstimmungen erlaubt sind, werden die Stimmen intern ausgezählt und das Ergebnis der Abstimmung muss manuell bearbeitet werden. | +| Angebotene Dienste werden automatisch auf dezentralisierte Weise abgewickelt (z. B. die Verteilung philanthropischer Gelder). | Erfordert menschliche Handhabung oder zentral gesteuerte Automatisierung, die anfällig für Manipulationen ist. | +| Alle Aktivitäten sind transparent und vollständig öffentlich. | Aktivitäten sind in der Regel privat und für die Öffentlichkeit eingeschränkt. | -### Beispiele für DAOs {#dao-examples} +### DAO-Beispiele {#dao-examples} -Für ein besseres Verständnis finden Sie im Folgenden einige Beispiele für den Einsatz einer DAO: +Damit dies verständlicher wird, sind hier einige Beispiele, wie Sie eine DAO nutzen könnten: -- **Eine Wohltätigkeitsorganisation** – Sie könnten von jeder Person auf der Welt Spenden annehmen und darüber abstimmen, welche Zwecke unterstützt werden sollen. -- **Kollektivbesitz** – Sie könnten physische oder digitale Vermögenswerte erwerben und Mitglieder können darüber abstimmen, wie diese eingesetzt werden sollen. -- **Projekte und Förderung** – Sie könnten einen Risikofonds anlegen, der Investitionskapital zusammenlegt und abstimmt, welche Projekte unterstützt werden sollen. Das zurückgezahlte Geld könnte später unter den DAO-Mitgliedern neu verteilt werden. +- **Eine Wohltätigkeitsorganisation** – Sie könnten Spenden von jedem auf der Welt annehmen und darüber abstimmen, welche Zwecke finanziert werden sollen. +- **Kollektives Eigentum** – Sie könnten physische oder digitale Vermögenswerte erwerben und die Mitglieder können darüber abstimmen, wie diese genutzt werden sollen. +- **Unternehmen und Zuschüsse** – Sie könnten einen Risikofonds gründen, der Investitionskapital bündelt und darüber abstimmt, welche Unternehmen unterstützt werden sollen. Zurückgezahltes Geld könnte später unter den DAO-Mitgliedern umverteilt werden. ## Wie funktionieren DAOs? {#how-daos-work} -Das Grundgerüst einer DAO ist ihr [Smart Contract](/glossary/#smart-contract), der die Regeln der Organisation bestimmt und die Finanzmittel enthält. Sobald ein Smart Contract auf Ethereum aktiv ist, können die Regeln ausschließlich per Abstimmung geändert werden. Vorgänge, die nicht durch die Regeln und Logik des Codes abgedeckt sind, schlagen fehl. Da auch die Finanzmittel durch den Smart Contract definiert sind, kann niemand das Geld ohne die Zustimmung der Gruppe ausgeben. Daher benötigen DAOs keine zentrale Instanz. Stattdessen trifft die Gruppe Entscheidungen gemeinsam, wobei Zahlungen bei positiver Abstimmung automatisch genehmigt werden. +Das Rückgrat einer DAO ist ihr [Smart Contract](/glossary/#smart-contract), der die Regeln der Organisation definiert und die Kasse der Gruppe verwaltet. Sobald der Vertrag auf [Ethereum](/) live ist, kann niemand die Regeln ändern, außer durch eine Abstimmung. Wenn jemand versucht, etwas zu tun, das nicht durch die Regeln und die Logik im Code abgedeckt ist, wird es fehlschlagen. Und da die Kasse ebenfalls durch den Smart Contract definiert ist, bedeutet das, dass niemand das Geld ohne die Zustimmung der Gruppe ausgeben kann. Das bedeutet, dass DAOs keine zentrale Autorität benötigen. Stattdessen trifft die Gruppe Entscheidungen kollektiv, und Zahlungen werden automatisch autorisiert, wenn Abstimmungen erfolgreich sind. -Möglich wird dies durch die Manipulationssicherheit von Smart Contracts, die auf Ethereum veröffentlicht werden. Da alle Vorgänge öffentlich sind, sind unbemerkte Änderungen am Code (also den Regeln der DAO) unmöglich. +Dies ist möglich, weil Smart Contracts manipulationssicher sind, sobald sie auf Ethereum live gehen. Man kann den Code (die Regeln der DAO) nicht einfach bearbeiten, ohne dass es jemand bemerkt, da alles öffentlich ist. ## Ethereum und DAOs {#ethereum-and-daos} -Ethereum ist aus einer Reihe von Gründen die perfekte Plattform für DAOs: +Ethereum ist aus mehreren Gründen die perfekte Grundlage für DAOs: -- Ethereums Konsensebene ist dezentralisiert und so gut etabliert, dass Organisationen dem Netzwerk vertrauen können. -- Der Code eines Smart Contracts kann nach seiner Veröffentlichung nicht mehr geändert werden, auch nicht von seinen Eigentümern. Damit kann die DAO nach den Regeln arbeiten, nach denen sie programmiert wurde. -- Smart Contracts können Geldmittel versenden und empfangen. Andernfalls wäre für die Verwaltung der Geldmittel der Gruppe eine vertrauenswürdige Vermittlungsinstanz erforderlich. -- Die Ethereum-Community ist bekannt dafür, dass ihr Zusammenarbeit wichtiger ist als Wettbewerb. Daher können sich bewährte Verfahren und Unterstützungssysteme schnell herausbilden. +- Ethereums eigener Konsens ist dezentralisiert und etabliert genug, damit Organisationen dem Netzwerk vertrauen können. +- Der Code von Smart Contracts kann nach der Veröffentlichung nicht mehr geändert werden, nicht einmal von seinen Eigentümern. Dies ermöglicht es der DAO, nach den Regeln zu arbeiten, mit denen sie programmiert wurde. +- Smart Contracts können Gelder senden/empfangen. Ohne dies bräuchte man einen vertrauenswürdigen Vermittler, um die Gelder der Gruppe zu verwalten. +- Die Ethereum-Community hat sich als eher kooperativ denn als kompetitiv erwiesen, was es ermöglicht, dass Best Practices und Unterstützungssysteme schnell entstehen. -## DAO-Verwaltung {#dao-governance} +## DAO-Governance {#dao-governance} -Um DAOs zu verwalten, sind vorher zahlreiche Überlegungen notwendig – etwa wie Abstimmungen und Vorschläge funktionieren sollen. +Bei der Governance einer DAO gibt es viele Überlegungen, wie zum Beispiel die Funktionsweise von Abstimmungen und Vorschlägen. ### Delegation {#governance-delegation} -Die Delegation ist die DAO-Variante repräsentativer Demokratie. Tokenbesitzer delegieren Stimmen an Benutzer, die sich selbst nominieren und sich verpflichten, auf dem aktuellen Stand zu bleiben und das Protokoll zu verwalten. +Delegation ist wie die DAO-Version der repräsentativen Demokratie. Token-Inhaber delegieren Stimmen an Benutzer, die sich selbst nominieren und sich verpflichten, das Protokoll zu verwalten und informiert zu bleiben. -#### Bekanntes Beispiel {#governance-example} +#### Ein bekanntes Beispiel {#governance-example} -[ENS](https://claim.ens.domains/delegate-ranking) – Um sie zu vertreten, können ENS-Besitzer ihre Stimmen an engagierte Communitymitglieder delegieren. +[ENS](https://claim.ens.domains/delegate-ranking) – ENS-Inhaber können ihre Stimmen an engagierte Community-Mitglieder delegieren, um sie zu vertreten. -### Automatische Transaktionsverwaltung {#governance-example} +### Automatische Transaktions-Governance {#governance-example} -In vielen DAOs werden Transaktionen automatisch ausgeführt, wenn eine Mindestanzahl der Mitglieder zustimmt. +In vielen DAOs werden Transaktionen automatisch ausgeführt, wenn ein Quorum der Mitglieder zustimmt. -#### Bekanntes Beispiel {#governance-example} +#### Ein bekanntes Beispiel {#governance-example} -[Nouns](https://nouns.wtf) – In der Nouns DAO wird eine Transaktion automatisch ausgeführt, wenn die Mindestanzahl der Stimmen erreicht ist und sich die Mehrzahl der Stimmen für die Transaktion ausspricht, solange es von den Gründern keinen Widerspruch gibt. +[Nouns](https://nouns.wtf) – In der Nouns DAO wird eine Transaktion automatisch ausgeführt, wenn ein Quorum an Stimmen erreicht ist und eine Mehrheit zustimmt, solange die Gründer kein Veto einlegen. -### Multisig-Verwaltung {#governance-example} +### Mehrfachsignatur-Governance {#governance-example} -DAOS können über Tausende stimmberechtigte Mitglieder verfügen. Die Geldmittel werden allerdings in einer [Wallet](/glossary/#wallet) aufbewahrt, die von 5 bis 20 aktiven, vertrauenswürdigen Mitgliedern der Community, die normalerweise „gedoxxt“ (Ihre öffentlichen Identitäten sind der Community bekannt) sind, geteilt wird. Nach einer Abstimmung setzen die [Multi-sig](/glossary/#multisig)-Unterzeichner den Willen der Community um. +Während DAOs Tausende von stimmberechtigten Mitgliedern haben können, können sich die Gelder in einem [Wallet](/glossary/#wallet) befinden, das von 5-20 aktiven Community-Mitgliedern geteilt wird, denen vertraut wird und die normalerweise gedoxxt sind (öffentliche Identitäten, die der Community bekannt sind). Nach einer Abstimmung führen die [Mehrfachsignatur](/glossary/#multisig)-Unterzeichner den Willen der Community aus. ## DAO-Gesetze {#dao-laws} -Im US-Bundesstaat Wyoming wurde 1977 die LCC eingeführt, die Unternehmer schützt und ihre Haftung beschränkt. In jüngster Zeit hat der Staat außerdem ein DAO-Gesetz verabschiedet, das den Rechtsstatus von DAOs festlegt. Aktuell verfügen (in den USA) Wyoming, Vermont und die Jungferninseln über eine Form von DAO-Gesetzen. +1977 erfand Wyoming die LLC, die Unternehmer schützt und ihre Haftung begrenzt. In jüngerer Zeit leisteten sie Pionierarbeit beim DAO-Gesetz, das den rechtlichen Status für DAOs festlegt. Derzeit haben Wyoming, Vermont und die Jungferninseln DAO-Gesetze in irgendeiner Form. -### Bekanntes Beispiel {#law-example} +### Ein bekanntes Beispiel {#law-example} -[CityDAO](https://citizen.citydao.io/) – CityDAO hat durch Wyomings DAO-Gesetz rund 16 Hektar Land in der Nähe des Yellowstone-Nationalparks gekauft. +[CityDAO](https://citizen.citydao.io/) – CityDAO nutzte das DAO-Gesetz von Wyoming, um 40 Acres Land in der Nähe des Yellowstone-Nationalparks zu kaufen. ## DAO-Mitgliedschaft {#dao-membership} -Für die Mitgliedschaft in einer DAO gibt es verschiedene Modelle. Über die Mitgliedschaft wird festgelegt, wie Abstimmungen und andere wesentliche Bereiche der DAO funktionieren. +Es gibt verschiedene Modelle für die DAO-Mitgliedschaft. Die Mitgliedschaft kann bestimmen, wie Abstimmungen funktionieren und andere wichtige Teile der DAO. ### Token-basierte Mitgliedschaft {#token-based-membership} -Abhängig vom benutzten Token normalerweise vollkommen [berechtigungsfrei](/glossary/#permissionless). Meistens können diese Verwaltungs-Token berechtigungsfrei in einem [dezentralisierten Austausch](/glossary/#dex) gehandelt werden. Andere müssen durch die Bereitstellung liquider Mittel oder eine andere Form des „Proof of Work“ erworben werden. In jedem Fall gewährt der Besitz des Tokens Zugang zur Abstimmung. +Normalerweise vollständig [erlaubnisfrei](/glossary/#permissionless), abhängig vom verwendeten Token. Meistens können diese Governance-Token erlaubnisfrei an einer [dezentralisierten Börse](/glossary/#dex) gehandelt werden. Andere müssen durch die Bereitstellung von Liquidität oder einen anderen „Proof-of-Work“ verdient werden. So oder so gewährt das bloße Halten des Tokens Zugang zur Abstimmung. -_In der Regel werden sie zur Steuerung umfangreicher dezentraler Protokolle und/oder von Token selbst verwendet._ +_Wird typischerweise verwendet, um breite dezentralisierte Protokolle und/oder Token selbst zu verwalten._ -#### Bekanntes Beispiel {#token-example} +#### Ein bekanntes Beispiel {#token-example} -[MakerDAO](https://makerdao.com) – Der Token MKR von MakerDAOs wird an zahlreichen dezentralisierten Börsen angeboten, sodass jeder Token und damit Stimmrechte für die zukünftige Ausrichtung des Maker-Protokolls kaufen kann. +[MakerDAO](https://makerdao.com) – Der Token MKR von MakerDAO ist auf dezentralisierten Börsen weit verbreitet und jeder kann sich einkaufen, um Stimmrecht über die Zukunft des Maker-Protokolls zu haben. ### Anteilsbasierte Mitgliedschaft {#share-based-membership} -Anteilsbasierte DAOs sind stärker reglementiert, aber immer noch recht offen. Alle potenziellen Mitglieder können Anträge stellen, um der DAO beizutreten. Dafür wird meist eine Gegenleistung in Form von Token oder geleisteter Arbeit angeboten. Anteile stehen für direkte Stimmrechte und Eigentum. Die Mitglieder können jeder aussteigen und erhalten einen proportionalen Anteil an den Finanzmitteln. +Anteilsbasierte DAOs sind stärker zugangsbeschränkt, aber immer noch recht offen. Alle potenziellen Mitglieder können einen Vorschlag einreichen, um der DAO beizutreten, wobei sie normalerweise einen Tribut von gewissem Wert in Form von Token oder Arbeit anbieten. Anteile repräsentieren direkte Stimmrechte und Eigentum. Mitglieder können jederzeit mit ihrem proportionalen Anteil an der Kasse austreten. -_Findet in der Regel Anwendung für kleinere, auf den Menschen ausgerichtete Organisationen wie Wohltätigkeitsorganisationen, Arbeitergemeinschaften und Investmentclubs. Die anteilsbasierte Mitgliedschaft kann auch die Verwaltung von Protokollen und Token regeln._ +_Wird typischerweise für enger verbundene, menschenzentrierte Organisationen wie Wohltätigkeitsorganisationen, Arbeiterkollektive und Investmentclubs verwendet. Kann auch Protokolle und Token verwalten._ -#### Bekanntes Beispiel {#share-example} +#### Ein bekanntes Beispiel {#share-example} -[MolochDAO](http://molochdao.com/) – MolochDAO ist auf die Finanzierung von Ethereum-Projekten ausgerichtet. Für sie ist ein Antrag auf Mitgliedschaft erforderlich, damit die Gruppe beurteilen kann, ob Interessenten über das nötige Fachwissen und Kapital verfügen, um fundierte Entscheidungen über potenzielle Förderungsempfänger zu treffen. Es ist nicht möglich, den Zugang zur DAO einfach auf dem freien Markt zu erwerben. +[MolochDAO](http://molochdao.com/) – MolochDAO konzentriert sich auf die Finanzierung von Ethereum-Projekten. Sie erfordern einen Vorschlag für die Mitgliedschaft, damit die Gruppe beurteilen kann, ob Sie über das erforderliche Fachwissen und Kapital verfügen, um fundierte Urteile über potenzielle Stipendiaten zu fällen. Man kann sich den Zugang zur DAO nicht einfach auf dem freien Markt kaufen. ### Reputationsbasierte Mitgliedschaft {#reputation-based-membership} -Die Reputation ist ein Nachweis der Teilnahme und gewährt Stimmrechte in der DAO. Im Gegensatz zur token- oder anteilsbasierten Mitgliedschaft werde bei reputationsbasierten DAOs keine Eigentumsrechte an Mitwirkende übertragen. Die Reputation kann weder gekauft, übertragen noch delegiert werden. DAO-Mitglieder können die Reputation nur durch Teilnahme erwerben. Für On-Chain-Abstimmungen ist keine Berechtigung erforderlich. Jedes potenzielle Mitglied kann einen Antrag auf Beitritt zur DAO und Vergütung seiner Mitwirkung in Form von Reputation und Token stellen. +Reputation stellt einen Teilnahmenachweis dar und gewährt Stimmrecht in der DAO. Im Gegensatz zur Token- oder anteilsbasierten Mitgliedschaft übertragen reputationsbasierte DAOs kein Eigentum an Mitwirkende. Reputation kann nicht gekauft, übertragen oder delegiert werden; DAO-Mitglieder müssen sich Reputation durch Teilnahme verdienen. Abstimmungen auf der Blockchain sind erlaubnisfrei und potenzielle Mitglieder können frei Vorschläge einreichen, um der DAO beizutreten und als Belohnung für ihre Beiträge Reputation und Token zu erhalten. -_Wird üblicherweise für die dezentralisierte Entwicklung und Verwaltung von Protokollen und [DApps](/glossary/#dapp) verwendet, aber auch gut geeignet für eine vielfältige Reihe an Organisationen wie Wohltätigkeitsorganisationen, Arbeitergemeinschaften, Investmentclubs usw._ +_Wird typischerweise für die dezentralisierte Entwicklung und Governance von Protokollen und [Dapps](/glossary/#dapp) verwendet, eignet sich aber auch gut für eine Vielzahl von Organisationen wie Wohltätigkeitsorganisationen, Arbeiterkollektive, Investmentclubs usw._ -#### Bekanntes Beispiel {#reputation-example} +#### Ein bekanntes Beispiel {#reputation-example} -[DXdao](https://DXdao.eth.limo) – DXdao war eine weltweit souveräne Gemeinschaft, die seit 2019 dezentralisierte Protokolle und Anwendungen entwickelte und verwaltete. Sie nutzte reputationsbasierte Verwaltung und [holografischen Konsens](/glossary/#holographic-consensus) zur Koordiantion und Verwaltung von Geldmitteln, d. h. niemand konnte sich Einfluss auf ihre Entwicklung oder Verwaltung erkaufen. +[DXdao](https://DXdao.eth.limo) – DXdao war ein globales souveränes Kollektiv, das seit 2019 dezentralisierte Protokolle und Anwendungen aufbaute und verwaltete. Es nutzte reputationsbasierte Governance und [holografischen Konsens](/glossary/#holographic-consensus), um Gelder zu koordinieren und zu verwalten, was bedeutet, dass sich niemand einkaufen konnte, um seine Zukunft oder Governance zu beeinflussen. -## DAO – Beitritt und Gründung {#join-start-a-dao} +## Einer DAO beitreten / eine DAO gründen {#join-start-a-dao} ### Einer DAO beitreten {#join-a-dao} -- [DAOs der Ethereum-Community](/community/get-involved/#decentralized-autonomous-organizations-daos) -- [DAO-Liste von DAOHaus](https://app.daohaus.club/explore) -- [DAO-Liste von tally.xyz](https://www.tally.xyz) +- [Ethereum-Community-DAOs](/community/get-involved/#decentralized-autonomous-organizations-daos) +- [DAOHaus-Liste von DAOs](https://app.daohaus.club/explore) +- [Tally.xyz-Liste von DAOs](https://www.tally.xyz/explore) +- [DeGov.AI-Liste von DAOs](https://apps.degov.ai/) -### Gründung einer DAO {#start-a-dao} +### Eine DAO gründen {#start-a-dao} -- [Eine DAO mit DAOHaus gründen](https://app.daohaus.club/summon) -- [Eine Governor DAO mit Tally gründen](https://www.tally.xyz/add-a-dao) -- [Eine von Aragon betriebene DAO gründen](https://aragon.org/product) -- [Eine Kolonie gründen](https://colony.io/) -- [Eine DAO mit dem holografischen Konsens von DAOstack gründen](https://alchemy.daostack.io/daos/create) +- [Eine DAO mit DAOHaus ins Leben rufen](https://app.daohaus.club/summon) +- [Eine Governor-DAO mit Tally gründen](https://www.tally.xyz/get-started) +- [Eine von Aragon betriebene DAO erstellen](https://aragon.org/product) +- [Eine Colony gründen](https://colony.io/) +- [Eine DAO mit dem holografischen Konsens von DAOstack erstellen](https://alchemy.daostack.io/daos/create) +- [Eine DAO mit dem DeGov Launcher starten](https://docs.degov.ai/integration/deploy) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} ### DAO-Artikel {#dao-articles} - [Was ist eine DAO?](https://aragon.org/dao) – [Aragon](https://aragon.org/) -- [Haus der DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) +- [House of DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) - [Was ist eine DAO und wofür ist sie da?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/) -- [Gründung einer DAO-basierten digitalen Community](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) +- [Wie man eine DAO-gestützte digitale Community gründet](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Was ist eine DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) -- [Was ist holografischer Konsens?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) – [DAOstack](https://daostack.io/) -- [DAOs sind keine Unternehmen: „Wo die Dezentralisierung in autonomen Organisationen wichtig ist“ von Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) -- [DAOs, DACs, DAs und mehr: Ein unvollständiger Terminologie-Guide](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) +- [Was ist holografischer Konsens?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) +- [DAOs sind keine Unternehmen: Wo Dezentralisierung in autonomen Organisationen wichtig ist, von Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) +- [DAOs, DACs, DAs und mehr: Ein unvollständiger Terminologie-Leitfaden](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) ### Videos {#videos} -- [Was ist eine DAO in der Kryptolandschaft?](https://youtu.be/KHm0uUPqmVE) -- [Lässt sich mithilfe von DAOs eine Stadt errichten?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/) +- [Was ist eine DAO in Krypto?](https://youtu.be/KHm0uUPqmVE) +- [Kann eine DAO eine Stadt bauen?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/) - + \ No newline at end of file diff --git a/public/content/translations/de/decentralized-identity/index.md b/public/content/translations/de/decentralized-identity/index.md index 72abcbbc709..5f414a56c64 100644 --- a/public/content/translations/de/decentralized-identity/index.md +++ b/public/content/translations/de/decentralized-identity/index.md @@ -1,191 +1,218 @@ --- -title: Dezentralisierte Identität -description: Was ist eine dezentralisierte Identität und warum ist sie wichtig? +title: "Dezentralisierte Identität" +description: "Was ist eine dezentralisierte Identität und warum ist sie wichtig?" lang: de template: use-cases emoji: ":id:" sidebarDepth: 2 image: /images/eth-gif-cat.png -summaryPoint1: Traditionelle Identitätssysteme haben die Ausgabe, Wartung und Kontrolle Ihrer Identifikatoren zentralisiert. -summaryPoint2: Eine dezentralisierte Identität beseitigt die Abhängigkeit von zentralisierten Dritten. -summaryPoint3: Dank Krypto haben Benutzer jetzt die Werkzeuge, um ihre eigenen Identifikatoren und Bescheinigungen wieder auszugeben, zu halten und zu kontrollieren. +summaryPoint1: "Traditionelle Identitätssysteme haben die Emission, Pflege und Kontrolle Ihrer Identifikatoren zentralisiert." +summaryPoint2: "Dezentralisierte Identität beseitigt die Abhängigkeit von zentralisierten Drittanbietern." +summaryPoint3: "Dank Krypto haben Benutzer nun wieder die Werkzeuge, um ihre eigenen Identifikatoren und Bestätigungen zu emittieren, zu halten und zu kontrollieren." --- -Identität untermauert praktisch jeden Aspekt Ihres heutigen Lebens. Die Nutzung von Online-Diensten, die Eröffnung eines Bankkontos, die Teilnahme an Wahlen, der Kauf von Immobilien, die Sicherung von Arbeit – all dies erfordert den Nachweis Ihrer Identität. +Identität untermauert heute praktisch jeden Aspekt Ihres Lebens. Die Nutzung von Online-Diensten, die Eröffnung eines Bankkontos, die Stimmabgabe bei Wahlen, der Kauf von Immobilien, die Sicherung eines Arbeitsplatzes – all diese Dinge erfordern den Nachweis Ihrer Identität. -Traditionelle Identitätsmanagementsysteme verlassen sich jedoch seit Langem auf zentralisierte Vermittler, die Ihre Identifikatoren und [Attestierungen](/glossary/#attestation) ausstellen, speichern und kontrollieren. Das bedeutet, dass Sie Ihre identitätsbezogenen Informationen nicht kontrollieren können und nicht entscheiden können, wer Zugriff auf personenbezogene Daten (PII) hat, und wie viel Zugriff diese Parteien haben. +Traditionelle Identitätsmanagementsysteme verlassen sich jedoch seit langem auf zentralisierte Vermittler, die Ihre Identifikatoren und [Bestätigungen](/glossary/#attestation) ausgeben, halten und kontrollieren. Das bedeutet, dass Sie Ihre identitätsbezogenen Informationen nicht kontrollieren oder entscheiden können, wer Zugang zu personenbezogenen Daten (PII) hat und wie viel Zugang diese Parteien haben. -Um diese Probleme zu lösen, haben wir dezentrale Identitätssysteme, die auf öffentlichen Blockchains wie Ethereum basieren. Eine dezentralisierte Identität erlaubt es den Menschen, ihre identitätsbezogenen Informationen zu verwalten. Durch dezentralisierte Identitätslösungen können _Sie_ Identifikatoren erschaffen und Ihre Attestierungen sowohl beanspruchen als auch über sie verfügen, ohne dabei auf zentrale Autoritäten, wie Dienstleister oder Regierungen, vertrauen zu müssen. +Um diese Probleme zu lösen, haben wir dezentralisierte Identitätssysteme, die auf öffentlichen Blockchains wie [Ethereum](/) aufbauen. Dezentralisierte Identität ermöglicht es Einzelpersonen, ihre identitätsbezogenen Informationen zu verwalten. Mit dezentralisierten Identitätslösungen können _Sie_ Identifikatoren erstellen und Ihre Bestätigungen beanspruchen und halten, ohne sich auf zentrale Behörden wie Dienstleister oder Regierungen verlassen zu müssen. ## Was ist Identität? {#what-is-identity} -Identität bedeutet das Selbstempfinden eines Individuums, definiert durch einzigartige Charaktereigenschaften. Identität bezieht sich auf ein _Individuum_, d. h. eine eigenständige Person. Identität könnte sich auch auf andere nicht-menschliche Entitäten, wie eine Organisation oder Behörde, beziehen. +Identität bedeutet das Selbstverständnis eines Individuums, definiert durch einzigartige Merkmale. Identität bezieht sich darauf, ein _Individuum_ zu sein, d. h. eine eigenständige menschliche Entität. Identität könnte sich auch auf andere, nicht-menschliche Entitäten beziehen, wie z. B. eine Organisation oder Behörde. ## Was sind Identifikatoren? {#what-are-identifiers} -Ein Identifikator ist eine Information, die als Pointer einer bestimmten Identität oder von Identitäten fungiert. Beispiele für allgemeine Identifikatoren: +Ein Identifikator ist eine Information, die als Verweis auf eine bestimmte Identität oder bestimmte Identitäten dient. Zu den gängigen Identifikatoren gehören: - Name -- Sozialversicherungsnummer/Steuernummer -- Mobiltelefonnummer +- Sozialversicherungsnummer/Steueridentifikationsnummer +- Handynummer - Geburtsdatum und -ort -- Zugangsdaten für eine digitale Identifikation, z. B. E-Mail-Adressen, Benutzernamen, Avatare +- Digitale Identifikationsnachweise, z. B. E-Mail-Adressen, Benutzernamen, Avatare -Diese traditionellen Beispiele von Identifikatoren werden von zentralen Stellen ausgestellt, gespeichert und kontrolliert. Sie brauchen die Erlaubnis Ihrer Regierung, um Ihren Namen zu ändern, oder die einer Social-Media-Plattform, um Ihren Benutzernamen zu ändern. +Diese traditionellen Beispiele für Identifikatoren werden von zentralen Entitäten ausgegeben, gehalten und kontrolliert. Sie benötigen die Erlaubnis Ihrer Regierung, um Ihren Namen zu ändern, oder von einer Social-Media-Plattform, um Ihren Benutzernamen zu ändern. -## Vorteile dezentralisierter Identitäten {#benefits-of-decentralized-identity} +## Vorteile der dezentralisierten Identität {#benefits-of-decentralized-identity} -1. Dezentralisierte Identitäten erhöhen die individuelle Kontrolle der Identifizierung von Informationen. Dezentralisierte Identifikatoren und Attestierungen können überprüft werden, ohne sich auf zentralisierte Behörden und Dienste Dritter zu verlassen. +1. Dezentralisierte Identität erhöht die individuelle Kontrolle über identifizierende Informationen. Dezentralisierte Identifikatoren und Bestätigungen können verifiziert werden, ohne sich auf zentralisierte Behörden und Drittanbieterdienste verlassen zu müssen. -2. Dezentralisierte Identitätslösungen benötigen kein Vertrauen. Sie stellen eine nahtlose und die Privatsphäre schützende Methode zur Überprüfung und Verwaltung von Benutzeridentitäten dar. +2. Dezentralisierte Identitätslösungen ermöglichen eine vertrauenslose, nahtlose und datenschutzfreundliche Methode zur Verifizierung und Verwaltung der Benutzeridentität. -3. Dezentralisierte Identitäten nutzten die Blockchain-Technologie, die Vertrauen zwischen verschiedenen Parteien schafft und kryptografische Garantien bietet, um die Gültigkeit von Attestierungen nachzuweisen. +3. Dezentralisierte Identität nutzt die Blockchain-Technologie, die Vertrauen zwischen verschiedenen Parteien schafft und kryptografische Garantien bietet, um die Gültigkeit von Bestätigungen zu beweisen. -4. Dezentralisierte Identitäten machen Identitätsdaten übertragbar. Benutzer speichern Attestierungen und Identifikatoren in mobilen Wallets und können sie mit jeder Partei ihrer Wahl teilen. Dezentralisierte Identifikatoren und Attestierungen sind nicht in der Datenbank der emittierenden Organisation gesperrt. +4. Dezentralisierte Identität macht Identitätsdaten portabel. Benutzer speichern Bestätigungen und Identifikatoren in einem mobilen Wallet und können sie mit jeder beliebigen Partei teilen. Dezentralisierte Identifikatoren und Bestätigungen sind nicht in der Datenbank der ausstellenden Organisation gesperrt. -5. Dezentralisierte Identitäten sollten gut mit aufkommenden [Zero-Knowledge](/glossary/#zk-proof)-Technologien zusammenarbeiten. Diese ermöglichen Einzelpersonen, dass sie beweisen können, dass sie etwas besitzen oder etwas gemacht haben, ohne preiszugeben, was es ist. Dies könnte sich zu einer schlagkräftigen Möglichkeit entwickeln, Vertrauen und Privatsphäre für bestimmte Anwendungen zu verbinden, wie z. B. Abstimmungsverhalten. +5. Dezentralisierte Identität sollte gut mit aufkommenden [Zero-Knowledge](/glossary/#zk-proof)-Technologien funktionieren, die es Einzelpersonen ermöglichen zu beweisen, dass sie etwas besitzen oder getan haben, ohne preiszugeben, was diese Sache ist. Dies könnte ein mächtiger Weg werden, um Vertrauen und Privatsphäre für Anwendungen wie Wahlen zu kombinieren. -6. Dezentralisierte Identitäten ermöglichen [Anti-Sybil](/glossary/#anti-sybil)-Mechanismen zu identifizieren, wenn eine Einzelperson vorgibt, mehrere Personen zu sein, um ein System auszutricksen oder zu spammen. +6. Dezentralisierte Identität ermöglicht Anti-[Sybil-Angriff](/glossary/#anti-sybil)-Mechanismen (Anti-Sybil), um zu erkennen, wenn ein einzelner Mensch vorgibt, mehrere Menschen zu sein, um ein System zu manipulieren oder zu spammen. -## Dezentralisierte Nutzungsmöglichkeiten von Identitäten {#decentralized-identity-use-cases} +## Anwendungsfälle für dezentralisierte Identität {#decentralized-identity-use-cases} -Dezentralisierte Identitäten haben viele potenzielle Nutzungsmöglichkeiten: +Dezentralisierte Identität hat viele potenzielle Anwendungsfälle: -### 1. Universale Log-Ins {#universal-dapp-logins} +### 1. Universelle Logins {#universal-dapp-logins} -Dezentralisierte Identitäten können dazu beitragen, Passwort-basierte Logins durch dezentrale Authentifizierung zu ersetzen. Dienstleister können Attestierungen an Benutzer verteilen, welche in einer Ethereum-Wallet gespeichert werden. Eine Beispielattestierung wäre ein [NFT](/glossary/#nft), welcher dem Inhaber Zugriff auf eine Online-Community gewährt. +Dezentralisierte Identität kann helfen, passwortbasierte Logins durch dezentralisierte Authentifizierung zu ersetzen. Dienstleister können Bestätigungen an Benutzer ausgeben, die in einem Ethereum-Wallet gespeichert werden können. Eine beispielhafte Bestätigung wäre ein [nicht-fungibler Token](/glossary/#nft) (NFT), der dem Inhaber Zugang zu einer Online-Community gewährt. -Eine [Anmeldung über Ethereum](https://siwe.xyz/) würde es Servern ermöglichen, das Ethereum-Konto des Benutzers zu bestätigen und die erforderliche Attestierung von seiner Account-Adresse einzuholen. Das bedeutet, dass Benutzer auf Plattformen und Websites zugreifen können, ohne sich lange Passwörter merken und das Online-Erlebnis für Benutzer verbessern zu müssen. +Eine [Sign-In with Ethereum](https://siwe.xyz/)-Funktion würde es Servern dann ermöglichen, das Ethereum-Konto des Benutzers zu bestätigen und die erforderliche Bestätigung von seiner Kontoadresse abzurufen. Das bedeutet, dass Benutzer auf Plattformen und Websites zugreifen können, ohne sich lange Passwörter merken zu müssen, was das Online-Erlebnis für Benutzer verbessert. ### 2. KYC-Authentifizierung {#kyc-authentication} -Die Nutzung vieler Online-Dienste erfordert von Einzelpersonen die Bereitstellung von Attestierungen und Berechtigungsnachweisen, wie zum Beispiel einen Führerschein oder nationalen Reisepass. Dieser Ansatz ist jedoch problematisch, da private Nutzerinformationen kompromittiert werden und Dienstleister die Echtheit der Attestierung nicht überprüfen können. +Die Nutzung vieler Online-Dienste erfordert, dass Einzelpersonen Bestätigungen und Nachweise vorlegen, wie z. B. einen Führerschein oder einen nationalen Reisepass. Dieser Ansatz ist jedoch problematisch, da private Benutzerinformationen kompromittiert werden können und Dienstleister die Echtheit der Bestätigung nicht überprüfen können. -Dezentralisierte Identitäten erlauben es Unternehmen, herkömmliche [Know-Your-Customer (KYC)](https://de.wikipedia.org/wiki/Know_your_customer)-Prozesse zu überspringen und Benutzeridentitäten mittels überprüfbarer Zugangsdaten zu authentifizieren. Dies senkt die Kosten des Identitätsmanagements und verhindert die Verwendung gefälschter Dokumentationen. +Dezentralisierte Identität ermöglicht es Unternehmen, auf herkömmliche [Know-Your-Customer (KYC)](https://en.wikipedia.org/wiki/Know_your_customer)-Prozesse zu verzichten und Benutzeridentitäten über verifizierbare Nachweise (Verifiable Credentials) zu authentifizieren. Dies senkt die Kosten für das Identitätsmanagement und verhindert die Verwendung gefälschter Dokumente. -### 3. Abstimmungen und Online-Communtitys {#voting-and-online-communities} +### 3. Wahlen und Online-Communities {#voting-and-online-communities} -Online-Abstimmungen und Social Media sind zwei neuartige Anwendungen für dezentralisierte Identitäten. Online-Wahlsysteme sind manipulationsanfällig, insbesondere wenn böswillige Akteure falsche Identitäten zur Abstimmung erschaffen. Einzelpersonen zu bitten, On-chain-Attestierungen vorzulegen, kann die Integrität von Online-Abstimmungsverfahren verbessern. +Online-Wahlen und soziale Medien sind zwei neuartige Anwendungen für dezentralisierte Identität. Online-Wahlsysteme sind anfällig für Manipulationen, insbesondere wenn böswillige Akteure falsche Identitäten erstellen, um abzustimmen. Die Aufforderung an Einzelpersonen, Bestätigungen auf der Blockchain vorzulegen, kann die Integrität von Online-Wahlprozessen verbessern. -Dezentralisierte Identitäten können dabei helfen, Online-Communitys zu schaffen, die frei von gefälschten Konten sind. Zum Beispiel müsste jeder Benutzer seine Identität mittels eines On-Chain-Identitätssystems, wie dem Ethereum Name Service, authentifizieren, womit die Gefahr durch Bots reduziert wird. +Dezentralisierte Identität kann helfen, Online-Communities zu schaffen, die frei von gefälschten Konten sind. Zum Beispiel müsste jeder Benutzer seine Identität mithilfe eines Identitätssystems auf der Blockchain, wie dem Ethereum Name Service, authentifizieren, was die Wahrscheinlichkeit von Bots verringert. ### 4. Anti-Sybil-Schutz {#sybil-protection} -Applikationen, die Finanzierungshilfe geben, welche [Quadratische Abstimmung](/glossary/#quadratic-voting) nutzen, sind anfällig für [Sybil-Attacken](/glossary/#sybil-attack), weil der Wert eines Zuschusses erhöht wird, wenn mehr Personen dafür abstimmen, was Nutzer dazu anreizt, ihre Beiträge auf mehrere Identitäten zu verteilen. Dezentralisierte Identitäten helfen, dies zu verhindern, indem sie jeden Teilnehmer beweisen lassen, dass sie wirklich menschlich sind, auch wenn dabei meist keine spezifischen privaten Informationen verlangt werden. +Anwendungen zur Vergabe von Zuschüssen, die [quadratische Abstimmungen](/glossary/#quadratic-voting) verwenden, sind anfällig für [Sybil-Angriffe](/glossary/#sybil-attack), da der Wert eines Zuschusses steigt, wenn mehr Personen dafür stimmen, was Benutzer dazu anregt, ihre Beiträge auf viele Identitäten aufzuteilen. Dezentralisierte Identitäten helfen, dies zu verhindern, indem sie die Hürde für jeden Teilnehmer erhöhen, zu beweisen, dass er wirklich ein Mensch ist, oft jedoch ohne spezifische private Informationen preisgeben zu müssen. -## Was ist eine Attestierung? {#what-are-attestations} +### 5. Nationale und staatliche IDs {#national-and-government-id} -Eine Attestierung ist ein Anspruch einer Entität gegenüber einer anderen Entität. Wenn Sie in den Vereinigten Staaten leben, bestätigt der Führerschein des Fahrzeugministeriums (eine Entität), dass Sie (eine andere Entität) berechtigt sind, ein Auto zu fahren. +Regierungen können die Prinzipien der dezentralisierten Identität nutzen, um grundlegende Identitätsdokumente – wie nationale Personalausweise, Reisepässe oder Führerscheine – als verifizierbare Nachweise auf Ethereum auszugeben. Dies bietet starke kryptografische Garantien für die Echtheit, um Betrug und Fälschung bei der Online-Identitätsprüfung zu reduzieren. Bürger können diese Bestätigungen in ihrem persönlichen [Wallet](/wallets/) speichern und sie verwenden, um ihre Identität, ihr Alter oder ihr Wahlrecht nachzuweisen. -Attestierungen unterscheiden sich von Identifikatoren. Eine Attestierung _enthält_ Identifikatoren für den Verweis auf eine bestimmte Identität und stellt einen Anspruch gegenüber einem Attribut im Zusammenhang mit dieser Identität. Ihr Führerschein hat also Identifikatoren (Name, Geburtsdatum, Adresse), ist aber zugleich auch die Attestierung Ihres gesetzlichen Fahrrechts. +Dieses Modell ermöglicht eine selektive Offenlegung, insbesondere in Kombination mit der Datenschutztechnologie [Zero-Knowledge-Beweis (ZKP)](/zero-knowledge-proofs/). Zum Beispiel könnte ein Bürger kryptografisch beweisen, dass er über 18 Jahre alt ist, um auf einen altersbeschränkten Dienst zuzugreifen, ohne sein genaues Geburtsdatum preiszugeben, was mehr Privatsphäre bietet als ein herkömmlicher Ausweis. + +#### 💡Fallstudie: Bhutan National Digital ID (NDI) auf Ethereum {#case-study-bhutan-ndi} + +- Bietet Zugang zu verifizierbaren Identitätsnachweisen für die fast 800.000 Bürger Bhutans +- Migration vom Polygon-Netzwerk [zum Ethereum-Mainnet](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) im Oktober 2025 +- Über [234.000 digitale IDs](https://www.blockchain-council.org/blockchain/bhutan-uses-blockchain-in-digital-id-project/) ausgestellt (Stand: März 2025) + +Das Königreich Bhutan [migrierte sein National Digital Identity (NDI)-System](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) im Oktober 2025 zu Ethereum. Basierend auf den Prinzipien der dezentralisierten Identität und der selbstsouveränen Identität verwendet das NDI-System von Bhutan dezentralisierte Identifikatoren und verifizierbare Nachweise, um digital signierte Nachweise direkt an das persönliche Wallet eines Bürgers auszugeben. Durch die Verankerung kryptografischer Beweise dieser Nachweise auf Ethereum stellt das System sicher, dass sie authentisch und manipulationssicher sind und von jeder Partei verifiziert werden können, ohne eine zentrale Behörde abfragen zu müssen. + +Die Architektur des Systems betont den Datenschutz durch den Einsatz der [Zero-Knowledge-Beweis (ZKP)](/zero-knowledge-proofs/)-Technologie. Diese Implementierung der „selektiven Offenlegung“ ermöglicht es Bürgern, bestimmte Fakten zu beweisen (z. B. „Ich bin über 18“ oder „Ich bin Staatsbürger“), um auf Dienste zuzugreifen, ohne die zugrunde liegenden persönlichen Daten wie ihre vollständige ID-Nummer oder ihr genaues Geburtsdatum preiszugeben. Dies demonstriert eine leistungsstarke, reale Nutzung von Ethereum für ein sicheres, benutzerzentriertes und datenschutzfreundliches nationales ID-System. + +#### 💡Fallstudie: Stadt Buenos Aires QuarkID auf Ethereum [Ebene 2](/layer-2/) ZKSync Era {#case-study-buenos-aires-quarkid} + +- Ausgabe dezentralisierter Identitätsnachweise an über [3,6 Millionen Benutzer](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo) beim Start +- QuarkID ist ein Open-Source-Protokoll, das im Rahmen der UN-Ziele für nachhaltige Entwicklung als [Digital Public Good](https://www.digitalpublicgoods.net/r/quarkid) anerkannt ist +- Betont ein „[Government-as-User](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)“-Modell, bei dem die Stadt nicht Eigentümer des Protokolls ist, was den Bürgern volle Dateneigentümerschaft und Privatsphäre gibt + +Im Jahr 2024 integrierte die Regierung der Stadt Buenos Aires (GCBA) QuarkID, das Open-Source-„Digital Trust Framework“, das vom Sekretariat für Innovation und digitale Transformation der GCBA entwickelt wurde, in miBA, die offizielle App der Stadt für Einwohner, um auf Regierungsdienste und offizielle Dokumente zuzugreifen. Beim Start erhielten alle über 3,6 Millionen Benutzer von miBA dezentralisierte digitale Identitäten, die es ihnen ermöglichen, verifizierbare digitale Dokumente und Zertifikate auf der Blockchain zu verwalten und zu teilen, einschließlich Staatsbürgerschaftsnachweisen, Geburts-, Heirats- und Sterbeurkunden, Steuerunterlagen, Impfpass und mehr. + +Das QuarkID-System, das auf dem Ethereum-[Ebene 2](/layer-2/)-Netzwerk ZKSync Era aufbaut, nutzt die ZKP-Technologie, um es Bürgern zu ermöglichen, persönliche Nachweise Peer-to-Peer über ihre Mobilgeräte zu verifizieren – ohne unnötige persönliche Daten preiszugeben. Das Programm hebt ein „Government-as-User“-Modell hervor, bei dem die GCBA als ein Benutzer des quelloffenen, interoperablen QuarkID-Protokolls agiert, anstatt als zentralisierter Eigentümer aufzutreten. Diese ZKP-fähige Architektur bietet eine wichtige Datenschutzfunktion: Kein Dritter, nicht einmal die GCBA, kann nachverfolgen, wie, wann oder warum ein Bürger seine Nachweise verwendet. Dieses erfolgreiche Programm bietet den Bürgern eine vollständig selbstsouveräne Identität und Kontrolle über ihre sensiblen Daten, alles gesichert durch das global verteilte Netzwerk von Ethereum. + +## Was sind Bestätigungen? {#what-are-attestations} + +Eine Bestätigung ist eine Behauptung, die von einer Entität über eine andere Entität aufgestellt wird. Wenn Sie in den Vereinigten Staaten leben, bestätigt der Ihnen vom Department of Motor Vehicles (einer Entität) ausgestellte Führerschein, dass Sie (eine andere Entität) gesetzlich berechtigt sind, ein Auto zu fahren. + +Bestätigungen unterscheiden sich von Identifikatoren. Eine Bestätigung _enthält_ Identifikatoren, um auf eine bestimmte Identität zu verweisen, und stellt eine Behauptung über ein Attribut im Zusammenhang mit dieser Identität auf. Ihr Führerschein enthält also Identifikatoren (Name, Geburtsdatum, Adresse), ist aber auch die Bestätigung über Ihr gesetzliches Recht zu fahren. ### Was sind dezentralisierte Identifikatoren? {#what-are-decentralized-identifiers} -Klassische Identifikatoren, wie beispielsweise Ihr bürgerlicher Name oder Ihre E-Mail-Adresse, sind von Dritten abhängig - von Regierungen und E-Mail-Anbietern. Dezentralisierte Identifikatoren (DIDs) sind anders - sie werden nicht von einer zentralen Stelle ausgegeben, verwaltet oder kontrolliert. +Traditionelle Identifikatoren wie Ihr gesetzlicher Name oder Ihre E-Mail-Adresse sind auf Dritte angewiesen – Regierungen und E-Mail-Anbieter. Dezentralisierte Identifikatoren (DIDs) sind anders – sie werden von keiner zentralen Entität ausgegeben, verwaltet oder kontrolliert. -Dezentralisierte Identifikatoren werden von Individuen ausgegeben, gehalten und kontrolliert. Ein [Ethereum-Konto](/glossary/#account) ist ein Beispiel für einen dezentralisierten Identifikator. Sie haben die Möglichkeit, so viele Konten zu erstellen, wie Sie möchten, ohne dass Sie eine Erlaubnis von Dritten benötigen und ohne dass diese Konten in einem zentralen Register gespeichert werden müssen. +Dezentralisierte Identifikatoren werden von Einzelpersonen ausgegeben, gehalten und kontrolliert. Ein [Ethereum-Konto](/glossary/#account) ist ein Beispiel für einen dezentralisierten Identifikator. Sie können so viele Konten erstellen, wie Sie möchten, ohne die Erlaubnis von irgendjemandem und ohne die Notwendigkeit, sie in einem zentralen Register zu speichern. -Dezentralisierte Identifikatoren sind auf verteilten Ledgers ([Blockchains](/glossary/#blockchain)) oder [Peer-to-Peer Netzwerken](/glossary/#peer-to-peer-network) gespeichert. Das macht DIDs [weltweit eindeutig, auflösbar mit hoher Verfügbarkeit und kryptographisch verifizierbar](https://w3c-ccg.github.io/did-primer/). Ein dezentralisierter Identifikator kann mit verschiedenen Entitäten verknüpft werden, darunter Personen, Organisationen oder staatliche Einrichtungen. +Dezentralisierte Identifikatoren werden auf verteilten Ledgern ([Blockchains](/glossary/#blockchain)) oder [Peer-to-Peer-Netzwerken](/glossary/#peer-to-peer-network) gespeichert. Dies macht DIDs [global einzigartig, mit hoher Verfügbarkeit auflösbar und kryptografisch verifizierbar](https://w3c-ccg.github.io/did-primer/). Ein dezentralisierter Identifikator kann mit verschiedenen Entitäten verknüpft werden, einschließlich Personen, Organisationen oder Regierungsinstitutionen. -## Was ermöglicht dezentralisierte Identifikatoren? {#what-makes-decentralized-identifiers-possible} +## Was macht dezentralisierte Identifikatoren möglich? {#what-makes-decentralized-identifiers-possible} -### 1. Öffentliche Schlüssel-Kryptografie {#public-key-cryptography} +### 1. Public-Key-Kryptografie {#public-key-cryptography} -Öffentliche Schlüssel-Kryptografie ist eine Maßnahme zur Informationssicherheit, die einen [öffentlichen Schlüssel](/glossary/#public-key) und einen [privaten Schlüssel](/glossary/#private-key) für eine Einheit generiert. Öffentliche Schlüssel-[Kryptografie](/glossary/#cryptography) wird in Blockchain Netzwerken verwendet, um Nutzeridentitäten zu authentifizieren und den Besitz von digitalen Assets nachzuweisen. +Public-Key-Kryptografie ist eine Informationssicherheitsmaßnahme, die einen [Public-Key](/glossary/#public-key) und einen [Private-Key](/glossary/#private-key) für eine Entität generiert. Public-Key-[Kryptografie](/glossary/#cryptography) wird in Blockchain-Netzwerken verwendet, um Benutzeridentitäten zu authentifizieren und das Eigentum an digitalen Vermögenswerten zu beweisen. -Einige dezentralisierte Identifikatoren, wie z. B. ein Ethereum-Konto, haben öffentliche und private Schlüssel. Der öffentliche Schlüssel identifiziert den Controller des Kontos, während die privaten Schlüssel Nachrichten für dieses Konto signieren und entschlüsseln können. Öffentliche Schlüssel-Kryptografie liefert die nötigen Nachweise, um Einheiten zu authentifizieren und Nachahmung zu verhindern, indem [kryptografische Signaturen](https://andersbrownworth.com/blockchain/public-private-keys/) verwendet werden, um alle Ansprüche zu verifizieren. +Einige dezentralisierte Identifikatoren, wie z. B. ein Ethereum-Konto, verfügen über Public- und Private-Keys. Der Public-Key identifiziert den Kontrolleur des Kontos, während die Private-Keys Nachrichten für dieses Konto signieren und entschlüsseln können. Die Public-Key-Kryptografie liefert Beweise, die erforderlich sind, um Entitäten zu authentifizieren und Identitätsdiebstahl sowie die Verwendung gefälschter Identitäten zu verhindern, indem [kryptografische Signaturen](https://andersbrownworth.com/blockchain/public-private-keys/) verwendet werden, um alle Behauptungen zu verifizieren. ### 2. Dezentralisierte Datenspeicher {#decentralized-datastores} -Eine Blockchain dient als überprüfbares Datenregister: ein offenes, dezentralisiertes Informationsarchiv, welches in keiner Weise Vertrauen benötigt. Die Existenz öffentlicher Blockchains macht es überflüssig, Identifikatoren in zentralisierten Registern zu speichern. +Eine Blockchain dient als verifizierbares Datenregister: ein offenes, vertrauensloses und dezentralisiertes Informations-Repository. Die Existenz öffentlicher Blockchains beseitigt die Notwendigkeit, Identifikatoren in zentralisierten Registern zu speichern. -Wenn jemand die Gültigkeit eines dezentralen Identifikators bestätigen muss, kann er den zugehörigen öffentlichen Schlüssel in der Blockchain finden. Dies unterscheidet sich von traditionellen Identifikatoren, die eine Authentifizierung durch Dritte erfordern. +Wenn jemand die Gültigkeit eines dezentralisierten Identifikators bestätigen muss, kann er den zugehörigen Public-Key auf der Blockchain nachschlagen. Dies unterscheidet sich von traditionellen Identifikatoren, die Dritte zur Authentifizierung benötigen. -## Wie ermöglichen dezentralisierte Identifikatoren und Attestierungen dezentralisierte Identitäten? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} +## Wie ermöglichen dezentralisierte Identifikatoren und Bestätigungen eine dezentralisierte Identität? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} -Die dezentralisierte Identität repräsentiert die Vorstellung, dass identitätsbezogene Informationen selbstkontrolliert, privat und übertragbar sein sollten. Dabei stellen dezentralisierte Identifikatoren und Attestierungen die Grundbausteine dar. +Dezentralisierte Identität ist die Idee, dass identitätsbezogene Informationen selbstkontrolliert, privat und portabel sein sollten, wobei dezentralisierte Identifikatoren und Bestätigungen die primären Bausteine sind. -Im Zusammenhang mit dezentralisierten Identitäten sind Attestierungen (auch bekannt als [nachprüfbare Berechtigungsnachweise](https://www.w3.org/TR/vc-data-model/)) manipulationssichere, kryptografisch überprüfbare Angaben des Emittenten. Jede Attestierung oder jeder nachprüfbarer Berechtigungsnachweis einer Entität (z. B. einer Organisation) wird mit ihrer DID in Zusammenhang gebracht. +Im Kontext der dezentralisierten Identität sind Bestätigungen (auch bekannt als [Verifiable Credentials](https://www.w3.org/TR/vc-data-model/)) manipulationssichere, kryptografisch verifizierbare Behauptungen des Ausstellers. Jede Bestätigung oder jedes Verifiable Credential, das eine Entität (z. B. eine Organisation) ausgibt, ist mit ihrer DID verknüpft. -Da DIDs auf der Blockchain gespeichert sind, kann jeder die Gültigkeit einer Attestierung überprüfen, indem man die DID des Emittenten auf Ethereum überprüft. Im Grunde funktioniert die Blockchain von Ethereum wie ein globales Verzeichnis, das die Überprüfung von DIDs, die mit bestimmten Entitäten verbunden sind, ermöglicht. +Da DIDs auf der Blockchain gespeichert sind, kann jeder die Gültigkeit einer Bestätigung überprüfen, indem er die DID des Ausstellers auf Ethereum abgleicht. Im Wesentlichen fungiert die Ethereum-Blockchain wie ein globales Verzeichnis, das die Verifizierung von DIDs ermöglicht, die mit bestimmten Entitäten verknüpft sind. -Dezentralisierte Identifikatoren sind der Grund dafür, dass Attestierungen selbstkontrolliert und überprüfbar sind. Auch wenn der Emittent nicht mehr existiert, wird der Inhaber immer einen Nachweis über die Herkunft und Gültigkeit der Attestierung haben. +Dezentralisierte Identifikatoren sind der Grund, warum Bestätigungen selbstkontrolliert und verifizierbar sind. Selbst wenn der Aussteller nicht mehr existiert, hat der Inhaber immer einen Beweis für die Herkunft und Gültigkeit der Bestätigung. -Dezentralisierte Identifikatoren sind auch entscheidend für den Schutz von persönlichen Daten mittels dezentralisierter Identität. Zum Beispiel, wenn eine Person einen Nachweis über eine Attestierung (z. B. Führerschein) einreicht, müssen die Verifizierenden die Gültigkeit der Informationen nicht überprüfen. Stattdessen benötigt der Verifizierende nur kryptografische Garantien über die Echtheit der Attestierung und die Identität der emittierenden Organisation, um festzustellen, ob der Nachweis gültig ist. +Dezentralisierte Identifikatoren sind auch entscheidend für den Schutz der Privatsphäre persönlicher Informationen durch dezentralisierte Identität. Wenn beispielsweise eine Person den Beweis einer Bestätigung (einen Führerschein) einreicht, muss die verifizierende Partei die Gültigkeit der Informationen im Beweis nicht überprüfen. Stattdessen benötigt der Verifizierer nur kryptografische Garantien für die Echtheit der Bestätigung und die Identität der ausstellenden Organisation, um festzustellen, ob der Beweis gültig ist. -## Attestierungen im Zusammenhang mit einer dezentralisierten Identität {#types-of-attestations-in-decentralized-identity} +## Arten von Bestätigungen in der dezentralisierten Identität {#types-of-attestations-in-decentralized-identity} -Wie Informationen zu Attestierungen gespeichert und in einem auf Ethereum basierenden Ökosystem der Identität abgerufen werden, unterscheidet sich vom traditionellen Identitätsmanagement. Hier finden Sie einen Überblick einiger Ansätze zur Ausgabe, Speicherung und der Überprüfung von Attestierungen in dezentralisierten Identitätssystemen: +Wie Bestätigungsinformationen in einem Ethereum-basierten Identitätsökosystem gespeichert und abgerufen werden, unterscheidet sich vom traditionellen Identitätsmanagement. Hier ist ein Überblick über die verschiedenen Ansätze zur Ausgabe, Speicherung und Verifizierung von Bestätigungen in dezentralisierten Identitätssystemen: -### Off-Chain-Attestierungen {#off-chain-attestations} +### Off-Chain-Bestätigungen {#offchain-attestations} -Eine Sorge bei der On-Chain-Speicherung von Attestierungen besteht darin, dass sie möglicherweise Informationen enthalten, die Einzelpersonen privat halten möchten. Diese öffentliche Art der Ethereum-Blockchain macht sie zum Speichern solcher Attestierungen wenig attraktiv. +Ein Bedenken bei der Speicherung von Bestätigungen auf der Blockchain ist, dass sie Informationen enthalten könnten, die Einzelpersonen privat halten möchten. Die öffentliche Natur der Ethereum-Blockchain macht es unattraktiv, solche Bestätigungen zu speichern. -Die Lösung besteht darin, Attestierungen auszustellen, die von Benutzern „off-chain" in digitalen Wallets gehalten werden, aber mit der DID des Ausstellers unterschrieben werden, die „on-chain" gespeichert sind. Diese Attestierungen sind als sogenannte [JSON Web Token](https://en.wikipedia.org/wiki/JSON_Web_Token) kodiert und enthalten die digitale Signatur des Emittenten. Das ermöglicht eine einfache Überprüfung von Off-Chain-Ansprüchen. +Die Lösung besteht darin, Bestätigungen auszugeben, die von Benutzern Off-Chain in digitalen Wallets gehalten werden, aber mit der auf der Blockchain gespeicherten DID des Ausstellers signiert sind. Diese Bestätigungen sind als [JSON Web Tokens](https://en.wikipedia.org/wiki/JSON_Web_Token) codiert und enthalten die digitale Signatur des Ausstellers – was eine einfache Verifizierung von Off-Chain-Behauptungen ermöglicht. -Hier ist ein hypothetisches Szenario zur Erklärung von Off-Chain-Attestierungen: +Hier ist ein hypothetisches Szenario, um Off-Chain-Bestätigungen zu erklären: -1. Eine Universität (der Emittent) stellt eine Attestierung aus (ein digitales akademisches Zertifikat), unterzeichnet sie mit ihren Schlüsseln und gibt sie an Bob (den Identitätseigentümer) aus. +1. Eine Universität (der Aussteller) generiert eine Bestätigung (ein digitales akademisches Zertifikat), signiert sie mit ihren Schlüsseln und gibt sie an Bob (den Identitätsinhaber) aus. -2. Bob bewirbt sich für eine Stelle und möchte seine akademischen Qualifikationen gegenüber einem Arbeitgeber nachweisen. Aus diesem Grund teilt er seine Attestierung mit Hilfe seiner mobilen Wallet. Das Unternehmen (Verifizierender) kann dann die Gültigkeit der Attestierung überprüfen, indem es die Gültigkeit der DID des Emittenten (d. h. ihres öffentlichen Schlüssels auf Ethereum) bestätigt. +2. Bob bewirbt sich um einen Job und möchte einem Arbeitgeber seine akademischen Qualifikationen nachweisen, also teilt er die Bestätigung aus seinem mobilen Wallet. Das Unternehmen (der Verifizierer) kann dann die Gültigkeit der Bestätigung bestätigen, indem es die DID des Ausstellers (d. h. seinen Public-Key auf Ethereum) überprüft. -### Off-Chain-Attestierungen mit dauerhaftem Zugriff {#offchain-attestations-with-persistent-access} +### Off-Chain-Bestätigungen mit dauerhaftem Zugriff {#offchain-attestations-with-persistent-access} -Bei dieser Regelung werden Attestierungen in JSON-Dateien umgewandelt und off-chain gespeichert (idealerweise mit einem [dezentralen Cloud-Speicher](/developers/docs/storage/), einer Plattform wie IPFS oder Swarm). Ein [Hash](/glossary/#hash) der JSON-Datei wird jedoch on-chain gespeichert und über eine On-Chain-Datenerfassung mit einer DID verbunden. Die dazugehörige DID könnte entweder die des Emittenten der Attestierung oder des Empfängers sein. +Bei dieser Anordnung werden Bestätigungen in JSON-Dateien umgewandelt und Off-Chain gespeichert (idealerweise auf einer [dezentralisierten Cloud-Speicher](/developers/docs/storage/)-Plattform wie IPFS oder Swarm). Ein [Hash](/glossary/#hash) der JSON-Datei wird jedoch auf der Blockchain gespeichert und über ein Register auf der Blockchain mit einer DID verknüpft. Die zugehörige DID könnte entweder die des Ausstellers der Bestätigung oder die des Empfängers sein. -Dieser Ansatz macht es möglich, dass Attestierungen eine Blockchain-basierte Langlebigkeit erlangen, wobei Informationen zu Ansprüchen verschlüsselt und überprüfbar bleiben. Er erlaubt auch eine selektive Offenlegung, da der Inhaber des privaten Schlüssels die Informationen entschlüsseln kann. +Dieser Ansatz ermöglicht es Bestätigungen, eine Blockchain-basierte Persistenz zu erlangen, während die Behauptungsinformationen verschlüsselt und verifizierbar bleiben. Er ermöglicht auch eine selektive Offenlegung, da der Inhaber des Private-Keys die Informationen entschlüsseln kann. -### On-Chain-Attestierungen {#onchain-attestations} +### Bestätigungen auf der Blockchain {#onchain-attestations} -On-Chain-Attestierungen werden in [Smart Contracts](/glossary/#smart-contract) auf der Ethereum-Blockchain gehalten. Der Smart Contract (als Datenerfassung fungierend) ordnet eine Attestierung einem zugehörigen dezentralisierten On-Chain-Identifikator (einem öffentlichen Schlüssel) zu. +Bestätigungen auf der Blockchain werden in [Smart Contracts](/glossary/#smart-contract) auf der Ethereum-Blockchain gehalten. Der Smart Contract (der als Register fungiert) ordnet eine Bestätigung einem entsprechenden dezentralisierten Identifikator auf der Blockchain (einem Public-Key) zu. -Im Folgenden zeigt ein Beispiel, wie On-Chain-Attestierungen in der Praxis funktionieren könnten: +Hier ist ein Beispiel, um zu zeigen, wie Bestätigungen auf der Blockchain in der Praxis funktionieren könnten: -1. Ein Unternehmen (XYZ Corp) plant, Eigentumsanteile mit einem Smart Contract zu verkaufen, möchte aber nur Käufer, die eine Hintergrundüberprüfung abgeschlossen haben. +1. Ein Unternehmen (XYZ Corp) plant, Eigentumsanteile mithilfe eines Smart Contracts zu verkaufen, möchte aber nur Käufer, die eine Hintergrundüberprüfung abgeschlossen haben. -2. XYZ Corp kann das Unternehmen Hintergrundüberprüfungen durchführen lassen, um On-Chain-Attestierungen auf Ethereum auszugeben. Mit dieser Attestierung wird bestätigt, dass eine Person die Hintergrundüberprüfung bestanden hat, ohne dass persönliche Daten freigegeben werden. +2. XYZ Corp kann das Unternehmen, das Hintergrundüberprüfungen durchführt, veranlassen, Bestätigungen auf der Blockchain auf Ethereum auszugeben. Diese Bestätigung zertifiziert, dass eine Person die Hintergrundüberprüfung bestanden hat, ohne persönliche Informationen preiszugeben. -3. Durch den Verkauf von Aktien mittels Smart Contracts kann man den Datenerfassungsvertrag auf die Identität von geprüften Käufern hin untersuchen. Das macht es möglich, mit dem Smart Contract zu bestimmen, wer Aktien kaufen darf oder nicht. +3. Der Smart Contract, der Anteile verkauft, kann den Registervertrag auf die Identitäten der überprüften Käufer prüfen, was es dem Smart Contract ermöglicht zu bestimmen, wer Anteile kaufen darf oder nicht. -### Seelengebundene Token und Identität {#soulbound} +### Soulbound-Token und Identität {#soulbound} -[Seelengebundene Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([nicht-übertragbare NFTs](/glossary/#nft)) könnten benutzt werden, um Informationen zu sammeln, die einzigartig für ein bestimmtes Wallet sind. Dies erzeugt eine einzigartige On-Chain-Identität, die an eine bestimmte Ethereum-Adresse gebunden ist, die Token enthalten könnte, welche wiederum bestimmte Leistungen (z. B. Abschluss eines bestimmten Online-Kurses oder das Bestehen eines Schwellenwertes in einem Spiel) oder eine Gemeinschaftsbeteiligung darstellen. +[Soulbound-Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([nicht-fungible Token](/glossary/#nft), die nicht übertragbar sind) könnten verwendet werden, um Informationen zu sammeln, die für ein bestimmtes Wallet einzigartig sind. Dies schafft effektiv eine einzigartige Identität auf der Blockchain, die an eine bestimmte Ethereum-Adresse gebunden ist und Token umfassen könnte, die Erfolge (z. B. den Abschluss eines bestimmten Online-Kurses oder das Erreichen einer Mindestpunktzahl in einem Spiel) oder die Teilnahme an der Community repräsentieren. -## Dezentrale Identitäten verwenden {#use-decentralized-identity} +## Dezentralisierte Identität nutzen {#use-decentralized-identity} -Es gibt viele ehrgeizige Projekte, die Ethereum als Grundlage für dezentrale Identitätslösungen verwenden: +Es gibt viele ehrgeizige Projekte, die Ethereum als Grundlage für dezentralisierte Identitätslösungen nutzen: -- **[Ethereum Name Service (ENS)](https://ens.domains/)** - _Ein dezentralisiertes Namenssystem für maschinenlesbare On-chain-Identifikatoren, wie Ethereum Wallet-Adressen, Content-Hashes und Metadaten._ -- **[SpruceID](https://www.spruceid.com/)** - _Ein dezentralisiertes Identitätsprojekt, das es Benutzern erlaubt, digitale Identitäten mit Hilfe von Ethereum-Konten und ENS-Profilen zu kontrollieren, statt sich auf Dienste Dritter zu verlassen._ -- **[Ethereum Attestation Service (EAS)](https://attest.sh/)** - _Ein dezentralisiertes Ledger/Protokoll zum Erstellen von On-Ketten- oder Off-Kettenbescheinigungen über irgendetwas._ -- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (Beweis des Menschseins) ist ein auf Ethereum basierendes System zur Überprüfung der sozialen Identität._ -- **[BrightID](https://www.brightid.org/)**- _Ein dezentralisiertes quelloffenes Netzwerk zur sozialen Identität, das versucht, die Identitätsüberprüfung durch die Schaffung und Analyse eines sozialen Diagramms zu reformieren._ -- **[walt.id](https://walt.id)** — _Open-Source-Infrastruktur für dezentrale Identität und Wallets, die es Entwicklern und Organisationen ermöglicht, selbstbestimmte Identität und NFTs/SBTs zu nutzen._ -- **[Veramo](https://veramo.io/)** - _Ein JavaScript-Framework, dass es für jeden vereinfacht, kryptografisch überprüfbare Daten in ihren Applikationen zu nutzen._ +- **[Ethereum Name Service (ENS)](https://ens.domains/)** - _Ein dezentralisiertes Namenssystem für maschinenlesbare Identifikatoren auf der Blockchain, wie Ethereum-Wallet-Adressen, Inhalts-Hashes und Metadaten._ +- **[Sign in with Ethereum (SIWE)](https://siwe.xyz/)** - _Offener Standard für die Authentifizierung mit Ethereum-Konten._ +- **[SpruceID](https://www.spruceid.com/)** - _Ein dezentralisiertes Identitätsprojekt, das es Benutzern ermöglicht, die digitale Identität mit Ethereum-Konten und ENS-Profilen zu kontrollieren, anstatt sich auf Drittanbieterdienste zu verlassen._ +- **[Ethereum Attestation Service (EAS)](https://attest.org/)** - _Ein dezentralisierter Ledger/ein dezentralisiertes Protokoll zur Erstellung von Bestätigungen auf der Blockchain oder Off-Chain über alles Mögliche._ +- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (oder PoH) ist ein soziales Identitätsverifizierungssystem, das auf Ethereum aufbaut._ +- **[BrightID](https://www.brightid.org/)** - _Ein dezentralisiertes, quelloffenes soziales Identitätsnetzwerk, das die Identitätsverifizierung durch die Erstellung und Analyse eines sozialen Graphen reformieren möchte._ +- **[walt.id](https://walt.id)** — _Quelloffene dezentralisierte Identitäts- und Wallet-Infrastruktur, die es Entwicklern und Organisationen ermöglicht, selbstsouveräne Identität und NFTs/SBTs zu nutzen._ +- **[Veramo](https://veramo.io/)** - _Ein JavaScript-Framework, das es jedem leicht macht, kryptografisch verifizierbare Daten in seinen Anwendungen zu verwenden._ -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} ### Artikel {#articles} -- [Blockchain-Nutzungsfälle: Blockchain in digitaler Identität](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_> -- [Was ist Ethereum ERC725? Eigenständiges Identitätsmanagement in der Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam-Stadt_ -- [Wie die Blockchain das Problem der digitalen Identität lösen könnte](https://time.com/6142810/proof-of-humanity/)— _Andrew R. Chow_ -- [Was sind dezentralisierte Identitäten und warum sollten sie Sie interessieren?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ -- [Einführung in die dezentrale Identität](https://walt.id/white-paper/digital-identity) – _Dominik Beron_ +- [Blockchain Use Cases: Blockchain in Digital Identity](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_ +- [What is Ethereum ERC725? Self-Sovereign Identity Management on the Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ +- [How Blockchain Could Solve the Problem of Digital Identity](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ +- [What Is Decentralized Identity And Why Should You Care?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- [Introduction to Decentralized Identity](https://walt.id/white-paper/digital-identity) — _Dominik Beron_ ### Videos {#videos} -- [Dezentralisierte Identität (Bonus Livestream Session)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Ein großartiges Erklärungsvideo über dezentrale Identität von Andreas Antonopolous_ -- [Anmelden mit Ethereum und dezentralisierter Identität mit Ceramic, IDX, React, und 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _YouTube-Tutorial zum Aufbau eines Identitätsmanagementsystems zum Erstellen, Lesen und Aktualisieren des Profils von Benutzern mit ihrer Ethereum-Wallet von Nader Dabit_ -- [BrightID - Dezentralisierte Identität auf Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Podcast Bankless Episode über BrightID, eine dezentrale Identitätslösung für Ethereum_ -- [Das Off-Chain-Internet: Dezentralisierte Identität & Überprüfbare Berechtigungsnachweise](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — EthDenver 2022 Präsentation von Evin McMullen -- [Erklärung zu überprüfbaren Anmeldeinformationen](https://www.youtube.com/watch?v=ce1IdSr-Kig) – YouTube-Erklärvideo mit Demo von Tamino Baumann +- [Decentralized Identity (Bonus Livestream Session)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Ein großartiges Erklärvideo zur dezentralisierten Identität von Andreas Antonopoulos_ +- [Sign In with Ethereum and Decentralized Identity with Ceramic, IDX, React, and 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _YouTube-Tutorial zum Aufbau eines Identitätsmanagementsystems zum Erstellen, Lesen und Aktualisieren des Profils eines Benutzers mithilfe seines Ethereum-Wallets von Nader Dabit_ +- [BrightID - Decentralized Identity on Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Bankless-Podcast-Episode, in der BrightID diskutiert wird, eine dezentralisierte Identitätslösung für Ethereum_ +- [The Offchain Internet: Decentralized Identity & Verifiable Credentials](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — EthDenver 2022-Präsentation von Evin McMullen +- [Verifiable Credentials Explained](https://www.youtube.com/watch?v=ce1IdSr-Kig) - YouTube-Erklärvideo mit Demo von Tamino Baumann ### Communities {#communities} -- [ERC-725 Allianz auf GitHub](https://github.com/erc725alliance) — _Unterstützer des ERC725-Standards zur Identitätsverwaltung in der Ethereum-Blockchain_ -- [EthID Discord Server](https://discord.com/invite/ZUyG3mSXFD) — _Community für Enthusiasten und Entwickler, die am Anmelden mit Ethereum arbeiten_ -- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Eine Community von Entwicklern, die zum Aufbau eines Rahmens für überprüfbare Daten für Anwendungen beitragen_ -- [walt.id](https://discord.com/invite/AW8AgqJthZ) – _Eine Gemeinschaft von Entwicklern und Erstellern, die an Anwendungsfällen für dezentrale Identität in verschiedenen Branchen arbeiten_ +- [ERC-725 Alliance auf GitHub](https://github.com/erc725alliance) — _Unterstützer des ERC725-Standards zur Verwaltung von Identitäten auf der Ethereum-Blockchain_ +- [EthID Discord-Server](https://discord.com/invite/ZUyG3mSXFD) — _Community für Enthusiasten und Entwickler, die an Sign-in with Ethereum und dem Ethereum Follow Protocol arbeiten_ +- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Eine Community von Entwicklern, die zum Aufbau eines Frameworks für verifizierbare Daten für Anwendungen beitragen_ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _Eine Community von Entwicklern und Buildern, die an Anwendungsfällen für dezentralisierte Identität in verschiedenen Branchen arbeiten_ \ No newline at end of file diff --git a/public/content/translations/de/defi/index.md b/public/content/translations/de/defi/index.md index 794915bd28c..81d490950af 100644 --- a/public/content/translations/de/defi/index.md +++ b/public/content/translations/de/defi/index.md @@ -1,343 +1,353 @@ --- -title: Dezentrales Finanzwesen (DeFi) -description: Eine Übersicht über DeFi auf Ethereum +title: Dezentralisiertes Finanzwesen (DeFi) +metaTitle: Was ist DeFi? | Vorteile und Nutzung des dezentralisierten Finanzwesens +description: "Ein Überblick über DeFi auf Ethereum" lang: de template: use-cases emoji: ":money_with_wings:" image: /images/use-cases/defi.png -alt: Ein ETH-Logo aus Legosteinen. +alt: Ein Eth-Logo aus Legosteinen. sidebarDepth: 2 summaryPoint1: Eine globale, offene Alternative zum aktuellen Finanzsystem. -summaryPoint2: Produkte, mit denen Sie sich Geld leihen, sparen, investieren sowie Handel treiben können und mehr. -summaryPoint3: Die Grundlage bildet Open-Source-Technologie, mit der jeder programmieren kann. +summaryPoint2: "Produkte, mit denen Sie leihen, sparen, investieren, handeln und mehr können." +summaryPoint3: Basiert auf Open-Source-Technologie, mit der jeder programmieren kann. --- -DeFi ist ein offenes und globales Finanzsystem für das Zeitalter des Internets und bietet eine Alternative zu dem undurchsichtigen und streng kontrollierten System, das durch jahrzehntealte Infrastruktur und Prozesse zusammengehalten wird. Es gibt Ihnen Kontrollmöglichkeiten und Transparenz über Ihr Geld zurück. Zudem ermöglicht es Ihnen den Zugang zu globalen Märkten und Alternativen zu lokalen Währungs- oder Banksystemen. DeFi-Produkte ermöglichen jedem mit einer Internetverbindung den Zugang zu Finanzdienstleistungen. Sie sind zudem größtenteils im Besitz der eigenen Benutzer, die auch die Verwaltung übernehmen. Bis dato sind viele Milliarden Dollar an Kryptowährungen durch DeFi-Anwendungen geflossen und jeden Tag wird die Summe mehr. +DeFi ist ein offenes und globales Finanzsystem, das für das Internetzeitalter entwickelt wurde – eine Alternative zu einem System, das undurchsichtig, streng kontrolliert und durch jahrzehntealte Infrastruktur und Prozesse zusammengehalten wird. Es gibt Ihnen Kontrolle und Transparenz über Ihr Geld. Es bietet Ihnen Zugang zu globalen Märkten und Alternativen zu Ihrer lokalen Währung oder Ihren Bankoptionen. DeFi-Produkte öffnen Finanzdienstleistungen für jeden mit einer Internetverbindung und sie werden größtenteils von ihren Nutzern besessen und gepflegt. Bisher sind Kryptowerte im Wert von zig Milliarden Dollar durch DeFi-Anwendungen geflossen, und es werden jeden Tag mehr. ## Was ist DeFi? {#what-is-defi} -DeFi ist ein Sammelbegriff für Finanzprodukte und -Services, die für alle zugänglich sind, die Ethereum nutzen können – also jeder mit einer Internetverbindung. Mit DeFi sind die Märkte immer zugänglich. In diesem System gibt es keine zentralen Behörden, die Zahlungen blockieren oder den Zugang zu irgendetwas verweigern können. Dienste, die früher langsam und dem Risiko menschlicher Fehler ausgesetzt waren, funktionieren automatisch und sind jetzt sicherer, da sie auf öffentlichem Code basieren, den sich jeder ansehen und überprüfen kann. +DeFi ist ein Sammelbegriff für Finanzprodukte und -dienstleistungen, die für jeden zugänglich sind, der [Ethereum](/) nutzen kann – also für jeden mit einer Internetverbindung. Mit DeFi sind die Märkte immer geöffnet und es gibt keine zentralen Behörden, die Zahlungen blockieren oder Ihnen den Zugang zu irgendetwas verweigern können. Dienstleistungen, die früher langsam und anfällig für menschliche Fehler waren, sind jetzt automatisch und sicherer, da sie durch Code abgewickelt werden, den jeder einsehen und überprüfen kann. -Es gibt eine boomende Kryptowirtschaft, in der Sie Assets leihen und verleihen können, lang- und kurzfristige Positionen einnehmen, Zinsen verdienen und vieles mehr. Beispielsweise setzen Krypto-versierte Argentinier auf DeFi, um den Folgen der Hyperinflation zu entkommen. Und auch Unternehmen haben begonnen, ihre Mitarbeiter in Echtzeit via Krypto zu bezahlen. Es wurden sogar Darlehen im Wert von Millionen Dollar aufgenommen und bezahlt, ohne dass für die Beteiligten eine persönliche Identifizierung erforderlich gewesen wäre. +Es gibt eine boomende Krypto-Wirtschaft, in der Sie verleihen, leihen, Long/Short-Positionen eingehen, Zinsen verdienen und vieles mehr können. Krypto-affine Argentinier haben DeFi genutzt, um der lähmenden Inflation zu entkommen. Unternehmen haben begonnen, ihren Mitarbeitern ihre Löhne in Echtzeit zu streamen. Einige Leute haben sogar Kredite in Millionenhöhe aufgenommen und abbezahlt, ohne dass eine persönliche Identifikation erforderlich war. -## DeFi vs. das traditionelle Finanzsystem {#defi-vs-tradfi} +## DeFi vs. traditionelles Finanzwesen {#defi-vs-tradfi} -Um das wahre Potenzial von DeFi erkennen zu können, ist es wichtig, die aktuellen Probleme des traditionellen Finanzsystems zu kennen. +Einer der besten Wege, das Potenzial von DeFi zu erkennen, ist, die heute bestehenden Probleme zu verstehen. -- Manchen Menschen ist die Möglichkeit zur Einrichtung eines Bankkontos oder zur Nutzung von Finanzdienstleistungen verwehrt. -- Der mangelnde Zugang zu Finanzdienstleistungen kann dazu führen, dass Menschen nicht aus ihrer Arbeitslosigkeit herauskommen. -- Traditionelle Finanzdienstleistungen können der Grund sein, dass Sie nicht bezahlt werden können. -- Ihre persönlichen Daten sind praktisch eine versteckte Gebühr für Finanzdienstleistungen. -- Regierungen und zentralisierte Institutionen können Märkte willkürlich schließen. -- Handelszeiten am Finanzmarkt sind häufig auf die Geschäftszeiten bestimmter Zeitzonen beschränkt. -- Transfers von Geldmitteln können aufgrund der Prozesse, die Interaktionen von Personen umfassen, Tage dauern. -- Bei vielen Finanzdienstleistungen sind oftmals Vermittler (z. B. Broker) zwischengeschaltet, für die Gebühren anfallen können. +- Einigen Menschen wird der Zugang zur Eröffnung eines Bankkontos oder zur Nutzung von Finanzdienstleistungen verwehrt. +- Mangelnder Zugang zu Finanzdienstleistungen kann Menschen daran hindern, eine Anstellung zu finden. +- Finanzdienstleister können verhindern, dass Sie bezahlt werden. +- Eine versteckte Gebühr von Finanzdienstleistungen sind Ihre persönlichen Daten. +- Regierungen und zentralisierte Institutionen können Märkte nach Belieben schließen. +- Handelszeiten sind oft auf die Geschäftszeiten einer bestimmten Zeitzone beschränkt. +- Geldtransfers können aufgrund interner menschlicher Prozesse Tage dauern. +- Finanzdienstleistungen sind mit einem Aufschlag verbunden, da Vermittlungsinstitutionen ihren Anteil benötigen. ### Ein Vergleich {#defi-comparison} -| DeFi | Traditionelles Finanzsystem | -| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Sie halten Ihr Geld selbst. | Ihr Geld liegt bei Dritten. | -| Sie kontrollieren, wofür Ihr Geld verwendet wird und wohin es fließt. | Sie müssen Unternehmen/Banken vertrauen, dass sie Ihr Geld nicht schlecht verwalten und beispielsweise Kredite an riskante Kreditnehmer vergeben. | -| Überweisungen erfolgen in wenigen Minuten. | Überweisungen können aufgrund von manuellen Prozessen Tage dauern. | -| Transaktionstätigkeiten erfolgen pseudonymisiert. | Finanzielle Vorgänge sind eng an Ihre Identität gekoppelt. | -| DeFi ist offen für jeden. | Sie müssen sich bewerben, um Finanzdienstleistungen in Anspruch nehmen zu können. | -| Märkte sind rund um die Uhr geöffnet. | Märkte schließen, da es Beschränkungen für die Arbeitszeit von Angestellten gibt. | -| Basiert auf dem Transparenzprinzip – jeder kann die Daten eines Produktes einsehen und überprüfen, wie das System funktioniert. | Finanzinstitute sind wie geschlossene Bücher: Es ist nicht möglich, ihre Kredithistorie, Aufzeichnungen der verwalteten Vermögenswerte oder Ähnliches einzusehen. | +| DeFi | Traditionelles Finanzwesen | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Sie verwalten Ihr Geld selbst. | Ihr Geld wird von Unternehmen verwaltet. | +| Sie kontrollieren, wohin Ihr Geld fließt und wie es ausgegeben wird. | Sie müssen darauf vertrauen, dass Unternehmen Ihr Geld nicht schlecht verwalten, z. B. durch Kredite an riskante Kreditnehmer. | +| Geldtransfers erfolgen in Minuten. | Zahlungen können aufgrund manueller Prozesse Tage dauern. | +| Transaktionsaktivitäten sind pseudonym. | Finanzielle Aktivitäten sind eng mit Ihrer Identität verknüpft. | +| DeFi steht jedem offen. | Sie müssen sich bewerben, um Finanzdienstleistungen nutzen zu können. | +| Die Märkte sind immer geöffnet. | Märkte schließen, weil Mitarbeiter Pausen brauchen. | +| Es basiert auf Transparenz – jeder kann sich die Daten eines Produkts ansehen und überprüfen, wie das System funktioniert. | Finanzinstitute sind geschlossene Bücher: Sie können nicht verlangen, ihre Kredithistorie, eine Aufzeichnung ihrer verwalteten Vermögenswerte usw. einzusehen. | - DeFi-Apps entdecken + DeFi-Dapps erkunden -## Alles begann mit Bitcoin... {#bitcoin} +## Es begann mit Bitcoin... {#bitcoin} -Bitcoin war in vielerlei Hinsicht die erste DeFi-Anwendung. Mit Bitcoin können Sie den Wert selbst besitzen, kontrollieren und überall auf der Welt hinsenden. Bitcoin bietet vielen Menschen, die sich gegenseitig nicht vertrauen, die Möglichkeit, eine Einigung über einen aktuellen Transaktionsstatus und Stand aller Konten zu erzielen, ohne dass dafür ein vertrauenswürdiger Vermittler vonnöten ist. Bitcoin ist offen für jeden und niemand ist befugt, Regeln zu ändern. Die Regeln von Bitcoin, wie die Knappheit und Offenheit, sind in der Technologie niedergeschrieben. Es ist nicht wie im traditionellen Finanzwesen, wo Regierungen Geld drucken können, das Ihre Ersparnisse entwertet, und Unternehmen die Märkte schließen können. +Bitcoin war in vielerlei Hinsicht die erste DeFi-Anwendung. Bitcoin ermöglicht es Ihnen, Werte wirklich zu besitzen, zu kontrollieren und überall auf die Welt zu senden. Dies geschieht, indem es einer großen Anzahl von Menschen, die einander nicht vertrauen, eine Möglichkeit bietet, sich auf einen Ledger von Konten zu einigen, ohne dass ein vertrauenswürdiger Vermittler erforderlich ist. Bitcoin steht jedem offen und niemand hat die Befugnis, seine Regeln zu ändern. Die Regeln von Bitcoin, wie seine Knappheit und seine Offenheit, sind in die Technologie eingeschrieben. Es ist nicht wie im traditionellen Finanzwesen, wo Regierungen Geld drucken können, das Ihre Ersparnisse entwertet, und Unternehmen Märkte schließen können. -Darauf baut Ethereum auf. Wie bei Bitcoin, können die Regeln sich nicht ändern und jeder hat Zugang dazu. Doch zusätzlich macht Ethereum dieses digitale Geld programmierbar, und zwar mit[Smart Contracts](/glossary/#smart-contract). Dies bietet über das Speichern und Senden von Werten hinaus noch viele weitere Möglichkeiten. +Ethereum baut darauf auf. Wie bei Bitcoin können die Regeln nicht zu Ihren Ungunsten geändert werden und jeder hat Zugang. Aber es macht dieses digitale Geld auch programmierbar, indem es [Smart Contracts](/glossary/#smart-contract) verwendet, sodass Sie über das bloße Speichern und Senden von Werten hinausgehen können. ## Programmierbares Geld {#programmable-money} -Das klingt merkwürdig... „Warum würde ich mein Geld programmieren wollen?“ Das ist tatsächlich eher ein Standardmerkmal der Token auf Ethereum. Jeder kann Logik in Zahlungen programmieren. Auf diese Weise erhalten Sie die Kontrolle und Sicherheit wie bei Bitcoin in Verbindung mit Dienstleistungen, die von Finanzinstituten bereitgestellt werden. Das eröffnet Möglichkeiten für Kryptowährungen, die mit Bitcoin nicht gegeben sind, wie z. B. das Vergeben oder Beanspruchen von Krediten, Terminplanung von Zahlungen, Investitionen in Indexfonds und vieles mehr. +Das klingt seltsam... „Warum sollte ich mein Geld programmieren wollen?“ Dies ist jedoch mehr als nur eine Standardfunktion von Token auf Ethereum. Jeder kann Logik in Zahlungen programmieren. So erhalten Sie die Kontrolle und Sicherheit von Bitcoin kombiniert mit den Dienstleistungen von Finanzinstituten. Dies ermöglicht es Ihnen, Dinge mit Kryptowährungen zu tun, die Sie mit Bitcoin nicht tun können, wie z. B. Verleihen und Leihen, das Planen von Zahlungen, das Investieren in Indexfonds und mehr. - -
Machen Sie sich mit unseren Vorschlägen für DeFi-Anwendungen vertraut und testen sie, wenn Sie neu bei Ethereum sind.
+ +
Entdecken Sie unsere Vorschläge für DeFi-Anwendungen zum Ausprobieren, wenn Sie neu bei Ethereum sind.
- DeFi-Apps entdecken + DeFi-Dapps erkunden
-## Was kann man mit DeFi machen? {#defi-use-cases} +## Was können Sie mit DeFi machen? {#defi-use-cases} -Für fast alle Finanzdienstleistungen gibt es dezentrale Alternativen. Ethereum aber schafft zudem Möglichkeiten, komplett neue Finanzprodukte zu gestalten. Im Folgenden eine Liste mit Beispielen, die ständig länger wird: +Es gibt eine dezentralisierte Alternative zu den meisten Finanzdienstleistungen. Aber Ethereum schafft auch Möglichkeiten zur Entwicklung völlig neuer Finanzprodukte. Dies ist eine ständig wachsende Liste. -- [Geld rund um die Welt senden](#send-money) -- [Geld rund um die Welt „streamen“](#stream-money) +- [Geld rund um den Globus senden](#send-money) +- [Geld rund um den Globus streamen](#stream-money) - [Zugang zu stabilen Währungen](#stablecoins) -- [Kredite mit hinterlegten Sicherheiten aufnehmen](#lending) -- [Kredite ohne hinterlegte Sicherheiten aufnehmen](#flash-loans) -- [Krypto-Sparkonten eröffnen](#saving) -- [Mit Token handeln](#swaps) -- [Das eigene Portfolio vergrößern](#investing) +- [Geld mit Sicherheiten leihen](#lending) +- [Geld ohne Sicherheiten leihen](#flash-loans) +- [Mit Krypto-Sparen beginnen](#saving) +- [Token handeln](#swaps) +- [Ihr Portfolio vergrößern](#investing) - [Ihre Ideen finanzieren](#crowdfunding) -- [Versicherungen abschließen](#insurance) -- [Das eigene Portfolio verwalten](#aggregators) +- [Versicherungen kaufen](#insurance) +- [Ihr Portfolio verwalten](#aggregators) -### Geld schnell um die ganze Welt senden {#send-money} +### Geld schnell rund um den Globus senden {#send-money} -Als Blockchain ist Ethereum für sichere und globale Transaktionen konzipiert. Wie auch Bitcoin macht Ethereum das weltweite Senden von Geld so einfach wie das Versenden einer E-Mail. Geben Sie einfach den [ENS-Namen](/glossary/#ens) des Empfängers (z. B. bob.eth) oder die Kontoadresse der Wallet ein und schon geht die Zahlung (typischerweise) innerhalb von Minuten direkt beim Empfänger ein. Zum Senden oder Empfangen von Zahlungen ist eine [Wallet](/wallets/) erforderlich. +Als Blockchain ist Ethereum darauf ausgelegt, Transaktionen auf sichere und globale Weise zu senden. Wie Bitcoin macht Ethereum das Senden von Geld um die Welt so einfach wie das Senden einer E-Mail. Geben Sie einfach den [ENS-Namen](/glossary/#ens) Ihres Empfängers (wie bob.eth) oder dessen Kontoadresse aus Ihrem Wallet ein und Ihre Zahlung geht (normalerweise) in wenigen Minuten direkt an ihn. Um Zahlungen zu senden oder zu empfangen, benötigen Sie ein [Wallet](/wallets/). [Erfahren Sie mehr über Krypto-Zahlungen](/payments/). - Siehe Zahlungs-dApps + Zahlungs-Dapps ansehen -#### Geld um die Welt „streamen“... {#stream-money} +#### Geld rund um den Globus streamen... {#stream-money} -Über Ethereum lässt sich auch Geld streamen. So können Sie das Gehalt für Personen sekündlich überweisen und geben ihnen damit Zugang zu ihrem verdienten Geld, wann immer sie es gerade benötigen. Ein weiterer Anwendungsfall wäre beispielsweise das Mieten von Objekten, wie z. B. Schließfächer oder E-Scooter, auf sekündlicher Basis. +Sie können auch Geld über Ethereum streamen. Dies ermöglicht es Ihnen, jemandem sein Gehalt sekundengenau zu zahlen, sodass er jederzeit auf sein Geld zugreifen kann, wenn er es braucht. Oder mieten Sie etwas sekundengenau, wie ein Schließfach oder einen Elektroroller. -Und wenn Sie keine [ETH](/glossary/#ether) senden oder streamen wollen, weil sich der Wert so stark verändern kann, gibt es alternative Währungen auf Ethereum: [Stablecoins](/glossary/#stablecoin). +Und wenn Sie [ETH](/glossary/#ether) nicht senden oder streamen möchten, weil sich sein Wert stark ändern kann, gibt es alternative Währungen auf Ethereum: [Stablecoins](/glossary/#stablecoin). -### Zugriff auf Stablecoins {#stablecoins} +### Zugang zu stabilen Währungen {#stablecoins} -Die Volatilität von Kryptowährungen ist ein Problem für viele Finanzprodukte und allgemein für den Einsatz als Zahlungsmittel. Dieses Problem hat die DeFi-Community mit Stablecoins gelöst. Ihr Wert ist an ein anderes Asset gebunden, typischerweise beliebte Währungen wie der Dollar. +Die Volatilität von Kryptowährungen ist ein Problem für viele Finanzprodukte und allgemeine Ausgaben. Die DeFi-Community hat dies mit Stablecoins gelöst. Ihr Wert bleibt an einen anderen Vermögenswert gekoppelt, normalerweise an eine beliebte Währung wie den Dollar. -Coins wie Dai oder USDC haben einen Wert der sich bis auf wenige Cent-Beträge am Wert des US-Dollars orientiert. Das macht sie perfekt für die Verzinsung/Veranlagung oder als Zahlungsmittel. Viele Menschen in Lateinamerika setzen auf Stablecoins als Mittel, um ihr Erspartes in Zeiten großer Unsicherheit werterhaltend zu schützen. +Coins wie Dai oder USDC haben einen Wert, der innerhalb weniger Cent eines Dollars bleibt. Das macht sie perfekt für das Verdienen oder den Einzelhandel. Viele Menschen in Lateinamerika haben Stablecoins genutzt, um ihre Ersparnisse in einer Zeit großer Unsicherheit mit ihren von der Regierung ausgegebenen Währungen zu schützen. - Mehr zu Stablecoins + Mehr über Stablecoins -### Kreditaufnahme {#lending} +### Leihen {#lending} -Es gibt zwei etablierte Möglichkeiten, um Geld von dezentralen Anbietern zu leihen: +Das Leihen von Geld bei dezentralisierten Anbietern gibt es in zwei Hauptvarianten. -- Peer-to-Peer, das heißt der Kreditnehmer leiht direkt von einem bestimmten Kreditgeber. -- Pool-basiert, das heißt Kreditgeber stellen Geldmittel (Liquidität) für einen Pool bereit, aus dem Kreditnehmer die Mittel leihen können. +- Peer-to-Peer, was bedeutet, dass ein Kreditnehmer direkt von einem bestimmten Kreditgeber leiht. +- Pool-basiert, wobei Kreditgeber Gelder (Liquidität) in einen Pool einzahlen, aus dem Kreditnehmer leihen können. - Siehe Lending-dApps + Kredit-Dapps ansehen -Auf dezentrale Kreditanbieter zurückzugreifen, bietet viele Vorteile... +Es gibt viele Vorteile bei der Nutzung eines dezentralisierten Kreditgebers... -#### Geld leihen mit Privatsphäre {#borrowing-privacy} +#### Leihen mit Privatsphäre {#borrowing-privacy} -Bei der Vergabe und Inanspruchnahme von Krediten dreht sich heutzutage alles um die beteiligten Einzelpersonen. Banken müssen vor einer Kreditvergabe wissen, ob man wahrscheinlich in der Lage ist, den Kredit zurückzuzahlen. +Heute dreht sich beim Verleihen und Leihen von Geld alles um die beteiligten Personen. Banken müssen wissen, ob Sie einen Kredit wahrscheinlich zurückzahlen werden, bevor sie ihn vergeben. -Eine dezentrale Kreditvergabe funktioniert vollständig ohne Identifikation der involvierten Parteien. Stattdessen muss der Kreditnehmer eine Sicherheit stellen, die der Kreditgeber automatisch erhält, wenn der Kredit nicht zurückgezahlt wird. Manche Kreditanbieter nehmen sogar [NFTs](/glossary/#nft) als Sicherheiten an. NFTs kann man sich wie eine Besitzurkunde für einen bestimmten Vermögenswert vorstellen. [Mehr zu NFTs](/nft/) +Dezentralisiertes Verleihen funktioniert, ohne dass sich eine der Parteien identifizieren muss. Stattdessen muss der Kreditnehmer Sicherheiten hinterlegen, die der Kreditgeber automatisch erhält, wenn der Kredit nicht zurückgezahlt wird. Einige Kreditgeber akzeptieren sogar [NFTs](/glossary/#nft) als Sicherheit. NFTs sind eine Urkunde für einen einzigartigen Vermögenswert, wie ein Gemälde. [Mehr über NFTs](/nft/) -Das ermöglicht es, ohne Kreditchecks und Preisgabe von privaten Informationen Geld zu borgen. +Dies ermöglicht es Ihnen, Geld ohne Bonitätsprüfungen oder die Weitergabe privater Informationen zu leihen. -#### Zugang zu globalen Geldmitteln {#access-global-funds} +#### Zugang zu globalen Geldern {#access-global-funds} -Wenn Sie auf einen dezentralen Kreditgeber setzen, erhalten Sie Zugang zu allen hinterlegten Assets überall auf der Welt und nicht nur zu denen, die im Depot Ihrer Bank oder Institution verwaltet werden. Damit werden Kredite leichter zugänglich und die Zinssätze verbessern sich. +Wenn Sie einen dezentralisierten Kreditgeber nutzen, haben Sie Zugang zu Geldern, die aus der ganzen Welt eingezahlt wurden, und nicht nur zu den Geldern, die sich in der Verwahrung Ihrer gewählten Bank oder Institution befinden. Dies macht Kredite zugänglicher und verbessert die Zinssätze. -#### Steuervorteile {#tax-efficiencies} +#### Steuereffizienz {#tax-efficiencies} -Wenn Sie Geld leihen, erhalten Sie Zugang zu Assets und müssen nicht Ihr ETH verkaufen (ein steuerpflichtiger Vorgang). Stattdessen können Sie ETH als Sicherheit für einen Stablecoin-Kredit verwenden. Damit erhalten Sie den benötigten Cashflow, ohne Ihre ETH verkaufen zu müssen. Stablecoins sind Token, die als Zahlungsmittel wesentlich besser geeignet sind, da sie anders als ETH keinen Wertschwankungen unterliegen. [Mehr zu Stablecoins](#stablecoins) +Das Leihen kann Ihnen Zugang zu den benötigten Geldern verschaffen, ohne dass Sie Ihre ETH verkaufen müssen (ein steuerpflichtiges Ereignis). Stattdessen können Sie ETH als Sicherheit für einen Stablecoin-Kredit verwenden. Dies gibt Ihnen den benötigten Cashflow und lässt Sie Ihre ETH behalten. Stablecoins sind Token, die viel besser geeignet sind, wenn Sie Bargeld benötigen, da ihr Wert nicht wie bei ETH schwankt. [Mehr über Stablecoins](#stablecoins) -#### Flash Loans {#flash-loans} +#### Flash-Kredite {#flash-loans} -Flash Loans, also Blitzkredite, sind eine experimentelle Form der dezentralen Kreditaufnahme. Dabei können Sie Geld leihen, ohne Sicherheiten oder persönliche Informationen hinterlegen zu müssen. +Flash-Kredite sind eine experimentellere Form des dezentralisierten Verleihens, bei der Sie ohne Sicherheiten oder die Angabe persönlicher Informationen leihen können. -Derzeit sind sie für den Otto Normalverbraucher nicht sehr leicht zugänglich, doch sie zeigen, was in der Zukunft für jeden möglich sein könnte. +Sie sind derzeit für nicht-technische Personen nicht allgemein zugänglich, deuten aber an, was in Zukunft für alle möglich sein könnte. -Flash Loans funktionieren unter der Prämisse, dass der Kredit innerhalb einer Transaktion beansprucht und auch wieder zurückgezahlt wird. Wenn er nicht zurückgezahlt werden kann, wird die Transaktion rückgängig gemacht – so als wäre nie etwas passiert. +Es funktioniert auf der Grundlage, dass der Kredit innerhalb derselben Transaktion aufgenommen und zurückgezahlt wird. Wenn er nicht zurückgezahlt werden kann, wird die Transaktion rückgängig gemacht, als wäre nie etwas passiert. -Das Geld, das dafür verwendet wird, ist meist in Liquiditäts-Pools (große Pools an Assets, die für das Leihen verwendet werden) gebunden. Wenn diese gebundenen Werte zu einem bestimmten Zeitpunkt gerade nicht verwendet werden, ergibt sich daraus für Dritte die Möglichkeit, diese Werte zu leihen, damit zu arbeiten und buchstäblich zum Zeitpunkt des Ausleihens wieder vollständig zurückzuzahlen. +Die häufig verwendeten Gelder werden in Liquiditätspools (große Pools von Geldern, die zum Leihen verwendet werden) gehalten. Wenn sie in einem bestimmten Moment nicht genutzt werden, schafft dies eine Gelegenheit für jemanden, diese Gelder zu leihen, Geschäfte damit zu machen und sie buchstäblich zur gleichen Zeit, zu der sie geliehen werden, vollständig zurückzuzahlen. -Das setzt voraus, dass viel Logik in eine sehr maßgeschneiderte Transaktion einfließen muss. Ein einfaches Beispiel wäre, einen Flash Loan einzusetzen, um eine große Menge eines bestimmten Assets zu einem niedrigen Preis zu borgen und es dann an einem anderen Handelsplatz zu einem höheren Preis zu verkaufen. +Das bedeutet, dass viel Logik in eine sehr maßgeschneiderte Transaktion integriert werden muss. Ein einfaches Beispiel wäre jemand, der einen Flash-Kredit nutzt, um so viel von einem Vermögenswert zu einem bestimmten Preis zu leihen, dass er ihn an einer anderen Börse verkaufen kann, wo der Preis höher ist. -Während einer einzelnen Transaktion passiert also Folgendes: +In einer einzigen Transaktion passiert also Folgendes: -- Sie leihen sich Betrag X von $asset zum Preis von $ 1,00 von Handelsplatz A. -- Sie verkaufen X von $asset auf Handelsplatz B für $ 1,10. -- Sie zahlen den Kredit bei Handelsplatz A zurück. -- Sie behalten den Profit abzüglich der Transaktionsgebühren. +- Sie leihen X Menge von $asset zu 1,00 $ von Börse A +- Sie verkaufen X $asset an Börse B für 1,10 $ +- Sie zahlen den Kredit an Börse A zurück +- Sie behalten den Gewinn abzüglich der Transaktionsgebühr -Gäbe es an Handelsplatz B kurzfristig zu wenig Angebot von Assets, wodurch Sie nicht in der Lage wären, genug zu verkaufen, um den ursprünglichen Kredit zurückzuzahlen, so würde die Transaktion schlichtweg einfach fehlschlagen. +Wenn das Angebot von Börse B plötzlich sinken würde und der Nutzer nicht genug kaufen könnte, um den ursprünglichen Kredit zu decken, würde die Transaktion einfach fehlschlagen. -Um das obige Beispiel in der etablierten Finanzwelt umzusetzen, benötigten Sie sehr viel Geld. Diese Strategien des Geldverdienens sind jenen mit großem bestehenden Vermögen vorbehalten. Flash Loans sind ein Beispiel einer Zukunft, in der der Besitz von Geld nicht die Voraussetzung dafür ist, Geld zu verdienen. +Um das obige Beispiel in der traditionellen Finanzwelt durchführen zu können, bräuchten Sie eine enorme Menge an Geld. Diese Strategien zum Geldverdienen sind nur für diejenigen zugänglich, die bereits über Vermögen verfügen. Flash-Kredite sind ein Beispiel für eine Zukunft, in der Geld zu haben nicht unbedingt eine Voraussetzung dafür ist, Geld zu verdienen. - Mehr zu Flash Loans + Mehr über Flash-Kredite -### Jetzt mit dem Kryptosparen beginnen {#saving} +### Mit Krypto-Sparen beginnen {#saving} -#### Darlehen {#lending} +#### Verleihen {#lending} -Sie können Ihrer Krypto in Echtzeit beim Wachsen zusehen, indem Sie sie verleihen und Zinsen verdienen. Aktuell sind diese Zinssätze um einiges höher als bei lokalen Banken (wenn Sie das Glück haben, Zugang dazu zu haben). Hier ein Beispiel: +Sie können Zinsen auf Ihre Kryptowährungen verdienen, indem Sie sie verleihen, und zusehen, wie Ihr Guthaben in Echtzeit wächst. Derzeit sind die Zinssätze viel höher als das, was Sie wahrscheinlich bei Ihrer örtlichen Bank bekommen (wenn Sie das Glück haben, Zugang zu einer zu haben). Hier ist ein Beispiel: -- Sie verleihen 100 Dai, ein [Stablecoin](/stablecoins/), an ein Produkt wie z. B. Aave. -- Sie erhalten einen Token, der für Ihr verliehenes Dai steht, also 100 Aave Dai (aDai). -- Ihr aDai steigt auf Grundlage der Zinssätze an und Sie können Ihr Guthaben in Ihrer Wallet wachsen sehen. Abhängig von der [APR](/glossary/#apr) kann Ihr Wallet-Guthaben beispielsweise nach ein paar Tagen und sogar nur ein paar Stunden 100,1234 anzeigen! -- Sie können dann jederzeit normales Dai in Höhe Ihres aDai-Guthabens abheben. +- Sie verleihen Ihre 100 Dai, einen [Stablecoin](/stablecoins/), an ein Produkt wie Aave. +- Sie erhalten 100 Aave Dai (aDai), was ein Token ist, der Ihre verliehenen Dai repräsentiert. +- Ihre aDai werden basierend auf den Zinssätzen steigen und Sie können sehen, wie Ihr Guthaben in Ihrem Wallet wächst. Abhängig vom [APR](/glossary/#apr) wird Ihr Wallet-Guthaben nach ein paar Tagen oder sogar Stunden etwa 100,1234 betragen! +- Sie können jederzeit einen Betrag an regulären Dai abheben, der Ihrem aDai-Guthaben entspricht. - Zu Lending-dApps + Verleih-Dapps ansehen -#### No-Loss-Lotterien {#no-loss-lotteries} +#### Lotterien ohne Verlust {#no-loss-lotteries} -No-Loss-Lotterien wie zum Beispiel PoolTogether sind ein lustiger und innovativer Weg, Geld zu sparen. +Lotterien ohne Verlust wie PoolTogether sind eine unterhaltsame und innovative neue Möglichkeit, Geld zu sparen. -- Sie kaufen 100 Tickets mit 100 Dai-Token. -- Sie erhalten 100 plDai, die für Ihre 100 Tickets stehen. -- Wird eines Ihrer Tickets als Gewinner gezogen, erhöht sich Ihr plDai-Guthaben um die Höhe des Gewinnpools. -- Wenn Sie nicht gewinnen, gehen Ihre 100 plDai in die Ziehung in der nächsten Woche über. -- Sie können natürlich jederzeit reguläres Dai in Höhe Ihres plDai-Guthabens abheben. +- Sie kaufen 100 Lose mit 100 Dai-Token. +- Sie erhalten 100 plDai, die Ihre 100 Lose repräsentieren. +- Wenn eines Ihrer Lose als Gewinner gezogen wird, erhöht sich Ihr plDai-Guthaben um den Betrag des Preispools. +- Wenn Sie nicht gewinnen, werden Ihre 100 plDai auf die Ziehung der nächsten Woche übertragen. +- Sie können jederzeit einen Betrag an regulären Dai abheben, der Ihrem plDai-Guthaben entspricht. -Der Gewinnpool wird aus allen Zinsen gewonnen, die durch das Verleihen der Ticketanzahlungen wie im Beispiel zum Verleihen oben generiert wurden. +Der Preispool wird durch alle Zinsen generiert, die durch das Verleihen der Loseinzahlungen wie im obigen Verleih-Beispiel entstehen. - PoolTogether testen + PoolTogether ausprobieren ### Token tauschen {#swaps} -Auf Ethereum gibt es Tausende Token. Der Handel mit verschiedenen Token erfolgt über dezentrale Tauschbörsen (DEXs) und ist jederzeit möglich. Sie geben niemals die Kontrolle über Ihre Vermögenswerte aus der Hand. Das ist wie der Besuch einer Wechselstube, wenn Sie in ein anderes Land reisen. Doch die DeFi-Version ist immer geöffnet. Die Märkte sind rund um die Uhr an 365 Tagen im Jahr geöffnet. Die Technologie garantiert, dass es immer jemanden gibt, der einen Handel akzeptiert. +Es gibt Tausende von Token auf Ethereum. Dezentralisierte Börsen (DEXs) ermöglichen es Ihnen, verschiedene Token zu handeln, wann immer Sie wollen. Sie geben niemals die Kontrolle über Ihre Vermögenswerte auf. Das ist so, als würden Sie beim Besuch eines anderen Landes eine Wechselstube nutzen. Aber die DeFi-Version schließt nie. Die Märkte sind 24/7, 365 Tage im Jahr geöffnet und die Technologie garantiert, dass es immer jemanden gibt, der einen Handel akzeptiert. -Wenn Sie zum Beispiel die No-Loss-Lotterie PoolTogether (wie oben beschrieben) nutzen möchten, benötigen Sie einen Token wie Dai oder USDC. An diesen DEXs können Sie Ihr ETH gegen solche Token eintauschen. Sobald Sie fertig sind, ist es wieder möglich, diese Token zurückzutauschen. +Wenn Sie beispielsweise die Lotterie ohne Verlust PoolTogether (oben beschrieben) nutzen möchten, benötigen Sie einen Token wie Dai oder USDC. Diese DEXs ermöglichen es Ihnen, Ihre ETH gegen diese Token zu tauschen und wieder zurück, wenn Sie fertig sind. - Zu Token-Handesplätzen + Token-Börsen ansehen -### Erweitertes Trading {#trading} +### Fortgeschrittener Handel {#trading} -Für Trader, die sich mehr Kontrolle wünschen, gibt es fortgeschrittenere Optionen. Limit Orders, Perpetuals, Margin Trading und vieles mehr ist möglich. Mit dezentralem Trading erhalten Sie Zugang zu globaler Liquidität. Der Markt schließt nie und Sie haben immer volle Kontrolle über Ihre Assets. +Es gibt fortgeschrittenere Optionen für Händler, die etwas mehr Kontrolle mögen. Limit-Orders, Perpetuals, Margin-Trading und mehr sind alle möglich. Mit dezentralisiertem Handel erhalten Sie Zugang zu globaler Liquidität, der Markt schließt nie und Sie haben immer die Kontrolle über Ihre Vermögenswerte. -Wenn Sie sich für einen zentralen Handelsplatz entscheiden, müssen Sie Ihre Assets vor dem Handeln zuerst hinterlegen und darauf vertrauen, dass der Anbieter diese sicher verwahrt. Während Ihre Assets bei dem Anbieter hinterlegt sind, sind sie dem Risiko von Hackerangriffen ausgesetzt. +Wenn Sie eine zentralisierte Börse nutzen, müssen Sie Ihre Vermögenswerte vor dem Handel einzahlen und darauf vertrauen, dass sie darauf aufpassen. Während Ihre Vermögenswerte eingezahlt sind, sind sie gefährdet, da zentralisierte Börsen attraktive Ziele für Hacker sind. - Zu Trading-dApps + Handels-Dapps ansehen -### Das eigene Portfolio vergrößern {#investing} +### Ihr Portfolio vergrößern {#investing} -Auf Ethereum gibt es auch Produkte für das Portfoliomanagement, deren Ziel es ist, Ihr Portfolio mit einer Strategie Ihrer Wahl zu vergrößern. Das erfolgt automatisch, ist offen für jeden und Sie benötigen keinen realen Manager, der einen Anteil an Ihren Gewinnen beansprucht. +Es gibt Fondsmanagement-Produkte auf Ethereum, die versuchen werden, Ihr Portfolio basierend auf einer Strategie Ihrer Wahl zu vergrößern. Dies geschieht automatisch, steht jedem offen und erfordert keinen menschlichen Manager, der einen Teil Ihrer Gewinne einbehält. -Ein gutes Beispiel ist der [DeFi Pulse Index Fund (DPI)](https://defipulse.com/blog/defi-pulse-index/). Es handelt sich um einen Fonds, der automatisch ein Rebalancing durchführt, um sicherzustellen, dass Ihr Portfolio immer die besten DeFi-Token nach Marktkapitalisierung enthält. Sie werden niemals irgendwelche Details verwalten müssen und können jederzeit Abhebungen aus dem Fonds tätigen. +Beispielsweise gibt es tokenisierte Indexfonds, die automatisch umschichten, um sicherzustellen, dass Ihr Portfolio immer die Top-DeFi-Token nach Marktkapitalisierung enthält. Sie müssen sich nie um die Details kümmern und können sich jederzeit aus dem Fonds zurückziehen. - Zu Investment-dApps + Investment-Dapps ansehen -### Eigene Ideen finanzieren {#crowdfunding} +### Ihre Ideen finanzieren {#crowdfunding} -Ethereum ist die ideale Platform für Crowdfunding: +Ethereum ist eine ideale Plattform für Crowdfunding: -- Potenzielle Geldgeber können von überall kommen – Ethereum und seine Token sind für jedermann offen, überall auf der Welt. -- Das System ist transparent, so dass Spendensammler beweisen können, wie viel Geld gesammelt wurde. Es lässt sich sogar nachverfolgen, wie die Mittel später ausgegeben werden. -- Spendensammler können automatische Erstattungen einrichten, wenn es beispielsweise eine bestimmte Frist und einen Mindestbetrag gibt, die bzw. der nicht eingehalten oder erreicht wird. +- Potenzielle Geldgeber können von überall her kommen – Ethereum und seine Token stehen jedem überall auf der Welt offen. +- Es ist transparent, sodass Spendensammler beweisen können, wie viel Geld gesammelt wurde. Sie können sogar später nachverfolgen, wie die Gelder ausgegeben werden. +- Spendensammler können automatische Rückerstattungen einrichten, wenn beispielsweise eine bestimmte Frist und ein Mindestbetrag nicht erreicht werden. - Zu Crowdfunding-dApps + Crowdfunding-Dapps ansehen #### Quadratische Finanzierung {#quadratic-funding} -Ethereum ist Open-Source-Software und ein Großteil der bisherigen Arbeit wurde von der Community finanziert. Das hat zur Entwicklung eines interessanten neuen Fundraising-Modells geführt: die quadratische Finanzierung. Damit lässt sich die Art und Weise, wie wir in Zukunft alle Arten von öffentlichen Gütern finanzieren, verbessern. +Ethereum ist Open-Source-Software und ein Großteil der bisherigen Arbeit wurde von der Community finanziert. Dies hat zum Wachstum eines interessanten neuen Fundraising-Modells geführt: der quadratischen Finanzierung. Dies hat das Potenzial, die Art und Weise, wie wir in Zukunft alle Arten von öffentlichen Gütern finanzieren, zu verbessern. -Über die quadratische Finanzierung wird sichergestellt, dass die Projekte mit dem größten individuellen Bedarf auch die meisten Mittel erhalten. Mit anderen Worten: Projekte, die das Leben der meisten Menschen verbessern können. So funktioniert es: +Die quadratische Finanzierung stellt sicher, dass die Projekte, die die meiste Finanzierung erhalten, diejenigen mit der größten einzigartigen Nachfrage sind. Mit anderen Worten, Projekte, die das Leben der meisten Menschen verbessern. So funktioniert es: -1. Es gibt einen übereinstimmenden Pool an gespendeten Mitteln. -2. Eine öffentliche Finanzierungsrunde startet. -3. Menschen können ihre Nachfrage nach einem Projekt signalisieren, indem sie Geld spenden. -4. Sobald die Runde zu Ende ist, werden die Gelder aus dem übereinstimmenden Pool auf die Projekte verteilt. Die Projekte mit dem höchsten individuellen Bedarf erhalten den größten Teil aus dem übereinstimmenden Pool. +1. Es gibt einen gespendeten Matching-Pool an Geldern. +2. Eine Runde der öffentlichen Finanzierung beginnt. +3. Menschen können ihre Nachfrage nach einem Projekt signalisieren, indem sie etwas Geld spenden. +4. Sobald die Runde beendet ist, wird der Matching-Pool an die Projekte verteilt. Diejenigen mit der größten einzigartigen Nachfrage erhalten den höchsten Betrag aus dem Matching-Pool. -Projekt A mit 100 Spenden zu je 1 Euro könnte also mehr Mittel erhalten als Projekt B mit einer einzelnen Spende von 10.000 Euro (abhängig von der Größe des übereinstimmenden Pools). +Das bedeutet, dass Projekt A mit seinen 100 Spenden von 1 Dollar am Ende mehr Finanzierung erhalten könnte als Projekt B mit einer einzigen Spende von 10.000 Dollar (abhängig von der Größe des Matching-Pools). - Zu quadratischer Finanzierung + Mehr über quadratische Finanzierung -### Versicherung {#insurance} +### Versicherungen {#insurance} -Eine dezentralisierte Versicherung zielt darauf ab, Versicherungen billiger und transparenter zu machen sowie Versicherungsfälle schneller auszuzahlen. Mit einem höherem Grad an Automatisierung wird der Versicherungsschutz erschwinglicher und die Auszahlungen erfolgen wesentlich schneller. Die Daten, die zur Entscheidung über Ihren Versicherungsfall genutzt werden, sind vollkommen transparent. +Dezentralisierte Versicherungen zielen darauf ab, Versicherungen billiger, schneller in der Auszahlung und transparenter zu machen. Mit mehr Automatisierung ist der Versicherungsschutz erschwinglicher und Auszahlungen erfolgen viel schneller. Die Daten, die zur Entscheidung über Ihren Anspruch verwendet werden, sind völlig transparent. -Bei Ethereum-Produkten gibt es wie auch bei jeder anderen Software Fehler und Exploits. Derzeit liegt beispielsweise bei vielen Versicherungsprodukten in diesem Bereich der Schwerpunkt auf dem Schutz der Benutzer vor finanziellen Verlusten. Es gibt jedoch Projekte, die damit beginnen, einen Versicherungsschutz für alles Unwägbarkeiten aufzubauen, die das Leben uns bescheren kann. Ein gutes Beispiel ist die Ernteversicherung von Etherisc. Es wird versucht, [Kleinbauern in Kenia gegen Dürren und Überschwemmungen abzusichern](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). Dezentrale Versicherungen können Landwirten, denen herkömmliche Versicherungen oft zu teuer sind, einen erschwinglichen Versicherungsschutz bieten. +Ethereum-Produkte können, wie jede Software, unter Fehlern und Exploits leiden. Daher konzentrieren sich derzeit viele Versicherungsprodukte in diesem Bereich darauf, ihre Nutzer vor dem Verlust von Geldern zu schützen. Es gibt jedoch Projekte, die beginnen, einen Versicherungsschutz für alles aufzubauen, was das Leben uns entgegenwerfen kann. Ein gutes Beispiel dafür ist die Ernteversicherung von Etherisc, die darauf abzielt, [Kleinbauern in Kenia vor Dürren und Überschwemmungen zu schützen](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). Dezentralisierte Versicherungen können Landwirten, die oft aus traditionellen Versicherungen herausgepreist werden, einen günstigeren Schutz bieten. - Zu Versicherungs-dApps + Versicherungs-Dapps ansehen -### Aggregatoren und Portfoliomanager {#aggregators} +### Aggregatoren und Portfolio-Manager {#aggregators} -Bei all diesen Entwicklungen brauchen Sie einen Weg, um alle Ihre Investitionen, Darlehen und Trades im Auge zu behalten. Es gibt eine Reihe von Produkten, mit denen Sie alle Ihre DeFi-Aktivitäten zentral koordinieren können. Das ist der Vorteil der offenen Architektur von DeFi. Teams können Schnittstellen entwickeln, über die Sie nicht nur Ihr Guthaben für alle Produkte sehen, sondern zusätzlich auch deren Funktionen nutzen können. Das finden Sie vielleicht nützlich, wenn Sie sich umfassender mit DeFi vertraut machen. +Bei so viel Aktivität benötigen Sie eine Möglichkeit, den Überblick über all Ihre Investitionen, Kredite und Trades zu behalten. Es gibt eine Vielzahl von Produkten, mit denen Sie all Ihre DeFi-Aktivitäten von einem Ort aus koordinieren können. Das ist das Schöne an der offenen Architektur von DeFi. Teams können Schnittstellen entwickeln, in denen Sie nicht nur Ihre Guthaben über verschiedene Produkte hinweg sehen, sondern auch deren Funktionen nutzen können. Sie könnten dies nützlich finden, wenn Sie mehr von DeFi erkunden. - Zu Portfolio-dApps + Portfolio-Dapps ansehen ## Wie funktioniert DeFi? {#how-defi-works} -DeFi setzt Kryptowährungen und Smart Contracts ein, um Dienstleistungen anzubieten, die ohne Vermittler auskommen. In der Finanzwelt von heute fungieren Finanzinstitute als Garanten für Transaktionen. Das verleiht diesen Institutionen enorme Macht, da Ihr Geld durch die Institutionen fließt. Hinzu kommt, dass mehr als eine Milliarde Menschen auf der ganzen Welt nicht einmal Zugang zu einem Bankkonto haben. +DeFi nutzt Kryptowährungen und Smart Contracts, um Dienstleistungen anzubieten, die keine Vermittler benötigen. In der heutigen Finanzwelt fungieren Finanzinstitute als Garanten für Transaktionen. Dies verleiht diesen Institutionen immense Macht, da Ihr Geld durch sie fließt. Außerdem haben Milliarden von Menschen auf der ganzen Welt nicht einmal Zugang zu einem Bankkonto. -In DeFi ersetzt ein Smart Contract das Finanzinstitut in der Transaktion. Ein Smart Contract ist eine Art Ethereum-Konto, das Guthaben halten kann und dieses auf Grundlage bestimmter Bedingungen zurücksenden oder zurückerstatten kann. Niemand kann diesen Smart Contract mehr ändern, wenn er live ist – er läuft immer wie programmiert ab. +In DeFi ersetzt ein Smart Contract das Finanzinstitut in der Transaktion. Ein Smart Contract ist eine Art Ethereum-Konto, das Gelder halten und diese basierend auf bestimmten Bedingungen senden/zurückerstatten kann. Niemand kann diesen Smart Contract ändern, wenn er live ist – er wird immer wie programmiert ausgeführt. -Ein Vertrag, sprich Contract, mit dem ein Zuschuss oder Taschengeld bezahlt werden soll, könnte so programmiert werden, dass jeden Freitag Geld von Konto A auf Konto B überwiesen wird. Und das passiert solange, wie Konto A über die erforderlichen Mittel verfügt. Niemand kann den Vertrag ändern. Es ist nicht möglich, Konto C als Empfänger hinzufügen, um Geldmittel zu stehlen. +Ein Vertrag, der darauf ausgelegt ist, Taschengeld auszuzahlen, könnte so programmiert werden, dass er jeden Freitag Geld von Konto A auf Konto B überweist. Und er wird dies nur tun, solange Konto A über die erforderlichen Mittel verfügt. Niemand kann den Vertrag ändern und Konto C als Empfänger hinzufügen, um Gelder zu stehlen. -Zudem sind die Contracts öffentlich und können von jedermann eingesehen und geprüft werden. Das bedeutet, dass schlechte Contracts meist sehr schnell von der Community überprüft werden. +Verträge sind auch öffentlich, sodass jeder sie einsehen und prüfen kann. Das bedeutet, dass schlechte Verträge oft ziemlich schnell unter die Lupe der Community geraten. -Daher ist es derzeit notwendig, den technisch versierten Mitgliedern der Ethereum-Community zu vertrauen, die Code lesen können. Die Open-Source-Community trägt dazu bei, dass die Entwickler stetig überprüft werden. Allerdings wird die Notwendigkeit dazu im Laufe der Zeit immer mehr abnehmen, da Smart Contracts leichter lesbar werden und neue Möglichkeiten zum Nachweis der Vertrauenswürdigkeit des Codes entwickelt werden. +Dies bedeutet, dass man derzeit den technischeren Mitgliedern der Ethereum-Community vertrauen muss, die Code lesen können. Die auf Open Source basierende Community hilft dabei, Entwickler in Schach zu halten, aber dieses Bedürfnis wird mit der Zeit abnehmen, da Smart Contracts leichter lesbar werden und andere Möglichkeiten zur Überprüfung der Vertrauenswürdigkeit von Code entwickelt werden. ## Ethereum und DeFi {#ethereum-and-defi} Ethereum ist aus mehreren Gründen die perfekte Grundlage für DeFi: -- Niemand ist Eigentümer von Ethereum oder der Smart Contracts, die darauf laufen. Und damit hat jeder die Möglichkeit, DeFi zu nutzen. Das bedeutet auch, dass niemand die Regeln für Sie ändern kann. -- Unter der Oberfläche sprechen alle DeFi-Produkte dieselbe Sprache: Ethereum. Daher können auch viele der Produkte nahtlos zusammenarbeiten. Sie können auf einer Platform Token verleihen und mit dem zinsakkumulierenden Token, den Sie dafür erhalten, auf dem Markt einer völlig anderen Anwendung handeln. Das ist ungefährt so, als würden Sie die Treuepunkte aus dem Supermarkt bei Ihrer Bank einzahlen. -- Token und Kryptowährungen sind Grundpfeiler von Ethereum: Ein verteiltes Ledger, die Nachvollziehbarkeit von Transaktionen und Eigentum – das liegt in der DNA von Ethereum. -- Ethereum ermöglicht völlige finanzielle Freiheit. Die meisten Produkte übernehmen niemals Eigentumsrechte an Ihren Geldmitteln, sodass Sie die Kontrolle nie aus der Hand geben. +- Niemand besitzt Ethereum oder die Smart Contracts, die darauf leben – dies gibt jedem die Möglichkeit, DeFi zu nutzen. Das bedeutet auch, dass niemand die Regeln zu Ihren Ungunsten ändern kann. +- DeFi-Produkte sprechen hinter den Kulissen alle dieselbe Sprache: Ethereum. Das bedeutet, dass viele der Produkte nahtlos zusammenarbeiten. Sie können Token auf einer Plattform verleihen und den zinstragenden Token in einem anderen Markt auf einer völlig anderen Anwendung tauschen. Das ist so, als könnten Sie Treuepunkte bei Ihrer Bank einlösen. +- Token und Kryptowährungen sind in Ethereum, einen gemeinsamen Ledger, integriert – das Nachverfolgen von Transaktionen und Eigentum ist sozusagen Ethereums Ding. +- Ethereum ermöglicht völlige finanzielle Freiheit – die meisten Produkte werden niemals die Verwahrung Ihrer Gelder übernehmen, sodass Sie die Kontrolle behalten. -DeFi ist praktisch ein Ebenenmodell: +Sie können sich DeFi in Schichten vorstellen: -1. Die Blockchain: Ethereum enthält den Transaktionsverlauf und den Status der Konten. -2. Die Assets: [ETH](/what-is-ether/) und die anderen Token (Währungen). -3. Die Protokolle – [Smart Contracts](/glossary/#smart-contract), die die Funktionalität bereitstellen, z.B. einen Dienst, der die dezentrale Ausleihe von Vermögenswerten ermöglicht. -4. [Die Anwendungen](/apps/): Produkte die wir benutzen, um Protokolle zu verwalten und auf diese zuzugreifen. +1. Die Blockchain – Ethereum enthält die Transaktionshistorie und den Status der Konten. +2. Die Vermögenswerte – [ETH](/what-is-ether/) und die anderen Token (Währungen). +3. Die Protokolle – [Smart Contracts](/glossary/#smart-contract), die die Funktionalität bereitstellen, zum Beispiel ein Dienst, der das dezentralisierte Verleihen von Vermögenswerten ermöglicht. +4. [Die Anwendungen](/apps/) – die Produkte, die wir verwenden, um die Protokolle zu verwalten und darauf zuzugreifen. -Merke: Vieles von DeFi nutzt den [ERC-20-Standard](/glossary/#erc-20). Anwendungen in DeFi nutzen einen Wrapper namens „Wrapped Ether“ (WETH) für ETH. [Erfahren Sie mehr über Wrapped Ether](/wrapped-eth). +Hinweis: Ein Großteil von DeFi verwendet den [ERC-20-Standard](/glossary/#erc-20). Anwendungen in DeFi verwenden einen Wrapper für ETH namens Wrapped Ether (WETH). [Erfahren Sie mehr über Wrapped Ether](/wrapped-eth). -## DeFi aufbauen {#build-defi} +## DeFi entwickeln {#build-defi} -DeFi ist eine Open-Source-Bewegung. DeFi-Protokolle und -Anwendungen sind für jeden offen, um sie zu überprüfen, aufzuspalten und zu verbessern. Durch diese kombinierten Ebenen oder Layer (sie teilen alle die gleiche Basis-Blockchain und Assets) können Protokolle vermischt und aufeinander abgestimmt werden, um neue einzigartige Möglichkeiten zu schaffen. +DeFi ist eine Open-Source-Bewegung. Die DeFi-Protokolle und -Anwendungen sind alle offen, damit Sie sie einsehen, forken und weiterentwickeln können. Aufgrund dieses geschichteten Stacks (sie alle teilen sich dieselbe Basis-Blockchain und dieselben Vermögenswerte) können Protokolle gemischt und kombiniert werden, um einzigartige Kombinationsmöglichkeiten zu erschließen. - Mehr zum Erstellen von dApps + Mehr über die Entwicklung von Dapps -## Weiterführende Informationen {#further-reading} +## Jenseits des traditionellen DeFi {#beyond-traditional-defi} + +Das DeFi-Ökosystem expandiert weiter in neue Bereiche: + +- **[Prognosemärkte](/prediction-markets/)** – Dezentralisierte Plattformen, auf denen Sie ohne Vermittler auf den Ausgang zukünftiger Ereignisse wetten können, von Wahlen bis hin zu Sportereignissen. +- **[Real-World Assets (RWAs)](/real-world-assets/)** – Die Tokenisierung physischer Vermögenswerte wie Immobilien, Rohstoffe und Anleihen auf Ethereum, wodurch Werte in Billionenhöhe auf die Blockchain gebracht werden. +- **[Zahlungen](/payments/)** – Die Nutzung von Ethereum und Stablecoins für schnelle, kostengünstige globale Zahlungen ohne traditionelle Bankinfrastruktur. +- **[KI-Agenten](/ai-agents/)** – Autonome Software-Agenten, die auf Ethereum Transaktionen durchführen können und so neue Formen des automatisierten Handels, des Portfoliomanagements und der Interaktion auf der Blockchain ermöglichen. + +## Weiterführende Literatur {#further-reading} ### DeFi-Daten {#defi-data} @@ -346,19 +356,19 @@ DeFi ist eine Open-Source-Bewegung. DeFi-Protokolle und -Anwendungen sind für j ### DeFi-Artikel {#defi-articles} -- [Ein Leitfaden für Einsteiger in DeFi](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, 6. Januar 2020_ +- [Ein Anfängerleitfaden für DeFi](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, 6. Januar 2020_ +- [EEA DeFi Risk Assessment Guidelines](https://entethalliance.org/specs/defi-risks/) – Ein von der Industrie unterstützter Überblick darüber, wie man Hauptrisiken in DeFi-Protokollen identifiziert und bewertet. ### Videos {#videos} -- [Finanzmathematik – mehr erfahren über dezentralisierte Finanzmärkte](https://finematics.com/) – _Videos zu DeFi_ -- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _DeFi-Grundlagen: Alles, was Sie wissen müssen, um in diesem gelegentlich verblüffenden Bereich durchzustarten._ -- [Whiteboard-Krypto](https://youtu.be/17QRFlml4pA) _Was ist DeFi?_ +- [Finematics - Bildung zu dezentralisiertem Finanzwesen](https://finematics.com/) – _Videos über DeFi_ +- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _DeFi-Grundlagen: Alles, was Sie wissen müssen, um in diesem gelegentlich verwirrenden Bereich anzufangen._ +- [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) _Was ist DeFi?_ ### Communities {#communities} -- [DeFi Llama Discord Server](https://discord.defillama.com/) -- [DeFi Pulse Discord Server](https://discord.gg/Gx4TCTk) +- [DeFi Llama Discord-Server](https://discord.defillama.com/) - + \ No newline at end of file diff --git a/public/content/translations/de/desci/index.md b/public/content/translations/de/desci/index.md index 9c126b3ff53..6822dee3476 100644 --- a/public/content/translations/de/desci/index.md +++ b/public/content/translations/de/desci/index.md @@ -1,134 +1,138 @@ --- -title: Dezentrale Wissenschaft (DeSci) -description: Eine Übersicht über dezentralisierte Wissenschaft auf Ethereum +title: Dezentralisierte Wissenschaft (DeSci) +description: "Ein Überblick über dezentralisierte Wissenschaft auf Ethereum" lang: de template: use-cases emoji: ":microscope:" sidebarDepth: 2 image: /images/future_transparent.png alt: "" -summaryPoint1: Eine globale, offene Alternative zum derzeitigen wissenschaftlichen System. -summaryPoint2: Technologie, die es Wissenschaftlern ermöglicht, Finanzierung zu erhalten, Experimente durchzuführen, Daten zu teilen, Erkenntnisse zu verbreiten und vieles mehr. +summaryPoint1: Eine globale, offene Alternative zum aktuellen Wissenschaftssystem. +summaryPoint2: "Technologie, die es Wissenschaftlern ermöglicht, Gelder zu beschaffen, Experimente durchzuführen, Daten zu teilen, Erkenntnisse zu verbreiten und vieles mehr." summaryPoint3: Baut auf der Open-Science-Bewegung auf. --- ## Was ist dezentralisierte Wissenschaft (DeSci)? {#what-is-desci} -Die dezentralisierte Wissenschaft (DeSci) ist eine Bewegung mit dem Ziel, eine öffentliche Infrastruktur für die faire und gerechte Finanzierug, Schaffung, Überprüfung, Zueignung, Speicherung und Verbreitung von wissenschaftlichem Wissen mithilfe des [Web3](/glossary/#web3)-Stack zu errichten. +Dezentralisierte Wissenschaft (DeSci) ist eine Bewegung, die darauf abzielt, eine öffentliche Infrastruktur für die Finanzierung, Erstellung, Überprüfung, Anerkennung, Speicherung und Verbreitung wissenschaftlichen Wissens fair und gerecht mithilfe des [Web3](/glossary/#web3)-Stacks aufzubauen. -DeSci zielt darauf ab, ein Ökosystem zu schaffen, in dem Wissenschaftler ermutigt werden, ihre Forschungsergebnisse offen zu teilen und Anerkennung für ihre Arbeit zu erhalten. Gleichzeitig wird Fachleuten, die ihre eigenen Leistungen einbringen möchten, der Zugang zur Forschung ermöglicht. DeSci arbeitet mit der Idee, dass wissenschaftliche Erkenntnisse für alle zugänglich und der Prozess der wissenschaftlichen Forschung transparent sein sollte. DeSci schafft ein dezentraleres und verteiltes wissenschaftliches Forschungsmodell, das widerstandsfähiger gegen Zensur und Kontrolle durch zentrale Behörden ist. DeSci hofft, eine Umgebung zu schaffen, in der neue und unkonventionelle Ideen gedeihen können, indem der Zugang zu Finanzierung, wissenschaftlichen Werkzeugen und Kommunikationskanälen dezentralisiert wird. +DeSci zielt darauf ab, ein Ökosystem zu schaffen, in dem Wissenschaftler einen Anreiz haben, ihre Forschung offen zu teilen und Anerkennung für ihre Arbeit zu erhalten, während gleichzeitig jedem ein einfacher Zugang zur Forschung und die Möglichkeit zur Mitwirkung geboten wird. DeSci basiert auf der Idee, dass wissenschaftliches Wissen für jeden zugänglich und der Prozess der wissenschaftlichen Forschung transparent sein sollte. DeSci schafft ein stärker dezentralisiertes und verteiltes wissenschaftliches Forschungsmodell, das es widerstandsfähiger gegen Zensur und Kontrolle durch zentrale Behörden macht. DeSci hofft, ein Umfeld zu schaffen, in dem neue und unkonventionelle Ideen gedeihen können, indem der Zugang zu Finanzierung, wissenschaftlichen Werkzeugen und Kommunikationskanälen dezentralisiert wird. -Die dezentralisierte Wissenschaft ermöglicht eine vielfältigere Finanzierung aus verschiedenen Quellen (von [DAOs](/glossary/#dao) über [quadratische Spenden](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) bis hin zu Crowdfunding und mehr), einen leichteren Zugang zu Daten und Methoden sowie Anreize für die Reproduzierbarkeit. +Dezentralisierte Wissenschaft ermöglicht vielfältigere Finanzierungsquellen (von [DAOs](/glossary/#dao), [quadratischen Spenden](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) bis hin zu Crowdfunding und mehr), zugänglichere Daten und Methoden sowie die Bereitstellung von Anreizen für Reproduzierbarkeit. -### Juan Benet - Die DeSci-Bewegung +### Juan Benet – Die DeSci-Bewegung ## Wie DeSci die Wissenschaft verbessert {#desci-improves-science} -Eine unvollständige Liste von zentralen Problemen in der Wissenschaft und wie dezentralisierte Wissenschaft dazu beitragen kann, diese Probleme anzugehen +Eine unvollständige Liste der Hauptprobleme in der Wissenschaft und wie dezentralisierte Wissenschaft helfen kann, diese Probleme anzugehen -| **Dezentralisierte Wissenschaft** | **Traditionelle Wissenschaft** | -| -------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Die Verteilung von Geldmitteln wird **von der Öffentlichkeit bestimmt**, indem Mechanismen wie quadratische Spenden oder DAOs genutzt werden. | Kleine, geschlossene, **zentralisierte Gruppen** kontrollieren die Verteilung von Geldmitteln. | -| Sie arbeiten mit Kollegen aus **der ganzen Welt** zusammen. | Finanzierungsorganisationen und Heimatinstitutionen **limitieren** Ihre Kollaborationen. | -| Finanzierungsentscheidungen finden online und **transparent** statt. Es werden neue Finanzierungsmechanismen erforscht. | Finanzierungsentscheidungen werden mit langer Bearbeitungszeit und **limitierter Transparenz** durchgeführt. Es gibt nur wenige Finanzierungsmechanismen. | -| Die gemeinsame Nutzung von Labor-Dienstleistungen wird leichter und transparenter durch [Web3](/glossary/#web3)-Technologie. | Die gemeinsame Nutzung von Labor-Dienstleistungen ist meist **langsam und undurchsichtig**. | -| **Neue Veröffentlichungsmodelle**, die Web3-Primitiven für Vertrauen, Transparenz und universellen Zugriff nutzen, können entwickelt werden. | Sie veröffentlichen über etablierte Wege, die oft als **ineffizient, voreingenommen and ausbeuterisch** eingestuft werden. | -| Sie können **Tokens und Reputation durch Peer-Review-Arbeit verdienen**. | Ihre **Peer-Review-Arbeit ist unbezahlt**, was für gewinnorientierte Herausgeber von Vorteil ist. | -| **Sie besitzen das geistige Eigentum (IP)**, das Sie generieren und verteilen es den transparenten Bedingungen entsprechend. | **Ihre Heimatinstitution besitzt das IP**, das Sie generieren. Der Zugang zum IP ist nicht sichtbar. | -| **Das Teilen von allen durchgeführten Forschungsarbeiten**, einschließlich der Daten von erfolglosen Versuchen, indem alle Schritte On-Chain sind. | **Publikations-Bias** heißt, dass Forscher eher Experimente mit erfolgreichen Ergebnissen veröffentlichen. | +| **Dezentralisierte Wissenschaft** | **Traditionelle Wissenschaft** | +| ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| Die Verteilung von Geldern wird **durch die Öffentlichkeit bestimmt**, unter Verwendung von Mechanismen wie quadratischen Spenden oder DAOs. | Kleine, geschlossene, **zentralisierte Gruppen** kontrollieren die Verteilung von Geldern. | +| Sie arbeiten mit Kollegen aus **der ganzen Welt** in dynamischen Teams zusammen. | Förderorganisationen und Heimatinstitutionen **schränken** Ihre Zusammenarbeit **ein**. | +| Finanzierungsentscheidungen werden online und **transparent** getroffen. Neue Finanzierungsmechanismen werden erforscht. | Finanzierungsentscheidungen werden mit langen Bearbeitungszeiten und **eingeschränkter Transparenz** getroffen. Es gibt nur wenige Finanzierungsmechanismen. | +| Die gemeinsame Nutzung von Labordienstleistungen wird durch [Web3](/glossary/#web3)-Technologie einfacher und transparenter. | Die gemeinsame Nutzung von Laborressourcen ist oft **langsam und undurchsichtig**. | +| Es können **neue Veröffentlichungsmodelle** entwickelt werden, die Web3-Primitive für Vertrauen, Transparenz und universellen Zugang nutzen. | Sie veröffentlichen über etablierte Wege, die häufig als **ineffizient, voreingenommen und ausbeuterisch** anerkannt sind. | +| Sie können **Token und Reputation für Peer-Review-Arbeiten verdienen**. | Ihre **Peer-Review-Arbeit ist unbezahlt**, was gewinnorientierten Verlagen zugutekommt. | +| **Sie besitzen das geistige Eigentum (IP)**, das Sie generieren, und vertreiben es zu transparenten Bedingungen. | **Ihre Heimatinstitution besitzt das IP**, das Sie generieren. Der Zugang zum IP ist nicht transparent. | +| **Teilen der gesamten Forschung**, einschließlich der Daten aus erfolglosen Bemühungen, indem alle Schritte auf der Blockchain stattfinden. | **Publikationsbias** bedeutet, dass Forscher eher Experimente teilen, die erfolgreiche Ergebnisse hatten. | ## Ethereum und DeSci {#ethereum-and-desci} -Ein dezentralisiertes Wissenschaftssystem erfordert robuste Sicherheit, minimale Geld- und Transaktionskosten und ein reiches Ökosystem für die Anwendungsentwicklung. Ethereum stellt alles, was für den Bau einer dezentralisierten, wissenschaftlichen Technologie gebraucht wird, bereit. +Ein dezentralisiertes Wissenschaftssystem erfordert robuste Sicherheit, minimale monetäre und Transaktionskosten sowie ein reichhaltiges Ökosystem für die Anwendungsentwicklung. [Ethereum](/) bietet alles, was für den Aufbau einer dezentralisierten Wissenschaftstechnologie erforderlich ist. ## DeSci-Anwendungsfälle {#use-cases} -DeSci baut das spezifische Instrumentarium, um die traditionelle akademische Welt in die digitale Welt zu integrieren. Im Folgenden finden Sie eine Auswahl von Anwendungsfällen, die Web3 der wissenschaftlichen Gemeinschaft bieten kann. +DeSci baut das wissenschaftliche Instrumentarium auf, um die traditionelle akademische Welt in die digitale Welt zu integrieren. Im Folgenden finden Sie eine Auswahl von Anwendungsfällen, die Web3 der wissenschaftlichen Gemeinschaft bieten kann. -### Veröffentlichung (Publishing) {#publishing} +### Veröffentlichung {#publishing} -Das wissenschaftliche Publizieren ist bekanntermaßen problematisch, weil es von Verlagen verwaltet wird, die auf die kostenlose Arbeit von Wissenschaftlern, Gutachtern und Redakteuren angewiesen sind, um die Veröffentlichungen zu erstellen, dann aber exorbitante Veröffentlichungsgebühren verlangen. Die Öffentlichkeit, die in der Regel indirekt durch Steuern für das Werk und die Veröffentlichungskosten gezahlt hat, kann oft nicht auf dasselbe Werk zugreifen, ohne den Verleger erneut zu bezahlen. Die Gesamtkosten für die Publikation einzelner wissenschaftlicher Arbeiten belaufen sich oft auf fünfstellige Beträge (USD), wodurch das gesamte Konzept wissenschaftlicher Erkenntnisse als [öffentliches Gut](/glossary/#public-goods) untergraben wird, während gleichzeitig enorme Gewinne für eine kleine Gruppe von Verlegern erzielt werden. +Das wissenschaftliche Publikationswesen ist bekanntermaßen problematisch, da es von Verlagen verwaltet wird, die auf die unbezahlte Arbeit von Wissenschaftlern, Gutachtern und Redakteuren angewiesen sind, um die Arbeiten zu erstellen, dann aber exorbitante Veröffentlichungsgebühren verlangen. Die Öffentlichkeit, die die Arbeit und die Publikationskosten in der Regel indirekt über Steuern bezahlt hat, kann oft nicht auf dieselbe Arbeit zugreifen, ohne den Verlag erneut zu bezahlen. Die Gesamtgebühren für die Veröffentlichung einzelner wissenschaftlicher Arbeiten liegen oft im fünfstelligen Bereich (USD), was das gesamte Konzept von wissenschaftlichem Wissen als [öffentliches Gut](/glossary/#public-goods) untergräbt und gleichzeitig enorme Gewinne für eine kleine Gruppe von Verlagen generiert. -Kostenlose und frei zugängliche Plattformen gibt es in Form von Preprint-Servern, wie [ArXiv](https://arxiv.org/). Diesen Plattformen mangelt es jedoch an Qualitätskontrollen, [Anti-Sybil-Mechanismen](/glossary/#anti-sybil). Sie verfolgen in der Regel keine Qualitätskriterien auf Artikelniveau, was bedeutet, dass sie in der Regel nur dazu dienen, die Arbeiten zu veröffentlichen, ehe sie bei einem traditionellen Verlag eingereicht werden. SciHub macht auch publizierte Arbeiten frei zugänglich. Dies geschieht jedoch nicht auf legalem Weg, sondern erst, nachdem die Verlage ihre Bezahlung erhalten haben und die Arbeit in ein strenges Urheberrecht verpackt wurde. Dies hinterlässt eine kritische Lücke für zugängliche wissenschaftliche Publikationen und empirischen Daten mit einem eingebetteten Legitimationsmechanismus und Motivationsmodell. Die Werkzeuge für den Aufbau eines solchen Systems gibt es in Web3. +Kostenlose und Open-Access-Plattformen existieren in Form von Pre-Print-Servern, [wie ArXiv](https://arxiv.org/). Diesen Plattformen mangelt es jedoch an Qualitätskontrolle, [Anti-Sybil-Mechanismen](/glossary/#anti-sybil) und sie verfolgen im Allgemeinen keine Metriken auf Artikelebene, was bedeutet, dass sie normalerweise nur verwendet werden, um Arbeiten vor der Einreichung bei einem traditionellen Verlag bekannt zu machen. SciHub macht veröffentlichte Arbeiten ebenfalls kostenlos zugänglich, jedoch nicht legal und erst, nachdem die Verlage bereits ihre Bezahlung erhalten und das Werk in strenge Urheberrechtsgesetze gehüllt haben. Dies hinterlässt eine kritische Lücke für zugängliche wissenschaftliche Arbeiten und Daten mit einem eingebetteten Legitimationsmechanismus und Anreizmodell. Die Werkzeuge zum Aufbau eines solchen Systems existieren im Web3. ### Reproduzierbarkeit und Replizierbarkeit {#reproducibility-and-replicability} -Reproduzierbarkeit und Replizierbarkeit sind die Grundvoraussetzungen für qualitativ hochwertige wissenschaftliche Erkenntnisse. +Reproduzierbarkeit und Replizierbarkeit sind die Grundlagen hochwertiger wissenschaftlicher Entdeckungen. -- Reproduzierbare Ergebnisse können mehrfach nacheinander vom selben Team mit derselben Methodik erzielt werden. -- Reproduzierbare Ergebnisse können von einer anderen Gruppe mit demselben Versuchsaufbau erzielt werden. +- Reproduzierbare Ergebnisse können vom selben Team unter Verwendung derselben Methodik mehrmals hintereinander erzielt werden. +- Replizierbare Ergebnisse können von einer anderen Gruppe unter Verwendung desselben Versuchsaufbaus erzielt werden. -Neue Web3-native Tools können sicherstellen, dass Reproduzierbarkeit und Replizierbarkeit die Basis für Forschungsergebnisse sind. Damit können wir Qualitätsforschung in das technologische Umfeld der akademischen Welt einbinden. Web3 bietet die Möglichkeit, [Attestierungen](/glossary/#attestation) für jeden Analysekomponenten zu schaffen: die rohen Daten, den Rechner und das Anwendungsergebnis. Der Vorteil von Konsens-Systemen besteht darin, dass durch die Schaffung eines vertrauenswürdigen Netzwerks zur Pflege dieser Komponenten jeder Netzwerkteilnehmer für die Nachvollziehbarkeit der Berechnung und die Validierung jedes Ergebnisses verantwortlich sein kann. +Neue Web3-native Werkzeuge können sicherstellen, dass Reproduzierbarkeit und Replizierbarkeit die Basis von Entdeckungen sind. Wir können Qualitätswissenschaft in das technologische Gefüge der akademischen Welt einweben. Web3 bietet die Möglichkeit, [Bestätigungen](/glossary/#attestation) für jede Analysekomponente zu erstellen: die Rohdaten, die Rechen-Engine und das Anwendungsergebnis. Das Schöne an Konsenssystemen ist, dass, wenn ein vertrauenswürdiges Netzwerk zur Aufrechterhaltung dieser Komponenten geschaffen wird, jeder Netzwerkteilnehmer dafür verantwortlich sein kann, die Berechnung zu reproduzieren und jedes Ergebnis zu validieren. ### Finanzierung {#funding} -Das derzeitige Standardmodell der Wissenschaftsförderung besteht darin, dass Einzelpersonen oder Forschergruppen schriftliche Anträge bei einer Förderorganisation einreichen. Die Bewertung der Anträge und die anschließende Durchführung von Interviews mit den Antragstellern erfolgt durch ein kleines Gremium, das sich aus vertrauenswürdigen Personen zusammensetzt, bevor die Mittel an einen kleinen Kreis von Antragstellern vergeben werden. Abgesehen von der Entstehung von Engpässen, die manchmal zu **jahrelangen Wartezeiten** zwischen der Beantragung eines Zuschusses und dem Erhalten eines Zuschusses führen, ist dieses Modell dafür bekannt, höchst **anfällig für die Neigungen, Eigeninteressen und Politik** des Überprüfungsgremiums zu sein. +Das aktuelle Standardmodell zur Finanzierung der Wissenschaft besteht darin, dass Einzelpersonen oder Gruppen von Wissenschaftlern schriftliche Anträge bei einer Förderorganisation stellen. Ein kleines Gremium von Vertrauenspersonen bewertet die Anträge und führt dann Interviews mit den Kandidaten durch, bevor einem kleinen Teil der Bewerber Gelder zugesprochen werden. Abgesehen von der Schaffung von Engpässen, die manchmal zu **jahrelangen Wartezeiten** zwischen der Beantragung und dem Erhalt eines Stipendiums führen, ist dieses Modell bekanntermaßen sehr **anfällig für Voreingenommenheit, Eigeninteressen und Politik** des Prüfungsgremiums. -Studien haben gezeigt, dass die Bewilligungsgremien bei der Auswahl von qualitativ hochwertigen Anträgen schlecht abschneiden: Gleiche Anträge, die verschiedenen Gremien vorgelegt werden, führen zu sehr unterschiedlichen Ergebnissen. Aufgrund der Mittelknappheit konzentrierten sie sich auf einen kleineren Pool älterer Forscher mit intellektuell konservativeren Projekten. Dies hat zu einer extrem wettbewerbsorientierten Förderlandschaft geführt, die falsche Anreize setzt und die Innovation im Keim erstickt. +Studien haben gezeigt, dass Gremien zur Überprüfung von Förderanträgen bei der Auswahl qualitativ hochwertiger Vorschläge schlechte Arbeit leisten, da dieselben Vorschläge, die verschiedenen Gremien vorgelegt werden, stark abweichende Ergebnisse erzielen. Da die Finanzierung knapper geworden ist, hat sie sich auf einen kleineren Pool erfahrenerer Forscher mit intellektuell konservativeren Projekten konzentriert. Dieser Effekt hat eine hyperkompetitive Finanzierungslandschaft geschaffen, die perverse Anreize verfestigt und Innovationen erstickt. -Web3 hat das Potenzial, dieses kaputte Finanzierungsmodell zu durchbrechen, indem es mit verschiedenen Anreizmodellen experimentiert, die von DAOs und Web3 im Allgemeinen entwickelt werden. [Retroaktive Fördermittel für öffentliche Güter](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [quadratische Förderung](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO Governance](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) und [tokenisierte Anreizstrukturen](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) sind einige der Web3-Tools, die die Wissenschaftsförderung revolutionieren könnten. +Web3 hat das Potenzial, dieses kaputte Finanzierungsmodell zu durchbrechen, indem es mit verschiedenen Anreizmodellen experimentiert, die von DAOs und Web3 im Allgemeinen entwickelt wurden. [Rückwirkende Finanzierung öffentlicher Güter](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [quadratische Finanzierung](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO-Governance](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) und [tokenisierte Anreizstrukturen](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) sind einige der Web3-Werkzeuge, die die Wissenschaftsfinanzierung revolutionieren könnten. ### IP-Eigentum und -Entwicklung {#ip-ownership} -Geistiges Eigentum (IP) ist ein Hauptproblem der traditionellen Wissenschaft: Es bleibt in Universitäten stecken oder wird in Biotechs nicht genutzt und ist schwierig zu bewerten. Allerdings ist das Eigentum an digitalen Gütern (wie z. B. wissenschaftlichen Daten oder Aufsätzen) ein Bereich, in dem Web3 mit seinen [Non-Fungible Token (NFTs)](/glossary/#nft) eine sehr gute Lösung bietet. +Geistiges Eigentum (IP) ist ein großes Problem in der traditionellen Wissenschaft: davon, dass es in Universitäten feststeckt oder in Biotech-Unternehmen ungenutzt bleibt, bis hin zu der Tatsache, dass es notorisch schwer zu bewerten ist. Das Eigentum an digitalen Vermögenswerten (wie wissenschaftlichen Daten oder Artikeln) ist jedoch etwas, das Web3 mithilfe von [nicht-fungiblen Token (NFTs)](/glossary/#nft) außergewöhnlich gut handhabt. -Auf die gleiche Weise, wie NFTs Einnahmen für zukünftige Transaktionen an den ursprünglichen Ersteller zurückgeben können, können Sie transparente Wertzuweisungsketten einrichten, um Forscher, Verwaltungsorgane (wie DAOs) oder sogar die Personen, deren Daten gesammelt werden, zu belohnen. +Auf die gleiche Weise, wie NFTs Einnahmen für zukünftige Transaktionen an den ursprünglichen Ersteller zurückgeben können, können Sie transparente Wertzuschreibungsketten einrichten, um Forscher, Leitungsgremien (wie DAOs) oder sogar die Probanden, deren Daten gesammelt werden, zu belohnen. -[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) können auch als Schlüssel zu einem dezentralisierten Datenspeicher für die durchgeführten Forschungsexperimente fungieren und zur NFT- und [DeFi](/glossary/#defi)-Finanzierung beitragen (von der Fraktionalisierung bis zu Lending Pools und Value Appraisal). Es ermöglicht auch nativen On-Chain-Einheiten als DAOs wie etwa [VitaDAO](https://www.vitadao.com/), direkt in der Kette zu recherchieren. Die Einführung von nicht übertragbaren ["soulbound"-Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) könnte ebenfalls eine wichtige Rolle in DeSci spielen, da sie es Einzelpersonen ermöglichen, ihre Erfahrung und ihre Referenzen in Verbindung mit ihrer Ethereum-Adresse nachzuweisen. +[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) können auch als Schlüssel zu einem dezentralisierten Daten-Repository der durchgeführten Forschungsexperimente fungieren und sich in die NFT- und [DeFi](/glossary/#defi)-Finanzialisierung einklinken (von der Fraktionierung bis hin zu Kreditpools und Wertgutachten). Es ermöglicht auch nativen Entitäten auf der Blockchain, wie DAOs wie [VitaDAO](https://www.vitadao.com/), Forschung direkt auf der Blockchain durchzuführen. +Das Aufkommen von nicht übertragbaren ["Soulbound"-Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) könnte ebenfalls eine wichtige Rolle in DeSci spielen, indem es Einzelpersonen ermöglicht, ihre Erfahrung und Qualifikationen in Verbindung mit ihrer Ethereum-Adresse nachzuweisen. -### Datenspeicherung, Zugriff und Architektur {#data-storage} +### Datenspeicherung, -zugang und -architektur {#data-storage} -Wissenschaftliche Daten können durch Web3-Modelle viel leichter zugänglich gemacht werden, und die verteilte Speicherung erlaubt es der Forschung, katastrophale Ereignisse zu überleben. +Wissenschaftliche Daten können mithilfe von Web3-Mustern weitaus zugänglicher gemacht werden, und verteilte Speicherung ermöglicht es der Forschung, katastrophale Ereignisse zu überstehen. -Ausgangspunkt muss ein System sein, auf das jede dezentrale Identität mit verifizierbaren Berechtigungsnachweisen zugreift. Dies ermöglicht die sichere Replikation sensibler Daten durch vertrauenswürdige Parteien, Redundanz und Widerstandsfähigkeit gegen Zensur, die Reproduktion von Ergebnissen und sogar die Möglichkeit der Zusammenarbeit mehrerer Parteien und das Hinzufügen neuer Daten zu einem Datensatz. Vertrauliche Datenverarbeitungsmethoden wie [Compute-to-Data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) bieten alternative Zugriffsmechanismen zur Replikation von Rohdaten und zur Schaffung vertrauenswürdiger Forschungsumgebungen für besonders sensible Daten. Trusted Research Environments (vertrauenswürdige Forschungsumgebungen) wurden [vom NHS](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) als bahnbrechende Lösung für Datenschutz und Zusammenarbeit genannt, da sie ein Ökosystem schaffen, in dem Forscher vor Ort sicher mit Daten arbeiten können, indem sie standardisierte Umgebungen für die gemeinsame Nutzung von Code und Verfahren verwenden. +Der Ausgangspunkt muss ein System sein, das für jede dezentralisierte Identität zugänglich ist, die über die entsprechenden überprüfbaren Anmeldeinformationen verfügt. Dies ermöglicht es, sensible Daten von vertrauenswürdigen Parteien sicher zu replizieren, was Redundanz und Zensurresistenz, die Reproduktion von Ergebnissen und sogar die Möglichkeit für mehrere Parteien zur Zusammenarbeit und zum Hinzufügen neuer Daten zum Datensatz ermöglicht. Vertrauliche Berechnungsmethoden wie [Compute-to-Data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) bieten alternative Zugriffsmechanismen zur Rohdatenreplikation und schaffen vertrauenswürdige Forschungsumgebungen (Trusted Research Environments) für die sensibelsten Daten. Vertrauenswürdige Forschungsumgebungen wurden [vom NHS](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) als zukunftsweisende Lösung für Datenschutz und Zusammenarbeit angeführt, indem ein Ökosystem geschaffen wird, in dem Forscher mithilfe standardisierter Umgebungen für den Austausch von Code und Praktiken sicher vor Ort mit Daten arbeiten können. -Flexible Web3-Datenlösungen unterstützen die oben genannten Szenarien. Sie bilden die Grundlage für eine wirklich offene Wissenschaft, in der Forscher ohne Zugangsbeschränkungen oder Gebühren öffentliche Güter schaffen können. Öffentliche Web3-Datenlösungen wie IPFS, Arweave und Filecoin werden für die Dezentralisierung optimiert. dClimate bietet beispielsweise universellen Zugang zu Klima- und Wetterdaten, auch von Wetterstationen und Vorhersagemodellen. +Flexible Web3-Datenlösungen unterstützen die oben genannten Szenarien und bilden die Grundlage für echte Open Science, bei der Forscher öffentliche Güter ohne Zugriffsberechtigungen oder Gebühren erstellen können. Öffentliche Web3-Datenlösungen wie IPFS, Arweave und Filecoin sind für Dezentralisierung optimiert. dClimate bietet beispielsweise universellen Zugang zu Klima- und Wetterdaten, einschließlich solcher von Wetterstationen und prädiktiven Klimamodellen. ## Machen Sie mit {#get-involved} -Erkunden Sie Projekte und werden Sie Teil der DeSci-Gemeinschaft. - -- [DeSci.Global: globale Ereignisse und Termine](https://desci.global) -- [Blockchain für Science Telegram](https://t.me/BlockchainForScience) -- [Molecule: fördern und eigene Forschungsprojekte finanzieren lassen](https://www.molecule.xyz/) -- [VitaDAO: langfristige Forschung finanziert durch gesponserte Forschungsverträge](https://www.vitadao.com/) -- [ResearchHub: wissenschaftliche Ergebnisse veröffentlichen und in Diskurs mit Partnern gehen](https://www.researchhub.com/) -- [dClimate API: Klimadaten abfragen, die von einer dezentralen Gemeinschaft erfasst werden](https://www.dclimate.net/) -- [DeSci Foundation: DeSci Publishing Tool Builder](https://descifoundation.org/) -- [DeSci.World: One-Stop-Shop für Benutzer, mit dezentralisierter Wissenschaft](https://desci.world) -- [OceanDAO: DAO regelte die Finanzierung der datenbezogenen Wissenschaft](https://oceanprotocol.com/) -- [OpScientia: offene dezentrale wissenschaftliche Workflows](https://opsci.io/research/) -- [Bio.xyz: Erhalten Sie Mittel für Ihr Biotech-DAO oder desci-Projekt](https://www.bio.xyz/) +Entdecken Sie Projekte und treten Sie der DeSci-Community bei. + +- [DeSci.Global: globaler Veranstaltungs- und Meetup-Kalender](https://desci.global) +- [Blockchain for Science Telegram](https://t.me/BlockchainForScience) +- [Molecule: Finanzieren Sie Ihre Forschungsprojekte und lassen Sie sich finanzieren](https://www.molecule.xyz/) +- [VitaDAO: Erhalten Sie Finanzierung durch gesponserte Forschungsvereinbarungen für Langlebigkeitsforschung](https://www.vitadao.com/) +- [ResearchHub: Veröffentlichen Sie ein wissenschaftliches Ergebnis und treten Sie in einen Dialog mit Kollegen](https://www.researchhub.com/) +- [dClimate API: Fragen Sie Klimadaten ab, die von einer dezentralisierten Community gesammelt wurden](https://www.dclimate.net/) +- [DeSci Foundation: Entwickler von DeSci-Veröffentlichungstools](https://descifoundation.org/) +- [DeSci.World: One-Stop-Shop für Benutzer, um dezentralisierte Wissenschaft zu betrachten und sich daran zu beteiligen](https://desci.world) +- [OceanDAO: DAO-gesteuerte Finanzierung für datenbezogene Wissenschaft](https://oceanprotocol.com/) +- [Opscientia: offene dezentralisierte Wissenschafts-Workflows](https://opsci.io/research/) +- [Bio.xyz: Lassen Sie sich für Ihre Biotech-DAO oder Ihr DeSci-Projekt finanzieren](https://www.bio.xyz/) - [Active Inference Institute](https://www.activeinference.org/) -- [IdeaMarkets: Ermöglicht dezentralisierte wissenschaftliche Glaubwürdigkeit](https://ideamarket.io/) +- [IdeaMarkets: Ermöglichung dezentralisierter wissenschaftlicher Glaubwürdigkeit](https://ideamarket.io/) - [DeSci Labs](https://www.desci.com/) -- [ValleyDAO: eine offene, globale Gemeinschaft, die Geldmittel und translationale Unterstützung für die Forschung von synthetischer Biologie bietet](https://www.valleydao.bio) -- [Cerebrum DAO: Sourcing- und Nurturing-Lösungen, um Gehirn-Fitness voranzubringen und Neurodegeneration vorzubeugen](https://www.cerebrumdao.com/) -- [CryoDAO: Förderung von Mondflug-Forschung im Feld von Kältekonservierung](https://www.cryodao.org) +- [ValleyDAO: eine offene, globale Community, die Finanzierung und translationale Unterstützung für die Forschung in der synthetischen Biologie bietet](https://www.valleydao.bio) +- [Cerebrum DAO: Beschaffung und Förderung von Lösungen zur Förderung der Gehirngesundheit und zur Vorbeugung von Neurodegeneration](https://www.cerebrumdao.com/) +- [CryoDAO: Finanzierung von Moonshot-Forschung im Bereich der Kryokonservierung](https://www.cryodao.org) +- [Elata: die Plattform, auf der Ihr Gehirn alltägliche Apps antreibt](https://www.elata.bio/) -Wir freuen uns über Vorschläge für neue Projekte, die in die Liste aufgenommen werden sollen – bitte lesen Sie dazu unsere [Listing Policy](/contributing/adding-desci-projects/)! +Wir freuen uns über Vorschläge für neue Projekte, die aufgelistet werden sollen – bitte lesen Sie unsere [Auflistungsrichtlinie](/contributing/adding-desci-projects/), um loszulegen! -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [DeSci Wiki von Jocelynn Pearl und Ultrarare](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#) -- [Ein Leitfaden für die dezentrale Biotechnologie von Jocelynn Perl für die Zukunft von a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) -- [Die Argumente für DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) -- [Anleitung zu DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Dezentralisierte Wissenschaftsressourcen](https://www.vincentweisser.com/desci) -- [Die Biopharma-IP-NFTs von Molecule – Eine technische Beschreibung](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) -- [Aufbau zuverlässiger Wissenschaftssysteme von Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) -- [Paul Kohlhaas – DeSci: die Zukunft der dezentralisierten Wissenschaft (Podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) -- [Eine aktive Inferenz-Ontologie für die dezentralisierte Wissenschaft: von aufgestellten Sensemaking bis zu den epistemischen Commons](https://zenodo.org/record/6320575) -- [DeSci: die Zukunft der Forschung von Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) -- [Science Funding (Epilog: DeSci und neue Kryptoprimitive) von Nadia](https://nadia.xyz/science-funding) -- [Dezentralisierung ist eine Dezentralisierung der Arzneimittelentwicklung](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [Ein Leitfaden für dezentralisierte Biotech von Jocelynn Pearl für a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) +- [Das Argument für DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) +- [Leitfaden zu DeSci](https://future.com/what-is-decentralized-science-aka-desci/) +- [Ressourcen zur dezentralisierten Wissenschaft](https://www.vincentweisser.com/desci) +- [Molecule’s Biopharma IP-NFTs - Eine technische Beschreibung](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) +- [Aufbau vertrauensloser Wissenschaftssysteme von Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) +- [Paul Kohlhaas - DeSci: Die Zukunft der dezentralisierten Wissenschaft (Podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) +- [Eine Active Inference Ontologie für dezentralisierte Wissenschaft: von situierter Sinnstiftung zu den epistemischen Gemeingütern](https://zenodo.org/record/6320575) +- [DeSci: Die Zukunft der Forschung von Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) +- [Wissenschaftsfinanzierung (Epilog: DeSci und neue Krypto-Primitive) von Nadia](https://nadia.xyz/science-funding) +- [Dezentralisierung stört die Arzneimittelentwicklung](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [Was ist DeSci – Dezentralisierte Wissenschaft?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/) ### Videos {#videos} -- [Was ist die dezentralisierte Wissenschaft?](https://www.youtube.com/watch?v=-DeMklVWNdA) -- [Gespräch zwischen Vitalik Buterin und dem Wissenschaftler Aubrey de Grey über den Schnittpunkt der Langlebigkeitsforschung und Kryptographie](https://www.youtube.com/watch?v=x9TSJK1widA) -- [Wissenschaftliche Veröffentlichung ist kaputt. Kann Web3 das reparieren?](https://www.youtube.com/watch?v=WkvzYgCvWj8) -- [Juan Benet - DeSci, unabhängige Labore und datenintensive Wissenschaft im großen Maßstab](https://www.youtube.com/watch?v=zkXM9H90g_E) -- [Sebastian Brunemeier – Wie DeSci die biomedizinische Forschung verändern kann & Risikokapital](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [Was ist dezentralisierte Wissenschaft?](https://www.youtube.com/watch?v=-DeMklVWNdA) +- [Gespräch zwischen Vitalik Buterin und dem Wissenschaftler Aubrey de Grey über die Schnittstelle von Langlebigkeitsforschung und Krypto](https://www.youtube.com/watch?v=x9TSJK1widA) +- [Wissenschaftliches Publizieren ist kaputt. Kann Web3 es reparieren?](https://www.youtube.com/watch?v=WkvzYgCvWj8) +- [Juan Benet - DeSci, unabhängige Labore & groß angelegte Datenwissenschaft](https://www.youtube.com/watch?v=zkXM9H90g_E) +- [Sebastian Brunemeier - Wie DeSci die biomedizinische Forschung & Risikokapital transformieren kann](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [Paige Donner - Werkzeuge für Open Science mit Web3 & der Blockchain](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/accounts/index.md b/public/content/translations/de/developers/docs/accounts/index.md index 80ce328c50d..8a5facca8c2 100644 --- a/public/content/translations/de/developers/docs/accounts/index.md +++ b/public/content/translations/de/developers/docs/accounts/index.md @@ -1,81 +1,82 @@ --- title: Ethereum-Konten -description: Eine Erklärung der Ethereum-Konten – ihre Datenstrukturen und ihre Beziehung zur Schlüsselpaar-Kryptografie. +description: "Eine Erklärung von Ethereum-Konten – ihre Datenstrukturen und ihre Beziehung zur Schlüsselpaar-Kryptografie." lang: de --- -Ein Ethereum-Konto ist eine Entität mit einem Ether(ETH)-Guthaben, welche Transaktionen bei Ethereum durchführen kann. Konten können benutzerkontrolliert oder als intelligenter Vertrag bereitgestellt werden. +Ein [Ethereum](/)-Konto ist eine Entität mit einem Ether-Guthaben (ETH), die Nachrichten auf Ethereum senden kann. Konten können benutzergesteuert sein oder als Smart Contracts bereitgestellt werden. ## Voraussetzungen {#prerequisites} -Als Vorbereitung auf die Inhalte dieser Seite empfehlen wir Ihnen, zunächst unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um Ihnen zu helfen, diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Kontotypen {#types-of-account} Ethereum hat zwei Kontotypen: -- Konten im externen Besitz (EOA) – kontrolliert von jeder beliebigen Person mit den privaten Schlüsseln -- Vertragskonto – ein auf dem Netwerk eröffneter Smart Contract, gesteuert durch Code. Erfahre mehr über [intelligente Verträge](/developers/docs/smart-contracts/). +- Extern verwaltetes Konto (Externally-owned account, EOA) – kontrolliert von jedem, der die Private-Keys besitzt +- Vertragskonto (Contract account) – ein im Netzwerk bereitgestellter Smart Contract, der durch Code gesteuert wird. Erfahren Sie mehr über [Smart Contracts](/developers/docs/smart-contracts/) -Beide Kontotypen haben die Möglichkeit +Beide Kontotypen haben die Fähigkeit: -- ETH und Token zu empfangen, zu halten und zu versenden, -- mit bereitgestellten, intelligenten Verträgen zu interagieren. +- ETH und Token zu empfangen, zu halten und zu senden +- Mit bereitgestellten Smart Contracts zu interagieren -### Wesentliche Unterschiede {#key-differences} +### Hauptunterschiede {#key-differences} -**Externer Besitz** +**Extern verwaltet** -- Die Erstellung eines Kontos ist kostenlos. +- Die Erstellung eines Kontos kostet nichts - Kann Transaktionen initiieren -- Transaktionen zwischen fremden Konten können nur ETH/Token-Transfers sein. -- Bestehend aus einem kryptografischen Schlüsselpaar:öÖffentliche und private Schlüssel, die Kontoaktivitäten steuern +- Transaktionen zwischen extern verwalteten Konten können nur ETH-/Token-Überweisungen sein +- Besteht aus einem kryptografischen Schlüsselpaar: Public- und Private-Keys, die die Kontoaktivitäten steuern -**Vertrag** +**Vertrag (Contract)** -- Die Erstellung eines Vertrags ist mit Kosten verbunden, da diese Netzwerkspeicher verwenden. -- Transaktionen können nur als Antwort auf den Erhalt einer Transaktion gesendet werden. -- Transaktionen von einem externen Konto auf ein Vertragskonto können einen Code auslösen, der viele verschiedene Aktionen ausführt, z. B. die Übertragung von Token oder sogar die Erstellung eines neuen Vertrags. -- Vertragskonten haben keine privaten Schlüssel. Stattdessen werden sie durch die Logik vom Smart Contract Code gesteuert. +- Die Erstellung eines Vertrags ist mit Kosten verbunden, da Sie Netzwerkspeicherplatz nutzen +- Kann Nachrichten nur als Reaktion auf den Empfang einer Transaktion senden +- Transaktionen von einem externen Konto an ein Vertragskonto können Code auslösen, der viele verschiedene Aktionen ausführen kann, wie z. B. die Überweisung von Token oder sogar die Erstellung eines neuen Vertrags +- Vertragskonten haben keine Private-Keys. Stattdessen werden sie durch die Logik des Smart-Contract-Codes gesteuert -## Analyse eines Kontos {#an-account-examined} +## Ein Konto im Detail {#an-account-examined} -Ethereum-Konten haben vier Bereiche: +Ethereum-Konten haben vier Felder: -- `Nonce` – ein Zähler, der die Anzahl der von einem externen Konto gesendeten Transaktionen oder die Anzahl der von einem Vertragskonto erstellten Verträge angibt. Für jedes Konto kann nur eine Transaktion mit einem bestimmten Nonce-Wert ausgeführt werden. Das schützt vor Wiederholungsangriffen, bei denen signierte Transaktionen wiederholt gesendet und erneut ausgeführt werden. -- `Balance` – die Anzahl von wei, die diese Adresse besitzt. Wei ist eine Stückelung der ETH und es gibt 1e+18 wei pro ETH. -- `codeHash` – Dieser Hash bezieht sich auf den _code_ eines Kontos auf der Ethereum Virtual Machine (EVM). In Vertragskonten sind Codefragmente einprogrammiert, die verschiedene Operationen ausführen können. Dieser EVM-Code wird ausgeführt, wenn das Konto einen Nachrichtenaufruf erhält. Er kann im Gegensatz zu den anderen Kontofeldern nicht geändert werden. Alle diese Codefragmente werden in der Zustandsdatenbank unter den entsprechenden Hashes gespeichert und können später abgerufen werden. Dieser Hash-Wert wird als codeHash bezeichnet. Bei externen Konten ist das Feld codeHash der Hash einer leeren Zeichenfolge. -- `StorageRoot` – manchmal auch bekannt als Speicher-Hash. Ein 256-Bit-Hash des Wurzelknotens eines Merkle-Patricia-Tries, der den Speicherinhalt des Kontos codiert (eine Zuordnung zwischen 256-Bit-Integer-Werten), codiert in den Trie als eine Zuordnung vom Keccak-256-Bit-Hash der 256-Bit-Integer-Schlüssel zu den RLP-codierten 256-Bit-Integer-Werten. Dieser Trie kodiert den Hash des Speicherinhalts dieses Kontos und ist standardmäßig leer. +- `nonce` – Ein Zähler, der die Anzahl der von einem extern verwalteten Konto gesendeten Transaktionen oder die Anzahl der von einem Vertragskonto erstellten Verträge angibt. Für jedes Konto kann nur eine Transaktion mit einer bestimmten Nonce ausgeführt werden, was vor Replay-Angriffen schützt, bei denen signierte Transaktionen wiederholt gesendet und erneut ausgeführt werden. +- `balance` – Die Anzahl der Wei, die dieser Adresse gehören. Wei ist eine Stückelung von ETH und es gibt 1e+18 Wei pro ETH. +- `codeHash` – Dieser Hash bezieht sich auf den _Code_ eines Kontos auf der Ethereum Virtual Machine (EVM). In Vertragskonten sind Codefragmente einprogrammiert, die verschiedene Operationen ausführen können. Dieser EVM-Code wird ausgeführt, wenn das Konto einen Nachrichtenaufruf erhält. Er kann im Gegensatz zu den anderen Kontofeldern nicht geändert werden. Alle derartigen Codefragmente sind in der Zustandsdatenbank unter ihren entsprechenden Hashes zum späteren Abruf enthalten. Dieser Hash-Wert ist als codeHash bekannt. Bei extern verwalteten Konten ist das codeHash-Feld der Hash einer leeren Zeichenfolge. +- `storageRoot` – Manchmal auch als Speicher-Hash (Storage Hash) bezeichnet. Ein 256-Bit-Hash des Wurzelknotens eines [Merkle Patricia Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), der den Speicherinhalt des Kontos codiert (eine Zuordnung zwischen 256-Bit-Ganzzahlwerten), codiert in den Trie als Zuordnung vom Keccak-256-Bit-Hash der 256-Bit-Ganzzahlschlüssel zu den RLP-codierten 256-Bit-Ganzzahlwerten. Dieser Trie codiert den Hash des Speicherinhalts dieses Kontos und ist standardmäßig leer. -![Ein Diagramm, das die Funktionsweise eines Kontos zeigt](./accounts.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das den Aufbau eines Kontos zeigt](./accounts.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -## Externe Konten und Schlüsselpaare {#externally-owned-accounts-and-key-pairs} +## Extern verwaltete Konten und Schlüsselpaare {#externally-owned-accounts-and-key-pairs} -Ein Account besteht aus einem Paar kryptographischer Schlüssel: öffentlich und privat. Sie tragen zum Nachweis bei, dass eine Transaktion tatsächlich vom Absender unterzeichnet wurde, und verhindern Fälschungen. Deinen privaten Schlüssel verwendest du, um Transaktionen zu unterzeichnen; so gewährt er dir die Obhut über das mit deinem Konto verbundene Guthaben. Man besitzt nie wirklich Kryptowährung, sondern private Schlüssel – das Geld ist immer auf Ethereums Hauptbuch (ledger). +Ein Konto besteht aus einem Paar kryptografischer Schlüssel: Public- und Private-Key. Sie helfen zu beweisen, dass eine Transaktion tatsächlich vom Absender signiert wurde, und verhindern Fälschungen. Ihr Private-Key ist das, was Sie zum Signieren von Transaktionen verwenden, er gewährt Ihnen also die Verwahrung der mit Ihrem Konto verbundenen Gelder. Sie halten nie wirklich Kryptowährung, Sie halten Private-Keys – die Gelder befinden sich immer auf Ethereums Ledger. -Dies hindert böswillige Akteure daran, gefälschte Transaktionen zu übertragen, da du immer den Absender einer Transaktion überprüfen kannst. +Dies hindert böswillige Akteure daran, gefälschte Transaktionen zu senden, da Sie den Absender einer Transaktion immer verifizieren können. -Wenn Alice Ether von ihrem Konto an das Konto von Bob senden möchte, muss sie eine Transaktionsanfrage erstellen und zur Verifizierung an das Netzwerk senden. Ethereums Verwendung von Kryptographie mit öffentlichem Schlüssel stellt sicher, dass Alice nachweisen kann, dass sie ursprünglich die Transaktionsanfrage initiiert hat. Ohne kryptographische Mechanismen könnte Eve, ein böswilliger Akteur, einfach öffentlich eine Anfrage senden, die so aussieht wie „sende 5 ETH von Alices Konto auf Eves Konto", und niemand wäre in der Lage zu überprüfen, dass sie nicht von Alice kommt. +Wenn Alice Ether von ihrem eigenen Konto auf Bobs Konto senden möchte, muss Alice eine Transaktionsanfrage erstellen und diese zur Verifizierung an das Netzwerk senden. Ethereums Verwendung von Public-Key-Kryptografie stellt sicher, dass Alice beweisen kann, dass sie die Transaktionsanfrage ursprünglich initiiert hat. Ohne kryptografische Mechanismen könnte eine böswillige Angreiferin Eve einfach öffentlich eine Anfrage senden, die in etwa so aussieht: „Sende 5 ETH von Alices Konto an Eves Konto“, und niemand könnte verifizieren, dass sie nicht von Alice stammt. ## Kontoerstellung {#account-creation} -Wenn Sie einen Account erstellen möchten, generieren die meisten Bibliotheken einen zufälligen privaten Schlüssel für Sie. +Wenn Sie ein Konto erstellen möchten, generieren die meisten Bibliotheken Ihnen einen zufälligen Private-Key. -Ein privater Schlüssel besteht aus 64 hexadezimalen Zeichen und kann mit einem Passwort verschlüsselt werden. +Ein Private-Key besteht aus 64 Hex-Zeichen und kann mit einem Passwort verschlüsselt werden. Beispiel: `fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f` -Der öffentliche Schlüssel wird mithilfe des [Elliptic Curve Digital Signature Algorithm](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) aus dem privaten Schlüssel generiert. Du erhältst eine öffentliche Adresse für dein Konto, indem du die letzten 20 Bytes des Keccak-256-Hashes des öffentlichen Schlüssels nimmst und `0x` an den Anfang setzt. +Der Public-Key wird aus dem Private-Key unter Verwendung des [Elliptic Curve Digital Signature Algorithm](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) generiert. Sie erhalten eine öffentliche Adresse für Ihr Konto, indem Sie die letzten 20 Bytes des Keccak-256-Hashes des Public-Keys nehmen und `0x` an den Anfang setzen. -Das bedeutet, dass ein Konto in externem Besitz (EOA) eine 42-stellige Adresse hat (ein 20-Byte-Segment, das aus 40 hexadezimalen Zeichen und dem Präfix `0x` besteht). +Das bedeutet, dass ein extern verwaltetes Konto (EOA) eine 42-stellige Adresse hat (20-Byte-Segment, was 40 hexadezimalen Zeichen entspricht, plus das Präfix `0x`). Beispiel: `0x5e97870f263700f46aa00d967821199b9bc5a120` -Das folgende Beispiel zeigt, wie Sie mit dem Signatur-Tool [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) ein neues Konto erstellen. Clef ist ein Kontenverwaltungs- und Signierungs-Tool, das zusammen mit dem Ethereum-Client [Geth](https://geth.ethereum.org) erhältlich ist. Der Befehl `clef newaccount` erstellt ein neues Schlüsselpaar und speichert es in einem verschlüsselten Schlüsselspeicher. +Das folgende Beispiel zeigt, wie man ein Signatur-Tool namens [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) verwendet, um ein neues Konto zu generieren. Clef ist ein Kontoverwaltungs- und Signatur-Tool, das mit der Ethereum-Anwendung [Geth](https://geth.ethereum.org) gebündelt ist. Der Befehl `clef newaccount` erstellt ein neues Schlüsselpaar und speichert es in einem verschlüsselten Keystore. ``` > clef newaccount --keystore @@ -90,47 +91,47 @@ WARN [10-28|16:19:09.306] Please remember your password! Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120 ``` -[Dokumentation für Geth](https://geth.ethereum.org/docs) +[Geth-Dokumentation](https://geth.ethereum.org/docs) -Es ist möglich, neue öffentliche Schlüssel von deinem privaten Schlüssel abzuleiten, aber nicht, einen privaten Schlüssel von öffentlichen Schlüsseln abzuleiten. Es ist unabdingbar, Ihren privaten Schlüssel sicher aufzubewahren und – wie der Name schon sagt – **PRIVAT** zu halten. +Es ist möglich, neue Public-Keys aus Ihrem Private-Key abzuleiten, aber Sie können keinen Private-Key aus Public-Keys ableiten. Es ist von entscheidender Bedeutung, Ihre Private-Keys sicher und, wie der Name schon sagt, **PRIVAT** zu halten. -Du benötigst einen privaten Schlüssel, um Nachrichten und Transaktionen zu signieren, die eine Signatur nach außen anzeigen. Andere können dann die Unterschrift verwenden, um deinen öffentlichen Schlüssel abzuleiten und den Autor der Nachricht zu verifizieren. In Ihrer Anwendung können Sie eine JavaScript-Bibliothek nutzen, um Transaktionen zum Netzwerk zu senden. +Sie benötigen einen Private-Key, um Nachrichten und Transaktionen zu signieren, die eine Signatur ausgeben. Andere können dann die Signatur nehmen, um Ihren Public-Key abzuleiten und so den Autor der Nachricht zu beweisen. In Ihrer Anwendung können Sie eine JavaScript-Bibliothek verwenden, um Transaktionen an das Netzwerk zu senden. ## Vertragskonten {#contract-accounts} -Vertragskonten haben eine 42-stellige, hexadezimale Adresse: +Vertragskonten haben ebenfalls eine 42-stellige hexadezimale Adresse: Beispiel: `0x06012c8cf97bead5deae237070f9587f8e7a266d` -Die Vertragsadresse wird in der Regel angegeben, wenn ein Vertrag an die Ethereum Blockchain versendet wird. Diese Adresse stammt von der Erstelleradresse und der Anzahl der Transaktionen, die von dieser Adresse versendet werden (die „nonce“). +Die Vertragsadresse wird normalerweise vergeben, wenn ein Vertrag auf der Ethereum-Blockchain bereitgestellt wird. Die Adresse ergibt sich aus der Adresse des Erstellers und der Anzahl der von dieser Adresse gesendeten Transaktionen (der „Nonce“). -## Schlüssel für Validatoren {#validators-keys} +## Validator-Schlüssel {#validators-keys} -Es gibt einen weiteren Schlüsseltyp in Ethereum, der mit dem Wechsel von Proof-of-Work zu Proof-of-Stake für den Konsensmechanismus eingeführt wurde. Dieser nennt sich BLS-Schlüssel und wird verwendet, um Validatoren zu identifizieren. Diese Schlüssel lassen sich sehr effizient aggregieren, um die Bandbreite zu reduzieren, die das Netzwerk benötigt, um einen Konsens zu erzielen. Ohne diese Schlüsselaggregation wäre der minimale Stake für Validatoren viel höher. +Es gibt auch eine andere Art von Schlüssel in Ethereum, die eingeführt wurde, als Ethereum vom Proof-of-Work- zum Proof-of-Stake-basierten Konsens wechselte. Dies sind „BLS“-Schlüssel und sie werden verwendet, um Validatoren zu identifizieren. Diese Schlüssel können effizient aggregiert werden, um die Bandbreite zu reduzieren, die das Netzwerk benötigt, um zu einem Konsens zu gelangen. Ohne diese Schlüsselaggregation wäre der Mindesteinsatz für einen Validator viel höher. -[Mehr über Schlüssel für Validatoren](/developers/docs/consensus-mechanisms/pos/keys/). +[Mehr zu Validator-Schlüsseln](/developers/docs/consensus-mechanisms/pos/keys/). -## Ein Hinweis zu Wallets {#a-note-on-wallets} +## Eine Anmerkung zu Wallets {#a-note-on-wallets} -Ein Konto ist kein Wallet. Eine Wallet ist eine Schnittstelle oder Anwendung, die Sie mit Ihrem Ethereum-Konto interagieren lässt, sei es ein Konto in externem Besitz oder ein Vertragskonto. +Ein Konto ist kein Wallet. Ein Wallet ist eine Schnittstelle oder Anwendung, mit der Sie mit Ihrem Ethereum-Konto interagieren können, entweder einem extern verwalteten Konto oder einem Vertragskonto. ## Eine visuelle Demo {#a-visual-demo} -Austin führt Sie durch Hash-Funktionen und Schlüsselpaare. +Sehen Sie sich an, wie Austin Sie durch Hash-Funktionen und Schlüsselpaare führt. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ethereum Accounts verstehen](https://info.etherscan.com/understanding-ethereum-accounts/) – Etherscan +- [Ethereum-Konten verstehen](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan -_Gibt es Community-Resourcen, die Sie hilfreich fanden? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Smart Contracts](/developers/docs/smart-contracts/) -- [Transaktionen](/developers/docs/transactions/) +- [Transaktionen](/developers/docs/transactions/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/apis/backend/index.md b/public/content/translations/de/developers/docs/apis/backend/index.md index f3d7e4a2b8b..242aa925a2e 100644 --- a/public/content/translations/de/developers/docs/apis/backend/index.md +++ b/public/content/translations/de/developers/docs/apis/backend/index.md @@ -1,162 +1,166 @@ --- title: Backend-API-Bibliotheken -description: Eine Einführung in die Ethereum-Client-APIs, über die Sie mit der Blockchain Ihrer Anwendung interagieren können. +description: "Eine Einführung in die Ethereum-Client-APIs, mit denen Sie von Ihrer Anwendung aus mit der Blockchain interagieren können." lang: de --- -Damit eine Softwareanwendung mit der Ethereum-Blockchain interagieren kann (z. B. Lesen von Blockchain-Daten und/oder Senden von Transaktionen an das Netzwerk), muss es sich mit einem Ethereum-Knoten verbinden. +Damit eine Softwareanwendung mit der [Ethereum](/)-Blockchain interagieren kann (d. h. Blockchain-Daten lesen und/oder Transaktionen an das Netzwerk senden), muss sie sich mit einem Ethereum-Blockchain-Knoten verbinden. -Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, sodass eine einheitliche Sammlung von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) zur Verfügung steht, auf die Anwendungen sich verlassen können. +Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, sodass es eine einheitliche Reihe von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) gibt, auf die sich Anwendungen verlassen können. -Wenn Sie eine bestimmte Programmiersprache verwenden möchten, um sich mit einem Ethereum-Knoten zu verbinden, können Sie auf eine der komfortablen Bibliotheken in diesem Ökosystem zurückgreifen, die Ihnen das Leben erleichtern. Mit diesen Programmbibliotheken können Entwickler intuitive, einzeilige Methoden schreiben, um JSON-RPC-Anfragen („unter der Haube“) zu initialisieren, die mit Ethereum interagieren. +Wenn Sie eine bestimmte Programmiersprache verwenden möchten, um sich mit einem Ethereum-Blockchain-Knoten zu verbinden, gibt es im Ökosystem viele praktische Bibliotheken, die dies erheblich erleichtern. Mit diesen Bibliotheken können Entwickler intuitive, einzeilige Methoden schreiben, um (im Hintergrund) JSON-RPC-Anfragen zu initialisieren, die mit Ethereum interagieren. ## Voraussetzungen {#prerequisites} -Es könnte hilfreich sein, den [Ethereum-Stack](/developers/docs/ethereum-stack/) und die [Ethereum-Clients](/developers/docs/nodes-and-clients/) zu verstehen. +Es könnte hilfreich sein, den [Ethereum-Stack](/developers/docs/ethereum-stack/) und [Ethereum-Clients](/developers/docs/nodes-and-clients/) zu verstehen. ## Warum eine Bibliothek verwenden? {#why-use-a-library} -Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte Interaktion mit einem Ethereum-Knoten. Zudem bieten sie auch Dienstprogrammfunktionen (z. B. ETH in GWei umwandeln), so dass Sie als Entwickler weniger Zeit mit den Problemstellungen der Ethereum-Clients verbringen müssen und sich stärker auf die einzigartige Funktion Ihrer Anwendung konzentrieren können. +Diese Bibliotheken abstrahieren einen Großteil der Komplexität, die mit der direkten Interaktion mit einem Ethereum-Blockchain-Knoten einhergeht. Sie bieten auch Hilfsfunktionen (z. B. die Umrechnung von ETH in Gwei), sodass Sie als Entwickler weniger Zeit mit den Feinheiten von Ethereum-Clients verbringen müssen und sich mehr auf die einzigartige Funktionalität Ihrer Anwendung konzentrieren können. ## Verfügbare Bibliotheken {#available-libraries} -### Infrastruktur- und Knoten-Dienste {#infrastructure-and-node-services} +### Infrastruktur und Blockchain-Knoten-Dienste {#infrastructure-and-node-services} -**Alchemy-****_Ehereum-Entwicklungsplattform_** +**Alchemy -** **_Ethereum-Entwicklungsplattform._** - [alchemy.com](https://www.alchemy.com/) -- [Dokumentation](https://docs.alchemy.com/) +- [Dokumentation](https://www.alchemy.com/docs/) - [GitHub](https://github.com/alchemyplatform) - [Discord](https://discord.com/invite/alchemyplatform) - -**All That Node –** **_Node-as-a-Service._** + +**All That Node -** **_Node-as-a-Service._** - [All That Node.com](https://www.allthatnode.com/) - [Dokumentation](https://docs.allthatnode.com) - [Discord](https://discord.gg/GmcdVEUbJM) -**Blast by Bware Labs -** **_Dezentrale APIs für Ethereum Mainnet und Testnetzwerke._** +**Blast von Bware Labs -** **_Dezentralisierte APIs für das Ethereum-Mainnet und Testnets._** - [blastapi.io](https://blastapi.io/) - [Dokumentation](https://docs.blastapi.io) -- [Discord](https://discord.gg/bwarelabs) +- [Discord](https://discord.gg/SaRqmRUjjQ) -**BlockPi -** **_Bereitstellung von effizienteren und schnellen RPC-Diensten_** +**BlockPi -** **_Bietet effizientere und schnellere RPC-Dienste_** - [blockpi.io](https://blockpi.io/) - [Dokumentation](https://docs.blockpi.io/) - [GitHub](https://github.com/BlockPILabs) - [Discord](https://discord.com/invite/xTvGVrGVZv) -**Cloudflare-Ethereum-Gateway.** +**Cloudflare Ethereum Gateway.** - [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/) -**Etherscan – Blockexplorer und Transaktions-API** +**Etherscan - Blocksuchmaschine und Transaktions-APIs** - [Dokumentation](https://docs.etherscan.io/) -**GetBlock-** **_Blockchain als Dienstleistung für Web3-Entwicklung_** +**Blockscout - Open-Source-Blocksuchmaschine** +- [Dokumentation](https://docs.blockscout.com/) + +**GetBlock-** **_Blockchain-as-a-Service für die Web3-Entwicklung_** - [GetBlock.io](https://getblock.io/) -- [Dokumentation](https://getblock.io/docs/) +- [Dokumentation](https://docs.getblock.io/) -**Infura –** **_Die Ethereum-API als Dienst_** +**Infura -** **_Die Ethereum-API as a Service._** - [infura.io](https://infura.io) - [Dokumentation](https://docs.infura.io/api) - [GitHub](https://github.com/INFURA) -**Node RPC – _kostengünstiger EVM-JSON-RPC-Anbieter_** +**Node RPC - _Kostengünstiger EVM-JSON-RPC-Anbieter_** - [noderpc.xyz](https://www.noderpc.xyz/) - [Dokumentation](https://docs.noderpc.xyz/node-rpc) -**NOWNodes - _Full Nodes und Block Explorers._** +**NOWNodes - _Vollständige Blockchain-Knoten und Blocksuchmaschinen._** - [NOWNodes.io](https://nownodes.io/) +- [Dokumentation](https://nownodes.gitbook.io/documentation) -**QuickNode –** **_Blockchain-Infrastruktur als Dienstleistung_** +**QuickNode -** **_Blockchain-Infrastruktur as a Service._** - [quicknode.com](https://quicknode.com) - [Dokumentation](https://www.quicknode.com/docs/welcome) - [Discord](https://discord.gg/quicknode) -**Rivet –** **_Ethereum- und Ethereum Classic-APIs als Service unterstützt durch Open-Source-Software_** +**Rivet -** **_Ethereum- und Ethereum-Classic-APIs as a Service, basierend auf Open-Source-Software._** - [rivet.cloud](https://rivet.cloud) - [Dokumentation](https://rivet.cloud/docs/) - [GitHub](https://github.com/openrelayxyz/ethercattle-deployment) -**Zmok –** **_geschwindigkeitsorientierte Ethereum-Nodes als JSON-RPC-/WebSockets-API_** +**Zmok -** **_Geschwindigkeitsorientierte Ethereum-Blockchain-Knoten als JSON-RPC/WebSockets-API._** - [zmok.io](https://zmok.io/) - [GitHub](https://github.com/zmok-io) - [Dokumentation](https://docs.zmok.io/) - [Discord](https://discord.gg/fAHeh3ka6s) -### Entwicklungswerkzeuge {#development-tools} +### Entwicklungstools {#development-tools} -**ethers-kt – ** **_asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains._** +**ethers-kt -** **_Asynchrone, hochleistungsfähige Kotlin/Java/Android-Bibliothek für EVM-basierte Blockchains._** - [GitHub](https://github.com/Kr1ptal/ethers-kt) - [Beispiele](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) - [Discord](https://discord.gg/rx35NzQGSb) -**Nethereum -** **_Eine Open Source .NET Integration-Library für Blockchain_** +**Nethereum -** **_Eine Open-Source-.NET-Integrationsbibliothek für die Blockchain._** - [GitHub](https://github.com/Nethereum/Nethereum) - [Dokumentation](http://docs.nethereum.com/en/latest/) - [Discord](https://discord.com/invite/jQPrR58FxX) -**Python Tooling –** **_eine Auswahl von Programmbibliotheken für Ethereum-Interaktion über Python_** +**Python-Tools -** **_Vielzahl von Bibliotheken für die Ethereum-Interaktion über Python._** -- [py.ethereum.org](https://snakecharmers.ethereum.org) +- [py.ethereum.org](https://snakecharmers.ethereum.org/) - [web3.py GitHub](https://github.com/ethereum/web3.py) - [web3.py Chat](https://gitter.im/ethereum/web3.py) -**Tatum –** **_die ultimative Blockchain-Entwicklungsplattform_** +**Tatum -** **_Die ultimative Blockchain-Entwicklungsplattform._** - [Tatum](https://tatum.io/) - [GitHub](https://github.com/tatumio/) - [Dokumentation](https://docs.tatum.io/) - [Discord](https://discord.gg/EDmW3kjTC9) -**web3j –** **_eine Java-/Android-/Kotlin-/Scala -Integrationsbibliothek für Ethereum_** +**web3j -** **_Eine Java/Android/Kotlin/Scala-Integrationsbibliothek für Ethereum._** - [GitHub](https://github.com/web3j/web3j) -- [Dokumente](https://docs.web3j.io/) +- [Dokumentation](https://docs.web3j.io/) - [Gitter](https://gitter.im/web3j/web3j) ### Blockchain-Dienste {#blockchain-services} -**BlockCypher –** **_Ethereum-Web-APIs_** +**BlockCypher -** **_Ethereum-Web-APIs._** - [blockcypher.com](https://www.blockcypher.com/) - [Dokumentation](https://www.blockcypher.com/dev/ethereum/) -**Chainbase -** **_All-in-One web3-Dateninfrastruktur für Ethereum._** +**Chainbase -** **_All-in-One-Web3-Dateninfrastruktur für Ethereum._** - [chainbase.com](https://chainbase.com/) - [Dokumentation](https://docs.chainbase.com/) - [Discord](https://discord.gg/Wx6qpqz4AF) -**Chainstack -** **_Elastische und dedizierte Ethereum-Nodes als Dienst._** +**Chainstack -** **_Elastische und dedizierte Ethereum-Blockchain-Knoten as a Service._** - [chainstack.com](https://chainstack.com) -- [Dokumentation](https://docs.chainbase.com/docs) -- [Ethereum API-Referenz](https://docs.chainstack.com/reference/ethereum-getting-started) +- [Dokumentation](https://docs.chainstack.com/) +- [Ethereum-API-Referenz](https://docs.chainstack.com/reference/ethereum-getting-started) -**Coinbase Cloud Node -** **_Blockchain Infrastruktur-API._** +**Coinbase Cloud Node -** **_Blockchain-Infrastruktur-API._** -- [Coinbase Cloud Node](https://www.coinbase.com/cloud) -- [Dokumentation](https://docs.cloud.coinbase.com/) +- [Coinbase Cloud Node](https://www.coinbase.com/developer-platform) +- [Dokumentation](https://docs.cdp.coinbase.com/) -**DataHub von Figment -** **_Web3-API-Dienste mit Ethereum-Mainnet und -Testnets_** +**DataHub von Figment -** **_Web3-API-Dienste mit dem Ethereum-Mainnet und Testnets._** - [DataHub](https://www.figment.io/) - [Dokumentation](https://docs.figment.io/) -**Moralis -** **_EVM API-Anbieter auf Unternehmensebene._** +**Moralis -** **_EVM-API-Anbieter auf Unternehmensniveau._** - [moralis.io](https://moralis.io) - [Dokumentation](https://docs.moralis.io/) @@ -164,26 +168,34 @@ Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte I - [Discord](https://moralis.io/joindiscord/) - [Forum](https://forum.moralis.io/) -**NFTPort -** **_Ethereum Daten- und Mint-APIs._** +**NFTPort -** **_Ethereum-Daten- und Prägen-APIs._** - [nftport.xyz](https://www.nftport.xyz/) - [Dokumentation](https://docs.nftport.xyz/) - [GitHub](https://github.com/nftport/) - [Discord](https://discord.com/invite/K8nNrEgqhE) -**Tokenview -** **_Die allgemeine API-Plattform für die Multi-Crypto-Blockchain._** +**Tokenview -** **_Die allgemeine Multi-Krypto-Blockchain-API-Plattform._** - [services.tokenview.io](https://services.tokenview.io/) - [Dokumentation](https://services.tokenview.io/docs?type=api) - [GitHub](https://github.com/Tokenview) -**Watchdata –** **_bietet einen einfachen und zuverlässigen API-Zugriff auf die Ethereum-Blockchain_** +**Watchdata -** **_Bietet einfachen und zuverlässigen API-Zugang zur Ethereum-Blockchain._** - [Watchdata](https://watchdata.io/) - [Dokumentation](https://docs.watchdata.io/) - [Discord](https://discord.com/invite/TZRJbZ6bdn) -**Covalent –** **_erweiterte Blockchain-APIs für über 200 Ketten._** +**Codex -** **_Echtzeit-API für angereicherte Blockchain-Daten über Dutzende von Chains hinweg._** + +- [codex.io](https://www.codex.io/) +- [Dokumentation](https://docs.codex.io) +- [Explorer](https://docs.codex.io/explore) +- [GitHub](https://github.com/Codex-Data) +- [Discord](https://discord.com/invite/mFpUhT3vAq) + +**Covalent -** **_Angereicherte Blockchain-APIs für über 200 Chains._** - [covalenthq.com](https://www.covalenthq.com/) - [Dokumentation](https://www.covalenthq.com/docs/api/) @@ -191,16 +203,16 @@ Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte I - [Discord](https://www.covalenthq.com/discord/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Blockchain-Knoten und Clients](/developers/docs/nodes-and-clients/) - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Web3js einrichten, um die Ethereum-Blockchain in JavaScript zu nutzen](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Leitfaden für die Einrichtung von web3.js in Ihrem Projekt._ -- [Aufruf eines intelligenten Vertrags mit JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Mit dem DAI-Token können Sie die Funktion „Verträge aufrufen“ mit JavaScript verwenden._ +- [Web3js einrichten, um die Ethereum-Blockchain in JavaScript zu nutzen](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Anleitung zur Einrichtung von web3.js in Ihrem Projekt._ +- [Einen Smart Contract aus JavaScript aufrufen](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Erfahren Sie anhand des DAI-Tokens, wie Sie Vertragsfunktionen mit JavaScript aufrufen._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/apis/javascript/index.md b/public/content/translations/de/developers/docs/apis/javascript/index.md index 24cde103297..276e87a3c2e 100644 --- a/public/content/translations/de/developers/docs/apis/javascript/index.md +++ b/public/content/translations/de/developers/docs/apis/javascript/index.md @@ -1,83 +1,85 @@ --- title: JavaScript-API-Bibliotheken -description: Eine Einführung in die JavaScript-Client-Bibliotheken, über die Sie von Ihrer Anwendung aus mit der Blockchain interagieren können. +description: "Eine Einführung in die JavaScript-Client-Bibliotheken, mit denen Sie von Ihrer Anwendung aus mit der Blockchain interagieren können." lang: de --- -Damit eine Web-Anwendung mit der Ethereum-Blockchain interagieren kann (z. B. Auslesen von Blockchain-Daten und/oder Senden von Transaktionen an das Netzwerk), muss sie sich mit einem Ethereum-Node verbinden. +Damit eine Web-App mit der Ethereum-Blockchain interagieren kann (d. h. Blockchain-Daten lesen und/oder Transaktionen an das Netzwerk senden), muss sie sich mit einem Ethereum-Blockchain-Knoten verbinden. -Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, damit es einen einheitlichen Satz von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) gibt, auf die sich Anwendungen verlassen können. +Zu diesem Zweck implementiert jede Ethereum-Anwendung die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, sodass es eine einheitliche Reihe von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) gibt, auf die sich Anwendungen verlassen können. -Wenn Sie sich über JavaScript mit einem Ethereum-Node verbinden möchten, ist das auch über VanillaJavaScript möglich. Doch es existieren noch weitere Lösungen in Programmbibliotheken in diesem Ökosystem, die das alles viel einfacher machen. Mit diesen Programmbibliotheken können Entwickler intuitive, einzeilige Methoden schreiben, um JSON-RPC-Anfragen („unter der Haube“) zu initialisieren, die mit Ethereum interagieren. +Wenn Sie JavaScript verwenden möchten, um sich mit einem Ethereum-Blockchain-Knoten zu verbinden, ist es möglich, reines JavaScript zu verwenden. Es gibt jedoch mehrere praktische Bibliotheken im Ökosystem, die dies viel einfacher machen. Mit diesen Bibliotheken können Entwickler intuitive, einzeilige Methoden schreiben, um JSON-RPC-Anfragen (im Hintergrund) zu initialisieren, die mit Ethereum interagieren. -Bitte beachten Sie, dass seit [der Zusammenführung](/roadmap/merge/) zwei verbundene Teile von Ethereum-Software benötigt werden, um einen Knoten zu betreiben. Ein Ausführungsclient und ein Konsensclient. Bitte stellen Sie sicher, dass Ihr Knoten sowohl über einen Ausführungs- als auch einen Konsensclient verfügt. Wenn sich Ihr Knoten nicht auf einem lokalen Rechner (Ihr Knoten läuft z. B. auf einer AWS-Instanz) befindet, müssen Sie die IP-Adressen im Tutorial entsprechend anpassen. Für weitere Informationen schauen Sie sich unsere Seite zum [Betreiben eines Knotens](/developers/docs/nodes-and-clients/run-a-node/) an. +Bitte beachten Sie, dass seit [The Merge](/roadmap/merge/) zwei verbundene Teile der Ethereum-Software – ein Ausführungs-Client und ein Konsens-Client – erforderlich sind, um einen Blockchain-Knoten auszuführen. Bitte stellen Sie sicher, dass Ihr Blockchain-Knoten sowohl einen Ausführungs- als auch einen Konsens-Client enthält. Wenn sich Ihr Blockchain-Knoten nicht auf Ihrem lokalen Computer befindet (z. B. wenn Ihr Blockchain-Knoten auf einer AWS-Instanz läuft), aktualisieren Sie die IP-Adressen im Tutorial entsprechend. Weitere Informationen finden Sie auf unserer Seite zum [Ausführen eines Blockchain-Knotens](/developers/docs/nodes-and-clients/run-a-node/). ## Voraussetzungen {#prerequisites} -Sie müssen JavaScript verstehen. Zusätzlich ist es hilfreich, wenn Sie den [Ethereum-Stack](/developers/docs/ethereum-stack/) und [Ethereum-Clients](/developers/docs/nodes-and-clients/) ebenfalls verstehen. +Neben dem Verständnis von JavaScript könnte es hilfreich sein, den [Ethereum-Stack](/developers/docs/ethereum-stack/) und [Ethereum-Anwendungen](/developers/docs/nodes-and-clients/) zu verstehen. -## Warum eine Programmbibliothek verwenden? {#why-use-a-library} +## Warum eine Bibliothek verwenden? {#why-use-a-library} -Mit diesen Programmbibliotheken lässt sich die direkte Interaktion mit einem Ethereum-Node erheblich vereinfachen. Zudem bieten sie Dienstprogrammfunktionen (z. B. Umwandlung von ETH zu GWei), so dass Sie als Entwickler weniger Zeit damit verbringen, Probleme mit Ethereum-Clients zu lösen, und sich auf die einzigartigen Funktionen Ihrer Applikation konzentrieren können. +Diese Bibliotheken abstrahieren einen Großteil der Komplexität der direkten Interaktion mit einem Ethereum-Blockchain-Knoten. Sie bieten auch Hilfsfunktionen (z. B. die Umwandlung von ETH in Gwei), sodass Sie als Entwickler weniger Zeit mit den Feinheiten von Ethereum-Anwendungen verbringen müssen und sich mehr auf die einzigartige Funktionalität Ihrer Anwendung konzentrieren können. -## Eigenschaften von Programmbibliotheken {#library-features} +## Funktionen der Bibliothek {#library-features} -### Verbindung mit Ethereum-Nodes {#connect-to-ethereum-nodes} +### Mit Ethereum-Blockchain-Knoten verbinden {#connect-to-ethereum-nodes} -Sie können sich über einen Provider und diese Bibliotheken mit Ethereum verbinden und die Daten auslesen – über JSON-RPC, INFURA, Etherscan, Alchemy oder MetaMask. +Mithilfe von Providern ermöglichen Ihnen diese Bibliotheken, sich mit Ethereum zu verbinden und dessen Daten zu lesen, sei es über JSON-RPC, INFURA, Etherscan, Alchemy oder MetaMask. -**Ether-Beispiel** +> **Warnung:** Web3.js wurde am 4. März 2025 archiviert. [Lesen Sie die Ankündigung](https://blog.chainsafe.io/web3-js-sunset/). Erwägen Sie für neue Projekte die Verwendung alternativer Bibliotheken wie [ethers.js](https://ethers.org) oder [viem](https://viem.sh). + +**Ethers-Beispiel** ```js -// Ein BrowserProvider umschließt einen standardmäßigen Web3-Provider, der -// von MetaMask als window.ethereum in jede Seite injiziert wird +// Ein BrowserProvider kapselt einen Standard-Web3-Provider, welcher +// das ist, was MetaMask als window.ethereum in jede Seite einfügt const provider = new ethers.BrowserProvider(window.ethereum) -// Das MetaMask-Plugin ermöglicht auch das Signieren von Transaktionen, um -// Ether zu senden und bezahlte Statusänderungen innerhalb der Blockchain vorzunehmen. -// Dazu benötigen wir den Unterzeichner vom Konto... +// Das MetaMask-Plugin erlaubt auch das Signieren von Transaktionen, um +// Ether zu senden und zu bezahlen, um den Zustand innerhalb der Blockchain zu ändern. +// Dafür benötigen wir den Account-Signer... const signer = provider.getSigner() ``` -**Web3j-Beispiel** +**Web3js-Beispiel** ```js var web3 = new Web3("http://localhost:8545") -// or +// oder var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")) // Provider wechseln web3.setProvider("ws://localhost:8546") -// or +// oder web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546")) -// Verwendung der IPC Provider in node.js +// Verwendung des IPC-Providers in node.js var net = require("net") -var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // mac os path +var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // Mac OS Pfad // oder var web3 = new Web3( new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net) ) // Mac OS Pfad -// in Windows ist der Pfad: "\\\\.\\pipe\\geth.ipc" -// in Linux ist der Pfad: "/users/myuser/.ethereum/geth.ipc" +// unter Windows ist der Pfad: "\\\\.\\pipe\\geth.ipc" +// unter Linux ist der Pfad: "/users/myuser/.ethereum/geth.ipc" ``` -Sobald die Einrichtung abgeschlossen ist, können Sie folgende Abfragen für die Blockchain vornehmen: +Sobald dies eingerichtet ist, können Sie die Blockchain abfragen nach: - Blocknummern -- Ressourcen-Schätzung -- Smart-Contract-Ereignisse +- Gasschätzungen +- Smart-Contract-Ereignissen - Netzwerk-ID -- und weitere... +- und mehr ... ### Wallet-Funktionalität {#wallet-functionality} -Diese Programmbibliotheken bieten Ihnen die Funktionalität, um Wallets zu erstellen, Schlüssel zu verwalten und Transaktionen zu signieren. +Diese Bibliotheken bieten Ihnen Funktionen zum Erstellen von Wallets, Verwalten von Schlüsseln und Signieren von Transaktionen. Hier ist ein Beispiel von Ethers ```js -// Erstelle eine Wallet-Instanz aus einem Mnemonik... +// Erstelle eine Wallet-Instanz aus einem Mnemonic... mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" walletMnemonic = Wallet.fromPhrase(mnemonic) @@ -88,30 +90,30 @@ walletPrivateKey = new Wallet(walletMnemonic.privateKey) walletMnemonic.address === walletPrivateKey.address // true -// Die Adresse als Promise gemäß der Signer API +// Die Adresse als Promise gemäß der Signer-API walletMnemonic.getAddress() // { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' } -// Die Wallet-Adresse ist auch synchron verfügbar +// Eine Wallet-Adresse ist auch synchron verfügbar walletMnemonic.address // '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' -// Die internen kryptographischen Komponenten +// Die internen kryptografischen Komponenten walletMnemonic.privateKey // '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db' walletMnemonic.publicKey // '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64' -// Die Wallet-Mnemonic +// Das Wallet-Mnemonic walletMnemonic.mnemonic // { -// locale: 'en', -// path: 'm/44\'/60\'/0\'/0/0', -// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol' +// locale: 'en', +// path: 'm/44\'/60\'/0\'/0/0', +// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol' // } -// Hinweis: Ein Wallet, das mit einem privaten Schlüssel erstellt wurde, hat keine -// Mnemonic (die Ableitung verhindert dies) +// Hinweis: Eine mit einem privaten Schlüssel erstellte Wallet hat +// kein Mnemonic (die Ableitung verhindert dies) walletPrivateKey.mnemonic // null @@ -128,8 +130,8 @@ tx = { walletMnemonic.signTransaction(tx) // { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' } -// Die Connect-Methode gibt eine neue Instanz des -// Wallets zurück, die mit einem Provider verbunden ist +// Die connect-Methode gibt eine neue Instanz der +// Wallet zurück, die mit einem Provider verbunden ist wallet = walletMnemonic.connect(provider) // Abfragen des Netzwerks @@ -138,33 +140,33 @@ wallet.getBalance() wallet.getTransactionCount() // { Promise: 0 } -// Ether senden +// Senden von Ether wallet.sendTransaction(tx) ``` -[Lesen Sie die ganzen Dokumente](https://docs.ethers.io/v5/api/signer/#Wallet) +[Lesen Sie die vollständige Dokumentation](https://docs.ethers.io/v5/api/signer/#Wallet) -Einmal eingerichtet, können Sie: +Sobald dies eingerichtet ist, können Sie: - Konten erstellen - Transaktionen senden - Transaktionen signieren -- und weitere... +- und mehr ... -### Mit den Funktionen von Smart Contracts interagieren {#interact-with-smart-contract-functions} +### Mit Smart-Contract-Funktionen interagieren {#interact-with-smart-contract-functions} -JavaScript-Client-Bibliotheken ermöglichen Ihrer Anwendung, Smart Contract-Funktionen aufzurufen. Dafür lesen sie die Application Binary Interface (ABI) eines kompilierten Vertrags. +JavaScript-Client-Bibliotheken ermöglichen es Ihrer Anwendung, Smart-Contract-Funktionen aufzurufen, indem sie das Application Binary Interface (ABI) eines kompilierten Vertrags lesen. -Die ABI erklärt im Wesentlichen die Funktionen des Vertrags im JSON-Format und erlaubt die Verwendung wie ein normales JavaScript-Objekt. +Das ABI erklärt im Wesentlichen die Funktionen des Vertrags in einem JSON-Format und ermöglicht es Ihnen, ihn wie ein normales JavaScript-Objekt zu verwenden. -Also folgender Solidity-Vertrag: +Der folgende Solidity-Vertrag: ```solidity contract Test { uint a; address d = 0x12345678901234567890123456789012; - function Test(uint testInt) { a = testInt;} + constructor(uint testInt) { a = testInt;} event Event(uint indexed b, bytes32 c); @@ -177,7 +179,7 @@ contract Test { } ``` -Würde in nachfolgendem JSON resultieren: +Würde zu folgendem JSON führen: ```json [{ @@ -206,86 +208,93 @@ Würde in nachfolgendem JSON resultieren: }] ``` -Dies bedeutet Sie können: +Das bedeutet, Sie können: -- Sie können eine Transaktion an den Smart Contract senden und seine Methode ausführen. -- Sie können eine Ressourcen-Schätzung aufrufen, für die eine Ausführungsmethode in der EVM bei Ausführung erforderlich wird. -- Sie können einen Vertrag bereitstellen. -- Und mehr... +- Eine Transaktion an den Smart Contract senden und seine Methode ausführen +- Einen Aufruf tätigen, um das Gas zu schätzen, das eine Methodenausführung bei der Ausführung in der Ethereum Virtual Machine benötigt +- Einen Vertrag bereitstellen +- Und mehr ... -### Dienstprogrammfunktionen {#utility-functions} +### Hilfsfunktionen {#utility-functions} -Die Dienstprogrammfunktionen stellen Ihnen praktische Verknüpfungen bereit, die das Entwickeln mit Ethereum erleichtern. +Hilfsfunktionen bieten Ihnen praktische Verknüpfungen, die das Entwickeln mit Ethereum etwas einfacher machen. -ETH-Werte sind standardmäßig in Wei. 1 ETH = 1.000.000.000.000.000.000.000.000 WEI – sprich, Sie haben es mit vielen Zahlen zu tun. `web3.utils.toWei` konvertiert für Sie Ether in Wei. +ETH-Werte sind standardmäßig in Wei angegeben. 1 ETH = 1.000.000.000.000.000.000 WEI – das bedeutet, Sie haben es mit vielen Zahlen zu tun! `web3.utils.toWei` wandelt Ether für Sie in Wei um. -Das sieht in Ether wie folgt aus: +Und in Ethers sieht das so aus: ```js -// Holen Sie sich das Guthaben eines Kontos (über Adresse oder ENS-Name) -Guthaben = provider.getBalance("Ethers. th") -// // { BigNumber: "2337132817842795605" } +// Abrufen des Guthabens eines Accounts (über Adresse oder ENS-Namen) +balance = await provider.getBalance("ethers.eth") +// { BigNumber: "2337132817842795605" } // Oft müssen Sie die Ausgabe für den Benutzer formatieren, -// dieser bevorzugt die Werte lieber in Ether (anstatt Wei) +// der es vorzieht, Werte in Ether (anstelle von Wei) zu sehen ethers.utils.formatEther(balance) // '2.337132817842795605' ``` -- [Web3js-Dienstprogrammfunktionen](https://docs.web3js.org/api/web3-utils) -- [Ethers-Dienstprogrammfunktionen](https://docs.ethers.io/v5/api/utils/) +- [Web3js-Hilfsfunktionen](https://docs.web3js.org/api/web3-utils) +- [Ethers-Hilfsfunktionen](https://docs.ethers.org/v6/api/utils/) -## Verfügbare Programmbibliotheken {#available-libraries} +## Verfügbare Bibliotheken {#available-libraries} -**Web3.js –** **_Ethereum-JavaScript-API_** +**Web3.js –** **_Ethereum-JavaScript-API._** -- [Dokumentation](https://docs.web3js.org/) -- [GitHub](https://github.com/ethereum/web3.js/) +- [Dokumentation](https://docs.web3js.org) +- [GitHub](https://github.com/ethereum/web3.js) -**Ethers.js –** **_Eine vollständige Ethereum-Wallet-Implementierung und Dienstprogramme in JavaScript und TypeScript_** +**Ethers.js –** **_Vollständige Ethereum-Wallet-Implementierung und Hilfsprogramme in JavaScript und TypeScript._** -- [Dokumentation](https://docs.ethers.io/) -- [GitHub](https://github.com/ethers-io/ethers.js/) +- [Ethers.js-Startseite](https://ethers.org/) +- [Dokumentation](https://docs.ethers.io) +- [GitHub](https://github.com/ethers-io/ethers.js) -**The Graph –** **_Ein Protokoll für die Indizierung von Ethereum- und IPFS-Daten und Abfragen mit GraphQL_** +**The Graph –** **_Ein Protokoll zur Indizierung von Ethereum- und IPFS-Daten und deren Abfrage mittels GraphQL._** -- [The Graph](https://thegraph.com/) -- [Graph Explorer](https://thegraph.com/explorer/) -- [Dokumentation](https://thegraph.com/docs/) -- [GitHub](https://github.com/graphprotocol/) +- [The Graph](https://thegraph.com) +- [Graph Explorer](https://thegraph.com/explorer) +- [Dokumentation](https://thegraph.com/docs) +- [GitHub](https://github.com/graphprotocol) - [Discord](https://thegraph.com/discord) -**light.js –** **_Eine reaktive High-Level-JS-Bibliothek, die für leichte Clients optimiert wurde._** +**Alchemy SDK –** **_Wrapper um Ethers.js mit erweiterten APIs._** -- [GitHub](https://github.com/openethereum/js-libs/tree/master/packages/light.js) +- [Dokumentation](https://www.alchemy.com/docs) +- [GitHub](https://github.com/alchemyplatform/alchemy-sdk-js) +**viem –** **_TypeScript-Schnittstelle für Ethereum._** -**Alchemyweb3 –** **_Wrapper um Web3.js mit automatischen Wiederholungen und erweiterten APIs_** - -- [Dokumentation](https://docs.alchemy.com/reference/api-overview) -- [GitHub](https://github.com/alchemyplatform/alchemy-web3) +- [Dokumentation](https://viem.sh) +- [GitHub](https://github.com/wagmi-dev/viem) -**Alchemy NFT API –** **_API für den Abruf von NFT-Daten, einschließlich Eigentumsrechten, Metadatenattributen und mehr._** +**Codex –** **_Echtzeit-API für angereicherte Blockchain-Daten über Dutzende von Chains hinweg._** -- [Dokumentation](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) -- [GitHub](https://github.com/alchemyplatform/alchemy-web3) +- [Dokumentation](https://docs.codex.io) +- [Explorer](https://docs.codex.io/explore) +- [GitHub](https://github.com/Codex-Data) +- [Discord](https://discord.com/invite/mFpUhT3vAq) -**Viem -** **_Schnittstelle in TypeScript für Ethereum._** +**Drift –** **_TypeScript-Meta-Bibliothek mit integriertem Caching, Hooks und Test-Mocks._** -- [Dokumentation](https://viem.sh) -- [GitHub](https://github.com/wagmi-dev/viem) +- [Dokumentation](https://ryangoree.github.io/drift/) +- [GitHub](https://github.com/ryangoree/drift/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} + +- [Web3js einrichten, um die Ethereum-Blockchain in JavaScript zu nutzen](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Anleitung zur Einrichtung von web3.js in Ihrem Projekt._ +- [Einen Smart Contract aus JavaScript aufrufen](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Sehen Sie am Beispiel des DAI-Tokens, wie man Vertragsfunktionen mit JavaScript aufruft._ +- [Transaktionen mit web3 und Alchemy senden](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Schritt-für-Schritt-Anleitung zum Senden von Transaktionen aus dem Backend._ + +## Tutorials: JavaScript-APIs & WebSockets auf Ethereum {#tutorials} -- [Web3js einrichten, um die Ethereum-Blockchain in JavaScript zu nutzen](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Leitfaden für die Einrichtung von web3.js in Ihrem Projekt._ -- [Aufruf eines intelligenten Vertrags mit JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Mit dem DAI-Token können Sie die Funktion „Verträge aufrufen“ mit JavaScript verwenden._ -- [Transaktionen über web3 und Alchemy senden](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Schritt-für-Schritt-Komplettlösung zum Senden von Transaktionen aus dem Backend._ +- [WebSockets verwenden](/developers/tutorials/using-websockets/) _– Wie man WebSockets mit Alchemy verwendet, um Ethereum-Ereignisse zu abonnieren und JSON-RPC-Anfragen in Echtzeit zu stellen._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/apis/json-rpc/index.md b/public/content/translations/de/developers/docs/apis/json-rpc/index.md index ad51b54df9a..9b6a6f24578 100644 --- a/public/content/translations/de/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/de/developers/docs/apis/json-rpc/index.md @@ -1,66 +1,66 @@ --- title: JSON-RPC-API -description: Ein zustandsloses, leichtgewichtiges Remote Procedure Call (RPC)-Protokoll für Ethereum-Clients +description: "Ein zustandsloses, leichtgewichtiges Remote-Procedure-Call-Protokoll (RPC) für Ethereum-Clients." lang: de --- -Damit eine Software-Anwendung mit der Ethereum-Blockchain interagieren kann – entweder um Blockchain-Daten zu lesen oder Transaktionen an das Netzwerk zu senden – muss sie mit einem Ethereum-Knoten verbunden werden. +Damit eine Softwareanwendung mit der [Ethereum](/)-Blockchain interagieren kann – sei es durch das Lesen von Blockchain-Daten oder das Senden von Transaktionen an das Netzwerk –, muss sie sich mit einem Ethereum-Blockchain-Knoten verbinden. -Zu diesem Zweck implementiert jeder [Ethereum-Client](/developers/docs/nodes-and-clients/#execution-clients) eine [JSON-RPC-Spezifikation](https://github.com/ethereum/execution-apis), sodass eine einheitliche Methode vorliegt, auf die sich Anwendungen verlassen können, unabhängig von der spezifischen Nodes oder Client Implementierung. +Zu diesem Zweck implementiert jeder [Ethereum-Client](/developers/docs/nodes-and-clients/#execution-clients) eine [JSON-RPC-Spezifikation](https://github.com/ethereum/execution-apis), sodass es eine einheitliche Reihe von Methoden gibt, auf die sich Anwendungen unabhängig von der spezifischen Blockchain-Knoten- oder Client-Implementierung verlassen können. -[JSON-RPC](https://www.jsonrpc.org/specification) ist ein zustandsloses, leichtgewichtiges Remote-Prozeduraufruf-(RPC)-Protokoll. Es definiert mehrere Datenstrukturen und die Regeln für deren Verarbeitung. Sie ist transportunabhängig, da die Konzepte innerhalb eines Prozesses, über Sockets, über HTTP oder in vielen verschiedenen Nachrichtenübermittlungsumgebungen verwendet werden können. Verwendet wird dabei das Datenformat JSON (RFC 4627). +[JSON-RPC](https://www.jsonrpc.org/specification) ist ein zustandsloses, leichtgewichtiges Remote-Procedure-Call-Protokoll (RPC). Es definiert verschiedene Datenstrukturen und die Regeln für deren Verarbeitung. Es ist transportunabhängig, da die Konzepte innerhalb desselben Prozesses, über Sockets, über HTTP oder in vielen verschiedenen Messaging-Umgebungen verwendet werden können. Es verwendet JSON (RFC 4627) als Datenformat. -## Client-Implementierungen {#client-implementations} +## Anwendungsimplementierungen {#client-implementations} -Ethereum-Clients können bei der Implementierung der JSON-RPC-Spezifikation jeweils unterschiedliche Programmiersprachen verwenden. Weitere Details zu den einzelnen Programmiersprachen finden Sie in der [Client-Dokumentation](/developers/docs/nodes-and-clients/#execution-clients). Es wird empfohlen, dass Sie sich mit den neuesten Informationen zur API-Unterstützung in der Dokumentation des jeweiligen Clients vertraut machen. +Ethereum-Anwendungen können bei der Implementierung der JSON-RPC-Spezifikation jeweils unterschiedliche Programmiersprachen verwenden. Weitere Details zu bestimmten Programmiersprachen finden Sie in der jeweiligen [Anwendungsdokumentation](/developers/docs/nodes-and-clients/#execution-clients). Wir empfehlen, die Dokumentation jeder Anwendung auf die neuesten Informationen zur API-Unterstützung zu prüfen. -## Komfortable Bibliotheken {#convenience-libraries} +## Hilfsbibliotheken {#convenience-libraries} -Es ist möglich, über die JSAON-RPC-API direkt mit Ethereum-Clients zu interagieren, doch für dApp-Entwickler gibt es häufig einfachere Optionen. Es gibt viele [JavaScript-](/developers/docs/apis/javascript/#available-libraries) und [Backend-API-](/developers/docs/apis/backend/#available-libraries) Bibliotheken, die Wrapper für die JSON-RPC-API bereitstellen. Mithilfe dieser Bibliotheken können Entwickler intuitive, einzeilige Methoden in der Programmiersprache ihrer Wahl schreiben, um JSON-RPC-Anforderungen (unter der Haube) zu initialisieren, die mit Ethereum interagieren. +Während Sie sich dafür entscheiden können, direkt über die JSON-RPC-API mit Ethereum-Clients zu interagieren, gibt es für Dapp-Entwickler oft einfachere Optionen. Es existieren viele Bibliotheken für [JavaScript](/developers/docs/apis/javascript/#available-libraries) und [Backend-APIs](/developers/docs/apis/backend/#available-libraries), die Wrapper für die JSON-RPC-API bereitstellen. Mit diesen Bibliotheken können Entwickler intuitive, einzeilige Methoden in der Programmiersprache ihrer Wahl schreiben, um (im Hintergrund) JSON-RPC-Anfragen zu initialisieren, die mit Ethereum interagieren. -## Konsensclient-APIs {#consensus-clients} +## Konsens-Client-APIs {#consensus-clients} -Diese Seite befasst sich hauptsächlich mit der JSON-RPC-API, die von Ethereum-Ausführungsclients verwendet wird. Konsensclients haben jedoch auch eine RPC-API, mit der Benutzer Informationen über den Knoten abfragen sowie Beacon-Blöcke, Beacon-Zustand und andere konsensbezogene Informationen direkt von einem Knoten anfordern können. Diese API ist auf der Webseite [Beacon API](https://ethereum.github.io/beacon-APIs/#/) dokumentiert. +Diese Seite befasst sich hauptsächlich mit der JSON-RPC-API, die von Ethereum-Ausführungs-Clients verwendet wird. Allerdings verfügen Konsens-Clients auch über eine RPC-API, die es Benutzern ermöglicht, Informationen über den Blockchain-Knoten abzufragen, Beacon-Blöcke, den Beacon-Zustand und andere konsensbezogene Informationen direkt von einem Blockchain-Knoten anzufordern. Diese API ist auf der [Beacon-API-Webseite](https://ethereum.github.io/beacon-APIs/#/) dokumentiert. -Es wird auch eine interne API für die Kommunikation zwischen Clients innerhalb eines Knotens verwendet, d. h. sie ermöglicht es dem Konsensclient und dem Ausführungsclient, Daten auszutauschen. Dies wird als „Engine API“ bezeichnet und die Spezifikationen sind auf [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) verfügbar. +Eine interne API wird auch für die Kommunikation zwischen Clients innerhalb eines Blockchain-Knotens verwendet – das heißt, sie ermöglicht es dem Konsens-Client und dem Ausführungs-Client, Daten auszutauschen. Diese wird als „Engine API“ bezeichnet und die Spezifikationen sind auf [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) verfügbar. -## Spezifikationen des Ausführungsclients {#spec} +## Ausführungs-Client-Spezifikation {#spec} -[ Lesen Sie die vollständige JSON-RPC-API-Spezifikation auf GitHub](https://github.com/ethereum/execution-apis). Diese API ist auf der [Execution API-Webseite](https://ethereum.github.io/execution-apis/api-documentation/) dokumentiert und enthält einen Inspector, mit dem Sie alle verfügbaren Methoden ausprobieren können. +[Lesen Sie die vollständige JSON-RPC-API-Spezifikation auf GitHub](https://github.com/ethereum/execution-apis). Diese API ist auf der [Webseite der Execution API](https://ethereum.github.io/execution-apis/) dokumentiert und enthält einen Inspektor, um alle verfügbaren Methoden auszuprobieren. ## Konventionen {#conventions} -### Hexadezimalwert-Kodierung {#hex-encoding} +### Hex-Wert-Codierung {#hex-encoding} -In JSON werden zwei Schlüssel-Datentypen übertragen: Roh-Byte-Arrays und Mengen. Beide werden mit einer Hex-Kodierung übertragen, haben jedoch unterschiedliche Anforderungen an das Format. +Zwei wichtige Datentypen werden über JSON übergeben: unformatierte Byte-Arrays und Mengen (Quantities). Beide werden mit einer Hex-Codierung übergeben, haben jedoch unterschiedliche Anforderungen an die Formatierung. #### Mengen {#quantities-encoding} -Wenn Mengen (Ganzzahlen, Kommazahlen) kodiert werden: Als Hexadezimalwert kodieren, ein „0x“ als Präfix hinzufügen und die kompakteste Darstellung verwenden (kleine Ausnahme: Null sollte als „0x0“ dargestellt werden). +Bei der Codierung von Mengen (Ganzzahlen, Zahlen): als Hex codieren, mit dem Präfix "0x" versehen, die kompakteste Darstellung wählen (kleine Ausnahme: Null sollte als "0x0" dargestellt werden). Hier sind einige Beispiele: -- 0x41 (entspricht Dezimalwert 65) -- 0x41 (entspricht Dezimalwert 1024) -- RICHTIG: „0x“ (sollte immer mindestens eine Ziffer enthalten - Null ist „0x0“) -- RICHTIG: „0x400“ (führende Nullen sind nicht zulässig) -- RICHTIG: „0xff“ (muss mit „0x“ prefixiert werden) +- 0x41 (65 im Dezimalsystem) +- 0x400 (1024 im Dezimalsystem) +- FALSCH: 0x (sollte immer mindestens eine Ziffer haben - Null ist "0x0") +- FALSCH: 0x0400 (keine führenden Nullen erlaubt) +- FALSCH: ff (muss das Präfix 0x haben) ### Unformatierte Daten {#unformatted-data-encoding} -Wenn unformatierte Daten kodiert werden (Byte-Arrays, Kontoadressen, Hashes, Bytecode-Arrays): Als Hex kodieren, „0x“ als Präfix hinzufügen, zwei Hex-Ziffern pro Byte. +Bei der Codierung unformatierter Daten (Byte-Arrays, Kontoadressen, Hashes, Bytecode-Arrays): als Hex codieren, mit dem Präfix "0x" versehen, zwei Hex-Ziffern pro Byte. Hier sind einige Beispiele: -- 0x41 (Größe 1, „A“) -- 0x004200 (Größe 3, „0B0“) +- 0x41 (Größe 1, "A") +- 0x004200 (Größe 3, "0B0") - 0x (Größe 0, "") -- FALSCH: 0xf0f0f (muss eine gerade Anzahl von Ziffern haben) -- FALSCH: 004200 (muss 0x als Präfix hinzufügen) +- FALSCH: 0xf0f0f (muss eine gerade Anzahl von Ziffern sein) +- FALSCH: 004200 (muss das Präfix 0x haben) -### Der Standardblockparameter {#default-block} +### Der Block-Parameter {#block-parameter} -Die folgenden Methoden haben einen zusätzlichen Standardblockparameter: +Die folgenden Methoden haben einen Block-Parameter: - [eth_getBalance](#eth_getbalance) - [eth_getCode](#eth_getcode) @@ -68,45 +68,45 @@ Die folgenden Methoden haben einen zusätzlichen Standardblockparameter: - [eth_getStorageAt](#eth_getstorageat) - [eth_call](#eth_call) -Wenn Anfragen gestellt werden, die den Zustand von Ethereum beeinflussen, bestimmt der letzte Standardblockparameter die Höhe des Blocks. +Wenn Anfragen gestellt werden, die den Zustand von Ethereum abfragen, bestimmt der angegebene Block-Parameter die Höhe des Blocks. -Folgende Optionen sind für den Standardblockparameter möglich: +Die folgenden Optionen sind für den Block-Parameter möglich: - `HEX String` - eine ganzzahlige Blocknummer -- `String „frühestes“` für den frühesten/Genesis-Block -- `String "latest"` – für den neuesten vorgeschlagenen Block -- `String „sicher“` - für den neuesten sicheren Block -- `String „finalisiert“` - für den neuesten finalisierten Block -- `String „ausstehend“` - für den ausstehenden Zustand/Transaktionen +- `String "earliest"` - für den frühesten/Genesis-Block +- `String "latest"` - für den zuletzt vorgeschlagenen Block +- `String "safe"` - für den letzten sicheren Head-Block +- `String "finalized"` - für den letzten finalisierten Block +- `String "pending"` - für den ausstehenden Zustand/Transaktionen ## Beispiele -Auf dieser Seite stellen wir Beispiele dafür bereit, wie man einzelne JSON_RPC API-Endpunkte mit dem Befehlszeilenwerkzeug [curl](https://curl.se) verwendet. Diese Beispiele für einzelne Endpunkte finden sich im Abschnitt [Curl-Beispiele](#curl-examples) unten. Weiter unten auf der Seite stellen wir auch ein [End-to-End-Beispiel](#usage-example) bereit, wie man mithilfe eines Geth-Nodes, der JSON_RPC API und curl einen Smart Contract kompiliert und bereitstellt. +Auf dieser Seite zeigen wir Beispiele, wie man einzelne JSON_RPC-API-Endpunkte mit dem Befehlszeilentool [curl](https://curl.se) verwendet. Diese Beispiele für einzelne Endpunkte finden Sie unten im Abschnitt [Curl-Beispiele](#curl-examples). Weiter unten auf der Seite bieten wir auch ein [End-to-End-Beispiel](#usage-example) für das Kompilieren und Bereitstellen eines Smart Contracts unter Verwendung eines Geth-Blockchain-Knotens, der JSON_RPC-API und curl. ## Curl-Beispiele {#curl-examples} -Beispiele zur Verwendung der JSON_RPC-API durch Ausführen von [curl](https://curl.se)-Anfragen an einem Ethereum-Knoten werden unten bereitgestellt. Jedes Beispiel enthält eine Beschreibung des spezifischen Endpunkts, seiner Parameter, seines Rückgabetyps und ein Beispiel dafür, wie es verwendet werden sollte. +Beispiele für die Verwendung der JSON_RPC-API durch [curl](https://curl.se)-Anfragen an einen Ethereum-Blockchain-Knoten werden unten bereitgestellt. Jedes Beispiel enthält eine Beschreibung des spezifischen Endpunkts, seiner Parameter, des Rückgabetyps und ein ausgearbeitetes Beispiel für seine Verwendung. -Es kann sein, dass die curl-Anfragen eine Fehlermeldung im Zusammenhang mit dem Inhaltstyp zurückgeben. Das liegt daran, dass die Option `--data` den Inhaltstyp auf `application/x-www-form-urlencoded` festlegt. Wenn Ihr Knoten sich darüber beschwert, setzen Sie den Header manuell, indem Sie am Anfang des Aufrufs `-H "Content-Type: application/json"` platzieren. In den Beispielen ist auch die URL/IP & Port-Kombination nicht enthalten, die als letztes Argument an curl übergeben werden muss (z. B. `127.0.0.1:8545`). Ein vollständiger curl-Aufruf, der diese zusätzlichen Daten enthält, hat folgende Form: +Die curl-Anfragen könnten eine Fehlermeldung bezüglich des Inhaltstyps zurückgeben. Dies liegt daran, dass die Option `--data` den Inhaltstyp auf `application/x-www-form-urlencoded` setzt. Wenn Ihr Blockchain-Knoten dies beanstandet, setzen Sie den Header manuell, indem Sie `-H "Content-Type: application/json"` an den Anfang des Aufrufs setzen. Die Beispiele enthalten auch nicht die Kombination aus URL/IP und Port, die das letzte Argument für curl sein muss (z. B. `127.0.0.1:8545`). Eine vollständige curl-Anfrage einschließlich dieser zusätzlichen Daten hat die folgende Form: ```shell curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545 ``` -## Kommunikation, Zustand, Verlauf {#gossip-state-history} +## Gossip, Zustand, Historie {#gossip-state-history} -Eine Handvoll Kernmethoden von JSON-RPC erfordern Daten aus dem Ethereum-Netzwerk und gehören in drei Hauptkategorien: _Kommunikation, Zustand, Verlauf_. Verwenden Sie die Links in diesen Abschnitten, um zu jeder Methode zu springen, oder verwenden Sie das Inhaltsverzeichnis, um die gesamte Liste der Methoden zu durchsuchen. +Eine Handvoll zentraler JSON-RPC-Methoden benötigt Daten aus dem Ethereum-Netzwerk und lässt sich sauber in drei Hauptkategorien einteilen: _Gossip, Zustand und Historie_. Nutzen Sie die Links in diesen Abschnitten, um zu jeder Methode zu springen, oder verwenden Sie das Inhaltsverzeichnis, um die gesamte Liste der Methoden zu erkunden. -### Kommunikationsmethoden {#gossip-methods} +### Gossip-Methoden {#gossip-methods} -> Diese Methoden verfolgen die Spitze der Blockchain. Das ist der Weg, wie Transaktionen sich im Netzwerk verbreiten, in Blöcke aufgenommen werden und wie Clients von neuen Blöcken erfahren. +> Diese Methoden verfolgen die Spitze der Chain. Auf diese Weise verbreiten sich Transaktionen im Netzwerk, finden ihren Weg in Blöcke und so erfahren Anwendungen von neuen Blöcken. - [eth_blockNumber](#eth_blocknumber) - [eth_sendRawTransaction](#eth_sendrawtransaction) ### Zustandsmethoden {#state_methods} -> Methoden, die den aktuellen Zustand aller gespeicherten Daten melden. Der „Zustand“ ist wie ein großes gemeinsames Stück RAM und enthält Kontostände, Vertragsdaten und Gasabschätzungen. +> Methoden, die den aktuellen Zustand aller gespeicherten Daten melden. Der „Zustand“ ist wie ein großer gemeinsamer Arbeitsspeicher (RAM) und umfasst Kontostände, Vertragsdaten und Gasschätzungen. - [eth_getBalance](#eth_getbalance) - [eth_getStorageAt](#eth_getstorageat) @@ -115,9 +115,9 @@ Eine Handvoll Kernmethoden von JSON-RPC erfordern Daten aus dem Ethereum-Netzwer - [eth_call](#eth_call) - [eth_estimateGas](#eth_estimategas) -### Verlaufsmethoden {#history_methods} +### Historienmethoden {#history_methods} -> Abrufen historischer Aufzeichnungen jedes Blocks bis zum Genesis-Block. Dies ist wie eine große Nur-hinzufügen-Datei, die alle Blockheaders, Blockinhalte, Onkelblöcke und Transaktionsbelege enthält. +> Ruft historische Aufzeichnungen jedes Blocks bis zum Genesis-Block ab. Dies ist wie eine große Datei, an die nur angehängt werden kann (append-only), und umfasst alle Block-Header, Block-Körper, Uncle-Blöcke und Transaktionsbelege. - [eth_getBlockTransactionCountByHash](#eth_getblocktransactioncountbyhash) - [eth_getBlockTransactionCountByNumber](#eth_getblocktransactioncountbynumber) @@ -132,30 +132,30 @@ Eine Handvoll Kernmethoden von JSON-RPC erfordern Daten aus dem Ethereum-Netzwer - [eth_getUncleByBlockHashAndIndex](#eth_getunclebyblockhashandindex) - [eth_getUncleByBlockNumberAndIndex](#eth_getunclebyblocknumberandindex) -## JSON-RPC-API-Playground +## JSON-RPC API Playground -Sie können das [Playground-Tool](https://ethereum-json-rpc.com) verwenden, um die API-Methoden zu entdecken und auszuprobieren. Es zeigt Ihnen auch, welche Methoden und Netzwerke von verschiedenen Knotenanbietern unterstützt werden. +Du kannst das [Playground-Tool](https://ethereum-json-rpc.com) verwenden, um die API-Methoden zu entdecken und auszuprobieren. Es zeigt dir auch, welche Methoden und Netzwerke von verschiedenen Anbietern von Blockchain-Knoten unterstützt werden. -## JSON-RPC API-Methoden {#json-rpc-methods} +## JSON-RPC-API-Methoden {#json-rpc-methods} -### web3_ClientVersion {#web3_clientversion} +### web3_clientVersion {#web3_clientversion} -Gibt die aktuelle Client-Version zurück. +Gibt die aktuelle Version der Anwendung zurück. **Parameter** Keine -**Rückgaben** +**Rückgabe** -`String` - Die aktuelle Client-Version +`String` - Die aktuelle Version der Anwendung **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc":"2.0", @@ -165,26 +165,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], ### web3_sha3 {#web3_sha3} -Gibt Keccak-256 (_nicht_ der standardisierte SHA3-256) von den gegebenen Daten zurück. +Gibt den Keccak-256-Hash (_nicht_ den standardisierten SHA3-256) der angegebenen Daten zurück. **Parameter** -1. `DATA` – die Daten, die in einen SHA3-Hash konvertiert werden sollen +1. `DATA` - Die Daten, die in einen SHA3-Hash konvertiert werden sollen ```js params: ["0x68656c6c6f20776f726c64"] ``` -**Rückgabewert** +**Rückgabe** -`DATA` - Das SHA3-Ergebnis des gegebenen Strings. +`DATA` - Das SHA3-Ergebnis der angegebenen Zeichenfolge. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}' -// Result +// Ergebnis { "id":64, "jsonrpc": "2.0", @@ -200,22 +200,22 @@ Gibt die aktuelle Netzwerk-ID zurück. Keine -**Rückgabewert** +**Rückgabe** `String` - Die aktuelle Netzwerk-ID. -Die vollständige Liste der aktuellen Netzwerk-IDs ist verfügbar unter [chainlist.org](https://chainlist.org). Einige häufige sind: +Die vollständige Liste der aktuellen Netzwerk-IDs ist unter [chainlist.org](https://chainlist.org) verfügbar. Einige häufige sind: - `1`: Ethereum Mainnet -- `11155111`: Sepolia Testnetz -- `560048` : Hoodi Testnetz +- `11155111`: Sepolia-Testnet +- `560048` : Hoodi-Testnet **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc": "2.0", @@ -225,22 +225,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67 ### net_listening {#net_listening} -Gibt `true` zurück, wenn der Client aktiv auf Netzwerkverbindungen hört. +Gibt `true` zurück, wenn die Anwendung aktiv auf Netzwerkverbindungen lauscht. **Parameter** Keine -**Rückgabewert** +**Rückgabe** -`Boolean` - `true`, wenn zuhörend, ansonsten `false`. +`Boolean` - `true` beim Lauschen, andernfalls `false`. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc":"2.0", @@ -250,22 +250,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id": ### net_peerCount {#net_peercount} -Gibt die Anzahl der aktuell mit dem Client verbundenen Peers zurück. +Gibt die Anzahl der Peers zurück, die derzeit mit der Anwendung verbunden sind. **Parameter** Keine -**Rückgabewert** +**Rückgabe** -`QUANTITY` - Ganzzahlwert, der die Anzahl der verbundenen Peers repräsentiert. +`QUANTITY` - Ganzzahl der Anzahl der verbundenen Peers. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' -// Result +// Ergebnis { "id":74, "jsonrpc": "2.0", @@ -275,22 +275,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id": ### eth_protocolVersion {#eth_protocolversion} -Gibt die aktuelle Ethereum-Protokollversion zurück. Beachten Sie, dass diese Methode [nicht in Geth verfügbar](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924) ist. +Gibt die aktuelle Ethereum-Protokollversion zurück. Beachten Sie, dass diese Methode [in Geth nicht verfügbar ist](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). **Parameter** Keine -**Rückgabewert** +**Rückgabe** `String` - Die aktuelle Ethereum-Protokollversion **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc": "2.0", @@ -302,21 +302,25 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[] Gibt ein Objekt mit Daten zum Synchronisierungsstatus oder `false` zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** Keine -**Rückgabewert** +**Rückgabe** -Die genauen Rückgabedaten variieren je nach Client-Implementierung. Alle Clients geben `False` zurück, wenn der Knoten nicht synchronisiert wird, und alle Clients geben die nachfolgenden Felder zurück. +Die genauen Rückgabedaten variieren zwischen den Implementierungen der Anwendung. Alle Anwendungen geben `False` zurück, wenn der Blockchain-Knoten nicht synchronisiert wird, und alle Anwendungen geben die folgenden Felder zurück. -`Object|Boolean` – ein Objekt mit Synchronisierungsstatus-Daten oder `FALSE`, wenn nicht synchronisiert wird: +`Object|Boolean`, Ein Objekt mit Synchronisierungsstatusdaten oder `FALSE`, wenn nicht synchronisiert wird: -- `startingBlock`: `QUANTITY` - Der Block, bei dem der Import begonnen hat (wird nur zurückgesetzt, nachdem die Synchronisierung ihren Kopf erreicht hat) -- `currentBlock`: `QUANTITY` - Der aktuelle Block, identisch zu eth_blockNumber +- `startingBlock`: `QUANTITY` - Der Block, bei dem der Import gestartet wurde (wird erst zurückgesetzt, nachdem die Synchronisierung ihren Kopf erreicht hat) +- `currentBlock`: `QUANTITY` - Der aktuelle Block, identisch mit eth_blockNumber - `highestBlock`: `QUANTITY` - Der geschätzte höchste Block -Die einzelnen Clients können jedoch auch zusätzliche Daten liefern. Beispielsweise gibt Geth Folgendes zurück: +Die einzelnen Anwendungen können jedoch auch zusätzliche Daten bereitstellen. Zum Beispiel gibt Geth Folgendes zurück: ```json { @@ -341,7 +345,7 @@ Die einzelnen Clients können jedoch auch zusätzliche Daten liefern. Beispielsw } ``` -Besu gibt hingegen Folgendes zurückgibt: +Wohingegen Besu Folgendes zurückgibt: ```json { @@ -357,14 +361,14 @@ Besu gibt hingegen Folgendes zurückgibt: } ``` -Weitere Einzelheiten finden Sie in der Dokumentation zu Ihrem jeweiligen Client. +Weitere Details finden Sie in der Dokumentation Ihrer spezifischen Anwendung. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -374,7 +378,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} highestBlock: '0x454' } } -// Or when not syncing +// Oder wenn nicht synchronisiert wird { "id":1, "jsonrpc": "2.0", @@ -384,22 +388,28 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} ### eth_coinbase {#eth_coinbase} -Gibt die Coinbase-Adresse des Clients zurück. +Gibt die Coinbase-Adresse der Anwendung zurück. + + + Endpunkt im Playground ausprobieren + + +> **Hinweis:** Diese Methode ist seit **v1.14.0** veraltet und wird nicht mehr unterstützt. Der Versuch, diese Methode zu verwenden, führt zu einem Fehler „Method not supported“ (Methode nicht unterstützt). **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`DATA`, 20 Byte – die aktuelle Coinbase-Adresse. +`DATA`, 20 Bytes - die aktuelle Coinbase-Adresse. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}' -// Result +// Ergebnis { "id":64, "jsonrpc": "2.0", @@ -409,22 +419,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6 ### eth_chainId {#eth_chainId} -Gibt die Ketten-ID zurück, die für das Unterzeichnen der Replay-geschützten Transaktionen verwendet wird. +Gibt die Chain-ID zurück, die zum Signieren von vor Replay-Angriffen geschützten Transaktionen verwendet wird. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`chainId` – Hexadezimalwert als String, der die Ganzzahl der aktuellen Ketten-ID repräsentiert. +`chainId`, hexadezimaler Wert als String, der die Ganzzahl der aktuellen Chain-ID darstellt. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc": "2.0", @@ -434,22 +448,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67 ### eth_mining {#eth_mining} -Gibt `true` zurück, wenn der Client aktiv neue Blöcke mint. Dies kann für Proof-of-Work-Netzwerke nur `true` zurückgeben und ist möglicherweise seit [der Zusammenführung](/roadmap/merge/) in einigen Clients nicht mehr verfügbar. +Gibt `true` zurück, wenn die Anwendung aktiv neue Blöcke schürft (Mining). Dies kann nur für Proof-of-Work-Netzwerke `true` zurückgeben und ist in einigen Anwendungen seit [dem Merge](/roadmap/merge/) möglicherweise nicht mehr verfügbar. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`Boolean` – gibt `true` zurück, wenn der Client aktiv mint, andernfalls `false`. +`Boolean` - gibt `true` zurück, wenn die Anwendung schürft, andernfalls `false`. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}' -// + { "id":71, "jsonrpc": "2.0", @@ -459,22 +477,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71} ### eth_hashrate {#eth_hashrate} -Gibt die Anzahl der Hashes pro Sekunde zurück, mit der der Knoten mint. Dies kann für Proof-of-Work-Netzwerke nur `true` zurückgeben und ist möglicherweise seit [der Zusammenführung](/roadmap/merge/) in einigen Clients nicht mehr verfügbar. +Gibt die Anzahl der Hashes pro Sekunde zurück, mit denen der Blockchain-Knoten schürft. Dies kann nur für Proof-of-Work-Netzwerke `true` zurückgeben und ist in einigen Anwendungen seit [dem Merge](/roadmap/merge/) möglicherweise nicht mehr verfügbar. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`QUANTITY` – Anzahl der Hashes pro Sekunde. +`QUANTITY` - Anzahl der Hashes pro Sekunde. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}' -// Result +// Ergebnis { "id":71, "jsonrpc": "2.0", @@ -484,22 +506,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7 ### eth_gasPrice {#eth_gasprice} -Gibt eine Schätzung des aktuellen Preises pro Gas in Wei zurück. Der Besu-Client prüft beispielsweise die letzten 100 Blöcke und gibt standardmäßig den mittleren Preis pro Gas-Einheit zurück. +Gibt eine Schätzung des aktuellen Preises pro Gas in Wei zurück. Zum Beispiel untersucht die Besu-Anwendung die letzten 100 Blöcke und gibt standardmäßig den Median-Gaspreis pro Einheit zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl des aktuellen Gas-Preises in Wei. +`QUANTITY` - Ganzzahl des aktuellen Gaspreises in Wei. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' -// Result +// Ergebnis { "id":73, "jsonrpc": "2.0", @@ -509,22 +535,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7 ### eth_accounts {#eth_accounts} -Gibt eine Liste von Adressen zurück, die dem Client gehören. +Gibt eine Liste der Adressen zurück, die der Anwendung gehören. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`Array of DATA`, 20 Byte – Adressen, die dem Client gehören. +`Array von DATA`, 20 Bytes - Adressen, die der Anwendung gehören. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -534,22 +564,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1 ### eth_blockNumber {#eth_blocknumber} -Gibt die Zahl des aktuellsten Blocks zurück. +Gibt die Nummer des neuesten Blocks zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine (None) +Keine -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl der Blocknummer, auf der sich der Client derzeit befindet. +`QUANTITY` - Ganzzahl der aktuellen Blocknummer, auf der sich die Anwendung befindet. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' -// Result +// Ergebnis { "id":83, "jsonrpc": "2.0", @@ -559,27 +593,31 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id ### eth_getBalance {#eth_getbalance} -Gibt das Guthaben des Kontos einer bestimmten Adresse zurück. +Gibt den Kontostand des Kontos an einer bestimmten Adresse zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `DATA`, 20 Bytes - Adresse, deren Guthaben überprüft werden soll. -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Bytes - Adresse, deren Kontostand überprüft werden soll. +2. `QUANTITY|TAG` - ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] ``` -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl für den aktuellen Saldo in Wei. +`QUANTITY` - Ganzzahl des aktuellen Kontostands in Wei. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -589,45 +627,50 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407 ### eth_getStorageAt {#eth_getstorageat} -Gibt den Wert aus einer Speicherposition an einer angegebenen Adresse zurück. +Gibt den Wert von einer Speicherposition an einer bestimmten Adresse zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** 1. `DATA`, 20 Bytes - Adresse des Speichers. -2. `QUANTITY` - Ganzzahlwert der Position im Speicher. -3. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY` - Ganzzahl der Position im Speicher. +3. `QUANTITY|TAG` - ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) -**Rückgaben** +**Rückgabe** -`DATA` – der Wert an dieser Speicherposition. +`DATA` - der Wert an dieser Speicherposition. -**Beispiel:** Die Berechnung der richtigen Position hängt vom abzurufenden Speicher ab. Betrachten Sie den folgenden Contract, der unter `0x295a70b2de5e3953354a6a8344e616ed314d7251` von der Adresse `0x391694e7e0b0cce554cb130d723a9d27458f9298` bereitgestellt wurde. +**Beispiel** +Die Berechnung der korrekten Position hängt vom abzurufenden Speicher ab. Betrachten Sie den folgenden Smart Contract, der unter `0x295a70b2de5e3953354a6a8344e616ed314d7251` von der Adresse `0x391694e7e0b0cce554cb130d723a9d27458f9298` bereitgestellt wurde. ``` contract Storage { uint pos0; mapping(address => uint) pos1; - function Storage() { + constructor() { pos0 = 1234; pos1[msg.sender] = 5678; } } ``` -Das Abrufen des Wertes von pos0 ist simpel: +Das Abrufen des Wertes von pos0 ist unkompliziert: ```js curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 {"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} ``` -Das Abrufen eines Elements der Karte ist schwieriger. Die Position eines Elements in der Karte wird folgendermaßen berechnet: +Das Abrufen eines Elements der Map ist schwieriger. Die Position eines Elements in der Map wird berechnet mit: ```js keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` -Das bedeutet, um den Speicher auf pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] abzurufen, müssen wir die Position folgendermaßen berechnen: +Das bedeutet, um den Speicher auf pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] abzurufen, müssen wir die Position berechnen mit: ```js keccak( @@ -638,7 +681,7 @@ keccak( ) ``` -Die Geth-Konsole, die mit der Web3-Bibliothek bereitgestellt wird, kann verwendet werden, um die Berechnung durchzuführen: +Die Geth-Konsole, die mit der web3-Bibliothek geliefert wird, kann für die Berechnung verwendet werden: ```js > var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" @@ -647,7 +690,7 @@ undefined "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" ``` -Um den Speicher nun abzurufen: +Nun zum Abrufen des Speichers: ```js curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 @@ -656,30 +699,34 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ ### eth_getTransactionCount {#eth_gettransactioncount} -Gibt die Anzahl der von einer Adresse _gesendeten_ Transaktionen zurück. +Gibt die Anzahl der Transaktionen zurück, die von einer Adresse _gesendet_ wurden. + + + Endpunkt im Playground ausprobieren + **Parameter** 1. `DATA`, 20 Bytes - Adresse. -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "latest", // state at the latest block + "latest", // Zustand beim neuesten Block ] ``` -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl der Anzahl der von dieser Adresse gesendeten Transaktionen. +`QUANTITY` - Ganzzahl der Anzahl der von dieser Adresse gesendeten Transaktionen. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -689,7 +736,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params ### eth_getBlockTransactionCountByHash {#eth_getblocktransactioncountbyhash} -Gibt die Anzahl der Transaktionen in einem Block zurück, von einem Block, der dem angegebenen Block-Hash entspricht. +Gibt die Anzahl der Transaktionen in einem Block aus einem Block zurück, der dem angegebenen Block-Hash entspricht. + + + Endpunkt im Playground ausprobieren + **Parameter** @@ -699,9 +750,9 @@ Gibt die Anzahl der Transaktionen in einem Block zurück, von einem Block, der d params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"] ``` -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl der Anzahl der Transaktionen in diesem Block. +`QUANTITY` - Ganzzahl der Anzahl der Transaktionen in diesem Block. **Beispiel** @@ -718,11 +769,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHa ### eth_getBlockTransactionCountByNumber {#eth_getblocktransactioncountbynumber} -Gibt die Anzahl der Transaktionen in einem Block zurück, der der angegebenen Blocknummer entsprechen. +Gibt die Anzahl der Transaktionen in einem Block zurück, der der angegebenen Blocknummer entspricht. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `QUANTITY|TAG` – Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). ```js params: [ @@ -730,9 +785,9 @@ params: [ ] ``` -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl der Anzahl der Transaktionen in diesem Block. +`QUANTITY` - Ganzzahl der Anzahl der Transaktionen in diesem Block. **Beispiel** @@ -749,7 +804,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNu ### eth_getUncleCountByBlockHash {#eth_getunclecountbyblockhash} -Gibt die Anzahl der Onkel in einem Block zurück, der dem angegebenen Block-Hash entspricht. +Gibt die Anzahl der Uncles in einem Block aus einem Block zurück, der dem angegebenen Block-Hash entspricht. + + + Endpunkt im Playground ausprobieren + **Parameter** @@ -759,9 +818,9 @@ Gibt die Anzahl der Onkel in einem Block zurück, der dem angegebenen Block-Hash params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"] ``` -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl für die Anzahl der Onkel in diesem Block. +`QUANTITY` - Ganzzahl der Anzahl der Uncles in diesem Block. **Beispiel** @@ -778,11 +837,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","p ### eth_getUncleCountByBlockNumber {#eth_getunclecountbyblocknumber} -Gibt die Anzahl der Onkel in einem Block zurück, der der angegebenen Blocknummer entspricht. +Gibt die Anzahl der Uncles in einem Block aus einem Block zurück, der der angegebenen Blocknummer entspricht. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `QUANTITY|TAG` – Ganzzahl einer Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `QUANTITY|TAG` - Ganzzahl einer Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -790,9 +853,9 @@ params: [ ] ``` -**Rückgaben** +**Rückgabe** -`QUANTITY` – Ganzzahl für die Anzahl der Onkel in diesem Block. +`QUANTITY` - Ganzzahl der Anzahl der Uncles in diesem Block. **Beispiel** @@ -809,12 +872,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber", ### eth_getCode {#eth_getcode} -Gibt den Code an einer angegebenen Adresse zurück. +Gibt den Code an einer bestimmten Adresse zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** 1. `DATA`, 20 Bytes - Adresse -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -823,9 +890,9 @@ params: [ ] ``` -**Rückgaben** +**Rückgabe** -`DATA` – der Code von der angegebenen Adresse. +`DATA` - der Code von der angegebenen Adresse. **Beispiel** @@ -842,27 +909,27 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA ### eth_sign {#eth_sign} -Die Unterzeichnungsmethode berechnet eine Ethereum-spezifische Signatur mit: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. +Die Sign-Methode berechnet eine Ethereum-spezifische Signatur mit: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. -Durch das Hinzufügen eines Präfixes zur Nachricht wird die berechnete Signatur als Ethereum-spezifische Signatur erkennbar. Das verhindert Missbrauch, bei dem eine bösartige dApp beliebige Daten (z. B. Transaktionen) signieren und die Signatur nutzen kann, um sich als das Opfer auszugeben. +Durch das Hinzufügen eines Präfixes zur Nachricht wird die berechnete Signatur als Ethereum-spezifische Signatur erkennbar. Dies verhindert Missbrauch, bei dem eine bösartige Dapp beliebige Daten (z. B. eine Transaktion) signieren und die Signatur verwenden kann, um sich als das Opfer auszugeben. -Hinweis: Die zum Signieren verwendete Adresse muss entsperrt sein. +Hinweis: Die Adresse, mit der signiert werden soll, muss entsperrt sein. **Parameter** 1. `DATA`, 20 Bytes - Adresse -2. `DATA`, N Bytes - Nachricht zum Signieren +2. `DATA`, N Bytes - zu signierende Nachricht -**Rückgaben** +**Rückgabe** `DATA`: Signatur **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -872,31 +939,31 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d37 ### eth_signTransaction {#eth_signtransaction} -Signiert eine Transaktion, die zu einem späteren Zeitpunkt an das Netzwerk gesendet werden kann, indem sie mit [eth_sendRawTransaction](#eth_sendrawtransaction) verwendet wird. +Signiert eine Transaktion, die zu einem späteren Zeitpunkt mit [eth_sendRawTransaction](#eth_sendrawtransaction) an das Netzwerk übermittelt werden kann. **Parameter** -1. `Objekt` - Das Transaktionsobjekt +1. `Object` - Das Transaktionsobjekt - `type`: - `from`: `DATA`, 20 Bytes - Die Adresse, von der die Transaktion gesendet wird. -- `to`: `DATA`, 20 Bytes - (Optional beim Erstellen eines neuen Vertrags) Die Adresse, an die die Transaktion gerichtet ist. -- `gas`: `MENGE` - (Optional, Standard: 90000) Ganzzahlwert des Gases, das für die Transaktionsausführung bereitgestellt wurde. Es wird ungenutztes Gas zurückgegeben. -- `gasPrice`: `QUANTITY` – (optional, Standard: noch zu bestimmen) Ganzzahl von gasPrice, die für jedes bezahlte Gas verwendet wird, in Wei. -- `value`: `QUANTITY` – (optional) Ganzzahl des Werts, der mit dieser Transaktion gesendet wird, in Wei. -- `data`: `DATA` - Der kompilierte Code eines Vertrags ODER der Hash der aufgerufenen Methode Signatur und kodierter Parameter. -- `nonce`: `QUANTITY` - (Optional) Ganzzahlwert einer Nonce. Dies ermöglicht es, eigene ausstehende Transaktionen mit der gleichen Nonce zu überschreiben. +- `to`: `DATA`, 20 Bytes - (optional beim Erstellen eines neuen Smart Contracts) Die Adresse, an die die Transaktion gerichtet ist. +- `gas`: `QUANTITY` - (optional, Standard: 90000) Ganzzahl des für die Transaktionsausführung bereitgestellten Gases. Es wird ungenutztes Gas zurückgegeben. +- `gasPrice`: `QUANTITY` - (optional, Standard: noch festzulegen) Ganzzahl des Gaspreises, der für jedes bezahlte Gas verwendet wird, in Wei. +- `value`: `QUANTITY` - (optional) Ganzzahl des mit dieser Transaktion gesendeten Wertes, in Wei. +- `data`: `DATA` - Der kompilierte Code eines Smart Contracts ODER der Hash der aufgerufenen Methodensignatur und der codierten Parameter. +- `nonce`: `QUANTITY` - (optional) Ganzzahl einer Nonce. Dies ermöglicht das Überschreiben Ihrer eigenen ausstehenden Transaktionen, die dieselbe Nonce verwenden. -**Rückgaben** +**Rückgabe** -`DATA` – das RLP-codierte Transaktionsobjekt, das vom angegebenen Konto signiert wurde. +`DATA`, Das RLP-codierte Transaktionsobjekt, das von dem angegebenen Konto signiert wurde. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}' -// Result +// Ergebnis { "id": 1, "jsonrpc": "2.0", @@ -906,19 +973,19 @@ curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction"," ### eth_sendTransaction {#eth_sendtransaction} -Erstellt eine neue Nachrichtenanruftransaktion oder eine Contract-Erstellung, wenn das Datenfeld Code enthält, und signiert sie mit dem im `from`-Feld angegebenen Konto. +Erstellt eine neue Nachrichtenaufruf-Transaktion oder eine Smart-Contract-Erstellung, wenn das Datenfeld Code enthält, und signiert sie mit dem in `from` angegebenen Konto. **Parameter** -1. `Objekt` - Das Transaktionsobjekt +1. `Object` - Das Transaktionsobjekt - `from`: `DATA`, 20 Bytes - Die Adresse, von der die Transaktion gesendet wird. -- `to`: `DATA`, 20 Bytes - (Optional beim Erstellen eines neuen Vertrags) Die Adresse, an die die Transaktion gerichtet ist. -- `gas`: `MENGE` - (Optional, Standard: 90000) Ganzzahlwert des Gases, das für die Transaktionsausführung bereitgestellt wurde. Es wird ungenutztes Gas zurückgegeben. -- `gasprice`: `QUANTITY` – (Optional, Standard: Noch zu bestimmen) Ganzzahlwert des Gaspreises, der für jedes bezahlte Gas verwendet wird. -- `Value`: `QUANTITY` - (Optional) Ganzzahlwert des mit dieser Transaktion gesendeten Werts. -- `input`: `DATA` – der kompilierte Code eines Contracts ODER der Hash der aufgerufenen Methodensignatur und der codierten Parameter. -- `nonce`: `QUANTITY` - (Optional) Ganzzahlwert einer Nonce. Dies ermöglicht es, eigene ausstehende Transaktionen mit der gleichen Nonce zu überschreiben. +- `to`: `DATA`, 20 Bytes - (optional beim Erstellen eines neuen Smart Contracts) Die Adresse, an die die Transaktion gerichtet ist. +- `gas`: `QUANTITY` - (optional, Standard: 90000) Ganzzahl des für die Transaktionsausführung bereitgestellten Gases. Es wird ungenutztes Gas zurückgegeben. +- `gasPrice`: `QUANTITY` - (optional, Standard: noch festzulegen) Ganzzahl des Gaspreises, der für jedes bezahlte Gas verwendet wird. +- `value`: `QUANTITY` - (optional) Ganzzahl des mit dieser Transaktion gesendeten Wertes. +- `input`: `DATA` - Der kompilierte Code eines Smart Contracts ODER der Hash der aufgerufenen Methodensignatur und der codierten Parameter. +- `nonce`: `QUANTITY` - (optional) Ganzzahl einer Nonce. Dies ermöglicht das Überschreiben Ihrer eigenen ausstehenden Transaktionen, die dieselbe Nonce verwenden. ```js params: [ @@ -934,18 +1001,18 @@ params: [ ] ``` -**Rückgaben** +**Rückgabe** -`DATA`, 32 Byte – der Transaktions-Hash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. +`DATA`, 32 Bytes - der Transaktions-Hash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. -Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Contract-Adresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, wenn Sie einen Contract erstellt haben. +Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Vertragsadresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, wenn Sie einen Smart Contract erstellt haben. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -955,7 +1022,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{ ### eth_sendRawTransaction {#eth_sendrawtransaction} -Erstellt eine neue Nachrichtenaufruftransaktion oder eine Contract-Erstellung für signierte Transaktionen. +Erstellt eine neue Nachrichtenaufruf-Transaktion oder eine Smart-Contract-Erstellung für signierte Transaktionen. **Parameter** @@ -967,18 +1034,18 @@ params: [ ] ``` -**Rückgaben** +**Rückgabe** -`DATA`, 32 Byte – der Transaktions-Hash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. +`DATA`, 32 Bytes - der Transaktions-Hash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. -Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Contract-Adresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, wenn Sie einen Contract erstellt haben. +Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Vertragsadresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, wenn Sie einen Smart Contract erstellt haben. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -988,31 +1055,35 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" ### eth_call {#eth_call} -Führt sofort einen neuen Nachrichtenaufruf aus, ohne eine Transaktion auf der Blockchain zu erstellen. Wird häufig für die Ausführung von Smart-Contract-Funktionen mit Leseberechtigung verwendet, zum Beispiel `balanceOf` für einen ERC-20-Contract. +Führt sofort einen neuen Nachrichtenaufruf aus, ohne eine Transaktion auf der Blockchain zu erstellen. Wird oft zum Ausführen von schreibgeschützten Smart-Contract-Funktionen verwendet, zum Beispiel `balanceOf` für einen ERC-20-Vertrag. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `Object` - Das Transaktionsaufrufobjekt +1. `Object` - Das Transaktionsaufruf-Objekt -- `from`: `DATA`, 20 Bytes - (Optional) Die Adresse, von der die Transaktion gesendet wird. -- `to`: `DATA`, 20 Bytes – Die Adresse, an die die Transaktion gerichtet ist. -- `gas`: `QUANTITY` - (Optional) Ganzzahlwert des für die Transaktionsausführung bereitgestellten Gases. eth_call verbraucht kein Gas, aber dieser Parameter kann von einigen Ausführungen benötigt werden. -- `gasprice`: `QUANTITY` - (Optional) Ganzzahlwert des Gaspreises, der für jedes bezahlte Gas verwendet wird -- `value`: `QUANTITY` - (Optional) Ganzzahlwert des mit dieser Transaktion gesendeten Werts -- `input`: `DATA` – (optional) Hash der Methodensignatur und der codierten Parameter. Einzelheiten finden Sie unter [Ethereum-Contract-ABI in der Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/abi-spec.html). +- `from`: `DATA`, 20 Bytes - (optional) Die Adresse, von der die Transaktion gesendet wird. +- `to`: `DATA`, 20 Bytes - Die Adresse, an die die Transaktion gerichtet ist. +- `gas`: `QUANTITY` - (optional) Ganzzahl des für die Transaktionsausführung bereitgestellten Gases. eth_call verbraucht null Gas, aber dieser Parameter wird möglicherweise von einigen Ausführungen benötigt. +- `gasPrice`: `QUANTITY` - (optional) Ganzzahl des Gaspreises, der für jedes bezahlte Gas verwendet wird +- `value`: `QUANTITY` - (optional) Ganzzahl des mit dieser Transaktion gesendeten Wertes +- `input`: `DATA` - (optional) Hash der Methodensignatur und der codierten Parameter. Weitere Details finden Sie unter [Ethereum Contract ABI in der Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/abi-spec.html). -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) -**Rückgaben** +**Rückgabe** -`DATA` – der Rückgabewert des ausgeführten Vertrages. +`DATA` - der Rückgabewert des ausgeführten Smart Contracts. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1022,22 +1093,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}] ### eth_estimateGas {#eth_estimategas} -Generiert und gibt eine Schätzung zurück, wie viel Gas erforderlich ist, damit die Transaktion abgeschlossen werden kann. Die Transaktion wird nicht zur Blockchain hinzugefügt. Beachten Sie, dass die Schätzung aus verschiedenen Gründen, einschließlich der EVM-Mechanik und der Leistung des Knotens, erheblich höher sein kann als die tatsächlich von der Transaktion verbrauchte Gas-Menge. +Generiert und gibt eine Schätzung zurück, wie viel Gas erforderlich ist, damit die Transaktion abgeschlossen werden kann. Die Transaktion wird nicht zur Blockchain hinzugefügt. Beachten Sie, dass die Schätzung aus verschiedenen Gründen, einschließlich EVM-Mechaniken und der Leistung des Blockchain-Knotens, deutlich höher sein kann als die tatsächlich von der Transaktion verbrauchte Gasmenge. + + + Endpunkt im Playground ausprobieren + **Parameter** -Siehe [eth_call](#eth_call)-Parameter – mit der Ausnahme, dass alle Eigenschaften optional sind. Wenn kein Gas-Limit angegeben ist, verwendet Geth das Block-Gas-Limit aus dem anstehenden Block als Obergrenze. Infolgedessen reicht die zurückgegebene Schätzung möglicherweise nicht aus, um die Abfrage/Transaktion auszuführen, wenn die Gas-Menge höher als das ausstehende Block-Gas-Limit ist. +Siehe Parameter von [eth_call](#eth_call), mit der Ausnahme, dass alle Eigenschaften optional sind. Wenn kein Gaslimit angegeben ist, verwendet Geth das Block-Gaslimit aus dem ausstehenden Block als Obergrenze. Infolgedessen reicht die zurückgegebene Schätzung möglicherweise nicht aus, um den Aufruf/die Transaktion auszuführen, wenn die Gasmenge höher ist als das Gaslimit des ausstehenden Blocks. -**Rückgaben** +**Rückgabe** -`QUANTITY` – die verbrauchte Gas-Menge. +`QUANTITY` - die verbrauchte Gasmenge. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1047,12 +1122,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see ### eth_getBlockByHash {#eth_getblockbyhash} -Gibt Informationen zu einem Block per Hash zurück. +Gibt Informationen zu einem Block anhand des Hashes zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** 1. `DATA`, 32 Bytes - Hash eines Blocks. -2. `Boolean` - Bei `true` werden die vollständigen Transaktionsobjekte zurückgegeben, bei `false` nur die Hashes der Transaktionen. +2. `Boolean` - Wenn `true`, werden die vollständigen Transaktionsobjekte zurückgegeben, wenn `false`, nur die Hashes der Transaktionen. ```js params: [ @@ -1061,41 +1140,40 @@ params: [ ] ``` -**Rückgaben** +**Rückgabe** -`Object` – ein Blockobjekt oder `null`, wenn kein Block gefunden wurde: +`Object` - Ein Blockobjekt oder `null`, wenn kein Block gefunden wurde: -- `number`: `QUANTITY` - Die Blocknummer. `null`, wenn es ein ausstehender Block ist. -- `hash`: `DATA`, 32 Bytes - Hash des Blocks. `null`, wenn es ein ausstehender Block ist. +- `number`: `QUANTITY` - die Blocknummer. `null`, wenn es sich um einen ausstehenden Block handelt. +- `hash`: `DATA`, 32 Bytes - Hash des Blocks. `null`, wenn es sich um einen ausstehenden Block handelt. - `parentHash`: `DATA`, 32 Bytes - Hash des übergeordneten Blocks. -- `nonce`: `DATA`, 8 Bytes - Hash des generierten Proof-of-Work. `null`, wenn es ein ausstehender Block ist. -- `sha3Uncles`: `DATA`, 32 Bytes - SHA3 der Onkeldaten im Block. -- `logsBloom`: `DATA`, 256 Bytes - Der Bloom-Filter für die Protokolle des Blocks. `null`, wenn es ein ausstehender Block ist. -- `TransaktionsRoot`: `DATA`, 32 Bytes - Das Stammverzeichnis der Transaktions-Trie des Blocks. -- `stateRoot`: `DATA`, 32 Bytes – Die Wurzel des endgültigen Zustands-Trie des Blocks. -- `receiptsRoot`: `DATA`, 32 Bytes - Die Wurzel des Quittungstries des Blocks. -- `miner`: `DATA`, 20 Byte – die Adresse des Begünstigten, dem die Mining-Belohnungen gegeben wurden. -- `difficulty`: `QUANTITY` - Ganzzahlwert der Schwierigkeit für diesen Block. -- `totalDifficulty`: `QUANTITY` - Ganzzahlwert der Gesamtschwierigkeit der Blockchain bis zu diesem Block. -- `extraData`: `DATA` - Das Feld „zusätzliche Daten“ dieses Blocks. -- `size`: `QUANTITY` - Ganzzahlwert der Größe dieses Blocks in Bytes. -- `gasLimit`: `QUANTITY` - Das maximal zulässige Gas in diesem Block. -- `gasUsed`: `QUANTITY` - Das insgesamt von allen Transaktionen in diesem Block verbrauchte Gas. -- `timestamp`: `QUANTITY` - Der Unix-Zeitstempel für den Zeitpunkt, zu dem der Block sortiert wurde. -- `transactions`: `Array` – Array von Transaktionsobjekten oder 32-Byte-Transaktions-Hashes, abhängig vom zuletzt angegebenen Parameter. -- `uncles`: `Array` - Array von Onkel-Hashes. +- `nonce`: `DATA`, 8 Bytes - Hash des generierten Proof-of-Work. `null`, wenn es sich um einen ausstehenden Block handelt, `0x0` für Proof-of-Stake-Blöcke (seit dem Merge) +- `sha3Uncles`: `DATA`, 32 Bytes - SHA3 der Uncles-Daten im Block. +- `logsBloom`: `DATA`, 256 Bytes - der Bloom-Filter für die Protokolle des Blocks. `null`, wenn es sich um einen ausstehenden Block handelt. +- `transactionsRoot`: `DATA`, 32 Bytes - die Wurzel des Transaktions-Tries des Blocks. +- `stateRoot`: `DATA`, 32 Bytes - die Wurzel des finalen Zustands-Tries des Blocks. +- `receiptsRoot`: `DATA`, 32 Bytes - die Wurzel des Beleg-Tries des Blocks. +- `miner`: `DATA`, 20 Bytes - die Adresse des Begünstigten, dem die Block-Belohnungen gegeben wurden. +- `difficulty`: `QUANTITY` - Ganzzahl der Schwierigkeit für diesen Block. +- `totalDifficulty`: `QUANTITY` - Ganzzahl der Gesamtschwierigkeit der Chain bis zu diesem Block. +- `extraData`: `DATA` - das Feld "extra data" dieses Blocks. +- `size`: `QUANTITY` - Ganzzahl der Größe dieses Blocks in Bytes. +- `gasLimit`: `QUANTITY` - das maximal zulässige Gas in diesem Block. +- `gasUsed`: `QUANTITY` - das gesamte verbrauchte Gas aller Transaktionen in diesem Block. +- `timestamp`: `QUANTITY` - der Unix-Zeitstempel für den Zeitpunkt, an dem der Block zusammengestellt wurde. +- `transactions`: `Array` - Array von Transaktionsobjekten oder 32-Byte-Transaktions-Hashes, abhängig vom zuletzt angegebenen Parameter. +- `uncles`: `Array` - Array von Uncle-Hashes. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}' -// Result -{ +// Ergebnis { -"jsonrpc": "2.0", -"id": 1, -"result": { + "jsonrpc": "2.0", + "id": 1, + "result": { "difficulty": "0x4ea3f27bc", "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32", "gasLimit": "0x1388", @@ -1118,18 +1196,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncles": [ ] -} + } } ``` ### eth_getBlockByNumber {#eth_getblockbynumber} -Gibt Informationen über eine Block-für-Block-Nummer zurück. +Gibt Informationen zu einem Block anhand der Blocknummer zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `QUANTITY|TAG` – Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). -2. `Boolean` - Bei `true` werden die vollständigen Transaktionsobjekte zurückgegeben, bei `false` nur die Hashes der Transaktionen. +1. `QUANTITY|TAG` - Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). +2. `Boolean` - Wenn `true`, werden die vollständigen Transaktionsobjekte zurückgegeben, wenn `false`, nur die Hashes der Transaktionen. ```js params: [ @@ -1138,12 +1220,13 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getBlockByHash](#eth_getblockbyhash) +**Rückgabe** +Siehe [eth_getBlockByHash](#eth_getblockbyhash) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}' ``` @@ -1151,7 +1234,11 @@ Ergebnis siehe [eth_getBlockByHash](#eth_getblockbyhash) ### eth_getTransactionByHash {#eth_gettransactionbyhash} -Gibt die Informationen über eine Transaktion zurück, die anhand des Transaktions-Hashs angefordert wurde. +Gibt die Informationen zu einer Transaktion zurück, die anhand des Transaktions-Hashes angefordert wurde. + + + Endpunkt im Playground ausprobieren + **Parameter** @@ -1161,31 +1248,31 @@ Gibt die Informationen über eine Transaktion zurück, die anhand des Transaktio params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] ``` -**Rückgaben** +**Rückgabe** -`Object` – ein Transaktionsobjekt oder `null`, wenn keine Transaktion gefunden wurde: +`Object` - Ein Transaktionsobjekt oder `null`, wenn keine Transaktion gefunden wurde: -- `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich diese Transaktion befand. `null`, wenn es aussteht. -- `blockNumber`: `QUANTITY` - Blocknummer, in der sich diese Transaktion befand. `null`, wenn es aussteht. -- `from`: `DATA`, 20 Bytes - Adresse des Senders. -- `gas`: `QUANTITY` - Vom Sender bereitgestelltes Gas. -- `gasPrice`: `QUANTITY` - Vom Sender bereitgestellter Gaspreis in Wei. +- `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich diese Transaktion befand. `null`, wenn sie ausstehend ist. +- `blockNumber`: `QUANTITY` - Blocknummer, in der sich diese Transaktion befand. `null`, wenn sie ausstehend ist. +- `from`: `DATA`, 20 Bytes - Adresse des Absenders. +- `gas`: `QUANTITY` - vom Absender bereitgestelltes Gas. +- `gasPrice`: `QUANTITY` - vom Absender bereitgestellter Gaspreis in Wei. - `hash`: `DATA`, 32 Bytes - Hash der Transaktion. -- `input`: `DATA` - Die mit der Transaktion gesendeten Daten. -- `nonce`: `QUANTITY` - Die Anzahl der von dem Sender vor dieser Transaktion durchgeführten Transaktionen. -- `to`: `DATA`, 20 Bytes - Adresse des Empfängers. `null` wenn es sich um eine Vertragserstellungstransaktion handelt. -- `transactionIndex`: `QUANTITY` - Ganzzahlwert der Transaktionsindexposition im Block. `null`, wenn es aussteht. -- `value`: `QUANTITY` - Der übertragene Wert in Wei. -- `v`: `QUANTITY` - ECDSA Wiederherstellungs-ID -- `r`: `QUANTITY` - ECDSA Signatur r -- `s`: `QUANTITY` - ECDSA Signatur s +- `input`: `DATA` - die mit der Transaktion gesendeten Daten. +- `nonce`: `QUANTITY` - die Anzahl der Transaktionen, die der Absender vor dieser durchgeführt hat. +- `to`: `DATA`, 20 Bytes - Adresse des Empfängers. `null`, wenn es sich um eine Smart-Contract-Erstellungstransaktion handelt. +- `transactionIndex`: `QUANTITY` - Ganzzahl der Indexposition der Transaktion im Block. `null`, wenn sie ausstehend ist. +- `value`: `QUANTITY` - übertragener Wert in Wei. +- `v`: `QUANTITY` - ECDSA-Wiederherstellungs-ID +- `r`: `QUANTITY` - ECDSA-Signatur r +- `s`: `QUANTITY` - ECDSA-Signatur s **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}' -// Result +// Ergebnis { "jsonrpc":"2.0", "id":1, @@ -1210,12 +1297,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param ### eth_getTransactionByBlockHashAndIndex {#eth_gettransactionbyblockhashandindex} -Gibt Informationen über eine Transaktion nach dem Block-Hash und der Transaktionsindexposition zurück. +Gibt Informationen zu einer Transaktion anhand des Block-Hashes und der Transaktionsindexposition zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** 1. `DATA`, 32 Bytes - Hash eines Blocks. -2. `QUANTITY` - Ganzzahlwert der Transaktionsindexposition. +2. `QUANTITY` - Ganzzahl der Transaktionsindexposition. ```js params: [ @@ -1224,7 +1315,8 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) +**Rückgabe** +Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) **Beispiel** @@ -1237,12 +1329,16 @@ Ergebnis siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) ### eth_getTransactionByBlockNumberAndIndex {#eth_gettransactionbyblocknumberandindex} -Gibt Informationen über eine Transaktion nach der Blocknummer und der Transaktionsindexposition zurück. +Gibt Informationen zu einer Transaktion anhand der Blocknummer und der Transaktionsindexposition zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `QUANTITY|TAG` – eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). -2. `QUANTITY` - Die Transaktionsindexposition. +1. `QUANTITY|TAG` - eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). +2. `QUANTITY` - die Transaktionsindexposition. ```js params: [ @@ -1251,12 +1347,13 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) +**Rückgabe** +Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}' ``` @@ -1264,9 +1361,9 @@ Ergebnis siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) ### eth_getTransactionReceipt {#eth_gettransactionreceipt} -Gibt den Beleg einer Transaktion nach dem Transaktions-Hash zurück. +Gibt den Beleg einer Transaktion anhand des Transaktions-Hashes zurück. -**Hinweis:** Der Beleg ist für ausstehende Transaktionen nicht verfügbar. +**Hinweis** Der Beleg ist für ausstehende Transaktionen nicht verfügbar. **Parameter** @@ -1276,33 +1373,34 @@ Gibt den Beleg einer Transaktion nach dem Transaktions-Hash zurück. params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"] ``` -**Rückgaben** `Object` – ein Transaktionsbeleg-Objekt oder `null`, wenn kein Beleg gefunden wurde: +**Rückgabe** +`Object` - Ein Transaktionsbelegobjekt oder `null`, wenn kein Beleg gefunden wurde: -- `transactionHash`: `DATA`, 32 Bytes - Hash der Transaktion. -- `transactionIndex`: `QUANTITY` - Ganzzahlwert der Transaktionsindexposition im Block. +- `transactionHash `: `DATA`, 32 Bytes - Hash der Transaktion. +- `transactionIndex`: `QUANTITY` - Ganzzahl der Indexposition der Transaktion im Block. - `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich diese Transaktion befand. - `blockNumber`: `QUANTITY` - Blocknummer, in der sich diese Transaktion befand. -- `from`: `DATA`, 20 Bytes - Adresse des Senders. -- `to`: `DATA`, 20 Bytes - Adresse des Empfängers. null, wenn es sich um eine Vertragserstellungstransaktion handelt. -- `cumulativeGasUsed` : `QUANTITY` - Die Gesamtmenge an Gas, die bei Ausführung dieser Transaktion im Block verwendet wurde. -- `effectiveGasPrice` : `QUANTITY` - Die Summe der Grundgebühr und der Tipp, die pro Einheit Gas bezahlt wurde. -- `gasUsed`: `QUANTITY` - Die Menge an Gas, die von dieser bestimmten Transaktion allein verwendet wurde. -- `contractAddress`: `DATA`, 20 Bytes - Die Vertragsadresse, die erstellt wurde, falls die Transaktion eine Vertragserstellung war, andernfalls `null`. -- `logs`: `Array` - Array von Log-Objekten, die diese Transaktion generiert hat. -- `logsBloom`: `DATA`, 256 Bytes - Bloom-Filter für leichte Clients, um schnell verwandte Logs abzurufen. -- `type`: `QUANTITY` - Ganzzahlwert des Transaktionstyps, `0x0` für veraltete Transaktionen, `0x1` für Zugriffslistentypen, `0x2` für dynamische Gebühren. +- `from`: `DATA`, 20 Bytes - Adresse des Absenders. +- `to`: `DATA`, 20 Bytes - Adresse des Empfängers. null, wenn es sich um eine Smart-Contract-Erstellungstransaktion handelt. +- `cumulativeGasUsed` : `QUANTITY ` - Die Gesamtmenge an Gas, die verbraucht wurde, als diese Transaktion im Block ausgeführt wurde. +- `effectiveGasPrice` : `QUANTITY` - Die Summe aus Grundgebühr und Trinkgeld, die pro Gaseinheit gezahlt wird. +- `gasUsed `: `QUANTITY ` - Die Gasmenge, die allein von dieser spezifischen Transaktion verbraucht wurde. +- `contractAddress `: `DATA`, 20 Bytes - Die erstellte Vertragsadresse, wenn die Transaktion eine Smart-Contract-Erstellung war, andernfalls `null`. +- `logs`: `Array` - Array von Protokollobjekten, die diese Transaktion generiert hat. +- `logsBloom`: `DATA`, 256 Bytes - Bloom-Filter für Light Clients, um zugehörige Protokolle schnell abzurufen. +- `type`: `QUANTITY` - Ganzzahl des Transaktionstyps, `0x0` für Legacy-Transaktionen, `0x1` für Zugriffslistentypen, `0x2` für dynamische Gebühren. -Es gibt auch _eines davon_ zurück: +Es gibt außerdem _entweder_ Folgendes zurück: -- `root` : `DATA` 32 Bytes des vorherigen Transaktions-Stateroots (vor Byzantium) -- `status`: `QUANTITY` entweder `1` (Erfolg) or `0` (Fehler) +- `root` : `DATA` 32 Bytes der Post-Transaktions-Zustandswurzel (vor Byzantium) +- `status`: `QUANTITY` entweder `1` (Erfolg) oder `0` (Fehlschlag) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}' -// Result +// Ergebnis { "jsonrpc": "2.0", "id": 1, @@ -1310,15 +1408,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para "blockHash": "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3", "blockNumber": "0xeff35f", - "contractAddress": null, // string of the address if it was created + "contractAddress": null, // String der Adresse, falls sie erstellt wurde "cumulativeGasUsed": "0xa12515", "effectiveGasPrice": "0x5a9c688d4", "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7", "gasUsed": "0xb4c8", "logs": [{ - // logs as returned by getFilterLogs, etc. + // Logs, wie sie von getFilterLogs usw. zurückgegeben werden }], - "logsBloom": "0x00...0", // 256 byte bloom filter + "logsBloom": "0x00...0", // 256-Byte-Bloom-Filter "status": "0x1", "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "transactionHash": @@ -1331,12 +1429,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para ### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex} -Gibt Informationen über einen Onkel eines Blocks nach Hash und Onkel-Indexposition zurück. +Gibt Informationen zu einem Uncle eines Blocks anhand des Hashes und der Uncle-Indexposition zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** 1. `DATA`, 32 Bytes - Der Hash eines Blocks. -2. `QUANTITY` - Die Indexposition des Onkels. +2. `QUANTITY` - Die Indexposition des Uncles. ```js params: [ @@ -1345,7 +1447,8 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getBlockByHash](#eth_getblockbyhash) +**Rückgabe** +Siehe [eth_getBlockByHash](#eth_getblockbyhash) **Beispiel** @@ -1356,16 +1459,20 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex" Ergebnis siehe [eth_getBlockByHash](#eth_getblockbyhash) -**Hinweis**: Ein Onkel enthält keine einzelnen Transaktionen. +**Hinweis**: Ein Uncle enthält keine einzelnen Transaktionen. ### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex} -Gibt Informationen über einen Onkel eines Blocks nach Nummer und Onkel-Indexposition zurück. +Gibt Informationen zu einem Uncle eines Blocks anhand der Nummer und der Uncle-Indexposition zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `QUANTITY|TAG` – eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). -2. `QUANTITY` - Die Indexposition des Onkels. +1. `QUANTITY|TAG` - eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). +2. `QUANTITY` - die Indexposition des Uncles. ```js params: [ @@ -1374,14 +1481,15 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getBlockByHash](#eth_getblockbyhash) +**Rückgabe** +Siehe [eth_getBlockByHash](#eth_getblockbyhash) -**Hinweis**: Ein Onkel enthält keine einzelnen Transaktionen. +**Hinweis**: Ein Uncle enthält keine einzelnen Transaktionen. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}' ``` @@ -1389,23 +1497,25 @@ Ergebnis siehe [eth_getBlockByHash](#eth_getblockbyhash) ### eth_newFilter {#eth_newfilter} -Erstellt auf Basis von Filteroptionen ein Filterobjekt, um eine Benachrichtigung auszugeben, wenn sich der Status ändert (Protokolle). Um zu überprüfen, ob sich der Status geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. +Erstellt ein Filterobjekt basierend auf Filteroptionen, um zu benachrichtigen, wenn sich der Zustand ändert (Protokolle). +Um zu überprüfen, ob sich der Zustand geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. -**Hinweis zum Festlegen von Themenfiltern:** Themen sind auftragsabhängig. Eine Transaktion mit einem Protokoll mit den Themen [A, B] wird mit den folgenden Themenfiltern abgeglichen: +**Ein Hinweis zur Angabe von Themenfiltern:** +Themen (Topics) sind reihenfolgeabhängig. Eine Transaktion mit einem Protokoll mit den Themen [A, B] wird von den folgenden Themenfiltern abgeglichen: -- `[]` „alles“ -- `[A]` „A an erster Stelle (und alles danach)“ -- `[null, B]` „Alles an erster Stelle UND B an zweiter Stelle (und alles danach)“ -- `[A, B]` „A an erster Stelle UND B an zweiter Stelle (und alles danach)“ -- `[[A, B], [A, B]]` „(A ODER B) an erster Stelle UND (A ODER B) an zweiter Stelle (und alles danach)“ +- `[]` "alles" +- `[A]` "A an erster Position (und alles danach)" +- `[null, B]` "alles an erster Position UND B an zweiter Position (und alles danach)" +- `[A, B]` "A an erster Position UND B an zweiter Position (und alles danach)" +- `[[A, B], [A, B]]` "(A ODER B) an erster Position UND (A ODER B) an zweiter Position (und alles danach)" - **Parameter** -1. `Object` – die Filteroptionen: +1. `Object` - Die Filteroptionen: -- `fromBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `toBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `Adresse`: `DATA|Array`, 20 Bytes - (Optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. -- `topics`: `Array of DATA`, - (Optional) Array von 32 Bytes `DATA`-Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. +- `fromBlock`: `QUANTITY|TAG` - (optional, Standard: `"latest"`) Ganzzahlige Blocknummer oder `"latest"` für den zuletzt vorgeschlagenen Block, `"safe"` für den neuesten sicheren Block, `"finalized"` für den neuesten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die sich noch nicht in einem Block befinden. +- `toBlock`: `QUANTITY|TAG` - (optional, Standard: `"latest"`) Ganzzahlige Blocknummer oder `"latest"` für den zuletzt vorgeschlagenen Block, `"safe"` für den neuesten sicheren Block, `"finalized"` für den neuesten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die sich noch nicht in einem Block befinden. +- `address`: `DATA|Array`, 20 Bytes - (optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. +- `topics`: `Array von DATA`, - (optional) Array von 32-Byte-`DATA`-Themen. Themen sind reihenfolgeabhängig. Jedes Thema kann auch ein Array von DATA mit "oder"-Optionen sein. ```js params: [ @@ -1425,14 +1535,15 @@ params: [ ] ``` -**Rückgaben** `QUANTITY` – eine Filter-ID. +**Rückgabe** +`QUANTITY` - Eine Filter-ID. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1442,18 +1553,21 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topic ### eth_newBlockFilter {#eth_newblockfilter} -Erstellt einen Filter im Knoten, um eine Benachrichtigung auszugeben, wenn ein neuer Block eintrifft. Um zu überprüfen, ob sich der Status geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. +Erstellt einen Filter im Blockchain-Knoten, um zu benachrichtigen, wenn ein neuer Block eintrifft. +Um zu überprüfen, ob sich der Zustand geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. -**Parameter** Keine +**Parameter** +Keine -**Rückgaben** `QUANTITY` – eine Filter-ID. +**Rückgabe** +`QUANTITY` - Eine Filter-ID. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1463,18 +1577,21 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[], ### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter} -Erstellt einen Filter im Knoten, um eine Benachrichtigung auszugeben, wenn eine neue ausstehende Transaktionen eintrifft. Um zu überprüfen, ob sich der Status geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. +Erstellt einen Filter im Blockchain-Knoten, um zu benachrichtigen, wenn neue ausstehende Transaktionen eintreffen. +Um zu überprüfen, ob sich der Zustand geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. -**Parameter** Keine +**Parameter** +Keine -**Rückgaben** `QUANTITY` – eine Filter-ID. +**Rückgabe** +`QUANTITY` - Eine Filter-ID. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1484,11 +1601,12 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter" ### eth_uninstallFilter {#eth_uninstallfilter} -Deinstalliert einen Filter mit angegebener ID. Sollte immer aufgerufen werden, wenn die Uhr nicht mehr benötigt wird. Zusätzlich Timeout für Filter, wenn sie für einen bestimmten Zeitraum nicht mit [eth_getFilterChanges](#eth_getfilterchanges) angefordert werden. +Deinstalliert einen Filter mit der angegebenen ID. Sollte immer aufgerufen werden, wenn die Überwachung nicht mehr benötigt wird. +Zusätzlich laufen Filter ab, wenn sie für eine gewisse Zeit nicht mit [eth_getFilterChanges](#eth_getfilterchanges) angefordert werden. **Parameter** -1. `QUANTITY` – die Filter-ID. +1. `QUANTITY` - Die Filter-ID. ```js params: [ @@ -1496,14 +1614,15 @@ params: [ ] ``` -**Rückgabewerte** `Boolean` – `true`, wenn der Filter erfolgreich deinstalliert wurde, andernfalls `false`. +**Rückgabe** +`Boolean` - `true`, wenn der Filter erfolgreich deinstalliert wurde, andernfalls `false`. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1513,11 +1632,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":[" ### eth_getFilterChanges {#eth_getfilterchanges} -Umfragemethode für einen Filter, die ein Array von Protokollen zurückgibt, die seit der letzten Umfrage aufgetreten sind. +Polling-Methode für einen Filter, die ein Array von Protokollen zurückgibt, die seit dem letzten Abruf aufgetreten sind. **Parameter** -1. `QUANTITY` – die Filter-ID. +1. `QUANTITY` - die Filter-ID. ```js params: [ @@ -1525,26 +1644,28 @@ params: [ ] ``` -**Rückgabewerte** `Array` – Array von Protokollobjekten oder ein leeres Array, wenn sich seit der letzten Umfrage nichts geändert hat. +**Rückgabe** +`Array` - Array von Protokollobjekten oder ein leeres Array, wenn sich seit dem letzten Abruf nichts geändert hat. -- Für mit `eth_newBlockFilter` erstellte Filter sind die Rückgabewerte Block-Hashes (`DATA`, 32 Bytes), z. `["0x3454645634534..."]`. -- Für Filter, die mit `eth_newPendingTransactionFilter` erstellt wurden, sind die Rückgabewerte Transaktions-Hashes (`DATA`, 32 Bytes), z. `["0x6345343454645..."]`. -- Für mit `eth_newFilter` erstellte Filter sind Protokolle Objekte mit folgenden Parametern: - - `removed`: `TAG` - `true`, als das Protokoll aufgrund einer Neustrukturierung der Blockchain entfernt wurde. `false`, wenn es sich um ein gültiges Protokoll handelt. - - `logIndex`: `QUANTITY` – Ganzzahlwert der Protokollindexposition im Block. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `transactionIndex`: `QUANTITY` - Ganzzahlwert der Transaktionsindexposition, aus der das Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. +- Für Filter, die mit `eth_newBlockFilter` erstellt wurden, sind die Rückgaben Block-Hashes (`DATA`, 32 Bytes), z. B. `["0x3454645634534..."]`. +- Für Filter, die mit `eth_newPendingTransactionFilter ` erstellt wurden, sind die Rückgaben Transaktions-Hashes (`DATA`, 32 Bytes), z. B. `["0x6345343454645..."]`. +- Für Filter, die mit `eth_newFilter` erstellt wurden, sind Protokolle Objekte mit folgenden Parametern: + - `removed`: `TAG` - `true`, wenn das Protokoll aufgrund einer Chain-Reorganisation entfernt wurde. `false`, wenn es ein gültiges Protokoll ist. + - `logIndex`: `QUANTITY` - Ganzzahl der Protokollindexposition im Block. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `transactionIndex`: `QUANTITY` - Ganzzahl der Transaktionsindexposition, aus der das Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - `transactionHash`: `DATA`, 32 Bytes - Hash der Transaktionen, aus denen dieses Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich dieses Protokoll befand. `null`, wenn es aussteht. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `blockNumber`: `QUANTITY` - Die Blocknummer, in der sich dieses Protokoll befand. `null`, wenn es aussteht. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `Adresse`: `DATA`, 20 Bytes - Adresse, von der dieses Protokoll stammt. - - `data`: `DATA` – enthält null oder mehr 32 Byte nicht indizierte Argumente des Protokolls. - - `topics`: `Array of DATA` - Array von 0 bis 4 32 Bytes `DATA` von indizierten Protokollargumenten. (In _Solidity_: Das erste Thema ist der _Hash_ der Signatur des Ereignisses (z. B. `Deposit (address,bytes32,uint256)`), es sei denn, Sie haben das Ereignis mit dem `anonymous`-Spezifizierer deklariert.) + - `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich dieses Protokoll befand. `null`, wenn es ausstehend ist. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `blockNumber`: `QUANTITY` - die Blocknummer, in der sich dieses Protokoll befand. `null`, wenn es ausstehend ist. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `address`: `DATA`, 20 Bytes - Adresse, von der dieses Protokoll stammt. + - `data`: `DATA` - nicht indizierte Protokolldaten variabler Länge. (In _Solidity_: null oder mehr nicht indizierte 32-Byte-Protokollargumente.) + - `topics`: `Array von DATA` - Array von 0 bis 4 32-Byte-`DATA` von indizierten Protokollargumenten. (In _Solidity_: Das erste Thema ist der _Hash_ der Signatur des Ereignisses (z. B. `Deposit(address,bytes32,uint256)`), es sei denn, Sie haben das Ereignis mit dem Spezifizierer `anonymous` deklariert.) + - **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc":"2.0", @@ -1569,7 +1690,7 @@ Gibt ein Array aller Protokolle zurück, die dem Filter mit der angegebenen ID e **Parameter** -1. `QUANTITY` – die Filter-ID. +1. `QUANTITY` - Die Filter-ID. ```js params: [ @@ -1577,12 +1698,13 @@ params: [ ] ``` -**Rückgabewerte** Siehe [eth_getFilterChanges](#eth_getfilterchanges) +**Rückgabe** +Siehe [eth_getFilterChanges](#eth_getfilterchanges) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}' ``` @@ -1590,17 +1712,17 @@ Ergebnis siehe [eth_getFilterChanges](#eth_getfilterchanges) ### eth_getLogs {#eth_getlogs} -Gibt ein Array aller Protokolle zurück, die einem angegebenen Filterobjekt entsprechen. +Gibt ein Array aller Protokolle zurück, die einem bestimmten Filterobjekt entsprechen. **Parameter** -1. `Object` – die Filteroptionen: +1. `Object` - Die Filteroptionen: -- `fromBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `toBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `Adresse`: `DATA|Array`, 20 Bytes - (Optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. -- `topics`: `Array of DATA`, - (Optional) Array von 32 Bytes `DATA`-Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. -- `blockhash`: `DATA`, 32 Bytes - (optional, **future**) Mit dem Hinzufügen von EIP-234 wird `blockHash` eine neue Filteroption sein, die die zurückgegebenen Protokolle auf den einzelnen Block mit dem 32-Byte-Hash `blockHash` beschränkt. Die Verwendung von `blockHash` entspricht `fromBlock` = `toBlock` = die Blocknummer mit Hash `blockHash`. Wenn `blockHash` in den Filterkriterien vorhanden ist, sind weder `fromBlock` noch `toBlock` zulässig. +- `fromBlock`: `QUANTITY|TAG` - (optional, Standard: `"latest"`) Ganzzahlige Blocknummer oder `"latest"` für den zuletzt vorgeschlagenen Block, `"safe"` für den neuesten sicheren Block, `"finalized"` für den neuesten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die sich noch nicht in einem Block befinden. +- `toBlock`: `QUANTITY|TAG` - (optional, Standard: `"latest"`) Ganzzahlige Blocknummer oder `"latest"` für den zuletzt vorgeschlagenen Block, `"safe"` für den neuesten sicheren Block, `"finalized"` für den neuesten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die sich noch nicht in einem Block befinden. +- `address`: `DATA|Array`, 20 Bytes - (optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. +- `topics`: `Array von DATA`, - (optional) Array von 32-Byte-`DATA`-Themen. Themen sind reihenfolgeabhängig. Jedes Thema kann auch ein Array von DATA mit "oder"-Optionen sein. +- `blockHash`: `DATA`, 32 Bytes - (optional, **zukünftig**) Mit der Hinzufügung von EIP-234 wird `blockHash` eine neue Filteroption sein, die die zurückgegebenen Protokolle auf den einzelnen Block mit dem 32-Byte-Hash `blockHash` beschränkt. Die Verwendung von `blockHash` entspricht `fromBlock` = `toBlock` = der Blocknummer mit dem Hash `blockHash`. Wenn `blockHash` in den Filterkriterien vorhanden ist, sind weder `fromBlock` noch `toBlock` zulässig. ```js params: [ @@ -1612,12 +1734,13 @@ params: [ ] ``` -**Rückgabewerte** Siehe [eth_getFilterChanges](#eth_getfilterchanges) +**Rückgabe** +Siehe [eth_getFilterChanges](#eth_getfilterchanges) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}' ``` @@ -1625,11 +1748,11 @@ Ergebnis siehe [eth_getFilterChanges](#eth_getfilterchanges) ## Anwendungsbeispiel {#usage-example} -### Einen Contract mit JSON_RPC bereitstellen {#deploying-contract} +### Bereitstellen eines Vertrags mit JSON_RPC {#deploying-contract} -Dieser Abschnitt enthält eine Demonstration, wie ein Contract nur mithilfe der RPC-Schnittstelle bereitgestellt wird. Es gibt alternative Wege zur Bereitstellung von Contracts, bei denen diese Komplexität abstrahiert wird – zum Beispiel die Verwendung von Bibliotheken, die auf der RPC-Schnittstelle wie [web3.js](https://web3js.readthedocs.io/) und [web3.py](https://github.com/ethereum/web3.py) aufbauen. Diese Abstraktionen sind im Allgemeinen leichter zu verstehen und weniger fehleranfällig, es ist dennoch hilfreich, zu verstehen, was im Hintergrund passiert. +Dieser Abschnitt enthält eine Demonstration, wie man einen Vertrag nur über die RPC-Schnittstelle bereitstellt. Es gibt alternative Wege zur Bereitstellung von Verträgen, bei denen diese Komplexität abstrahiert wird – zum Beispiel durch die Verwendung von Bibliotheken, die auf der RPC-Schnittstelle aufbauen, wie [web3.js](https://web3js.readthedocs.io/) und [web3.py](https://github.com/ethereum/web3.py). Diese Abstraktionen sind im Allgemeinen leichter zu verstehen und weniger fehleranfällig, aber es ist dennoch hilfreich zu verstehen, was unter der Haube passiert. -Das Folgende ist ein unkomplizierter Smart Contract namens `Multiply7`, der über die JSON-RPC-Schnittstelle auf einem Ethereum-Knoten bereitgestellt wird. Dieses Tutorial geht davon aus, dass der Reader bereits einen Geth-Knoten ausführt. Weitere Informationen zu Nodes und Clients finden Sie [hier](/developers/docs/nodes-and-clients/run-a-node). Bitte sehen Sie in der jeweiligen [Client](/developers/docs/nodes-and-clients/)-Dokumentation nach, wie Sie den HTTP-JSON-RPC für Nicht-Geth-Clients starten. Die meisten Clients werden standardmäßig auf `localhost:8545` ausgeführt. +Das Folgende ist ein einfacher Smart Contract namens `Multiply7`, der über die JSON-RPC-Schnittstelle auf einem Ethereum-Blockchain-Knoten bereitgestellt wird. Dieses Tutorial setzt voraus, dass der Leser bereits einen Geth-Blockchain-Knoten ausführt. Weitere Informationen zu Blockchain-Knoten und Anwendungen finden Sie [hier](/developers/docs/nodes-and-clients/run-a-node). Bitte lesen Sie die Dokumentation der jeweiligen [Anwendung](/developers/docs/nodes-and-clients/), um zu erfahren, wie Sie den HTTP-JSON-RPC für Nicht-Geth-Anwendungen starten. Die meisten Anwendungen werden standardmäßig unter `localhost:8545` bereitgestellt. ```javascript contract Multiply7 { @@ -1641,34 +1764,34 @@ contract Multiply7 { } ``` -Stellen Sie zunächst sicher, dass die HTTP-RPC-Schnittstelle aktiviert ist. Das bedeutet, dass wir Geth beim Start mit dem `--http`-Flag versehen. In diesem Beispiel verwenden wir den Geth-Knoten in einer privaten Entwicklungs-Blockchain. Mit diesem Ansatz benötigen wir kein Ether im echten Netzwerk. +Als Erstes müssen wir sicherstellen, dass die HTTP-RPC-Schnittstelle aktiviert ist. Das bedeutet, dass wir Geth beim Start das Flag `--http` übergeben. In diesem Beispiel verwenden wir den Geth-Blockchain-Knoten auf einer privaten Entwicklungs-Chain. Mit diesem Ansatz benötigen wir kein Ether im echten Netzwerk. ```bash geth --http --dev console 2>>geth.log ``` -Dadurch wird die HTTP-RPC-Schnittstelle auf `http://localhost:8545` gestartet. +Dadurch wird die HTTP-RPC-Schnittstelle unter `http://localhost:8545` gestartet. -Wir können überprüfen, ob die Schnittstelle läuft, indem wir die Coinbase-Adresse und den Saldo mit [curl](https://curl.se) abrufen. Bitte beachten Sie, dass sich die Daten in diesen Beispielen auf Ihrem lokalen Knoten unterscheiden. Wenn Sie diese Befehle ausprobieren möchten, ersetzen Sie die Anfrageparameter in der zweiten Curl-Anfrage durch das Ergebnis, das von der ersten zurückgegeben wird. +Wir können überprüfen, ob die Schnittstelle läuft, indem wir die Coinbase-Adresse (indem wir die erste Adresse aus dem Array der Konten abrufen) und den Kontostand mit [curl](https://curl.se) abfragen. Bitte beachten Sie, dass die Daten in diesen Beispielen auf Ihrem lokalen Blockchain-Knoten abweichen werden. Wenn Sie diese Befehle ausprobieren möchten, ersetzen Sie die Anfrageparameter in der zweiten curl-Anfrage durch das Ergebnis, das von der ersten zurückgegeben wurde. ```bash -curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' -H "Content-Type: application/json" localhost:8545 +curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545 {"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]} curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545 {"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"} ``` -Da Zahlen hexadezimal codiert sind, wird der Saldo in Wei als hexadezimaler String zurückgegeben. Wenn wir das Guthaben in Ether als Zahl haben möchten, können wir web3 von der Geth-Konsole verwenden. +Da Zahlen hexadezimal kodiert sind, wird der Kontostand in Wei als Hex-String zurückgegeben. Wenn wir den Kontostand in Ether als Zahl haben möchten, können wir web3 aus der Geth-Konsole verwenden. ```javascript web3.fromWei("0x1639e49bba16280000", "ether") // "410" ``` -Jetzt, da es etwas Ether in unserer privaten Entwicklungs-Kette gibt, können wir den Contract bereitstellen. Der erste Schritt besteht darin, den Multiply7-Contract in Bytecode zu kompilieren, der an die EVM gesendet werden kann. Um Solc, den Solidity-Compiler, zu installieren, folgen Sie der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Möglicherweise möchten Sie eine ältere `solc`-Version verwenden, um der [Version des verwendeten Compilers für unser Beispiel zu entsprechen](https://github.com/ethereum/solidity/releases/tag/v0.4.20).) +Da sich nun etwas Ether auf unserer privaten Entwicklungs-Chain befindet, können wir den Vertrag bereitstellen. Der erste Schritt besteht darin, den Multiply7-Vertrag in Bytecode zu kompilieren, der an die EVM gesendet werden kann. Um solc, den Solidity-Compiler, zu installieren, folgen Sie der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Möglicherweise möchten Sie eine ältere `solc`-Version verwenden, die [der für unser Beispiel verwendeten Compiler-Version](https://github.com/ethereum/solidity/releases/tag/v0.4.20) entspricht.) -Der nächste Schritt besteht darin, den Multiply7-Contract in Bytecode zu kompilieren, der an die EVM gesendet werden kann. +Der nächste Schritt besteht darin, den Multiply7-Vertrag in Bytecode zu kompilieren, der an die EVM gesendet werden kann. ```bash echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin @@ -1678,51 +1801,51 @@ Binary: 6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029 ``` -Jetzt, da wir den kompilierten Code haben, müssen wir bestimmen, wie viel Gas es kostet, ihn einzusetzen. Die RPC-Schnittstelle hat eine `eth_estimateGas`-Methode, die uns eine Schätzung bereitstellt. +Da wir nun den kompilierten Code haben, müssen wir ermitteln, wie viel Gas die Bereitstellung kostet. Die RPC-Schnittstelle verfügt über eine Methode `eth_estimateGas`, die uns eine Schätzung liefert. ```bash curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545 {"jsonrpc":"2.0","id":5,"result":"0x1c31e"} ``` -Und schließlich stellen Sie den Contract bereit. +Und schließlich den Vertrag bereitstellen. ```bash curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545 {"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"} ``` -Die Transaktion wird von dem Knoten akzeptiert und ein Transaktions-Hash wird zurückgegeben. Dieser Hash kann verwendet werden, um die Transaktion zu verfolgen. Der nächste Schritt besteht darin, die Adresse zu ermitteln, an der unser Contract bereitgestellt wird. Jede ausgeführte Transaktion erstellt einen Beleg. Dieser Beleg enthält verschiedene Informationen über die Transaktion, wie z. B. in welchem Block die Transaktion enthalten war und wie viel Gas von der EVM verbraucht wurde. Wenn eine Transaktion einen Contract erstellt, enthält sie auch die Contract-Adresse. Wir können den Beleg mit der RPC-Methode `eth_getTransactionReceipt` abrufen. +Die Transaktion wird vom Blockchain-Knoten akzeptiert und ein Transaktions-Hash wird zurückgegeben. Dieser Hash kann verwendet werden, um die Transaktion zu verfolgen. Der nächste Schritt besteht darin, die Adresse zu ermitteln, an der unser Vertrag bereitgestellt wird. Jede ausgeführte Transaktion erstellt einen Beleg. Dieser Beleg enthält verschiedene Informationen über die Transaktion, z. B. in welchen Block die Transaktion aufgenommen wurde und wie viel Gas von der EVM verbraucht wurde. Wenn eine Transaktion einen Vertrag erstellt, enthält sie auch die Vertragsadresse. Wir können den Beleg mit der RPC-Methode `eth_getTransactionReceipt` abrufen. ```bash curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545 {"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}} ``` -Unser Contract wurde am `0x4d03d617d700cf81935d7f797f4e2ae719648262` erstellt. Ein Nullergebnis anstelle eines Belegs bedeutet, dass die Transaktion noch nicht in einen Block aufgenommen wurde. Warten Sie einen Moment, prüfen Sie, ob Ihr Konsens-Client ausgeführt wird, und versuchen Sie es erneut. +Unser Vertrag wurde unter `0x4d03d617d700cf81935d7f797f4e2ae719648262` erstellt. Ein Null-Ergebnis anstelle eines Belegs bedeutet, dass die Transaktion noch nicht in einen Block aufgenommen wurde. Warten Sie einen Moment, überprüfen Sie, ob Ihr Konsens-Client läuft, und versuchen Sie es erneut. #### Interaktion mit Smart Contracts {#interacting-with-smart-contract} -In diesem Beispiel senden wir eine Transaktion mit `eth_sendTransaction` an die Methode `multiply` des Contracts. +In diesem Beispiel senden wir eine Transaktion mit `eth_sendTransaction` an die Methode `multiply` des Vertrags. -`eth_sendTransaction` erfordert mehrere Argumente, speziell `from`, `to` und `data`. `From` ist die öffentliche Adresse unseres Kontos und `to` ist die Contract-Adresse. Das Argument `data` enthält eine Nutzlast, die definiert, welche Methode mit welchen Argumenten aufgerufen werden muss. An dieser Stelle kommt die [ABI (Application Binary Interface – binäre Anwendungsschnittstelle)](https://docs.soliditylang.org/en/latest/abi-spec.html) ins Spiel. Die ABI ist eine JSON-Datei, die festlegt, wie Daten für die EVM definiert und kodiert werden. +`eth_sendTransaction` erfordert mehrere Argumente, insbesondere `from`, `to` und `data`. `From` ist die öffentliche Adresse unseres Kontos und `to` ist die Vertragsadresse. Das Argument `data` enthält einen Payload, der definiert, welche Methode mit welchen Argumenten aufgerufen werden muss. Hier kommt das [ABI (Application Binary Interface)](https://docs.soliditylang.org/en/latest/abi-spec.html) ins Spiel. Das ABI ist eine JSON-Datei, die definiert, wie Daten für die EVM definiert und kodiert werden. -Die Byte der Nutzlast definieren, welche Methode im Contract aufgerufen wird. Das sind die ersten 4 Byte aus dem Keccak-Hash über den Funktionsnamen und seine Argumenttypen, Hex-codiert. Die Multiplizieren-Funktion akzeptiert ein uint, welches ein Alias für uint256 ist. Damit bleibt uns: +Die Bytes des Payloads definieren, welche Methode im Vertrag aufgerufen wird. Dies sind die ersten 4 Bytes aus dem Keccak-Hash über den Funktionsnamen und seine Argumenttypen, hexadezimal kodiert. Die Multiply-Funktion akzeptiert ein uint, was ein Alias für uint256 ist. Das ergibt für uns: ```javascript web3.sha3("multiply(uint256)").substring(0, 10) // "0xc6888fa1" ``` -Der nächste Schritt besteht darin, die Argumente zu codieren. Es gibt nur einen uint256, beispielsweise den Wert 6. Die ABI hat einen Abschnitt, der angibt, wie uint256-Typen codiert werden. +Der nächste Schritt ist die Kodierung der Argumente. Es gibt nur ein uint256, sagen wir, den Wert 6. Das ABI hat einen Abschnitt, der spezifiziert, wie uint256-Typen kodiert werden. -`int: enc(X)` ist die Big-Endian-Zweierkomplementcodierung von X, aufgefüllt auf der Seite höherer Ordnung (links) mit 0xff für negatives X und mit null > Byte für positives X, sodass die Länge ein Vielfaches von 32 Byte ist. +`int: enc(X)` ist die Big-Endian-Zweierkomplement-Kodierung von X, die auf der höherwertigen (linken) Seite mit 0xff für negatives X und mit Null-Bytes für positives X aufgefüllt wird, sodass die Länge ein Vielfaches von 32 Bytes beträgt. -Dies wird zu `0000000000000000000000000000000000000000000000000000000000006` codiert. +Dies wird kodiert zu `0000000000000000000000000000000000000000000000000000000000000006`. -Durch die Kombination des Funktionsselektors und des codierten Arguments werden unsere Daten zu `0xc6888fa10000000000000000000000000000000000000000000000000000000000006`. +Durch die Kombination des Funktionsselektors und des kodierten Arguments lauten unsere Daten `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`. -Dies kann nun an den Knoten gesendet werden: +Dies kann nun an den Blockchain-Knoten gesendet werden: ```bash curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545 @@ -1753,19 +1876,19 @@ Da eine Transaktion gesendet wurde, wurde ein Transaktions-Hash zurückgegeben. } ``` -Der Beleg enthält ein Protokoll. Dieses Protokoll wurde von der EVM bei der Transaktionsausführung generiert und in den Beleg aufgenommen. Die Funktion `multiply` zeigt, dass das Ereignis `Print` mit der Eingabe mal 7 ausgelöst wurde. Da das Argument für das Ereignis `Print` ein uint256 war, können wir es gemäß den ABI-Regeln dekodieren, was zu der erwarteten Dezimalzahl 42 führt. Abgesehen von den Daten ist es erwähnenswert, dass Themen verwendet werden können, um festzustellen, welches Ereignis das Protokoll erstellt hat: +Der Beleg enthält ein Protokoll (Log). Dieses Protokoll wurde von der EVM bei der Ausführung der Transaktion generiert und in den Beleg aufgenommen. Die Funktion `multiply` zeigt, dass das Ereignis `Print` mit der Eingabe mal 7 ausgelöst wurde. Da das Argument für das Ereignis `Print` ein uint256 war, können wir es gemäß den ABI-Regeln dekodieren, was uns die erwartete Dezimalzahl 42 liefert. Abgesehen von den Daten ist es erwähnenswert, dass Topics verwendet werden können, um zu bestimmen, welches Ereignis das Protokoll erstellt hat: ```javascript web3.sha3("Print(uint256)") // "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da" ``` -Das war nur eine kurze Einführung in einige der häufigsten Aufgaben, die die direkte Verwendung von JSON-RPC demonstrieren. +Dies war nur eine kurze Einführung in einige der häufigsten Aufgaben, die die direkte Nutzung des JSON-RPC demonstriert. ## Verwandte Themen {#related-topics} - [JSON-RPC-Spezifikation](http://www.jsonrpc.org/specification) -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Blockchain-Knoten und Clients](/developers/docs/nodes-and-clients/) - [JavaScript-APIs](/developers/docs/apis/javascript/) - [Backend-APIs](/developers/docs/apis/backend/) -- [Ausführende Clients](/developers/docs/nodes-and-clients/#execution-clients) +- [Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/blocks/index.md b/public/content/translations/de/developers/docs/blocks/index.md index 8729bdf88cc..38c819432b7 100644 --- a/public/content/translations/de/developers/docs/blocks/index.md +++ b/public/content/translations/de/developers/docs/blocks/index.md @@ -1,152 +1,153 @@ --- -title: Blöcke -description: Eine Übersicht über Blöcke in der Ethereum Blockchain – ihre Datenstruktur, warum sie benötigt werden und wie sie erstellt werden. +title: "Blöcke" +description: "Ein Überblick über Blöcke in der Ethereum-Blockchain – ihre Datenstruktur, warum sie benötigt werden und wie sie erstellt werden." lang: de --- -Blöcke sind Stapel von Transaktionen mit einem Hash des vorherigen Blocks in der Kette. Dies verbindet Blöcke (in einer Kette), weil Hashes kryptographisch aus den Blockdaten abgeleitet werden. Dies verhindert Betrug: Eine Änderung in irgendeiner Chronik würde alle nachfolgenden Blöcke ungültig machen, da sich alle nachfolgenden Hashes ändern und jeder, der die Blockchain ausführt, dies bemerken würde. +Blöcke sind Bündel von Transaktionen mit einem Hash des vorherigen Blocks in der Kette. Dies verbindet Blöcke miteinander (in einer Kette), da Hashes kryptografisch aus den Blockdaten abgeleitet werden. Dies verhindert Betrug, da eine einzige Änderung in einem beliebigen Block in der Historie alle folgenden Blöcke ungültig machen würde, da sich alle nachfolgenden Hashes ändern würden und jeder, der die Blockchain ausführt, dies bemerken würde. ## Voraussetzungen {#prerequisites} -Blöcke sind ein sehr anfängerfreundliches Thema. Um dir jedoch zu helfen, diese Seite besser zu verstehen, empfehlen wir, zuerst [ Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Blöcke sind ein sehr anfängerfreundliches Thema. Damit Sie diese Seite jedoch besser verstehen, empfehlen wir Ihnen, zuerst [Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Warum Blöcke? {#why-blocks} -Um sicherzustellen, dass alle Teilnehmer des Ethereum-Netzwerks einen synchronisierten Zustand beibehalten und sich über den genauen Verlauf der Transaktionen einig sind, fassen wir die Transaktionen in Blöcken zusammen. Das bedeutet, dass Dutzende (oder Hunderte) von Transaktionen in einem Durchgang übergeben, bestätigt und synchronisiert werden. +Um sicherzustellen, dass alle Teilnehmer im [Ethereum](/)-Netzwerk einen synchronisierten Zustand beibehalten und sich auf die genaue Historie der Transaktionen einigen, bündeln wir Transaktionen in Blöcke. Das bedeutet, dass Dutzende (oder Hunderte) von Transaktionen auf einmal festgeschrieben, vereinbart und synchronisiert werden. -![Ein Diagramm, das Transaktionen in einem Block zeigt, die Zustandsänderungen verursachen](./tx-block.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das zeigt, wie eine Transaktion in einem Block Zustandsänderungen verursacht](./tx-block.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Durch die zeitliche Verteilung der Commits geben wir allen Netzwerkteilnehmern genügend Zeit, einen Konsens zu erzielen: Obwohl Transaktionsanfragen dutzende Male pro Sekunde erfolgen, werden Blöcke auf Ethereum nur alle zwölf Sekunden erstellt und festgeschrieben. +Indem wir die Festschreibungen (Commits) zeitlich verteilen, geben wir allen Netzwerk-Teilnehmern genügend Zeit, um zu einem Konsens zu gelangen: Auch wenn Transaktionsanfragen dutzende Male pro Sekunde auftreten, werden Blöcke auf Ethereum nur alle zwölf Sekunden erstellt und festgeschrieben. ## Wie Blöcke funktionieren {#how-blocks-work} -Um die Transaktionsgeschichte zu erhalten, sind Blöcke streng sortiert (jeder neu erstellte Block enthält einen Verweis auf den übergeordneten Block), und Transaktionen innerhalb von Blöcken sind ebenfalls streng geordnet. Außer in seltenen Fällen, zu einem bestimmten Zeitpunkt, sind sich alle Teilnehmer des Netzwerks über die genaue Anzahl und Geschichte der Blöcke einig und arbeiten daran, die aktuellen Live-Transaktionsanfragen in den nächsten Block zu integrieren. +Um die Transaktionshistorie zu bewahren, sind Blöcke streng geordnet (jeder neu erstellte Block enthält einen Verweis auf seinen übergeordneten Block), und auch die Transaktionen innerhalb der Blöcke sind streng geordnet. Bis auf seltene Ausnahmen sind sich zu jedem Zeitpunkt alle Teilnehmer im Netzwerk über die genaue Anzahl und Historie der Blöcke einig und arbeiten daran, die aktuellen Live-Transaktionsanfragen in den nächsten Block zu bündeln. -Sobald ein Block von einem zufällig ausgewählten Validator im Netzwerk erstellt wird, wird er im gesamten Netzwerk verbreitet. Alle Knoten fügen diesen Block dann am Ende ihrer Blockchain hinzu und ein neuer Validator wird ausgewählt, um den nächsten Block zu erstellen. Der genaue Prozess der Blockzusammenstellung und Festlegung/Konsensbildung ist zurzeit in Ethereums Proof-of-Stake-Protokoll festgelegt. +Sobald ein Block von einem zufällig ausgewählten Validator im Netzwerk zusammengestellt wurde, wird er an den Rest des Netzwerks weitergeleitet; alle Blockchain-Knoten fügen diesen Block an das Ende ihrer Blockchain an, und ein neuer Validator wird ausgewählt, um den nächsten Block zu erstellen. Der genaue Prozess der Blockzusammenstellung und der Festschreibungs-/Konsensprozess wird derzeit durch Ethereums „Proof-of-Stake“-Protokoll spezifiziert. -## Proof-of-Stake-Protokoll {#proof-of-work-protocol} +## Proof-of-Stake-Protokoll {#proof-of-stake-protocol} Proof-of-Stake bedeutet Folgendes: -- Validierende Nodes müssen 32 ETH als Sicherheit gegen Fehlverhalten in einen Einzahlungsvertrag einlagern. Das dient dem Schutz des Netzwerks, da nachweislich unehrliches Verhalten zum anteiligen oder vollständigen Verlust des Einsatzes führt. -- In jedem Slot (zwölf Sekunden voneinander entfernt) wird zufällig ein Validator ausgewählt, um als Vorschlagender für einen Block zu agieren. Sie bündeln Transaktionen, führen sie aus und bestimmen einen neuen „Zustand“. Sie verpacken diese Informationen in einen Block und geben sie an andere Validatoren weiter. -- Andere Validatoren, die von dem neuen Block erfahren, führen die Transaktionen erneut aus, um sicherzustellen, dass sie der vorgeschlagenen Änderung des globalen Zustands zustimmen. In der Annahme, dass der Block gültig ist, fügen sie ihn zu ihrer eigenen Datenbank hinzu. -- Wenn ein Validator von zwei konkurrierenden Blöcken für denselben Slot erfährt, wählt er mit seinem Fork-Wahlalgorithmus den Block aus, der von den meisten eingesetzten ETH unterstützt wird. +- Validierende Blockchain-Knoten müssen 32 ETH in einen Einzahlungsvertrag als Sicherheit gegen schlechtes Verhalten einzahlen (staken). Dies hilft, das Netzwerk zu schützen, da nachweislich unehrliches Verhalten dazu führt, dass ein Teil oder der gesamte Einsatz zerstört wird. +- In jedem Slot (im Abstand von zwölf Sekunden) wird ein Validator zufällig als Block-Vorschlagender ausgewählt. Er bündelt Transaktionen, führt sie aus und bestimmt einen neuen „Zustand“. Er verpackt diese Informationen in einen Block und leitet ihn an andere Validatoren weiter. +- Andere Validatoren, die von dem neuen Block erfahren, führen die Transaktionen erneut aus, um sicherzustellen, dass sie mit der vorgeschlagenen Änderung des globalen Zustands einverstanden sind. Unter der Annahme, dass der Block gültig ist, fügen sie ihn ihrer eigenen Datenbank hinzu. +- Wenn ein Validator von zwei widersprüchlichen Blöcken für denselben Slot erfährt, verwendet er seinen Fork-Choice-Algorithmus, um denjenigen auszuwählen, der durch die meisten gestakten ETH unterstützt wird. [Mehr über Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) -## Was enthält ein Block? {#block-anatomy} +## Was ist in einem Block? {#block-anatomy} -Ein Block enthält viele verschiedene Informationen. Auf oberster Ebene enthält ein Block folgende Felder: +Ein Block enthält viele Informationen. Auf der höchsten Ebene enthält ein Block die folgenden Felder: -| Feld | Beschreibung | -|:------------------- |:----------------------------------------------------------- | -| `Zeitspanne (Slot)` | Der Slot, zu dem der Block gehört | -| `proposer_index` | Die ID des Validators, der den Block vorschlägt | -| `parent_root` | Der Hash des vorausgehenden Blocks | -| `state_root` | Der Stamm-Hash des Zustandsobjekts | -| `hauptteil` | Ein Objekt, das mehrere Felder enthält, wie unten definiert | +| Feld | Beschreibung | +| :--------------- | :------------------------------------------------------------ | +| `slot` | der Slot, zu dem der Block gehört | +| `proposer_index` | die ID des Validators, der den Block vorschlägt | +| `parent_root` | der Hash des vorhergehenden Blocks | +| `state_root` | der Root-Hash des Zustandsobjekts | +| `body` | ein Objekt, das mehrere Felder enthält, wie unten definiert | -Der `Body` eines Blocks enthält selbst mehrere Felder: +Der Block-`body` enthält selbst mehrere Felder: -| Feld | Beschreibung | -|:-------------------- |:-------------------------------------------------------------------------------- | -| `randao_reveal` | Ein Wert, der zur Auswahl des nächsten Block-Vorschlagenden verwendet wird | -| `eth1_data` | Informationen zum Einzahlungsvertrag | -| `graffiti` | Beliebige Daten, die zum Markieren von Blöcken verwendet werden | -| `proposer_slashings` | Liste der zu streichenden Validatoren | -| `attester_slashings` | Liste der Attestierer für Slashing | -| `beglaubigungen` | Liste der Bescheinigungen zugunsten des aktuellen Blocks | -| `einzahlungen` | Liste der neuen Einlagen zum Einzahlungsvertrag | -| `voluntary_exits` | Liste der Validatoren, die das Netzwerk verlassen | -| `sync_aggregate` | Teilmenge der Validatoren, die zur Bedienung von leichten Clients verwendet wird | -| `execution_payload` | Vom Ausführungs-Client übergebene Transaktionen | +| Feld | Beschreibung | +| :------------------- | :-------------------------------------------------------------------------------- | +| `randao_reveal` | ein Wert, der verwendet wird, um den nächsten Block-Vorschlagenden auszuwählen | +| `eth1_data` | Informationen über den Einzahlungsvertrag | +| `graffiti` | beliebige Daten, die zum Markieren von Blöcken verwendet werden | +| `proposer_slashings` | Liste der Validatoren, die einem Slashing unterzogen werden sollen | +| `attester_slashings` | Liste der Bestätiger (Attester), die einem Slashing unterzogen werden sollen | +| `attestations` | Liste der Bestätigungen, die für vorherige Slots vorgenommen wurden | +| `deposits` | Liste der neuen Einzahlungen in den Einzahlungsvertrag | +| `voluntary_exits` | Liste der Validatoren, die das Netzwerk verlassen | +| `sync_aggregate` | Teilmenge der Validatoren, die zur Bedienung von Light Clients verwendet werden | +| `execution_payload` | Transaktionen, die vom Ausführungs-Client übergeben wurden | -Das Feld `attestations` enthält eine Liste aller Attestierungen im Block. Attestierungen haben ihren eigenen Datentyp der mehrere Datenteile enthält. Jede Attestierung enthält: +Das Feld `attestations` enthält eine Liste aller Bestätigungen im Block. Bestätigungen haben ihren eigenen Datentyp, der mehrere Datenbestandteile enthält. Jede Bestätigung enthält: | Feld | Beschreibung | -|:------------------ |:------------------------------------------------------------------------- | -| `aggregation_bits` | Eine Liste der Validatoren, die an dieser Attestierung teilgenommen haben | -| `daten` | Ein Container mit mehreren Unterfeldern | -| `signature` | Kollektivsignatur aller bescheinigenden Validatoren | +| :----------------- | :------------------------------------------------------------------------ | +| `aggregation_bits` | eine Liste, welche Validatoren an dieser Bestätigung teilgenommen haben | +| `data` | ein Container mit mehreren Unterfeldern | +| `signature` | aggregierte Signatur einer Gruppe von Validatoren für den `data`-Teil | -Das Feld `data` in `attestation` enthält folgende Elemente: +Das Feld `data` in der `attestation` enthält Folgendes: -| Feld | Beschreibung | -|:------------------- |:----------------------------------------------------------- | -| `Zeitspanne (Slot)` | Der Slot, auf den sich die Attestierung bezieht | -| `Index` | Indizes für die bescheinigenden Validatoren | -| `beacon_block_root` | Der Stamm-Hash des Beacon-Blocks, der dieses Objekt enthält | -| `quelle` | Der letzte berechtigte Kontrollpunkt | -| `target` | Der Grenzblock der neuesten Epoche | +| Feld | Beschreibung | +| :------------------ | :------------------------------------------------------------------------ | +| `slot` | der Slot, auf den sich die Bestätigung bezieht | +| `index` | Indizes für bestätigende Validatoren | +| `beacon_block_root` | der Root-Hash des Beacon-Blocks, der als Kopf der Kette angesehen wird | +| `source` | der letzte gerechtfertigte (justified) Checkpoint | +| `target` | der neueste Epochengrenzblock | -Die Ausführung der Transaktionen in der `execution_payload` aktualisiert den globalen Zustand. Alle Clients führen die Transaktionen in der `execution_payload` erneut aus, um sicherzustellen, dass der neue Zustand dem Zustand im neuen Block im Feld `state_root` entspricht. Auf diese Weise stellen Clients sicher, dass ein neuer Block gültig und sicher ist, um ihn der Blockchain hinzuzufügen. Der `execution payload` selbst ist ein Objekt mit mehreren Feldern. Es gibt auch einen `execution_payload_header`, der wichtige zusammengefasste Informationen über die auszuführenden Daten enthält. Diese Datenstrukturen sind wie folgt organisiert: +Das Ausführen der Transaktionen im `execution_payload` aktualisiert den globalen Zustand. Alle Anwendungen führen die Transaktionen im `execution_payload` erneut aus, um sicherzustellen, dass der neue Zustand mit dem im Feld `state_root` des neuen Blocks übereinstimmt. Auf diese Weise können Anwendungen erkennen, dass ein neuer Block gültig und sicher ist, um ihn ihrer Blockchain hinzuzufügen. Das `execution payload` selbst ist ein Objekt mit mehreren Feldern. Es gibt auch einen `execution_payload_header`, der wichtige zusammenfassende Informationen über die Ausführungsdaten enthält. Diese Datenstrukturen sind wie folgt organisiert: Der `execution_payload_header` enthält die folgenden Felder: -| Feld | Beschreibung | -|:--------------------- |:------------------------------------------------------------------------------------- | -| `übergeordneter_hash` | Hash des übergeordneten Blocks | -| `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | -| `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | -| `receipts_root` | Hash des Transaktionsempfänger-Baums | -| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | -| `prev_randao` | Verwendeter Wert in einer zufälligen Validatorauswahl | -| `block_number` | Die Nummer des aktuellen Blocks | -| `gas_limit` | Maximales für diesen Block erlaubtes Gas | -| `gas_used` | Die eingesetzte Menge an Gas in diesem Block | -| `Zeitstempel` | Die Blockzeit | -| `extra_data` | Beliebige zusätzliche Daten als rohe Bytes | -| `base_fee_per_gas` | Der Basisgebührenwert | -| `block_hash` | Hash des ausführenden Blocks | -| `transactions_root` | Stamm-Hash der Transaktionen in der Nutzlast | -| `withdrawal_root` | Stamm-Hash der Abhebungen in der Nutzlast | - -Die `execution_payload` selbst enthält Folgendes (das ist identisch zum Header, außer dass es anstatt des Stamm-Hash der Transaktionen die Liste der Transaktions- und Abhebungsinformationen enthält) : - -| Feld | Beschreibung | -|:--------------------- |:------------------------------------------------------------------------------------- | -| `übergeordneter_hash` | Hash des übergeordneten Blocks | -| `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | -| `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | -| `receipts_root` | Hash des Transaktionsempfänger-Baums | -| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | -| `prev_randao` | Verwendeter Wert in einer zufälligen Validatorauswahl | -| `block_number` | Die Nummer des aktuellen Blocks | -| `gas_limit` | Maximales für diesen Block erlaubtes Gas | -| `gas_used` | Die eingesetzte Menge an Gas in diesem Block | -| `Zeitstempel` | Die Blockzeit | -| `extra_data` | Beliebige zusätzliche Daten als rohe Bytes | -| `base_fee_per_gas` | Der Basisgebührenwert | -| `block_hash` | Hash des ausführenden Blocks | -| `Transaktionen` | Liste der Transaktionen, die ausgeführt werden sollen | -| `abhebungen` | Liste der Abhebungsobjekte | +| Feld | Beschreibung | +| :------------------ | :---------------------------------------------------------------------------------- | +| `parent_hash` | Hash des übergeordneten Blocks | +| `fee_recipient` | Kontoadresse für die Zahlung von Transaktionsgebühren | +| `state_root` | Root-Hash für den globalen Zustand nach Anwendung der Änderungen in diesem Block | +| `receipts_root` | Hash des Transaktionsbeleg-Tries | +| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | +| `prev_randao` | Wert, der bei der zufälligen Auswahl von Validatoren verwendet wird | +| `block_number` | die Nummer des aktuellen Blocks | +| `gas_limit` | maximal zulässiges Gaslimit in diesem Block | +| `gas_used` | die tatsächliche Menge an Gas, die in diesem Block verbraucht wurde | +| `timestamp` | die Blockzeit | +| `extra_data` | beliebige zusätzliche Daten als rohe Bytes | +| `base_fee_per_gas` | der Wert der Grundgebühr | +| `block_hash` | Hash des Ausführungsblocks | +| `transactions_root` | Root-Hash der Transaktionen im Payload | +| `withdrawal_root` | Root-Hash der Abhebungen im Payload | + +Das `execution_payload` selbst enthält Folgendes (beachten Sie, dass dies identisch mit dem Header ist, außer dass es anstelle des Root-Hashs der Transaktionen die tatsächliche Liste der Transaktionen und Abhebungsinformationen enthält): + +| Feld | Beschreibung | +| :----------------- | :---------------------------------------------------------------------------------- | +| `parent_hash` | Hash des übergeordneten Blocks | +| `fee_recipient` | Kontoadresse für die Zahlung von Transaktionsgebühren | +| `state_root` | Root-Hash für den globalen Zustand nach Anwendung der Änderungen in diesem Block | +| `receipts_root` | Hash des Transaktionsbeleg-Tries | +| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | +| `prev_randao` | Wert, der bei der zufälligen Auswahl von Validatoren verwendet wird | +| `block_number` | die Nummer des aktuellen Blocks | +| `gas_limit` | maximal zulässiges Gaslimit in diesem Block | +| `gas_used` | die tatsächliche Menge an Gas, die in diesem Block verbraucht wurde | +| `timestamp` | die Blockzeit | +| `extra_data` | beliebige zusätzliche Daten als rohe Bytes | +| `base_fee_per_gas` | der Wert der Grundgebühr | +| `block_hash` | Hash des Ausführungsblocks | +| `transactions` | Liste der auszuführenden Transaktionen | +| `withdrawals` | Liste der Abhebungsobjekte | Die Liste `withdrawals` enthält `withdrawal`-Objekte, die wie folgt strukturiert sind: -| Feld | Beschreibung | -|:---------------- |:---------------------------------------------- | -| `address` | Kontoadresse, für die die Abhebung erfolgt ist | -| `Betrag` | Abgehobener Betrag | -| `Index` | Abhebungsindexwert | -| `validatorIndex` | Validatorindexwert | +| Feld | Beschreibung | +| :--------------- | :--------------------------------- | +| `address` | Kontoadresse, die abgehoben hat | +| `amount` | Abhebungsbetrag | +| `index` | Indexwert der Abhebung | +| `validatorIndex` | Indexwert des Validators | ## Blockzeit {#block-time} -Die Blockzeit bezieht sich auf die Zeit zwischen Blöcken. In Ethereum wird Zeit in Einheiten zu je zwölf Sekunden aufgeteilt. Diese heißen "Slots". In jedem Slot wird ein Validator ausgewählt, der einen Block vorschlägt. Geht man davon aus, dass alle Validatoren online und voll funktionsfähig sind, wird es in jedem Slot einen Block gegen. Die zugehörige Blockzeit beträgt dann 12 Sekunden. Es kann jedoch vorkommen, dass Validatoren offline sind, wenn sie dazu aufgerufen werden einen Block vorzuschlagen. Der zugehörige Slot bleibt dann leer. +Die Blockzeit bezieht sich auf die Zeit, die Blöcke voneinander trennt. In Ethereum ist die Zeit in Einheiten von zwölf Sekunden unterteilt, die „Slots“ genannt werden. In jedem Slot wird ein einzelner Validator ausgewählt, um einen Block vorzuschlagen. Unter der Annahme, dass alle Validatoren online und voll funktionsfähig sind, wird es in jedem Slot einen Block geben, was bedeutet, dass die Blockzeit 12 Sekunden beträgt. Gelegentlich können Validatoren jedoch offline sein, wenn sie aufgerufen werden, einen Block vorzuschlagen, was bedeutet, dass Slots manchmal leer bleiben können. -Diese Implementierung unterscheidet sich von PoW-basierten Blockchain-Systemen, in denen die Erzeugung eines Blocks zu den probabilistischen Verfahren gehört, wodurch die Mining-Schwierigkeit des Protokolls ausgeglichen wird. Die [durchschnittliche Blockverbreitungszeit](https://etherscan.io/chart/blocktime) von Ethereum ist ein perfektes Beispiel für die Implementierung von Proof of Stake und damit für den Wechsel von Proof of Work (PoW) zu Proof of Stake (PoS), der durch eine weitere Anpassung der Blockverbreitungszeit auf 12 Sekunden ermöglicht wurde. +Diese Implementierung unterscheidet sich von Proof-of-Work-basierten Systemen, bei denen die Blockzeiten probabilistisch sind und durch die Ziel-Mining-Schwierigkeit des Protokolls abgestimmt werden. Ethereums [durchschnittliche Blockzeit](https://etherscan.io/chart/blocktime) ist ein perfektes Beispiel dafür, wobei der Übergang von Proof-of-Work zu Proof-of-Stake anhand der Konsistenz der neuen 12-Sekunden-Blockzeit klar abgeleitet werden kann. ## Blockgröße {#block-size} -Ein finaler, wichtiger Hinweis ist, dass Blöcke selbst in ihrer Größe begrenzt sind. Jeder Block hat eine Zielgröße von 30 Millionen Gas, aber die Größe der Blöcke wird entsprechend der Netznachfrage erhöht oder verringert, bis zur Blockgrenze von 60 Millionen Gas (doppelte Zielblockgröße). Das Gas-Limit eines Blocks kann um den Faktor 1/1024 vom Gas-Limit des vorangegangenen Blocks nach oben oder unten justiert werden. Dadurch können Validatoren das Gas-Limit eines Blocks durch Konsens verändern. Die Gesamtmenge des von allen Transaktionen im Block verbrauchten Gases muss unter dem Blockgaslimit liegen. Das ist wichtig, weil dadurch sichergestellt wird, dass Blöcke nicht willkürlich groß sein können. Wenn Blöcke beliebig groß sein könnten, würden weniger leistungsstarke Knoten aufgrund von Platz- und Geschwindigkeitsanforderungen allmählich nicht mehr mit dem Netzwerk Schritt halten können. Je größer der Block, desto höher ist die erforderliche Verarbeitungsleistung, um den Block rechtzeitig für das nächste Zeitintervall zu berechnen. Das ist ein ganz zentraler Aspekt, der durch die Begrenzung der Blockgröße umgangen wird. +Ein letzter wichtiger Hinweis ist, dass Blöcke selbst in ihrer Größe begrenzt sind. Jeder Block hat eine Zielgröße von 30 Millionen Gas, aber die Größe der Blöcke wird entsprechend den Netzwerkanforderungen steigen oder fallen, bis zum Blocklimit von 60 Millionen Gas (2x Zielblockgröße). Das Block-Gaslimit kann um einen Faktor von 1/1024 gegenüber dem Gaslimit des vorherigen Blocks nach oben oder unten angepasst werden. Infolgedessen können Validatoren das Block-Gaslimit durch Konsens ändern. Die Gesamtmenge an Gas, die von allen Transaktionen im Block verbraucht wird, muss geringer sein als das Block-Gaslimit. Dies ist wichtig, da es sicherstellt, dass Blöcke nicht beliebig groß sein können. Wenn Blöcke beliebig groß sein könnten, würden weniger leistungsfähige vollständige Blockchain-Knoten (Full Nodes) aufgrund von Platz- und Geschwindigkeitsanforderungen allmählich nicht mehr mit dem Netzwerk mithalten können. Je größer der Block, desto größer ist die Rechenleistung, die erforderlich ist, um ihn rechtzeitig für den nächsten Slot zu verarbeiten. Dies ist eine zentralisierende Kraft, der durch die Begrenzung der Blockgrößen entgegengewirkt wird. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Transaktionen](/developers/docs/transactions/) -- [Ressourcen](/developers/docs/gas/) -- [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) +- [Gas](/developers/docs/gas/) +- [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/bridges/index.md b/public/content/translations/de/developers/docs/bridges/index.md new file mode 100644 index 00000000000..8778f133bab --- /dev/null +++ b/public/content/translations/de/developers/docs/bridges/index.md @@ -0,0 +1,138 @@ +--- +title: "Kettenübergreifende Brücken" +description: "Ein Überblick über das Bridging für Entwickler" +lang: de +--- + +Mit der Verbreitung von L1-Blockchains und L2-[Skalierungslösungen](/developers/docs/scaling/) sowie einer ständig wachsenden Zahl von dezentralisierten Anwendungen, die kettenübergreifend agieren, ist der Bedarf an Kommunikation und der Bewegung von Vermögenswerten über verschiedene Chains hinweg zu einem wesentlichen Bestandteil der Netzwerkinfrastruktur geworden. Es gibt verschiedene Arten von kettenübergreifenden Brücken, um dies zu ermöglichen. + +## Bedarf an kettenübergreifenden Brücken {#need-for-bridges} + +Kettenübergreifende Brücken existieren, um Blockchain-Netzwerke miteinander zu verbinden. Sie ermöglichen Konnektivität und Interoperabilität zwischen Blockchains. + +Blockchains existieren in isolierten Umgebungen, was bedeutet, dass es für Blockchains keine natürliche Möglichkeit gibt, mit anderen Blockchains zu handeln und zu kommunizieren. Infolgedessen kann es zwar erhebliche Aktivitäten und Innovationen innerhalb eines Ökosystems geben, diese werden jedoch durch die mangelnde Konnektivität und Interoperabilität mit anderen Ökosystemen eingeschränkt. + +Kettenübergreifende Brücken bieten eine Möglichkeit für isolierte Blockchain-Umgebungen, sich miteinander zu verbinden. Sie richten eine Transportroute zwischen Blockchains ein, auf der Token, Nachrichten, beliebige Daten und sogar [Smart Contract](/developers/docs/smart-contracts/)-Aufrufe von einer Chain zur anderen übertragen werden können. + +## Vorteile von kettenübergreifenden Brücken {#benefits-of-bridges} + +Einfach ausgedrückt, erschließen kettenübergreifende Brücken zahlreiche Anwendungsfälle, indem sie es Blockchain-Netzwerken ermöglichen, Daten auszutauschen und Vermögenswerte untereinander zu verschieben. + +Blockchains haben einzigartige Stärken, Schwächen und Ansätze zur Entwicklung von Anwendungen (wie Geschwindigkeit, Durchsatz, Kosten usw.). Kettenübergreifende Brücken unterstützen die Entwicklung des gesamten Krypto-Ökosystems, indem sie es Blockchains ermöglichen, die Innovationen der jeweils anderen zu nutzen. + +Für Entwickler ermöglichen kettenübergreifende Brücken Folgendes: + +- die Übertragung beliebiger Daten, Informationen und Vermögenswerte über Chains hinweg. +- die Erschließung neuer Funktionen und Anwendungsfälle für Protokolle, da kettenübergreifende Brücken den Gestaltungsspielraum für das Angebot von Protokollen erweitern. Zum Beispiel kann ein Protokoll für Yield Farming, das ursprünglich im [Ethereum](/)-Mainnet bereitgestellt wurde, Liquiditätspools über alle EVM-kompatiblen Chains hinweg anbieten. +- die Möglichkeit, die Stärken verschiedener Blockchains zu nutzen. Beispielsweise können Entwickler von den niedrigeren Gebühren der verschiedenen L2-Lösungen profitieren, indem sie ihre Dapps über Rollups und Sidechains hinweg bereitstellen, und Benutzer können diese über Brücken hinweg nutzen. +- die Zusammenarbeit von Entwicklern aus verschiedenen Blockchain-Ökosystemen zur Entwicklung neuer Produkte. +- die Gewinnung von Benutzern und Communitys aus verschiedenen Ökosystemen für ihre Dapps. + +## Wie funktionieren kettenübergreifende Brücken? {#how-do-bridges-work} + +Obwohl es viele [Arten von Brückendesigns](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/) gibt, stechen drei Methoden zur Erleichterung des kettenübergreifenden Transfers von Vermögenswerten hervor: + +- **Sperren und Prägen (Lock and mint) –** Sperren von Vermögenswerten auf der Quell-Chain und Prägen von Vermögenswerten auf der Ziel-Chain. +- **Verbrennen und Prägen (Burn and mint) –** Verbrennen von Vermögenswerten auf der Quell-Chain und Prägen von Vermögenswerten auf der Ziel-Chain. +- **Atomic Swaps –** Tauschen von Vermögenswerten auf der Quell-Chain gegen Vermögenswerte auf der Ziel-Chain mit einer anderen Partei. + +## Arten von kettenübergreifenden Brücken {#bridge-types} + +Kettenübergreifende Brücken lassen sich in der Regel in eine der folgenden Kategorien einteilen: + +- **Native Brücken –** Diese Brücken werden in der Regel gebaut, um Liquidität auf einer bestimmten Blockchain aufzubauen und es Benutzern zu erleichtern, Gelder in das Ökosystem zu verschieben. Beispielsweise wurde die [Arbitrum Bridge](https://bridge.arbitrum.io/) entwickelt, um es Benutzern bequem zu machen, vom Ethereum-Mainnet zu Arbitrum zu wechseln. Weitere solcher Brücken sind die Polygon PoS Bridge, das [Optimism Gateway](https://app.optimism.io/bridge) usw. +- **Auf Validatoren oder Orakeln basierende Brücken –** Diese Brücken stützen sich auf ein externes Set von Validatoren oder Orakeln, um kettenübergreifende Transfers zu validieren. Beispiele: Multichain und Across. +- **Brücken zur verallgemeinerten Nachrichtenübermittlung –** Diese Brücken können Vermögenswerte zusammen mit Nachrichten und beliebigen Daten über Chains hinweg übertragen. Beispiele: Axelar, LayerZero und Nomad. +- **Liquiditätsnetzwerke –** Diese Brücken konzentrieren sich in erster Linie auf die Übertragung von Vermögenswerten von einer Chain zur anderen über Atomic Swaps. Im Allgemeinen unterstützen sie keine kettenübergreifende Nachrichtenübermittlung. Beispiele: Connext und Hop. + +## Zu berücksichtigende Kompromisse {#trade-offs} + +Bei kettenübergreifenden Brücken gibt es keine perfekten Lösungen. Vielmehr gibt es nur Kompromisse, die eingegangen werden, um einen Zweck zu erfüllen. Entwickler und Benutzer können Brücken anhand der folgenden Faktoren bewerten: + +- **Sicherheit –** Wer verifiziert das System? Brücken, die durch externe Validatoren gesichert sind, sind in der Regel weniger sicher als Brücken, die lokal oder nativ durch die Validatoren der Blockchain gesichert sind. +- **Komfort –** Wie lange dauert es, eine Transaktion abzuschließen, und wie viele Transaktionen musste ein Benutzer signieren? Für einen Entwickler: Wie lange dauert es, eine Brücke zu integrieren, und wie komplex ist der Prozess? +- **Konnektivität –** Welche verschiedenen Ziel-Chains kann eine Brücke verbinden (d. h. Rollups, Sidechains, andere Layer-1-Blockchains usw.), und wie schwer ist es, eine neue Blockchain zu integrieren? +- **Fähigkeit zur Weitergabe komplexerer Daten –** Kann eine Brücke die Übertragung von Nachrichten und komplexeren beliebigen Daten über Chains hinweg ermöglichen, oder unterstützt sie nur kettenübergreifende Transfers von Vermögenswerten? +- **Kosteneffizienz –** Wie viel kostet es, Vermögenswerte über eine Brücke über Chains hinweg zu übertragen? In der Regel erheben Brücken eine feste oder variable Gebühr, die von den Gaskosten und der Liquidität bestimmter Routen abhängt. Es ist auch entscheidend, die Kosteneffizienz einer Brücke auf der Grundlage des Kapitals zu bewerten, das zur Gewährleistung ihrer Sicherheit erforderlich ist. + +Auf einer hohen Ebene können kettenübergreifende Brücken in vertrauenswürdige (trusted) und vertrauenslose (trustless) Brücken kategorisiert werden. + +- **Vertrauenswürdig (Trusted) –** Vertrauenswürdige Brücken werden extern verifiziert. Sie verwenden ein externes Set von Verifizierern (Föderationen mit Mehrfachsignatur, Multi-Party-Computation-Systeme, Orakel-Netzwerke), um Daten über Chains hinweg zu senden. Infolgedessen können sie eine hervorragende Konnektivität bieten und eine vollständig verallgemeinerte Nachrichtenübermittlung über Chains hinweg ermöglichen. Sie schneiden auch in Bezug auf Geschwindigkeit und Kosteneffizienz tendenziell gut ab. Dies geht auf Kosten der Sicherheit, da sich die Benutzer auf die Sicherheit der Brücke verlassen müssen. +- **Vertrauenslos (Trustless) –** Diese Brücken stützen sich auf die Blockchains, die sie verbinden, und deren Validatoren, um Nachrichten und Token zu übertragen. Sie sind „vertrauenslos“, weil sie keine neuen Vertrauensannahmen (zusätzlich zu den Blockchains) hinzufügen. Infolgedessen gelten vertrauenslose Brücken als sicherer als vertrauenswürdige Brücken. + +Um vertrauenslose Brücken anhand anderer Faktoren zu bewerten, müssen wir sie in Brücken zur verallgemeinerten Nachrichtenübermittlung und Liquiditätsnetzwerke unterteilen. + +- **Brücken zur verallgemeinerten Nachrichtenübermittlung –** Diese Brücken zeichnen sich durch Sicherheit und die Fähigkeit aus, komplexere Daten über Chains hinweg zu übertragen. In der Regel sind sie auch kosteneffizient. Diese Stärken gehen jedoch im Allgemeinen auf Kosten der Konnektivität bei Light-Client-Brücken (z. B. IBC) und Geschwindigkeitsnachteilen bei optimistischen Brücken (z. B. Nomad), die Betrugsnachweise verwenden. +- **Liquiditätsnetzwerke –** Diese Brücken verwenden Atomic Swaps zur Übertragung von Vermögenswerten und sind lokal verifizierte Systeme (d. h. sie verwenden die Validatoren der zugrunde liegenden Blockchains, um Transaktionen zu verifizieren). Infolgedessen zeichnen sie sich durch Sicherheit und Geschwindigkeit aus. Darüber hinaus gelten sie als vergleichsweise kosteneffizient und bieten eine gute Konnektivität. Der größte Kompromiss ist jedoch ihre Unfähigkeit, komplexere Daten weiterzugeben – da sie keine kettenübergreifende Nachrichtenübermittlung unterstützen. + +## Risiken bei kettenübergreifenden Brücken {#risk-with-bridges} + +Kettenübergreifende Brücken sind für die drei [größten Hacks im DeFi-Bereich](https://rekt.news/leaderboard/) verantwortlich und befinden sich noch in einem frühen Entwicklungsstadium. Die Nutzung einer Brücke birgt die folgenden Risiken: + +- **Smart-Contract-Risiko –** Obwohl viele Brücken Audits erfolgreich bestanden haben, reicht ein einziger Fehler in einem Smart Contract aus, um Vermögenswerte Hacks auszusetzen (z. B. [Solanas Wormhole Bridge](https://rekt.news/wormhole-rekt/)). +- **Systemische finanzielle Risiken** – Viele Brücken verwenden Wrapped Assets, um kanonische Versionen des ursprünglichen Vermögenswerts auf einer neuen Chain zu prägen. Dies setzt das Ökosystem einem systemischen Risiko aus, da wir bereits gesehen haben, wie Wrapped-Versionen von Token ausgenutzt wurden. +- **Kontrahentenrisiko –** Einige Brücken verwenden ein vertrauenswürdiges Design, das erfordert, dass sich Benutzer auf die Annahme verlassen, dass Validatoren nicht zusammenarbeiten, um Benutzergelder zu stehlen. Die Notwendigkeit für Benutzer, diesen Drittakteuren zu vertrauen, setzt sie Risiken wie Rug Pulls, Zensur und anderen böswilligen Aktivitäten aus. +- **Offene Fragen –** Da sich Brücken noch in der Anfangsphase der Entwicklung befinden, gibt es viele unbeantwortete Fragen dazu, wie sich Brücken unter verschiedenen Marktbedingungen verhalten werden, z. B. in Zeiten von Netzwerküberlastungen und bei unvorhergesehenen Ereignissen wie Angriffen auf Netzwerkebene oder State Rollbacks. Diese Unsicherheit birgt gewisse Risiken, deren Ausmaß noch unbekannt ist. + +## Wie können Dapps kettenübergreifende Brücken nutzen? {#how-can-dapps-use-bridges} + +Hier sind einige praktische Anwendungen, die Entwickler in Bezug auf Brücken und die kettenübergreifende Ausrichtung ihrer Dapp in Betracht ziehen können: + +### Integration von kettenübergreifenden Brücken {#integrating-bridges} + +Für Entwickler gibt es viele Möglichkeiten, Unterstützung für Brücken hinzuzufügen: + +1. **Aufbau einer eigenen Brücke –** Der Aufbau einer sicheren und zuverlässigen Brücke ist nicht einfach, insbesondere wenn man einen Weg mit minimiertem Vertrauen wählt. Darüber hinaus erfordert es jahrelange Erfahrung und technisches Fachwissen im Zusammenhang mit Skalierbarkeits- und Interoperabilitätsstudien. Zusätzlich wäre ein engagiertes Team erforderlich, um eine Brücke zu warten und ausreichend Liquidität anzuziehen, um sie rentabel zu machen. + +2. **Benutzern mehrere Brückenoptionen anzeigen –** Viele [Dapps](/developers/docs/dapps/) erfordern, dass Benutzer ihren nativen Token besitzen, um mit ihnen zu interagieren. Um Benutzern den Zugriff auf ihre Token zu ermöglichen, bieten sie auf ihrer Website verschiedene Brückenoptionen an. Diese Methode ist jedoch nur eine schnelle Lösung für das Problem, da sie den Benutzer von der Dapp-Schnittstelle wegführt und ihn dennoch zwingt, mit anderen Dapps und Brücken zu interagieren. Dies ist eine umständliche Onboarding-Erfahrung mit einem erhöhten Risiko, Fehler zu machen. + +3. **Integration einer Brücke –** Diese Lösung erfordert nicht, dass die Dapp Benutzer zu externen Brücken- und DEX-Schnittstellen weiterleitet. Sie ermöglicht es Dapps, die Onboarding-Erfahrung der Benutzer zu verbessern. Dieser Ansatz hat jedoch seine Grenzen: + + - Die Bewertung und Wartung von Brücken ist schwierig und zeitaufwändig. + - Die Auswahl einer einzigen Brücke schafft einen Single Point of Failure und eine Abhängigkeit. + - Die Dapp ist durch die Fähigkeiten der Brücke eingeschränkt. + - Brücken allein reichen möglicherweise nicht aus. Dapps benötigen möglicherweise DEXs, um mehr Funktionen wie kettenübergreifende Swaps anzubieten. + +4. **Integration mehrerer Brücken –** Diese Lösung löst viele Probleme, die mit der Integration einer einzelnen Brücke verbunden sind. Sie hat jedoch auch Einschränkungen, da die Integration mehrerer Brücken ressourcenintensiv ist und technische sowie kommunikative Mehraufwände für Entwickler schafft – die knappste Ressource im Krypto-Bereich. + +5. **Integration eines Brücken-Aggregators –** Eine weitere Option für Dapps ist die Integration einer Brücken-Aggregationslösung, die ihnen Zugriff auf mehrere Brücken bietet. Brücken-Aggregatoren erben die Stärken aller Brücken und sind somit nicht durch die Fähigkeiten einer einzelnen Brücke eingeschränkt. Insbesondere pflegen die Brücken-Aggregatoren in der Regel die Brückenintegrationen, was der Dapp die Mühe erspart, sich um die technischen und operativen Aspekte einer Brückenintegration kümmern zu müssen. + +Allerdings haben auch Brücken-Aggregatoren ihre Grenzen. Zum Beispiel können sie zwar mehr Brückenoptionen anbieten, aber auf dem Markt sind in der Regel noch viel mehr Brücken verfügbar als die, die auf der Plattform des Aggregators angeboten werden. Darüber hinaus sind Brücken-Aggregatoren genau wie Brücken auch Smart-Contract- und Technologierisiken ausgesetzt (mehr Smart Contracts = mehr Risiken). + +Wenn eine Dapp den Weg der Integration einer Brücke oder eines Aggregators wählt, gibt es verschiedene Optionen, je nachdem, wie tief die Integration sein soll. Wenn es sich beispielsweise nur um eine Front-End-Integration handelt, um die Onboarding-Erfahrung der Benutzer zu verbessern, würde eine Dapp das Widget integrieren. Wenn die Integration jedoch dazu dient, tiefere kettenübergreifende Strategien wie Staking, Yield Farming usw. zu erkunden, integriert die Dapp das SDK oder die API. + +### Bereitstellung einer Dapp auf mehreren Chains {#deploying-a-dapp-on-multiple-chains} + +Um eine Dapp auf mehreren Chains bereitzustellen, können Entwickler Entwicklungsplattformen wie [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/) usw. verwenden. In der Regel verfügen diese Plattformen über zusammensetzbare Plugins, die es Dapps ermöglichen, kettenübergreifend zu agieren. Beispielsweise können Entwickler einen deterministischen Bereitstellungs-Proxy verwenden, der vom [hardhat-deploy-Plugin](https://github.com/wighawag/hardhat-deploy) angeboten wird. + +#### Beispiele: + +- [How to build cross-chain dapps](https://moralis.io/how-to-build-cross-chain-dapps/) +- [Building a Cross-Chain NFT Marketplace](https://youtu.be/WZWCzsB1xUE) +- [Moralis: Building cross-chain NFT dapps](https://www.youtube.com/watch?v=ehv70kE1QYo) + +### Überwachung der Vertragsaktivität über Chains hinweg {#monitoring-contract-activity-across-chains} + +Um die Vertragsaktivität über Chains hinweg zu überwachen, können Entwickler Subgraphen und Entwicklerplattformen wie Tenderly verwenden, um Smart Contracts in Echtzeit zu beobachten. Solche Plattformen verfügen auch über Tools, die eine größere Datenüberwachungsfunktionalität für kettenübergreifende Aktivitäten bieten, wie z. B. die Überprüfung auf [von Verträgen ausgegebene Ereignisse](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events) usw. + +#### Tools + +- [The Graph](https://thegraph.com/en/) +- [Tenderly](https://tenderly.co/) + +## Weiterführende Literatur {#further-reading} + +- [Kettenübergreifende Blockchain-Brücken](/bridges/) – ethereum.org +- [L2Beat Bridge Risk Framework](https://l2beat.com/bridges/summary) +- [Blockchain Bridges: Building Networks of Cryptonetworks](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) - 8. Sep. 2021 – Dmitriy Berenzon +- [The Interoperability Trilemma](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) - 1. Okt. 2021 – Arjun Bhuptani +- [Clusters: How Trusted & Trust-Minimized Bridges Shape the Multi-Chain Landscape](https://blog.celestia.org/clusters/) - 4. Okt. 2021 – Mustafa Al-Bassam +- [LI.FI: With Bridges, Trust is a Spectrum](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) - 28. Apr. 2022 – Arjun Chand +- [The State Of Rollup Interoperability Solutions](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - 20. Juni 2024 – Alex Hook +- [Harnessing Shared Security For Secure Cross-Chain Interoperability: Lagrange State Committees And Beyond](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - 12. Juni 2024 – Emmanuel Awosika + +Darüber hinaus finden Sie hier einige aufschlussreiche Präsentationen von [James Prestwich](https://twitter.com/_prestwich), die dabei helfen können, ein tieferes Verständnis für kettenübergreifende Brücken zu entwickeln: + +- [Building Bridges, Not Walled Gardens](https://youtu.be/ZQJWMiX4hT0) +- [Breaking Down Bridges](https://youtu.be/b0mC-ZqN8Oo) +- [Why are the Bridges Burning](https://youtu.be/c7cm2kd20j8) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/index.md index ffbf5c088ab..c66345b9019 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/index.md @@ -1,30 +1,30 @@ --- -title: Konsensmechanismus -description: Eine Erklärung von Konsensprotokollen in verteilten Systemen und die Rolle, die sie in Ethereum spielen. +title: Konsensmechanismen +description: "Eine Erklärung von Konsensprotokollen in verteilten Systemen und der Rolle, die sie bei Ethereum spielen." lang: de --- -Der Begriff „Konsensmechanismus“ wird oft umgangssprachlich verwendet, um „Proof-of-Stake“-, „Proof-of-Work“- oder „Proof-of-Authority“-Protokolle zu beschreiben. Dies sind jedoch nur Komponenten in Konsensmechanismen, die vor [Sybil-Angriffen](/glossary/#sybil-attack) schützen. Konsensmechanismen sind der komplette Stack von Ideen, Protokollen und Anreizen, die es einer verteilten Reihe von Nodes ermöglichen, sich über den Zustand einer Blockchain zu einigen. +Der Begriff „Konsensmechanismus“ wird umgangssprachlich oft verwendet, um sich auf „Proof-of-Stake“-, „Proof-of-Work“- oder „Proof-of-Authority“-Protokolle zu beziehen. Dies sind jedoch nur Komponenten in Konsensmechanismen, die vor [Sybil-Angriffen](/glossary/#sybil-attack) schützen. Konsensmechanismen sind der komplette Stack aus Ideen, Protokollen und Anreizen, die es einer verteilten Gruppe von Blockchain-Knoten ermöglichen, sich auf den Zustand einer Blockchain zu einigen. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst unsere [Einleitung zu Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. -## Was ist ein Konsens? {#what-is-consensus} +## Was ist Konsens? {#what-is-consensus} -Unter einem Konsens verstehen wir, dass eine allgemeine Einigung erzielt wurde. Stellen Sie sich vor, eine Gruppe von Menschen geht ins Kino. Wenn es keine Meinungsverschiedenheiten über einen vorgeschlagenen Film gibt, dann besteht Konsens. Wenn es zu Uneinigkeiten kommt, muss die Gruppe über die Mittel verfügen, um zu entscheiden, welchen Film sie sehen möchte. In extremen Fällen wird die Gruppe sich irgendwann aufteilen. +Unter Konsens verstehen wir, dass eine allgemeine Einigung erzielt wurde. Stellen Sie sich eine Gruppe von Menschen vor, die ins Kino gehen. Wenn es keine Meinungsverschiedenheiten über die vorgeschlagene Filmauswahl gibt, ist ein Konsens erreicht. Wenn es Meinungsverschiedenheiten gibt, muss die Gruppe über Mittel verfügen, um zu entscheiden, welchen Film sie sehen möchte. In extremen Fällen wird sich die Gruppe schließlich aufteilen. -Im Zusammenhang mit der Ethereum-Blockchain ist der Prozess formalisiert. Das Erreichen von Konsens bedeutet, dass mindestens 66 % der Nodes im Netzwerk sich auf den globalen Zustand des Netzwerks einigen. +In Bezug auf die [Ethereum](/)-Blockchain ist der Prozess formalisiert, und das Erreichen eines Konsenses bedeutet, dass mindestens 66 % der Blockchain-Knoten im Netzwerk über den globalen Zustand des Netzwerks einig sind. ## Was ist ein Konsensmechanismus? {#what-is-a-consensus-mechanism} -Der Begriff „Konsensmechanismus“ bezieht sich auf den gesamten Stack von Protokollen, Anreizen und Ideen, die es einem Netzwerk von Nodes ermöglichen, sich auf den Zustand einer Blockchain zu einigen. +Der Begriff Konsensmechanismus bezieht sich auf den gesamten Stack von Protokollen, Anreizen und Ideen, die es einem Netzwerk von Blockchain-Knoten ermöglichen, sich auf den Zustand einer Blockchain zu einigen. -Ethereum verwendet einen auf Proof-of-Stake basierenden Konsensmechanismus, der seine kryptoökonomische Sicherheit aus einer Reihe von Belohnungen und Strafen ableitet, die auf das von Stakern gesperrte Kapital angewendet werden. Diese Anreizstruktur ermutigt einzelne Staker dazu, ehrliche Validatoren zu betreiben, bestraft diejenigen, die dies nicht tun, und schafft extrem hohe Kosten für Angriffe auf das Netzwerk. +Ethereum verwendet einen auf Proof-of-Stake basierenden Konsensmechanismus, der seine kryptoökonomische Sicherheit aus einer Reihe von Belohnungen und Strafen ableitet, die auf das von Stakern gesperrte Kapital angewendet werden. Diese Anreizstruktur ermutigt einzelne Staker, ehrliche Validatoren zu betreiben, bestraft diejenigen, die dies nicht tun, und verursacht extrem hohe Kosten für einen Angriff auf das Netzwerk. -Es existiert darüber hinaus ein Protokoll, das den Auswahlprozess ehrlicher Validatoren bestimmt, die Blöcke vorschlagen oder validieren, Transaktionen verarbeiten und ihre Stimme bezüglich ihrer Sicht auf die Spitze der Chain abgeben. In den seltenen Situationen, in denen mehrere Blöcke sich in der gleichen Position nahe der Spitze der Chain befinden, kommt ein Abspaltungs-Wahl-Mechanismus zum Tragen. Hierbei werden die Blöcke auswählt, die die „schwerste“ Kette bilden, und zwar gemessen an der Anzahl der Validatoren, die für die Blöcke gestimmt haben, gewichtet nach ihrem eingesetzten Ether-Guthaben. +Dann gibt es ein Protokoll, das regelt, wie ehrliche Validatoren ausgewählt werden, um Blöcke vorzuschlagen oder zu validieren, Transaktionen zu verarbeiten und für ihre Sicht auf die Spitze der Chain abzustimmen. In den seltenen Situationen, in denen sich mehrere Blöcke an derselben Position in der Nähe der Spitze der Chain befinden, gibt es einen Fork-Choice-Mechanismus, der Blöcke auswählt, die die „schwerste“ Chain bilden, gemessen an der Anzahl der Validatoren, die für die Blöcke gestimmt haben, gewichtet nach ihrem gestakten Ether-Guthaben. -Einige Konzepte, die für den Konsens wichtig sind, sind nicht explizit im Code definiert. Dazu gehört etwa die zusätzliche Sicherheit, die durch potenzielle soziale Koordination außerhalb des Bands als letzte Verteidigungslinie gegen Angriffe auf das Netzwerk geboten wird. +Einige Konzepte sind für den Konsens wichtig, die nicht explizit im Code definiert sind, wie z. B. die zusätzliche Sicherheit, die durch eine potenzielle Out-of-Band-soziale Koordination als letzte Verteidigungslinie gegen Angriffe auf das Netzwerk geboten wird. Diese Komponenten bilden zusammen den Konsensmechanismus. @@ -32,61 +32,61 @@ Diese Komponenten bilden zusammen den Konsensmechanismus. ### Proof-of-Work-basiert {#proof-of-work} -Wie Bitcoin nutzte auch Ethereum früher ein auf **Proof-of-Work (PoW)** basierendes Konsensprotokoll. +Wie Bitcoin verwendete Ethereum einst ein auf **Proof-of-Work (PoW)** basierendes Konsensprotokoll. -#### Blockerstellung {#pow-block-creation} +#### Block-Erstellung {#pow-block-creation} -Miner konkurrieren darum, neue Blöcke voll mit verarbeiteten Transaktionen zu erstellen. Der Gewinner teilt den neuen Block mit dem Rest des Netzwerks und verdient einige frisch geprägte ETH. Das Rennen wird von dem Computer gewonnen, der ein mathematisches Rätsel am schnellsten lösen kann. Dies erzeugt die kryptografische Verbindung zwischen dem aktuellen Block und dem vorherigen Block. Die Lösung dieses Rätsels ist die Arbeit („Work“) in „Proof-of-Work“. Die kanonische Chain wird dann durch eine Abspaltungs-Wahl-Regel bestimmt, bei der die Reihe von Blöcken ausgewählt wird, für deren Mining die meiste Arbeit geleistet wurde. +Miner konkurrieren darum, neue Blöcke zu erstellen, die mit verarbeiteten Transaktionen gefüllt sind. Der Gewinner teilt den neuen Block mit dem Rest des Netzwerks und verdient etwas frisch geprägtes ETH. Das Rennen gewinnt der Computer, der ein mathematisches Rätsel am schnellsten lösen kann. Dies erzeugt die kryptografische Verbindung zwischen dem aktuellen Block und dem vorhergehenden Block. Das Lösen dieses Rätsels ist die Arbeit (Work) in „Proof-of-Work“. Die kanonische Chain wird dann durch eine Fork-Choice-Regel bestimmt, die die Menge an Blöcken auswählt, für deren Mining die meiste Arbeit aufgewendet wurde. #### Sicherheit {#pow-security} -Die Sicherheit des Netzwerks wird dadurch gewährleistet, dass Sie 51 % der Rechenleistung des Netzwerks brauchen, um die Chain zu betrügen. Das würde so große Investitionen in Ausrüstung und Energie erfordern, dass Sie wahrscheinlich mehr ausgeben würden, als Sie einnehmen. +Das Netzwerk wird dadurch sicher gehalten, dass man 51 % der Rechenleistung des Netzwerks benötigen würde, um die Chain zu betrügen. Dies würde so enorme Investitionen in Ausrüstung und Energie erfordern, dass man wahrscheinlich mehr ausgeben würde, als man gewinnen könnte. -Mehr über [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) +Mehr zu [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) ### Proof-of-Stake-basiert {#proof-of-stake} -Ethereum verwendet jetzt ein auf **Proof-of-Stake (PoS)** basierendes Konsensprotokoll. +Ethereum verwendet nun ein auf **Proof-of-Stake (PoS)** basierendes Konsensprotokoll. -#### Blockerstellung {#pos-block-creation} +#### Block-Erstellung {#pos-block-creation} -Validatoren erstellen Blöcke. In jedem Slot wird zufällig ein Validator als Block-Proposer ausgewählt. Ihr Konsens-Client fordert ein Bündel von Transaktionen als „Ausführungsnutzlast“ von ihrem gekoppelten Ausführungs-Client an. Sie verpacken dies in Konsensdaten, um einen Block zu bilden, den sie an andere Nodes im Ethereum-Netzwerk senden. Diese Blockproduktion wird mit ETH belohnt. In seltenen Fällen, wenn für einen einzigen Slot mehrere mögliche Blöcke existieren oder Nodes zu unterschiedlichen Zeiten von Blöcken erfahren, wählt der Abspaltungs-Wahl-Algorithmus den Block aus, der die Chain mit dem größten Gewicht an Attestierungen bildet (wobei das Gewicht die Anzahl der attestierenden Validatoren ist, skaliert nach ihrem ETH-Guthaben). +Validatoren erstellen Blöcke. Ein Validator wird in jedem Slot zufällig als Block-Vorschlagender ausgewählt. Sein Konsens-Client fordert ein Bündel von Transaktionen als „Ausführungs-Payload“ von seinem gekoppelten Ausführungs-Client an. Er verpackt dies in Konsensdaten, um einen Block zu bilden, den er an andere Blockchain-Knoten im Ethereum-Netzwerk sendet. Diese Blockproduktion wird in ETH belohnt. In seltenen Fällen, in denen mehrere mögliche Blöcke für einen einzelnen Slot existieren oder Blockchain-Knoten zu unterschiedlichen Zeiten von Blöcken erfahren, wählt der Fork-Choice-Algorithmus den Block aus, der die Chain mit dem größten Gewicht an Bestätigungen bildet (wobei das Gewicht die Anzahl der bestätigenden Validatoren skaliert nach ihrem ETH-Guthaben ist). #### Sicherheit {#pos-security} -Ein Proof-of-Stake-System ist kryptoökonomisch sicher, weil ein Angreifer, der versucht, die Kontrolle über die Chain zu übernehmen, eine massive Menge an ETH zerstören muss. Ein Belohnungssystem setzt Anreize für einzelne Staker, ehrlich zu handeln, und Strafen halten Staker davon ab, mit böswilliger Absicht zu handeln. +Ein Proof-of-Stake-System ist kryptoökonomisch sicher, da ein Angreifer, der versucht, die Kontrolle über die Chain zu übernehmen, eine massive Menge an ETH zerstören muss. Ein System von Belohnungen bietet einzelnen Stakern Anreize, sich ehrlich zu verhalten, und Strafen schrecken Staker davon ab, böswillig zu handeln. Mehr zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) ### Ein visueller Leitfaden {#types-of-consensus-video} -Erfahren Sie mehr über die verschiedenen Arten von Konsensmechanismen, die auf Ethereum verwendet werden: +Sehen Sie sich mehr zu den verschiedenen Arten von Konsensmechanismen an, die bei Ethereum verwendet werden: -### Sybil: Widerstand & Kettenauswahl {#sybil-chain} +### Sybil-Resistenz & Chain-Auswahl {#sybil-chain} -Proof-of-Work und Proof-of-Stake sind für sich genommen keine Konsensprotokolle, aber sie werden oft der Einfachheit halber als solche bezeichnet. Sie sind eigentlich Sybil-Widerstandsmechanismen und Blockautor-Selektoren; sie bieten eine Möglichkeit, zu entscheiden, wer der Autor des letzten Blocks ist. Eine weitere wichtige Komponente ist der Chain-Auswahl-(auch Abspaltungs-Wahl-)Algorithmus. Er ermöglicht es Nodes, in Szenarien, bei denen mehrere Blöcke in der gleichen Position existieren, einen einzigen korrekten Block an der Spitze der Chain auszuwählen. +Proof-of-Work und Proof-of-Stake allein sind keine Konsensprotokolle, werden aber der Einfachheit halber oft als solche bezeichnet. Sie sind eigentlich Sybil-Resistenzmechanismen und Selektoren für Blockautoren; sie sind eine Möglichkeit zu entscheiden, wer der Autor des neuesten Blocks ist. Eine weitere wichtige Komponente ist der Chain-Auswahl-Algorithmus (auch Fork-Choice genannt), der es Blockchain-Knoten ermöglicht, in Szenarien, in denen mehrere Blöcke an derselben Position existieren, einen einzigen korrekten Block an der Spitze der Chain auszuwählen. -Mit dem **Sybil-Widerstand** wird gemessen, wie ein Protokoll gegen einen Sybil-Angriff abschneidet. Der Widerstand gegen diese Art von Angriffen ist für eine dezentrale Blockchain unerlässlich und ermöglicht es Minern und Validatoren, gleichermaßen entsprechend der eingesetzten Ressourcen belohnt zu werden. Proof-of-Work und Proof-of-Stake schützen davor, indem sie die Benutzer dazu bringen, viel Energie aufzuwenden oder viele Sicherheiten bereitzustellen. Diese Schutzmaßnahmen sind eine wirtschaftliche Abschreckung gegen Sybil-Angriffe. +**Sybil-Resistenz** misst, wie sich ein Protokoll gegen einen Sybil-Angriff behauptet. Die Resistenz gegen diese Art von Angriff ist für eine dezentralisierte Blockchain unerlässlich und ermöglicht es, Miner und Validatoren basierend auf den eingesetzten Ressourcen gleichermaßen zu belohnen. Proof-of-Work und Proof-of-Stake schützen davor, indem sie Benutzer dazu zwingen, viel Energie aufzuwenden oder viele Sicherheiten zu hinterlegen. Diese Schutzmaßnahmen sind eine wirtschaftliche Abschreckung gegen Sybil-Angriffe. -Eine **Chain-Auswahlregel** wird verwendet, um zu entscheiden, welche Chain die „richtige“ ist. Bitcoin verwendet die „längste Chain“-Regel. Das bedeutet, dass die Blockchain, die am längsten ist, von den restlichen Nodes als gültig akzeptiert wird, sodass sie mit ihr arbeiten. Bei Proof-of-Work-Chains wird die längste Chain auf Basis der gesamten kumulativen Proof-of-Work-Schwierigkeit der Chain bestimmt. Bei Ethereum kam früher auch die „längste Chain“-Regel zur Anwendung; jetzt, da Ethereum auf Proof-of-Stake läuft, hat es jedoch einen aktualisierten Abspaltungs-Wahl-Algorithmus übernommen, der das „Gewicht“ der Kette bestimmt. Das Gewicht entspricht der kumulierten Summe der Validatorenstimmen, gewichtet nach den in Ether eingesetzten Beträgen der Validatoren. +Eine **Chain-Auswahlregel** wird verwendet, um zu entscheiden, welche Chain die „richtige“ Chain ist. Bitcoin verwendet die Regel der „längsten Chain“, was bedeutet, dass die längste Blockchain diejenige ist, die der Rest der Blockchain-Knoten als gültig akzeptiert und mit der er arbeitet. Bei Proof-of-Work-Chains wird die längste Chain durch die gesamte kumulative Proof-of-Work-Schwierigkeit der Chain bestimmt. Ethereum verwendete früher ebenfalls die Regel der längsten Chain; da Ethereum nun jedoch auf Proof-of-Stake läuft, hat es einen aktualisierten Fork-Choice-Algorithmus übernommen, der das „Gewicht“ der Chain misst. Das Gewicht ist die kumulierte Summe der Stimmen der Validatoren, gewichtet nach den gestakten Ether-Guthaben der Validatoren. -Ethereum verwendet einen Konsensmechanismus, bekannt als [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/), der [Casper FFG-Proof-of-Stake](https://arxiv.org/abs/1710.09437) mit der [GHOST-Abspaltungs-Wahl-Regel](https://arxiv.org/abs/2003.03052) kombiniert. +Ethereum verwendet einen Konsensmechanismus namens [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/), der [Casper FFG Proof-of-Stake](https://arxiv.org/abs/1710.09437) mit der [GHOST-Fork-Choice-Regel](https://arxiv.org/abs/2003.03052) kombiniert. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Was ist ein Blockchain-Konsens-Algorithmus?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) -- [Was ist der Nakamoto-Konsens? Vollständiger Leitfaden für Anfänger](https://blockonomi.com/nakamoto-consensus/) +- [Was ist ein Blockchain-Konsensalgorithmus?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) +- [Was ist der Nakamoto-Konsens? Ein kompletter Anfängerleitfaden](https://blockonomi.com/nakamoto-consensus/) - [Wie funktioniert Casper?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) -- [Über die Sicherheit und Leistungsfähigkeit von Proof-of-Work-Blockchains](https://eprint.iacr.org/2016/555.pdf) +- [Zur Sicherheit und Leistung von Proof-of-Work-Blockchains](https://eprint.iacr.org/2016/555.pdf) - [Byzantinischer Fehler](https://en.wikipedia.org/wiki/Byzantine_fault) -_Gibt es Community-Resourcen, die Sie hilfreich fanden? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) - [Mining](/developers/docs/consensus-mechanisms/pow/mining/) - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -- [Proof-of-authority](/developers/docs/consensus-mechanisms/poa/) +- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md index 8820958d1c3..e17a46b1115 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md @@ -1,10 +1,10 @@ --- title: Proof-of-Authority (PoA) -description: Eine Erklärung des Proof-of-Authority-Konsensprotokolls und seiner Rolle im Blockchain-Ökosystem. +description: "Eine Erklärung des Proof-of-Authority-Konsensprotokolls und seiner Rolle im Blockchain-Ökosystem." lang: de --- -**Proof-of-Authority (PoA)** ist ein rufbasierter Konsensalgorithmus, der eine modifizierte Version von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) darstellt. Es wird hauptsächlich von privaten Chains, Testnetzen und lokalen Entwicklungsnetzwerken verwendet. PoA ist ein rufbasierter Konsensalgorithmus, der das Vertrauen in eine Gruppe von autorisierten Unterzeichnern voraussetzt, um Blöcke zu erzeugen, im Gegensatz zu einem Stake-basierten Mechanismus in PoS. +**Proof-of-Authority (PoA)** ist ein reputationsbasierter Konsensalgorithmus, der eine modifizierte Version von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) ist. Er wird meistens von privaten Chains, Testnets und lokalen Entwicklungsnetzwerken verwendet. PoA ist ein reputationsbasierter Konsensalgorithmus, der das Vertrauen in eine Gruppe autorisierter Unterzeichner erfordert, um Blöcke zu produzieren, anstelle eines einsatzbasierten Mechanismus wie bei PoS. ## Voraussetzungen {#prerequisites} @@ -12,68 +12,68 @@ Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [T ## Was ist Proof-of-Authority (PoA)? {#what-is-poa} -Proof-of-Authority ist eine modifizierte Version von **[Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) (PoS)**, die einen rufbasierten Konsensalgorithmus anstelle des Stake-basierten Mechanismus in PoS darstellt. Der Begriff wurde erstmals im 2017 von Gavin Wood eingeführt, und dieser Konsensalgorithmus wurde hauptsächlich von privaten Ketten, Testnetzen und lokalen Entwicklungsnetzwerken verwendet, weil er im Gegensatz zu PoW den Bedarf an qualitativ hochwertigen Ressourcen und die Skalierbarkeitsprobleme von PoS überwindet, da er eine kleine Teilmenge von Knoten hat, die die Blockchain speichern und Blöcke produzieren. +Proof-of-Authority ist eine modifizierte Version von **[Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) (PoS)**, die ein reputationsbasierter Konsensalgorithmus anstelle des einsatzbasierten Mechanismus in PoS ist. Der Begriff wurde erstmals 2017 von Gavin Wood eingeführt, und dieser Konsensalgorithmus wurde hauptsächlich von privaten Chains, Testnets und lokalen Entwicklungsnetzwerken verwendet, da er den Bedarf an hochwertigen Ressourcen wie bei PoW überwindet und die Skalierbarkeitsprobleme von PoS löst, indem eine kleine Teilmenge von Blockchain-Knoten die Blockchain speichert und Blöcke produziert. -Proof-of-Authority erfordert das Vertrauen in eine Gruppe autorisierter Unterzeichner, die im [Genesis-Block](/glossary/#genesis-block) festgelegt sind. In den meisten aktuellen Implementierungen behalten alle autorisierten Unterzeichner die gleiche Befugnis und die gleichen Privilegien bei der Bestimmung des Konsenses der Kette. Die Idee hinter dem Ruf-Staking ist, dass jeder autorisierte Validator beispielsweise durch Know Your Customer (KYC) oder durch die Zugehörigkeit zu einer renommierten Organisation jedem als einziger Validator bekannt ist — auf diese Weise ist die Identität des Validators bekannt, falls er etwas Unrechtes tut. +Proof-of-Authority erfordert das Vertrauen in eine Gruppe autorisierter Unterzeichner, die im [Genesis-Block](/glossary/#genesis-block) festgelegt sind. In den meisten aktuellen Implementierungen behalten alle autorisierten Unterzeichner die gleiche Macht und die gleichen Privilegien bei der Bestimmung des Konsenses der Chain. Die Idee hinter dem Reputations-Staking ist, dass jeder autorisierte Validator jedem durch Dinge wie Know Your Customer (KYC) bekannt ist, oder indem eine bekannte Organisation der einzige Validator ist – auf diese Weise ist ihre Identität bekannt, falls ein Validator etwas falsch macht. -Es gibt mehrere Implementierungen von PoA, aber die Standardimplementierung von Ethereum ist **Clique**, die [EIP-225](https://eips.ethereum.org/EIPS/eip-225) implementiert. Clique ist entwicklerfreundlich und ein einfach zu implementierender Standard, der alle Client-Synchronisierungstypen unterstützt. Andere Implementierungen umfassen [IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) und [Aura](https://openethereum.github.io/Chain-specification). +Es gibt mehrere Implementierungen von PoA, aber die Standard-Ethereum-Implementierung ist **Clique**, welche [EIP-225](https://eips.ethereum.org/EIPS/eip-225) implementiert. Clique ist entwicklerfreundlich und ein einfach zu implementierender Standard, der alle Anwendungs-Synchronisierungstypen unterstützt. Andere Implementierungen umfassen [IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) und [Aura](https://openethereum.github.io/Chain-specification). -## Funktionsweise {#how-it-works} +## Wie es funktioniert {#how-it-works} -Bei PoA wird eine Gruppe von autorisierten Unterzeichnern ausgewählt, um neue Blöcke zu erstellen. Die Unterzeichner werden auf der Grundlage ihres Rufs ausgewählt und sind die einzigen, die neue Blöcke erstellen dürfen. Die Unterzeichner werden nach dem Rotationsprinzip ausgewählt, und jeder Unterzeichner darf innerhalb eines bestimmten Zeitrahmens einen Block erstellen. Der Zeitpunkt der Blockerstellung ist festgelegt und die Unterzeichner müssen innerhalb dieses Zeitrahmens einen Block erstellen. +Bei PoA wird eine Gruppe autorisierter Unterzeichner ausgewählt, um neue Blöcke zu erstellen. Die Unterzeichner werden basierend auf ihrer Reputation ausgewählt und sind die einzigen, die neue Blöcke erstellen dürfen. Die Unterzeichner werden im Round-Robin-Verfahren ausgewählt, und jeder Unterzeichner darf in einem bestimmten Zeitrahmen einen Block erstellen. Die Blockerstellungszeit ist festgelegt, und die Unterzeichner müssen innerhalb dieses Zeitrahmens einen Block erstellen. -In diesem Zusammenhang ist der Ruf kein quantifizierter Wert, sondern es handelt sich eher um den Ruf bekannter Unternehmen wie Microsoft und Google. Die Auswahl der vertrauenswürdigen Unterzeichner erfolgt daher nicht algorithmisch, sondern ist eine übliche menschliche _Vertrauenshandlung_. Dabei richtet beispielsweise eine Instanz wie Microsoft ein privates PoA-Netzwerk zwischen Hunderten oder Tausenden von Startups ein und fungiert als einziger vertrauenswürdiger Unterzeichner mit der Möglichkeit, in Zukunft weitere bekannte Unterzeichner wie Google hinzuzufügen. Die Startups würden zweifellos darauf vertrauen, dass Microsoft stets ehrlich handelt, und das Netzwerk nutzen. Dadurch entfällt die Notwendigkeit, in verschiedenen kleinen/privaten Netzwerken zu staken, die aus unterschiedlichen Gründen aufgebaut wurden, um sie dezentralisiert und funktionsfähig zu halten, und es fällt gleichzeitig der Bedarf an Minern weg, die viel Energie und Ressourcen verbrauchen. Einige private Netzwerke verwenden den PoA-Standard direkt, wie zum Beispiel VeChain, während andere ihn modifizieren, wie Binance, das [PoSA](https://academy.binance.com/en/glossary/proof-of-staked-authority-posa) nutzt — eine benutzerdefinierte, modifizierte Version von PoA und PoS. +Die Reputation in diesem Kontext ist keine quantifizierte Größe, sondern vielmehr die Reputation bekannter Unternehmen wie Microsoft und Google. Daher ist die Art und Weise der Auswahl der vertrauenswürdigen Unterzeichner nicht algorithmisch, sondern vielmehr der normale menschliche Akt des _Vertrauens_, bei dem eine Entität, sagen wir zum Beispiel Microsoft, ein privates PoA-Netzwerk zwischen Hunderten oder Tausenden von Start-ups erstellt und die Rolle selbst als einziger vertrauenswürdiger Unterzeichner übernimmt, mit der Möglichkeit, in Zukunft andere bekannte Unterzeichner wie Google hinzuzufügen. Die Start-ups würden Microsoft zweifellos vertrauen, jederzeit ehrlich zu handeln und das Netzwerk zu nutzen. Dies löst die Notwendigkeit für Staking in verschiedenen kleinen/privaten Netzwerken, die für unterschiedliche Zwecke aufgebaut wurden, um sie dezentralisiert und funktionsfähig zu halten, zusammen mit der Notwendigkeit für Miner, was viel Strom und Ressourcen verbraucht. Einige private Netzwerke verwenden den PoA-Standard so wie er ist, wie z. B. VeChain, und einige modifizieren ihn, wie z. B. Binance, das [PoSA](https://academy.binance.com/en/glossary/proof-of-staked-authority-posa) verwendet, was eine benutzerdefinierte modifizierte Version von PoA und PoS ist. -Die Abstimmung wird von den Unterzeichnern selbst durchgeführt. Jeder Unterzeichner stimmt beim Erstellen eines neuen Blocks über die Aufnahme oder Entfernung eines Unterzeichners in seinen Block ab. Die Abstimmungen werden von den Knoten zusammengezählt, und die Unterzeichner werden hinzugefügt oder entfernt, wenn die Stimmen einen bestimmten „SIGNER_LIMIT“-Schwellenwert erreichen. +Der Abstimmungsprozess wird von den Unterzeichnern selbst durchgeführt. Jeder Unterzeichner stimmt für das Hinzufügen oder Entfernen eines Unterzeichners in seinem Block ab, wenn er einen neuen Block erstellt. Die Stimmen werden von den Blockchain-Knoten zusammengezählt, und die Unterzeichner werden basierend darauf hinzugefügt oder entfernt, ob die Stimmen einen bestimmten Schwellenwert `SIGNER_LIMIT` erreichen. -Es kann vorkommen, dass kleine Abzweigungen entstehen. Die Schwierigkeit eines Blocks hängt davon ab, ob der Block der Reihe nach oder außerhalb der Reihe unterzeichnet wurde. „In der Reihe“-Blöcke haben den Schwierigkeitsgrad 2 und „Außerhalb der Reihe“-Blöcke haben den Schwierigkeitsgrad 1. Bei kleinen Abzweigungen sammelt die Kette, bei der die meisten Unterzeichner die Blöcke „der Reihe nach“ versiegelt haben, die meiste Schwierigkeit an und gewinnt. +Es kann zu einer Situation kommen, in der kleine Forks auftreten. Die Schwierigkeit eines Blocks hängt davon ab, ob der Block an der Reihe ("in turn") oder außer der Reihe ("out of turn") signiert wurde. "In turn"-Blöcke haben die Schwierigkeit 2 und "out of turn"-Blöcke haben die Schwierigkeit 1. Im Falle von kleinen Forks wird die Chain, bei der die meisten Unterzeichner Blöcke "in turn" versiegeln, die größte Schwierigkeit ansammeln und gewinnen. ## Angriffsvektoren {#attack-vectors} -### Böswillige Unterzeichner {#malicious-signers} +### Bösartige Unterzeichner {#malicious-signers} -Ein böswilliger Benutzer könnte der Liste der Unterzeichner hinzugefügt werden, oder ein(e) Unterzeichnungsschlüssel/-maschine könnte kompromittiert werden. In einem solchen Szenario muss das Protokoll in der Lage sein, sich gegen Umstrukturierungen und Spamming zu wehren. Die vorgeschlagene Lösung besteht darin, dass bei einer Liste von N autorisierten Unterzeichnern jeder Unterzeichner nur 1 Block aus jedem K prägen darf. Dadurch wird sichergestellt, dass der Schaden begrenzt wird und die übrigen Validatoren den böswilligen Benutzer ausschließen können. +Ein bösartiger Benutzer könnte zur Liste der Unterzeichner hinzugefügt werden, oder ein Signaturschlüssel/eine Signaturmaschine könnte kompromittiert werden. In einem solchen Szenario muss das Protokoll in der Lage sein, sich gegen Reorganisationen und Spamming zu verteidigen. Die vorgeschlagene Lösung besteht darin, dass bei einer Liste von N autorisierten Unterzeichnern jeder Unterzeichner nur 1 Block von jeweils K prägen darf. Dies stellt sicher, dass der Schaden begrenzt ist und der Rest der Validatoren den bösartigen Benutzer abwählen kann. ### Zensur {#censorship-attack} -Ein weiterer interessanter Angriffsvektor ist, wenn ein Unterzeichner (oder eine Gruppe von Unterzeichnern) versucht, Blöcke zu zensieren, die über ihre Streichung aus der Autorisierungsliste abstimmen. Um das zu umgehen, wird die zulässige Prägungsfrequenz für Unterzeichner auf 1 aus N/2 beschränkt. Dadurch wird gewährleistet, dass böswillige Unterzeichner mindestens 51 % der unterzeichnenden Konten kontrollieren müssen, um effektiv zur neuen Quelle der Wahrheit für die Kette zu werden. +Ein weiterer interessanter Angriffsvektor ist, wenn ein Unterzeichner (oder eine Gruppe von Unterzeichnern) versucht, Blöcke zu zensieren, die über ihre Entfernung aus der Autorisierungsliste abstimmen. Um dies zu umgehen, ist die erlaubte Prägehäufigkeit der Unterzeichner auf 1 von N/2 beschränkt. Dies stellt sicher, dass bösartige Unterzeichner mindestens 51 % der Signaturkonten kontrollieren müssen, an welchem Punkt sie effektiv zur neuen Quelle der Wahrheit (Source-of-Truth) für die Chain werden würden. ### Spam {#spam-attack} -Ein weiterer kleiner Angriffsvektor sind böswillige Unterzeichner, die neue Abstimmungsvorschläge in jeden von ihnen geprägten Block einfügen. Da die Knoten alle Abstimmungen zusammenzählen müssen, um die tatsächliche Liste der autorisierten Unterzeichner zu erstellen, müssen sie alle Abstimmungen im Laufe der Zeit aufzeichnen. Eine fehlende Begrenzung des Zeitfensters für die Abstimmung könnte zu einem langsamen und dennoch unkontrollierten Wachstum führen. Die Lösung besteht darin, ein _bewegliches_ Fenster aus W Blöcken zu setzen, nach dem die Abstimmungen als veraltet gelten. _Ein angemessenes Zeitfenster könnten 1–2 Epochen sein._ +Ein weiterer kleiner Angriffsvektor sind bösartige Unterzeichner, die neue Abstimmungsvorschläge in jeden Block injizieren, den sie prägen. Da Blockchain-Knoten alle Stimmen zusammenzählen müssen, um die tatsächliche Liste der autorisierten Unterzeichner zu erstellen, müssen sie alle Stimmen im Laufe der Zeit aufzeichnen. Ohne eine Begrenzung des Abstimmungsfensters könnte dies langsam, aber unbegrenzt wachsen. Die Lösung besteht darin, ein _gleitendes_ Fenster von W Blöcken festzulegen, nach dem Stimmen als veraltet gelten. _Ein vernünftiges Fenster könnten 1-2 Epochen sein._ ### Gleichzeitige Blöcke {#concurrent-blocks} -Wenn es in einem PoA-Netzwerk N autorisierte Unterzeichner gibt, darf jeder Unterzeichner 1 Block aus K prägen, was bedeutet, dass N-K+1-Validatoren zu jedem beliebigen Zeitpunkt prägen dürfen. Um zu verhindern, dass diese Validatoren um Blöcke wetteifern, sollte jeder Unterzeichner einen kleinen zufälligen „Offset“ zu dem Zeitpunkt hinzufügen, zu dem ein neuer Block freigegeben wird. Obwohl dieser Prozess sicherstellt, dass kleine Abzweigungen selten sind, kann es dennoch gelegentlich zu Abzweigungen kommen, genau wie im Mainnet. Wenn festgestellt wird, dass ein Unterzeichner seine Befugnisse missbraucht und Chaos verursacht, können die anderen Unterzeichner ihn abwählen. +In einem PoA-Netzwerk, wenn es N autorisierte Unterzeichner gibt, darf jeder Unterzeichner 1 Block von K prägen, was bedeutet, dass N-K+1 Validatoren zu jedem gegebenen Zeitpunkt prägen dürfen. Um zu verhindern, dass diese Validatoren um Blöcke wetteifern, sollte jeder Unterzeichner einen kleinen zufälligen "Offset" zu der Zeit hinzufügen, zu der er einen neuen Block veröffentlicht. Obwohl dieser Prozess sicherstellt, dass kleine Forks selten sind, können gelegentliche Forks dennoch auftreten, genau wie im Mainnet. Wenn festgestellt wird, dass ein Unterzeichner seine Macht missbraucht und Chaos verursacht, können die anderen Unterzeichner ihn abwählen. -Wenn es beispielsweise 10 autorisierte Unterzeichner gibt und jeder Unterzeichner 1 von 20 Blöcken erstellen darf, können zu jedem beliebigen Zeitpunkt 11 Validatoren Blöcke erstellen. Um zu verhindern, dass sie bei der Erstellung von Blöcken wetteifern, fügt jeder Unterzeichner einen kleinen zufälligen „Offset“ zu der Zeit hinzu, zu der er einen neuen Block freigibt. Das reduziert das Auftreten von kleinen Abzweigungen, ermöglicht aber immer noch gelegentliche Abzweigungen, wie wir es aus dem Ethereum-Mainnet kennen. Wenn ein Unterzeichner seine Autorität missbraucht und Störungen verursacht, kann er aus dem Netzwerk gestimmt werden. +Wenn es zum Beispiel 10 autorisierte Unterzeichner gibt und jeder Unterzeichner 1 Block von 20 erstellen darf, dann können zu jedem Zeitpunkt 11 Validatoren Blöcke erstellen. Um zu verhindern, dass sie um die Erstellung von Blöcken wetteifern, fügt jeder Unterzeichner einen kleinen zufälligen "Offset" zu der Zeit hinzu, zu der er einen neuen Block veröffentlicht. Dies reduziert das Auftreten kleiner Forks, lässt aber dennoch gelegentliche Forks zu, wie man es im Ethereum-Mainnet sieht. Wenn ein Unterzeichner seine Autorität missbraucht und Störungen verursacht, kann er aus dem Netzwerk abgewählt werden. -## Pro und Kontra {#pros-and-cons} +## Vor- und Nachteile {#pros-and-cons} -| Vorteile | Nachteile | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Skalierbarer als andere beliebte Mechanismen wie PoS und PoW, da es auf einer begrenzten Anzahl von Blockunterzeichnern basiert | PoA-Netzwerke haben typischerweise eine relativ kleine Anzahl an Validierungsknoten. Dadurch wird ein PoA-Netzwerk stärker zentralisiert. | -| PoA-Blockchains sind unglaublich günstig bei Betrieb und Wartung | Ein autorisierter Unterzeichner zu werden, ist für eine gewöhnliche Person in der Regel unerreichbar, da die Blockchain Entitäten mit einem etablierten Ruf erfordert. | -| Die Transaktionen werden sehr schnell bestätigt, da weniger als 1 Sekunde erreicht werden kann, weil nur eine begrenzte Anzahl von Unterzeichnern erforderlich ist, um neue Blöcke zu validieren. | Böswillige Unterzeichner könnten Reorganisationen durchführen, doppelte Ausgaben tätigen oder Transaktionen im Netzwerk zensieren. Diese Angriffe werden zwar abgeschwächt, sind aber immer noch möglich. | +| Vorteile | Nachteile | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Skalierbarer als andere beliebte Mechanismen wie PoS und PoW, da es auf einer begrenzten Anzahl von Blockunterzeichnern basiert | PoA-Netzwerke haben typischerweise eine relativ kleine Anzahl von validierenden Blockchain-Knoten. Dies macht ein PoA-Netzwerk zentralisierter. | +| PoA-Blockchains sind unglaublich günstig zu betreiben und zu warten | Ein autorisierter Unterzeichner zu werden, ist für eine gewöhnliche Person typischerweise unerreichbar, da die Blockchain Entitäten mit etablierter Reputation erfordert. | +| Die Transaktionen werden sehr schnell bestätigt, da es weniger als 1 Sekunde dauern könnte, weil nur eine begrenzte Anzahl von Unterzeichnern erforderlich ist, um neue Blöcke zu validieren | Bösartige Unterzeichner könnten Reorgs durchführen, doppelt ausgeben (Double Spend) oder Transaktionen im Netzwerk zensieren. Diese Angriffe werden abgeschwächt, sind aber immer noch möglich | -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [EIP-225](https://eips.ethereum.org/EIPS/eip-225) _Clique-Standard_ -- [Studie zu Proof of Authority](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _Kryptoökonomie_ -- [Was ist Proof of Authority](https://forum.openzeppelin.com/t/proof-of-authority/3577) _OpenZeppelin_ -- [Erläuterung von Proof of Authority](https://academy.binance.com/en/articles/proof-of-authority-explained) _binance_ +- [Studie zu Proof-of-Authority](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _Kryptoökonomie_ +- [Was ist Proof-of-Authority](https://forum.openzeppelin.com/t/proof-of-authority/3577) _OpenZeppelin_ +- [Proof-of-Authority erklärt](https://academy.binance.com/en/articles/proof-of-authority-explained) _Binance_ - [PoA in der Blockchain](https://medium.com/techskill-brew/proof-of-authority-or-poa-in-blockchain-part-11-blockchain-series-be15b3321cba) -- [Erläuterung von Clique](https://medium.com/@Destiner/clique-cross-client-proof-of-authority-algorithm-for-ethereum-8b2a135201d) -- [Veralteter PoA, Aura-Spezifikation](https://openethereum.github.io/Chain-specification) +- [Clique erklärt](https://medium.com/@Destiner/clique-cross-client-proof-of-authority-algorithm-for-ethereum-8b2a135201d) +- [Veraltete PoA-, Aura-Spezifikation](https://openethereum.github.io/Chain-specification) - [IBFT 2.0, eine weitere PoA-Implementierung](https://besu.hyperledger.org/private-networks/concepts/poa) -### Eher der visuelle Lernende? {#visual-learner} +### Lernen Sie eher visuell? {#visual-learner} -Sehen Sie sich eine visuelle Erläuterung des Proof-of-Authority an: +Sehen Sie sich eine visuelle Erklärung von Proof-of-Authority an: ## Verwandte Themen {#related-topics} - [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) -- [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) +- [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md index d622af9ad3e..5fdd99ea916 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md @@ -1,163 +1,163 @@ --- -title: Angriff und Verteidigung im Proof-of-Stake-System auf Ethereum -description: Lernen Sie die bekannten Angriffsvektoren im Proof-of-Stake-System auf Ethereum kennen und wie diese abgewehrt werden können. +title: Angriff und Verteidigung bei Ethereums Proof-of-Stake +description: "Erfahren Sie mehr über die bekannten Angriffsvektoren auf das Proof-of-Stake-System von Ethereum und wie diese abgewehrt werden." lang: de --- -Diebe und Saboteure suchen ständig nach Möglichkeiten, die Client-Software auf Ethereum anzugreifen. Diese Seite stellt die bekannten Angriffsvektoren auf Ethereums Konsensebene dar und erläutert, wie diese Angriffe abgewehrt werden können. Die Informationen auf dieser Seite stammen aus einer [ausführlicheren Version](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs). +Diebe und Saboteure suchen ständig nach Möglichkeiten, die Client-Software von [Ethereum](/) anzugreifen. Diese Seite beschreibt die bekannten Angriffsvektoren auf die Konsensebene von Ethereum und skizziert, wie diese Angriffe abgewehrt werden können. Die Informationen auf dieser Seite basieren auf einer [ausführlicheren Version](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs). ## Voraussetzungen {#prerequisites} -Einige Grundkenntnisse im Bereich [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) sind erforderlich. Außerdem ist es hilfreich, Grundkenntnisse über die [Anreizebene](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) und den Abspaltungs-Wahl-Algorithmus auf Ethereum, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper), zu haben. +Ein gewisses Grundwissen über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) ist erforderlich. Außerdem ist es hilfreich, ein grundlegendes Verständnis der [Anreizebene](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) von Ethereum und des Fork-Choice-Algorithmus [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper) zu haben. -## Was möchten Angreifer? {#what-do-attackers-want} +## Was wollen Angreifer? {#what-do-attackers-want} -Ein häufiges Missverständnis ist, dass erfolgreiche Angreifer neue Ether generieren oder sie von beliebigen Konten abziehen können. Keines von beidem ist möglich, da alle Transaktionen von allen Ausführungs-Clients im Netzwerk ausgeführt werden. Diese müssen einfache Gültigkeitsbedingungen erfüllen (z. B. müssen Transaktionen vom privaten Schlüssel eines Absenders signiert werden, der Absender muss über ausreichend Guthaben verfügen, usw.), sonst werden sie einfach rückgängig gemacht. Es gibt drei verschiedene Arten von Ergebnissen, die ein Angreifer realistischerweise erreichen möchte: Neuorganisationen, doppelte Endgültigkeit oder das Verzögern von Endgültigkeit. +Ein weit verbreiteter Irrglaube ist, dass ein erfolgreicher Angreifer neue Ether generieren oder Ether von beliebigen Konten abziehen kann. Beides ist nicht möglich, da alle Transaktionen von allen Ausführungs-Clients im Netzwerk ausgeführt werden. Sie müssen grundlegende Gültigkeitsbedingungen erfüllen (z. B. müssen Transaktionen mit dem Private-Key des Senders signiert sein, der Sender muss über ein ausreichendes Guthaben verfügen usw.), andernfalls werden sie einfach rückgängig gemacht. Es gibt drei Arten von Ergebnissen, auf die ein Angreifer realistischerweise abzielen könnte: Reorgs, doppelte Finalität oder Finalitätsverzögerung. -Eine **“Neuorganisation”** ist eine Neumischung von Blöcken in eine neue Reihenfolge. Hier könnten einige Blöcke in der kanonischen Chain hinzugefügt oder entfernt werden. Bei einer böswilligen Neuanordnung könnte sichergegangen werden, dass spezifische Blöcke ein- oder ausgeschlossen werden. Dies könnte dazu führen, dass für vorweglaufende und zurücklaufende Transaktionen (MEV) doppelte Ausgaben oder Wertextraktionen getätigt werden. Neuorganisationen könnten auch dazu eingesetzt werden, um zu verhindern, dass bestimmte Transaktionen in die kanonische Chain aufgenommen werden – eine Form der Zensur. Die extremste Form einer Neuorganisation ist die „Endgültigkeitsumkehrung“, bei der Blöcke ersetzt oder entfernt werden, die zuvor bereits finalisiert wurden. Das ist nur möglich, wenn mehr als ⅓ der insgesamt eingesetzten Ether vom Angreifer zerstört wird – diese Garantie wird als „wirtschaftliche Endgültigkeit“ bezeichnet – mehr dazu später. +Ein **„Reorg“** ist eine Neuanordnung von Blöcken in eine neue Reihenfolge, möglicherweise mit dem Hinzufügen oder Entfernen von Blöcken in der kanonischen Chain. Ein böswilliger Reorg könnte sicherstellen, dass bestimmte Blöcke ein- oder ausgeschlossen werden, was Double-Spending oder Wertabschöpfung durch Front-Running- und Back-Running-Transaktionen (MEV - Maximal extrahierbarer Wert) ermöglicht. Reorgs könnten auch verwendet werden, um zu verhindern, dass bestimmte Transaktionen in die kanonische Chain aufgenommen werden – eine Form der Zensur. Die extremste Form des Reorgs ist die „Finalitätsumkehrung“, bei der Blöcke entfernt oder ersetzt werden, die zuvor finalisiert wurden. Dies ist nur möglich, wenn mehr als ⅓ der gesamten eingesetzten Ether vom Angreifer zerstört werden – diese Garantie ist als „wirtschaftliche Finalität“ bekannt – dazu später mehr. -**Doppelte Endgültigkeit** ist die unwahrscheinliche, aber ernste Bedingung, bei der zwei Abspaltungen gleichzeitig finalisiert werden können, was zu einer permanente Spaltung der Chain führt. Das ist theoretisch möglich für einen Angreifer, der dazu bereit ist, 34 % der insgesamt eingesetzten Ether zu riskieren. Die Community wäre dazu gezwungen, sich außerhalb der Chain zu koordinieren und sich darauf zu einigen, welcher Chain gefolgt werden soll. Dies würde eine starke Sozialebene erfordern. +**Doppelte Finalität** ist der unwahrscheinliche, aber schwerwiegende Zustand, in dem zwei Forks gleichzeitig finalisieren können, was zu einer dauerhaften Spaltung der Chain führt. Dies ist theoretisch für einen Angreifer möglich, der bereit ist, 34 % der gesamten eingesetzten Ether zu riskieren. Die Community wäre gezwungen, sich Off-Chain zu koordinieren und sich darauf zu einigen, welcher Chain sie folgen soll, was Stärke auf der sozialen Ebene erfordern würde. -Ein Angriff, bei dem die **Endgültigkeit verzögert** wird, hindert das Netzwerk daran, die notwendigen Bedingungen zu erreichen, um die Chain zu finalisieren. Ohne Endgültigkeit ist es schwer, finanziellen Anwendungen auf Basis von Ethereum zu vertrauen. Das Ziel eines solchen Angriffs wäre wahrscheinlich eher die Störung von Ethereum als eine direkte Bereicherung, es sei denn, der Angreifer verfügt über eine/einige strategische Short-Position(en). +Ein Angriff zur **Finalitätsverzögerung** hindert das Netzwerk daran, die notwendigen Bedingungen zur Finalisierung von Abschnitten der Chain zu erreichen. Ohne Finalität ist es schwer, Finanzanwendungen zu vertrauen, die auf Ethereum aufbauen. Das Ziel eines Angriffs zur Finalitätsverzögerung ist wahrscheinlich einfach, Ethereum zu stören, anstatt direkt davon zu profitieren, es sei denn, der Angreifer hat strategische Short-Positionen. -Ein Angriff auf die soziale Ebene könnte darauf abzielen, das öffentliche Vertrauen in Ethereum zu untergraben, Ether zu entwerten, die Akzeptanz zu verringern oder die Ethereum-Community zu schwächen, sodass die Koordination außerhalb des Bands erschwert wird. +Ein Angriff auf die soziale Ebene könnte darauf abzielen, das öffentliche Vertrauen in Ethereum zu untergraben, Ether abzuwerten, die Akzeptanz zu verringern oder die Ethereum-Community zu schwächen, um eine Out-of-Band-Koordination zu erschweren. -Nachdem wir festgestellt haben, warum ein Angreifer Ethereum angreifen könnte, geht es in den folgenden Abschnitten darum, _wie_ so ein Angriff versucht werden könnte. +Nachdem nun geklärt ist, warum ein Angreifer Ethereum angreifen könnte, untersuchen die folgenden Abschnitte, _wie_ er dabei vorgehen könnte. ## Angriffsmethoden {#methods-of-attack} -### Angriffe auf Layer 0 {#layer-0} +### Angriffe auf Ebene 0 (Layer 0) {#layer-0} -Erstmal könnten Einzelpersonen, die sich nicht aktiv an Ethereum beteiligen (indem sie Client-Software ausführen) angreifen, indem sie die Sozialebene (Layer 0) ins Visier nehmen. Layer 0 ist das Fundament, auf dem Ethereum aufgebaut ist. Als solches bietet es eine potenzielle Angriffsfläche. Die Konsequenzen aus so einem Angriff hätten Auswirkungen auf den gesamten restlichen Stack. Einige Beispiele hierfür sind: +Zunächst einmal können Personen, die nicht aktiv an Ethereum teilnehmen (indem sie Client-Software ausführen), angreifen, indem sie auf die soziale Ebene (Ebene 0) abzielen. Ebene 0 ist das Fundament, auf dem Ethereum aufbaut, und stellt als solches eine potenzielle Angriffsfläche mit Konsequenzen dar, die sich durch den Rest des Stacks ziehen. Einige Beispiele könnten sein: -- Eie Falschinformationskampagne könnte das Vertrauen der Community in Ethereums Roadmap, Entwicklerteams, Anwendungen usw. untergraben. Das könnte dann dazu führen, dass sich die Anzahl an Menschen, die dazu bereit sind, bei der Sicherung des Netzwerks zu helfen, stark verringern würde. So eine Entwicklung hätte negative Einflüsse sowohl auf die Dezentralisierung als auch auf die krypto-ökonomische Sicherheit. -- Gezielte Angriffe und/oder Einschüchterungsversuche in Richtung der Entwicklercommunity. Dies könnte zum freiwilligen Austritt von Entwicklern führen und Ethereums Fortschritt verlangsamen. +- Eine Desinformationskampagne könnte das Vertrauen der Community in die Roadmap von Ethereum, Entwicklerteams, Apps usw. untergraben. Dies könnte dann die Anzahl der Personen verringern, die bereit sind, sich an der Sicherung des Netzwerks zu beteiligen, was sowohl die Dezentralisierung als auch die kryptoökonomische Sicherheit beeinträchtigt. +- Gezielte Angriffe und/oder Einschüchterungen, die sich gegen die Entwickler-Community richten. Dies könnte zum freiwilligen Ausscheiden von Entwicklern führen und den Fortschritt von Ethereum verlangsamen. -- Eine übereifrige Regulierung könnte auch als Angriff auf die Layer 0 interpretiert werden, da sie die Anreize für die Teilnahme und Übernahme massiv verringern könnte. -- Eine Infiltration der Entwicklercommunity durch wissende, aber böswillige Akteure mit dem Ziel, den Fortschritt aufzuhalten, und zwar durch Diskussionen über Kleinigkeiten, das Verlangsamen von Schlüsselentscheidungen, Spam usw. -- Bestechungsgelder, die an Schlüsselpersonen im Ethereum-Ökosystem gesendet werden, um deren Entscheidungen zu beeinflussen. +- Übereifrige Regulierung könnte ebenfalls als Angriff auf Ebene 0 betrachtet werden, da sie die Teilnahme und Akzeptanz schnell demotivieren könnte. +- Infiltration sachkundiger, aber böswilliger Akteure in die Entwickler-Community, deren Ziel es ist, den Fortschritt durch endlose Diskussionen über Nebensächlichkeiten (Bike-Shedding), die Verzögerung wichtiger Entscheidungen, die Erstellung von Spam usw. zu verlangsamen. +- Bestechung von Schlüsselakteuren im Ethereum-Ökosystem, um die Entscheidungsfindung zu beeinflussen. -Was diese Angriffe besonders gefährlich macht, ist, dass in vielen Fällen sehr wenig Kapital oder technisches Wissen dafür erforderlich ist. Ein Angriff auf Layer 0 könnte ein Multiplikator auf einen krypto-ökonomischen Angriff sein. Wenn es beispielsweise zu Zensur oder einer Endgültigkeitsumkehrung durch einen böswilligen Mehrheits-Stakeholder kommen würde, könnte eine Schwächung der Sozialebene es schwieriger machen, eine Antwort der Community außerhalb des Bandes zu koordinieren. +Was diese Angriffe besonders gefährlich macht, ist, dass in vielen Fällen nur sehr wenig Kapital oder technisches Know-how erforderlich ist. Ein Angriff auf Ebene 0 könnte ein Multiplikator für einen kryptoökonomischen Angriff sein. Wenn beispielsweise Zensur oder Finalitätsumkehrung durch einen böswilligen Mehrheits-Stakeholder erreicht würden, könnte die Untergrabung der sozialen Ebene es schwieriger machen, eine Out-of-Band-Reaktion der Community zu koordinieren. -Eine Verteidigung gegen Angriffe auf Layer 0 ist wahrscheinlich nicht unkompliziert, jedoch lassen sich einige einfachen Prinzipien festlegen. Eines davon ist die Aufrechterhaltung eines hohen Signal-Rausch-Verhältnisses in Bezug auf öffentliche Informationen über Ethereum, die von ehrlichen Mitgliedern der Community in Blogs, auf Discord-Servern, in kommentierten Spezifikationen, Büchern, Podcasts und auf YouTube erstellt und verbreitet werden. Hier auf ethereum.org bemühen wir uns sehr darum, akkurate Informationen zu liefern und diese in möglichst viele Sprachen zu übersetzen. Einen Bereich mit hochqualitativen Informationen und Memes zu überfluten ist eine effektive Verteidigung gegen Falschinformationen. +Die Abwehr von Angriffen auf Ebene 0 ist wahrscheinlich nicht einfach, aber es lassen sich einige Grundprinzipien aufstellen. Eines davon ist die Aufrechterhaltung eines insgesamt hohen Signal-Rausch-Verhältnisses für öffentliche Informationen über Ethereum, die von ehrlichen Mitgliedern der Community über Blogs, Discord-Server, kommentierte Spezifikationen, Bücher, Podcasts und YouTube erstellt und verbreitet werden. Hier bei ethereum.org bemühen wir uns sehr, genaue Informationen bereitzustellen und sie in so viele Sprachen wie möglich zu übersetzen. Einen Raum mit hochwertigen Informationen und Memes zu überfluten, ist eine wirksame Verteidigung gegen Fehlinformationen. -Eine andere wichtige Verteidigung gegen Angriffe gegen die Sozialebene sind klare Leitlinien und Verwaltungsprotokolle. Ethereum hat sich unter den Smart-Contract-Layer-1-Systemen seine Position als Champion in Bezug auf Dezentralisierung und Sicherheit erkämpft und misst gleichzeitig auch der Skalierbarkeit und Nachhaltigkeit hohen Wert bei. Welche Meinungsverschiedenheiten auch immer in der Ethereum-Community auftreten, diese Grundprinzipien werden nur minimal beeinträchtigt. Die Einschätzung zu einem Narrativ gegen diese Grundprinzipien und eine Prüfung dieser Prinzipien in mehreren Runden im Rahmen des EIP(Ethereum Improvement Proposal)-Prozesses könnte der Community helfen, gute von böswilligen Akteuren zu unterscheiden. Dies schränkt darüber hinaus die Optionen für böswillige Akteuren ein, die zukünftige Richtung von Ethereum zu beeinflussen. +Eine weitere wichtige Befestigung gegen Angriffe auf die soziale Ebene ist ein klares Leitbild und Governance-Protokoll. Ethereum hat sich als Champion für Dezentralisierung und Sicherheit unter den Smart Contract-Ebene-1-Netzwerken positioniert und legt gleichzeitig großen Wert auf Skalierbarkeit und Nachhaltigkeit. Welche Meinungsverschiedenheiten auch immer in der Ethereum-Community auftreten, diese Kernprinzipien werden nur minimal kompromittiert. Die Bewertung eines Narrativs anhand dieser Kernprinzipien und deren Prüfung durch aufeinanderfolgende Überprüfungsrunden im EIP-Prozess (Ethereum-Verbesserungsvorschlag) könnte der Community helfen, gute von schlechten Akteuren zu unterscheiden, und schränkt den Spielraum für böswillige Akteure ein, die zukünftige Ausrichtung von Ethereum zu beeinflussen. -Schließlich ist es von entscheidender Bedeutung, dass die Ethereum-Community offen bleibt und alle Teilnehmer willkommen heißt. Eine von Gatekeepern und Exklusivität geprägte Community ist besonders anfällig für soziale Angriffe, weil es ein Leichtes ist, ein „Wir gegen die anderen“-Narrativ zu etablieren. Tribalismus und toxischer Maximalismus schaden der Community und untergraben die Sicherheit der Layer 0. Ethereaner, die ein berechtigtes Interesse an der Sicherheit des Netzwerks haben, sollten ihr Verhalten online und in der realen Welt als direkten Beitrag zur Sicherheit der Layer 0 auf Ethereum betrachten. +Schließlich ist es von entscheidender Bedeutung, dass die Ethereum-Community offen und einladend für alle Teilnehmer bleibt. Eine Community mit Gatekeepern und Exklusivität ist besonders anfällig für soziale Angriffe, da es einfach ist, „Wir und Die“-Narrative aufzubauen. Tribalismus und toxischer Maximalismus schaden der Community und untergraben die Sicherheit von Ebene 0. Ethereans mit einem begründeten Interesse an der Sicherheit des Netzwerks sollten ihr Verhalten online und im echten Leben (Meatspace) als direkten Beitrag zur Sicherheit von Ethereums Ebene 0 betrachten. -### Angriffe auf das Protokoll {#attacking-the-protocol} +### Angriff auf das Protokoll {#attacking-the-protocol} -Jeder kann die Client-Software von Ethereum ausführen. Um einen Validatoren zu einem Client hinzuzufügen, muss ein Benutzer 32 Ether in den Einzahlungsvertrag überweisen. Ein Validator ermöglicht es einem Benutzer, sich aktiv an der Netzwerksicherheit von Ethereum zu beteiligen, indem er neue Blöcke vorschlägt und diese attestiert. Der Validator hat nun eine Stimme, mit der er den zukünftigen Inhalt der Blockchain beeinflussen kann – er kann dies auf ehrliche Weise tun und seinen Vorrat an Ether durch Belohnungen vergrößern oder er kann versuchen, den Prozess zu seinem eigenen Vorteil zu manipulieren und dabei seinen Stake riskieren. Eine Möglichkeit, einen Angriff zu starten, besteht darin, einen größeren Anteil des Gesamt-Stakes anzuhäufen und diesen dann zu nutzen, um ehrliche Validatoren zu überstimmen. Je größer der Anteil des von den Angreifern kontrollierten Stakes ist, desto größer ist ihr Stimmgewicht, insbesondere bei bestimmten wirtschaftlichen Meilensteinen, auf die wir später noch eingehen werden. Die meisten Angreifer werden jedoch nicht in der Lage sein, genügend Ether anzuhäufen, um auf diese Weise einen Angriff durchzuführen. Stattdessen sind sie auf subtile Techniken angewiesen, mit denen sie die ehrliche Mehrheit so manipulieren, dass sie auf eine bestimmte Weise handelt. +Jeder kann die Client-Software von Ethereum ausführen. Um einer Anwendung einen Validator hinzuzufügen, muss ein Benutzer 32 Ether in den Einzahlungsvertrag einzahlen (Staking). Ein Validator ermöglicht es einem Benutzer, sich aktiv an der Netzwerksicherheit von Ethereum zu beteiligen, indem er neue Blöcke vorschlägt und Bestätigungen dafür abgibt. Der Validator hat nun eine Stimme, mit der er die zukünftigen Inhalte der Blockchain beeinflussen kann – er kann dies ehrlich tun und seinen Ether-Bestand durch Belohnungen vergrößern, oder er kann versuchen, den Prozess zu seinem eigenen Vorteil zu manipulieren und dabei seinen Einsatz zu riskieren. Eine Möglichkeit, einen Angriff durchzuführen, besteht darin, einen größeren Anteil des gesamten Einsatzes anzuhäufen und diesen dann zu nutzen, um ehrliche Validatoren zu überstimmen. Je größer der vom Angreifer kontrollierte Anteil am Einsatz ist, desto größer ist seine Stimmmacht, insbesondere bei bestimmten wirtschaftlichen Meilensteinen, die wir später untersuchen werden. Die meisten Angreifer werden jedoch nicht in der Lage sein, genügend Ether anzuhäufen, um auf diese Weise anzugreifen. Stattdessen müssen sie subtile Techniken anwenden, um die ehrliche Mehrheit dazu zu manipulieren, auf eine bestimmte Weise zu handeln. -Grundsätzlich handelt es sich bei allen Angriffen mit kleinen Stakes um subtile Variationen zweier Arten von Validator-Fehlverhalten: Unteraktivität (keine oder zu späte Attestierungen/Vorschläge) oder Überaktivität (zu viele Attestierungen/Vorschläge in einem Slot). In ihrer einfachsten Form werden diese Aktionen durch den Abspaltungs-Wahl-Algorithmus und die Anreizebene leicht abgewehrt. Allerdings gibt es clevere Möglichkeiten, das System zum Vorteil eines Angreifers zu manipulieren. +Grundsätzlich sind alle Angriffe mit geringem Einsatz subtile Variationen von zwei Arten von Fehlverhalten der Validatoren: Unteraktivität (Versäumnis, Bestätigungen abzugeben/vorzuschlagen oder dies zu spät zu tun) oder Überaktivität (zu häufiges Vorschlagen/Bestätigen in einem Slot). In ihren einfachsten Formen werden diese Aktionen problemlos vom Fork-Choice-Algorithmus und der Anreizebene gehandhabt, aber es gibt clevere Möglichkeiten, das System zum Vorteil eines Angreifers auszunutzen. -### Angriffe mit kleinen ETH-Beträgen {#attacks-by-small-stakeholders} +### Angriffe mit kleinen Mengen an ETH {#attacks-by-small-stakeholders} -#### Neuorganisationen {#reorgs} +#### Reorgs {#reorgs} -In mehreren Artikeln wurden Angriffe auf Ethereum beschrieben, die Neuorganisationen oder Endgültigkeitsverzögerungen mit nur einem kleinen Teil der insgesamt eingesetzten Ether erreichten. Diese Angriffe beruhen in der Regel darauf, dass der Angreifer anderen Validatoren bestimmte Informationen vorenthält und diese dann auf eine nuancierte Art und/oder zu einem günstigen Zeitpunkt freigibt. Sie zielen in der Regel darauf ab, einen oder mehrere ehrliche Blöcke aus der kanonischen Chain zu verdrängen. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) hat gezeigt, wie ein angreifender Validator einen Block für einen bestimmten Slot `n+1` erstellen und attestieren kann (`B`), diesen aber nicht an andere Nodes im Netzwerk weitergeben kann. Stattdessen halten sie an diesem attestierten Block bis zum nächsten Slot `n+2` fest. Ein ehrlicher Validator schlägt einen Block (`C`) für Slot `n+2` vor. Fast gleichzeitig kann der Angreifer seinen zurückgehaltenen Block (`B`) und seine dafür zurückgehaltenen Attestierungen freigeben und auch attestieren, dass `B` die Spitze der Chain ist mit seinen Stimmen für Slot `n+2`. Damit würde er die Existenz des ehrlichen Blocks `C` faktisch leugnen. Wenn der ehrliche Block `D` freigegeben wird, sieht der Abspaltungs-Wahl-Algorithmus, dass `D` auf `B` aufbaut, der schwerer ist als `D`, der auf `C`aufbaut. Der Angreifer hat es also geschafft, den ehrlichen Block `C` aus der kanonischen Chain aus Slot `n+2` zu entfernen und hat dazu eine 1-Block-Ex-ante-Neuorganisation eingesetzt. [Ein Angreifer, der 34 %](https://www.youtube.com/watch?v=6vzXwwk12ZE) des Stakes hält, hat eine sehr gute Chance, diesen Angriff erfolgreich durchzuführen, wie in dieser Anmerkung [erklärt wird](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair). Theoretisch könnte dieser Angriff jedoch auch mit kleineren Stakes unternommen werden. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) hat beschrieben, wie dieser Angriff mit einem Stake von 30 % funktioniert. Später wurde allerdings gezeigt, dass er auch mit [2 % des Gesamt-Stakes](https://arxiv.org/pdf/2009.04987.pdf) und außerdem mit einem [einzelnen Validator](https://arxiv.org/abs/2110.10086#) erfolgreich war, der Balancing-Techniken anwandte, die wir uns im nächsten Abschnitt genauer ansehen werden. +Mehrere wissenschaftliche Arbeiten haben Angriffe auf Ethereum erklärt, die Reorgs oder Finalitätsverzögerungen mit nur einem kleinen Anteil der gesamten eingesetzten Ether erreichen. Diese Angriffe beruhen im Allgemeinen darauf, dass der Angreifer den anderen Validatoren bestimmte Informationen vorenthält und diese dann auf nuancierte Weise und/oder zu einem günstigen Zeitpunkt veröffentlicht. Sie zielen in der Regel darauf ab, einen oder mehrere ehrliche Blöcke aus der kanonischen Chain zu verdrängen. [Neuder et al. 2020](https://arxiv.org/pdf/2102.02247.pdf) zeigten, wie ein angreifender Validator einen Block (`B`) für einen bestimmten Slot `n+1` erstellen und bestätigen kann, ihn aber nicht an andere Blockchain-Knoten im Netzwerk weiterleitet. Stattdessen behält er diesen bestätigten Block bis zum nächsten Slot `n+2` zurück. Ein ehrlicher Validator schlägt einen Block (`C`) für Slot `n+2` vor. Fast gleichzeitig kann der Angreifer seinen zurückgehaltenen Block (`B`) und seine zurückgehaltenen Bestätigungen dafür freigeben und mit seinen Stimmen für Slot `n+2` auch bestätigen, dass `B` die Spitze der Chain ist, wodurch er die Existenz des ehrlichen Blocks `C` effektiv leugnet. Wenn der ehrliche Block `D` freigegeben wird, sieht der Fork-Choice-Algorithmus, dass `D`, der auf `B` aufbaut, schwerer ist als `D`, der auf `C` aufbaut. Dem Angreifer ist es somit gelungen, den ehrlichen Block `C` in Slot `n+2` mithilfe eines 1-Block-Ex-ante-Reorgs aus der kanonischen Chain zu entfernen. [Ein Angreifer mit 34 %](https://www.youtube.com/watch?v=6vzXwwk12ZE) des Einsatzes hat sehr gute Chancen, bei diesem Angriff erfolgreich zu sein, wie [in dieser Notiz](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) erklärt wird. Theoretisch könnte dieser Angriff jedoch auch mit geringeren Einsätzen versucht werden. [Neuder et al. 2020](https://arxiv.org/pdf/2102.02247.pdf) beschrieben, dass dieser Angriff mit einem Einsatz von 30 % funktioniert, aber später wurde gezeigt, dass er mit [2 % des gesamten Einsatzes](https://arxiv.org/pdf/2009.04987.pdf) und dann noch einmal für einen [einzelnen Validator](https://arxiv.org/abs/2110.10086#) unter Verwendung von Balancing-Techniken, die wir im nächsten Abschnitt untersuchen werden, durchführbar ist. -![Ex-ante-Neuorganisation](reorg-schematic.png) +![Ex-ante-Reorg](reorg-schematic.png) -Ein konzeptionelles Diagramm des oben beschriebenen Neuorganisations-Angriffs mit nur einem Block (angepasst aus https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) +Ein konzeptionelles Diagramm des oben beschriebenen Ein-Block-Reorg-Angriffs (angepasst von https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) -Ein raffinierterer Angriff kann die Reihe ehrlicher Validatoren in getrennte Gruppen aufteilen, die unterschiedliche Ansichten über die Spitze der Chain haben. Dies ist bekannt unter dem Namen **Balancing-Angriff**. Der Angreifer wartet auf seine Chance, einen Block vorzuschlagen, und wenn diese gekommen ist, wird er mehrdeutig und schlägt zwei vor. Sie senden einen Block an die Hälfte der Reihe aus ehrlichen Validatoren und den anderen Block an die andere Hälfte. Die Mehrdeutigkeit würde vom Abspaltungs-Wahl-Algorithmus erkannt werden und der Block-Proposer würde mit Slashing bestraft und aus dem Netz geworfen werden. Die beiden Blöcke würden hingegen weiterhin existieren, wobei jeweils etwa die Hälfte der Validatoren eine der beiden Abspaltungen attestieren. In der Zwischenzeit halten die übrigen böswilligen Validatoren ihre Attestierungen zurück. Indem sie dann selektiv die Attestierungen, die die eine oder andere Abspaltung begünstigen, genau während der Ausführung des Abspaltungs-Wahl-Algorithmus an gerade genug Validatoren freigeben, kippen sie das kumulierte Gewicht der Attestierungen zugunsten der einen oder anderen Abspaltung. Dies kann auf unbestimmte Zeit fortgesetzt werden, wobei die angreifenden Validatoren eine gleichmäßige Verteilung der Validatoren auf die beiden Abspaltungen beibehalten. Da keine der beiden Abspaltungen eine 2/3-Supermajority auf sich vereinigen kann, würde das Netzwerk nicht finalisiert werden. +Ein raffinierterer Angriff kann die Menge der ehrlichen Validatoren in diskrete Gruppen aufteilen, die unterschiedliche Ansichten über die Spitze der Chain haben. Dies wird als **Balancing-Angriff** bezeichnet. Der Angreifer wartet auf seine Chance, einen Block vorzuschlagen, und wenn diese kommt, verhält er sich zweideutig (Equivocation) und schlägt zwei vor. Er sendet einen Block an die Hälfte der ehrlichen Validatoren und den anderen Block an die andere Hälfte. Die Zweideutigkeit würde vom Fork-Choice-Algorithmus erkannt werden, und der Block-Vorschlagende würde durch Slashing bestraft und aus dem Netzwerk geworfen werden, aber die beiden Blöcke würden weiterhin existieren und etwa die Hälfte der Validatoren würde für jeden Fork Bestätigungen abgeben. In der Zwischenzeit halten die verbleibenden böswilligen Validatoren ihre Bestätigungen zurück. Indem sie dann selektiv die Bestätigungen, die den einen oder anderen Fork begünstigen, an gerade genug Validatoren freigeben, genau in dem Moment, in dem der Fork-Choice-Algorithmus ausgeführt wird, kippen sie das angesammelte Gewicht der Bestätigungen zugunsten des einen oder anderen Forks. Dies kann auf unbestimmte Zeit fortgesetzt werden, wobei die angreifenden Validatoren eine gleichmäßige Aufteilung der Validatoren auf die beiden Forks aufrechterhalten. Da keiner der Forks eine 2/3-Supermehrheit auf sich vereinen kann, würde das Netzwerk nicht finalisieren. -**Bouncing-Angriffe** funktionieren ähnlich. Die Stimmen werden erneut von den angreifenden Validatoren zurückgehalten. Anstatt die Stimmen freizugeben, um eine gleichmäßige Aufteilung zwischen zwei Abspaltungen aufrechtzuerhalten, nutzen sie ihre Stimmen in günstigen Momenten, um Checkpoints zu rechtfertigen, die zwischen Aspaltung A und Abspaltung B alternieren. Dieses Hin- und Herwechseln der Berechtigungen zwischen zwei Abspaltungen verhindert, dass sich Paare berechtigter Quell- und Ziel-Checkpoints bilden, die auf beiden Chains finalisiert werden können, was die Endgültigkeit aufhält. +**Bouncing-Angriffe** sind ähnlich. Stimmen werden wiederum von den angreifenden Validatoren zurückgehalten. Anstatt die Stimmen freizugeben, um eine gleichmäßige Aufteilung zwischen zwei Forks aufrechtzuerhalten, nutzen sie ihre Stimmen in günstigen Momenten, um Checkpoints zu rechtfertigen, die zwischen Fork A und Fork B wechseln. Dieses Hin- und Herwechseln der Rechtfertigung zwischen zwei Forks verhindert, dass es Paare von gerechtfertigten Quell- und Ziel-Checkpoints gibt, die auf einer der beiden Chains finalisiert werden können, wodurch die Finalität gestoppt wird. -Sowohl Bouncing- als auch Balancing-Angriffe setzen voraus, dass der Angreifer das Timing der Nachrichten im Netzwerk sehr genau kontrollieren kann, was unwahrscheinlich ist. Dennoch sind Schutzmechanismen in das Protokoll eingebaut, und zwar in Form einer zusätzlichen Gewichtung von prompten Nachrichten gegenüber langsamen Nachrichten. Dies ist bekannt unter dem Namen [Proposer-Weight Boosting](https://github.com/ethereum/consensus-specs/pull/2730). Um sich gegen Bouncing-Angriffe zu schützen, wurde der Abspaltungs-Wahl-Algorithmus so aktualisiert, dass der letzte berechtigte Checkpoint auf die einer alternativen Chain nur während des [ersten Drittels der Slots in jeder Epoche](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) wechseln kann. Diese Bedingung hindert den Angreifer daran, Stimmen zu speichern, um sie später einzusetzen – der Abspaltungs-Wahl-Algorithmus bleibt einfach dem Checkpoint treu, den er im ersten Drittel der Epoche gewählt hat, in der die meisten ehrlichen Validatoren gewählt hätten. +Sowohl Bouncing- als auch Balancing-Angriffe beruhen darauf, dass der Angreifer eine sehr genaue Kontrolle über das Timing von Nachrichten im gesamten Netzwerk hat, was unwahrscheinlich ist. Dennoch sind im Protokoll Verteidigungsmechanismen in Form einer zusätzlichen Gewichtung eingebaut, die schnellen Nachrichten im Vergleich zu langsamen gegeben wird. Dies ist als [Proposer-Weight Boosting](https://github.com/ethereum/consensus-specs/pull/2730) bekannt. Zur Abwehr von Bouncing-Angriffen wurde der Fork-Choice-Algorithmus so aktualisiert, dass der zuletzt gerechtfertigte Checkpoint nur während des [ersten Drittels der Slots in jeder Epoche](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) zu dem einer alternativen Chain wechseln kann. Diese Bedingung hindert den Angreifer daran, Stimmen aufzusparen, um sie später einzusetzen – der Fork-Choice-Algorithmus bleibt einfach dem Checkpoint treu, den er im ersten Drittel der Epoche gewählt hat, in der die meisten ehrlichen Validatoren abgestimmt hätten. -Zusammengenommen führen diese Maßnahmen zu einem Szenario, in dem ein ehrlicher Block-Proposer seinen Block sehr schnell nach dem Beginn des Slots überträgt, woraufhin eine Zeitspanne von ~1/3 eines Slots (4 Sekunden) folgt, während der dieser neue Block den Abspaltungs-Wahl-Algorithmus veranlassen könnte, zu einer anderen Chain zu wechseln. Nach Ablauf dieser Frist werden Attestierungen, die von langsamen Validatoren eingehen, im Vergleich zu den früher eingegangenen Attestierungen niedriger gewichtet. Dies begünstigt schnelle Antragsteller und Validatoren bei der Bestimmung Spitze der Chain und verringert die Wahrscheinlichkeit eines erfolgreichen Balancing- oder Bouncing-Angriffs erheblich. +Zusammengenommen schaffen diese Maßnahmen ein Szenario, in dem ein ehrlicher Block-Vorschlagender seinen Block sehr schnell nach Beginn des Slots ausgibt. Dann gibt es eine Zeitspanne von ~1/3 eines Slots (4 Sekunden), in der dieser neue Block den Fork-Choice-Algorithmus dazu veranlassen könnte, zu einer anderen Chain zu wechseln. Nach derselben Frist werden Bestätigungen, die von langsamen Validatoren eintreffen, im Vergleich zu den früher eingetroffenen abgewertet. Dies begünstigt schnelle Vorschlagende und Validatoren bei der Bestimmung der Spitze der Chain stark und verringert die Wahrscheinlichkeit eines erfolgreichen Balancing- oder Bouncing-Angriffs erheblich. -Es ist erwähnenswert, dass das Proposer-Boosting allein nur gegen „billige Neuorganisationen“ schützt, d. h. gegen solche, die von einem Angreifer mit einem kleinen Stake versucht werden. Das „Proposer-Boosting“ selbst kann von größeren Stakeholdern manipuliert werden. Die Autoren von [diesem Beitrag](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) beschreiben, wie ein Angreifer mit 7 % des Stakes seine Stimmen strategisch so einsetzen kann, dass er ehrliche Validatoren dazu bringt, auf ihrer Abspaltung aufzubauen und durch Neuorganisation einen ehrlichen Block aus dem Rennen zu nehmen. Dieser Angriff wurde unter der Annahme idealer Latenzbedingungen entwickelt, die sehr unwahrscheinlich sind. Die Chancen für den Angreifer sind nach wie vor sehr gering und der größere Stake bedeutet auch ein höheres Kapitalrisiko und eine stärkere wirtschaftliche Abschreckung. +Es ist erwähnenswert, dass Proposer Boosting allein nur gegen „billige Reorgs“ schützt, d. h. solche, die von einem Angreifer mit einem kleinen Einsatz versucht werden. Tatsächlich kann das Proposer Boosting selbst von größeren Stakeholdern ausgetrickst werden. Die Autoren [dieses Beitrags](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) beschreiben, wie ein Angreifer mit 7 % des Einsatzes seine Stimmen strategisch einsetzen kann, um ehrliche Validatoren dazu zu bringen, auf seinem Fork aufzubauen und so einen ehrlichen Block durch einen Reorg zu verdrängen. Dieser Angriff wurde unter der Annahme idealer Latenzbedingungen entwickelt, die sehr unwahrscheinlich sind. Die Chancen stehen für den Angreifer immer noch sehr schlecht, und der größere Einsatz bedeutet auch mehr riskiertes Kapital und eine stärkere wirtschaftliche Abschreckung. -Ein [Balancing-Angriff, der speziell auf die LMD-Regel abzielt](https://ethresear.ch/t/balancing-attack-lmd-edition/11853), wurde ebenfalls vorgeschlagen. Es wurde vermutet, dass so ein Angriff trotz Proposer Boosting Erfolg haben könnte. Ein Angreifer richtet zwei konkurrierende Chains ein, indem er dafür sorgt, dass ihr Block-Proposal mehrdeutig wird. Außerdem propagiert er jeden Block an etwa jeweils die Hälfte des Netzwerks, wodurch ein ungefähres Gleichgewicht zwischen den Abspaltungen hergestellt wird. Dann geben die betrügerischen Validatoren ihre Stimmen mehrdeutig ab und legen den Zeitpunkt so fest, dass die Hälfte des Netzes zuerst ihre Stimmen für Abspaltung `A` erhält und die andere Hälfte zuerst ihre Stimmen für Abspaltung `B` erhält. Da die LMD-Regel die zweite Attestierung verwirft und nur die erste Attestierung für jeden Validator aufrechterhält, sieht die Hälfte des Netzwerks Stimmen für `A` und keine für `B`, die andere Hälfte sieht Stimmen für `B` und keine für `A`. Die Autoren beschreiben, dass die LMD-Regel dem Gegner „bemerkenswerte Macht“ dazu verleiht, einen Balancing-Angriff zu starten. +Es wurde auch ein [Balancing-Angriff vorgeschlagen, der speziell auf die LMD-Regel abzielt](https://ethresear.ch/t/balancing-attack-lmd-edition/11853) und der trotz Proposer Boosting als durchführbar erachtet wurde. Ein Angreifer richtet zwei konkurrierende Chains ein, indem er seinen Blockvorschlag zweideutig macht und jeden Block an etwa die Hälfte des Netzwerks weiterleitet, wodurch ein ungefähres Gleichgewicht zwischen den Forks hergestellt wird. Dann verhalten sich die kolludierenden Validatoren bei ihren Abstimmungen zweideutig und timen dies so, dass die Hälfte des Netzwerks ihre Stimmen für Fork `A` zuerst erhält und die andere Hälfte ihre Stimmen für Fork `B` zuerst erhält. Da die LMD-Regel die zweite Bestätigung verwirft und nur die erste für jeden Validator behält, sieht die Hälfte des Netzwerks Stimmen für `A` und keine für `B`, die andere Hälfte sieht Stimmen für `B` und keine für `A`. Die Autoren beschreiben, dass die LMD-Regel dem Angreifer „bemerkenswerte Macht“ verleiht, um einen Balancing-Angriff durchzuführen. -Dieser LMD-Angriffsvektor wurde geschlossen, indem [der Abspaltungs-Wahl-Algorithmus](https://github.com/ethereum/consensus-specs/pull/2845) so aktualisiert wurde, dass mehrdeutige Validatoren bei der Abspaltungs-Wahl überhaupt nicht berücksichtigt werden. Bei mehrdeutigen Validatoren wird ihr zukünftiger Einfluss durch den Abspaltungs-Wahl-Algorithmus ebenfalls abgewertet. Dadurch wird der oben beschriebene Balancing-Angriff verhindert und gleichzeitig die Widerstandsfähigkeit gegen Lawinenangriffe aufrechterhalten. +Dieser LMD-Angriffsvektor wurde geschlossen, indem der [Fork-Choice-Algorithmus aktualisiert wurde](https://github.com/ethereum/consensus-specs/pull/2845), sodass er zweideutig handelnde Validatoren vollständig aus der Fork-Choice-Betrachtung ausschließt. Der zukünftige Einfluss von zweideutig handelnden Validatoren wird vom Fork-Choice-Algorithmus ebenfalls abgewertet. Dies verhindert den oben beschriebenen Balancing-Angriff und erhält gleichzeitig die Widerstandsfähigkeit gegen Avalanche-Angriffe aufrecht. -Eine andere Klasse von Angriffen, genannt [**Lawinenangriffe**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3), wurde in einem [Artikel aus dem März 2022](https://arxiv.org/pdf/2203.01315.pdf) beschrieben. Um einen Lawinenangriff durchzuführen, muss der Angreifer mehrere aufeinanderfolgende Block-Proposer kontrollieren. In jedem der Block-Proposal-Slots hält der Angreifer seinen Block zurück und sammelt Blöcke, bis die ehrliche Chain ein Gleichgewicht des Subtrees mit den zurückgehaltenen Blöcken erreicht. Dann werden die zurückgehaltenen Blöcke freigegeben, sodass sie für maximale Mehrdeutigkeit sorgen. Die Autoren legen nahe, dass Proposer Boosting – die primäre Verteidigung gegen Balancing- und Bouncing-Angriffe – nicht vor einigen Varianten von Lawinenangriffen schützt. Allerdings demonstrierten die Autoren den Angriff auch nur an einer stark idealisierten Version des Abspaltungs-Wahl-Algorithmus auf Ethereum (sie verwendeten GHOST ohne LMD). +Eine weitere Klasse von Angriffen, sogenannte [**Avalanche-Angriffe**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3), wurde in einem [Papier vom März 2022](https://arxiv.org/pdf/2203.01315.pdf) beschrieben. Um einen Avalanche-Angriff durchzuführen, muss der Angreifer mehrere aufeinanderfolgende Block-Vorschlagende kontrollieren. In jedem der Blockvorschlags-Slots hält der Angreifer seinen Block zurück und sammelt sie, bis die ehrliche Chain ein gleiches Teilbaumgewicht wie die zurückgehaltenen Blöcke erreicht. Dann werden die zurückgehaltenen Blöcke freigegeben, sodass sie maximal zweideutig sind. Die Autoren deuten an, dass Proposer Boosting – die primäre Verteidigung gegen Balancing- und Bouncing-Angriffe – nicht vor einigen Varianten des Avalanche-Angriffs schützt. Die Autoren demonstrierten den Angriff jedoch auch nur an einer stark idealisierten Version von Ethereums Fork-Choice-Algorithmus (sie verwendeten GHOST ohne LMD). -Der Lawinenangriff wird durch den LMD-Teil des LMD-GHOST-Abspaltungs-Wahl-Algorithmus abgeschwächt. LMD bedeutet „latest-message-driven“ und bezieht sich auf eine Tabelle, die von jedem Validator geführt wird und die die letzte von anderen Validatoren erhaltene Nachricht enthält. Dieses Feld wird nur dann aktualisiert, wenn die neue Nachricht von einem späteren Slot stammt als die bereits in der Tabelle für einen bestimmten Validator enthaltene Nachricht. In der Praxis bedeutet dies, dass in jedem Slot die erste empfangene Nachricht diejenige ist, die akzeptiert wurde, und dass alle weiteren Nachrichten zu ignorierende Mehrdeutigkeiten sind. Anders ausgedrückt: Die Konsens-Clients zählen keine Mehrdeutigkeiten – sie verwenden die zuerst eintreffende Nachricht von jedem Validator und Mehrdeutigkeiten werden einfach verworfen, um Lawinenangriffe zu verhindern. +Der Avalanche-Angriff wird durch den LMD-Teil des LMD-GHOST-Fork-Choice-Algorithmus abgeschwächt. LMD bedeutet „latest-message-driven“ (gesteuert durch die neueste Nachricht) und bezieht sich auf eine Tabelle, die von jedem Validator geführt wird und die neueste von anderen Validatoren empfangene Nachricht enthält. Dieses Feld wird nur aktualisiert, wenn die neue Nachricht aus einem späteren Slot stammt als diejenige, die sich bereits für einen bestimmten Validator in der Tabelle befindet. In der Praxis bedeutet dies, dass in jedem Slot die erste empfangene Nachricht diejenige ist, die akzeptiert wird, und alle zusätzlichen Nachrichten Zweideutigkeiten sind, die ignoriert werden. Anders ausgedrückt: Die Konsens-Clients zählen keine Zweideutigkeiten – sie verwenden die zuerst eintreffende Nachricht von jedem Validator, und Zweideutigkeiten werden einfach verworfen, was Avalanche-Angriffe verhindert. -Es gibt mehrere andere mögliche Upgrades für die Abspaltungs-Wahl-Regel, die in Zukunft die Sicherheit durch Proposer Boost erhöhen könnten. Eines davon ist [View-Merge](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), wobei die Attestierer ihre Sicht auf die Abspaltungs-Wahl `n` Sekunden vor Beginn eines Slots einfrieren und der Proposer dann dabei hilft, die Sicht auf die Chain im gesamten Netzwerk zu synchronisieren. Ein weiteres mögliches Upgrade ist die [Einzelplatzendgültigkeit](https://notes.ethereum.org/@vbuterin/single_slot_finality), die vor Angriffen auf Basis des Timings von Nachrichten schützt, indem sie die Chain nach nur einem Slot finalisiert. +Es gibt mehrere andere potenzielle zukünftige Upgrades für die Fork-Choice-Regel, die die durch Proposer-Boost gebotene Sicherheit erhöhen könnten. Eines davon ist [View-Merge](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), bei dem Bestätigende ihre Sicht auf die Fork-Choice `n` Sekunden vor Beginn eines Slots einfrieren und der Vorschlagende dann hilft, die Sicht auf die Chain im gesamten Netzwerk zu synchronisieren. Ein weiteres potenzielles Upgrade ist die [Single-Slot-Finalität](https://notes.ethereum.org/@vbuterin/single_slot_finality), die vor Angriffen schützt, die auf dem Timing von Nachrichten basieren, indem die Chain nach nur einem Slot finalisiert wird. -#### Endgültigkeitsverzögerung {#finality-delay} +#### Finalitätsverzögerung {#finality-delay} -[Im selben Artikel](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf), der zuerst den kostengünstigen Angriff auf die Neuorganisation eines einzelnen Blocks beschrieben hatte, wurde auch ein Angriff mit Endgültigkeitsverzögerung (auch bekannt als „Livesness-Versagen“) beschrieben, der sich darauf stützt, dass der Angreifer der Block-Proposer für einen Block an der Epochengrenze ist. Dies ist von entscheidender Bedeutung, da diese Blöcke an der Epochengrenze zu den Checkpoints werden, die Casper FFG verwendet, um Teile der Chain zu finalisieren. Der Angreifer hält seinen Block einfach so lange zurück, bis genügend ehrliche Validatoren ihre FFG-Stimmen zugunsten des vorherigen Blocks an der Epochengrenze als aktuelles Finalisierungsziel einsetzen. Dann geben sie ihren zurückgehaltenen Block frei. Sie attestieren für ihren Block und die übrigen ehrlichen Validatoren tun dies ebenfalls, wodurch Abspaltungen mit unterschiedlichen Ziel-Checkpoints kreiert werden. Wenn sie es genau richtig timen, verhindern sie die Endgültigkeit, weil es keine 2/3-Supermajority gibt, die für eine der beiden Abspaltungen attestiert. Je kleiner der Stake ist, desto präziser muss das Timing sein, da der Angreifer weniger Attestierungen direkt kontrolliert, und desto geringer ist die Wahrscheinlichkeit, dass der Angreifer den Validator kontrolliert, der einen bestimmten Block an der Epochengrenze vorschlägt. +[Dasselbe Papier](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf), das zuerst den kostengünstigen Ein-Block-Reorg-Angriff beschrieb, beschrieb auch einen Angriff zur Finalitätsverzögerung (auch bekannt als „Liveness Failure“), der darauf beruht, dass der Angreifer der Block-Vorschlagende für einen Epochengrenzen-Block ist. Dies ist von entscheidender Bedeutung, da diese Epochengrenzen-Blöcke zu den Checkpoints werden, die Casper FFG verwendet, um Teile der Chain zu finalisieren. Der Angreifer hält seinen Block einfach zurück, bis genügend ehrliche Validatoren ihre FFG-Stimmen zugunsten des vorherigen Epochengrenzen-Blocks als aktuelles Finalisierungsziel verwenden. Dann geben sie ihren zurückgehaltenen Block freigegeben. Sie geben Bestätigungen für ihren Block ab, und die verbleibenden ehrlichen Validatoren tun dies ebenfalls, wodurch Forks mit unterschiedlichen Ziel-Checkpoints entstehen. Wenn sie das Timing genau richtig gewählt haben, verhindern sie die Finalität, da es für keinen der beiden Forks eine 2/3-Supermehrheit an Bestätigungen geben wird. Je kleiner der Einsatz, desto präziser muss das Timing sein, da der Angreifer weniger Bestätigungen direkt kontrolliert und die Wahrscheinlichkeit geringer ist, dass der Angreifer den Validator kontrolliert, der einen bestimmten Epochengrenzen-Block vorschlägt. -#### Langstreckenangriffe {#long-range-attacks} +#### Long-Range-Angriffe {#long-range-attacks} -Es gibt auch eine Angriffsklasse, die spezifisch für Proof-of-Stake-Blockchains ist, bei der ein Validator, der am Genesis-Block beteiligt war, eine separate Abspaltung der Blockchain neben der ehrlichen aufrechterhält. Schließlich überzeugt dieser die Reihe ehrlicher Validator davon, viel später zu einem günstigen Zeitpunk zu dieser Abspaltung zu wechseln. Diese Art von Angriff ist bei Ethereum nicht möglich, da das Endgültigkeits-Gadget sicherstellt, dass sich alle Validatoren in regelmäßigen Abständen („Checkpoints“) über den Zustand der ehrlichen Chain einig sind. Dieser einfache Mechanismus neutralisiert Langstreckenangriffe, da Ethereum-Clients finalisierte Blöcke einfach nicht neu organisieren. Neue Nodes, die dem Netzwerk beitreten, tun dies, indem sie einen vertrauenswürdigen aktuellen Zustands-Hash finden (einen „[Checkpoint schwacher](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) Subjektivität“) und ihn als Pseudo-Genesis-Block verwenden, auf dem aufgebaut werden kann. Dadurch wird für einen neuen Node, der in das Netzwerk eintritt, ein „Vertrauens-Gateway“ geschaffen, bevor er damit beginnen kann, Informationen für sich selbst zu verifizieren. +Es gibt auch eine Klasse von Angriffen, die spezifisch für Proof-of-Stake-Blockchains ist und bei der ein Validator, der am Genesis-Block teilgenommen hat, neben dem ehrlichen Fork einen separaten Fork der Blockchain aufrechterhält und schließlich die ehrliche Validatoren-Menge davon überzeugt, zu einem viel späteren, günstigen Zeitpunkt zu diesem zu wechseln. Diese Art von Angriff ist auf Ethereum aufgrund des Finalitäts-Gadgets nicht möglich, das sicherstellt, dass sich alle Validatoren in regelmäßigen Abständen („Checkpoints“) auf den Zustand der ehrlichen Chain einigen. Dieser einfache Mechanismus neutralisiert Long-Range-Angreifer, da Ethereum-Clients finalisierte Blöcke einfach nicht reorg-en. Neue Blockchain-Knoten, die dem Netzwerk beitreten, tun dies, indem sie einen vertrauenswürdigen aktuellen Zustands-Hash (einen „[Weak Subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) Checkpoint“) finden und ihn als Pseudo-Genesis-Block verwenden, auf dem sie aufbauen. Dies schafft ein „Vertrauens-Gateway“ für einen neuen Blockchain-Knoten, der in das Netzwerk eintritt, bevor er beginnen kann, Informationen selbst zu verifizieren. #### Denial of Service {#denial-of-service} -Der PoS-Mechanismus von Ethereum wählt in jedem Slot einen einzelnen Validator aus der Gesamtmenge der Validatoren aus, der als Block-Proposer fungiert. Diese kann mit Hilfe einer öffentlich bekannten Funktion berechnet werden und es ist möglich, dass ein Angreifer den nächsten Block-Proposer kurze Zeit vor seinem Block-Proposal identifiziert. Dann kann der Angreifer den Block-Proposer mit Spam-Mails bombardieren, um ihn daran zu hindern, Informationen mit seinen Peers auszutauschen. Für den Rest des Netzwerkes würde es so aussehen, als wäre der Block-Proposer offline und als würde der Slot einfach leer werden. Dies könnte als eine Form der Zensur gegen bestimmte Validatoren eingesetzt werden, die so daran gehindert werden, Informationen zur Blockchain hinzuzufügen. Durch die Implementierung von Single Secret Leader Elections (SSLE) oder Non Single Secret Leader Elections wird das DoS-Risiko gemindert, da nur derjenige, der den Block vorschlägt, weiß, dass er ausgewählt wurde und die Auswahl nicht im Voraus bekannt ist. Dies wurde noch nicht implementiert, ist aber ein aktiver Bereich der [Forschung und Entwicklung](https://ethresear.ch/t/secret-non-single-leader-election/11789). +Der PoS-Mechanismus von Ethereum wählt in jedem Slot einen einzelnen Validator aus der gesamten Validatoren-Menge als Block-Vorschlagenden aus. Dies kann mithilfe einer öffentlich bekannten Funktion berechnet werden, und es ist für einen Angreifer möglich, den nächsten Block-Vorschlagenden kurz vor seinem Blockvorschlag zu identifizieren. Dann kann der Angreifer den Block-Vorschlagenden mit Spam überhäufen, um ihn daran zu hindern, Informationen mit seinen Peers auszutauschen. Für den Rest des Netzwerks würde es so aussehen, als wäre der Block-Vorschlagende offline, und der Slot würde einfach leer bleiben. Dies könnte eine Form der Zensur gegen bestimmte Validatoren sein, die sie daran hindert, der Blockchain Informationen hinzuzufügen. Die Implementierung von Single Secret Leader Elections (SSLE) oder Non-Single Secret Leader Elections wird DoS-Risiken mindern, da nur der Block-Vorschlagende jemals weiß, dass er ausgewählt wurde, und die Auswahl nicht im Voraus bekannt ist. Dies ist noch nicht implementiert, aber ein aktiver Bereich der [Forschung und Entwicklung](https://ethresear.ch/t/secret-non-single-leader-election/11789). -All dies deutet darauf hin, dass es sehr schwierig ist, Ethereum mit einem kleinen Stake erfolgreich anzugreifen. Für die hier beschriebenen realisierbaren Angriffe sind ein idealisierter Abspaltungs-Wahl-Algorithmus oder unwahrscheinliche Netzwerkbedingungen erforderlich oder die Angriffsvektoren wurden bereits mit relativ kleinen Patches für die Client-Software geschlossen. Dies schließt natürlich nicht aus, dass irgendwo dort draußen Zero-Days existieren. Allerdings zeigt es, wie hoch die Messlatte für technisches Geschick, Wissen über die Konsensebene und Glück liegt, damit ein Angreifer mit einem Minderheits-Stake erfolgreich sein kann. Aus der Sicht eines Angreifers wäre es am besten, so viel Ether wie möglich zu sammeln und, ausgestattet mit einem größeren Anteil des Gesamt-Stakes, zurückzukehren. +All dies deutet darauf hin, dass es sehr schwierig ist, Ethereum mit einem kleinen Einsatz erfolgreich anzugreifen. Die hier beschriebenen durchführbaren Angriffe erfordern einen idealisierten Fork-Choice-Algorithmus, unwahrscheinliche Netzwerkbedingungen, oder die Angriffsvektoren wurden bereits mit relativ kleinen Patches an der Client-Software geschlossen. Dies schließt natürlich nicht die Möglichkeit aus, dass Zero-Days in freier Wildbahn existieren, aber es zeigt die extrem hohe Hürde an technischer Eignung, Wissen über die Konsensebene und Glück, die erforderlich ist, damit ein Angreifer mit Minderheitseinsatz effektiv sein kann. Aus der Sicht eines Angreifers könnte es die beste Wette sein, so viel Ether wie möglich anzuhäufen und mit einem größeren Anteil am gesamten Einsatz bewaffnet zurückzukehren. -### Angreifer, die >= 33 % des gesamten Stakes nutzen {#attackers-with-33-stake} +### Angreifer mit >= 33 % des gesamten Einsatzes {#attackers-with-33-stake} -Alle in diesem Artikel erwähnten Angriffe werden wahrscheinlicher, wenn der Angreifer über mehr eingesetzte Ether verfügt, mit denen er abstimmen kann, und über mehr Validatoren, die ausgewählt werden können, um Blöcke in jedem Slot vorzuschlagen. Ein böswilliger Validator könnte dadurch versuchen, so viele eingesetzte Ether wie möglich zu kontrollieren. +Alle zuvor in diesem Artikel erwähnten Angriffe haben eine höhere Erfolgswahrscheinlichkeit, wenn der Angreifer über mehr eingesetzte Ether verfügt, mit denen er abstimmen kann, und über mehr Validatoren, die ausgewählt werden könnten, um in jedem Slot Blöcke vorzuschlagen. Ein böswilliger Validator könnte daher darauf abzielen, so viele eingesetzte Ether wie möglich zu kontrollieren. -33 % des eingesetzten Ethers ist ein Richtwert für einen Angreifer, da er bei jedem höheren Betrag die Möglichkeit hat, die Finalisierung der Chain zu verhindern, ohne die Aktionen der anderen Validatoren genau kontrollieren zu müssen. Sie können einfach alle zusammen verschwinden. Wenn 1/3 oder mehr der eingesetzten Ether auf böswillige Weise attestieren oder gar nicht attestieren, kann keine 2/3-Supermajority existieren und die Chain kann nicht finalisiert werden. Die Verteidigung dagegen ist das Inactivity Leak. Das Inactivity Leak identifiziert diejenigen Validatoren, die nicht attestieren oder widersprüchlich zur Mehrheit attestieren. Die eingesetzten Ether, die sich im Besitz dieser nicht attestierenden Validatoren befinden, werden nach und nach abgezogen, bis sie schließlich zusammengenommen weniger als 1/3 der Gesamtmenge ausmachen, sodass die Chain wieder finalisiert werden kann. +33 % der eingesetzten Ether sind ein Richtwert für einen Angreifer, da er mit allem, was über diesen Betrag hinausgeht, die Möglichkeit hat, die Finalisierung der Chain zu verhindern, ohne die Aktionen der anderen Validatoren genau kontrollieren zu müssen. Sie können einfach alle zusammen verschwinden. Wenn 1/3 oder mehr der eingesetzten Ether böswillig Bestätigungen abgeben oder dies unterlassen, kann keine 2/3-Supermehrheit existieren und die Chain kann nicht finalisieren. Die Verteidigung dagegen ist das Inactivity Leak (Inaktivitätsleck). Das Inactivity Leak identifiziert diejenigen Validatoren, die keine Bestätigungen abgeben oder entgegen der Mehrheit bestätigen. Die eingesetzten Ether, die diesen nicht bestätigenden Validatoren gehören, werden allmählich abgezogen, bis sie schließlich zusammen weniger als 1/3 der Gesamtsumme ausmachen, sodass die Chain wieder finalisieren kann. -Der Zweck dieses Inactivity Leak ist es, dafür zu sorgen, dass die Kette wieder finalisiert werden kann. Jedoch verliert der Angreifer auch einen Teil seiner eingesetzten Ether. Anhaltende Inaktivität bei Validatoren, die 33 % der insgesamt eingesetzten Ether repräsentieren, ist sehr teuer, auch wenn die Validatoren nicht mit Slashing bestraft werden. +Der Zweck des Inactivity Leaks besteht darin, die Chain wieder zur Finalisierung zu bringen. Der Angreifer verliert jedoch auch einen Teil seiner eingesetzten Ether. Anhaltende Inaktivität bei Validatoren, die 33 % der gesamten eingesetzten Ether repräsentieren, ist sehr teuer, auch wenn die Validatoren nicht durch Slashing bestraft werden. -Unter der Annahme, dass das Ethereum-Netzwerk asynchron ist (d. h. es gibt Verzögerungen zwischen dem Senden und Empfangen von Nachrichten), könnte ein Angreifer, der 34 % des gesamten Stakes kontrolliert, eine doppelte Endgültigkeit herbeiführen. Der Grund dafür ist, dass der Angreifer, wenn er als Block-Producer ausgewählt wird, für Mehrdeutigkeit sorgen und dann doppelt mit all seinen Validatoren abstimmen kann. Das erzeugt eine Situation, in der eine Abspaltung in der Blockchain existiert, für die jeweils 34 % der eingesetzten Ether abstimmen. Für jede Abspaltung müssten nur 50 % der übrigen Validatoren stimmen, damit beide Abspaltungen von einer Supermajority unterstützt werden. In diesem Fall können beide Chains finalisiert werden (weil 34 % der Angreifervalidatoren + die Hälfte der verbleibenden 66 % = 67 % für jede Abspaltung). Die konkurrierenden Blöcke müssten jeweils von etwa 50 % der ehrlichen Validatoren empfangen werden, sodass dieser Angriff nur durchführbar ist, wenn der Angreifer ein gewisses Maß an Kontrolle über das Timing der über das Netzwerk propagierten Nachrichten hat, sodass er dafür sorgen kann, dass die Hälfte der ehrlichen Validatoren auf jede Chain gelangen. Der Angreifer würde zwangsläufig seinen gesamten Stake (34 % von ~10 Millionen Ether mit dem heutigen Validatoren-Set) zerstören, um diese doppelte Endgültigkeit zu erreichen, da 34 % seiner Validatoren gleichzeitig doppelt abstimmen würden – ein Vergehen, das mit Slashing und der maximalen Korrelationsstrafe geahndet wird. Die Verteidigung gegen diesen Angriff sind die sehr großen Kosten für das Zerstören von 34 % der insgesamt eingesetzten Ether. Um sich von diesem Angriff zu erholen, müsste sich die Ethereum-Community „außerhalb des Bands“ koordinieren und sich auf das Folgen einer Abspaltung einigen und die andere Abspaltung ignorieren. +Unter der Annahme, dass das Ethereum-Netzwerk asynchron ist (d. h. es gibt Verzögerungen zwischen dem Senden und Empfangen von Nachrichten), könnte ein Angreifer, der 34 % des gesamten Einsatzes kontrolliert, eine doppelte Finalität verursachen. Dies liegt daran, dass der Angreifer sich zweideutig verhalten kann, wenn er als Blockproduzent ausgewählt wird, und dann mit all seinen Validatoren doppelt abstimmen kann. Dies schafft eine Situation, in der ein Fork der Blockchain existiert, für den jeweils 34 % der eingesetzten Ether stimmen. Jeder Fork benötigt nur 50 % der verbleibenden Validatoren, die für ihn stimmen, damit beide Forks von einer Supermehrheit unterstützt werden. In diesem Fall können beide Chains finalisieren (da 34 % der Validatoren des Angreifers + die Hälfte der verbleibenden 66 % = 67 % auf jedem Fork). Die konkurrierenden Blöcke müssten jeweils von etwa 50 % der ehrlichen Validatoren empfangen werden, sodass dieser Angriff nur durchführbar ist, wenn der Angreifer ein gewisses Maß an Kontrolle über das Timing der sich über das Netzwerk ausbreitenden Nachrichten hat, sodass er die Hälfte der ehrlichen Validatoren auf jede Chain lenken kann. Der Angreifer würde zwangsläufig seinen gesamten Einsatz (34 % von ~10 Millionen Ether beim heutigen Validatoren-Set) zerstören, um diese doppelte Finalität zu erreichen, da 34 % seiner Validatoren gleichzeitig doppelt abstimmen würden – ein Vergehen, das mit Slashing und der maximalen Korrelationsstrafe geahndet wird. Die Verteidigung gegen diesen Angriff sind die sehr hohen Kosten für die Zerstörung von 34 % der gesamten eingesetzten Ether. Die Erholung von diesem Angriff würde erfordern, dass sich die Ethereum-Community „Out-of-Band“ koordiniert und sich darauf einigt, dem einen oder anderen Fork zu folgen und den anderen zu ignorieren. -### Angreifer, die ~50 % des gesamten Stakes nutzen {#attackers-with-50-stake} +### Angreifer mit ~50 % des gesamten Einsatzes {#attackers-with-50-stake} -Mit 50 % des eingesetzten Ethers könnte eine böswillige Gruppe von Validatoren die Chain theoretisch in zwei gleich große Abspaltungen aufteilen und dann einfach ihren gesamten Stake von 50 % einsetzen, um gegensätzlich zum ehrlichen Validatoren-Set abzustimmen, was die beiden Abspaltungen aufrechterhalten und die Endgültigkeit verhindern würde. Das Inactivity Leak auf beiden Abspaltungen würde letztendlich dazu führen, dass beide Chains finalisiert werden. An diesem Punkt bleibt als einzige Option ein Rückgriff auf die soziale Wiederherstellung. +Bei 50 % der eingesetzten Ether könnte eine böswillige Gruppe von Validatoren die Chain theoretisch in zwei gleich große Forks aufteilen und dann einfach ihren gesamten 50 %-Einsatz verwenden, um entgegen der ehrlichen Validatoren-Menge abzustimmen, wodurch die beiden Forks aufrechterhalten und die Finalität verhindert wird. Das Inactivity Leak auf beiden Forks würde schließlich dazu führen, dass beide Chains finalisieren. An diesem Punkt besteht die einzige Option darin, auf eine soziale Wiederherstellung zurückzugreifen. -Es ist sehr unwahrscheinlich, dass eine böswillige Gruppe von Validatoren durchgängig genau 50 % des Gesamt-Stakes kontrollieren könnte, da die Zahl der ehrlichen Validatoren und die Netzwerklatenz usw. stark schwanken. Die enormen Kosten eines solchen Angriffs in Verbindung mit der geringen Erfolgswahrscheinlichkeit sollten für rationale Angreifer eine starke Abschreckung darstellen; vor allem, da eine kleine zusätzliche Investition, um _mehr als_ 50 % zu erhalten, ihnen viel mehr Möglichkeiten eröffnet. +Es ist sehr unwahrscheinlich, dass eine feindliche Gruppe von Validatoren angesichts einer gewissen Fluktuation bei den Zahlen der ehrlichen Validatoren, der Netzwerklatenz usw. konstant genau 50 % des gesamten Einsatzes kontrollieren könnte – die enormen Kosten für die Durchführung eines solchen Angriffs in Kombination mit der geringen Erfolgswahrscheinlichkeit scheinen eine starke Abschreckung für einen rationalen Angreifer zu sein, insbesondere wenn eine kleine zusätzliche Investition, um _mehr als_ 50 % zu erhalten, viel mehr Macht freisetzt. -Bei >50 % des gesamten Stakes könnte der Angreifer den Abspaltungs-Wahl-Alogrithmus dominieren. In diesem Fall wäre der Angreifer in der Lage, mit der Mehrheit der Stimmen zu attestieren, was ihm genügend Kontrolle gibt, um kurze Neuorganisationen durchzuführen, ohne dass er ehrliche Clients täuschen muss. Die ehrlichen Validatoren würden es ihm gleichtun, da ihr Abspaltungs-Wahl-Algorithmus auch seine bevorzugte Chain als die schwerste ansehen würde, sodass die Chain finalisiert werden könnte. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, Kurzstrecken-Neuorganisationen vorzunehmen und die maximale Anzahl an MEV zu extrahieren, indem Blöcke nach Belieben neu angeordnet werden. Die Verteidigung dagegen sind die enormen Kosten eines Mehrheits-Stakes (derzeit knapp 19 Mrd. USD), die ein Angreifer aufs Spiel setzen würde, weil die Sozialebene wahrscheinlich eingreifen und eine ehrliche Minderheits-Abspaltung übernehmen würde, wodurch der Stake des Angreifers dramatisch abgewertet würde. +Bei >50 % des gesamten Einsatzes könnte der Angreifer den Fork-Choice-Algorithmus dominieren. In diesem Fall wäre der Angreifer in der Lage, mit der Mehrheitsstimme Bestätigungen abzugeben, was ihm ausreichend Kontrolle gibt, um kurze Reorgs durchzuführen, ohne ehrliche Clients täuschen zu müssen. Die ehrlichen Validatoren würden nachziehen, da ihr Fork-Choice-Algorithmus die vom Angreifer bevorzugte Chain ebenfalls als die schwerste ansehen würde, sodass die Chain finalisieren könnte. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, Short-Range-Reorgs durchzuführen und maximalen MEV zu extrahieren, indem er Blöcke zu seinen Gunsten neu anordnet. Die Verteidigung dagegen sind die enormen Kosten eines Mehrheitseinsatzes (derzeit knapp 19 Milliarden USD), die von einem Angreifer aufs Spiel gesetzt werden, da die soziale Ebene wahrscheinlich eingreifen und einen ehrlichen Minderheits-Fork übernehmen wird, was den Einsatz des Angreifers dramatisch abwertet. -### Angreifer, die >= 66 % des gesamten Stakes nutzen {#attackers-with-66-stake} +### Angreifer mit >=66 % des gesamten Einsatzes {#attackers-with-66-stake} -Ein Angreifer, der 66 % oder mehr der insgesamt eingesetzten Ether besitzt, kann seine bevorzugte Chain finalisieren, ohne ehrliche Validatoren zu etwas zwingen zu müssen. Der Angreifer kann einfach für seine bevorzugte Chain abstimmen und sie dann finalisieren, schlichtweg weil er mit einer unehrlichen Supermajority abstimmen kann. Als Stakeholder mit Supermajority könnte der Angreifer immer die Inhalte der finalisierten Blöcke bestimmen. Er könnte nach Belieben Ausgaben tätigen, diese zurücknehmen und dann erneut tätigen, bestimmte Transaktionen zensieren oder die Chain neu organisieren. Wenn der Angreifer zusätzliche Ether kauft, sodass er 66 % statt 51 % des gesamten Stakes kontrolliert, erwirbt er im Endeffekt die Fähigkeit, rückwirkende Neuorganisationen und Endgültigkeitsumkehrungen durchzuführen (d. h. die Vergangenheit zu verändern und die Zukunft zu kontrollieren). Die einzige echte Verteidigung hier sind die enormen Kosten von 66 % des gesamten Ether-Stakes und die Option, auf die Sozialebene zurückzugreifen, wo sich die Übernahme einer alternativen Abspaltung koordinieren lässt. Wir können uns diesen Vorgang im nächsten Abschnitt detaillierter ansehen. +Ein Angreifer mit 66 % oder mehr der gesamten eingesetzten Ether kann seine bevorzugte Chain finalisieren, ohne ehrliche Validatoren zwingen zu müssen. Der Angreifer kann einfach für seinen bevorzugten Fork stimmen und ihn dann finalisieren, einfach weil er mit einer unehrlichen Supermehrheit abstimmen kann. Als Stakeholder mit Supermehrheit würde der Angreifer immer den Inhalt der finalisierten Blöcke kontrollieren, mit der Macht, auszugeben, zurückzuspulen und erneut auszugeben, bestimmte Transaktionen zu zensieren und die Chain nach Belieben zu reorg-en. Durch den Kauf zusätzlicher Ether, um 66 % statt 51 % zu kontrollieren, kauft der Angreifer effektiv die Fähigkeit, Ex-post-Reorgs und Finalitätsumkehrungen durchzuführen (d. h. die Vergangenheit zu ändern sowie die Zukunft zu kontrollieren). Die einzigen wirklichen Verteidigungen hier sind die enormen Kosten von 66 % der gesamten eingesetzten Ether und die Option, auf die soziale Ebene zurückzugreifen, um die Übernahme eines alternativen Forks zu koordinieren. Wir können dies im nächsten Abschnitt genauer untersuchen. ## Menschen: die letzte Verteidigungslinie {#people-the-last-line-of-defense} -Wenn es unehrlichen Validatoren gelingt, ihre präferierte Version der Chain zu finalisieren, gerät die Ethereum-Community in eine schwierige Lage. Die kanonische Chain beinhaltet dann einen „unehrlichen“ Abschnitt, der in die Historie aufgenommen wurde, wohingegen ehrliche Validatoren dafür bestraft werden können, für eine alternative („ehrliche“) Chain abzustimmen. Dabei ist zu beachten, dass eine finalisierte, aber inkorrekte Chain auch das Ergebnis eines Fehlers im Mehrheits-Client sein könnte. Letztendlich ist es der ultimative Fallback, sich zur Lösung der Situation auf die Sozialebene – Layer 0 – zu verlassen. +Wenn es den unehrlichen Validatoren gelingt, ihre bevorzugte Version der Chain zu finalisieren, gerät die Ethereum-Community in eine schwierige Situation. Die kanonische Chain enthält einen unehrlichen Abschnitt, der in ihre Geschichte eingebrannt ist, während ehrliche Validatoren am Ende dafür bestraft werden können, dass sie Bestätigungen für eine alternative (ehrliche) Chain abgeben. Beachten Sie, dass eine finalisierte, aber fehlerhafte Chain auch durch einen Fehler in einem Mehrheits-Client entstehen könnte. Letztendlich besteht der ultimative Rückhalt darin, sich auf die soziale Ebene – Ebene 0 – zu verlassen, um die Situation zu lösen. -Eine der Stärken des PoS-Konsens auf Ethereum ist es, dass es eine [Reihe von Verteidigungsstrategien](https://youtu.be/1m12zgJ42dI?t=1712) gibt, auf die die Community zurückgreifen kann, sollte es zu einem Angriff kommen. Eine minimale Reaktion könnte darin bestehen, die Validatoren der Angreifer zwangsweise aus dem Netzwerk zu entfernen, ohne zusätzliche Strafen zu verhängen. Um dem Netzwerk wieder beitreten zu können, müsste ein Angreifer Teil einer Aktivierungswarteschlange werden, mit der sichergestellt wird, dass das Validatoren-Set allmählich größer wird. So dauert es zum Beispiel etwa 200 Tage, bis genügend Validatoren hinzukommen, um die Menge an eingesetztem Ether zu verdoppeln. Dies bedeutet, dass die ehrlichen Validatoren im Grunde 200 Tage Zeit haben, bevor der Angreifer einen weiteren 51 %-Angriff starten kann. Jedoch könnte sich die Community auch dazu entscheiden, den Angreifer härter zu bestrafen. Das könnte durch den Widerruf vergangener Belohnungen oder das Zerstören eines Anteils (bis zu 100 %) ihres eingesetzten Kapitals geschehen. +Eine der Stärken des PoS-Konsenses von Ethereum ist, dass es eine [Reihe von Verteidigungsstrategien](https://youtu.be/1m12zgJ42dI?t=1712) gibt, die die Community im Falle eines Angriffs anwenden kann. Eine minimale Reaktion könnte darin bestehen, die Validatoren der Angreifer ohne zusätzliche Strafe zwangsweise aus dem Netzwerk zu entfernen. Um wieder in das Netzwerk einzutreten, müsste sich der Angreifer in eine Aktivierungswarteschlange einreihen, die sicherstellt, dass die Validatoren-Menge allmählich wächst. Beispielsweise dauert das Hinzufügen von genügend Validatoren, um die Menge der eingesetzten Ether zu verdoppeln, etwa 200 Tage, was den ehrlichen Validatoren effektiv 200 Tage Zeit verschafft, bevor der Angreifer einen weiteren 51-%-Angriff versuchen kann. Die Community könnte sich jedoch auch dafür entscheiden, den Angreifer härter zu bestrafen, indem sie vergangene Belohnungen widerruft oder einen Teil (bis zu 100 %) seines eingesetzten Kapitals verbrennt. -Unabhängig von der Strafe, die dem Angreifer auferlegt wird, muss die Community auch gemeinsam nicht nur entscheiden, ob die unehrliche Chain tatsächlich ungültig ist (obwohl es sich bei ihr um die vom Abspaltungs-Wahl-Algorithmus, der in den Ethereum-Client kodiert ist, bevorzugte handelt), sondern auch, dass die Community stattdessen auf der ehrlichen Chain aufbauen sollte. Ehrliche Validatoren könnten sich gemeinsam darauf einigen, auf einer von der Community akzeptierten Abspaltung der Ethereum-Blockchain aufzubauen, die beispielsweise vor Beginn des Angriffs von der kanonischen Chain abgezweigt wurde. Alternativ vereinbaren die Validatoren, die Validatoren der Angreifer zwangsweise zu entfernen. Ehrliche Validierer hätten einen Anreiz dafür, auf dieser Chain aufzubauen, weil sie die Strafen vermeiden würden, die ihnen auferlegt werden, weil sie die Chain des Angreifers (gerechtfertigterweise) nicht attestieren. Börsen, On-Ramps und Anwendungen, die auf Ethereum aufbauen, würden es vermutlich vorziehen, auf der ehrlichen Chain zu sein und würden den ehrlichen Validatoren auf die ehrliche Blockchain folgen. +Unabhängig von der dem Angreifer auferlegten Strafe muss die Community auch gemeinsam entscheiden, ob die unehrliche Chain, obwohl sie diejenige ist, die von dem in den Ethereum-Clients codierten Fork-Choice-Algorithmus bevorzugt wird, tatsächlich ungültig ist und dass die Community stattdessen auf der ehrlichen Chain aufbauen sollte. Ehrliche Validatoren würden sich kollektiv darauf einigen, auf einem von der Community akzeptierten Fork der Ethereum-Blockchain aufzubauen, der sich beispielsweise vor Beginn des Angriffs von der kanonischen Chain abgespalten hat oder bei dem die Validatoren der Angreifer zwangsweise entfernt wurden. Ehrliche Validatoren hätten einen Anreiz, auf dieser Chain aufzubauen, da sie die Strafen vermeiden würden, die gegen sie verhängt werden, weil sie (zu Recht) keine Bestätigungen für die Chain des Angreifers abgeben. Börsen, On-Ramps und auf Ethereum basierende Anwendungen würden vermutlich lieber auf der ehrlichen Chain sein und den ehrlichen Validatoren zur ehrlichen Blockchain folgen. -Jedoch wäre dies eine große verwaltungstechnische Herausforderung. Einigen Benutzern und Validatoren würden durch die Umstellung auf die ehrliche Chain zweifellos Nachteile entstehen und Transaktionen in Blöcken, die nach dem Angriff validiert wurden, könnten möglicherweise rückgängig gemacht werden, was zu Störungen auf der Anwendungsebene führen würde. Außerdem untergräbt eine solche Umstellung ganz einfach die Ethik einiger Benutzer, die dazu neigen, zu glauben, dass „Code Gesetz ist“. Börsen und Anwendungen würden höchstwahrscheinlich Off-Chain-Aktionen mit On-Chain-Transaktionen verknüpft haben, was nun möglicherweise rückgängig gemacht werden würde. Dies würde eine Kaskade von Widerrufen und Revisionen in Gang setzen, die nur schwer auf faire Weise zunichtegemacht werden könnten, insbesondere dann, wenn unehrlich erzielte Gewinne durchmischt oder in DeFi oder andere Derivate mit sekundären Auswirkungen für ehrliche Nutzer eingezahlt worden wären. Zweifellos hätten einige Benutzer, vielleicht sogar institutionelle, bereits von der unehrlichen Chain profitiert, entweder durch arglistiges Verhalten oder durch Zufall, und könnten sich gegen eine Abspaltung stellen, um ihre Gewinne zu bewahren. Es gab bereits Aufrufe dazu, die Community-Antwort auf >51 %-Angriffe zu proben, sodass vernünftige, koordinierte Mitigationsmaßnahmen schnell ausgeführt werden können. Es gibt auf ethresear.ch [hier](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) und [hier](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) und auf Twitter [hier](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw) einige nützliche Diskussionen von Vitalik. Das Ziel einer koordinierten sozialen Antwort sollte es sein, sehr zielgerichtet vorzugehen, den Angreifer spezifisch zu bestrafen sowie die Auswirkungen für andere Nutzer gering zu halten. +Dies wäre jedoch eine erhebliche Governance-Herausforderung. Einige Benutzer und Validatoren würden zweifellos durch den Wechsel zurück zur ehrlichen Chain verlieren, Transaktionen in Blöcken, die nach dem Angriff validiert wurden, könnten möglicherweise zurückgesetzt werden, was die Anwendungsebene stört, und es untergräbt ganz einfach die Ethik einiger Benutzer, die dazu neigen zu glauben, dass „Code is Law“ (Code ist Gesetz) gilt. Börsen und Anwendungen werden höchstwahrscheinlich Off-Chain-Aktionen mit Transaktionen auf der Blockchain verknüpft haben, die nun möglicherweise zurückgesetzt werden, was eine Kaskade von Rücknahmen und Revisionen auslöst, die schwer fair zu entwirren wäre, insbesondere wenn unrechtmäßig erworbene Gewinne gemischt, in DeFi oder andere Derivate mit sekundären Auswirkungen für ehrliche Benutzer eingezahlt wurden. Zweifellos hätten einige Benutzer, vielleicht sogar institutionelle, bereits von der unehrlichen Chain profitiert, sei es durch Scharfsinn oder durch Zufall, und könnten sich einem Fork widersetzen, um ihre Gewinne zu schützen. Es gab Aufrufe, die Reaktion der Community auf >51-%-Angriffe zu proben, damit eine sinnvolle koordinierte Schadensbegrenzung schnell durchgeführt werden kann. Es gibt einige nützliche Diskussionen von Vitalik auf ethresear.ch [hier](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) und [hier](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) sowie auf Twitter [hier](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw). Das Ziel einer koordinierten sozialen Reaktion sollte es sein, sehr zielgerichtet und spezifisch bei der Bestrafung des Angreifers vorzugehen und die Auswirkungen für andere Benutzer zu minimieren. -Die Verwaltung ist bereits ein kompliziertes Thema. Die Koordinierung einer Layer-0-Notfallantwort auf eine unehrlich finalisierende Chain wäre zweifellos eine Herausforderung für die Ethereum-Community. Jedoch [kam es bereits](/ethereum-forks/#dao-fork-summary) - [zweimal](/ethereum-forks/#tangerine-whistle) in der Geschichte Ethereums dazu. +Governance ist ohnehin schon ein kompliziertes Thema. Die Bewältigung einer Notfallreaktion auf Ebene 0 auf eine unehrliche finalisierende Chain wäre zweifellos eine Herausforderung für die Ethereum-Community, aber es [ist bereits passiert](/ethereum-forks/#dao-fork-summary) – [zweimal](/ethereum-forks/#tangerine-whistle) – in der Geschichte von Ethereum). -Nichtsdestotrotz liegt eine gewisse Befriedigung in der Tatsache, dass der letzte Fallback in der realen Welt angesiedelt ist. Selbst mit dieser phänomenalen Technologie, die uns zur Verfügung steht, müssten sich die Menschen am Ende des Tages koordinieren und gemeinsam einen Ausweg suchen, sollte der schlimmste Fall eintreten. +Dennoch hat es etwas ziemlich Befriedigendes, dass der letzte Rückhalt im echten Leben (Meatspace) liegt. Letztendlich müssten sich echte Menschen, selbst mit diesem phänomenalen Technologie-Stack über uns, im schlimmsten Fall koordinieren, um einen Ausweg zu finden. ## Zusammenfassung {#summary} -Auf dieser Seite wurden einige der Möglichkeiten untersucht, wie Angreifer versuchen könnten, Schwächen im Proof-of-Stake-Konsensprotokoll von Ethereum auszunutzen. Neuorganisationen und Endgültigkeitsverzögerungen wurden für verschiedene Angreifer untersucht, die über steigende Anteile des gesamten eingesetzten Ethers verfügen. Insgesamt hat ein vermögenderer Angreifer mehr Chancen auf Erfolg, da sich sein Stake in Stimmrecht niederschlägt, mit dem er den Inhalt künftiger Blöcke beeinflussen kann. Ab bestimmten Schwellenwerten an eingesetztem Ether steigt die Macht eines Angreifers: +Diese Seite hat einige der Möglichkeiten untersucht, wie Angreifer versuchen könnten, das Proof-of-Stake-Konsensprotokoll von Ethereum auszunutzen. Reorgs und Finalitätsverzögerungen wurden für Angreifer mit zunehmenden Anteilen an den gesamten eingesetzten Ether untersucht. Insgesamt hat ein reicherer Angreifer mehr Erfolgschancen, da sich sein Einsatz in Stimmmacht übersetzt, mit der er den Inhalt zukünftiger Blöcke beeinflussen kann. Bei bestimmten Schwellenwerten an eingesetzten Ether steigt die Macht des Angreifers: -33 %: Endgültigkeitsverzögerung +33 %: Finalitätsverzögerung -34 %: Endgültigkeitsverzögerung, doppelte Endgültigkeit +34 %: Finalitätsverzögerung, doppelte Finalität -51 %: Endgültigkeitsverzögerung, doppelte Endgültigkeit, Zensur, Kontrolle über die Zukunft der Blockchain +51 %: Finalitätsverzögerung, doppelte Finalität, Zensur, Kontrolle über die Zukunft der Blockchain -66 %: Endgültigkeitsverzögerung, doppelte Endgültigkeit, Zensur, Kontrolle über die Zukunft und Vergangenheit der Blockchain +66 %: Finalitätsverzögerung, doppelte Finalität, Zensur, Kontrolle über die Zukunft und Vergangenheit der Blockchain -Es gibt auch eine Reihe hoch entwickelter Angriffe, für die nur geringe Mengen an eingesetztem Ether erforderlich sind, die aber darauf beruhen, dass ein sehr raffinierter Angreifer das Timing von Nachrichten genau kontrolliert und damit die ehrlichen Validatoren zu seinen Gunsten beeinflusst. +Es gibt auch eine Reihe raffinierterer Angriffe, die kleine Mengen an eingesetzten Ether erfordern, aber darauf beruhen, dass ein sehr raffinierter Angreifer eine genaue Kontrolle über das Timing von Nachrichten hat, um die ehrliche Validatoren-Menge zu seinen Gunsten zu beeinflussen. -Insgesamt ist das Risiko eines erfolgreichen Angriffs trotz dieser potenziellen Angriffsvektoren gering, sicherlich geringer als bei Proof-of-Work-Äquivalenten. Der Grund dafür sind die enormen Kosten der eingesetzten Ether, die ein Angreifer aufs Spiel setzen würde, wenn er versuchen würde, die ehrlichen Validatoren mit seiner Stimmabgabe zu überwältigen. Die eingebaute Anreizebene nach dem Prinzip „Zuckerbrot und Peitsche“ schützt gegen die meisten Arten von Vergehen, besonders bei Angreifern, die einen geringen Stake einsetzen. Auch für subtilere Bouncing- und Balancing-Angriffe bestehen geringe Erfolgsaussichten, weil unter realen Netzwerkbedingungen die Feinsteuerung der Nachrichtenzustellung an bestimmte Untergruppen von Validatoren sehr schwierig ist. Darüber hinaus haben Client-Teams die bekannten Bouncing-, Balancing- und Lawinen-Angriffsvektoren mit einfachen Patches schnell geschlossen. +Insgesamt ist das Risiko eines erfolgreichen Angriffs trotz dieser potenziellen Angriffsvektoren gering, sicherlich geringer als bei Proof-of-Work-Äquivalenten. Dies liegt an den enormen Kosten der eingesetzten Ether, die von einem Angreifer aufs Spiel gesetzt werden, der darauf abzielt, ehrliche Validatoren mit seiner Stimmmacht zu überwältigen. Die eingebaute Anreizebene nach dem „Zuckerbrot und Peitsche“-Prinzip schützt vor den meisten Verfehlungen, insbesondere bei Angreifern mit geringem Einsatz. Subtilere Bouncing- und Balancing-Angriffe sind ebenfalls unwahrscheinlich erfolgreich, da reale Netzwerkbedingungen die genaue Kontrolle der Nachrichtenübermittlung an bestimmte Teilmengen von Validatoren sehr schwierig machen und Client-Teams die bekannten Bouncing-, Balancing- und Avalanche-Angriffsvektoren schnell mit einfachen Patches geschlossen haben. -34 %-, 51 %- oder 66 %-Angriffe würden wahrscheinlich eine soziale Koordination außerhalb des Bands erfordern, um mit ihnen fertig zu werden. Auch wenn dies für die Community wahrscheinlich schmerzhaft wäre, wirkt die Möglichkeit, dass die Community außerhalb des Bands reagiert, für Angreifer wie eine starke Abschreckung. Die soziale Ebene von Ethereum ist der ultimative Rückhalt – ein technisch erfolgreicher Angriff könnte immer noch aufgehalten werden, wenn sich die Community darauf einigt, eine ehrliche Abspaltung zu übernehmen. Es käme zu einem Wettlauf zwischen dem Angreifer und der Ethereum-Community. Die Milliarden von US-Dollar, die für einen 66 %-Angriff ausgegeben wurden, würden wahrscheinlich durch einen erfolgreichen Angriff auf Basis sozialer Koordinierung ausgelöscht, sollte dieser schnell genug durchgeführt werden. Dies würde dazu führen, dass der Angreifer mit schweren Taschen voller illiquider Ether auf einer bekanntermaßen unehrlichen Chain zurückbleibt, die von der Ethereum-Community ignoriert wird. Die Wahrscheinlichkeit, dass dies letztendlich für einen Angreifer profitabel ist, ist so gering, dass es eine wirksame Abschreckung darstellt. Aus diesem Grund sind Investitionen in die Aufrechterhaltung einer kohäsiven sozialen Ebene mit eng aufeinander abgestimmten Werten so wichtig. +Angriffe mit 34 %, 51 % oder 66 % würden zur Lösung wahrscheinlich eine soziale Out-of-Band-Koordination erfordern. Während dies für die Community wahrscheinlich schmerzhaft wäre, ist die Fähigkeit einer Community, Out-of-Band zu reagieren, eine starke Abschreckung für einen Angreifer. Die soziale Ebene von Ethereum ist der ultimative Rückhalt – ein technisch erfolgreicher Angriff könnte immer noch neutralisiert werden, indem die Community zustimmt, einen ehrlichen Fork zu übernehmen. Es gäbe ein Rennen zwischen dem Angreifer und der Ethereum-Community – die Milliarden von Dollar, die für einen 66-%-Angriff ausgegeben wurden, würden wahrscheinlich durch einen erfolgreichen sozialen Koordinationsangriff zunichte gemacht, wenn dieser schnell genug durchgeführt würde, sodass der Angreifer mit schweren Taschen illiquider eingesetzter Ether auf einer bekannten unehrlichen Chain zurückbleibt, die von der Ethereum-Community ignoriert wird. Die Wahrscheinlichkeit, dass dies für den Angreifer am Ende profitabel wäre, ist gering genug, um eine wirksame Abschreckung zu sein. Aus diesem Grund sind Investitionen in die Aufrechterhaltung einer kohäsiven sozialen Ebene mit eng aufeinander abgestimmten Werten so wichtig. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Detailliertere Version dieser Seite](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) -- [Vitalik zur Abwicklungsendgültigkeit](https://blog.ethereum.org/2016/05/09/on-settlement-finality) -- [Artikel zu LMD GHOST](https://arxiv.org/abs/2003.03052) -- [Artikel zu Casper-FGG](https://arxiv.org/abs/1710.09437) -- [Artikel zu Gasper](https://arxiv.org/pdf/2003.03052.pdf) -- [Proposer-Gewicht erhöht Konsensspezifikationen](https://github.com/ethereum/consensus-specs/pull/2730) +- [Ausführlichere Version dieser Seite](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [Vitalik über Settlement-Finalität](https://blog.ethereum.org/2016/05/09/on-settlement-finality) +- [LMD-GHOST-Papier](https://arxiv.org/abs/2003.03052) +- [Casper-FFG-Papier](https://arxiv.org/abs/1710.09437) +- [Gasper-Papier](https://arxiv.org/pdf/2003.03052.pdf) +- [Konsens-Spezifikationen für Proposer Weight Boosting](https://github.com/ethereum/consensus-specs/pull/2730) - [Bouncing-Angriffe auf ethresear.ch](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) -- [SSLE-Forschung](https://ethresear.ch/t/secret-non-single-leader-election/11789) +- [SSLE-Forschung](https://ethresear.ch/t/secret-non-single-leader-election/11789) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md index 432c145d4a3..68a0ad190be 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md @@ -1,92 +1,92 @@ --- -title: Beglaubigungen -description: Eine Beschreibung von Attestierungen auf Proof-of-Stake-Ethereum. +title: "Bestätigungen" +description: "Eine Beschreibung von Bestätigungen (Attestations) beim Proof-of-Stake-Ethereum." lang: de --- -Von einem Validator wird erwartet, dass er während jeder Epoche eine Attestierung erstellt, signiert und überträgt. Diese Seite beschreibt, wie diese Attestierungen aussehen und wie sie zwischen Konsens-Clients verarbeitet und kommuniziert werden. +Von einem Validator wird erwartet, dass er in jeder Epoche eine Bestätigung erstellt, signiert und überträgt. Diese Seite beschreibt, wie diese Bestätigungen aussehen und wie sie verarbeitet und zwischen Konsens-Clients kommuniziert werden. -## Was ist eine Attestierung? {#what-is-an-attestation} +## Was ist eine Bestätigung? {#what-is-an-attestation} -Jede [Epoche](/glossary/#epoch) (6,4 Minuten) schlägt ein Validator dem Netzwerk eine Attestierung vor. Die Attestierung ist für einen spezifischen Slot in der Epoche. Der Zweck der Attestierung besteht darin, für die Sichtweise des Validators auf die Chain zu abzustimmen, insbesondere in Bezug auf den letzten berechtigten Block und den ersten Block der aktuellen Epoche (bekannt als `Quell`- und `Ziel`-Checkpoints). Diese Informationen werden für alle teilnehmenden Validatoren kombiniert, was es dem Netzwerk ermöglicht, einen Konsens über den Status der Blockchain zu erzielen. +In jeder [Epoche](/glossary/#epoch) (6,4 Minuten) schlägt ein Validator dem Netzwerk eine Bestätigung vor. Die Bestätigung gilt für einen bestimmten Slot in der Epoche. Der Zweck der Bestätigung besteht darin, für die Sicht des Validators auf die Chain abzustimmen, insbesondere für den jüngsten gerechtfertigten Block und den ersten Block in der aktuellen Epoche (bekannt als `source`- und `target`-Checkpoints). Diese Informationen werden für alle teilnehmenden Validatoren kombiniert, sodass das Netzwerk einen Konsens über den Zustand der Blockchain erreichen kann. -Die Attestierung beinhaltet die folgenden Komponenten: +Die Bestätigung enthält die folgenden Komponenten: -- `aggregation_bits`: eine Bitliste von Validatoren, deren Position dem Validatorenindex in ihrem Komitee entspricht; der Wert (0/1) indiziert, ob der Validator die `Daten` signiert hat (d. h. ob sie aktiv sind und mit dem Block-Proposer übereinstimmen) -- `Daten`: Details, die mit der Attestierung verbunden sind, wie unten definiert -- `Signatur`: eine BLS-Signatur, die die Signaturen individueller Validatoren zusammenfasst +- `aggregation_bits`: eine Bitliste von Validatoren, bei der die Position dem Validator-Index in ihrem Komitee entspricht; der Wert (0/1) gibt an, ob der Validator die `data` signiert hat (d. h. ob er aktiv ist und mit dem Block-Vorschlagenden übereinstimmt) +- `data`: Details zur Bestätigung, wie unten definiert +- `signature`: eine BLS-Signatur, die die Signaturen einzelner Validatoren aggregiert -Die erste Aufgabe für einen attestierenden Validator ist der Aufbau der `Daten`. Die `Daten` beinhalten die folgenden Informationen: +Die erste Aufgabe für einen bestätigenden Validator besteht darin, die `data` zu erstellen. Die `data` enthalten die folgenden Informationen: -- `Slot`: die Slot-Nummer, auf die sich die Attestierung bezieht -- `Index`: eine Nummer, die identifiziert, zu welchem Komitee der Validator in einem gegebenen Slot gehört -- `beacon_block_root`: Root Hash des Blocks, den der Validator an der Spitze der Chain sieht (als Resultat der Anwendung des Abspaltungs-Wahl-Algorithmus) -- `Quelle`: Teil der Endgültigkeitsabstimmung, der angibt, was die Validatoren als den letzten berechtigten Block ansehen -- `Ziel`: Teil der Endgültigkeitsabstimmung, der angibt, was die Validatoren als ersten Block in der derzeitigen Epoche ansehen +- `slot`: Die Slot-Nummer, auf die sich die Bestätigung bezieht +- `index`: Eine Nummer, die identifiziert, zu welchem Komitee der Validator in einem bestimmten Slot gehört +- `beacon_block_root`: Root-Hash des Blocks, den der Validator an der Spitze der Chain sieht (das Ergebnis der Anwendung des Fork-Choice-Algorithmus) +- `source`: Teil der Finalitätsabstimmung, der angibt, was die Validatoren als den jüngsten gerechtfertigten Block ansehen +- `target`: Teil der Finalitätsabstimmung, der angibt, was die Validatoren als den ersten Block in der aktuellen Epoche ansehen -Sobald die `Daten` erstellt wurden, kann der Validator das Bit in `aggregation_bits`, das seinem eigenen Validatorenindex entspricht, von 0 auf 1 umdrehen, um zu zeigen, dass er teilgenommen hat. +Sobald die `data` erstellt sind, kann der Validator das Bit in den `aggregation_bits`, das seinem eigenen Validator-Index entspricht, von 0 auf 1 setzen, um zu zeigen, dass er teilgenommen hat. -Schließlich kann der Validator die Attestierung signieren und an das Netzwerk übertragen. +Schließlich signiert der Validator die Bestätigung und überträgt sie an das Netzwerk. -### Aggregierte Attestierung {#aggregated-attestation} +### Aggregierte Bestätigung {#aggregated-attestation} -Die Weiterleitung dieser Daten durch das Netzwerk für jeden Validator ist mit einem erheblichen Mehraufwand verbunden. Bevor es also zu einer groß angelegten Übertragung der Attestierungen der einzelnen Validatoren kommt, werden die Attestierungen in Subnetzen aggregiert. Dies umfasst das Aggregieren von Signaturen, sodass eine übertragene Attestierung die Konsens-`Daten` sowie eine einzelne Signatur enthält, die aus einer Kombination der Signaturen aller Validatoren gebildet wird, die mit diesen `Daten` übereinstimmen. Dies kann mit `aggregation_bits` überprüft werden, das den Index jedes Validators in seinem Komitee bereitstellt (dessen ID in `Daten` angegeben ist), was zur Abfrage einzelner Signaturen verwendet werden kann. +Es gibt einen erheblichen Overhead, der mit der Weitergabe dieser Daten im Netzwerk für jeden Validator verbunden ist. Daher werden die Bestätigungen einzelner Validatoren innerhalb von Subnetzen aggregiert, bevor sie weiter verbreitet werden. Dies beinhaltet die Aggregation von Signaturen, sodass eine übertragene Bestätigung die Konsens-`data` und eine einzige Signatur enthält, die durch die Kombination der Signaturen aller Validatoren gebildet wird, die mit diesen `data` übereinstimmen. Dies kann mithilfe der `aggregation_bits` überprüft werden, da diese den Index jedes Validators in seinem Komitee (dessen ID in den `data` angegeben ist) liefern, was zur Abfrage einzelner Signaturen verwendet werden kann. -In jeder Epoche werden 16 Validatoren in jedem Subnetz als `Aggregatoren` ausgewählt. Die Aggregatoren sammeln alle Attestierungen, von denen sie über das Gossip-Netzwerk erfahren und die über gleichwertige `Daten` wie ihre eigenen verfügen. Der Absender jeder passenden Attestierung wird in den `aggregation_bits` erfasst. Die Aggregatoren übertragen dann das Attestierungsaggregat an das gesamte Netzwerk. +In jeder Epoche werden 16 Validatoren in jedem Subnetz als `aggregators` ausgewählt. Die Aggregatoren sammeln alle Bestätigungen, von denen sie über das Gossip-Netzwerk hören und die äquivalente `data` zu ihren eigenen haben. Der Absender jeder passenden Bestätigung wird in den `aggregation_bits` aufgezeichnet. Die Aggregatoren übertragen dann das Bestätigungsaggregat an das breitere Netzwerk. -Wenn ein Validator als Block-Proposer ausgewählt wird, bündelt er aggregierte Attestierungen aus den Subnetzen bis zum aktuellsten Slot im neuen Block. +Wenn ein Validator als Block-Vorschlagender ausgewählt wird, verpackt er aggregierte Bestätigungen aus den Subnetzen bis zum neuesten Slot in den neuen Block. -### Lebenszyklus der Attestierungseinbeziehung {#attestation-inclusion-lifecycle} +### Lebenszyklus der Einbindung von Bestätigungen {#attestation-inclusion-lifecycle} 1. Generierung -2. Propagierung +2. Verbreitung 3. Aggregation -4. Propagierung -5. Einbeziehung +4. Verbreitung +5. Einbindung -Der Attestierungslebenszyklus ist in dem nachstehenden Schema skizziert: +Der Lebenszyklus der Bestätigung ist im folgenden Schema dargestellt: -![Attestierungslebenszyklus](./attestation_schematic.png) +![Lebenszyklus der Bestätigung](./attestation_schematic.png) ## Belohnungen {#rewards} -Die Validatoren werden für das Einreichen von Attestierungen belohnt. Die Belohnung für die Attestierung hängt von den Teilnahme-Flags (Quelle, Ziel und Spitze), der Basisbelohnung und der Teilnahmequote ab. +Validatoren werden für das Einreichen von Bestätigungen belohnt. Die Belohnung für die Bestätigung hängt von den Teilnahme-Flags (Source, Target und Head), der Grundbelohnung und der Teilnahmequote ab. -Jedes der Teilnahme-Flags kann entweder wahr oder falsch sein, je nach der eingereichten Attestierung und ihrer Einbeziehungsverzögerung. +Jedes der Teilnahme-Flags kann entweder wahr oder falsch sein, abhängig von der eingereichten Bestätigung und ihrer Einbindungsverzögerung (Inclusion Delay). -Das beste Szenario ist, wenn alle drei Flags wahr sind. In diesem Fall würde ein Validator (pro richtigem Flag) Folgendes verdienen: +Das beste Szenario tritt ein, wenn alle drei Flags wahr sind. In diesem Fall würde ein Validator (pro korrektem Flag) Folgendes verdienen: -`Belohnung += Basisbelohnung * Flag-Gewicht * Flag-Attestierungsquote / 64` +`Belohnung += Grundbelohnung * Flag-Gewichtung * Flag-Bestätigungsrate / 64` -Die Flag-Attestierungsquote wird anhand der Summe der Effektivguthaben aller attestierenden Validatoren für die betreffende Flag im Vergleich zum gesamten aktiven Effektivguthaben gemessen. +Die Flag-Bestätigungsrate wird gemessen, indem die Summe der effektiven Guthaben aller bestätigenden Validatoren für das jeweilige Flag mit dem gesamten aktiven effektiven Guthaben verglichen wird. -### Basisbelohnung {#base-reward} +### Grundbelohnung {#base-reward} -Die Basisbelohnung wird anhand der Anzahl der attestierenden Validatoren und ihrer effektiv eingesetzten Ether-Guthaben berechnet: +Die Grundbelohnung wird anhand der Anzahl der bestätigenden Validatoren und ihrer effektiven gestakten Ether-Guthaben berechnet: -`base reward = validator effective balance x 2^6 / SQRT(Effective balance of all active validators)` +`Grundbelohnung = effektives Validator-Guthaben x 2^6 / WURZEL(Effektives Guthaben aller aktiven Validatoren)` -#### Einbeziehungsverzögerung {#inclusion-delay} +#### Einbindungsverzögerung {#inclusion-delay} -Zu dem Zeitpunkt, als die Validatoren über die Spitze der Chain (`block n`) abstimmten, war `block n+1` noch nicht vorgeschlagen worden. Daher werden Attestierungen naturgemäß **einen Block später** aufgenommen, sodass alle Attestierungen, die für `block n` als Chain-Spitze gestimmt haben, in `block n+1` aufgenommen wurden; die **Einbeziehungsverzögerung** beträgt 1. Wenn sich die Einbeziehungsverzögerung auf zwei Slots verdoppelt, halbiert sich die Attestierungsbelohnung, da zur Berechnung der Attestierungsbelohnung die Basisbelohnung mit dem Kehrwert der Einbeziehungsverzögerung multipliziert wird. +Zu dem Zeitpunkt, als die Validatoren über die Spitze der Chain (`block n`) abstimmten, war `block n+1` noch nicht vorgeschlagen worden. Daher werden Bestätigungen natürlicherweise **einen Block später** eingebunden, sodass alle Bestätigungen, die dafür gestimmt haben, dass `block n` die Spitze der Chain ist, in `block n+1` eingebunden wurden, und die **Einbindungsverzögerung** beträgt 1. Wenn sich die Einbindungsverzögerung auf zwei Slots verdoppelt, halbiert sich die Belohnung für die Bestätigung, da zur Berechnung der Bestätigungsbelohnung die Grundbelohnung mit dem Kehrwert der Einbindungsverzögerung multipliziert wird. -### Attestierungsszenarien {#attestation-scenarios} +### Bestätigungsszenarien {#attestation-scenarios} -#### Fehlender Abstimmungsvalidator {#missing-voting-validator} +#### Fehlender abstimmender Validator {#missing-voting-validator} -Die Validatoren haben maximal 1 Epoche Zeit, um ihre Attestierung einzureichen. Wenn die Attestierung in Epoche 0 versäumt wurde, können sie diese mit einer Einbeziehungsverzögerung in Epoche 1 nachreichen. +Validatoren haben maximal 1 Epoche Zeit, um ihre Bestätigung einzureichen. Wenn die Bestätigung in Epoche 0 verpasst wurde, können sie diese mit einer Einbindungsverzögerung in Epoche 1 einreichen. #### Fehlender Aggregator {#missing-aggregator} -Insgesamt gibt es 16 Aggregatoren pro Epoche. Darüber hinaus abonnieren zufällige Validatoren **256 Epochen lang zwei Subnetze** und dienen als Backup, falls Aggregatoren fehlen. +Es gibt insgesamt 16 Aggregatoren pro Epoche. Darüber hinaus abonnieren zufällige Validatoren **zwei Subnetze für 256 Epochen** und dienen als Backup, falls Aggregatoren fehlen. -#### Fehlender Block-Proposer {#missing-block-proposer} +#### Fehlender Block-Vorschlagender {#missing-block-proposer} -Beachten Sie, dass in einigen Fällen ein glücklicher Aggregator auch zum Block-Proposer werden kann. Wenn die Attestierung nicht miteinbezogen wurde, weil der Block-Proposer verloren gegangen ist, würde der nächste Block-Proposer die aggregierte Attestierung wiederaufnehmen und in den nächsten Block miteinbeziehen. Jedoch wird sich die **Einbeziehungsverzögerung** um den Faktor eins erhöhen. +Beachten Sie, dass in einigen Fällen ein glücklicher Aggregator auch zum Block-Vorschlagenden werden kann. Wenn die Bestätigung nicht eingebunden wurde, weil der Block-Vorschlagende fehlt, würde der nächste Block-Vorschlagende die aggregierte Bestätigung aufnehmen und in den nächsten Block einbinden. Die **Einbindungsverzögerung** erhöht sich jedoch um eins. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Attestierungen in Vitaliks kommentierter Konsens-Spezifikation](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) -- [Attestierungen in eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) +- [Bestätigungen in Vitaliks kommentierter Konsens-Spezifikation](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) +- [Bestätigungen auf eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md index 43979ed0e91..de91365d5fb 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -1,32 +1,32 @@ --- title: Block-Vorschlag -description: Erklärung, wie Blöcke unter Proof-of-Stake-Ethereum vorgeschlagen werden. +description: "Erklärung, wie Blöcke im Proof-of-Stake-Ethereum vorgeschlagen werden." lang: de --- -Blöcke sind die grundlegenden Einheiten der Blockchain. Blöcke sind diskrete Informationseinheiten, die zwischen den Nodes weitergegeben, vereinbart und der Datenbank jedes Nodes hinzugefügt werden. Diese Seite erklärt, wie sie produziert werden. +Blöcke sind die grundlegenden Einheiten der Blockchain. Blöcke sind diskrete Informationseinheiten, die zwischen Blockchain-Knoten weitergegeben, vereinbart und der Datenbank jedes Blockchain-Knotens hinzugefügt werden. Diese Seite erklärt, wie sie produziert werden. ## Voraussetzungen {#prerequisites} -Block-Proposals sind Teil des Proof-of-Stake-Protokolls. Um diese Seite zu verstehen, empfehlen wir Ihnen, über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und die [Blockarchitektur](/developers/docs/blocks/) nachzulesen. +Der Block-Vorschlag ist Teil des Proof-of-Stake-Protokolls. Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Blockarchitektur](/developers/docs/blocks/) zu informieren. ## Wer produziert Blöcke? {#who-produces-blocks} -Konten von Validatoren schlagen Blöcke vor. Die Konten von Validatoren werden von Node-Operatoren verwaltet, die Validatorensoftware als Teil ihrer Ausführungs- und Konsens-Clients betreiben und mindestens 32 ETH in den Einzahlungsvertrag transferiert haben. Allerdings ist jeder Validator nur gelegentlich für das Vorschlagen eines Blocks zuständig. Ethereum misst die Zeit in Slots und Epochen. Jeder Slot ist zwölf Sekunden lang und 32 Slots (6,4 Minuten) ergeben eine Epoche. Jeder Slot bietet eine Möglichkeit, Ethereum einen neuen Block hinzuzufügen. +Validator-Konten schlagen Blöcke vor. Validator-Konten werden von Betreibern von Blockchain-Knoten verwaltet, die Validator-Software als Teil ihrer Ausführungs-Clients und Konsens-Clients ausführen und mindestens 32 ETH in den Einzahlungsvertrag eingezahlt haben. Jeder Validator ist jedoch nur gelegentlich dafür verantwortlich, einen Block vorzuschlagen. [Ethereum](/) misst die Zeit in Slots und Epochen. Jeder Slot dauert zwölf Sekunden, und 32 Slots (6,4 Minuten) bilden eine Epoche. Jeder Slot ist eine Gelegenheit, einen neuen Block zu Ethereum hinzuzufügen. ### Zufällige Auswahl {#random-selection} -Ein einzelner Validator wird pseudo-zufällig ausgewählt, einen Block in jedem Slot vorzuschlagen. So etwas wie echte Zufälligkeit gibt es nicht in einer Blockchain, denn wenn jeder Node echte Zufallszahlen generieren würde, könnten sie keinen Konsens erzielen. Das Ziel ist es vielmehr, den Validatoren-Auswahlprozess unvorhersehbar zu machen. Die Zufälligkeit wird bei Ethereum durch einen Algorithmus namens RANDAO erreicht, der einen Hash vom Block-Proposer mit einem Seed mischt, der bei jedem Block aktualisiert wird. Dieser Wert wird genutzt, um einen spezifischen Validator aus dem gesamten Validatoren-Set auszuwählen. Die Auswahl der Validatoren wird zwei Epochen im Voraus als Schutz vor bestimmten Arten der Seed-Manipulation festgelegt. +Ein einzelner Validator wird pseudozufällig ausgewählt, um in jedem Slot einen Block vorzuschlagen. Es gibt keine echte Zufälligkeit in einer Blockchain, denn wenn jeder Blockchain-Knoten wirklich zufällige Zahlen generieren würde, könnten sie nicht zu einem Konsens kommen. Stattdessen ist das Ziel, den Auswahlprozess der Validatoren unvorhersehbar zu machen. Die Zufälligkeit wird auf Ethereum mithilfe eines Algorithmus namens RANDAO erreicht, der einen Hash vom Block-Vorschlagenden mit einem Seed mischt, der bei jedem Block aktualisiert wird. Dieser Wert wird verwendet, um einen bestimmten Validator aus der gesamten Menge der Validatoren auszuwählen. Die Auswahl der Validatoren wird zwei Epochen im Voraus festgelegt, um sich vor bestimmten Arten der Seed-Manipulation zu schützen. -Obwohl die Validatoren in jedem Slot zu RANDAO beitragen, wird der globale RANDAO-Wert nur einmal pro Epoche aktualisiert. Zur Berechnung des Index des nächsten Block-Proposers wird der RANDAO-Wert mit der Slot-Zahl vermischt, um einen eindeutigen Wert für jeden Slot zu erhalten. Die Wahrscheinlichkeit, dass ein einzelner Validator ausgewählt wird, ist nicht einfach `1/N` (wobei `N` = Gesamtzahl der aktiven Validatoren). Stattdessen wird sie nach dem effektiven ETH-Guthaben eines jeden Validators gewichtet. Das maximale Effektivguthaben beträgt 32 ETH (dies bedeutet, dass `ein Guthaben von < 32 ETH` zu einer niedrigeren Gewichtung führt als `ein Guthaben von == 32 ETH`, `ein Guthaben von > 32 ETH` führt jedoch nicht zu einer höheren Gewichtung als `ein Guthaben von == 32 ETH`). +Obwohl Validatoren in jedem Slot zu RANDAO beitragen, wird der globale RANDAO-Wert nur einmal pro Epoche aktualisiert. Um den Index des nächsten Block-Vorschlagenden zu berechnen, wird der RANDAO-Wert mit der Slot-Nummer gemischt, um in jedem Slot einen eindeutigen Wert zu erhalten. Die Wahrscheinlichkeit, dass ein einzelner Validator ausgewählt wird, ist nicht einfach `1/N` (wobei `N` = gesamte aktive Validatoren). Stattdessen wird sie durch das effektive ETH-Guthaben jedes Validators gewichtet. Das maximale effektive Guthaben beträgt 32 ETH (das bedeutet, dass `balance < 32 ETH` zu einer geringeren Gewichtung führt als `balance == 32 ETH`, aber `balance > 32 ETH` führt nicht zu einer höheren Gewichtung als `balance == 32 ETH`). -Nur ein Block-Proposer wird in jedem Slot ausgewählt. Unter normalen Bedigungen produziert und veröffentlicht ein einziger Block-Producer einen einzigen Block in ihrem dedizierten Slot. Das Erzeugen von zwei Blöcken für denselben Slot ist ein mit Slashing geahndetes Vergehen, das oft als „Äquivokation“ bezeichnet wird. +In jedem Slot wird nur ein Block-Vorschlagender ausgewählt. Unter normalen Bedingungen erstellt und veröffentlicht ein einzelner Blockproduzent einen einzigen Block in seinem zugewiesenen Slot. Das Erstellen von zwei Blöcken für denselben Slot ist ein Vergehen, das mit Slashing bestraft wird und oft als „Equivocation“ (Doppeldeutigkeit) bezeichnet wird. -## Wie wird der Block erzeugt? {#how-is-a-block-created} +## Wie wird der Block erstellt? {#how-is-a-block-created} -Es wird erwartet, dass der Block-Proposer einen signierten Beacon Block versendet, der auf der jüngsten Spitze der Chain aufbaut, entsprechend der Ansicht seines eigenen, lokal ausgeführten Abspaltungs-Wahl-Algorithmus. Der Abspaltungs-Wahl-Algorithmus wendet alle in der Warteschlange befindlichen Attestierungen an, die vom vorherigen Slot übrig geblieben sind. Dann findet er den Block mit dem größten kumulierten Gewicht an Attestierungen in seiner Historie. Dies ist der Parent Block für den neuen Block, der vom Proposer erstellt wird. +Vom Block-Vorschlagenden wird erwartet, dass er einen signierten Beacon Chain-Block überträgt, der auf dem aktuellsten Kopf der Chain aufbaut, entsprechend der Sicht seines eigenen lokal ausgeführten Fork-Choice-Algorithmus. Der Fork-Choice-Algorithmus wendet alle in der Warteschlange befindlichen Bestätigungen an, die aus dem vorherigen Slot übrig geblieben sind, und findet dann den Block mit dem größten akkumulierten Gewicht an Bestätigungen in seiner Historie. Dieser Block ist der übergeordnete Block (Parent) des neuen Blocks, der vom Vorschlagenden erstellt wird. -Der Block-Proposer erstellt einen Block, indem er Daten aus seiner eigenen lokalen Datenbank und Ansicht der Chain sammelt. Der Inhalt des Blocks ist in dem nachstehenden Ausschnitt dargestellt: +Der Block-Vorschlagende erstellt einen Block, indem er Daten aus seiner eigenen lokalen Datenbank und seiner Sicht auf die Chain sammelt. Der Inhalt des Blocks wird im folgenden Ausschnitt gezeigt: ```rust class BeaconBlockBody(Container): @@ -42,28 +42,28 @@ class BeaconBlockBody(Container): execution_payload: ExecutionPayload ``` -Das `randao_reveal`-Feld nimmt einen verifizierbaren zufälligen Wert an, den der Block-Proposer erzeugt, indem er die derzeitige Epochennummer signiert. `eth1_data` ist eine Stimme für die Ansicht des Block-Proposers auf den Einzahlungsvertrag, einschließlich der Root des Einzahlungs-Merkle-Trees und der Gesamtzahl an Einzahlungen, die eine Verifizierung neuer Einzahlungen ermöglichen. `graffiti` ist ein optionales Feld, welches verwendet wird, um dem Block eine Nachricht hinzuzufügen. `proposer_slashings` und `attester_slashings` sind Felder, die Beweise dafür enthalten, dass bestimmte Validatoren nach der Auffassung des Proposers in der Chain Vergehen begangen haben, die mit Slashing bestraft werden können. `deposits` ist eine Liste neuer Validator-Einzahlungen, die dem Block-Proposer bekannt sind, und `voluntary_exits` ist eine Liste von Validatoren, die aussteigen möchten und von denen der Block-Proposer im Gossip-Netzwerk der Konsensebene gehört hat. `sync_aggregate` ist ein Vektor, der anzeigt, welche Validatoren zuvor einem Synchronisierungskomitee (eine Untergruppe von Validatoren, die leichte Daten des Clients liefern) zugewiesen waren und an der Signierung von Daten teilgenommen haben. +Das Feld `randao_reveal` nimmt einen verifizierbaren Zufallswert auf, den der Block-Vorschlagende durch Signieren der aktuellen Epochennummer erstellt. `eth1_data` ist eine Abstimmung für die Sicht des Block-Vorschlagenden auf den Einzahlungsvertrag, einschließlich der Wurzel des Einzahlungs-Merkle-Tries und der Gesamtzahl der Einzahlungen, die es ermöglichen, neue Einzahlungen zu verifizieren. `graffiti` ist ein optionales Feld, das verwendet werden kann, um dem Block eine Nachricht hinzuzufügen. `proposer_slashings` und `attester_slashings` sind Felder, die Beweise dafür enthalten, dass bestimmte Validatoren nach Ansicht des Vorschlagenden auf die Chain Vergehen begangen haben, die mit Slashing bestraft werden. `deposits` ist eine Liste neuer Validator-Einzahlungen, die dem Block-Vorschlagenden bekannt sind, und `voluntary_exits` ist eine Liste von Validatoren, die austreten möchten und von denen der Block-Vorschlagende im Gossip-Netzwerk der Konsensebene gehört hat. Das `sync_aggregate` ist ein Vektor, der zeigt, welche Validatoren zuvor einem Sync-Komitee (einer Untergruppe von Validatoren, die Light-Client-Daten bereitstellen) zugewiesen waren und an der Signierung von Daten teilgenommen haben. -`execution_payload` ermöglicht die Weitergabe von Informationen über Transaktionen zwischen den Ausführungs- und Konsens-Clients. `execution_payload` ist ein Block mit Ausführungsdaten, der in einen Beacon Block eingebettet wird. Das Feld in `execution_payload` reflektiert die Blockstruktur, die im Yellowpaper für Ethereum aufgezeigt wird, mit dem Unterschied, dass es keine „Ommers“ gibt und `prev_randao` anstelle von `difficulty` existiert. Der Ausführungs-Client hat Zugriff auf einen lokalen Pool von Transaktionen, von denen es in seinem eigenen Gossip-Netzwerk gehört hat. Diese Transaktionen werden lokal ausgeführt, um einen aktualisierten Zustands-Trie zu generieren, der als „Post-State“ bezeichnet wird. Die Transaktionen sind in `execution_payload` als Liste, die `transactions` genannt wird, enthalten und der Post-State wird im Feld `state-root` zur Verfügung gestellt. +Die `execution_payload` ermöglicht es, Informationen über Transaktionen zwischen den Ausführungs-Clients und Konsens-Clients weiterzugeben. Die `execution_payload` ist ein Block von Ausführungsdaten, der in einem Beacon Chain-Block verschachtelt wird. Die Felder innerhalb der `execution_payload` spiegeln die im Ethereum Yellow Paper skizzierte Blockstruktur wider, mit der Ausnahme, dass es keine Ommers gibt und `prev_randao` anstelle von `difficulty` existiert. Der Ausführungs-Client hat Zugriff auf einen lokalen Pool von Transaktionen, von denen er in seinem eigenen Gossip-Netzwerk gehört hat. Diese Transaktionen werden lokal ausgeführt, um einen aktualisierten Zustands-Trie zu generieren, der als Post-State bekannt ist. Die Transaktionen sind in der `execution_payload` als eine Liste namens `transactions` enthalten, und der Post-State wird im Feld `state-root` bereitgestellt. -All diese Daten werden in einem Beacon Block gesammelt, signiert und an die Peers von Block-Proposern übertragen, die sie an ihre Peers weitergeben usw. +All diese Daten werden in einem Beacon Chain-Block gesammelt, signiert und an die Peers des Block-Vorschlagenden übertragen, die ihn an ihre Peers weiterleiten usw. -Lesen Sie mehr zur [Anatomie von Blöcken](/developers/docs/blocks). +Lesen Sie mehr über die [Anatomie von Blöcken](/developers/docs/blocks). ## Was passiert mit dem Block? {#what-happens-to-blocks} -Der Block wird zur lokalen Datenbank des Block-Proposers hinzugefügt und über das Gossip-Netzwerk der Konsensebene an die Peers übertragen. Wenn ein Validator den Block empfängt, überprüft er die darin enthaltenen Daten. Er verifiziert, dass der Block das richtige Parent hat, dem richtigen Slot zugeordnet ist, dass der Index des Proposers der erwartete ist, dass das RANDAO Reveal gültig ist und dass der Proposer nicht geslasht wird. `execution_payload` ist nicht gebündelt und der Ausführungs-Client des Validatoren führt die Transaktionen in der Liste wieder aus, um den vorgeschlagenen Zustandswechsel zu überprüfen. Vorausgesetzt, dass der Block all diese Prüfungen besteht, fügt jeder Validator den Block seiner eigenen kanonischen Chain hinzu. Der Prozess startet dann im nächsten Slot wieder von Neuem. +Der Block wird der lokalen Datenbank des Block-Vorschlagenden hinzugefügt und über das Gossip-Netzwerk der Konsensebene an Peers übertragen. Wenn ein Validator den Block empfängt, verifiziert er die darin enthaltenen Daten, einschließlich der Überprüfung, ob der Block den richtigen übergeordneten Block (Parent) hat, dem richtigen Slot entspricht, der Index des Vorschlagenden der erwartete ist, der RANDAO-Reveal gültig ist und der Vorschlagende nicht mit Slashing bestraft wurde. Die `execution_payload` wird entbündelt, und der Ausführungs-Client des Validators führt die Transaktionen in der Liste erneut aus, um die vorgeschlagene Zustandsänderung zu überprüfen. Unter der Annahme, dass der Block all diese Überprüfungen besteht, fügt jeder Validator den Block seiner eigenen kanonischen Chain hinzu. Der Prozess beginnt dann im nächsten Slot von vorn. -## Blockbelohnungen {#block-rewards} +## Block-Belohnungen {#block-rewards} -Der Block-Proposer wird für seine Arbeit bezahlt. Ihm steht eine `base_reward` zu, die als eine Funktion aus der Anzahl der aktiven Validatoren und deren Effektivguthaben berechnet wird. Der Block-Proposer erhält dann einen Anteil der `base_reward` für jede gültige Attestierung, die in diesem Block enthalten ist; je mehr Validatoren den Block attestieren, desto größer fällt die Belohnung für den Block-Proposer aus. Es gibt auch eine Belohnung für das Melden von Validatoren, die mit Slashing bestraft werden sollten, in der Höhe von `1/512 * Effektivguthaben` für jeden mit Slashing sanktionierten Validator. +Der Block-Vorschlagende erhält eine Bezahlung für seine Arbeit. Es gibt eine `base_reward`, die als Funktion der Anzahl der aktiven Validatoren und ihrer effektiven Guthaben berechnet wird. Der Block-Vorschlagende erhält dann einen Bruchteil der `base_reward` für jede gültige Bestätigung, die im Block enthalten ist; je mehr Validatoren den Block bestätigen, desto größer ist die Belohnung des Block-Vorschlagenden. Es gibt auch eine Belohnung für das Melden von Validatoren, die mit Slashing bestraft werden sollten, in Höhe von `1/512 * effektives Guthaben` für jeden mit Slashing bestraften Validator. [Mehr zu Belohnungen und Strafen](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [Einführung in Blöcke](/developers/docs/blocks/) -- [Einführung zu Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -- [Konsensspezifikationen auf Ethereum](https://github.com/ethereum/consensus-specs) -- [Einführung zu Gasper](/developers/docs/consensus-mechanisms/pos/) -- [Ethereum-Upgrade](https://eth2book.info/) +- [Einführung in Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) +- [Ethereum-Konsens-Spezifikationen](https://github.com/ethereum/consensus-specs) +- [Einführung in Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) +- [Upgrading Ethereum](https://eth2book.info/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md index be478898199..27ccf03af67 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -1,172 +1,172 @@ --- -title: Häufig gestellte Fragen -description: Häufig gestellte Fragen zu Proof-of-Stake-Ethereum. +title: "Häufig gestellte Fragen" +description: "Häufig gestellte Fragen zu Proof-of-Stake bei Ethereum." lang: de --- ## Was ist Proof-of-Stake? {#what-is-proof-of-stake} -Proof-of-Stake beschreibt eine Klasse von Algorithmen, die für die Sicherheit von Blockchains sorgen können, indem sie sicherstellen, dass Assets von Angreifern, die unehrlich handeln, verloren gehen. Für Proof-of-Stake-Systeme ist ein Validatoren-Set erforderlich, um Assets verfügbar zu machen, die zerstört werden können, sollte ein Validator ein nachweislich unehrliches Verhalten an den Tag legen. Ethereum nutzt einen Proof-of-Stake-Mechanismus zur Sicherung der Blockchain. +Proof-of-Stake ist eine Klasse von Algorithmen, die Blockchains Sicherheit bieten kann, indem sie sicherstellt, dass Angreifer, die unehrlich handeln, wertvolle Vermögenswerte verlieren. Proof-of-Stake-Systeme erfordern eine Gruppe von Validatoren, die einen Vermögenswert zur Verfügung stellen, der zerstört werden kann, wenn der Validator ein nachweislich unehrliches Verhalten an den Tag legt. Ethereum verwendet einen Konsensmechanismus basierend auf Proof-of-Stake, um die Blockchain zu sichern. -## Was ist der Unterschied zwischen Proof-of-Stake und Proof-of-Work? {#comparison-to-proof-of-work} +## Wie lässt sich Proof-of-Stake mit Proof-of-Work vergleichen? {#comparison-to-proof-of-work} -Sowohl Proof-of-Work als auch Proof-of-Stake sind Mechanismen, die böswillige Akteure wirtschaftlich davon abhalten, das Netzwerk mit Spam zu überhäufen oder betrügerische Aktivitäten auszuführen. In beiden Fällen legen Nodes, die aktiv am Konsens teilnehmen, Assets „in das Netzwerk“ ab, das sie verlieren, sollten sie sich falsch verhalten. +Sowohl Proof-of-Work als auch Proof-of-Stake sind Mechanismen, die bösartige Akteure wirtschaftlich davon abhalten, das Netzwerk zu spammen oder zu betrügen. In beiden Fällen bringen Blockchain-Knoten, die aktiv am Konsens teilnehmen, einen Vermögenswert „in das Netzwerk“ ein, den sie verlieren, wenn sie sich falsch verhalten. -Bei Proof-of-Work ist dieses Asset die Energie. Der Node, bekannt als Miner, führt einen Algorithmus aus, der versucht, einen Wert schneller als jeder andere Node zu berechnen. Der schnellste Node hat das Recht, der Chain einen Block vorzuschlagen. Um die Historie der Chain zu verändern oder die Block-Proposals zu dominieren müsste ein Miner über so viel Rechenleistung verfügen, dass er immer das Rennen gewinnt. Dies ist unerschwinglich teuer und schwierig auszuführen und schützt die Chain so vor Angriffen. Die Energie, die für das „Mining“ über den Proof-of-Work-Mechanismus erforderlich ist, ist ein Asset in der realen Welt, für den Miner bezahlen. +Bei Proof-of-Work ist dieser Vermögenswert Energie. Der Blockchain-Knoten, bekannt als Miner, führt einen Algorithmus aus, der darauf abzielt, einen Wert schneller als jeder andere Blockchain-Knoten zu berechnen. Der schnellste Blockchain-Knoten hat das Recht, der Chain einen Block vorzuschlagen. Um die Historie der Chain zu ändern oder den Blockvorschlag zu dominieren, müsste ein Miner über so viel Rechenleistung verfügen, dass er das Rennen immer gewinnt. Dies ist unerschwinglich teuer und schwer auszuführen, was die Chain vor Angriffen schützt. Die Energie, die für das „Mining“ mittels Proof-of-Work erforderlich ist, ist ein realer Vermögenswert, für den die Miner bezahlen. -Proof-of-Stake erfordert Nodes, bekannt als Validatoren, die ein Krypto-Asset einem Smart Contract explizit übergeben. Wenn sich ein Validator falsch verhält, können diese Kryptowerte zerstört werden, da er seine Assets direkt in die Chain und nicht indirekt über den Energieverbrauch einbringt. Dieser Vorgang wird auch „Staking“ (englisch für „Einsatz“) genannt. +Proof-of-Stake erfordert, dass Blockchain-Knoten, bekannt als Validatoren, explizit ein Krypto-Asset an einen Smart Contract übermitteln. Wenn sich ein Validator falsch verhält, kann diese Kryptowährung zerstört werden, da er seine Vermögenswerte direkt in die Chain einbringt (Staking), anstatt indirekt über Energieaufwand. -Proof-of-Work ist sehr viel energieaufwendiger, da Elektrizität im Mining-Prozess verbraucht wird. Für Proof-of-Stake wird hingegen nur eine sehr kleine Mengen an Energie benötigt – Ethereum-Validatoren können sogar auf Geräten mit geringem Energiebedarf wie etwa einem Raspberry Pi ausgeführt werden. Es wird davon ausgegangen, dass Ethereums Proof-of-Stake-Mechanismus sicherer ist als der Proof-of-Work-Mechanismus, da die Kosten für einen Angriff höher und die Konsequenzen für einen Angreifer schwerwiegender sind. +Proof-of-Work ist viel energiehungriger, da beim Mining-Prozess Strom verbraucht wird. Proof-of-Stake hingegen benötigt nur eine sehr geringe Menge an Energie – Ethereum-Validatoren können sogar auf einem stromsparenden Gerät wie einem Raspberry Pi ausgeführt werden. Der Proof-of-Stake-Mechanismus von Ethereum gilt als sicherer als Proof-of-Work, da die Kosten für einen Angriff höher sind und die Konsequenzen für einen Angreifer schwerwiegender ausfallen. -Proof-of-Work versus Proof-of-Stake ist ein umstrittenes Thema. [Vitalik Buterins Blog](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) und die Debatte zwischen Justin Drake und Lyn Alden geben einen guten Überblick über die Argumente. +Proof-of-Work versus Proof-of-Stake ist ein umstrittenes Thema. [Vitalik Buterins Blog](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) und die Debatte zwischen Justin Drake und Lyn Alden bieten eine gute Zusammenfassung der Argumente. ## Ist Proof-of-Stake energieeffizient? {#is-pos-energy-efficient} -Ja. Nodes auf dem Proof-of-Stake-Netzwerk nutzen sehr geringe Mengen an Energie. Eine Studie Dritter kam zu dem Schluss, dass Ethereums gesamtes Proof-of-Stake-Netzwerk ungefähr 0,0026 TWh/Jahr verbraucht – ungefähr 13.000-mal weniger Energie, als allein in den USA jedes für Gaming aufgebraucht wird. +Ja. Blockchain-Knoten in einem Proof-of-Stake-Netzwerk verbrauchen eine winzige Menge an Energie. Eine unabhängige Studie kam zu dem Schluss, dass das gesamte Proof-of-Stake-Netzwerk von Ethereum rund 0,0026 TWh/Jahr verbraucht – etwa 13.000-mal weniger als Gaming allein in den USA. -[ Mehr zum Energieverbrauch von Ethereum](/energy-consumption/). +[Mehr zum Energieverbrauch von Ethereum](/energy-consumption/). ## Ist Proof-of-Stake sicher? {#is-pos-secure} -Ethereums Proof-of-Stake ist sehr sicher. Der Mechanismus wurde acht Jahre lang erforscht, entwickelt und rigoros getestet, bevor er in Betrieb genommen wurde. Die Sicherheitsversprechen unterscheiden sich von Proof-of-Work-Blockchains. Bei Proof-of-Stake können böswillige Validatoren aktiv bestraft („geslasht“) werden und aus dem Validatoren-Set ausgeschlossen werden. Das kostet eine erhebliche Menge an ETH. Unter Proof-of-Work kann ein böswilliger Akteur seinen Angriff immer wieder ausführen, solange er über die erforderliche Hash-Leistung verfügt. Außerdem ist es im Vergleich zu Proof-of-Work-Ethereum kostspieliger, gleichwertige Angriffe auf Proof-of-Stake-Ethereum durchzuführen. Um die Liveness der Chain zu beeinflussen, sind mindestens 33 % der insgesamt eingesetzten Ether im Netzwerk erforderlich (außer in Fällen sehr ausgeklügelter Angriffe mit extrem geringer Erfolgswahrscheinlichkeit). Um die Inhalte zukünftiger Blocks zu kontrollieren, werden mindestens 51 % der insgesamt eingesetzten ETH benötigt, und um die Historie zu verändern, sind mindestens 66 % der insgesamt eingesetzten ETH erforderlich. Das Ethereum-Protokoll würde diese Assetss in den Angriffsszenarien mit 33 % oder 51 % und durch sozialen Konsens im Angriffsszenario mit 66 % zerstören. +Das Proof-of-Stake von Ethereum ist sehr sicher. Der Mechanismus wurde über acht Jahre lang erforscht, entwickelt und streng getestet, bevor er live ging. Die Sicherheitsgarantien unterscheiden sich von Proof-of-Work-Blockchains. Bei Proof-of-Stake können bösartige Validatoren aktiv bestraft („Slashing“) und aus der Gruppe der Validatoren ausgeschlossen werden, was eine erhebliche Menge an ETH kostet. Unter Proof-of-Work kann ein Angreifer seinen Angriff beliebig oft wiederholen, solange er über ausreichend Hash-Leistung verfügt. Es ist auch kostspieliger, gleichwertige Angriffe auf das Proof-of-Stake von Ethereum durchzuführen als unter Proof-of-Work. Um die Lebendigkeit (Liveness) der Chain zu beeinträchtigen, sind mindestens 33 % der gesamten im Netzwerk eingesetzten Ether erforderlich (außer in Fällen sehr raffinierter Angriffe mit extrem geringer Erfolgswahrscheinlichkeit). Um den Inhalt zukünftiger Blöcke zu kontrollieren, sind mindestens 51 % der gesamten eingesetzten ETH erforderlich, und um die Historie neu zu schreiben, werden über 66 % des gesamten Einsatzes benötigt. Das Ethereum-Protokoll würde diese Vermögenswerte in den 33-%- oder 51-%-Angriffsszenarien zerstören und durch sozialen Konsens im 66-%-Angriffsszenario. -- [Weitere Informationen zur Absicherung von Ethereum durch Proof-of-Stake gegen Angreifer](/developers/docs/consensus-mechanisms/pos/attack-and-defense) -- [Weitere Informationen zum Aufbau von Proof-of-Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [Mehr zur Verteidigung des Ethereum-Proof-of-Stake vor Angreifern](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +- [Mehr zum Proof-of-Stake-Design](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -## Macht Proof-of-Stake Ethereum günstiger? {#does-pos-make-ethereum-cheaper} +## Macht Proof-of-Stake Ethereum billiger? {#does-pos-make-ethereum-cheaper} -Nein. Die Kosten für das Versenden einer Transaktion (Gasgebühren) werden von einem dynamischen Gebührenmarkt bestimmt. Sie erhöhen sich bei steigender Netzwerknachfrage. Der Konsensmechanismus beeinflusst dies nicht direkt. +Nein. Die Kosten für das Senden einer Transaktion (Gasgebühr) werden durch einen dynamischen Gebührenmarkt bestimmt, der mit steigender Netzwerknachfrage zunimmt. Der Konsensmechanismus hat darauf keinen direkten Einfluss. [Mehr zu Gas](/developers/docs/gas). -## Was sind Nodes, Clients und Validatoren? {#what-are-nodes-clients-and-validators} +## Was sind Blockchain-Knoten, Anwendungen und Validatoren? {#what-are-nodes-clients-and-validators} -Nodes sind Computer, die mit dem Ethereum-Netzwerk verbunden sind. Clients sind die Software, die von ihnen ausgeführt wird und die den Computer in einen Node verwandelt. Es gibt zwei Arten von Clients: Ausführungs-Clients und Konsens-Clients. Es bedarf beider, um einen Node zu erstellen. Ein Validator ist eine optionale Erweiterung zu einem Konsens-Client, der es dem Node ermöglicht, am Proof-of-Stake-Konsens teilzunehmen. Das bedeutet, dass er Blöcke erstellen und vorschlagen kann, wenn er ausgewählt wird, und dass er Blöcke, von denen er im Netzwerk erfährt, attestieren kann. Um einen Validator zu betreiben, muss ein Operator eines Nodes 32 ETH in den Einzahlungsvertrag trasferieren. +Blockchain-Knoten sind Computer, die mit dem Ethereum-Netzwerk verbunden sind. Anwendungen sind die Software, die sie ausführen und die den Computer in einen Blockchain-Knoten verwandelt. Es gibt zwei Arten von Anwendungen: Ausführungs-Clients und Konsens-Clients. Beide werden benötigt, um einen Blockchain-Knoten zu erstellen. Ein Validator ist ein optionales Add-on zu einem Konsens-Client, das es dem Blockchain-Knoten ermöglicht, am Proof-of-Stake-Konsens teilzunehmen. Dies bedeutet das Erstellen und Vorschlagen von Blöcken, wenn sie ausgewählt werden, und das Bestätigen von Blöcken, von denen sie im Netzwerk erfahren. Um einen Validator zu betreiben, muss der Betreiber des Blockchain-Knotens 32 ETH in den Einzahlungsvertrag einzahlen. -- [Mehr zu Nodes und Clients](/developers/docs/nodes-and-clients) -- [Mehr zum Staking](/staking) +- [Mehr zu Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients) +- [Mehr zu Staking](/staking) ## Ist Proof-of-Stake eine neue Idee? {#is-pos-new} -Nein. Ein Benutzer auf BitcoinTalk [schlug 2011 die grundlegende Idee von Proof-of-Stake](https://bitcointalk.org/index.php?topic=27787.0) als ein Upgrade für Bitcoin vor. Es vergingen elf Jahre, bevor die Technologie bereit war, auf dem Ethereum Mainnet implementiert zu werden. Einige andere Chains implementierten Proof-of-Stake bereits vor Ethereum, jedoch nicht Ethereums spezifischen Mechanismus (bekannt als Gasper). +Nein. Ein Benutzer auf BitcoinTalk [schlug die Grundidee von Proof-of-Stake vor](https://bitcointalk.org/index.php?topic=27787.0), als Upgrade für Bitcoin im Jahr 2011. Es dauerte elf Jahre, bis es bereit war, im Ethereum-Mainnet implementiert zu werden. Einige andere Chains implementierten Proof-of-Stake früher als Ethereum, jedoch nicht den spezifischen Mechanismus von Ethereum (bekannt als Gasper). -## Was ist das Besondere an Ethereums Proof-of-Stake? {#why-is-ethereum-pos-special} +## Was ist das Besondere am Proof-of-Stake von Ethereum? {#why-is-ethereum-pos-special} -Ethereums Proof-of-Stake-Mechanismus ist in seinem Aufbau einzigartig. Er war nicht der erste Proof-of-Stake-Mechanismus, der konzipiert und implementiert wurde, jedoch ist es der robusteste. Der Proof-of-Stake-Mechanismus ist als „Casper“ bekannt. Casper definiert, wie Validatoren ausgewählt werden, um Blöcke vorzuschlagen, wie und wann Attestierungen gemacht werden, wie Attestierungen gezählt werden, welche Belohnungen und Strafen an die Validatoren gehen, welche Bedingungen für das Slashing gelten, welche ausfallsicheren Mechanismen wie das Inactivity Leak es gibt und welche Bedingungen für „Endgültikeit“ gelten. Endgültigkeit ist die Bedingung, dass mindestens 66 % der insgesamt eingesetzten ETH im Netzwerk für einen Block gestimmt haben müssen, damit dieser als permanenter Teil der kanonischen Chain betrachtet wird. Forscher haben Casper spezifisch für Ethereum entwickelt und Ethereum ist die erste und einzige Blockchain, die es implementiert hat. +Der Proof-of-Stake-Mechanismus von Ethereum ist in seinem Design einzigartig. Es war nicht der erste Proof-of-Stake-Mechanismus, der entworfen und implementiert wurde, aber er ist der robusteste. Der Proof-of-Stake-Mechanismus ist als „Casper“ bekannt. Casper definiert, wie Validatoren ausgewählt werden, um Blöcke vorzuschlagen, wie und wann Bestätigungen vorgenommen werden, wie Bestätigungen gezählt werden, die Belohnungen und Strafen für Validatoren, Slashing-Bedingungen, ausfallsichere Mechanismen wie das Inactivity Leak und die Bedingungen für „Finalität“. Finalität ist die Bedingung, dass ein Block, um als dauerhafter Teil der kanonischen Chain betrachtet zu werden, von mindestens 66 % der gesamten im Netzwerk eingesetzten ETH gewählt worden sein muss. Forscher haben Casper speziell für Ethereum entwickelt, und Ethereum ist die erste und einzige Blockchain, die es implementiert hat. -Zusätzlich zu Casper nutzt Ethereums Proof-of-Stake einen Abspaltungs-Wahl-Algorithmus, der LMD-GHOST genannt wird. Dies ist für den Fall erforderlich, dass zwei Blöcke für denselben Slot existieren. In diesem Fall werden zwei Abspaltungen der Blockchain erstellt. LMD-GHOST wählt diejenige aus, die das größte „Gewicht“ an Attestierungen hat. Das Gewicht ist die Anzahl der Attestierungen, die anhand des Effektiguthabens der Validatoren gewichtet wird. LMD-GHOST existiert nur für Ethereum. +Zusätzlich zu Casper verwendet das Proof-of-Stake von Ethereum einen Fork-Choice-Algorithmus namens LMD-GHOST. Dies ist erforderlich, falls eine Bedingung eintritt, bei der zwei Blöcke für denselben Slot existieren. Dadurch entstehen zwei Forks der Blockchain. LMD-GHOST wählt denjenigen aus, der das größte „Gewicht“ an Bestätigungen aufweist. Das Gewicht ist die Anzahl der Bestätigungen, gewichtet mit dem effektiven Kontostand der Validatoren. LMD-GHOST ist einzigartig für Ethereum. -Die Kombination von Casper und LMD_Ghost ist als Gasper bekannt. +Die Kombination aus Casper und LMD_GHOST ist als Gasper bekannt. [Mehr zu Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) ## Was ist Slashing? {#what-is-slashing} -Slashing ist der gegebene Begriff für das Zerstören einiger Teile des Stakes (des Einsatzes) der Validatoren und das Entfernen des Validator aus dem Netzwerk. Die Menge an ETH, die beim Slashing verloren geht, skaliert mit der Anzahl der Validatoren, die geslasht werden – das heißt, dass illegal zusammenarbeitende Validatoren schwerer bestraft werden als einzeln Handelnde. +Slashing ist der Begriff für die Zerstörung eines Teils des Einsatzes eines Validators und den Ausschluss des Validators aus dem Netzwerk. Die Menge an ETH, die bei einem Slashing verloren geht, skaliert mit der Anzahl der Validatoren, die geslasht werden – das bedeutet, dass kolludierende Validatoren strenger bestraft werden als Einzelpersonen. [Mehr zu Slashing](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) ## Warum benötigen Validatoren 32 ETH? {#why-32-eth} -Validatoren müssen ETH einsetzen, damit sie etwas zu verlieren haben, sollten sie sich falsch benehmen. Der Grund, warum sie genau 32 ETH einsetzen müssen, ist, dass die Nodes so auf einfacher Hardware laufen können. Wenn der minimal pro Validator eingesetzte ETH-Betrag niedriger wäre, würde sich die Anzahl an Validatoren und auch die Anzahl an Nachrichten, die in jedem Slot verarbeitet werden müssen, erhöhen. Dies würde bedeuten, dass leistungsstärkere Hardware nötig wäre, um einen Node zu betreiben. +Validatoren müssen ETH einsetzen (Staking), damit sie etwas zu verlieren haben, wenn sie sich falsch verhalten. Der Grund, warum sie genau 32 ETH einsetzen müssen, besteht darin, es Blockchain-Knoten zu ermöglichen, auf bescheidener Hardware zu laufen. Wäre das Minimum an ETH pro Validator geringer, würde die Anzahl der Validatoren und damit die Anzahl der Nachrichten, die in jedem Slot verarbeitet werden müssen, steigen, was bedeuten würde, dass leistungsfähigere Hardware erforderlich wäre, um einen Blockchain-Knoten zu betreiben. -## Wie werden die Validatoren ausgewählt? {#how-are-validators-selected} +## Wie werden Validatoren ausgewählt? {#how-are-validators-selected} -Ein einzelner Validator wird pseudo-zufällig ausgewählt, um in jedem Slot einen Block vorzuschlagen. Der dabei verwendete Algorithmus nennt sich RANDAO und mischt einen Hash vom Block-Proposer mit einem Seed, der für jeden Block aktualisiert wird. Dieser Wert wird genutzt, um einen spezifischen Validator aus dem gesamten Validatoren-Set auszuwählen. Die Auswahl des Validators wird zwei Epochen im Voraus festgelegt. +Ein einzelner Validator wird pseudozufällig ausgewählt, um in jedem Slot einen Block vorzuschlagen, wobei ein Algorithmus namens RANDAO verwendet wird, der einen Hash vom Block-Vorschlagenden mit einem Seed mischt, der bei jedem Block aktualisiert wird. Dieser Wert wird verwendet, um einen bestimmten Validator aus der gesamten Gruppe der Validatoren auszuwählen. Die Auswahl der Validatoren wird zwei Epochen im Voraus festgelegt. [Mehr zur Auswahl von Validatoren](/developers/docs/consensus-mechanisms/pos/block-proposal) -## Was ist Stake Grinding? {#what-is-stake-grinding} +## Was ist Stake-Grinding? {#what-is-stake-grinding} -Stake Grinding beschreibt eine Kategorie von Angriffen auf Proof-of-Stake-Netzwerke, bei denen der Angreifer versucht, den Auswahlalgorithmus für Validatoren zu Gunsten seiner eigenen Validatoren zu beeinflussen. Für diese Angriffe auf RANDAO ist ungefähr die Hälfte der insgesamt eingesetzten ETH erforderlich. +Stake-Grinding ist eine Kategorie von Angriffen auf Proof-of-Stake-Netzwerke, bei denen der Angreifer versucht, den Algorithmus zur Auswahl der Validatoren zugunsten seiner eigenen Validatoren zu beeinflussen. Stake-Grinding-Angriffe auf RANDAO erfordern etwa die Hälfte der gesamten eingesetzten ETH. -[Mehr zu Stake Grinding](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) +[Mehr zu Stake-Grinding](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) -## Was ist soziales Slashing? {#what-is-social-slashing} +## Was ist Social Slashing? {#what-is-social-slashing} -Soziales Slashing beschreibt die Fähigkeit der Community, als Antwort auf einen Angriff eine Abspaltung der Blockchain zu bewirken. Es ermöglicht der Community, sich von einem Angriff, bei dem eine unehrliche Chain finalisiert wurde, zu erholen. Soziales Slashing kann auch als Verteidigung gegen Zensurangriffe zur Anwendung kommen. +Social Slashing ist die Fähigkeit der Community, als Reaktion auf einen Angriff einen Fork der Blockchain zu koordinieren. Es ermöglicht der Community, sich davon zu erholen, wenn ein Angreifer eine unehrliche Chain finalisiert. Social Slashing kann auch gegen Zensurangriffe eingesetzt werden. -- [Mehr zum sozialen Slashing](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin zum sozialen Slashing](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Mehr zu Social Slashing](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) +- [Vitalik Buterin über Social Slashing](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## Werde ich geslasht? {#will-i-get-slashed} -Als Validator ist es sehr schwierig, geslasht zu werden, außer Sie verhalten sich absichtlich auf bösartige Weise. Slashing wird nur in sehr spezifischen Szenarios implementiert, bei denen Validatoren mehrere Blöcke für denselben Slot vorschlagen oder sich bei ihren Attestierungen widersprechen. Es ist sehr unwahrscheinlich, dass diese Fälle zufällig auftreten. +Als Validator ist es sehr schwierig, geslasht zu werden, es sei denn, man legt absichtlich ein bösartiges Verhalten an den Tag. Slashing wird nur in sehr spezifischen Szenarien implementiert, in denen Validatoren mehrere Blöcke für denselben Slot vorschlagen oder sich mit ihren Bestätigungen selbst widersprechen – es ist sehr unwahrscheinlich, dass dies versehentlich geschieht. -[Mehr zu den Bedingungen für Slashing](https://eth2book.info/altair/part2/incentives/slashing) +[Mehr zu Slashing-Bedingungen](https://eth2book.info/altair/part2/incentives/slashing) -## Was ist das „Nothing-at-Stake“-Problem? {#what-is-nothing-at-stake-problem} +## Was ist das Nothing-at-Stake-Problem? {#what-is-nothing-at-stake-problem} -Das Nothing-at-Stake(„nichts zu verlieren“)-Problem ist ein konzeptionelles Problem mit einigen Proof-of-Stake-Mechanismen, bei denen es nur Belohnungen und keine Bestrafungen gibt. Wenn es nichts zu verlieren gibt, ist ein pragmatischer Validierer auch gerne bereit, jede oder sogar mehrere Abspaltungen der Blockchain zu attestieren, da die seine Belohnungen vermehrt. Ethereum umgeht dies, indem es Endgültigkeitsbedingungen und Slashing nutzt, um sicherzugehen, dass es eine kanonische Chain gibt. +Das Nothing-at-Stake-Problem ist ein konzeptionelles Problem bei einigen Proof-of-Stake-Mechanismen, bei denen es nur Belohnungen und keine Strafen gibt. Wenn nichts auf dem Spiel steht (Einsatz), ist ein pragmatischer Validator gleichermaßen bereit, jeden oder sogar mehrere Forks der Blockchain zu bestätigen, da dies seine Belohnungen erhöht. Ethereum umgeht dies durch die Verwendung von Finalitätsbedingungen und Slashing, um eine einzige kanonische Chain sicherzustellen. [Mehr zum Nothing-at-Stake-Problem](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) -## Was ist ein Abspaltungs-Wahl-Algorithmus? {#what-is-a-fork-choice-algorithm} +## Was ist ein Fork-Choice-Algorithmus? {#what-is-a-fork-choice-algorithm} -Ein Abspaltungs-Wahl-Algorithmus implementiert Regeln, mit denen festgelegt wird, welche Chain die kanonische ist. Unter optimalen Bedingungen bedarf es keiner Abspaltungs-Wahl-Regel, da es nur einen Block-Proposer pro Slot gibt und nur einen Block, der ausgewählt werden kann. Gelegentlich führen jedoch mehrere Blöcke für denselben Slot oder spät eintreffende Informationen dazu, dass es mehrere Optionen dafür gibt, wie Blöcke in der Nähe der Chain-Spitze organisiert sind. In diesen Fällen müssen alle Clients einige identische Regeln implementieren, um sicherzustellen, dass sie alle die richtige Blockreihenfolge auswählen. Der Abspaltungs-Wahl-Algorithmus kodiert diese Regeln. +Ein Fork-Choice-Algorithmus implementiert Regeln, die bestimmen, welche Chain die kanonische ist. Unter optimalen Bedingungen besteht keine Notwendigkeit für eine Fork-Choice-Regel, da es nur einen Block-Vorschlagenden pro Slot und einen Block zur Auswahl gibt. Gelegentlich führen jedoch mehrere Blöcke für denselben Slot oder spät eintreffende Informationen zu mehreren Optionen dafür, wie Blöcke nahe der Spitze der Chain organisiert sind. In diesen Fällen müssen alle Anwendungen einige Regeln identisch implementieren, um sicherzustellen, dass sie alle die richtige Abfolge von Blöcken auswählen. Der Fork-Choice-Algorithmus kodiert diese Regeln. -Ethereums Abspaltungs-Wahl-Algorithmus heißt LMD-GHOST. Es wählt die Abspaltung mit dem größten Gewicht an Attestierungen, d. h. die Abspaltung, für die die meisten eingesetzten ETH gestimmt haben. +Der Fork-Choice-Algorithmus von Ethereum heißt LMD-GHOST. Er wählt den Fork mit dem größten Gewicht an Bestätigungen, also denjenigen, für den die meisten eingesetzten ETH gestimmt haben. [Mehr zu LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice) -## Was ist Endgültigkeit bei Proof-of-Stake? {#what-is-finality} +## Was ist Finalität bei Proof-of-Stake? {#what-is-finality} -Endgültigkeit bei Proof-of-Stake ist die Garantie, dass ein gegebener Block ein permanenter Teil der kanonischen Chain ist und nicht rückgängig gemacht werden kann, außer es kommt zu einem Konsensversagen, bei dem ein Angreifer 33 % der insgesamt eingesetzten Ether verbrennt. Das ist „krypto-ökonomische“ Endgültigkeit, im Gegensatz zur „probabilistischer Endgültigkeit“, die für Proof-of-Work-Blockchains relevant ist. Bei der probabilistischen Endgültigkeit gibt es keine expliziten finalisierten oder nicht finalisierten Zustände für die Blöcke – es wird lediglich immer weniger wahrscheinlich, dass ein Block aus der Chain entfernt werden könnte, je älter er wird. Außerdem bestimmen die Benutzer für sich selbst, wann sie überzeugt genug sind, dass ein Block „sicher“ ist. Bei krypto-ökonomischer Endgültigkeit müssen Paare von Checkpoint-Blöcken von 66 % der eingesetzten Ether gewählt werden. Wenn diese Bedingung erfüllt ist, werden Blöcke zwischen diesen Checkpoints explizit „finalisiert“. +Finalität bei Proof-of-Stake ist die Garantie, dass ein bestimmter Block ein dauerhafter Teil der kanonischen Chain ist und nicht rückgängig gemacht werden kann, es sei denn, es liegt ein Konsensfehler vor, bei dem ein Angreifer 33 % der gesamten eingesetzten Ether verbrennt. Dies ist eine „kryptoökonomische“ Finalität im Gegensatz zur „probabilistischen Finalität“, die für Proof-of-Work-Blockchains relevant ist. Bei der probabilistischen Finalität gibt es keine expliziten finalisierten/nicht-finalisierten Zustände für Blöcke – es wird einfach immer unwahrscheinlicher, dass ein Block aus der Chain entfernt werden könnte, je älter er wird, und die Benutzer entscheiden selbst, wann sie ausreichend zuversichtlich sind, dass ein Block „sicher“ ist. Bei der kryptoökonomischen Finalität müssen Paare von Checkpoint-Blöcken von 66 % der eingesetzten Ether gewählt werden. Wenn diese Bedingung erfüllt ist, werden Blöcke zwischen diesen Checkpoints explizit „finalisiert“. -[Mehr zur Endgültigkeit](/developers/docs/consensus-mechanisms/pos/#finality) +[Mehr zu Finalität](/developers/docs/consensus-mechanisms/pos/#finality) -## Was ist „schwache Subjektivität“? {#what-is-weak-subjectivity} +## Was ist „schwache Subjektivität“ (Weak Subjectivity)? {#what-is-weak-subjectivity} -Schwache Subjektivität ist eine Funktion des Proof-of-Stake-Netzwerks, bei der soziale Informationen genutzt werden, um den derzeitigen Zustand der Blockchain zu bestätigen. Neuen Nodes oder Nodes, die das Netzwerk wieder betreten, nachdem sie für eine längere Zeit offline waren, kann ein aktueller Zustand gegeben werden. Auf diese Weise kann der Node direkt sehen, ob er sich auf der korrekten Chain befindet. Diese Zustände sind bekannt als „Checkpoints von schwacher Subjektivität“ und sie können von anderen Node-Operatoren außerhalb des Bands, von Block-Explorern oder von mehreren öffentliche Endpunkten erhalten werden. +Schwache Subjektivität ist ein Merkmal von Proof-of-Stake-Netzwerken, bei dem soziale Informationen verwendet werden, um den aktuellen Zustand der Blockchain zu bestätigen. Neuen Blockchain-Knoten oder Blockchain-Knoten, die dem Netzwerk nach langer Offline-Zeit wieder beitreten, kann ein aktueller Zustand übergeben werden, sodass der Blockchain-Knoten sofort erkennen kann, ob er sich auf der richtigen Chain befindet. Diese Zustände sind als „Weak Subjectivity Checkpoints“ bekannt und können von anderen Betreibern von Blockchain-Knoten Out-of-Band, von Blocksuchmaschinen oder von verschiedenen öffentlichen Endpunkten bezogen werden. [Mehr zu schwacher Subjektivität](/developers/docs/consensus-mechanisms/pos/weak-subjectivity) ## Ist Proof-of-Stake zensurresistent? {#is-pos-censorship-resistant} -Zensurresistenz ist im Moment schwer zu beweisen. Jedoch bietet Proof-of-Stake anders als Proof-of-Work die Option, Slashings zu koordinieren, sodass zensierende Validatoren bestraft werden können. Es stehen Änderungen an den Protokollen an, die Blockersteller von Block-Proposern trennen und Listen von Transaktionen einführen, die Ersteller in jeden Block mit aufnehmen müssen. Dieser Vorschlag wird als „richtige-Ersteller-Separierung“ bezeichnet und hilft dabei, Validatoren daran zu hindern, Transaktionen zu zensieren. +Zensurresistenz ist derzeit schwer zu beweisen. Im Gegensatz zu Proof-of-Work bietet Proof-of-Stake jedoch die Möglichkeit, Slashings zu koordinieren, um zensierende Validatoren zu bestrafen. Es stehen Änderungen am Protokoll an, die Block-Ersteller von Block-Vorschlagenden trennen und Listen von Transaktionen implementieren, die Ersteller in jeden Block aufnehmen müssen. Dieser Vorschlag ist als Proposer-Builder Separation bekannt und hilft zu verhindern, dass Validatoren Transaktionen zensieren. -[Mehr zur Proposer-Ersteller-Separierung](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) +[Mehr zur Proposer-Builder Separation](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) -## Ist Ethereums Proof-of-Stake-System anfällig für einen 51 %-Angriff? {#pos-51-attack} +## Kann das Proof-of-Stake-System von Ethereum durch einen 51-%-Angriff attackiert werden? {#pos-51-attack} -Ja. Proof-of-Stake ist genauso wie Proof-of-Work anfällig für 51 %-Angriffe. Anstatt 51 % der Hash-Leistung eines Netzwerks benötigt ein Angreifer 51 % der insgesamt eingesetzten ETH. Ein Angreifer, der 51 % des gesamten Stakes ansammelt, erhält die Kontrolle über den Abspaltungs-Wahl-Algorithmus. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, Kurzstrecken-Neuorganisationen durchzuführen und MEV zu extrahieren, indem er Blöcke zu seinen Gunsten neu anordnet. +Ja. Proof-of-Stake ist anfällig für 51-%-Angriffe, genau wie Proof-of-Work. Anstatt dass der Angreifer 51 % der Hash-Leistung des Netzwerks benötigt, benötigt der Angreifer 51 % der gesamten eingesetzten ETH. Ein Angreifer, der 51 % des gesamten Einsatzes ansammelt, erlangt die Kontrolle über den Fork-Choice-Algorithmus. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, kurzfristige Reorganisationen durchzuführen und MEV zu extrahieren, indem er Blöcke zu seinen Gunsten neu anordnet. [Mehr zu Angriffen auf Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/attack-and-defense) ## Was ist soziale Koordination und warum wird sie benötigt? {#what-is-social-coordination} -Soziale Koordination ist die letzte Verteidigungslinie auf Ethereum, mit der es möglich wäre, eine ehrliche Chain wiederherzustellen, die einem Angriff zum Opfer gefallen ist, bei dem unehrliche Blöcke finalisiert wurden. In diesem Fall müsste sich die Ethereum-Community „außerhalb des Bands“ koordinieren und sich darauf einigen, eine ehrliche Minderheitsabspaltung zu nutzen und dabei die Validatoren des Angreifers mit Slashing zu bestrafen. Dies würde voraussetzen, dass auch Anwendungen und Börsen die ehrliche Abspaltung anerkennen. +Soziale Koordination ist eine letzte Verteidigungslinie für Ethereum, die es ermöglichen würde, eine ehrliche Chain von einem Angriff zu erholen, der unehrliche Blöcke finalisiert hat. In diesem Fall müsste sich die Ethereum-Community „Out-of-Band“ koordinieren und sich darauf einigen, einen ehrlichen Minderheits-Fork zu verwenden, wobei die Validatoren des Angreifers im Zuge dessen geslasht werden. Dies würde erfordern, dass auch Apps und Börsen den ehrlichen Fork anerkennen. -[Lesen Sie mehr zu sozialer Koordination](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) +[Mehr zur sozialen Koordination lesen](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) -## Werden die Reichen durch Proof-of-Stake noch reicher? {#do-rich-get-richer} +## Werden die Reichen bei Proof-of-Stake reicher? {#do-rich-get-richer} -Je mehr ETH jemand einsetzt, desto mehr Validatoren kann derjenige betreiben und desto mehr Belohnungen können für ihn anfallen. Die Belohnung skaliert linear mit der Menge an eingesetzten ETH und jeder bekommt denselben prozentualen Ertrag. Proof-of-Work bereichert die Reichen mehr als Proof-of-Stake, weil reichere Miner, die Hardware in großem Umfang kaufen, von Skaleneffekten profitieren. Das bedeutet, dass die Beziehung zwischen Reichtum und Belohnung nicht linear ist. +Je mehr ETH jemand für das Staking hat, desto mehr Validatoren kann er betreiben und desto mehr Belohnungen kann er ansammeln. Die Belohnungen skalieren linear mit der Menge der eingesetzten ETH, und jeder erhält die gleiche prozentuale Rendite. Proof-of-Work bereichert die Reichen mehr als Proof-of-Stake, da reichere Miner, die Hardware in großem Maßstab kaufen, von Skaleneffekten profitieren, was bedeutet, dass die Beziehung zwischen Reichtum und Belohnung nicht linear ist. ## Ist Proof-of-Stake zentralisierter als Proof-of-Work? {#is-pos-decentralized} -Nein, Proof-of-Work tendiert stärker zur Zentralisierung, weil die Mining-Kosten steigen und Einzelpersonen und dann kleine Unternehmen verdrängen, und so weiter. Das derzeitige Problem mit Proof-of-Stake ist der Einfluss von Liquid Staking Derivatives (LSDs). Dabei handelt es sich um Token, die ETH repräsentieren und von einem Anbieter eingesetzt wurden. Diese können von jeder Person auf Sekundärmärkten getauscht werden, ohne dass die eigentlichen ETH entwertet werden. LSDs erlauben es Nutzern, weniger als 32 ETH einzusetzen. Sie erzeugen jedoch auch ein Zentralisierungsrisiko, bei dem einige wenige große Organisationen einen Großteil des Stakes kontrollieren. Aus diesem Grund ist [Solo-Staking](/staking/solo) die beste Option für Ethereum. +Nein, Proof-of-Work tendiert zur Zentralisierung, da die Mining-Kosten steigen und Einzelpersonen, dann kleine Unternehmen und so weiter vom Markt verdrängen. Das aktuelle Problem bei Proof-of-Stake ist der Einfluss von Liquid Staking Derivatives (LSDs). Dies sind Token, die von einem Anbieter eingesetzte ETH repräsentieren und die jeder auf Sekundärmärkten tauschen kann, ohne dass das eigentliche ETH-Staking beendet wird. LSDs ermöglichen es Benutzern, mit weniger als 32 ETH am Staking teilzunehmen, aber sie schaffen auch ein Zentralisierungsrisiko, bei dem einige wenige große Organisationen am Ende einen Großteil des Einsatzes kontrollieren können. Aus diesem Grund ist [Solo-Staking](/staking/solo) die beste Option für Ethereum. -[Mehr zur Stake-Zentralisierung in LSDs](https://notes.ethereum.org/@djrtwo/risks-of-lsd) +[Mehr zur Zentralisierung von Einsätzen bei LSDs](https://notes.ethereum.org/@djrtwo/risks-of-lsd) -## Warum kann ich nur ETH einsetzen? {#why-can-i-only-stake-eth} +## Warum kann ich nur ETH für das Staking verwenden? {#why-can-i-only-stake-eth} -ETH ist die Währung von Ethereum. Eine einheitliche Währung, auf die alle Stakes lauten, ist sowohl für die Buchhaltung von Effektivguthaben als auch für die Stimmengewichtung und die Sicherheit unerlässlich. ETH selbst sind eher ein fundamentaler Bestandteil von Ethereum als ein Smart Contract. Die Einbeziehung anderer Währungen würde die Komplexität deutlich erhöhen und die Sicherheit des Stakings verringern. +ETH ist die native Währung von Ethereum. Es ist unerlässlich, eine einzige Währung zu haben, in der alle Einsätze denominiert sind, sowohl für die Bilanzierung effektiver Kontostände zur Gewichtung von Stimmen als auch für die Sicherheit. ETH selbst ist eine grundlegende Komponente von Ethereum und kein Smart Contract. Die Einbeziehung anderer Währungen würde die Komplexität erheblich erhöhen und die Sicherheit des Stakings verringern. ## Ist Ethereum die einzige Proof-of-Stake-Blockchain? {#is-ethereum-the-only-pos-blockchain} -Nein, es gibt mehrere Proof-of-Stake-Blockchains. Keiner ist identisch mit Ethereum; der Proof-of-Stake-Mechanismus von Ethereum ist einzigartig. +Nein, es gibt mehrere Proof-of-Stake-Blockchains. Keine ist identisch mit Ethereum; der Proof-of-Stake-Mechanismus von Ethereum ist einzigartig. ## Was ist The Merge? {#what-is-the-merge} -The Merge war der Moment, als für Ethereum der auf Proof-of-Work basierende Konsensmechanismus abgeschaltet und der auf Proof-of-Stake basierende Konsensmechanismus eingeschaltet wurde. The Merge wurde am 15. September 2022 durchgeführt. +The Merge war der Moment, in dem Ethereum seinen auf Proof-of-Work basierenden Konsensmechanismus abschaltete und seinen auf Proof-of-Stake basierenden Konsensmechanismus einschaltete. The Merge fand am 15. September 2022 statt. -[Mehr zum Zusammenschluss](/roadmap/merge) +[Mehr zu The Merge](/roadmap/merge) -## Was sind Liveness und Sicherheit? {#what-are-liveness-and-safety} +## Was sind Lebendigkeit (Liveness) und Sicherheit (Safety)? {#what-are-liveness-and-safety} -Liveness und Sicherheit sind die beiden fundamentalen Sicherheitsbedenken einer Blockchain. Liveness ist die Verfügbarkeit einer finalisierenden Chain. Wenn die Chain aufhört, sich zu finalisieren, oder Benutzer nicht mehr einfach auf sie zugreifen können, heißt das Livesness-Versagen. Extrem hohe Zugangskosten könnten auch als Livesness-Versagen bezeichnet werden. Die Sicherheit beschreibt, wie schwer es ist, die Chain anzugreifen – d.h. widersprüchliche Checkpoints zu finalisieren. +Lebendigkeit und Sicherheit sind die beiden grundlegenden Sicherheitsaspekte für eine Blockchain. Lebendigkeit ist die Verfügbarkeit einer finalisierenden Chain. Wenn die Chain aufhört zu finalisieren oder Benutzer nicht einfach darauf zugreifen können, handelt es sich um Lebendigkeitsausfälle. Extrem hohe Zugangskosten könnten ebenfalls als Lebendigkeitsausfall betrachtet werden. Sicherheit bezieht sich darauf, wie schwierig es ist, die Chain anzugreifen – d. h. widersprüchliche Checkpoints zu finalisieren. -[Lesen sie mehr dazu im Casper-Artikel](https://arxiv.org/pdf/1710.09437.pdf) +[Mehr dazu im Casper-Paper lesen](https://arxiv.org/pdf/1710.09437.pdf) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md index 08aa993330d..36f5f27be9c 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md @@ -1,52 +1,52 @@ --- title: Gasper -description: Eine Erklärung des Gasper-Proof-of-Stake-Mechanismus. +description: "Eine Erklärung des Gasper-Proof-of-Stake-Mechanismus." lang: de --- -Gasper ist eine Kombination aus Casper the Friendly Finality Gadget („Casper das freundliche Endültigkeitsgadget“, Casper-FFG) und dem LMD-GHOST-Abspaltungs-Wahl-Algorithmus. Zusammen bilden diese Komponenten den Konsensmechanismus zur Sicherung des Proof-of-Stake-Ethereum. Casper ist der Mechanismus, der bestimmte Blöcke auf „fertiggestellt“ aktualisiert, sodass neue Teilnehmer im Netzwerk sicher sein können, dass sie die kanonische Chain synchronisieren. Der Abspaltungs-Wahl-Algorithmus verwendet kumulierte Stimmen, um sicherzustellen, dass Nodes leicht die richtige auswählen können, wenn es zu Abspaltungen in der Blockkette kommt. +Gasper ist eine Kombination aus Casper the Friendly Finality Gadget (Casper-FFG) und dem LMD-GHOST-Fork-Choice-Algorithmus. Zusammen bilden diese Komponenten den Konsensmechanismus, der das Proof-of-Stake-Ethereum sichert. Casper ist der Mechanismus, der bestimmte Blöcke auf „finalisiert“ hochstuft, sodass neue Teilnehmer im Netzwerk sicher sein können, dass sie die kanonische Chain synchronisieren. Der Algorithmus zur Fork-Auswahl verwendet angesammelte Stimmen, um sicherzustellen, dass Blockchain-Knoten leicht den richtigen auswählen können, wenn Forks in der Blockchain auftreten. -**Beachten Sie**, dass die ursprüngliche Definition von Casper-FFG für die Aufnahme in Gasper leicht aktualisiert wurde. Auf dieser Seite berücksichtigen wir die aktualisierte Version. +**Hinweis:** Die ursprüngliche Definition von Casper-FFG wurde für die Aufnahme in Gasper leicht aktualisiert. Auf dieser Seite betrachten wir die aktualisierte Version. ## Voraussetzungen -Um dieses Material zu verstehen, muss die Einführungsseite zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) gelesen werden. +Um dieses Material zu verstehen, ist es notwendig, die Einführungsseite zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) zu lesen. ## Die Rolle von Gasper {#role-of-gasper} -Gasper sitzt an der Spitze einer Proof-of-Stake-Blockchain, für die Nodes Ether als Sicherheitsleistung hinterlegen. Diese kann zerstört werden, wenn sie faul oder unehrlich in der Art und Weise sind, wie sie Blöcke vorschlagen oder validieren. Gasper ist der Mechanismus, der bestimmt, wie Validatoren belohnt und bestraft werden, und entscheidet, welche Blöcke akzeptiert und abgelehnt werden sowie auf welche Abspaltung die Blockchain aufgebaut werden soll. +Gasper baut auf einer Proof-of-Stake-Blockchain auf, bei der Blockchain-Knoten Ether als Sicherheitskaution hinterlegen, die zerstört werden kann, wenn sie beim Vorschlagen oder Validieren von Blöcken faul oder unehrlich sind. Gasper ist der Mechanismus, der definiert, wie Validatoren belohnt und bestraft werden, wie sie entscheiden, welche Blöcke sie akzeptieren und ablehnen, und auf welcher Fork der Blockchain sie aufbauen. -## Was ist Endgültigkeit? {#what-is-finality} +## Was ist Finalität? {#what-is-finality} -Die Endgültigkeit ist eine Eigenschaft bestimmter Blöcke. Sie bedeutet, dass sie nicht rückgängig gemacht werden können, es sei denn, es ist zu einem kritischen Konsensfehler gekommen und ein Angreifer hat mindestens 1/3 des insgesamt eingesetzten Ethers zerstört. Finalisierte Blöcke können als Informationen betrachtet werden, bei denen sich die Blockchain sicher ist. Ein Block muss eine zweistufige Upgradeprozedur durchlaufen, damit ein Block finalisiert werden kann: +Finalität ist eine Eigenschaft bestimmter Blöcke, die bedeutet, dass sie nicht rückgängig gemacht werden können, es sei denn, es gab einen kritischen Konsensfehler und ein Angreifer hat mindestens 1/3 des gesamten als Einsatz hinterlegten Ethers zerstört. Finalisierte Blöcke können als Informationen betrachtet werden, über die sich die Blockchain sicher ist. Ein Block muss ein zweistufiges Hochstufungsverfahren durchlaufen, um finalisiert zu werden: -1. Zwei Drittel des insgesamt eingesetzten Ethers müssen für die Einbeziehung dieses Blocks in die kanonische Chain gestimmt haben. Diese Bedingung aktualisiert den Block auf „berechtigt“. Es ist unwahrscheinlich, dass berechtigte Blöcke rückgängig gemacht werden. Das ist aber unter bestimmten Bedingungen möglich. -2. Wenn neben einem berechtigten Block noch ein anderer Block berechtigt ist, wird er auf „finalisiert“ aktualisiert. Die Finalisierung eines Blocks ist dahingehend ein Commitment, den Block in die kanonische Chain aufzunehmen. Sie kann nicht rückgängig gemacht werden, es sei denn, ein Angreifer zerstört Millionen Ether (Milliarden von $USD). +1. Zwei Drittel des gesamten als Einsatz hinterlegten Ethers müssen für die Aufnahme dieses Blocks in die kanonische Chain gestimmt haben. Diese Bedingung stuft den Block auf „gerechtfertigt“ (justified) hoch. Gerechtfertigte Blöcke werden wahrscheinlich nicht rückgängig gemacht, können es aber unter bestimmten Bedingungen werden. +2. Wenn ein weiterer Block auf einem gerechtfertigten Block gerechtfertigt wird, wird er auf „finalisiert“ hochgestuft. Die Finalisierung eines Blocks ist eine Verpflichtung, den Block in die kanonische Chain aufzunehmen. Er kann nicht rückgängig gemacht werden, es sei denn, ein Angreifer zerstört Millionen von Ether (Milliarden von USD). -Diese Block-Upgrades werden nicht in jedem Slot vorgenommen. Stattdessen können nur epochal begrenzte Blöcke berechtigt und finalisiert werden. Diese Blöcke werden als „Checkpoints“ bezeichnet. Die Aktualisierung berücksichtigt Paare von Checkpoints. Eine „Supermajority-Verbindung“ muss zwischen zwei aufeinander folgenden Checkpoints existieren (z. B. zwei Drittel der insgesamt eingesetzten Ether stimmen dafür ab, dass Checkpoint B der richtige Nachfahr von Checkpoint A ist), damit der weniger aktuelle Checkpoint auf „Finalisiert“ und der neuere Block auf „Berechtigt“ aktualisiert werden kann. +Diese Block-Hochstufungen finden nicht in jedem Slot statt. Stattdessen können nur Blöcke an Epochengrenzen gerechtfertigt und finalisiert werden. Diese Blöcke sind als „Checkpoints“ bekannt. Die Hochstufung berücksichtigt Paare von Checkpoints. Es muss eine „Supermajority-Verbindung“ (Zweidrittelmehrheit) zwischen zwei aufeinanderfolgenden Checkpoints bestehen (d. h. zwei Drittel des gesamten als Einsatz hinterlegten Ethers stimmen dafür, dass Checkpoint B der korrekte Nachkomme von Checkpoint A ist), um den älteren Checkpoint auf finalisiert und den neueren Block auf gerechtfertigt hochzustufen. -Da für die Endgültigkeit eine 2/3 Mehrheit erforderlich ist, die sich einig ist, dass ein Block kanonisch ist, kann ein Angreifer niemals eine alternative finalisierte Chain erstellen, ohne: +Da die Finalität eine Zweidrittel-Zustimmung erfordert, dass ein Block kanonisch ist, kann ein Angreifer unmöglich eine alternative finalisierte Chain erstellen, ohne: -1. 2/3 des gesamten eingesetzten Ethers zu besitzen oder zu manipulieren. -2. mindestens 1/3 des gesamten eingesetzten Ethers zu zerstören. +1. Zwei Drittel des gesamten als Einsatz hinterlegten Ethers zu besitzen oder zu manipulieren. +2. Mindestens ein Drittel des gesamten als Einsatz hinterlegten Ethers zu zerstören. -Die erste Bedingung kommt dadurch auf, dass mindestens 2/3 des eingesetzten Ethers benötigt wird, um eine Chain zu finalisieren. Die zweite Bedingung kommt aus dem folgenden Grund auf: Wenn 2/3 des gesamten Stakes für beide Abspaltungen gestimmt hat, muss mindestens 1/3 für beide gestimmt haben. Doppeltes Abstimmen ist eine Bedingung für Slashing und würde maximal bestraft werden. In diesem Fall würde 1/3 des gesamten Stakes zerstört werden. Nach Stand vom Mai 2022 müsste ein Angreifer hierfür Ether im Wert von ungefähr 10 Mrd. $ verbrennen. Der Algorithmus, der Blöcke in Gasper berechtigt und finalisiert, ist eine leicht modifizierte Form von [Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf). +Die erste Bedingung entsteht, weil zwei Drittel des als Einsatz hinterlegten Ethers erforderlich sind, um eine Chain zu finalisieren. Die zweite Bedingung entsteht, weil, wenn zwei Drittel des gesamten Einsatzes für beide Forks gestimmt haben, ein Drittel für beide gestimmt haben muss. Doppeltes Abstimmen ist eine Slashing-Bedingung, die maximal bestraft würde, und ein Drittel des gesamten Einsatzes würde zerstört werden. Stand Mai 2022 erfordert dies, dass ein Angreifer Ether im Wert von etwa 10 Milliarden USD verbrennt. Der Algorithmus, der Blöcke in Gasper rechtfertigt und finalisiert, ist eine leicht modifizierte Form von [Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf). ### Anreize und Slashing {#incentives-and-slashing} -Validatoren werden für das ehrliche Vorschlagen und Validieren von Blöcken belohnt. Sie erhalten Ether als Belohnung, die zu ihrem Stake hinzugefügt werden. Andererseits entgehen den Validatoren, die abwesend sind und nicht handeln, wenn sie dazu aufgefordert werden, diese Belohnungen und sie verlieren manchmal einen kleinen Teil ihres bestehenden Stakes. Jedoch sind die Strafen dafür, offline zu bleiben, gering und belaufen sich in den meisten Fällen auf die Opportunitätskosten für die Belohnungen, die den Benutzern entgehen. Es gibt aber auch einige von Validatoren ausgeführte Aktionen, die sehr schwer versehentlich durchzuführen sind und auf eine böswillige Absicht hindeuten. Dazu gehört etwa, wenn mehrere Blöcke für denselben Slot vorgeschlagen werden, mehrere Blöcke für denselben Slot attestiert werden oder früheren Checkpoint-Stimmen wiedersprochen wird. Das sind Verhaltensweisen, die mit Slashing und damit etwas härter bestraft werden könen – das Slashing führt dazu, dass ein Teil des Stakes eines Validatoren zerstört wird und er vom Validatorennetzwerk entfernt wird. Dieser Prozess dauert 36 Tage. An Tag 1 wird eine Anfangsstrafe von bis zu 1 ETH erhoben. Dann geht die Anzahl der Ether des mit Slashing sanktionierten Validatoren über den gesamten Zeitraum des Ausstiegs langsam zurück. An Tag 18 erhalten sie allerdings eine „Korrelationsstrafe“, die größer ist, wenn mehrere Validatoren zur gleichen Zeit mit Slashing bestraft werden. Die Maximalstrafe ist der gesamte Stake. Diese Belohnungen und Bestrafungen sind als Anreiz für ehrliche Validatoren und als Abschreckung vor Angriffen auf das Netzwerk konzipiert. +Validatoren werden für das ehrliche Vorschlagen und Validieren von Blöcken belohnt. Ether wird als Belohnung ausgeschüttet und ihrem Einsatz hinzugefügt. Andererseits verpassen Validatoren, die abwesend sind und nicht handeln, wenn sie aufgerufen werden, diese Belohnungen und verlieren manchmal einen kleinen Teil ihres bestehenden Einsatzes. Die Strafen für das Offline-Sein sind jedoch gering und belaufen sich in den meisten Fällen auf Opportunitätskosten durch entgangene Belohnungen. Einige Aktionen von Validatoren sind jedoch sehr schwer versehentlich durchzuführen und deuten auf eine böswillige Absicht hin, wie z. B. das Vorschlagen mehrerer Blöcke für denselben Slot, das Abgeben von Bestätigungen für mehrere Blöcke für denselben Slot oder das Widersprechen früherer Checkpoint-Abstimmungen. Dies sind Verhaltensweisen, die zu einem „Slashing“ führen können und härter bestraft werden – Slashing führt dazu, dass ein Teil des Einsatzes des Validators zerstört wird und der Validator aus dem Netzwerk der Validatoren entfernt wird. Dieser Prozess dauert 36 Tage. An Tag 1 gibt es eine anfängliche Strafe von bis zu 1 ETH. Dann fließt der Ether des geslashten Validators über die Austrittsperiode langsam ab, aber an Tag 18 erhält er eine „Korrelationsstrafe“, die größer ist, wenn mehr Validatoren etwa zur gleichen Zeit geslasht werden. Die Höchststrafe ist der gesamte Einsatz. Diese Belohnungen und Strafen sollen ehrliche Validatoren anreizen und Angriffe auf das Netzwerk abschrecken. -### Inactivity Leak {#inactivity-leak} +### Inaktivitätsleck {#inactivity-leak} -Zusätzlich zur Sicherheit bietet Gasper auch „plausible Liveness“. Dies beschreibt den Zustand, dass die Chain unabhängig von anderen Aktivitäten (wie Angriffen, Latenzproblemen oder Slashings) finalisiert werden kann, solange zwei Drittel der insgesamt eingesetzten Ether ehrlich und gemäß dem Protokoll abstimmen. Um es anders auszudrücken: Ein Drittel der gesamten eingesetzten Ether müssen auf irgendeine Weise kompromittiert sein, damit die Chain nicht finalisiert. In Gasper gibt es eine zusätzliche Verteidigungslinie gegen ein Versagen der Liveness, bekannt als „Inactivity Leak“. Dieser Mechanismus tritt in Kraft, wenn die Chain mehr als vier Epochen lang nicht finalisiert werde konnte. Den Validatoren, die nicht aktiv für die Mehrheits-Chan attestieren, wird ihr allmählich Stake entzogen, bis die Mehrheit wieder über zwei Drittel des gesamten Stakes verfügt. Auf diese Weise wird sichergestellt, dass ein Liveness-Vesagen nur vorübergehend ist. +Neben der Sicherheit bietet Gasper auch „plausible Liveness“ (plausible Lebendigkeit). Dies ist die Bedingung, dass, solange zwei Drittel des gesamten als Einsatz hinterlegten Ethers ehrlich abstimmen und dem Protokoll folgen, die Chain unabhängig von anderen Aktivitäten (wie Angriffen, Latenzproblemen oder Slashings) finalisieren kann. Anders ausgedrückt: Ein Drittel des gesamten als Einsatz hinterlegten Ethers muss irgendwie kompromittiert sein, um zu verhindern, dass die Chain finalisiert. In Gasper gibt es eine zusätzliche Verteidigungslinie gegen einen Liveness-Ausfall, bekannt als das „Inaktivitätsleck“ (Inactivity Leak). Dieser Mechanismus wird aktiviert, wenn die Chain für mehr als vier Epochen nicht finalisiert werden konnte. Den Validatoren, die nicht aktiv Bestätigungen für die Mehrheits-Chain abgeben, wird ihr Einsatz nach und nach entzogen, bis die Mehrheit wieder zwei Drittel des gesamten Einsatzes erreicht, wodurch sichergestellt wird, dass Liveness-Ausfälle nur vorübergehend sind. -### Abspaltung-Wahl {#fork-choice} +### Fork-Auswahl {#fork-choice} -Die ursprüngliche Definition von Casper-FFG enthielt einen Abspaltungs-Wahl-Algorithmus, der die folgende Regel auferlegte: `Folge der Chain, die den berechtigten Checkpoint mit der größten Höhe` enthält, wobei die Höhe als der größte Abstand zum Genesis-Block definiert ist. In Gasper wird die ursprüngliche Regel für die Wahl der Abspaltung zugunsten eines ausgefeilteren Algorithmus namens LMD-GHOST ersetzt. Es ist wichtig, zu erkennen, dass unter normalen Bedingungen eine Regel für die Wahl der Abspaltung unnötig ist – es gibt einen einzigen Block-Proposer für jeden Slot und ehrliche Validatoren, die das attestieren. Nur in Fällen von Asynchronität großer Netzwerke oder bei mehrdeutigen Handlungen eines unehrlichen Block-Proposer wird der Abspaltungs-Wahl-Algorithmus benötigt. Wenn solche Fälle jedoch eintreten, ist der Abspaltungs-Wahl-Algorithmus ein entscheidender Schutzmechanismus zur Sicherung der korrekten Chain. +Die ursprüngliche Definition von Casper-FFG enthielt einen Fork-Choice-Algorithmus, der die Regel auferlegte: `follow the chain containing the justified checkpoint that has the greatest height` (folge der Chain, die den gerechtfertigten Checkpoint mit der größten Höhe enthält), wobei die Höhe als die größte Entfernung vom Genesis-Block definiert ist. In Gasper ist die ursprüngliche Fork-Choice-Regel zugunsten eines ausgefeilteren Algorithmus namens LMD-GHOST veraltet. Es ist wichtig zu erkennen, dass unter normalen Bedingungen eine Fork-Choice-Regel unnötig ist – es gibt einen einzigen Block-Vorschlagenden für jeden Slot, und ehrliche Validatoren bestätigen ihn. Nur in Fällen großer Netzwerk-Asynchronität oder wenn ein unehrlicher Block-Vorschlagender zweideutig gehandelt hat, ist ein Fork-Choice-Algorithmus erforderlich. Wenn diese Fälle jedoch eintreten, ist der Fork-Choice-Algorithmus eine kritische Verteidigung, die die korrekte Chain sichert. -LMD-GHOST steht für „latest message-driven greedy heaviest observed sub-tree“ oder auf Deutsch „neuester, nachrichtengesteuerter, gieriger und schwerster beobachteter Unterbaum“. Hierbei handelt es sich um eine fachsprachenlastige Definition für einen Algorithmus, der die Abspaltung mit dem höchsten Gesamtgewicht an Attestierungen als die kanonische auswählt („greedy heaviest subtree“ oder auf Deutsch „gieriger, schwerster Unterbaum“) und sicherstellt, dass bei mehreren Nachrichten von einem Validator nur die neueste berücksichtigt wird („latest-message driven“ oder auf Deutsch „neuester, nachrichtengesteuerter“). Bevor ein Validator den schwersten Block zu seiner kanonischen Chain hinzufügt, bewertet er jeden Block anhand dieser Regel. +LMD-GHOST steht für „latest message-driven greedy heaviest observed sub-tree“. Dies ist eine sehr fachspezifische Art, einen Algorithmus zu definieren, der die Fork mit dem größten angesammelten Gewicht an Bestätigungen als die kanonische auswählt (greedy heaviest subtree) und bei dem, wenn mehrere Nachrichten von einem Validator empfangen werden, nur die neueste berücksichtigt wird (latest-message driven). Bevor der schwerste Block zu seiner kanonischen Chain hinzugefügt wird, bewertet jeder Validator jeden Block anhand dieser Regel. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Gasper: Die Kombination aus GHOST und Kasper](https://arxiv.org/pdf/2003.03052.pdf) -- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf) +- [Gasper: Combining GHOST and Casper](https://arxiv.org/pdf/2003.03052.pdf) +- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md index a538aef6416..91982682463 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md @@ -1,99 +1,99 @@ --- title: Proof-of-Stake (PoS) -description: Eine Erklärung des Proof-of-Stake-Konsensprotokolls und seiner Rolle in Ethereum. +description: "Eine Erklärung des Proof-of-Stake-Konsensprotokolls und seiner Rolle bei Ethereum." lang: de --- -Proof-of-Stake (PoS) ist die Basis für Ethereums [Konsensmechanismus](/developers/docs/consensus-mechanisms/). Ethereum wechselte 2022 zum Proof-of-Stake-Mechanismus, da dieser sicherer und weniger energieintensiv ist sowie sich besser für die Implementierung neuer Skalierungslösungen eignet als die frühere [Proof-of-Work](/developers/docs/consensus-mechanisms/pow)-Architektur. +Proof-of-Stake (PoS) liegt dem [Konsensmechanismus](/developers/docs/consensus-mechanisms/) von Ethereum zugrunde. Ethereum hat seinen Proof-of-Stake-Mechanismus im Jahr 2022 aktiviert, da er im Vergleich zur vorherigen [Proof-of-Work](/developers/docs/consensus-mechanisms/pow)-Architektur sicherer, weniger energieintensiv und besser für die Implementierung neuer Skalierungslösungen geeignet ist. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst einen Blick auf [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu werfen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu informieren. ## Was ist Proof-of-Stake (PoS)? {#what-is-pos} -Proof-of-Stake ist eine Methode, mit der nachgewiesen wird, dass Validatoren einen gewissen Wert in das Netzwerk eingebracht haben, der zerstört werden kann, wenn sie unehrlich handeln. Im Proof-of-Stake-Verfahren auf Ethereum setzen die Validatoren explizit Kapital ein, und zwar in Form von ETH in einen Smart Contract. Es ist dann die Aufgabe des Validatoren, zu prüfen, ob neue Blöcke, die über das Netzwerk propagiert wurden, gültig sind. Die Validatoren sind auch dafür verantwortlich, gelegentlich selbst neue Blöcke zu erstellen und über das Netzwerk zu propagieren. Wenn sie versuchen, das System zu täuschen (beispielsweise durch das Vorschlagen mehrerer Blöcke, wenn sie nur einen versenden sollen, oder das Abgeben widersprüchlicher Attestierungen) könnten Teile oder alle ETH, die sie als Kapital eingesetzt haben, zerstört werden. +Proof-of-Stake ist eine Möglichkeit zu beweisen, dass Validatoren etwas von Wert in das Netzwerk eingebracht haben, das zerstört werden kann, wenn sie unehrlich handeln. Beim Proof-of-Stake von [Ethereum](/) hinterlegen Validatoren explizit Kapital in Form von ETH in einem Smart Contract auf Ethereum (Staking). Der Validator ist dann dafür verantwortlich zu überprüfen, ob neue Blöcke, die über das Netzwerk verbreitet werden, gültig sind, und gelegentlich selbst neue Blöcke zu erstellen und zu verbreiten. Wenn sie versuchen, das Netzwerk zu betrügen (zum Beispiel, indem sie mehrere Blöcke vorschlagen, wenn sie nur einen senden sollten, oder widersprüchliche Bestätigungen senden), kann ein Teil oder ihr gesamtes gestaktes ETH zerstört werden. ## Validatoren {#validators} -Um als Validator teilzunehmen, muss ein Nutzer 32 ETH im Einzahlungsvertrag hinterlegen und drei separate Softwarekomponenten ausführen: einen Ausführungs-Client, einen Konsens-Client und einen Validator-Client. Wenn der Nutzer seine ETH hinterlegt, tritt er in eine Aktivierungswarteschlange ein, die die Anzahl neuer Validatoren begrenzt, die dem Netzwerk beitreten. Nach der Aktivierung erhalten Validatoren neue Blöcke von Peers im Ethereum-Netzwerk. Die im Block enthaltenen Transaktionen werden erneut ausgeführt, um zu prüfen, ob die vorgeschlagenen Änderungen am Ethereum-Status gültig sind. Zusätzlich dazu erfolgt die Überprüfung der Blocksignatur. Der Validator versendet dann ein Votum (genannt Attestierung) zugunsten dieses Blocks über das Netzwerk. +Um als Validator teilzunehmen, muss ein Benutzer 32 ETH in den Einzahlungsvertrag einzahlen und drei separate Softwarekomponenten ausführen: einen Ausführungs-Client, einen Konsens-Client und einen Validator-Client. Nach der Einzahlung ihrer ETH reiht sich der Benutzer in eine Aktivierungswarteschlange ein, die die Rate neuer Validatoren begrenzt, die dem Netzwerk beitreten. Sobald sie aktiviert sind, erhalten Validatoren neue Blöcke von Peers im Ethereum-Netzwerk. Die im Block gelieferten Transaktionen werden erneut ausgeführt, um zu überprüfen, ob die vorgeschlagenen Änderungen am Zustand von Ethereum gültig sind, und die Block-Signatur wird überprüft. Der Validator sendet dann eine Stimme (eine sogenannte Bestätigung) zugunsten dieses Blocks über das Netzwerk. -Bei Proof-of-Work war das Timing der Blocks durch die Schwierigkeit des Minings bestimmt. Bei Proof-of-Work ist das Tempo hingegen festgelegt. Die Zeit wird bei Proof-of-Stake-Ethereum in Slots (12 Sekunden) und Epochen (32 Slots) unterteilt. Ein Validator wird in jedem Slot zufällig für das Vorschlagen eines Blocks ausgewählt. Es ist die Aufgabe dieses Validators, einen neuen Block zu erstellen und ihn an andere Nodes im Netzwerk zu versenden. In jedem Slot wird außerdem zufällig ein Komitee aus Validatoren ausgewählt, das per Abstimmung über die Gültigkeit des vorgeschlagenen Blocks entscheidet. Die Aufteilung des Validatoren-Sets in Komitees ist wichtig, um die Netzwerkbelastung in einem kontrollierbaren Rahmen zu halten. Die Komitees teilen das Validatoren-Team so auf, dass jeder aktive Validator in jeder Epoche Attestierungen abgibt, jedoch nicht in jedem Slot. +Während beim Proof-of-Work das Timing der Blöcke durch die Mining-Schwierigkeit bestimmt wird, ist das Tempo beim Proof-of-Stake festgelegt. Die Zeit im Proof-of-Stake-Ethereum ist in Slots (12 Sekunden) und Epochen (32 Slots) unterteilt. In jedem Slot wird zufällig ein Validator als Block-Vorschlagender ausgewählt. Dieser Validator ist dafür verantwortlich, einen neuen Block zu erstellen und ihn an andere Blockchain-Knoten im Netzwerk zu senden. Ebenfalls in jedem Slot wird zufällig ein Komitee von Validatoren ausgewählt, deren Stimmen verwendet werden, um die Gültigkeit des vorgeschlagenen Blocks zu bestimmen. Die Aufteilung der Validatoren in Komitees ist wichtig, um die Netzwerklast überschaubar zu halten. Komitees teilen die Validatoren so auf, dass jeder aktive Validator in jeder Epoche Bestätigungen abgibt, aber nicht in jedem Slot. -## Wie eine Transaktion auf Ethereum PoS ausgeführt wird {#transaction-execution-ethereum-pos} +## Wie eine Transaktion im Ethereum-PoS ausgeführt wird {#transaction-execution-ethereum-pos} -Der folgende Abschnitt enthält eine End-to-End-Erklärung, wie eine Transaktion auf Ethereum Proof of Stake ausgeführt wird. +Im Folgenden wird durchgehend erklärt, wie eine Transaktion im Proof-of-Stake von Ethereum ausgeführt wird. -1. Ein Nutzer erstellt und signiert eine [Transaktion](/developers/docs/transactions/) mit seinem privaten Schlüssel. Dies wird üblicherweise durch eine Wallet oder eine Bibliothek wie [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) usw. verarbeitet, aber im Hintergrund stellt der Anwender mithilfe der [JSON-RPC-API](/developers/docs/apis/json-rpc/) von Ethereum eine Anfrage an einen Knoten. Der Nutzer setzte die Menge an Gas fest, die er als Trinkgeld an den Validator abgeben würde, um ihn dazu anzuregen, die Transaktion in einen Block aufzunehmen. Das [Trinkgeld](/developers/docs/gas/#priority-fee) wird an den Validator gezahlt, wohingegen die [Basisgebühr](/developers/docs/gas/#base-fee) verbrannt wird. -2. Die Transaktion wird an einen Ethereum [Ausführungsclient](/developers/docs/nodes-and-clients/#execution-client) übermittelt, der deren Gültigkeit verifiziert. Das bedeutet, sicherzustellen, dass der Sender über genügend ETH verfügt, um die Transaktion zu erfüllen, und dass er sie mit dem richtigen Schlüssel signiert hat. -3. Wenn die Transaktion gültig ist, fügt der Ausführungsclient sie seinem lokalen Mempool (Liste der ausstehenden Transaktionen) hinzu und versendet sie über die Ausführungsebene im Gossip-Netzwerk an andere Nodes. Wenn andere Nodes von der Transaktion erfahren, fügen sie sie ebenfalls ihrem lokalen Mempool hinzu. Erfahrene Nutzer könnten davon absehen, ihre Transaktionen zu versenden, und sie stattdessen an spezialisierte Blockersteller weiterleiten, wie z. B. die [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview). Dies ermöglicht es Ihnen, die Transaktionen in kommenden Blöcken so zu organisieren, dass maximaler Profit ([MEV](/developers/docs/mev/#mev-extraction)) erzielt wird. -4. Einer der Validatoren-Nodes im Netzwerk ist der Block-Proposer für den aktuellen Slot, der zuvor mittels RANDAO pseudozufällig ausgewählt wurde. Dieser Node ist dafür verantwortlich, den nächsten Block zu erstellen und zu übertragen, der zur Ethereum-Blockchain hinzugefügt wird, und dafür, den globalen Status zu aktualisieren. Der Node setzt sich aus drei Teilen zusammen: einem Ausführungsclient, einem Konsensclient und einem Validatorenclient. Der Ausführungsclient bündelt Transaktionen aus dem lokalen Mempool zu einer „Ausführungsnutzlast“ und führt sie lokal aus, um eine Zustandsänderung herbeizuführen. Diese Informationen werden an den Konsensclient weitergeleitet, wo die Ausführungsnutzlast als Teil eines „Beacon-Blocks“ verpackt wird, der auch Informationen über Belohnungen, Strafen, Slashings, Attestierungen usw. enthält, die es dem Netzwerk ermöglichen, sich auf die Reihenfolge der Blöcke an der Spitze der Chain zu einigen. Die Kommunikation zwischen den Ausführungs- und Konsensclients wird in [Konsens- und Ausführungsclients miteinander verbinden](/developers/docs/networking-layer/#connecting-clients) näher beschrieben. -5. Andere Nodes empfangen den neuen Beacon-Block über das Gossip-Netzwerk auf der Konsensebene. Sie leiten ihn an ihren Ausführungs-Client weiter, wo die Transaktionen erneut lokal ausgeführt werden, um sicherzustellen, dass die vorgeschlagene Zustandsänderung gültig ist. Der Validator-Client attestiert dann die Gültigkeit des Blocks und dass er den logisch nächsten Block in seiner Sicht auf die Chain darstellt (d. h. er baut auf der Chain mit dem größten Gewicht an Attestierungen auf, o wie es in den [Abspaltungs-Wahl-Regeln](/developers/docs/consensus-mechanisms/pos/#fork-choice) definiert ist). Der Block wird zur lokalen Datenbank in jedem Node hinzugefügt, der ihn attestiert. -6. Eine Transaktion kann als „finalisiert“ angesehen werden, wenn sie Teil einer Chain geworden ist, wobei zwischen zwei Checkpoints eine „Supermajority-Verbindung“ besteht. Zu Checkpoints kommt es zu Beginn jeder Epoche. Sie sollen der Tatsache Rechnung tragen, dass in jedem Slot nur eine bestimmte Teilmenge der aktiven Validatoren Attestierungen abgibt, wohingegen über die gesamte Epoche gesehen alle aktiven Validatoren Attestierungen abgeben. Deshalb kann eine „Supermajority-Verbindung“ nur zwischen Epochen nachgewiesen werden (hier stimmen 66 % der gesamten eingesetzten ETH im Netzwerk über zwei Checkpoints überein). +1. Ein Benutzer erstellt und signiert eine [Transaktion](/developers/docs/transactions/) mit seinem Private-Key. Dies wird normalerweise von einem Wallet oder einer Bibliothek wie [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) usw. gehandhabt, aber unter der Haube stellt der Benutzer eine Anfrage an einen Blockchain-Knoten über die Ethereum-[JSON-RPC-API](/developers/docs/apis/json-rpc/). Der Benutzer definiert die Menge an Gas, die er bereit ist, als Trinkgeld an einen Validator zu zahlen, um ihn zu ermutigen, die Transaktion in einen Block aufzunehmen. Die [Trinkgelder](/developers/docs/gas/#priority-fee) werden an den Validator gezahlt, während die [Grundgebühr](/developers/docs/gas/#base-fee) verbrannt wird. +2. Die Transaktion wird an einen Ethereum-[Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-client) übermittelt, der ihre Gültigkeit überprüft. Dies bedeutet, dass sichergestellt wird, dass der Absender über genügend ETH verfügt, um die Transaktion auszuführen, und dass er sie mit dem richtigen Schlüssel signiert hat. +3. Wenn die Transaktion gültig ist, fügt der Ausführungs-Client sie seinem lokalen Mempool (Liste der ausstehenden Transaktionen) hinzu und überträgt sie auch an andere Blockchain-Knoten über das Gossip-Netzwerk der Ausführungsebene. Wenn andere Blockchain-Knoten von der Transaktion erfahren, fügen sie diese ebenfalls ihrem lokalen Mempool hinzu. Fortgeschrittene Benutzer könnten darauf verzichten, ihre Transaktion zu übertragen, und sie stattdessen an spezialisierte Block-Builder wie [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview) weiterleiten. Dies ermöglicht es ihnen, die Transaktionen in kommenden Blöcken für maximalen Profit zu organisieren ([Maximal extrahierbarer Wert (MEV)](/developers/docs/mev/#mev-extraction)). +4. Einer der Validator-Blockchain-Knoten im Netzwerk ist der Block-Vorschlagende für den aktuellen Slot, nachdem er zuvor pseudozufällig mittels RANDAO ausgewählt wurde. Dieser Blockchain-Knoten ist dafür verantwortlich, den nächsten Block zu erstellen und zu übertragen, der der Ethereum-Blockchain hinzugefügt werden soll, und den globalen Zustand zu aktualisieren. Der Blockchain-Knoten besteht aus drei Teilen: einem Ausführungs-Client, einem Konsens-Client und einem Validator-Client. Der Ausführungs-Client bündelt Transaktionen aus dem lokalen Mempool in eine „Ausführungs-Payload“ und führt sie lokal aus, um eine Zustandsänderung zu generieren. Diese Informationen werden an den Konsens-Client weitergegeben, wo die Ausführungs-Payload als Teil eines „Beacon-Blocks“ verpackt wird, der auch Informationen über Belohnungen, Strafen, Slashing, Bestätigungen usw. enthält, die es dem Netzwerk ermöglichen, sich auf die Reihenfolge der Blöcke an der Spitze der Chain zu einigen. Die Kommunikation zwischen den Ausführungs- und Konsens-Clients wird detaillierter unter [Verbindung der Konsens- und Ausführungs-Clients](/developers/docs/networking-layer/#connecting-clients) beschrieben. +5. Andere Blockchain-Knoten empfangen den neuen Beacon-Block über das Gossip-Netzwerk der Konsensebene. Sie geben ihn an ihren Ausführungs-Client weiter, wo die Transaktionen lokal erneut ausgeführt werden, um sicherzustellen, dass die vorgeschlagene Zustandsänderung gültig ist. Der Validator-Client bestätigt dann, dass der Block gültig ist und aus seiner Sicht der Chain der logische nächste Block ist (was bedeutet, dass er auf der Chain mit dem größten Gewicht an Bestätigungen aufbaut, wie in den [Fork-Choice-Regeln](/developers/docs/consensus-mechanisms/pos/#fork-choice) definiert). Der Block wird der lokalen Datenbank in jedem Blockchain-Knoten hinzugefügt, der ihn bestätigt. +6. Die Transaktion kann als „finalisiert“ betrachtet werden, wenn sie Teil einer Chain mit einer „Supermajority-Verbindung“ zwischen zwei Checkpoints geworden ist. Checkpoints treten zu Beginn jeder Epoche auf und existieren, um der Tatsache Rechnung zu tragen, dass nur eine Teilmenge der aktiven Validatoren in jedem Slot Bestätigungen abgibt, aber alle aktiven Validatoren über jede Epoche hinweg Bestätigungen abgeben. Daher kann eine „Supermajority-Verbindung“ nur zwischen Epochen nachgewiesen werden (hierbei stimmen 66 % des gesamten gestakten ETH im Netzwerk über zwei Checkpoints überein). -Weitere Details zur Endgültigkeit finden Sie unten. +Weitere Details zur Finalität finden Sie unten. -## Endgültigkeit {#finality} +## Finalität {#finality} -Eine Transaktion hat in verteilten Netzwerken „Endgültigkeit“, wenn sie Teil eines Blocks ist, der nicht geändern werden kann, ohne dass eine große Menge ETH verbrannt wird. Auf Proof-of-Stake-Ethereum wird dies mithilfe von „Checkpoint“-Blöcken verwaltet. Der erste Block jeder Epoche ist ein Checkpoint. Validatoren stimmen für Paare von Checkpoints ab, die sie als gültig einstufen. Wenn ein Paar von Checkpoints Stimmen auf sich vereint, die mindestens zwei Drittel der gesamten eingesetzten ETH repräsentieren, werden die Checkpoints aktualisiert. Der aktuellere der beiden (Ziel) wird „berechtigt“. Der frühere der beiden ist bereits berechtigt, da er in der vorherigen Epoche das „Ziel“ war. Jetzt wird er auf „finalisiert“ aktualisiert. +Eine Transaktion hat in verteilte Netzwerken „Finalität“, wenn sie Teil eines Blocks ist, der sich nicht ändern kann, ohne dass eine große Menge an ETH verbrannt wird. Beim Proof-of-Stake-Ethereum wird dies mithilfe von „Checkpoint“-Blöcken verwaltet. Der erste Block in jeder Epoche ist ein Checkpoint. Validatoren stimmen für Paare von Checkpoints ab, die sie für gültig halten. Wenn ein Paar von Checkpoints Stimmen auf sich zieht, die mindestens zwei Drittel des gesamten gestakten ETH repräsentieren, werden die Checkpoints hochgestuft. Der neuere der beiden (Ziel) wird „gerechtfertigt“ (justified). Der frühere der beiden ist bereits gerechtfertigt, da er das „Ziel“ in der vorherigen Epoche war. Nun wird er auf „finalisiert“ hochgestuft. Dieser Prozess der Hochstufung der Checkpoints wird von **[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437)** gehandhabt. Casper-FFG ist ein Block-Finalitäts-Tool für den Konsens. Sobald ein Block finalisiert ist, kann er nicht rückgängig gemacht oder geändert werden, ohne dass ein mehrheitliches Slashing der Staker erfolgt, was es wirtschaftlich unrentabel macht. -Um diesen Vorgang für einen finalisierten Block rückgängig zu machen, müsste ein Angreifer sich dazu bereit erklären, mindestens ein Drittel der Gesamtmenge an eingesetzten ETH zu verlieren. Der genaue Grund dafür wird in diesem [Ethereum Foundation-Blogbeitrag](https://blog.ethereum.org/2016/05/09/on-settlement-finality) erklärt. Da für die Endgültigkeit eine Zwei-Drittel-Mehrheit erforderlich ist, könnte ein Angreifer verhindern, dass das Netzwerk Endgültigkeit erreicht, indem er mit einem Drittel des gesamten Einsatzes abstimmt. Es gibt einen Mechanismus, um sich dagegen zu verteidigen: das [Inactivity Leak](https://eth2book.info/bellatrix/part2/incentives/inactivity). Dieses tritt immer dann in Kraft, wenn die Chain in mehr als vier Epochen nicht finalisiert wird. Das Inactivity Leak entzieht den Validatoren die eingesetzten ETH, die gegen die Mehrheit stimmen, wodurch die Mehrheit wieder eine Zwei-Drittel-Mehrheit erreichen und die Chain finalisieren kann. +Um einen finalisierten Block rückgängig zu machen, müsste ein Angreifer in Kauf nehmen, mindestens ein Drittel des gesamten Angebots an gestaktem ETH zu verlieren. Der genaue Grund dafür wird in diesem [Blogbeitrag der Ethereum Foundation](https://blog.ethereum.org/2016/05/09/on-settlement-finality) erklärt. Da Finalität eine Zweidrittelmehrheit erfordert, könnte ein Angreifer das Netzwerk daran hindern, Finalität zu erreichen, indem er mit einem Drittel des gesamten Einsatzes abstimmt. Es gibt einen Mechanismus, um sich dagegen zu verteidigen: das [Inactivity Leak](https://eth2book.info/bellatrix/part2/incentives/inactivity) (Inaktivitätsleck). Dieses wird aktiviert, wenn die Chain für mehr als vier Epochen nicht finalisiert werden kann. Das Inactivity Leak entzieht den Validatoren, die gegen die Mehrheit stimmen, nach und nach das gestakte ETH, sodass die Mehrheit wieder eine Zweidrittelmehrheit erlangen und die Chain finalisieren kann. ## Kryptoökonomische Sicherheit {#crypto-economic-security} -Das Ausführen eines Validators ist ein Commitment. Vom Validator wird erwartet, dass er ausreichend Hardware und Konnektivität aufrechterhält, um an Blockvalidierung und -vorschlägen teilzunehmen. Im Gegenzug wird der Validator in ETH bezahlt (sein eingesetztes Guthaben erhöht sich). Auf der anderen Seite ergeben sich aus der Teilnahme als Validator auch neue Möglichkeiten für Nutzer, das Netzwerk aus Motiven der persönlichen Vorteilnahme oder Sabotage anzugreifen. Um dies zu verhindern, profitieren Validatoren nicht von ETH-Belohnungen, wenn sie trotz Aufforderung nicht teilnehmen. Außerdem kann ihr bestehender Stake bei unehrlichen Handlungen zerstört werden. Zwei primäre Verhaltensweisen können als unehrlich betrachtet werden: das Vorschlagen mehrerer Blöcke in einem einzelnen Slot (Äquivokation) und das Einreichen widersprüchlicher Attestierungen. +Einen Validator zu betreiben, ist eine Verpflichtung. Es wird erwartet, dass der Validator über ausreichende Hardware und Konnektivität verfügt, um an der Block-Validierung und -Vorschlagung teilzunehmen. Im Gegenzug wird der Validator in ETH bezahlt (sein gestaktes Guthaben steigt). Andererseits eröffnet die Teilnahme als Validator auch neue Wege für Benutzer, das Netzwerk aus persönlichem Gewinnstreben oder zur Sabotage anzugreifen. Um dies zu verhindern, entgehen Validatoren ETH-Belohnungen, wenn sie nicht teilnehmen, wenn sie dazu aufgerufen werden, und ihr bestehender Einsatz kann zerstört werden, wenn sie sich unehrlich verhalten. Zwei primäre Verhaltensweisen können als unehrlich angesehen werden: das Vorschlagen mehrerer Blöcke in einem einzigen Slot (Equivocation) und das Einreichen widersprüchlicher Bestätigungen. -Die Höhe der geslashten ETH hängt davon ab, wie viele Validatoren ungefähr zur gleichen Zeit geslasht werden. Dies wird als [„Korrelationsstrafe“](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty) bezeichnet. Sie kann geringfügig ausfallen (~1 % des Stakes, wenn ein einzelner Validator alleine geslasht wird) oder dazu führen, dass der gesamte Stake des Validators vernichtet wird (bei einem Massen-Slashing-Ereignis). Sie wird zur Hälfte der Zeit einer erzwungenen Austrittsperiode verhängt und beginnt mit einer sofortigen Strafe (bis zu 1 ETH) an Tag 1, setzt sich mit der Korrelationsstrafe an Tag 18 fort und führt schließlich zum Rauswurf aus dem Netzwerk an Tag 36. Sie erhalten täglich geringfügige Strafen für Attestierungen, da sie im Netzwerk präsent sind, aber keine Stimmen abgeben. All das bedeutet, dass ein koordinierter Angriff für den Angreifer sehr teuer wäre. +Die Menge an ETH, die dem Slashing unterliegt, hängt davon ab, wie viele Validatoren etwa zur gleichen Zeit ebenfalls geslasht werden. Dies ist als ["Korrelationsstrafe"](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty) bekannt und kann geringfügig sein (\~1 % Einsatz für einen einzelnen Validator, der alleine geslasht wird) oder dazu führen, dass 100 % des Einsatzes des Validators zerstört werden (Massen-Slashing-Ereignis). Sie wird auf halbem Weg durch eine erzwungene Austrittsperiode verhängt, die mit einer sofortigen Strafe (bis zu 1 ETH) an Tag 1, der Korrelationsstrafe an Tag 18 und schließlich dem Ausschluss aus dem Netzwerk an Tag 36 beginnt. Sie erhalten jeden Tag geringfügige Strafen für fehlende Bestätigungen, weil sie im Netzwerk präsent sind, aber keine Stimmen abgeben. All dies bedeutet, dass ein koordinierter Angriff für den Angreifer sehr kostspielig wäre. -## Auswahl abgeben {#fork-choice} +## Fork-Choice {#fork-choice} -Wenn das Netzwerk optimal und auf ehrliche Weise funktioniert, gibt es immer nur einen neuen Block an der Spitze der Chain und alle Validatoren bestätigen dies durch ihre Attestierungen. Es ist jedoch möglich, dass Validatoren aufgrund der Netzwerklatenz oder mehrdeutiger Aussagen eines Block-Proposers unterschiedliche Ansichten über Spitze der Chain haben. Daher benötigen Konsens-Clients einen Algorithmus, um zu entscheiden, welchen sie bevorzugen sollen. Der für Proof-of-Stake-Ethereum verwendete Algorithmus heißt [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf). Er funktioniert so, dass er die Abspaltung identifiziert, die das größte Gewicht an Attestierungen in ihrer Historie hat. +Wenn das Netzwerk optimal und ehrlich funktioniert, gibt es immer nur einen neuen Block an der Spitze der Chain, und alle Validatoren bestätigen ihn. Es ist jedoch möglich, dass Validatoren aufgrund von Netzwerklatenz oder weil ein Block-Vorschlagender zweideutig gehandelt hat (Equivocation), unterschiedliche Ansichten über die Spitze der Chain haben. Daher benötigen Konsens-Clients einen Algorithmus, um zu entscheiden, welchen sie bevorzugen. Der im Proof-of-Stake-Ethereum verwendete Algorithmus heißt [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf) und funktioniert, indem er den Fork identifiziert, der das größte Gewicht an Bestätigungen in seiner Historie aufweist. ## Proof-of-Stake und Sicherheit {#pos-and-security} -Die Gefahr eines [51 %-Angriffs](https://www.investopedia.com/terms/1/51-attack.asp) besteht genauso unter Proof-of-Stake, wie sie unter Proof-of-Work bestand. Allerdings ist das Risiko für die Angreifer höher. Ein Angreifer müsste über 51 % der eingesetzten ETH verfügen. Er könnte dann seine eigenen Attestierungen einsetzen, um sicherzustellen, dass seine gewünschte Abspaltung diejenige mit den meisten kumulierten Attestierungen ist. Das „Gewicht“ der kumulierten Attestierungen wird von Konsens-Clients verwendet, um die richtige Chain zu bestimmen. Ein Angreifer mit 51 % der eingesetzten ETH hätte also die Möglichkeit, seine Abspaltung zur kanonischen zu machen. Ein Vorteil von Proof-of-Stake gegenüber Proof-of-Work besteht allerdings darin, dass die Community Flexibilität bei der Durchführung einer Gegenattacke hat. Zum Beispiel könnten die ehrlichen Validatoren beschließen, weiterhin auf der Minderheits-Chain aufzubauen und gleichzeitig die Abspaltung des Angreifers zu ignorieren, während sie Apps, Börsen und Pools ermutigen, es ihnen gleichzutun. Sie könnten auch beschließen, den Angreifer gewaltsam aus dem Netzwerk zu entfernen und seine eingesetzten ETH zu vernichten. Diese Maßnahmen stellen starke wirtschaftliche Verteidigungsmechanismen gegen einen 51 %-Angriff dar. +Die Bedrohung durch einen [51-%-Angriff](https://www.investopedia.com/terms/1/51-attack.asp) besteht beim Proof-of-Stake nach wie vor, genau wie beim Proof-of-Work, aber sie ist für die Angreifer noch riskanter. Ein Angreifer bräuchte 51 % des gestakten ETH. Er könnte dann seine eigenen Bestätigungen verwenden, um sicherzustellen, dass sein bevorzugter Fork derjenige mit den meisten angesammelten Bestätigungen ist. Das „Gewicht“ der angesammelten Bestätigungen wird von Konsens-Clients verwendet, um die korrekte Chain zu bestimmen, sodass dieser Angreifer in der Lage wäre, seinen Fork zum kanonischen zu machen. Eine Stärke von Proof-of-Stake gegenüber Proof-of-Work ist jedoch, dass die Community Flexibilität bei der Durchführung eines Gegenangriffs hat. Zum Beispiel könnten die ehrlichen Validatoren beschließen, weiter auf der Minderheits-Chain aufzubauen und den Fork des Angreifers zu ignorieren, während sie Apps, Börsen und Pools ermutigen, dasselbe zu tun. Sie könnten auch beschließen, den Angreifer gewaltsam aus dem Netzwerk zu entfernen und sein gestaktes ETH zu zerstören. Dies sind starke wirtschaftliche Verteidigungen gegen einen 51-%-Angriff. -Neben 51 %-Angriffen könnten böswillige Akteure auch versuchen, andere Arten von schädlichen Aktivitäten durchzuführen, wie zum Beispiel: +Über 51-%-Angriffe hinaus könnten böswillige Akteure auch andere Arten von bösartigen Aktivitäten versuchen, wie zum Beispiel: -- Langstreckenangriffe (obwohl das Endgültigkeits-Gadget diesen Angriffsvektor neutralisiert) -- Kurzstrecken-'Reorgs' (werden durch Proposer-Boosting und Fristen für Attestierungen abgeschwächt) -- Bouncing- und Balancing-Angriffe (ebenfalls durch das Proposer-Boosting abgeschwächt; diese Angriffe wurden ohnehin nur unter idealisierten Netzwerkbedingungen demonstriert) -- Lawinenangriffe (neutralisiert durch die Regel des Abspaltungs-Wahl-Algorithmus, die besagt, dass nur die neueste Nachricht berücksichtigt wird) +- Long-Range-Angriffe (obwohl das Finalitäts-Gadget diesen Angriffsvektor neutralisiert) +- Short-Range-„Reorgs“ (obwohl Proposer-Boosting und Fristen für Bestätigungen dies abschwächen) +- Bouncing- und Balancing-Angriffe (ebenfalls durch Proposer-Boosting abgeschwächt, und diese Angriffe wurden ohnehin nur unter idealisierten Netzwerkbedingungen demonstriert) +- Avalanche-Angriffe (neutralisiert durch die Regel der Fork-Choice-Algorithmen, nur die neueste Nachricht zu berücksichtigen) -Es hat sich insgesamt gezeigt, dass Proof-of-Stake, wie es auf Ethereum implementiert ist, wirtschaftlich sicherer ist als Proof-of-Work. +Insgesamt hat sich gezeigt, dass Proof-of-Stake, wie es auf Ethereum implementiert ist, wirtschaftlich sicherer ist als Proof-of-Work. ## Vor- und Nachteile {#pros-and-cons} -| Vorteile | Nachteile | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| Das Staking erleichtert es Einzelpersonen, an der Sicherung des Netzwerks teilzuhaben, und fördert damit die Dezentralisierung. Validator-Node kann auf einem normalen Laptop ausgeführt werden. Staking Pools ermöglichen es Benutzern, Kapital einzusetzen, auch wenn sie nicht über 32 ETH verfügen. | Proof-of-Stake ist neuer und es liegt weniger Betriebserfahrung vor als bei Proof-of-Work | -| Staking ist stärker dezentralisiert. Skaleneffekte gelten beim Staking nicht in dem gleichen Maße wie beim Proof-of-Work-Mining. | Die Implementierung von Proof-of-Stake ist schwieriger als bei Proof-of-Work | -| Proof-of-Stake bietet mehr kryptoökonomische Sicherheit als Proof-of-Work | Benutzer müssen drei Komponenten von Software ausführen um an Ethereums Proof-of-Stake teilhaben zu können. | -| Weniger neue ETH müssen ausgegeben werden, um Anreize für Netzwerkteilnehmer zu schaffen | | +| Vorteile | Nachteile | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| Staking macht es für Einzelpersonen einfacher, sich an der Sicherung des Netzwerks zu beteiligen, was die Dezentralisierung fördert. Ein Validator-Blockchain-Knoten kann auf einem normalen Laptop ausgeführt werden. Staking-Pools ermöglichen es Benutzern, Staking zu betreiben, ohne 32 ETH zu besitzen. | Proof-of-Stake ist jünger und im Vergleich zu Proof-of-Work weniger praxiserprobt. | +| Staking ist dezentralisierter. Skaleneffekte gelten nicht in der gleichen Weise wie beim PoW-Mining. | Proof-of-Stake ist komplexer zu implementieren als Proof-of-Work. | +| Proof-of-Stake bietet eine größere kryptoökonomische Sicherheit als Proof-of-Work. | Benutzer müssen drei Softwarekomponenten ausführen, um am Proof-of-Stake von Ethereum teilzunehmen. | +| Es ist weniger Emission von neuem ETH erforderlich, um Netzwerkteilnehmer zu motivieren. | | ### Vergleich mit Proof-of-Work {#comparison-to-proof-of-work} -Ethereum nutzte ursprünglich Proof-of-Work, wechselte jedoch im September 2022 zu Proof-of-Stake. PoS bietet zahlreiche Vorteile gegenüber PoW, wie zum Beispiel: +Ethereum verwendete ursprünglich Proof-of-Work, wechselte aber im September 2022 zu Proof-of-Stake. PoS bietet mehrere Vorteile gegenüber PoW, wie zum Beispiel: -- bessere Energieeffizienz – es besteht keine Notwendigkeit, viel Energie für Proof-of-Work-Berechnungen aufzuwenden -- niedrigere Eintrittshürden, reduzierte Hardwareanforderungen – es besteht für Benutzer keine Notwendigkeit für Elite-Hardware, damit sie eine Chance haben, neuen Blöcke zu erstellen -- reduziertes Zentralisierungsrisiko – Proof-of-Stake sollte zu mehr Nodes führen, die das Netzwerk sichern -- aufgrund des niedrigen Energiebedarfs ist eine geringere ETH-Ausgabe erforderlich, um Anreize für die Teilnahme zu schaffen -- wirtschaftliche Strafen für Fehlverhalten machen 51 %-Stil-Angriffe für einen Angreifer im Vergleich zu Proof-of-Work kostspieliger -- die Community kann auf die „soziale Wiederherstellung“ einer ehrlichen Chain zurückgreifen, falls ein 51 %-Angriff die kryptoökonomischen Abwehrmechanismen überwinden sollte. +- bessere Energieeffizienz – es ist nicht nötig, viel Energie für Proof-of-Work-Berechnungen aufzuwenden +- niedrigere Eintrittsbarrieren, reduzierte Hardwareanforderungen – es ist keine Elite-Hardware erforderlich, um eine Chance zu haben, neue Blöcke zu erstellen +- reduziertes Zentralisierungsrisiko – Proof-of-Stake sollte dazu führen, dass mehr Blockchain-Knoten das Netzwerk sichern +- aufgrund des geringen Energiebedarfs ist weniger ETH-Emission erforderlich, um die Teilnahme zu motivieren +- wirtschaftliche Strafen für Fehlverhalten machen Angriffe im 51-%-Stil für einen Angreifer im Vergleich zu Proof-of-Work kostspieliger +- die Community kann auf die soziale Wiederherstellung einer ehrlichen Chain zurückgreifen, falls ein 51-%-Angriff die kryptoökonomischen Verteidigungen überwinden sollte. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [Proof of Stake FAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ -- [Was ist Proof-of-Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ -- [Was Proof of Stake ist und warum sie wichtig ist](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ +- [What is Proof of Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ +- [What Proof of Stake Is And Why It Matters](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ - [Why Proof of Stake (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [Proof of Stake: How I Learned to Love Weak Subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) _Vitalik Buterin_ - [Proof-of-stake Ethereum attack and defense](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [A Proof of Stake Design Philosophy](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ -- [Video: Vitalik Buterin erklärt Lex Fridman die Funktionsweise von Proof-of-Stake](https://www.youtube.com/watch?v=3yrqBG-7EVE) +- [Video: Vitalik Buterin explains proof-of-stake to Lex Fridman](https://www.youtube.com/watch?v=3yrqBG-7EVE) ## Verwandte Themen {#related-topics} -- [Proof of work](/developers/docs/consensus-mechanisms/pow/) -- [Proof-of-authority](/developers/docs/consensus-mechanisms/poa/) +- [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) +- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md index 58a50bf51c6..6ba4e406e1d 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -1,80 +1,84 @@ --- -title: Schlüssel im Proof-of-Stake-System auf Ethereum -description: Eine Erklärung der Schlüssel, die im Proof-of-Stake-Konsensmechanismus auf Ethereum verwendet werden +title: "Schlüssel im Proof-of-Stake-Ethereum" +description: "Eine Erklärung der Schlüssel, die im Proof-of-Stake-Konsensmechanismus von Ethereum verwendet werden" lang: de --- -Ethereum sichert die Assets der Benutzer durch Verschlüsselung auf Basis öffentlicher/privater Schlüssel ab. Der öffentliche Schlüssel wird als Basis für eine Ethereum-Adresse verwendet – das bedeutet, dass er für die Allgemeinheit sichtbar ist und als einzigartiger Identifikator verwendet wird. Der private (oder „geheime“) Schlüssel sollte immer nur für den Kontoinhaber zugänglich sein. Der private Schlüssel wird dazu genutzt, Transaktionen und Daten zu „signieren“, sodass kryptographisch nachgewiesen werden kann, dass der Inhaber die Aktion eines bestimmten privaten Schlüssels genehmigt. +Ethereum sichert die Vermögenswerte der Benutzer mithilfe von Public-Key- und Private-Key-Kryptografie. Der Public-Key wird als Basis für eine Ethereum-Adresse verwendet – das heißt, er ist für die Allgemeinheit sichtbar und dient als eindeutiger Identifikator. Der Private-Key (oder „geheime“ Schlüssel) sollte immer nur für den Inhaber eines Kontos zugänglich sein. Der Private-Key wird verwendet, um Transaktionen und Daten zu „signieren“, sodass die Kryptografie beweisen kann, dass der Inhaber eine bestimmte Aktion eines spezifischen Private-Keys genehmigt. -Ethereums Schlüssel werden mit Hilfe der [elliptischen Kurvenkryptografie](https://de.wikipedia.org/wiki/Elliptic-curve_cryptography) erzeugt. +Die Schlüssel von Ethereum werden mithilfe von [Kryptografie auf Basis elliptischer Kurven](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography) generiert. -Als Ethereum jedoch von [Proof-of-Work](/developers/docs/consensus-mechanisms/pow) zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) wechselte, wurde eine neue Art von Schlüssel zu Ethereum hinzugefügt. Die ursprünglichen Schlüssel funktionieren immer noch genauso wie zuvor – es gab keine Änderungen an den elliptischen kurvenbasierten Schlüsseln, die die Konten sichern. Jedoch benötigten die Benutzer einen neuen Typ von Schlüssel, um am Proof-of-Stake-Mechanismus teilzunehmen, ETH einzusetzen und Validatoren zu betreiben. Dieses Bedürfnis entstand aus Skalierbarkeitsproblemen, die damit verbunden waren, dass viele Nachrichten zwischen einer großen Anzahl von Validatoren ausgetauscht wurden. Hierfür war eine kryptographische Methode erforderlich, die leicht aggregiert werden konnte, um den für das Erreichen eines Konsenses erforderlichen Kommunikationaufwand zu reduzieren. +Als Ethereum jedoch von [Proof-of-Work](/developers/docs/consensus-mechanisms/pow) zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) wechselte, wurde Ethereum ein neuer Schlüsseltyp hinzugefügt. Die ursprünglichen Schlüssel funktionieren immer noch genau wie zuvor – es gab keine Änderungen an den auf elliptischen Kurven basierenden Schlüsseln, die Konten sichern. Benutzer benötigten jedoch einen neuen Schlüsseltyp, um am Proof-of-Stake teilzunehmen, indem sie ETH staken und Validatoren betreiben. Dieser Bedarf entstand aus Skalierbarkeitsherausforderungen im Zusammenhang mit vielen Nachrichten, die zwischen einer großen Anzahl von Validatoren ausgetauscht wurden. Dies erforderte eine kryptografische Methode, die leicht aggregiert werden konnte, um die Menge an Kommunikation zu reduzieren, die erforderlich ist, damit das Netzwerk zu einem Konsens kommt. -Dieser neue Schlüsseltyp verwendet das Signaturschema [**Boneh-Lynn-Shacham (BLS)**](https://wikipedia.org/wiki/BLS_digital_signature). BLS ermöglicht eine sehr effiziente Aggregation von Signaturen, erlaubt aber auch das Reverse Engineering von aggregierten individuellen Validatorenschlüsseln und ist ideal für die Verwaltung von Aktionen zwischen Validatoren. +Dieser neue Schlüsseltyp verwendet das [**Boneh-Lynn-Shacham (BLS)**-Signaturschema](https://wikipedia.org/wiki/BLS_digital_signature). BLS ermöglicht eine sehr effiziente Aggregation von Signaturen, erlaubt aber auch das Reverse Engineering von aggregierten individuellen Validator-Schlüsseln und ist ideal für die Verwaltung von Aktionen zwischen Validatoren. -## Die beiden Arten von Validatorenschlüsseln {#two-types-of-keys} +## Die zwei Arten von Validator-Schlüsseln {#two-types-of-keys} -Vor dem Wechsel zu Proof-of-Stake verfügten Ethereum-Benutzer nur über einen einzigen auf einer elliptischen Kurve basierenden privaten Schlüssel, mit dem sie auf ihre Geldmittel zugreifen konnten. Mit der Einführung von Proof-of-Stake brauchten Benutzer, die Solo-Staker sein wollten, auch einen **Validatorenschlüssel** und einen **Auszahlungsschlüssel**. +Vor dem Wechsel zu Proof-of-Stake hatten Ethereum-Benutzer nur einen einzigen auf elliptischen Kurven basierenden Private-Key, um auf ihre Gelder zuzugreifen. Mit der Einführung von Proof-of-Stake benötigten Benutzer, die Solo-Staker sein wollten, auch einen **Validator-Schlüssel** und einen **Auszahlungsschlüssel**. -### Der Validatorenschlüssel {#validator-key} +### Der Validator-Schlüssel {#validator-key} -Der Schlüssel für die Validatorensignatur besteht aus zwei Elementen: +Der Validator-Signaturschlüssel besteht aus zwei Elementen: -- dem **privaten** Schlüssel des Validatoren -- dem **öffentlichen** Schlüssel des Validatoren +- **Private-Key** des Validators +- **Public-Key** des Validators -Der Zweck eines privaten Validatorenschlüssel ist es, On-Chain-Operationen wie zum Beispiel Block-Proposals und Attestierungen zu signieren. Deshalb müssen diese Schlüssel in einer Hot Wallet gehalten werden. +Der Zweck des Private-Keys des Validators besteht darin, Operationen auf der Blockchain wie Blockvorschläge und Bestätigungen zu signieren. Aus diesem Grund müssen diese Schlüssel in einem Hot-Wallet aufbewahrt werden. -Diese Flexibilität hat den Vorteil, dass sich die Signaturschlüssel für Validatoren sehr schnell von einem zum anderen Gerät transferieren lassen. Sollten sie allerdings verloren gehen oder gestohlen werden, könnte ein Dieb auf mehrere Arten **böswillig handeln**: +Diese Flexibilität hat den Vorteil, dass Validator-Signaturschlüssel sehr schnell von einem Gerät auf ein anderes übertragen werden können. Wenn sie jedoch verloren gehen oder gestohlen werden, kann ein Dieb auf verschiedene Weise **böswillig handeln**: -- Bestrafung des Validatoren mit Slashing, indem er: - - ein Proposer ist und zwei unterschiedliche Beacon-Blöcke für denselben Slot signiert - - ein Attestierer ist und eine Attestierung, die eine andere „umgibt“, signiert - - ein Attestierer ist und zwei unterschiedliche Attestierungen mit demselben Ziel signiert -- Erzwingen eines freiwilligen Austritts, was den Validatoren vom Staking anhält und dem Besitzer des Auszahlungsschlüssel Zugriff auf sein ETH-Guthaben gewährt +- Ein Slashing des Validators verursachen, indem er: + - Als Vorschlagender agiert und zwei verschiedene Beacon-Blöcke für denselben Slot signiert + - Als Bestätigender agiert und eine Bestätigung signiert, die eine andere „umschließt“ + - Als Bestätigender agiert und zwei verschiedene Bestätigungen mit demselben Ziel signiert +- Einen freiwilligen Ausstieg erzwingen, was den Validator vom Staking abhält und dem Besitzer des Auszahlungsschlüssels Zugriff auf sein ETH-Guthaben gewährt -Der **öffentliche Schlüssel des Validatoren** ist in den Transaktionsdaten enthalten, wenn ein Benutzer ETH in den Staking-Einzahlungsvertrag transferiert. Diese Daten sind als _Einzahlungsdaten_ bekannt. Mit ihnen kann Ethereum den Validatoren identifizieren. +Der **Public-Key des Validators** ist in den Transaktionsdaten enthalten, wenn ein Benutzer ETH in den Staking-Einzahlungsvertrag einzahlt. Dies wird als _Einzahlungsdaten_ bezeichnet und ermöglicht es Ethereum, den Validator zu identifizieren. -### Zugangsdaten für die Auszahlung {#withdrawal-credentials} +### Auszahlungsberechtigungen {#withdrawal-credentials} -Jeder Validator hat eine Eigenschaft, bekannt als _Zugangsdaten für die Auszahlung_. Dieses 32-Byte-Feld beginnt entweder mit `0x00`, was BLS-Zugangsdaten für die Auszahlung repräsentiert, oder `0x01`, wobei es sich um Zugangsdaten handelt, die sich auf eine Ausführungsadresse beziehen. +Jeder Validator hat eine Eigenschaft, die als _Auszahlungsberechtigungen_ (Withdrawal Credentials) bekannt ist. Das erste Byte dieses 32-Byte-Feldes identifiziert den Kontotyp: `0x00` steht für ursprüngliche BLS-Berechtigungen (vor Shapella, nicht auszahlbar), `0x01` steht für Legacy-Berechtigungen, die auf eine Ausführungsadresse verweisen, und `0x02` steht für den modernen Compounding-Berechtigungstyp. -Validatoren mit `0x00`-BLS-Schlüsseln müssen diese Zugangsdaten aktualisieren, damit auf eine Auszahlungsadresse verwiesen wird und überschüssige Zahlungen für ihr Guthaben oder vollständige Auszahlungen von Staking-Beträgen aktiviert werden können. Dies lässt sich erreichen, indem während der ersten Schlüsselgeneration eine Ausführungsadresse in den Einzahlungsdaten bereitstellt wird _ODER_, indem der Auszahlungsschlüssel zu einem späteren Zeitpunkt verwendet wird, um eine `BLSToExecutionChange`-Nachricht zu signieren und zu übertragen. +Validatoren mit `0x00` BLS-Schlüsseln müssen diese Berechtigungen aktualisieren, damit sie auf eine Ausführungsadresse verweisen, um Zahlungen von Überschussguthaben oder die vollständige Auszahlung aus dem Staking zu aktivieren. Dies kann erfolgen, indem während der anfänglichen Schlüsselgenerierung eine Ausführungsadresse in den Einzahlungsdaten angegeben wird, _ODER_ indem der Auszahlungsschlüssel zu einem späteren Zeitpunkt verwendet wird, um eine `BLSToExecutionChange`-Nachricht zu signieren und zu übertragen. + +[Mehr zu den Auszahlungsberechtigungen von Validatoren](/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/) ### Der Auszahlungsschlüssel {#withdrawal-key} -Der Auszahlungsschlüssel wird zur Aktualisierung der Zugangsdaten für die Auszahlung benötigt, um auf eine Ausführungsadresse zu verweisen, falls die nicht während der ersten Einzahlung festgelegt wurde. Dies ermöglicht die allmähliche Bearbeitung von überschüssigen Guthabenauszahlungen und das vollständige Abheben der eingesetzten ETH durch die jeweiligen Benutzer. +Der Auszahlungsschlüssel wird benötigt, um die Auszahlungsberechtigungen so zu aktualisieren, dass sie auf eine Ausführungsadresse verweisen, falls dies nicht während der anfänglichen Einzahlung festgelegt wurde. Dies ermöglicht den Beginn der Verarbeitung von Überschussguthabenzahlungen und erlaubt es Benutzern auch, ihre gestakten ETH vollständig abzuheben. + +Genau wie die Validator-Schlüssel bestehen auch die Auszahlungsschlüssel aus zwei Komponenten: -Genau wie die Validatorenschlüssel setzen sich die Auszahlungsschlüssel auch aus zwei Komponenten zusammen: +- **Private-Key** für die Auszahlung +- **Public-Key** für die Auszahlung -- **Privater** Auszahlungsschlüssel -- **Öffentlicher** Auszahlungsschlüssel +Der Verlust dieses Schlüssels vor der Aktualisierung der Auszahlungsberechtigungen auf den Typ `0x01` bedeutet den Verlust des Zugriffs auf das Validator-Guthaben. Der Validator kann weiterhin Bestätigungen und Blöcke signieren, da diese Aktionen den Private-Key des Validators erfordern. Es gibt jedoch wenig bis gar keinen Anreiz dafür, wenn die Auszahlungsschlüssel verloren gegangen sind. -Ein Verlust dieses Schlüssel, bevor die Zugangsdaten für die Auszahlung auf `0x01`-Typ aktualisiert wurden, ist gleichbedeutend mit dem Verlust des Zugriffs auf das Validatorenguthaben. Der Validator kann immer noch Attestierungen und Blöcke signieren, da für diese Aktionen der private Schlüssel des Validatoren erforderlich ist. Hierfür gibt es aber wenig bis keine Anreize, sollten die Auszahlungsschlüssel verloren gegangen sein. +Die Trennung der Validator-Schlüssel von den Ethereum-Kontoschlüsseln ermöglicht es einem einzelnen Benutzer, mehrere Validatoren zu betreiben. -Eine Trennung der Schlüssel der Validatoren von denen des Ethereum-Kontos ermöglicht das Betreiben mehrerer Validatoren durch einen einzigen Benutzer. +![validator key schematic](validator-key-schematic.png) -![Schema der Schlüssel für Validatoren](validator-key-schematic.png) +**Hinweis**: Der Ausstieg aus den Staking-Pflichten und die Auszahlung des Guthabens eines Validators erfordern derzeit die Signierung einer [freiwilligen Ausstiegsnachricht (Voluntary Exit Message, VEM)](https://mirror.xyz/ladislaus.eth/wmoBbUBes2Wp1_6DvP6slPabkyujSU7MZOFOC3QpErs&1) mit dem Validator-Schlüssel. [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002) ist jedoch ein Vorschlag, der es einem Benutzer in Zukunft ermöglichen wird, den Ausstieg eines Validators auszulösen und sein Guthaben abzuheben, indem er Ausstiegsnachrichten mit dem Auszahlungsschlüssel signiert. Dies wird Vertrauensannahmen reduzieren, indem es Stakern, die ETH an [Staking-as-a-Service-Anbieter](/staking/saas/#what-is-staking-as-a-service) delegieren, ermöglicht, die Kontrolle über ihre Gelder zu behalten. -## Schlüssel aus einer Seed Phrase ableiten {#deriving-keys-from-seed} +## Ableiten von Schlüsseln aus einer Seed-Phrase {#deriving-keys-from-seed} -Wenn für jede 32 eingesetzten ETH ein neues Set von zwei komplett unabhängigen Schlüsseln erforderlich wäre, würde die Schlüsselverwaltung schnell sehr unübersichtlich werden, besonders für Benutzer, die mehrere Validatoren ausführen. Stattdessen lassen sich mehrere Validatorenschlüssel von einem einzelnen gemeinsamen Geheimnis ableiten und das Speichern dieses Geheimnisses ermöglicht den Zugriff auf mehrere Validatorenschlüssel. +Wenn für jede 32 gestakten ETH ein neues Set von 2 völlig unabhängigen Schlüsseln erforderlich wäre, würde die Schlüsselverwaltung schnell unhandlich werden, insbesondere für Benutzer, die mehrere Validatoren betreiben. Stattdessen können mehrere Validator-Schlüssel aus einem einzigen gemeinsamen Geheimnis abgeleitet werden, und die Speicherung dieses einzigen Geheimnisses ermöglicht den Zugriff auf mehrere Validator-Schlüssel. -[Mnemoniken](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) und Pfade sind wichtige Funktionen, mit denen Benutzer oft zu tun haben, wenn [sie auf ihre Wallets zugreifen](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0). Die Mnemonik ist eine Sequenz von Wörtern, die als erster Seed für einen privaten Schlüssel dienen. Durch Kombination mit zusätzlichen kann die Mnemonik einen Hash, bekannt als der „Master Key“, generieren. Das kann man sich wie die Wurzeln eines Baums vorstellen. Abzweigungen dieser Wurzeln lassen sich mithilfe eines hierarchischen Pfads ableiten, sodass Child Nodes als Kombinationen aus dem Hash der Parent Nodes und dem Index im Baum existieren können. Lesen Sie mehr zu [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) und [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)-Standards für die mnemonikbasierte Schlüsselerstellung. +[Mnemonics](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) und Pfade sind prominente Merkmale, auf die Benutzer oft stoßen, wenn [sie auf ihre Wallets zugreifen](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0). Die Mnemonic ist eine Wortfolge, die als anfänglicher Seed für einen Private-Key dient. In Kombination mit zusätzlichen Daten generiert die Mnemonic einen Hash, der als „Master-Schlüssel“ bekannt ist. Dies kann man sich als die Wurzel eines Baumes vorstellen. Zweige von dieser Wurzel können dann über einen hierarchischen Pfad abgeleitet werden, sodass Kindknoten als Kombinationen aus dem Hash ihres Elternknotens und ihrem Index im Baum existieren können. Lesen Sie mehr über die Standards [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) und [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) für die Mnemonic-basierte Schlüsselgenerierung. -Diese Pfade haben die folgende Struktur. Nutzer, die mit Hardware-Wallets interagiert haben, sollte sie bekannt vorkommen: +Diese Pfade haben die folgende Struktur, die Benutzern vertraut sein wird, die bereits mit Hardware-Wallets interagiert haben: ``` m/44'/60'/0'/0` ``` -Die Schrägstriche in diesem Weg trennen Komponenten des privaten Schlüssels wie folgt: +Die Schrägstriche in diesem Pfad trennen die Komponenten des Private-Keys wie folgt: ``` master_key / purpose / coin_type / account / change / address_index ``` -Diese Logik ermöglicht es Benutzern, so viele Validatoren wie möglich an eine einzige **mnemonische Phrase** anzuhängen, da die Tree Root gewöhnlich sein kann und es an den Branches zur Differenzierung kommen kann. Der Benutzer kann **eine beliebige Anzahl von Schlüsseln** von der mnemonischen Phrase ableiten. +Diese Logik ermöglicht es Benutzern, so viele Validatoren wie möglich an eine einzige **Mnemonic-Phrase** anzuhängen, da die Baumwurzel gemeinsam sein kann und die Unterscheidung an den Zweigen erfolgen kann. Der Benutzer kann **eine beliebige Anzahl von Schlüsseln** aus der Mnemonic-Phrase ableiten. ``` [m / 0] @@ -86,11 +90,13 @@ Diese Logik ermöglicht es Benutzern, so viele Validatoren wie möglich an eine [m / 2] ``` -Jeder Branch ist durch einen `/` separiert, deshalb bedeutet `m/2`, dass Sie mit dem Master Key beginnen und dem zweiten Branch folgen. Im Schema unten kommt eine einzige mnemonische Phrase zum Einsatz, um drei Auszahlungsschlüssel mit jeweils zwei zugehörigen Validatoren zu speichern. +Jeder Zweig ist durch ein `/` getrennt, sodass `m/2` bedeutet, mit dem Master-Schlüssel zu beginnen und Zweig 2 zu folgen. Im untenstehenden Schema wird eine einzige Mnemonic-Phrase verwendet, um drei Auszahlungsschlüssel zu speichern, denen jeweils zwei Validatoren zugeordnet sind. -![Logik für Validatorenschlüssel](multiple-keys.png) +![validator key logic](multiple-keys.png) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [Blogbeitrag der Ethereum Foundation von Carl Beekhuizen](https://blog.ethereum.org/2020/05/21/keys) -- [Schlüsselerzeugung EIP-2333 BLS12-381](https://eips.ethereum.org/EIPS/eip-2333) +- [EIP-2333 BLS12-381 Schlüsselgenerierung](https://eips.ethereum.org/EIPS/eip-2333) +- [EIP-7002: Durch die Ausführungsebene ausgelöste Ausstiege](https://web.archive.org/web/20250125035123/https://research.2077.xyz/eip-7002-unpacking-improvements-to-staking-ux-post-merge) +- [Schlüsselverwaltung im großen Maßstab](https://docs.ethstaker.cc/ethstaker-knowledge-base/scaled-node-operators/key-management-at-scale) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index 07be8bea0f5..48f18160e80 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -1,69 +1,69 @@ --- title: Proof-of-Stake vs. Proof-of-Work -description: Ein Vergleich zwischen dem auf Proof-of-Stake und auf Proof-of-Work basierenden Konsensmechanismus auf Ethereum +description: Ein Vergleich zwischen Ethereums Proof-of-Stake- und Proof-of-Work-basiertem Konsensmechanismus lang: de --- -Als Ethereum veröffentlicht wurde, war immer noch viel Forschung und Entwicklung zu leisten, bevor dem Proof-of-Stake-System genug Vertrauen für die Sicherung von Ethereum entgegengebracht wurde. Proof-of-Work war ein einfacherer Mechanismus, der sich bereits mit Bitcoin bewährt hatte, was bedeutete, dass Core-Entwickler das System direkt implementieren konnten, damit Ethereum veröffentlicht werden konnte. Es dauerte weitere acht Jahre, um Proof-of-Stake ausreichend weiterzuentwickeln, dass es implementiert werden konnte. +Als [Ethereum](/) an den Start ging, benötigte Proof-of-Stake noch viel Forschung und Entwicklung, bevor man darauf vertrauen konnte, dass es Ethereum absichert. Proof-of-Work war ein einfacherer Mechanismus, der sich bereits bei Bitcoin bewährt hatte, was bedeutete, dass die Kernentwickler ihn sofort implementieren konnten, um Ethereum auf den Weg zu bringen. Es dauerte weitere acht Jahre, um Proof-of-Stake so weit zu entwickeln, dass es implementiert werden konnte. -Auf dieser Seite werden die Gründe für Ethereums Wechsel von Proof-of-Work zu Proof-of-Stake und die damit verbundenen Kompromisse erläutert. +Diese Seite erklärt die Beweggründe für Ethereums Wechsel von Proof-of-Work zu Proof-of-Stake und die damit verbundenen Kompromisse. ## Sicherheit {#security} -Ethereums Forscher halten Proof-of-Stake für sicherer als Proof-of-Work. Jedoch wurde es erst vor kurzer Zeit zum echtem Ethereum Mainnet hinzugefügt und ist weniger zeiterprobt als Proof-of-Work. In den folgenden Abschnitten werden die Vor- und Nachteile des Proof-of-Stake-Sicherheitsmodells im Vergleich zu Proof-of-Work diskutiert. +Ethereum-Forscher halten Proof-of-Stake für sicherer als Proof-of-Work. Es wurde jedoch erst vor Kurzem für das echte Ethereum-Mainnet implementiert und ist weniger praxiserprobt als Proof-of-Work. Die folgenden Abschnitte erörtern die Vor- und Nachteile des Sicherheitsmodells von Proof-of-Stake im Vergleich zu Proof-of-Work. ### Kosten eines Angriffs {#cost-to-attack} -Bei Proof-of-Stake müssen Validatoren mindestens 32 ETH in einen Smart Contract transferieren („staken“). Ethereum kann eingesetzte Ether zerstören, um Validatoren, die sich falsch verhalten, zu bestrafen. Um einen Konsens zu erreichen, müssen mindestens 66 % der insgesamt eingesetzten Ether für eine bestimmte Gruppe von Blöcken abstimmen. Blöcke, für die >=66 % des Stakes abgestimmt haben, werden „finalisiert“, was bedeutet, dass sie nicht mehr entfernt oder neu organisiert werden können. +Bei Proof-of-Stake müssen Validatoren mindestens 32 ETH in einem Smart Contract hinterlegen ("Staking"). Ethereum kann gestakte Ether zerstören, um Validatoren zu bestrafen, die sich falsch verhalten. Um zu einem Konsens zu gelangen, müssen mindestens 66 % der gesamten gestakten Ether für eine bestimmte Gruppe von Blöcken stimmen. Blöcke, für die >=66 % des Einsatzes gestimmt haben, werden "finalisiert", was bedeutet, dass sie nicht entfernt oder neu organisiert werden können. -Ein Angriff auf das Netzwerk kann bedeuten, das Finalisieren der Chain zu verhindern oder eine bestimmte Anordnung von Blöcken in der kanonischen Chain zu erreichen, die für den Angreifer von Vorteil ist. Dies erfordert, dass der Angreifer ehrliche Konsensbildung umgeht, indem er entweder eine große Menge an Ether anhäuft und damit direkt abstimmt oder ehrliche Validatoren dazu bringt, auf eine bestimmte Weise abzustimmen. Wenn wir ausgeklügelte, unwahrscheinliche Angriffe zur Täuschung ehrlicher Validierer für den Moment außen vor lassen, belaufen sich die Kosten für einen Angriff auf Ethereum auf die Kosten für den Stake, den ein Angreifer aufbringen muss, um den Konsens zu seinen Gunsten zu beeinflussen. +Das Netzwerk anzugreifen kann bedeuten, die Finalisierung der Chain zu verhindern oder eine bestimmte Anordnung von Blöcken in der kanonischen Chain sicherzustellen, die einem Angreifer in irgendeiner Weise zugutekommt. Dies erfordert, dass der Angreifer den Pfad des ehrlichen Konsenses umleitet, indem er entweder eine große Menge an Ether ansammelt und direkt damit abstimmt oder ehrliche Validatoren dazu bringt, auf eine bestimmte Weise abzustimmen. Abgesehen von raffinierten Angriffen mit geringer Wahrscheinlichkeit, die ehrliche Validatoren austricksen, entsprechen die Kosten für einen Angriff auf Ethereum den Kosten des Einsatzes, den ein Angreifer ansammeln muss, um den Konsens zu seinen Gunsten zu beeinflussen. -Die niedrigsten Angriffskosten sind >33 % des gesamten Stakes. Ein Angreifer, der >33 % des gesamten Stakes hält, könnte einfach nur, indem er offline geht, eine Endgültigkeitsverzögerung hervorrufen. Dies ist ein relativ geringes Problem für das Netzwerk, da es einen Mechanismus gibt, der als „Inactivity Leak“ bekannt ist und den Offline-Validatoren Stake entzieht, bis die Online-Mehrheit 66 % des Stakes repräsentiert und die Chain wieder finalisieren kann. Es ist für einen Angreifer auch theoretisch möglich, mit etwas über 33 % des Gesamt-Stakes eine doppelte Endgültigkeit herbeizuführen. Hierzu würde er zwei Blöcke statt einem Block erzeugen, wenn er darum gebeten wird, als Block-Producer zu fungieren, und dann mit all seinen Validatoren doppelt abstimmen. Bei jeder Abspaltung müssen nur 50 % der verbleibenden ehrlichen Validatoren jeden Block zuerst sehen. Wenn der Angreifer es also schafft, seine Nachrichten zum genau richtigen Zeitpunkt zu versenden, könnte es ihm gelingen, beide Abspaltungen zu finalisieren. Die Wahrscheinlichkeit, dass dies gelingt, ist zwar gering. Wenn ein Angreifer jedoch in der Lage wäre, eine doppelte Endgültigkeit herbeizuführen, müsste sich die Ethereum-Community dazu entscheiden, einer der Abspaltungen zu folgen. In diesem Fall würden die Validatoren des Angreifers auf der anderen Abspaltung zwangsläufig mit Slashing bestraft werden. +Die geringsten Kosten für einen Angriff betragen >33 % des gesamten Einsatzes. Ein Angreifer, der >33 % des gesamten Einsatzes hält, kann eine Verzögerung der Finalität verursachen, indem er einfach offline geht. Dies ist ein relativ kleines Problem für das Netzwerk, da es einen Mechanismus gibt, der als "Inactivity Leak" (Inaktivitätsverlust) bekannt ist und den Einsatz von Offline-Validatoren abzieht, bis die Online-Mehrheit 66 % des Einsatzes repräsentiert und die Chain wieder finalisieren kann. Es ist theoretisch auch möglich, dass ein Angreifer mit etwas mehr als 33 % des gesamten Einsatzes eine doppelte Finalität verursacht, indem er zwei Blöcke anstelle von einem erstellt, wenn er aufgefordert wird, ein Blockproduzent zu sein, und dann mit all seinen Validatoren doppelt abstimmt. Jeder Fork erfordert nur, dass 50 % der verbleibenden ehrlichen Validatoren jeden Block zuerst sehen. Wenn es ihnen also gelingt, ihre Nachrichten genau richtig zu timen, können sie möglicherweise beide Forks finalisieren. Dies hat eine geringe Erfolgswahrscheinlichkeit, aber wenn ein Angreifer in der Lage wäre, eine doppelte Finalität zu verursachen, müsste die Ethereum-Community entscheiden, einem Fork zu folgen, in welchem Fall die Validatoren des Angreifers auf dem anderen zwangsläufig dem Slashing unterliegen würden. -Mit >33 % des gesamten Stakes hat ein Angreifer die Chance, das Ethereum-Netzwerk geringfügig (Endgültigkeitsverzögerung) oder schwerwiegender (doppelte Endgültigkeit) zu beeinflussen. Bei mehr als 14.000.000 ETH im Netzwerk und einem repräsentativen Preis von 1.000 $/ETH betragen die Mindestkosten für diese Angriffe `1.000 x 14.000.000 x 0,33 = 4.620.000.000 $`. Der Angreifer würde dieses Geld durch das Slashing verlieren und vom Netzwerk ausgestoßen werden. Um nochmal anzugreifen, müsste er erneut >33 % des Stakes ansammeln und erneut verbrennen. Jeder Versuch, das Netzwerk anzugreifen, würde >4,6 Milliarden $ kosten (bei 1.000 $/ETH und 14 Mio. eingesetzten ETH). Der Angreifer wird auch vom Netzwerk ausgeschlossen, wenn er mit Slashing bestraft wird, und müsste einer Aktivierungswarteschlange beitreten, um wieder ins Netzwerk zu gelangen. Das bedeutet, dass die Wiederholungsrate eines Angriffs nicht nur durch die Geschwindigkeit begrenzt ist, mit der der Angreifer >33 % des Gesamt-Stakes anhäufen kann, sondern auch durch die Zeit, die er benötigt, um alle seine Validatoren in das Netz einzubinden. Jedes Mal, wenn ein Akteur angreift, verliert er Unmengen an Geld, und der Rest der Community profitiert finanziell dank des aus dem Angriff resultierenden Angebotsschocks. +Mit >33 % des gesamten Einsatzes hat ein Angreifer die Chance, eine geringfügige (Verzögerung der Finalität) oder schwerwiegendere (doppelte Finalität) Auswirkung auf das Ethereum-Netzwerk zu haben. Mit mehr als 14.000.000 ETH, die im Netzwerk gestakt sind, und einem repräsentativen Preis von 1000 $/ETH betragen die Mindestkosten für die Durchführung dieser Angriffe `1000 x 14,000,000 x 0.33 = $4,620,000,000`. Der Angreifer würde dieses Geld durch Slashing verlieren und aus dem Netzwerk geworfen werden. Um erneut anzugreifen, müsste er (erneut) >33 % des Einsatzes ansammeln und (erneut) verbrennen. Jeder Versuch, das Netzwerk anzugreifen, würde >4,6 Milliarden $ kosten (bei 1000 $/ETH und 14 Mio. gestakten ETH). Der Angreifer wird auch aus dem Netzwerk geworfen, wenn er geslasht wird, und muss sich in eine Aktivierungswarteschlange einreihen, um wieder beizutreten. Dies bedeutet, dass die Rate eines wiederholten Angriffs nicht nur auf die Rate begrenzt ist, mit der der Angreifer >33 % des gesamten Einsatzes ansammeln kann, sondern auch auf die Zeit, die benötigt wird, um all seine Validatoren in das Netzwerk aufzunehmen. Jedes Mal, wenn der Angreifer angreift, wird er viel ärmer und der Rest der Community wird dank des daraus resultierenden Angebotsschocks reicher. -Für andere Angriffe wie 51 %-Angriffe oder Endgültigkeitsumkehrung mit 66 % des gesamten Stakes sind wesentlich mehr ETH erforderlich. Sie sind auch für den Angreifer deutlich kostspieliger. +Andere Angriffe, wie 51-%-Angriffe oder die Umkehrung der Finalität mit 66 % des gesamten Einsatzes, erfordern wesentlich mehr ETH und sind für den Angreifer viel kostspieliger. -Vergleichen Sie das mit Proof-of-Stake. Die Kosten für einen Angriff auf Proof-of-Work-Ethereum entsprachen den Kosten, die notwendig waren, um konstant >50 % der gesamten Hash-Rate des Netzwerks zu besitzen. Dies waren die Hardware- und Betriebskosten zur Aufrechterhaltung von ausreichend Rechenleistung, um andere Miner konstant bei der Berechnung von Proof-of-Work-Lösungen zu übertreffen. Auf Ethereum wurde größtenteils mit GPUs und nicht mit ASICs geschürft, was die Kosten niedrig hielt (obwohl auf Ethereum, hätte es am Proof-of-Work-Mechanismus festgehalten, ASIC Mining möglicherweise populärer geworden wäre). Ein Angreifer müsste eine Menge Hardware kaufen und den Strom dafür bezahlen, um ein Proof-of-Work-Ethereum-Netzwerk anzugreifen. Die Gesamtkosten wären allerdings geringer als die Kosten, die erforderlich sind, um genug ETH für einen Angriff zu sammeln. Ein 51 %-Angriff ist [20-mal weniger](https://youtu.be/1m12zgJ42dI?t=1562) teuer bei Proof-of-Work als bei Proof-of-Stake. Wenn der Angriff entdeckt und die Chain hart abgespalten worden wäre, um die Änderungen wieder zu entfernen, könnte der Angreifer wiederholt dieselbe Hardware verwenden, um die neue Abspaltung anzugreifen. +Vergleichen Sie dies mit Proof-of-Work. Die Kosten für den Start eines Angriffs auf das Proof-of-Work-Ethereum entsprachen den Kosten für den dauerhaften Besitz von >50 % der gesamten Hash-Rate des Netzwerks. Dies belief sich auf die Hardware- und Betriebskosten für ausreichend Rechenleistung, um andere Miner auszustechen und Proof-of-Work-Lösungen konsistent zu berechnen. Ethereum wurde hauptsächlich mit GPUs anstelle von ASICs gemint, was die Kosten niedrig hielt (obwohl ASIC-Mining möglicherweise populärer geworden wäre, wenn Ethereum bei Proof-of-Work geblieben wäre). Ein Angreifer müsste viel Hardware kaufen und für den Strom bezahlen, um sie zu betreiben, um ein Proof-of-Work-Ethereum-Netzwerk anzugreifen, aber die Gesamtkosten wären geringer als die Kosten, die erforderlich sind, um genug ETH anzusammeln, um einen Angriff zu starten. Ein 51-%-Angriff ist bei Proof-of-Work ~[20-mal weniger](https://youtu.be/1m12zgJ42dI?t=1562) teuer als bei Proof-of-Stake. Wenn der Angriff entdeckt und die Chain einem Hard-Fork unterzogen würde, um ihre Änderungen zu entfernen, könnte der Angreifer wiederholt dieselbe Hardware verwenden, um den neuen Fork anzugreifen. ### Komplexität {#complexity} -Proof-of-Stake ist viel komplexer als Proof-of-Work. Dies könnte ein Vorteil für Proof-of-Work sein, da es schwerer ist, aus Versehen Bugs oder ungewollte Effekte in einfachere Protokolle einzuführen. Jedoch hat sich die Komplexität nach Jahren von Forschung und Entwicklung, Simulationen und Testnetz-Implementationen verringert. Das Proof-of-Stake-Protokoll wurde unabhängig voneinander von fünf verschiedenen Teams (jeweils auf Ausführungs- und Konsensebene) in fünf Programmiersprachen implementiert, was zur Folge hat, dass es gegen Client-Bugs sehr widerstandsfähig ist. +Proof-of-Stake ist viel komplexer als Proof-of-Work. Dies könnte ein Punkt zugunsten von Proof-of-Work sein, da es schwieriger ist, versehentlich Fehler oder unbeabsichtigte Effekte in einfachere Protokolle einzuführen. Die Komplexität wurde jedoch durch jahrelange Forschung und Entwicklung, Simulationen und Testnet-Implementierungen gebändigt. Das Proof-of-Stake-Protokoll wurde unabhängig von fünf separaten Teams (jeweils auf der Ausführungsebene und der Konsensebene) in fünf Programmiersprachen implementiert, was Widerstandsfähigkeit gegen Anwendungs-Bugs bietet. -Um die Proof-of-Stake-Konsenslogik sicher zu testen und zu entwickeln, wurde die Beacon Chain zwei Jahre vor der Implementierung von Proof-of-Stake auf Ethereums Mainnet veröffentlicht. Die Beacon Chain diente als Sandbox für Proof-of-Stake-Tests, da es sich um eine Live-Blockchain zur Implementierung der Proof-of-Stake-Konsenslogik handelte, die jedoch nichts mit echten Ethereum-Transaktionen zu tun hatte – sie erreichte praktisch nur aus sich selbst heraus eine Übereinstimmung. Sobald dies lange genug stabil und ohne Bugs funktioniert hatte, wurde die Beacon Chain mit Ethereums Mainnet zusammengeführt. Das hat alles dazu beigetragen, die Komplexität von Proof-of-Stake so weit zu verringern, dass das Risiko für unbeabsichtigte Konsequenzen oder Client-Bugs nur noch sehr gering war. +Um die Proof-of-Stake-Konsenslogik sicher zu entwickeln und zu testen, wurde die Beacon Chain zwei Jahre vor der Implementierung von Proof-of-Stake im Ethereum-Mainnet gestartet. Die Beacon Chain fungierte als Sandbox für Proof-of-Stake-Tests, da es sich um eine Live-Blockchain handelte, die die Proof-of-Stake-Konsenslogik implementierte, ohne jedoch echte Ethereum-Transaktionen zu berühren – sie fand effektiv nur einen Konsens über sich selbst. Nachdem dies für eine ausreichende Zeit stabil und fehlerfrei war, wurde die Beacon Chain mit dem Ethereum-Mainnet "zusammengeführt". All dies trug dazu bei, die Komplexität von Proof-of-Stake so weit zu bändigen, dass das Risiko unbeabsichtigter Folgen oder Anwendungs-Bugs sehr gering war. ### Angriffsfläche {#attack-surface} -Proof-of-Stake ist komplexer als Proof-of-Work, was bedeutet, dass mehr potenzielle Angriffsvektoren berücksichtigt werden müssen. Anstatt eines Peer-to-Peer-Netzwerks zur Verbindung von Clients gibt es davon zwei, die jeweils ein eigenes Protokoll implementieren. Wenn in jedem Slot ein bestimmter Validator für ein Block-Proposal vorausgewählt wird, kann es potenziell zu einem Denial-of-Service kommen, wobei via große Mengen an Datenverkehr im Netzwerk dieser spezielle Validator außer Gefecht gesetzt wird. +Proof-of-Stake ist komplexer als Proof-of-Work, was bedeutet, dass es mehr potenzielle Angriffsvektoren zu bewältigen gibt. Anstelle eines Peer-to-Peer-Netzwerks, das Anwendungen verbindet, gibt es zwei, von denen jedes ein separates Protokoll implementiert. Die Vorauswahl eines bestimmten Validators, der in jedem Slot einen Block vorschlägt, schafft das Potenzial für Denial-of-Service-Angriffe, bei denen große Mengen an Netzwerkverkehr diesen bestimmten Validator offline nehmen. -Es gibt auch Möglichkeiten für Angreifer, die Freigabe ihrer Blöcke oder Attestierungen sorgfältig so zu timen, dass sie von einem bestimmten Teil des ehrlichen Netzwerks empfangen werden und ihn dazu bringen, auf eine bestimmte Weise abzustimmen. Schließlich kann ein Angreifer einfach genügend ETH anhäufen, um den Konsensmechanismus mit seinem Stake zu dominieren. Für jeden dieser [Angriffsvektoren existieren entsprechende Abwehrmaßnahmen](/developers/docs/consensus-mechanisms/pos/attack-and-defense), diese sind jedoch nicht für eine Verteidigung im Rahmen eines Proof-of-Work-Angriffs gedacht. +Es gibt auch Möglichkeiten für Angreifer, die Veröffentlichung ihrer Blöcke oder Bestätigungen sorgfältig zu timen, sodass sie von einem bestimmten Anteil des ehrlichen Netzwerks empfangen werden und diese dazu beeinflussen, auf bestimmte Weise abzustimmen. Schließlich kann ein Angreifer einfach ausreichend ETH ansammeln, um sie als Einsatz zu hinterlegen und den Konsensmechanismus zu dominieren. Jeder dieser [Angriffsvektoren hat zugehörige Verteidigungsmaßnahmen](/developers/docs/consensus-mechanisms/pos/attack-and-defense), aber sie existieren nicht, um unter Proof-of-Work verteidigt zu werden. ## Dezentralisierung {#decentralization} -Proof-of-Stake ist dezentraler als Proof-of-Work, da das Wettrüsten um die Mining-Hardware tendenziell dazu führt, dass Einzelpersonen und kleine Organisationen das Nachsehen haben. Zwar kann jeder theoretisch mit einfacher Hardware mit dem Mining beginnen, doch ist die Wahrscheinlichkeit dafür, dass sie eine Belohnung erhalten, im Vergleich zu institutionellen Mining-Operationen verschwindend gering. Bei Proof-of-Stake sind die Kosten für das Staking und die prozentuale Rendite daraus für alle gleich. Es kostet aktuell 32 ETH, einen Validator zu betreiben. +Proof-of-Stake ist dezentralisierter als Proof-of-Work, da das Wettrüsten bei Mining-Hardware dazu neigt, Einzelpersonen und kleine Organisationen preislich zu verdrängen. Während technisch gesehen jeder mit bescheidener Hardware mit dem Mining beginnen kann, ist die Wahrscheinlichkeit, eine Belohnung zu erhalten, im Vergleich zu institutionellen Mining-Betrieben verschwindend gering. Bei Proof-of-Stake sind die Kosten für das Staking und die prozentuale Rendite auf diesen Einsatz für alle gleich. Es kostet derzeit 32 ETH, einen Validator zu betreiben. -Andererseits hat die Erfindung von Liquid Staking Derivatives zu Bedenken bezüglich zu starker Zentralisierung geführt, da einige wenige große Anbieter große Mengen an eingesetzten ETH verwalten. Diese Entwicklung ist problematisch und muss so bald wie möglich korrigiert werden, jedoch ist die Situation differenzierter, als es zunächst den Anschein hat. Zentralisierte Staking-Anbieter verfügen nicht zwangsläufig über eine zentrale Kontrolle über Validatoren – oft nutzen sie den Prozess nur als Möglichkeit, einen zentralen ETH-Pool zu schaffen, in den viele unabhängige Node-Betreiber Kapital einsetzen können, ohne dass jeder einzelne Teilnehmer 32 ETH beisteuern muss. +Andererseits hat die Erfindung von Liquid-Staking-Derivaten zu Zentralisierungsbedenken geführt, da einige wenige große Anbieter große Mengen an gestakten ETH verwalten. Dies ist problematisch und muss so schnell wie möglich korrigiert werden, aber es ist auch nuancierter, als es scheint. Zentralisierte Staking-Anbieter haben nicht zwangsläufig die zentralisierte Kontrolle über Validatoren – oft ist es nur eine Möglichkeit, einen zentralen Pool von ETH zu schaffen, den viele unabhängige Blockchain-Knoten-Betreiber staken können, ohne dass jeder Teilnehmer 32 eigene ETH benötigt. -Die beste Option für Ethereum sind Validatoren, die lokal auf Heimcomputern betrieben werden und mit denen ein maximales Ausmaß an Dezentralisierung erreicht werden kann. Aus diesem Grund wehrt sich Ethereum gegen Änderungen, die die Hardwareanforderungen für den Betrieb eines Nodes/Validators erhöhen. +Die beste Option für Ethereum ist, dass Validatoren lokal auf Heimcomputern ausgeführt werden, was die Dezentralisierung maximiert. Aus diesem Grund widersetzt sich Ethereum Änderungen, die die Hardwareanforderungen für den Betrieb eines Blockchain-Knotens/Validators erhöhen. ## Nachhaltigkeit {#sustainability} -Proof-of-Stake ist ein kohlenstoffarmer Weg zur Sicherung der Blockchain. Unter Proof-of-Work konkurrieren Miner um das Recht, einen Block zu schürfen. Miner sind erfolgreicher, wenn sie ihre Berechnungen schneller durchführen können. Das schafft Anreize für Investitionen in die Hardware und sorgt für höheren Energieverbrauch. Dies wurde für Ethereum vor dem Wechsel zu Proof-of-Stake beobachtet. Kurz vorm Übergang zu Proof-of-Stake verbrauchte Ethereum ungefähr 78 TWh/Jahr gebraucht – so viel wie ein kleines Land. Der Wechsel zu Proof-of-Stake hat den Energieverbrauch hingegen um ~99,98 % gesenkt. Proof-of-Stake machte Ethereum zu einer energieeffizienten Plattform, für die wenig Kohlenstoff ausgestoßen wird. +Proof-of-Stake ist eine kohlenstoffarme Methode zur Absicherung der Blockchain. Unter Proof-of-Work konkurrieren Miner um das Recht, einen Block zu minen. Miner sind erfolgreicher, wenn sie Berechnungen schneller durchführen können, was Investitionen in Hardware und Energieverbrauch anreizt. Dies wurde bei Ethereum beobachtet, bevor es zu Proof-of-Stake wechselte. Kurz vor dem Übergang zu Proof-of-Stake verbrauchte Ethereum etwa 78 TWh/Jahr – so viel wie ein kleines Land. Der Wechsel zu Proof-of-Stake reduzierte diesen Energieaufwand jedoch um ~99,98 %. Proof-of-Stake machte Ethereum zu einer energieeffizienten, kohlenstoffarmen Plattform. -[Mehr über Ethereums Energieverbrauch](/energy-consumption) +[Mehr über den Energieverbrauch von Ethereum](/energy-consumption) -## Ausgabe {#issuance} +## Emission {#issuance} -Proof-of-Stake-Ethereum kann für seine Sicherheit bezahlen, indem viel weniger Münzen als bei Proof-of-Work-Ethereum ausgeben werden, da die Validatoren keine hohen Stromkosten bezahlen müssen. Infolgedessen kann ETH seine Inflation verringern oder sogar deflationär werden, sollten große Mengen an ETH verbrannt werden. Niedrigere Inflationsniveaus bedeuten, dass Ethereums Sicherheit günstiger ist, als das unter Proof-of-Work der Fall gewesen war. +Das Proof-of-Stake-Ethereum kann für seine Sicherheit bezahlen, indem es weitaus weniger Coins ausgibt als das Proof-of-Work-Ethereum, da Validatoren keine hohen Stromkosten zahlen müssen. Infolgedessen kann ETH seine Inflation reduzieren oder sogar deflationär werden, wenn große Mengen an ETH verbrannt werden. Niedrigere Inflationsraten bedeuten, dass die Sicherheit von Ethereum billiger ist als unter Proof-of-Work. -## Eher der visuelle Lernende? {#visual-learner} +## Lernen Sie besser visuell? {#visual-learner} -Hier erklärt Justin Drake die Vorteile von Proof-of-Stake im Vergleich zu Proof-of-Work: +Sehen Sie sich an, wie Justin Drake die Vorteile von Proof-of-Stake gegenüber Proof-of-Work erklärt: -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Vitaliks Designphilosophie für Proof-of-Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [Vitaliks Proof-of-Stake-Designphilosophie](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) - [Vitaliks Proof-of-Stake-FAQs](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) -- [„Einfach erklärt“-Video zu PoS vs. PoW](https://www.youtube.com/watch?v=M3EFi_POhps) +- ["Simply Explained"-Video über PoS vs. PoW](https://www.youtube.com/watch?v=M3EFi_POhps) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md index 5cd6ed7434c..b79e841ecb5 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md @@ -1,34 +1,34 @@ --- -title: Proof-of-Stake-Belohnungen und -Bestrafungen -description: Erfahren Sie mehr über die protokollinternen Anreize auf Proof-of-Stake-Ethereum. +title: Proof-of-Stake-Belohnungen und -Strafen +description: "Erfahren Sie mehr über die protokollinternen Anreize in Proof-of-Stake-Ethereum." lang: de --- -Ethereum wird durch seine native Kryptowährung Ether (ETH) gesichert. Node-Betreiber, die an der Validierung von Blöcken und der Identifizierung der Spitze der Chain teilnehmen möchten, zahlen Ether in den [Einzahlungsvertrag](/staking/deposit-contract/) auf Ethereum ein. Sie werden dann in Ether dafür bezahlt, dass sie eine Validatorensoftware laufen lassen. Diese prüft die Gültigkeit neuer Blöcke, die über das Peer-to-Peer-Netzwerk empfangen werden, und wendet den Abspaltungs-Wahl-Algorithmus an, um die Spitze der Chain zu identifizieren. +[Ethereum](/) wird durch seine native Kryptowährung, Ether (ETH), gesichert. Betreiber von Blockchain-Knoten, die an der Validierung von Blöcken und der Identifizierung der Spitze der Chain teilnehmen möchten, zahlen Ether in den [Einzahlungsvertrag](/staking/deposit-contract/) auf Ethereum ein. Sie werden dann in Ether bezahlt, um Validator-Software auszuführen, die die Gültigkeit neuer Blöcke überprüft, die über das Peer-to-Peer-Netzwerk empfangen werden, und den Fork-Choice-Algorithmus anwenden, um die Spitze der Chain zu identifizieren. -Es gibt zwei Hauptaufgaben für einen Validatoren: 1) Er prüft neue Blöcke und „attestiert“ deren Gültigkeit, 2) er schlägt neue Blöcke vor, falls er nach dem Zufallsprinzip aus dem gesamten Validatoren-Pool ausgewählt wurde. Wenn der Validator eine dieser Aufgaben ach Aufforderung nicht erfüllt, verpasst er die Ether-Auszahlung. Validatoren werden manchmal auch mit der Aggregierung von Signaturen und der Teilnahme an Synchronisierungskomitees beauftragt. +Es gibt zwei Hauptrollen für einen Validator: 1) Überprüfung neuer Blöcke und deren „Bestätigung“, wenn sie gültig sind, 2) Vorschlagen neuer Blöcke, wenn sie zufällig aus dem gesamten Validator-Pool ausgewählt werden. Wenn der Validator eine dieser Aufgaben nicht erfüllt, wenn er dazu aufgefordert wird, entgeht ihm eine Ether-Auszahlung. Validatoren werden manchmal auch mit der Signaturaggregation und der Teilnahme an Sync-Komitees beauftragt. -Es gibt auch einige Aktionen, die sehr schwer versehentlich durchzuführen sind und auf eine böswillige Absicht hindeuten. Dazu gehört etwa das Vorschlagen mehrerer Blöcke für denselben Slot oder das Attestieren für mehrere Blöcke aus demselben Slot. Das sind Verhaltensweisen, die mit Slashing bestraft werden können. Sie führen dazu, dass ein gewisser Betrag an Ether (bis zu 1 ETH) im Besitz des Validators verbrannt wird, bevor dieser aus dem Netzwerk entfernt wird, was 36 Tage dauert. Die Anzahl der Ether des mit Slashing sanktionierten Validatoren geht über den gesamten Zeitraum des Ausstiegs langsam zurück. An Tag 18 erhalten sie allerdings eine „Korrelationsstrafe“, die größer ist, wenn mehrere Validatoren zur gleichen Zeit mit Slashing bestraft werden. Die Anreizstruktur des Konsensmechanismus belohnt dadurch Ehrlichkeit und bestraft böswillige Akteure. +Es gibt auch einige Aktionen, die sehr schwer versehentlich durchzuführen sind und auf eine böswillige Absicht hindeuten, wie z. B. das Vorschlagen mehrerer Blöcke für denselben Slot oder die Bestätigung mehrerer Blöcke für denselben Slot. Dies sind Verhaltensweisen, die zu „Slashing“ führen, was zur Folge hat, dass dem Validator ein bestimmter Betrag an Ether (bis zu 1 ETH) verbrannt wird, bevor der Validator aus dem Netzwerk entfernt wird, was 36 Tage dauert. Das Ether des von Slashing betroffenen Validators fließt über die Austrittsphase langsam ab, aber an Tag 18 erhält er eine „Korrelationsstrafe“, die größer ist, wenn mehr Validatoren etwa zur gleichen Zeit von Slashing betroffen sind. Die Anreizstruktur des Konsensmechanismus belohnt daher Ehrlichkeit und bestraft böswillige Akteure. -Alle Belohnungen und Strafen werden in jeder Epoche einmal angewendet. +Alle Belohnungen und Strafen werden einmal pro Epoche angewendet. -Lesen Sie weiter und erfahren Sie mehr Details ... +Lesen Sie weiter für mehr Details... -## Belohnungen und Bestrafungen {#rewards} +## Belohnungen und Strafen {#rewards} ### Belohnungen {#rewards} -Validatoren erhalten Belohnungen, wenn sie Stimmen abgeben, die mit der Mehrheit der anderen Validatoren übereinstimmen, wenn sie Blöcke vorschlagen und wenn sie an Synchronisierungs-Komitees teilnehmen. Der Wert der Belohnungen in jeder Epoche wird über eine `base_reward` berechnet. Von dieser Basiseinheit werden andere Belohnungen berechnet. Die `Base_Reward` stellt die durchschnittliche Belohnung dar, die ein Validator unter optimalen Bedingungen in jeder Epoche erhält. Sie wird wie folgt aus dem Effektivguthaben des Validatoren und der Gesamtzahl an aktiven Validatoren berechnet: +Validatoren erhalten Belohnungen, wenn sie Abstimmungen vornehmen, die mit der Mehrheit der anderen Validatoren übereinstimmen, wenn sie Blöcke vorschlagen und wenn sie an Sync-Komitees teilnehmen. Der Wert der Belohnungen in jeder Epoche wird aus einer `base_reward` berechnet. Dies ist die Basiseinheit, aus der andere Belohnungen berechnet werden. Die `base_reward` stellt die durchschnittliche Belohnung dar, die ein Validator unter optimalen Bedingungen pro Epoche erhält. Diese wird aus dem effektiven Guthaben des Validators und der Gesamtzahl der aktiven Validatoren wie folgt berechnet: ``` base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance)))) ``` -wenn `base_reward_factor` 64 ist, ist `base_rewards_per_epoch` 4 und `sum(active balance)` ist die Gesamtheit der eingesetzten Ether über alle aktiven Validatoren hinweg. +wobei `base_reward_factor` 64 ist, `base_rewards_per_epoch` 4 ist und `sum(active balance)` das gesamte eingesetzte Ether (Einsatz) aller aktiven Validatoren ist. -Das bedeutet, dass die Basisbelohnung proportional zum Effektivguthaben des Validatoren und invers proportional zur Anzahl der Validatoren auf dem Netzwerk ist. Je mehr Validatoren, desto höher die Gesamtausgabe (als `sqrt(N)`, aber desto kleiner die `base_reward` pro Validator (als `1/sqrt(N)`). Diese Faktoren beeinflussen die APR für das Staking eines Nodes. Lesen Sie die Gründe dafür in [Vitaliks Notizen](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Basisbelohnungen). +Das bedeutet, dass die Grundbelohnung proportional zum effektiven Guthaben des Validators und umgekehrt proportional zur Anzahl der Validatoren im Netzwerk ist. Je mehr Validatoren, desto größer ist die gesamte Emission (als `sqrt(N)`), aber desto kleiner ist die `base_reward` pro Validator (als `1/sqrt(N)`). Diese Faktoren beeinflussen den effektiven Jahreszins (APR) für einen Staking-Knoten. Lesen Sie die Begründung dafür in [Vitaliks Notizen](https://notes.ethereum.org/@vbuterin/serenity_design_rationale?type=view#Base-rewards). -Die Gesamtbelohnung wird dann als die Summe von fünf Komponenten berechnet, die jeweils eine Gewichtung haben, mit der sich bestimmen lässt, wie viel jede Komponente zur Gesamtbelohnung beiträgt. Die Komponenten sind: +Die Gesamtbelohnung wird dann als Summe von fünf Komponenten berechnet, die jeweils eine Gewichtung haben, die bestimmt, wie viel jede Komponente zur Gesamtbelohnung beiträgt. Die Komponenten sind: ``` 1. source vote: the validator has made a timely vote for the correct source checkpoint @@ -38,53 +38,54 @@ Die Gesamtbelohnung wird dann als die Summe von fünf Komponenten berechnet, die 5. proposer reward: the validator has proposed a block in the correct slot ``` -Die Gewichtungen für jede Komponoente lauten wie folgt: +Die Gewichtungen für jede Komponente sind wie folgt: ``` -TIMELY_SOURCE_WEIGHT uint64(14) -TIMELY_TARGET_WEIGHT uint64(26) -TIMELY_HEAD_WEIGHT uint64(14) -SYNC_REWARD_WEIGHT uint64(2) -PROPOSER_WEIGHT uint64(8) +TIMELY_SOURCE_WEIGHT uint64(14) +TIMELY_TARGET_WEIGHT uint64(26) +TIMELY_HEAD_WEIGHT uint64(14) +SYNC_REWARD_WEIGHT uint64(2) +PROPOSER_WEIGHT uint64(8) ``` -Die Summe dieser Gewichte beträgt 64. Die Belohnung ergibt sich aus der Summe der anwendbaren Gewichte geteilt durch 64. Ein Validator, der rechtzeitig Quell-, Ziel- und Spitzenstimmen abgegeben, einen Block vorgeschlagen sowie an einem Synchronisierungs-Komitee teilgenommen hat, könnte `64/64 * base_reward == base_reward` erhalten. Jedoch ist ein Validator normalerweise kein Block-Proposer, weshalb seine maximale Belohnung `64-8 /64 * base_reward == 7/8 * base_reward` beträgt. Validatoren, die weder Block-Proposer noch in einem Synchronisierungskomitee sind, können `64-8-2 / 64 * base_reward == 6.75/8 * base_reward` erhalten. +Die Summe dieser Gewichtungen ergibt 64. Die Belohnung wird als Summe der anwendbaren Gewichtungen geteilt durch 64 berechnet. Ein Validator, der rechtzeitig Source-, Target- und Head-Abstimmungen vorgenommen, einen Block vorgeschlagen und an einem Sync-Komitee teilgenommen hat, könnte `64/64 * base_reward == base_reward` erhalten. Ein Validator ist jedoch normalerweise kein Block-Vorschlagender, sodass seine maximale Belohnung `64-8 /64 * base_reward == 7/8 * base_reward` beträgt. Validatoren, die weder Block-Vorschlagende sind noch in einem Sync-Komitee sitzen, können `64-8-2 / 64 * base_reward == 6.75/8 * base_reward` erhalten. -Eine zusätzliche Belohnung wird als Anreiz für schnelle Attestierungen hinzugefügt. Dies ist die `inclusion_delay_reward`. Sie hat denselben Wert wie die `base_reward` mal `1/delay`, wobei `delay` die Anzahl an Slots ist, die das Block-Proposal und die Attestierungen trennen. Wird die Attestierung beispielsweise innerhalb eines Slots des Block-Proposals eingereicht, erhält der Attestierer `base_reward * 1/1 == base_reward`. Wenn die Attestierung im nächsten Slot eintrifft, erhält der Attestierer `base_reward * 1/2` und so weiter. +Eine zusätzliche Belohnung wird hinzugefügt, um schnelle Bestätigungen zu fördern. Dies ist die `inclusion_delay_reward`. Diese hat einen Wert, der der `base_reward` multipliziert mit `1/delay` entspricht, wobei `delay` die Anzahl der Slots ist, die den Blockvorschlag und die Bestätigung trennen. Wenn die Bestätigung beispielsweise innerhalb eines Slots nach dem Blockvorschlag eingereicht wird, erhält der Bestätigende `base_reward * 1/1 == base_reward`. Wenn die Bestätigung im nächsten Slot eintrifft, erhält der Bestätigende `base_reward * 1/2` und so weiter. -Block-Proposer erhalten `8 / 64 * base_reward` für **jede im Block enthaltene gültige Attestierung**. Der echte Wert der Belohnung skaliert also mit der Anzahl an attestierenden Validatoren. Block-Proposer können ihre Belohnungen auch erhöhen, wenn sie Beweise für das Fehlverhalten anderer Validatoren in den von ihnen vorgeschlagenen Block mit aufnehmen. Diese Belohnungen sind das „Zuckerbrot“, das ehrliches Verhalten vonseiten der Validatoren fördert. Ein Block-Proposer einschließlich Slashing wird mit dem `slashed_validators_effective_balance / 512` belohnt. +Block-Vorschlagende erhalten `8 / 64 * base_reward` für **jede gültige Bestätigung**, die im Block enthalten ist, sodass der tatsächliche Wert der Belohnung mit der Anzahl der bestätigenden Validatoren skaliert. Block-Vorschlagende können ihre Belohnung auch erhöhen, indem sie Beweise für Fehlverhalten anderer Validatoren in ihren vorgeschlagenen Block aufnehmen. Diese Belohnungen sind die „Karotten“, die die Ehrlichkeit der Validatoren fördern. Ein Block-Vorschlagender, der ein Slashing einschließt, wird mit der `slashed_validators_effective_balance / 512` belohnt. ### Strafen {#penalties} -Bisher haben wir uns nur mit Validatoren beschäftigt, die sich benehmenden. Was aber ist mit Validatoren, die nicht rechtzeitig für Spitze, Quelle und Ziel abstimmen oder dies nur langsam tun? +Bisher haben wir uns perfekt verhaltende Validatoren betrachtet, aber was ist mit Validatoren, die nicht rechtzeitig Head-, Source- und Target-Abstimmungen vornehmen oder dies nur langsam tun? -Die Strafen für das Verpassen der Ziel- und Quellstimmen entsprechen den Belohnungen, die der Attestierer erhalten hätte, wenn er sie eingereicht hätte. Das bedeutet, dass die Belohnung ihrem Guthaben nicht hinzugefügt wird, sondern der gleiche Wert von ihrem Guthaben abgezogen wird. Es gibt keine Strafe für das Verpassen der Spitzenabstimmung („Head Vote“) (d. h. für Spitzenabstimmungen gibt es nur Belohnungen, niemals Strafen). Es gibt keine mit der `inclusion_delay` verbundene Strafe – die Belohnung wird einfach nicht zum Guthaben des Validatoren hinzugefügt. Es gibt auch keine Strafe für das Versäumnis, einen Block vorzuschlagen. +Die Strafen für das Verpassen der Target- und Source-Abstimmungen entsprechen den Belohnungen, die der Bestätigende erhalten hätte, wenn er sie eingereicht hätte. Das bedeutet, dass anstelle der Hinzufügung der Belohnung zu ihrem Guthaben ein gleicher Wert von ihrem Guthaben abgezogen wird. Es gibt keine Strafe für das Verpassen der Head-Abstimmung (d. h. Head-Abstimmungen werden nur belohnt, niemals bestraft). Es gibt keine Strafe im Zusammenhang mit der `inclusion_delay` – die Belohnung wird dem Guthaben des Validators einfach nicht hinzugefügt. Es gibt auch keine Strafe für das Versäumnis, einen Block vorzuschlagen. -Lesen Sie mehr zu Belohnungen und Strafen in den [Konsensspezifikationen](https://github.com/ethereum/consensus-specs/blob/master/specs/altair/beacon-chain.md). Belohnungen und Strafen wurden im Bellatrix-Upgrade angepasst – sehen Sie zu, wie Danny Ryan und Vitalik dies in einem [Peep an EIP-Video](https://www.youtube.com/watch?v=iaAEGs1DMgQ) diskutieren. +Lesen Sie mehr über Belohnungen und Strafen in den [Konsens-Spezifikationen](https://github.com/ethereum/consensus-specs/blob/master/specs/altair/beacon-chain.md). Belohnungen und Strafen wurden im Bellatrix-Upgrade angepasst – sehen Sie sich an, wie Danny Ryan und Vitalik dies in diesem [Peep an EIP-Video](https://www.youtube.com/watch?v=iaAEGs1DMgQ) diskutieren. ## Slashing {#slashing} -Slashing ist eine schwerwiegendere Maßnahme, die zum gewaltsamen Ausschluss eines Validators aus dem Netzwerk und dem damit verbundenen Verlust seiner eingesetzten Ether führt. Es gibt drei Möglichkeiten, wie ein Validator „geslasht“ werden kann. Alle laufen auf den unehrlichen Vorschlag oder die Attestierung von Blöcken hinaus: +Slashing ist eine schwerwiegendere Maßnahme, die zur zwangsweisen Entfernung eines Validators aus dem Netzwerk und einem damit verbundenen Verlust seines eingesetzten Ethers führt. Es gibt drei Möglichkeiten, wie ein Validator von Slashing betroffen sein kann, die alle auf den unehrlichen Vorschlag oder die Bestätigung von Blöcken hinauslaufen: -- durch das Vorschlagen und Signieren von zwei unterschiedlichen Blöcken für denselben Slot -- duch das Attestieren für einen Block, der einen anderen „umgibt“ (was die Historie faktisch verändert) -- durch „doppeltes Abstimmen“, indem für zwei Kandidaten für denselben Block attestiert wird +- Durch das Vorschlagen und Signieren von zwei verschiedenen Blöcken für denselben Slot +- Durch die Bestätigung eines Blocks, der einen anderen „umgibt“ (was effektiv die Historie ändert) +- Durch „doppelte Abstimmung“, indem zwei Kandidaten für denselben Block bestätigt werden -Wenn diese Aktionen erkannt werden, wird der Validator geslasht. Das bedeutet, dass 1/32 des von ihm eingesetzten Ether (bis zu maximal 1 Ether) direkt verbrannt werden, danach beginnt ein 36-tägiger Löschungszeitraum. Während dieses Löschungszeitraums verringert sich der Stake des Validatoren allmählich bis auf null. Zum Mittelpunkt (Tag 18) wird eine zusätzliche Strafe verhängt. Deren Höhe richtet sich nach dem Gesamteinsatz aller mit Slashing sanktionierten Validatoren in den 36 Tagen vor dem Slashing-Ereignis. Dies bedeutet, dass sich das Ausmaß des Slashings erhöht, wenn mehrere Validatoren mit Slashing bestraft werden. Der maximale Slashing-Betrag ist das volle Effektivguthaben aller Validatoren, die mit Slashing sanktioniert wurden (d. h. wenn viele Validatoren mit Slashing bestraft werden, könnten sie ihren gesamten Stake verlieren). Andererseits wird nach einem einzigen, isolierten Slashing-Ereignis nur ein kleiner Anteil des Validatoren-Stakes verbrannt. Diese mit der Anzahl der Validatoren skalierende Mittelpunktstrafe wird als „Korrelationsstrafe“ bezeichnet. +Wenn diese Aktionen erkannt werden, wird der Validator von Slashing betroffen. Das bedeutet, dass für einen 32-ETH-Validator sofort 0,0078125 verbrannt werden (linear skaliert mit dem aktiven Guthaben), woraufhin eine 36-tägige Entfernungsfrist beginnt. Während dieser Entfernungsfrist fließt der Einsatz des Validators allmählich ab. Zur Halbzeit (Tag 18) wird eine zusätzliche Strafe verhängt, deren Höhe mit dem gesamten eingesetzten Ether aller von Slashing betroffenen Validatoren in den 36 Tagen vor dem Slashing-Ereignis skaliert. Das bedeutet, dass die Höhe des Slashings zunimmt, wenn mehr Validatoren von Slashing betroffen sind. Das maximale Slashing ist das volle effektive Guthaben aller von Slashing betroffenen Validatoren (d. h., wenn viele Validatoren von Slashing betroffen sind, könnten sie ihren gesamten Einsatz verlieren). Andererseits verbrennt ein einzelnes, isoliertes Slashing-Ereignis nur einen kleinen Teil des Einsatzes des Validators. Diese Halbzeitstrafe, die mit der Anzahl der von Slashing betroffenen Validatoren skaliert, wird als „Korrelationsstrafe“ bezeichnet. -## Inactivity Leak {#inactivity-leak} +## Inaktivitätsleck {#inactivity-leak} -Wenn es in der Konsensebene mehr als vier Epochen lang zu keiner Finalisierung kam, wird ein Notfallprotokoll namens „Inactivity Leak“ aktiviert. Das ultimative Ziel des Inactivity Leak ist es, die Bedingungen dafür zu schaffen, dass die Chain Endgültigkeit wiedererlangen kann. Wie oben erläutert erfordert die Endgültigkeit eine 2/3-Mehrheit des gesamten eingesetzten Ethers, um sich auf Quell- und Ziel-Checkpoints zu einigen. Wenn Validatoren, die mehr als 1/3 der gesamten Validatoren repräsentieren, offline gehen oder es versäumen, korrekten Attestierungen einzureichen, ist es für eine 2/3-Supermajority nicht möglich, die Checkpoints zu finalisieren. Das Inactivity Leak sorgt dafür, dass der Stake der inaktiven Validatoren allmählich verschwindet, bis sie weniger als 1/3 des gesamten Stakes kontrollieren, sodass die verbleibenden aktiven Validatoren die Chain finalisieren können. Wie groß der Pool der inaktiven Validatoren auch sein mag, die verbleibenden aktiven Validatoren werden schließlich >2/3 des Stakes kontrollieren. Der Verlust von Stake ist ein starker Anreiz für inaktive Validatoren, so schnell wie möglich wieder aktiv zu werden! Zu einem Szenario mit Inactivity Leak kam es auf dem Medalle-Testnetz, als \<66 % der aktiven Validatoren in der Lage waren, einen Konsens zur derzeitigen Spitze der Blockchain zu erreichen. Das Inactivity Leak wurde aktiviert und später wurde die Endgültigkeit zurückgewonnen! +Wenn die Konsensebene mehr als vier Epochen ohne Finalisierung durchlaufen hat, wird ein Notfallprotokoll namens „Inaktivitätsleck“ (Inactivity Leak) aktiviert. Das ultimative Ziel des Inaktivitätslecks ist es, die Bedingungen zu schaffen, die erforderlich sind, damit die Chain die Finalität wiedererlangt. Wie oben erklärt, erfordert die Finalität eine 2/3-Mehrheit des gesamten eingesetzten Ethers, um sich auf Source- und Target-Checkpoints zu einigen. Wenn Validatoren, die mehr als 1/3 der gesamten Validatoren repräsentieren, offline gehen oder keine korrekten Bestätigungen einreichen, ist es für eine 2/3-Supermehrheit nicht möglich, Checkpoints zu finalisieren. Das Inaktivitätsleck lässt den Einsatz, der den inaktiven Validatoren gehört, allmählich abfließen, bis sie weniger als 1/3 des gesamten Einsatzes kontrollieren, was es den verbleibenden aktiven Validatoren ermöglicht, die Chain zu finalisieren. Unabhängig davon, wie groß der Pool inaktiver Validatoren ist, werden die verbleibenden aktiven Validatoren schließlich >2/3 des Einsatzes kontrollieren. Der Verlust des Einsatzes ist ein starker Anreiz für inaktive Validatoren, sich so schnell wie möglich wieder zu reaktivieren! Ein Inaktivitätsleck-Szenario trat im Medalla-Testnet auf, als < 66 % der aktiven Validatoren in der Lage waren, einen Konsens über die aktuelle Spitze der Blockchain zu erzielen. Das Inaktivitätsleck wurde aktiviert und die Finalität wurde schließlich wiedererlangt! -Das Belohnungs-, Strafen- und Slashing-Design des Konsensmechanismus ermutigt die einzelnen Validatoren dazu, sich korrekt zu verhalten. Aus diesen Designentscheidungen ergibt sich jedoch ein System, das starke Anreize für eine gleichmäßige Verteilung der Validatoren auf mehrere Clients setzt und die Anreize zur Dominanz eines einzelnen Clients stark reduzieren sollte. +Das Design von Belohnungen, Strafen und Slashing des Konsensmechanismus ermutigt einzelne Validatoren, sich korrekt zu verhalten. Aus diesen Designentscheidungen entsteht jedoch ein System, das eine gleichmäßige Verteilung von Validatoren auf mehrere Anwendungen (Clients) stark fördert und die Dominanz einer einzelnen Anwendung stark benachteiligen soll. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [Upgrading Ethereum: The incentive layer](https://eth2book.info/altair/part2/incentives) - [Incentives in Ethereum's hybrid Casper protocol](https://arxiv.org/pdf/1903.04205.pdf) - [Vitalik's annotated spec](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1) - [Eth2 Slashing Prevention Tips](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) +- [Analysis of slashing penalties under EIP-7251](https://ethresear.ch/t/slashing-penalty-analysis-eip-7251/16509) _Quellen_ -- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_ +- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md index db3f053b9fc..ed7bf08a9e1 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md @@ -1,39 +1,39 @@ --- -title: Schwache Subjektivität -description: Eine Erklärung zur schwachen Subjektivität und deren Rolle in PoS-Ethereum. +title: "Schwache Subjektivität" +description: "Eine Erklärung der schwachen Subjektivität und ihrer Rolle im PoS-Ethereum." lang: de --- -Subjektivität in Blockchains bezieht sich auf die Abhängigkeit davon, dass soziale Informationen mit dem aktuellen Zustand übereinstimmen. Es kann mehrere gültige Abspaltungen geben, aus denen anhand der von anderen Peers im Netzwerk gesammelten Informationen eine Auswahl getroffen wird. Das Gegenteil davon ist die Objektivität, die sich auf Chains bezieht, bei denen es nur eine mögliche gültige Chain gibt, auf die sich alle Nodes zwangsläufig einigen können, indem sie ihre kodierten Regeln anwenden. Es gibt also auch einen dritten Zustand, bekannt als schwache Subjektivität. Dies bezieht sich auf eine Chain, die objektiv Fortschritte machen kann, nachdem ein erster „Informationskeim“ sozial abgerufen wurde. +Subjektivität bei Blockchains bezieht sich auf die Abhängigkeit von sozialen Informationen, um sich auf den aktuellen Zustand zu einigen. Es kann mehrere gültige Forks geben, aus denen anhand von Informationen ausgewählt wird, die von anderen Peers im Netzwerk gesammelt wurden. Das Gegenteil ist Objektivität, die sich auf Chains bezieht, bei denen es nur eine mögliche gültige Chain gibt, auf die sich alle Blockchain-Knoten durch Anwendung ihrer programmierten Regeln zwangsläufig einigen werden. Es gibt auch einen dritten Zustand, der als schwache Subjektivität (weak subjectivity) bekannt ist. Dies bezieht sich auf eine Chain, die objektiv fortschreiten kann, nachdem ein anfänglicher Informationskern sozial abgerufen wurde. ## Voraussetzungen {#prerequisites} -Um diese Seite zu verstehen, müssen zuerst die Grundlagen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) verstanden werden. +Um diese Seite zu verstehen, ist es notwendig, zunächst die Grundlagen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) zu verstehen. ## Welche Probleme löst die schwache Subjektivität? {#problems-ws-solves} -Subjektivität ist bei Proof-of-Stake-Blockchains inhärent, da die Auswahl der korrekten Chain aus mehreren Abspaltungen durch das Zählen historischer Stimmen erfolgt. Dies setzt die Blockchain mehreren Angriffsvektoren aus. Dazu gehören auch Langstreckenangriffe, bei denen Nodes, die sehr früh an der Chain beteiligt waren, eine alternative Abspaltung aufrechterhalten, die sie viel später zu ihrem eigenen Vorteil freigeben. Wenn 33 % der Validatoren ihren Stake zurückziehen, jedoch weiter attestieren und Blöcke produzieren, könnten diese andererseits eine alternative Abspaltung generieren, die mit der kanonischen Chain in Konflikt steht. Neue Nodes oder Nodes, die lange Zeit offline waren, wissen möglicherweise nicht, dass diese angreifenden Validatoren ihre Geldmittel zurückgezogen haben. Angreifer könnten sie also dazu bringen, einer falschen Chain zu folgen. Ethereum kann dieses Problem mit Angriffsvektoren lösen, indem es Beschränkungen auferlegt, die die subjektiven Aspekte des Mechanismus – und damit die Vertrauensannahmen – auf das absolute Minimum reduziert. +Subjektivität ist Proof-of-Stake-Blockchains inhärent, da die Auswahl der richtigen Chain aus mehreren Forks durch das Zählen historischer Stimmen erfolgt. Dies setzt die Blockchain mehreren Angriffsvektoren aus, einschließlich Long-Range-Angriffen (langfristige Angriffe), bei denen Blockchain-Knoten, die sehr früh an der Chain teilgenommen haben, einen alternativen Fork aufrechterhalten, den sie viel später zu ihrem eigenen Vorteil veröffentlichen. Alternativ könnten 33 % der Validatoren ihren Einsatz abheben, aber weiterhin bestätigen und Blöcke produzieren, wodurch sie einen alternativen Fork generieren könnten, der mit der kanonischen Chain in Konflikt steht. Neue Blockchain-Knoten oder Blockchain-Knoten, die lange Zeit offline waren, wissen möglicherweise nicht, dass diese angreifenden Validatoren ihre Gelder abgehoben haben, sodass Angreifer sie dazu verleiten könnten, einer falschen Chain zu folgen. [Ethereum](/) kann diese Angriffsvektoren lösen, indem es Einschränkungen auferlegt, die die subjektiven Aspekte des Mechanismus – und damit die Vertrauensannahmen – auf ein absolutes Minimum reduzieren. -## Checkpoints von schwacher Subjektivität {#ws-checkpoints} +## Checkpoints für schwache Subjektivität {#ws-checkpoints} -Schwache Subjektivität wird in Proof-of-Stake-Ethereum durch die Verwendung von „Checkpoints von schwacher Subjektivität“ implementiert. Dabei handelt es sich um State Roots, bei denen sich alle Nodes auf dem Netzwerk einig sind, dass sie zur kanonischen Chain gehören. Sie dienen demselben Zweck der „universellen Wahrheit“ wie Genesis-Blöcke, nur dass sie nicht an der Genesis-Position in der Blockchain sitzen. Der Abspaltungs-Wahl-Algorithmus vertraut darauf, dass der in diesem Checkpoint definierte Blockchain-Zustand korrekt ist und dass er die Chain von diesem Punkt an unabhängig und objektiv verifiziert. Die Checkpoints fungieren als „Rückkehrlimits“, da Blöcke, die sich vor Checkpoints von schwacher Subjektivität befinden, nicht verändert werden können. Dies untergräbt Langstreckenangriffe, indem Langstreckenabspaltungen als Teil des Mechanismusdesigns einfach als ungültig definiert werden. Wenn die Checkpoints von schwacher Subjektivität in einem geringeren Abstand zueinander liegen als der Zeitraum, in dem die Validatoren ihre Stakes zurückziehen können, wird sichergestellt, dass ein Validator, der die Chain aufspaltet, zumindest um einen gewissen Schwellenwert geslasht wird, bevor er seinen Stake abziehen kann, und dass neue Teilnehmer nicht von Validatoren, deren Stakes abgezogen wurden, zu falschen Abspaltungen verleitet werden können. +Schwache Subjektivität wird im Proof-of-Stake-Ethereum durch die Verwendung von „Checkpoints für schwache Subjektivität“ (weak subjectivity checkpoints) implementiert. Dies sind Zustands-Roots (state roots), bei denen sich alle Blockchain-Knoten im Netzwerk einig sind, dass sie zur kanonischen Chain gehören. Sie dienen demselben Zweck der „universellen Wahrheit“ wie Genesis-Blöcke, außer dass sie sich nicht an der Genesis-Position in der Blockchain. Der Fork-Auswahl-Algorithmus vertraut darauf, dass der in diesem Checkpoint definierte Blockchain-Zustand korrekt ist und dass er die Chain von diesem Punkt an unabhängig und objektiv verifiziert. Die Checkpoints fungieren als „Revert-Limits“ (Rücksetzungsgrenzen), da Blöcke, die sich vor Checkpoints für schwache Subjektivität befinden, nicht geändert werden können. Dies untergräbt Long-Range-Angriffe, indem Long-Range-Forks als Teil des Mechanismusdesigns einfach als ungültig definiert werden. Die Sicherstellung, dass die Checkpoints für schwache Subjektivität durch einen geringeren Abstand als die Auszahlungsfrist für Validatoren getrennt sind, stellt sicher, dass ein Validator, der die Chain forkt, zumindest um einen bestimmten Schwellenwert geslasht wird, bevor er seinen Einsatz abheben kann, und dass neue Teilnehmer nicht von Validatoren, deren Einsatz abgehoben wurde, auf falsche Forks gelockt werden können. -## Unterschiede zwischen Checkpoints von schwacher Subjektivität und finalisierten Blöcken {#difference-between-ws-and-finalized-blocks} +## Unterschied zwischen Checkpoints für schwache Subjektivität und finalisierten Blöcken {#difference-between-ws-and-finalized-blocks} -Finalisierte Blöcke und Checkpoints von schwacher Subjektivität werden von Ethereum-Nodes unterschiedlich behandelt. Wenn ein Node von zwei konkurrierenden finalisierten Blöcken erfährt, ist er zwischen den beiden hin- und hergerissen – er hat keine Möglichkeit, automatisch zu erkennen, welche die kanonische Abspaltung ist. Das ist symptomatisch für ein Konsensversagen. Im Gegensatz dazu lehnt ein Node einfach jeden Block ab, der im Widerspruch zu seinem Checkpoint von schwacher Subjektivität steht. Aus Sicht des Nodes stellt der Checkpoint von schwachen Subjektivität eine absolute Wahrheit dar, die nicht durch neues Wissen seiner Peers untergraben werden kann. +Finalisierte Blöcke und Checkpoints für schwache Subjektivität werden von Ethereum-Blockchain-Knoten unterschiedlich behandelt. Wenn ein Blockchain-Knoten auf zwei konkurrierende finalisierte Blöcke aufmerksam wird, ist er zwischen den beiden hin- und hergerissen – er hat keine Möglichkeit, automatisch zu erkennen, welcher der kanonische Fork ist. Dies ist symptomatisch für ein Konsensversagen. Im Gegensatz dazu lehnt ein Blockchain-Knoten einfach jeden Block ab, der mit seinem Checkpoint für schwache Subjektivität in Konflikt steht. Aus der Perspektive des Blockchain-Knotens stellt der Checkpoint für schwache Subjektivität eine absolute Wahrheit dar, die nicht durch neues Wissen von seinen Peers untergraben werden kann. ## Wie schwach ist schwach? {#how-weak-is-weak} -Der subjektive Aspekt von Proof-of-Stake für Ethereum besteht darin, dass ein aktueller Zustand (Checkpoint von schwacher Subjektivität) aus einer vertrauenswürdigen Quelle erforderlich ist, von der aus die Synchronisierung erfolgen kann. Das Risiko, einen schlechten Checkpoint von schwacher Subjektivität zu erhalten, ist sehr gering, da diese anhand mehrerer unabhängiger öffentlicher Quellen wie Block-Explorer oder mehrerer Nodes überprüft werden können. Jedoch ist immer ein gewisses Maß an Vertrauen für die Ausführung jeder Software-Anwendung erforderlich. Zum Beispiel muss den Software-Entwicklern genug Vertrauen entgegengebracht werden, dass sie eine ehrliche Software programmiert haben. +Der subjektive Aspekt von Ethereums Proof-of-Stake ist die Anforderung an einen aktuellen Zustand (Checkpoint für schwache Subjektivität) aus einer vertrauenswürdigen Quelle, von der aus synchronisiert werden soll. Das Risiko, einen schlechten Checkpoint für schwache Subjektivität zu erhalten, ist sehr gering, da diese mit mehreren unabhängigen öffentlichen Quellen wie Blocksuchmaschinen oder mehreren Blockchain-Knoten abgeglichen werden können. Es ist jedoch immer ein gewisses Maß an Vertrauen erforderlich, um eine Softwareanwendung auszuführen, zum Beispiel das Vertrauen darauf, dass die Softwareentwickler ehrliche Software produziert haben. -Ein Checkpoint von schwacher Subjektivität könnte sogar als Teil der Client-Software kommen. Ein Angreifer kann wohl nicht nur den Checkpoint in der Software, sondern genauso leicht auch die Software selbst korrumpieren. Es gibt keinen echten kryptowirtschaftlichen Weg, dieses Problem zu umgehen. Der Einfluss unseriöser Entwickler wird in Ethereum allerdings dadurch minimiert, dass mehrere unabhängige Client-Teams beteiligt sind. Jedes Team entwickelt äquivalente Software in unterschiedlichen Programmiersprachen und hat ein eigenes Interesse daran, eine ehrliche Blockchain aufrechtzuerhalten. Block-Explorer können auch Checkpoints von schwacher Subjektivität oder eine Möglichkeit zum Abgleich von Checkpoints, die von anderer Stelle stammen, mit einer zusätzlichen Quelle bereitstellen. +Ein Checkpoint für schwache Subjektivität kann sogar als Teil der Client-Software geliefert werden. Wohl oder übel kann ein Angreifer den Checkpoint in der Software korrumpieren und genauso leicht die Software selbst korrumpieren. Es gibt keinen wirklichen kryptoökonomischen Weg um dieses Problem herum, aber die Auswirkungen nicht vertrauenswürdiger Entwickler werden in Ethereum minimiert, indem es mehrere unabhängige Client-Teams gibt, die jeweils gleichwertige Software in verschiedenen Sprachen entwickeln und alle ein begründetes Interesse daran haben, eine ehrliche Chain aufrechtzuerhalten. Blocksuchmaschinen können auch Checkpoints für schwache Subjektivität bereitstellen oder eine Möglichkeit bieten, von anderswo erhaltene Checkpoints mit einer zusätzlichen Quelle abzugleichen. -Schließlich können Checkpoints von anderen Nodes angefordert werden; möglicherweise kann ein anderer Ethereum-Benutzer, der einen vollständigen Node betreibt, einen Checkpoint bereitstellen, den Validatoren dann mit Daten von einem Block-Explorer abgleichen können. Insgesamt kann das Vertrauen in den Anbieter eines Checkpoints von schwachen Subjektivität als ebenso problematisch angesehen werden wie das Vertrauen in die Client-Entwickler. Das erforderliche Vertrauen ist insgesamt gering. Es ist wichtig, darauf hinzuweisen, dass diese Überlegungen nur in dem sehr unwahrscheinlichen Fall wichtig werden, dass sich eine Mehrheit der Validatoren zusammenschließt, um eine alternative Abspaltung der Blockchain zu produzieren. Unter allen anderen Umständen gibt es nur eine Ethereum-Chain, aus der gewählt werden kann. +Schließlich können Checkpoints von anderen Blockchain-Knoten angefordert werden; vielleicht kann ein anderer Ethereum-Benutzer, der einen vollständigen Blockchain-Knoten (Full Node) betreibt, einen Checkpoint bereitstellen, den Validatoren dann anhand von Daten aus einer Blocksuchmaschine verifizieren können. Insgesamt kann das Vertrauen in den Anbieter eines Checkpoints für schwache Subjektivität als ebenso problematisch angesehen werden wie das Vertrauen in die Client-Entwickler. Das insgesamt erforderliche Vertrauen ist gering. Es ist wichtig zu beachten, dass diese Überlegungen nur in dem sehr unwahrscheinlichen Fall wichtig werden, dass eine Mehrheit der Validatoren sich verschwört, um einen alternativen Fork der Blockchain zu produzieren. Unter allen anderen Umständen gibt es nur eine Ethereum-Chain zur Auswahl. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Weak subjectivity in Eth2](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) +- [Schwache Subjektivität in Eth2](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) - [Vitalik: How I learned to love weak subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) -- [Weak subjectivity (Teku docs)](https://docs.teku.consensys.net/en/latest/Concepts/Weak-Subjectivity/) -- [Phase-0 Weak subjectivity guide](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/weak-subjectivity.md) -- [Analysis of weak subjectivity in Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) +- [Schwache Subjektivität (Teku-Dokumentation)](https://docs.teku.consensys.io/concepts/weak-subjectivity) +- [Leitfaden zur schwachen Subjektivität in Phase-0](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/weak-subjectivity.md) +- [Analyse der schwachen Subjektivität in Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md new file mode 100644 index 00000000000..4f3cecae980 --- /dev/null +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md @@ -0,0 +1,64 @@ +--- +title: Auszahlungsberechtigungen +description: "Eine Erklärung der Arten von Validator-Auszahlungsberechtigungen (0x00, 0x01, 0x02) und ihrer Auswirkungen für Ethereum-Staker." +lang: de +--- + +Jeder Validator verfügt über eine **Auszahlungsberechtigung** (Withdrawal Credential), die bestimmt, wie und wo seine als Einsatz (Stake) hinterlegten ETH und Belohnungen ausgezahlt werden können. Der Typ der Berechtigung wird durch das erste Byte angegeben: `0x00`, `0x01` oder `0x02`. Das Verständnis dieser Typen ist wichtig für Validatoren, die ihren Einsatz verwalten. + +## 0x00: Pre-Shapella-Berechtigungen {#0x00-credentials} + +Der Typ `0x00` ist das ursprüngliche Format der Auszahlungsberechtigung aus der Zeit vor dem Shapella-Upgrade (April 2023). Bei Validatoren mit diesem Berechtigungstyp ist keine Auszahlungsadresse auf der Ausführungsebene festgelegt, was bedeutet, dass ihre Gelder auf der Konsensebene gesperrt bleiben. Wenn Sie noch über `0x00`-Berechtigungen verfügen, müssen Sie ein Upgrade auf `0x01` oder `0x02` durchführen, bevor Sie Auszahlungen erhalten können. + +## 0x01: Veraltete Auszahlungsberechtigungen (Legacy) {#0x01-credentials} + +Der Typ `0x01` wurde mit dem Shapella-Upgrade eingeführt und wurde zum Standard für Validatoren, die eine Auszahlungsadresse auf der Ausführungsebene festlegen wollten. Mit `0x01`-Berechtigungen: + +- Jedes Guthaben über 32 ETH wird **automatisch** an Ihre Auszahlungsadresse **überwiesen** (Sweeping) +- Vollständige Ausstiege (Exits) durchlaufen die Standard-Ausstiegswarteschlange +- Belohnungen über 32 ETH können sich nicht verzinsen (Compounding) – sie werden regelmäßig abgebucht + +**Warum einige Validatoren immer noch 0x01 verwenden:** Es ist einfacher und vertraut. Viele Validatoren haben nach Shapella eingezahlt und verfügen bereits über diesen Typ, und er funktioniert gut für diejenigen, die automatische Auszahlungen von überschüssigem Guthaben wünschen. + +**Warum es nicht empfohlen wird:** Mit `0x01` verlieren Sie die Möglichkeit, Belohnungen über 32 ETH zu verzinsen (Compounding). Jeder Überschuss wird automatisch abgebucht, was das Verdienstpotenzial Ihres Validators einschränkt und eine separate Verwaltung der ausgezahlten Gelder erfordert. + +## 0x02: Zinseszins-Auszahlungsberechtigungen (Compounding) {#0x02-credentials} + +Der Typ `0x02` wurde mit dem Pectra-Upgrade eingeführt und ist heute die **empfohlene Wahl** für Validatoren. Validatoren mit `0x02`-Berechtigungen werden manchmal als „Compounding-Validatoren“ bezeichnet. + +Mit `0x02`-Berechtigungen: + +- Belohnungen über 32 ETH **verzinsen sich** in Schritten von 1 ETH bis zu einem maximalen effektiven Guthaben von 2048 ETH +- Teilweise Auszahlungen müssen manuell angefordert werden (automatische Abbuchungen erfolgen nur oberhalb der Grenze von 2048 ETH) +- Validatoren können mehrere 32-ETH-Validatoren zu einem einzigen Validator mit höherem Guthaben konsolidieren +- Vollständige Ausstiege werden weiterhin über die Standard-Ausstiegswarteschlange unterstützt + +Sowohl teilweise Auszahlungen als auch Konsolidierungen können über die [Launchpad Validator Actions](https://launchpad.ethereum.org/en/validator-actions) durchgeführt werden. + +**Warum Validatoren 0x02 bevorzugen sollten:** Es bietet eine bessere Kapitaleffizienz durch Zinseszins (Compounding), mehr Kontrolle darüber, wann Auszahlungen erfolgen, und unterstützt die Konsolidierung von Validatoren. Für Solo-Staker, die im Laufe der Zeit Belohnungen ansammeln, bedeutet dies, dass ihr effektives Guthaben – und damit ihre Belohnungen – ohne manuelles Eingreifen über 32 ETH hinaus wachsen kann. + +**Wichtig:** Sobald Sie von `0x01` zu `0x02` konvertieren, können Sie dies nicht mehr rückgängig machen. + +Eine detaillierte Anleitung zur Konvertierung in Typ-2-Berechtigungen und zur MaxEB-Funktion finden Sie auf der [MaxEB-Erklärungsseite](/roadmap/pectra/maxeb/). + +## Was sollte ich wählen? {#what-should-i-pick} + +- **Neue Validatoren:** Wählen Sie `0x02`. Es ist der moderne Standard mit besserem Zinseszins und mehr Flexibilität. +- **Bestehende 0x01-Validatoren:** Erwägen Sie die Konvertierung zu `0x02`, wenn Sie möchten, dass sich Belohnungen über 32 ETH verzinsen, oder wenn Sie planen, Validatoren zu konsolidieren. +- **Bestehende 0x00-Validatoren:** Führen Sie sofort ein Upgrade durch – Sie können keine Auszahlungen vornehmen, ohne Ihre Berechtigungen zu aktualisieren. Sie müssen zuerst zu `0x01` konvertieren, danach können Sie zu `0x02` konvertieren. + +## Tools zur Verwaltung von Auszahlungsberechtigungen {#withdrawal-credential-tools} + +Mehrere Tools unterstützen die Auswahl oder Konvertierung zwischen Berechtigungstypen: + +- **[Ethereum Staking Launchpad](https://launchpad.ethereum.org/en/validator-actions)** – Das offizielle Tool für Einzahlungen und die Verwaltung von Validatoren, einschließlich der Konvertierung von Berechtigungen und Konsolidierungen +- **[Pectra Staking Manager](https://pectrastaking.com)** – Web-Benutzeroberfläche mit Wallet-Connect-Unterstützung für Konvertierungen und Konsolidierungen +- **[Pectra Validator Ops CLI Tool](https://github.com/Luganodes/Pectra-Batch-Contract)** – Befehlszeilen-Tool für Batch-Konvertierungen +- **[Ethereal](https://github.com/wealdtech/ethereal)** – CLI-Tool für Ethereum-Operationen einschließlich der Verwaltung von Validatoren + +Eine vollständige Liste der Konsolidierungs-Tools und detaillierte Anweisungen zur Konvertierung finden Sie unter [MaxEB-Konsolidierungs-Tools](/roadmap/pectra/maxeb/#consolidation-tooling). + +## Weiterführende Literatur {#further-reading} + +- [Schlüssel im Proof-of-Stake-Ethereum](/developers/docs/consensus-mechanisms/pos/keys/) – Erfahren Sie mehr über Validator-Schlüssel und wie sie mit Auszahlungsberechtigungen zusammenhängen +- [MaxEB](/roadmap/pectra/maxeb/) – Detaillierter Leitfaden zum Pectra-Upgrade und zur Funktion des maximalen effektiven Guthabens \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md index ef3440a9afe..934fef09bb5 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md @@ -1,107 +1,107 @@ --- title: Proof-of-Work (PoW) -description: Eine Erklärung für das Proof-of-Work-Konsensprotokoll und seine Rolle in Ethereum. +description: "Eine Erklärung des Proof-of-Work-Konsensprotokolls und seiner Rolle in Ethereum." lang: de --- -Das Ethereum-Netzwerk hat zu Beginn einen Konsensmechanismus verwendet, der **[Proof-of-Work (PoW)](/developers/docs/consensus-mechanisms/pow)** beinhaltete. Das ermöglichte es den Nodes des Ethereum-Netzwerks, sich über den Status aller auf der Ethereum-Blockchain gespeicherten Informationen zu einigen, und verhinderte bestimmte Arten von wirtschaftlichen Angriffen. 2022 hat Ethereum jedoch Proof-of-Work abgeschaltet und stattdessen begonnen, [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) zu verwenden. +Das [Ethereum](/)-Netzwerk nutzte zu Beginn einen Konsensmechanismus, der **[Proof-of-Work (PoW)](/developers/docs/consensus-mechanisms/pow)** beinhaltete. Dies ermöglichte es den Blockchain-Knoten des Ethereum-Netzwerks, sich auf den Zustand aller auf der Ethereum-Blockchain aufgezeichneten Informationen zu einigen, und verhinderte bestimmte Arten von wirtschaftlichen Angriffen. Ethereum hat Proof-of-Work jedoch im Jahr 2022 abgeschaltet und stattdessen auf [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) umgestellt. - Proof-of-Work ist inzwischen veraltet. Ethereum verwendet Proof-of-Work nicht mehr als Teil seines Konsensmechanismus. Stattdessen nutzt Ethereum Proof-of-Stake. Lesen Sie mehr über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Staking](/staking/). + Proof-of-Work ist nun veraltet. Ethereum verwendet Proof-of-Work nicht mehr als Teil seines Konsensmechanismus. Stattdessen wird Proof-of-Stake verwendet. Lesen Sie mehr über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Staking](/staking/). ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst etwas über [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu informieren. ## Was ist Proof-of-Work (PoW)? {#what-is-pow} -Der Nakamoto-Konsens, der Proof-of-Work nutzt, ist der Mechanismus, der es dem dezentralisierten Ethereum-Netzwerk früher ermöglichte, einen Konsens zu erzielen (d. h., alle Knoten stimmen überein) – beispielsweise über Kontostände und die Reihenfolge von Transaktionen. Das verhinderte, dass Benutzer ihre Münzen „doppelt ausgeben“ konnten, und stellte sicher, dass die Ethereum-Kette extrem schwierig anzugreifen oder zu manipulieren war. Diese Sicherheitseigenschaften stammen jetzt stattdessen von Proof-of-Stake – unter Verwendung des Konsensmechanismus [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/). +Der Nakamoto-Konsens, der Proof-of-Work nutzt, ist der Mechanismus, der es dem dezentralisierten Ethereum-Netzwerk einst ermöglichte, einen Konsens (d. h. alle Blockchain-Knoten stimmen überein) über Dinge wie Kontostände und die Reihenfolge von Transaktionen zu erzielen. Dies hinderte Benutzer daran, ihre Coins "doppelt auszugeben" (Double Spending), und stellte sicher, dass die Ethereum-Chain extrem schwer anzugreifen oder zu manipulieren war. Diese Sicherheitseigenschaften stammen nun stattdessen von Proof-of-Stake unter Verwendung des Konsensmechanismus namens [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/). ## Proof-of-Work und Mining {#pow-and-mining} -Proof-of-Work ist der grundlegende Algorithmus, der den Schwierigkeitsgrad und die Regeln für die Arbeit der Miner bei Proof-of-Work-Blockchains festlegt. Mining ist die „Work“ (Arbeit) selbst. Es ist das Hinzufügen von gültigen Blöcken zur Kette. Das ist wichtig, da die Länge der Kette dem Netzwerk hilft, der richtigen Abzweigung der Blockchain zu folgen. Je mehr „Work“ erledigt ist, desto länger die Kette, und je höher die Blockzahl, desto sicherer kann das Netzwerk bezüglich des aktuellen Status sein. +Proof-of-Work ist der zugrunde liegende Algorithmus, der die Schwierigkeit und die Regeln für die Arbeit festlegt, die Miner auf Proof-of-Work-Blockchains leisten. Mining ist die "Arbeit" selbst. Es ist der Vorgang, der Chain gültige Blöcke hinzuzufügen. Dies ist wichtig, da die Länge der Chain dem Netzwerk hilft, dem richtigen Fork der Blockchain zu folgen. Je mehr "Arbeit" geleistet wird, desto länger ist die Chain, und je höher die Blocknummer, desto sicherer kann sich das Netzwerk über den aktuellen Zustand der Dinge sein. [Mehr über Mining](/developers/docs/consensus-mechanisms/pow/mining/) ## Wie funktionierte Ethereums Proof-of-Work? {#how-it-works} -Ethereums Transaktionen werden zu Blöcken verarbeitet. Im mittlerweile veralteten Proof-of-Work-Ethereum enthielt jeder Block: +Ethereum-Transaktionen werden in Blöcken verarbeitet. Im nun veralteten Proof-of-Work-Ethereum enthielt jeder Block: -- einen Block-Schwierigkeitsgrad – zum Beispiel: 3.324.092.183.262.715, -- einen mixHash – zum Beispiel, `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29`, -- eine Nonce – zum Beispiel: `0xd3ee432b4fb3d26b`. +- Blockschwierigkeit (block difficulty) – zum Beispiel: 3.324.092.183.262.715 +- mixHash – zum Beispiel: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` +- Nonce – zum Beispiel: `0xd3ee432b4fb3d26b` -Diese Blockdaten standen in direktem Zusammenhang zu Proof-of-Work. +Diese Blockdaten standen in direktem Zusammenhang mit Proof-of-Work. -### Die "Arbeit" (Work) in Proof-of-Work {#the-work} +### Die Arbeit in Proof-of-Work {#the-work} -Ethash, das Proof-of-Work-Protokoll, verlangte von Minern, dass sie sich an einem intensiven Trial-and-Error-Wettlauf beteiligten, um die Nonce für einen Block zu finden. Nur Blöcke mit einer gültigen Nonce konnten zur Kette hinzugefügt werden. +Das Proof-of-Work-Protokoll Ethash verlangte von den Minern, ein intensives Rennen von Versuch und Irrtum (Trial and Error) zu durchlaufen, um die Nonce für einen Block zu finden. Nur Blöcke mit einer gültigen Nonce konnten der Chain hinzugefügt werden. -Während des Wettlaufs zur Erstellung eines Blocks leitete ein Miner einen Datensatz, der nur durch das Herunterladen und Ausführen der vollständigen Kette erlangt werden konnte (wie ein Miner es tut), durch eine mathematische Funktion. Der Datensatz wurde verwendet, um einen mixHash unterhalb eines Ziels zu erzeugen, das durch die Blockschwierigkeit vorgegeben wird. Die beste Herangehensweise dafür ist die Trial-and-Error-Methode. +Beim Wettlauf um die Erstellung eines Blocks leitete ein Miner wiederholt einen Datensatz, der nur durch das Herunterladen und Ausführen der gesamten Chain (wie es ein Miner tut) erhalten werden konnte, durch eine mathematische Funktion. Der Datensatz wurde verwendet, um einen mixHash unterhalb eines Ziels zu generieren, das durch die Blockschwierigkeit vorgegeben ist. Der beste Weg, dies zu tun, ist durch Versuch und Irrtum. -Die Schwierigkeit bestimmte das Ziel für den Hash. Je niedriger das Ziel, desto kleiner der Satz gültiger Hashes. Einmal generiert war die Verifizierung für andere Miner und Clients unglaublich einfach. Selbst wenn sich eine Transaktion ändern sollte, war der Hash völlig anders und deutete auf Betrug hin. +Die Schwierigkeit bestimmte das Ziel für den Hash. Je niedriger das Ziel, desto kleiner die Menge der gültigen Hashes. Einmal generiert, war dies für andere Miner und Anwendungen unglaublich einfach zu verifizieren. Selbst wenn sich nur eine Transaktion ändern würde, wäre der Hash völlig anders und würde Betrug signalisieren. -„Hashing“ macht es leichter, Betrug zu erkennen. Aber auch der Proof-of-Work-Prozess selbst war eine große Abschreckung für Angriffe auf die Chain. +Hashing macht es einfach, Betrug zu erkennen. Aber Proof-of-Work als Prozess war auch eine große Abschreckung gegen Angriffe auf die Chain. -### Sicherheit von Proof-of-Work {#security} +### Proof-of-Work und Sicherheit {#security} -Die Miner wurden dazu angeregt, diese Arbeit auf der Haupt-Kette von Ethereum zu leisten. Für Untergruppen von Minern gab es wenig Anreiz, eine eigene Kette zu starten – das untergräbt das System. Bockchains verlassen sich auf einen einzigen Status als Quelle der Wahrheit. +Miner wurden dazu angeregt, diese Arbeit auf der Haupt-Ethereum-Chain zu verrichten. Es gab wenig Anreiz für eine Untergruppe von Minern, ihre eigene Chain zu starten – es untergräbt das System. Blockchains verlassen sich darauf, einen einzigen Zustand als Quelle der Wahrheit (Source of Truth) zu haben. -Das Ziel von Proof-of-Work bestand darin, die Chain zu verlängern. Die Gültigkeit der längsten Kette war am glaubwürdigsten, weil diese den größten Rechenaufwand zur Erzeugung erfordert hatte. Im PoW-System von Ethereum war es nahezu unmöglich, neue Blöcke zu erstellen, die Transaktionen löschen, gefälschte Transaktionen erstellen oder eine zweite Kette aufrechterhalten. Das liegt daran, dass ein bösartiger Miner immer schneller als alle anderen den Nonce des Blocks hätte lösen müssen. +Das Ziel von Proof-of-Work war es, die Chain zu verlängern. Die längste Chain war am glaubwürdigsten als die gültige, da für ihre Generierung die meiste Rechenarbeit geleistet wurde. Innerhalb von Ethereums PoW-System war es fast unmöglich, neue Blöcke zu erstellen, die Transaktionen löschen, gefälschte erstellen oder eine zweite Chain aufrechterhalten. Das liegt daran, dass ein böswilliger Miner die Block-Nonce immer schneller als alle anderen hätte lösen müssen. -Um konsequent bösartige, aber gültige Blöcke zu erstellen, hätte ein bösartiger Miner über 51 % der Mining-Leistung des Netzwerks benötigt, um alle anderen zu übertreffen. Diese Menge an „Work“ erfordert eine Menge teure Rechenleistung, und der aufgewendete Energieaufwand könnte sogar die bei dem Angriff erzielten Gewinne übersteigen. +Um beständig böswillige, aber gültige Blöcke zu erstellen, hätte ein böswilliger Miner über 51 % der Mining-Leistung des Netzwerks benötigt, um alle anderen zu schlagen. Diese Menge an "Arbeit" erfordert viel teure Rechenleistung, und die aufgewendete Energie hätte die bei einem Angriff erzielten Gewinne möglicherweise sogar übertroffen. -### Wirtschaftlichkeit von Proof-of-Work {#economics} +### Proof-of-Work-Ökonomie {#economics} -Proof-of-Work war auch dafür verantwortlich, neue Währung in das System einzuspeisen und Miner zur Ausführung der Arbeit zu motivieren. +Proof-of-Work war auch dafür verantwortlich, neue Währung in das System auszugeben und Miner zu motivieren, die Arbeit zu tun. -Seit dem [Konstantinopel-Upgrade](/ethereum-forks/#constantinople) wurden Miner, die erfolgreich einen Block erstellen, mit zwei frisch geprägten ETH und einem Teil der Transaktionsgebühren belohnt. Ommer-Blöcke wurden ebenfalls mit 1,75 ETH vergütet. Ommer-Blöcke waren gültige Blöcke, die von einem Miner praktisch zur selben Zeit erstellt wurden wie ein durch einen anderen Miner erstellter kanonischer Block. Die endgültige Bestimmung erfolgte anhand der Kette, auf die zuerst aufgebaut wurde. Zu Ommer-Blöcken kam es in der Regel durch Netzwerklatenzen. +Seit dem [Constantinople-Upgrade](/ethereum-forks/#constantinople) wurden Miner, die erfolgreich einen Block erstellten, mit zwei frisch geprägten ETH und einem Teil der Transaktionsgebühren belohnt. Ommer-Blöcke wurden ebenfalls mit 1,75 ETH vergütet. Ommer-Blöcke waren gültige Blöcke, die von einem Miner praktisch zur gleichen Zeit erstellt wurden, als ein anderer Miner den kanonischen Block erstellte, was letztendlich dadurch bestimmt wurde, auf welcher Chain zuerst aufgebaut wurde. Ommer-Blöcke traten normalerweise aufgrund von Netzwerklatenz auf. -## Endgültigkeit {#finality} +## Finalität {#finality} -Eine Transaktion hat bei Ethereum „Endgültigkeit“, wenn sie Teil eines Blocks ist, der sich nicht mehr ändern kann. +Eine Transaktion hat auf Ethereum "Finalität", wenn sie Teil eines Blocks ist, der sich nicht mehr ändern kann. -Da die Miner dezentral arbeiteten, konnten zwei gültige Blöcke gleichzeitig gemint werden. Das erzeugt eine temporäre Abzweigung. Letztendlich wurde eine dieser Ketten zur akzeptierten Kette, nachdem weitere Blöcke gemint und hinzugefügt wurden, wodurch die Kette länger wurde. +Da Miner auf dezentralisierte Weise arbeiteten, konnten zwei gültige Blöcke gleichzeitig gemint werden. Dies erzeugt einen temporären Fork. Letztendlich wurde eine dieser Chains zur akzeptierten Chain, nachdem nachfolgende Blöcke gemint und ihr hinzugefügt wurden, was sie länger machte. -Um es noch komplizierter zu machen, wurden Transaktionen, die auf der temporären Abzweigung abgelehnt wurden, möglicherweise nicht in die akzeptierte Kette aufgenommen. Das bedeutet, dass dies umgekehrt werden konnte. „Endgültigkeit“ bezieht sich also auf die Zeit, die Sie abwarten sollten, bevor Sie eine Transaktion als unumkehrbar betrachten. Unter dem vorherigen Proof-of-Work-Ethereum galt: Je mehr Blöcke auf einem spezifischen Block `N` gemint wurden, desto größer war das Vertrauen, dass die Transaktionen in `N` erfolgreich waren und nicht zurückgesetzt werden. Jetzt, mit Proof-of-Stake, ist die Finalisierung eine explizite Eigenschaft eines Blocks, keine wahrscheinliche. +Um die Dinge weiter zu verkomplizieren, wurden Transaktionen, die auf dem temporären Fork abgelehnt wurden, möglicherweise nicht in die akzeptierte Chain aufgenommen. Das bedeutet, dass sie rückgängig gemacht werden könnten. Finalität bezieht sich also auf die Zeit, die Sie warten sollten, bevor Sie eine Transaktion als unumkehrbar betrachten. Unter dem vorherigen Proof-of-Work-Ethereum galt: Je mehr Blöcke auf einem bestimmten Block `N` gemint wurden, desto höher war die Zuversicht, dass die Transaktionen in `N` erfolgreich waren und nicht rückgängig gemacht würden. Jetzt, mit Proof-of-Stake, ist die Finalisierung eine explizite und keine probabilistische Eigenschaft eines Blocks. -## Energieverbrauch von Proof-of-Work {#energy} +## Proof-of-Work-Energieverbrauch {#energy} -Ein Hauptkritikpunkt an Proof-of-Work ist die Menge an Energie, die benötigt wird, um das Netzwerk sicher zu halten. Um Sicherheit und Dezentralisierung zu erhalten, verbrauchte Ethereums Proof-of-Work große Mengen an Energie. Kurz vor der Umstellung auf Proof-of-Stake verbrauchten die Ethereum-Miner zusammen etwa 70 TWh/Jahr (ungefähr so viel wie die Tschechische Republik – laut [digiconomist](https://digiconomist.net/) am 18. Juli 2022). +Ein Hauptkritikpunkt an Proof-of-Work ist die Menge an Energie, die erforderlich ist, um das Netzwerk sicher zu halten. Um Sicherheit und Dezentralisierung aufrechtzuerhalten, verbrauchte Ethereum unter Proof-of-Work große Mengen an Energie. Kurz vor dem Wechsel zu Proof-of-Stake verbrauchten die Ethereum-Miner zusammen etwa 70 TWh/Jahr (etwa so viel wie die Tschechische Republik – laut [digiconomist](https://digiconomist.net/) am 18. Juli 2022). ## Vor- und Nachteile {#pros-and-cons} -| Vorteile | Nachteile | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| Proof-of-Work ist neutral. Du brauchst keine ETH, um loszulegen, und die Blockbelohnungen erlauben dir von 0 ETH auf einen positiven Kontostand zu kommen. Für [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) brauchst du zu Beginn ETH. | Proof-of-Work verbraucht so viel Energie, dass es schlecht für die Umwelt ist. | -| Proof-of-Work ist ein bewährter Konsensmechanismus, der Bitcoin und Ethereum seit vielen Jahren sicher und dezentralisiert macht. | Wenn du Mining betreiben willst, brauchst du eine so spezielle Ausrüstung, dass es eine große Investition ist, damit anzufangen. | -| Verglichen mit dem Proof-of-Stake ist es relativ einfach zu implementieren. | Da immer mehr Rechenleistung benötigt wird, könnten Mining-Pools das Mining-Geschäft dominieren, was zu Zentralisierung und Sicherheitsrisiken führt. | +| Vorteile | Nachteile | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| Proof-of-Work ist neutral. Sie benötigen keine ETH, um loszulegen, und Block-Belohnungen ermöglichen es Ihnen, von 0 ETH zu einem positiven Guthaben zu gelangen. Bei [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) benötigen Sie ETH, um zu beginnen. | Proof-of-Work verbraucht so viel Energie, dass es schlecht für die Umwelt ist. | +| Proof-of-Work ist ein erprobter und getesteter Konsensmechanismus, der Bitcoin und Ethereum über viele Jahre hinweg sicher und dezentralisiert gehalten hat. | Wenn Sie minen möchten, benötigen Sie so spezielle Ausrüstung, dass es eine große Investition ist, um anzufangen. | +| Im Vergleich zu Proof-of-Stake ist es relativ einfach zu implementieren. | Aufgrund des steigenden Rechenbedarfs könnten Mining-Pools potenziell das Mining-Geschäft dominieren, was zu Zentralisierung und Sicherheitsrisiken führt. | -## Vergleich mit Proof-of-Stake {#compared-to-pos} +## Im Vergleich zu Proof-of-Stake {#compared-to-pos} -Im Großen und Ganzen hat Proof-of-Stake dasselbe Ziel wie Proof-of-Work: dem dezentralen Netzwerk helfen, Konsens auf eine sichere Weise zu erzielen. Es gibt jedoch einige Unterschiede im Prozess und im Personal: +Auf hoher Ebene hat Proof-of-Stake das gleiche Endziel wie Proof-of-Work: dem dezentralisierten Netzwerk zu helfen, sicher einen Konsens zu erreichen. Es gibt jedoch einige Unterschiede im Prozess und beim Personal: -- Der Proof-of-Stake hebt die Bedeutung der Rechenleistung für die eingesetzte ETH auf. -- Beim Proof-of-Stake werden die Miner durch Validatoren ersetzt. Validatoren setzen ihre ETH ein ("Staking"), um die Fähigkeit, neue Blöcke zu erstellen, zu aktivieren. -- Validatoren konkurrieren nicht um Blöcke, sondern werden zufällig durch einen Algorithmus ausgewählt. -- Die Endgültigkeit ist klarer: Wenn sich 2/3 der Prüfer/Prüferinnen an bestimmten Kontrollpunkten über den Zustand des Blocks einig sind, gilt er als endgültig. Die Validatoren müssen ihren gesamten Einsatz darauf setzen. Wenn sie also versuchen, sich abzusprechen, verlieren sie ihren gesamten Einsatz. +- Proof-of-Stake tauscht die Bedeutung von Rechenleistung gegen gestakte ETH aus. +- Proof-of-Stake ersetzt Miner durch Validatoren. Validatoren setzen ihre ETH als Einsatz (Stake), um die Fähigkeit zur Erstellung neuer Blöcke zu aktivieren. +- Validatoren konkurrieren nicht um die Erstellung von Blöcken, sondern werden zufällig von einem Algorithmus ausgewählt. +- Finalität ist klarer: An bestimmten Checkpoints gilt ein Block als final, wenn 2/3 der Validatoren dem Zustand des Blocks zustimmen. Validatoren müssen ihren gesamten Einsatz darauf wetten. Wenn sie also später versuchen, sich abzusprechen, verlieren sie ihren gesamten Einsatz. [Mehr über Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -## Eher ein visueller Lerner? {#visual-learner} +## Lernen Sie eher visuell? {#visual-learner} -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Mehrheitsangriff](https://en.bitcoin.it/wiki/Majority_attack) -- [Zur Endgültigkeit der Abrechnung](https://blog.ethereum.org/2016/05/09/on-settlement-finality) +- [Mehrheitsangriff (Majority attack)](https://en.bitcoin.it/wiki/Majority_attack) +- [Über die Finalität der Abwicklung (On settlement finality)](https://blog.ethereum.org/2016/05/09/on-settlement-finality) ### Videos {#videos} @@ -111,4 +111,4 @@ Im Großen und Ganzen hat Proof-of-Stake dasselbe Ziel wie Proof-of-Work: dem de - [Mining](/developers/docs/consensus-mechanisms/pow/mining/) - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) +- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md index c015f445a5a..1aaae74125f 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -1,6 +1,6 @@ --- title: Mining -description: Wie funktionierte das Ethereum-Mining? +description: "Eine Erklärung, wie Mining auf Ethereum funktionierte." lang: de --- @@ -8,79 +8,79 @@ lang: de -Proof-of-Work ist nicht mehr der zugrunde liegende Konsensmechanismus von Ethereum, was bedeutet, dass das Mining ausgeschaltet wurde. Stattdessen wird Ethereum von Validatoren gesichert, die ETH staken. Du kannst schon heute mit dem Staking deiner ETH beginnen. Lese mehr dazu unter den Merge, Proof-of-Stake, und Staking. Diese Seite dient ausschließlich zu Archivierungszwecken, um Ereignisse rund um Ethereum zu dokumentieren. +Proof-of-Work liegt dem Konsensmechanismus von Ethereum nicht mehr zugrunde, was bedeutet, dass das Mining abgeschaltet wurde. Stattdessen wird [Ethereum](/) durch Validatoren gesichert, die ETH staken. Sie können noch heute mit dem Staking Ihrer ETH beginnen. Lesen Sie mehr über The Merge, Proof-of-Stake und Staking. Diese Seite ist nur von historischem Interesse. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) zu informieren. ## Was ist Ethereum-Mining? {#what-is-ethereum-mining} -Mining ist der Prozess der Erstellung eines Blocks von Transaktionen, der zur Ethereum-Blockchain in der mittlerweile veralteten Proof-of-Work-Architektur von Ethereum hinzugefügt werden soll. +Mining ist der Prozess der Erstellung eines Blocks von Transaktionen, der der Ethereum-Blockchain in der nun veralteten Proof-of-Work-Architektur von Ethereum hinzugefügt wird. -Das Wort Mining stammt aus dem Kontext der Goldanalogie für Kryptowährungen. Gold oder Edelmetalle sind knapp, digitale Token sind es auch, und die einzige Möglichkeit, das Gesamtvolumen in einem Proof-of-Work System zu erhöhen, ist das Mining. Beim Proof-of-Work von Ethereum erfolgte die Ausgabe ausschließlich durch Mining. Im Gegensatz zum Mining von Gold oder Edelmetallen, diente Mining bei Ethereum, durch das Kreieren, Verifizieren, Publizieren und Verteilen von Blocks in der Blockchain, auch der Sicherung des Netzwerkes. +Das Wort Mining stammt aus dem Kontext der Goldanalogie für Kryptowährungen. Gold oder Edelmetalle sind knapp, ebenso wie digitale Token, und die einzige Möglichkeit, das Gesamtvolumen in einem Proof-of-Work-System zu erhöhen, ist durch Mining. Im Proof-of-Work-Ethereum war die einzige Art der Emission das Mining. Im Gegensatz zu Gold oder Edelmetallen war das Ethereum-Mining jedoch auch die Methode, um das Netzwerk zu sichern, indem Blöcke in der Blockchain erstellt, verifiziert, veröffentlicht und verbreitet wurden. -Mining von Ether = Sicherung des Netzwerks +Ether minen = Das Netzwerk sichern -Mining ist das Lebenselixier jeder Proof-of-Work Blockchain. Ethereum-Miner – die Computer, auf denen die Software lief – investierten ihre Zeit und Rechenleistung, um Transaktionen zu verarbeiten und Blöcke zu generieren, bevor der Übergang zu Proof-of-Stake erfolgte. +Mining ist das Lebenselixier jeder Proof-of-Work-Blockchain. Ethereum-Miner – Computer, auf denen Software läuft – nutzten vor dem Übergang zu Proof-of-Stake ihre Zeit und Rechenleistung, um Transaktionen zu verarbeiten und Blöcke zu produzieren. ## Warum gibt es Miner? {#why-do-miners-exist} -In dezentralisierten Systemen wie Ethereum müssen wir sicherstellen, dass jeder mit der Reihenfolge der Transaktionen einverstanden ist. Miner halfen dabei, indem sie rechnerisch schwierige Puzzles lösten, um Blöcke zu produzieren und dabei das Netzwerk vor Attacken zu schützen. +In dezentralisierten Systemen wie Ethereum müssen wir sicherstellen, dass sich alle über die Reihenfolge der Transaktionen einig sind. Miner halfen dabei, indem sie rechenintensive Rätsel lösten, um Blöcke zu produzieren und das Netzwerk vor Angriffen zu sichern. [Mehr zu Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) -Zuvor war es jedem möglich, mit dem eigenen Computer im Ethereum-Netzwerk zu minen. Allerdings konnte nicht jeder profitabel Ether (ETH) minen. In den meisten Fällen mussten Miner dedizierte Computer-Hardware kauften und Zugang zu günstigen Energiequellen haben. Es war unwahrscheinlich, dass ein durchschnittlicher Computer genug Blockbelohnungen verdienen konnte, um die Kosten für das Mining zu kompensieren. +Zuvor konnte jeder mit seinem Computer im Ethereum-Netzwerk minen. Allerdings konnte nicht jeder Ether (ETH) profitabel minen. In den meisten Fällen mussten Miner spezielle Computerhardware kaufen und Zugang zu günstigen Energiequellen haben. Der durchschnittliche Computer verdiente wahrscheinlich nicht genug Block-Belohnungen, um die mit dem Mining verbundenen Kosten zu decken. -### Mining-Kosten {#cost-of-mining} +### Kosten des Minings {#cost-of-mining} -- Mögliche Kosten für die Hardware, die für den Bau und die Wartung einer Mining-Anlage erforderlich ist -- Stromkosten für den Betrieb der Mining-Anlage -- Wenn man Miner in einem Pool war, erhob der Pool üblicherweise eine pauschale prozentuale Gebühr für jeden im Pool generierten Block -- Mögliche Kosten für die Ausrüstung zur Unterstützung der Mining-Anlage (Belüftung, Energieüberwachung, elektrische Verkabelung usw.) +- Potenzielle Kosten für die Hardware, die zum Bau und zur Wartung eines Mining-Rigs erforderlich ist +- Stromkosten für den Betrieb des Mining-Rigs +- Wenn Sie in einem Pool gemint haben, berechneten diese Pools in der Regel eine pauschale prozentuale Gebühr für jeden vom Pool generierten Block +- Potenzielle Kosten für Ausrüstung zur Unterstützung des Mining-Rigs (Belüftung, Energieüberwachung, elektrische Verkabelung usw.) -Um die Rentabilität des Minings weiterzuerkunden, können Sie einen Mining-Rechner verwenden, beispielsweise den von [Etherscan](https://etherscan.io/ether-mining-calculator). +Um die Rentabilität des Minings weiter zu untersuchen, verwenden Sie einen Mining-Rechner, wie ihn [Etherscan](https://etherscan.io/ether-mining-calculator) anbietet. ## Wie Ethereum-Transaktionen gemint wurden {#how-ethereum-transactions-were-mined} -Im Folgenden wird ein Überblick darüber gegeben, wie Transaktionen in Ethereum-Proof-of-Work gemint wurden. Eine analoge Beschreibung dieses Prozesses für Ethereum-Proof-of-Stake finden Sie [hier](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). +Im Folgenden finden Sie einen Überblick darüber, wie Transaktionen im Ethereum-Proof-of-Work gemint wurden. Eine analoge Beschreibung dieses Prozesses für Ethereum-Proof-of-Stake finden Sie [hier](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Ein Benutzer schreibt und signiert eine Anfrage für eine [Transaktion](/developers/docs/transactions/) mit seinem privaten Schlüssel von einem [Konto](/developers/docs/accounts/). -2. Der Benutzer überträgt die Transaktionsanfrage von einigen [Nodes](/developers/docs/nodes-and-clients/) an das gesamte Ethereum-Netzwerk. -3. Wenn sie von der neuen Transaktionsanfrage hören, fügen alle Nodes die Anfrage ihrem lokalen Mempool (eine Liste aller Transaktionsanfragen, die noch nicht an die Blockchain übertragen wurden, von denen sie gehört haben) hinzu. -4. Irgendwann fasst ein Mining-Node mehrere Dutzend oder Hundert Transaktionsanfragen in einem potenziellen [Block](/developers/docs/blocks/) zusammen, sodass die [Transaktionsentgelte](/developers/docs/gas/), die sie verdienen, maximiert werden, während sie unter dem Block-Ressourcen-Limit bleiben. Zu diesem Zeitpunkt tut der Mining-Node Folgendes: - 1. Er überprüft die Gültigkeit jeder Transaktionsanfrage (z. B. es versucht keiner, die Ether von einem Konto ohne Signatur zu transferieren, die Anfrage ist nicht fehlerhaft etc.), führt dann den Code der Anfrage aus und ändert den Status ihrer lokalen Kopie der EVM. Die Miner erhalten die Transaktionsentgelte für jede dieser Transaktionsanfragen auf ihr eigenes Konto. - 2. Startet den Prozess der Erstellung des Proof-of-Work "Nachweiszertifikat der Legitimität" für den potenziellen Block, sobald alle Transaktionsanfragen in dem Block verifiziert und in der lokalen EVM-Kopie ausgeführt wurden. -5. Letztendlich wird ein Miner ein Zertifikat für einen Block erstellen, der unsere spezifische Transaktionsanfrage enthält. Dieser Miner sendet dann den vollendeten Block, der das Zertifikat und eine Prüfsumme des beanspruchten neuen EVM-Status enthält. -6. Andere Nodes hören von dem neuen Block. Sie prüfen das Zertifikat, führen alle Transaktionen in dem Block selbst aus (einschließlich der ursprünglich von unserem Nutzer übermittelten Transaktion) und überprüfen, ob die Prüfsumme von ihrem neuem EVM-Status nach der Ausführung aller Transaktionen mit der Prüfsumme aus dem vom Miner-Block selbst behaupteten Status übereinstimmt. Nur dann fügen diese Nodes den Block an den Schwanz ihrer Blockchain an und akzeptieren den neuen EVM-Status als kanonischen Status. -7. Jeder Node entfernt alle Transaktionen in dem neuen Block aus seinem lokalen Mempool aus unerfüllten Transaktionsanfragen. -8. Neue Knoten, die dem Netzwerk beitreten, laden alle Blöcke in Reihenfolge herunter, einschließlich des Blocks mit der von uns vefolgten Transaktion. Sie initialisieren eine lokale EVM-Kopie (diese startet als ein leerer EVM-Status), gehen dann durch den Ausführungsprozess jeder Transaktion in jedem Block an der Spitze der lokalen EVM-Kopie und überprüfen dabei in jedem Block die Prüfsummenstatus. +1. Ein Benutzer schreibt und signiert eine [Transaktionsanfrage](/developers/docs/transactions/) mit dem Private-Key eines [Kontos](/developers/docs/accounts/). +2. Der Benutzer sendet die Transaktionsanfrage von einem [Blockchain-Knoten](/developers/docs/nodes-and-clients/) an das gesamte Ethereum-Netzwerk. +3. Sobald ein Blockchain-Knoten im Ethereum-Netzwerk von der neuen Transaktionsanfrage erfährt, fügt er die Anfrage seinem lokalen Mempool hinzu, einer Liste aller Transaktionsanfragen, von denen er gehört hat und die noch nicht in einem Block in die Blockchain aufgenommen wurden. +4. Irgendwann fasst ein Mining-Knoten mehrere Dutzend oder Hundert Transaktionsanfragen zu einem potenziellen [Block](/developers/docs/blocks/) zusammen, und zwar so, dass die [Transaktionsgebühren](/developers/docs/gas/), die er verdient, maximiert werden, während er gleichzeitig unter das Gaslimit des Blocks fällt. Der Mining-Knoten führt dann Folgendes aus: + 1. Er verifiziert die Gültigkeit jeder Transaktionsanfrage (d. h. niemand versucht, Ether von einem Konto zu überweisen, für das er keine Signatur erstellt hat, die Anfrage ist nicht fehlerhaft usw.) und führt dann den Code der Anfrage aus, wodurch der Zustand seiner lokalen Kopie der EVM geändert wird. Der Miner schreibt die Transaktionsgebühr für jede dieser Transaktionsanfragen seinem eigenen Konto gut. + 2. Er beginnt mit dem Prozess der Erstellung des Proof-of-Work-„Legitimitätszertifikats“ für den potenziellen Block, sobald alle Transaktionsanfragen im Block verifiziert und auf der lokalen EVM-Kopie ausgeführt wurden. +5. Schließlich wird ein Miner die Erstellung eines Zertifikats für einen Block abschließen, der unsere spezifische Transaktionsanfrage enthält. Der Miner sendet dann den fertigen Block, der das Zertifikat und eine Prüfsumme des behaupteten neuen EVM-Zustands enthält. +6. Andere Blockchain-Knoten erfahren von dem neuen Block. Sie verifizieren das Zertifikat, führen alle Transaktionen auf dem Block selbst aus (einschließlich der ursprünglich von unserem Benutzer gesendeten Transaktion) und verifizieren, dass die Prüfsumme ihres neuen EVM-Zustands nach der Ausführung aller Transaktionen mit der Prüfsumme des vom Block des Miners behaupteten Zustands übereinstimmt. Erst dann hängen diese Blockchain-Knoten diesen Block an das Ende ihrer Blockchain an und akzeptieren den neuen EVM-Zustand als den kanonischen Zustand. +7. Jeder Blockchain-Knoten entfernt alle Transaktionen im neuen Block aus seinem lokalen Mempool unerfüllter Transaktionsanfragen. +8. Neue Blockchain-Knoten, die dem Netzwerk beitreten, laden alle Blöcke nacheinander herunter, einschließlich des Blocks, der unsere interessante Transaktion enthält. Sie initialisieren eine lokale EVM-Kopie (die als EVM mit leerem Zustand beginnt) und durchlaufen dann den Prozess der Ausführung jeder Transaktion in jedem Block auf ihrer lokalen EVM-Kopie, wobei sie die Zustandsprüfsummen bei jedem Block auf dem Weg verifizieren. -Jede Transaktion wird einmal gemint (in einen neuen Block eingeschlossen und zum ersten Mal propagiert), aber von jedem Teilnehmer im Prozess der Weitergabe des kanonischen EVM-Status ausgeführt und verifiziert. Dies hebt eines der wichtigsten Mantras der Blockchain hervor: **Nicht vertrauen – prüfen**. +Jede Transaktion wird einmal gemint (in einen neuen Block aufgenommen und zum ersten Mal verbreitet), aber von jedem Teilnehmer im Prozess der Weiterentwicklung des kanonischen EVM-Zustands ausgeführt und verifiziert. Dies unterstreicht eines der zentralen Mantras der Blockchain: **Nicht vertrauen, verifizieren** (Don’t trust, verify). -## Ommer(Onkel)-Blöcke {#ommer-blocks} +## Ommer- (Uncle-) Blöcke {#ommer-blocks} -Das Mining von Blöcken bei Proof-of-Work war probabilistisch, was bedeutet, dass manchmal aufgrund von Netzwerklatenz gleichzeitig zwei gültige Blöcke veröffentlicht wurden. In diesem Fall musste das Protokoll die längste (und daher „gültigste“) Kette bestimmen und gleichzeitig Fairness gegenüber den Minern gewährleisten, indem es den vorgeschlagenen, aber nicht einbezogenen gültigen Block teilweise belohnte. Das förderte eine weitere Dezentralisierung des Netzwerks, da kleinere Miner, die möglicherweise mit größerer Latenz konfrontiert sind, immer noch Erträge durch [Ommer](/glossary/#ommer)-Blockbelohnungen generieren konnten. +Das Block-Mining bei Proof-of-Work war probabilistisch, was bedeutet, dass aufgrund von Netzwerklatenz manchmal zwei gültige Blöcke gleichzeitig veröffentlicht wurden. In diesem Fall musste das Protokoll die längste (und damit „gültigste“) Kette bestimmen und gleichzeitig Fairness gegenüber den Minern gewährleisten, indem der vorgeschlagene, aber nicht aufgenommene gültige Block teilweise belohnt wurde. Dies förderte die weitere Dezentralisierung des Netzwerks, da kleinere Miner, die möglicherweise mit einer größeren Latenz konfrontiert waren, dennoch Erträge über [Ommer](/glossary/#ommer)-Block-Belohnungen erzielen konnten. -Der Begriff „Ommer" ist der bevorzugte geschlechtsneutrale Begriff für das Geschwisterteil eines Elternblocks, aber manchmal ist auch die Rede von „Onkel". **Seit dem Übergang von Ethereum zu Proof-of-Stake werden keine Ommer-Blöcke mehr gemint**, da in jedem Slot nur ein Vorschlaggeber gewählt wird. Sie können diese Veränderung im [Geschichtsdiagramm](https://ycharts.com/indicators/ethereum_uncle_rate) der geminten Ommer-Blöcke einsehen. +Der Begriff „Ommer“ ist der bevorzugte geschlechtsneutrale Begriff für das Geschwisterkind eines Elternblocks, wird aber manchmal auch als „Uncle“ (Onkel) bezeichnet. **Seit Ethereums Wechsel zu Proof-of-Stake werden Ommer-Blöcke nicht mehr gemint**, da in jedem Slot nur ein Block-Vorschlagender gewählt wird. Sie können diese Änderung sehen, indem Sie sich das [historische Diagramm](https://ycharts.com/indicators/ethereum_uncle_rate) der geminten Ommer-Blöcke ansehen. ## Eine visuelle Demo {#a-visual-demo} -Sehen Sie Austin bei einer Führung durch das Mining und die Proof-of-Work-Blockchain zu. +Sehen Sie zu, wie Austin Sie durch das Mining und die Proof-of-Work-Blockchain führt. ## Der Mining-Algorithmus {#mining-algorithm} -Das Ethereum-Mainnet hat immer nur einen Mining-Algorithmus verwendet – [„Ethash“](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash war der Nachfolger eines ursprünglichen Algorithmus für Forschung und Entwicklung namens [„Dagger-Hashimoto“](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/). +Das Ethereum-Mainnet verwendete immer nur einen Mining-Algorithmus – ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash war der Nachfolger eines ursprünglichen F&E-Algorithmus, der als ['Dagger-Hashimoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/) bekannt ist. -[Mehr über Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/). +[Mehr zu Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/). ## Verwandte Themen {#related-topics} -- [Ressourcen](/developers/docs/gas/) +- [Gas](/developers/docs/gas/) - [EVM](/developers/docs/evm/) -- [Proof-of-Work (Arbeitsnachweis)](/developers/docs/consensus-mechanisms/pow/) +- [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 4279b0f0273..afdd90e36ce 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -1,29 +1,29 @@ --- title: Dagger-Hashimoto -description: Dagger-Hashimoto-Algorithmus im Detail. +description: Ein detaillierter Blick auf den Dagger-Hashimoto-Algorithmus. lang: de --- -Dagger-Hashimoto war die ursprüngliche Forschungsimplementierung und Spezifikation für den Mining-Algorithmus von Ethereum. Dagger-Hashimoto wurde durch [Ethash](#ethash) abgelöst. Das Mining wurde mit [der Zusammenführung](/roadmap/merge/) am 15. September 2022 komplett ausgeschaltet. Seitdem wird die Sicherheit von Ethereum durch einen [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Mechanismus gewährleistet. Diese Seite dient dem geschichtlichen Interesse – die Informationen hier sind seit der Zusammenführung für Ethereum nicht mehr relevant. +Dagger-Hashimoto war die ursprüngliche Forschungsimplementierung und Spezifikation für den Mining-Algorithmus von Ethereum. Dagger-Hashimoto wurde durch [Ethash](#ethash) ersetzt. Das Mining wurde beim [Merge](/roadmap/merge/) am 15. September 2022 vollständig abgeschaltet. Seitdem wird Ethereum stattdessen durch einen [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Mechanismus gesichert. Diese Seite ist von historischem Interesse – die hierin enthaltenen Informationen sind für das Post-Merge-Ethereum nicht mehr relevant. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst in den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow), das [Mining](/developers/docs/consensus-mechanisms/pow/mining) und [Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms) einzulesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow), [Mining](/developers/docs/consensus-mechanisms/pow/mining) und [Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms) zu informieren. ## Dagger-Hashimoto {#dagger-hashimoto} -Dagger-Hashimoto will zwei Ziele erreichen: +Dagger-Hashimoto zielt darauf ab, zwei Ziele zu erfüllen: -1. **ASIC-Resistenz**: Der Vorteil der Erstellung von spezieller Hardware für den Algorithmus sollte so gering wie möglich sein. -2. **Light-Client-Verifizierbarkeit**: Ein Block sollte durch einen Light-Client effizient verifiziert werden können. +1. **ASIC-Resistenz**: Der Nutzen aus der Entwicklung spezialisierter Hardware für den Algorithmus sollte so gering wie möglich sein. +2. **Verifizierbarkeit durch Light Clients**: Ein Block sollte von einem Light Client effizient verifizierbar sein. -Durch eine weitere Modifikation spezifizieren wir außerdem, wie – sofern gewünscht – ein drittes Ziel erreicht wird, was jedoch zusätzliche Komplexität mit sich bringt: +Mit einer zusätzlichen Modifikation spezifizieren wir auch, wie ein drittes Ziel auf Wunsch erfüllt werden kann, jedoch auf Kosten zusätzlicher Komplexität: -**Speichern der vollen Kette**: Mining sollte das Speichern des gesamten Blockchain-Status erfordern (wegen der irregulären Struktur des Ethereum-Statusbaums wird erwartet, dass einige Kürzungen möglich sein werden, insbedondere von eingen oft genutzten Contracts; dies soll aber minimiert werden). +**Speicherung der gesamten Chain**: Das Mining sollte die Speicherung des gesamten Blockchain-Zustands erfordern (aufgrund der unregelmäßigen Struktur des Ethereum-Zustands-Tries gehen wir davon aus, dass ein gewisses Pruning möglich sein wird, insbesondere bei einigen häufig verwendeten Verträgen, aber wir möchten dies minimieren). ## DAG-Generierung {#dag-generation} -Der Code für den Algorithmus wird unten in Python definiert. Zunächst geben wir `encode_int` zur Anordnung nicht unterzeichneter Einheiten spezifizierter Präzision an Strings. Die entsprechend Umkehrung wird ebenfalls bereitgestellt: +Der Code für den Algorithmus wird unten in Python definiert. Zuerst geben wir `encode_int` an, um vorzeichenlose Ganzzahlen (unsigned ints) einer bestimmten Genauigkeit in Strings umzuwandeln. Die Umkehrung ist ebenfalls angegeben: ```python NUM_BITS = 512 @@ -45,7 +45,7 @@ def decode_int(s): return x ``` -Als Nächstes gehen wir davon aus, dass `sah3` eine Funktion ist, die eine Ganzzahl bezieht und eine Ganzzahl ausgibt, und `dbl_sah3` eine Doppelt-sah3-Funktion ist; wenn man diesen Referenzcode in eine Implementierungsanwendung umwandelt: +Wir nehmen im Folgenden an, dass `sha3` eine Funktion ist, die eine Ganzzahl annimmt und eine Ganzzahl ausgibt, und `dbl_sha3` eine Double-SHA3-Funktion ist; wenn Sie diesen Referenzcode in eine Implementierung umwandeln, verwenden Sie: ```python from pyethereum import utils @@ -62,31 +62,31 @@ def dbl_sha3(x): ### Parameter {#parameters} -Folgende Parameter werden für den Algorithmus verwendet: +Die für den Algorithmus verwendeten Parameter sind: ```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 2**512 +SAFE_PRIME_512 = 2**512 - 38117 # Größte sichere Primzahl kleiner als 2**512 params = { - "n": 4000055296 * 8 // NUM_BITS, # Size of the dataset (4 Gigabytes); MUST BE MULTIPLE OF 65536 - "n_inc": 65536, # Increment in value of n per period; MUST BE MULTIPLE OF 65536 - # with epochtime=20000 gives 882 MB growth per year - "cache_size": 2500, # Size of the light client's cache (can be chosen by light - # client; not part of the algo spec) - "diff": 2**14, # Difficulty (adjusted during block evaluation) - "epochtime": 100000, # Length of an epoch in blocks (how often the dataset is updated) - "k": 1, # Number of parents of a node - "w": w, # Used for modular exponentiation hashing - "accesses": 200, # Number of dataset accesses during hashimoto - "P": SAFE_PRIME_512 # Safe Prime for hashing and random number generation + "n": 4000055296 * 8 // NUM_BITS, # Größe des Datensatzes (4 Gigabyte); MUSS EIN VIELFACHES VON 65536 SEIN + "n_inc": 65536, # Erhöhung des Wertes von n pro Periode; MUSS EIN VIELFACHES VON 65536 SEIN + # mit epochtime=20000 ergibt sich ein Wachstum von 882 MB pro Jahr + "cache_size": 2500, # Größe des Caches des Light-Clients (kann vom Light- + # Client gewählt werden; nicht Teil der Algo-Spezifikation) + "diff": 2**14, # Schwierigkeit (wird während der Blockauswertung angepasst) + "epochtime": 100000, # Länge einer Epoche in Blöcken (wie oft der Datensatz aktualisiert wird) + "k": 1, # Anzahl der Elternknoten eines Knotens + "w": w, # Wird für modulares Exponentiations-Hashing verwendet + "accesses": 200, # Anzahl der Datensatzzugriffe während Hashimoto + "P": SAFE_PRIME_512 # Sichere Primzahl für Hashing und Zufallszahlengenerierung } ``` -`P` ist in diesem Fall eine Primzahl, die so gewählt wurde, dass `log₂(P)` nur etwas geringer als 512 ist, was den 512 Bits entspricht, die wir zur Darstellung unserer Zahlen nutzen. Beachten Sie, dass nur die zweite Hälfte des DAG tatsächlich gespeichert werden muss, sodass der tatsächliche RAM-Bedarf bei 1 GB beginnt und um 441 MB pro Jahr wächst. +In diesem Fall ist `P` eine Primzahl, die so gewählt wurde, dass `log₂(P)` nur geringfügig kleiner als 512 ist, was den 512 Bits entspricht, die wir zur Darstellung unserer Zahlen verwendet haben. Beachten Sie, dass nur die zweite Hälfte des DAG tatsächlich gespeichert werden muss, sodass der De-facto-RAM-Bedarf bei 1 GB beginnt und um 441 MB pro Jahr wächst. -### Bau eines Dagger-Graphen {#dagger-graph-building} +### Dagger-Graphenerstellung {#dagger-graph-building} -Der Primitiv des Baus eines Dagger-Graphen ist wie folgt definiert: +Das Primitiv zur Erstellung des Dagger-Graphen ist wie folgt definiert: ```python def produce_dag(params, seed, length): @@ -101,15 +101,15 @@ def produce_dag(params, seed, length): return o ``` -Im Wesentlichen wird ein Graph mit einem einzigen Knoten begonnen, `sha3(seed)`, und von dort aus werden nacheinander weitere Knoten auf der Grundlage zufälliger vorheriger Knoten hinzugefügt. Wenn ein neuer Knoten erstellt wird, wird eine modulare Potenz des Seeds berechnet, um zufällig einige Indizes auszuwählen, die kleiner sind als `i` (bei Verwendung von `x % i` oben), und die Werte der Knoten an diesen Indizes werden in einer Berechnung verwendet, um einen neuen Wert für `x` zu generieren, welcher dann in eine kleine Proof-of-Work-Funktion (auf XOR-Basis) hinzugegeben wird, um letztlich den Wert des Graphen an Index `i` zu generieren. Der Grundgedanke hinter diesem speziellen Design ist, einen sequentiellen Zugriff auf den DAG zu erzwingen; der nächste Wert des DAG, auf den zugegriffen wird, kann nicht bestimmt werden, bis der aktuelle Wert bekannt ist. Schließlich wird das Ergebnis durch modulare Potenzierung weiter gehasht. +Im Wesentlichen beginnt es einen Graphen als einzelnen Knoten, `sha3(seed)`, und fügt von dort aus sequenziell weitere Knoten basierend auf zufälligen vorherigen Knoten hinzu. Wenn ein neuer Knoten erstellt wird, wird eine modulare Potenz des Seeds berechnet, um zufällig einige Indizes kleiner als `i` auszuwählen (unter Verwendung von `x % i` oben), und die Werte der Knoten an diesen Indizes werden in einer Berechnung verwendet, um einen neuen Wert für `x` zu generieren, der dann in eine kleine Proof-of-Work-Funktion (basierend auf XOR) eingespeist wird, um letztendlich den Wert des Graphen am Index `i` zu generieren. Der Grund für dieses spezielle Design ist es, einen sequenziellen Zugriff auf den DAG zu erzwingen; der nächste Wert des DAG, auf den zugegriffen wird, kann erst bestimmt werden, wenn der aktuelle Wert bekannt ist. Schließlich hasht die modulare Exponentiation das Ergebnis weiter. -Dieser Algorithmus stützt sich auf mehrere Ergebnisse aus der Zahlentheorie. Schauen Sie sich den unteren Zusatz mit einer Diskussion an. +Dieser Algorithmus stützt sich auf mehrere Ergebnisse aus der Zahlentheorie. Siehe den Anhang unten für eine Diskussion. -## Light-Client-Bewertung {#light-client-evaluation} +## Light-Client-Auswertung {#light-client-evaluation} -Die oben beschriebene Konstruktion des Graphen soll es ermöglichen, jeden Knoten des Graphen zu rekonstruieren, indem ein Unterbaum mit nur wenigen Knoten berechnet wird und wobei nur nur eine geringe Menge an Zusatzspeicher notig ist. Beachten Sie, dass mit „k=1“ dieser Unterbaum nur eine Kette von Werten ist, die sich bis zum ersten Element im DAG hochziehen. +Die obige Graphenkonstruktion zielt darauf ab, dass jeder Knoten im Graphen rekonstruiert werden kann, indem ein Teilbaum aus nur einer kleinen Anzahl von Knoten berechnet wird und nur eine geringe Menge an Hilfsspeicher benötigt wird. Beachten Sie, dass bei k=1 der Teilbaum nur eine Kette von Werten ist, die bis zum ersten Element im DAG reicht. -Diese Light-Client-Berechnungsfunktion für den DAG funktioniert wie folgt: +Die Light-Client-Berechnungsfunktion für den DAG funktioniert wie folgt: ```python def quick_calc(params, seed, p): @@ -131,13 +131,13 @@ def quick_calc(params, seed, p): return quick_calc_cached(p) ``` -Im Wesentlichen handelt es sich einfach um eine neue Implementierung des obigen Algorithmus, bei der die Schleife zur Berechnung der Werte für den gesamten DAG entfällt und die frühere Knotensuche durch einen rekursiven Aufruf oder eine Cache-Suche ersetzt wird. Beachten Sie, dass für `k=1` der Cache unnötig ist, obwohl eine weitere Optimierung die ersten paar Tausend Werte der DAG vorab berechnet und diese als statischen Cache für Berechnungen aufbewahrt; im Zusatz finden Sie eine entsprechende Code-Implementierung. +Im Wesentlichen handelt es sich einfach um eine Umschreibung des obigen Algorithmus, die die Schleife zur Berechnung der Werte für den gesamten DAG entfernt und die frühere Knotensuche durch einen rekursiven Aufruf oder eine Cache-Suche ersetzt. Beachten Sie, dass für `k=1` der Cache unnötig ist, obwohl eine weitere Optimierung tatsächlich die ersten paar tausend Werte des DAG vorberechnet und diese als statischen Cache für Berechnungen bereithält; siehe den Anhang für eine Code-Implementierung davon. -## Doppelte DAG-Puffer {#double-buffer} +## Doppelter Puffer von DAGs {#double-buffer} -In einem vollen Client wird ein [_doppelter Puffer_](https://wikipedia.org/wiki/Multiple_buffering) von 2 DAGs verwendet, die mithilfe der obigen Formel produziert wurden. Der Gedanke dahinter ist, dass DAGs jede `epochtime` Anzahl von Blöcken entsprechend den obigen Parametern erzeugt werden. Der Client verwendet nicht den zuletzt erstellten DAG, sondern den vorherigen. Das hat den Vorteil, dass die DAGs im Laufe der Zeit ersetzt werden können, ohne dass ein Schritt eingefügt werden muss, bei dem Miner plötzlich alle Daten neu berechnen müssen. Andernfalls besteht die Gefahr einer abrupten, vorübergehenden Verlangsamung der Chain-Verarbeitung in regelmäßigen Abständen und einer dramatisch zunehmenden Zentralisierung. Dadurch könnte es 51-%-Angriffe in diesen wenigen Minuten geben, bevor alle Daten neu berechnet sind. +In einem vollständigen Client wird ein [_doppelter Puffer_ (Double Buffer)](https://wikipedia.org/wiki/Multiple_buffering) von 2 DAGs verwendet, die durch die obige Formel erzeugt wurden. Die Idee ist, dass DAGs alle `epochtime` Anzahl von Blöcken gemäß den obigen Parametern erzeugt werden. Anstatt dass der Client den zuletzt erzeugten DAG verwendet, verwendet er den vorherigen. Der Vorteil davon ist, dass die DAGs im Laufe der Zeit ersetzt werden können, ohne dass ein Schritt integriert werden muss, bei dem Miner plötzlich alle Daten neu berechnen müssen. Andernfalls besteht die Gefahr einer abrupten vorübergehenden Verlangsamung der Chain-Verarbeitung in regelmäßigen Abständen und einer dramatisch zunehmenden Zentralisierung. Somit bestehen Risiken für einen 51-%-Angriff innerhalb dieser wenigen Minuten, bevor alle Daten neu berechnet sind. -Der Algorithmus für das Generieren des DAG-Sets zur Berechnung der Arbeit für einen Block ist wie folgt: +Der Algorithmus, der verwendet wird, um den Satz von DAGs zu generieren, die zur Berechnung der Arbeit für einen Block verwendet werden, lautet wie folgt: ```python def get_prevhash(n): @@ -164,7 +164,7 @@ def get_daggerset(params, block): dagsz = get_dagsize(params, block) seedset = get_seedset(params, block) if seedset["front_hash"] <= 0: - # No back buffer is possible, just make front buffer + # Kein Back-Buffer möglich, erstelle einfach einen Front-Buffer return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), "block_number": 0}} else: @@ -176,7 +176,7 @@ def get_daggerset(params, block): ## Hashimoto {#hashimoto} -Die Idee hinter dem ursprünglichen Hashimoto besteht darin, die Blockchain als Datensatz zu nutzen, eine Berechnung durchzuführen, die n Indizes aus der Blockchain auswählt, die Transaktionen an diesen Indizes sammelt, ein XOR dieser Daten durchführt und den Hash des Ergebnisses zurückgibt. Der ursprüngliche Algorithmus von Thaddeus Dryja – der Konsistenz halber in Python übersetzt – lautet wie folgt: +Die Idee hinter dem ursprünglichen Hashimoto ist es, die Blockchain als Datensatz zu verwenden und eine Berechnung durchzuführen, die N Indizes aus der Blockchain auswählt, die Transaktionen an diesen Indizes sammelt, ein XOR dieser Daten durchführt und den Hash des Ergebnisses zurückgibt. Der ursprüngliche Algorithmus von Thaddeus Dryja, der aus Konsistenzgründen in Python übersetzt wurde, lautet wie folgt: ```python def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): @@ -189,7 +189,7 @@ def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): return txid_mix ^ (nonce << 192) ``` -Leider gilt Hashimoto zwar als RAM-intensiv, jedoch basiert er auf einer 256-Bit-Arithmetik, die eine erhebliche Rechenlast verursacht. Dagger-Hashimoto verwendet jedoch nur die 64 am wenigsten signifikanten Bits, wenn er seinen Datensatz indiziert, um dieses Problem zu lösen. +Obwohl Hashimoto als RAM-hart gilt, stützt es sich leider auf 256-Bit-Arithmetik, was einen erheblichen Rechenaufwand bedeutet. Dagger-Hashimoto verwendet jedoch nur die niedrigstwertigen 64 Bits bei der Indizierung seines Datensatzes, um dieses Problem zu beheben. ```python def hashimoto(dag, dagsize, params, header, nonce): @@ -200,7 +200,7 @@ def hashimoto(dag, dagsize, params, header, nonce): return dbl_sha3(mix) ``` -Der Einsatz von Doppel-SHA3 ermöglicht eine Form der sofortigen Vorab-Verifizierung ohne Datenübertragung, bei der lediglich geprüft wird, ob ein korrekter Zwischenwert bereitgestellt wurde. Diese äußere Schicht von Proof-of-Work ist äußerst ASIC-freundlich und relativ schwach ausgelegt. Sie existiert jedoch, um DDoS-Angriffe noch weiter zu erschweren, da dieser kleine Arbeitsaufwand erbracht werden muss, um einen Block zu erzeugen, der nicht sofort abgelehnt wird. Hier ist die Light-Client-Version: +Die Verwendung von Double-SHA3 ermöglicht eine Form der datenlosen, nahezu sofortigen Vorab-Verifizierung, bei der nur überprüft wird, ob ein korrekter Zwischenwert bereitgestellt wurde. Diese äußere Schicht des Proof-of-Work ist sehr ASIC-freundlich und ziemlich schwach, existiert aber, um DDoS noch schwieriger zu machen, da diese geringe Menge an Arbeit geleistet werden muss, um einen Block zu produzieren, der nicht sofort abgelehnt wird. Hier ist die Light-Client-Version: ```python def quick_hashimoto(seed, dagsize, params, header, nonce): @@ -213,7 +213,7 @@ def quick_hashimoto(seed, dagsize, params, header, nonce): ## Mining und Verifizierung {#mining-and-verifying} -Nun setzen wir das alles in einem Mining-Algorithmus zusammen: +Lassen Sie uns nun alles im Mining-Algorithmus zusammenfassen: ```python def mine(daggerset, params, block): @@ -249,61 +249,57 @@ def light_verify(params, header, nonce): return result * params["diff"] < 2**256 ``` -Beachten Sie außerdem, dass Dagger-Hashimoto zusätzliche Anforderungen an den Blockheader stellt: +Beachten Sie auch, dass Dagger-Hashimoto zusätzliche Anforderungen an den Block-Header stellt: -- Damit eine Verifizierung mit zwei Ebenen funktioniert, muss ein Block-Header sowohl die Nonce als auch den mittleren Wert vor sha3 haben. -- Irgendwo muss ein Block-Header den sha3 des aktuellen Seed-Sets speichern. +- Damit die zweischichtige Verifizierung funktioniert, muss ein Block-Header sowohl die Nonce als auch den mittleren Wert vor SHA3 enthalten. +- Irgendwo muss ein Block-Header den SHA3 des aktuellen Seed-Sets speichern. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Anhang {#appendix} -Wie oben erwähnt, basiert der für die DAG-Generierung verwendete RNG auf einigen Ergebnissen aus der Zahlentheorie. Zunächst stellen wir sicher, dass der Lehmer-RNG, welcher die Grundlage für die Variable `picker` bildet, eine lange Periode besitzt. Im zweiten Schritt zeigen wir, dass `pow(x,3,P)` `x` nicht `1` oder `P-1` zuordnet, sofern `x ∈ [2,P-2]` als Startwert gilt. Schließlich zeigen wir, dass `pow(x,3,P)` eine niedrige Kollisionsrate hat, wenn es als Hashing-Funktion behandelt wird. +Wie oben angemerkt, stützt sich der für die DAG-Generierung verwendete RNG (Zufallszahlengenerator) auf einige Ergebnisse aus der Zahlentheorie. Erstens stellen wir sicher, dass der Lehmer-RNG, der die Basis für die Variable `picker` bildet, eine große Periode hat. Zweitens zeigen wir, dass `pow(x,3,P)` `x` nicht auf `1` oder `P-1` abbildet, vorausgesetzt, `x ∈ [2,P-2]` zu Beginn. Schließlich zeigen wir, dass `pow(x,3,P)` eine niedrige Kollisionsrate aufweist, wenn es als Hash-Funktion behandelt wird. ### Lehmer-Zufallszahlengenerator {#lehmer-random-number} -Obwohl die Funktion `produce_dag` keine unverzerrten Zufallszahlen erzeugen muss, besteht eine potenzielle Gefahr darin, dass `seed**i % P` nur eine Handvoll Werte annimmt. Dies könnte Minern, die das Muster erkennen, einen Vorteil gegenüber denen verschaffen, die es nicht tun. +Während die Funktion `produce_dag` keine unverzerrten Zufallszahlen erzeugen muss, besteht eine potenzielle Bedrohung darin, dass `seed**i % P` nur eine Handvoll Werte annimmt. Dies könnte Minern, die das Muster erkennen, einen Vorteil gegenüber denjenigen verschaffen, die dies nicht tun. -Um dies zu vermeiden, wird auf ein Ergebnis aus der Zahlentheorie zurückgegriffen. Eine [_sichere Primzahl_](https://en.wikipedia.org/wiki/Safe_prime) ist definiert als eine Primzahl `P`, sodass `(P-1)/2` ebenfalls eine Primzahl ist. Die _Reihenfolge_ eines Mitglieds `x` der [multiplikativen Gruppe](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` ist definiert als das minimale `m`, sodass
xᵐ mod P ≡ 1
-Angesichts dieser Definitionen haben wir: +Um dies zu vermeiden, wird auf ein Ergebnis aus der Zahlentheorie zurückgegriffen. Eine [_sichere Primzahl_ (Safe Prime)](https://en.wikipedia.org/wiki/Safe_prime) ist definiert als eine Primzahl `P`, bei der `(P-1)/2` ebenfalls eine Primzahl ist. Die _Ordnung_ eines Elements `x` der [multiplikativen Gruppe](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` ist definiert als das minimale `m`, sodass
xᵐ mod P ≡ 1
+Unter Berücksichtigung dieser Definitionen haben wir: -> Beobachtung 1. Lassen Sie `x` ein Mitglied der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P` sein. Bei `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P` ist die Ordnung von `x` entweder `P-1` oder `(P-1)/2`. +> Beobachtung 1. Sei `x` ein Element der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P`. Wenn `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P`, dann ist die Ordnung von `x` entweder `P-1` oder `(P-1)/2`. -_Beweis_. Da `P` eine sichere Primzahl ist, gilt nach dem \[Satz von Lagrange\]\[lagrange\], dass die Ordnung von `x` entweder `1`, `2`, `(P-1)/2` oder `P-1` ist. +_Beweis_. Da `P` eine sichere Primzahl ist, gilt nach dem [Satz von Lagrange][lagrange], dass die Ordnung von `x` entweder `1`, `2`, `(P-1)/2` oder `P-1` ist. -Die Ordnung von `x` kann nicht `1` sein, da wir gemäß dem Little Theorem von Fermat Folgendes haben: +Die Ordnung von `x` kann nicht `1` sein, da nach dem kleinen Satz von Fermat gilt:
xP-1 mod P ≡ 1
Daher muss `x` eine multiplikative Identität von `ℤ/nℤ` sein, die eindeutig ist. Da wir angenommen haben, dass `x ≠ 1`, ist dies nicht möglich. -Die Ordnung von `x` kann nicht `2` sein, es sei denn, `x = P-1`, weil dies die Aussage verletzen würde, dass `P` eine Primzahl ist. +Die Ordnung von `x` kann nicht `2` sein, es sei denn, `x = P-1`, da dies verletzen würde, dass `P` eine Primzahl ist. -Aus dem obigen Vorschlag können wir erkennen, dass die Iteration von `(picker * init) % P` eine Zykluslänge von mindestens `(P-1)/2` hat. Das liegt daran, dass wir `P` als sichere Primzahl gewählt haben, die etwa einer höheren Potenz von zwei entspricht, und `init` im Intervall `[2,2**256+1]` liegt. Angesichts der Größe von `P` sollten wir niemals einen Zyklus aus der modularen Potenzierung erwarten. +Aus der obigen Aussage können wir erkennen, dass die Iteration von `(picker * init) % P` eine Zykluslänge von mindestens `(P-1)/2` haben wird. Dies liegt daran, dass wir `P` als eine sichere Primzahl ausgewählt haben, die ungefähr einer höheren Zweierpotenz entspricht, und `init` im Intervall `[2,2**256+1]` liegt. Angesichts der Größe von `P` sollten wir niemals einen Zyklus aus der modularen Exponentiation erwarten. -Wenn wir die erste Zelle im DAG zuweisen (die Variable mit der Bezeichnung `init`), berechnen wir `pow(sha3(seed) + 2, 3, P)`. Auf den ersten Blick stellt dies nicht sicher, dass das Ergebnis weder `1` noch `P-1` ist. Da `P-1` jedoch eine sichere Primzahl ist, haben wir die folgende zusätzliche Sicherheit, die eine Folgerung aus Beobachtung 1 ist: +Wenn wir die erste Zelle im DAG zuweisen (die Variable mit der Bezeichnung `init`), berechnen wir `pow(sha3(seed) + 2, 3, P)`. Auf den ersten Blick garantiert dies nicht, dass das Ergebnis weder `1` noch `P-1` ist. Da `P-1` jedoch eine sichere Primzahl ist, haben wir die folgende zusätzliche Sicherheit, die ein Korollar aus Beobachtung 1 ist: -> Beobachtung 2. `x` sei ein Element der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P`, und `w` sei eine natürliche Zahl. Wenn `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P` sowie `w mod P ≠ P-1 mod P` und `w mod P ≠ 0 mod P`, dann `xʷ mod P ≠ 1 mod P` und `xʷ mod P ≠ P-1 mod P`. +> Beobachtung 2. Sei `x` ein Element der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P`, und sei `w` eine natürliche Zahl. Wenn `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P`, sowie `w mod P ≠ P-1 mod P` und `w mod P ≠ 0 mod P`, dann ist `xʷ mod P ≠ 1 mod P` und `xʷ mod P ≠ P-1 mod P` -### Modulare Potenzierung als Hash-Funktion {#modular-exponentiation} +### Modulare Exponentiation als Hash-Funktion {#modular-exponentiation} -Bei bestimmten Werten von `P` und `w` kann es bei der Funktion `pow(x, w, P)` zu zahlreichen Kollisionen kommen. Beispielsweise nimmt `pow(x,9,19)` nur die Werte `{1,18}` an. +Für bestimmte Werte von `P` und `w` kann die Funktion `pow(x, w, P)` viele Kollisionen aufweisen. Zum Beispiel nimmt `pow(x,9,19)` nur die Werte `{1,18}` an. -Wenn `P` eine Primzahl ist, kann ein geeignetes `w` für eine Hash-Funktion zur modularen Potenzierung mithilfe des folgenden Ergebnisses ausgewählt werden: +Da `P` eine Primzahl ist, kann ein geeignetes `w` für eine modulare Exponentiations-Hash-Funktion unter Verwendung des folgenden Ergebnisses ausgewählt werden: -> Beobachtung 3. `P` sei eine Primzahl; `w` und `P-1` sind nur dann teilerfremd, wenn für alle `a` und `b` in `ℤ/Pℤ` Folgendes gilt: -> ->
-> „aʷ mod P ≡ bʷ mod P“ gilt nur dann, wenn „a mod P ≡ b mod P“ ->
+> Beobachtung 3. Sei `P` eine Primzahl; `w` und `P-1` sind teilerfremd, wenn und nur wenn für alle `a` und `b` in `ℤ/Pℤ` gilt:
`aʷ mod P ≡ bʷ mod P` wenn und nur wenn `a mod P ≡ b mod P`
-Da `P` eine Primzahl ist und `w` teilerfremd zu `P-1` ist, gilt, dass `|{pow(x, w, P) : x ∈ ℤ}| = P`, was bedeutet, dass die Hashing-Funktion die minimal mögliche Kollisionsrate aufweist. +Da `P` eine Primzahl ist und `w` teilerfremd zu `P-1` ist, gilt somit `|{pow(x, w, P) : x ∈ ℤ}| = P`, was impliziert, dass die Hash-Funktion die minimal mögliche Kollisionsrate aufweist. -Im speziellen Fall, dass `P` eine sichere Primzahl ist, wie wir sie ausgewählt haben, hat `P-1` nur die Faktoren 1, 2, `(P-1)/2` und `P-1`. Da `P` > 7 ist, wissen wir, dass 3 teilerfremd zu `P-1` ist, daher erfüllt `w=3` die obige Aussage. +In dem speziellen Fall, dass `P` eine sichere Primzahl ist, wie wir sie ausgewählt haben, hat `P-1` nur die Faktoren 1, 2, `(P-1)/2` und `P-1`. Da `P` > 7, wissen wir, dass 3 teilerfremd zu `P-1` ist, daher erfüllt `w=3` die obige Aussage. -## Effizienterer cache-basierter Auswertungsalgorithmus {#cache-based-evaluation} +## Effizienterer Cache-basierter Auswertungsalgorithmus {#cache-based-evaluation} ```python def quick_calc(params, seed, p): @@ -331,4 +327,4 @@ def quick_hashimoto_cached(cache, dagsize, params, header, nonce): for _ in range(params["accesses"]): mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) return dbl_sha3(mix) -``` +``` \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index b42bba6a799..fd3f7da831c 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -1,6 +1,6 @@ --- title: Ethash -description: Der Ethash-Algorithmus im Detail. +description: Ein detaillierter Blick auf den Ethash-Algorithmus. lang: de --- @@ -8,25 +8,25 @@ lang: de - Ethash war der Proof-of-Work-Mining-Algorithmus von Ethereum. Proof-of-work wurde nun **komplett abgeschaltet** und Ethereum wird jetzt stattdessen durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) gesichert. Lesen Sie mehr über [die Zusammenführung](/roadmap/merge/), [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Staking](/staking/). Diese Seite dient dem geschichtlichen Interesse! + Ethash war Ethereums Proof-of-Work-Mining-Algorithmus. Proof-of-Work wurde nun **vollständig abgeschaltet** und Ethereum wird stattdessen durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) gesichert. Lesen Sie mehr über [The Merge](/roadmap/merge/), [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Staking](/staking/). Diese Seite ist von historischem Interesse! -Ethash ist eine modifizierte Version des [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto)-Algorithmus. Ethash-Proof-of-Work ist [speicherhart](https://wikipedia.org/wiki/Memory-hard_function), was die Algorithmus-ASIC resistent machen sollte. Zwar wurden schließlich Ethash-ASICs entwickelt, aber GPU-Mining war weiterhin eine gangbare Option, bis Proof-of-Work abgeschaltet wurde. Ethash wird immer noch verwendet, um andere Coins zu minen, die nicht auf Proof-of-Work-Netzwerken von Ethereum laufen. +Ethash ist eine modifizierte Version des [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto)-Algorithmus. Ethash-Proof-of-Work ist [speicherintensiv (memory hard)](https://wikipedia.org/wiki/Memory-hard_function), was den Algorithmus ASIC-resistent machen sollte. Ethash-ASICs wurden schließlich entwickelt, aber GPU-Mining war immer noch eine praktikable Option, bis Proof-of-Work abgeschaltet wurde. Ethash wird weiterhin verwendet, um andere Coins in anderen Nicht-Ethereum-Proof-of-Work-Netzwerken zu minen. ## Wie funktioniert Ethash? {#how-does-ethash-work} -Speicherhärte wird durch einen Proof-of-Work-Algorithmus erreicht, der das Auswählen von Teilmengen einer festgelegten Ressource erfordert, abhängig von der Nonce und dem Block-Header. Diese Ressource (einige Gigabyte groß) nennt sich DAG. Der DAG wird alle 30.000 Blöcke geändert – ein ~125-Stunden-Fenster, das als Epoche bezeichnet wird (etwa 5,2 Tage) – und seine Erstellung dauert eine Weile. Da der DAG nur von der Höhe des Blocks abhängt, kann die Erzeugung im Voraus erfolgen. Ist dies jedoch nicht der Fall, muss der Client bis zum Ende dieses Prozesses warten, um einen Block zu erstellen. Wenn die Clients die DAGs nicht im Voraus erstellen und zwischenspeichern, kann es bei jedem Epochenwechsel zu massiven Blockverzögerungen im Netzwerk kommen. Beachten Sie, dass der DAG nicht für die Verifizierung des Proof-of-Work erzeugt werden muss, was im Wesentlichen eine Verifizierung mit geringer CPU-Leistung und wenig Speicher ermöglicht. +Speicherintensität wird mit einem Proof-of-Work-Algorithmus erreicht, der die Auswahl von Teilmengen einer festen Ressource in Abhängigkeit von der Nonce und dem Block-Header erfordert. Diese Ressource (einige Gigabyte groß) wird als DAG bezeichnet. Der DAG wird alle 30000 Blöcke geändert, ein ~125-Stunden-Fenster, das als Epoche (etwa 5,2 Tage) bezeichnet wird, und dessen Generierung eine Weile dauert. Da der DAG nur von der Blockhöhe abhängt, kann er im Voraus generiert werden. Wenn dies jedoch nicht der Fall ist, muss die Anwendung bis zum Ende dieses Prozesses warten, um einen Block zu produzieren. Wenn Anwendungen DAGs nicht im Voraus generieren und zwischenspeichern, kann das Netzwerk bei jedem Epochenübergang eine massive Blockverzögerung erfahren. Beachten Sie, dass der DAG nicht für die Verifizierung des Proof-of-Work generiert werden muss, was im Wesentlichen eine Verifizierung mit geringer CPU- und Speicherleistung ermöglicht. -Die allgemeine Route, die der Algorithmus nimmt, ist wie folgt: +Der allgemeine Ablauf des Algorithmus ist wie folgt: -1. Es gibt einen **Seed**, welcher für jeden Block berechnet werden kann, indem die Block-Header bis zu diesem Punkt durchsucht werden. -2. Aus dem Seed kann ein **16 MB großer pseudozufälliger Cache** berechnet werden. Light-Clients speichern den Cache. -3. Aus dem Cache können wir einen **1 GB großen Datensatz** mit der Eigenschaft generieren, dass jedes Element im Datensatz nur von einer sehr kleinen Anzahl an Elementen aus dem Cache abhängt. Volle Clients und Miner speichern den Datensatz. Der Datensatz wächst linear über die Zeit. -4. Beim Mining werden zufällige Ausschnitte aus dem Datensatz entnommen und zu einem Hash zusammengefügt. Die Verifizierung kann mit wenig Speicher durchgeführt werden, indem der Cache verwendet wird, um die spezifischen Teile des Datensatzes, die Sie benötigen, neu zu generieren, sodass Sie nur den Cache speichern müssen. +1. Es gibt einen **Seed**, der für jeden Block berechnet werden kann, indem die Block-Header bis zu diesem Punkt durchsucht werden. +2. Aus dem Seed kann man einen **16 MB großen pseudozufälligen Cache** berechnen. Light-Anwendungen speichern den Cache. +3. Aus dem Cache können wir einen **1 GB großen Datensatz** generieren, mit der Eigenschaft, dass jedes Element im Datensatz nur von einer kleinen Anzahl von Elementen aus dem Cache abhängt. Vollständige Anwendungen und Miner speichern den Datensatz. Der Datensatz wächst linear mit der Zeit. +4. Beim Mining werden zufällige Teile des Datensatzes entnommen und zusammen gehasht. Die Verifizierung kann mit wenig Speicherplatz durchgeführt werden, indem der Cache verwendet wird, um die spezifischen Teile des Datensatzes, die Sie benötigen, neu zu generieren, sodass Sie nur den Cache speichern müssen. -Der große Datensatz wird alle 30.000 Blöcke aktualisiert, sodass der größte Teil der Arbeit eines Miners darin besteht, den Datensatz zu lesen, und nicht darin, ihn zu verändern. +Der große Datensatz wird alle 30000 Blöcke aktualisiert, sodass der Großteil der Arbeit eines Miners darin besteht, den Datensatz zu lesen und nicht, Änderungen daran vorzunehmen. ## Definitionen {#definitions} @@ -47,15 +47,15 @@ CACHE_ROUNDS = 3 # number of rounds in cache production ACCESSES = 64 # number of accesses in hashimoto loop ``` -### Die Verwendung von „SHA3“ {#sha3} +### Die Verwendung von 'SHA3' {#sha3} -Die Entwicklung von Ethereum fiel mit der Entwicklung des SHA3-Standards zusammen, und im Verlauf des Standardisierungsprozesses wurde eine späte Änderung im Padding des finalen Hash-Algorithmus vorgenommen. Daher sind Ethereums „sha3_256“- und „sha3_512“-Hashes keine standardmäßigen SHA3-Hashes, sondern eine Abwandlung, die in anderen Zusammenhängen oft als „Keccak-256“ und „Keccak-512“ bezeichnet wird. Die Diskussion finden Sie beispielsweise [hier](https://eips.ethereum.org/EIPS/eip-1803), [hier](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) oder [hier](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +Die Entwicklung von Ethereum fiel mit der Entwicklung des SHA3-Standards zusammen, und der Standardisierungsprozess nahm eine späte Änderung am Padding des finalisierten Hash-Algorithmus vor, sodass Ethereums "sha3_256"- und "sha3_512"-Hashes keine Standard-SHA3-Hashes sind, sondern eine Variante, die in anderen Kontexten oft als "Keccak-256" und "Keccak-512" bezeichnet wird. Siehe Diskussion z. B. [hier](https://eips.ethereum.org/EIPS/eip-1803), [hier](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) oder [hier](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). -Bitte behalten Sie das im Hinterkopf, da im Folgenden bei der Beschreibung des Algorithmus auf „sha3“-Hashes Bezug genommen wird. +Bitte behalten Sie dies im Hinterkopf, da in der unten stehenden Beschreibung des Algorithmus auf "sha3"-Hashes verwiesen wird. ## Parameter {#parameters} -Die Parameter für den Cache und den Datensatz von Ethash hängen von der Blocknummer ab. Die Größe des Cache und die Datensatzgröße wachsen beide linear; jedoch wählen wir immer die größte Primzahl unterhalb des linear wachsenden Schwellenwerts, um das Risiko zu verringern, dass versehentliche Regelmäßigkeiten zu zyklischem Verhalten führen. +Die Parameter für den Cache und den Datensatz von Ethash hängen von der Blocknummer ab. Die Cache-Größe und die Datensatzgröße wachsen beide linear; wir nehmen jedoch immer die höchste Primzahl unter dem linear wachsenden Schwellenwert, um das Risiko versehentlicher Regelmäßigkeiten zu verringern, die zu zyklischem Verhalten führen. ```python def get_cache_size(block_number): @@ -73,22 +73,22 @@ def get_full_size(block_number): return sz ``` -Tabellen mit Werten zu Datensatz- und Cache-Größe finden Sie im Zusatz. +Tabellen mit Werten für Datensatz- und Cache-Größen finden Sie im Anhang. -## Cache-Gegerierung {#cache-generation} +## Cache-Generierung {#cache-generation} -Nun geben wir die Funktion zur Erzeugung eines Cache an: +Nun spezifizieren wir die Funktion zur Erstellung eines Caches: ```python def mkcache(cache_size, seed): n = cache_size // HASH_BYTES - # Sequentially produce the initial dataset + # Den anfänglichen Datensatz sequenziell erzeugen o = [sha3_512(seed)] for i in range(1, n): o.append(sha3_512(o[-1])) - # Use a low-round version of randmemohash + # Eine Version von randmemohash mit wenigen Runden verwenden for _ in range(CACHE_ROUNDS): for i in range(n): v = o[i][0] % n @@ -97,11 +97,11 @@ def mkcache(cache_size, seed): return o ``` -Der Cache-Produktionsprozess des Cache umfasst zunächst das sequenzielle Auffüllen von 32 MB Speicher und dann das Ausführen von zwei Durchläufen des _RandMemoHash_-Algorithmus von Sergio Demian Lerner aus [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). Die Ausgabe ist ein Satz von 524288 64-Byte-Werten. +Der Cache-Erstellungsprozess beinhaltet zunächst das sequentielle Auffüllen von 32 MB Speicher und anschließend die Durchführung von zwei Durchläufen von Sergio Demian Lerners _RandMemoHash_-Algorithmus aus [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). Die Ausgabe ist ein Satz von 524288 64-Byte-Werten. -## Funktion der Datenaggregation {#date-aggregation-function} +## Datenaggregationsfunktion {#date-aggregation-function} -Wir verwenden in einigen Fällen einen vom [FNV-Hash](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) inspirierten Algorithmus als nicht-assoziativen Ersatz für XOR. Beachten Sie, dass wir die Primzahl mit dem vollständigen 32-Bit-Input multiplizieren, im Gegensatz zur FNV-1-Spezifikation, die die Primzahl wiederum mit einem Byte (Oktett) multipliziert. +Wir verwenden in einigen Fällen einen vom [FNV-Hash](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) inspirierten Algorithmus als nicht-assoziativen Ersatz für XOR. Beachten Sie, dass wir die Primzahl mit der vollen 32-Bit-Eingabe multiplizieren, im Gegensatz zur FNV-1-Spezifikation, die die Primzahl nacheinander mit einem Byte (Oktett) multipliziert. ```python FNV_PRIME = 0x01000193 @@ -110,9 +110,9 @@ def fnv(v1, v2): return ((v1 * FNV_PRIME) ^ v2) % 2**32 ``` -Bitte beachten Sie, dass selbst das Yellow Paper fnv als v1\*(FNV_PRIME ^ v2) spezifiziert, alle aktuellen Implementierungen verwenden durchgängig die obige Definition. +Bitte beachten Sie, dass selbst das Yellow Paper `fnv` als `v1*(FNV_PRIME ^ v2)` spezifiziert, alle aktuellen Implementierungen jedoch konsequent die obige Definition verwenden. -## Berechnung des gesamten Datensatzes {#full-dataset-calculation} +## Berechnung des vollständigen Datensatzes {#full-dataset-calculation} Jedes 64-Byte-Element im vollständigen 1-GB-Datensatz wird wie folgt berechnet: @@ -120,18 +120,18 @@ Jedes 64-Byte-Element im vollständigen 1-GB-Datensatz wird wie folgt berechnet: def calc_dataset_item(cache, i): n = len(cache) r = HASH_BYTES // WORD_BYTES - # initialize the mix + # Den Mix initialisieren mix = copy.copy(cache[i % n]) mix[0] ^= i mix = sha3_512(mix) - # fnv it with a lot of random cache nodes based on i + # Mit vielen zufälligen Cache-Knoten basierend auf i fnv-hashen for j in range(DATASET_PARENTS): cache_index = fnv(i ^ j, mix[j % r]) mix = map(fnv, mix, cache[cache_index % n]) return sha3_512(mix) ``` -Im Wesentlichen werden die Daten von 256 pseudozufällig ausgewählten Cache-Knoten kombiniert und gehasht, um den Datensatzknoten zu berechnen. Der gesamte Datensatz wird dann wie folgt generiert: +Im Wesentlichen kombinieren wir Daten von 256 pseudozufällig ausgewählten Cache-Knoten und hashen diese, um den Datensatz-Knoten zu berechnen. Der gesamte Datensatz wird dann generiert durch: ```python def calc_dataset(full_size, cache): @@ -140,27 +140,27 @@ def calc_dataset(full_size, cache): ## Hauptschleife {#main-loop} -Nun legen wir die „Hashimoto“-ähnliche Hauptschleife fest, in der wir Daten aus dem gesamten Datensatz aggregieren, um unseren endgültigen Wert für einen bestimmten Header und eine bestimmte Nonce zu ermitteln. Im folgenden Code stellt `header` den SHA3-256-_Hash_ der RLP-Darstellung eines _abgeschnittenen_ Block-Headers dar, d. h. eines Headers ohne die Felder **mixHash** und **nonce**. `nonce` sind die acht Byte einer vorzeichenlosen 64-Bit-Ganzzahl in Big-Endian-Reihenfolge. Daher ist `nonce[::-1]` die Little-Endian-Darstellung dieses Werts mit acht Byte: +Nun spezifizieren wir die "Hashimoto"-ähnliche Hauptschleife, in der wir Daten aus dem vollständigen Datensatz aggregieren, um unseren Endwert für einen bestimmten Header und eine bestimmte Nonce zu erzeugen. Im folgenden Code repräsentiert `header` den SHA3-256-_Hash_ der RLP-Darstellung eines _abgeschnittenen_ Block-Headers, d. h. eines Headers ohne die Felder **mixHash** und **nonce**. `nonce` sind die acht Bytes einer vorzeichenlosen 64-Bit-Ganzzahl in Big-Endian-Reihenfolge. Somit ist `nonce[::-1]` die acht Byte lange Little-Endian-Darstellung dieses Wertes: ```python def hashimoto(header, nonce, full_size, dataset_lookup): n = full_size / HASH_BYTES w = MIX_BYTES // WORD_BYTES mixhashes = MIX_BYTES / HASH_BYTES - # combine header+nonce into a 64 byte seed + # Header+Nonce zu einem 64-Byte-Seed kombinieren s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s + # Den Mix mit repliziertem s starten mix = [] for _ in range(MIX_BYTES / HASH_BYTES): mix.extend(s) - # mix in random dataset nodes + # Zufällige Datensatz-Knoten einmischen for i in range(ACCESSES): p = fnv(i ^ s[0], mix[i % w]) % (n // mixhashes) * mixhashes newdata = [] for j in range(MIX_BYTES / HASH_BYTES): newdata.extend(dataset_lookup(p + j)) mix = map(fnv, mix, newdata) - # compress mix + # Mix komprimieren cmix = [] for i in range(0, len(mix), 4): cmix.append(fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3])) @@ -176,17 +176,17 @@ def hashimoto_full(full_size, dataset, header, nonce): return hashimoto(header, nonce, full_size, lambda x: dataset[x]) ``` -Im Wesentlichen halten wir einen 128 Byte breiten „Mix“ aufrecht und holen wiederholt sequentiell 128 Byte aus dem vollständigen Datensatz, um sie mithilfe der `fnv`-Funktion mit dem Mix zu kombinieren. Es werden 128 Byte sequentieller Zugriff verwendet, sodass bei jeder Runde des Algorithmus immer eine vollständige Seite aus dem RAM geholt wird, wodurch Fehlübersetzungen im Lookaside-Puffer, die ASICs theoretisch vermeiden könnten, minimiert werden. +Im Wesentlichen pflegen wir einen "Mix" von 128 Bytes Breite und rufen wiederholt sequentiell 128 Bytes aus dem vollständigen Datensatz ab und verwenden die `fnv`-Funktion, um sie mit dem Mix zu kombinieren. Es werden 128 Bytes sequentieller Zugriff verwendet, sodass jede Runde des Algorithmus immer eine vollständige Seite aus dem RAM abruft, wodurch Translation-Lookaside-Buffer-Fehlschläge minimiert werden, die ASICs theoretisch vermeiden könnten. -Liegt das Ergebnis dieses Algorithmus unter dem gewünschten Zielwert, so ist die Nonce gültig. Beachten Sie, dass die zusätzliche Anwendung von `sha3_256` am Ende sicherstellt, dass es eine Zwischen-Nonce gibt, die bereitgestellt werden kann, um zu beweisen, dass zumindest etwas Arbeit geleistet wurde; diese schnelle äußere PoW-Verifizierung kann für Anti-DoS-Zwecke verwendet werden. Ein weiterer Zweck ist die statistische Sicherheit darüber, dass das Ergebnis eine unverzerrte 256-Bit-Zahl ist. +Wenn die Ausgabe dieses Algorithmus unter dem gewünschten Ziel liegt, ist die Nonce gültig. Beachten Sie, dass die zusätzliche Anwendung von `sha3_256` am Ende sicherstellt, dass eine Zwischen-Nonce existiert, die bereitgestellt werden kann, um zu beweisen, dass zumindest ein kleiner Teil der Arbeit erledigt wurde; diese schnelle äußere PoW-Verifizierung kann für Anti-DDoS-Zwecke verwendet werden. Sie dient auch dazu, statistisch sicherzustellen, dass das Ergebnis eine unverzerrte 256-Bit-Zahl ist. ## Mining {#mining} -Der Mining-Algorithmus wird wie folgt definiert: +Der Mining-Algorithmus ist wie folgt definiert: ```python def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit + # Ziel mit Nullen auffüllen, um es mit dem Hash auf derselben Stelle zu vergleichen target = zpad(encode_int(2**256 // difficulty), 64)[::-1] from random import randint nonce = randint(0, 2**64) @@ -195,9 +195,9 @@ def mine(full_size, dataset, header, difficulty): return nonce ``` -## Seed-Hashes definieren {#seed-hash} +## Definition des Seed-Hashes {#seed-hash} -Um den Seed-Hash zu berechnen, der für das Mining auf einem bestimmten Block verwendet wird, nutzen wir den folgenden Algorithmus: +Um den Seed-Hash zu berechnen, der verwendet werden würde, um auf einem bestimmten Block zu minen, verwenden wir den folgenden Algorithmus: ```python def get_seedhash(block): @@ -207,20 +207,20 @@ Um den Seed-Hash zu berechnen, der für das Mining auf einem bestimmten Block ve return s ``` -Beachten Sie, dass wir für reibungsloses Mining und Überprüfen empfehlen, zukünftige Seed-Hashes und Datensätze in einem separaten Thread vorab zu berechnen. +Beachten Sie, dass wir für ein reibungsloses Mining und Verifizieren empfehlen, zukünftige Seed-Hashes und Datensätze in einem separaten Thread im Voraus zu berechnen. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ -## Zusatz {#appendix} +## Anhang {#appendix} Der folgende Code sollte vorangestellt werden, wenn Sie daran interessiert sind, die obige Python-Spezifikation als Code auszuführen. ```python import sha3, copy -# Assumes little endian bit ordering (same as Intel architectures) +# Setzt Little-Endian-Bitreihenfolge voraus (wie bei Intel-Architekturen) def decode_int(s): return int(s[::-1].encode('hex'), 16) if s else 0 @@ -248,7 +248,7 @@ def serialize_cache(ds): serialize_dataset = serialize_cache -# sha3 hash function, outputs 64 bytes +# sha3-Hash-Funktion, gibt 64 Bytes aus def sha3_512(x): return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) @@ -267,7 +267,7 @@ def isprime(x): ### Datengrößen {#data-sizes} -Die folgenden Nachschlagetabellen enthalten etwa 2048 tabellarische Epochen von Daten- und Cache-Größen. +Die folgenden Lookup-Tabellen bieten ungefähr 2048 tabellarische Epochen von Datengrößen und Cache-Größen. ```python def get_datasize(block_number): @@ -1016,4 +1016,4 @@ cache_sizes = [ 283377344, 283508416, 283639744, 283770304, 283901504, 284032576, 284163136, 284294848, 284426176, 284556992, 284687296, 284819264, 284950208, 285081536] -``` +``` \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md index b7edea0d218..fab3585c517 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md @@ -1,6 +1,6 @@ --- title: Mining-Algorithmen -description: Ein detailierter Einblick in die Algorithmen, welche für das Ethereum-Mining eingesetzt werden. +description: "Ein detaillierter Blick auf die Algorithmen, die für das Ethereum-Mining verwendet werden." lang: de --- @@ -8,35 +8,35 @@ lang: de -Proof-of-work ist nicht länger Ethereums Konsensmechanismus. Dies bedeutet, dass das Minen abgeschaltet wurde. Ethereum wird stattdessen durch Validatoren gesichert, die ETH einsetzen. Sie können schon heute mit dem Staking von ETH beginnen. Lese mehr dazu unter den Merge, Proof-of-Stake, und Staking. Diese Seite dient ausschließlich dem geschichtlichen Interesse. +Proof-of-Work liegt dem Konsensmechanismus von Ethereum nicht mehr zugrunde, was bedeutet, dass das Mining abgeschaltet wurde. Stattdessen wird Ethereum durch Validatoren gesichert, die ETH staken. Sie können noch heute mit dem Staking Ihrer ETH beginnen. Lesen Sie mehr über The Merge, Proof-of-Stake und Staking. Diese Seite ist nur von historischem Interesse. -Ethereum-Mining nutzte einen Algorithmus namens Ethash. Die Grundidee des Algorithmus besteht darin, dass der Miner versucht, durch Brute-Force-Berechnungen einen Nonce-Input zu finden, sodass der sich ergebende Hash-Wert kleiner ist als ein spezifischer Schwellenwert, der durch die berechnete Schwierigkeit festgelegt ist. Dieser Schwierigkeitsgrad kann dynamisch angepasst werden, sodass die Block-Produktion in regelmäßigen Intervallen ausgeführt werden kann. +Das Ethereum-Mining verwendete einen Algorithmus namens Ethash. Die grundlegende Idee des Algorithmus ist, dass ein Miner versucht, durch Brute-Force-Berechnung eine Nonce-Eingabe zu finden, sodass der resultierende Hash kleiner ist als ein Schwellenwert, der durch die berechnete Schwierigkeit bestimmt wird. Dieser Schwierigkeitsgrad kann dynamisch angepasst werden, sodass die Blockproduktion in regelmäßigen Abständen erfolgen kann. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir, dass Sie zunächst etwas über den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow) und [das Mining](/developers/docs/consensus-mechanisms/pow/mining) lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow) und [Mining](/developers/docs/consensus-mechanisms/pow/mining) zu informieren. -## Dagger-Hashimoto {#dagger-hashimoto} +## Dagger Hashimoto {#dagger-hashimoto} -Dagger Hashimoto war ein Wegbereiter-Forschungsalgorithmus für das Ethereum-Mining, der von Ethash abgelöst wurde. Er war eine Verschmelzung zweier anderer Algorithmen: Dagger und Hashimoto. Er war stets nur eine Forschungsimplementierung und wurde mit Veröffentlichung des Ethereum-Mainnets von Ethash abgelöst. +Dagger Hashimoto war ein Vorläufer-Forschungsalgorithmus für das Ethereum-Mining, der von Ethash abgelöst wurde. Es war eine Verschmelzung von zwei verschiedenen Algorithmen: Dagger und Hashimoto. Es handelte sich immer nur um eine Forschungsimplementierung und wurde bis zum Start des Ethereum-Mainnets durch Ethash ersetzt. -[Dagger](http://www.hashcash.org/papers/dagger.html) beinhaltet unter anderem die Generierung eines [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph), von dem zufällige Teile zu einem Hash-Wert zusammengefügt werden. Der Grundgedanke beruht darauf, dass jede Nonce nur einen kleinen Abschnitt eines großen Gesamt-Datenbaums benötigt. Den Unterbaum für jede Nonce neu zu berechnen, würde Mining unmöglich machen – weshalb der Baum gespeichert werden muss –, doch für die Verifizierung einer einzigen Nonce ist dieser Vorgang in Ordnung. Dagger wurde als Alternative zu bestehenden Algorithmen wie Scrypt entwickelt, die speicherhart, aber schwer zu verifizieren sind, wenn ihre Speicherhärte auf tatsächlich sichere Ebenen ansteigt. Dagger hatte jedoch Schwachstellen durch Hardwarebeschleunigung in Shared-Memory-Umgebungen und wurde daher durch andere Methoden in der Forschung ersetzt. +[Dagger](http://www.hashcash.org/papers/dagger.html) beinhaltet die Erstellung eines [gerichteten azyklischen Graphen (Directed Acyclic Graph)](https://en.wikipedia.org/wiki/Directed_acyclic_graph), von dem zufällige Teile zusammen gehasht werden. Das Kernprinzip besteht darin, dass jede Nonce nur einen kleinen Teil eines großen Gesamtdatenbaums benötigt. Die Neuberechnung des Teilbaums für jede Nonce ist für das Mining unerschwinglich – daher die Notwendigkeit, den Baum zu speichern –, aber für die Verifizierung einer einzelnen Nonce in Ordnung. Dagger wurde als Alternative zu bestehenden Algorithmen wie Scrypt entwickelt, die speicherintensiv (memory-hard) sind, aber schwer zu verifizieren, wenn ihre Speicherintensität auf ein wirklich sicheres Niveau ansteigt. Dagger war jedoch anfällig für Hardwarebeschleunigung mit gemeinsam genutztem Speicher (Shared Memory) und wurde zugunsten anderer Forschungsansätze fallen gelassen. -[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) ist ein Algorithmus, der durch I/O-Limitierung ASIC-resistent ist (d. h., Speicherzugriffe sind der limitierende Faktor während des Miningprozesses). Die Theorie dahinter besagt, dass RAM leichter verfügbar ist als Rechenleistung; durch milliardenschwere Forschung wurde bereits untersucht, inwieweit sich RAM für verschiedene Nutzungsszenarien optimieren lässt, die häufig annähernd zufällige Zugriffsmuster nutzen (daher „Random Access Memory“). Daraus folgt, dass bestehende RAM-Lösungen wahrscheinlich annähernd optimal für die Bewertung des Algorithmus sind. Hashimoto nutzt die Blockchain als Datenquelle, was sowohl den Punkt (1) als auch (3) weiter oben erfüllt. +[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) ist ein Algorithmus, der ASIC-Resistenz hinzufügt, indem er I/O-gebunden ist (d. h. Speicherlesevorgänge sind der begrenzende Faktor im Mining-Prozess). Die Theorie besagt, dass RAM leichter verfügbar ist als Rechenleistung; Milliarden von Dollar an Forschungsgeldern wurden bereits in die Optimierung von RAM für verschiedene Anwendungsfälle investiert, die oft nahezu zufällige Zugriffsmuster beinhalten (daher „Random Access Memory“). Infolgedessen ist der vorhandene RAM wahrscheinlich mäßig nah am Optimum für die Auswertung des Algorithmus. Hashimoto nutzt die Blockchain als Datenquelle und erfüllt damit gleichzeitig die obigen Punkte (1) und (3). -Dagger-Hashimoto verwendete abgeänderte Versionen der Algorithmen von Dagger und Hashimoto. Der Unterschied zwischen Dagger-Hashimoto und Hashimoto besteht darin, dass Dagger-Hashimoto anstatt der Blockchain einen spezifischen Datensatz nutzt, der entsprechend den Blockdaten alle n Blöcke eine Aktualisierung durchführt. Der Datensatz wird durch den Dagger-Algorithmus generiert, was die effiziente Berechnung einer Untergruppe für jede Nonce für den Verifizierungsalgorithmus des Light-Clients ermöglicht. Der Unterschied zwischen Dagger-Hashimoto und Dagger besteht darin, dass – anders als im originalen Dagger – der Datensatz, der für die Anfrage an den Block genutzt wird, semi-permanent ist und nur gelegentlich aktualisiert wird (beispielsweise einmal pro Woche). Das bedeutet, dass der Anteil des Aufwands für die Generierung des Datensatzes annähernd null ist, weshalb Sergio Lerners Argumente in Bezug auf Geschwindigkeitszuwächse durch Shared-Memory vernachlässigbar sind. +Dagger-Hashimoto verwendete geänderte Versionen der Dagger- und Hashimoto-Algorithmen. Der Unterschied zwischen Dagger Hashimoto und Hashimoto besteht darin, dass Dagger Hashimoto anstelle der Blockchain als Datenquelle einen benutzerdefiniert generierten Datensatz verwendet, der basierend auf Blockdaten alle N Blöcke aktualisiert wird. Der Datensatz wird mit dem Dagger-Algorithmus generiert, was eine effiziente Berechnung einer für jede Nonce spezifischen Teilmenge für den Light-Client-Verifizierungsalgorithmus ermöglicht. Der Unterschied zwischen Dagger Hashimoto und Dagger besteht darin, dass der Datensatz, der zur Abfrage des Blocks verwendet wird, im Gegensatz zum ursprünglichen Dagger semi-permanent ist und nur in gelegentlichen Abständen (z. B. einmal pro Woche) aktualisiert wird. Dies bedeutet, dass der Aufwand für die Generierung des Datensatzes nahezu null ist, sodass Sergio Lerners Argumente bezüglich der Geschwindigkeitssteigerungen durch Shared Memory vernachlässigbar werden. -Erfahren Sie mehr über [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). +Mehr zu [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). ## Ethash {#ethash} -Ethash war der Mining-Algorithmus, der tatsächlich auf dem echten Ethereum-Mainnet unter der inzwischen veralteten Proof-of-Work-Architektur verwendet wurde. Ethash war im Grunde ein neuer Name, der einer bestimmten Version von Dagger-Hashimoto gegeben wurde, nachdem der Algorithmus signifikant aktualisiert worden war, aber noch immer die grundlegenden Prinzipien seines Vorgängers befolgte. Das Ethereum-Mainnet hat immer ausschließlich Ethash verwendet – Dagger-Hashimoto war eine Forschungs- und Entwicklungsversion des Mining-Algorithmus, die noch vor dem Mining auf dem Ethereum-Mainnet ersetzt wurde. +Ethash war der Mining-Algorithmus, der tatsächlich im echten Ethereum-Mainnet unter der nun veralteten Proof-of-Work-Architektur verwendet wurde. Ethash war im Grunde ein neuer Name für eine bestimmte Version von Dagger-Hashimoto, nachdem der Algorithmus erheblich aktualisiert wurde, während er weiterhin die grundlegenden Prinzipien seines Vorgängers erbte. Das Ethereum-Mainnet verwendete immer nur Ethash – Dagger Hashimoto war eine F&E-Version des Mining-Algorithmus, die abgelöst wurde, bevor das Mining im Ethereum-Mainnet begann. -[Mehr über Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). +[Mehr zu Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/dapps/index.md b/public/content/translations/de/developers/docs/dapps/index.md index 934f383496c..aad29b6ae4f 100644 --- a/public/content/translations/de/developers/docs/dapps/index.md +++ b/public/content/translations/de/developers/docs/dapps/index.md @@ -1,96 +1,104 @@ --- -title: Einführung in Dapps +title: "Technische Einführung in Dapps" description: lang: de --- -Eine dezentralisierte Anwendung (dapp) ist eine Anwendung, die auf einem dezentralisierten Netzwerk aufgebaut ist. Dies kombiniert einen [Smart Contract](/developers/docs/smart-contracts/) und eine Frontend-Benutzeroberfläche. Beachte, dass Smart Contracts in Ethereum zugänglich und transparent sind – wie offene APIs –, also kann deine Dapp sogar einen Smart Contract enthalten, den eine andere Person geschrieben hat. +Eine dezentralisierte Anwendung (Dapp) ist eine Anwendung, die auf einem dezentralisierten Netzwerk aufbaut und einen [Smart Contract](/developers/docs/smart-contracts/) mit einer Frontend-Benutzeroberfläche kombiniert. Auf [Ethereum](/) sind Smart Contracts zugänglich und transparent – wie offene APIs –, sodass Ihre Dapp sogar einen Smart Contract enthalten kann, den jemand anderes geschrieben hat. ## Voraussetzungen {#prerequisites} -Bevor du mehr über Dapps lernst, solltest du die [Blockchain-Basics](/developers/docs/intro-to-ethereum/) kennen und dir durchlesen, was das Ethereum-Netzwerk ist und wie es dezentralisiert wird. +Bevor Sie sich mit Dapps befassen, sollten Sie die [Blockchain-Grundlagen](/developers/docs/intro-to-ethereum/) durchgehen und sich über das Ethereum-Netzwerk und dessen dezentralisierte Natur informieren. ## Definition einer Dapp {#definition-of-a-dapp} -Eine Dapp hat ihren Backend-Code auf einem dezentralisierten Peer-to-Peer-Netzwerk laufen. Vergleiche das mit einer App, bei der der Backend-Code auf dezentralisierten Servern läuft. +Der Backend-Code einer Dapp läuft auf einem dezentralisierten Peer-to-Peer-Netzwerk. Im Gegensatz dazu läuft der Backend-Code einer herkömmlichen App auf zentralisierten Servern. -Eine Dapp kann Frontend-Code und eine Benutzeroberfläche in jeder beliebigen Sprache haben (genau wie eine App), die Aufrufe in ihrem Backend tätigen können. Darüber hinaus kann das Frontend auf dezentralisiertem Speicher wie [IPFS](https://ipfs.io/) gehostet werden. +Eine Dapp kann Frontend-Code und Benutzeroberflächen haben, die in einer beliebigen Sprache geschrieben sind (genau wie eine App), um Aufrufe an ihr Backend zu tätigen. Darüber hinaus kann ihr Frontend auf dezentralisierten Speichern wie [IPFS](https://ipfs.io/) gehostet werden. -- **Dezentralisiert** – Dapps arbeiten auf Ethereum, einer offenen, öffentlichen und dezentralen Plattform, auf der keine Person oder Gruppe die Kontrolle hat. -- **Deterministisch** – Dapps führen dieselbe Funktion aus, unabhängig von der Umgebung, in der sie ausgeführt werden. -- **Turing-Vollständigkeit** – Dapps können jede Aktion ausführen, wenn die erforderlichen Ressourcen vorhanden sind. -- **Isoliert** – Dapps werden in einer virtuellen Umgebung ausgeführt, die als Ethereum Virtual Machine bekannt ist, so dass ein Fehler im Smart Contract die normale Funktion des Blockchain-Netzwerks nicht beeinträchtigt. +- **Dezentralisiert** – Dapps laufen auf Ethereum, einer offenen, öffentlichen, dezentralisierten Plattform, bei der keine einzelne Person oder Gruppe die Kontrolle hat +- **Deterministisch** – Dapps führen dieselbe Funktion aus, unabhängig von der Umgebung, in der sie ausgeführt werden +- **Turing-vollständig** – Dapps können jede Aktion ausführen, sofern die erforderlichen Ressourcen vorhanden sind +- **Isoliert** – Dapps werden in einer virtuellen Umgebung ausgeführt, die als Ethereum Virtual Machine bekannt ist. Wenn der Smart Contract also einen Fehler aufweist, beeinträchtigt dies nicht die normale Funktion des Blockchain-Netzwerks -### Smart Contracts {#on-smart-contracts} +### Über Smart Contracts {#on-smart-contracts} -Um Dapps einzuführen, müssen wir auch Smart Contracts vorstellen – das Backend einer Dapp. Einen detaillierten Überblick findest du in unserem Abschnitt über [Smart Contracts](/developers/docs/smart-contracts/). +Um Dapps vorzustellen, müssen wir Smart Contracts einführen – mangels eines besseren Begriffs das Backend einer Dapp. Für einen detaillierten Überblick besuchen Sie unseren Abschnitt über [Smart Contracts](/developers/docs/smart-contracts/). -Ein Smart Contract ist ein Code, der auf der Ethereum-Blockchain existiert und genau wie programmiert abläuft. Sobald Smart Contracts im Netzwerk eingesetzt werden, kannst du sie nicht mehr ändern. Dapps können dezentralisiert sein, weil sie von der Logik kontrolliert werden, die in den Vertrag geschrieben ist, und nicht von einem Individuum oder einem Unternehmen. Das bedeutet auch, dass du deine Verträge sehr sorgfältig gestalten und gründlich testen musst. +Ein Smart Contract ist Code, der auf der Ethereum-Blockchain existiert und genau wie programmiert ausgeführt wird. Sobald Smart Contracts im Netzwerk bereitgestellt wurden, können Sie sie nicht mehr ändern. Dapps können dezentralisiert sein, weil sie durch die im Vertrag geschriebene Logik gesteuert werden und nicht durch eine Einzelperson oder ein Unternehmen. Das bedeutet auch, dass Sie Ihre Verträge sehr sorgfältig entwerfen und gründlich testen müssen. ## Vorteile der Dapp-Entwicklung {#benefits-of-dapp-development} -- **Zero downtime** - Sobald der Smart Contract auf der Blockchain implementiert ist, kann das gesamte Netzwerk jederzeit Kunden bedienen, die mit dem Vertrag interagieren wollen. Böswillige Akteure können daher keine "Denial-of-Service"-Angriffe starten, die auf einzelne Dapps abzielen. -- **Privatsphäre** – Du musst keine echte Identität zur Verfügung stellen, um eine Dapp bereitzustellen oder mit einer zu interagieren. -- **Resistenz gegen Zensur** - keine einzige Entität im Netzwerk kann Benutzer daran hindern, Transaktionen zu übertragen, Dapps bereitzustellen oder Daten der Blockchain auszulesen. -- **Komplette Datenintegrität** – Daten, die auf der Blockchain gespeichert sind, sind unveränderbar und unbestreitbar, dank kryptographischer Primitivität. Böswillige Akteure können keine Transaktionen oder andere Daten, die bereits öffentlich gemacht wurden, fälschen. -- **Vertrauenslose Berechnung/überprüfbares Verhalten** – Smart Contracts können analysiert werden und garantieren, dass sie auf vorhersehbare Weise ausgeführt werden, ohne dass dafür das Vertrauen in eine zentrale Autorität vorausgesetzt wird. Das ist bei traditionellen Modellen nicht der Fall. Wenn wir zum Beispiel Online-Banking-Systeme nutzen, müssen wir darauf vertrauen, dass die Finanzinstitute unsere Finanzdaten nicht missbrauchen, keine Aufzeichnungen manipulieren und uns nicht hacken. +- **Keine Ausfallzeiten** – Sobald der Smart Contract auf der Blockchain bereitgestellt ist, wird das Netzwerk als Ganzes immer in der Lage sein, Anwendungen zu bedienen, die mit dem Vertrag interagieren möchten. Böswillige Akteure können daher keine Denial-of-Service-Angriffe auf einzelne Dapps starten. +- **Datenschutz** – Sie müssen keine reale Identität angeben, um eine Dapp bereitzustellen oder mit ihr zu interagieren. +- **Zensurresistenz** – Keine einzelne Entität im Netzwerk kann Benutzer daran hindern, Transaktionen einzureichen, Dapps bereitzustellen oder Daten aus der Blockchain zu lesen. +- **Vollständige Datenintegrität** – Daten, die auf der Blockchain gespeichert sind, sind dank kryptografischer Primitive unveränderlich und unbestreitbar. Böswillige Akteure können keine Transaktionen oder andere Daten fälschen, die bereits veröffentlicht wurden. +- **Vertrauenslose Berechnung/verifizierbares Verhalten** – Smart Contracts können analysiert werden und führen garantiert auf vorhersehbare Weise aus, ohne dass einer zentralen Autorität vertraut werden muss. Dies gilt nicht für traditionelle Modelle; wenn wir beispielsweise Online-Banking-Systeme nutzen, müssen wir darauf vertrauen, dass Finanzinstitute unsere Finanzdaten nicht missbrauchen, Aufzeichnungen nicht manipulieren oder gehackt werden. ## Nachteile der Dapp-Entwicklung {#drawbacks-of-dapp-development} -- **Wartung** – Dapps können schwieriger zu warten sein, weil der Code und die Daten, die auf der Blockchain veröffentlicht werden, schwerer zu ändern sind. Für Entwickler ist es schwierig ihre dApps (oder die zugrunde liegenden Daten, die von einer dApp gespeichert werden) zu aktualisieren, sobald sie bereitgestellt wurden, selbst wenn in einer alten Version Fehler oder Sicherheitsrisiken festgestellt werden. -- **Performance-Overhead** – Es gibt einen enormen Performance-Overhead und die Skalierung ist sehr schwierig. Um den Grad an Sicherheit, Integrität, Transparenz und Zuverlässigkeit zu erreichen, den Ethereum anstrebt, führt jeder Node jede Transaktion aus und speichert sie. Hinzu kommt, dass der Proof-of-Stake-Konsens ebenfalls Zeit benötigt. -- **Netzüberlastung** – Wenn eine Dapp zu viele Rechenressourcen verbraucht, gerät das gesamte Netzwerk ins Stocken. Derzeit kann das Netzwerk nur etwa 10 bis 15 Transaktionen pro Sekunde verarbeiten; wenn Transaktionen schneller eingehen, kann der Pool an unbestätigten Transaktionen schnell anschwellen. -- **Benutzererfahrung** – Es könnte schwieriger sein, eine benutzerfreundliche Erfahrung zu entwickeln, weil es für den durchschnittlichen Endbenutzer zu schwer sein könnte, die notwendigen Tools für eine wirklich sichere Interaktion mit der Blockchain einzurichten. -- **Zentralisierung** – Benutzer- und entwicklerfreundliche Lösungen, die auf der Basisschicht von Ethereum aufgebaut sind, könnten am Ende ohnehin wie zentralisierte Dienste aussehen. Solche Dienste können zum Beispiel Schlüssel oder andere sensible Informationen serverseitig speichern, ein Frontend über einen zentralen Server bedienen oder wichtige Geschäftslogik auf einem zentralen Server ausführen, bevor sie in die Blockchain geschrieben werden. Durch die Zentralisierung werden viele (wenn nicht alle) Vorteile der Blockchain gegenüber dem traditionellen Modell aufgehoben. +- **Wartung** – Dapps können schwerer zu warten sein, da der auf der Blockchain veröffentlichte Code und die Daten schwerer zu ändern sind. Es ist für Entwickler schwierig, Aktualisierungen an ihren Dapps (oder den zugrunde liegenden Daten, die von einer Dapp gespeichert werden) vorzunehmen, sobald sie bereitgestellt sind, selbst wenn Fehler oder Sicherheitsrisiken in einer alten Version identifiziert werden. +- **Leistungsaufwand** – Es gibt einen enormen Leistungsaufwand, und die Skalierung ist wirklich schwierig. Um das Maß an Sicherheit, Integrität, Transparenz und Zuverlässigkeit zu erreichen, das Ethereum anstrebt, führt jeder Blockchain-Knoten jede Transaktion aus und speichert sie. Darüber hinaus nimmt auch der Proof-of-Stake-Konsens Zeit in Anspruch. +- **Netzwerküberlastung** – Wenn eine Dapp zu viele Rechenressourcen verbraucht, staut sich das gesamte Netzwerk. Derzeit kann das Netzwerk nur etwa 10-15 Transaktionen pro Sekunde verarbeiten; wenn Transaktionen schneller gesendet werden, kann der Pool unbestätigter Transaktionen schnell anwachsen. +- **Benutzererfahrung** – Es kann schwieriger sein, benutzerfreundliche Erlebnisse zu entwickeln, da der durchschnittliche Endbenutzer es möglicherweise zu schwierig findet, einen Tool-Stack einzurichten, der erforderlich ist, um auf wirklich sichere Weise mit der Blockchain zu interagieren. +- **Zentralisierung** – Benutzerfreundliche und entwicklerfreundliche Lösungen, die auf der Basisschicht von Ethereum aufbauen, könnten am Ende ohnehin wie zentralisierte Dienste aussehen. Beispielsweise können solche Dienste Schlüssel oder andere sensible Informationen serverseitig speichern, ein Frontend über einen zentralisierten Server bereitstellen oder wichtige Geschäftslogik auf einem zentralisierten Server ausführen, bevor sie auf die Blockchain schreiben. Zentralisierung beseitigt viele (wenn nicht alle) Vorteile der Blockchain gegenüber dem traditionellen Modell. -## Eher ein visueller Lerner? {#visual-learner} +## Lernen Sie lieber visuell? {#visual-learner} -## Tools zum Erstellen von dApps {#dapp-tools} +## Tools zur Erstellung von Dapps {#dapp-tools} -**Scaffold-ETH _- Experimentiere schnell mit Solidity, indem du ein Frontend verwendest, das sich an deinen Smart Contract anpasst._** +**Scaffold-ETH _– Experimentieren Sie schnell mit Solidity über ein Frontend, das sich an Ihren Smart Contract anpasst._** - [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) - [Beispiel-Dapp](https://punkwallet.io/) -**Eth App erstellen _– Erstelle Ethereum-gestützte Apps mit einem Befehl._** +**Create Eth App _– Erstellen Sie Ethereum-basierte Apps mit einem einzigen Befehl._** - [GitHub](https://github.com/paulrberg/create-eth-app) -**One Click Dapp _– FOSS-Tool zur Erstellung von Dapp-Frontends aus einer [ABI](/glossary/#abi)._** +**One Click Dapp _– FOSS-Tool zur Generierung von Dapp-Frontends aus einer [ABI](/glossary/#abi)._** - [oneclickdapp.com](https://oneclickdapp.com) - [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1) -**Etherflow _– FOSS-Tool für Ethereum-Entwickler, um ihre Nodes zu testen und RPC-Aufrufe vom Browser aus zu komponieren und zu debuggen._** +**Etherflow _– FOSS-Tool für Ethereum-Entwickler, um ihren Blockchain-Knoten zu testen sowie RPC-Aufrufe im Browser zu erstellen und zu debuggen._** - [etherflow.quiknode.io](https://etherflow.quiknode.io/) - [GitHub](https://github.com/abunsen/etherflow) -**thirdweb _- SDKs in jeder Sprache, Smart Contracts, Tools und Infrastruktur für die Web3-Entwicklung._** +**thirdweb _– SDKs in jeder Sprache, Smart Contracts, Tools und Infrastruktur für die Web3-Entwicklung._** -- [Website](https://thirdweb.com/) +- [Startseite](https://thirdweb.com/) - [Dokumentation](https://portal.thirdweb.com/) - [GitHub](https://github.com/thirdweb-dev/) -**Crossmint _– Eine Web3-Entwicklungsplattform auf Unternehmensniveau, die das Bereitstellen von Smart Contracts sowie Kreditkarten- und Cross-Chain-Zahlungen ermöglicht und APIs zu Erstellung, Verteilung, Verkauf, Speicherung und Bearbeitung von NFTs nutzt._** +**Crossmint _– Web3-Entwicklungsplattform auf Unternehmensniveau zur Bereitstellung von Smart Contracts, zur Ermöglichung von Kreditkarten- und Cross-Chain-Zahlungen sowie zur Nutzung von APIs zum Erstellen, Verteilen, Verkaufen, Speichern und Bearbeiten von NFTs._** - [crossmint.com](https://www.crossmint.com) - [Dokumentation](https://docs.crossmint.com) - [Discord](https://discord.com/invite/crossmint) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Entdecken Sie dApps](/apps) +- [Dapps entdecken](/apps) - [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ -- [Ein Leitfaden für dezentrale Anwendungen aus dem Jahr 2021](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) – _LimeChain_ -- [Was sind dezentrale Apps?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) – _Gemini_ +- [Ein Leitfaden zu dezentralisierten Anwendungen aus dem Jahr 2021](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) – _LimeChain_ +- [Was sind dezentralisierte Apps?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) – _Gemini_ - [Beliebte Dapps](https://www.alchemy.com/dapps) – _Alchemy_ -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Einführung in den Ethereum-Stack](/developers/docs/ethereum-stack/) - [Entwicklungs-Frameworks](/developers/docs/frameworks/) + +## Tutorials: Apps und Frontends auf Ethereum erstellen {#tutorials} + +- [Uniswap-v2 Contract Walk-Through](/developers/tutorials/uniswap-v2-annotated-code/) _– Ein kommentierter Durchgang durch die Uniswap v2 Core Contracts, der erklärt, wie der AMM funktioniert._ +- [Erstellen einer Benutzeroberfläche für Ihren Vertrag](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) _– Wie man ein modernes React + wagmi Frontend erstellt, das sich mit Ihrem Smart Contract verbindet._ +- [Hello World Smart Contract für Anfänger – Fullstack](/developers/tutorials/hello-world-smart-contract-fullstack/) _– End-to-End-Tutorial: Schreiben, Bereitstellen und Erstellen eines Frontends für einen einfachen Smart Contract._ +- [Serverkomponenten und Agenten für Web3-Apps](/developers/tutorials/server-components/) _– Wie man TypeScript-Serverkomponenten schreibt, die auf Blockchain-Ereignisse hören und mit Transaktionen antworten._ +- [IPFS für dezentralisierte Benutzeroberflächen](/developers/tutorials/ipfs-decentralized-ui/) _– Wie Sie das Frontend Ihrer Dapp auf IPFS hosten, um Zensurresistenz zu gewährleisten._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md index 1ee0c1dfd60..2e9fd05576d 100644 --- a/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md @@ -1,260 +1,245 @@ --- -title: Block-Explorer -description: Eine Einführung in Block-Explorer, Ihr Portal in die Welt der Blockchain-Daten – dort können Sie Informationen über Transaktionen, Konten, Verträge und mehr abfragen +title: Blocksuchmaschinen +description: "Eine Einführung in Blocksuchmaschinen, Ihr Portal in die Welt der Blockchain-Daten, wo Sie Informationen über Transaktionen, Konten, Verträge und mehr abfragen können." lang: de sidebarDepth: 3 --- -Block-Explorer sind das Portal zu den Daten von Ethereum. Sie können sie nutzen, um Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen On-Chain-Aktivitäten einzusehen. +Blocksuchmaschinen sind Ihr Portal zu den Daten von Ethereum. Sie können sie verwenden, um Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen Aktivitäten auf der Blockchain zu sehen. ## Voraussetzungen {#prerequisites} -Sie sollten das Basiskonzept von Ethereum verstehen, damit Sie die Daten, die Sie über einen Block-Explorer erhalten, sinnvoll nutzen können. Beginnen Sie mit [einer Einführung in Ethereum](/developers/docs/intro-to-ethereum/). +Sie sollten die grundlegenden Konzepte von Ethereum verstehen, damit Sie die Daten, die Ihnen eine Blocksuchmaschine liefert, nachvollziehen können. Beginnen Sie mit [einer Einführung in Ethereum](/developers/docs/intro-to-ethereum/). -## Dienste {#services} +## Open-Source-Tools {#open-source-tools} -- [Etherscan](https://etherscan.io/) -_Auch in Chinesisch, Koreanisch, Russisch und Japanisch verfügbar_ -- [3xpl](https://3xpl.com/ethereum) +- [3xpl](https://3xpl.com/ethereum) - Eine werbefreie Ethereum-Suchmaschine, die das Herunterladen ihrer Datensätze ermöglicht (Open-Core: Kernmodule sind Open Source) - [Beaconcha.in](https://beaconcha.in/) -- [Blockchair](https://blockchair.com/ethereum) -_Auch in Spanisch, Französisch, Italienisch, Niederländisch, Portugiesisch, Russisch, Chinesisch und Farsi verfügbar_ - [Blockscout](https://eth.blockscout.com/) +- [lazy-etherscan](https://github.com/woxjro/lazy-etherscan) +- [Otterscan](https://otterscan.io/) + +## Dienste {#services} + +- [Blockchair](https://blockchair.com/ethereum) - Private Ethereum-Suchmaschine. Auch zum Sortieren und Filtern von (Mempool-)Daten. Verfügbar auf Spanisch, Französisch, Italienisch, Niederländisch, Portugiesisch, Russisch, Chinesisch und Farsi - [Chainlens](https://www.chainlens.com/) - [DexGuru Block Explorer](https://ethereum.dex.guru/) - [Etherchain](https://www.etherchain.org/) -- [Ethernow](https://www.ethernow.xyz/) -- [Ethplorer](https://ethplorer.io/) -_Auch in Chinesisch, Spanisch, Französisch, Türkisch, Russisch, Koreanisch und Vietnamesisch verfügbar_ +- [Etherscan](https://etherscan.io/) - Auch verfügbar auf Chinesisch, Koreanisch, Russisch und Japanisch +- [Ethplorer](https://ethplorer.io/) - Eine Blocksuchmaschine mit Fokus auf Token. Auch verfügbar auf Chinesisch, Spanisch, Französisch, Türkisch, Russisch, Koreanisch und Vietnamesisch +- [Ethseer](https://ethseer.io) - [EthVM](https://www.ethvm.com/) - [OKLink](https://www.oklink.com/eth) -- [Rantom](https://rantom.app/) -- [Ethseer](https://ethseer.io) - -## Open-Source-Werkzeuge {#open-source-tools} - -- [Otterscan](https://otterscan.io/) -- [lazy-etherscan](https://github.com/woxjro/lazy-etherscan) ## Daten {#data} -Ethereum ist von Grund auf transparent und damit ist auch alles überprüfbar. Block-Explorer bieten eine Oberfläche, um diese Informationen zu erhalten. Das gilt sowohl für das Ethereum-Netzwerk als auch für die Testnets, wenn Sie diese Daten benötigen. Die Daten werden in Ausführungsdaten und Konsensdaten unterteilt. Die Ausführungsdaten beziehen sich auf die Transaktionen, die in einem bestimmten Block ausgeführt wurden. Die Konsensdaten beziehen sich auf die Blöcke selbst und die Validatoren, die sie vorgeschlagen haben. +Ethereum ist von Grund auf transparent, sodass alles überprüfbar ist. Blocksuchmaschinen bieten eine Schnittstelle, um diese Informationen abzurufen. Und dies gilt sowohl für das Haupt-Ethereum-Netzwerk als auch für die Testnets, falls Sie diese Daten benötigen. Die Daten sind in Ausführungsdaten und Konsensdaten unterteilt. Die Ausführungsdaten beziehen sich auf die Transaktionen, die in einem bestimmten Block ausgeführt wurden. Die Konsensdaten beziehen sich auf die Blöcke selbst und die Validatoren, die sie vorgeschlagen haben. -Im Folgenden finden Sie eine Zusammenfassung der Arten von Daten, die Sie über einem Block-Explorer erhalten können: +Hier ist eine Zusammenfassung der Arten von Daten, die Sie von einer Blocksuchmaschine erhalten können. ### Ausführungsdaten {#execution-data} -Neue Blöcke werden alle 12 Sekunden zu Ethereum hinzugefügt (es sei denn, ein Block-Proposer verpasst seinen Zug), so dass den Block-Explorern ein nahezu konstanter Datenstrom hinzugefügt wird. Blöcke enthalten viele wichtige Daten, die Sie vielleicht hilfreich finden: +Neue Blöcke werden Ethereum alle 12 Sekunden hinzugefügt (es sei denn, ein Block-Vorschlagender verpasst seinen Zug), sodass ein nahezu konstanter Datenstrom zu Blocksuchmaschinen hinzugefügt wird. Blöcke enthalten viele wichtige Daten, die Sie nützlich finden könnten: **Standarddaten** - Blockhöhe - Die Blocknummer und Länge der Blockchain (in Blöcken) bei der Erstellung des aktuellen Blocks - Zeitstempel - Die Zeit, zu der ein Block vorgeschlagen wurde - Transaktionen - Die Anzahl der im Block enthaltenen Transaktionen -- Gebührenempfänger - Die Adresse, die Gas-Trinkgelder aus Transaktionen erhalten hat -- Block-Prämie - Der ETH-Betrag, der dem Validator, der den Block vorgeschlagen hat, zugesprochen wurde +- Gebührenempfänger - Die Adresse, die Gasgebühr-Trinkgelder aus Transaktionen erhalten hat +- Block-Belohnung - Die Menge an ETH, die dem Validator zugesprochen wird, der den Block vorgeschlagen hat - Größe - Die Größe der Daten innerhalb des Blocks (gemessen in Bytes) -- Verbrauchtes Gas - Gesamte Gaseinheiten, die von den Transaktionen im Block verbraucht wurden -- Gaslimit - Die Gaslimits, die von den Transaktionen im Block gesetzt wurden -- Grundgebühr pro Gas - Der Mindestmultiplikator, der erforderlich ist, damit eine Transaktion in einen Block aufgenommen werden kann -- Verbrannte Gebühren - Wie viel ETH in einem Block verbrannt wird -- Extradaten - alle zusätzlichen Daten, die der Ersteller im Block eingefügt hat +- Verwendetes Gas - Die gesamten Einheiten an Gas, die von den Transaktionen im Block verwendet wurden +- Gaslimit - Die gesamten Gaslimits, die von den Transaktionen im Block festgelegt wurden +- Grundgebühr pro Gas - Der minimale Multiplikator, der erforderlich ist, damit eine Transaktion in einen Block aufgenommen wird +- Verbrannte Gebühren - Wie viel ETH im Block verbrannt wird +- Zusätzliche Daten - Alle zusätzlichen Daten, die der Ersteller in den Block aufgenommen hat **Erweiterte Daten** -- Hash - Der kryptografische Hash, der den Kopf eines Blocks darstellt (der eindeutige Identifier des Blocks) -- Parent Hash - Der Hash des Blocks, der vor dem aktuellen Block kam -- StateRoot - Der Wurzelhash des Merkle-Baums, der den gesamten Zustand des Systems speichert +- Hash - Der kryptografische Hash, der den Block-Header darstellt (die eindeutige Kennung des Blocks) +- Parent-Hash - Der Hash des Blocks, der vor dem aktuellen Block kam +- StateRoot - Der Root-Hash des Merkle-Trie, der den gesamten Zustand des Systems speichert -### Ressourcen {#gas} +### Gas {#gas} -Block-Explorer geben nicht nur Informationen zum Ressourcenverbrauch in Transkationen und Blöcken an, manche zeigen auch Informationen zu den aktuell im Netzwerk gültigen Ressourcenpreisen an. Das hilft Ihnen dabei, die Nutzung des Netzwerks zu verstehen, sichere Transaktionen auszuführen und nicht mehr Ressourcen zu beanspruchen als notwendig. Suchen Sie nach APIs, die Ihnen helfen können, diese Informationen in die Produktschnittstelle zu integrieren. Ressourcenspezifische Datenabdeckungen: +Blocksuchmaschinen geben Ihnen nicht nur Daten über die Gas-Nutzung in Transaktionen und Blöcken, sondern einige geben Ihnen auch Informationen zu den aktuellen Gaspreisen des Netzwerks. Dies hilft Ihnen, die Netzwerknutzung zu verstehen, sichere Transaktionen einzureichen und nicht zu viel für Gas auszugeben. Halten Sie Ausschau nach APIs, die Ihnen helfen können, diese Informationen in die Benutzeroberfläche Ihres Produkts zu integrieren. Gas-spezifische Daten umfassen: -- Geschätzte Gaseinheiten, die für eine sichere, aber langsame Transaktion benötigt werden (+ geschätzter Preis und Dauer) -- Geschätzte Gaseinheiten, die für eine durchschnittliche Transaktion benötigt werden (+ geschätzter Preis und Dauer) -- Geschätzte Gaseinheiten, die für eine schnelle Transaktion benötigt werden (+ geschätzter Preis und Dauer) -- Durchschnittliche Bestätigungszeit auf Basis des Gaspreises -- Verträge, die Gas verbrauchen - mit anderen Worten: beliebte Produkte, die im Netz viel genutzt werden -- Konten, die Gas ausgeben - mit anderen Worten, häufige Nutzer des Netzes +- Geschätzte Einheiten an Gas, die für eine sichere, aber langsame Transaktion benötigt werden (+ geschätzter Preis und Dauer) +- Geschätzte Einheiten an Gas, die für eine durchschnittliche Transaktion benötigt werden (+ geschätzter Preis und Dauer) +- Geschätzte Einheiten an Gas, die für eine schnelle Transaktion benötigt werden (+ geschätzter Preis und Dauer) +- Durchschnittliche Bestätigungszeit basierend auf dem Gaspreis +- Verträge, die Gas verbrauchen - mit anderen Worten, beliebte Produkte, die im Netzwerk stark genutzt werden +- Konten, die Gas ausgeben - mit anderen Worten, häufige Netzwerknutzer ### Transaktionen {#transactions} -Block-Explorer werden häufig eingesetzt, um den Status der Transaktionen abzurufen. Das liegt an dem Detailgrad, den sie bieten und der zusätzliche Sicherheit bietet. Die Transaktionsdetails enthalten Folgendes: +Blocksuchmaschinen sind zu einem gängigen Ort geworden, an dem Menschen den Fortschritt ihrer Transaktionen verfolgen. Das liegt daran, dass der Detaillierungsgrad, den Sie erhalten können, zusätzliche Sicherheit bietet. Transaktionsdaten umfassen: **Standarddaten** -- Transaktionshash - Ein Hash, der bei der Übermittlung der Transaktion generiert wird +- Transaktions-Hash - Ein Hash, der generiert wird, wenn die Transaktion eingereicht wird - Status - Ein Hinweis darauf, ob die Transaktion ausstehend, fehlgeschlagen oder erfolgreich ist -- Block - Der Block, in dem die Transaktion enthalten ist -- Zeitstempel – der Zeitpunkt, zu dem eine Transaktion in einen von einem Validator vorgeschlagenen Block aufgenommen wurde -- From - Die Adresse des Kontos, das die Transaktion übermittelt hat -- To - Die Adresse des Empfängers oder des Smart Contracts, mit dem die Transaktion interagiert -- Übertragene Token - Eine Liste der Token, die als Teil der Transaktion übertragen wurden -- Wert - Der Gesamtwert der übertragenen ETH -- Transaktionsgebühr – an den Validator gezahlte Summe, um die Transaktion zu verarbeiten (Berechnung: Gaspreis \* Gasverbrauch) +- Block - Der Block, in den die Transaktion aufgenommen wurde +- Zeitstempel - Die Zeit, zu der eine Transaktion in einen von einem Validator vorgeschlagenen Block aufgenommen wurde +- Von - Die Adresse des Kontos, das die Transaktion eingereicht hat +- An - Die Adresse des Empfängers oder Smart Contracts, mit dem die Transaktion interagiert +- Übertragene Token - Eine Liste von Token, die als Teil der Transaktion übertragen wurden +- Wert - Der gesamte ETH-Wert, der übertragen wird +- Transaktionsgebühr - Der Betrag, der an den Validator gezahlt wird, um die Transaktion zu verarbeiten (berechnet durch Gaspreis\*verwendetes Gas) **Erweiterte Daten** -- Gaslimit - Die maximale Anzahl von Gaseinheiten, die diese Transaktion verbrauchen kann -- Verbrauchtes Gas - Die tatsächliche Menge an Gaseinheiten, die die Transaktion verbraucht hat -- Gaspreis - Der festgelegte Preis pro Gaseinheit -- Nonce - Die Transaktionsnummer für die Absenderadresse`"from"` (denken Sie daran, dass diese bei 0 beginnt, so dass eine Nonce von `100` die 101ste Transaktion wäre, die von diesem Konto übermittelt wurde) -- Eingabedaten - Alle zusätzlichen Informationen, die für die Transaktion erforderlich sind +- Gaslimit - Die maximale Anzahl an Gaseinheiten, die diese Transaktion verbrauchen kann +- Verwendetes Gas - Die tatsächliche Menge an Gaseinheiten, die die Transaktion verbraucht hat +- Gaspreis - Der pro Gaseinheit festgelegte Preis +- Nonce - Die Transaktionsnummer für die `from`-Adresse (denken Sie daran, dass dies bei 0 beginnt, sodass eine Nonce von `100` tatsächlich die 101. Transaktion wäre, die von diesem Konto eingereicht wurde) +- Eingabedaten - Alle zusätzlichen Informationen, die von der Transaktion benötigt werden ### Konten {#accounts} -Es gibt viele Daten, auf die Sie über ein Konto zugreifen können. Daher wird häufig empfohlen, mehrere Konten zu verwenden, damit Ihr Vermögen und Ihre Assets nicht so leicht nachverfolgt werden können. Außerdem werden weitere Lösungen entwickelt, um Transaktionen und Kontoaktivitäten sicherer und privater zu gestalten. Im Folgenden finden Sie die Daten, die für Konten verfügbar sind: +Es gibt viele Daten, auf die Sie über ein Konto zugreifen können. Aus diesem Grund wird oft empfohlen, mehrere Konten zu verwenden, damit Ihre Vermögenswerte und Werte nicht leicht verfolgt werden können. Es werden auch einige Lösungen entwickelt, um Transaktionen und Kontoaktivitäten privater zu gestalten. Aber hier sind die Daten, die für Konten verfügbar sind: **Benutzerkonten** -- Account-Adresse - Die öffentliche Adresse, an die Sie Geld senden können -- ETH-Guthaben - Der ETH-Betrag, der mit diesem Konto verbunden ist -- Total Eth value - Der Wert der ETH -- Token - Dem Konto zugeordnete Token und ihr Wert -- Transaktionshistorie - Eine Liste aller Transaktionen, bei denen dieses Konto entweder der Absender oder der Empfänger war +- Kontoadresse - Die öffentliche Adresse, an die Sie Gelder senden können +- ETH-Guthaben - Die Menge an ETH, die mit diesem Konto verknüpft ist +- Gesamter ETH-Wert - Der Wert der ETH +- Token - Die mit dem Konto verknüpften Token und ihr Wert +- Transaktionsverlauf - Eine Liste aller Transaktionen, bei denen dieses Konto entweder der Sender oder der Empfänger war -**Intelligente Verträge** +**Smart Contracts** -Smart-Contract-Konten verfügen über die gleichen Daten wie ein Benutzerkonto, doch einige Block-Explorer zeigen zusätzlich auch einige Codeinformationen an. Beispiele: +Smart-Contract-Konten verfügen über alle Daten, die auch ein Benutzerkonto hat, aber einige Blocksuchmaschinen zeigen sogar einige Code-Informationen an. Beispiele hierfür sind: - Vertragsersteller - Die Adresse, die den Vertrag im Mainnet bereitgestellt hat -- Erstellungstransaktion - Die Transaktion, die die Bereitstellung im Mainnet beinhaltete +- Erstellungstransaktion - Die Transaktion, die die Bereitstellung im Mainnet enthielt - Quellcode - Der Solidity- oder Vyper-Code des Smart Contracts -- Vertrags-ABI - Die "Application Binary Interface" - die Aufrufe, die der Vertrag tätigt, und die empfangenen Daten -- Vertragserstellungscode - Der kompilierte Bytecode des Smart Contracts – wird erstellt, wenn Sie einen in Solidity oder Vyper usw. geschriebenen Smart Contract kompilieren -- Vertragsereignisse - Eine Historie der im Smart Contract aufgerufenen Methoden – im Grunde eine Möglichkeit zu sehen, wie der Vertrag verwendet wird und wie oft +- Vertrags-ABI - Das Application Binary Interface des Vertrags – die Aufrufe, die der Vertrag tätigt, und die empfangenen Daten +- Vertragserstellungscode - Der kompilierte Bytecode des Smart Contracts – erstellt, wenn Sie einen in Solidity oder Vyper usw. geschriebenen Smart Contract kompilieren. +- Vertragsereignisse - Ein Verlauf der im Smart Contract aufgerufenen Methoden – im Grunde eine Möglichkeit zu sehen, wie der Vertrag genutzt wird und wie oft ### Token {#tokens} -Token sind eine Art von Vertrag und enthalten ähnliche Daten wie ein Smart Contract. Doch dadurch, dass sie einen Wert haben und gehandelt werden können, weisen sie zusätzliche Datenpunkte auf: +Token sind eine Art von Vertrag, daher haben sie ähnliche Daten wie ein Smart Contract. Da sie jedoch einen Wert haben und gehandelt werden können, weisen sie zusätzliche Datenpunkte auf: - Typ - Ob es sich um einen ERC-20, ERC-721 oder einen anderen Token-Standard handelt - Preis - Wenn es sich um einen ERC-20 handelt, haben sie einen aktuellen Marktwert - Marktkapitalisierung - Wenn es sich um einen ERC-20 handelt, haben sie eine Marktkapitalisierung (berechnet durch Preis\*Gesamtangebot) - Gesamtangebot - Die Anzahl der im Umlauf befindlichen Token - Inhaber - Die Anzahl der Adressen, die den Token halten -- Transfers - Die Anzahl der Übertragungen des Tokens zwischen Konten -- Transaktionshistorie - Eine Historie aller Transaktionen, die den Token betreffen -- Vertragsadresse - Die Adresse des Tokens, die im Mainnet bereitgestellt wurde -- Nachkommastellen - ERC-20-Token sind teilbar und haben Nachkommastellen +- Übertragungen - Die Anzahl der Male, die der Token zwischen Konten übertragen wurde +- Transaktionsverlauf - Ein Verlauf aller Transaktionen, die den Token beinhalten +- Vertragsadresse - Die Adresse des Tokens, der im Mainnet bereitgestellt wurde +- Dezimalstellen - ERC-20-Token sind teilbar und haben Dezimalstellen ### Netzwerk {#network} -Einige Blockdaten geben Aufschluss über den Zustand von Ethereum im Allgemeinen. +Einige Blockdaten befassen sich ganzheitlicher mit der Gesundheit von Ethereum. -- Gesamttransaktionen - Die Anzahl der Transaktionen seit dem Start von Ethereum -- Transaktionen pro Sekunde - Die Anzahl der Transaktionen, die innerhalb einer Sekunde verarbeitet werden können -- ETH-Preis - Die aktuelle Bewertung von 1 ETH -- Gesamtes ETH-Angebot - Anzahl der im Umlauf befindlichen ETH - neue ETH werden bei der Erstellung jedes Blocks in Form von Block-Prämien geschaffen -- Marktkapitalisierung - Berechnung des Preises\*Angebot +- Gesamte Transaktionen - Die Anzahl der Transaktionen seit der Erstellung von Ethereum +- Transaktionen pro Sekunde - Die Anzahl der innerhalb einer Sekunde verarbeitbaren Transaktionen +- ETH-Preis - Die aktuellen Bewertungen von 1 ETH +- Gesamtes ETH-Angebot - Anzahl der im Umlauf befindlichen ETH – denken Sie daran, dass neue ETH mit der Erstellung jedes Blocks in Form von Block-Belohnungen geschaffen werden +- Marktkapitalisierung - Berechnung von Preis\*Angebot -## Daten der Konsensebene {#consensus-layer-data} +## Konsensebene-Daten {#consensus-layer-data} ### Epoche {#epoch} -Aus Sicherheitsgründen werden am Ende jeder Epoche (alle 6,4 Minuten) zufällig ausgewählte Gruppen von Validatoren gebildet. Epochendaten enthalten: +Aus Sicherheitsgründen werden am Ende jeder Epoche (alle 6,4 Minuten) randomisierte Komitees von Validatoren gebildet. Epochendaten umfassen: - Epochennummer -- Abgeschlossener Status - Ob die Epoche abgeschlossen wurde (Ja/Nein) +- Finalisierungsstatus - Ob die Epoche finalisiert wurde (Ja/Nein) - Zeit - Die Zeit, zu der die Epoche endete -- Attestierungen - Die Anzahl der Attestierungen in der Epoche (Stimmen für Blöcke innerhalb von Slots) -- Einzahlungen - Die Anzahl der ETH-Einzahlungen, die in der Epoche enthalten sind (Validatoren müssen ETH einsetzen, um Validatoren zu werden) -- Slashings - Anzahl der Strafen, die an die Proposer von Blöcken oder an die Attestierer vergeben wurden -- Abstimmungsbeteiligung - Die Menge an eingesetzter ETH, die zur Attestierung von Blöcken verwendet wurde -- Validatoren - Anzahl der aktiven Validatoren für die Epoche -- Durchschnittliches Guthaben der Validatoren - Durchschnittliches Guthaben der aktiven Validatoren -- Slots - Anzahl der in der Epoche enthaltenen Slots (Slots beinhalten einen gültigen Block) +- Bestätigungen - Die Anzahl der Bestätigungen in der Epoche (Stimmen für Blöcke innerhalb von Slots) +- Einzahlungen - Die Anzahl der in der Epoche enthaltenen ETH-Einzahlungen (Validatoren müssen ETH als Einsatz hinterlegen, um Validatoren zu werden) +- Slashings - Anzahl der Strafen, die an Vorschlagende von Blöcken oder Bestätigende vergeben wurden +- Wahlbeteiligung - Die Menge an als Einsatz hinterlegten ETH, die zur Bestätigung von Blöcken verwendet wurde +- Validatoren - Anzahl der für die Epoche aktiven Validatoren +- Durchschnittliches Validator-Guthaben - Durchschnittliches Guthaben für aktive Validatoren +- Slots - Anzahl der in der Epoche enthaltenen Slots (Slots enthalten einen gültigen Block) ### Slot {#slot} -Slots sind Möglichkeiten für die Blockerstellung. Folgende Daten sind zu Slots verfügbar: +Slots sind Gelegenheiten zur Blockerstellung. Die für jeden Slot verfügbaren Daten umfassen: - Epoche - Die Epoche, in der der Slot gültig ist - Slot-Nummer -- Status - Der Status des Slots (Vorgeschlagen/Fehlgeschlagen) -- Zeit - Zeitstempel des Slots -- Proposer - Der Validierer, der den Block für den Slot vorgeschlagen hat -- Blockwurzel - Die Hash-Tree-Wurzel des Beacon-Blocks -- Parent Root - Der Hash-Wert des vorhergehenden Blocks -- Statuswurzel - Die Hash-Tree-Wurzel des BeaconState -- Signature -- Randao Reveal -- Graffiti - Ein Block-Proposer kann seinem Block-Vorschlag eine 32 Byte lange Nachricht beifügen +- Status - Der Status des Slots (Vorgeschlagen/Verpasst) +- Zeit - Der Slot-Zeitstempel +- Vorschlagender - Der Validator, der den Block für den Slot vorgeschlagen hat +- Block-Root - Der Hash-Tree-Root des BeaconBlocks +- Parent-Root - Der Hash des Blocks, der davor kam +- State-Root - Der Hash-Tree-Root des BeaconStates +- Signatur +- Randao-Reveal +- Graffiti - Ein Block-Vorschlagender kann eine 32 Byte lange Nachricht in seinen Blockvorschlag aufnehmen - Ausführungsdaten - Block-Hash - - Anzahl der Einzahlungen - - Einzahlungswurzel -- Attestierungen - Anzahl der Attestierungen für den Block in diesem Slot -- Einzahlungen - Anzahl der Einzahlungen in diesem Slot -- Freiwillige Austritte - Anzahl der Validierer, die während des Slots ausgeschieden sind -- Slashings - Anzahl der Strafen, die an die Proposer von Blöcken oder an die Attestierer vergeben wurden -- Abstimmungen - Die Validatoren, die für den Block in diesem Slot gestimmt haben + - Einzahlungsanzahl + - Einzahlungs-Root +- Bestätigungen - Anzahl der Bestätigungen für den Block in diesem Slot +- Einzahlungen - Die Anzahl der Einzahlungen während dieses Slots +- Freiwillige Austritte - Die Anzahl der Validatoren, die während des Slots ausgetreten sind +- Slashings - Anzahl der Strafen, die an Vorschlagende von Blöcken oder Bestätigende vergeben wurden +- Stimmen - Die Validatoren, die für den Block in diesem Slot gestimmt haben ### Blöcke {#blocks-1} -Proof-of-Stake unterteilt die Zeit in Slots und Epochen. Damit gibt es neue Daten: +Proof-of-Stake unterteilt die Zeit in Slots und Epochen. Das bedeutet also neue Daten! -- Proposer - Der Validator, der algorithmisch ausgewählt wurde, um den neuen Block vorzuschlagen +- Vorschlagender - Der Validator, der algorithmisch ausgewählt wurde, um den neuen Block vorzuschlagen - Epoche - Die Epoche, in der der Block vorgeschlagen wurde - Slot - Der Slot, in dem der Block vorgeschlagen wurde -- Attestierungen - Die Anzahl der im Slot enthaltenen Attestierungen - Attestierungen sind wie Stimmen, die anzeigen, dass der Block bereit ist, in die Beacon Chain aufgenommen zu werden +- Bestätigungen - Die Anzahl der im Slot enthaltenen Bestätigungen – Bestätigungen sind wie Stimmen, die anzeigen, dass der Block bereit ist, an die Beacon Chain zu gehen ### Validatoren {#validators} -Validatoren sind dafür verantwortlich, Blöcke vorzuschlagen und sie innerhalb der Slots zu bestätigen. +Validatoren sind dafür verantwortlich, Blöcke vorzuschlagen und sie innerhalb von Slots zu bestätigen. - Validator-Nummer - Eindeutige Nummer, die den Validator repräsentiert -- Aktueller Kontostand - Der Kontostand des Validators einschließlich der Prämien -- Effektives Guthaben - Das Guthaben des Validators, das für Staking verwendet wird -- Einkommen - Die Prämien oder Strafen, die der Validator erhalten hat -- Status - Ob der Validator gerade online und aktiv ist oder nicht -- Attestierungseffektivität - Die durchschnittliche Zeit, die es dauert, bis die Attestierungen des Validators in die Chain aufgenommen werden -- Berechtigung zur Aktivierung - Datum (und Epoche), an dem der Validator für die Validierung verfügbar wurde +- Aktuelles Guthaben - Das Guthaben des Validators einschließlich Belohnungen +- Effektives Guthaben - Das Guthaben des Validators, das für das Staking verwendet wird +- Einkommen - Die vom Validator erhaltenen Belohnungen oder Strafen +- Status - Ob der Validator derzeit online und aktiv ist oder nicht +- Bestätigungseffektivität - Die durchschnittliche Zeit, die benötigt wird, bis die Bestätigungen des Validators in die Chain aufgenommen werden +- Berechtigung zur Aktivierung - Datum (und Epoche), an dem der Validator zur Validierung verfügbar wurde - Aktiv seit - Datum (und Epoche), an dem der Validator aktiv wurde - Vorgeschlagene Blöcke - Der Block, den der Validator vorgeschlagen hat -- Attestierungen - Die Attestierungen, die der Validator vorgelegt hat -- Einzahlungen - Die Absenderadresse, der Transaktionshash, die Blocknummer, der Zeitstempel, der Betrag und der Status der vom Validator getätigten Staking-Einzahlungen +- Bestätigungen - Die Bestätigungen, die der Validator bereitgestellt hat +- Einzahlungen - Die Von-Adresse, der Transaktions-Hash, die Blocknummer, der Zeitstempel, der Betrag und der Status der vom Validator getätigten Staking-Einzahlung -### Beglaubigungen {#attestations} +### Bestätigungen {#attestations} -Attestierungen sind "Ja"-Stimmen für die Aufnahme von Blöcken in die Chain. Ihre Daten beziehen sich auf eine Aufzeichnung der Attestierung und der bestätigenden Validatoren. +Bestätigungen sind „Ja“-Stimmen, um Blöcke in die Chain aufzunehmen. Ihre Daten beziehen sich auf eine Aufzeichnung der Bestätigung und der Validatoren, die bestätigt haben. -- Slot - Der Slot, in dem die Attestierung stattgefunden hat -- Komitee-Index - Der Index des Komitees für den gegebenen Slot -- Aggregationsbits - Stellt die aggregierte Attestierung aller an der Attestierung beteiligten Validatoren dar -- Validatoren - Die Validatoren, die Attestierungen bereitgestellt haben -- Wurzel des Beacon-Blocks - Zeigt auf den Block, für den die Validatoren attestieren -- Quelle - Zeigt auf die letzte geprüfte Epoche -- Target - Zeigt auf die letzte Epochengrenze -- Signature +- Slot - Der Slot, in dem die Bestätigung stattfand +- Komitee-Index - Der Index des Komitees zum gegebenen Slot +- Aggregationsbits - Repräsentiert die aggregierte Bestätigung aller teilnehmenden Validatoren an der Bestätigung +- Validatoren - Die Validatoren, die Bestätigungen bereitgestellt haben +- Beacon-Block-Root - Zeigt auf den Block, den die Validatoren bestätigen +- Quelle - Zeigt auf die letzte gerechtfertigte Epoche +- Ziel - Zeigt auf die letzte Epochengrenze +- Signatur ### Netzwerk {#network-1} -Die Daten der obersten Ebene der Konsensebene umfassen Folgendes: +Die Top-Level-Daten der Konsensebene umfassen Folgendes: - Aktuelle Epoche - Aktueller Slot - Aktive Validatoren - Anzahl der aktiven Validatoren -- Ausstehende Validatoren - Anzahl der Validatoren, die darauf warten, aktiv zu werden -- Staked ETH - Höhe der im Netzwerk gestakten ETH +- Ausstehende Validatoren - Anzahl der Validatoren, die darauf warten, aktiv geschaltet zu werden +- Gestakte ETH - Menge an ETH, die im Netzwerk als Einsatz hinterlegt ist - Durchschnittliches Guthaben - Durchschnittliches ETH-Guthaben der Validatoren -## Block Explorer {#block-explorers} - -- [Etherscan](https://etherscan.io/) - ein Block-Explorer, mit dem Sie Daten für Ethereum Mainnet abrufen können -- [Etherscan Sepolia](https://sepolia.etherscan.io/) - ein Block-Explorer, mit dem Sie Daten für das Sepolia Testnet abrufen können -- [Etherscan Hoodi](https://hoodi.etherscan.io/) - ein Block-Explorer, mit dem Sie Daten für das Hoodi Testnet abrufen können -- [3xpl](https://3xpl.com/ethereum) – ein werbefreier Open-Source-Ethereum-Explorer, der den Download seiner Datensätze erlaubt -- [Beaconcha.in](https://beaconcha.in/) - ein Open-Source-Block-Explorer für Ethereum Mainnet -- [Blockchair](https://blockchair.com/ethereum) – Der privateste Ethereum-Explorer. Auch zum Sortieren und Filtern von (Mempool-) Daten -- [Etherchain](https://www.etherchain.org/) - Ein Block-Explorer für das Ethereum Mainnet -- [Ethplorer](https://ethplorer.io/) - ein Block-Explorer mit Fokus auf Token für das Ethereum Mainnet -- [Rantom](https://rantom.app/) - Ein benutzerfreundlicher Open-Source-DeFi- und NFT-Transaktions-Viewer für detaillierte Einblicke -- [Ethernow](https://www.ethernow.xyz/) – ein Echtzeit-Transaktions-Explorer, der es ermöglicht, die Pre-Chain-Ebene des Ethereum-Mainnets einzusehen - -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Transaktionen](/developers/docs/transactions/) - [Konten](/developers/docs/accounts/) -- [Netzwerke](/developers/docs/networks/) +- [Netzwerke](/developers/docs/networks/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-and-analytics/index.md b/public/content/translations/de/developers/docs/data-and-analytics/index.md index 90348c1a85e..abbb8069778 100644 --- a/public/content/translations/de/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/de/developers/docs/data-and-analytics/index.md @@ -1,55 +1,82 @@ --- title: Daten und Analysen -description: So bekommen Sie Analysen und Daten in der Chain für die Nutzung in Ihren dApps +description: "Wie man Analysen und Daten auf der Blockchain für die Verwendung in Dapps erhält" lang: de --- ## Einführung {#Introduction} -Da die Nutzung des Netzwerks weiter zunimmt, steigt damit die Menge an wertvollen Informationen in den On-Chain-Daten. Da das Datenvolumen rapide zunimmt, kann die Berechnung und Aggregation dieser Informationen zur Erstellung von Berichten oder zur Steuerung einer dApp ein Zeit- und arbeitsintensives Unterfangen werden. +Da die Nutzung des Netzwerks weiter wächst, wird eine zunehmende Menge an wertvollen Informationen in den Daten auf der Blockchain vorhanden sein. Da das Datenvolumen schnell zunimmt, kann die Berechnung und Aggregation dieser Informationen, um darüber zu berichten oder eine Dapp zu betreiben, zu einem zeit- und prozessintensiven Unterfangen werden. -Wenn Sie dabei auf vorhandene Datenanbieter setzen, können Sie die Entwicklung beschleunigen, genauere Ergebnisse liefern und den laufenden Wartungsaufwand reduzieren. Das bietet Ihnen die Möglichkeit, dass Sie ein Team nur mit den wesentlichen Funktionen betrauen, das Sie mit Ihrem Projekt bieten möchten. +Die Nutzung bestehender Datenanbieter kann die Entwicklung beschleunigen, genauere Ergebnisse liefern und den laufenden Wartungsaufwand reduzieren. Dies ermöglicht es einem Team, sich auf die Kernfunktionalität zu konzentrieren, die ihr Projekt bereitstellen möchte. ## Voraussetzungen {#prerequisites} -Sie sollten das Grundkonzept des [Block -Explorers](/developers/docs/data-and-analytics/block-explorers/) kennen, um dessen Einsatz im Kontext der Datenanalyse besser zu verstehen. Zusätzlich sollten Sie sich mit dem Konzept eines [Index](/glossary/#index) vertraut machen, um besser verstehen zu können, welche Vorteile sie für ein Systemdesign bedeuten. +Sie sollten das grundlegende Konzept von [Blocksuchmaschinen](/developers/docs/data-and-analytics/block-explorers/) verstehen, um deren Verwendung im Kontext der Datenanalyse besser nachvollziehen zu können. Machen Sie sich außerdem mit dem Konzept eines [Index](/glossary/#index) vertraut, um die Vorteile zu verstehen, die sie einem Systemdesign hinzufügen. -In puncto architektonische Grundlagen sollten Sie mit den Begriffen [API](https://www.wikipedia.org/wiki/API) und [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) vertraut sein, auch in der Theorie. +In Bezug auf architektonische Grundlagen sollten Sie verstehen, was eine [API](https://www.wikipedia.org/wiki/API) und [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) sind, zumindest in der Theorie. -## Block Explorer {#block-explorers} +## Blocksuchmaschinen {#block-explorers} -Viele [Block-Explorer](/developers/docs/data-and-analytics/block-explorers/) bieten [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer)-[API](https://www.wikipedia.org/wiki/API)-Gateways, die Entwicklern Einblick in Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen On-Chain-Aktivitäten ermöglichen. +Viele [Blocksuchmaschinen](/developers/docs/data-and-analytics/block-explorers/) bieten [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer) [API](https://www.wikipedia.org/wiki/API)-Gateways, die Entwicklern Einblick in Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen Aktivitäten auf der Blockchain geben. -Entwickler können diese Daten dann verarbeiten und umwandeln, um ihren Nutzern einzigartige Einblicke und Interaktionen mit der [Blockchain](/glossary/#blockchain) zu ermöglichen. So liefert [Etherscan](https://etherscan.io) beispielsweise Ausführungs- und Konsensdaten für jeden 12s-Slot. +Entwickler können diese Daten dann verarbeiten und transformieren, um ihren Benutzern einzigartige Einblicke und Interaktionen mit der [Blockchain](/glossary/#blockchain) zu bieten. Zum Beispiel stellen [Etherscan](https://etherscan.io) und [Blockscout](https://eth.blockscout.com) Ausführungs- und Konsensdaten für jeden 12-Sekunden-Slot bereit. ## The Graph {#the-graph} -Das [Graph Network](https://thegraph.com/) ist ein dezentrales Indexierungsprotokoll zur Organisation von Blockchain-Daten. Anstatt für die Aggregation von On-Chain-Daten Datenspeicher, ob zentral oder außerhalb der Chain, zu erstellen und zu verwalten, können Entwickler mit The Graph serverlose Anwendungen erstellen, die vollständig auf einer öffentlichen Infrastruktur laufen. +[The Graph](https://thegraph.com/) ist ein Indexierungsprotokoll, das eine einfache Möglichkeit bietet, Blockchain-Daten über offene APIs, sogenannte Subgraphen, abzufragen. -Mit [GraphQL](https://graphql.org/) können Entwickler jede der kuratierten offenen APIs, die sogenannten Sub-Graphen, abfragen, um die notwendigen Informationen zu erhalten, die sie für ihre dApp benötigen. Durch die Abfrage dieser indizierten Sub-Graphen erhalten Berichte und Anwendungen nicht nur Leistungs- und Skalierbarkeitsvorteile, sondern auch die integrierte Genauigkeit, die durch den Netzwerkkonsens bereitgestellt wird. Sobald dem Netzwerk neue Verbesserungen und/oder Sub-Graphen hinzugefügt werden, können Ihre Projekte schnell iterieren, um von diesen Verbesserungen zu profitieren. +Mit The Graph können Entwickler von Folgendem profitieren: -## Client-Diversität +- Dezentralisierte Indexierung: Ermöglicht die Indexierung von Blockchain-Daten durch mehrere Indexer und eliminiert so jeden Single Point of Failure. +- GraphQL-Abfragen: Bietet eine leistungsstarke GraphQL-Schnittstelle zur Abfrage indexierter Daten, was den Datenabruf extrem einfach macht. +- Anpassbarkeit: Definieren Sie Ihre eigene Logik zur Transformation und Speicherung von Blockchain-Daten und verwenden Sie Subgraphen wieder, die von anderen Entwicklern im The Graph Network veröffentlicht wurden. -Die [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/) ist wichtig für die allgemeine Sicherheit des Ethereum-Netzwerks, da sie die Widerstandsfähigkeit gegen Fehler und Schwachstellen gewährleistet. Es gibt nun mehrere Dashboards zur Client-Vielfalt, darunter [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) und [Ethernodes](https://ethernodes.org/). +Folgen Sie dieser [Schnellstartanleitung](https://thegraph.com/docs/en/quick-start/), um innerhalb von 5 Minuten einen Subgraphen zu erstellen, bereitzustellen und abzufragen. + +## Client-Vielfalt {#client-diversity} + +[Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/) ist wichtig für die allgemeine Gesundheit des Ethereum-Netzwerks, da sie Widerstandsfähigkeit gegen Fehler und Exploits bietet. Es gibt mittlerweile mehrere Dashboards zur Client-Vielfalt, darunter [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) und [Ethernodes](https://ethernodes.org/). ## Dune Analytics {#dune-analytics} -[Dune Analytics](https://dune.com/) verarbeitet Blockchain-Daten in relationalen Datenbanktabellen (DuneSQL) vor, ermöglicht Benutzern die Abfrage von Blockchain-Daten mit SQL und die Erstellung von Dashboards auf der Grundlage der Abfrageergebnisse. Die On-Chain-Daten sind in 4 Rohtabellen organisiert: `Blöcke`, `Transaktionen`, (Event) `Logs` und (Call) `Traces`. Beliebte Verträge und Protokolle liegen entschlüsselt vor und jedes hat seinen eigenen Satz von Event- und Call-Tabellen. Diese Event- und Call-Tabellen werden weiterverarbeitet und in Abstraktionstabellen nach der Art der Protokolle organisiert, z. B. Dex, Lending, Stablecoins usw. +[Dune Analytics](https://dune.com/) verarbeitet Blockchain-Daten in relationale Datenbanktabellen (DuneSQL) vor, ermöglicht es Benutzern, Blockchain-Daten mit SQL abzufragen und Dashboards basierend auf den Abfrageergebnissen zu erstellen. Daten auf der Blockchain sind in 4 Rohtabellen organisiert: `blocks`, `transactions`, (Ereignis-) `logs` und (Aufruf-) `traces`. Beliebte Verträge und Protokolle wurden decodiert und haben jeweils ihre eigenen Ereignis- und Aufruftabellen. Diese Ereignis- und Aufruftabellen werden weiterverarbeitet und nach Art der Protokolle in Abstraktionstabellen organisiert, zum Beispiel Dex, Kreditvergabe (Lending), Stablecoins usw. + +## SQD {#sqd} + +[SQD](https://sqd.dev/) ist eine dezentralisierte, hyperskalierbare Datenplattform, die für die Bereitstellung eines effizienten, erlaubnisfreien Zugriffs auf große Datenmengen optimiert ist. Sie stellt derzeit historische Daten auf der Blockchain bereit, einschließlich Ereignisprotokollen, Transaktionsbelegen, Traces und Statusdifferenzen pro Transaktion. SQD bietet ein leistungsstarkes Toolkit zur Erstellung benutzerdefinierter Datenextraktions- und Verarbeitungspipelines und erreicht eine Indexierungsgeschwindigkeit von bis zu 150.000 Blöcken pro Sekunde. + +Um loszulegen, besuchen Sie die [Dokumentation](https://docs.sqd.dev/) oder sehen Sie sich [EVM-Beispiele](https://github.com/subsquid-labs/squid-evm-examples) an, was Sie mit SQD erstellen können. ## SubQuery Network {#subquery-network} -[SubQuery](https://subquery.network/) ist ein führender Datenindexierer, der Entwicklern schnelle, zuverlässige, dezentrale und maßgeschneiderte APIs für ihre web3-Projekte bietet. SubQuery befähigt Entwickler aus über 165 Ökosystemen (einschließlich Ethereum) mit reichhaltigen indizierten Daten, um intuitive und immersive Erlebnisse für ihre Benutzer zu schaffen. Das SubQuery Network versorgt Ihre unaufhaltsamen Apps mit einem widerstandsfähigen und dezentralen Infrastrukturnetzwerk. Nutzen Sie das Blockchain-Entwickler-Toolkit von SubQuery, um die Web3-Anwendungen der Zukunft zu bauen, ohne dabei Zeit mit dem Aufbau eines benutzerdefinierten Backends für die Datenverarbeitung verbringen zu müssen. +[SubQuery](https://subquery.network/) ist ein führender Daten-Indexer, der Entwicklern schnelle, zuverlässige, dezentralisierte und maßgeschneiderierte APIs für ihre Web3-Projekte bietet. SubQuery stattet Entwickler aus über 165 Ökosystemen (einschließlich Ethereum) mit umfangreichen indexierten Daten aus, um intuitive und immersive Erlebnisse für ihre Benutzer zu schaffen. Das SubQuery Network treibt Ihre unaufhaltsamen Apps mit einem widerstandsfähigen und dezentralisierten Infrastruktur-Netzwerk an. Verwenden Sie das Blockchain-Entwickler-Toolkit von SubQuery, um die Web3-Anwendungen der Zukunft zu erstellen, ohne Zeit für den Aufbau eines benutzerdefinierten Backends für Datenverarbeitungsaktivitäten aufwenden zu müssen. + +Um zu beginnen, besuchen Sie die [Ethereum-Schnellstartanleitung](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html), um innerhalb von Minuten mit der Indexierung von Ethereum-Blockchain-Daten in einer lokalen Docker-Umgebung zu Testzwecken zu beginnen, bevor Sie auf einem [verwalteten Dienst von SubQuery](https://managedservice.subquery.network/) oder im [dezentralisierten Netzwerk von SubQuery](https://app.subquery.network/dashboard) live gehen. + +## Codex {#codex} + +[Codex](https://www.codex.io/) ist eine Echtzeit-Blockchain-Daten-API, die angereicherte Daten für über 70 Millionen Token in mehr als 80 Netzwerken bereitstellt. Entwickler können auf strukturierte Token-Preise, Wallet-Guthaben, Transaktionshistorien und aggregierte Analysen (Volumen, Liquidität, einzigartige Wallets) zugreifen, ohne eine eigene Indexierungsinfrastruktur warten zu müssen. Codex unterstützt die Datenbereitstellung in Sekundenbruchteilen über WebSocket- und Webhook-Integrationen. + +Um loszulegen, besuchen Sie die [Dokumentation](https://docs.codex.io), probieren Sie den [Explorer](https://docs.codex.io/explore) aus oder melden Sie sich im [Dashboard](https://dashboard.codex.io/signup) an. + +## EVM Query Language {#evm-query-language} + +EVM Query Language (EQL) ist eine SQL-ähnliche Sprache, die entwickelt wurde, um EVM-Ketten (Ethereum Virtual Machine) abzufragen. Das ultimative Ziel von EQL ist es, komplexe relationale Abfragen auf erstklassigen Bürgern der EVM-Kette (Blöcke, Konten und Transaktionen) zu unterstützen und gleichzeitig Entwicklern und Forschern eine ergonomische Syntax für den täglichen Gebrauch zu bieten. Mit EQL können Entwickler Blockchain-Daten mit einer vertrauten SQL-ähnlichen Syntax abrufen und die Notwendigkeit von komplexem Boilerplate-Code eliminieren. EQL unterstützt standardmäßige Blockchain-Datenanfragen (z. B. das Abrufen der Nonce und des Guthabens eines Kontos auf Ethereum oder das Abrufen der aktuellen Blockgröße und des Zeitstempels) und fügt kontinuierlich Unterstützung für komplexere Anfragen und Funktionsumfänge hinzu. -Um loszulegen, sehen Sie sich die [Ethereum-Schnellstartanleitung](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) an, um in wenigen Minuten Daten der Ethereum-Blockchain in einer lokalen Docker-Umgebung zu indizieren und vor der Live-Schaltung auf dem [verwalteten Dienst von SubQuery](https://managedservice.subquery.network/) oder dem [dezentralen Netzwerk von SubQuery](https://app.subquery.network/dashboard) zu testen. +## Weiterführende Literatur {#further-reading} -## Etherenow – Mempool-Datenprogramm {#ethernow} -[Blocknative](https://www.blocknative.com/) bietet einen offenen Zugang zu seinem historischen [Mempool-Datenarchiv](https://www.ethernow.xyz/mempool-data-archive) für Ethereum. Dies ermöglicht Forschern und Projekten im Gemeinwohl, die Pre-Chain-Ebene des Ethereum-Mainnets zu erkunden. Der Datensatz wird aktiv gepflegt und stellt das umfassendste historische Protokoll von Mempool-Transaktionsereignissen innerhalb des Ethereum-Ökosystems dar. Erfahren Sie mehr bei [Ethernow](https://www.ethernow.xyz/). +- [Exploring Crypto Data I: Data Flow Architectures](https://web.archive.org/web/20250125012042/https://research.2077.xyz/exploring-crypto-data-1-data-flow-architectures) +- [Graph Network Übersicht](https://thegraph.com/docs/en/about/) +- [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) +- [API-Codebeispiele auf EtherScan](https://etherscan.io/apis#contracts) +- [API-Dokumentation auf Blockscout](https://docs.blockscout.com/devs/apis) +- [Beaconcha.in Beacon Chain-Suchmaschine](https://beaconcha.in) +- [Dune-Grundlagen](https://docs.dune.com/#dune-basics) +- [SubQuery Ethereum-Schnellstartanleitung](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [SQD Network Übersicht](https://docs.sqd.dev/) +- [EVM Query Language](https://eql.sh/blog/alpha-release-notes) -## Weiterführende Informationen {#further-reading} +## Tutorials: Daten & Analysen / SQL auf Ethereum {#tutorials} -- [Graph Network-Übersicht](https://thegraph.com/docs/en/about/) -- [Graph-Abfrageplatz](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) -- [API-Code-Beispiele auf EtherScan](https://etherscan.io/apis#contracts) -- [Beaconcha.in Beacon Chain Explorer](https://beaconcha.in) -- [Dune Basics](https://docs.dune.com/#dune-basics) -- [Ethereum-Schnellstartanleitung – SubQuery](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [Lernen Sie grundlegende Ethereum-Themen mit SQL](/developers/tutorials/learn-foundational-ethereum-topics-with-sql/) _– Fragen Sie Ethereum-Daten auf der Blockchain mit SQL ab, um Transaktionen, Blöcke und Gas-Grundlagen zu verstehen._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md b/public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md new file mode 100644 index 00000000000..d07acc3f453 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md @@ -0,0 +1,118 @@ +--- +title: Strategien zur Datenspeicherung auf der Blockchain +description: "Es gibt verschiedene Möglichkeiten, Daten mithilfe der Blockchain zu speichern. Dieser Artikel vergleicht die verschiedenen Strategien, ihre Kosten und Kompromisse sowie die Anforderungen für eine sichere Nutzung." +lang: de +--- + +Es gibt mehrere Möglichkeiten, Informationen entweder direkt auf der Blockchain oder auf eine durch die Blockchain gesicherte Weise zu speichern: + +- EIP-4844-Blobs +- Calldata +- Off-Chain mit L1-Mechanismen +- Vertrags-„Code“ +- Events +- EVM-Speicher + +Die Wahl der zu verwendenden Methode hängt von mehreren Kriterien ab: + +- Die Quelle der Informationen. Informationen in Calldata können nicht direkt von der Blockchain selbst stammen. +- Das Ziel der Informationen. Calldata ist nur in der Transaktion verfügbar, die sie enthält. Events sind auf der Blockchain überhaupt nicht zugänglich. +- Wie viel Aufwand ist akzeptabel? Computer, die einen vollständigen Blockchain-Knoten ausführen, können mehr Verarbeitungsleistung erbringen als ein Light Client in einer Anwendung, die in einem Browser läuft. +- Ist es notwendig, einen einfachen Zugriff auf die Informationen von jedem Blockchain-Knoten aus zu ermöglichen? +- Die Sicherheitsanforderungen. + +## Die Sicherheitsanforderungen {#security-requirements} + +Im Allgemeinen besteht die Informationssicherheit aus drei Attributen: + +- _Vertraulichkeit_: Unbefugte Entitäten dürfen die Informationen nicht lesen. Dies ist in vielen Fällen wichtig, aber nicht hier. _Es gibt keine Geheimnisse auf der Blockchain_. Blockchains funktionieren, weil jeder die Zustandsübergänge verifizieren kann, daher ist es unmöglich, sie zur direkten Speicherung von Geheimnissen zu verwenden. Es gibt Möglichkeiten, vertrauliche Informationen auf der Blockchain zu speichern, aber sie alle verlassen sich auf eine Off-Chain-Komponente, um zumindest einen Schlüssel zu speichern. + +- _Integrität_: Die Informationen sind korrekt, sie können nicht von unbefugten Entitäten oder auf unbefugte Weise geändert werden (zum Beispiel die Übertragung von [ERC-20-Token](https://eips.ethereum.org/EIPS/eip-20#events) ohne ein `Transfer`-Event). Auf der Blockchain verifiziert jeder Blockchain-Knoten jede Zustandsänderung, was die Integrität sicherstellt. + +- _Verfügbarkeit_: Die Informationen stehen jeder autorisierten Entität zur Verfügung. Auf der Blockchain wird dies normalerweise dadurch erreicht, dass die Informationen auf jedem [vollständigen Blockchain-Knoten](https://ethereum.org/developers/docs/nodes-and-clients/#full-node) verfügbar sind. + +Die verschiedenen hier vorgestellten Lösungen weisen alle eine hervorragende Integrität auf, da Hashes auf L1 gepostet werden. Sie haben jedoch unterschiedliche Verfügbarkeitsgarantien. + +## Voraussetzungen {#prerequisites} + +Sie sollten ein gutes Verständnis der [Blockchain-Grundlagen](/developers/docs/intro-to-ethereum/) haben. Diese Seite setzt außerdem voraus, dass der Leser mit [Blöcken](/developers/docs/blocks/), [Transaktionen](/developers/docs/transactions/) und anderen relevanten Themen vertraut ist. + +## EIP-4844-Blobs {#eip-4844-blobs} + +Beginnend mit [dem Dencun-Hardfork](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/beacon-chain.md) beinhaltet die Ethereum-Blockchain [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), was Ethereum um Daten-Blobs mit einer begrenzten Lebensdauer (anfänglich etwa [18 Tage](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration)) erweitert. Diese Blobs werden separat vom [Ausführungsgas](/developers/docs/gas) bepreist, obwohl ein ähnlicher Mechanismus verwendet wird. Sie sind eine günstige Möglichkeit, temporäre Daten zu posten. + +Der Hauptanwendungsfall für EIP-4844-Blobs besteht darin, dass Rollups ihre Transaktionen veröffentlichen. [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups) müssen die Transaktionen auf ihren Blockchains veröffentlichen. Diese Transaktionen müssen während der [Herausforderungsfrist (Challenge Period)](https://docs.optimism.io/connect/resources/glossary#challenge-period) für jeden verfügbar sein, um es [Validatoren](https://docs.optimism.io/connect/resources/glossary#validator) zu ermöglichen, den Fehler zu beheben, falls der [Sequencer](https://docs.optimism.io/connect/resources/glossary#sequencer) des Rollups eine falsche State Root postet. + +Sobald jedoch die Herausforderungsfrist abgelaufen ist und die State Root finalisiert wurde, besteht der verbleibende Zweck für die Kenntnis dieser Transaktionen darin, den aktuellen Zustand der Chain zu replizieren. Dieser Zustand ist auch von Blockchain-Knoten der Chain verfügbar, wobei viel weniger Verarbeitungsaufwand erforderlich ist. Transaktionsinformationen sollten also weiterhin an einigen Orten aufbewahrt werden, wie z. B. in [Blocksuchmaschinen](/developers/docs/data-and-analytics/block-explorers), aber es besteht keine Notwendigkeit, für das Maß an Zensurresistenz zu bezahlen, das Ethereum bietet. + +[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/#data-availability) posten ebenfalls ihre Transaktionsdaten, um es anderen Blockchain-Knoten zu ermöglichen, den bestehenden Zustand zu replizieren und Validitätsnachweise zu verifizieren, aber auch das ist eine kurzfristige Anforderung. + +Zum Zeitpunkt des Schreibens kostet das Posten auf EIP-4844 ein Wei (10-18 ETH) pro Byte, was im Vergleich zu [den 21.000 Ausführungsgas, die jede Transaktion, einschließlich einer, die Blobs postet, kostet](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index), vernachlässigbar ist. Sie können den aktuellen EIP-4844-Preis auf [blobscan.com](https://blobscan.com/blocks) einsehen. + +Hier sind die Adressen, um die von einigen bekannten Rollups geposteten Blobs zu sehen. + +| Rollup | Mailbox-Adresse | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://blobscan.com/address/0xFF00000000000000000000000000000000000010) | +| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://blobscan.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | +| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://blobscan.com/address/0xFF00000000000000000000000000000000008453) | + +## Calldata {#calldata} + +Calldata bezieht sich auf die Bytes, die als Teil der Transaktion gesendet werden. Sie werden als Teil der permanenten Aufzeichnung der Blockchain in dem Block gespeichert, der diese Transaktion enthält. + +Dies ist die günstigste Methode, um Daten dauerhaft in der Blockchain abzulegen. Die Kosten pro Byte betragen entweder 4 Ausführungsgas (wenn das Byte null ist) oder 16 Gas (jeder andere Wert). Wenn die Daten komprimiert sind, was gängige Praxis ist, dann ist jeder Bytewert gleich wahrscheinlich, sodass die durchschnittlichen Kosten bei etwa 15,95 Gas pro Byte liegen. + +Zum Zeitpunkt des Schreibens liegen die Preise bei 12 Gwei/Gas und 2300 $/ETH, was bedeutet, dass die Kosten bei etwa 45 Cent pro Kilobyte liegen. Da dies vor EIP-4844 die günstigste Methode war, ist dies die Methode, die Rollups verwendeten, um Transaktionsinformationen zu speichern, die für [Fehlerherausforderungen (Fault Challenges)](https://docs.optimism.io/stack/protocol/overview#fault-proofs) verfügbar sein müssen, aber nicht direkt auf der Blockchain zugänglich sein müssen. + +Hier sind die Adressen, um die von einigen bekannten Rollups geposteten Transaktionen zu sehen. + +| Rollup | Mailbox-Adresse | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000000010) | +| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://eth.blockscout.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | +| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000008453) | + +## Off-Chain mit L1-Mechanismen {#offchain-with-l1-mechs} + +Abhängig von Ihren Sicherheitskompromissen kann es akzeptabel sein, die Informationen an einem anderen Ort abzulegen und einen Mechanismus zu verwenden, der sicherstellt, dass die Daten bei Bedarf verfügbar sind. Damit dies funktioniert, gibt es zwei Anforderungen: + +1. Posten Sie einen [Hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) der Daten auf der Blockchain, genannt _Input Commitment_. Dies kann ein einzelnes 32-Byte-Wort sein, ist also nicht teuer. Solange das Input Commitment verfügbar ist, ist die Integrität gewährleistet, da es nicht machbar ist, andere Daten zu finden, die denselben Hash-Wert ergeben würden. Wenn also falsche Daten bereitgestellt werden, kann dies erkannt werden. + +2. Verfügen Sie über einen Mechanismus, der die Verfügbarkeit sicherstellt. Zum Beispiel kann in [Redstone](https://redstone.xyz/docs/what-is-redstone) jeder Blockchain-Knoten eine Verfügbarkeitsherausforderung einreichen. Wenn der Sequencer nicht bis zur Frist auf der Blockchain antwortet, wird das Input Commitment verworfen, sodass die Informationen als nie gepostet gelten. + +Dies ist für ein Optimistic Rollup akzeptabel, da wir uns bereits darauf verlassen, mindestens einen ehrlichen Verifizierer für die State Root zu haben. Ein solcher ehrlicher Verifizierer wird auch sicherstellen, dass er über die Daten zur Verarbeitung von Blöcken verfügt, und eine Verfügbarkeitsherausforderung ausgeben, wenn die Informationen Off-Chain nicht verfügbar sind. Diese Art von Optimistic Rollup wird [Plasma](/developers/docs/scaling/plasma/) genannt. + +## Vertrags-Code {#contract-code} + +Informationen, die nur einmal geschrieben werden müssen, nie überschrieben werden und auf der Blockchain verfügbar sein müssen, können als Vertrags-Code gespeichert werden. Das bedeutet, dass wir einen „Smart Contract“ mit den Daten erstellen und dann [`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai) verwenden, um die Informationen zu lesen. Der Vorteil ist, dass das Kopieren von Code relativ günstig ist. + +Abgesehen von den Kosten für die Speichererweiterung kostet `EXTCODECOPY` 2600 Gas für den ersten Zugriff auf einen Vertrag (wenn er „kalt“ ist) und 100 Gas für nachfolgende Kopien aus demselben Vertrag plus 3 Gas pro 32-Byte-Wort. Verglichen mit Calldata, die 15,95 pro Byte kosten, ist dies ab etwa 200 Bytes günstiger. Basierend auf [der Formel für Speichererweiterungskosten](https://www.evm.codes/about#memoryexpansion) sind die Kosten für die Speichererweiterung geringer als die Kosten für das Hinzufügen von Calldata, solange Sie nicht mehr als 4 MB Speicher benötigen. + +Natürlich sind dies nur die Kosten, um die Daten zu _lesen_. Die Erstellung des Vertrags kostet etwa 32.000 Gas + 200 Gas/Byte. Diese Methode ist nur dann wirtschaftlich, wenn dieselben Informationen viele Male in verschiedenen Transaktionen gelesen werden müssen. + +Vertrags-Code kann unsinnig sein, solange er nicht mit `0xEF` beginnt. Verträge, die mit `0xEF` beginnen, werden als [Ethereum Object Format](https://notes.ethereum.org/@ipsilon/evm-object-format-overview) interpretiert, welches viel strengere Anforderungen hat. + +## Events {#events} + +[Events](https://docs.alchemy.com/docs/solidity-events) werden von Smart Contracts ausgegeben und von Off-Chain-Software gelesen. +Ihr Vorteil ist, dass Off-Chain-Code auf Events lauschen kann. Die Kosten sind [Gas](https://www.evm.codes/#a0?fork=cancun), 375 plus 8 Gas pro Byte an Daten. Bei 12 Gwei/Gas und 2300 $/ETH entspricht dies einem Cent plus 22 Cent pro Kilobyte. + +## Speicher {#storage} + +Smart Contracts haben Zugriff auf [persistenten Speicher](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory). Dieser ist jedoch sehr teuer. Das Schreiben eines 32-Byte-Wortes in einen zuvor leeren Speicherplatz kann [22.100 Gas kosten](https://www.evm.codes/#55?fork=cancun). Bei 12 Gwei/Gas und 2300 $/ETH sind das etwa 61 Cent pro Schreibvorgang oder 19,5 $ pro Kilobyte. + +Dies ist die teuerste Form der Speicherung in Ethereum. + +## Zusammenfassung {#summary} + +Diese Tabelle fasst die verschiedenen Optionen sowie ihre Vor- und Nachteile zusammen. + +| Speichertyp | Datenquelle | Verfügbarkeitsgarantie | Verfügbarkeit auf der Blockchain | Zusätzliche Einschränkungen | +| --------------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------- | +| EIP-4844-Blobs | Off-Chain | Ethereum-Garantie für [\~18 Tage](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration) | Nur Hash ist verfügbar | | +| Calldata | Off-Chain | Ethereum-Garantie für immer (Teil der Blockchain) | Nur verfügbar, wenn in einen Vertrag geschrieben, und bei dieser Transaktion | | +| Off-Chain mit L1-Mechanismen| Off-Chain | Garantie „eines ehrlichen Verifizierers“ während der Herausforderungsfrist | Nur Hash | Garantiert durch den Herausforderungsmechanismus, nur während der Herausforderungsfrist | +| Vertrags-Code | Auf der Blockchain oder Off-Chain | Ethereum-Garantie für immer (Teil der Blockchain) | Ja | Geschrieben an eine „zufällige“ Adresse, darf nicht mit `0xEF` beginnen | +| Events | Auf der Blockchain | Ethereum-Garantie für immer (Teil der Blockchain) | Nein | | +| Speicher | Auf der Blockchain | Ethereum-Garantie für immer (Teil der Blockchain und des aktuellen Zustands, bis überschrieben) | Ja | | \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-availability/index.md b/public/content/translations/de/developers/docs/data-availability/index.md new file mode 100644 index 00000000000..91034b55757 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-availability/index.md @@ -0,0 +1,84 @@ +--- +title: "Datenverfügbarkeit" +description: "Ein Überblick über Probleme und Lösungen im Zusammenhang mit der Datenverfügbarkeit in Ethereum" +lang: de +--- + +„Nicht vertrauen, sondern überprüfen“ (Don't trust, verify) ist eine gängige Maxime bei Ethereum. Die Idee dahinter ist, dass Ihr Blockchain-Knoten unabhängig überprüfen kann, ob die empfangenen Informationen korrekt sind, indem er alle Transaktionen in den Blöcken ausführt, die er von Peers erhält. So wird sichergestellt, dass die vorgeschlagenen Änderungen exakt mit denen übereinstimmen, die der Blockchain-Knoten unabhängig berechnet hat. Das bedeutet, dass Blockchain-Knoten nicht darauf vertrauen müssen, dass die Sender des Blocks ehrlich sind. Dies ist jedoch nicht möglich, wenn Daten fehlen. + +**Datenverfügbarkeit** bezieht sich auf das Vertrauen, das ein Benutzer haben kann, dass die zur Überprüfung eines Blocks erforderlichen Daten wirklich für alle Netzwerkteilnehmer verfügbar sind. Für vollständige Blockchain-Knoten (Full Nodes) auf Ebene 1 von [Ethereum](/) ist dies relativ einfach; der vollständige Blockchain-Knoten lädt eine Kopie aller Daten in jedem Block herunter – die Daten _müssen_ verfügbar sein, damit das Herunterladen möglich ist. Ein Block mit fehlenden Daten würde verworfen und nicht zur Blockchain hinzugefügt werden. Dies ist die „Datenverfügbarkeit auf der Blockchain“ und ein Merkmal monolithischer Blockchains. Vollständige Blockchain-Knoten können nicht dazu verleitet werden, ungültige Transaktionen zu akzeptieren, da sie jede Transaktion selbst herunterladen und ausführen. Für modulare Blockchains, Ebene-2-Rollups und Light Clients ist die Landschaft der Datenverfügbarkeit jedoch komplexer und erfordert ausgefeiltere Überprüfungsverfahren. + +## Voraussetzungen {#prerequisites} + +Sie sollten ein gutes Verständnis der [Blockchain-Grundlagen](/developers/docs/intro-to-ethereum/) haben, insbesondere der [Konsensmechanismen](/developers/docs/consensus-mechanisms/). Diese Seite setzt außerdem voraus, dass der Leser mit [Blöcken](/developers/docs/blocks/), [Transaktionen](/developers/docs/transactions/), [Blockchain-Knoten](/developers/docs/nodes-and-clients/), [Skalierungslösungen](/developers/docs/scaling/) und anderen relevanten Themen vertraut ist. + +## Das Problem der Datenverfügbarkeit {#the-data-availability-problem} + +Das Problem der Datenverfügbarkeit besteht in der Notwendigkeit, dem gesamten Netzwerk zu beweisen, dass die zusammengefasste Form einiger Transaktionsdaten, die der Blockchain hinzugefügt werden, wirklich eine Menge gültiger Transaktionen darstellt, ohne jedoch zu verlangen, dass alle Blockchain-Knoten alle Daten herunterladen. Die vollständigen Transaktionsdaten sind für die unabhängige Überprüfung von Blöcken erforderlich, aber die Anforderung, dass alle Blockchain-Knoten alle Transaktionsdaten herunterladen, ist ein Hindernis für die Skalierung. Lösungen für das Problem der Datenverfügbarkeit zielen darauf ab, ausreichende Zusicherungen zu bieten, dass die vollständigen Transaktionsdaten den Netzwerkteilnehmern, die die Daten nicht selbst herunterladen und speichern, zur Überprüfung zur Verfügung gestellt wurden. + +[Light-Knoten](/developers/docs/nodes-and-clients/light-clients) und [Ebene-2-Rollups](/developers/docs/scaling) sind wichtige Beispiele für Netzwerkteilnehmer, die starke Zusicherungen der Datenverfügbarkeit benötigen, aber Transaktionsdaten nicht selbst herunterladen und verarbeiten können. Die Vermeidung des Herunterladens von Transaktionsdaten macht Light-Knoten erst „light“ (leicht) und ermöglicht es Rollups, effektive Skalierungslösungen zu sein. + +Datenverfügbarkeit ist auch ein kritisches Anliegen für zukünftige [„zustandslose“ (stateless)](/roadmap/statelessness) Ethereum-Anwendungen, die keine Statusdaten herunterladen und speichern müssen, um Blöcke zu überprüfen. Die zustandslosen Anwendungen müssen dennoch sicher sein, dass die Daten _irgendwo_ verfügbar sind und korrekt verarbeitet wurden. + +## Lösungen für die Datenverfügbarkeit {#data-availability-solutions} + +### Data Availability Sampling (DAS) {#data-availability-sampling} + +Data Availability Sampling (DAS) ist eine Möglichkeit für das Netzwerk, zu überprüfen, ob Daten verfügbar sind, ohne einen einzelnen Blockchain-Knoten zu sehr zu belasten. Jeder Blockchain-Knoten (einschließlich Nicht-Staking-Knoten) lädt eine kleine, zufällig ausgewählte Teilmenge der Gesamtdaten herunter. Das erfolgreiche Herunterladen der Stichproben bestätigt mit hoher Zuversicht, dass alle Daten verfügbar sind. Dies beruht auf der Daten-Erasure-Coding (Löschcodierung), die einen bestimmten Datensatz um redundante Informationen erweitert (dies geschieht, indem eine als _Polynom_ bekannte Funktion über die Daten gelegt und dieses Polynom an zusätzlichen Punkten ausgewertet wird). Dadurch können die Originaldaten bei Bedarf aus den redundanten Daten wiederhergestellt werden. Eine Konsequenz dieser Datenerstellung ist, dass, wenn _irgendwelche_ der Originaldaten nicht verfügbar sind, die _Hälfte_ der erweiterten Daten fehlt! Die Menge der von jedem Blockchain-Knoten heruntergeladenen Datenstichproben kann so eingestellt werden, dass es _äußerst_ wahrscheinlich ist, dass mindestens eines der von jeder Anwendung abgetasteten Datenfragmente fehlt, _wenn_ weniger als die Hälfte der Daten wirklich verfügbar ist. + +DAS wird verwendet, um sicherzustellen, dass Rollup-Betreiber ihre Transaktionsdaten verfügbar machen, nachdem [Full Danksharding](/roadmap/danksharding/#what-is-danksharding) implementiert wurde. Ethereum-Blockchain-Knoten werden die in Blobs bereitgestellten Transaktionsdaten mithilfe des oben erläuterten Redundanzschemas zufällig abtasten, um sicherzustellen, dass alle Daten vorhanden sind. Dieselbe Technik könnte auch eingesetzt werden, um sicherzustellen, dass Blockproduzenten all ihre Daten zur Sicherung von Light Clients zur Verfügung stellen. In ähnlicher Weise müsste unter der [Trennung von Block-Vorschlagenden und Block-Erstellern (Proposer-Builder Separation)](/roadmap/pbs) nur der Block-Ersteller einen gesamten Block verarbeiten – andere Validatoren würden dies mithilfe von Data Availability Sampling überprüfen. + +### Komitees für Datenverfügbarkeit (Data Availability Committees) {#data-availability-committees} + +Data Availability Committees (DACs) sind vertrauenswürdige Parteien, die Datenverfügbarkeit bereitstellen oder bestätigen. DACs können anstelle von [oder in Kombination mit](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS) DAS verwendet werden. Die Sicherheitsgarantien, die mit Komitees einhergehen, hängen von der spezifischen Einrichtung ab. Ethereum verwendet beispielsweise zufällig ausgewählte Teilmengen von Validatoren, um die Datenverfügbarkeit für Light-Knoten zu bestätigen. + +DACs werden auch von einigen Validiums verwendet. Das DAC ist eine vertrauenswürdige Gruppe von Blockchain-Knoten, die Kopien von Daten offline speichert. Das DAC ist verpflichtet, die Daten im Falle eines Streits zur Verfügung zu stellen. Mitglieder des DAC veröffentlichen auch Bestätigungen auf der Blockchain, um zu beweisen, dass die besagten Daten tatsächlich verfügbar sind. Einige Validiums ersetzen DACs durch ein Proof-of-Stake (PoS)-Validatorsystem. Hier kann jeder ein Validator werden und Daten Off-Chain speichern. Sie müssen jedoch eine „Kaution“ (Bond) hinterlegen, die in einem Smart Contract deponiert wird. Im Falle von böswilligem Verhalten, wie z. B. dem Zurückhalten von Daten durch den Validator, kann die Kaution einem Slashing unterzogen werden. Proof-of-Stake-Komitees für Datenverfügbarkeit sind wesentlich sicherer als reguläre DACs, da sie ehrliches Verhalten direkt anreizen. + +## Datenverfügbarkeit und Light-Knoten {#data-availability-and-light-nodes} + +[Light-Knoten](/developers/docs/nodes-and-clients/light-clients) müssen die Korrektheit der empfangenen Block-Header validieren, ohne die Blockdaten herunterzuladen. Der Preis für diese Leichtigkeit ist die Unfähigkeit, die Block-Header unabhängig zu überprüfen, indem Transaktionen lokal so erneut ausgeführt werden, wie es vollständige Blockchain-Knoten tun. + +Ethereum-Light-Knoten vertrauen zufälligen Gruppen von 512 Validatoren, die einem _Sync-Komitee_ zugewiesen wurden. Das Sync-Komitee fungiert als DAC, das Light Clients mithilfe einer kryptografischen Signatur signalisiert, dass die Daten im Header korrekt sind. Jeden Tag wird das Sync-Komitee aktualisiert. Jeder Block-Header warnt Light-Knoten davor, welche Validatoren voraussichtlich den _nächsten_ Block abzeichnen werden, sodass sie nicht dazu verleitet werden können, einer böswilligen Gruppe zu vertrauen, die vorgibt, das echte Sync-Komitee zu sein. + +Was passiert jedoch, wenn es einem Angreifer irgendwie _doch_ gelingt, einen bösartigen Block-Header an Light Clients weiterzugeben und sie davon zu überzeugen, dass er von einem ehrlichen Sync-Komitee abgezeichnet wurde? In diesem Fall könnte der Angreifer ungültige Transaktionen einschließen und der Light Client würde sie blind akzeptieren, da er nicht alle im Block-Header zusammengefassten Statusänderungen unabhängig überprüft. Um sich davor zu schützen, könnte der Light Client Betrugsnachweise verwenden. + +Diese Betrugsnachweise funktionieren so, dass ein vollständiger Blockchain-Knoten, der sieht, wie ein ungültiger Statusübergang im Netzwerk verbreitet wird, schnell ein kleines Datenstück generieren könnte, das zeigt, dass ein vorgeschlagener Statusübergang unmöglich aus einer bestimmten Menge von Transaktionen resultieren kann, und diese Daten an Peers senden könnte. Light-Knoten könnten diese Betrugsnachweise aufgreifen und sie verwenden, um schlechte Block-Header zu verwerfen, wodurch sichergestellt wird, dass sie auf derselben ehrlichen Chain bleiben wie die vollständigen Blockchain-Knoten. + +Dies setzt voraus, dass vollständige Blockchain-Knoten Zugriff auf die vollständigen Transaktionsdaten haben. Ein Angreifer, der einen schlechten Block-Header sendet und es zudem versäumt, die Transaktionsdaten verfügbar zu machen, könnte verhindern, dass vollständige Blockchain-Knoten Betrugsnachweise generieren. Die vollständigen Blockchain-Knoten könnten zwar eine Warnung vor einem schlechten Block signalisieren, aber sie könnten ihre Warnung nicht mit einem Beweis untermauern, da die Daten nicht zur Verfügung gestellt wurden, um den Beweis daraus zu generieren! + +Die Lösung für dieses Problem der Datenverfügbarkeit ist DAS. Light-Knoten laden sehr kleine zufällige Blöcke der vollständigen Statusdaten herunter und verwenden die Stichproben, um zu überprüfen, ob der vollständige Datensatz verfügbar ist. Die tatsächliche Wahrscheinlichkeit, nach dem Herunterladen von N zufälligen Blöcken fälschlicherweise von einer vollständigen Datenverfügbarkeit auszugehen, kann berechnet werden ([bei 100 Blöcken liegt die Wahrscheinlichkeit bei 10^-30](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html), d. h. unglaublich unwahrscheinlich). + +Selbst in diesem Szenario könnten Angriffe, die nur wenige Bytes zurückhalten, von Anwendungen, die zufällige Datenanfragen stellen, unbemerkt bleiben. Erasure Coding behebt dies, indem kleine fehlende Datenstücke rekonstruiert werden, die zur Überprüfung vorgeschlagener Statusänderungen verwendet werden können. Ein Betrugsnachweis könnte dann unter Verwendung der rekonstruierten Daten erstellt werden, was verhindert, dass Light-Knoten schlechte Header akzeptieren. + +**Hinweis:** DAS und Betrugsnachweise wurden für Proof-of-Stake-Ethereum-Light-Clients noch nicht implementiert, stehen aber auf der Roadmap und werden höchstwahrscheinlich die Form von ZK-SNARK-basierten Nachweisen annehmen. Die heutigen Light Clients verlassen sich auf eine Form von DAC: Sie überprüfen die Identitäten des Sync-Komitees und vertrauen dann den signierten Block-Headern, die sie erhalten. + +## Datenverfügbarkeit und Ebene-2-Rollups {#data-availability-and-layer-2-rollups} + +[Ebene-2-Skalierungslösungen](/layer-2/), wie z. B. [Rollups](/glossary/#rollups), senken die Transaktionskosten und erhöhen den Durchsatz von Ethereum, indem sie Transaktionen Off-Chain verarbeiten. Rollup-Transaktionen werden komprimiert und in Stapeln (Batches) auf Ethereum gepostet. Stapel repräsentieren Tausende einzelner Off-Chain-Transaktionen in einer einzigen Transaktion auf Ethereum. Dies reduziert die Überlastung auf der Basisebene und senkt die Gebühren für die Benutzer. + +Es ist jedoch nur möglich, den auf Ethereum geposteten „Zusammenfassungs“-Transaktionen zu vertrauen, wenn die vorgeschlagene Statusänderung unabhängig überprüft und als Ergebnis der Anwendung aller einzelnen Off-Chain-Transaktionen bestätigt werden kann. Wenn Rollup-Betreiber die Transaktionsdaten für diese Überprüfung nicht zur Verfügung stellen, könnten sie falsche Daten an Ethereum senden. + +[Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/) posten komprimierte Transaktionsdaten auf Ethereum und warten eine gewisse Zeit (typischerweise 7 Tage), damit unabhängige Prüfer die Daten kontrollieren können. Wenn jemand ein Problem feststellt, kann er einen Betrugsnachweis generieren und ihn verwenden, um das Rollup anzufechten. Dies würde dazu führen, dass die Chain zurückgesetzt und der ungültige Block weggelassen wird. Dies ist nur möglich, wenn Daten verfügbar sind. Derzeit gibt es zwei Möglichkeiten, wie Optimistic Rollups Transaktionsdaten auf L1 posten. Einige Rollups machen Daten dauerhaft als `CALLDATA` verfügbar, das dauerhaft auf der Blockchain verbleibt. Mit der Implementierung von EIP-4844 posten einige Rollups ihre Transaktionsdaten stattdessen in günstigeren Blob-Speicher. Dies ist kein permanenter Speicher. Unabhängige Prüfer müssen die Blobs abfragen und ihre Anfechtungen innerhalb von ca. 18 Tagen vorbringen, bevor die Daten von der Ethereum-Ebene 1 gelöscht werden. Die Datenverfügbarkeit wird vom Ethereum-Protokoll nur für dieses kurze, feste Zeitfenster garantiert. Danach liegt es in der Verantwortung anderer Entitäten im Ethereum-Ökosystem. Jeder Blockchain-Knoten kann die Datenverfügbarkeit mithilfe von DAS überprüfen, d. h. durch Herunterladen kleiner, zufälliger Stichproben der Blob-Daten. + +[Zero-Knowledge Rollups (ZK-Rollups)](/developers/docs/scaling/zk-rollups) müssen keine Transaktionsdaten posten, da [Zero-Knowledge-Validitätsnachweise](/glossary/#zk-proof) die Korrektheit von Statusübergängen garantieren. Die Datenverfügbarkeit ist jedoch immer noch ein Problem, da wir die Funktionalität des ZK-Rollups ohne Zugriff auf seine Statusdaten nicht garantieren (oder mit ihm interagieren) können. Beispielsweise können Benutzer ihre Kontostände nicht kennen, wenn ein Betreiber Details über den Status des Rollups zurückhält. Außerdem können sie keine Statusaktualisierungen mithilfe von Informationen durchführen, die in einem neu hinzugefügten Block enthalten sind. + +## Datenverfügbarkeit vs. Datenabrufbarkeit {#data-availability-vs-data-retrievability} + +Datenverfügbarkeit unterscheidet sich von Datenabrufbarkeit. Datenverfügbarkeit ist die Zusicherung, dass vollständige Blockchain-Knoten auf den vollständigen Satz von Transaktionen, die mit einem bestimmten Block verbunden sind, zugreifen und diesen überprüfen konnten. Daraus folgt nicht zwangsläufig, dass die Daten für immer zugänglich sind. + +Datenabrufbarkeit ist die Fähigkeit von Blockchain-Knoten, _historische Informationen_ aus der Blockchain abzurufen. Diese historischen Daten werden nicht zur Überprüfung neuer Blöcke benötigt, sie sind nur erforderlich, um vollständige Blockchain-Knoten ab dem Genesis-Block zu synchronisieren oder bestimmte historische Anfragen zu bedienen. + +Das Kern-Ethereum-Protokoll befasst sich in erster Linie mit der Datenverfügbarkeit, nicht mit der Datenabrufbarkeit. Die Datenabrufbarkeit kann durch eine kleine Population von Archivknoten bereitgestellt werden, die von Dritten betrieben werden, oder sie kann über das Netzwerk mithilfe dezentralisierter Dateispeicherung wie dem [Portal Network](https://www.ethportal.net/) verteilt werden. + +## Weiterführende Literatur {#further-reading} + +- [WTF is Data Availability?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) +- [What Is Data Availability?](https://coinmarketcap.com/academy/article/what-is-data-availability) +- [Eine Einführung in Datenverfügbarkeitsprüfungen](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html) +- [Eine Erklärung des Sharding + DAS-Vorschlags](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [Eine Anmerkung zu Datenverfügbarkeit und Erasure Coding](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding#can-an-attacker-not-circumvent-this-scheme-by-releasing-a-full-unavailable-block-but-then-only-releasing-individual-bits-of-data-as-clients-query-for-them) +- [Komitees für Datenverfügbarkeit.](https://medium.com/starkware/data-availability-e5564c416424) +- [Proof-of-Stake-Komitees für Datenverfügbarkeit.](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [Lösungen für das Problem der Datenabrufbarkeit](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding) +- [Data Availability Or: How Rollups Learned To Stop Worrying And Love Ethereum](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [EIP-7623: Increasing Calldata Cost](https://web.archive.org/web/20250515194659/https://research.2077.xyz/eip-7623-increase-calldata-cost) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/index.md new file mode 100644 index 00000000000..c6a975272f0 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/index.md @@ -0,0 +1,32 @@ +--- +title: Datenstrukturen und Codierung +description: "Ein Überblick über die grundlegenden Ethereum-Datenstrukturen." +lang: de +sidebarDepth: 2 +--- + +Ethereum erstellt, speichert und überträgt große Datenmengen. Diese Daten müssen auf standardisierte und speichereffiziente Weise formatiert werden, damit jeder einen [Blockchain-Knoten](/run-a-node/) auf relativ bescheidener, handelsüblicher Hardware betreiben kann. Um dies zu erreichen, werden im Ethereum-Stack verschiedene spezifische Datenstrukturen verwendet. + +## Voraussetzungen {#prerequisites} + +Sie sollten die Grundlagen von Ethereum und [Client-Software](/developers/docs/nodes-and-clients/) verstehen. Vertrautheit mit der Netzwerkschicht und [dem Ethereum-Whitepaper](/whitepaper/) wird empfohlen. + +## Datenstrukturen {#data-structures} + +### Patricia-Merkle-Tries {#patricia-merkle-tries} + +Patricia-Merkle-Tries sind Strukturen, die Schlüssel-Wert-Paare in einen deterministischen und kryptografisch authentifizierten Trie codieren. Diese werden in der gesamten Ausführungsebene von Ethereum ausgiebig genutzt. + +[Mehr zu Patricia-Merkle-Tries](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) + +### Recursive Length Prefix {#recursive-length-prefix} + +Recursive Length Prefix (RLP) ist eine Serialisierungsmethode, die in der gesamten Ausführungsebene von Ethereum ausgiebig genutzt wird. + +[Mehr zu RLP](/developers/docs/data-structures-and-encoding/rlp) + +### Simple Serialize {#simple-serialize} + +Simple Serialize (SSZ) ist das dominierende Serialisierungsformat auf der Konsensebene von Ethereum, da es mit der Merklelisierung kompatibel ist. + +[Mehr zu SSZ](/developers/docs/data-structures-and-encoding/ssz) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md new file mode 100644 index 00000000000..be7f42f1864 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -0,0 +1,266 @@ +--- +title: Merkle Patricia Trie +description: "Einführung in den Merkle Patricia Trie." +lang: de +sidebarDepth: 2 +--- + +Der Status von [Ethereum](/) (die Gesamtheit aller Konten, Salden und Smart Contracts) ist in einer speziellen Version der Datenstruktur kodiert, die in der Informatik allgemein als Merkle-Baum (Merkle Tree) bekannt ist. Diese Struktur ist für viele Anwendungen in der Kryptografie nützlich, da sie eine überprüfbare Beziehung zwischen all den einzelnen Datenbestandteilen herstellt, die in dem Baum miteinander verflochten sind. Dies führt zu einem einzigen **Root**-Wert (Wurzelwert), der verwendet werden kann, um Dinge über die Daten zu beweisen. + +Die Datenstruktur von Ethereum ist ein „modifizierter Merkle-Patricia Trie“. Er wird so genannt, weil er einige Merkmale von PATRICIA (Practical Algorithm To Retrieve Information Coded in Alphanumeric) entlehnt und weil er für den effizienten Datenabruf (engl. re**trie**val) von Elementen konzipiert ist, die den Ethereum-Status ausmachen. + +Ein Merkle-Patricia Trie ist deterministisch und kryptografisch verifizierbar: Die einzige Möglichkeit, einen Status-Root zu generieren, besteht darin, ihn aus jedem einzelnen Teil des Status zu berechnen. Dass zwei Status identisch sind, lässt sich leicht beweisen, indem man den Root-Hash und die Hashes, die zu ihm geführt haben, vergleicht (_ein Merkle-Beweis_). Umgekehrt gibt es keine Möglichkeit, zwei verschiedene Status mit demselben Root-Hash zu erstellen, und jeder Versuch, den Status mit anderen Werten zu ändern, führt zu einem anderen Status-Root-Hash. Theoretisch bietet diese Struktur den „heiligen Gral“ der `O(log(n))`-Effizienz für Einfügungen, Suchvorgänge und Löschungen. + +In naher Zukunft plant Ethereum die Migration zu einer [Verkle-Baum](/roadmap/verkle-trees)-Struktur (Verkle Tree), was viele neue Möglichkeiten für zukünftige Protokollverbesserungen eröffnen wird. + +## Voraussetzungen {#prerequisites} + +Um diese Seite besser zu verstehen, wäre es hilfreich, über Grundkenntnisse zu [Hashes](https://en.wikipedia.org/wiki/Hash_function), [Merkle-Bäumen](https://en.wikipedia.org/wiki/Merkle_tree), [Tries](https://en.wikipedia.org/wiki/Trie) und [Serialisierung](https://en.wikipedia.org/wiki/Serialization) zu verfügen. Dieser Artikel beginnt mit der Beschreibung eines grundlegenden [Radix-Baums](https://en.wikipedia.org/wiki/Radix_tree) und führt dann nach und nach die Modifikationen ein, die für die optimiertere Datenstruktur von Ethereum erforderlich sind. + +## Grundlegende Radix-Tries {#basic-radix-tries} + +In einem grundlegenden Radix-Trie sieht jeder Knoten wie folgt aus: + +``` + [i_0, i_1 ... i_n, value] +``` + +Wobei `i_0 ... i_n` die Symbole des Alphabets (oft binär oder hexadezimal) darstellen, `value` der Endwert am Knoten ist und die Werte in den `i_0, i_1 ... i_n`-Slots entweder `NULL` oder Zeiger auf (in unserem Fall Hashes von) andere(n) Knoten sind. Dies bildet einen grundlegenden `(key, value)`-Speicher (Schlüssel-Wert-Speicher). + +Angenommen, Sie möchten eine Radix-Baum-Datenstruktur verwenden, um eine Reihenfolge über eine Menge von Schlüssel-Wert-Paaren zu persistieren. Um den Wert zu finden, der aktuell dem Schlüssel `dog` im Trie zugeordnet ist, würden Sie zunächst `dog` in Buchstaben des Alphabets umwandeln (was `64 6f 67` ergibt) und dann den Trie entlang dieses Pfades absteigen, bis Sie den Wert finden. Das heißt, Sie beginnen damit, den Root-Hash in einer flachen Schlüssel-Wert-Datenbank (DB) nachzuschlagen, um den Wurzelknoten des Tries zu finden. Er wird als ein Array von Schlüsseln dargestellt, die auf andere Knoten zeigen. Sie würden den Wert am Index `6` als Schlüssel verwenden und ihn in der flachen Schlüssel-Wert-DB nachschlagen, um den Knoten eine Ebene tiefer zu erhalten. Dann wählen Sie Index `4`, um den nächsten Wert nachzuschlagen, dann Index `6` und so weiter, bis Sie, nachdem Sie dem Pfad `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7` gefolgt sind, den Wert des Knotens nachschlagen und das Ergebnis zurückgeben. + +Es gibt einen Unterschied zwischen dem Nachschlagen von etwas im „Trie“ und der zugrunde liegenden flachen Schlüssel-Wert-„DB“. Beide definieren Schlüssel-Wert-Anordnungen, aber die zugrunde liegende DB kann ein traditionelles 1-Schritt-Nachschlagen eines Schlüssels durchführen. Das Nachschlagen eines Schlüssels im Trie erfordert mehrere Nachschlagevorgänge in der zugrunde liegenden DB, um zu dem oben beschriebenen Endwert zu gelangen. Lassen Sie uns Letzteres als `path` (Pfad) bezeichnen, um Unklarheiten zu beseitigen. + +Die Aktualisierungs- und Löschoperationen für Radix-Tries können wie folgt definiert werden: + +```python + def update(node_hash, path, value): + curnode = db.get(node_hash) if node_hash else [NULL] * 17 + newnode = curnode.copy() + if path == "": + newnode[-1] = value + else: + newindex = update(curnode[path[0]], path[1:], value) + newnode[path[0]] = newindex + db.put(hash(newnode), newnode) + return hash(newnode) + + def delete(node_hash, path): + if node_hash is NULL: + return NULL + else: + curnode = db.get(node_hash) + newnode = curnode.copy() + if path == "": + newnode[-1] = NULL + else: + newindex = delete(curnode[path[0]], path[1:]) + newnode[path[0]] = newindex + + if all(x is NULL for x in newnode): + return NULL + else: + db.put(hash(newnode), newnode) + return hash(newnode) +``` + +Ein „Merkle“-Radix-Baum wird aufgebaut, indem Knoten mithilfe deterministisch generierter kryptografischer Hash-Werte verknüpft werden. Diese Inhaltsadressierung (in der Schlüssel-Wert-DB `key == keccak256(rlp(value))`) bietet eine kryptografische Integritätsgarantie für die gespeicherten Daten. Wenn der Root-Hash eines bestimmten Tries öffentlich bekannt ist, kann jeder mit Zugriff auf die zugrunde liegenden Blattdaten einen Beweis konstruieren, dass der Trie einen bestimmten Wert an einem bestimmten Pfad enthält, indem er die Hashes jedes Knotens bereitstellt, die einen bestimmten Wert mit der Baumwurzel verbinden. + +Es ist für einen Angreifer unmöglich, einen Beweis für ein `(path, value)`-Paar zu liefern, das nicht existiert, da der Root-Hash letztendlich auf allen darunter liegenden Hashes basiert. Jede zugrunde liegende Änderung würde den Root-Hash verändern. Sie können sich den Hash als eine komprimierte Darstellung von Strukturinformationen über die Daten vorstellen, die durch den Urbild-Schutz (Pre-Image Protection) der Hash-Funktion gesichert ist. + +Wir bezeichnen eine atomare Einheit eines Radix-Baums (z. B. ein einzelnes Hex-Zeichen oder eine 4-Bit-Binärzahl) als „Nibble“. Während man einen Pfad Nibble für Nibble durchläuft, wie oben beschrieben, können Knoten maximal auf 16 Kinder verweisen, enthalten aber ein `value`-Element. Wir stellen sie daher als ein Array der Länge 17 dar. Wir nennen diese 17-Element-Arrays „Zweigknoten“ (Branch Nodes). + +## Merkle Patricia Trie {#merkle-patricia-trees} + +Radix-Tries haben eine große Einschränkung: Sie sind ineffizient. Wenn Sie eine `(path, value)`-Bindung speichern möchten, bei der der Pfad, wie bei Ethereum, 64 Zeichen lang ist (die Anzahl der Nibbles in `bytes32`), benötigen wir über ein Kilobyte zusätzlichen Speicherplatz, um eine Ebene pro Zeichen zu speichern, und jedes Nachschlagen oder Löschen wird die vollen 64 Schritte in Anspruch nehmen. Der im Folgenden vorgestellte Patricia Trie löst dieses Problem. + +### Optimierung {#optimization} + +Ein Knoten in einem Merkle Patricia Trie ist eines der folgenden Elemente: + +1. `NULL` (dargestellt als leere Zeichenfolge) +2. `branch` (Zweig) Ein 17-Element-Knoten `[ v0 ... v15, vt ]` +3. `leaf` (Blatt) Ein 2-Element-Knoten `[ encodedPath, value ]` +4. `extension` (Erweiterung) Ein 2-Element-Knoten `[ encodedPath, key ]` + +Bei 64 Zeichen langen Pfaden ist es unvermeidlich, dass Sie nach dem Durchlaufen der ersten paar Ebenen des Tries einen Knoten erreichen, an dem zumindest für einen Teil des Weges nach unten kein abweichender Pfad existiert. Um zu vermeiden, dass bis zu 15 spärliche `NULL`-Knoten entlang des Pfades erstellt werden müssen, kürzen wir den Abstieg ab, indem wir einen `extension`-Knoten der Form `[ encodedPath, key ]` einrichten, wobei `encodedPath` den „Teilpfad“ enthält, um vorzuspringen (unter Verwendung einer unten beschriebenen kompakten Kodierung), und der `key` für das nächste DB-Nachschlagen dient. + +Für einen `leaf`-Knoten, der durch ein Flag im ersten Nibble des `encodedPath` markiert werden kann, kodiert der Pfad alle Pfadfragmente der vorherigen Knoten und wir können den `value` direkt nachschlagen. + +Diese obige Optimierung führt jedoch zu Mehrdeutigkeiten. + +Wenn wir Pfade in Nibbles durchlaufen, kann es sein, dass wir am Ende eine ungerade Anzahl von Nibbles durchlaufen müssen, aber da alle Daten im `bytes`-Format gespeichert werden, ist es nicht möglich, beispielsweise zwischen dem Nibble `1` und den Nibbles `01` zu unterscheiden (beide müssen als `<01>` gespeichert werden). Um eine ungerade Länge anzugeben, wird dem Teilpfad ein Flag vorangestellt. + +### Spezifikation: Kompakte Kodierung einer Hex-Sequenz mit optionalem Terminator {#specification} + +Die Kennzeichnung sowohl von _ungerader vs. gerader verbleibender Teilpfadlänge_ als auch von _Blatt- vs. Erweiterungsknoten_, wie oben beschrieben, befindet sich im ersten Nibble des Teilpfads jedes 2-Element-Knotens. Daraus ergibt sich Folgendes: + +| Hex-Zeichen | Bits | Knotentyp (Teil) | Pfadlänge | +| ----------- | ---- | ------------------ | --------- | +| 0 | 0000 | extension | gerade | +| 1 | 0001 | extension | ungerade | +| 2 | 0010 | terminating (leaf) | gerade | +| 3 | 0011 | terminating (leaf) | ungerade | + +Bei einer geraden verbleibenden Pfadlänge (`0` oder `2`) folgt immer ein weiteres `0`-„Füll“-Nibble (Padding). + +```python + def compact_encode(hexarray): + term = 1 if hexarray[-1] == 16 else 0 + if term: + hexarray = hexarray[:-1] + oddlen = len(hexarray) % 2 + flags = 2 * term + oddlen + if oddlen: + hexarray = [flags] + hexarray + else: + hexarray = [flags] + [0] + hexarray + # hexarray hat nun eine gerade Länge, dessen erstes Nibble die Flags sind. + o = "" + for i in range(0, len(hexarray), 2): + o += chr(16 * hexarray[i] + hexarray[i + 1]) + return o +``` + +Beispiele: + +```python + > [1, 2, 3, 4, 5, ...] + '11 23 45' + > [0, 1, 2, 3, 4, 5, ...] + '00 01 23 45' + > [0, f, 1, c, b, 8, 10] + '20 0f 1c b8' + > [f, 1, c, b, 8, 10] + '3f 1c b8' +``` + +Hier ist der erweiterte Code zum Abrufen eines Knotens im Merkle Patricia Trie: + +```python + def get_helper(node_hash, path): + if path == []: + return node_hash + if node_hash == "": + return "" + curnode = rlp.decode(node_hash if len(node_hash) < 32 else db.get(node_hash)) + if len(curnode) == 2: + (k2, v2) = curnode + k2 = compact_decode(k2) + if k2 == path[: len(k2)]: + return get(v2, path[len(k2) :]) + else: + return "" + elif len(curnode) == 17: + return get_helper(curnode[path[0]], path[1:]) + + def get(node_hash, path): + path2 = [] + for i in range(len(path)): + path2.push(int(ord(path[i]) / 16)) + path2.push(ord(path[i]) % 16) + path2.push(16) + return get_helper(node_hash, path2) +``` + +### Beispiel-Trie {#example-trie} + +Angenommen, wir möchten einen Trie, der vier Pfad-Wert-Paare enthält: `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coins')`, `('horse', 'stallion')`. + +Zuerst konvertieren wir sowohl Pfade als auch Werte in `bytes`. Unten werden die tatsächlichen Byte-Darstellungen für _Pfade_ durch `<>` gekennzeichnet, obwohl _Werte_ zum leichteren Verständnis weiterhin als Zeichenfolgen (Strings) angezeigt werden, gekennzeichnet durch `''` (auch sie wären eigentlich `bytes`): + +``` + <64 6f> : 'verb' + <64 6f 67> : 'puppy' + <64 6f 67 65> : 'coins' + <68 6f 72 73 65> : 'stallion' +``` + +Nun bauen wir einen solchen Trie mit den folgenden Schlüssel-Wert-Paaren in der zugrunde liegenden DB auf: + +``` + rootHash: [ <16>, hashA ] + hashA: [ <>, <>, <>, <>, hashB, <>, <>, <>, [ <20 6f 72 73 65>, 'stallion' ], <>, <>, <>, <>, <>, <>, <>, <> ] + hashB: [ <00 6f>, hashC ] + hashC: [ <>, <>, <>, <>, <>, <>, hashD, <>, <>, <>, <>, <>, <>, <>, <>, <>, 'verb' ] + hashD: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coins' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ] +``` + +Wenn ein Knoten innerhalb eines anderen Knotens referenziert wird, wird `keccak256(rlp.encode(node))` eingefügt, falls `len(rlp.encode(node)) >= 32`, andernfalls `node`, wobei `rlp.encode` die [RLP](/developers/docs/data-structures-and-encoding/rlp)-Kodierungsfunktion ist. + +Beachten Sie, dass man beim Aktualisieren eines Tries das Schlüssel-Wert-Paar `(keccak256(x), x)` in einer persistenten Lookup-Tabelle speichern muss, _wenn_ der neu erstellte Knoten eine Länge >= 32 hat. Wenn der Knoten jedoch kürzer ist, muss man nichts speichern, da die Funktion f(x) = x umkehrbar ist. + +## Tries in Ethereum {#tries-in-ethereum} + +Alle Merkle-Tries in der Ausführungsebene von Ethereum verwenden einen Merkle Patricia Trie. + +Aus einem Block-Header stammen 3 Roots von 3 dieser Tries. + +1. stateRoot +2. transactionsRoot +3. receiptsRoot + +### Status-Trie {#state-trie} + +Es gibt einen globalen Status-Trie, und er wird jedes Mal aktualisiert, wenn eine Anwendung einen Block verarbeitet. Darin ist ein `path` immer: `keccak256(ethereumAddress)` und ein `value` ist immer: `rlp(ethereumAccount)`. Genauer gesagt ist ein Ethereum-`account` (Konto) ein 4-Element-Array aus `[nonce,balance,storageRoot,codeHash]`. An dieser Stelle ist es erwähnenswert, dass dieser `storageRoot` die Wurzel eines weiteren Patricia Tries ist: + +### Speicher-Trie {#storage-trie} + +Im Speicher-Trie (Storage Trie) befinden sich _alle_ Vertragsdaten. Es gibt einen separaten Speicher-Trie für jedes Konto. Um Werte an bestimmten Speicherpositionen bei einer gegebenen Adresse abzurufen, werden die Speicheradresse, die ganzzahlige Position der gespeicherten Daten im Speicher und die Block-ID benötigt. Diese können dann als Argumente an die in der JSON-RPC-API definierte Methode `eth_getStorageAt` übergeben werden, z. B. um die Daten im Speicher-Slot 0 für die Adresse `0x295a70b2de5e3953354a6a8344e616ed314d7251` abzurufen: + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 + +{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} + +``` + +Das Abrufen anderer Elemente im Speicher ist etwas aufwendiger, da die Position im Speicher-Trie zunächst berechnet werden muss. Die Position wird als `keccak256`-Hash der Adresse und der Speicherposition berechnet, die beide links mit Nullen auf eine Länge von 32 Bytes aufgefüllt werden. Zum Beispiel ist die Position für die Daten im Speicher-Slot 1 für die Adresse `0x391694e7e0b0cce554cb130d723a9d27458f9298` wie folgt: + +```python +keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) +``` + +In einer Geth-Konsole kann dies wie folgt berechnet werden: + +``` +> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" +undefined +> web3.sha3(key, {"encoding": "hex"}) +"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" +``` + +Der `path` ist daher `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. Dies kann nun verwendet werden, um die Daten wie zuvor aus dem Speicher-Trie abzurufen: + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 + +{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} +``` + +Hinweis: Der `storageRoot` für ein Ethereum-Konto ist standardmäßig leer, wenn es sich nicht um ein Vertragskonto handelt. + +### Transaktions-Trie {#transaction-trie} + +Es gibt einen separaten Transaktions-Trie für jeden Block, der wiederum `(key, value)`-Paare speichert. Ein Pfad ist hier: `rlp(transactionIndex)`, was den Schlüssel darstellt, der einem Wert entspricht, der wie folgt bestimmt wird: + +```python +if legacyTx: + value = rlp(tx) +else: + value = TxType | encode(tx) +``` + +Weitere Informationen dazu finden Sie in der Dokumentation zu [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718). + +### Receipts-Trie {#receipts-trie} + +Jeder Block hat seinen eigenen Receipts-Trie. Ein `path` ist hier: `rlp(transactionIndex)`. `transactionIndex` ist sein Index innerhalb des Blocks, in den er aufgenommen wurde. Der Receipts-Trie wird niemals aktualisiert. Ähnlich wie beim Transaktions-Trie gibt es aktuelle und Legacy-Receipts. Um einen bestimmten Receipt im Receipts-Trie abzufragen, werden der Index der Transaktion in ihrem Block, die Receipt-Nutzdaten (Payload) und der Transaktionstyp benötigt. Der zurückgegebene Receipt kann vom Typ `Receipt` sein, der als Verkettung von `TransactionType` und `ReceiptPayload` definiert ist, oder er kann vom Typ `LegacyReceipt` sein, der als `rlp([status, cumulativeGasUsed, logsBloom, logs])` definiert ist. + +Weitere Informationen dazu finden Sie in der Dokumentation zu [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718). + +## Weiterführende Literatur {#further-reading} + +- [Modified Merkle Patricia Trie — How Ethereum saves a state](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd) +- [Merkling in Ethereum](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum) +- [Understanding the Ethereum trie](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md new file mode 100644 index 00000000000..ba11dcc2802 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md @@ -0,0 +1,177 @@ +--- +title: Recursive-Length-Prefix-Serialisierung (RLP) +description: "Eine Definition der RLP-Codierung in der Ausführungsebene von Ethereum." +lang: de +sidebarDepth: 2 +--- + +Die Recursive-Length-Prefix-Serialisierung (RLP) wird in den Ausführungs-Clients von Ethereum umfassend verwendet. RLP standardisiert die Datenübertragung zwischen Blockchain-Knoten in einem platzsparenden Format. Der Zweck von RLP besteht darin, beliebig verschachtelte Arrays von Binärdaten zu codieren, und RLP ist die primäre Codierungsmethode, die zur Serialisierung von Objekten in der Ausführungsebene von Ethereum verwendet wird. Der Hauptzweck von RLP ist die Codierung von Strukturen; mit Ausnahme von positiven Ganzzahlen (Integers) delegiert RLP die Codierung spezifischer Datentypen (z. B. Strings, Floats) an Protokolle höherer Ordnung. Positive Ganzzahlen müssen in Big-Endian-Binärform ohne führende Nullen dargestellt werden (wodurch der ganzzahlige Wert Null dem leeren Byte-Array entspricht). Deserialisierte positive Ganzzahlen mit führenden Nullen müssen von jedem Protokoll höherer Ordnung, das RLP verwendet, als ungültig behandelt werden. + +Weitere Informationen finden Sie im [Ethereum Yellow Paper (Anhang B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19). + +Um RLP zur Codierung eines Wörterbuchs (Dictionary) zu verwenden, sind die beiden vorgeschlagenen kanonischen Formen: + +- Verwendung von `[[k1,v1],[k2,v2]...]` mit Schlüsseln in lexikografischer Reihenfolge +- Verwendung der übergeordneten Patricia-Tree-Codierung, wie es [Ethereum](/) tut + +## Definition {#definition} + +Die RLP-Codierungsfunktion nimmt ein Element (Item) auf. Ein Element ist wie folgt definiert: + +- ein String (d. h. ein Byte-Array) ist ein Element +- eine Liste von Elementen ist ein Element +- eine positive Ganzzahl ist ein Element + +Zum Beispiel sind alle folgenden Dinge Elemente: + +- ein leerer String; +- der String, der das Wort "cat" enthält; +- eine Liste, die eine beliebige Anzahl von Strings enthält; +- und komplexere Datenstrukturen wie `["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"]`. +- die Zahl `100` + +Beachten Sie, dass im Kontext des Rests dieser Seite „String“ „eine bestimmte Anzahl von Bytes an Binärdaten“ bedeutet; es werden keine speziellen Codierungen verwendet und es wird kein Wissen über den Inhalt der Strings vorausgesetzt (außer wie durch die Regel gegen nicht-minimale positive Ganzzahlen gefordert). + +Die RLP-Codierung ist wie folgt definiert: + +- Eine positive Ganzzahl wird in das kürzeste Byte-Array umgewandelt, dessen Big-Endian-Interpretation die Ganzzahl ist, und dann gemäß den unten stehenden Regeln als String codiert. +- Für ein einzelnes Byte, dessen Wert im Bereich `[0x00, 0x7f]` (dezimal `[0, 127]`) liegt, ist dieses Byte seine eigene RLP-Codierung. +- Andernfalls, wenn ein String 0-55 Bytes lang ist, besteht die RLP-Codierung aus einem einzelnen Byte mit dem Wert **0x80** (dez. 128) plus der Länge des Strings, gefolgt vom String. Der Bereich des ersten Bytes ist somit `[0x80, 0xb7]` (dez. `[128, 183]`). +- Wenn ein String mehr als 55 Bytes lang ist, besteht die RLP-Codierung aus einem einzelnen Byte mit dem Wert **0xb7** (dez. 183) plus der Länge in Bytes der Länge des Strings in Binärform, gefolgt von der Länge des Strings, gefolgt vom String. Zum Beispiel würde ein 1024 Byte langer String als `\xb9\x04\x00` (dez. `185, 4, 0`) gefolgt vom String codiert werden. Hier ist `0xb9` (183 + 2 = 185) das erste Byte, gefolgt von den 2 Bytes `0x0400` (dez. 1024), die die Länge des eigentlichen Strings angeben. Der Bereich des ersten Bytes ist somit `[0xb8, 0xbf]` (dez. `[184, 191]`). +- Wenn ein String 2^64 Bytes lang oder länger ist, darf er nicht codiert werden. +- Wenn die gesamten Nutzdaten (Payload) einer Liste (d. h. die kombinierte Länge aller ihrer RLP-codierten Elemente) 0-55 Bytes lang sind, besteht die RLP-Codierung aus einem einzelnen Byte mit dem Wert **0xc0** plus der Länge der Nutzdaten, gefolgt von der Verkettung der RLP-Codierungen der Elemente. Der Bereich des ersten Bytes ist somit `[0xc0, 0xf7]` (dez. `[192, 247]`). +- Wenn die gesamten Nutzdaten einer Liste mehr als 55 Bytes lang sind, besteht die RLP-Codierung aus einem einzelnen Byte mit dem Wert **0xf7** plus der Länge in Bytes der Länge der Nutzdaten in Binärform, gefolgt von der Länge der Nutzdaten, gefolgt von der Verkettung der RLP-Codierungen der Elemente. Der Bereich des ersten Bytes ist somit `[0xf8, 0xff]` (dez. `[248, 255]`). + +In Kurzform: + +| Bereich | Byte 1 | Byte 2 | ... | Byte 9 | Byte 10 | Bedeutung | +| ----------- | ---------- | ---------- | ---------- | --------------------- | ---------- | ----------------------------------------- | +| `0x00-0x7f` | `0ppppppp` | | | | | Einzel-Byte-String | +| `0x80-0xb7` | `10nnnnnn` | `pppppppp` | `...` | | | kurzer String (0-55 Bytes) | +| `0xb8-0xbf` | `10111NNN` | `nnnnnnnn` | `...` | `nnnnnnnn`/`pppppppp` | `pppppppp` | langer String, N+1 Bytes für Länge, dann Nutzdaten | +| `0xc0-0xf7` | `11nnnnnn` | `pppppppp` | `...` | | | kurze Liste (0-55 Bytes) | +| `0xf8-0xff` | `11111NNN` | `nnnnnnnn` | `...` | `nnnnnnnn`/`pppppppp` | `pppppppp` | lange Liste, N+1 Bytes für Länge, dann Nutzdaten | + +- `p` = Nutzdaten (Payload) +- `n` = Länge (Anzahl der Nutzdaten-Bytes) +- `N` = Länge-der-Länge-Offset (N+1 `n` Bytes folgen) + +Im Code sieht das so aus: + +```python +def rlp_encode(input): + if isinstance(input,str): + if len(input) == 1 and ord(input) < 0x80: + return input + return encode_length(len(input), 0x80) + input + elif isinstance(input, list): + output = '' + for item in input: + output += rlp_encode(item) + return encode_length(len(output), 0xc0) + output + +def encode_length(L, offset): + if L < 56: + return chr(L + offset) + elif L < 256**8: + BL = to_binary(L) + return chr(len(BL) + offset + 55) + BL + raise Exception("input too long") + +def to_binary(x): + if x == 0: + return '' + return to_binary(int(x / 256)) + chr(x % 256) +``` + +## Beispiele {#examples} + +- der String "dog" = [ 0x83, 'd', 'o', 'g' ] +- die Liste [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` +- der leere String ('null') = `[ 0x80 ]` +- die leere Liste = `[ 0xc0 ]` +- die Ganzzahl 0 = `[ 0x80 ]` +- das Byte '\x00' = `[ 0x00 ]` +- das Byte '\x0f' = `[ 0x0f ]` +- die Bytes '\x04\x00' = `[ 0x82, 0x04, 0x00 ]` +- die [mengentheoretische Darstellung](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) von drei, `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` +- der String "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't' ]` + +## RLP-Decodierung {#rlp-decoding} + +Gemäß den Regeln und dem Prozess der RLP-Codierung wird die Eingabe der RLP-Decodierung als ein Array von Binärdaten betrachtet. Der RLP-Decodierungsprozess läuft wie folgt ab: + +1. Anhand des ersten Bytes (d. h. des Präfixes) der Eingabedaten werden der Datentyp, die Länge der eigentlichen Daten und der Offset decodiert; + +2. Anhand des Typs und des Offsets der Daten werden die Daten entsprechend decodiert, wobei die minimale Codierungsregel für positive Ganzzahlen beachtet wird; + +3. Fahren Sie mit der Decodierung des Rests der Eingabe fort; + +Dabei lauten die Regeln für die Decodierung von Datentypen und Offsets wie folgt: + +1. Die Daten sind ein String, wenn der Bereich des ersten Bytes (d. h. des Präfixes) [0x00, 0x7f] ist, und der String ist exakt das erste Byte selbst; + +2. Die Daten sind ein String, wenn der Bereich des ersten Bytes [0x80, 0xb7] ist, und der String, dessen Länge gleich dem ersten Byte minus 0x80 ist, folgt auf das erste Byte; + +3. Die Daten sind ein String, wenn der Bereich des ersten Bytes [0xb8, 0xbf] ist, und die Länge des Strings, dessen Länge in Bytes gleich dem ersten Byte minus 0xb7 ist, folgt auf das erste Byte, und der String folgt auf die Länge des Strings; + +4. Die Daten sind eine Liste, wenn der Bereich des ersten Bytes [0xc0, 0xf7] ist, und die Verkettung der RLP-Codierungen aller Elemente der Liste, deren gesamte Nutzdaten gleich dem ersten Byte minus 0xc0 sind, folgt auf das erste Byte; + +5. Die Daten sind eine Liste, wenn der Bereich des ersten Bytes [0xf8, 0xff] ist, und die gesamten Nutzdaten der Liste, deren Länge gleich dem ersten Byte minus 0xf7 ist, folgen auf das erste Byte, und die Verkettung der RLP-Codierungen aller Elemente der Liste folgt auf die gesamten Nutzdaten der Liste; + +Im Code sieht das so aus: + +```python +def rlp_decode(input): + if len(input) == 0: + return + output = '' + (offset, dataLen, type) = decode_length(input) + if type is str: + output = instantiate_str(substr(input, offset, dataLen)) + elif type is list: + output = instantiate_list(substr(input, offset, dataLen)) + output += rlp_decode(substr(input, offset + dataLen)) + return output + +def decode_length(input): + length = len(input) + if length == 0: + raise Exception("input is null") + prefix = ord(input[0]) + if prefix <= 0x7f: + return (0, 1, str) + elif prefix <= 0xb7 and length > prefix - 0x80: + strLen = prefix - 0x80 + return (1, strLen, str) + elif prefix <= 0xbf and length > prefix - 0xb7 and length > prefix - 0xb7 + to_integer(substr(input, 1, prefix - 0xb7)): + lenOfStrLen = prefix - 0xb7 + strLen = to_integer(substr(input, 1, lenOfStrLen)) + return (1 + lenOfStrLen, strLen, str) + elif prefix <= 0xf7 and length > prefix - 0xc0: + listLen = prefix - 0xc0; + return (1, listLen, list) + elif prefix <= 0xff and length > prefix - 0xf7 and length > prefix - 0xf7 + to_integer(substr(input, 1, prefix - 0xf7)): + lenOfListLen = prefix - 0xf7 + listLen = to_integer(substr(input, 1, lenOfListLen)) + return (1 + lenOfListLen, listLen, list) + raise Exception("input does not conform to RLP encoding form") + +def to_integer(b): + length = len(b) + if length == 0: + raise Exception("input is null") + elif length == 1: + return ord(b[0]) + return ord(substr(b, -1)) + to_integer(substr(b, 0, -1)) * 256 +``` + +## Weiterführende Literatur {#further-reading} + +- [RLP in Ethereum](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) +- [Ethereum under the hood: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) +- [Coglio, A. (2020). Ethereum's Recursive Length Prefix in ACL2. arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) + +## Verwandte Themen {#related-topics} + +- [Patricia Merkle Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md new file mode 100644 index 00000000000..8ec92dacc74 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md @@ -0,0 +1,150 @@ +--- +title: Simple serialize +description: "Erklärung des SSZ-Formats von Ethereum." +lang: de +sidebarDepth: 2 +--- + +**Simple Serialize (SSZ)** ist die Serialisierungsmethode, die auf der Beacon Chain verwendet wird. Sie ersetzt die RLP-Serialisierung, die auf der Ausführungsebene verwendet wird, überall auf der Konsensebene, mit Ausnahme des Peer-Discovery-Protokolls. Um mehr über die RLP-Serialisierung zu erfahren, siehe [Recursive-Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp/). SSZ ist so konzipiert, dass es deterministisch ist und sich effizient merkelisieren lässt. Man kann sich SSZ als aus zwei Komponenten bestehend vorstellen: einem Serialisierungsschema und einem Merkelisierungsschema, das so konzipiert ist, dass es effizient mit der serialisierten Datenstruktur arbeitet. + +## Wie funktioniert SSZ? {#how-does-ssz-work} + +### Serialisierung {#serialization} + +SSZ ist ein Serialisierungsschema, das nicht selbsterklärend ist – vielmehr stützt es sich auf ein Schema, das im Voraus bekannt sein muss. Das Ziel der SSZ-Serialisierung ist es, Objekte beliebiger Komplexität als Byte-Strings darzustellen. Dies ist ein sehr einfacher Prozess für „Basistypen“. Das Element wird einfach in hexadezimale Bytes umgewandelt. Zu den Basistypen gehören: + +- vorzeichenlose Ganzzahlen (unsigned integers) +- boolesche Werte (Booleans) + +Für komplexe „zusammengesetzte“ Typen ist die Serialisierung komplizierter, da der zusammengesetzte Typ mehrere Elemente enthält, die unterschiedliche Typen oder unterschiedliche Größen oder beides haben können. Wenn diese Objekte alle feste Längen haben (d. h. die Größe der Elemente ist unabhängig von ihren tatsächlichen Werten immer konstant), ist die Serialisierung einfach eine Umwandlung jedes Elements im zusammengesetzten Typ, geordnet in Little-Endian-Byte-Strings. Diese Byte-Strings werden zusammengefügt. Das serialisierte Objekt hat die Bytelisten-Darstellung der Elemente mit fester Länge in derselben Reihenfolge, in der sie im deserialisierten Objekt erscheinen. + +Bei Typen mit variablen Längen werden die tatsächlichen Daten durch einen „Offset“-Wert an der Position dieses Elements im serialisierten Objekt ersetzt. Die tatsächlichen Daten werden einem Heap am Ende des serialisierten Objekts hinzugefügt. Der Offset-Wert ist der Index für den Beginn der tatsächlichen Daten im Heap und fungiert als Zeiger auf die relevanten Bytes. + +Das folgende Beispiel veranschaulicht, wie das Offsetting für einen Container mit Elementen sowohl fester als auch variabler Länge funktioniert: + +```rust + + struct Dummy { + + number1: u64, + number2: u64, + vector: Vec, + number3: u64 + } + + dummy = Dummy{ + + number1: 37, + number2: 55, + vector: vec![1,2,3,4], + number3: 22, + } + + serialized = ssz.serialize(dummy) + +``` + +`serialized` hätte die folgende Struktur (hier nur auf 4 Bits aufgefüllt, in der Realität auf 32 Bits aufgefüllt, und die `int`-Darstellung wird der Übersichtlichkeit halber beibehalten): + +``` +[37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4] +------------ ----------- ----------- ----------- ---------- + | | | | | + number1 number2 offset for number 3 value for + vector vector + +``` + +der Übersichtlichkeit halber auf mehrere Zeilen aufgeteilt: + +``` +[ + 37, 0, 0, 0, # little-endian encoding of `number1`. + 55, 0, 0, 0, # little-endian encoding of `number2`. + 16, 0, 0, 0, # The "offset" that indicates where the value of `vector` starts (little-endian 16). + 22, 0, 0, 0, # little-endian encoding of `number3`. + 1, 2, 3, 4, # The actual values in `vector`. +] +``` + +Dies ist immer noch eine Vereinfachung – die Ganzzahlen und Nullen in den obigen Schemata wären eigentlich gespeicherte Bytelisten, wie hier: + +``` +[ + 10100101000000000000000000000000 # little-endian encoding of `number1` + 10110111000000000000000000000000 # little-endian encoding of `number2`. + 10010000000000000000000000000000 # The "offset" that indicates where the value of `vector` starts (little-endian 16). + 10010110000000000000000000000000 # little-endian encoding of `number3`. + 10000001100000101000001110000100 # The actual value of the `bytes` field. +] +``` + +Die tatsächlichen Werte für Typen mit variabler Länge werden also in einem Heap am Ende des serialisierten Objekts gespeichert, wobei ihre Offsets an den richtigen Positionen in der geordneten Liste der Felder gespeichert werden. + +Es gibt auch einige Sonderfälle, die eine spezifische Behandlung erfordern, wie z. B. der Typ `BitList`, bei dem während der Serialisierung eine Längenbegrenzung hinzugefügt und bei der Deserialisierung entfernt werden muss. Vollständige Details sind in der [SSZ-Spezifikation](https://github.com/ethereum/consensus-specs/blob/master/ssz/simple-serialize.md) verfügbar. + +### Deserialisierung {#deserialization} + +Um dieses Objekt zu deserialisieren, wird das Schema benötigt. Das Schema definiert das genaue Layout der serialisierten Daten, sodass jedes spezifische Element aus einem Byte-Blob in ein sinnvolles Objekt deserialisiert werden kann, bei dem die Elemente den richtigen Typ, Wert, die richtige Größe und Position haben. Es ist das Schema, das dem Deserialisierer mitteilt, welche Werte tatsächliche Werte und welche Offsets sind. Alle Feldnamen verschwinden, wenn ein Objekt serialisiert wird, werden aber bei der Deserialisierung gemäß dem Schema wieder instanziiert. + +Siehe [ssz.dev](https://www.ssz.dev/overview) für eine interaktive Erklärung dazu. + +## Merkelisierung {#merkleization} + +Dieses SSZ-serialisierte Objekt kann dann merkelisiert werden – das heißt, in eine Merkle-Baum-Darstellung derselben Daten umgewandelt werden. Zunächst wird die Anzahl der 32-Byte-Blöcke im serialisierten Objekt bestimmt. Dies sind die „Blätter“ (Leaves) des Baums. Die Gesamtzahl der Blätter muss eine Zweierpotenz sein, damit das gemeinsame Hashen der Blätter schließlich eine einzige Hash-Baum-Wurzel (Hash-Tree-Root) ergibt. Wenn dies von Natur aus nicht der Fall ist, werden zusätzliche Blätter hinzugefügt, die 32 Bytes an Nullen enthalten. Schematisch dargestellt: + +``` + hash tree root + / \ + / \ + / \ + / \ + hash of leaves hash of leaves + 1 and 2 3 and 4 + / \ / \ + / \ / \ + / \ / \ + leaf1 leaf2 leaf3 leaf4 +``` + +Es gibt auch Fälle, in denen sich die Blätter des Baums nicht von Natur aus so gleichmäßig verteilen wie im obigen Beispiel. Zum Beispiel könnte Blatt 4 ein Container mit mehreren Elementen sein, die zusätzliche „Tiefe“ erfordern, die dem Merkle-Baum hinzugefügt werden muss, wodurch ein ungleichmäßiger Baum entsteht. + +Anstatt diese Baumelemente als Blatt X, Knoten X usw. zu bezeichnen, können wir ihnen verallgemeinerte Indizes geben, beginnend mit Wurzel = 1 und von links nach rechts entlang jeder Ebene zählend. Dies ist der oben erklärte verallgemeinerte Index. Jedes Element in der serialisierten Liste hat einen verallgemeinerten Index, der gleich `2**depth + idx` ist, wobei idx seine nullbasierte Position im serialisierten Objekt ist und die Tiefe (depth) die Anzahl der Ebenen im Merkle-Baum ist, die als Zweierlogarithmus der Anzahl der Elemente (Blätter) bestimmt werden kann. + +## Verallgemeinerte Indizes {#generalized-indices} + +Ein verallgemeinerter Index ist eine Ganzzahl, die einen Knoten in einem binären Merkle-Baum darstellt, wobei jeder Knoten einen verallgemeinerten Index `2 ** depth + index in row` hat. + +``` + 1 --depth = 0 2**0 + 0 = 1 + 2 3 --depth = 1 2**1 + 0 = 2, 2**1+1 = 3 + 4 5 6 7 --depth = 2 2**2 + 0 = 4, 2**2 + 1 = 5... + +``` + +Diese Darstellung liefert einen Knotenindex für jedes Datenelement im Merkle-Baum. + +## Multiproofs {#multiproofs} + +Die Bereitstellung der Liste der verallgemeinerten Indizes, die ein bestimmtes Element darstellen, ermöglicht es uns, es gegen die Hash-Baum-Wurzel zu verifizieren. Diese Wurzel ist unsere akzeptierte Version der Realität. Alle Daten, die uns zur Verfügung gestellt werden, können gegen diese Realität verifiziert werden, indem sie an der richtigen Stelle in den Merkle-Baum eingefügt werden (bestimmt durch ihren verallgemeinerten Index) und beobachtet wird, dass die Wurzel konstant bleibt. Es gibt Funktionen in der Spezifikation [hier](https://github.com/ethereum/consensus-specs/blob/master/ssz/merkle-proofs.md#merkle-multiproofs), die zeigen, wie man die minimale Menge an Knoten berechnet, die erforderlich ist, um den Inhalt einer bestimmten Menge von verallgemeinerten Indizes zu verifizieren. + +Um beispielsweise Daten im Index 9 im untenstehenden Baum zu verifizieren, benötigen wir den Hash der Daten an den Indizes 8, 9, 5, 3, 1. +Der Hash von (8,9) sollte gleich dem Hash (4) sein, der mit 5 gehasht wird, um 2 zu erzeugen, was wiederum mit 3 gehasht wird, um die Baumwurzel 1 zu erzeugen. Wenn für 9 falsche Daten bereitgestellt würden, würde sich die Wurzel ändern – wir würden dies erkennen und den Zweig nicht verifizieren können. + +``` +* = data required to generate proof + + 1* + 2 3* + 4 5* 6 7 +8* 9* 10 11 12 13 14 15 + +``` + +## Weiterführende Literatur {#further-reading} + +- [Upgrading Ethereum: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz) +- [Upgrading Ethereum: Merkelisierung](https://eth2book.info/altair/part2/building_blocks/merkleization) +- [SSZ-Implementierungen](https://github.com/ethereum/consensus-specs/issues/2138) +- [SSZ-Rechner](https://simpleserialize.com/) +- [SSZ.dev](https://www.ssz.dev/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md new file mode 100644 index 00000000000..95ae76d3621 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md @@ -0,0 +1,199 @@ +--- +title: Definition der Web3-Geheimnisspeicherung +description: "Formale Definition für die Web3-Geheimnisspeicherung" +lang: de +sidebarDepth: 2 +--- + +Damit Ihre App auf Ethereum funktioniert, können Sie das Web3-Objekt verwenden, das von der web3.js-Bibliothek bereitgestellt wird. Unter der Haube kommuniziert es über RPC-Aufrufe mit einem lokalen Blockchain-Knoten. [web3](https://github.com/ethereum/web3.js/) funktioniert mit jedem Ethereum-Blockchain-Knoten, der eine RPC-Schicht bereitstellt. + +`web3` enthält das `eth`-Objekt – web3.eth. + +```js +var fs = require("fs") +var recognizer = require("ethereum-keyfile-recognizer") + +fs.readFile("keyfile.json", (err, data) => { + var json = JSON.parse(data) + var result = recognizer(json) +}) + +/* * Ergebnis + * [ 'web3', 3 ] web3 (v3) Schlüsseldatei + * [ 'ethersale', undefined ] Ethersale-Schlüsseldatei + * null ungültige Schlüsseldatei */ + + + + + +``` + +Dies dokumentiert **Version 3** der Definition der Web3-Geheimnisspeicherung. + +## Definition {#definition} + +Die eigentliche Kodierung und Dekodierung der Datei bleibt im Vergleich zu Version 1 weitgehend unverändert, außer dass der Krypto-Algorithmus nicht mehr auf AES-128-CBC festgelegt ist (AES-128-CTR ist jetzt die Mindestanforderung). Die meisten Bedeutungen/Algorithmen ähneln Version 1, mit Ausnahme von `mac`, das als SHA3 (keccak-256) der Verkettungen der zweit-linkesten 16 Bytes des abgeleiteten Schlüssels zusammen mit dem vollständigen `ciphertext` angegeben wird. + +Geheime Schlüsseldateien werden direkt in `~/.web3/keystore` (für Unix-ähnliche Systeme) und `~/AppData/Web3/keystore` (für Windows) gespeichert. Sie können beliebig benannt werden, aber eine gute Konvention ist `.json`, wobei `` die 128-Bit-UUID ist, die dem geheimen Schlüssel zugewiesen wird (ein datenschutzfreundlicher Stellvertreter für die Adresse des geheimen Schlüssels). + +Alle solchen Dateien haben ein zugehöriges Passwort. Um den geheimen Schlüssel einer bestimmten `.json`-Datei abzuleiten, leiten Sie zunächst den Verschlüsselungsschlüssel der Datei ab; dies geschieht, indem das Passwort der Datei durch eine Schlüsselableitungsfunktion geleitet wird, wie durch den Schlüssel `kdf` beschrieben. KDF-abhängige statische und dynamische Parameter für die KDF-Funktion werden im Schlüssel `kdfparams` beschrieben. + +PBKDF2 muss von allen minimal konformen Implementierungen unterstützt werden, gekennzeichnet durch: + +- `kdf`: `pbkdf2` + +Für PBKDF2 umfassen die `kdfparams`: + +- `prf`: Muss `hmac-sha256` sein (kann in Zukunft erweitert werden); +- `c`: Anzahl der Iterationen; +- `salt`: Salt, das an PBKDF übergeben wird; +- `dklen`: Länge für den abgeleiteten Schlüssel. Muss >= 32 sein. + +Sobald der Schlüssel der Datei abgeleitet wurde, sollte er durch die Ableitung des MAC verifiziert werden. Der MAC sollte als SHA3-Hash (keccak-256) des Byte-Arrays berechnet werden, das als Verkettung der zweit-linkesten 16 Bytes des abgeleiteten Schlüssels mit dem Inhalt des Schlüssels `ciphertext` gebildet wird, d. h.: + +```js +KECCAK(DK[16..31] ++ ) +``` + +(wobei `++` der Verkettungsoperator ist) + +Dieser Wert sollte mit dem Inhalt des Schlüssels `mac` verglichen werden; wenn sie unterschiedlich sind, sollte ein alternatives Passwort angefordert (oder der Vorgang abgebrochen) werden. + +Nachdem der Schlüssel der Datei verifiziert wurde, kann der Geheimtext (der Schlüssel `ciphertext` in der Datei) mit dem symmetrischen Verschlüsselungsalgorithmus entschlüsselt werden, der durch den Schlüssel `cipher` angegeben und durch den Schlüssel `cipherparams` parametrisiert wird. Wenn die Größe des abgeleiteten Schlüssels und die Schlüsselgröße des Algorithmus nicht übereinstimmen, sollten die mit Nullen aufgefüllten, rechtesten Bytes des abgeleiteten Schlüssels als Schlüssel für den Algorithmus verwendet werden. + +Alle minimal konformen Implementierungen müssen den Algorithmus AES-128-CTR unterstützen, gekennzeichnet durch: + +- `cipher: aes-128-ctr` + +Diese Chiffre nimmt die folgenden Parameter an, die als Schlüssel für den Schlüssel `cipherparams` angegeben werden: + +- `iv`: 128-Bit-Initialisierungsvektor für die Chiffre. + +Der Schlüssel für die Chiffre sind die linkesten 16 Bytes des abgeleiteten Schlüssels, d. h. `DK[0..15]` + +Die Erstellung/Verschlüsselung eines geheimen Schlüssels sollte im Wesentlichen die Umkehrung dieser Anweisungen sein. Stellen Sie sicher, dass `uuid`, `salt` und `iv` tatsächlich zufällig sind. + +Zusätzlich zum Feld `version`, das als „harter“ Identifikator der Version dienen sollte, können Implementierungen auch `minorversion` verwenden, um kleinere, nicht bahnbrechende Änderungen am Format zu verfolgen. + +## Testvektoren {#test-vectors} + +Details: + +- `Address`: `008aeeda4d805471df9b2a5b0f38a0c3bcba786b` +- `ICAP`: `XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67` +- `UUID`: `3198bc9c-6672-5ab3-d9954942343ae5b6` +- `Password`: `testpassword` +- `Secret`: `7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d` + +### PBKDF2-SHA-256 {#PBKDF2-SHA-256} + +Testvektor unter Verwendung von `AES-128-CTR` und `PBKDF2-SHA-256`: + +Dateiinhalte von `~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json`: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "6087dab2f9fdbbfaddc31a909735c1e6" + }, + "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", + "kdf": "pbkdf2", + "kdfparams": { + "c": 262144, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd" + }, + "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**Zwischenwerte**: + +`Derived key`: `f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551` +`MAC Body`: `e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46` +`MAC`: `517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2` +`Cipher key`: `f06d69cdc7da0faffb1008270bca38f5` + +### Scrypt {#scrypt} + +Testvektor unter Verwendung von AES-128-CTR und Scrypt: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "740770fce12ce862af21264dab25f1da" + }, + "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034" + }, + "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**Zwischenwerte**: + +`Derived key`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` +`MAC Body`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` +`MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` +`Cipher key`: `7446f59ecc301d2d79bc3302650d8a5c` + +## Änderungen gegenüber Version 1 {#alterations-from-v2} + +Diese Version behebt mehrere Inkonsistenzen mit der [hier](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst) veröffentlichten Version 1. Kurz gesagt sind dies: + +- Die Groß- und Kleinschreibung ist ungerechtfertigt und inkonsistent (scrypt kleingeschrieben, Kdf gemischt, MAC großgeschrieben). +- Adresse ist unnötig und beeinträchtigt den Datenschutz. +- `Salt` ist an sich ein Parameter der Schlüsselableitungsfunktion und sollte mit dieser verknüpft werden, nicht mit der Krypto im Allgemeinen. +- _SaltLen_ ist unnötig (einfach aus Salt ableiten). +- Die Schlüsselableitungsfunktion ist vorgegeben, der Krypto-Algorithmus ist jedoch fest spezifiziert. +- `Version` ist an sich numerisch, aber ein String (strukturierte Versionierung wäre mit einem String möglich, kann aber für ein sich selten änderndes Konfigurationsdateiformat als außerhalb des Rahmens betrachtet werden). +- `KDF` und `cipher` sind konzeptionell verwandte Konzepte, werden aber unterschiedlich organisiert. +- `MAC` wird durch ein Leerzeichen-agnostisches Datenstück berechnet(!) + +Es wurden Änderungen am Format vorgenommen, um die folgende Datei zu erhalten, die funktional dem Beispiel auf der zuvor verlinkten Seite entspricht: + +```json +{ + "crypto": { + "cipher": "aes-128-cbc", + "ciphertext": "07533e172414bfa50e99dba4a0ce603f654ebfa1ff46277c3e0c577fdc87f6bb4e4fe16c5a94ce6ce14cfa069821ef9b", + "cipherparams": { + "iv": "16d67ba0ce5a339ff2f07951253e6ba8" + }, + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "06870e5e6a24e183a5c807bd1c43afd86d573f7db303ff4853d135cd0fd3fe91" + }, + "mac": "8ccded24da2e99a11d48cda146f9cc8213eb423e2ea0d8427f41c3be414424dd", + "version": 1 + }, + "id": "0498f19a-59db-4d54-ac95-33901b4f1870", + "version": 2 +} +``` + +## Änderungen gegenüber Version 2 {#alterations-from-v2} + +Version 2 war eine frühe C++-Implementierung mit einer Reihe von Fehlern. Alle wesentlichen Elemente bleiben davon unverändert. \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md new file mode 100644 index 00000000000..d2f8699ec9f --- /dev/null +++ b/public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md @@ -0,0 +1,217 @@ +--- +title: "Best Practices für das Design dezentralisierter Börsen (DEX)" +description: "Ein Leitfaden, der UX/UI-Entscheidungen für das Tauschen von Token erklärt." +lang: de +--- + +Seit dem Start von Uniswap im Jahr 2018 wurden Hunderte von dezentralisierten Börsen auf Dutzenden verschiedener Chains gestartet. +Viele davon führten neue Elemente ein oder fügten ihre eigene Note hinzu, aber die Benutzeroberfläche ist im Allgemeinen gleich geblieben. + +Ein Grund dafür ist [Jakobs Gesetz](https://lawsofux.com/jakobs-law/): + +> Benutzer verbringen die meiste Zeit auf anderen Websites. Das bedeutet, dass Benutzer es bevorzugen, wenn Ihre Website genauso funktioniert wie all die anderen Websites, die sie bereits kennen. + +Dank früher Innovatoren wie Uniswap, Pancakeswap und Sushiswap haben DeFi-Benutzer eine kollektive Vorstellung davon, wie eine DEX aussieht. +Aus diesem Grund entsteht nun so etwas wie eine „Best Practice“. Wir sehen, dass immer mehr Designentscheidungen über verschiedene Websites hinweg standardisiert werden. Man kann die Entwicklung von DEXes als ein riesiges Beispiel für Live-Tests betrachten. Dinge, die funktionierten, blieben; Dinge, die nicht funktionierten, wurden verworfen. Es gibt immer noch Raum für Persönlichkeit, aber es gibt bestimmte Standards, denen eine DEX entsprechen sollte. + +Dieser Artikel ist eine Zusammenfassung darüber: +- was enthalten sein sollte +- wie man es so benutzerfreundlich wie möglich gestaltet +- die wichtigsten Möglichkeiten, das Design anzupassen + +Alle Beispiel-Wireframes wurden speziell für diesen Artikel erstellt, obwohl sie alle auf realen Projekten basieren. + +Das Figma-Kit ist ebenfalls unten verlinkt – fühlen Sie sich frei, es zu verwenden und Ihre eigenen Wireframes zu beschleunigen! + +## Grundlegende Anatomie einer DEX {#basic-anatomy-of-a-dex} + +Die Benutzeroberfläche (UI) enthält im Allgemeinen drei Elemente: +1. Hauptformular +2. Schaltfläche (Button) +3. Detailbereich + +![Generische DEX-UI, die die drei Hauptelemente zeigt](./1.png) + + +## Variationen {#variations} + +Dies wird ein wiederkehrendes Thema in diesem Artikel sein, aber es gibt verschiedene Möglichkeiten, wie diese Elemente organisiert werden können. Der „Detailbereich“ kann sich befinden: +- Über der Schaltfläche +- Unter der Schaltfläche +- Versteckt in einem Akkordeon-Panel +- Und/oder in einem „Vorschau“-Modal + +Hinweis: Ein „Vorschau“-Modal ist optional, aber wenn Sie auf der Haupt-UI nur sehr wenige Details anzeigen, wird es unerlässlich. + +## Struktur des Hauptformulars {#structure-of-the-main-form} + +Dies ist das Feld, in dem Sie tatsächlich auswählen, welchen Token Sie tauschen möchten. Die Komponente besteht aus einem Eingabefeld und einer kleinen Schaltfläche in einer Reihe. + +DEXes zeigen typischerweise zusätzliche Details in einer Reihe darüber und einer Reihe darunter an, obwohl dies auch anders konfiguriert werden kann. + +![Eingabereihe mit einer Detailreihe darüber und darunter](./2.png) + +## Variationen {#variations2} + +Hier werden zwei UI-Variationen gezeigt; eine ohne jegliche Ränder, was ein sehr offenes Design schafft, und eine, bei der die Eingabereihe einen Rand hat, was den Fokus auf dieses Element lenkt. + +![Zwei UI-Variationen des Hauptformulars](./3.png) + +Diese Grundstruktur ermöglicht es, **vier wichtige Informationen** im Design anzuzeigen: eine in jeder Ecke. Wenn es nur eine obere/untere Reihe gibt, dann gibt es nur zwei Plätze. + +Während der Entwicklung von DeFi wurden hier viele verschiedene Dinge integriert. + +## Wichtige Informationen, die enthalten sein sollten {#key-info-to-include} + +- Guthaben im Wallet +- Max-Schaltfläche +- Fiat-Gegenwert +- Preisauswirkung auf den „erhaltenen“ Betrag + +In den frühen Tagen von DeFi fehlte oft der Fiat-Gegenwert. Wenn Sie irgendeine Art von Web3-Projekt entwickeln, ist es unerlässlich, dass ein Fiat-Gegenwert angezeigt wird. Benutzer denken immer noch in lokalen Währungen. Um also den mentalen Modellen der realen Welt zu entsprechen, sollte dies einbezogen werden. + +Im zweiten Feld (in dem Sie den Token auswählen, in den Sie tauschen) können Sie auch die Preisauswirkung neben dem Fiat-Währungsbetrag anzeigen, indem Sie die Differenz zwischen dem Eingabebetrag und den geschätzten Ausgabebeträgen berechnen. Dies ist ein ziemlich nützliches Detail, das man einfügen sollte. + +Prozent-Schaltflächen (z. B. 25 %, 50 %, 75 %) können eine nützliche Funktion sein, aber sie nehmen mehr Platz ein, fügen mehr Handlungsaufforderungen (Call-to-Actions) hinzu und erhöhen die mentale Belastung. Das Gleiche gilt für Prozent-Schieberegler. Einige dieser UI-Entscheidungen hängen von Ihrer Marke und Ihrem Benutzertyp ab. + +Zusätzliche Details können unter dem Hauptformular angezeigt werden. Da diese Art von Informationen hauptsächlich für professionelle Benutzer gedacht ist, ist es sinnvoll, sie entweder: +- so minimal wie möglich zu halten, oder; +- in einem Akkordeon-Panel zu verstecken + +![Details, die in den Ecken dieses Hauptformulars angezeigt werden](./4.png) + +## Zusätzliche Informationen, die enthalten sein sollten {#extra-info-to-include} + +- Token-Preis +- Slippage (Preisrutsch) +- Mindestens erhalten +- Erwartete Ausgabe +- Preisauswirkung +- Geschätzte Gaskosten +- Andere Gebühren +- Order-Routing + +Man kann argumentieren, dass einige dieser Details optional sein könnten. + +Order-Routing ist interessant, macht aber für die meisten Benutzer keinen großen Unterschied. + +Einige andere Details geben einfach dasselbe auf unterschiedliche Weise wieder. Zum Beispiel sind „Mindestens erhalten“ und „Slippage“ zwei Seiten derselben Medaille. Wenn Sie die Slippage auf 1 % eingestellt haben, dann ist das Minimum, das Sie erwarten können zu erhalten = erwartete Ausgabe - 1 %. Einige UIs zeigen den erwarteten Betrag, den Mindestbetrag und die Slippage an… Was nützlich, aber möglicherweise übertrieben ist. + +Die meisten Benutzer werden ohnehin die Standard-Slippage beibehalten. + +Die „Preisauswirkung“ wird oft in Klammern neben dem Fiat-Gegenwert im „An“-Feld angezeigt. Dies ist ein großartiges UX-Detail, das man hinzufügen kann, aber wenn es hier angezeigt wird, muss es dann wirklich unten noch einmal angezeigt werden? Und dann noch einmal auf einem Vorschaubildschirm? + +Viele Benutzer (insbesondere diejenigen, die kleine Beträge tauschen) werden sich nicht um diese Details kümmern; sie werden einfach eine Zahl eingeben und auf Tauschen klicken. + +![Einige Details zeigen dasselbe](./5.png) + +Welche Details genau angezeigt werden, hängt von Ihrer Zielgruppe ab und davon, welches Gefühl die App vermitteln soll. + +Wenn Sie die Slippage-Toleranz in den Detailbereich aufnehmen, sollten Sie sie auch direkt von hier aus bearbeitbar machen. Dies ist ein gutes Beispiel für einen „Beschleuniger“; ein raffinierter UX-Trick, der die Abläufe erfahrener Benutzer beschleunigen kann, ohne die allgemeine Benutzerfreundlichkeit der App zu beeinträchtigen. + +![Slippage kann über den Detailbereich gesteuert werden](./6.png) + +Es ist eine gute Idee, nicht nur über eine bestimmte Information auf einem Bildschirm sorgfältig nachzudenken, sondern über den gesamten Ablauf: +Eingabe von Zahlen im Hauptformular → Scannen der Details → Klicken auf den Vorschaubildschirm (falls Sie einen Vorschaubildschirm haben). +Sollte der Detailbereich jederzeit sichtbar sein, oder muss der Benutzer darauf klicken, um ihn zu erweitern? +Sollten Sie Reibung erzeugen, indem Sie einen Vorschaubildschirm hinzufügen? Dies zwingt den Benutzer, langsamer zu werden und seinen Handel zu überdenken, was nützlich sein kann. Aber wollen sie all die gleichen Informationen noch einmal sehen? Was ist an diesem Punkt für sie am nützlichsten? + +## Designoptionen {#design-options} + +Wie bereits erwähnt, hängt vieles davon von Ihrem persönlichen Stil ab. +Wer ist Ihr Benutzer? +Was ist Ihre Marke? +Möchten Sie eine „Pro“-Benutzeroberfläche, die jedes Detail zeigt, oder möchten Sie minimalistisch sein? +Selbst wenn Sie auf die professionellen Benutzer abzielen, die alle möglichen Informationen wünschen, sollten Sie sich an Alan Coopers weise Worte erinnern: + +> Egal wie schön, egal wie cool Ihre Benutzeroberfläche ist, es wäre besser, wenn es weniger davon gäbe. + +### Struktur {#structure} + +- Token auf der linken Seite oder Token auf der rechten Seite +- 2 Reihen oder 3 +- Details über oder unter der Schaltfläche +- Details erweitert, minimiert oder nicht angezeigt + +### Komponentenstil {#component-style} + +- leer (empty) +- umrandet (outlined) +- gefüllt (filled) + +Aus reiner UX-Sicht spielt der UI-Stil eine geringere Rolle, als Sie denken. Visuelle Trends kommen und gehen in Zyklen, und viele Vorlieben sind subjektiv. + +Der einfachste Weg, ein Gefühl dafür zu bekommen – und über die verschiedenen Konfigurationen nachzudenken – ist, sich einige Beispiele anzusehen und dann selbst etwas zu experimentieren. + +Das enthaltene Figma-Kit enthält leere, umrandete und gefüllte Komponenten. + +Sehen Sie sich die folgenden Beispiele an, um verschiedene Möglichkeiten zu sehen, wie Sie alles zusammensetzen können: + +![3 Reihen in einem gefüllten Stil](./7.png) + +![3 Reihen in einem umrandeten Stil](./8.png) + +![2 Reihen in einem leeren Stil](./9.png) + +![3 Reihen in einem umrandeten Stil, mit einem Detailbereich](./10.png) + +![3 Reihen mit der Eingabereihe in einem umrandeten Stil](./11.png) + +![2 Reihen in einem gefüllten Stil](./12.png) + +## Aber auf welche Seite sollte der Token kommen? {#but-which-side-should-the-token-go-on} + +Unter dem Strich macht es wahrscheinlich keinen großen Unterschied für die Benutzerfreundlichkeit. Es gibt jedoch ein paar Dinge zu beachten, die Sie in die eine oder andere Richtung beeinflussen könnten. + +Es war leicht interessant zu beobachten, wie sich die Mode mit der Zeit ändert. Uniswap hatte den Token anfangs auf der linken Seite, hat ihn aber inzwischen nach rechts verschoben. Sushiswap hat diese Änderung ebenfalls während eines Design-Upgrades vorgenommen. Die meisten, aber nicht alle Protokolle sind diesem Beispiel gefolgt. + +Die finanzielle Konvention setzt das Währungssymbol traditionell vor die Zahl, z. B. $50, €50, £50, aber wir *sagen* 50 Dollar, 50 Euro, 50 Pfund. + +Für den allgemeinen Benutzer – insbesondere für jemanden, der von links nach rechts und von oben nach unten liest – fühlt sich der Token auf der rechten Seite wahrscheinlich natürlicher an. + +![Eine UI mit Token auf der linken Seite](./13.png) + +Den Token auf die linke Seite und alle Zahlen auf die rechte Seite zu setzen, sieht angenehm symmetrisch aus, was ein Pluspunkt ist, aber es gibt einen weiteren Nachteil bei diesem Layout. + +Das Gesetz der Nähe besagt, dass Elemente, die nahe beieinander liegen, als zusammengehörig wahrgenommen werden. Dementsprechend möchten wir zusammengehörige Elemente nebeneinander platzieren. Das Token-Guthaben steht in direktem Zusammenhang mit dem Token selbst und ändert sich, wenn ein neuer Token ausgewählt wird. Es macht daher etwas mehr Sinn, dass sich das Token-Guthaben neben der Token-Auswahlschaltfläche befindet. Es könnte unter den Token verschoben werden, aber das bricht die Symmetrie des Layouts. + +Letztendlich gibt es für beide Optionen Vor- und Nachteile, aber es ist interessant, wie der Trend anscheinend zum Token auf der rechten Seite geht. + +## Verhalten der Schaltfläche {#button-behavior} + +Haben Sie keine separate Schaltfläche für das Genehmigen (Approve). Verlangen Sie auch keinen separaten Klick für das Genehmigen. Der Benutzer möchte tauschen, also schreiben Sie einfach „Tauschen“ auf die Schaltfläche und leiten Sie die Genehmigung als ersten Schritt ein. Ein Modal kann den Fortschritt mit einem Stepper oder einer einfachen Benachrichtigung „Tx 1 von 2 - Genehmigung läuft“ anzeigen. + +![Eine UI mit separaten Schaltflächen für Genehmigen und Tauschen](./14.png) + +![Eine UI mit einer Schaltfläche, auf der Genehmigen steht](./15.png) + +### Schaltfläche als kontextbezogene Hilfe {#button-as-contextual-help} + +Die Schaltfläche kann eine Doppelfunktion als Warnung erfüllen! + +Dies ist eigentlich ein ziemlich ungewöhnliches Designmuster außerhalb von Web3, ist aber innerhalb davon zum Standard geworden. Dies ist eine gute Innovation, da sie Platz spart und die Aufmerksamkeit fokussiert hält. + +Wenn die Hauptaktion – TAUSCHEN – aufgrund eines Fehlers nicht verfügbar ist, kann der Grund dafür mit der Schaltfläche erklärt werden, z. B.: + +- Netzwerk wechseln +- Wallet verbinden +- verschiedene Fehler + +Die Schaltfläche kann auch **der Aktion zugeordnet** werden, die ausgeführt werden muss. Wenn der Benutzer beispielsweise nicht tauschen kann, weil er sich im falschen Netzwerk befindet, sollte auf der Schaltfläche „Zu Ethereum wechseln“ stehen, und wenn der Benutzer auf die Schaltfläche klickt, sollte das Netzwerk zu Ethereum gewechselt werden. Dies beschleunigt den Benutzerfluss erheblich. + +![Wichtige Aktionen, die vom Haupt-CTA initiiert werden](./16.png) + +![Fehlermeldung, die innerhalb des Haupt-CTAs angezeigt wird](./17.png) + +## Bauen Sie Ihre eigene mit dieser Figma-Datei {#build-your-own-with-this-figma-file} + +Dank der harten Arbeit mehrerer Protokolle hat sich das DEX-Design stark verbessert. Wir wissen, welche Informationen der Benutzer benötigt, wie wir sie anzeigen sollten und wie wir den Ablauf so reibungslos wie möglich gestalten können. +Hoffentlich bietet dieser Artikel einen soliden Überblick über die UX-Prinzipien. + +Wenn Sie experimentieren möchten, können Sie gerne das Figma-Wireframe-Kit verwenden. Es ist so einfach wie möglich gehalten, bietet aber genug Flexibilität, um die Grundstruktur auf verschiedene Weise aufzubauen. + +[Figma-Wireframe-Kit](https://www.figma.com/community/file/1393606680816807382/dex-wireframes-kit) + +DeFi wird sich weiterentwickeln, und es gibt immer Raum für Verbesserungen. + +Viel Glück! \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md b/public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md new file mode 100644 index 00000000000..0886cd2a9d6 --- /dev/null +++ b/public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md @@ -0,0 +1,131 @@ +--- +title: "7 Heuristiken für das Design von Web3-Benutzeroberflächen" +description: Prinzipien zur Verbesserung der Benutzerfreundlichkeit von Web3 +lang: de +--- + +Usability-Heuristiken sind allgemeine „Faustregeln“, mit denen Sie die Benutzerfreundlichkeit Ihrer Website messen können. +Die 7 hier vorgestellten Heuristiken sind speziell auf Web3 zugeschnitten und sollten zusammen mit Jakob Nielsens [10 allgemeinen Prinzipien für Interaktionsdesign](https://www.nngroup.com/articles/ten-usability-heuristics/) verwendet werden. + +## Sieben Usability-Heuristiken für Web3 {#seven-usability-heuristics-for-web3} + +1. Feedback folgt auf Aktion +2. Sicherheit und Vertrauen +3. Die wichtigsten Informationen sind offensichtlich +4. Verständliche Terminologie +5. Aktionen sind so kurz wie möglich +6. Netzwerkverbindungen sind sichtbar und flexibel +7. Steuerung über die App, nicht über das Wallet + +## Definitionen und Beispiele {#definitions-and-examples} + +### 1. Feedback folgt auf Aktion {#feedback-follows-action} + +**Es sollte offensichtlich sein, wenn etwas passiert ist oder gerade passiert.** + +Benutzer entscheiden über ihre nächsten Schritte basierend auf dem Ergebnis ihrer vorherigen Schritte. Daher ist es unerlässlich, dass sie über den Systemstatus informiert bleiben. Dies ist im Web3 besonders wichtig, da Transaktionen manchmal eine kurze Zeit benötigen, um in die Blockchain geschrieben zu werden. Wenn es kein Feedback gibt, das sie zum Warten auffordert, sind sich die Benutzer unsicher, ob überhaupt etwas passiert ist. + +**Tipps:** +- Informieren Sie den Benutzer über Nachrichten, Benachrichtigungen und andere Warnungen. +- Kommunizieren Sie Wartezeiten klar. +- Wenn eine Aktion länger als ein paar Sekunden dauert, beruhigen Sie den Benutzer mit einem Timer oder einer Animation, um ihm das Gefühl zu geben, dass etwas passiert. +- Wenn ein Prozess aus mehreren Schritten besteht, zeigen Sie jeden Schritt an. + +**Beispiel:** +Das Anzeigen jedes Schritts einer Transaktion hilft den Benutzern zu wissen, wo sie sich im Prozess befinden. Entsprechende Symbole informieren den Benutzer über den Status seiner Aktionen. + +![Information des Benutzers über jeden Schritt beim Tauschen von Token](./Image1.png) + +### 2. Sicherheit und Vertrauen sind fest integriert {#security-and-trust-are-backed-in} + +Sicherheit sollte priorisiert und für den Benutzer hervorgehoben werden. +Menschen legen großen Wert auf ihre Daten. Sicherheit ist oft ein Hauptanliegen der Benutzer, daher sollte sie auf allen Ebenen des Designs berücksichtigt werden. Sie sollten immer bestrebt sein, das Vertrauen Ihrer Benutzer zu gewinnen, aber die Art und Weise, wie Sie dies tun, kann bei verschiedenen Apps Unterschiedliches bedeuten. Es sollte kein nachträglicher Einfall sein, sondern durchgehend bewusst gestaltet werden. Bauen Sie Vertrauen während der gesamten Benutzererfahrung auf, einschließlich sozialer Kanäle und Dokumentation sowie der endgültigen Benutzeroberfläche. Dinge wie der Grad der Dezentralisierung, der Mehrfachsignatur-Status (Multi-Sig) der Treasury und ob das Team öffentlich bekannt (doxxed) ist, beeinflussen das Vertrauen der Benutzer. + +**Tipps:** +- Listen Sie Ihre Audits stolz auf +- Lassen Sie mehrere Audits durchführen +- Bewerben Sie alle von Ihnen entworfenen Sicherheitsfunktionen +- Heben Sie mögliche Risiken hervor, einschließlich zugrunde liegender Integrationen +- Kommunizieren Sie die Komplexität von Strategien +- Berücksichtigen Sie Probleme außerhalb der Benutzeroberfläche, die die Sicherheitswahrnehmung Ihrer Benutzer beeinträchtigen könnten + +**Beispiel:** +Fügen Sie Ihre Audits in einer gut sichtbaren Größe in die Fußzeile ein. + +![Audits, auf die in der Fußzeile der Website verwiesen wird](./Image2.png) + +### 3. Die wichtigsten Informationen sind offensichtlich {#the-most-important-info-is-obvious} + +Zeigen Sie bei komplexen Systemen nur die relevantesten Daten an. Bestimmen Sie, was am wichtigsten ist, und priorisieren Sie dessen Anzeige. +Zu viele Informationen sind überwältigend und Benutzer orientieren sich bei Entscheidungen typischerweise an einer einzigen Information. Im DeFi-Bereich wird dies wahrscheinlich der effektive Jahreszins (APR) bei Rendite-Apps und der Beleihungsauslauf (LTV) bei Kredit-Apps sein. + +**Tipps:** +- Benutzerforschung wird die wichtigste Metrik aufdecken +- Machen Sie die wichtigsten Informationen groß und die anderen Details klein und unauffällig +- Menschen lesen nicht, sie überfliegen; stellen Sie sicher, dass Ihr Design leicht zu überfliegen ist + +**Beispiel:** Große Token in voller Farbe sind beim Überfliegen leicht zu finden. Der effektive Jahreszins (APR) ist groß und in einer Akzentfarbe hervorgehoben. + +![Der Token und der effektive Jahreszins (APR) sind leicht zu finden](./Image3.png) + +### 4. Klare Terminologie {#clear-terminology} + +Die Terminologie sollte verständlich und angemessen sein. +Fachjargon kann ein riesiges Hindernis sein, da er den Aufbau eines völlig neuen mentalen Modells erfordert. Benutzer können das Design nicht mit Wörtern, Phrasen und Konzepten in Verbindung bringen, die sie bereits kennen. Alles erscheint verwirrend und ungewohnt, und es gibt eine steile Lernkurve, bevor sie überhaupt versuchen können, es zu nutzen. Ein Benutzer nähert sich DeFi vielleicht mit dem Wunsch, etwas Geld zu sparen, und was er findet, ist: Mining, Farming, Staking, Emissionen, Bribes, Vaults, Lockers, veTokens, Vesting, Epochen, dezentralisierte Algorithmen, protokolleigene Liquidität... +Versuchen Sie, einfache Begriffe zu verwenden, die von der breitesten Personengruppe verstanden werden. Erfinden Sie keine brandneuen Begriffe nur für Ihr Projekt. + +**Tipps:** +- Verwenden Sie eine einfache und konsistente Terminologie +- Verwenden Sie so weit wie möglich die bestehende Sprache +- Denken Sie sich keine eigenen Begriffe aus +- Befolgen Sie Konventionen, sobald sie auftauchen +- Klären Sie die Benutzer so gut wie möglich auf + +**Beispiel:** +„Ihre Belohnungen“ ist ein allgemein verständlicher, neutraler Begriff; kein neues Wort, das für dieses Projekt erfunden wurde. Die Belohnungen sind in USD angegeben, um den mentalen Modellen der realen Welt zu entsprechen, auch wenn die Belohnungen selbst in einem anderen Token erfolgen. + +![Token-Belohnungen, angezeigt in US-Dollar](./Image4.png) + +### 5. Aktionen sind so kurz wie möglich {#actions-are-as-short-as-possible} + +Beschleunigen Sie die Interaktionen des Benutzers durch die Gruppierung von Teilaktionen. +Dies kann sowohl auf der Ebene des Smart Contracts als auch auf der Benutzeroberfläche erfolgen. Der Benutzer sollte nicht von einem Teil des Systems zu einem anderen wechseln – oder das System ganz verlassen – müssen, um eine häufige Aktion abzuschließen. + +**Tipps:** +- Kombinieren Sie „Genehmigen“ (Approve) nach Möglichkeit mit anderen Aktionen +- Bündeln Sie Signaturschritte so nah wie möglich beieinander + +**Beispiel:** Die Kombination von „Liquidität hinzufügen“ und „Staking“ ist ein einfaches Beispiel für einen Beschleuniger, der dem Benutzer sowohl Zeit als auch Gas spart. + +![Modal, das einen Schalter zur Kombination der Einzahlungs- und Staking-Aktionen zeigt](./Image5.png) + +### 6. Netzwerkverbindungen sind sichtbar und flexibel {#network-connections-are-visible-and-flexible} + +Informieren Sie den Benutzer darüber, mit welchem Netzwerk er verbunden ist, und stellen Sie klare Verknüpfungen zum Wechseln des Netzwerks bereit. +Dies ist besonders bei Multichain-Apps wichtig. Die Hauptfunktionen der App sollten auch dann sichtbar sein, wenn die Verbindung getrennt ist oder eine Verbindung zu einem nicht unterstützten Netzwerk besteht. + +**Tipps:** +- Zeigen Sie so viel wie möglich von der App an, während die Verbindung getrennt ist +- Zeigen Sie an, mit welchem Netzwerk der Benutzer derzeit verbunden ist +- Zwingen Sie den Benutzer nicht, zum Wallet zu gehen, um das Netzwerk zu wechseln +- Wenn die App erfordert, dass der Benutzer das Netzwerk wechselt, fordern Sie die Aktion über den primären Call-to-Action an +- Wenn die App Märkte oder Vaults für mehrere Netzwerke enthält, geben Sie klar an, welches Set der Benutzer gerade betrachtet + +**Beispiel:** Zeigen Sie dem Benutzer in der App-Leiste an, mit welchem Netzwerk er verbunden ist, und ermöglichen Sie ihm, es zu ändern. + +![Dropdown-Schaltfläche, die das verbundene Netzwerk anzeigt](./Image6.png) + +### 7. Steuerung über die App, nicht über das Wallet {#control-from-the-app-not-the-wallet} + +Die Benutzeroberfläche sollte dem Benutzer alles mitteilen, was er wissen muss, und ihm die Kontrolle über alles geben, was er tun muss. +Im Web3 gibt es Aktionen, die Sie in der Benutzeroberfläche ausführen, und Aktionen, die Sie im Wallet ausführen. Im Allgemeinen initiieren Sie eine Aktion in der Benutzeroberfläche und bestätigen sie dann im Wallet. Benutzer können sich unwohl fühlen, wenn diese beiden Stränge nicht sorgfältig integriert sind. + +**Tipps:** +- Kommunizieren Sie den Systemstatus über Feedback in der Benutzeroberfläche +- Führen Sie eine Aufzeichnung ihrer Historie +- Stellen Sie Links zu Blocksuchmaschinen für alte Transaktionen bereit +- Stellen Sie Verknüpfungen zum Wechseln von Netzwerken bereit. + +**Beispiel:** Ein dezenter Container zeigt dem Benutzer, welche relevanten Token er in seinem Wallet hat, und der Haupt-CTA bietet eine Verknüpfung zum Wechseln des Netzwerks. + +![Der Haupt-CTA fordert den Benutzer auf, das Netzwerk zu wechseln](./Image7.png) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/design-and-ux/index.md b/public/content/translations/de/developers/docs/design-and-ux/index.md new file mode 100644 index 00000000000..85c37f0a2e1 --- /dev/null +++ b/public/content/translations/de/developers/docs/design-and-ux/index.md @@ -0,0 +1,87 @@ +--- +title: Design und UX im Web3 +description: "Einführung in UX-Design und -Forschung im Web3-Bereich und bei Ethereum" +lang: de +--- + +Sind Sie neu im Bereich Design mit Ethereum? Dann sind Sie hier genau richtig. Die Ethereum-Community hat Ressourcen zusammengestellt, um Sie in die Grundlagen von Web3-Design und -Forschung einzuführen. Sie werden Kernkonzepte kennenlernen, die sich möglicherweise von anderen App-Designs unterscheiden, mit denen Sie vertraut sind. + +Benötigen Sie zunächst ein grundlegenderes Verständnis von Web3? Besuchen Sie den [**Lern-Hub**](/learn/). + +## Beginnen Sie mit der Nutzerforschung {#start-with-user-research} + +Effektives Design geht über die Erstellung visuell ansprechender Benutzeroberflächen hinaus. Es beinhaltet ein tiefes Verständnis der Bedürfnisse, Ziele und treibenden Faktoren der Nutzer. Daher empfehlen wir dringend, dass alle Designer einen Designprozess anwenden, wie zum Beispiel den [**Double-Diamond-Prozess**](), um sicherzustellen, dass ihre Arbeit bewusst und zielgerichtet ist. + +- [Web3 needs more UX Researchers and Designers](https://blog.akasha.org/akasha-conversations-9-web3-needs-more-ux-researchers-and-designers) – Ein Überblick über den aktuellen Reifegrad des Designs +- [A simple guide to UX Research in web3](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) – Eine einfache Anleitung zur Durchführung von Forschung +- [How to Approach UX Decisions in Web3](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) – Ein kurzer Überblick über quantitative und qualitative Forschung und die Unterschiede zwischen beiden (Video, 6 Min.) +- [Being a ux researcher in web3](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) – Eine persönliche Sicht darauf, wie es ist, ein UX-Forscher im Web3 zu sein + +## Forschungsstudien im Web3 {#research-in-web3} + +Dies ist eine kuratierte Liste von Nutzerforschungen im Web3, die bei Design- und Produktentscheidungen helfen oder als Inspiration für die Durchführung einer eigenen Studie dienen können. + +| Schwerpunkt | Name | +| :------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Krypto-Onboarding | [The Reown Pulse 2024: Crypto Consumer Sentiment & Usage](https://reown.com/blog/unveiling-walletconnects-consumer-crypto-report) | +| Krypto-Onboarding | [CRADL: UX in Cryptocurrency](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) | +| Krypto-Onboarding | [CRADL: Onboarding to Cryptocurrency](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) | +| Krypto-Onboarding | [Bitcoin UX report](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) | +| Krypto-Onboarding | [ConSensys: The State of Web3 perception around the world 2023](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) | +| Krypto-Onboarding | [NEAR: Accelerating the journey towards adoption](https://drive.google.com/file/d/1VuaQP4QSaQxR5ddQKTMGI0b0rWdP7uGn/view) | +| Staking | [OpenUX: Rocket Pool Node Operator UX](https://storage.googleapis.com/rocketpool/RocketPool-NodeOperator-UX-Report-Jan-2024.pdf) | +| Staking | [Staking: Key trends, takeaways, and predictions - Eth Staker](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) | +| Staking | [Multi App Staking]() | +| DAO | [2022 DAO Research Update: What do DAO Builders Need?](https://blog.aragon.org/2022-dao-research-update/) | +| DeFi | [Coverage pools](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) | +| DeFi | [ConSensys: DeFi User Research Report 2022](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) | +| Metaverse | [Metaverse: User Research Report](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) | +| Metaverse | [Going on Safari: Researching Users in the Metaverse](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (Video, 27 Min.) | + +## Design für Web3 {#design-for-web3} + +- [Web3 Design Playbook](https://learnweb3.design/) – Eine umfassende Sammlung von Frameworks und Notizen zu Web3-UX-Prinzipien, DeFi-Mustern, Governance-Design, Wallet-UX und Denken auf Protokollebene für Designer und Gründer +- [Web3 UX Design Handbook](https://web3ux.design/) – Ein praktischer Leitfaden zur Gestaltung von Web3-Apps +- [Web3 Design Principles](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) – Ein Framework von UX-Regeln für Blockchain-basierte Dapps +- [Blockchain Design Principles](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) – Erkenntnisse des Blockchain-Designteams bei IBM +- [Neueux.com](https://neueux.com/apps) – UI-Bibliothek von Nutzerabläufen mit vielfältigen Filteroptionen +- [Web3's Usability Crisis: What You NEED to Know!](https://www.youtube.com/watch?v=oBSXT_6YDzg) – Eine Podiumsdiskussion über die Fallstricke der entwicklerfokussierten Projektentwicklung (Video, 34 Min.) + +## Erste Schritte {#getting-started} + +- [Heuristics for Web3](/developers/docs/design-and-ux/heuristics-for-web3/) – 7 Heuristiken für das Web3-Schnittstellendesign +- [DEX Design Best Practices](/developers/docs/design-and-ux/dex-design-best-practice/) – Ein Leitfaden zur Gestaltung dezentralisierter Börsen + +## Web3-Design-Fallstudien {#design-case-studies} + +- [Deep Work Studio](https://www.deepwork.studio/case-studies) +- [Selling an NFT on OpenSea](https://builtformars.com/case-studies/opensea) +- [Wallet UX teardown how wallets need to change](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (Video, 20 Min.) + +## Design-Bounties {#bounties} + +- [Dework](https://app.dework.xyz/bounties) +- [Buildbox hackathons](https://app.buidlbox.io/) +- [ETHGlobal hackathons](https://ethglobal.com/) + +## Design-DAOs und -Communitys {#design-daos-and-communities} + +Engagieren Sie sich in professionellen, von der Community getragenen Organisationen oder treten Sie Designgruppen bei, um design- und forschungsbezogene Themen und Trends mit anderen Mitgliedern zu diskutieren. + +- [Vectordao.com](https://vectordao.com/) +- [Deepwork.studio](https://www.deepwork.studio/) +- [We3.co](https://we3.co/) +- [Openux.xyz](https://openux.xyz/) + +## Designsysteme und andere Designressourcen {#design-systems-and-resources} + +- [Optimism Design](https://www.figma.com/@optimism) (Figma) +- [Ethereum.org Design system](https://www.figma.com/@ethdotorg) (Figma) +- [Finity, a design system by Polygon](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma) +- [Kleros Design System](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma) +- [Safe Design System](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma) +- [ENS Design system](https://thorin.ens.domains/) +- [Mirror Design System](https://degen-xyz.vercel.app/) + +**Die auf dieser Seite aufgeführten Artikel und Projekte stellen keine offiziellen Empfehlungen dar** und dienen lediglich zu Informationszwecken. +Wir fügen Links zu dieser Seite basierend auf den Kriterien in unserer [Auflistungsrichtlinie](/contributing/design/adding-design-resources) hinzu. Wenn Sie möchten, dass wir ein Projekt/einen Artikel hinzufügen, bearbeiten Sie diese Seite auf [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/public/content/developers/docs/design-and-ux/index.md). \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/development-networks/index.md b/public/content/translations/de/developers/docs/development-networks/index.md index a651178cd46..1afd9a7e905 100644 --- a/public/content/translations/de/developers/docs/development-networks/index.md +++ b/public/content/translations/de/developers/docs/development-networks/index.md @@ -1,73 +1,75 @@ --- title: Entwicklungsnetzwerke -description: Eine Übersicht über Entwicklungsnetzwerke und die zur Erstellung von Ethereum-Anwendungen verfügbaren Tools +description: "Eine Übersicht über Entwicklungsnetzwerke und die verfügbaren Tools zur Unterstützung bei der Erstellung von Ethereum-Anwendungen." lang: de --- -Wenn Sie eine Ethereum-Anwendung mit Smart Contracts erstellen, möchten Sie sie vermutlich in einem lokalen Netzwerk ausführen, um die Funktionsweise vor der Bereitstellung zu prüfen. +Wenn Sie eine [Ethereum](/)-Anwendung mit Smart Contracts erstellen, sollten Sie diese in einem lokalen Netzwerk ausführen, um zu sehen, wie sie funktioniert, bevor Sie sie bereitstellen. -So, wie Sie einen lokalen Server auf Ihrem Computer für die Webentwicklung laufen lassen können, können Sie über ein Entwicklungsnetzwerk eine lokale Blockchain-Instanz für den Test Ihrer dApp erstellen. Diese Ethereum-Entwicklungsnetze bieten Funktionen, die eine wesentlich schnellere Iteration ermöglichen als ein öffentliches Testnetz (zum Beispiel müssen Sie sich nicht mit dem Erwerb von ETH von einem Testnet-Faucet beschäftigen). +Ähnlich wie Sie für die Webentwicklung einen lokalen Server auf Ihrem Computer ausführen, können Sie ein Entwicklungsnetzwerk verwenden, um eine lokale Blockchain-Instanz zum Testen Ihrer Dapp zu erstellen. Diese Ethereum-Entwicklungsnetzwerke bieten Funktionen, die eine viel schnellere Iteration ermöglichen als ein öffentliches Testnet (zum Beispiel müssen Sie sich nicht darum kümmern, ETH von einem Testnet-Faucet zu erhalten). ## Voraussetzungen {#prerequisites} -Sie sollten mit den [Grundlagen des Ethereum-Stacks](/developers/docs/ethereum-stack/) und den [Ethereum-Netzwerken](/developers/docs/networks/) vertraut sein, bevor Sie sich mit Entwicklungsnetzwerken beschäftigen. +Sie sollten die [Grundlagen des Ethereum-Stacks](/developers/docs/ethereum-stack/) und der [Ethereum-Netzwerke](/developers/docs/networks/) verstehen, bevor Sie sich mit Entwicklungsnetzwerken befassen. ## Was ist ein Entwicklungsnetzwerk? {#what-is-a-development-network} -Entwicklungsnetzwerke sind im Wesentlichen Ethereum-Kunden (Implementierungen von Ethereum), die speziell für die lokale Entwicklung konzipiert wurden. +Entwicklungsnetzwerke sind im Wesentlichen Ethereum-Clients (Implementierungen von Ethereum), die speziell für die lokale Entwicklung konzipiert sind. -**Warum nicht einfach einen Ethereum-Knoten lokal betreiben?** +**Warum nicht einfach einen Standard-Ethereum-Blockchain-Knoten lokal ausführen?** -Sie _könnten_ [einen Knoten betreiben](/developers/docs/nodes-and-clients/#running-your-own-node), da jedoch Entwicklungsnetzwerke speziell für die Entwicklung erstellt werden, sind sie oft mit praktischen Funktionen ausgestattet wie: +Sie _könnten_ [einen Blockchain-Knoten ausführen](/developers/docs/nodes-and-clients/#running-your-own-node), aber da Entwicklungsnetzwerke speziell für die Entwicklung entwickelt wurden, sind sie oft mit praktischen Funktionen ausgestattet, wie: -- Seeding deterministisch mit Daten für die lokale Blockchain durchführen (z. B. Konten mit ETH-Guthaben) -- Sofortige Erzeugung von Blöcken mit jeder empfangenen Transaktion, in der richtigen Reihenfolge und ohne Verzögerung -- Verbesserte Debugging- und Protokollierungsfunktionen +- Deterministisches Befüllen Ihrer lokalen Blockchain mit Daten (z. B. Konten mit ETH-Guthaben) +- Sofortiges Produzieren von Blöcken mit jeder empfangenen Transaktion, in der richtigen Reihenfolge und ohne Verzögerung +- Erweiterte Debugging- und Protokollierungsfunktionen ## Verfügbare Tools {#available-projects} -**Hinweis**: Die meisten [Entwicklerframeworks](/developers/docs/frameworks/) enthalten ein integriertes Entwicklungsnetzwerk. Wir empfehlen Ihnen, mit einem Framework für die Einrichtung [Ihrer lokalen Entwicklungsumgebung](/developers/local-environment/) zu beginnen. +**Hinweis**: Die meisten [Entwicklungs-Frameworks](/developers/docs/frameworks/) enthalten ein integriertes Entwicklungsnetzwerk. Wir empfehlen, mit einem Framework zu beginnen, um [Ihre lokale Entwicklungsumgebung einzurichten](/developers/local-environment/). ### Hardhat Network {#hardhat-network} -Ein lokales Ethereum-Netzwerk, das für die Entwicklung konzipiert ist. Die können darin Ihre Contracts bereitstellen, Tests durchführen und Ihren Code debuggen. +Ein lokales Ethereum-Netzwerk, das für die Entwicklung konzipiert ist. Es ermöglicht Ihnen, Ihre Verträge bereitzustellen, Ihre Tests auszuführen und Ihren Code zu debuggen. -Hardhat Network beinhaltet Hardhat, eine Ethereum-Entwicklungsumgebung für Profis. +Hardhat Network ist in Hardhat integriert, einer Ethereum-Entwicklungsumgebung für Profis. - [Website](https://hardhat.org/) -- [GitHub](https://github.com/nomiclabs/hardhat) +- [GitHub](https://github.com/NomicFoundation/hardhat) ### Lokale Beacon Chains {#local-beacon-chains} -Einige Konsensclients verfügen über integrierte Tools, um lokale Beacon Chains zu Testzwecken zu erstellen. Anleitungen für Lighthouse, Nimbus und Lodestar sind verfügbar: +Einige Konsens-Clients verfügen über integrierte Tools zum Starten lokaler Beacon Chains zu Testzwecken. Anleitungen für Lighthouse, Nimbus und Lodestar sind verfügbar: -- [Lokales Testnetz unter Verwendung von Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) -- [Lokales Testnetz unter Verwendung von Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) +- [Lokales Testnet mit Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) +- [Lokales Testnet mit Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) -### Öffentliche Ethereum Test-Chains {#public-beacon-testchains} +### Öffentliche Ethereum-Test-Chains {#public-beacon-testchains} -Es gibt auch zwei öffentliche Testimplementierungen von Ethereum: Sepolia und Hoodi. Sepolia ist das empfohlene Standard-Testnetz für die Anwendungsentwicklung, mit einem geschlossenen Validatorsatz für schnelle Synchronisation. Hoodi ist ein Testnetz für Validierung und Staking, das einen offenen Validatorsatz verwendet und es potenziell jedem ermöglicht, zu validieren. +Es gibt auch zwei gepflegte öffentliche Testimplementierungen von Ethereum: Sepolia und Hoodi. Das empfohlene Testnet mit langfristiger Unterstützung ist Hoodi, auf dem jeder frei validieren kann. Sepolia verwendet ein zugangsbeschränktes Validator-Set, was bedeutet, dass es keinen allgemeinen Zugang für neue Validatoren in diesem Testnet gibt. -- [Hoodi Staking Launchpad](https://hoodi.launchpad.ethereum.org/en/) -- [Sepolia Website](https://sepolia.dev/) -- [Hoodi Website](https://hoodi.ethpandaops.io/) +- [Hoodi Staking Launchpad](https://hoodi.launchpad.ethereum.org/) -### Kurtosis Ethereum-Paket {#kurtosis} +### Kurtosis Ethereum Package {#kurtosis} -Kurtosis ist ein Build-System für Multi-Container-Testumgebungen, das es Entwicklern ermöglicht, lokal reproduzierbare Instanzen von Blockchain-Netzwerken zu erstellen. +Kurtosis ist ein Build-System für Multi-Container-Testumgebungen, das es Entwicklern ermöglicht, lokal reproduzierbare Instanzen von Blockchain-Netzwerken zu starten. -Das Ethereum-Kurtosis-Paket kann verwendet werden, um schnell ein parameterisierbares, hochskalierbares und privates Ethereum-Testnetz über Docker oder Kubernetes einzurichten. Das Paket unterstützt alle wichtigen Clients der Ausführungs- und Konsensebene. Kurtosis verwaltet gekonnt alle lokalen Portzuweisungen und Dienstverbindungen für ein repräsentatives Netzwerk, das in Validierungs- und Test-Workflows im Zusammenhang mit der Ethereum-Kerninfrastruktur verwendet wird. +Das Ethereum-Kurtosis-Paket kann verwendet werden, um schnell ein parametrisierbares, hochskalierbares und privates Ethereum-Testnet über Docker oder Kubernetes zu instanziieren. Das Paket unterstützt alle wichtigen Ausführungsebene- (EL) und Konsensebene- (CL) Clients. Kurtosis verarbeitet elegant alle lokalen Port-Zuweisungen und Dienstverbindungen für ein repräsentatives Netzwerk, das in Validierungs- und Test-Workflows im Zusammenhang mit der Ethereum-Kerninfrastruktur verwendet werden soll. -- [Ethereum Netzwerk-Paket](https://github.com/kurtosis-tech/ethereum-package) +- [Ethereum-Netzwerkpaket](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) - [GitHub](https://github.com/kurtosis-tech/kurtosis) - [Dokumentation](https://docs.kurtosis.com/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -- [Eine lokale Entwicklungsumgebung einrichten](/developers/local-environment/) +- [Einrichten einer lokalen Entwicklungsumgebung](/developers/local-environment/) + +## Tutorials: Entwicklungsnetzwerke & Testumgebungen auf Ethereum {#tutorials} + +- [Entwickeln und Testen von Dapps mit einem lokalen Multi-Client-Ethereum-Testnet](/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/) _– Wie man ein lokales Multi-Client-Ethereum-Testnet mit Kurtosis für die Entwicklung und das Testen von Dapps startet._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/ethereum-stack/index.md b/public/content/translations/de/developers/docs/ethereum-stack/index.md index 2d5c5a715a1..ffa425c604f 100644 --- a/public/content/translations/de/developers/docs/ethereum-stack/index.md +++ b/public/content/translations/de/developers/docs/ethereum-stack/index.md @@ -1,61 +1,61 @@ --- -title: Einführung in den Ethereum-Stack -description: Eine Vorstellung der verschiedenen Ebenen des Ethereum-Stacks und wie sie zusammen passen +title: "Einführung in den Ethereum-Stack" +description: Ein Durchgang durch die verschiedenen Ebenen des Ethereum-Stacks und wie sie zusammenpassen. lang: de --- -Wie bei jedem Software-Stack variiert der komplette "Ethereum-Stack" zielabhängig von Projekt zu Projekt. +Wie bei jedem Software-Stack variiert der komplette „Ethereum-Stack“ von Projekt zu Projekt, abhängig von Ihren Zielen. -Es gibt jedoch zentrale Komponenten von Ethereum, die dabei helfen, ein gedankliches Modell für die Interaktion von Softwareanwendungen mit der Ethereum-Blockchain bereitzustellen. Wenn Sie die Ebenen des Stacks verstehen, ist es einfacher, die unterschiedlichen Möglichkeiten für die Integration von Ethereum in Softwareprojekte zu verstehen. +Es gibt jedoch Kernkomponenten von Ethereum, die ein mentales Modell dafür liefern, wie Softwareanwendungen mit der Ethereum-Blockchain interagieren. Das Verständnis der Ebenen des Stacks wird Ihnen helfen, die verschiedenen Möglichkeiten zu verstehen, wie Ethereum in Softwareprojekte integriert werden kann. -## Ebene 1: Ethereum-Virtual Machine {#ethereum-virtual-machine} +## Ebene 1: Ethereum Virtual Machine {#ethereum-virtual-machine} -Die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) ist die Laufzeitumgebung für Smart Contracts in Ethereum. Alle Smart Contracts und Statusänderungen auf der Ethereum-Blockchain erfolgen über [Transaktionen](/developers/docs/transactions/). Die EVM übernimmt die gesamte Transaktionsabwicklung im Ethereum-Netzwerk. +Die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) ist die Laufzeitumgebung für Smart Contracts auf Ethereum. Alle Smart Contracts und Zustandsänderungen auf der Ethereum-Blockchain werden durch [Transaktionen](/developers/docs/transactions/) ausgeführt. Die EVM übernimmt die gesamte Transaktionsverarbeitung im Ethereum-Netzwerk. -Wie bei jeder virtuellen Maschine erzeugt die EVM einen Abstraktionsgrad zwischen dem ausführenden Code und der ausführenden Maschine (einem Ethereum-Node). Derzeit läuft die EVM auf Tausenden von Knoten auf der ganzen Welt. +Wie bei jeder virtuellen Maschine schafft die EVM eine Abstraktionsebene zwischen dem ausführenden Code und der ausführenden Maschine (einem Ethereum-Blockchain-Knoten). Derzeit läuft die EVM auf Tausenden von verteilten Blockchain-Knoten auf der ganzen Welt. -Unter der Haube verwendet die EVM eine Reihe von Opcode-Anweisungen, um bestimmte Aufgaben auszuführen. Diese (140 einmaligen) Opcodes erlauben es der EVM [Turing-komplett](https://en.wikipedia.org/wiki/Turing_completeness) zu sein, was bedeutet, dass die EVM in der Lage ist, fast alles zu berechnen, wenn man genügend Ressourcen hat. +Unter der Haube verwendet die EVM eine Reihe von Opcode-Anweisungen, um spezifische Aufgaben auszuführen. Diese (140 einzigartigen) Opcodes ermöglichen es der EVM, [Turing-vollständig](https://en.wikipedia.org/wiki/Turing_completeness) zu sein, was bedeutet, dass die EVM in der Lage ist, fast alles zu berechnen, sofern genügend Ressourcen vorhanden sind. -Als dApp-Entwickler müssen Sie über die EVM nicht mehr wissen, als dass sie existiert und sie alle Anwendungen auf Ethereum zuverlässig ohne Ausfallzeiten betreibt. +Als Dapp-Entwickler müssen Sie nicht viel über die EVM wissen, außer dass sie existiert und dass sie zuverlässig alle Anwendungen auf Ethereum ohne Ausfallzeiten antreibt. ## Ebene 2: Smart Contracts {#smart-contracts} [Smart Contracts](/developers/docs/smart-contracts/) sind die ausführbaren Programme, die auf der Ethereum-Blockchain laufen. -Smart Contracts werden unter Verwendung bestimmter [Programmiersprachen](/developers/docs/smart-contracts/languages/) geschrieben, die in EVM Bytecode kompiliert werden (Low-Level-Maschinenbefehle, Opcodes genannt). +Smart Contracts werden in spezifischen [Programmiersprachen](/developers/docs/smart-contracts/languages/) geschrieben, die zu EVM-Bytecode (maschinennahe Anweisungen, sogenannte Opcodes) kompiliert werden. -Smart Contracts dienen nicht nur als Open-Source-Bibliotheken, sondern sind im Wesentlichen offene API-Dienste, die rund um die Uhr laufen und nicht aufgehoben werden können. Smart Contracts stellen öffentliche Funktionen zur Verfügung, mit denen Nutzer und Anwendungen ([dApps](/developers/docs/dapps/)) interagieren können, ohne dass eine Berechtigung dafür erforderlich ist. Jede Anwendung kann sich in die bereitgestellten Smart Contracts integrieren, um Funktionen zusammenzustellen, wie z. B. das Hinzufügen von [Daten-Feeds](/developers/docs/oracles/) oder die Unterstützung von Token-Swaps. Zudem kann jeder neue Smart Contracts für Ethereum bereitstellen, um maßgeschneiderte Funktionen für die Anforderungen der eigenen Anwendung zu schaffen. +Smart Contracts dienen nicht nur als Open-Source-Bibliotheken, sie sind im Wesentlichen offene API-Dienste, die ständig laufen und nicht abgeschaltet werden können. Smart Contracts bieten öffentliche Funktionen, mit denen Benutzer und Anwendungen ([Dapps](/developers/docs/dapps/)) interagieren können, ohne eine Erlaubnis zu benötigen. Jede Anwendung kann sich in bereitgestellte Smart Contracts integrieren, um Funktionalitäten zusammenzustellen, wie z. B. das Hinzufügen von [Daten-Feeds](/developers/docs/oracles/) oder die Unterstützung beim Tauschen von Token. Darüber hinaus kann jeder neue Smart Contracts auf Ethereum bereitstellen, um benutzerdefinierte Funktionen hinzuzufügen, die den Anforderungen seiner Anwendung entsprechen. -Als dApp-Entwickler müssen Sie Smart Contracts nur dann schreiben, wenn Sie benutzerdefinierte Funktionen zur Ethereum-Blockchain hinzufügen möchten. Sie werden feststellen, dass sich die meisten oder alle Bedürfnisse Ihres Projekts durch die Integration von bestehenden Smart Contracts erfüllen lassen, zum Beispiel wenn Sie Zahlungen in Stablecoins unterstützen oder den dezentralen Austausch von Tokens ermöglichen möchten. +Als Dapp-Entwickler müssen Sie nur dann Smart Contracts schreiben, wenn Sie der Ethereum-Blockchain benutzerdefinierte Funktionen hinzufügen möchten. Möglicherweise stellen Sie fest, dass Sie die meisten oder alle Anforderungen Ihres Projekts erfüllen können, indem Sie sich einfach in bestehende Smart Contracts integrieren, beispielsweise wenn Sie Zahlungen in Stablecoins unterstützen oder eine dezentralisierte Börse für Token ermöglichen möchten. -## Ebene 3: Ethereum-Nodes {#ethereum-nodes} +## Ebene 3: Ethereum-Blockchain-Knoten {#ethereum-nodes} -Damit eine Anwendung mit der Ethereum-Blockchain interagieren kann, muss sie sich mit einem [Ethereum-Node](/developers/docs/nodes-and-clients/) verbinden. Wenn Sie sich mit einem Node verbinden, können Sie Blockchain-Daten lesen und/oder Transaktionen an das Netzwerk senden. +Damit eine Anwendung mit der Ethereum-Blockchain interagieren kann, muss sie sich mit einem [Ethereum-Blockchain-Knoten](/developers/docs/nodes-and-clients/) verbinden. Die Verbindung zu einem Blockchain-Knoten ermöglicht es Ihnen, Blockchain-Daten zu lesen und/oder Transaktionen an das Netzwerk zu senden. -Ethereum-Nodes sind Computer auf denen Software läuft – ein Ethereum-Client. Ein Client ist eine Implementierung von Ethereum, der alle Transaktionen in jedem Block prüft und das Netzwerk somit sicher und die Daten genau hält. **Ethereum-Nodes sind die Ethereum-Blockchain**. Sie speichern gemeinsam den Zustand der Ethereum-Blockchain und erreichen einen Konsens über Transaktionen, um den Blockchain-Status zu mutieren. +Ethereum-Blockchain-Knoten sind Computer, auf denen Software läuft – ein Ethereum-Client. Ein Client ist eine Implementierung von Ethereum, die alle Transaktionen in jedem Block verifiziert und so das Netzwerk sicher und die Daten korrekt hält. **Ethereum-Blockchain-Knoten sind die Ethereum-Blockchain**. Sie speichern gemeinsam den Zustand der Ethereum-Blockchain und erzielen einen Konsens über Transaktionen, um den Blockchain-Zustand zu ändern. -Indem Sie Ihre Anwendung mit einem Ethereum-Node verbinden (über die [JSON-RPC-API](/developers/docs/apis/json-rpc/)), kann Ihre Anwendung Daten aus der Blockchain lesen (z. B. Salden von Benutzerkonten) und neue Transaktionen an das Netzwerk senden (z. B. ETH-Übertragungen zwischen Benutzerkonten oder die Ausführung von Smart-Contract-Funktionen). +Indem Sie Ihre Anwendung mit einem Ethereum-Blockchain-Knoten verbinden (über die [JSON-RPC-API](/developers/docs/apis/json-rpc/)), kann Ihre Anwendung Daten aus der Blockchain lesen (wie z. B. Benutzerkontostände) sowie neue Transaktionen an das Netzwerk übertragen (wie z. B. die Überweisung von ETH zwischen Benutzerkonten oder die Ausführung von Funktionen von Smart Contracts). ## Ebene 4: Ethereum-Client-APIs {#ethereum-client-apis} -Viele komfortable Bibliotheken (die von der Open-Source-Community von Ethereum erstellt und verwaltet werden) ermöglichen es Ihren Anwendern, sich mit der Ethereum-Blockchain zu verbinden und mit ihr zu kommunizieren. +Viele Komfortbibliotheken (die von der Open-Source-Community von Ethereum entwickelt und gepflegt werden) ermöglichen es Ihren Anwendungen, sich mit der Ethereum-Blockchain zu verbinden und mit ihr zu kommunizieren. -Wenn Ihre benutzerseitige Anwendung eine Web-App ist, können Sie auch eine entsprechende [JavaScript-API](/developers/docs/apis/javascript/) direkt in Ihr Frontend `installieren`. Oder Sie verwenden eine [Python](/developers/docs/programming-languages/python/)- oder [Java](/developers/docs/programming-languages/java/)-API, um diese Funktionalität serverseitig zu implementieren. +Wenn Ihre benutzerorientierte Anwendung eine Web-App ist, können Sie sich dafür entscheiden, eine [JavaScript-API](/developers/docs/apis/javascript/) direkt in Ihrem Frontend über `npm install` zu installieren. Oder vielleicht entscheiden Sie sich dafür, diese Funktionalität serverseitig mit einer [Python-](/developers/docs/programming-languages/python/) oder [Java-API](/developers/docs/programming-languages/java/) zu implementieren. -Obwohl diese APIs kein notwendiger Bestandteil des Stacks sind, gestalten sie die direkte Interaktion mit einem Ethereum-Node wesentlich einfacher. Zudem bieten sie Dienstprogrammfunktionen (z. B. Umwandlung von ETH zu GWei), so dass Sie als Entwickler weniger Zeit damit verbringen, Probleme mit Ethereum-Clients zu lösen, und sich auf die konkreten Funktionen Ihrer Anwendung konzentrieren können. +Obwohl diese APIs kein notwendiger Teil des Stacks sind, abstrahieren sie einen Großteil der Komplexität der direkten Interaktion mit einem Ethereum-Blockchain-Knoten. Sie bieten auch Hilfsfunktionen (z. B. die Umrechnung von ETH in Gwei), sodass Sie als Entwickler weniger Zeit mit den Feinheiten von Ethereum-Clients verbringen und sich mehr auf die spezifische Funktionalität Ihrer Anwendung konzentrieren können. ## Ebene 5: Endbenutzeranwendungen {#end-user-applications} -Auf der obersten Ebene des Stacks befinden sich benutzerorientierte Anwendungen. Das sind die Standardanwendungen, die Sie heute regelmäßig nutzen aund aufhauen: in erster Linie Web- und Mobilanwendungen. +Auf der obersten Ebene des Stacks befinden sich benutzerorientierte Anwendungen. Dies sind die Standardanwendungen, die Sie heute regelmäßig nutzen und entwickeln: in erster Linie Web- und mobile Apps. -Die Art und Weise, wie Sie diese Benutzeroberflächen entwickeln, bleibt im Wesentlichen unverändert. Meist müssen Benutzer nicht wissen, dass die von ihnen verwendete Anwendung auf einer Blockchain erstellt wurde. +Die Art und Weise, wie Sie diese Benutzeroberflächen entwickeln, bleibt im Wesentlichen unverändert. Oft müssen Benutzer nicht wissen, dass die von ihnen verwendete Anwendung mithilfe einer Blockchain erstellt wurde. -## Bereit, Ihren Stack zu wählen? {#ready-to-choose-your-stack} +## Bereit, Ihren Stack auszuwählen? {#ready-to-choose-your-stack} -Machen Sie sich mit unserem Leitfaden vertraut, um [eine lokale Entwicklungsumgebung für Ihre Ethereum-Anwendung aufzusetzen](/developers/local-environment/). +Sehen Sie sich unseren Leitfaden zur [Einrichtung einer lokalen Entwicklungsumgebung](/developers/local-environment/) für Ihre Ethereum-Anwendung an. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ +- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/evm/index.md b/public/content/translations/de/developers/docs/evm/index.md index bb357fd24ff..bf34fb7465b 100644 --- a/public/content/translations/de/developers/docs/evm/index.md +++ b/public/content/translations/de/developers/docs/evm/index.md @@ -1,78 +1,93 @@ --- title: Ethereum Virtual Machine (EVM) -description: Eine Einführung in die virtuelle Maschine von Ethereum und wie sie sich auf Zustand, Transaktionen und Smart Contracts bezieht. +description: "Eine Einführung in die Ethereum Virtual Machine und wie sie mit dem Zustand, Transaktionen und Smart Contracts zusammenhängt." lang: de --- -Die Ethereum Virtual Machine (EVM) ist eine dezentrale virtuelle Umgebung, die Code konsistent und sicher auf allen Ethereum-Knoten ausführt. Knoten führen die EVM aus, um Smart Contracts auszuführen, wobei sie "[Gas](/gas/)" verwenden, um den für [Operationen](/developers/docs/evm/opcodes/) erforderlichen Rechenaufwand zu messen, wodurch eine effiziente Ressourcenzuweisung und Netzwerksicherheit gewährleistet werden. +Die Ethereum Virtual Machine (EVM) ist eine dezentralisierte virtuelle Umgebung, die Code konsistent und sicher über alle [Ethereum](/)-Blockchain-Knoten hinweg ausführt. Blockchain-Knoten führen die EVM aus, um Smart Contracts auszuführen, und verwenden "[Gas](/developers/docs/gas/)", um den für [Operationen](/developers/docs/evm/opcodes/) erforderlichen Rechenaufwand zu messen, was eine effiziente Ressourcenzuweisung und Netzwerksicherheit gewährleistet. ## Voraussetzungen {#prerequisites} -Um den EVM zu verstehen, sind ein paar grundlegende Kenntnisse der gängigen Informatikterminologie wie [Bytes](https://wikipedia.org/wiki/Byte), [Speicher](https://wikipedia.org/wiki/Computer_memory) und [Stack](https://wikipedia.org/wiki/Stack_(abstract_data_type)) notwendig. Es wäre auch hilfreich, wenn Sie sich mit Kryptografie-/Blockchain-Konzepten wie [Hash-Funktionen](https://wikipedia.org/wiki/Cryptographic_hash_function) und dem [Merkle-Baum](https://wikipedia.org/wiki/Merkle_tree) auskennen. +Ein grundlegendes Verständnis gängiger Begriffe der Informatik wie [Bytes](https://wikipedia.org/wiki/Byte), [Speicher](https://wikipedia.org/wiki/Computer_memory) und [Stack]() ist notwendig, um die EVM zu verstehen. Es wäre auch hilfreich, mit Konzepten der Kryptografie/Blockchain wie [Hash-Funktionen](https://wikipedia.org/wiki/Cryptographic_hash_function) und dem [Merkle-Baum](https://wikipedia.org/wiki/Merkle_tree) vertraut zu sein. -## Vom Ledger zur Zustandsmaschine {#from-ledger-to-state-machine} +## Vom Ledger zum Zustandsautomaten {#from-ledger-to-state-machine} -Die Analogie eines 'verteilten Schalters' wird oft verwendet, um Blockchains wie Bitcoin zu beschreiben, die eine dezentrale Währung mit grundlegenden Tools der Kryptographie ermöglichen. Der Ledger führt eine Aufzeichnung von Aktivitäten, die sich an eine Reihe von Regeln halten müssen, die wiederum bestimmen, welche Aktionen erfolgen bzw. nicht erfolgen können, um den Ledger zu verändern. Zum Beispiel kann eine Bitcoin-Adresse nicht mehr Bitcoin ausgeben, als sie zuvor erhalten hat. Diese Regeln untermauern alle Transaktionen auf Bitcoin und vielen anderen Blockchains. +Die Analogie eines „verteilten Ledgers“ (distributed ledger) wird oft verwendet, um Blockchains wie Bitcoin zu beschreiben, die eine dezentralisierte Währung mithilfe grundlegender Werkzeuge der Kryptografie ermöglichen. Der Ledger führt eine Aufzeichnung der Aktivitäten, die sich an eine Reihe von Regeln halten muss, welche bestimmen, was jemand tun darf und was nicht, um den Ledger zu ändern. Zum Beispiel kann eine Bitcoin-Adresse nicht mehr Bitcoin ausgeben, als sie zuvor empfangen hat. Diese Regeln untermauern alle Transaktionen auf Bitcoin und vielen anderen Blockchains. -Während Ethereum seine eigene native Kryptowährung (Ether) hat, die fast genau den gleichen intuitiven Regeln folgt, ermöglicht es auch eine wesentlich leistungsfähigere Funktion: [Smart Contracts](/developers/docs/smart-contracts/). Für diese komplexere Funktion ist eine ausgeklügeltere Analogie erforderlich. Anstelle eines verteilten Ledgers ist Ethereum eine verteilte [Zustandsmaschine](https://wikipedia.org/wiki/Finite-state_machine). Ethereums Zustand ist eine große Datenstruktur, die nicht nur alle Konten und Kontostände enthält, sondern einen _Maschinenzustand_, der nach einer vordefinierten Reihe von Regeln von Block zu Block wechselt und beliebigen Maschinencode ausführen kann. Die spezifischen Regeln für das Ändern des Zustands von Block zu Block werden vom EVM definiert. +Während Ethereum seine eigene native Kryptowährung (Ether) hat, die fast genau denselben intuitiven Regeln folgt, ermöglicht es auch eine viel leistungsfähigere Funktion: [Smart Contracts](/developers/docs/smart-contracts/). Für diese komplexere Funktion ist eine ausgefeiltere Analogie erforderlich. Anstelle eines verteilten Ledgers ist Ethereum ein verteilter [Zustandsautomat](https://wikipedia.org/wiki/Finite-state_machine) (State Machine). Der Zustand von Ethereum ist eine große Datenstruktur, die nicht nur alle Konten und Salden enthält, sondern auch einen _Maschinenzustand_, der sich von Block zu Block gemäß einem vordefinierten Regelwerk ändern und beliebigen Maschinencode ausführen kann. Die spezifischen Regeln für die Änderung des Zustands von Block zu Block werden durch die EVM definiert. -![Ein Diagramm, das die Funktionsweise eines Kontos zeigt](./evm.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das den Aufbau der EVM zeigt](./evm.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -## Ethereum-Zustandsübergangsfunktion {#the-ethereum-state-transition-function} +## Die Ethereum-Zustandsübergangsfunktion {#the-ethereum-state-transition-function} -Die EVM verhält sich wie eine mathematische Funktion: Mit einer Eingabe, erzeugt sie eine deterministische Ausgabe. Folglich ist es sehr hilfreich, Ethereum formaler als eine **Zustandsübergangsfunktion** enthaltend zu beschreiben: +Die EVM verhält sich wie eine mathematische Funktion: Bei einer Eingabe erzeugt sie eine deterministische Ausgabe. Es ist daher sehr hilfreich, Ethereum formaler als eine **Zustandsübergangsfunktion** zu beschreiben: ``` Y(S, T)= S' ``` -Bei einem alten gültigen Zustand `(S)` und einem neuen Satz gültiger Transaktionen `(T)` erzeugt die Ethereum-Statusübergangsfunktion `Y(S, T)` einen neuen gültigen Ausgabezustand `S'`. +Gegeben ein alter gültiger Zustand `(S)` und eine neue Menge gültiger Transaktionen `(T)`, erzeugt die Ethereum-Zustandsübergangsfunktion `Y(S, T)` einen neuen gültigen Ausgabezustand `S'` ### Zustand {#state} -Im Rahmen von Ethereum ist der Zustand eine enorme Datenstruktur, die [ modifizierte Merkle-Patricia-Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) genannt wird, die alle [Konten](/developers/docs/accounts/) durch Hashes verbunden hält und mit einem einzigen Stamm-Hash in der Blockchain abrufbar ist. +Im Kontext von Ethereum ist der Zustand eine enorme Datenstruktur, die als [modifizierter Merkle Patricia Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) bezeichnet wird. Diese hält alle [Konten](/developers/docs/accounts/) durch Hashes verknüpft und reduzierbar auf einen einzigen Root-Hash, der auf der Blockchain gespeichert ist. ### Transaktionen {#transactions} -Transaktionen sind kryptographisch signierte Anweisungen von Konten. Es gibt zwei Arten von Transaktionen: solche, die zu Nachrichtenanrufen führen, und solche, die zur Erstellung von Verträgen führen. +Transaktionen sind kryptografisch signierte Anweisungen von Konten. Es gibt zwei Arten von Transaktionen: solche, die zu Nachrichtenaufrufen (Message Calls) führen, und solche, die zur Erstellung von Verträgen (Contract Creation) führen. -Die Erstellung von Verträgen führt zur Erstellung eines neuen Vertragskontos mit zusammengestelltem [Smart-Contract](/developers/docs/smart-contracts/anatomy/)-Bytecode. Immer wenn ein anderes Konto einen Nachrichtenaufruf an diesen Vertrag stellt, führt es seinen Bytecode aus. +Die Erstellung eines Vertrags führt zur Erstellung eines neuen Vertragskontos, das den kompilierten Bytecode des [Smart Contracts](/developers/docs/smart-contracts/anatomy/) enthält. Wann immer ein anderes Konto einen Nachrichtenaufruf an diesen Vertrag tätigt, führt es dessen Bytecode aus. ## EVM-Anweisungen {#evm-instructions} -Die EVM wird als [Stackmaschine](https://wikipedia.org/wiki/Stack_machine) mit einer Tiefe von 1024 Artikeln ausgeführt. Jedes Element ist ein 256-Bit-Wort, das für die einfache Verwendung mit 256-Bit-Kryptographie (wie Keccak-256-Hashes oder secp256k1-Signaturen) gewählt wurde. +Die EVM wird als [Stack-Maschine](https://wikipedia.org/wiki/Stack_machine) mit einer Tiefe von 1024 Elementen ausgeführt. Jedes Element ist ein 256-Bit-Wort, was für die einfache Verwendung mit 256-Bit-Kryptografie (wie Keccak-256-Hashes oder secp256k1-Signaturen) gewählt wurde. -Während der Ausführung behält die EVM einen transienten _-Speicher_ (als wortadressiertes Byte-Array), der zwischen Transaktionen nicht vorhanden ist. +Während der Ausführung unterhält die EVM einen flüchtigen _Speicher_ (als wortadressiertes Byte-Array), der zwischen Transaktionen nicht bestehen bleibt. -Verträge enthalten jedoch eine Merkle-Patricia_-Speicher_-Trie (als wortadressierbares Wort-Array), mit der das betreffende Konto und ein Teil des globalen Zustands verbunden sind. +### Transient Storage (Flüchtiger Speicher) -Kompilierter Smart-Contract-Bytecode wird als eine Anzahl von EVM-[Opcodes ausgeführt](/developers/docs/evm/opcodes), die standardmäßige Stackoperationen wie `XOR`, `UND`, `ADD`, `SUB` etc. ausführen. Die EVM implementiert auch eine Reihe von Blockchain-spezifischen Stack-Operationen, wie `ADDRESS`, `BALANCE`, `BLOCKHASH` usw. +Transient Storage ist ein schlüsselwertbasierter Speicher pro Transaktion, auf den über die Opcodes `TSTORE` und `TLOAD` zugegriffen wird. Er bleibt über alle internen Aufrufe während derselben Transaktion hinweg bestehen, wird aber am Ende der Transaktion gelöscht. Im Gegensatz zum Arbeitsspeicher (Memory) wird Transient Storage als Teil des EVM-Zustands und nicht als Teil des Ausführungsrahmens modelliert, wird jedoch nicht in den globalen Zustand übernommen. Transient Storage ermöglicht eine gas-effiziente, temporäre gemeinsame Nutzung von Zuständen über interne Aufrufe hinweg während einer Transaktion. -![Ein Diagramm, das zeigt, wo Gas im EVM-Betrieb benötigt wird](../gas/gas.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +### Storage + +Verträge enthalten einen Merkle Patricia _Storage_-Trie (als wortadressierbares Wort-Array), der mit dem betreffenden Konto verknüpft und Teil des globalen Zustands ist. Dieser persistente Speicher unterscheidet sich vom Transient Storage, der nur für die Dauer einer einzelnen Transaktion verfügbar ist und nicht Teil des persistenten Storage-Tries des Kontos ist. + +### Opcodes + +Kompilierter Smart-Contract-Bytecode wird als eine Reihe von EVM-[Opcodes](/developers/docs/evm/opcodes) ausgeführt, die Standard-Stack-Operationen wie `XOR`, `AND`, `ADD`, `SUB` usw. durchführen. Die EVM implementiert auch eine Reihe von Blockchain-spezifischen Stack-Operationen, wie `ADDRESS`, `BALANCE`, `BLOCKHASH` usw. Der Opcode-Satz enthält auch `TSTORE` und `TLOAD`, die Zugriff auf den Transient Storage bieten. + +![Ein Diagramm, das zeigt, wo Gas für EVM-Operationen benötigt wird](../gas/gas.png) +_Diagramme adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## EVM-Implementierungen {#evm-implementations} -Alle Implementierungen der EVM müssen sich nach der im Yellowpaper von Ethereum beschriebenen Spezifikation richten. +Alle Implementierungen der EVM müssen sich an die im Ethereum Yellowpaper beschriebene Spezifikation halten. -Während der siebenjährigen Geschichte von Ethereum hat die EVM mehrere Revisionen durchlaufen. Zudem gibt es mehrere Implementierungen der EVM in verschiedenen Programmiersprachen. +In der zehnjährigen Geschichte von Ethereum wurde die EVM mehrfach überarbeitet, und es gibt mehrere Implementierungen der EVM in verschiedenen Programmiersprachen. -[Ethereum-Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) enthalten eine EVM-Implementierung. Zusätzlich gibt es mehrere eigenständige Implementierungen, einschließlich: +[Ethereum-Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) enthalten eine EVM-Implementierung. Darüber hinaus gibt es mehrere eigenständige Implementierungen, darunter: -- [Py-EVM](https://github.com/ethereum/py-evm) - _Python_ -- [evmone](https://github.com/ethereum/evmone) - _C++_ -- [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_ +- [Py-EVM](https://github.com/ethereum/py-evm) – _Python_ +- [evmone](https://github.com/ethereum/evmone) – _C++_ +- [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) – _JavaScript_ - [revm](https://github.com/bluealloy/revm) – _Rust_ -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf) - [Jellopaper aka KEVM: Semantics of EVM in K](https://jellopaper.org/) - [The Beigepaper](https://github.com/chronaeon/beigepaper) -- [Opcodes der virtuellen Maschine von Ethereum](https://www.ethervm.io/) -- [Betriebscodes für die Referenzdokumente für die virtuelle Ethereum-Maschine](https://www.evm.codes/) -- [Eine kurze Einführung in die Dokumentation von Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) -- [Ethereum meistern – Die Ethereum Virtual Machine](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) +- [Ethereum Virtual Machine Opcodes](https://www.ethervm.io/) +- [Ethereum Virtual Machine Opcodes Interactive Reference](https://www.evm.codes/) +- [Eine kurze Einführung in der Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) +- [Mastering Ethereum – The Ethereum Virtual Machine](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) ## Verwandte Themen {#related-topics} - [Gas](/developers/docs/gas/) + +## Tutorials: Ethereum Virtual Machine (EVM) / Opcodes auf Ethereum {#tutorials} + +- [Die EVM-Spezifikationen des Yellowpapers verstehen](/developers/tutorials/yellow-paper-evm/) _– Ein geführter Durchgang durch die formale EVM-Spezifikation aus dem Ethereum Yellowpaper._ +- [Reverse Engineering eines Vertrags](/developers/tutorials/reverse-engineering-a-contract/) _– Wie man einen kompilierten Smart Contract mithilfe von EVM-Opcodes zurückentwickelt._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/evm/opcodes/index.md b/public/content/translations/de/developers/docs/evm/opcodes/index.md index 467c273bd2c..8e38b0ae32a 100644 --- a/public/content/translations/de/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/de/developers/docs/evm/opcodes/index.md @@ -1,174 +1,177 @@ --- -title: Opcodes für die EVM -description: Eine Liste aller verfügbaren Opcodes für die virtuelle Ethereum-Maschine (EVM). +title: "Opcodes für die EVM" +description: "Eine Liste aller verfügbaren Opcodes für die Ethereum Virtual Machine." lang: de --- ## Übersicht {#overview} -Das ist eine aktualisierte Version der EVM-Referenzseite unter [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes). Auch aus dem [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), dem [Jello Paper](https://jellopaper.org/evm/), und der [Geth](https://github.com/ethereum/go-ethereum)-Implementierung. Das soll eine zugängliche Referenz sein, aber sie ist nicht besonders streng. Wenn Sie sich sicher sein wollen, und Kenntnis von jedem Sonderfall haben benötigen, ist es ratsam, das Jello Paper oder eine Client-Implementierung zu verwenden. +Dies ist eine aktualisierte Version der EVM-Referenzseite unter [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes). +Sie stützt sich zudem auf das [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), das [Jello Paper](https://jellopaper.org/evm/) und die [geth](https://github.com/ethereum/go-ethereum)-Implementierung. +Dies soll eine leicht zugängliche Referenz sein, ist jedoch nicht besonders rigoros. +Wenn Sie sich der Richtigkeit sicher sein und jeden Randfall kennen möchten, ist die Verwendung des Jello Papers oder einer Client-Implementierung ratsam. -Suchen Sie nach einer interaktiven Referenz? Sehen Sie sich [evm.codes](https://www.evm.codes/) an. +Suchen Sie nach einer interaktiven Referenz? Schauen Sie sich [evm.codes](https://www.evm.codes/) an. Für Operationen mit dynamischen Gaskosten, siehe [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md). -💡 Kurztipp: Um ganze Zeilen einzusehen, verwenden Sie `[shift] + scroll`, um horizontal auf dem Desktop zu scrollen. +💡 Kurzer Tipp: Um ganze Zeilen anzuzeigen, verwenden Sie `[Shift] + Scrollen`, um auf dem Desktop horizontal zu scrollen. -| Stack | Name | Gas | Anfangs-Stack | Ergebnis-Stack | Speicher | Anmerkungen | -|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 00 | STOP | 0 | | | | halt execution | -| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | -| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | -| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | -| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | -| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | -| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | -| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | -| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | -| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | -| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | -| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | -| 0C-0F | _invalid_ | | | | | | -| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | -| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | -| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | -| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | -| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | -| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | -| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | -| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | -| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | -| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | -| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | -| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | -| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | -| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | -| 1E-1F | _invalid_ | | | | | | -| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | -| 21-2F | _invalid_ | | | | | | -| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | -| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | -| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | -| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | -| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | -| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | -| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | -| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data | -| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | -| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copy executing contract's bytecode | -| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | -| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | -| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from `addr` | -| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | -| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | -| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `Hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | -| 41 | COINBASE | 2 | `.` | `block.coinbase` | | Adresse des Proposers für den aktuellen Block | -| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp of current block | -| 43 | NUMBER | 2 | `.` | `block.number` | | number of current block | -| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | randomness beacon | -| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | gas limit of current block | -| 46 | CHAINID | 2 | `.` | `chain_id` | | push current [chain id](https://eips.ethereum.org/EIPS/eip-155) onto stack | -| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | balance of executing contract, in wei | -| 48 | BASEFEE | 2 | `.` | `block.basefee` | | base fee of current block | -| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | -| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | Blob-Basisgebühr des aktuellen Blocks ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | -| 4B-4F | _invalid_ | | | | | | -| 50 | POP | 2 | `_anon` | `.` | | remove item from top of stack and discard it | -| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | read word from memory at offset `ost` | -| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | write a word to memory | -| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | write a single byte to memory | -| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | read word from storage | -| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | write word to storage | -| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` mark that `pc` is only assigned if `dst` is a valid jumpdest | -| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | -| 58 | PC | 2 | `.` | `$pc` | | program counter | -| 59 | MSIZE | 2 | `.` | `len(mem)` | | size of memory in current execution context, in bytes | -| 5A | GAS | 2 | `.` | `gasRemaining` | | | -| 5B | JUMPDEST | 1 | | | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | -| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | read word from transient storage ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | -| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | write word to transient storage ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | -| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | copy memory from one area to another ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | -| 5F | PUSH0 | 2 | `.` | `uint8` | | Bringen Sie den konstanten Wert 0 in den Stack ein | -| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | -| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | -| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | -| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | -| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | -| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | -| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | -| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | -| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | -| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | -| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | -| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | -| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | -| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | -| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | -| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | -| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | -| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | -| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | -| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | -| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | -| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | -| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | -| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | -| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | -| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | -| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | -| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | -| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | -| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | -| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | -| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | -| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | -| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | -| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | -| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | -| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | -| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | -| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | -| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | -| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | -| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | -| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | -| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | -| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | -| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | -| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | -| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | -| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | -| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | -| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | -| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | -| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | -| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | -| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | -| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | -| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | -| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | -| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | -| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | -| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | -| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | -| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | -| A5-EF | _invalid_ | | | | | | -| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | -| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value | -| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len-1] | -| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | -| F6-F9 | _invalid_ | | | | | | -| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| FB-FC | _invalid_ | | | | | | -| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | -| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | -| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | sendet alle ETH an `addr`; wenn es in derselben Transaktion ausgeführt wird, in der ein Vertrag erstellt wurde, zerstört es den Vertrag | +| Stack | Name | Gas | Anfänglicher Stack | Resultierender Stack | Speicher / Storage | Notizen | +| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | +| 00 | STOP | 0 | | | | Ausführung anhalten | +| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256-Addition modulo 2\*\*256 | +| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256-Multiplikation modulo 2\*\*256 | +| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256-Subtraktion modulo 2\*\*256 | +| 04 | DIV | 5 | `a, b` | `a // b` | | uint256-Division | +| 05 | SDIV | 5 | `a, b` | `a // b` | | int256-Division | +| 06 | MOD | 5 | `a, b` | `a % b` | | uint256-Modulo | +| 07 | SMOD | 5 | `a, b` | `a % b` | | int256-Modulo | +| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256-Addition modulo N | +| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256-Multiplikation modulo N | +| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256-Potenzierung modulo 2\*\*256 | +| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [Vorzeichenerweiterung](https://wikipedia.org/wiki/Sign_extension) von `x` von `(b+1)` Bytes auf 32 Bytes | +| 0C-0F | _ungültig_ | +| 10 | LT | 3 | `a, b` | `a < b` | | uint256 kleiner-als | +| 11 | GT | 3 | `a, b` | `a > b` | | uint256 größer-als | +| 12 | SLT | 3 | `a, b` | `a < b` | | int256 kleiner-als | +| 13 | SGT | 3 | `a, b` | `a > b` | | int256 größer-als | +| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256-Gleichheit | +| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 ist-null | +| 16 | AND | 3 | `a, b` | `a && b` | | bitweises UND | +| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitweises ODER | +| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitweises exklusives ODER (XOR) | +| 19 | NOT | 3 | `a` | `~a` | | bitweises NICHT | +| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`-tes Byte von (u)int256 `x`, von links | +| 1B | SHL | 3 | `shift, val` | `val << shift` | | Linksverschiebung | +| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logische Rechtsverschiebung | +| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetische Rechtsverschiebung | +| 1E-1F | _ungültig_ | +| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | +| 21-2F | _ungültig_ | +| 30 | ADDRESS | 2 | `.` | `address(this)` | | Adresse des ausführenden Vertrags | +| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | Guthaben, in Wei | +| 32 | ORIGIN | 2 | `.` | `tx.origin` | | Adresse, von der die Transaktion ausging | +| 33 | CALLER | 2 | `.` | `msg.sender` | | Adresse des msg-Absenders | +| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg-Wert, in Wei | +| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | Wort aus msg-Daten an Index `idx` lesen | +| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | Länge der msg-Daten, in Bytes | +| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | msg-Daten kopieren | +| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | Länge des Codes des ausführenden Vertrags, in Bytes | +| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | Bytecode des ausführenden Vertrags kopieren | +| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | Gaspreis der Transaktion, in Wei pro Einheit Gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | +| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | Größe des Codes an der Adresse, in Bytes | +| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | Code von `addr` kopieren | +| 3D | RETURNDATASIZE | 2 | `.` | `size` | | Größe der zurückgegebenen Daten vom letzten externen Aufruf, in Bytes | +| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | zurückgegebene Daten vom letzten externen Aufruf kopieren | +| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | Adresse des Block-Vorschlagenden des aktuellen Blocks | +| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | Zeitstempel des aktuellen Blocks | +| 43 | NUMBER | 2 | `.` | `block.number` | | Nummer des aktuellen Blocks | +| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | Zufalls-Beacon | +| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | Gaslimit des aktuellen Blocks | +| 46 | CHAINID | 2 | `.` | `chain_id` | | aktuelle [Chain-ID](https://eips.ethereum.org/EIPS/eip-155) auf den Stack legen | +| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | Guthaben des ausführenden Vertrags, in Wei | +| 48 | BASEFEE | 2 | `.` | `block.basefee` | | Grundgebühr des aktuellen Blocks | +| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | +| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | Blob-Grundgebühr des aktuellen Blocks ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | +| 4B-4F | _ungültig_ | +| 50 | POP | 2 | `_anon` | `.` | | Element von der Spitze des Stacks entfernen und verwerfen | +| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | Wort aus dem Speicher an Offset `ost` lesen | +| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | ein Wort in den Speicher schreiben | +| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | ein einzelnes Byte in den Speicher schreiben | +| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | Wort aus dem Storage lesen | +| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | Wort in den Storage schreiben | +| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` markiert, dass `pc` nur zugewiesen wird, wenn `dst` ein gültiges jumpdest ist | +| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | +| 58 | PC | 2 | `.` | `$pc` | | Programmierzähler (Program Counter) | +| 59 | MSIZE | 2 | `.` | `len(mem)` | | Größe des Speichers im aktuellen Ausführungskontext, in Bytes | +| 5A | GAS | 2 | `.` | `gasRemaining` | | +| 5B | JUMPDEST | 1 | | | gültiges Sprungziel markieren | ein gültiges Sprungziel, zum Beispiel ein Sprungziel, das nicht innerhalb der Push-Daten liegt | +| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | Wort aus dem transienten Storage lesen ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | +| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | Wort in den transienten Storage schreiben ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | +| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | Speicher von einem Bereich in einen anderen kopieren ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | +| 5F | PUSH0 | 2 | `.` | `uint8` | | den konstanten Wert 0 auf den Stack legen | +| 60 | PUSH1 | 3 | `.` | `uint8` | | 1-Byte-Wert auf den Stack legen | +| 61 | PUSH2 | 3 | `.` | `uint16` | | 2-Byte-Wert auf den Stack legen | +| 62 | PUSH3 | 3 | `.` | `uint24` | | 3-Byte-Wert auf den Stack legen | +| 63 | PUSH4 | 3 | `.` | `uint32` | | 4-Byte-Wert auf den Stack legen | +| 64 | PUSH5 | 3 | `.` | `uint40` | | 5-Byte-Wert auf den Stack legen | +| 65 | PUSH6 | 3 | `.` | `uint48` | | 6-Byte-Wert auf den Stack legen | +| 66 | PUSH7 | 3 | `.` | `uint56` | | 7-Byte-Wert auf den Stack legen | +| 67 | PUSH8 | 3 | `.` | `uint64` | | 8-Byte-Wert auf den Stack legen | +| 68 | PUSH9 | 3 | `.` | `uint72` | | 9-Byte-Wert auf den Stack legen | +| 69 | PUSH10 | 3 | `.` | `uint80` | | 10-Byte-Wert auf den Stack legen | +| 6A | PUSH11 | 3 | `.` | `uint88` | | 11-Byte-Wert auf den Stack legen | +| 6B | PUSH12 | 3 | `.` | `uint96` | | 12-Byte-Wert auf den Stack legen | +| 6C | PUSH13 | 3 | `.` | `uint104` | | 13-Byte-Wert auf den Stack legen | +| 6D | PUSH14 | 3 | `.` | `uint112` | | 14-Byte-Wert auf den Stack legen | +| 6E | PUSH15 | 3 | `.` | `uint120` | | 15-Byte-Wert auf den Stack legen | +| 6F | PUSH16 | 3 | `.` | `uint128` | | 16-Byte-Wert auf den Stack legen | +| 70 | PUSH17 | 3 | `.` | `uint136` | | 17-Byte-Wert auf den Stack legen | +| 71 | PUSH18 | 3 | `.` | `uint144` | | 18-Byte-Wert auf den Stack legen | +| 72 | PUSH19 | 3 | `.` | `uint152` | | 19-Byte-Wert auf den Stack legen | +| 73 | PUSH20 | 3 | `.` | `uint160` | | 20-Byte-Wert auf den Stack legen | +| 74 | PUSH21 | 3 | `.` | `uint168` | | 21-Byte-Wert auf den Stack legen | +| 75 | PUSH22 | 3 | `.` | `uint176` | | 22-Byte-Wert auf den Stack legen | +| 76 | PUSH23 | 3 | `.` | `uint184` | | 23-Byte-Wert auf den Stack legen | +| 77 | PUSH24 | 3 | `.` | `uint192` | | 24-Byte-Wert auf den Stack legen | +| 78 | PUSH25 | 3 | `.` | `uint200` | | 25-Byte-Wert auf den Stack legen | +| 79 | PUSH26 | 3 | `.` | `uint208` | | 26-Byte-Wert auf den Stack legen | +| 7A | PUSH27 | 3 | `.` | `uint216` | | 27-Byte-Wert auf den Stack legen | +| 7B | PUSH28 | 3 | `.` | `uint224` | | 28-Byte-Wert auf den Stack legen | +| 7C | PUSH29 | 3 | `.` | `uint232` | | 29-Byte-Wert auf den Stack legen | +| 7D | PUSH30 | 3 | `.` | `uint240` | | 30-Byte-Wert auf den Stack legen | +| 7E | PUSH31 | 3 | `.` | `uint248` | | 31-Byte-Wert auf den Stack legen | +| 7F | PUSH32 | 3 | `.` | `uint256` | | 32-Byte-Wert auf den Stack legen | +| 80 | DUP1 | 3 | `a` | `a, a` | | 1. Wert auf dem Stack klonen | +| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | 2. Wert auf dem Stack klonen | +| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | 3. Wert auf dem Stack klonen | +| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | 4. Wert auf dem Stack klonen | +| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | 5. Wert auf dem Stack klonen | +| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | 6. Wert auf dem Stack klonen | +| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | 7. Wert auf dem Stack klonen | +| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | 8. Wert auf dem Stack klonen | +| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | 9. Wert auf dem Stack klonen | +| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | 10. Wert auf dem Stack klonen | +| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | 11. Wert auf dem Stack klonen | +| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | 12. Wert auf dem Stack klonen | +| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | 13. Wert auf dem Stack klonen | +| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | 14. Wert auf dem Stack klonen | +| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | 15. Wert auf dem Stack klonen | +| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | 16. Wert auf dem Stack klonen | +| 90 | SWAP1 | 3 | `a, b` | `b, a` | | +| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | +| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | +| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | +| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | +| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | +| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | +| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | +| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | +| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | +| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | +| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | +| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | +| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | +| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | +| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | +| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | +| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | +| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | +| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | +| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | +| A5-EF | _ungültig_ | +| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | +| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | +| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | wie DELEGATECALL, überträgt aber nicht den ursprünglichen msg.sender und msg.value | +| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len-1] | +| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | +| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | +| F6-F9 | _ungültig_ | +| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | +| FB-FC | _ungültig_ | +| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | +| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | als ungültig designierter Opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | +| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | sendet alle ETH an `addr`; wenn in derselben Transaktion ausgeführt, in der ein Vertrag erstellt wurde, wird der Vertrag zerstört| \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/frameworks/index.md b/public/content/translations/de/developers/docs/frameworks/index.md index 77f8773dbdc..b6c10580303 100644 --- a/public/content/translations/de/developers/docs/frameworks/index.md +++ b/public/content/translations/de/developers/docs/frameworks/index.md @@ -1,76 +1,76 @@ --- -title: dApp-Entwicklungs-Frameworks -description: Mehr über die Vorteile von Frameworks erfahren und verfügbare Optionen vergleichen +title: Dapp-Entwicklungs-Frameworks +description: "Entdecken Sie die Vorteile von Frameworks und vergleichen Sie die verfügbaren Optionen." lang: de --- ## Einführung in Frameworks {#introduction-to-frameworks} -Für den Aufbau einer vollwertigen dApp sind unterschiedliche Technologieteile erforderlich. Software-Frameworks enthalten viele der erforderlichen Funktionen oder bieten einfache Plugin-Systeme, über die Sie die Tools auswählen können, die Sie als hilfreich erachten. +Die Entwicklung einer vollwertigen Dapp erfordert verschiedene Technologien. Software-Frameworks enthalten viele der benötigten Funktionen oder bieten einfache Plugin-Systeme, um die gewünschten Werkzeuge auszuwählen. -Frameworks bieten zahlreiche direkt einsetzbare Funktionen wie: +Frameworks bieten viele sofort einsatzbereite Funktionen, wie zum Beispiel: -- Funktionen, um eine lokale Blockchain-Instanz aufzusetzen -- Dienstprogramme zum Kompilieren und Testen von Smart Contracts -- Client-Entwicklungs-Add-ons zur Erstellung Ihrer anwenderorientierten Anwendung im selben Projekt/Repository -- Konfiguration für die Verbindung zu Ethereum-Netzwerken und zur Bereitstellung von Verträgen, sei es zu einer lokal laufenden Instanz oder für ein öffentliches Netzwerk von Ethereum -- Dezentralisierte App-Verteilung – Integration mit Speicheroptionen wie IPFS +- Funktionen zum Starten einer lokalen Blockchain-Instanz. +- Dienstprogramme zum Kompilieren und Testen Ihrer Smart Contracts. +- Add-ons für die Client-Entwicklung, um Ihre benutzerorientierte Anwendung im selben Projekt/Repository zu erstellen. +- Konfigurationen zur Verbindung mit Ethereum-Netzwerken und zur Bereitstellung von Verträgen, sei es auf einer lokal laufenden Instanz oder einem der öffentlichen Netzwerke von Ethereum. +- Verteilung dezentralisierter Anwendungen – Integrationen mit Speicheroptionen wie IPFS. ## Voraussetzungen {#prerequisites} -Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit der Einführung in [dApps](/developers/docs/dapps/) und den [Ethereum-Stack](/developers/docs/ethereum-stack/) vertraut machen. +Bevor Sie sich in Frameworks vertiefen, empfehlen wir Ihnen, zuerst unsere Einführung in [Dapps](/developers/docs/dapps/) und den [Ethereum-Stack](/developers/docs/ethereum-stack/) zu lesen. ## Verfügbare Frameworks {#available-frameworks} -**Foundry** – **_Foundry ist ein blitzschnelles, portables und modulares Toolkit für die Entwicklung von Ethereum-Anwendungen_** +**Foundry** – **_Foundry ist ein blitzschnelles, portables und modulares Toolkit für die Entwicklung von Ethereum-Anwendungen._** - [Foundry installieren](https://book.getfoundry.sh/) - [Foundry-Buch](https://book.getfoundry.sh/) - [Foundry-Community-Chat auf Telegram](https://t.me/foundry_support) -- [Fantastisches Foundry](https://github.com/crisgarner/awesome-foundry) +- [Awesome Foundry](https://github.com/crisgarner/awesome-foundry) -**Hardhat –** **_Ethereum-Entwicklungsumgebung für Experten_** +**Hardhat –** **_Ethereum-Entwicklungsumgebung für Profis._** - [hardhat.org](https://hardhat.org) - [GitHub](https://github.com/nomiclabs/hardhat) -**Ape –** **_Das Smart-Contract-Entwicklungstool für Python-Experten, Data Scientists und Sicherheitsexperten_** +**Ape –** **_Das Smart-Contract-Entwicklungstool für Python-Entwickler, Datenwissenschaftler und Sicherheitsexperten._** - [Dokumentation](https://docs.apeworx.io/ape/stable/) - [GitHub](https://github.com/ApeWorX/ape) -**Web3j –** **_eine Plattform für die Entwicklung von Blockchain-Anwendungen auf JVM._** +**Web3j –** **_Eine Plattform zur Entwicklung von Blockchain-Anwendungen auf der JVM._** -- [Website](https://www.web3labs.com/web3j-sdk) +- [Startseite](https://www.web3labs.com/web3j-sdk) - [Dokumentation](https://docs.web3j.io) - [GitHub](https://github.com/web3j/web3j) -**ethers-kt – ** **_asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains._** +**ethers-kt –** **_Asynchrone, hochleistungsfähige Kotlin/Java/Android-Bibliothek für EVM-basierte Blockchains._** - [GitHub](https://github.com/Kr1ptal/ethers-kt) - [Beispiele](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) - [Discord](https://discord.gg/rx35NzQGSb) -**Create Eth App –** **_Ethereum-basierte Apps mit einem Befehl erstellen. Zur Auswahl steht ein breitest Angebot an UI-Frameworks und DeFi-Vorlagen._** +**Create Eth App –** **_Erstellen Sie Ethereum-basierte Anwendungen mit einem einzigen Befehl. Bietet eine große Auswahl an UI-Frameworks und DeFi-Vorlagen._** - [GitHub](https://github.com/paulrberg/create-eth-app) - [Vorlagen](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates) -**Scaffold-Eth –** **_Ethers.js + Hardhat + React-Komponenten und Hooks für web3: alles, was Sie brauchen, um mit der Entwicklung dezentraler Anwendungen auf Basis von Smart Contracts zu beginnen._** +**Scaffold-Eth –** **_Ethers.js + Hardhat + React-Komponenten und Hooks für Web3: Alles, was Sie brauchen, um mit der Entwicklung dezentralisierter Anwendungen auf Basis von Smart Contracts zu beginnen._** - [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) -**Tenderly –** **_Web3-Entwicklungsplattform, die es Blockchain-Entwicklern ermöglicht, Smart Contracts zu erstellen, zu testen, zu debuggen, zu überwachen und zu betreiben sowie die dApp-Nutzererfahrung zu verbessern._** +**Tenderly –** **_Web3-Entwicklungsplattform, die es Blockchain-Entwicklern ermöglicht, Smart Contracts zu erstellen, zu testen, zu debuggen, zu überwachen und zu betreiben sowie die Dapp-UX zu verbessern._** - [Website](https://tenderly.co/) - [Dokumentation](https://docs.tenderly.co/) -**The Graph –** **_The Graph für die effiziente Abfrage von Blockchain-Daten._** +**The Graph –** **_The Graph zur effizienten Abfrage von Blockchain-Daten._** - [Website](https://thegraph.com/) - [Tutorial](/developers/tutorials/the-graph-fixing-web3-data-querying/) -**Alchemy-****_Ehereum-Entwicklungsplattform_** +**Alchemy –** **_Ethereum-Entwicklungsplattform._** - [alchemy.com](https://www.alchemy.com/) - [GitHub](https://github.com/alchemyplatform) @@ -82,7 +82,7 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [GitHub](https://github.com/node-real) - [Discord](https://discord.gg/V5k5gsuE) -**thirdweb SDK –** **_erstellen Sie Web3-Anwendungen, die mit Ihren Smart Contracts interagieren können, indem Sie unsere leistungsstarken SDKs und CLI verwenden._** +**thirdweb SDK –** **_Erstellen Sie Web3-Anwendungen, die mit Ihren Smart Contracts interagieren können, mithilfe unserer leistungsstarken SDKs und CLI._** - [Dokumentation](https://portal.thirdweb.com/sdk/) - [GitHub](https://github.com/thirdweb-dev/) @@ -93,7 +93,7 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [GitHub](https://github.com/chainstack) - [Discord](https://discord.gg/BSb5zfp9AT) -**Crossmint –** **_eine Plattform für Web3-Entwicklung auf Unternehmensniveau, die es Ihnen ermöglicht, NFT-Anwendungen auf allen wichtigen EVM-Blockchains (und anderen) zu erstellen._** +**Crossmint –** **_Web3-Entwicklungsplattform auf Unternehmensniveau, mit der Sie NFT-Anwendungen auf allen wichtigen EVM-Chains (und anderen) erstellen können._** - [Website](https://www.crossmint.com) - [Dokumentation](https://docs.crossmint.com) @@ -103,37 +103,49 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [Dokumentation](https://eth-brownie.readthedocs.io/en/latest/) - [GitHub](https://github.com/eth-brownie/brownie) -- **Brownie wird derzeit nicht gewartet** +- **Brownie wird derzeit nicht mehr gewartet** -**OpenZeppelin SDK –** **_das ultimative Smart-Contract-Toolkit: eine Suite an Tools, die Ihnen helfen, zu entwickeln, zu kompilieren, zu aktualisieren, bereitzustellen und mit Smart Contracts zu interagieren._** +**OpenZeppelin SDK –** **_Das ultimative Smart-Contract-Toolkit: Eine Suite von Tools, die Ihnen bei der Entwicklung, Kompilierung, Aktualisierung, Bereitstellung und Interaktion mit Smart Contracts helfen._** -- [OpenZeppelin SDK](https://openzeppelin.com/sdk/) +- [OpenZeppelin Defender SDK](https://docs.openzeppelin.com/defender/sdk) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) - [Community-Forum](https://forum.openzeppelin.com/c/support/17) -- **Die Entwicklung von OpenZeppelin SDK ist beendet** +- **Die Entwicklung des OpenZeppelin SDK wurde eingestellt** -**Catapulta –** **_ein Tool für die Bereitstellung von Multi-Chain-Smart-Contracts, das die Verifizierung in Block-Explorern automatisiert, bereitgestellte Smart Contracts verfolgt und Bereitstellungsberichte teilt; Plug-and-Play für Foundry- und Hardhat-Projekte._** +**Catapulta –** **_Multi-Chain-Bereitstellungstool für Smart Contracts, automatisiert Verifizierungen in Blocksuchmaschinen, verfolgt bereitgestellte Smart Contracts und teilt Bereitstellungsberichte, Plug-and-Play für Foundry- und Hardhat-Projekte._** -- [Github](https://github.com/catapulta-sh) +- [GitHub](https://github.com/catapulta-sh) -**Covalent –** **_erweiterte Blockchain-APIs für über 200 Ketten._** +**GoldRush (powered by Covalent) –** **_GoldRush bietet die umfassendste Blockchain-Daten-API-Suite für Entwickler, Analysten und Unternehmen. Egal, ob Sie ein DeFi-Dashboard, ein Wallet, einen Trading-Bot, einen KI-Agenten oder eine Compliance-Plattform erstellen, die Daten-APIs bieten schnellen, genauen und entwicklerfreundlichen Zugriff auf die wesentlichen Daten auf der Blockchain, die Sie benötigen._** -- [covalenthq.com](https://www.covalenthq.com/) -- [Dokumentation](https://www.covalenthq.com/docs/api/) +- [Website](https://goldrush.dev/) +- [Dokumentation](https://goldrush.dev/docs/chains/ethereum) - [GitHub](https://github.com/covalenthq) - [Discord](https://www.covalenthq.com/discord/) -**Wake –** **_ein All-in-One-Python-Framework für das Testen von Contracts, Fuzzing, Bereitstellung, Schwachstellenscanning und Code-Navigation._** +**Wake –** **_All-in-One-Python-Framework für das Testen von Verträgen, Fuzzing, Bereitstellung, Schwachstellen-Scans und Code-Navigation._** -- [Website](https://getwake.io/) +- [Startseite](https://getwake.io/) - [Dokumentation](https://ackeeblockchain.com/wake/docs/latest/) - [GitHub](https://github.com/Ackee-Blockchain/wake) -- [VS-Code-Erweiterung](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity) +- [VS Code-Erweiterung](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity) -## Weiterführende Informationen {#further-reading} +**Veramo –** **_Modulares und agnostisches Open-Source-Framework, das es Entwicklern dezentralisierter Anwendungen leicht macht, dezentralisierte Identitäten und verifizierbare Anmeldeinformationen in ihre Anwendungen zu integrieren._** -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +- [Startseite](https://veramo.io/) +- [Dokumentation](https://veramo.io/docs/basics/introduction) +- [GitHub](https://github.com/uport-project/veramo) +- [Discord](https://discord.com/invite/FRRBdjemHV) +- [NPM-Paket](https://www.npmjs.com/package/@veramo/core) + +## Weiterführende Literatur {#further-reading} + +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} -- [Eine lokale Entwicklungsumgebung einrichten](/developers/local-environment/) +- [Einrichten einer lokalen Entwicklungsumgebung](/developers/local-environment/) + +## Tutorials: Entwicklungs-Frameworks auf Ethereum {#tutorials} + +- [Hello World Smart Contract für Anfänger – Fullstack](/developers/tutorials/hello-world-smart-contract-fullstack/) _– Erstellen und implementieren Sie einen Hello-World-Smart-Contract mit Hardhat und verbinden Sie ihn dann mit einem Frontend._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/gas/index.md b/public/content/translations/de/developers/docs/gas/index.md index 09ac46fea76..d0be1ea5ace 100644 --- a/public/content/translations/de/developers/docs/gas/index.md +++ b/public/content/translations/de/developers/docs/gas/index.md @@ -1,138 +1,151 @@ --- -title: Gas und Gebühren -description: +title: "Gas und Gebühren" +metaTitle: "Ethereum-Gas und -Gebühren: technischer Überblick" +description: "Erfahren Sie mehr über Ethereum-Gasgebühren, wie sie berechnet werden und welche Rolle sie bei der Netzwerksicherheit und Transaktionsverarbeitung spielen." lang: de --- -Gas ist für das Ethereum-Netzwerk unerlässlich. Es ist der Treibstoff, der Ethereum den Betrieb ermöglicht, so wie ein Auto Benzin braucht, um zu fahren. +Gas ist für das [Ethereum](/)-Netzwerk unerlässlich. Es ist der Treibstoff, der den Betrieb ermöglicht, genau wie ein Auto Benzin zum Fahren braucht. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst [Transaktionen](/developers/docs/transactions/) und [Blöcke](/developers/docs/evm/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Transaktionen](/developers/docs/transactions/) und die [EVM](/developers/docs/evm/) zu informieren. ## Was ist Gas? {#what-is-gas} -Gas bezieht sich auf die Einheit, die den Umfang des Rechenaufwands misst, der für die Durchführung spezifischer Operationen im Ethereum-Netzwerk erforderlich ist. +Gas bezeichnet die Einheit, die den Rechenaufwand misst, der zur Ausführung bestimmter Operationen im Ethereum-Netzwerk erforderlich ist. -Da jede Transaktion im Ethereum-Netzwerk den Einsatz von Rechenressourcen erfordert, um zur Ausführung zu gelangen, ist für diese Ressourcen eine Vergütung erforderlich. Das dient der Sicherstellung, dass das Ethereum-Netzwerk weder für Spam-Attacken anfällig ist, noch in Zustände unendlicher Rechenzyklen verfallen kann. Die Bezahlung für Berechnungen erfolgt in Form einer Gasgebühr. +Da jede Ethereum-Transaktion Rechenressourcen zur Ausführung benötigt, müssen diese Ressourcen bezahlt werden, um sicherzustellen, dass Ethereum nicht anfällig für Spam ist und nicht in endlosen Rechenschleifen stecken bleiben kann. Die Bezahlung für die Rechenleistung erfolgt in Form einer Gasgebühr. -Die Gasgebühr entspricht **dem Volumen des verbrauchten Gases für eine spezifische Transaktion multipliziert mit dem Preis je Gaseinheit**. Die Gebühr wird unabhängig davon gezahlt, ob eine Transaktion erfolgreich ist oder nicht. +Die Gasgebühr ist **die Menge an Gas, die für eine Operation verwendet wird, multipliziert mit den Kosten pro Gaseinheit**. Die Gebühr wird unabhängig davon gezahlt, ob eine Transaktion erfolgreich ist oder fehlschlägt. -![Ein Diagramm, das zeigt, wo Gas im EVM-Betrieb benötigt wird](./gas.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das zeigt, wo Gas bei EVM-Operationen benötigt wird](./gas.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Gasgebühren sind in der originären Währung von Ethereum, Ether (ETH), zu entrichten. Die Gaspreise werden in der Regel in Gwei angegeben, einer Untereinheit von ETH. Jede Gwei entspricht einem Milliardstel einer ETH (0,000000001 ETH oder 10-9 ETH). +Gasgebühren müssen in der nativen Währung von Ethereum, Ether (ETH), bezahlt werden. Gaspreise werden normalerweise in Gwei angegeben, was eine Stückelung von ETH ist. Jeder Gwei entspricht einem Milliardstel eines ETH (0,000000001 ETH oder 10-9 ETH). -Anstatt z. B. zu sagen, dass dein Gas 0,000000001 Ether kostet, kannst du sagen, dass dein Gas 1 Gwei kostet. +Anstatt beispielsweise zu sagen, dass Ihr Gas 0,000000001 Ether kostet, können Sie sagen, dass Ihr Gas 1 Gwei kostet. -Das Wort "gwei" ist eine Kurzform von "giga-wei", was "Milliarde wei" bedeutet. Ein gwei entspricht einer Milliarde wei. Wei selbst (benannt nach [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), dem Erfinder von [B-Geld](https://www.investopedia.com/terms/b/bmoney.asp)) ist die kleinste Einheit von ETH. +Das Wort „Gwei“ ist eine Zusammenziehung von „Giga-Wei“, was „Milliarde Wei“ bedeutet. Ein Gwei entspricht einer Milliarde Wei. Wei selbst (benannt nach [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), dem Schöpfer von [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) ist die kleinste Einheit von ETH. -## Wie werden die Gasgebühren berechnet? {#how-are-gas-fees-calculated} +## Wie werden Gasgebühren berechnet? {#how-are-gas-fees-calculated} -Sie können die Menge an Gas, die Sie zu zahlen bereit sind, festlegen, wenn Sie eine Transaktion einreichen. Durch das Angebot einer festgelegten Gasmenge beteiligen Sie sich an einer Auktion zur Einbeziehung Ihrer Transaktion in den nächsten Block. Bei einem zu niedrigen Gasangebot verringert sich die Wahrscheinlichkeit, dass Validierer Ihre Transaktion für die Einbindung in den nächsten Block auswählen, was zu einer verzögerten oder sogar nicht erfolgenden Ausführung Ihrer Transaktion führen kann. Wenn Sie zu viel bieten, könnten Sie ETH verschwenden. Wie können Sie also feststellen, wie viel Sie zahlen müssen? +Sie können die Menge an Gas festlegen, die Sie zu zahlen bereit sind, wenn Sie eine Transaktion einreichen. Indem Sie eine bestimmte Menge an Gas anbieten, bieten Sie darauf, dass Ihre Transaktion in den nächsten Block aufgenommen wird. Wenn Sie zu wenig anbieten, ist es weniger wahrscheinlich, dass Validatoren Ihre Transaktion zur Aufnahme auswählen, was bedeutet, dass Ihre Transaktion möglicherweise spät oder gar nicht ausgeführt wird. Wenn Sie zu viel anbieten, verschwenden Sie möglicherweise etwas ETH. Wie können Sie also feststellen, wie viel Sie bezahlen müssen? -Der Gesamtbetrag, den Sie zahlen, wird in zwei Komponenten aufgeteilt: die `Grundgebühr `und die `Prioritätsgebühr` (Trinkgeld). +Das gesamte Gas, das Sie bezahlen, ist in zwei Komponenten unterteilt: die `Grundgebühr` und die `Prioritätsgebühr` (Trinkgeld). -Die `Grundgebühr` wird durch das Protokoll festgelegt - Sie müssen mindestens diesen Betrag zahlen, damit Ihre Transaktion als gültig betrachtet wird. Die `Prioritätsgebühr` ist ein Trinkgeld, das Sie auf die Grundgebühr aufschlagen, um Ihre Transaktion für die Validierer attraktiv zu machen, so dass diese sie für die Aufnahme in den nächsten Block auswählen. +Die `Grundgebühr` wird vom Protokoll festgelegt – Sie müssen mindestens diesen Betrag bezahlen, damit Ihre Transaktion als gültig angesehen wird. Die `Prioritätsgebühr` ist ein Trinkgeld, das Sie zur Grundgebühr hinzufügen, um Ihre Transaktion für Validatoren attraktiv zu machen, damit sie diese für die Aufnahme in den nächsten Block auswählen. -Eine Transaktion, für die nur die `Grundgebühr` gezahlt wird, ist zwar technisch gesehen gültig, wird aber wahrscheinlich nicht berücksichtigt, da sie den Validierern keinen Anreiz bietet, sie einer anderen Transaktion vorzuziehen. Die "richtige" `Prioritätsgebühr` wird durch die Netzwerkauslastung zu dem Zeitpunkt bestimmt, an dem Sie Ihre Transaktion senden. Wenn es viel Nachfrage gibt, müssen Sie Ihre `Prioritätsgebühr` möglicherweise höher ansetzen, aber wenn es weniger Nachfrage gibt, können Sie weniger bezahlen. +Eine Transaktion, die nur die `Grundgebühr` bezahlt, ist technisch gültig, wird aber wahrscheinlich nicht aufgenommen, da sie den Validatoren keinen Anreiz bietet, sie einer anderen Transaktion vorzuziehen. Die „richtige“ `Prioritätsgebühr` wird durch die Netzwerkauslastung zu dem Zeitpunkt bestimmt, an dem Sie Ihre Transaktion senden – wenn eine hohe Nachfrage besteht, müssen Sie Ihre `Prioritätsgebühr` möglicherweise höher ansetzen, aber bei geringerer Nachfrage können Sie weniger bezahlen. -Nehmen wir zum Beispiel an, Jordan muss Taylor 1 ETH bezahlen. Ein ETH-Transfer erfordert 21.000 Gaseinheiten, und die Grundgebühr beträgt 10 gwei. Jordan enthält ein Trinkgeld von 2 gwei. +Nehmen wir zum Beispiel an, Jordan muss Taylor 1 ETH zahlen. Eine ETH-Überweisung erfordert 21.000 Gaseinheiten und die Grundgebühr beträgt 10 Gwei. Jordan fügt ein Trinkgeld von 2 Gwei hinzu. -Die Gesamtgebühr würde sich nun wie folgt zusammensetzen: +Die Gesamtgebühr würde nun wie folgt lauten: -`Verbrauchte Gaseinheiten * (Grundgebühr + Prioritätsgebühr)` +`verwendete Gaseinheiten * (Grundgebühr + Prioritätsgebühr)` -wobei die `Grundgebühr` ein durch das Protokoll bestimmter Wert und die `Prioritätsgebühr` ein vom Benutzer gesetzter Wert als Anreiz für den Validierer ist. +wobei die `Grundgebühr` ein vom Protokoll festgelegter Wert ist und die `Prioritätsgebühr` ein vom Benutzer als Trinkgeld für den Validator festgelegter Wert ist. -z.B. `21,000 * (10 + 2) = 252,000 gwei` (0.000252 ETH). +z. B. `21.000 * (10 + 2) = 252.000 Gwei` (0,000252 ETH). -Wenn Jordan das Geld versendet, werden 1,000252 ETH von Jordans Konto abgezogen. Taylor werden 1,0000 ETH gutgeschrieben. Der Validator erhält das Trinkgeld von 0,000042 ETH. Die `Grundgebühr` von 0,00021 ETH wird verbrannt. +Wenn Jordan das Geld sendet, werden 1,000252 ETH von Jordans Konto abgezogen. Taylor werden 1,0000 ETH gutgeschrieben. Der Validator erhält das Trinkgeld von 0,000042 ETH. Die `Grundgebühr` von 0,00021 ETH wird verbrannt. ### Grundgebühr {#base-fee} -Jeder Block hat seine eigene Basisgebühr, welche als reservierter Preis erscheint. Um in einen Block aufgenommen zu werden, muss der angebotene Preis pro Gas mindestens der Grundgebühr entsprechen. Die Grundgebühr wird unabhängig vom aktuellen Block berechnet und richtet sich stattdessen nach den vorherigen Blöcken. Das macht die Transaktionsgebühren für die Nutzer/Nutzerinnen berechenbarer. Bei der Erstellung des Blocks wird diese **Grundgebühr "verbrannt"** und damit aus dem Verkehr gezogen. +Jeder Block hat eine Grundgebühr, die als Mindestpreis fungiert. Um für die Aufnahme in einen Block in Frage zu kommen, muss der angebotene Preis pro Gas mindestens der Grundgebühr entsprechen. Die Grundgebühr wird unabhängig vom aktuellen Block berechnet und stattdessen durch die vorherigen Blöcke bestimmt, was Transaktionsgebühren für Benutzer vorhersehbarer macht. Wenn der Block erstellt wird, wird diese **Grundgebühr „verbrannt“**, wodurch sie aus dem Verkehr gezogen wird. -Die Grundgebühr wird anhand einer Formel berechnet, die die Größe des vorherigen Blocks (die für alle Transaktionen verwendete Gasmenge) mit der Zielgröße vergleicht. Die Grundgebühr erhöht sich um maximal 12,5 % pro Block, wenn die Zielblockgröße überschritten wird. Dieses exponentielle Wachstum macht es wirtschaftlich unrentabel, die Blockgröße unbegrenzt hoch zu halten. +Die Grundgebühr wird durch eine Formel berechnet, die die Größe des vorherigen Blocks (die Menge an Gas, die für alle Transaktionen verwendet wurde) mit der Zielgröße (der Hälfte des Gaslimits) vergleicht. Die Grundgebühr erhöht oder verringert sich um maximal 12,5 % pro Block, wenn die Zielblockgröße über bzw. unter dem Zielwert liegt. Dieses exponentielle Wachstum macht es wirtschaftlich unrentabel, dass die Blockgröße auf unbestimmte Zeit hoch bleibt. | Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | -| ----------- | ---------------:| ----------------:| --------------------:| -| 1 | 15 m | 0 % | 100 gwei | -| 2 | 30 m | 0 % | 100 gwei | -| 3 | 30 m | 12,5 % | 112,5 gwei | -| 4 | 30 m | 12,5 % | 126,6 gwei | -| 5 | 30 m | 12,5 % | 142,4 gwei | -| 6 | 30 m | 12,5 % | 160,2 gwei | -| 7 | 30 m | 12,5 % | 180,2 gwei | -| 8 | 30 m | 12,5 % | 202,7 gwei | +| ----------- | --------------: | ---------------: | -------------------: | +| 1 | 18M | 0 % | 100 Gwei | +| 2 | 36M | 0 % | 100 Gwei | +| 3 | 36M | 12,5 % | 112,5 Gwei | +| 4 | 36M | 12,5 % | 126,6 Gwei | +| 5 | 36M | 12,5 % | 142,4 Gwei | +| 6 | 36M | 12,5 % | 160,2 Gwei | +| 7 | 36M | 12,5 % | 180,2 Gwei | +| 8 | 36M | 12,5 % | 202,7 Gwei | -Der obigen Tabelle folgend: Um eine Transaktion auf Block Nummer 9 zu erstellen, wird eine Wallet den Nutzer mit Sicherheit wissen lassen, dass die **maximale Grundgebühr**, die dem nächsten Block hinzugefügt wird, `aktuelle Grundgebühr * 112,5%` oder `202,7 gwei * 112,5% = 228,1 gwei` ist. +In der obigen Tabelle wird ein Beispiel mit 36 Millionen als Gaslimit demonstriert. Diesem Beispiel folgend, wird ein Wallet dem Benutzer bei der Erstellung einer Transaktion in Blocknummer 9 mit Sicherheit mitteilen, dass die **maximale Grundgebühr**, die dem nächsten Block hinzugefügt wird, `aktuelle Grundgebühr * 112,5 %` oder `202,7 Gwei * 112,5 % = 228,1 Gwei` beträgt. -Außerdem ist es unwahrscheinlich, dass es zu längeren Zeiträumen mit vollen Blöcken kommt, da die Grundgebühr vor einem vollen Block schnell ansteigt. +Es ist auch wichtig zu beachten, dass es unwahrscheinlich ist, dass wir längere Spitzen von vollen Blöcken sehen werden, da die Grundgebühr vor einem vollen Block sehr schnell ansteigt. | Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | -| ----------- | ---------------:| ----------------:| --------------------:| -| 30 | 30 m | 12,5 % | 2705,6 gwei | +| ----------- | --------------: | ---------------: | -------------------: | +| 30 | 36M | 12,5 % | 2705,6 Gwei | | ... | ... | 12,5 % | ... | -| 50 | 30 m | 12,5 % | 28531,3 gwei | +| 50 | 36M | 12,5 % | 28531,3 Gwei | | ... | ... | 12,5 % | ... | -| 100 | 30 m | 12,5 % | 10302608,6 gwei | +| 100 | 36M | 12,5 % | 10302608,6 Gwei | -### Prioritätsgebühr (Trinkgeld) {#priority-fee} +### Prioritätsgebühr (Trinkgelder) {#priority-fee} -Die Prioritätsgebühr (Trinkgeld) bietet den Validierern einen Anreiz, eine Transaktion in den Block aufzunehmen. Ohne Trinkgeld wäre es für Validierer wirtschaftlich rentabel, leere Blöcke zu schürfen, da sie die gleiche Blockbelohnung erhalten würden. Kleine Trinkgelder geben den Validierern einen minimalen Anreiz, eine Transaktion aufzunehmen. Damit Transaktionen vor anderen Transaktionen im selben Block bevorzugt ausgeführt werden, kann ein höheres Trinkgeld hinzugefügt werden, um zu versuchen, konkurrierende Transaktionen zu überbieten. +Die Prioritätsgebühr (Trinkgeld) bietet Validatoren einen Anreiz, die Anzahl der Transaktionen in einem Block zu maximieren, was nur durch das Block-Gaslimit begrenzt ist. Ohne Trinkgelder könnte ein rationaler Validator weniger – oder sogar null – Transaktionen ohne direkte Strafe auf der Ausführungsebene oder Konsensebene aufnehmen, da Staking-Belohnungen unabhängig davon sind, wie viele Transaktionen sich in einem Block befinden. Darüber hinaus ermöglichen Trinkgelder den Benutzern, andere für die Priorität innerhalb desselben Blocks zu überbieten, was effektiv Dringlichkeit signalisiert. ### Maximale Gebühr {#maxfee} -Um eine Transaktion im Netzwerk auszuführen, können Nutzer/Nutzerinnen ein maximales Limit angeben, das sie bereit sind, für die Ausführung ihrer Transaktion zu bezahlen. Dieser optionale Parameter ist als `maxFeePerGas` bekannt. Damit eine Transaktion ausgeführt werden kann, muss die maximale Gebühr die Summe aus der Grundgebühr und dem Trinkgeld übersteigen. Der Absender der Transaktion erhält die Differenz zwischen der maximalen Gebühr und der Summe aus Grundgebühr und Trinkgeld zurück. +Um eine Transaktion im Netzwerk auszuführen, können Benutzer ein maximales Limit angeben, das sie für die Ausführung ihrer Transaktion zu zahlen bereit sind. Dieser optionale Parameter ist als `maxFeePerGas` bekannt. Damit eine Transaktion ausgeführt werden kann, muss die maximale Gebühr die Summe aus Grundgebühr und Trinkgeld überschreiten. Dem Absender der Transaktion wird die Differenz zwischen der maximalen Gebühr und der Summe aus Grundgebühr und Trinkgeld erstattet. ### Blockgröße {#block-size} -Jeder Block hat eine Zielgröße von 15 Millionen Gas, aber die Größe der Blöcke wird entsprechend der Netznachfrage erhöht oder verringert, bis zur Blockgrenze von 60 Millionen Gas (die zweifache Zielblockgröße). Das Protokoll erreicht durch den Prozess des _Tâtonnement_ eine gleichgewichtige Blockgröße von durchschnittlich 30 Millionen. Das heißt, wenn die Blockgröße die Zielblockgröße übersteigt, erhöht das Protokoll die Grundgebühr für den folgenden Block. Ebenso senkt das Protokoll die Grundgebühr, wenn die Blockgröße kleiner als die Zielblockgröße ist. Der Betrag, um den die Grundgebühr angepasst wird, ist proportional dazu, wie weit die aktuelle Blockgröße vom Zielwert entfernt ist. [Mehr über Blöcke](/developers/docs/blocks/). +Jeder Block hat eine Zielgröße von der Hälfte des aktuellen Gaslimits, aber die Größe der Blöcke wird entsprechend der Netzwerknachfrage steigen oder fallen, bis das Blocklimit erreicht ist (2x die Zielblockgröße). Das Protokoll erreicht eine durchschnittliche Gleichgewichtsblockgröße am Zielwert durch den Prozess des _Tâtonnement_ (Herantasten). Das bedeutet, wenn die Blockgröße größer als die Zielblockgröße ist, erhöht das Protokoll die Grundgebühr für den folgenden Block. Ebenso verringert das Protokoll die Grundgebühr, wenn die Blockgröße kleiner als die Zielblockgröße ist. -### Berechnung der Gasgebühren in der Praxis {#calculating-fees-in-practice} +Der Betrag, um den die Grundgebühr angepasst wird, ist proportional dazu, wie weit die aktuelle Blockgröße vom Zielwert entfernt ist. Dies ist eine lineare Berechnung von -12,5 % für einen leeren Block, 0 % bei der Zielgröße, bis zu +12,5 % für einen Block, der das Gaslimit erreicht. Das Gaslimit kann im Laufe der Zeit basierend auf der Signalisierung der Validatoren sowie durch Netzwerk-Upgrades schwanken. Sie können [die Änderungen des Gaslimits im Laufe der Zeit hier einsehen](https://eth.blockscout.com/stats/averageGasLimit?interval=threeMonths). -Sie können ausdrücklich angeben, wie viel Sie bereit sind zu zahlen, damit Ihre Transaktion ausgeführt wird. Die meisten Anbieter von Wallets legen jedoch automatisch eine empfohlene Transaktionsgebühr fest (Grundgebühr + empfohlene Prioritätsgebühr), um die Komplexität für die Nutzer zu verringern. +[Mehr über Blöcke](/developers/docs/blocks/) + +### Berechnung von Gasgebühren in der Praxis {#calculating-fees-in-practice} + +Sie können explizit angeben, wie viel Sie bereit sind zu zahlen, um Ihre Transaktion ausführen zu lassen. Die meisten Wallet-Anbieter legen jedoch automatisch eine empfohlene Transaktionsgebühr (Grundgebühr + empfohlene Prioritätsgebühr) fest, um die Komplexität für ihre Benutzer zu verringern. ## Warum gibt es Gasgebühren? {#why-do-gas-fees-exist} -Kurzum, Gasgebühren helfen dabei, das Ethereum-Netz sicher zu halten. Indem wir für jede Berechnung, die im Netzwerk ausgeführt wird, eine Gebühr verlangen, verhindern wir, dass Akteure mit böswilligen Absichten das Netzwerk spammen. Um versehentliche oder feindliche Endlosschleifen oder andere Verschwendung von Rechenlast in Code zu vermeiden, muss jede Transaktion eine Grenze für die Anzahl der Rechenschritte festlegen, die sie zur Codeausführung verwenden kann. Die Grundeinheit der Berechnung ist "Gas". +Kurz gesagt, Gasgebühren tragen dazu bei, das Ethereum-Netzwerk sicher zu halten. Indem wir für jede im Netzwerk ausgeführte Berechnung eine Gebühr verlangen, verhindern wir, dass böswillige Akteure das Netzwerk mit Spam überfluten. Um versehentliche oder feindselige Endlosschleifen oder andere Rechenverschwendung im Code zu vermeiden, muss jede Transaktion ein Limit festlegen, wie viele Rechenschritte der Codeausführung sie verwenden darf. Die grundlegende Recheneinheit ist „Gas“. -Auch wenn eine Transaktion ein Limit beinhaltet, wird jedes nicht verbrauchte Gas an den Nutzer zurückgegeben (d. h. `max fee - (base fee + tip)` wird zurückgegeben). +Obwohl eine Transaktion ein Limit enthält, wird jegliches Gas, das in einer Transaktion nicht verwendet wird, an den Benutzer zurückgegeben (z. B. wird `maximale Gebühr - (Grundgebühr + Trinkgeld)` zurückgegeben). -![Diagramm zeigt, wie ungenutztes Gas zurückerstattet wird](../transactions/gas-tx.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramm, das zeigt, wie ungenutztes Gas erstattet wird](../transactions/gas-tx.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## Was ist das Gaslimit? {#what-is-gas-limit} -Das Gaslimit bezieht sich auf die maximale Menge an Gas, die Sie bereit sind, bei einer Transaktion zu verbrauchen. Kompliziertere Transaktionen mit [Smart Contracts](/developers/docs/smart-contracts/) erfordern mehr Rechenarbeit und damit ein höheres Gaslimit als eine einfache Zahlung. Ein Standard-ETH-Transfer erfordert ein Gaslimit von 21.000 Gaseinheiten. +Das Gaslimit bezieht sich auf die maximale Menge an Gas, die Sie für eine Transaktion verbrauchen möchten. Kompliziertere Transaktionen, die [Smart Contracts](/developers/docs/smart-contracts/) beinhalten, erfordern mehr Rechenarbeit, sodass sie ein höheres Gaslimit erfordern als eine einfache Zahlung. Eine Standard-ETH-Überweisung erfordert ein Gaslimit von 21.000 Gaseinheiten. -Wenn Sie zum Beispiel ein Gaslimit von 50.000 für einen einfachen ETH-Transfer festlegen würden, würde die EVM 21.000 verbrauchen und Sie würden die restlichen 29.000 zurückbekommen. Wenn Sie jedoch zu wenig Gas angeben, z. B. ein Gaslimit von 20.000 für einen einfachen ETH-Transfer, wird die EVM Ihre 20.000 Gaseinheiten verbrauchen und versuchen, die Transaktion durchzuführen, aber sie wird nicht abgeschlossen. Die EVM macht dann alle Änderungen rückgängig, da der Validierer jedoch bereits Arbeit im Wert von 20.000 Gaseinheiten geleistet hat, ist dieses Gas verbraucht. +Wenn Sie beispielsweise ein Gaslimit von 50.000 für eine einfache ETH-Überweisung festlegen, würde die EVM 21.000 verbrauchen und Sie würden die restlichen 29.000 zurückerhalten. Wenn Sie jedoch zu wenig Gas angeben, beispielsweise ein Gaslimit von 20.000 für eine einfache ETH-Überweisung, schlägt die Transaktion während der Validierungsphase fehl. Sie wird abgelehnt, bevor sie in einen Block aufgenommen wird, und es wird kein Gas verbraucht. Wenn einer Transaktion hingegen während der Ausführung das Gas ausgeht (z. B. wenn ein Smart Contract auf halbem Weg das gesamte Gas verbraucht), macht die EVM alle Änderungen rückgängig, aber das gesamte bereitgestellte Gas wird dennoch für die geleistete Arbeit verbraucht. -## Warum können die Gasgebühren so hoch sein? {#why-can-gas-fees-get-so-high} +## Warum können Gasgebühren so hoch werden? {#why-can-gas-fees-get-so-high} -Die hohen Gasgebühren sind auf die Beliebtheit von Ethereum zurückzuführen. Wenn die Nachfrage zu groß ist, müssen die Nutzer höhere Trinkgeldbeträge anbieten, um darüber zu versuchen, die Transaktionen anderer Nutzer zu überbieten. Ein höheres Trinkgeld kann die Wahrscheinlichkeit erhöhen, dass Ihre Transaktion in den nächsten Block gelangt. Außerdem führen komplexere Smart-Contract-Anwendungen möglicherweise eine hohle Anzahl an Operationen durch, um ihre Funktionen zu unterstützen, so dass sie viel Gas verbrauchen. +Hohe Gasgebühren sind auf die Beliebtheit von Ethereum zurückzuführen. Wenn die Nachfrage zu groß ist, müssen Benutzer höhere Trinkgeldbeträge anbieten, um zu versuchen, die Transaktionen anderer Benutzer zu überbieten. Ein höheres Trinkgeld kann die Wahrscheinlichkeit erhöhen, dass Ihre Transaktion in den nächsten Block aufgenommen wird. Außerdem führen komplexere Smart-Contract-Apps möglicherweise viele Operationen aus, um ihre Funktionen zu unterstützen, wodurch sie viel Gas verbrauchen. ## Initiativen zur Senkung der Gaskosten {#initiatives-to-reduce-gas-costs} -Die [Skalierbarkeits-Upgrades](/roadmap/) für Ethereum waren letztendlich dazu gedacht, einige der Probleme mit den Gasgebühren lösen. Das wiederum soll die Plattform in die Lage versetzen, Tausende von Transaktionen pro Sekunde zu verarbeiten und global zu skalieren. +Die Ethereum-[Skalierungs-Upgrades](/roadmap/) sollten letztendlich einige der Probleme mit den Gasgebühren beheben, was es der Plattform wiederum ermöglichen wird, Tausende von Transaktionen pro Sekunde zu verarbeiten und global zu skalieren. + +Die Skalierung auf Ebene 2 ist eine primäre Initiative, um die Gaskosten, die Benutzererfahrung und die Skalierbarkeit erheblich zu verbessern. -Die Skalierung auf Layer 2 ist eine der wichtigsten Initiativen, um die Gaskosten, das Nutzererlebnis und die Skalierbarkeit deutlich zu verbessern. [Mehr zur Skalierung mit Layer 2](/developers/docs/scaling/#layer-2-scaling) +[Mehr über die Skalierung auf Ebene 2](/developers/docs/scaling/#layer-2-scaling) -## Gasgebühren überwachen {#monitoring-gas-fees} +## Überwachung von Gasgebühren {#monitoring-gas-fees} -Wenn Sie die Gaspreise überwachen möchten, damit Sie Ihre ETH günstiger verschicken können, stehen Ihnen unterschiedliche Tools zur Verfügung, wie zum Beispiel: +Wenn Sie die Gaspreise überwachen möchten, um Ihre ETH günstiger zu versenden, können Sie viele verschiedene Tools verwenden, wie zum Beispiel: -- [Etherscan](https://etherscan.io/gastracker) _Transaktionsgaspreis-Schätzer_ -- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Chrome-Erweiterung zur Gasschätzung, die sowohl Typ 0 Legacy-Transaktionen als auch Typ 2 EIP-1559-Transaktionen unterstützt_ -- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Berechnen Sie Gasgebühren in Ihrer lokalen Währung für verschiedene Transaktionsarten im Mainnet, Arbitrum und Polygon._ +- [Etherscan](https://etherscan.io/gastracker) _Schätzer für Transaktionsgaspreise_ +- [Blockscout](https://eth.blockscout.com/gas-tracker) _Open-Source-Schätzer für Transaktionsgaspreise_ +- [ETH Gas Tracker](https://www.ethgastracker.com/) _Überwachen und verfolgen Sie die Ethereum- und L2-Gaspreise, um Transaktionsgebühren zu senken und Geld zu sparen_ +- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Chrome-Erweiterung zur Gasschätzung, die sowohl ältere Typ-0-Transaktionen als auch Typ-2-EIP-1559-Transaktionen unterstützt._ +- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Berechnen Sie Gasgebühren in Ihrer lokalen Währung für verschiedene Transaktionstypen im Mainnet, auf Arbitrum und Polygon._ -## Verwandte Werkzeuge {#related-tools} +## Verwandte Tools {#related-tools} -- [Blocknative's Gas Platform](https://www.blocknative.com/gas) _API zur Gasschätzung von Blocknative's Global Mempool Data Platform_ +- [Blocknative's Gas Platform](https://www.blocknative.com/gas) _Gasschätzungs-API, angetrieben von Blocknatives globaler Mempool-Datenplattform_ +- [Gas Network](https://gas.network) Gas-Orakel auf der Blockchain. Unterstützung für über 35 Chains. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ethereum Gas erklärt](https://defiprime.com/gas) -- [Den Gasverbrauch von Smart Contracts reduzieren](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) -- [Strategien für Programmierer zur Optimierung des Gasverbrauchs](https://www.alchemy.com/overviews/solidity-gas-optimization) -- [Spezifikationen zu EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). -- [Tim Beikos EIP-1559-Ressourcen](https://hackmd.io/@timbeiko/1559-resources). +- [Ethereum Gas Explained](https://defiprime.com/gas) +- [Reducing the gas consumption of your Smart Contracts](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) +- [Gas Optimization Strategies for Developers](https://www.alchemy.com/overviews/solidity-gas-optimization) +- [EIP-1559 docs](https://eips.ethereum.org/EIPS/eip-1559). +- [Tim Beiko's EIP-1559 Resources](https://hackmd.io/@timbeiko/1559-resources) +- [EIP-1559: Separating Mechanisms From Memes](https://web.archive.org/web/20241126205908/https://research.2077.xyz/eip-1559-separating-mechanisms-from-memes) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/ides/index.md b/public/content/translations/de/developers/docs/ides/index.md index 71ca31bcf64..0cca73371d5 100644 --- a/public/content/translations/de/developers/docs/ides/index.md +++ b/public/content/translations/de/developers/docs/ides/index.md @@ -1,16 +1,16 @@ --- -title: Integrierte Entwicklungsumgebungen (Integrated Development Environments, IDEs) -description: +title: Integrierte Entwicklungsumgebungen (IDEs) +description: "Erfahren Sie mehr über webbasierte und Desktop-IDEs für die Ethereum-Entwicklung, einschließlich Remix, VS Code und beliebter Plugins." lang: de --- -Wenn es um die Einrichtung einer [integrierten Entwicklungsumgebung (IDE)](https://wikipedia.org/wiki/Integrated_development_environment) geht, lässt sich die Programmierung von Anwendungen auf Ethereum mit der Programmierung jedes anderen Softwareprojekts vergleichen. Die Auswahl ist groß, daher ist es empfehlenswert, die Auswahl der IDE oder des Code-Editors an Ihren Vorstellungen zu orientieren. Vermutlich ist für Ihre Ethereum-Entwicklung die IDE am besten geeignet, die Sie bereits für Ihre herkömmliche Softwareentwicklung nutzen. +Wenn es um die Einrichtung einer [integrierten Entwicklungsumgebung (IDE)](https://wikipedia.org/wiki/Integrated_development_environment) geht, ist die Programmierung von Anwendungen auf Ethereum ähnlich wie bei jedem anderen Softwareprojekt. Es gibt viele Optionen zur Auswahl, also wählen Sie letztendlich die IDE oder den Code-Editor, der am besten zu Ihren Vorlieben passt. Höchstwahrscheinlich ist die beste IDE-Wahl für Ihre Ethereum-Entwicklung die IDE, die Sie bereits für die traditionelle Softwareentwicklung verwenden. ## Webbasierte IDEs {#web-based-ides} -Wenn Sie sich erst einmal mit dem Code vertraut machen möchten, bevor Sie [eine lokale Entwicklungsumgebung aufsetzen](/developers/local-environment/), bieten sich diese Web-Apps an, die für die Entwicklung von Ethereum Smart Contracts konzipiert sind. +Wenn Sie mit Code herumspielen möchten, bevor Sie [eine lokale Entwicklungsumgebung einrichten](/developers/local-environment/), sind diese Web-Apps speziell für die Entwicklung von Ethereum-Smart-Contracts entwickelt worden. -**[Remix](https://remix.ethereum.org/)** - **_Webbasierte IDE mit integrierter statischer Analyse und einer virtuellen Test-Blockchain-Maschine_** +**[Remix](https://remix.ethereum.org/)** - **_Webbasierte IDE mit integrierter statischer Analyse und einer Test-Blockchain Virtual Machine_** - [Dokumentation](https://remix-ide.readthedocs.io/en/latest/#) - [Gitter](https://gitter.im/ethereum/remix) @@ -20,7 +20,7 @@ Wenn Sie sich erst einmal mit dem Code vertraut machen möchten, bevor Sie [eine - [Dokumentation](https://chainide.gitbook.io/chainide-english-1/) - [Hilfeforum](https://forum.chainide.com/) -**[Replit (Solidity Starter - Beta)](https://replit.com/@replit/Solidity-starter-beta)** - **_Eine anpassbare Entwicklungsumgebung für Ethereum mit Hot Reloading, Fehlerprüfung und erstklassiger Testnetz-Unterstützung_** +**[Replit (Solidity Starter - Beta)](https://replit.com/@replit/Solidity-starter-beta)** - **_Eine anpassbare Entwicklungsumgebung für Ethereum mit Hot-Reloading, Fehlerüberprüfung und erstklassiger Testnet-Unterstützung_** - [Dokumentation](https://docs.replit.com/) @@ -32,34 +32,33 @@ Wenn Sie sich erst einmal mit dem Code vertraut machen möchten, bevor Sie [eine ## Desktop-IDEs {#desktop-ides} -Die meisten etablierten IDEs haben Plugins entwickelt, um die Ethereum-Entwicklungserfahrung zu verbessern. Alle bieten mindestens Syntaxhervorhebung für [Smart Contract-Sprachen](/developers/docs/smart-contracts/languages/). +Die meisten etablierten IDEs haben Plugins entwickelt, um die Ethereum-Entwicklungserfahrung zu verbessern. Zumindest bieten sie Syntaxhervorhebung für [Smart-Contract-Sprachen](/developers/docs/smart-contracts/languages/). -**Visual Studio Code -** **_Eine professionelle plattformübergreifende IDE mit offizieller Ethereum-Unterstützung_** +**Visual Studio Code -** **_Professionelle plattformübergreifende IDE mit offizieller Ethereum-Unterstützung_** - [Visual Studio Code](https://code.visualstudio.com/) -- [Azure Blockchain Workbench](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/microsoft-azure-blockchain.azure-blockchain-workbench?tab=Overview) -- [Code-Beispiele](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) +- [Codebeispiele](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) - [GitHub](https://github.com/microsoft/vscode) -**JetBrains IDEs (IntelliJ IDEA, usw.) ** **_Unverzichtbare Werkzeuge für Softwareentwickler und -teams_** +**JetBrains IDEs (IntelliJ IDEA usw.) -** **_Unverzichtbare Werkzeuge für Softwareentwickler und Teams_** - [JetBrains](https://www.jetbrains.com/) - [GitHub](https://github.com/JetBrains) - [IntelliJ Solidity](https://github.com/intellij-solidity/intellij-solidity/) -**Remix Desktop –** **_Erleben Sie Remix IDE auf Ihrem lokalen Rechner_** +**Remix Desktop -** **_Erleben Sie die Remix IDE auf Ihrem lokalen Rechner_** - [Download](https://github.com/ethereum/remix-desktop/releases) - [GitHub](https://github.com/ethereum/remix-desktop) -## Plug-ins und Erweiterungen {#plugins-extensions} +## Plugins und Erweiterungen {#plugins-extensions} -- [Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) – Ethereum-Solidity-Sprache für Visual Studio Code -- [Solidity + Hardhat für VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - Solidity- und Hardhat-Unterstützung durch das Hardhat-Team -- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) – Code-Formatierer mit Prettier +- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - Ethereum Solidity Language für Visual Studio Code +- [Solidity + Hardhat for VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - Solidity- und Hardhat-Unterstützung durch das Hardhat-Team +- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - Code-Formatierer, der Prettier verwendet -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Liste von Alchemy über Ethereum-IDEs_ +- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _– Alchemys Liste von Ethereum-IDEs_ -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/index.md b/public/content/translations/de/developers/docs/index.md index dfb508cc36b..5720f1a2317 100644 --- a/public/content/translations/de/developers/docs/index.md +++ b/public/content/translations/de/developers/docs/index.md @@ -1,18 +1,18 @@ --- -title: Dokumentation zur Ethereum-Entwicklung -description: Einführung in die Entwicklerdokumentation zu ethereum.org. +title: Ethereum-Entwicklungsdokumentation +description: "Einführung in die Entwicklerdokumentation von ethereum.org." lang: de --- -Diese Dokumentation soll Ihnen dabei helfen, mit Ethereum zu entwickeln. Darin wird das Konzept von Ethereum erläutert sowie der Technologie-Stack von Ethereum. Außerdem sind fortgeschrittene Themen für komplexere Anwendungen und Anwendungsfälle dokumentiert. +Diese Dokumentation soll dir bei der Entwicklung mit [Ethereum](/) helfen. Sie behandelt Ethereum als Konzept, erklärt den Ethereum-Tech-Stack und dokumentiert fortgeschrittene Themen für komplexere Anwendungen und Anwendungsfälle. -Diese Dokumentation wird von der Open-Source-Community gepflegt, also zögern Sie nicht, neue Themen vorzuschlagen oder neue Inhalte hinzuzufügen. Geben Sie dabei Beispiele an, wenn das Ihrer Meinung nach hilfreich ist. Die gesamte Entwicklungsdokumentation kann auf GitHub bearbeitet werden. Falls Sie sich nicht sicher sind wie, [befolgen Sie einfach diese Anleitung](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). +Dies ist ein Open-Source-Projekt der Community. Du kannst also gerne neue Themen vorschlagen, neue Inhalte hinzufügen und Beispiele bereitstellen, wo immer du denkst, dass es hilfreich sein könnte. Die gesamte Dokumentation kann über GitHub bearbeitet werden – wenn du dir nicht sicher bist, wie das geht, [folge dieser Anleitung](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). ## Entwicklungsmodule {#development-modules} -Wenn das Ihr erster Versuch bei der Entwicklung mit Ethereum ist, empfehlen wir Ihnen, ganz vorne zu beginnen und sich wie bei einem Buch durchzuarbeiten. +Wenn dies dein erster Versuch in der Ethereum-Entwicklung ist, empfehlen wir, am Anfang zu beginnen und dich wie bei einem Buch durchzuarbeiten. -### Grundsätzliche Themen {#foundational-topics} +### Grundlegende Themen {#foundational-topics} @@ -22,4 +22,4 @@ Wenn das Ihr erster Versuch bei der Entwicklung mit Ethereum ist, empfehlen wir ### Fortgeschritten {#advanced} - + \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/intro-to-ether/index.md b/public/content/translations/de/developers/docs/intro-to-ether/index.md index e6407726993..bb2e7117a38 100644 --- a/public/content/translations/de/developers/docs/intro-to-ether/index.md +++ b/public/content/translations/de/developers/docs/intro-to-ether/index.md @@ -1,78 +1,78 @@ --- -title: Einführung in Ether -description: Eine Einführung für Entwickler in die Kryptowährung Ether. +title: "Technische Einführung in Ether" +description: "Eine Einführung in die Kryptowährung Ether für Entwickler." lang: de --- ## Voraussetzungen {#prerequisites} -Damit du diese Seite besser verstehst, empfehlen wir dir, zuerst [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst die [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Was ist eine Kryptowährung? {#what-is-a-cryptocurrency} -Eine Kryptowährung ist ein Tauschmittel, das durch ein Blockchain-basiertes Ledger gesichert ist. +Eine Kryptowährung ist ein Tauschmittel, das durch einen Blockchain-basierten Ledger gesichert ist. -Ein Tauschmittel ist alles, was allgemein als Zahlungsmittel für Waren und Dienstleistungen akzeptiert wird, und ein Ledger ist ein Datenspeicher, der die Transaktionen aufzeichnet. Die Blockchain-Technologie ermöglicht es den Nutzern, Transaktionen auf dem Ledger durchzuführen, ohne sich auf eine vertrauenswürdige dritte Partei zu verlassen, die dieses verwaltet. +Ein Tauschmittel ist alles, was weithin als Zahlungsmittel für Waren und Dienstleistungen akzeptiert wird, und ein Ledger ist ein Datenspeicher, der Transaktionen aufzeichnet. Die Blockchain-Technologie ermöglicht es Benutzern, Transaktionen auf dem Ledger durchzuführen, ohne sich auf eine vertrauenswürdige dritte Partei verlassen zu müssen, um den Ledger zu verwalten. -Die erste Kryptowährung war Bitcoin, die vom Pseudonym Satoshi Nakamoto erschaffen wurde. Seit der Veröffentlichung von Bitcoin im Jahr 2009 haben Menschen Tausende von Kryptowährungen auf vielen verschiedenen Blockchains geschaffen. +Die erste Kryptowährung war Bitcoin, entwickelt von Satoshi Nakamoto. Seit der Veröffentlichung von Bitcoin im Jahr 2009 wurden Tausende von Kryptowährungen auf vielen verschiedenen Blockchains entwickelt. ## Was ist Ether? {#what-is-ether} -**Ether (ETH)** ist die Kryptowährung, die für viele Dinge im Ethereum-Netzwerk verwendet wird. Grundsätzlich ist es die einzig akzeptable Form der Bezahlung von Transaktionsgebühren, und nach [der Zusammenführung](/roadmap/merge) wird Ether benötigt, um Blöcke auf dem Mainnet zu validieren und vorzuschlagen. Ether werden u. a. auch als primäre Form von Sicherheiten auf den [DeFi](/defi)-Kreditmärkten, als Rechnungseinheit auf NFT-Marktplätzen, als Bezahlung für die Erbringung von Dienstleistungen oder für den Verkauf von Gütern in der realen Welt und mehr verwendet. +**Ether (ETH)** ist die Kryptowährung, die für viele Dinge im Ethereum-Netzwerk verwendet wird. Grundsätzlich ist es die einzige akzeptierte Zahlungsform für Transaktionsgebühren, und nach [The Merge](/roadmap/merge) wird Ether benötigt, um Blöcke im Mainnet zu validieren und vorzuschlagen. Ether wird auch als primäre Form der Sicherheit auf den [DeFi](/defi)-Kreditmärkten, als Rechnungseinheit auf NFT-Marktplätzen, als Zahlung für erbrachte Dienstleistungen oder den Verkauf von realen Gütern und vielem mehr verwendet. -Ethereum ermöglicht es Entwicklern, [**dezentrale Anwendungen (dapps)**](/developers/docs/dapps) zu erstellen, die sich alle einen Pool von Rechenleistung teilen. Da dieser gemeinsame Pool endlich ist, braucht Ethereum einen Mechanismus, um zu bestimmen, wer ihn nutzen darf. Andernfalls könnte eine App versehentlich oder böswillig alle Netzwerkressourcen verbrauchen, was anderen den Zugriff auf die App verwehren würde. +Ethereum ermöglicht es Entwicklern, [**dezentralisierte Anwendungen (Dapps)**](/developers/docs/dapps) zu erstellen, die sich alle einen Pool an Rechenleistung teilen. Dieser gemeinsame Pool ist begrenzt, daher benötigt Ethereum einen Mechanismus, um zu bestimmen, wer ihn nutzen darf. Andernfalls könnte eine Dapp versehentlich oder böswillig alle Netzwerkressourcen verbrauchen, was andere vom Zugriff darauf abhalten würde. -Die Kryptowährung Ether unterstützt einen Preismechanismus für die Rechenleistung von Ethereum. Wenn Nutzer/Nutzerinnen eine Transaktion durchführen wollen, müssen sie Ether bezahlen, damit ihre Transaktion auf der Blockchain anerkannt wird. Diese Nutzungskosten werden als [Gasgebühren](/developers/docs/gas/) bezeichnet, und die Gasgebühr hängt von der Menge an Rechenleistung ab, die für die Ausführung der Transaktion benötigt wird, sowie von der netzwerkweiten Nachfrage nach Rechenleistung zu diesem Zeitpunkt. +Die Kryptowährung Ether unterstützt einen Preismechanismus für die Rechenleistung von Ethereum. Wenn Benutzer eine Transaktion durchführen möchten, müssen sie Ether bezahlen, damit ihre Transaktion auf der Blockchain anerkannt wird. Diese Nutzungskosten werden als [Gasgebühren](/developers/docs/gas/) bezeichnet, und die Gasgebühr hängt von der Menge an Rechenleistung ab, die zur Ausführung der Transaktion erforderlich ist, sowie von der netzwerkweiten Nachfrage nach Rechenleistung zu diesem Zeitpunkt. -Selbst wenn eine böswillige Dapp eine Endlosschleife einreichen würde, ginge der Transaktion irgendwann der Ether aus und sie würde beendet, so dass das Netzwerk wieder zur Normalität zurückkehren könnte. +Selbst wenn eine böswillige Dapp eine Endlosschleife einreichen würde, würde der Transaktion daher irgendwann das Ether ausgehen und sie würde abgebrochen werden, sodass das Netzwerk zum Normalzustand zurückkehren kann. -Es ist üblich, Ethereum und Ether [zu verwechseln](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845); wenn Leute den "Preis von Ethereum" erwähnen, beschreiben sie den Preis von Ether. +Es ist [üblich, Ethereum und Ether zu verwechseln](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845) – wenn Leute vom „Preis von Ethereum“ sprechen, meinen sie eigentlich den Preis von Ether. -## Ether-Minting {#minting-ether} +## Prägen von Ether {#minting-ether} -Minting ist der Prozess, bei dem neuer Ether im Ethereum-Ledger erstellt wird. Das zugrundeliegende Ethereum-Protokoll erstellt den neuen Ether, und es ist nicht möglich, dass ein Nutzer Ether erstellt. +Das Prägen ist der Prozess, bei dem neues Ether auf dem Ethereum-Ledger erstellt wird. Das zugrunde liegende Ethereum-Protokoll erstellt das neue Ether, und es ist für einen Benutzer nicht möglich, Ether zu erstellen. -Ether wird als Belohnung für jeden vorgeschlagenen Block und an jedem Epochen-Checkpoint für andere Validierungsaktivitäten geprägt, die mit dem Erreichen des Konsenses in Zusammenhang stehen. Der Gesamtbetrag, der ausgegeben wird, hängt von der Anzahl der Validatoren und der Höhe ihrer Einsätze ab. Diese Gesamtausgabe wird im Idealfall, wenn alle Validierer ehrlich und online sind, gleichmäßig unter den Validierern aufgeteilt, doch in der Realität variiert sie je nach Leistung der Validierer. Etwa 1/8 der Gesamtausgabe geht an den Block-Vorschlagenden, der Rest wird auf die weiteren Validierer verteilt. Block-Vorschlagende erhalten auch Trinkgelder aus Transaktionsgebühren und MEV-bezogenen Einnahmen, aber diese stammen aus recyceltem Ether, nicht aus der Neuausstellung. +Ether wird als Belohnung für jeden vorgeschlagenen Block und an jedem Epochen-Checkpoint für andere Validator-Aktivitäten im Zusammenhang mit der Konsensfindung geprägt. Die insgesamt ausgegebene Menge hängt von der Anzahl der Validatoren ab und davon, wie viel Ether sie als Einsatz hinterlegt haben. Diese gesamte Emission wird im Idealfall, dass alle Validatoren ehrlich und online sind, gleichmäßig unter den Validatoren aufgeteilt, variiert in der Realität jedoch je nach Leistung der Validatoren. Etwa 1/8 der gesamten Emission geht an den Block-Vorschlagenden; der Rest wird auf die anderen Validatoren verteilt. Block-Vorschlagende erhalten auch Trinkgelder aus Transaktionsgebühren und MEV-bezogenen Einnahmen, aber diese stammen aus recyceltem Ether, nicht aus einer neuen Emission. -## Ether verbrennen {#burning-ether} +## Verbrennen von Ether {#burning-ether} -Neben der Erzeugung von Ether durch Blockbelohnungen kann Ether auch durch einen Prozess namens "Burning" zerstört werden. Wenn Ether verbrannt wird, wird er dauerhaft aus dem Verkehr gezogen. +Neben der Erstellung von Ether durch Block-Belohnungen kann Ether auch durch einen Prozess namens „Verbrennen“ (Burning) zerstört werden. Wenn Ether verbrannt wird, wird es dauerhaft aus dem Verkehr gezogen. -Bei jeder Transaktion auf Ethereum wird Ether verbrannt. Wenn Nutzer für ihre Transaktionen bezahlen, wird eine grundlegende Gasgebühr vernichtet, die vom Netzwerk entsprechend der Transaktion festgelegt wird. Dies, zusammen mit variablen Blockgrößen und einer maximalen Gasgebühr, vereinfacht die Abschätzung der Transaktionsgebühren auf Ethereum. Wenn die Nachfrage im Netzwerk hoch ist, können [Blöcke](https://etherscan.io/block/12965263) mehr Ether verbrauchen, als sie minten, wodurch die Ausgabe von Ether effektiv ausgeglichen wird. +Das Verbrennen von Ether findet bei jeder Transaktion auf Ethereum statt. Wenn Benutzer für ihre Transaktionen bezahlen, wird eine Grundgebühr für Gas, die vom Netzwerk entsprechend der Transaktionsnachfrage festgelegt wird, zerstört. Dies, gepaart mit variablen Blockgrößen und einer maximalen Gasgebühr, vereinfacht die Schätzung der Transaktionsgebühr auf Ethereum. Wenn die Netzwerknachfrage hoch ist, können [Blöcke](https://eth.blockscout.com/block/22580057) mehr Ether verbrennen, als sie prägen, was die Ether-Emission effektiv ausgleicht. -Das Verbrennen der Grundgebühr verhindert, dass ein Block-Produzent Transaktionen manipulieren kann. Wenn beispielsweise Block-Ersteller die Grundgebühr erhalten, könnten sie ihre eigenen Transaktionen kostenlos einbeziehen und die Grundgebühr für alle anderen erhöhen. Alternativ könnten sie die Grundgebühr an einige Nutzer außerhalb der Kette zurückerstatten, was zu einem undurchsichtigen und komplexen Markt für Transaktionsgebühren führen würde. +Das Verbrennen der Grundgebühr erschwert es einem Blockproduzenten, Transaktionen zu manipulieren. Wenn Blockproduzenten beispielsweise die Grundgebühr erhalten würden, könnten sie ihre eigenen Transaktionen kostenlos einbeziehen und die Grundgebühr für alle anderen erhöhen. Alternativ könnten sie einigen Benutzern die Grundgebühr Off-Chain erstatten, was zu einem undurchsichtigeren und komplexeren Markt für Transaktionsgebühren führen würde. -## Stückelung von Ether {#denominations} +## Stückelungen von Ether {#denominations} -Da der Wert vieler Transaktionen auf Ethereum gering ist, hat Ether mehrere Stückelungen, die als kleinere Rechnungseinheiten bezeichnet werden können. Von diesen Stückelungen sind Wei und gwei besonders wichtig. +Da der Wert vieler Transaktionen auf Ethereum gering ist, hat Ether mehrere Stückelungen, die als kleinere Rechnungseinheiten bezeichnet werden können. Von diesen Stückelungen sind Wei und Gwei besonders wichtig. -Wei ist die kleinstmögliche Menge an Ether. Daher basieren viele technische Implementierungen, wie das [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), auf Berechnungen in Wei. +Wei ist die kleinstmögliche Menge an Ether, und infolgedessen basieren viele technische Implementierungen, wie das [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), alle Berechnungen auf Wei. -Gwei, kurz für Giga-Wei, wird oft verwendet, um die Gaskosten auf Ethereum zu beschreiben. +Gwei, kurz für Giga-Wei, wird oft verwendet, um Gaskosten auf Ethereum zu beschreiben. -| Stückelung | Wert in Ether | Häufige Verwendung | -| ---------- | ---------------- | ------------------------------ | -| Wei | 10-18 | Technische Implementierungen | -| Gwei | 10-9 | Menschlich lesbare Gasgebühren | +| Stückelung | Wert in Ether | Häufige Verwendung | +| ------------ | ---------------- | ------------------------- | +| Wei | 10-18 | Technische Implementierungen | +| Gwei | 10-9 | Für Menschen lesbare Gasgebühren | -## Überweisung von Ether {#transferring-ether} +## Überweisen von Ether {#transferring-ether} -Jede Transaktion auf Ethereum enthält ein `value`-Feld, das den zu überweisenden Ether-Betrag in Wei angibt, der von der Adresse des Absenders an die Adresse des Empfängers gesendet wird. +Jede Transaktion auf Ethereum enthält ein `value`-Feld, das die Menge an Ether angibt, die in Wei gestückelt von der Adresse des Absenders an die Adresse des Empfängers gesendet werden soll. -Wenn es sich bei der Empfängeradresse um einen [Smart Contract](/developers/docs/smart-contracts/) handelt, kann dieser übertragene Ether zum Bezahlen von Gas verwendet werden, wenn der Smart Contract seinen Code ausführt. +Wenn die Empfängeradresse ein [Smart Contract](/developers/docs/smart-contracts/) ist, kann dieses überwiesene Ether verwendet werden, um für Gas zu bezahlen, wenn der Smart Contract seinen Code ausführt. -[Weitere Informationen zu Transaktionen](/developers/docs/transactions/) +[Mehr zu Transaktionen](/developers/docs/transactions/) -## Ether-Saldo abfragen {#querying-ether} +## Abfragen von Ether {#querying-ether} -Nutzer können den Ether-Saldo jedes [Kontos](/developers/docs/accounts/) abfragen, indem sie das `balance`-Feld des Kontos einsehen, das den Ether-Bestand in Wei anzeigt. +Benutzer können das Ether-Guthaben jedes [Kontos](/developers/docs/accounts/) abfragen, indem sie das `balance`-Feld des Kontos überprüfen, das die Ether-Bestände in Wei anzeigt. -[Etherscan](https://etherscan.io) ist ein beliebtes Tool zur Überprüfung von Adresssalden über eine webbasierte Anwendung. Zum Beispiel zeigt [diese Etherscan-Seite](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae) den Kontostand der Ethereum Foundation. Kontostände können auch über Wallets oder direkt durch Anfragen an die Knoten abgefragt werden. +[Etherscan](https://etherscan.io) und [Blockscout](https://eth.blockscout.com) sind beliebte Tools, um Adressguthaben über webbasierte Anwendungen zu überprüfen. Zum Beispiel zeigt [diese Blockscout-Seite](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) das Guthaben der Ethereum Foundation. Kontostände können auch über Wallets oder direkt durch Anfragen an Blockchain-Knoten abgefragt werden. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Definition von Ether und Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) - _CME Group_ -- [Ethereum Whitepaper](/whitepaper/): Der ursprüngliche Vorschlag für Ethereum. Dieses Dokument enthält eine Beschreibung von Ether und der Beweggründe für seine Entstehung. -- [Gwei-Rechner](https://www.alchemy.com/gwei-calculator): Dieser Gwei-Rechner konvertiert Wei, Gwei und Ether. Geben Sie einfach einen Betrag an Wei, Gwei oder ETH ein, die Umrechnung erhalten Sie automatisch. +- [Definition von Ether und Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_ +- [Ethereum-Whitepaper](/whitepaper/): Der ursprüngliche Vorschlag für Ethereum. Dieses Dokument enthält eine Beschreibung von Ether und die Motivationen hinter seiner Erschaffung. +- [Gwei-Rechner](https://www.alchemy.com/gwei-calculator): Verwenden Sie diesen Gwei-Rechner, um Wei, Gwei und Ether einfach umzurechnen. Geben Sie einfach einen beliebigen Betrag in Wei, Gwei oder ETH ein und berechnen Sie automatisch die Umrechnung. -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/intro-to-ethereum/index.md b/public/content/translations/de/developers/docs/intro-to-ethereum/index.md index d7481551ac1..01409e41454 100644 --- a/public/content/translations/de/developers/docs/intro-to-ethereum/index.md +++ b/public/content/translations/de/developers/docs/intro-to-ethereum/index.md @@ -1,116 +1,124 @@ --- -title: Einleitung zu Ethereum -description: Die Einführung eines dApp Entwicklers in die Kernkonzepte von Ethereum. +title: "Technische Einführung in Ethereum" +description: "Eine Einführung in die Kernkonzepte von Ethereum für Dapp-Entwickler." lang: de --- ## Was ist eine Blockchain? {#what-is-a-blockchain} -Eine Blockchain wird am besten als öffentliche Datenbank beschrieben, die über viele Computer in einem Netzwerk aktualisiert und geteilt wird. +Eine Blockchain ist eine öffentliche Datenbank, die über viele Computer in einem Netzwerk hinweg aktualisiert und geteilt wird. -"Block" bezieht sich auf die Tatsache, dass Daten und Zustand in sequenziellen Batches oder "Blocks" gespeichert werden. Wenn du ETH an jemand anderen sendest, müssen die Transaktionsdaten zu einem Block hinzugefügt werden, damit der Vorgang erfolgreich ist. +„Block“ bezieht sich auf Daten und Zustände, die in aufeinanderfolgenden Gruppen, den sogenannten „Blöcken“, gespeichert werden. Wenn Sie ETH an jemand anderen senden, müssen die Transaktionsdaten zu einem Block hinzugefügt werden, damit die Transaktion erfolgreich ist. -"Chain" bezieht sich auf die Tatsache, dass jeder Block kryptographisch auf seinen vorherigen Block verweist. Mit anderen Worten: Blöcke werden aneinandergekettet. Die Daten in einem Block können sich nicht ändern, ohne alle nachfolgenden Blöcke zu ändern, was den Konsens des gesamten Netzwerks erfordern würde. +„Chain“ (Kette) bezieht sich auf die Tatsache, dass jeder Block kryptografisch auf seinen Vorgänger verweist. Mit anderen Worten: Blöcke werden miteinander verkettet. Die Daten in einem Block können nicht geändert werden, ohne alle nachfolgenden Blöcke zu ändern, was den Konsens des gesamten Netzwerks erfordern würde. -Jeder Computer im Netzwerk muss jedem neuen Block und der Kette als Ganzes zustimmen. Diese Computer werden als " Nodes" bezeichnet. Die Nodes stellen sicher, dass jeder, der mit der Blockchain interagiert, die gleichen Daten hat. Um diese verteilte Vereinbarung zu erreichen, brauchen Blockchains einen Konsensmechanismus. +Jeder Computer im Netzwerk muss jedem neuen Block und der Kette als Ganzes zustimmen. Diese Computer sind als „Blockchain-Knoten“ bekannt. Blockchain-Knoten stellen sicher, dass jeder, der mit der Blockchain interagiert, über dieselben Daten verfügt. Um diese verteilte Einigung zu erreichen, benötigen Blockchains einen Konsensmechanismus. -Ethereum verwendet einen [Proof-of-Stake-basierten Konsensmechanismus](/developers/docs/consensus-mechanisms/pos/). Jeder, der der Chain neue Blöcke hinzufügen möchte, muss seine ETH – die native Kryptowährung der Ethereum-Blockchain – staken, die als Sicherheit und zum Ausführen der Validatorsoftware verwendet werden können. Diese "Validatoren" können dann nach dem Zufallsprinzip ausgewählt werden, um Blöcke einzureichen, die dann zur Überprüfung an andere Validatoren gesendet und zur Blockchain hinzugefügt werden. Es gibt ein System mit Belohnungen bzw. Strafen, das für die Teilnehmer einen starken Anreiz darstellt, ehrlich zu agieren und weitestgehend online verfügbar zu sein. +[Ethereum](/) verwendet einen [Proof-of-Stake-basierten Konsensmechanismus](/developers/docs/consensus-mechanisms/pos/). Jeder, der der Kette neue Blöcke hinzufügen möchte, muss ETH – die native Kryptowährung in Ethereum – als Einsatz hinterlegen (staken) und eine Validator-Software ausführen. Diese „Validatoren“ können dann zufällig ausgewählt werden, um Blöcke vorzuschlagen, die andere Validatoren überprüfen und der Blockchain hinzufügen. Es gibt ein System von Belohnungen und Strafen, das den Teilnehmern starke Anreize bietet, ehrlich zu sein und so oft wie möglich online verfügbar zu sein. -Wenn Sie sehen möchten, wie Blockchain-Daten gehasht und anschließend an den Verlauf der Blockreferenzen angehängt werden, sollten Sie sich [diese Demo](https://andersbrownworth.com/blockchain/blockchain) von Anders Brownworth und das dazugehörige Video unten ansehen. +Wenn Sie sehen möchten, wie Blockchain-Daten gehasht und anschließend an die Historie der Blockverweise angehängt werden, sollten Sie sich [diese Demo](https://andersbrownworth.com/blockchain/blockchain) von Anders Brownworth ansehen und das dazugehörige Video unten betrachten. -Sehen Sie sich die Erklärung von Anders Brownworth zu Blockchains an: +Sehen Sie sich an, wie Anders Hashes in Blockchains erklärt: ## Was ist Ethereum? {#what-is-ethereum} -Ethereum ist eine Blockchain mit einem eingebetteten Computer. Dieser ist die Grundlage für den Aufbau von Anwendungen und Organisationen auf dezentrale, genehmigungsfreie und zensurresistente Weise. +Ethereum ist eine Blockchain mit einem eingebetteten Computer. Es ist die Grundlage für den Aufbau von Anwendungen und Organisationen auf dezentralisierte, erlaubnisfreie und zensurresistente Weise. -Im Ethereum-Ökosystem gibt es einen einzigen kanonischen Computer (genannt die virtuelle Ethereum-Maschine oder kurz EVM), dessen alle Teilnehmer jeder im Ethereum-Netzwerk zustimmen. Jeder, der am Ethereum-Netzwerk (jeder Ethereum-Knoten) teilnimmt, behält eine Kopie des Zustands dieses Computers. Zusätzlich kann jeder Teilnehmer eine Anfrage an diesen Computer senden, um beliebige Berechnungen durchzuführen. Wenn eine solche Anfrage gesendet wird, überprüfen andere Teilnehmenden im Netzwerk die Berechnung und führen sie aus ("execute"). Diese Ausführung führt zu einer Zustandsänderung in der EVM, die bestätigt und im gesamten Netzwerk verbreitet wird. +Im Ethereum-Universum gibt es einen einzigen, kanonischen Computer (die sogenannte Ethereum Virtual Machine oder EVM), auf dessen Zustand sich alle im Ethereum-Netzwerk einigen. Jeder, der am Ethereum-Netzwerk teilnimmt (jeder Ethereum-Blockchain-Knoten), behält eine Kopie des Zustands dieses Computers. Darüber hinaus kann jeder Teilnehmer eine Anfrage an diesen Computer senden, um beliebige Berechnungen durchzuführen. Wann immer eine solche Anfrage gesendet wird, verifizieren, validieren und führen andere Teilnehmer im Netzwerk die Berechnung aus. Diese Ausführung verursacht eine Zustandsänderung in der EVM, die festgeschrieben und im gesamten Netzwerk verbreitet wird. -Rechenanfragen werden als Transaktionsanfragen bezeichnet; die Aufzeichnung aller Transaktionen und des aktuellen Zustands der EVM wird auf der Blockchain gespeichert, die wiederum von allen Knoten gespeichert und vereinbart wird. +Anfragen für Berechnungen werden als Transaktionsanfragen bezeichnet; die Aufzeichnung aller Transaktionen und der aktuelle Zustand der EVM werden auf der Blockchain gespeichert, die wiederum von allen Blockchain-Knoten gespeichert und abgestimmt wird. -Kryptographische Mechanismen stellen sicher, dass Transaktionen, die einmal als gültig verifiziert und in die Blockchain aufgenommen wurden, später nicht mehr manipuliert werden können. Dieselben Mechanismen stellen auch sicher, dass alle Transaktionen signiert und mit den entsprechenden "Berechtigungen" ausgeführt werden (niemand außer Alice selbst sollte in der Lage sein, digitale Vermögenswerte von ihrem Konto zu versenden). +Kryptografische Mechanismen stellen sicher, dass Transaktionen, sobald sie als gültig verifiziert und der Blockchain hinzugefügt wurden, später nicht mehr manipuliert werden können. Dieselben Mechanismen stellen auch sicher, dass alle Transaktionen mit den entsprechenden „Berechtigungen“ signiert und ausgeführt werden (niemand sollte in der Lage sein, digitale Vermögenswerte von Alices Konto zu senden, außer Alice selbst). ## Was ist Ether? {#what-is-ether} -**Ether (ETH)** ist die native Kryptowährung von Ethereum. Der Zweck von ETH ist es, einen Markt für Berechnungen zu ermöglichen. Ein solcher Markt bietet einen wirtschaftlichen Anreiz für die Teilnehmenden, Transaktionsanfragen zu verifizieren und auszuführen und dem Netzwerk Rechenressourcen zur Verfügung zu stellen. +**Ether (ETH)** ist die native Kryptowährung von Ethereum. Der Zweck von ETH ist es, einen Markt für Berechnungen zu ermöglichen. Ein solcher Markt bietet einen wirtschaftlichen Anreiz für die Teilnehmer, Transaktionsanfragen zu verifizieren und auszuführen sowie dem Netzwerk Rechenressourcen zur Verfügung zu stellen. -Jeder Teilnehmer, der eine Transaktionsanforderung sendet, muss dem Netzwerk auch einen gewissen Betrag an ETH als Prämie anbieten. Das Netzwerk verbrennt einen Teil des Kopfgelds und gewährt den Rest der Person, die letztendlich die Transaktion verifiziert, ausführt, für die Blockchain bereitstellt und auf das Netzwerk überträgt. +Jeder Teilnehmer, der eine Transaktionsanfrage sendet, muss dem Netzwerk auch einen bestimmten Betrag an ETH als Belohnung anbieten. Das Netzwerk verbrennt einen Teil der Belohnung und vergibt den Rest an denjenigen, der letztendlich die Arbeit erledigt, die Transaktion zu verifizieren, auszuführen, auf der Blockchain festzuschreiben und an das Netzwerk zu senden. -Die Höhe der gezahlten ETH entspricht den für die Berechnung benötigten Ressourcen. Diese Prämien verhindern auch, dass böswillige Teilnehmer das Netzwerk absichtlich verstopfen, indem sie die Ausführung unendlicher Berechnungen oder anderer ressourcenintensiver Skripte anfordern, da diese Teilnehmer für die Berechnungsressourcen bezahlen müssen. +Die Menge der gezahlten ETH entspricht den Ressourcen, die für die Berechnung erforderlich sind. Diese Belohnungen verhindern auch, dass böswillige Teilnehmer das Netzwerk absichtlich verstopfen, indem sie die Ausführung unendlicher Berechnungen oder anderer ressourcenintensiver Skripte anfordern, da diese Teilnehmer für die Rechenressourcen bezahlen müssen. -ETH wird auch verwendet, um dem Netzwerk auf drei Arten kryptoökonomische Sicherheit zu geben: 1) Es wird als Mittel zur Belohnung von Validierern verwendet, die Blöcke vorschlagen oder unehrliches Verhalten anderer Validierer aufdecken; 2) Es wird von Validierern als Sicherheit gegen unehrliches Verhalten eingesetzt – wenn Validierer versuchen, sich falsch zu verhalten, kann das die Zerstörung ihrer ETH zur Folge haben; 3) Es wird verwendet, um "Stimmen" für neu vorgeschlagene Blöcke abzuwägen, was in die Fork-Auswahl des Konsensmechanismus einfließt. +ETH wird auch verwendet, um dem Netzwerk auf drei Hauptarten kryptoökonomische Sicherheit zu bieten: 1) Es wird als Mittel verwendet, um Validatoren zu belohnen, die Blöcke vorschlagen oder unehrliches Verhalten anderer Validatoren aufdecken; 2) Es wird von Validatoren als Einsatz hinterlegt (gestaket) und dient als Sicherheit gegen unehrliches Verhalten – wenn Validatoren versuchen, sich falsch zu verhalten, können ihre ETH zerstört werden; 3) Es wird verwendet, um „Stimmen“ für neu vorgeschlagene Blöcke zu gewichten, was in den Fork-Choice-Teil des Konsensmechanismus einfließt. ## Was sind Smart Contracts? {#what-are-smart-contracts} -In der Praxis schreiben die Teilnehmenden nicht jedes Mal einen neuen Code, wenn sie eine Berechnung auf der EVM anfordern wollen. Vielmehr laden Anwendungsentwickler Programme (wiederverwendbare Codeschnipsel) in den EVM-Speicher hoch, und die Nutzer stellen Anfragen, um diese Codeschnipsel mit unterschiedlichen Parametern auszuführen. Wir nennen die Programme, die hochgeladen und durch das Netzwerk ausgeführt werden, Smart Contracts (intelligente Verträge). +In der Praxis schreiben die Teilnehmer nicht jedes Mal neuen Code, wenn sie eine Berechnung auf der EVM anfordern möchten. Vielmehr laden Anwendungsentwickler Programme (wiederverwendbare Code-Schnipsel) in den EVM-Zustand hoch, und Benutzer stellen Anfragen, um diese Code-Schnipsel mit unterschiedlichen Parametern auszuführen. Wir nennen die Programme, die in das Netzwerk hochgeladen und von diesem ausgeführt werden, „Smart Contracts“. -Ganz grundsätzlich können Sie sich einen Smart Contract wie eine Art Verkaufsautomat vorstellen: ein Skript, das, wenn es mit bestimmten Parametern aufgerufen wird, bestimmte Aktionen oder Berechnungen durchführt, wenn bestimmte Bedingungen erfüllt sind. Zum Beispiel könnte ein einfacher Verkäufer-Smart-Contract das Eigentum an einem digitalen Vermögenswert schaffen und zuweisen, wenn der Aufrufer ("caller") ETH an einen bestimmten Empfänger sendet. +Auf einer sehr grundlegenden Ebene können Sie sich einen Smart Contract wie eine Art Verkaufsautomaten vorstellen: ein Skript, das, wenn es mit bestimmten Parametern aufgerufen wird, einige Aktionen oder Berechnungen durchführt, sofern bestimmte Bedingungen erfüllt sind. Zum Beispiel könnte ein einfacher Verkäufer-Smart-Contract das Eigentum an einem digitalen Vermögenswert erstellen und zuweisen, wenn der Aufrufer ETH an einen bestimmten Empfänger sendet. -Jeder Entwickler kann einen Smart Contract erstellen und im Netzwerk öffentlich machen, während die Blockchain als Datenebene gegen eine Gebühr an das Netzwerk genutzt wird. Jeder Benutzer kann dann, wiederum gegen eine Gebühr an das Netzwerk, den Smart Contract aufrufen, um seinen Code auszuführen. +Jeder Entwickler kann einen Smart Contract erstellen und ihn für das Netzwerk öffentlich machen, wobei die Blockchain als Datenschicht genutzt wird, gegen eine an das Netzwerk gezahlte Gebühr. Jeder Benutzer kann dann den Smart Contract aufrufen, um seinen Code auszuführen, wiederum gegen eine an das Netzwerk gezahlte Gebühr. -Mit Smart Contracts können Entwickler und Entwicklerinnen beliebig komplexe nutzerorientierte Apps und Dienste entwickeln und bereitstellen, wie z. B. Marktplätze, Finanzinstrumente, Spiele etc. +Somit können Entwickler mit Smart Contracts beliebig komplexe benutzerorientierte Anwendungen und Dienste erstellen und bereitstellen, wie z. B.: Marktplätze, Finanzinstrumente, Spiele usw. ## Terminologie {#terminology} ### Blockchain {#blockchain} -Die Sequenz aller Blöcke, die dem Ethereum-Netzwerk in der Geschichte des Netzwerks übertragen wurden. Sie werden so genannt, weil jeder Block einen Verweis auf den vorherigen Block enthält. Das hilft uns, eine Ordnung über alle Blöcke (und damit über den genauen Verlauf) zu erhalten. +Die Abfolge aller Blöcke, die in der Geschichte des Netzwerks im Ethereum-Netzwerk festgeschrieben wurden. So benannt, weil jeder Block einen Verweis auf den vorherigen Block enthält, was uns hilft, eine Reihenfolge über alle Blöcke (und damit über die genaue Historie) aufrechtzuerhalten. ### ETH {#eth} -**Ether (ETH)** ist die einheimische Kryptowährung von Ethereum. Nutzer zahlen ETH an andere Nutzer, damit ihre Anfragen zur Ausführung des Codes erfüllt werden. +**Ether (ETH)** ist die native Kryptowährung von Ethereum. Benutzer zahlen ETH an andere Benutzer, um ihre Anfragen zur Codeausführung erfüllen zu lassen. [Mehr zu ETH](/developers/docs/intro-to-ether/) ### EVM {#evm} -Die virtuelle Ethereum-Machine ist der globale virtuelle Computer, dessen Zustand jeder Teilnehmer im Ethereum-Netzwerk speichert und dem er zustimmt. Jeder Teilnehmer kann die Ausführung von beliebigem Code auf der EVM beantragen. Jede Codeausführung ändert den Zustand der EVM. +Die Ethereum Virtual Machine ist der globale virtuelle Computer, dessen Zustand jeder Teilnehmer im Ethereum-Netzwerk speichert und dem er zustimmt. Jeder Teilnehmer kann die Ausführung von beliebigem Code auf der EVM anfordern; die Codeausführung ändert den Zustand der EVM. [Mehr zur EVM](/developers/docs/evm/) -### Nodes {#nodes} +### Blockchain-Knoten {#nodes} -Die realen Maschinen, die den EVM-Zustand speichern. Knoten kommunizieren miteinander, um Informationen über den EVM-Zustand und neue Zustandsänderungen zu verbreiten. Alle Nutzer können auch die Ausführung von Code anfordern, indem sie eine Anfrage zur Codeausführung von einem Knoten aus senden. Das Ethereum-Netzwerk selbst ist das Aggregat aller Ethereum-Knoten und deren Kommunikation. +Die realen Maschinen, die den EVM-Zustand speichern. Blockchain-Knoten kommunizieren miteinander, um Informationen über den EVM-Zustand und neue Zustandsänderungen zu verbreiten. Jeder Benutzer kann auch die Ausführung von Code anfordern, indem er eine Codeausführungsanfrage von einem Blockchain-Knoten sendet. Das Ethereum-Netzwerk selbst ist die Gesamtheit aller Ethereum-Blockchain-Knoten und ihrer Kommunikation. -[Mehr zu Nodes](/developers/docs/nodes-and-clients/) +[Mehr zu Blockchain-Knoten](/developers/docs/nodes-and-clients/) ### Konten {#accounts} -Wo ETH gespeichert wird: Benutzer können Konten eröffnen, ETH auf diese Konten einzahlen und ETH von ihren Konten an andere Benutzer übertragen. Konten und Kontostände werden in einer großen Tabelle in der EVM gespeichert. Sie sind Teil der EVM-Zustands. +Wo ETH gespeichert wird. Benutzer können Konten initialisieren, ETH auf die Konten einzahlen und ETH von ihren Konten an andere Benutzer überweisen. Konten und Kontostände werden in einer großen Tabelle in der EVM gespeichert; sie sind ein Teil des gesamten EVM-Zustands. -[Mehr über Konten](/developers/docs/accounts/) +[Mehr zu Konten](/developers/docs/accounts/) ### Transaktionen {#transactions} -Eine "Transaktionsanfrage" ist der formale Begriff für eine Anfrage zur Codeausführung auf der EVM, und eine "Transaktion" ist eine erfüllte Transaktionsanfrage und die damit verbundene Änderung des EVM-Zustands. Jeder Benutzer kann eine Transaktionsanfrage an das Netzwerk von einem Knoten aus senden. Damit sich die Transaktionsanfrage auf den vereinbarten EVM-Zustand auswirkt, muss sie von einem anderen Knoten validiert, ausgeführt und an das Netzwerk übertragen werden. Die Ausführung eines Codes führt zu einer Zustandsänderung in der EVM. Nach der Integration wird diese Zustandsänderung an alle Knoten im Netzwerk übertragen. Einige Beispiele für Transaktionen: +Eine „Transaktionsanfrage“ ist der formale Begriff für eine Anfrage zur Codeausführung auf der EVM, und eine „Transaktion“ ist eine erfüllte Transaktionsanfrage und die damit verbundene Änderung im EVM-Zustand. Jeder Benutzer kann eine Transaktionsanfrage von einem Blockchain-Knoten an das Netzwerk senden. Damit die Transaktionsanfrage den vereinbarten EVM-Zustand beeinflusst, muss sie von einem anderen Blockchain-Knoten validiert, ausgeführt und „im Netzwerk festgeschrieben“ werden. Die Ausführung von beliebigem Code verursacht eine Zustandsänderung in der EVM; nach der Festschreibung wird diese Zustandsänderung an alle Blockchain-Knoten im Netzwerk gesendet. Einige Beispiele für Transaktionen: -- X ETH von meinem Konto an das Konto von Alice senden. -- Veröffentliche Smart-Contract-Code in den EVM-Zustand. -- Führe den Code des Smart Contracts unter Adresse X in der EVM mit Argumenten Y aus. +- Sende X ETH von meinem Konto auf Alices Konto. +- Veröffentliche etwas Smart-Contract-Code im EVM-Zustand. +- Führe den Code des Smart Contracts an der Adresse X in der EVM mit den Argumenten Y aus. [Mehr zu Transaktionen](/developers/docs/transactions/) ### Blöcke {#blocks} -Da das Transaktionsvolumen sehr hoch ist, werden die Transaktionen in Stapeln oder Blöcken "übertragen". Blöcke enthalten in der Regel Dutzende bis Hunderte von Transaktionen. +Das Volumen der Transaktionen ist sehr hoch, daher werden Transaktionen in Stapeln oder Blöcken „festgeschrieben“. Blöcke enthalten im Allgemeinen Dutzende bis Hunderte von Transaktionen. [Mehr zu Blöcken](/developers/docs/blocks/) ### Smart Contracts {#smart-contracts} -Ein wiederverwendbarer Codeschnipsel (ein Programm), den ein Entwickler in den EVM-Zustand veröffentlicht. Jeder kann anfragen, dass der Smart-Contract-Code ausgeführt wird, indem er eine Transaktionsanfrage stellt. Da Entwickler beliebige ausführbare Anwendungen in die EVM (Spiele, Marktplätze, Finanzinstrumente etc.) schreiben können, werden diese oft auch [dApps oder dezentralisierte Apps](/developers/docs/dapps/) genannt. +Ein wiederverwendbares Code-Schnipsel (ein Programm), das ein Entwickler im EVM-Zustand veröffentlicht. Jeder kann die Ausführung des Smart-Contract-Codes anfordern, indem er eine Transaktionsanfrage stellt. Da Entwickler durch die Veröffentlichung von Smart Contracts beliebige ausführbare Anwendungen in die EVM schreiben können (Spiele, Marktplätze, Finanzinstrumente usw.), werden diese oft auch als [Dapps oder dezentralisierte Anwendungen](/developers/docs/dapps/) bezeichnet. [Mehr zu Smart Contracts](/developers/docs/smart-contracts/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} - [Ethereum-Whitepaper](/whitepaper/) -- [Wie funktioniert Ethereum überhaupt?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) – _Preethi Kasireddy_ (**Hinweis:** Diese Ressource ist immer noch wertvoll, doch Sie sollten sich bewusst sein, dass sie aus der Zeit vor [der Zusammenführung](/roadmap/merge) stammt und sich daher noch auf den Proof-of-Work-Mechanismus von Ethereum bezieht – Ethereum ist jetzt durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) gesichert) +- [How does Ethereum work, anyway?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) – _Preethi Kasireddy_ (**Hinweis:** Diese Ressource ist immer noch wertvoll, aber beachten Sie, dass sie vor [The Merge](/roadmap/merge) verfasst wurde und sich daher noch auf den Proof-of-Work-Mechanismus von Ethereum bezieht – Ethereum wird heute tatsächlich durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) gesichert) -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +### Lernen Sie eher visuell? {#visual-learner} + +Diese Videoserie bietet eine gründliche Untersuchung grundlegender Themen: + + + +[Ethereum Basics Playlist](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) + +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Tutorials {#related-tutorials} -- [Eine Anleitung für Entwickler zu Ethereum, Teil 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _ – eine einsteigerfreundliche Einführung zu Ethereum mit Python und web3.py_ +- [Ein Entwickler-Leitfaden für Ethereum, Teil 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Eine sehr anfängerfreundliche Erkundung von Ethereum mit Python und web3.py_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/mev/index.md b/public/content/translations/de/developers/docs/mev/index.md index 3f501d1e37c..6941ce010cf 100644 --- a/public/content/translations/de/developers/docs/mev/index.md +++ b/public/content/translations/de/developers/docs/mev/index.md @@ -1,128 +1,221 @@ --- -title: Maximaler extrahierbarer Wert (MEV) -description: Eine Einführung in den maximal extrahierbaren Wert (MEV) +title: Maximal extrahierbarer Wert (MEV) +description: "Eine Einführung in den maximal extrahierbaren Wert (MEV)" lang: de --- -Der Maximal extrahierbare Wert (MEV) bezieht sich auf den maximalen Wert, der aus der Blockproduktion extrahiert werden kann und der über die Standard-Blockprämie und die Gasgebühren hinausgeht, indem Transaktionen in einem Block einbezogen, ausgeschlossen oder in der Reihenfolge geändert werden. +Maximal extrahierbarer Wert (MEV) bezieht sich auf den maximalen Wert, der aus der Blockproduktion über die standardmäßige Block-Belohnung und die Gasgebühren hinaus extrahiert werden kann, indem Transaktionen in einem Block eingeschlossen, ausgeschlossen und in ihrer Reihenfolge geändert werden. -## Durch Miner extrahierbarer Wert +## Maximal extrahierbarer Wert {#maximal-extractable-value} -Dieses Konzept wurde erstmals im Rahmen des [Arbeitsnachweis](/developers/docs/consensus-mechanisms/pow/) angewandt und anfangs als „miner extractable value" bezeichnet. Das liegt daran, dass beim Arbeitsnachweis die Miner den Einschluss, den Ausschluss und die Reihenfolge von Transaktionen kontrollieren. Nach der Umstellung auf Proof-of-Stake über [Die Zusammenführung](/roadmap/merge) werden jedoch die Validierer für diese Rollen verantwortlich sein, und Mining wird nicht mehr möglich sein. Die Methoden der Wertextraktion werden auch nach dieser Umstellung fortbestehen, so dass eine Namensänderung erforderlich war. Um das gleiche Akronym der Kontinuität willen und gleichzeitig die gleiche grundlegende Bedeutung beizubehalten, wird jetzt der „maximal extrahierbare Wert" als umfassenderer Ersatz verwendet. +Der maximal extrahierbare Wert wurde zuerst im Kontext von [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) angewendet und anfangs als „Miner Extractable Value“ (durch Miner extrahierbarer Wert) bezeichnet. Das liegt daran, dass beim Proof-of-Work die Miner das Einschließen, Ausschließen und die Reihenfolge von Transaktionen kontrollieren. Seit dem Übergang zu Proof-of-Stake durch [The Merge](/roadmap/merge) sind jedoch Validatoren für diese Rollen verantwortlich, und Mining ist nicht länger Teil des [Ethereum](/)-Protokolls. Die Methoden zur Wertextraktion existieren jedoch weiterhin, weshalb nun stattdessen der Begriff „Maximal extrahierbarer Wert“ verwendet wird. ## Voraussetzungen {#prerequisites} -Stellen Sie sicher, dass Sie mit [Transaktionen](/developers/docs/transactions/), [Blöcken](/developers/docs/blocks/), [Gas](/developers/docs/gas/) und [Mining](/developers/docs/consensus-mechanisms/pow/mining/) vertraut sind. Eine Vertrautheit mit [dApps](/apps/) und [DeFi](/defi/) ist ebenfalls hilfreich. +Stellen Sie sicher, dass Sie mit [Transaktionen](/developers/docs/transactions/), [Blöcken](/developers/docs/blocks/), [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) und [Gas](/developers/docs/gas/) vertraut sind. Vertrautheit mit [Dapps](/apps/) und [DeFi](/defi/) ist ebenfalls hilfreich. -## MEV-Extrahierung {#mev-extraction} +## MEV-Extraktion {#mev-extraction} -Theoretisch kommt MEV ausschließlich den Minern zugute, da Miner die einzige Partei sind, welche die Ausführung einer profitablen MEV-Gelegenheit garantieren kann (zumindest in der aktuellen Proof-of-Work-Kette; dies wird sich nach [Die Zusammenführung](/roadmap/merge/) ändern). In der Praxis wird jedoch ein großer Teil des MEV von unabhängigen Netzwerkteilnehmern, den sogenannten „Suchenden", extrahiert Die Suchenden lassen komplexe Algorithmen auf Blockchain-Daten laufen, um profitable MEV-Möglichkeiten zu erkennen, und haben Bots, die diese profitablen Transaktionen automatisch an das Netzwerk übermitteln. +Theoretisch fällt MEV vollständig den Validatoren zu, da sie die einzige Partei sind, die die Ausführung einer profitablen MEV-Gelegenheit garantieren kann. In der Praxis wird jedoch ein großer Teil des MEV von unabhängigen Netzwerk-Teilnehmern extrahiert, die als „Searcher“ (Sucher) bezeichnet werden. Searcher führen komplexe Algorithmen auf Blockchain-Daten aus, um profitable MEV-Gelegenheiten zu erkennen, und nutzen Bots, um diese profitablen Transaktionen automatisch an das Netzwerk zu übermitteln. -Die Miner erhalten ohnehin einen Teil des vollen MEV-Betrags, weil die Suchenden bereit sind, hohe Gasgebühren zu zahlen (die an die Miner gehen), um im Gegenzug die Wahrscheinlichkeit zu erhöhen, dass ihre profitablen Transaktionen in einen Block aufgenommen werden. Unter der Annahme, dass die Suchenden ökonomisch rational handeln, wird die Gasgebühr, die ein Suchender zu zahlen bereit ist, bis zu 100 % seines MEV betragen (denn wenn die Gasgebühr höher wäre, würde der Suchende Geld verlieren). +Validatoren erhalten dennoch einen Teil des gesamten MEV-Betrags, da Searcher bereit sind, hohe Gasgebühren (die an den Validator gehen) im Austausch für eine höhere Wahrscheinlichkeit der Aufnahme ihrer profitablen Transaktionen in einen Block zu zahlen. Unter der Annahme, dass Searcher wirtschaftlich rational handeln, wird die Gasgebühr, die ein Searcher zu zahlen bereit ist, ein Betrag von bis zu 100 % des MEV des Searchers sein (denn wenn die Gasgebühr höher wäre, würde der Searcher Geld verlieren). -Bei einigen stark umkämpften MEV-Möglichkeiten wie [DEX-Arbitrage](#mev-examples-dex-arbitrage) müssen die Suchenden unter Umständen 90 % oder sogar mehr ihrer gesamten MEV-Einnahmen in Form von Gasgebühren an den Miner zahlen, weil so viele Leute denselben profitablen Arbitragehandel betreiben wollen. Denn nur wenn sie das Geschäft mit dem höchsten Gaspreis einreichen, ist gewährleistet, dass ihr Arbitragegeschäft zustande kommt. +Daher müssen Searcher bei einigen stark umkämpften MEV-Gelegenheiten, wie z. B. [DEX-Arbitrage](#mev-examples-dex-arbitrage), möglicherweise 90 % oder sogar mehr ihrer gesamten MEV-Einnahmen als Gasgebühren an den Validator zahlen, weil so viele Leute denselben profitablen Arbitrage-Handel ausführen wollen. Das liegt daran, dass die einzige Möglichkeit, die Ausführung ihrer Arbitrage-Transaktion zu garantieren, darin besteht, die Transaktion mit dem höchsten Gaspreis einzureichen. -### Gas-Golfen {#mev-extraction-gas-golfing} +### Gas Golfing {#mev-extraction-gas-golfing} -Diese Dynamik hat dazu geführt, dass das „Gas Golfen" - also das Programmieren von Transaktionen so, dass sie möglichst wenig Gas verbrauchen - zu einem Wettbewerbsvorteil geworden ist, weil es den Suchenden ermöglicht, einen höheren Gaspreis festzulegen und gleichzeitig ihre gesamten Gasgebühren konstant zu halten (da Gasgebühren = Gaspreis \* verbrauchtes Gas). +Diese Dynamik hat dazu geführt, dass es ein Wettbewerbsvorteil ist, gut im „Gas Golfing“ zu sein – dem Programmieren von Transaktionen, sodass sie die geringste Menge an Gas verbrauchen. Dies ermöglicht es Searchern, einen höheren Gaspreis festzulegen und gleichzeitig ihre gesamten Gasgebühren konstant zu halten (da Gasgebühren = Gaspreis \* verbrauchtes Gas). -Einige bekannte Gas-Golf-Techniken sind: Verwenden von Adressen, die mit einer langen Reihe von Nullen beginnen (z. B. [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://etherscan.io/address/0x0000000000c521824eaff97eac7b73b084ef9306)), da sie weniger Platz (und damit Gas) zum Speichern benötigen; und das Belassen kleiner [ERC-20](/developers/docs/standards/tokens/erc-20/)-Token-Guthaben in Verträgen, da es mehr Gas kostet, einen Speicher-Slot zu initialisieren (der Fall, wenn das Guthaben gleich 0 ist), als einen Speicherplatz zu aktualisieren. Die Suche nach weiteren Techniken zur Verringerung des Gasverbrauchs ist ein aktiver Research-Bereich unter den Forschern. +Einige bekannte Gas-Golf-Techniken umfassen: die Verwendung von Adressen, die mit einer langen Reihe von Nullen beginnen (z. B. [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://eth.blockscout.com/address/0x0000000000C521824EaFf97Eac7B73B084ef9306)), da sie weniger Platz (und somit Gas) zum Speichern benötigen; und das Belassen kleiner [ERC-20](/developers/docs/standards/tokens/erc-20/)-Token-Guthaben in Verträgen, da es mehr Gas kostet, einen Speicherplatz zu initialisieren (was der Fall ist, wenn das Guthaben 0 beträgt), als einen Speicherplatz zu aktualisieren. Das Finden weiterer Techniken zur Reduzierung des Gasverbrauchs ist ein aktives Forschungsgebiet unter Searchern. -### Generalisierte Vorläufer {#mev-extraction-generalized-frontrunners} +### Generalisierte Frontrunner {#mev-extraction-generalized-frontrunners} -Anstatt komplexe Algorithmen zu programmieren, um gewinnbringende MEV-Möglichkeiten zu erkennen, lassen einige Suchende generalisierte Vorläufer betreiben. Generalisierte Vorläufer sind Bots, die den Mempool beobachten, um profitable Transaktionen zu erkennen. Der Vorläufer kopiert den Code der potenziell profitablen Transaktion, ersetzt die Adressen durch die Adresse des Vorläufers und führt die Transaktion lokal aus, um zu überprüfen, ob die geänderte Transaktion zu einem Gewinn für die Adresse des Vorläufers führt. Wenn die Transaktion tatsächlich rentabel ist, reicht der Vorläufer die geänderte Transaktion mit der ersetzten Adresse und einem höheren Gaspreis ein als den der Original-Transaktion und erhält so den MEV des ursprünglichen Suchenden. +Anstatt komplexe Algorithmen zu programmieren, um profitable MEV-Gelegenheiten zu erkennen, betreiben einige Searcher generalisierte Frontrunner. Generalisierte Frontrunner sind Bots, die den Mempool überwachen, um profitable Transaktionen zu erkennen. Der Frontrunner kopiert den Code der potenziell profitablen Transaktion, ersetzt Adressen durch die Adresse des Frontrunners und führt die Transaktion lokal aus, um zu überprüfen, ob die modifizierte Transaktion zu einem Gewinn für die Adresse des Frontrunners führt. Wenn die Transaktion tatsächlich profitabel ist, reicht der Frontrunner die modifizierte Transaktion mit der ersetzten Adresse und einem höheren Gaspreis ein, wodurch er der ursprünglichen Transaktion zuvorkommt („Frontrunning“) und das MEV des ursprünglichen Searchers erhält. ### Flashbots {#mev-extraction-flashbots} -Flashbots ist ein unabhängiges Projekt, das den Go-Ethereum-Client um einen Dienst erweitert, der es Suchenden ermöglicht, MEV-Transaktionen an Miner zu übermitteln, ohne sie dem öffentlichen Mempool zu offenzulegen. Dadurch wird verhindert, dass Transaktionen von allgemeinen Vorläufern ausgeführt werden. - -Zum jetzigen Zeitpunkt wird ein erheblicher Teil der MEV-Transaktionen über Flashbots abgewickelt, was bedeutet, dass allgemeine Vorläufer nicht mehr so effektiv sind wie früher. +Flashbots ist ein unabhängiges Projekt, das Ausführungs-Clients um einen Dienst erweitert, der es Searchern ermöglicht, MEV-Transaktionen an Validatoren zu übermitteln, ohne sie dem öffentlichen Mempool preiszugeben. Dies verhindert, dass Transaktionen von generalisierten Frontrunnern überholt werden. ## MEV-Beispiele {#mev-examples} -Der MEV taucht auf der Blockchain auf mehrere Arten auf. +MEV tritt auf der Blockchain auf verschiedene Weise in Erscheinung. ### DEX-Arbitrage {#mev-examples-dex-arbitrage} -[Decentralized Exchange](/glossary/#dex) (DEX) Arbitrage ist die einfachste und bekannteste MEV-Möglichkeit. Infolgedessen ist sie auch die wettbewerbsfähigste. +Die Arbitrage an einer [dezentralisierten Börse](/glossary/#dex) (DEX) ist die einfachste und bekannteste MEV-Gelegenheit. Infolgedessen ist sie auch am stärksten umkämpft. -Das funktioniert so: Wenn zwei DEX einen Token zu zwei unterschiedlichen Preisen anbieten, kann jemand den Token auf dem DEX mit dem niedrigeren Preis kaufen und auf dem DEX mit dem höheren Preis in einer einzigen, atomaren Transaktion verkaufen. Dank der Mechanik der Blockchain ist dies eine echte, risikolose Arbitrage. +Es funktioniert so: Wenn zwei DEXes einen Token zu zwei verschiedenen Preisen anbieten, kann jemand den Token auf der günstigeren DEX kaufen und ihn auf der teureren DEX in einer einzigen, atomaren Transaktion verkaufen. Dank der Mechanik der Blockchain ist dies echte, risikolose Arbitrage. -[Hier ist ein Beispiel](https://etherscan.io/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) einer profitablen Arbitrage-Transaktion, bei der ein Suchender 1.000 ETH in 1.045 ETH umwandelte, indem er die unterschiedlichen Preise des Paares ETH/DAI bei Uniswap ggü. Sushiswap ausnutzte. +[Hier ist ein Beispiel](https://eth.blockscout.com/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) für eine profitable Arbitrage-Transaktion, bei der ein Searcher 1.000 ETH in 1.045 ETH verwandelte, indem er die unterschiedliche Preisgestaltung des ETH/DAI-Paares auf Uniswap im Vergleich zu Sushiswap ausnutzte. ### Liquidationen {#mev-examples-liquidations} -Eine weitere bekannte MEV-Möglichkeit sind Leihprotokoll-Liquidationen. +Liquidationen in Kreditprotokollen stellen eine weitere bekannte MEV-Gelegenheit dar. + +Kreditprotokolle wie Maker und Aave verlangen von den Nutzern, dass sie Sicherheiten (z. B. ETH) hinterlegen. Diese hinterlegten Sicherheiten werden dann verwendet, um sie an andere Nutzer zu verleihen. -Leihprotokolle wie Maker und Aave funktionieren, indem sie von den Nutzern verlangen, eine Art von Sicherheit zu hinterlegen (z.B. ETH). Die Nutzer können sich dann verschiedene Vermögenswerte und Token von anderen leihen, je nachdem, was sie brauchen (zum Beispiel können sie sich MKR leihen, wenn sie über einen Vorschlag der MakerDAO-Governance abstimmen wollen, oder SUSHI, wenn sie einen Teil der Handelsgebühren auf Sushiswap verdienen wollen), und zwar bis zu einem bestimmten Betrag ihrer hinterlegten Sicherheiten - zum Beispiel 30 % (der genaue Prozentsatz der Leihkraft wird durch das Protokoll festgelegt). Die Nutzer, von denen sie sich die anderen Token leihen, fungieren in diesem Fall als Verleiher. +Nutzer können sich dann je nach Bedarf Vermögenswerte und Token von anderen leihen (z. B. könnten Sie MKR leihen, wenn Sie bei einem MakerDAO-Governance-Vorschlag abstimmen möchten), bis zu einem bestimmten Prozentsatz ihrer hinterlegten Sicherheiten. Wenn der Leihbetrag beispielsweise maximal 30 % beträgt, kann ein Nutzer, der 100 DAI in das Protokoll einzahlt, bis zu einem Wert von 30 DAI eines anderen Vermögenswerts leihen. Das Protokoll bestimmt den genauen Prozentsatz der Leihkraft. -Da der Wert der Sicherheiten eines Kreditnehmers schwankt, ändert sich auch seine Kreditaufnahmefähigkeit. Wenn der Wert der geliehenen Vermögenswerte aufgrund von Marktschwankungen etwa 30 % des Wertes ihrer Sicherheiten übersteigt (auch hier wird der genaue Prozentsatz durch das Protokoll festgelegt), erlaubt das Protokoll in der Regel jedem, die Sicherheiten zu verwerten und die Kreditgeber sofort zu entschädigen (dies ist vergleichbar mit der Funktionsweise von [Margin Calls](https://www.investopedia.com/terms/m/margincall.asp) im traditionellen Finanzwesen). Im Falle einer Liquidation muss der Kreditnehmer in der Regel eine saftige Liquidationsgebühr zahlen, von der ein Teil an den Liquidator geht - hier kommt der MEV ins Spiel. +Da der Wert der Sicherheiten eines Kreditnehmers schwankt, schwankt auch seine Leihkraft. Wenn aufgrund von Marktschwankungen der Wert der geliehenen Vermögenswerte beispielsweise 30 % des Wertes ihrer Sicherheiten übersteigt (auch hier wird der genaue Prozentsatz durch das Protokoll bestimmt), erlaubt das Protokoll in der Regel jedem, die Sicherheiten zu liquidieren und die Kreditgeber sofort auszuzahlen (dies ist ähnlich wie [Margin Calls](https://www.investopedia.com/terms/m/margincall.asp) im traditionellen Finanzwesen funktionieren). Im Falle einer Liquidation muss der Kreditnehmer in der Regel eine hohe Liquidationsgebühr zahlen, von der ein Teil an den Liquidator geht – und genau hier kommt die MEV-Gelegenheit ins Spiel. -Die Suchenden konkurrieren darum, die Blockchain-Daten so schnell wie möglich zu analysieren, um festzustellen, welche Kreditnehmer liquidiert werden können, und als Erste eine Liquidationstransaktion einzureichen und die Liquidationsgebühr für sich selbst zu kassieren. +Searcher konkurrieren darum, Blockchain-Daten so schnell wie möglich zu analysieren, um festzustellen, welche Kreditnehmer liquidiert werden können, und die Ersten zu sein, die eine Liquidations-Transaktion einreichen und die Liquidationsgebühr für sich selbst kassieren. -### Der Sandwich-Handel {#mev-examples-sandwich-trading} +### Sandwich-Trading {#mev-examples-sandwich-trading} -Der Sandwich-Handel ist eine weitere gängige Methode der MEV-Extraktion. +Sandwich-Trading ist eine weitere gängige Methode der MEV-Extraktion. -Um ein Sandwich zu finden, wird ein Sucher den Mempool nach großen DEX-Geschäften beobachten. Nehmen wir zum Beispiel an, jemand möchte 10.000 UNI mit DAI auf Uniswap kaufen. Ein Handel dieser Größenordnung wird sich erheblich auf das UNI/DAI-Paar auswirken und den Kurs von UNI gegenüber DAI möglicherweise erheblich ansteigen lassen. +Für ein Sandwich-Manöver überwacht ein Searcher den Mempool auf große DEX-Trades. Angenommen, jemand möchte 10.000 UNI mit DAI auf Uniswap kaufen. Ein Trade dieser Größenordnung wird eine bedeutende Auswirkung auf das UNI/DAI-Paar haben und möglicherweise den Preis von UNI im Verhältnis zu DAI erheblich in die Höhe treiben. -Ein Sucher kann die ungefähre Preisauswirkung dieses großen Handels auf das Paar UNI/DAI berechnen und einen optimalen Kaufauftrag unmittelbar _vor_ dem großen Handel ausführen, indem er UNI billig kauft, und dann einen Verkaufsauftrag unmittelbar _nach_ dem großen Handel ausführen, indem er sie zu dem durch den großen Auftrag erzeugten höheren Preis verkauft. +Ein Searcher kann den ungefähren Preiseffekt dieses großen Trades auf das UNI/DAI-Paar berechnen und eine optimale Kauforder unmittelbar _vor_ dem großen Trade ausführen, um UNI günstig zu kaufen, und dann eine Verkaufsorder unmittelbar _nach_ dem großen Trade ausführen, um sie zu dem durch die große Order verursachten höheren Preis zu verkaufen. -Sandwiching ist jedoch riskanter, da es nicht atomar (im Gegensatz zu DEX-Arbitrage, wie oben beschrieben) und anfällig für einen [Salmonellenangriff](https://github.com/Defi-Cartel/salmonella) ist. +Sandwiching ist jedoch riskanter, da es nicht atomar ist (im Gegensatz zur oben beschriebenen DEX-Arbitrage) und anfällig für einen [Salmonella-Angriff](https://github.com/Defi-Cartel/salmonella) ist. -### NFT MEV {#mev-examples-nfts} +### NFT-MEV {#mev-examples-nfts} -MEV im NFT-Raum ist ein neu auftretendes Phänomen, das nicht unbedingt profitabel ist. +MEV im NFT-Bereich ist ein aufkommendes Phänomen und nicht zwangsläufig profitabel. -Da NEU-Transaktionen jedoch auf derselben Blockchain stattfinden, die auch von allen anderen Ethereum-Transaktionen genutzt wird, können Suchende auch auf dem NFT-Markt ähnliche Techniken wie bei den traditionellen MEV-Möglichkeiten anwenden. +Da NFT-Transaktionen jedoch auf derselben Blockchain stattfinden, die von allen anderen Ethereum-Transaktionen geteilt wird, können Searcher ähnliche Techniken wie bei traditionellen MEV-Gelegenheiten auch auf dem NFT-Markt anwenden. -Wenn es beispielsweise eine beliebte NFT-Abgabe gibt und ein Suchender eine bestimmte NFT oder eine Reihe von NFTs haben möchte, kann er eine Transaktion so programmieren, dass er der erste in der Schlange ist, um die NFT zu kaufen, oder er kann die gesamte Reihe von NFTs in einer einzigen Transaktion kaufen. Oder wenn ein NFT [fälschlicherweise zu einem niedrigen Preis](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent) angeboten wird, kann ein Suchender anderen Käufern zuvorkommen und es billig ergattern. +Wenn es beispielsweise einen beliebten NFT-Drop gibt und ein Searcher ein bestimmtes NFT oder ein Set von NFTs haben möchte, kann er eine Transaktion so programmieren, dass er als Erster in der Schlange steht, um das NFT zu kaufen, oder er kann das gesamte Set von NFTs in einer einzigen Transaktion kaufen. Oder wenn ein NFT [versehentlich zu einem niedrigen Preis gelistet wird](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent), kann ein Searcher anderen Käufern zuvorkommen und es günstig ergattern. -Ein prominentes Beispiel für NFT MEV entstand, als ein Sucher 7 Millionen Dollar ausgab, um [jeden einzelnen Cryptopunk zum Mindestpreis zu kaufen](https://etherscan.io/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5). Ein Blockchain-Forscher [erläuterte auf Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538), wie der Käufer mit einem MEV-Anbieter zusammenarbeitete, um seinen Kauf geheim zu halten. +Ein prominentes Beispiel für NFT-MEV ereignete sich, als ein Searcher 7 Millionen Dollar ausgab, um [jeden einzelnen Cryptopunk zum Mindestpreis zu kaufen](https://eth.blockscout.com/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5?tab=txs). Ein Blockchain-Forscher [erklärte auf Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538), wie der Käufer mit einem MEV-Anbieter zusammenarbeitete, um seinen Kauf geheim zu halten. -### Der lange Schwanz {#mev-examples-long-tail} +### Der Long Tail {#mev-examples-long-tail} -DEX-Arbitrage, Liquidationen und Sandwich-Trading sind allesamt sehr bekannte MEV-Möglichkeiten, die für neue Suchende wahrscheinlich nicht profitabel sein werden. Es gibt jedoch eine ganze Reihe weniger bekannter MEV-Möglichkeiten (NFT MEV ist wohl eine davon). +DEX-Arbitrage, Liquidationen und Sandwich-Trading sind allesamt sehr bekannte MEV-Gelegenheiten und dürften für neue Searcher kaum profitabel sein. Es gibt jedoch einen „Long Tail“ (langen Schwanz) an weniger bekannten MEV-Gelegenheiten (NFT-MEV ist wohl eine solche Gelegenheit). -Suchende, die gerade erst anfangen, können möglicherweise mehr Erfolg haben, wenn sie nach MEV in diesem längeren Schwanz suchen. Die [MEV-Jobbörse](https://github.com/flashbots/mev-job-board) von Flashbot listet einige neue Möglichkeiten auf. +Searcher, die gerade erst anfangen, könnten mehr Erfolg haben, wenn sie in diesem Long Tail nach MEV suchen. Das [MEV-Job-Board](https://github.com/flashbots/mev-job-board) von Flashbots listet einige aufkommende Gelegenheiten auf. ## Auswirkungen von MEV {#effects-of-mev} -MEV ist nicht nur schlecht - es gibt sowohl positive als auch negative Folgen von MEV auf Ethereum. +MEV ist nicht nur schlecht – es gibt sowohl positive als auch negative Konsequenzen von MEV auf Ethereum. -### Das Positive {#effects-of-mev-the-good} +### Das Gute {#effects-of-mev-the-good} -Viele DeFi-Projekte sind auf wirtschaftlich rationale Akteure angewiesen, um die Nützlichkeit und Stabilität ihrer Protokolle zu gewährleisten. DEX-Arbitrage stellt zum Beispiel sicher, dass die Nutzer die besten und korrektesten Preise für ihre Token erhalten, und Kreditprotokolle verlassen sich auf schnelle Liquidationen, wenn Kreditnehmer unter die Besicherungsquote fallen, um sicherzustellen, dass die Kreditgeber zurückbezahlt werden. +Viele DeFi-Projekte verlassen sich auf wirtschaftlich rationale Akteure, um die Nützlichkeit und Stabilität ihrer Protokolle zu gewährleisten. Beispielsweise stellt die DEX-Arbitrage sicher, dass Nutzer die besten und korrektesten Preise für ihre Token erhalten, und Kreditprotokolle sind auf schnelle Liquidationen angewiesen, wenn Kreditnehmer unter die Besicherungsquoten fallen, um sicherzustellen, dass Kreditgeber zurückgezahlt werden. -Ohne rationale Suchende, die nach wirtschaftlichen Ineffizienzen suchen und diese beheben und die wirtschaftlichen Anreize der Protokolle nutzen, könnten DeFi-Protokolle und dApps im Allgemeinen nicht so robust sein, wie sie es heute sind. +Ohne rationale Searcher, die wirtschaftliche Ineffizienzen suchen und beheben und die wirtschaftlichen Anreize von Protokollen ausnutzen, wären DeFi-Protokolle und Dapps im Allgemeinen möglicherweise nicht so robust, wie sie es heute sind. -### Das Negative {#effects-of-mev-the-bad} +### Das Schlechte {#effects-of-mev-the-bad} -Auf der Anwendungsebene führen einige Formen des MEV, wie der Sandwich-Handel, zu einer eindeutig schlechteren Erfahrung für die Nutzer. Nutzer, die sich in einem „Sandwich" befinden, müssen mit erhöhter Verzögerung und schlechterer Ausführung ihrer Geschäfte rechnen. +Auf der Anwendungsebene führen einige Formen von MEV, wie das Sandwich-Trading, zu einer eindeutig schlechteren Erfahrung für die Nutzer. Nutzer, die in ein Sandwich geraten, sehen sich mit erhöhter Slippage und einer schlechteren Ausführung ihrer Trades konfrontiert. -Auf der Netzwerkebene führen verallgemeinerte Vorläufer und die von ihnen häufig durchgeführten Gaspreisauktionen (bei denen zwei oder mehr Vorläufer um die Aufnahme ihrer Transaktion in den nächsten Block konkurrieren, indem sie den Gaspreis ihrer eigenen Transaktionen schrittweise erhöhen) zu einer Überlastung des Netzwerks und hohen Gaspreisen für alle anderen, die versuchen, reguläre Transaktionen durchzuführen. +Auf der Netzwerkebene führen generalisierte Frontrunner und die Gaspreis-Auktionen, an denen sie sich oft beteiligen (wenn zwei oder mehr Frontrunner darum konkurrieren, dass ihre Transaktion in den nächsten Block aufgenommen wird, indem sie den Gaspreis ihrer eigenen Transaktionen schrittweise erhöhen), zu Netzwerküberlastungen und hohen Gaspreisen für alle anderen, die versuchen, reguläre Transaktionen auszuführen. -Abgesehen von dem, was _innerhalb_ der Blöcke geschieht, kann MEV auch _zwischen_ den Blöcken schädliche Auswirkungen haben. Wenn der in einem Block verfügbare MEV die Standard-Blockbelohnung deutlich übersteigt, können Miner einen Anreiz haben, Blöcke zu reminen und den MEV für sich selbst einzunehmen, was zu einer Reorganisation der Blockchain und einer Instabilität des Konsenses führt. +Über das hinaus, was _innerhalb_ von Blöcken passiert, kann MEV schädliche Auswirkungen _zwischen_ Blöcken haben. Wenn das in einem Block verfügbare MEV die standardmäßige Block-Belohnung deutlich übersteigt, könnten Validatoren einen Anreiz haben, Blöcke neu zu organisieren (Reorg) und das MEV für sich selbst zu erfassen, was zu einer Reorganisation der Blockchain und Instabilität im Konsens führt. -Diese Möglichkeit der Reorganisation der Blockchain wurde [bereits bei der Bitcoin-Blockchain](https://dl.acm.org/doi/10.1145/2976749.2978408) untersucht. Da sich die Bitcoin-Blockbelohnung halbiert und die Transaktionsgebühren einen immer größeren Teil der Blockbelohnung ausmachen, entstehen Situationen, in denen es für die Miner wirtschaftlich rational wird, auf die Belohnung des nächsten Blocks zu verzichten und stattdessen vergangene Blöcke mit höheren Gebühren zu bearbeiten. Mit dem Wachstum von MEV könnte die gleiche Situation bei Ethereum eintreten und die Integrität der Blockchain bedrohen. +Diese Möglichkeit der Blockchain-Reorganisation wurde [bereits auf der Bitcoin-Blockchain untersucht](https://dl.acm.org/doi/10.1145/2976749.2978408). Da sich die Block-Belohnung von Bitcoin halbiert und Transaktionsgebühren einen immer größeren Teil der Block-Belohnung ausmachen, entstehen Situationen, in denen es für Miner wirtschaftlich rational wird, auf die Belohnung des nächsten Blocks zu verzichten und stattdessen vergangene Blöcke mit höheren Gebühren neu zu minen. Mit dem Wachstum von MEV könnte eine ähnliche Situation in Ethereum auftreten und die Integrität der Blockchain bedrohen. -## Zustand der MEV {#state-of-mev} +## Stand von MEV {#state-of-mev} -Die MEV-Förderung stieg Anfang 2021 sprunghaft an, was in den ersten Monaten des Jahres zu extrem hohen Gaspreisen führte. Das Auftauchen von Flashbots MEV-Relais hat die Effektivität von allgemeinen Vorläufern reduziert und die Gaspreisauktionen aus der Kette genommen, was die Gaspreise für normale Nutzer senkt. +Die MEV-Extraktion explodierte Anfang 2021, was in den ersten Monaten des Jahres zu extrem hohen Gaspreisen führte. Das Aufkommen des MEV-Relays von Flashbots hat die Effektivität von generalisierten Frontrunnern verringert und Gaspreis-Auktionen Off-Chain verlagert, was die Gaspreise für normale Nutzer gesenkt hat. -Während viele Suchende immer noch gutes Geld mit MEV verdienen, werden die Miner mit zunehmender Bekanntheit der Gelegenheiten und immer mehr Suchenden, die um dieselbe Gelegenheit konkurrieren, immer mehr MEV-Einnahmen erzielen (weil die gleiche Art von Gasauktionen, wie sie oben beschrieben wurden, auch in Flashbots stattfinden, wenn auch auf privater Basis, und die Miner die daraus resultierenden Gaseinnahmen erzielen). MEV gibt es auch nicht nur bei Ethereum, und da die Möglichkeiten bei Ethereum immer wettbewerbsfähiger werden, weichen die Suchenden auf andere Blockchains wie Binance Smart Chain aus, wo ähnliche MEV-Möglichkeiten wie bei Ethereum bestehen, aber weniger Wettbewerb herrscht. +Während viele Searcher immer noch gutes Geld mit MEV verdienen, werden Validatoren, da die Gelegenheiten bekannter werden und immer mehr Searcher um dieselbe Gelegenheit konkurrieren, immer mehr der gesamten MEV-Einnahmen erfassen (da die gleiche Art von Gas-Auktionen, wie ursprünglich oben beschrieben, auch in Flashbots stattfindet, wenn auch privat, und Validatoren die daraus resultierenden Gaseinnahmen erfassen werden). MEV ist auch nicht einzigartig für Ethereum, und da die Gelegenheiten auf Ethereum umkämpfter werden, weichen Searcher auf alternative Blockchains wie die Binance Smart Chain aus, wo ähnliche MEV-Gelegenheiten wie auf Ethereum mit weniger Konkurrenz existieren. -Mit dem Wachstum und der zunehmenden Beliebtheit von DeFi könnte MEV schon bald die Basisbelohnung eines Ethereum-Blocks deutlich übertreffen. Damit wächst die Möglichkeit, dass egoistische Blöcke zurückbleiben und der Konsens instabil wird. Einige sehen darin eine existenzielle Bedrohung für Ethereum, und die Abschreckung von egoistischem Mining ist ein aktives Forschungsgebiet in der Ethereum-Protokolltheorie. Eine Lösung, die derzeit untersucht wird, ist [MEV-Reward-Smoothing](https://ethresear.ch/t/committee-driven-mev-smoothing/10408). +Andererseits verändern der Übergang von Proof-of-Work zu Proof-of-Stake und die laufenden Bemühungen zur Skalierung von Ethereum mithilfe von Rollups die MEV-Landschaft auf eine Weise, die noch etwas unklar ist. Es ist noch nicht genau bekannt, wie die Tatsache, dass garantierte Block-Vorschlagende etwas im Voraus bekannt sind, die Dynamik der MEV-Extraktion im Vergleich zum probabilistischen Modell im Proof-of-Work verändert oder wie dies gestört wird, wenn [Single Secret Leader Election](https://ethresear.ch/t/secret-non-single-leader-election/11789) und [verteilte Validator-Technologie](/staking/dvt/) implementiert werden. Ebenso bleibt abzuwarten, welche MEV-Gelegenheiten existieren, wenn die meiste Nutzeraktivität von Ethereum weg und auf seine Ebene-2-Rollups und Shards verlagert wird. -## Zugehörige Ressourcen {#related-resources} +## MEV in Ethereum Proof-of-Stake (PoS) {#mev-in-ethereum-proof-of-stake} -- [Flashbots GitHub](https://github.com/flashbots/pm) +Wie erklärt, hat MEV negative Auswirkungen auf die allgemeine Nutzererfahrung und die Sicherheit der Konsensebene. Aber Ethereums Übergang zu einem Proof-of-Stake-Konsens (genannt „The Merge“) birgt potenziell neue MEV-bezogene Risiken: + +### Zentralisierung der Validatoren {#validator-centralization} + +Im Post-Merge-Ethereum erzielen Validatoren (die Sicherheitsleistungen von 32 ETH hinterlegt haben) einen Konsens über die Gültigkeit von Blöcken, die der Beacon Chain hinzugefügt werden. Da 32 ETH für viele unerschwinglich sein könnten, ist der [Beitritt zu einem Staking-Pool](/staking/pools/) möglicherweise eine praktikablere Option. Dennoch ist eine gesunde Verteilung von [Solo-Stakern](/staking/solo/) ideal, da sie die Zentralisierung von Validatoren abmildert und die Sicherheit von Ethereum verbessert. + +Es wird jedoch angenommen, dass die MEV-Extraktion in der Lage ist, die Zentralisierung der Validatoren zu beschleunigen. Dies liegt zum Teil daran, dass Validatoren [weniger für das Vorschlagen von Blöcken verdienen](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply) als Miner zuvor, weshalb die MEV-Extraktion die [Einnahmen der Validatoren](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb) seit [The Merge](/roadmap/merge/) stark beeinflusst hat. + +Größere Staking-Pools werden wahrscheinlich über mehr Ressourcen verfügen, um in notwendige Optimierungen zur Erfassung von MEV-Gelegenheiten zu investieren. Je mehr MEV diese Pools extrahieren, desto mehr Ressourcen haben sie, um ihre MEV-Extraktionsfähigkeiten zu verbessern (und die Gesamteinnahmen zu steigern), was im Wesentlichen [Skaleneffekte](https://www.investopedia.com/terms/e/economiesofscale.asp#) schafft. + +Mit weniger Ressourcen zur Verfügung könnten Solo-Staker möglicherweise nicht von MEV-Gelegenheiten profitieren. Dies könnte den Druck auf unabhängige Validatoren erhöhen, sich mächtigen Staking-Pools anzuschließen, um ihre Einnahmen zu steigern, was die Dezentralisierung in Ethereum verringert. + +### Erlaubnispflichtige Mempools {#permissioned-mempools} + +Als Reaktion auf Sandwiching- und Frontrunning-Angriffe könnten Händler beginnen, Off-Chain-Deals mit Validatoren für Transaktionsdatenschutz durchzuführen. Anstatt eine potenzielle MEV-Transaktion an den öffentlichen Mempool zu senden, sendet der Händler sie direkt an den Validator, der sie in einen Block aufnimmt und die Gewinne mit dem Händler teilt. + +„Dark Pools“ sind eine größere Version dieses Arrangements und fungieren als erlaubnispflichtige Mempools mit Zugangsbeschränkung, die Nutzern offenstehen, die bereit sind, bestimmte Gebühren zu zahlen. Dieser Trend würde die Erlaubnisfreiheit und Vertrauenslosigkeit von Ethereum verringern und die Blockchain potenziell in einen „Pay-to-Play“-Mechanismus verwandeln, der den Höchstbietenden bevorzugt. + +Erlaubnispflichtige Mempools würden auch die im vorherigen Abschnitt beschriebenen Zentralisierungsrisiken beschleunigen. Große Pools, die mehrere Validatoren betreiben, werden wahrscheinlich davon profitieren, Händlern und Nutzern Transaktionsdatenschutz anzubieten, was ihre MEV-Einnahmen erhöht. + +Die Bekämpfung dieser MEV-bezogenen Probleme im Post-Merge-Ethereum ist ein Kernbereich der Forschung. Bisher wurden zwei Lösungen vorgeschlagen, um die negativen Auswirkungen von MEV auf die Dezentralisierung und Sicherheit von Ethereum nach The Merge zu reduzieren: [**Proposer-Builder Separation (PBS)**](/roadmap/pbs/) und die [**Builder API**](https://github.com/ethereum/builder-specs). + +### Proposer-Builder Separation {#proposer-builder-separation} + +Sowohl beim Proof-of-Work als auch beim Proof-of-Stake schlägt ein Blockchain-Knoten, der einen Block erstellt, diesen anderen am Konsens teilnehmenden Blockchain-Knoten zur Hinzufügung zur Kette vor. Ein neuer Block wird Teil der kanonischen Kette, nachdem ein anderer Miner darauf aufbaut (im PoW) oder er Bestätigungen von der Mehrheit der Validatoren erhält (im PoS). + +Die Kombination der Rollen des Block-Produzenten und des Block-Vorschlagenden ist es, was die meisten der zuvor beschriebenen MEV-bezogenen Probleme einführt. Beispielsweise haben Konsens-Knoten einen Anreiz, Kettenreorganisationen in [Time-Bandit-Angriffen](https://www.mev.wiki/attack-examples/time-bandit-attack) auszulösen, um die MEV-Einnahmen zu maximieren. + +Die [Proposer-Builder Separation](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) (PBS) wurde entwickelt, um die Auswirkungen von MEV abzumildern, insbesondere auf der Konsensebene. Das Hauptmerkmal von PBS ist die Trennung der Rollen von Block-Produzent und Block-Vorschlagendem. Validatoren sind weiterhin dafür verantwortlich, Blöcke vorzuschlagen und darüber abzustimmen, aber eine neue Klasse spezialisierter Entitäten, sogenannte **Block-Builder**, wird mit der Anordnung von Transaktionen und dem Erstellen von Blöcken beauftragt. + +Unter PBS erstellt ein Block-Builder ein Transaktionsbündel und gibt ein Gebot für dessen Aufnahme in einen Beacon Chain-Block ab (als „Ausführungs-Payload“). Der Validator, der ausgewählt wurde, um den nächsten Block vorzuschlagen, prüft dann die verschiedenen Gebote und wählt das Bündel mit der höchsten Gebühr. PBS schafft im Wesentlichen einen Auktionsmarkt, auf dem Builder mit Validatoren verhandeln, die Blockplatz verkaufen. + +Aktuelle PBS-Designs verwenden ein [Commit-Reveal-Schema](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/), bei dem Builder nur eine kryptografische Verpflichtung auf den Inhalt eines Blocks (Block-Header) zusammen mit ihren Geboten veröffentlichen. Nach Annahme des Gewinnergebots erstellt der Vorschlagende einen signierten Blockvorschlag, der den Block-Header enthält. Es wird erwartet, dass der Block-Builder den vollständigen Blockkörper veröffentlicht, nachdem er den signierten Blockvorschlag gesehen hat, und er muss auch genügend [Bestätigungen](/glossary/#attestation) von Validatoren erhalten, bevor er finalisiert wird. + +#### Wie mildert die Proposer-Builder Separation die Auswirkungen von MEV ab? {#how-does-pbs-curb-mev-impact} + +Die protokollinterne Proposer-Builder Separation reduziert die Auswirkungen von MEV auf den Konsens, indem sie die MEV-Extraktion aus dem Zuständigkeitsbereich der Validatoren entfernt. Stattdessen werden Block-Builder, die spezialisierte Hardware betreiben, in Zukunft MEV-Gelegenheiten erfassen. + +Dies schließt Validatoren jedoch nicht völlig von MEV-bezogenen Einnahmen aus, da Builder hohe Gebote abgeben müssen, damit ihre Blöcke von Validatoren akzeptiert werden. Da Validatoren jedoch nicht mehr direkt auf die Optimierung von MEV-Einnahmen fokussiert sind, verringert sich die Gefahr von Time-Bandit-Angriffen. + +Die Proposer-Builder Separation reduziert auch die Zentralisierungsrisiken von MEV. Beispielsweise beseitigt die Verwendung eines Commit-Reveal-Schemas die Notwendigkeit für Builder, darauf zu vertrauen, dass Validatoren die MEV-Gelegenheit nicht stehlen oder sie anderen Buildern preisgeben. Dies senkt die Hürde für Solo-Staker, von MEV zu profitieren; andernfalls würden Builder dazu tendieren, große Pools mit Off-Chain-Reputation zu bevorzugen und Off-Chain-Deals mit ihnen durchzuführen. -## Weiterführende Informationen {#further-reading} +Ebenso müssen Validatoren nicht darauf vertrauen, dass Builder keine Blockkörper zurückhalten oder ungültige Blöcke veröffentlichen, da die Zahlung bedingungslos ist. Die Gebühr des Validators wird auch dann verarbeitet, wenn der vorgeschlagene Block nicht verfügbar ist oder von anderen Validatoren für ungültig erklärt wird. Im letzteren Fall wird der Block einfach verworfen, was den Block-Builder zwingt, alle Transaktionsgebühren und MEV-Einnahmen zu verlieren. -- [Was ist Miner-Extractable Value (MEV)?](https://blog.chain.link/what-is-miner-extractable-value-mev/) -- [MEV und ich](https://research.paradigm.xyz/MEV) -- [Ethereum ist ein dunkler Wald](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/) -- [Flucht aus dem dunklen Wald](https://samczsun.com/escaping-the-dark-forest/) -- [Flashbots: Vorläufer in der MEV-Krise](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) -- [@bertcmillers MEV-Themen](https://twitter.com/bertcmiller/status/1402665992422047747) +### Builder API {#builder-api} + +Während die Proposer-Builder Separation verspricht, die Auswirkungen der MEV-Extraktion zu reduzieren, erfordert ihre Implementierung Änderungen am Konsensprotokoll. Insbesondere müsste die [Fork-Choice](/developers/docs/consensus-mechanisms/pos/#fork-choice)-Regel auf der Beacon Chain aktualisiert werden. Die [Builder API](https://github.com/ethereum/builder-specs) ist eine vorübergehende Lösung, die darauf abzielt, eine funktionierende Implementierung der Proposer-Builder Separation bereitzustellen, wenn auch mit höheren Vertrauensannahmen. + +Die Builder API ist eine modifizierte Version der [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md), die von Konsens-Clients verwendet wird, um Ausführungs-Payloads von Ausführungs-Clients anzufordern. Wie in der [Spezifikation für ehrliche Validatoren](https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/validator.md) dargelegt, fordern Validatoren, die für Block-Vorschlagsaufgaben ausgewählt wurden, ein Transaktionsbündel von einem verbundenen Ausführungs-Client an, das sie in den vorgeschlagenen Beacon Chain-Block aufnehmen. + +Die Builder API fungiert auch als Middleware zwischen Validatoren und Ausführungs-Clients; sie unterscheidet sich jedoch dadurch, dass sie es Validatoren auf der Beacon Chain ermöglicht, Blöcke von externen Entitäten zu beziehen (anstatt einen Block lokal mit einem Ausführungs-Client zu erstellen). + +Nachfolgend finden Sie eine Übersicht darüber, wie die Builder API funktioniert: + +1. Die Builder API verbindet den Validator mit einem Netzwerk von Block-Buildern, die Ausführungs-Clients betreiben. Wie bei PBS sind Builder spezialisierte Parteien, die in ressourcenintensives Block-Building investieren und verschiedene Strategien anwenden, um die Einnahmen aus MEV + Prioritätstrinkgeldern zu maximieren. + +2. Ein Validator (der einen Konsens-Client betreibt) fordert Ausführungs-Payloads zusammen mit Geboten aus dem Netzwerk der Builder an. Gebote von Buildern enthalten den Header des Ausführungs-Payloads – eine kryptografische Verpflichtung auf den Inhalt des Payloads – und eine an den Validator zu zahlende Gebühr. + +3. Der Validator prüft die eingehenden Gebote und wählt den Ausführungs-Payload mit der höchsten Gebühr. Mithilfe der Builder API erstellt der Validator einen „blinden“ Beacon-Blockvorschlag, der nur seine Signatur und den Header des Ausführungs-Payloads enthält, und sendet ihn an den Builder. + +4. Es wird erwartet, dass der Builder, der die Builder API ausführt, mit dem vollständigen Ausführungs-Payload antwortet, sobald er den blinden Blockvorschlag sieht. Dies ermöglicht es dem Validator, einen „signierten“ Beacon-Block zu erstellen, den er im gesamten Netzwerk verbreitet. + +5. Von einem Validator, der die Builder API verwendet, wird weiterhin erwartet, dass er einen Block lokal erstellt, falls der Block-Builder nicht rechtzeitig antwortet, damit er keine Belohnungen für den Blockvorschlag verpasst. Der Validator kann jedoch keinen weiteren Block erstellen, weder mit den nun offengelegten Transaktionen noch mit einem anderen Set, da dies auf _Equivocation_ (das Signieren von zwei Blöcken innerhalb desselben Slots) hinauslaufen würde, was ein Vergehen ist, das mit Slashing bestraft wird. + +Eine beispielhafte Implementierung der Builder API ist [MEV Boost](https://github.com/flashbots/mev-boost), eine Verbesserung des [Flashbots-Auktionsmechanismus](https://docs.flashbots.net/flashbots-auction/overview), die entwickelt wurde, um die negativen externen Effekte von MEV auf Ethereum einzudämmen. Die Flashbots-Auktion ermöglicht es Validatoren im Proof-of-Stake, die Arbeit des Erstellens profitabler Blöcke an spezialisierte Parteien, sogenannte **Searcher**, auszulagern. +![Ein Diagramm, das den MEV-Fluss im Detail zeigt](./mev.png) + +Searcher suchen nach lukrativen MEV-Gelegenheiten und senden Transaktionsbündel an Block-Vorschlagende zusammen mit einem [verdeckten Gebot](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) für die Aufnahme in den Block. Der Validator, der mev-geth ausführt, eine geforkte Version des go-ethereum (Geth)-Clients, muss nur das Bündel mit dem meisten Gewinn auswählen und es als Teil des neuen Blocks aufnehmen. Um Block-Vorschlagende (Validatoren) vor Spam und ungültigen Transaktionen zu schützen, durchlaufen Transaktionsbündel **Relayer** zur Validierung, bevor sie zum Vorschlagenden gelangen. + +MEV Boost behält die gleiche Funktionsweise der ursprünglichen Flashbots-Auktion bei, wenn auch mit neuen Funktionen, die für Ethereums Wechsel zu Proof-of-Stake entwickelt wurden. Searcher finden weiterhin profitable MEV-Transaktionen für die Aufnahme in Blöcke, aber eine neue Klasse spezialisierter Parteien, sogenannte **Builder**, ist dafür verantwortlich, Transaktionen und Bündel zu Blöcken zu aggregieren. Ein Builder akzeptiert verdeckte Gebote von Searchern und führt Optimierungen durch, um die profitabelste Reihenfolge zu finden. + +Der Relayer ist weiterhin dafür verantwortlich, Transaktionsbündel zu validieren, bevor er sie an den Vorschlagenden weitergibt. MEV Boost führt jedoch **Treuhanddienste (Escrows)** ein, die für die Bereitstellung von [Datenverfügbarkeit](/developers/docs/data-availability/) verantwortlich sind, indem sie von Buildern gesendete Blockkörper und von Validatoren gesendete Block-Header speichern. Hier fragt ein mit einem Relay verbundener Validator nach verfügbaren Ausführungs-Payloads und verwendet den Sortieralgorithmus von MEV Boost, um den Payload-Header mit dem höchsten Gebot + MEV-Trinkgeldern auszuwählen. + +#### Wie mildert die Builder API die Auswirkungen von MEV ab? {#how-does-builder-api-curb-mev-impact} + +Der Hauptvorteil der Builder API ist ihr Potenzial, den Zugang zu MEV-Gelegenheiten zu demokratisieren. Die Verwendung von Commit-Reveal-Schemata eliminiert Vertrauensannahmen und senkt die Eintrittsbarrieren für Validatoren, die von MEV profitieren möchten. Dies sollte den Druck auf Solo-Staker verringern, sich in große Staking-Pools zu integrieren, um MEV-Gewinne zu steigern. + +Eine weit verbreitete Implementierung der Builder API wird einen größeren Wettbewerb unter Block-Buildern fördern, was die Zensurresistenz erhöht. Da Validatoren Gebote von mehreren Buildern prüfen, muss ein Builder, der beabsichtigt, eine oder mehrere Nutzertransaktionen zu zensieren, alle anderen nicht zensierenden Builder überbieten, um erfolgreich zu sein. Dies erhöht die Kosten für die Zensur von Nutzern drastisch und entmutigt diese Praxis. + +Einige Projekte, wie MEV Boost, verwenden die Builder API als Teil einer Gesamtstruktur, die darauf ausgelegt ist, bestimmten Parteien Transaktionsdatenschutz zu bieten, wie z. B. Händlern, die versuchen, Frontrunning-/Sandwiching-Angriffe zu vermeiden. Dies wird erreicht, indem ein privater Kommunikationskanal zwischen Nutzern und Block-Buildern bereitgestellt wird. Im Gegensatz zu den zuvor beschriebenen erlaubnispflichtigen Mempools ist dieser Ansatz aus folgenden Gründen vorteilhaft: + +1. Die Existenz mehrerer Builder auf dem Markt macht Zensur unpraktisch, was den Nutzern zugutekommt. Im Gegensatz dazu würde die Existenz zentralisierter und vertrauensbasierter Dark Pools die Macht in den Händen weniger Block-Builder konzentrieren und die Möglichkeit der Zensur erhöhen. + +2. Die Builder API-Software ist Open-Source, was es jedem ermöglicht, Block-Builder-Dienste anzubieten. Dies bedeutet, dass Nutzer nicht gezwungen sind, einen bestimmten Block-Builder zu verwenden, und verbessert die Neutralität und Erlaubnisfreiheit von Ethereum. Darüber hinaus werden MEV-suchende Händler nicht versehentlich zur Zentralisierung beitragen, indem sie private Transaktionskanäle nutzen. + +## Weiterführende Ressourcen {#related-resources} + +- [Flashbots-Dokumentation](https://docs.flashbots.net/) +- [Flashbots GitHub](https://github.com/flashbots/pm) +- [mevboost.org](https://www.mevboost.org/) - _Tracker mit Echtzeit-Statistiken für MEV-Boost-Relays und Block-Builder_ + +## Weiterführende Literatur {#further-reading} + +- [What Is Miner-Extractable Value (MEV)?](https://blog.chain.link/what-is-miner-extractable-value-mev/) +- [MEV and Me](https://www.paradigm.xyz/2021/02/mev-and-me) +- [Ethereum is a Dark Forest](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/) +- [Escaping the Dark Forest](https://samczsun.com/escaping-the-dark-forest/) +- [Flashbots: Frontrunning the MEV Crisis](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) +- [@bertcmiller's MEV Threads](https://twitter.com/bertcmiller/status/1402665992422047747) +- [MEV-Boost: Merge ready Flashbots Architecture](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) +- [What Is MEV Boost](https://www.alchemy.com/overviews/mev-boost) +- [Why run mev-boost?](https://writings.flashbots.net/writings/why-run-mevboost/) +- [The Hitchhikers Guide To Ethereum](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/networking-layer/index.md b/public/content/translations/de/developers/docs/networking-layer/index.md new file mode 100644 index 00000000000..d3c2edd8c31 --- /dev/null +++ b/public/content/translations/de/developers/docs/networking-layer/index.md @@ -0,0 +1,163 @@ +--- +title: Netzwerkschicht +description: "Eine Einführung in die Netzwerkschicht von Ethereum." +lang: de +sidebarDepth: 2 +--- + +[Ethereum](/) ist ein Peer-to-Peer-Netzwerk mit Tausenden von Blockchain-Knoten, die in der Lage sein müssen, über standardisierte Protokolle miteinander zu kommunizieren. Die „Netzwerkschicht“ ist der Stack von Protokollen, der es diesen Blockchain-Knoten ermöglicht, sich gegenseitig zu finden und Informationen auszutauschen. Dies umfasst das „Gossiping“ (Verbreiten) von Informationen (Eins-zu-Viele-Kommunikation) über das Netzwerk sowie den Austausch von Anfragen und Antworten zwischen bestimmten Blockchain-Knoten (Eins-zu-Eins-Kommunikation). Jeder Blockchain-Knoten muss bestimmte Netzwerkregeln einhalten, um sicherzustellen, dass er die richtigen Informationen sendet und empfängt. + +Die Client-Software besteht aus zwei Teilen (Ausführungs-Clients und Konsens-Clients), von denen jeder seinen eigenen, separaten Netzwerk-Stack hat. Neben der Kommunikation mit anderen Ethereum-Blockchain-Knoten müssen die Ausführungs- und Konsens-Clients auch miteinander kommunizieren. Diese Seite bietet eine einführende Erklärung der Protokolle, die diese Kommunikation ermöglichen. + +Ausführungs-Clients verbreiten Transaktionen über das Peer-to-Peer-Netzwerk der Ausführungsebene. Dies erfordert eine verschlüsselte Kommunikation zwischen authentifizierten Peers. Wenn ein Validator ausgewählt wird, um einen Block vorzuschlagen, werden Transaktionen aus dem lokalen Transaktionspool des Blockchain-Knotens über eine lokale RPC-Verbindung an Konsens-Clients weitergeleitet, die in Beacon-Blöcke verpackt werden. Konsens-Clients verbreiten dann Beacon-Blöcke über ihr P2P-Netzwerk. Dies erfordert zwei separate P2P-Netzwerke: eines, das Ausführungs-Clients für die Verbreitung von Transaktionen verbindet, und eines, das Konsens-Clients für die Verbreitung von Blöcken verbindet. + +## Voraussetzungen {#prerequisites} + +Ein gewisses Wissen über [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) von Ethereum ist hilfreich, um diese Seite zu verstehen. + +## Die Ausführungsebene {#execution-layer} + +Die Netzwerkprotokolle der Ausführungsebene sind in zwei Stacks unterteilt: + +- den Discovery-Stack: baut auf UDP auf und ermöglicht es einem neuen Blockchain-Knoten, Peers zu finden, mit denen er sich verbinden kann + +- den DevP2P-Stack: setzt auf TCP auf und ermöglicht es Blockchain-Knoten, Informationen auszutauschen + +Beide Stacks arbeiten parallel. Der Discovery-Stack speist neue Netzwerkteilnehmer in das Netzwerk ein, und der DevP2P-Stack ermöglicht deren Interaktionen. + +### Discovery {#discovery} + +Discovery ist der Prozess, andere Blockchain-Knoten im Netzwerk zu finden. Dies wird mithilfe einer kleinen Gruppe von Bootnodes (Blockchain-Knoten, deren Adressen in der Anwendung [fest codiert](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) sind, damit sie sofort gefunden werden können und die Anwendung mit Peers verbinden) initiiert. Diese Bootnodes existieren nur, um einen neuen Blockchain-Knoten einer Gruppe von Peers vorzustellen – dies ist ihr einziger Zweck. Sie nehmen nicht an normalen Anwendungsaufgaben wie der Synchronisierung der Blockchain teil und werden nur beim allerersten Start einer Anwendung verwendet. + +Das für die Interaktionen zwischen Blockchain-Knoten und Bootnode verwendete Protokoll ist eine modifizierte Form von [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f), das eine [verteilte Hash-Tabelle](https://en.wikipedia.org/wiki/Distributed_hash_table) verwendet, um Listen von Blockchain-Knoten zu teilen. Jeder Blockchain-Knoten verfügt über eine Version dieser Tabelle, die die erforderlichen Informationen enthält, um sich mit seinen engsten Peers zu verbinden. Diese „Nähe“ ist nicht geografisch – die Entfernung wird durch die Ähnlichkeit der ID des Blockchain-Knotens definiert. Die Tabelle jedes Blockchain-Knotens wird als Sicherheitsfunktion regelmäßig aktualisiert. Zum Beispiel sind im Discovery-Protokoll [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) Blockchain-Knoten auch in der Lage, „Anzeigen“ zu senden, die die von der Anwendung unterstützten Subprotokolle anzeigen. Dies ermöglicht es Peers, über die Protokolle zu verhandeln, die sie beide für die Kommunikation verwenden können. + +Discovery beginnt mit einem PING-PONG-Spiel. Ein erfolgreiches PING-PONG „bindet“ den neuen Blockchain-Knoten an einen Bootnode. Die anfängliche Nachricht, die einen Bootnode auf die Existenz eines neuen Blockchain-Knotens aufmerksam macht, der dem Netzwerk beitritt, ist ein `PING`. Dieses `PING` enthält gehashte Informationen über den neuen Blockchain-Knoten, den Bootnode und einen Ablaufzeitstempel. Der Bootnode empfängt das `PING` und gibt ein `PONG` zurück, das den `PING`-Hash enthält. Wenn die `PING`- und `PONG`-Hashes übereinstimmen, wird die Verbindung zwischen dem neuen Blockchain-Knoten und dem Bootnode verifiziert und man sagt, sie haben sich „gebunden“ (bonded). + +Sobald sie gebunden sind, kann der neue Blockchain-Knoten eine `FIND-NEIGHBOURS`-Anfrage an den Bootnode senden. Die vom Bootnode zurückgegebenen Daten enthalten eine Liste von Peers, mit denen sich der neue Blockchain-Knoten verbinden kann. Wenn die Blockchain-Knoten nicht gebunden sind, schlägt die `FIND-NEIGHBOURS`-Anfrage fehl, sodass der neue Blockchain-Knoten dem Netzwerk nicht beitreten kann. + +Sobald der neue Blockchain-Knoten eine Liste von Nachbarn vom Bootnode erhält, beginnt er mit jedem von ihnen einen PING-PONG-Austausch. Erfolgreiche PING-PONGs binden den neuen Blockchain-Knoten an seine Nachbarn und ermöglichen den Nachrichtenaustausch. + +``` +start client --> connect to bootnode --> bond to bootnode --> find neighbours --> bond to neighbours +``` + +Ausführungs-Clients verwenden derzeit das Discovery-Protokoll [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md), und es gibt aktive Bemühungen, auf das Protokoll [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) zu migrieren. + +#### ENR: Ethereum Node Records {#enr} + +Der [Ethereum Node Record (ENR)](/developers/docs/networking-layer/network-addresses/) ist ein Objekt, das drei grundlegende Elemente enthält: eine Signatur (Hash des Datensatzinhalts, der nach einem vereinbarten Identitätsschema erstellt wurde), eine Sequenznummer, die Änderungen am Datensatz verfolgt, und eine beliebige Liste von Schlüssel-Wert-Paaren. Dies ist ein zukunftssicheres Format, das einen einfacheren Austausch von Identifizierungsinformationen zwischen neuen Peers ermöglicht und das bevorzugte Format für [Netzwerkadressen](/developers/docs/networking-layer/network-addresses) für Ethereum-Blockchain-Knoten ist. + +#### Warum basiert Discovery auf UDP? {#why-udp} + +UDP unterstützt keine Fehlerprüfung, kein erneutes Senden fehlgeschlagener Pakete und kein dynamisches Öffnen und Schließen von Verbindungen – stattdessen feuert es einfach einen kontinuierlichen Informationsstrom auf ein Ziel ab, unabhängig davon, ob dieser erfolgreich empfangen wird. Diese minimale Funktionalität führt auch zu minimalem Overhead, was diese Art von Verbindung sehr schnell macht. Für Discovery, bei dem ein Blockchain-Knoten lediglich seine Anwesenheit bekannt machen möchte, um dann eine formelle Verbindung mit einem Peer herzustellen, ist UDP ausreichend. Für den Rest des Netzwerk-Stacks ist UDP jedoch nicht geeignet. Der Informationsaustausch zwischen Blockchain-Knoten ist recht komplex und erfordert daher ein funktionsreicheres Protokoll, das erneutes Senden, Fehlerprüfung usw. unterstützen kann. Der zusätzliche Overhead, der mit TCP verbunden ist, ist die zusätzliche Funktionalität wert. Daher arbeitet der Großteil des P2P-Stacks über TCP. + +### DevP2P {#devp2p} + +DevP2P ist selbst ein ganzer Stack von Protokollen, den Ethereum implementiert, um das Peer-to-Peer-Netzwerk aufzubauen und aufrechtzuerhalten. Nachdem neue Blockchain-Knoten dem Netzwerk beigetreten sind, werden ihre Interaktionen durch Protokolle im [DevP2P](https://github.com/ethereum/devp2p)-Stack gesteuert. Diese setzen alle auf TCP auf und umfassen das RLPx-Transportprotokoll, das Wire-Protokoll und mehrere Subprotokolle. [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) ist das Protokoll, das die Initiierung, Authentifizierung und Aufrechterhaltung von Sitzungen zwischen Blockchain-Knoten regelt. RLPx codiert Nachrichten mit RLP (Recursive Length Prefix), was eine sehr platzsparende Methode ist, um Daten in eine minimale Struktur für das Senden zwischen Blockchain-Knoten zu codieren. + +Eine RLPx-Sitzung zwischen zwei Blockchain-Knoten beginnt mit einem anfänglichen kryptografischen Handshake. Dabei sendet der Blockchain-Knoten eine Authentifizierungsnachricht, die dann vom Peer verifiziert wird. Bei erfolgreicher Verifizierung generiert der Peer eine Authentifizierungsbestätigungsnachricht, die an den initiierenden Blockchain-Knoten zurückgegeben wird. Dies ist ein Schlüsselaustauschprozess, der es den Blockchain-Knoten ermöglicht, privat und sicher zu kommunizieren. Ein erfolgreicher kryptografischer Handshake löst dann aus, dass beide Blockchain-Knoten eine „Hello“-Nachricht „on the wire“ (über die Leitung) aneinander senden. Das Wire-Protokoll wird durch einen erfolgreichen Austausch von Hello-Nachrichten initiiert. + +Die Hello-Nachrichten enthalten: + +- Protokollversion +- Anwendungs-ID +- Port +- Blockchain-Knoten-ID +- Liste der unterstützten Subprotokolle + +Dies sind die für eine erfolgreiche Interaktion erforderlichen Informationen, da sie definieren, welche Fähigkeiten zwischen beiden Blockchain-Knoten geteilt werden, und die Kommunikation konfigurieren. Es gibt einen Prozess der Subprotokoll-Aushandlung, bei dem die Listen der von jedem Blockchain-Knoten unterstützten Subprotokolle verglichen werden und diejenigen, die beiden Blockchain-Knoten gemeinsam sind, in der Sitzung verwendet werden können. + +Zusammen mit den Hello-Nachrichten kann das Wire-Protokoll auch eine „Disconnect“-Nachricht senden, die einen Peer warnt, dass die Verbindung geschlossen wird. Das Wire-Protokoll enthält auch PING- und PONG-Nachrichten, die regelmäßig gesendet werden, um eine Sitzung offen zu halten. Der Austausch über RLPx und das Wire-Protokoll bildet somit die Grundlage der Kommunikation zwischen den Blockchain-Knoten und bietet das Gerüst für den Austausch nützlicher Informationen gemäß einem bestimmten Subprotokoll. + +### Subprotokolle {#sub-protocols} + +#### Wire-Protokoll {#wire-protocol} + +Sobald Peers verbunden sind und eine RLPx-Sitzung gestartet wurde, definiert das Wire-Protokoll, wie Peers kommunizieren. Ursprünglich definierte das Wire-Protokoll drei Hauptaufgaben: Blockchain-Synchronisation, Blockverbreitung und Transaktionsaustausch. Nachdem Ethereum jedoch zu Proof-of-Stake gewechselt war, wurden die Blockverbreitung und die Blockchain-Synchronisation Teil der Konsensebene. Der Transaktionsaustausch liegt weiterhin im Aufgabenbereich der Ausführungs-Clients. Der Transaktionsaustausch bezieht sich auf den Austausch ausstehender Transaktionen zwischen Blockchain-Knoten, sodass Block-Ersteller einige davon für die Aufnahme in den nächsten Block auswählen können. Detaillierte Informationen zu diesen Aufgaben finden Sie [hier](https://github.com/ethereum/devp2p/blob/master/caps/eth.md). Anwendungen, die diese Subprotokolle unterstützen, stellen sie über den [JSON-RPC](/developers/docs/apis/json-rpc/) zur Verfügung. + +#### les (Light Ethereum Subprotocol) {#les} + +Dies ist ein minimales Protokoll zur Synchronisierung von Light-Clients. Traditionell wurde dieses Protokoll selten verwendet, da Full-Nodes (vollständige Blockchain-Knoten) erforderlich sind, um Daten für Light-Clients bereitzustellen, ohne dafür einen Anreiz zu erhalten. Das Standardverhalten von Ausführungs-Clients besteht darin, keine Light-Client-Daten über les bereitzustellen. Weitere Informationen finden Sie in der les-[Spezifikation](https://github.com/ethereum/devp2p/blob/master/caps/les.md). + +#### Snap {#snap} + +Das [Snap-Protokoll](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) ist eine optionale Erweiterung, die es Peers ermöglicht, Snapshots aktueller Status auszutauschen. Dadurch können Peers Konto- und Speicherdaten verifizieren, ohne dazwischenliegende Merkle-Trie-Knoten herunterladen zu müssen. + +#### Wit (Witness-Protokoll) {#wit} + +Das [Witness-Protokoll](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) ist eine optionale Erweiterung, die den Austausch von Status-Witnesses (Zeugen) zwischen Peers ermöglicht und dabei hilft, Anwendungen mit der Spitze der Blockchain zu synchronisieren. + +#### Whisper {#whisper} + +Whisper war ein Protokoll, das darauf abzielte, sicheres Messaging zwischen Peers bereitzustellen, ohne Informationen in die Blockchain zu schreiben. Es war Teil des DevP2P-Wire-Protokolls, ist aber mittlerweile veraltet. Es gibt andere [verwandte Projekte](https://wakunetwork.com/) mit ähnlichen Zielen. + +## Die Konsensebene {#consensus-layer} + +Die Konsens-Clients nehmen an einem separaten Peer-to-Peer-Netzwerk mit einer anderen Spezifikation teil. Konsens-Clients müssen an der Blockverbreitung (Block Gossip) teilnehmen, damit sie neue Blöcke von Peers empfangen und diese übertragen können, wenn sie an der Reihe sind, Block-Vorschlagender zu sein. Ähnlich wie bei der Ausführungsebene erfordert dies zunächst ein Discovery-Protokoll, damit ein Blockchain-Knoten Peers finden und sichere Sitzungen zum Austausch von Blöcken, Bestätigungen usw. einrichten kann. + +### Discovery {#consensus-discovery} + +Ähnlich wie die Ausführungs-Clients verwenden Konsens-Clients [discv5](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) über UDP, um Peers zu finden. Die Implementierung von discv5 auf der Konsensebene unterscheidet sich von der der Ausführungs-Clients nur dadurch, dass sie einen Adapter enthält, der discv5 mit einem [libP2P](https://libp2p.io/)-Stack verbindet und DevP2P obsolet macht. Die RLPx-Sitzungen der Ausführungsebene sind zugunsten des sicheren Noise-Kanal-Handshakes von libP2P veraltet. + +### ENRs {#consensus-enr} + +Der ENR für Konsens-Blockchain-Knoten enthält den Public-Key des Blockchain-Knotens, die IP-Adresse, UDP- und TCP-Ports sowie zwei konsensspezifische Felder: das Bestätigungs-Subnetz-Bitfeld und den `eth2`-Schlüssel. Ersteres erleichtert es Blockchain-Knoten, Peers zu finden, die an bestimmten Subnetzwerken für die Verbreitung von Bestätigungen teilnehmen. Der `eth2`-Schlüssel enthält Informationen darüber, welche Ethereum-Fork-Version der Blockchain-Knoten verwendet, um sicherzustellen, dass sich Peers mit dem richtigen Ethereum verbinden. + +### libP2P {#libp2p} + +Der libP2P-Stack unterstützt die gesamte Kommunikation nach der Discovery. Anwendungen können über IPv4 und/oder IPv6 wählen und zuhören, wie in ihrem ENR definiert. Die Protokolle auf der libP2P-Schicht können in die Gossip- und Req/Resp-Domänen (Anfrage/Antwort) unterteilt werden. + +### Gossip {#gossip} + +Die Gossip-Domäne umfasst alle Informationen, die sich schnell im gesamten Netzwerk verbreiten müssen. Dazu gehören Beacon-Blöcke, Beweise, Bestätigungen, Exits und Slashings. Dies wird mithilfe von libP2P gossipsub v1 übertragen und basiert auf verschiedenen Metadaten, die lokal auf jedem Blockchain-Knoten gespeichert sind, einschließlich der maximalen Größe der zu empfangenden und zu sendenden Gossip-Nutzdaten. Detaillierte Informationen zur Gossip-Domäne finden Sie [hier](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub). + +### Request-Response (Anfrage-Antwort) {#request-response} + +Die Request-Response-Domäne enthält Protokolle für Anwendungen, die spezifische Informationen von ihren Peers anfordern. Beispiele hierfür sind die Anforderung bestimmter Beacon-Blöcke, die mit bestimmten Root-Hashes übereinstimmen oder innerhalb eines Bereichs von Slots liegen. Die Antworten werden immer als Snappy-komprimierte, SSZ-codierte Bytes zurückgegeben. + +## Warum bevorzugt der Konsens-Client SSZ gegenüber RLP? {#ssz-vs-rlp} + +SSZ steht für Simple Serialization (einfache Serialisierung). Es verwendet feste Offsets, die es einfach machen, einzelne Teile einer codierten Nachricht zu decodieren, ohne die gesamte Struktur decodieren zu müssen. Dies ist für den Konsens-Client sehr nützlich, da er effizient bestimmte Informationen aus codierten Nachrichten extrahieren kann. Es wurde auch speziell für die Integration mit Merkle-Protokollen entwickelt, was zu entsprechenden Effizienzgewinnen bei der Merkleisierung führt. Da alle Hashes in der Konsensebene Merkle-Roots sind, summiert sich dies zu einer erheblichen Verbesserung. SSZ garantiert außerdem eindeutige Darstellungen von Werten. + +## Verbindung von Ausführungs- und Konsens-Clients {#connecting-clients} + +Sowohl Konsens- als auch Ausführungs-Clients laufen parallel. Sie müssen verbunden sein, damit der Konsens-Client dem Ausführungs-Client Anweisungen geben kann und der Ausführungs-Client Transaktionsbündel an den Konsens-Client weiterleiten kann, um sie in Beacon-Blöcke aufzunehmen. Die Kommunikation zwischen den beiden Clients kann über eine lokale RPC-Verbindung erfolgen. Eine API, bekannt als ['Engine-API'](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md), definiert die Anweisungen, die zwischen den beiden Clients gesendet werden. Da beide Clients hinter einer einzigen Netzwerkidentität stehen, teilen sie sich einen ENR (Ethereum Node Record), der einen separaten Schlüssel für jeden Client enthält (eth1-Schlüssel und eth2-Schlüssel). + +Eine Zusammenfassung des Kontrollflusses ist unten dargestellt, wobei der relevante Netzwerk-Stack in Klammern angegeben ist. + +### Wenn der Konsens-Client nicht der Block-Produzent ist: {#when-consensus-client-is-not-block-producer} + +- Der Konsens-Client empfängt einen Block über das Block-Gossip-Protokoll (Konsens-P2P) +- Der Konsens-Client validiert den Block vor, d. h. er stellt sicher, dass er von einem gültigen Absender mit korrekten Metadaten stammt +- Die Transaktionen im Block werden als Ausführungs-Payload an die Ausführungsebene gesendet (lokale RPC-Verbindung) +- Die Ausführungsebene führt die Transaktionen aus und validiert den Status im Block-Header (d. h. prüft, ob die Hashes übereinstimmen) +- Die Ausführungsebene gibt Validierungsdaten an die Konsensebene zurück, der Block gilt nun als validiert (lokale RPC-Verbindung) +- Die Konsensebene fügt den Block an die Spitze ihrer eigenen Blockchain an und bestätigt ihn, wobei die Bestätigung über das Netzwerk übertragen wird (Konsens-P2P) + +### Wenn der Konsens-Client der Block-Produzent ist: {#when-consensus-client-is-block-producer} + +- Der Konsens-Client erhält die Benachrichtigung, dass er der nächste Block-Produzent ist (Konsens-P2P) +- Die Konsensebene ruft die Methode `create block` im Ausführungs-Client auf (lokaler RPC) +- Die Ausführungsebene greift auf den Transaktions-Mempool zu, der durch das Transaktions-Gossip-Protokoll gefüllt wurde (Ausführungs-P2P) +- Der Ausführungs-Client bündelt Transaktionen in einen Block, führt die Transaktionen aus und generiert einen Block-Hash +- Der Konsens-Client holt sich die Transaktionen und den Block-Hash vom Ausführungs-Client und fügt sie dem Beacon-Block hinzu (lokaler RPC) +- Der Konsens-Client überträgt den Block über das Block-Gossip-Protokoll (Konsens-P2P) +- Andere Clients empfangen den vorgeschlagenen Block über das Block-Gossip-Protokoll und validieren ihn wie oben beschrieben (Konsens-P2P) + +Sobald der Block von ausreichend Validatoren bestätigt wurde, wird er an die Spitze der Blockchain angehängt, gerechtfertigt (justified) und schließlich finalisiert. + +![Diagramm der Netzwerkschicht des Ethereum-Konsens-Clients](cons_client_net_layer.png) +![Diagramm der Netzwerkschicht des Ethereum-Ausführungs-Clients](exe_client_net_layer.png) + +Schema der Netzwerkschicht für Konsens- und Ausführungs-Clients, von [ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248) + +## Weiterführende Literatur {#further-reading} + +[DevP2P](https://github.com/ethereum/devp2p) +[LibP2p](https://github.com/libp2p/specs) +[Netzwerkspezifikationen der Konsensebene](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#enr-structure) +[Kademlia zu discv5](https://vac.dev/kademlia-to-discv5) +[Kademlia-Paper](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) +[Einführung in Ethereum P2P](https://p2p.paris/en/talks/intro-ethereum-networking/) +[Beziehung zwischen eth1 und eth2](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) +[Video zu Details über den Merge und eth2-Clients](https://www.youtube.com/watch?v=zNIrIninMgg) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md new file mode 100644 index 00000000000..23cea96298d --- /dev/null +++ b/public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md @@ -0,0 +1,39 @@ +--- +title: Netzwerkadressen +description: "Eine Einführung in Netzwerkadressen." +lang: de +sidebarDepth: 2 +--- + +[Ethereum](/) Blockchain-Knoten müssen sich mit einigen grundlegenden Informationen identifizieren, um sich mit Peers zu verbinden. Um sicherzustellen, dass jeder potenzielle Peer diese Informationen interpretieren kann, werden sie in einem von drei standardisierten Formaten weitergeleitet, die jeder Ethereum-Blockchain-Knoten verstehen kann: Multiaddr, Enode oder Ethereum Node Records (ENRs). ENRs sind der aktuelle Standard für Ethereum-Netzwerkadressen. + +## Voraussetzungen {#prerequisites} + +Ein gewisses Verständnis der [Netzwerkschicht](/developers/docs/networking-layer/) von Ethereum ist erforderlich, um diese Seite zu verstehen. + +## Multiaddr {#multiaddr} + +Das ursprüngliche Adressformat für Ethereum-Blockchain-Knoten war die „Multiaddr“ (kurz für „Multi-Addresses“). Multiaddr ist ein universelles Format, das für Peer-to-Peer-Netzwerke entwickelt wurde. Adressen werden als Schlüssel-Wert-Paare dargestellt, wobei Schlüssel und Werte durch einen Schrägstrich getrennt sind. Zum Beispiel sieht die Multiaddr für einen Blockchain-Knoten mit der IPv4-Adresse `192.168.22.27`, der auf dem TCP-Port `33000` lauscht, wie folgt aus: + +`/ip4/192.168.22.27/tcp/33000` + +Für einen Ethereum-Blockchain-Knoten enthält die Multiaddr die Knoten-ID (einen Hash ihres Public-Keys): + +`/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br` + +## Enode {#enode} + +Ein Enode ist eine Möglichkeit, einen Ethereum-Blockchain-Knoten mithilfe eines URL-Adressformats zu identifizieren. Die hexadezimale Knoten-ID wird im Benutzernamenteil der URL codiert und durch ein @-Zeichen vom Host getrennt. Der Hostname kann nur als IP-Adresse angegeben werden; DNS-Namen sind nicht zulässig. Der Port im Hostnamen-Abschnitt ist der TCP-Listening-Port. Wenn sich die TCP- und UDP-Ports (Discovery) unterscheiden, wird der UDP-Port als Abfrageparameter „discport“ angegeben. + +Im folgenden Beispiel beschreibt die Knoten-URL einen Blockchain-Knoten mit der IP-Adresse `10.3.58.6`, dem TCP-Port `30303` und dem UDP-Discovery-Port `30301`. + +`enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301` + +## Ethereum Node Records (ENRs) {#enr} + +Ethereum Node Records (ENRs) sind ein standardisiertes Format für Netzwerkadressen auf Ethereum. Sie ersetzen Multiaddrs und Enodes. Diese sind besonders nützlich, da sie einen größeren Informationsaustausch zwischen Blockchain-Knoten ermöglichen. Der ENR enthält eine Signatur, eine Sequenznummer und Felder, die das Identitätsschema detailliert beschreiben, das zum Generieren und Validieren von Signaturen verwendet wird. Der ENR kann auch mit beliebigen Daten gefüllt werden, die als Schlüssel-Wert-Paare organisiert sind. Diese Schlüssel-Wert-Paare enthalten die IP-Adresse des Blockchain-Knotens und Informationen über die Subprotokolle, die der Blockchain-Knoten verwenden kann. Konsens-Clients verwenden eine [spezifische ENR-Struktur](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#enr-structure), um Boot-Knoten zu identifizieren, und enthalten auch ein `eth2`-Feld mit Informationen über den aktuellen Ethereum-Fork und das Attestation-Gossip-Subnetz (dies verbindet den Blockchain-Knoten mit einer bestimmten Gruppe von Peers, deren Bestätigungen zusammengefasst werden). + +## Weiterführende Literatur {#further-reading} + +- [EIP-778: Ethereum Node Records (ENR)](https://eips.ethereum.org/EIPS/eip-778) +- [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/de/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..7eccaacafa4 --- /dev/null +++ b/public/content/translations/de/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,89 @@ +--- +title: Das Portal Network +description: "Ein Überblick über das Portal Network – ein in der Entwicklung befindliches Netzwerk zur Unterstützung von ressourcenarmen Anwendungen." +lang: de +--- + +[Ethereum](/) ist ein Netzwerk aus Computern, auf denen Ethereum-Anwendungssoftware ausgeführt wird. Jeder dieser Computer wird als „Blockchain-Knoten“ bezeichnet. Die Anwendungssoftware ermöglicht es einem Blockchain-Knoten, Daten im Ethereum-Netzwerk zu senden und zu empfangen, und verifiziert Daten anhand der Ethereum-Protokollregeln. Blockchain-Knoten speichern viele historische Daten auf ihren Festplatten und fügen diesen hinzu, wenn sie neue Informationspakete, sogenannte Blöcke, von anderen Blockchain-Knoten im Netzwerk erhalten. Dies ist notwendig, um stets zu überprüfen, ob ein Blockchain-Knoten über Informationen verfügt, die mit dem Rest des Netzwerks übereinstimmen. Das bedeutet, dass der Betrieb eines Blockchain-Knotens viel Speicherplatz erfordern kann. Einige Operationen von Blockchain-Knoten können auch viel RAM erfordern. + +Um dieses Speicherplatzproblem zu umgehen, wurden „leichte“ Blockchain-Knoten entwickelt, die Informationen von vollständigen Blockchain-Knoten anfordern, anstatt alles selbst zu speichern. Dies bedeutet jedoch, dass der leichte Blockchain-Knoten die Informationen nicht unabhängig verifiziert und stattdessen einem anderen Blockchain-Knoten vertraut. Es bedeutet auch, dass vollständige Blockchain-Knoten zusätzliche Arbeit übernehmen müssen, um diese leichten Blockchain-Knoten zu bedienen. + +Das Portal Network ist ein neues Netzwerkdesign für Ethereum, das darauf abzielt, das Problem der Datenverfügbarkeit für „leichte“ Blockchain-Knoten zu lösen, ohne vollständigen Blockchain-Knoten vertrauen oder diese zusätzlich belasten zu müssen, indem die erforderlichen Daten in kleinen Stücken über das Netzwerk verteilt werden. + +Mehr über [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) + +## Warum brauchen wir das Portal Network? {#why-do-we-need-portal-network} + +Ethereum-Blockchain-Knoten speichern ihre eigene vollständige oder teilweise Kopie der Ethereum-Blockchain. Diese lokale Kopie wird verwendet, um Transaktionen zu validieren und sicherzustellen, dass der Blockchain-Knoten der richtigen Chain folgt. Diese lokal gespeicherten Daten ermöglichen es Blockchain-Knoten, unabhängig zu überprüfen, ob eingehende Daten gültig und korrekt sind, ohne einer anderen Entität vertrauen zu müssen. + +Diese lokale Kopie der Blockchain und die zugehörigen Status- und Belegdaten beanspruchen viel Platz auf der Festplatte des Blockchain-Knotens. Beispielsweise wird eine 2-TB-Festplatte für den Betrieb eines Blockchain-Knotens empfohlen, der [Geth](https://geth.ethereum.org) in Verbindung mit einem Konsens-Client verwendet. Bei der Verwendung von Snap Sync, das nur Chain-Daten aus einer relativ aktuellen Menge von Blöcken speichert, belegt Geth typischerweise etwa 650 GB Speicherplatz, wächst jedoch um etwa 14 GB/Woche (Sie können den Blockchain-Knoten regelmäßig wieder auf 650 GB bereinigen). + +Das bedeutet, dass der Betrieb von Blockchain-Knoten teuer sein kann, da Ethereum eine große Menge an Speicherplatz zugewiesen werden muss. Es gibt mehrere Lösungen für dieses Problem auf der Ethereum-Roadmap, einschließlich [Historienablauf (History Expiry)](/roadmap/statelessness/#history-expiry), [Statusablauf (State Expiry)](/roadmap/statelessness/#state-expiry) und [Zustandslosigkeit (Statelessness)](/roadmap/statelessness/). Es wird jedoch wahrscheinlich noch einige Jahre dauern, bis diese implementiert sind. Es gibt auch [leichte Blockchain-Knoten](/developers/docs/nodes-and-clients/light-clients/), die keine eigene Kopie der Chain-Daten speichern; sie fordern die benötigten Daten von vollständigen Blockchain-Knoten an. Dies bedeutet jedoch, dass leichte Blockchain-Knoten darauf vertrauen müssen, dass vollständige Blockchain-Knoten ehrliche Daten liefern, und belastet zudem die vollständigen Blockchain-Knoten, die die von den leichten Blockchain-Knoten benötigten Daten bereitstellen müssen. + +Das Portal Network zielt darauf ab, eine alternative Möglichkeit für leichte Blockchain-Knoten bereitzustellen, an ihre Daten zu gelangen, die kein Vertrauen erfordert oder die Arbeit, die von vollständigen Blockchain-Knoten geleistet werden muss, erheblich erhöht. Dies soll erreicht werden, indem eine neue Methode für Ethereum-Blockchain-Knoten eingeführt wird, um Daten über das Netzwerk hinweg zu teilen. + +## Wie funktioniert das Portal Network? {#how-does-portal-network-work} + +Ethereum-Blockchain-Knoten haben strenge Protokolle, die definieren, wie sie miteinander kommunizieren. Ausführungs-Clients kommunizieren über eine Reihe von Subprotokollen, die als [DevP2P](/developers/docs/networking-layer/#devp2p) bekannt sind, während Konsens-Clients einen anderen Stack von Subprotokollen namens [libP2P](/developers/docs/networking-layer/#libp2p) verwenden. Diese definieren die Arten von Daten, die zwischen Blockchain-Knoten weitergegeben werden können. + +![devP2P und libP2P](portal-network-devp2p-libp2p.png) + +Blockchain-Knoten können auch spezifische Daten über die [JSON-RPC-API](/developers/docs/apis/json-rpc/) bereitstellen. Auf diese Weise tauschen Apps und Wallets Informationen mit Ethereum-Blockchain-Knoten aus. Keines dieser Protokolle ist jedoch ideal, um Daten für leichte Anwendungen bereitzustellen. + +Leichte Anwendungen können derzeit keine spezifischen Teile von Chain-Daten über DevP2P oder libP2P anfordern, da diese Protokolle nur darauf ausgelegt sind, die Chain-Synchronisation und das Verbreiten (Gossiping) von Blöcken und Transaktionen zu ermöglichen. Leichte Anwendungen möchten diese Informationen nicht herunterladen, da sie dadurch nicht mehr „leicht“ wären. + +Die JSON-RPC-API ist ebenfalls keine ideale Wahl für Datenanfragen von leichten Anwendungen, da sie auf einer Verbindung zu einem bestimmten vollständigen Blockchain-Knoten oder einem zentralisierten RPC-Anbieter beruht, der die Daten bereitstellen kann. Dies bedeutet, dass die leichte Anwendung darauf vertrauen muss, dass dieser spezifische Blockchain-Knoten/Anbieter ehrlich ist, und der vollständige Blockchain-Knoten möglicherweise viele Anfragen von vielen leichten Anwendungen bearbeiten muss, was seine Bandbreitenanforderungen erhöht. + +Der Sinn des Portal Networks besteht darin, das gesamte Design zu überdenken und speziell auf Leichtigkeit auszulegen, außerhalb der Designbeschränkungen der bestehenden Ethereum-Anwendungen. + +Die Kernidee des Portal Networks besteht darin, die besten Teile des aktuellen Netzwerk-Stacks zu übernehmen, indem Informationen, die von leichten Anwendungen benötigt werden, wie historische Daten und die Identität des aktuellen Kopfes der Chain, über ein leichtgewichtiges dezentralisiertes Peer-to-Peer-Netzwerk im DevP2P-Stil unter Verwendung einer [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (ähnlich wie Bittorrent) bereitgestellt werden. + +Die Idee ist, jedem Blockchain-Knoten kleine Teile der gesamten historischen Ethereum-Daten und einige spezifische Verantwortlichkeiten für Blockchain-Knoten hinzuzufügen. Anfragen werden dann bedient, indem die Blockchain-Knoten gesucht werden, die die spezifisch angeforderten Daten speichern, und diese von ihnen abgerufen werden. + +Dies kehrt das normale Modell um, bei dem leichte Blockchain-Knoten einen einzelnen Blockchain-Knoten finden und diesen auffordern, große Datenmengen zu filtern und bereitzustellen; stattdessen filtern sie schnell ein großes Netzwerk von Blockchain-Knoten, die jeweils kleine Datenmengen verarbeiten. + +Das Ziel ist es, einem dezentralisierten Netzwerk von leichten Portal-Anwendungen Folgendes zu ermöglichen: + +- den Kopf der Chain zu verfolgen +- aktuelle und historische Chain-Daten zu synchronisieren +- Statusdaten abzurufen +- Transaktionen zu übertragen +- Transaktionen mithilfe der [EVM](/developers/docs/evm/) auszuführen + +Die Vorteile dieses Netzwerkdesigns sind: + +- Verringerung der Abhängigkeit von zentralisierten Anbietern +- Reduzierung der Internetbandbreitennutzung +- Minimierte oder gar keine Synchronisierung +- Zugänglich für ressourcenbeschränkte Geräte (\<1 GB RAM, \<100 MB Speicherplatz, 1 CPU) + +Die folgende Tabelle zeigt die Funktionen bestehender Anwendungen, die durch das Portal Network bereitgestellt werden können, sodass Benutzer auf sehr ressourcenarmen Geräten auf diese Funktionen zugreifen können. + +### Die Portal Networks + +| Beacon-Light-Client | Status-Netzwerk | Transaktions-Gossip | Historien-Netzwerk | +| ------------------- | ---------------------------- | ------------------- | --------------- | +| Beacon Chain Light | Konto- und Vertragsspeicher | Leichtgewichtiger Mempool | Header | +| Protokolldaten | | | Blockkörper | +| | | | Belege | + +## Client-Vielfalt standardmäßig {#client-diversity-as-default} + +Die Entwickler des Portal Networks haben sich zudem für das Design entschieden, vom ersten Tag an vier separate Portal Network-Anwendungen zu entwickeln. + +Die Portal Network-Anwendungen sind: + +- [Trin](https://github.com/ethereum/trin): geschrieben in Rust +- [Fluffy](https://fluffy.guide): geschrieben in Nim +- [Ultralight](https://github.com/ethereumjs/ultralight): geschrieben in TypeScript +- [Shisui](https://github.com/zen-eth/shisui): geschrieben in Go + +Mehrere unabhängige Anwendungs-Implementierungen zu haben, erhöht die Widerstandsfähigkeit und Dezentralisierung des Ethereum-Netzwerks. + +Wenn eine Anwendung Probleme oder Schwachstellen aufweist, können andere Anwendungen weiterhin reibungslos funktionieren, wodurch ein Single Point of Failure vermieden wird. Darüber hinaus fördern vielfältige Anwendungs-Implementierungen Innovation und Wettbewerb, treiben Verbesserungen voran und reduzieren das Risiko einer Monokultur innerhalb des Ökosystems. + +## Weiterführende Literatur {#further-reading} + +- [Das Portal Network (Piper Merriam auf der Devcon Bogota)](https://www.youtube.com/watch?v=0stc9jnQLXA). +- [Der Portal Network Discord](https://discord.gg/CFFnmE7Hbs) +- [Die Portal Network Website](https://www.ethportal.net/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/networks/index.md b/public/content/translations/de/developers/docs/networks/index.md index 583edd737f4..6b9c59035b4 100644 --- a/public/content/translations/de/developers/docs/networks/index.md +++ b/public/content/translations/de/developers/docs/networks/index.md @@ -1,49 +1,44 @@ --- title: Netzwerke -description: Eine Übersicht über Ethereums Netzwerke und wo man Testnet Ether (ETH) zum Testen neuer Anwendungen bekommt. +description: "Ein Überblick über die Netzwerke von Ethereum und wo man Testnet-Ether (ETH) zum Testen seiner Anwendung erhält." lang: de --- -Ethereum-Netzwerke sind Gruppen von verbundenen Computern, die über das Ethereum-Protokoll kommunizieren. Es gibt nur ein Ethereum-Mainnet, aber zu Test- und Entwicklungszwecken können unabhängige Netzwerke eingerichtet werden, die denselben Protokollregeln entsprechen. Es gibt viele unabhängige "Netzwerke", die dem Protokoll folgen, ohne miteinander zu interagieren. Sie können sogar ein lokales Netzwerk auf Ihrem eigenen Computer starten, um Ihre Smart Contracts und Web3-Anwendungen zu testen. +[Ethereum](/) Netzwerke sind Gruppen von verbundenen Computern, die über das Ethereum-Protokoll kommunizieren. Es gibt nur ein Ethereum-Mainnet, aber unabhängige Netzwerke, die denselben Protokollregeln entsprechen, können zu Test- und Entwicklungszwecken erstellt werden. Es gibt viele unabhängige „Netzwerke“, die dem Protokoll entsprechen, ohne miteinander zu interagieren. Sie können sogar lokal auf Ihrem eigenen Computer eines starten, um Ihre Smart Contracts und Web3-Dapps zu testen. -Ihr Ethereum-Konto funktioniert in den verschiedenen Netzwerken, aber Ihr Kontostand und Ihr Transaktionsverlauf werden nicht vom Ethereum-Mainnet übernommen. Für Testzwecke ist es nützlich zu wissen, welche Netzwerke verfügbar sind und wie man Testnet-ETH erhält, um sich auszuprobieren. Generell ist es aus Sicherheitsgründen nicht empfehlenswert, Mainnet-Konten in Testnets wiederzuverwenden oder umgekehrt. +Ihr Ethereum-Konto funktioniert über die verschiedenen Netzwerke hinweg, aber Ihr Kontostand und Ihre Transaktionshistorie werden nicht aus dem Haupt-Ethereum-Netzwerk übernommen. Zu Testzwecken ist es nützlich zu wissen, welche Netzwerke verfügbar sind und wie man Testnet-ETH erhält, um damit herumzuspielen. Im Allgemeinen wird aus Sicherheitsgründen nicht empfohlen, Mainnet-Konten in Testnets wiederzuverwenden oder umgekehrt. ## Voraussetzungen {#prerequisites} -Sie sollten die [Grundlagen von Ethereum](/developers/docs/intro-to-ethereum/) verstehen, bevor Sie sich über die verschiedenen Netzwerke informieren, denn die Testnetzwerke bieten Ihnen eine billige, sichere Version von Ethereum, mit der Sie Dinge ausprobieren können. +Sie sollten die [Grundlagen von Ethereum](/developers/docs/intro-to-ethereum/) verstehen, bevor Sie sich über die verschiedenen Netzwerke informieren, da die Testnetzwerke Ihnen eine günstige, sichere Version von Ethereum zum Herumspielen bieten. ## Öffentliche Netzwerke {#public-networks} -Öffentliche Netzwerke sind für jedermann auf der Welt mit einer Internetverbindung zugänglich. Jeder kann Transaktionen in einer öffentlichen Blockchain lesen oder erstellen und die ausgeführten Transaktionen validieren. Der Konsens zwischen den Peers entscheidet über die Aufnahme von Transaktionen und den Zustand des Netzwerks. +Öffentliche Netzwerke sind für jeden auf der Welt mit einer Internetverbindung zugänglich. Jeder kann Transaktionen auf einer öffentlichen Blockchain lesen oder erstellen und die ausgeführten Transaktionen validieren. Der Konsens unter den Peers entscheidet über die Aufnahme von Transaktionen und den Zustand des Netzwerks. ### Ethereum Mainnet {#ethereum-mainnet} -Mainnet ist die primäre öffentliche Ethereum-Produktions-Blockchain, bei der Transaktionen mit tatsächlichem Wert im dezentralisierten Ledger stattfinden. +Das Mainnet ist die primäre öffentliche Ethereum-Produktions-Blockchain, auf der Transaktionen mit tatsächlichem Wert auf dem verteilten Ledger stattfinden. -Wenn Menschen und Börsen ETH-Preise diskutieren, sprechen sie über Mainnet ETH. +Wenn Leute und Börsen über ETH-Preise diskutieren, sprechen sie über Mainnet-ETH. -### Ethereum Testnetze {#ethereum-testnets} +### Ethereum-Testnets {#ethereum-testnets} -Neben dem Mainnet gibt es öffentliche Testnetze. Diese werden von Protokollentwicklern oder Smart-Contract-Entwicklern verwendet, um sowohl Protokoll-Upgrades als auch potenzielle Smart Contracts in einer produktionsähnlichen Umgebung zu testen, bevor sie auf das Mainnet deployed werden. Stellen Sie sich das als Analogie zu Produktions- und Staging-Servern vor. +Zusätzlich zum Mainnet gibt es öffentliche Testnets. Dies sind Netzwerke, die von Protokollentwicklern oder Smart-Contract-Entwicklern verwendet werden, um sowohl Protokoll-Upgrades als auch potenzielle Smart Contracts in einer produktionsähnlichen Umgebung zu testen, bevor sie im Mainnet bereitgestellt werden. Stellen Sie sich dies als Analogon zu Produktions- versus Staging-Servern vor. -Sie sollten jeden Contract-Code, den Sie schreiben, auf einem Testnet testen, bevor Sie ihn auf dem Mainnet deployen. Unter den dApps, die mit bestehenden Smart Contracts integriert sind, haben die meisten Projekte Kopien auf Testnetzen deployed. +Sie sollten jeden von Ihnen geschriebenen Vertrags-Code in einem Testnet testen, bevor Sie ihn im Mainnet bereitstellen. Bei Dapps, die in bestehende Smart Contracts integriert sind, haben die meisten Projekte Kopien in Testnets bereitgestellt. -Die meisten Testnetze begannen mit einem berechtigten Proof-of-Authority-Konsensmechanismus. Das bedeutet, dass eine kleine Anzahl von Nodes ausgewählt wird, um Transaktionen zu validieren und neue Blöcke zu erstellen – wobei sie ihre Identität in diesem Prozess einsetzen. Alternativ verfügen einige Testnetze über einen offenen Proof-of-Stake-Konsensmechanismus, bei dem jeder das Validieren testen kann, genau wie beim Ethereum Mainnet. +Die meisten Testnets begannen mit der Verwendung eines erlaubnispflichtigen Proof-of-Authority-Konsensmechanismus. Das bedeutet, dass eine kleine Anzahl von Blockchain-Knoten ausgewählt wird, um Transaktionen zu validieren und neue Blöcke zu erstellen – wobei sie dabei ihre Identität als Einsatz verwenden. Alternativ verfügen einige Testnets über einen offenen Proof-of-Stake-Konsensmechanismus, bei dem jeder das Ausführen eines Validators testen kann, genau wie im Ethereum-Mainnet. -ETH auf Testnetzen soll keinen realen Wert haben; es wurden jedoch Märkte für bestimmte Arten von Testnet-ETH geschaffen, die knapp oder schwer zu erhalten geworden sind. Da Sie ETH benötigen, um tatsächlich mit Ethereum zu interagieren (selbst auf Testnetzen), erhalten die meisten Menschen Testnet-ETH kostenlos von Faucets. Die meisten Faucets sind Webanwendungen, in die Sie eine Adresse eingeben können, an die Sie ETH senden möchten. +ETH in Testnets soll keinen echten Wert haben; es wurden jedoch Märkte für bestimmte Arten von Testnet-ETH geschaffen, die knapp oder schwer zu bekommen sind. Da Sie ETH benötigen, um tatsächlich mit Ethereum zu interagieren (auch in Testnets), erhalten die meisten Leute Testnet-ETH kostenlos von Faucets. Die meisten Faucets sind Web-Apps, in die Sie eine Adresse eingeben können, an die ETH gesendet werden soll. -#### Welches Testnet soll ich benutzen? +#### Welches Testnet sollte ich verwenden? -Die beiden öffentlichen Testnetze, die Client-Entwickler derzeit warten, sind Sepolia und Hoodi. Sepolia ist ein Netzwerk für Contract- und Anwendungsentwickler, um ihre Anwendungen zu testen. Das Hoodi-Netzwerk ermöglicht es Protokollentwicklern, Netzwerk-Upgrades zu testen, und Stakern, das Validieren zu testen. +Die beiden öffentlichen Testnets, die Anwendungsentwickler derzeit pflegen, sind Sepolia und Hoodi. Sepolia ist ein Netzwerk für Vertrags- und Anwendungsentwickler, um ihre Anwendungen zu testen. Das Hoodi-Netzwerk ermöglicht es Protokollentwicklern, Netzwerk-Upgrades zu testen, und lässt Staker das Ausführen von Validatoren testen. #### Sepolia {#sepolia} -**Sepolia ist das empfohlene Standard-Testnet für die Anwendungsentwicklung**. -Das Sepolia-Netzwerk verwendet einen berechtigten Validatorsatz. Es ist relativ neu, was bedeutet, dass sein Zustand und seine Historie beide recht klein sind. Das bedeutet, dass das Netzwerk schnell synchronisiert und dass das Betreiben eines Nodes weniger Speicherplatz erfordert. Dies ist nützlich für Benutzer, die schnell einen Node starten und direkt mit dem Netzwerk interagieren möchten. - -- Geschlossener Validatorsatz, kontrolliert von Client- und Testteams -- Neues Testnet, weniger Anwendungen deployed als bei anderen Testnetzen -- Schnelle Synchronisation und minimaler Speicherplatzbedarf für den Betrieb eines Nodes +**Sepolia ist das empfohlene Standard-Testnet für die Anwendungsentwicklung**. Das Sepolia-Netzwerk verwendet ein erlaubnispflichtiges Validator-Set, das von Anwendungs- und Testteams kontrolliert wird. ##### Ressourcen @@ -55,23 +50,24 @@ Das Sepolia-Netzwerk verwendet einen berechtigten Validatorsatz. Es ist relativ ##### Faucets -- [QuickNode Sepolia Faucet](https://faucet.quicknode.com/drip) +- [Alchemy Sepolia Faucet](https://www.alchemy.com/faucets/ethereum-sepolia) +- [Chain Platform Sepolia Faucet](https://faucet.chainplatform.co/faucets/ethereum-sepolia/) +- [Chainstack Sepolia Faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) +- [Ethereum Ecosystem Faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) +- [ethfaucet.com Sepolia Faucet](https://ethfaucet.com/networks/ethereum) +- [Google Cloud Web3 Sepolia Faucet](https://cloud.google.com/application/web3/faucet/ethereum/sepolia) - [Grabteeth](https://grabteeth.xyz/) -- [PoW faucet](https://sepolia-faucet.pk910.de/) -- [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) -- [Alchemy Sepolia faucet](https://sepoliafaucet.com/) -- [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-faucet) -- [Ethereum Ecosystem faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) - +- [Infura Sepolia Faucet](https://www.infura.io/faucet) +- [PoW Faucet](https://sepolia-faucet.pk910.de/) +- [QuickNode Sepolia Faucet](https://faucet.quicknode.com/ethereum/sepolia) #### Hoodi {#hoodi} -Hoodi ist ein Testnet zum Testen von Validierung und Staking. Das Hoodi-Netzwerk ist offen für Benutzer, die einen Testnet-Validator betreiben möchten. Staker, die Protokoll-Upgrades testen möchten, bevor sie auf dem Mainnet deployed werden, sollten daher Hoodi verwenden. +Hoodi ist ein Testnet zum Testen von Validierung und Staking. Das Hoodi-Netzwerk ist offen für Benutzer, die einen Testnet-Validator ausführen möchten. Staker, die Protokoll-Upgrades testen möchten, bevor sie im Mainnet bereitgestellt werden, sollten daher Hoodi verwenden. -- Offener Validatorsatz, Staker können Netzwerk-Upgrades testen -- Großer Zustand, nützlich für das Testen komplexer Smart-Contract-Interaktionen -- Längere Synchronisationszeit und mehr Speicherplatz für den Betrieb eines Nodes erforderlich +- Offenes Validator-Set, Staker können Netzwerk-Upgrades testen +- Großer Zustand, nützlich zum Testen komplexer Smart-Contract-Interaktionen +- Längere Synchronisationszeit und erfordert mehr Speicherplatz, um einen Blockchain-Knoten auszuführen ##### Ressourcen @@ -79,65 +75,142 @@ Hoodi ist ein Testnet zum Testen von Validierung und Staking. Das Hoodi-Netzwerk - [GitHub](https://github.com/eth-clients/hoodi) - [Explorer](https://explorer.hoodi.ethpandaops.io/) - [Checkpoint Sync](https://checkpoint-sync.hoodi.ethpandaops.io/) +- [Otterscan](https://hoodi.otterscan.io/) +- [Etherscan](https://hoodi.etherscan.io/) ##### Faucets +- [Chain Platform Hoodi Faucet](https://faucet.chainplatform.co/faucets/ethereum-hoodi/) - [Hoodi Faucet](https://hoodi.ethpandaops.io/) +- [PoW Faucet](https://hoodi-faucet.pk910.de/) + +#### Ephemery {#ephemery} + +Ephemery ist eine einzigartige Art von Testnet, das jeden Monat vollständig zurückgesetzt wird. Der Ausführungs- und Konsenszustand wird alle 28 Tage auf Genesis zurückgesetzt, was bedeutet, dass alles, was im Testnet passiert, flüchtig ist. Dies macht es ideal für kurzfristige Tests, schnelles Bootstrapping von Blockchain-Knoten und „Hello World“-Anwendungen, die keine Dauerhaftigkeit benötigen. + +- Immer frischer Zustand, kurzfristiges Testen von Validatoren und Apps +- Enthält nur einen grundlegenden Satz von Verträgen +- Offenes Validator-Set und einfacher Zugang zu großen Mengen an Geldern +- Geringste Anforderungen an Blockchain-Knoten und schnellste Synchronisation, durchschnittlich <5GB + +##### Ressourcen + +- [Website](https://ephemery.dev/) +- [GitHub](https://github.com/ephemery-testnet/ephemery-resources) +- [Community-Chat](https://matrix.to/#/#staker-testnet:matrix.org) +- [Blockscout](https://explorer.ephemery.dev/) +- [Otterscan](https://otter.bordel.wtf/) +- [Beacon-Explorer](https://beaconlight.ephemery.dev/) +- [Checkpoint Sync](https://checkpoint-sync.ephemery.ethpandaops.io) +- [Launchpad](https://launchpad.ephemery.dev/) -Um einen Validator auf dem Hoodi-Testnet zu starten, verwenden Sie [Hoodi launchpad](https://hoodi.launchpad.ethereum.org/en/). +#### Faucets -### Layer-2-Testnetze {#layer-2-testnets} +- [Bordel Faucet](https://faucet.bordel.wtf/) +- [Pk910 PoW Faucet](https://ephemery-faucet.pk910.de/) -[Layer 2 (L2)](/layer-2/) ist ein Sammelbegriff zur Beschreibung einer bestimmten Gruppe von Ethereum-Skalierungslösungen. Ein Layer 2 ist eine separate Blockchain, die Ethereum erweitert und die Sicherheitsgarantien von Ethereum erbt. Layer-2-Testnetze sind normalerweise eng mit öffentlichen Ethereum-Testnetzen verbunden. +#### Holesky (veraltet) {#holesky} + +Das Holesky-Testnet ist seit September 2025 veraltet. Staking-Betreiber und Infrastrukturanbieter sollten stattdessen Hoodi für Validator-Tests verwenden. + +- [Ankündigung der Abschaltung des Holesky-Testnets](https://blog.ethereum.org/2025/09/01/holesky-shutdown-announcement) - _EF Blog, 1. September 2025_ +- [Updates zu den Holesky- und Hoodi-Testnets](https://blog.ethereum.org/2025/03/18/hoodi-holesky) - _EF Blog, 18. März 2025_ + +### Ebene-2-Testnets {#layer-2-testnets} + +[Ebene 2 (L2)](/layer-2/) ist ein Sammelbegriff zur Beschreibung einer bestimmten Gruppe von Ethereum-Skalierungslösungen. Eine Ebene 2 ist eine separate Blockchain, die Ethereum erweitert und die Sicherheitsgarantien von Ethereum erbt. Ebene-2-Testnets sind in der Regel eng mit öffentlichen Ethereum-Testnets gekoppelt. #### Arbitrum Sepolia {#arbitrum-sepolia} Ein Testnet für [Arbitrum](https://arbitrum.io/). +##### Ressourcen + +- [Etherscan](https://sepolia.arbiscan.io/) +- [Blockscout](https://sepolia-explorer.arbitrum.io/) + ##### Faucets -- [Chainlink faucet](https://faucets.chain.link/arbitrum-sepolia) -- [Alchemy faucet](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [Alchemy Arbitrum Sepolia Faucet](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [Chainlink Arbitrum Sepolia faucet](https://faucets.chain.link/arbitrum-sepolia) +- [ethfaucet.com Arbitrum Sepolia Faucet](https://ethfaucet.com/networks/arbitrum) +- [QuickNode Arbitrum Sepolia Faucet](https://faucet.quicknode.com/arbitrum/sepolia) #### Optimistic Sepolia {#optimistic-sepolia} Ein Testnet für [Optimism](https://www.optimism.io/). +##### Ressourcen + +- [Etherscan](https://sepolia-optimistic.etherscan.io/) +- [Blockscout](https://optimism-sepolia.blockscout.com/) + ##### Faucets -- [Chainlink faucet](https://faucets.chain.link/optimism-sepolia) -- [Alchemy faucet](https://www.alchemy.com/faucets/optimism-sepolia) +- [Alchemy Faucet](https://www.alchemy.com/faucets/optimism-sepolia) +- [Chainlink Faucet](https://faucets.chain.link/optimism-sepolia) +- [ethfaucet.com Optimism Sepolia Faucet](https://ethfaucet.com/networks/optimism) +- [Testnet Faucet](https://docs.optimism.io/builders/tools/build/faucets) #### Starknet Sepolia {#starknet-sepolia} Ein Testnet für [Starknet](https://www.starknet.io). +##### Ressourcen + +- [Voyager Sepolia Scan](https://sepolia.voyager.online/) + ##### Faucets -- [Alchemy faucet](https://www.alchemy.com/faucets/starknet-sepolia) +- [Alchemy Faucet](https://www.alchemy.com/faucets/starknet-sepolia) +- [Blast Starknet Sepolia Faucet](https://blastapi.io/faucets/starknet-sepolia-eth) +- [Starknet Faucet](https://starknet-faucet.vercel.app/) ## Private Netzwerke {#private-networks} -Ein Ethereum-Netzwerk ist ein privates Netzwerk, wenn seine Knoten nicht mit einem öffentlichen Netzwerk verbunden sind (z. B. mit Mainnet oder einem Testnet). In diesem Zusammenhang bedeutet privat nur reserviert oder isoliert statt geschützt oder sicher. +Ein Ethereum-Netzwerk ist ein privates Netzwerk, wenn seine Blockchain-Knoten nicht mit einem öffentlichen Netzwerk (d. h. Mainnet oder einem Testnet) verbunden sind. In diesem Zusammenhang bedeutet privat nur reserviert oder isoliert, anstatt geschützt oder sicher. ### Entwicklungsnetzwerke {#development-networks} -Um eine Ethereum-Anwendung zu entwickeln, ist es ratsam, sie in einem privaten Netzwerk auszuführen, um zu sehen, wie sie funktioniert, bevor Sie sie in der Blockchain einsetzen. Ähnlich wie Sie auf Ihrem Computer einen lokalen Server für die Webentwicklung erstellen, können Sie eine lokale Blockchain-Instanz erstellen, um Ihre dApp zu testen. Das ermöglicht eine wesentlich schnellere Iteration als ein öffentliches Testnet. +Um eine Ethereum-Anwendung zu entwickeln, sollten Sie sie in einem privaten Netzwerk ausführen, um zu sehen, wie sie funktioniert, bevor Sie sie bereitstellen. Ähnlich wie Sie einen lokalen Server auf Ihrem Computer für die Webentwicklung erstellen, können Sie eine lokale Blockchain-Instanz erstellen, um Ihre Dapp zu testen. Dies ermöglicht eine viel schnellere Iteration als ein öffentliches Testnet. -Es gibt Projekte und Tools, die dabei hilfreich sind. Erfahren Sie mehr über [Entwicklungsnetzwerke](/developers/docs/development-networks/). +Es gibt Projekte und Tools, die speziell dafür entwickelt wurden, dabei zu helfen. Erfahren Sie mehr über [Entwicklungsnetzwerke](/developers/docs/development-networks/). ### Konsortium-Netzwerke {#consortium-networks} -Der Konsensprozess wird von einer vordefinierten Gruppe von Nodes gesteuert, die vertrauenswürdig sind. Beispielsweise ein privates Netzwerk bekannter akademischer Institutionen, die jeweils eine einzelne Node stellen, sowie Blöcke werden mithilfe einer Schwelle von Unterzeichnern innerhalb des Netzwerks validiert. +Der Konsensprozess wird von einer vordefinierten Gruppe von Blockchain-Knoten gesteuert, denen vertraut wird. Zum Beispiel ein privates Netzwerk bekannter akademischer Institutionen, die jeweils einen einzelnen Blockchain-Knoten verwalten, und Blöcke werden durch einen Schwellenwert von Unterzeichnern innerhalb des Netzwerks validiert. + +Wenn ein öffentliches Ethereum-Netzwerk wie das öffentliche Internet ist, ist ein Konsortium-Netzwerk wie ein privates Intranet. + +## Warum sind Ethereum-Testnets nach U-Bahn-Stationen benannt? {#why-naming} + +Viele Ethereum-Testnets sind nach realen U-Bahn- oder Bahnhöfen benannt. Diese Namensgebungstradition begann früh und spiegelt die globalen Städte wider, in denen Mitwirkende gelebt oder gearbeitet haben. Es ist symbolisch, einprägsam und praktisch. Genau wie Testnets vom Ethereum-Mainnet isoliert sind, verlaufen U-Bahn-Linien getrennt vom Oberflächenverkehr. + +### Häufig genutzte und veraltete Testnets {#common-and-legacy-testnets} + +- **Sepolia** - Ein an die U-Bahn angebundenes Viertel in Athen, Griechenland. Wird derzeit für Smart-Contract- und Dapp-Tests verwendet. +- **Hoodi** - Benannt nach der U-Bahn-Station Hoodi in Bengaluru, Indien. Wird für Validator- und Protokoll-Upgrade-Tests verwendet. +- **Goerli** _(veraltet)_ - Benannt nach dem Görlitzer Bahnhof in Berlin, Deutschland. +- **Rinkeby** _(veraltet)_ - Benannt nach einem Vorort von Stockholm mit einer U-Bahn-Station. +- **Ropsten** _(veraltet)_ - Bezieht sich auf ein Gebiet und einen ehemaligen Fähr-/U-Bahn-Terminal in Stockholm. +- **Kovan** _(veraltet)_ - Benannt nach einer MRT-Station in Singapur. +- **Morden** _(veraltet)_ - Benannt nach einer Station der London Underground. Ethereums erstes öffentliches Testnet. + +### Andere spezialisierte Testnets {#other-testnets} + +Einige Testnets wurden für kurzfristige oder Upgrade-spezifische Tests erstellt und haben nicht unbedingt ein U-Bahn-Thema: + +- **Holesky** _(veraltet)_ - Benannt nach dem Bahnhof Holešovice in Prag. Wurde für Validator-Tests verwendet; veraltet seit 2025. +- **Kiln**, **Zhejiang**, **Shandong**, **Prater**, **Pyrmont**, **Olympic** _(alle veraltet)_ und **Ephemery** - Speziell für Upgrade-Simulationen wie The Merge, Shanghai oder Validator-Experimente entwickelt. Einige Namen sind eher regional oder thematisch als U-Bahn-basiert. -Wenn ein öffentliches Ethereum-Netzwerk wie das öffentliche Internet ist, dann ist ein Konsortialnetzwerk wie ein privates Intranet. +Die Verwendung von U-Bahn-Stationsnamen hilft Entwicklern, Testnets schnell zu identifizieren und sich daran zu erinnern, ohne sich auf numerische Chain-IDs verlassen zu müssen. Es spiegelt auch die Kultur von Ethereum wider: praktisch, global und menschenzentriert. ## Verwandte Tools {#related-tools} -- [Chain-Liste](https://chainlist.org/) _Liste der EVM-Netzwerke, um Wallets und Anbieter mit der entsprechenden Chain-ID und Netzwerk-ID zu verbinden_ -- [EVM-basierte Chains](https://github.com/ethereum-lists/chains) _GitHub Repo der Chain-Metadaten, die die Chain-Liste_ unterstützen +- [Chainlist](https://chainlist.org/) _Liste von EVM-Netzwerken, um Wallets und Anbieter mit der entsprechenden Chain-ID und Netzwerk-ID zu verbinden_ +- [EVM-basierte Chains](https://github.com/ethereum-lists/chains) _GitHub-Repo mit Chain-Metadaten, das Chainlist antreibt_ -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Vorschlag: vorhersehbarer Ethereum-Testnet-Lebenszyklus](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) -- [Die Entwicklung der Ethereum-Testnets](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) +- [Vorschlag: Vorhersehbarer Lebenszyklus von Ethereum-Testnets](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) +- [Die Evolution der Ethereum-Testnets](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md index 336f79d73a6..61b4dac84e9 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -1,80 +1,81 @@ --- -title: Ethereum-Archivierungsknoten -description: Ein Überblick über Archivierungsknoten +title: Ethereum-Archivknoten +description: "Ein Überblick über Archivknoten" lang: de sidebarDepth: 2 --- -Ein Archivierungsknoten ist eine Instanz eines Ethereum-Clients, die für den Aufbau eines Archives aller vergangenen Zustände konfiguriert ist. Er ist ein hilfreiches Tool für bestimmte Anwendungsfälle, jedoch könnte der schwieriger zu betreiben sein als ein vollständiger Knoten. +Ein Archivknoten (Archive Node) ist eine Instanz einer [Ethereum](/)-Anwendung (Client), die so konfiguriert ist, dass sie ein Archiv aller historischen Zustände erstellt. Er ist ein nützliches Werkzeug für bestimmte Anwendungsfälle, kann aber schwieriger zu betreiben sein als ein vollständiger Blockchain-Knoten (Full Node). ## Voraussetzungen {#prerequisites} -Sie sollten das Konzept eines [Ethereum-Knotens](/developers/docs/nodes-and-clients/), [seines Aufbaus](/developers/docs/nodes-and-clients/node-architecture/), [seiner Synchronisierungsstrategien](/developers/docs/nodes-and-clients/#sync-modes) und wie man ihn [betreibt](/developers/docs/apis/json-rpc/) und [nutzt](/developers/docs/nodes-and-clients/run-a-node/), verstehen. +Sie sollten das Konzept eines [Ethereum-Blockchain-Knotens](/developers/docs/nodes-and-clients/), [seiner Architektur](/developers/docs/nodes-and-clients/node-architecture/), [Synchronisierungsstrategien](/developers/docs/nodes-and-clients/#sync-modes) sowie die Praktiken für [deren Betrieb](/developers/docs/nodes-and-clients/run-a-node/) und [Nutzung](/developers/docs/apis/json-rpc/) verstehen. -## Was ist ein Archivierungsknoten +## Was ist ein Archivknoten? -Um die Bedeutung eines Archivierungsknotens zu verstehen, sollten wir zunächst das Konzept des Zustand klären. Ethereum kann als _Transaktionsbasierte Zustandsmaschine_ bezeichnet werden. Er besteht aus Konten und Anwendungen, die Transaktion ausführen, die ihren Zustand ändern. Die globalen Daten mit Informationen über jeden Account und Vertrag, wird in einer Trie-Datenbank gespeichert, die sich Zustand nennt. Dies wird verwaltet durch den Client der Ausführungsebene und beinhaltet: +Um die Bedeutung eines Archivknotens zu verstehen, lassen Sie uns das Konzept des „Zustands“ (State) klären. Ethereum kann als _transaktionsbasierte Zustandsmaschine_ bezeichnet werden. Es besteht aus Konten und Anwendungen, die Transaktionen ausführen, welche ihren Zustand ändern. Die globalen Daten mit Informationen über jedes Konto und jeden Vertrag werden in einer Trie-Datenbank gespeichert, die als Zustand bezeichnet wird. Dies wird vom Ausführungs-Client der Ausführungsebene (EL) gehandhabt und umfasst: -- Guthaben und Nonce eines Kontos -- Vertragscode und Speicher +- Kontostände und Nonces +- Vertragscode und -speicher - Konsensbezogene Daten, z. B. Staking-Einzahlungsvertrag -Um mit dem Netzwerk interagieren sowie neue Blöcke produzieren und verifizieren zu können, müssen Ethereum-Clients mit den neuesten Änderungen (der Spitze der Blockchain) und daher mit dem aktuellen Zustand Schritt halten. Ein auf der Ausführungsebene bestehender Client, der als vollständiger Knoten konfiguriert ist, verifiziert und folgt dem neuesten Zustand des Netzwerks, speichert jedoch nur einige der letzten Zustände, z. B. den Zustand, der mit den letzten 128 Blöcken verbunden wird. Dadurch kann er mit Umlagerungen der Blockchain umgehen und schnellen Zugriff auf die letzten Daten bereitstellen. Den letzten Zustand brauchen alle Clients, um eingehende Transaktionen verifizieren und das Netzwerk nutzen zu können. +Um mit dem Netzwerk zu interagieren, neue Blöcke zu verifizieren und zu produzieren, müssen Ethereum-Anwendungen mit den neuesten Änderungen (der Spitze der Chain) und somit dem aktuellen Zustand Schritt halten. Ein Ausführungs-Client, der als vollständiger Blockchain-Knoten konfiguriert ist, verifiziert und verfolgt den neuesten Zustand des Netzwerks, speichert jedoch nur die letzten paar Zustände zwischen, z. B. den Zustand, der mit den letzten 128 Blöcken verbunden ist, damit er Chain-Reorganisationen bewältigen und schnellen Zugriff auf aktuelle Daten bieten kann. Der aktuelle Zustand ist das, was alle Anwendungen benötigen, um eingehende Transaktionen zu verifizieren und das Netzwerk zu nutzen. -Man kann sich diesen Zustand als vorübergehenden Schnappschuss des Netzwerks an einem bestimmten Block und das Archiv als eine Wiederholung vom Verlauf des Netzwerks vorstellen. +Sie können sich den Zustand als eine momentane Momentaufnahme des Netzwerks bei einem bestimmten Block und das Archiv als eine Wiederholung der Historie vorstellen. -Vergangene Zustände können sicher entfernt werden, da sie nicht für das Betreiben des Netzwerks erforderlich sind und es für die Clients unnötig wäre, veraltete Daten zu behalten. Zustände, die vor irgendeinem „letzten“ Block (z. B. 128 Blocks vor der Spitze) existiert haben, werden praktisch weggeworfen. Vollständige Knoten behalten nur vergangene Daten der Blockchain (Blöcke und Transaktionen) und gelegentliche vergangene Schnappschüsse, die sie nutzen können, um ältere Zustände bei Bedarf wiederherzustellen. Dies erfolgt, indem sie die letzten Transaktionen im EVM erneut ausführen, was rechnerisch angefordert werden kann, wenn der erwünschte Zustand weit vom nächsten Schnappschuss entfernt ist. +Historische Zustände können sicher bereinigt (pruned) werden, da sie für den Betrieb des Netzwerks nicht erforderlich sind und es für die Anwendung nutzlos redundant wäre, alle veralteten Daten aufzubewahren. Zustände, die vor einem bestimmten kürzlichen Block existierten (z. B. 128 Blöcke vor dem Head), werden effektiv verworfen. Vollständige Blockchain-Knoten behalten nur historische Blockchain-Daten (Blöcke und Transaktionen) und gelegentliche historische Momentaufnahmen, die sie verwenden können, um ältere Zustände auf Anfrage neu zu generieren. Sie tun dies, indem sie vergangene Transaktionen in der Ethereum Virtual Machine (EVM) erneut ausführen, was rechenintensiv sein kann, wenn der gewünschte Zustand weit von der nächsten Momentaufnahme entfernt ist. -Dies bedeutet jedoch, dass der Zugang zu einem vergangenen Zustand eines vollständigen Knotens viel Rechenleistung erfordert. Der Klient muss möglicherweise alle vergangenen Transaktionen ausführen, um einen historischen Zustand seit Anfang zu berechnen. Archivierungsknoten lösen dies, indem sie nicht nur die letzten, sondern jeden einzelnen Zustand nach dem Erzeugen eines Blocks speichern. Es findet quasi einen Kompromiss, wobei mehr Speicherplatz erforderlich ist. +Dies bedeutet jedoch, dass der Zugriff auf einen historischen Zustand auf einem vollständigen Blockchain-Knoten viel Rechenleistung verbraucht. Die Anwendung muss möglicherweise alle vergangenen Transaktionen ausführen und einen historischen Zustand ab der Genesis berechnen. Archivknoten lösen dies, indem sie nicht nur die neuesten Zustände speichern, sondern jeden historischen Zustand, der nach jedem Block erstellt wurde. Im Grunde genommen wird ein Kompromiss mit einem größeren Speicherplatzbedarf eingegangen. -Es ist wichtig zu beachten, dass das Netzwerk nicht von Archivierungsknoten abhängt, um vergangene Daten zu speichern und bereitzustellen. Wie oben erwähnt, können alle vergangenen Zustände auf einem vollständigen Knoten abgeleitet werden. Transaktionen werden auf jedem vollständigen Knoten (zur Zeit kleiner als 400 G) gespeichert und können so das gesamte Archiv wiedergeben. +Es ist wichtig zu beachten, dass das Netzwerk nicht von Archivknoten abhängig ist, um alle historischen Daten aufzubewahren und bereitzustellen. Wie oben erwähnt, können alle historischen Zwischenzustände auf einem vollständigen Blockchain-Knoten abgeleitet werden. Transaktionen werden von jedem vollständigen Blockchain-Knoten gespeichert (derzeit weniger als 400 GB) und können wiederholt werden, um das gesamte Archiv aufzubauen. ### Anwendungsfälle -Die normale Nutzung von Ethereum, wie das Senden von Transaktionen, das Bereitstellen von Verträgen, dem Verifizieren vom Konsens usw. erfordert keinen Zugang zu vergangenen Zuständen. Nutzer sollten nie einen Archivierungsknoten benötigen, um mit dem Netzwerk normal interagieren zu können. +Die reguläre Nutzung von Ethereum wie das Senden von Transaktionen, das Bereitstellen von Verträgen, das Verifizieren des Konsenses usw. erfordert keinen Zugriff auf historische Zustände. Benutzer benötigen für eine Standardinteraktion mit dem Netzwerk niemals einen Archivknoten. -Der größte Vorteil eines Zustandsarchivs ist der schnelle Zugang zu Abfragen über vergangene Zustände. Ein Archivierungsknoten würde zum Beispiel direkt Ergebnisse auf Abfragen wie die Folgenden liefern: +Der Hauptvorteil des Zustandsarchivs ist ein schneller Zugriff auf Abfragen zu historischen Zuständen. Zum Beispiel würde ein Archivknoten umgehend Ergebnisse liefern wie: -- _Was war der ETH-Kontostand von Account 0x1337... an Block 15537393?_ -- _Was war der Kontostand vom Token 0x in Vertrag 0x an Block 1920000?_ +- _Wie hoch war das ETH-Guthaben des Kontos 0x1337... bei Block 15537393?_ +- _Wie hoch ist das Guthaben von Token 0x im Vertrag 0x bei Block 1920000?_ -Wie oben erklärt, müsste ein vollständiger Node diese Daten über die Ausführung von EVM generieren, was die CPU belastet und viel Zeit benötigt. Archivierungsknoten greifen darauf direkt über den Speicher zu und können direkt Antworten liefern. Diese Eigenschaft ist für bestimmte Teile der Infrastruktur nützlich, wie zum Beispiel: +Wie oben erklärt, müsste ein vollständiger Blockchain-Knoten diese Daten durch EVM-Ausführung generieren, was die CPU beansprucht und Zeit in Anspruch nimmt. Archivknoten greifen auf der Festplatte darauf zu und liefern Antworten sofort. Dies ist eine nützliche Funktion für bestimmte Teile der Infrastruktur, zum Beispiel: -- Serviceanbieter wie Block-Explorer +- Dienstanbieter wie Blocksuchmaschinen - Forscher - Sicherheitsanalysten - Dapp-Entwickler -- Prüfung und Einhaltung von Regeln +- Wirtschaftsprüfung und Compliance -Es gibt einige kostenlose [Anbieter](/developers/docs/nodes-and-clients/nodes-as-a-service/), die auch Zugang zu vergangenen Daten liefern. Da es anspruchsvoller ist, einen Archivierungsknoten zu betreiben, ist dieser Zugang oft limitiert und funktioniert nur für gelegentlichen Zugriff. Wenn Ihr Projekt durchgängigen Zugriff auf vergangene Daten benötigt, sollten Sie sich überlegen, selber einen Archivierungsknoten zu betreiben. +Es gibt verschiedene kostenlose [Dienste](/developers/docs/nodes-and-clients/nodes-as-a-service/), die ebenfalls Zugriff auf historische Daten ermöglichen. Da der Betrieb eines Archivknotens anspruchsvoller ist, ist dieser Zugriff meist begrenzt und funktioniert nur für gelegentlichen Zugriff. Wenn Ihr Projekt ständigen Zugriff auf historische Daten erfordert, sollten Sie in Betracht ziehen, selbst einen zu betreiben. -## Implementierung und Nutzung +## Implementierungen und Nutzung -Archivierungsknoten bedeutet in diesem Kontext, dass dem Nutzer, dem Clients der Ausführungsebene gegenüberstehen, Daten zur Verfügung gestellt werden, während sie die Zustands-Datenbank verwalten und JSON-RPC Endpunkte bereitstellen. Konfigurationsoptionen, Synchronisierungszeit und die Größe der Datenbank können je nach Client variieren. Weitere Details finden Sie in der Client-Dokumentation. +Archivknoten in diesem Kontext bedeutet Daten, die von benutzerorientierten Ausführungs-Clients bereitgestellt werden, da diese die Zustandsdatenbank verwalten und JSON-RPC-Endpunkte bereitstellen. Konfigurationsoptionen, Synchronisierungszeit und Datenbankgröße können je nach Anwendung variieren. Weitere Details finden Sie in der Dokumentation Ihrer Anwendung. -Bevor Sie ihren eigenen Archivierungsknoten starten, sollten Sie die Unterschiede zwischen den Clients und vor allem den verschiedenen [Hardwareanforderungen](/developers/docs/nodes-and-clients/run-a-node/#requirements) kennen. Die meisten Clients sind nicht für diese Funktion optimiert und ihre Archive benötigen über 12 TB Speicherplatz. Zum Vergleich: Implementierungen wie Erigon können dieselben Daten in weniger als 3 TB speichern, was sie zur effektivsten Art zum Betreiben eines Archivierungsknotens macht. +Bevor Sie Ihren eigenen Archivknoten starten, informieren Sie sich über die Unterschiede zwischen den Anwendungen und insbesondere über die verschiedenen [Hardwareanforderungen](/developers/docs/nodes-and-clients/run-a-node/#requirements). Die meisten Anwendungen sind nicht für diese Funktion optimiert und ihre Archive benötigen mehr als 12 TB Speicherplatz. Im Gegensatz dazu können Implementierungen wie Erigon dieselben Daten in unter 3 TB speichern, was sie zur effektivsten Möglichkeit macht, einen Archivknoten zu betreiben. -## Empfohlene Verfahren +## Empfohlene Praktiken -Abgesehen von den generellen [Empfehlungen zum Betreiben einer Node](/developers/docs/nodes-and-clients/run-a-node/) kann eine Archivierungs-Node höhere Anforderungen an Hardware und Wartung stellen. In Anbetracht von Erigons [Schlüsselfunktionen](https://github.com/ledgerwatch/erigon#key-features) ist der praktischste Ansatz, die [Erigon](/developers/docs/nodes-and-clients/#erigon)-Client-Implementation zu verwenden. +Abgesehen von allgemeinen [Empfehlungen für den Betrieb eines Blockchain-Knotens](/developers/docs/nodes-and-clients/run-a-node/) kann ein Archivknoten anspruchsvoller in Bezug auf Hardware und Wartung sein. In Anbetracht der [Hauptmerkmale](https://github.com/ledgerwatch/erigon#key-features) von Erigon ist der praktischste Ansatz die Verwendung der [Erigon](/developers/docs/nodes-and-clients/#erigon)-Anwendungsimplementierung. ### Hardware -Versichern Sie sich immer, dass ihre Hardware alle Voraussetzungen für einen gegebenen Modus in der Dokumentation des Clients erfüllt. Die größte Voraussetzung für Archivierungsknoten ist dabei der Speicherplatz. Je nach Client variiert dieser von 3 TB bis 12 TB. Obwohl HDD als eine bessere Lösung für große Datenmengen gesehen werden kann, wird eine SSD für das kontinuierliche Synchronisieren und Aktualisieren der Blockchain-Spitze benötigt. [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html)-Datenträger sind ausreichend, jedoch sollten sie von zuverlässiger Qualität, also mindestens [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences) sein. Festplatten können in einen Desktop Computer oder einen Server mit genügend Slots eingebaut werden. Diese speziellen Geräte sind ideal, um Knoten mit hoher Verfügbarkeit zu betreiben. Es ist durchaus möglich, Archivierungsknoten auf einem Laptop zu betreiben. Die Portabilität erfordert jedoch zusätzliche Kosten. +Stellen Sie immer sicher, dass Sie die Hardwareanforderungen für einen bestimmten Modus in der Dokumentation einer Anwendung überprüfen. +Die größte Anforderung für Archivknoten ist der Speicherplatz. Je nach Anwendung variiert dieser von 3 TB bis 12 TB. Auch wenn eine HDD als bessere Lösung für große Datenmengen angesehen werden könnte, erfordert die Synchronisierung und ständige Aktualisierung der Spitze der Chain SSD-Laufwerke. [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html)-Laufwerke sind gut genug, sollten aber von zuverlässiger Qualität sein, mindestens [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences). Festplatten können in einen Desktop-Computer oder einen Server mit genügend Steckplätzen eingebaut werden. Solche dedizierten Geräte sind ideal für den Betrieb eines Blockchain-Knotens mit hoher Verfügbarkeit. Es ist durchaus möglich, ihn auf einem Laptop auszuführen, aber die Portabilität ist mit zusätzlichen Kosten verbunden. -Alle Daten müssen in einen einzigen Speicherort passen, deshalb müssen Festplatten beispielsweise mit [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) oder LVM zusammengelegt werden. Es könnte sich auch lohnen, [ZFS](https://en.wikipedia.org/wiki/ZFS) zu nutzen, da es „Kopieren beim Schreiben“ (Copy-on-write) unterstützt. Dadurch wird sicherstellt, dass Daten korrekt auf die Festplatten geschrieben werden, ohne dass geringfügige Fehler entstehen. +Alle Daten müssen auf ein Volume passen, daher müssen Festplatten zusammengefügt werden, z. B. mit [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) oder LVM. Es könnte sich auch lohnen, die Verwendung von [ZFS](https://en.wikipedia.org/wiki/ZFS) in Betracht zu ziehen, da es „Copy-on-Write“ unterstützt, was sicherstellt, dass Daten ohne Low-Level-Fehler korrekt auf die Festplatte geschrieben werden. -Für mehr Stabilität und Sicherheit bei der Prävention gegen die Beschädigung der Datenbanken, besonders in einer professionellen Einrichtung, sollten sie sich überlegen [ECC Speicher](https://en.wikipedia.org/wiki/ECC_memory) zu verwenden, sollte Ihr System dies unterstützen. Die Größe des RAM sollte genauso groß wie für einen vollständigen Knoten sein. Mehr RAM kann jedoch dazu beitragen, die Synchronisierung zu beschleunigen. +Für mehr Stabilität und Sicherheit bei der Vermeidung versehentlicher Datenbankbeschädigungen, insbesondere in einem professionellen Setup, sollten Sie die Verwendung von [ECC-Speicher](https://en.wikipedia.org/wiki/ECC_memory) in Betracht ziehen, falls Ihr System dies unterstützt. Die Größe des RAMs wird im Allgemeinen genauso empfohlen wie für einen vollständigen Blockchain-Knoten, aber mehr RAM kann helfen, die Synchronisierung zu beschleunigen. -Während der ersten Synchronisierung führen Clients im Archivierungsmodus jede Transaktion seit der Genesis aus. Die Ausführungsgeschwindigkeit ist vor allem limitiert durch die CPU, daher kann eine schnellere CPU dazu beitragen, die erste Synchronisierung zu beschleunigen. Bei einem durchschnittlichen Computer kann die erste Synchronisierung bis zu einem Monat dauern. +Während der anfänglichen Synchronisierung führen Anwendungen im Archivmodus jede Transaktion seit der Genesis aus. Die Ausführungsgeschwindigkeit wird hauptsächlich durch die CPU begrenzt, sodass eine schnellere CPU bei der anfänglichen Synchronisierungszeit helfen kann. Auf einem durchschnittlichen Verbrauchercomputer kann die anfängliche Synchronisierung bis zu einem Monat dauern. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ethereum vollständiger Knoten vs Archivierungsknoten](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) - _QuickNode, September 2022_ -- [Building Your Own Ethereum Archive Node](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush, August 2021_ -- [How to set up Erigon, Erigon’s RPC and TrueBlocks (scrape and API) as services](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, aktualisiert September 2022_ +- [Ethereum Full Node vs Archive Node](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) – _QuickNode, September 2022_ +- [Building Your Own Ethereum Archive Node](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) – _Thomas Jay Rush, August 2021_ +- [How to set up Erigon, Erigon’s RPC and TrueBlocks (scrape and API) as services](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, aktualisiert im September 2022_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) -- [Einen Knoten betreiben](/developers/docs/nodes-and-clients/run-a-node/) +- [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) +- [Einen Blockchain-Knoten betreiben](/developers/docs/nodes-and-clients/run-a-node/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md index 38c121bb83e..1829ad50779 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md @@ -1,31 +1,31 @@ --- -title: Einführung zu Ethereum Bootnodes -description: Grundlegend benötigte Informationen zum Verständnis von Bootnodes +title: "Einführung in Ethereum-Bootnodes" +description: "Die grundlegenden Informationen, die Sie benötigen, um Bootnodes zu verstehen" lang: de --- -Wenn ein neuer Knoten dem Ethereum-Netzwerk beitritt, muss er sich mit anderen Knoten, sich sich bereits im Netzwerk befinden, verbinden, damit er neue Peers finden kann. Diese Eintrittspunkte in das Ethereum-Netzwerk werden Bootnodes genannt. Clients haben häufig eine Liste von Bootnodes fest einkodiert. Diese Bootnodes werden normalerweise vom Ethereum Foundation Entwicklerteam oder den Client-Teams betrieben. Beachten Sie dabei, dass Bootnodes nicht dasselbe wie statische Knoten sind. Statische Knoten werden immer wieder aufgerufen, während Bootnodes nur aufgerufen werden, wenn es genug Peers zum Verbinden gibt. Der Knoten muss zudem neue komplexere Verbindungen aufbauen. +Wenn ein neuer Blockchain-Knoten dem Ethereum-Netzwerk beitritt, muss er sich mit Blockchain-Knoten verbinden, die sich bereits im Netzwerk befinden, um dann neue Peers zu entdecken. Diese Einstiegspunkte in das Ethereum-Netzwerk werden Bootnodes genannt. Anwendungen haben normalerweise eine Liste von Bootnodes fest einkodiert. Diese Bootnodes werden typischerweise vom DevOps-Team der Ethereum Foundation oder den Anwendungs-Teams selbst betrieben. Beachten Sie, dass Bootnodes nicht dasselbe sind wie statische Blockchain-Knoten. Statische Blockchain-Knoten werden immer wieder aufgerufen, während Bootnodes nur dann aufgerufen werden, wenn es nicht genügend Peers gibt, mit denen man sich verbinden kann, und ein Blockchain-Knoten einige neue Verbindungen aufbauen muss. -## Verbinden mit einem Bootnode {#connect-to-a-bootnode} +## Mit einem Bootnode verbinden {#connect-to-a-bootnode} -Die meisten Clients verfügen über eine integrierte Liste von Bootnodes. Aber möglicherweise möchten Sie auch Ihren eigenen Bootnode betreiben, oder einen nutzen, der nicht Teil der fest einkodierten Liste des Clients ist. In diesem Fall können Sie sie spezifizieren, wenn Sie ihren Client wie folgt starten (Beispiel gilt für Geth, bitte überprüfen Sie die Dokumentation Ihres Clients): +Die meisten Anwendungen haben eine Liste von Bootnodes integriert, aber vielleicht möchten Sie auch Ihren eigenen Bootnode betreiben oder einen verwenden, der nicht Teil der fest einkodierten Liste der Anwendung ist. In diesem Fall können Sie diese beim Starten Ihrer Anwendung wie folgt angeben (das Beispiel gilt für Geth, bitte überprüfen Sie die Dokumentation Ihrer Anwendung): ``` geth --bootnodes "enode://@:" ``` -## Betrieb eines Bootnodes {#run-a-bootnode} +## Einen Bootnode betreiben {#run-a-bootnode} -Bootnodes sind vollständige Knoten, die nicht hinter einem NAT ([Network Address Translation](https://www.geeksforgeeks.org/network-address-translation-nat/)) stehen. Jeder vollständige Knoten kann als Bootnode wirken, solange er öffentlich zugänglich ist. +Bootnodes sind vollständige Blockchain-Knoten, die sich nicht hinter einem NAT ([Network Address Translation](https://www.geeksforgeeks.org/network-address-translation-nat/)) befinden. Jeder vollständige Blockchain-Knoten kann als Bootnode fungieren, solange er öffentlich erreichbar ist. -Wenn Sie einen Knoten starten, sollte er sich in Ihren ["Enode"](/developers/docs/networking-layer/network-addresses/#enode) einloggen. Dieser ist ein öffentlicher Identifikator, den andere nutzen können, um sich mit Ihrem Knoten zu verbinden. +Wenn Sie einen Blockchain-Knoten starten, sollte dieser Ihre [enode](/developers/docs/networking-layer/network-addresses/#enode) protokollieren. Dies ist eine öffentliche Kennung, die andere verwenden können, um sich mit Ihrem Blockchain-Knoten zu verbinden. -Der Enode wird normalerweise bei jedem Neustart neu generiert, schauen Sie sich daher die Dokumentation Ihres Clients an. Dort erfahren Sie, wie man einen beständigen Enode für Ihren Bootnode erzeugt. +Die enode wird normalerweise bei jedem Neustart neu generiert. Schauen Sie daher in der Dokumentation Ihrer Anwendung nach, wie Sie eine dauerhafte enode für Ihren Bootnode generieren können. -Ein guter Bootnode benötigt möglichst viele Peers, die an ihm andocken können, daher wird empfohlen, die maximale Anzahl davon zu erhöhen. Einen Bootnode mit vielen Peers auszuführen, kann die benötigte Bandbreite signifikant vergrößern. +Um ein guter Bootnode zu sein, ist es ratsam, die maximale Anzahl von Peers zu erhöhen, die sich mit ihm verbinden können. Der Betrieb eines Bootnodes mit vielen Peers wird den Bandbreitenbedarf erheblich erhöhen. ## Verfügbare Bootnodes {#available-bootnodes} -Eine Liste bereits verfügbarer Bootnodes in go-Ethereum finden Sie [hier](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Diese Bootnodes werden von der Ethereum Foundation und dem go-Ethereum Team gewartet. +Eine Liste der in go-ethereum integrierten Bootnodes finden Sie [hier](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Diese Bootnodes werden von der Ethereum Foundation und dem go-ethereum-Team gepflegt. -Es gibt weitere Listen von Bootnodes, die von Freiwilligen gepflegt werden. Stellen Sie sicher, dass Sie immer mindestens einen offiziellen Bootnode verwenden, da Sie sonst Opfer eines Eclipse-Angriffs werden könnten. +Es gibt noch weitere Listen von Bootnodes, die von Freiwilligen gepflegt werden. Bitte stellen Sie sicher, dass Sie immer mindestens einen offiziellen Bootnode einbeziehen, da Sie sonst Opfer eines Eclipse-Angriffs werden könnten. \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md index cf5d5d8d646..74dc5834b8c 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md @@ -1,43 +1,43 @@ --- -title: "Client-Diversität" -description: "Eine ausführliche Erklärung über die Bedeutung der Client-Vielfalt für Ethereum." +title: Client-Vielfalt +description: "Eine allgemeine Erklärung der Bedeutung der Ethereum-Client-Vielfalt." lang: de sidebarDepth: 2 --- -Das Verhalten eines Ethereum-Knotens wird durch die von ihm ausgeführte Client-Software gesteuert. Es gibt mehrere Ethereum-Clients auf Produktionsebene, die jeweils von verschiedenen Teams in verschiedenen Sprachen entwickelt und gepflegt werden. Die Clients werden nach einer gemeinsamen Spezifikation aufgebaut, die sicherstellt, dass die Clients nahtlos miteinander kommunizieren und die gleiche Funktionalität haben sowie ein gleichwertiges Nutzererlebnis bieten. Im Moment jedoch ist die Verteilung von Clients auf Knotenpunkte nicht gleich genug, um diese Netzwerkbefestigung auf sein volles Potenzial zu realisieren. Idealerweise teilen sich Nutzer ungefähr gleich über die verschiedenen Clients hinweg und bringen so viel Client-Vielfalt wie möglich ins Netzwerk. +Das Verhalten eines [Ethereum](/)-Blockchain-Knotens wird durch die darauf ausgeführte Anwendungssoftware (Client-Software) gesteuert. Es gibt mehrere produktionsreife Ethereum-Anwendungen, die jeweils in verschiedenen Sprachen von separaten Teams entwickelt und gepflegt werden. Die Anwendungen werden nach einer gemeinsamen Spezifikation erstellt, die sicherstellt, dass die Anwendungen nahtlos miteinander kommunizieren, dieselbe Funktionalität aufweisen und eine gleichwertige Benutzererfahrung bieten. Derzeit ist die Verteilung der Anwendungen auf die Blockchain-Knoten jedoch nicht gleichmäßig genug, um diese Netzwerkstärkung in vollem Umfang zu realisieren. Im Idealfall teilen sich die Benutzer ungefähr gleichmäßig auf die verschiedenen Anwendungen auf, um dem Netzwerk eine größtmögliche Client-Vielfalt zu verleihen. ## Voraussetzungen {#prerequisites} -Wenn Sie noch nicht verstehen, was Nodes und Clients sind, lesen Sie den Artikel über [Nodes und Clients](/developers/docs/nodes-and-clients/). Die [Ausführungs-](/glossary/#execution-layer) und [Konsens-](/glossary/#consensus-layer)Ebenen sind im Glossar definiert. +Wenn Sie noch nicht wissen, was Blockchain-Knoten und Anwendungen sind, lesen Sie [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/). Die [Ausführungsebene](/glossary/#execution-layer) und die [Konsensebene](/glossary/#consensus-layer) werden im Glossar definiert. -## Warum gibt es mehrere Clients? {#why-multiple-clients} +## Warum gibt es mehrere Anwendungen? {#why-multiple-clients} -Es gibt mehrere, unabhängig voneinander entwickelte und gewartete Clients, weil die Client-Vielfalt das Netzwerk widerstandsfähiger gegen Angriffe und Fehler macht. Mehrere Clients sind die einzigartige Stärke von Ethereum – andere Blockchains verlassen sich auf die Unfehlbarkeit eines einzigen Clients. Es reicht jedoch nicht aus, einfach mehrere Clients zur Verfügung zu haben. Sie müssen von der Community angenommen werden und die Anzahl der aktiven Nodes muss relativ gleichmäßig auf sie verteilt sein. +Es gibt mehrere, unabhängig voneinander entwickelte und gepflegte Anwendungen, da die Client-Vielfalt das Netzwerk widerstandsfähiger gegen Angriffe und Fehler macht. Mehrere Anwendungen sind eine Stärke, die einzigartig für Ethereum ist – andere Blockchains verlassen sich auf die Unfehlbarkeit einer einzigen Anwendung. Es reicht jedoch nicht aus, einfach nur mehrere Anwendungen zur Verfügung zu haben; sie müssen von der Community angenommen werden und die gesamten aktiven Blockchain-Knoten müssen relativ gleichmäßig auf sie verteilt sein. -## Warum ist die Client-Vielfalt wichtig? {#client-diversity-importance} +## Warum ist Client-Vielfalt wichtig? {#client-diversity-importance} -Viele unabhängig voneinander entwickelte und gewartete Clients sind für die Sicherheit eines dezentralen Netzwerks unerlässlich. Lassen Sie uns die Gründe dafür untersuchen. +Viele unabhängig entwickelte und gepflegte Anwendungen zu haben, ist für die Gesundheit eines dezentralisierten Netzwerks von entscheidender Bedeutung. Lassen Sie uns die Gründe dafür untersuchen. -### Bugs {#bugs} +### Fehler {#bugs} -Ein Fehler in einem einzelnen Client stellt ein geringeres Risiko für das Netzwerk dar, wenn er nur eine Minderheit der Ethereum-Knoten repräsentiert. Bei einer annähernd gleichmäßigen Verteilung der Knoten auf viele Clients ist die Wahrscheinlichkeit, dass die meisten Clients von einem gemeinsamen Problem betroffen sind, gering. Das Netzwerk ist daher robuster. +Ein Fehler in einer einzelnen Anwendung stellt ein geringeres Risiko für das Netzwerk dar, wenn sie eine Minderheit der Ethereum-Blockchain-Knoten repräsentiert. Bei einer annähernd gleichmäßigen Verteilung der Blockchain-Knoten auf viele Anwendungen ist die Wahrscheinlichkeit gering, dass die meisten Anwendungen von einem gemeinsamen Problem betroffen sind, und infolgedessen ist das Netzwerk robuster. ### Widerstandsfähigkeit gegen Angriffe {#resilience} -Die Client-Vielfalt bietet auch eine gewisse Widerstandsfähigkeit gegen Angriffe. Ein Angriff beispielsweise, der [einen bestimmten Client dazu verleitet](https://twitter.com/vdWijden/status/1437712249926393858), auf einen bestimmten Zweig der Chain zu wechseln, wird wahrscheinlich nicht erfolgreich sein, da andere Clients wahrscheinlich nicht auf dieselbe Weise ausnutzbar sind und die kanonische Chain unbeschädigt bleibt. Eine geringe Client-Vielfalt erhöht das Risiko, das mit einem Hack auf den dominanten Client verbunden ist. Die Client-Vielfalt hat sich bereits als wichtiger Schutz gegen böswillige Angriffe auf das Netzwerk erwiesen. So war beispielsweise der Denial-of-Service-Angriff von Shanghai im Jahr 2016 möglich, weil es den Angreifern gelang, den dominanten Client (Geth) dazu zu bringen, einen „Slow Disk I/O-Vorgang“ zehntausende Male pro Block auszuführen. Da auch alternative Clients online waren, die diese Schwachstelle nicht aufwiesen, konnte Ethereum dem Angriff widerstehen und weiterarbeiten, während die Schwachstelle in Geth behoben wurde. +Client-Vielfalt bietet auch Widerstandsfähigkeit gegen Angriffe. Zum Beispiel ist ein Angriff, der [eine bestimmte Anwendung austrickst](https://twitter.com/vdWijden/status/1437712249926393858), um auf einen bestimmten Zweig der Chain zu wechseln, unwahrscheinlich erfolgreich, da andere Anwendungen wahrscheinlich nicht auf dieselbe Weise ausgenutzt werden können und die kanonische Chain unbeschädigt bleibt. Eine geringe Client-Vielfalt erhöht das Risiko, das mit einem Hack der dominierenden Anwendung verbunden ist. Client-Vielfalt hat sich bereits als wichtige Verteidigung gegen böswillige Angriffe auf das Netzwerk erwiesen. Beispielsweise war der Shanghai-Denial-of-Service-Angriff im Jahr 2016 möglich, weil Angreifer die dominierende Anwendung (Geth) dazu bringen konnten, eine langsame Festplatten-E/A-Operation zehntausende Male pro Block auszuführen. Da auch alternative Anwendungen online waren, die diese Schwachstelle nicht aufwiesen, konnte Ethereum dem Angriff widerstehen und den Betrieb aufrechterhalten, während die Schwachstelle in Geth behoben wurde. -### Proof-of-Stake-Endgültigkeit {#finality} +### Proof-of-Stake-Finalität {#finality} -Ein Fehler in einem Konsensclient mit mehr als 33 % der Ethereum-Knoten könnte verhindern, dass die Konsensebene finalisieren kann. Das bedeutet, dass die Nutzer nicht darauf vertrauen können, dass Transaktionen nicht irgendwann rückgängig gemacht oder geändert werden. Dies wäre für viele der auf Ethereum aufbauenden Anwendungen, insbesondere DeFi, sehr problematisch. +Ein Fehler in einem Konsens-Client mit über 33 % der Ethereum-Blockchain-Knoten könnte verhindern, dass die Konsensebene die Finalität erreicht. Das bedeutet, dass Benutzer nicht darauf vertrauen könnten, dass Transaktionen nicht irgendwann rückgängig gemacht oder geändert werden. Dies wäre für viele der auf Ethereum basierenden Apps, insbesondere im DeFi-Bereich, sehr problematisch. - Schlimmer noch: Ein kritischer Bug in einem Client mit Zweidrittelmehrheit könnte dazu führen, dass die Chain falsch geteilt und finalisiert wird. Dies wiederum würde dazu führen, dass eine große Anzahl von Validatoren auf einer ungültigen Chain stecken bleibt. Wenn sie sich der korrekten Chain wieder anschließen möchten, müssen diese Validatoren mit Slashing oder einem langsamen und teuren freiwilligen Rückzug und Reaktivierung rechnen. Das Ausmaß eines Slashings skaliert mit der Anzahl der schuldigen Knoten, wobei maximal eine Zweidrittelmehrheit geslashed werden kann (32 ETH). + Schlimmer noch, ein kritischer Fehler in einer Anwendung mit einer Zweidrittelmehrheit könnte dazu führen, dass sich die Chain fälschlicherweise aufspaltet und finalisiert, was dazu führt, dass eine große Gruppe von Validatoren auf einer ungültigen Chain stecken bleibt. Wenn sie sich wieder der korrekten Chain anschließen möchten, droht diesen Validatoren ein Slashing oder ein langsamer und teurer freiwilliger Rückzug und eine Reaktivierung. Das Ausmaß eines Slashings skaliert mit der Anzahl der schuldigen Blockchain-Knoten, wobei eine Zweidrittelmehrheit maximal geslasht wird (32 ETH). -Obwohl dies unwahrscheinliche Szenarien sind, kann das Ethereum-Ökosystem das Risiko mindern, indem es die Verteilung der Clients auf die aktiven Knoten ausgleicht. Im Idealfall würde kein Konsensclient jemals einen Anteil von 33 % an der Gesamtzahl der Nodes erreichen. +Obwohl dies unwahrscheinliche Szenarien sind, kann das Ethereum-Ökosystem deren Risiko mindern, indem es die Verteilung der Anwendungen auf die aktiven Blockchain-Knoten ausgleicht. Im Idealfall würde kein Konsens-Client jemals einen Anteil von 33 % an den gesamten Blockchain-Knoten erreichen. ### Geteilte Verantwortung {#responsibility} -Bei Mehrheitsclients fallen außerdem Personalkosten an. Ein kleines Entwicklungsteam wird dadurch stärker belastet und trägt mehr Verantwortung. Je geringer die Client-Vielfalt ist, desto größer ist die Last der Verantwortung für die Entwickler, die den Mehrheitsclient pflegen. Die Verteilung dieser Verantwortung auf mehrere Teams ist vorteilhaft für die Sicherheit des Knoten-Netzwerks und für das Personalnetzwerk von Ethereum. +Es gibt auch menschliche Kosten, wenn es Mehrheits-Anwendungen gibt. Es legt eine übermäßige Belastung und Verantwortung auf ein kleines Entwicklungsteam. Je geringer die Client-Vielfalt ist, desto größer ist die Last der Verantwortung für die Entwickler, die die Mehrheits-Anwendung pflegen. Diese Verantwortung auf mehrere Teams zu verteilen, ist sowohl für die Gesundheit von Ethereums Netzwerk aus Blockchain-Knoten als auch für sein Netzwerk aus Menschen gut. ## Aktuelle Client-Vielfalt {#current-client-diversity} @@ -63,25 +63,25 @@ data={[ { name: "Nimbus", value: 8.74}, { name: "Lodestar", value: 2.67 }, { name: "Grandine", value: 1.04 }, -{ name: "Andere", value: 0.07 } +{ name: "Other", value: 0.07 } ]} /> -Dieses Diagramm ist möglicherweise veraltet – aktuelle Informationen finden Sie auf [ethernodes.org](https://ethernodes.org) und [clientdiversity.org](https://clientdiversity.org). +Dieses Diagramm ist möglicherweise veraltet – besuchen Sie [ethernodes.org](https://ethernodes.org) und [clientdiversity.org](https://clientdiversity.org) für aktuelle Informationen. -Die beiden Tortendiagramme oben zeigen Momentaufnahmen der aktuellen Client-Vielfalt für die Ausführungs- und Konsensebene (Stand: Oktober 2025). Die Client-Vielfalt hat sich im Laufe der Jahre verbessert, und auf der Ausführungsebene hat die Dominanz von [Geth](https://geth.ethereum.org/) abgenommen. [Nethermind](https://www.nethermind.io/nethermind-client) liegt knapp an zweiter Stelle, [Besu](https://besu.hyperledger.org/) an dritter und [Erigon](https://github.com/ledgerwatch/erigon) an vierter Stelle, während andere Clients weniger als 3 % des Netzwerks ausmachen. Der am häufigsten verwendete Client auf der Konsensebene – [Lighthouse](https://lighthouse.sigmaprime.io/) – liegt nur knapp vor dem am zweithäufigsten verwendeten. [Prysm](https://prysmaticlabs.com/#projects) und [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) machen ~31 % bzw. ~14 % aus, und andere Clients werden selten verwendet. +Die beiden obigen Kreisdiagramme zeigen Momentaufnahmen der aktuellen Client-Vielfalt für die Ausführungs- und Konsensebenen (zum Zeitpunkt der Erstellung im Oktober 2025). Die Client-Vielfalt hat sich im Laufe der Jahre verbessert, und auf der Ausführungsebene ist ein Rückgang der Dominanz von [Geth](https://geth.ethereum.org/) zu verzeichnen, wobei [Nethermind](https://www.nethermind.io/nethermind-client) dicht dahinter auf dem zweiten Platz liegt, [Besu](https://besu.hyperledger.org/) auf dem dritten und [Erigon](https://github.com/ledgerwatch/erigon) auf dem vierten Platz, während andere Anwendungen weniger als 3 % des Netzwerks ausmachen. Die am häufigsten verwendete Anwendung auf der Konsensebene – [Lighthouse](https://lighthouse.sigmaprime.io/) – liegt ziemlich nah an der am zweithäufigsten verwendeten. [Prysm](https://prysmaticlabs.com/#projects) und [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) machen ~31 % bzw. ~14 % aus, und andere Anwendungen werden selten verwendet. -Die Daten der Ausführungsebene wurden am 26. Okt. 2025 von [supermajority.info](https://supermajority.info/) bezogen. Die Daten für Konsens-Clients stammen von [Michael Sproul](https://github.com/sigp/blockprint). Die Daten der Konsensclients sind schwieriger zu beschaffen, da die Clients der Konsensschicht nicht immer eindeutige Spuren hinterlassen, anhand derer sie identifiziert werden können. Die Daten wurden mit einem Klassifizierungsalgorithmus generiert, der manchmal einige der Minderheits-Clients verwechselt (weitere Details finden Sie [hier](https://twitter.com/sproulM_/status/1440512518242197516)). Im obigen Diagramm werden diese mehrdeutigen Klassifizierungen mit einem Entweder-Oder-Label behandelt (z. B. Nimbus/Teku). Nichtsdestotrotz ist es klar, dass die Mehrheit des Netzwerks Prysm verwendet. Obwohl es sich nur um Momentaufnahmen handelt, vermitteln die Werte im Diagramm einen guten allgemeinen Eindruck vom aktuellen Stand der Client-Vielfalt. +Die Daten der Ausführungsebene wurden am 26. Oktober 2025 von [supermajority.info](https://supermajority.info/) bezogen. Die Daten für Konsens-Clients stammen von [Michael Sproul](https://github.com/sigp/blockprint). Daten zu Konsens-Clients sind schwieriger zu beschaffen, da die Anwendungen der Konsensebene nicht immer eindeutige Spuren aufweisen, anhand derer sie identifiziert werden können. Die Daten wurden mithilfe eines Klassifizierungsalgorithmus generiert, der manchmal einige der Minderheits-Anwendungen verwechselt (siehe [hier](https://twitter.com/sproulM_/status/1440512518242197516) für weitere Details). Im obigen Diagramm werden diese mehrdeutigen Klassifizierungen mit einer Entweder-Oder-Bezeichnung (z. B. Nimbus/Teku) behandelt. Dennoch ist klar, dass die Mehrheit des Netzwerks Prysm ausführt. Obwohl es sich nur um Momentaufnahmen handelt, vermitteln die Werte im Diagramm einen guten allgemeinen Eindruck vom aktuellen Stand der Client-Vielfalt. -Aktuelle Daten zur Client-Vielfalt für die Konsensebene sind jetzt auf [clientdiversity.org](https://clientdiversity.org/) verfügbar. +Aktuelle Daten zur Client-Vielfalt für die Konsensebene sind jetzt unter [clientdiversity.org](https://clientdiversity.org/) verfügbar. ## Ausführungsebene {#execution-layer} -Bisher hat sich die Diskussion über die Client-Vielfalt hauptsächlich auf die Konsensschicht konzentriert. Allerdings macht der Ausführungs-Client [Geth](https://geth.ethereum.org) derzeit etwa 85 % aller Nodes aus. Dieser Prozentsatz ist aus denselben Gründen problematisch wie bei den Konsensclients. Zum Beispiel könnte ein Fehler in Geth, der die Transaktionsabwicklung oder die Konstruktion der Ausführungsnutzlast betrifft, dazu führen, dass Konsensclients problematische oder fehlerhafte Transaktionen abschließen. Daher wäre Ethereum sicherer mit einer gleichmäßigeren Verteilung der Ausführungsclients, idealerweise mit keinem Client, der mehr als 33 % des Netzwerks repräsentiert. +Bisher konzentrierte sich die Diskussion um die Client-Vielfalt hauptsächlich auf die Konsensebene. Der Ausführungs-Client [Geth](https://geth.ethereum.org) macht jedoch derzeit rund 85 % aller Blockchain-Knoten aus. Dieser Prozentsatz ist aus denselben Gründen problematisch wie bei Konsens-Clients. Beispielsweise könnte ein Fehler in Geth, der die Transaktionsverarbeitung oder die Erstellung von Ausführungs-Payloads beeinträchtigt, dazu führen, dass Konsens-Clients problematische oder fehlerhafte Transaktionen finalisieren. Daher wäre Ethereum mit einer gleichmäßigeren Verteilung von Ausführungs-Clients gesünder, idealerweise ohne dass eine Anwendung mehr als 33 % des Netzwerks repräsentiert. -## Verwenden Sie einen Minderheits-Client {#use-minority-client} +## Verwenden Sie eine Minderheits-Anwendung {#use-minority-client} -Um die Kundenvielfalt zu berücksichtigen, müssen nicht nur einzelne Benutzer Minderheitskunden auswählen – auch Validierungs pools und Institutionen wie die großen Dapp und Börsen müssen ihre Kunden wechseln. Allerdings können alle Nutzer ihren Teil dazu beitragen, das derzeitige Ungleichgewicht auszugleichen und die Nutzung der gesamten verfügbaren Ethereum-Software zu forcieren. Nach der Zusammenführung müssen alle Knotenbetreiber einen Ausführungsclient und einen Konsensclient betreiben. Die Wahl von Kombinationen der unten vorgeschlagenen Clients wird dazu beitragen, die Client-Vielfalt zu erhöhen. +Die Bewältigung der Client-Vielfalt erfordert mehr, als dass sich einzelne Benutzer für Minderheits-Anwendungen entscheiden – es erfordert, dass auch Validator-Pools und Institutionen wie die großen Dapps und Börsen die Anwendungen wechseln. Dennoch können alle Benutzer ihren Teil dazu beitragen, das derzeitige Ungleichgewicht zu beheben und die Nutzung der gesamten verfügbaren Ethereum-Software zu normalisieren. Nach dem Merge müssen alle Betreiber von Blockchain-Knoten einen Ausführungs-Client und einen Konsens-Client ausführen. Die Wahl von Kombinationen der unten vorgeschlagenen Anwendungen wird dazu beitragen, die Client-Vielfalt zu erhöhen. ### Ausführungs-Clients {#execution-clients} @@ -100,11 +100,11 @@ Um die Kundenvielfalt zu berücksichtigen, müssen nicht nur einzelne Benutzer M - [Prysm](https://prysm.offchainlabs.com/docs/) - [Grandine](https://docs.grandine.io/) -Technisch versierte Nutzer können dazu beitragen, diesen Prozess zu beschleunigen, indem sie mehr Anleitungen und Dokumentationen für Minderheitenclients schreiben und ihre Kollegen, die Knoten betreiben, ermutigen, von den dominanten Clients wegzugehen. Anleitungen für den Wechsel zu einem Minderheits-Konsens-Client sind auf [clientdiversity.org](https://clientdiversity.org/) verfügbar. +Technische Benutzer können dazu beitragen, diesen Prozess zu beschleunigen, indem sie mehr Tutorials und Dokumentationen für Minderheits-Anwendungen schreiben und ihre Kollegen, die Blockchain-Knoten betreiben, ermutigen, von den dominierenden Anwendungen weg zu migrieren. Anleitungen zum Wechsel zu einem Minderheits-Konsens-Client sind auf [clientdiversity.org](https://clientdiversity.org/) verfügbar. ## Dashboards zur Client-Vielfalt {#client-diversity-dashboards} -Verschiedene Dashboards geben Echtzeit-Statistiken zur Client-Vielfalt für die Ausführungs- und Konsensebene. +Mehrere Dashboards bieten Echtzeit-Statistiken zur Client-Vielfalt für die Ausführungs- und Konsensebene. **Konsensebene:** @@ -116,17 +116,17 @@ Verschiedene Dashboards geben Echtzeit-Statistiken zur Client-Vielfalt für die - [supermajority.info](https://supermajority.info//) - [Ethernodes](https://ethernodes.org/) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [Client-Vielfalt auf der Konsensebene von Ethereum](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) -- [Ethereum-Merge: Betreiben Sie den Mehrheits-Client auf eigene Gefahr!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, 24. März 2022_ -- [Die Bedeutung der Client-Vielfalt](https://our.status.im/the-importance-of-client-diversity/) -- [Liste von Ethereum-Node-Diensten](https://ethereumnodes.com/) -- [Das „Fünf-Warum-Problem“ der Client-Vielfalt](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) -- [Ethereum-Vielfalt und wie sie erreicht werden kann (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) +- [Ethereum Merge: Führen Sie die Mehrheits-Anwendung auf eigene Gefahr aus!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, 24. März 2022_ +- [Bedeutung der Client-Vielfalt](https://our.status.im/the-importance-of-client-diversity/) +- [Liste der Ethereum-Blockchain-Knoten-Dienste](https://ethereumnodes.com/) +- [Die „Fünf Warums“ des Problems der Client-Vielfalt](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) +- [Ethereum-Vielfalt und wie man sie löst (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) - [clientdiversity.org](https://clientdiversity.org/) ## Verwandte Themen {#related-topics} -- [Einen Ethereum-Node betreiben](/run-a-node/) -- [Nodes und Clients](/developers/docs/nodes-and-clients/) +- [Einen Ethereum-Blockchain-Knoten betreiben](/run-a-node/) +- [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/index.md index 3db32f76894..41ff2e9962a 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/index.md @@ -1,313 +1,313 @@ --- -title: Knotenpunkte (Nodes) und Anwendungen (Clients) -description: "Eine Übersicht über Ethereum-Nodes und Client-Software, wie eine Node eingerichtet wird und warum Sie dies tun sollten." +title: Blockchain-Knoten und Clients +description: "Ein Überblick über Ethereum-Blockchain-Knoten und Client-Software sowie darüber, wie man einen Blockchain-Knoten einrichtet und warum man dies tun sollte." lang: de sidebarDepth: 2 --- -Ethereum ist ein verteiltes Netzwerk von Computern (bekannt als Nodes), auf denen Software ausgeführt wird, um Blöcke und Transaktionsdaten zu verifizieren. Die Software muss auf Ihrem Computer ausgeführt werden, um ihn in einen Ethereum-Knoten zu verwandeln. Für die Bildung eines Knotens sind zwei separate Softwarekomponenten (die sogenannten „Clients“) erforderlich. +[Ethereum](/) ist ein verteiltes Netzwerk von Computern (bekannt als Blockchain-Knoten), auf denen Software ausgeführt wird, die Blöcke und Transaktionsdaten verifizieren kann. Die Software muss auf Ihrem Computer ausgeführt werden, um ihn in einen Ethereum-Blockchain-Knoten zu verwandeln. Es sind zwei separate Softwarekomponenten (bekannt als „Clients“ oder Anwendungen) erforderlich, um einen Blockchain-Knoten zu bilden. ## Voraussetzungen {#prerequisites} -Sie sollten das Konzept eines Peer-to-Peer-Netzwerks und die [Grundlagen der EVM](/developers/docs/evm/) verstehen, bevor Sie tiefer eintauchen und Ihre eigene Instanz eines Ethereum-Clients starten. Werfen Sie einen Blick auf unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/). +Sie sollten das Konzept eines Peer-to-Peer-Netzwerks und die [Grundlagen der EVM](/developers/docs/evm/) verstehen, bevor Sie tiefer eintauchen und Ihre eigene Instanz eines Ethereum-Clients ausführen. Werfen Sie einen Blick auf unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/). -Wenn das Thema Nodes für Sie neu ist, empfehlen wir Ihnen, sich zuerst unsere benutzerfreundliche Einführung zum [Betreiben eines Ethereum-Nodes](/run-a-node) anzusehen. +Wenn das Thema Blockchain-Knoten neu für Sie ist, empfehlen wir Ihnen, sich zunächst unsere benutzerfreundliche Einführung zum [Betreiben eines Ethereum-Blockchain-Knotens](/run-a-node) anzusehen. -## Was sind Nodes und Clients? {#what-are-nodes-and-clients} +## Was sind Blockchain-Knoten und Clients? {#what-are-nodes-and-clients} -Ein „Node“ ist jede Instanz von Ethereum-Client-Software, die mit anderen Computern verbunden ist, auf denen ebenfalls Ethereum-Software ausgeführt wird und so ein Netzwerk bildet. Ein Client ist eine Implementierung von Ethereum, die Daten entsprechend der Protokollregeln verifiziert und das Netzwerk sicher hält. Ein Knoten muss zwei Clients ausführen: einen Konsens- und einen Ausführungsclient. +Ein „Blockchain-Knoten“ (Node) ist jede Instanz einer Ethereum-Client-Software, die mit anderen Computern verbunden ist, auf denen ebenfalls Ethereum-Software ausgeführt wird, und so ein Netzwerk bildet. Ein Client (eine Anwendung) ist eine Implementierung von Ethereum, die Daten anhand der Protokollregeln verifiziert und das Netzwerk sicher hält. Ein Blockchain-Knoten muss zwei Clients ausführen: einen Konsens-Client und einen Ausführungs-Client. -- Der Ausführungsclient (auch als Execution Engine, EL-Client oder früher Eth1-Client bekannt) empfängt neue Transaktionen, die im Netzwerk übertragen werden, führt sie im EVM aus und verwaltet den aktuellen Zustand und die Datenbank aller aktuellen Ethereum-Daten. -- Der Konsensclient (auch als Beacon-Node, CL-Client oder früher Eth2-Client bekannt) implementiert den Proof-of-Stake-Konsensalgorithmus, der es dem Netzwerk ermöglicht, basierend auf validierten Daten des Ausführungsclients eine Einigung zu erzielen. Darüber hinaus gibt es einen dritten Teil der Software, den so genannten „Validator“, der dem Konsensclient hinzugefügt werden kann und es einem Knoten ermöglicht, sich an der Sicherung des Netzwerks zu beteiligen. +- Der Ausführungs-Client (auch bekannt als Execution Engine, EL-Client oder früher Eth1-Client) lauscht auf neue Transaktionen, die im Netzwerk übertragen werden, führt sie in der EVM aus und speichert den neuesten Status sowie die Datenbank aller aktuellen Ethereum-Daten. +- Der Konsens-Client (auch bekannt als Beacon Node, CL-Client oder früher Eth2-Client) implementiert den Proof-of-Stake-Konsensalgorithmus, der es dem Netzwerk ermöglicht, basierend auf validierten Daten des Ausführungs-Clients eine Einigung zu erzielen. Es gibt auch eine dritte Softwarekomponente, bekannt als „Validator“, die dem Konsens-Client hinzugefügt werden kann und es einem Blockchain-Knoten ermöglicht, sich an der Sicherung des Netzwerks zu beteiligen. -Diese Clients arbeiten zusammen, um den aktuellen Stand der Ethereum Chain zu verfolgen und den Nutzern die Interaktion mit dem Ethereum-Netzwerk zu ermöglichen. Das modulare Design, bei dem mehrere Softwarekomponenten zusammenarbeiten, wird als [eingekapselte Komplexität](https://vitalik.eth.limo/general/2022/02/28/complexity.html) bezeichnet. Dieser Ansatz machte es einfacher, [Die Zusammenführung](/roadmap/merge) nahtlos auszuführen, erleichtert die Wartung und Entwicklung von Client-Software und ermöglicht die Wiederverwendung einzelner Clients, beispielsweise im [Layer-2-Ökosystem](/layer-2/). +Diese Clients arbeiten zusammen, um die Spitze der Ethereum-Chain zu verfolgen und es Benutzern zu ermöglichen, mit dem Ethereum-Netzwerk zu interagieren. Das modulare Design, bei dem mehrere Softwarekomponenten zusammenarbeiten, wird als [gekapselte Komplexität (encapsulated complexity)](https://vitalik.eth.limo/general/2022/02/28/complexity.html) bezeichnet. Dieser Ansatz machte es einfacher, [The Merge](/roadmap/merge) nahtlos auszuführen, erleichtert die Wartung und Entwicklung von Client-Software und ermöglicht die Wiederverwendung einzelner Clients, beispielsweise im [Ebene-2-Ökosystem](/layer-2/). -![Gekoppelte Ausführungs- und Konsens-Clients](./eth1eth2client.png) +![Gekoppelter Ausführungs- und Konsens-Client](./eth1eth2client.png) Vereinfachtes Diagramm eines gekoppelten Ausführungs- und Konsens-Clients. -### Client-Diversität {#client-diversity} +### Client-Vielfalt {#client-diversity} -Sowohl [Ausführungs-Klienten](/developers/docs/nodes-and-clients/#execution-clients) als auch [Konsens-Clients](/developers/docs/nodes-and-clients/#consensus-clients) existieren in einer Vielzahl von Programmiersprachen, die von verschiedenen Teams entwickelt wurden. +Sowohl [Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) als auch [Konsens-Clients](/developers/docs/nodes-and-clients/#consensus-clients) existieren in einer Vielzahl von Programmiersprachen, die von verschiedenen Teams entwickelt wurden. -Wenn mehrere Client-Implementierungen vorhanden sind, kann das Netzwerk gestärkt werden, indem die Abhängigkeit von einer einzigen Codebasis verringert wird. Das ideale Ziel besteht darin, Vielfalt zu erreichen, ohne dass ein einziger Client das Netzwerk dominiert, um somit potenzielle Einzelstellen von Fehlerquellen zu eliminieren. -Die Vielfalt der Sprachen lädt auch eine breitere Entwicklergemeinschaft ein und ermöglicht es ihnen, Integrationen in ihrer bevorzugten Sprache zu erstellen. +Mehrere Client-Implementierungen können das Netzwerk stärken, indem sie seine Abhängigkeit von einer einzigen Codebasis verringern. Das ideale Ziel ist es, Vielfalt zu erreichen, ohne dass ein Client das Netzwerk dominiert, wodurch ein potenzieller Single Point of Failure eliminiert wird. +Die Vielfalt der Sprachen lädt auch eine breitere Entwickler-Community ein und ermöglicht es ihnen, Integrationen in ihrer bevorzugten Sprache zu erstellen. -Erfahren Sie mehr über [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/). +Erfahren Sie mehr über [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/). -Diese Implementierungen haben gemeinsam, dass sie alle einer einzigen Spezifikation folgen. Spezifikationen legen fest, wie das Ethereum-Netzwerk und die Blockchain funktionieren. Jedes technische Detail ist definiert, und die Spezifikationen können wie folgt gefunden werden: +Was diese Implementierungen gemeinsam haben, ist, dass sie alle einer einzigen Spezifikation folgen. Spezifikationen schreiben vor, wie das Ethereum-Netzwerk und die Blockchain funktionieren. Jedes technische Detail ist definiert und die Spezifikationen sind wie folgt zu finden: - Ursprünglich das [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) -- [Ausführungs-Spezifikationen](https://github.com/ethereum/execution-specs/) -- [Konsens-Spezifikationen](https://github.com/ethereum/consensus-specs) +- [Ausführungsspezifikationen (Execution specs)](https://github.com/ethereum/execution-specs/) +- [Konsensspezifikationen (Consensus specs)](https://github.com/ethereum/consensus-specs) - [EIPs](https://eips.ethereum.org/), die in verschiedenen [Netzwerk-Upgrades](/ethereum-forks/) implementiert wurden -### Tracking von Nodes im Netzwerk {#network-overview} +### Verfolgung von Blockchain-Knoten im Netzwerk {#network-overview} -Es gibt mehrere Tracker, die einen Echtzeit-Überblick über die Knoten im Ethereum-Netzwerk bieten. Beachten Sie, dass diese Crawler aufgrund der Natur dezentraler Netzwerke nur einen begrenzten Überblick über das Netzwerk bieten können und möglicherweise unterschiedliche Ergebnisse melden. +Mehrere Tracker bieten einen Echtzeit-Überblick über die Blockchain-Knoten im Ethereum-Netzwerk. Beachten Sie, dass diese Crawler aufgrund der Natur dezentralisierter Netzwerke nur eine begrenzte Sicht auf das Netzwerk bieten können und möglicherweise unterschiedliche Ergebnisse melden. -- [Karte der Nodes](https://etherscan.io/nodetracker) von Etherscan +- [Karte der Blockchain-Knoten](https://etherscan.io/nodetracker) von Etherscan - [Ethernodes](https://ethernodes.org/) von Bitfly -- [Nodewatch](https://www.nodewatch.io/) von Chainsafe, crawlt Konsens-Nodes -- [Monitoreth](https://monitoreth.io/) – von MigaLabs, ein verteiltes Netzwerküberwachungstool -- [Wöchentliche Netzwerkzustandsberichte](https://probelab.io) – von ProbeLab, unter Verwendung des [Nebula-Crawlers](https://github.com/dennis-tra/nebula) und anderer Tools +- [Nodewatch](https://www.nodewatch.io/) von Chainsafe, crawlt Konsens-Knoten +- [Monitoreth](https://monitoreth.io/) - von MigaLabs, ein verteiltes Netzwerk-Monitoring-Tool +- [Wöchentliche Netzwerk-Gesundheitsberichte](https://probelab.io) - von ProbeLab, unter Verwendung des [Nebula-Crawlers](https://github.com/dennis-tra/nebula) und anderer Tools -## Node-Typen {#node-types} +## Arten von Blockchain-Knoten {#node-types} -Wenn Sie [Ihre eigene Node betreiben](/developers/docs/nodes-and-clients/run-a-node/) möchten, sollten Sie verstehen, dass es verschiedene Node-Typen gibt, die Daten unterschiedlich verbrauchen. Die Clients können drei verschiedene Arten von Knoten ausführen: leichte, vollständige und Archivknoten. Es gibt auch Optionen für verschiedene Synchronisierungsstrategien, die eine schnellere Synchronisierungszeit ermöglichen. Die Synchronisierung bezieht sich darauf, wie schnell sie die aktuellsten Informationen über Ethereums Zustand erhalten kann. +Wenn Sie [Ihren eigenen Blockchain-Knoten betreiben](/developers/docs/nodes-and-clients/run-a-node/) möchten, sollten Sie verstehen, dass es verschiedene Arten von Blockchain-Knoten gibt, die Daten unterschiedlich verbrauchen. Tatsächlich können Clients drei verschiedene Arten von Blockchain-Knoten ausführen: Light, Full und Archive. Es gibt auch Optionen für verschiedene Synchronisationsstrategien, die eine schnellere Synchronisationszeit ermöglichen. Synchronisation bezieht sich darauf, wie schnell die aktuellsten Informationen über den Status von Ethereum abgerufen werden können. ### Full Node {#full-node} -Vollständige Knoten führen eine Block-für-Block-Validierung der Blockchain durch, einschließlich des Herunterladens und Verifizierens des Block-Inhalts und der Statusdaten für jeden Block. Es gibt verschiedene Klassen von Full Nodes – einige beginnen mit dem Genesis-Block und verifizieren jeden einzelnen Block in der gesamten Geschichte der Blockchain. Andere beginnen ihre Verifizierung bei einem neueren Block, den sie für gültig halten (z. B. Geths „Snap Sync“). Unabhängig davon, wo die Verifizierung beginnt, behalten Full Nodes nur eine lokale Kopie relativ aktueller Daten (in der Regel die letzten 128 Blöcke), sodass ältere Daten gelöscht werden können, um Speicherplatz zu sparen. Ältere Daten können wiederhergestellt werden, wenn sie benötigt werden. +Full Nodes führen eine Block-für-Block-Validierung der Blockchain durch, einschließlich des Herunterladens und Verifizierens des Blockkörpers und der Statusdaten für jeden Block. Es gibt verschiedene Klassen von Full Nodes – einige beginnen beim Genesis-Block und verifizieren jeden einzelnen Block in der gesamten Geschichte der Blockchain. Andere beginnen ihre Verifizierung bei einem neueren Block, dem sie als gültig vertrauen (z. B. Geths „Snap Sync“). Unabhängig davon, wo die Verifizierung beginnt, behalten Full Nodes nur eine lokale Kopie relativ aktueller Daten (typischerweise die letzten 128 Blöcke), sodass ältere Daten gelöscht werden können, um Speicherplatz zu sparen. Ältere Daten können bei Bedarf neu generiert werden. -- Speichert die vollständigen Blockchain-Daten (obwohl diese regelmäßig „geprunt“ werden, so dass ein vollständiger Knoten nicht alle Zustandsdaten bis zurück zur Genesis speichert) -- Beteiligt sich an der Blockprüfung, überprüft alle Blöcke und Zustände. -- Alle Status können entweder aus dem lokalen Speicher abgerufen oder von einem Full Node aus „Snapshots“ neu generiert werden. -- Bedient das Netzwerk und liefert Daten auf Anfrage. +- Speichert vollständige Blockchain-Daten (obwohl diese regelmäßig bereinigt werden, sodass ein Full Node nicht alle Statusdaten bis zum Genesis-Block speichert). +- Nimmt an der Blockvalidierung teil, verifiziert alle Blöcke und Status. +- Alle Status können von einem Full Node entweder aus dem lokalen Speicher abgerufen oder aus „Snapshots“ neu generiert werden. +- Bedient das Netzwerk und stellt Daten auf Anfrage zur Verfügung. -### Archiv-Node {#archive-node} +### Archive Node {#archive-node} -Archivierungsnodes sind Full Nodes, die jeden Block seit Genesis verifizieren und niemals irgendwelche heruntergeladenen Daten löschen. +Archive Nodes sind Full Nodes, die jeden Block ab dem Genesis-Block verifizieren und niemals heruntergeladene Daten löschen. -- Speichert alles im Full Node und baut zusätzlich ein Archiv von vergangenen Zuständen auf. Dies ist erforderlich, wenn Sie beispielsweise den Kontostand bei Block Nr. 4.000.000 abfragen oder Ihre eigenen Transaktionen einfach und zuverlässig testen möchten, ohne sie mithilfe von Tracing zu validieren. -- Diese Daten werden in Einheiten von Terabytes dargestellt, was die Archivierungsknoten für den Durchschnittsnutzer weniger attraktiv macht, jedoch für Dienste wie Blockexplorer, Wallet-Anbieter und Chain-Analytics nützlich sein kann. +- Speichert alles, was im Full Node aufbewahrt wird, und baut ein Archiv historischer Status auf. Dies wird benötigt, wenn Sie beispielsweise einen Kontostand bei Block #4.000.000 abfragen oder einfach und zuverlässig Ihre eigenen Transaktionssätze testen möchten, ohne sie mittels Tracing zu validieren. +- Diese Daten umfassen Terabytes, was Archive Nodes für durchschnittliche Benutzer weniger attraktiv macht, aber für Dienste wie Blocksuchmaschinen, Wallet-Anbieter und Chain-Analysen nützlich sein kann. -Das Synchronisieren von Clients in jedem anderen Modus als dem Archiv führt zu reduzierten (pruned) Blockchain-Daten. Das bedeutet, es gibt kein Archiv mit allen vergangenen Zuständen, der vollständige Node ist jedoch in der Lage, diese bei Bedarf zu erstellen. +Das Synchronisieren von Clients in einem anderen Modus als dem Archivmodus führt zu bereinigten Blockchain-Daten. Das bedeutet, dass es kein Archiv aller historischen Status gibt, der Full Node diese jedoch bei Bedarf erstellen kann. -Erfahren Sie mehr über [Archiv-Nodes](/developers/docs/nodes-and-clients/archive-nodes). +Erfahren Sie mehr über [Archive Nodes](/developers/docs/nodes-and-clients/archive-nodes). ### Light Node {#light-node} -Anstatt jeden Block herunterzuladen, laden Light Nodes nur Block-Header herunter. Diese Header enthalten zusammenfassende Informationen über den Inhalt der Blöcke. Alle anderen Informationen, die der leichte Node benötigt, werden von einem Full Node angefordert. Der leichte Node kann dann die empfangenen Daten unabhängig mit den Zustandswurzeln in den Block-Headern abgleichen. Leichte Nodes ermöglichen es Nutzern, am Ethereum-Netzwerk teilzunehmen, ohne die leistungsstarke Hardware oder hohe Bandbreite zu benötigen, die für den Betrieb von Full Nodes erforderlich sind. Irgendwann könnten leichte Nodes auf Mobiltelefonen oder eingebetteten Geräten laufen. Light Nodes nehmen nicht am Konsens teil (d. h. sie können keine Validatoren sein), aber sie können mit der gleichen Funktionalität und den gleichen Sicherheitsgarantien wie ein Full Node auf die Ethereum-Blockchain zugreifen. +Anstatt jeden Block herunterzuladen, laden Light Nodes nur Block-Header herunter. Diese Header enthalten zusammenfassende Informationen über den Inhalt der Blöcke. Alle anderen Informationen, die der Light Node benötigt, werden von einem Full Node angefordert. Der Light Node kann dann die empfangenen Daten unabhängig anhand der Statuswurzeln (State Roots) in den Block-Headern verifizieren. Light Nodes ermöglichen es Benutzern, am Ethereum-Netzwerk teilzunehmen, ohne die leistungsstarke Hardware oder hohe Bandbreite zu benötigen, die für den Betrieb von Full Nodes erforderlich ist. Letztendlich könnten Light Nodes auf Mobiltelefonen oder eingebetteten Geräten laufen. Die Light Nodes nehmen nicht am Konsens teil (d. h. sie können keine Validatoren sein), aber sie können auf die Ethereum-Blockchain mit der gleichen Funktionalität und den gleichen Sicherheitsgarantien wie ein Full Node zugreifen. -Leichte Clients sind ein Bereich, in dem Ethereum aktiv entwickelt wird. Es wird erwartet, dass wir bald neue leichte Clients für die Konsens- und Ausführungsebene entwickeln werden. -Es gibt auch potenzielle Wege, um Light-Client-Daten über das [Gossip-Netzwerk](https://www.ethportal.net/) bereitzustellen. Dies ist vorteilhaft, da das Gossip-Netzwerk ein Netzwerk von leichten Nodes unterstützen könnte, ohne dass Full Nodes zur Bedienung von Anfragen erforderlich sind. +Light Clients sind ein Bereich aktiver Entwicklung für Ethereum, und wir erwarten, bald neue Light Clients für die Konsensebene und die Ausführungsebene zu sehen. +Es gibt auch potenzielle Wege, Light-Client-Daten über das [Gossip-Netzwerk](https://www.ethportal.net/) bereitzustellen. Dies ist vorteilhaft, da das Gossip-Netzwerk ein Netzwerk von Light Nodes unterstützen könnte, ohne dass Full Nodes Anfragen bedienen müssen. -Ethereum unterstützt noch keine große Population von leichten Nodes, jedoch ist die Unterstützung von leichten Nodes ein Bereich, der sich in naher Zukunft voraussichtlich schnell entwickeln wird. Insbesondere Clients wie [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) und [LodeStar](https://lodestar.chainsafe.io/) konzentrieren sich derzeit stark auf Light Nodes. +Ethereum unterstützt noch keine große Anzahl von Light Nodes, aber die Unterstützung von Light Nodes ist ein Bereich, der sich voraussichtlich in naher Zukunft schnell entwickeln wird. Insbesondere Clients wie [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) und [LodeStar](https://lodestar.chainsafe.io/) konzentrieren sich derzeit stark auf Light Nodes. -## Warum sollte ich einen Ethereum-Node betreiben? {#why-should-i-run-an-ethereum-node} +## Warum sollte ich einen Ethereum-Blockchain-Knoten betreiben? {#why-should-i-run-an-ethereum-node} -Der Betrieb eines eigenen Knotens ermöglicht es Ihnen, Ethereum auf private, autarke und vertrauenswürdige Weise zu nutzen und gleichzeitig das Netz zu unterstützen, da es so robuster und dezentraler wird. +Der Betrieb eines Blockchain-Knotens ermöglicht es Ihnen, Ethereum direkt, vertrauenslos und privat zu nutzen, während Sie das Netzwerk unterstützen, indem Sie es robuster und dezentralisiert halten. -### Ihre Vorteile {#benefits-to-you} +### Vorteile für Sie {#benefits-to-you} -Der Betrieb eines eigenen Knotens erlaubt es Ihnen, Ethereum auf private, autarke und vertrauenswürdige Weise zu nutzen. Sie müssen dem Netzwerk nicht vertrauen, da Sie die Daten mit Ihrem Client selbst überprüfen können. „Nicht vertrauen, überprüfen“ ist ein beliebtes Mantra der Blockchain. +Der Betrieb Ihres eigenen Blockchain-Knotens ermöglicht es Ihnen, Ethereum auf private, autarke und vertrauenslose Weise zu nutzen. Sie müssen dem Netzwerk nicht vertrauen, da Sie die Daten selbst mit Ihrem Client verifizieren können. „Nicht vertrauen, verifizieren“ (Don't trust, verify) ist ein beliebtes Blockchain-Mantra. -- Ihr Node überprüft alle Transaktionen und Blöcke selbstständig anhand der Konsensregeln. Das bedeutet, dass Sie sich nicht auf andere Nodes im Netzwerk verlassen oder ihnen vollständig vertrauen müssen. -- Sie können ein Ethereum-Wallet mit Ihrem eigenen Knoten verwenden. Sie können dApps sicherer und privater nutzen, da Sie Ihre Adressen und Guthaben nicht an Vermittler weitergeben müssen. Alles kann mit Ihrem eigenen Client überprüft werden. [MetaMask](https://metamask.io), [Frame](https://frame.sh/) und [viele andere Wallets](/wallets/find-wallet/) bieten RPC-Import an, der es ihnen ermöglicht, Ihre Node zu verwenden. -- Sie können andere Dienste betreiben und selbst hosten, die auf Daten von Ethereum angewiesen sind. Das kann zum Beispiel ein Beacon-Chain-Validator, Software wie Layer 2, Infrastruktur, Block-Explorer, Zahlungsprozessoren usw. sein. -- Sie können Ihre eigenen benutzerdefinierten [RPC-Endpunkte](/developers/docs/apis/json-rpc/) bereitstellen. Sie könnten diese Endpunkte sogar öffentlich anbieten, um der Community zu helfen, große zentrale Anbieter zu vermeiden. -- Sie können sich über **Interprozesskommunikation (IPC)** mit Ihrer Node verbinden oder die Node umschreiben, um Ihr Programm als Plugin zu laden. Dies gewährt eine niedrige Latenz, was sehr hilft, z. B. bei der Verarbeitung großer Datenmengen mit Web3-Bibliotheken oder wenn Sie Ihre Transaktionen so schnell wie möglich ersetzen müssen (d. h. Frontrunning). -- Sie können ETH direkt einsetzen, um das Netzwerk zu sichern und Prämien zu verdienen. Siehe [Solo-Staking](/staking/solo/), um loszulegen. +- Ihr Blockchain-Knoten verifiziert alle Transaktionen und Blöcke selbstständig anhand der Konsensregeln. Das bedeutet, dass Sie sich nicht auf andere Blockchain-Knoten im Netzwerk verlassen oder ihnen vollständig vertrauen müssen. +- Sie können ein Ethereum-Wallet mit Ihrem eigenen Blockchain-Knoten verwenden. Sie können Dapps sicherer und privater nutzen, da Sie Ihre Adressen und Guthaben nicht an Vermittler weitergeben müssen. Alles kann mit Ihrem eigenen Client überprüft werden. [MetaMask](https://metamask.io), [Frame](https://frame.sh/) und [viele andere Wallets](/wallets/find-wallet/) bieten RPC-Import an, sodass sie Ihren Blockchain-Knoten verwenden können. +- Sie können andere Dienste, die von Daten aus Ethereum abhängen, ausführen und selbst hosten. Dies könnte beispielsweise ein Beacon Chain-Validator, Software wie Ebene 2, Infrastruktur, Blocksuchmaschinen, Zahlungsabwickler usw. sein. +- Sie können Ihre eigenen benutzerdefinierten [RPC-Endpunkte](/developers/docs/apis/json-rpc/) bereitstellen. Sie könnten diese Endpunkte sogar öffentlich für die Community anbieten, um ihr zu helfen, große zentralisierte Anbieter zu vermeiden. +- Sie können sich über **Inter-process Communications (IPC)** mit Ihrem Blockchain-Knoten verbinden oder den Blockchain-Knoten so umschreiben, dass er Ihr Programm als Plugin lädt. Dies gewährt eine geringe Latenz, was sehr hilfreich ist, z. B. bei der Verarbeitung vieler Daten mit Web3-Bibliotheken oder wenn Sie Ihre Transaktionen so schnell wie möglich ersetzen müssen (d. h. Frontrunning). +- Sie können ETH direkt staken, um das Netzwerk zu sichern und Belohnungen zu verdienen. Siehe [Solo-Staking](/staking/solo/), um loszulegen. -![Wie Sie über Ihre Anwendung und Nodes auf Ethereum zugreifen](./nodes.png) +![Wie Sie über Ihre Anwendung und Blockchain-Knoten auf Ethereum zugreifen](./nodes.png) ### Vorteile für das Netzwerk {#network-benefits} -Eine Vielzahl von Nodes ist wichtig für die Gesundheit, Sicherheit und operative Belastbarkeit von Ethereum. +Eine vielfältige Gruppe von Blockchain-Knoten ist wichtig für die Gesundheit, Sicherheit und betriebliche Widerstandsfähigkeit von Ethereum. -- Full Nodes setzen die Konsensregeln durch, sodass sie nicht dazu verleitet werden können, Blöcke zu akzeptieren, die nicht den Regeln entsprechen. Dies sorgt für zusätzliche Sicherheit im Netzwerk, denn wenn alle Knoten leichte Nodes wären, die keine vollständige Verifizierung durchführen, könnten Validatoren das Netzwerk angreifen. -- Im Falle eines Angriffs, der die kryptoökonomischen Abwehrmechanismen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/#what-is-pos) überwindet, kann eine soziale Wiederherstellung durch Full Nodes durchgeführt werden, die sich dafür entscheiden, der ehrlichen Chain zu folgen. -- Mehr Knoten im Netzwerk führen zu einem vielfältigeren und robusteren Netzwerk, dem ultimativen Ziel der Dezentralisierung, das ein zensurresistentes und zuverlässiges System ermöglicht. -- Full Nodes bieten den Zugang zu Blockchain-Daten für leichte Clients, die darauf angewiesen sind. Light Nodes speichern nicht die gesamte Blockchain, sondern verifizieren Daten über die [State Roots in den Block-Headern](/developers/docs/blocks/#block-anatomy). Sie können bei Bedarf weitere Informationen von Full Nodes anfordern. +- Full Nodes setzen die Konsensregeln durch, sodass sie nicht dazu verleitet werden können, Blöcke zu akzeptieren, die diese nicht befolgen. Dies bietet zusätzliche Sicherheit im Netzwerk, denn wenn alle Blockchain-Knoten Light Nodes wären, die keine vollständige Verifizierung durchführen, könnten Validatoren das Netzwerk angreifen. +- Im Falle eines Angriffs, der die kryptoökonomischen Verteidigungen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/#what-is-pos) überwindet, kann eine soziale Wiederherstellung (Social Recovery) durch Full Nodes durchgeführt werden, die sich entscheiden, der ehrlichen Chain zu folgen. +- Mehr Blockchain-Knoten im Netzwerk führen zu einem vielfältigeren und robusteren Netzwerk, dem ultimativen Ziel der Dezentralisierung, was ein zensurresistentes und zuverlässiges System ermöglicht. +- Full Nodes bieten Zugriff auf Blockchain-Daten für leichtgewichtige Clients, die darauf angewiesen sind. Light Nodes speichern nicht die gesamte Blockchain, sondern verifizieren Daten über die [Statuswurzeln in Block-Headern](/developers/docs/blocks/#block-anatomy). Sie können bei Bedarf weitere Informationen von Full Nodes anfordern. Wenn Sie einen Full Node betreiben, profitiert das gesamte Ethereum-Netzwerk davon, auch wenn Sie keinen Validator betreiben. -## Eigene Node betreiben {#running-your-own-node} +## Betreiben Ihres eigenen Blockchain-Knotens {#running-your-own-node} -Haben Sie Interesse, Ihren eigenen Ethereum-Client zu betreiben? +Interessiert daran, Ihren eigenen Ethereum-Client zu betreiben? -Für eine einsteigerfreundliche Einführung besuchen Sie unsere Seite [Node betreiben](/run-a-node), um mehr zu erfahren. +Für eine anfängerfreundliche Einführung besuchen Sie unsere Seite [Einen Blockchain-Knoten betreiben](/run-a-node), um mehr zu erfahren. -Wenn Sie ein eher technischer Benutzer sind, finden Sie weitere Details und Optionen, wie Sie [Ihre eigene Node aufsetzen](/developers/docs/nodes-and-clients/run-a-node/) können. +Wenn Sie eher ein technischer Benutzer sind, tauchen Sie in weitere Details und Optionen ein, wie Sie [Ihren eigenen Blockchain-Knoten hochfahren](/developers/docs/nodes-and-clients/run-a-node/). ## Alternativen {#alternatives} -Die Einrichtung eines eigenen Knotens kann Sie Zeit und Ressourcen kosten, aber Sie müssen nicht immer eine eigene Instanz betreiben. In diesem Fall können Sie sich an einen externen API-Anbieter wenden. Für einen Überblick über die Nutzung dieser Dienste, schauen Sie sich [Nodes as a Service](/developers/docs/nodes-and-clients/nodes-as-a-service/) an. +Das Einrichten eines eigenen Blockchain-Knotens kann Sie Zeit und Ressourcen kosten, aber Sie müssen nicht immer Ihre eigene Instanz betreiben. In diesem Fall können Sie einen API-Anbieter von Drittanbietern verwenden. Einen Überblick über die Nutzung dieser Dienste finden Sie unter [Blockchain-Knoten als Dienstleistung (Nodes as a Service)](/developers/docs/nodes-and-clients/nodes-as-a-service/). -Wenn jemand in Ihrer Community einen Ethereum-Knoten mit öffentlichen APIs betreiben, können Sie Ihre Wallet in einen Community-Knoten über Custom RPC einbinden, um Ihre Privatsphäre besser zu schützen als bei der zufälligen Auswahl eines vertrauenswürdigen Dritten. +Wenn jemand in Ihrer Community einen Ethereum-Blockchain-Knoten mit einer öffentlichen API betreibt, können Sie Ihre Wallets über Custom RPC auf einen Community-Knoten verweisen und mehr Privatsphäre gewinnen als bei einem zufälligen vertrauenswürdigen Drittanbieter. -Wenn Sie andererseits einen Client betreiben, können Sie ihn mit Ihren Freunden teilen, die eventuell Bedarf haben. +Andererseits können Sie, wenn Sie einen Client betreiben, diesen mit Ihren Freunden teilen, die ihn möglicherweise benötigen. ## Ausführungs-Clients {#execution-clients} -Die Ethereum-Community unterhält mehrere quelloffene Ausführungsclients (früher als „Eth1-Clients“ oder einfach „Ethereum-Clients“ bezeichnet), die von verschiedenen Teams in unterschiedlichen Programmiersprachen entwickelt wurden. Dies macht das Netzwerk stärker und [vielfältiger](/developers/docs/nodes-and-clients/client-diversity/). Das ideale Ziel ist es, Vielfalt zu erreichen, ohne dass ein Client dominiert, um jede Art von einzelnen Ausfallpunkten zu reduzieren. +Die Ethereum-Community pflegt mehrere Open-Source-Ausführungs-Clients (früher bekannt als „Eth1-Clients“ oder einfach „Ethereum-Clients“), die von verschiedenen Teams in unterschiedlichen Programmiersprachen entwickelt wurden. Dies macht das Netzwerk stärker und [vielfältiger](/developers/docs/nodes-and-clients/client-diversity/). Das ideale Ziel ist es, Vielfalt zu erreichen, ohne dass ein Client dominiert, um Single Points of Failure zu reduzieren. -Diese Tabelle gibt einen Überblick über die verschiedenen Clients. Alle bestehen [Client-Tests](https://github.com/ethereum/tests) und werden aktiv gewartet, um mit Netzwerk-Upgrades auf dem neuesten Stand zu bleiben. +Diese Tabelle fasst die verschiedenen Clients zusammen. Alle bestehen [Client-Tests](https://github.com/ethereum/tests) und werden aktiv gepflegt, um bei Netzwerk-Upgrades auf dem neuesten Stand zu bleiben. -| Client | Sprache | Betriebssysteme | Netzwerke | Synchronisationsstrategien | Zustandsreduzierung | -| ------------------------------------------------------------------------------------------- | ------------------------ | --------------------- | ------------------------- | ----------------------------------------------------------------------------------------------- | ------------------- | -| [Geth](https://geth.ethereum.org/) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync), [Vollständig](#full-sync) | Archiv, Reduziert | -| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync) (ohne Bereitstellung), Schnell, [Vollständig](#full-sync) | Archiv, Reduziert | -| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync), [Schnell](#fast-sync), [Vollständig](#full-sync) | Archiv, Reduziert | -| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Vollständig](#full-sync) | Archiv, Reduziert | -| [Reth](https://reth.rs/) | Rust | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Vollständig](#full-sync) | Archiv, Reduziert | -| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(Beta)_ | TypeScript | Linux, Windows, MacOS | Sepolia, Holesky | [Vollständig](#full-sync) | Reduziert | +| Client | Sprache | Betriebssysteme | Netzwerke | Synchronisationsstrategien | Statusbereinigung (Pruning) | +| ------------------------------------------------------------------------ | ---------- | --------------------- | ------------------------- | -------------------------------------------------------------- | --------------------------- | +| [Geth](https://geth.ethereum.org/) | Go | Linux, Windows, macOS | Mainnet, Sepolia, Hoodi | [Snap](#snap-sync), [Full](#full-sync) | Archive, Pruned | +| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, macOS | Mainnet, Sepolia, Hoodi | [Snap](#snap-sync) (ohne Bereitstellung), Fast, [Full](#full-sync) | Archive, Pruned | +| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, macOS | Mainnet, Sepolia, Hoodi | [Snap](#snap-sync), [Fast](#fast-sync), [Full](#full-sync) | Archive, Pruned | +| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, macOS | Mainnet, Sepolia, Hoodi | [Full](#full-sync) | Archive, Pruned | +| [Reth](https://reth.rs/) | Rust | Linux, Windows, macOS | Mainnet, Sepolia, Hoodi | [Full](#full-sync) | Archive, Pruned | +| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(beta)_ | TypeScript | Linux, Windows, macOS | Sepolia, Hoodi | [Full](#full-sync) | Pruned | -Für mehr Informationen zu unterstützten Netzwerken, lesen Sie [Ethereum-Netzwerke](/developers/docs/networks/). +Weitere Informationen zu unterstützten Netzwerken finden Sie unter [Ethereum-Netzwerke](/developers/docs/networks/). -Jeder Client bietet einzigartige Anwendungsfälle und Vorteile, daher sollten Sie einen basierend auf Ihren eigenen Präferenzen wählen. Die Client-Vielfalt ermöglicht die Fokussierung der Implementierungen auf verschiedene Funktionen und Benutzergruppen. Sie können einen Client basierend auf Funktionen, Support, Programmiersprache oder Lizenzen auswählen. +Jeder Client hat einzigartige Anwendungsfälle und Vorteile, daher sollten Sie einen basierend auf Ihren eigenen Vorlieben auswählen. Vielfalt ermöglicht es, Implementierungen auf verschiedene Funktionen und Zielgruppen auszurichten. Möglicherweise möchten Sie einen Client basierend auf Funktionen, Support, Programmiersprache oder Lizenzen auswählen. ### Besu {#besu} -Hyperledger Besu ist ein Ethereum-Client auf Unternehmensebene für öffentliche und private Netzwerke. Er bietet alle Funktionen des Ethereum-Mainnets, von Tracing bis GraphQL, bietet ein umfangreiches Monitoring und wird von ConsenSys unterstützt, sowohl in offenen Community-Kanälen als auch durch kommerzielle SLA für Unternehmen. Er ist in Java geschrieben und durch Apache 2.0 lizenziert. +Hyperledger Besu ist ein Ethereum-Client auf Unternehmensniveau für öffentliche und zugangsbeschränkte (permissioned) Netzwerke. Er führt alle Funktionen des Ethereum-Mainnets aus, von Tracing bis GraphQL, verfügt über umfassendes Monitoring und wird von ConsenSys unterstützt, sowohl in offenen Community-Kanälen als auch durch kommerzielle SLAs für Unternehmen. Er ist in Java geschrieben und unter Apache 2.0 lizenziert. -Die umfangreiche [Dokumentation](https://besu.hyperledger.org/en/stable/) von Besu wird Sie durch alle Details zu seinen Funktionen und Setups führen. +Die ausführliche [Dokumentation](https://besu.hyperledger.org/en/stable/) von Besu führt Sie durch alle Details zu seinen Funktionen und Setups. ### Erigon {#erigon} -Erigon, früher bekannt als Turbo-Geth, begann als eine Abspaltung von Go Ethereum, die auf Geschwindigkeit und Speicherplatzeffizienz ausgerichtet ist. Es ist eine komplett neu entwickelte Implementierung von Ethereum, die derzeit in Go geschrieben ist, aber auch in anderen Sprachen implementiert werden kann. Das Ziel von Erigon ist es, eine schnellere, modularere und optimierte Implementierung von Ethereum anzubieten. Es kann eine vollständige Synchronisierung von Archivierungsknoten mit etwa 2 TB Speicherplatz in weniger als 3 Tagen durchführen. +Erigon, früher bekannt als Turbo-Geth, begann als Fork von Go Ethereum, der auf Geschwindigkeit und Speicherplatzeffizienz ausgerichtet war. Erigon ist eine komplett neu gestaltete Implementierung von Ethereum, die derzeit in Go geschrieben ist, aber Implementierungen in anderen Sprachen befinden sich in der Entwicklung. Das Ziel von Erigon ist es, eine schnellere, modularere und optimiertere Implementierung von Ethereum bereitzustellen. Es kann eine vollständige Archive-Node-Synchronisation mit etwa 2 TB Speicherplatz in weniger als 3 Tagen durchführen. ### Go Ethereum {#geth} -Go Ethereum (kurz Geth) ist eine der ursprünglichen Implementierungen des Ethereum-Protokolls. Derzeit ist es der am weitesten verbreitete Client mit der größten Benutzerbasis und der größten Vielfalt an Tools für Benutzer und Entwickler. Es ist in Go geschrieben, vollständig Open Source und unter der GNU LGPL v3 lizenziert. +Go Ethereum (kurz Geth) ist eine der ursprünglichen Implementierungen des Ethereum-Protokolls. Derzeit ist es der am weitesten verbreitete Client mit der größten Benutzerbasis und einer Vielzahl von Tools für Benutzer und Entwickler. Er ist in Go geschrieben, vollständig Open Source und unter der GNU LGPL v3 lizenziert. -Erfahren Sie mehr über Geth in seiner [Dokumentation](https://geth.ethereum.org/docs/). +Erfahren Sie mehr über Geth in seiner [Dokumentation](https://geth.ethereum.org/docs). ### Nethermind {#nethermind} -Nethermind ist eine Ethereum-Implementierung, die mit dem C# .NET Tech-Stack erstellt wurde, unter der LGPL-3.0 lizenziert ist und auf allen wichtigen Plattformen, einschließlich ARM, läuft. Sie bietet eine großartige Leistung mit: +Nethermind ist eine Ethereum-Implementierung, die mit dem C# .NET-Tech-Stack erstellt wurde, unter LGPL-3.0 lizenziert ist und auf allen wichtigen Plattformen einschließlich ARM läuft. Sie bietet großartige Leistung mit: -- einer optimierten virtuellen Maschine, -- Zustandszugriff, -- Netzwerkfunktionen und umfangreiche Features wie Prometheus-/Grafana-Dashboards, Unterstützung für Protokollierung auf Unternehmensebene mit Seq, JSON-RPC-Nachverfolgung und Analyse-Plug-ins. +- einer optimierten Virtual Machine +- Statuszugriff +- Netzwerkfunktionen und umfangreichen Features wie Prometheus/Grafana-Dashboards, Seq-Enterprise-Logging-Unterstützung, JSON-RPC-Tracing und Analyse-Plugins. -Nethermind hat auch eine [detaillierte Dokumentation](https://docs.nethermind.io), starken Entwickler-Support, eine Online-Community und 24/7-Support für Premium-Benutzer. +Nethermind verfügt außerdem über eine [detaillierte Dokumentation](https://docs.nethermind.io), starken Entwickler-Support, eine Online-Community und 24/7-Support für Premium-Benutzer. ### Reth {#reth} -Reth (kurz für Rust Ethereum) ist eine Ethereum-Full-Node-Implementierung, die den Schwerpunkt auf Benutzerfreundlichkeit, hohe Modularität, Geschwindigkeit und Effizienz legt. Reth wurde ursprünglich von Paradigm entwickelt und vorangetrieben und ist unter den Apache- und MIT-Lizenzen lizenziert. +Reth (kurz für Rust Ethereum) ist eine Ethereum-Full-Node-Implementierung, die darauf ausgerichtet ist, benutzerfreundlich, hochgradig modular, schnell und effizient zu sein. Reth wurde ursprünglich von Paradigm entwickelt und vorangetrieben und ist unter den Apache- und MIT-Lizenzen lizenziert. -Reth ist einsatzbereit und für die Verwendung in geschäftskritischen Umgebungen wie Staking- oder Hochverfügbarkeitsdiensten geeignet. Es zeigt eine gute Bilanz in Anwendungsfällen auf, bei denen hohe Leistung mit großen Spielräumen erforderlich ist, wie z. B. RPC, MEV, Indizierung, Simulationen und P2P-Aktivitäten. +Reth ist produktionsbereit und eignet sich für den Einsatz in geschäftskritischen Umgebungen wie Staking oder Diensten mit hoher Verfügbarkeit. Es schneidet in Anwendungsfällen gut ab, in denen hohe Leistung mit großen Margen erforderlich ist, wie z. B. RPC, MEV, Indizierung, Simulationen und P2P-Aktivitäten. -Erfahren Sie mehr im [Reth Book](https://reth.rs/) oder im [Reth GitHub-Repo](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth). +Erfahren Sie mehr, indem Sie sich das [Reth Book](https://reth.rs/) oder das [Reth GitHub-Repository](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth) ansehen. ### In Entwicklung {#execution-in-development} -Diese Clients befinden sich noch in einer frühen Entwicklungsphase und sind derzeit nicht für den Einsatz in Produktionsumgebungen empfohlen. +Diese Clients befinden sich noch in einem frühen Entwicklungsstadium und werden noch nicht für den produktiven Einsatz empfohlen. #### EthereumJS {#ethereumjs} -Der EthereumJS Execution Client (EthereumJS) ist in TypeScript geschrieben und besteht aus mehreren Paketen. Dazu gehören grundlegende Ethereum-Basiskomponenten wie die Klassen Block, Transaktion und Merkle-Patricia Trie sowie zentrale Client-Komponenten wie eine Implementierung der Ethereum Virtual Machine (EVM), eine Blockchain-Klasse und der DevP2P-Netzwerk-Stack. +Der EthereumJS-Ausführungs-Client (EthereumJS) ist in TypeScript geschrieben und besteht aus einer Reihe von Paketen, einschließlich grundlegender Ethereum-Primitive, die durch die Klassen Block, Transaktion und Merkle-Patricia Trie repräsentiert werden, sowie Kern-Client-Komponenten, einschließlich einer Implementierung der Ethereum Virtual Machine (EVM), einer Blockchain-Klasse und dem DevP2P-Netzwerk-Stack. Erfahren Sie mehr darüber, indem Sie die [Dokumentation](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master) lesen. ## Konsens-Clients {#consensus-clients} -Es gibt mehrere Konsens-Clients (früher als „Eth2“-Clients bekannt), um die [Konsens-Upgrades](/roadmap/beacon-chain/) zu unterstützen. Sie sind für die gesamte konsensbezogene Logik verantwortlich, einschließlich des Fork-Choice-Algorithmus, der Verarbeitung von Attestierungen und der Verwaltung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Belohnungen und -Strafen. +Es gibt mehrere Konsens-Clients (früher bekannt als „Eth2“-Clients), um die [Konsens-Upgrades](/roadmap/beacon-chain/) zu unterstützen. Sie sind für die gesamte konsensbezogene Logik verantwortlich, einschließlich des Fork-Choice-Algorithmus, der Verarbeitung von Bestätigungen (Attestations) und der Verwaltung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Belohnungen und -Strafen. -| Client | Sprache | Betriebssysteme | Netzwerke | -| ------------------------------------------------------------- | ---------- | --------------------- | -------------------------------------------------------- | -| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, MacOS | Beacon Chain, Holesky, Pyrmont, Sepolia und mehr | -| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, MacOS | Beacon Chain, Holesky, Sepolia und mehr | -| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, MacOS | Beacon Chain, Holesky, Sepolia und mehr | -| [Prysm](https://prysm.offchainlabs.com/docs/) | Go | Linux, Windows, MacOS | Beacon Chain, Gnosis, Holesky, Pyrmont, Sepolia und mehr | -| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, MacOS | Beacon Chain, Gnosis, Holesky, Sepolia und mehr | -| [Grandine](https://docs.grandine.io/) | Rust | Linux, Windows, MacOS | Beacon Chain, Holesky, Sepolia und mehr | +| Client | Sprache | Betriebssysteme | Netzwerke | +| ------------------------------------------------------------- | ---------- | --------------------- | --------------------------------------------------------- | +| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, macOS | Beacon Chain, Hoodi, Pyrmont, Sepolia, und mehr | +| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, macOS | Beacon Chain, Hoodi, Sepolia, und mehr | +| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, macOS | Beacon Chain, Hoodi, Sepolia, und mehr | +| [Prysm](https://prysm.offchainlabs.com/docs/) | Go | Linux, Windows, macOS | Beacon Chain, Gnosis, Hoodi, Pyrmont, Sepolia, und mehr | +| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, macOS | Beacon Chain, Gnosis, Hoodi, Sepolia, und mehr | +| [Grandine](https://docs.grandine.io/) | Rust | Linux, Windows, macOS | Beacon Chain, Hoodi, Sepolia, und mehr | ### Lighthouse {#lighthouse} -Lighthouse ist eine Konsens-Client-Implementierung, die in Rust unter der Apache-2.0-Lizenz geschrieben ist. Sie wird von Sigma Prime gewartet und ist seit der Entstehung der Beacon Chain stabil und produktionsbereit. Lighthouse wird von verschiedenen Unternehmen, Staking-Pools und Einzelpersonen genutzt. Es soll sicher, leistungsfähig und interoperabel in einer Vielzahl von Umgebungen sein – von Desktop-PCs bis hin zu anspruchsvollen automatisierten Implementierungen. +Lighthouse ist eine Konsens-Client-Implementierung, die in Rust unter der Apache-2.0-Lizenz geschrieben wurde. Sie wird von Sigma Prime gepflegt und ist seit dem Genesis-Block der Beacon Chain stabil und produktionsbereit. Verschiedene Unternehmen, Staking-Pools und Einzelpersonen verlassen sich darauf. Sie zielt darauf ab, sicher, leistungsstark und interoperabel in einer Vielzahl von Umgebungen zu sein, von Desktop-PCs bis hin zu anspruchsvollen automatisierten Bereitstellungen. Die Dokumentation finden Sie im [Lighthouse Book](https://lighthouse-book.sigmaprime.io/) ### Lodestar {#lodestar} -Lodestar ist eine produktionsbereite Konsens-Client-Implementierung, die in Typescript unter der LGPL-3.0-Lizenz geschrieben wurde. Sie wird von ChainSafe Systems gewartet und ist der neueste der Konsensus-Clients für Solo-Staker, Entwickler und Forscher. Lodestar besteht aus einem Beacon-Knoten und einem Validator-Client, die auf JavaScript-Implementierungen von Ethereum-Protokollen basieren. Lodestar zielt darauf ab, die Benutzerfreundlichkeit von Ethereum mit leichten Clients zu verbessern, die Zugänglichkeit für eine größere Gruppe von Entwicklern zu erweitern und weiter zur Vielfalt des Ökosystems beizutragen. +Lodestar ist eine produktionsbereite Konsens-Client-Implementierung, die in TypeScript unter der LGPL-3.0-Lizenz geschrieben wurde. Sie wird von ChainSafe Systems gepflegt und ist der neueste der Konsens-Clients für Solo-Staker, Entwickler und Forscher. Lodestar besteht aus einem Beacon Node und einem Validator-Client, die auf JavaScript-Implementierungen von Ethereum-Protokollen basieren. Lodestar zielt darauf ab, die Benutzerfreundlichkeit von Ethereum mit Light Clients zu verbessern, die Zugänglichkeit für eine größere Gruppe von Entwicklern zu erweitern und weiter zur Vielfalt des Ökosystems beizutragen. Weitere Informationen finden Sie auf der [Lodestar-Website](https://lodestar.chainsafe.io/) ### Nimbus {#nimbus} -Nimbus ist eine Konsens-Client-Implementierung, geschrieben in Nim unter der Apache-2.0-Lizenz. Sie ist ein produktionsbereiter Client und wird von Solo-Stakern und Staking-Pools verwendet. Nimbus ist auf Ressourceneffizienz ausgelegt, so dass er auf ressourcenbeschränkten Geräten und in der Unternehmensinfrastruktur gleichermaßen leicht ausgeführt werden kann, ohne dass die Stabilität oder die Prämien-Leistung beeinträchtigt wird. Ein geringerer Ressourcenbedarf bedeutet, dass der Client eine größere Sicherheitsmarge hat, wenn das Netzwerk unter Belastung steht. +Nimbus ist eine Konsens-Client-Implementierung, die in Nim unter der Apache-2.0-Lizenz geschrieben wurde. Es ist ein produktionsbereiter Client, der von Solo-Stakern und Staking-Pools verwendet wird. Nimbus ist auf Ressourceneffizienz ausgelegt, sodass er problemlos auf ressourcenbeschränkten Geräten und in der Unternehmensinfrastruktur ausgeführt werden kann, ohne die Stabilität oder die Belohnungsleistung zu beeinträchtigen. Ein geringerer Ressourcenbedarf bedeutet, dass der Client eine größere Sicherheitsmarge hat, wenn das Netzwerk unter Stress steht. Erfahren Sie mehr in den [Nimbus-Dokumenten](https://nimbus.guide/) ### Prysm {#prysm} -Prysm ist ein vollwertiger, open-source Konsensclient, der in Go unter der GPL-3.0-Lizenz geschrieben wurde. Er verfügt über eine optionale Webapp-UI und legt großen Wert auf Benutzerfreundlichkeit, Dokumentation und Konfigurierbarkeit sowohl für Stake-at-Home- als auch für institutionelle Benutzer. +Prysm ist ein voll ausgestatteter Open-Source-Konsens-Client, der in Go unter der GPL-3.0-Lizenz geschrieben wurde. Er verfügt über eine optionale Web-App-Benutzeroberfläche und priorisiert Benutzererfahrung, Dokumentation und Konfigurierbarkeit sowohl für Heimanwender (Stake-at-Home) als auch für institutionelle Benutzer. -Besuchen Sie die [Prysm-Dokumente](https://prysm.offchainlabs.com/docs/), um mehr zu erfahren. +Besuchen Sie die [Prysm-Dokumentation](https://prysm.offchainlabs.com/docs/), um mehr zu erfahren. ### Teku {#teku} -Teku ist einer der ursprünglichen Clients der Beacon Chain-Genesis. Neben den üblichen Zielen (Sicherheit, Robustheit, Stabilität, Benutzerfreundlichkeit, Leistung) zielt Teku speziell darauf ab, alle verschiedenen Konsensclient-Standards vollständig zu erfüllen. +Teku ist einer der ursprünglichen Beacon Chain-Genesis-Clients. Neben den üblichen Zielen (Sicherheit, Robustheit, Stabilität, Benutzerfreundlichkeit, Leistung) zielt Teku speziell darauf ab, alle verschiedenen Konsens-Client-Standards vollständig zu erfüllen. -Teku bietet sehr flexible Einsatzmöglichkeiten. Der Beacon Node und der Validator-Client können zusammen als ein ein Prozess ausgeführt werden, was für Solo-Staker äußerst praktisch ist. Die Nodes können aber auch separat für anspruchsvolle Staking-Operationen ausgeführt werden. Zudem ist Teku vollständig interoperabel mit [Web3Signer](https://github.com/ConsenSys/web3signer/) für die Sicherheit von Signierschlüsseln und Slashing-Schutz. +Teku bietet sehr flexible Bereitstellungsoptionen. Der Beacon Node und der Validator-Client können zusammen als ein einziger Prozess ausgeführt werden, was für Solo-Staker äußerst praktisch ist, oder die Blockchain-Knoten können für anspruchsvolle Staking-Operationen separat ausgeführt werden. Darüber hinaus ist Teku vollständig interoperabel mit [Web3Signer](https://github.com/ConsenSys/web3signer/) für die Sicherheit von Signaturschlüsseln und den Slashing-Schutz. -Teku ist in Java unter der Apache 2.0 Lizenz geschrieben. Es wird vom Protokoll-Team bei ConsenSys entwickelt, das auch für Besu und Web3Signer verantwortlich ist. Erfahren Sie mehr in den [Teku-Dokumenten](https://docs.teku.consensys.net/en/latest/). +Teku ist in Java geschrieben und unter Apache 2.0 lizenziert. Es wird vom Protocols-Team bei ConsenSys entwickelt, das auch für Besu und Web3Signer verantwortlich ist. Erfahren Sie mehr in der [Teku-Dokumentation](https://docs.teku.consensys.net/en/latest/). ### Grandine {#grandine} -Grandine ist eine Konsens-Client-Implementierung, geschrieben in Rust und unter der GPL-3.0-Lizenz. Es wird vom Grandine Core Team gepflegt und ist schnell, leistungsstark und leicht. Es ist für eine Vielzahl von Stakern geeignet – von Einzelstakern, die ressourcenarme Geräte wie Raspberry Pi verwenden, bis hin zu großen institutionellen Stakern, die Zehntausende von Validatoren betreiben. +Grandine ist eine Konsens-Client-Implementierung, die in Rust unter der GPL-3.0-Lizenz geschrieben wurde. Sie wird vom Grandine Core Team gepflegt und ist schnell, leistungsstark und leichtgewichtig. Sie eignet sich für eine breite Palette von Stakern, von Solo-Stakern, die auf ressourcenarmen Geräten wie dem Raspberry Pi laufen, bis hin zu großen institutionellen Stakern, die Zehntausende von Validatoren betreiben. Die Dokumentation finden Sie im [Grandine Book](https://docs.grandine.io/) ## Synchronisationsmodi {#sync-modes} -Um die aktuellen Daten im Netzwerk zu verfolgen und zu überprüfen, muss sich der Ethereum-Client mit dem neuesten Netzwerkstatus synchronisieren. Dazu werden Daten von Peers heruntergeladen, wobei ihre Integrität kryptographisch verifiziert und eine lokale Blockchain-Datenbank aufgebaut wird. +Um aktuelle Daten im Netzwerk zu verfolgen und zu verifizieren, muss sich der Ethereum-Client mit dem neuesten Netzwerkstatus synchronisieren. Dies geschieht durch das Herunterladen von Daten von Peers, die kryptografisch auf ihre Integrität überprüft werden, und den Aufbau einer lokalen Blockchain-Datenbank. -Die Synchronisationsmodi stellen verschiedene Ansätze für diesen Prozess mit unterschiedlichen Kompromissen dar. Die Clients unterscheiden sich auch in der Implementierung von Synchronisationsalgorithmen. Beziehen Sie sich immer auf die offizielle Dokumentation des von Ihnen gewählten Clients, um Einzelheiten zur Implementierung zu erfahren. +Synchronisationsmodi stellen verschiedene Ansätze für diesen Prozess mit unterschiedlichen Kompromissen dar. Clients variieren auch in ihrer Implementierung von Synchronisationsalgorithmen. Beziehen Sie sich immer auf die offizielle Dokumentation Ihres gewählten Clients für spezifische Implementierungsdetails. ### Synchronisationsmodi der Ausführungsebene {#execution-layer-sync-modes} -Die Ausführungsebene kann in verschiedenen Modi betrieben werden, um unterschiedlichen Anwendungsfällen gerecht zu werden – vom erneuten Ausführen des globalen Status der Blockchain bis hin zum reinen Synchronisieren mit dem aktuellen Stand der Chain von einem vertrauenswürdigen Checkpoint aus. +Die Ausführungsebene kann in verschiedenen Modi ausgeführt werden, um unterschiedlichen Anwendungsfällen gerecht zu werden, von der erneuten Ausführung des Weltzustands der Blockchain bis hin zur reinen Synchronisation mit der Spitze der Chain von einem vertrauenswürdigen Checkpoint aus. -#### Vollständige Synchronisierung {#full-sync} +#### Full Sync {#full-sync} -Eine vollständige Synchronisierung lädt alle Blöcke (inklusive Header und Blockinhalten) herunter und regeneriert den Status der Blockchain schrittweise, indem jeder Block ab Genesis aufgeführt wird. +Ein Full Sync lädt alle Blöcke (einschließlich Header und Blockkörper) herunter und regeneriert den Status der Blockchain inkrementell, indem jeder Block ab dem Genesis-Block ausgeführt wird. -- Minimiert das Vertrauen und bietet höchste Sicherheit, indem jede Transaktion verifiziert wird. -- Bei einer steigenden Anzahl von Transaktionen kann es Tage bis Wochen dauern, alle Transaktionen zu bearbeiten. +- Minimiert das Vertrauen und bietet die höchste Sicherheit durch die Verifizierung jeder Transaktion. +- Mit einer zunehmenden Anzahl von Transaktionen kann es Tage bis Wochen dauern, alle Transaktionen zu verarbeiten. -[Archiv-Nodes](#archive-node) führen eine vollständige Synchronisierung durch, um eine komplette Historie der Zustandsänderungen zu erstellen (und zu behalten), die durch jede Transaktion in jedem Block vorgenommen wurden. +[Archive Nodes](#archive-node) führen einen Full Sync durch, um eine vollständige Historie der Statusänderungen aufzubauen (und beizubehalten), die durch jede Transaktion in jedem Block vorgenommen wurden. -#### Schnelle Synchronisierung {#fast-sync} +#### Fast Sync {#fast-sync} -Wie bei einer vollständigen Synchronisierung lädt eine schnelle Synchronisierung alle Blöcke herunter (einschließlich Header, Transaktionen und Belegen). Anstatt jedoch die historischen Transaktionen neu zu verarbeiten, verlässt sich eine schnelle Synchronisierung auf die Belege, bis sie einen aktuellen Head erreicht hat. Danach beginnt sie, Blöcke zu importieren und zu verarbeiten, um einen vollständigen Node bereitzustellen. +Wie ein Full Sync lädt ein Fast Sync alle Blöcke (einschließlich Header, Transaktionen und Belege) herunter. Anstatt jedoch die historischen Transaktionen neu zu verarbeiten, verlässt sich ein Fast Sync auf die Belege, bis er einen aktuellen Head erreicht, woraufhin er zum Importieren und Verarbeiten von Blöcken wechselt, um einen Full Node bereitzustellen. -- Schnelle Synchronisierung – Strategie. +- Schnelle Synchronisationsstrategie. - Reduziert den Verarbeitungsbedarf zugunsten der Bandbreitennutzung. -#### Snap-Synchronisierung {#snap-sync} +#### Snap Sync {#snap-sync} -Snap-Synchronisierungen überprüfen ebenfalls die Chain Block für Block. Anstatt jedoch beim Genesis-Block zu beginnen, startet eine Snap-Synchronisierung bei einem aktuelleren „vertrauenswürdigen“ Checkpoint, von dem bekannt ist, dass er Teil der echten Blockchain ist. Der Knoten speichert in regelmäßigen Abständen Prüfpunkte und löscht dabei Daten, die älter als ein bestimmtes Alter sind. Diese Snapshots werden verwendet, um Statusdaten nach Bedarf wiederherzustellen, anstatt sie für immer zu speichern. +Snap Syncs verifizieren die Chain ebenfalls Block für Block. Anstatt jedoch beim Genesis-Block zu beginnen, startet ein Snap Sync bei einem neueren „vertrauenswürdigen“ Checkpoint, von dem bekannt ist, dass er Teil der wahren Blockchain ist. Der Blockchain-Knoten speichert regelmäßige Checkpoints und löscht Daten, die älter als ein bestimmtes Alter sind. Diese Snapshots werden verwendet, um Statusdaten bei Bedarf neu zu generieren, anstatt sie für immer zu speichern. -- Schnellste Synchronisierungsstrategie, derzeit Standard im Ethereum-Mainnet. -- Spart eine Menge Festplattenkapazität und Netzwerkbandbreite, ohne die Sicherheit zu beeinträchtigen. +- Schnellste Synchronisationsstrategie, derzeit Standard im Ethereum-Mainnet. +- Spart viel Speicherplatz und Netzwerkbandbreite, ohne die Sicherheit zu beeinträchtigen. -[Mehr zur Snap-Synchronisierung](https://github.com/ethereum/devp2p/blob/master/caps/snap.md). +[Mehr zu Snap Sync](https://github.com/ethereum/devp2p/blob/master/caps/snap.md). -#### Light-Synchronisierung {#light-sync} +#### Light Sync {#light-sync} -Der Light-Client-Modus lädt alle Block-Header und Blockdaten herunter und prüft einige davon nach Zufallsprinzip. Synchronisiert nur die Spitze der Chain vom vertrauenswürdigen Kontrollpunkt. +Der Light-Client-Modus lädt alle Block-Header und Blockdaten herunter und verifiziert einige davon zufällig. Synchronisiert nur die Spitze der Chain vom vertrauenswürdigen Checkpoint aus. -- Ruft nur den neuesten Zustand ab und verlässt sich dabei auf das Vertrauen in die Entwickler und den Konsensmechanismus. +- Ruft nur den neuesten Status ab und verlässt sich dabei auf das Vertrauen in die Entwickler und den Konsensmechanismus. - Der Client ist in wenigen Minuten mit dem aktuellen Netzwerkstatus einsatzbereit. -**Hinweis:** Die Light-Synchronisierung funktioniert noch nicht mit Proof-of-Stake-Ethereum – neue Versionen der Light-Synchronisierung sollten bald ausgeliefert werden! +**Hinweis:** Light Sync funktioniert noch nicht mit Proof-of-Stake-Ethereum – neue Versionen von Light Sync sollten bald veröffentlicht werden! [Mehr zu Light Clients](/developers/docs/nodes-and-clients/light-clients/) ### Synchronisationsmodi der Konsensebene {#consensus-layer-sync-modes} -#### Optimistische Synchronisierung {#optimistic-sync} +#### Optimistic Sync {#optimistic-sync} -Die „optimistische“ Synchronisierung ist eine Synchronisierungsstrategie nach der Zusammenführung, die als Opt-in und rückwärtskompatibel konzipiert ist und es Ausführungsknoten ermöglicht, sich über etablierte Methoden zu synchronisieren. Die Ausführungs-Engine kann Beacon-Blöcke _optimistisch_ importieren, ohne sie vollständig zu verifizieren, den neuesten Head finden und dann mit der Synchronisierung der Chain mit den oben genannten Methoden beginnen. Nachdem der Ausführungsclient aufgeholt hat, informiert er den Konsensclient über die Gültigkeit der Transaktionen auf der Beacon Chain. +Optimistic Sync ist eine Post-Merge-Synchronisationsstrategie, die als Opt-in und abwärtskompatibel konzipiert ist und es Ausführungsknoten ermöglicht, sich über etablierte Methoden zu synchronisieren. Die Execution Engine kann Beacon-Blöcke _optimistisch_ importieren, ohne sie vollständig zu verifizieren, den neuesten Head finden und dann beginnen, die Chain mit den oben genannten Methoden zu synchronisieren. Nachdem der Ausführungs-Client aufgeholt hat, informiert er den Konsens-Client über die Gültigkeit der Transaktionen in der Beacon Chain. -[Mehr zur optimistischen Synchronisierung](https://github.com/ethereum/consensus-specs/blob/master/sync/optimistic.md) +[Mehr zu Optimistic Sync](https://github.com/ethereum/consensus-specs/blob/master/sync/optimistic.md) -#### Checkpoint-Synchronisierung {#checkpoint-sync} +#### Checkpoint Sync {#checkpoint-sync} -Eine Checkpoint-Synchronisierung, auch bekannt als schwache Subjektivitätssynchronisierung, bietet eine überlegene Benutzererfahrung bei der Beacon-Node-Synchronisierung. Sie basiert auf Annahmen der [schwachen Subjektivität](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/), die das Synchronisieren der Beacon Chain von einem aktuellen Checkpoint mit schwacher Subjektivität anstelle des Genesis-Blocks ermöglicht. Checkpoint-Synchronisierungen machen die anfängliche Synchronisierungszeit erheblich schneller, mit ähnlichen Vertrauensannahmen wie bei der Synchronisierung vom [Genesis-Block](/glossary/#genesis-block). +Ein Checkpoint Sync, auch bekannt als Weak Subjectivity Sync, schafft eine überlegene Benutzererfahrung für die Synchronisation eines Beacon Nodes. Er basiert auf Annahmen der [schwachen Subjektivität (Weak Subjectivity)](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/), die es ermöglichen, die Beacon Chain von einem kürzlichen Weak-Subjectivity-Checkpoint anstelle des Genesis-Blocks zu synchronisieren. Checkpoint Syncs machen die anfängliche Synchronisationszeit deutlich schneller, bei ähnlichen Vertrauensannahmen wie bei der Synchronisation ab dem [Genesis-Block](/glossary/#genesis-block). -In der Praxis bedeutet dies, dass Ihr Knoten eine Verbindung zu einem entfernten Dienst herstellt, um die letzten abgeschlossenen Zustände herunterzuladen und die Daten ab diesem Punkt weiter zu überprüfen. Der Drittanbieter, der die Daten bereitstellt, ist vertrauenswürdig und sollte sorgfältig ausgewählt werden. +In der Praxis bedeutet dies, dass sich Ihr Blockchain-Knoten mit einem Remote-Dienst verbindet, um aktuelle finalisierte Status herunterzuladen, und von diesem Punkt an mit der Verifizierung der Daten fortfährt. Dem Drittanbieter, der die Daten bereitstellt, wird vertraut, und er sollte sorgfältig ausgewählt werden. -Mehr zur [Checkpoint-Synchronisierung](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) +Mehr zu [Checkpoint Sync](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ethereum 101 – Teil 2 – Nodes verstehen](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– Wil Barnes, 13. Februar 2019_ -- [Ethereum Full Nodes betreiben: Eine Anleitung für die kaum Motivierten](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ +- [Ethereum 101 - Teil 2 - Blockchain-Knoten verstehen](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– Wil Barnes, 13. Februar 2019_ +- [Ethereum Full Nodes betreiben: Ein Leitfaden für die kaum Motivierten](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ ## Verwandte Themen {#related-topics} @@ -316,4 +316,4 @@ Mehr zur [Checkpoint-Synchronisierung](https://notes.ethereum.org/@djrtwo/ws-syn ## Verwandte Tutorials {#related-tutorials} -- [Verwandeln Sie Ihren Raspberry Pi 4 in einen Validator-Node, indem Sie einfach die MicroSD-Karte flashen – Installationsanleitung](/developers/tutorials/run-node-raspberry-pi/) _– Flashen Sie Ihren Raspberry Pi 4, stecken Sie ein Ethernet-Kabel ein, schließen Sie die SSD-Festplatte an und schalten Sie das Gerät ein, um den Raspberry Pi 4 in einen vollwertigen Ethereum-Node zu verwandeln, der die Ausführungsebene (Mainnet) und/oder die Konsensebene (Beacon Chain/Validator) ausführt._ +- [Verwandeln Sie Ihren Raspberry Pi 4 in einen Validator-Knoten, indem Sie einfach die MicroSD-Karte flashen – Installationsanleitung](/developers/tutorials/run-node-raspberry-pi/) _– Flashen Sie Ihren Raspberry Pi 4, schließen Sie ein Ethernet-Kabel an, verbinden Sie die SSD-Festplatte und schalten Sie das Gerät ein, um den Raspberry Pi 4 in einen vollständigen Ethereum-Blockchain-Knoten zu verwandeln, der die Ausführungsebene (Mainnet) und/oder die Konsensebene (Beacon Chain / Validator) ausführt._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md index 8879e93c0ba..af15d28ca2c 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md @@ -1,61 +1,61 @@ --- -title: Leichte Clients -description: "Einführung zu leichten Clients von Ethereum." +title: Light Clients +description: "Einführung in Ethereum Light Clients." lang: de --- -Der Betrieb eines vollständigen Knotens ist die vertrauenswürdigste, dezentralste, privateste und zensurresistenteste Möglichkeit, um mit Ethereum zu interagieren. Mit einem vollständigen Knoten können Sie Ihre eigene Kopie der Blockchain behalten. Auf dieser können sie Abfragen direkt ausführen und Sie haben einen direkten Zugriff auf das Peer-to-Peer-Netzwerk von Ethereum. Jedoch erfordert der Betrieb eines vollständigen Knotens eine signifikante Menge an Arbeitsspeicher, Speicherplatz und CPU. Das bedeutet, dass es nicht für jeden möglich ist seinen eigenen Knoten zu betreiben. Es gibt mehrere Lösungen dazu in der Ethereum-Roadmap, dazu gehört auch die Zustandslosigkeit, jedoch sind diese noch Jahre von ihrer Implementierung entfernt. Die kurzfristige Lösung dazu ist, einige Vorteile eines vollständigen Knotens mit großen Leistungsverbesserungen, die es ermöglichen einen Knoten mit sehr geringen Hardware-Anforderungen zu betreiben, einzutauschen. Knoten, die diesen Kompromiss erzielen, werden leichte Knoten (Light Nodes) genannt. +Einen vollständigen Blockchain-Knoten (Full Node) zu betreiben, ist die vertrauensloseste, privateste, dezentralisierteste und zensurresistenteste Art, mit [Ethereum](/) zu interagieren. Mit einem vollständigen Blockchain-Knoten behalten Sie Ihre eigene Kopie der Blockchain, die Sie sofort abfragen können, und Sie erhalten direkten Zugang zum Peer-to-Peer-Netzwerk von Ethereum. Der Betrieb eines vollständigen Blockchain-Knotens erfordert jedoch eine erhebliche Menge an Arbeitsspeicher, Speicherplatz und CPU-Leistung. Das bedeutet, dass es nicht für jeden machbar ist, einen eigenen Blockchain-Knoten zu betreiben. Es gibt mehrere Lösungen dafür auf der Ethereum-Roadmap, einschließlich Zustandslosigkeit (Statelessness), aber deren Implementierung ist noch einige Jahre entfernt. Die kurzfristige Antwort besteht darin, einige der Vorteile des Betriebs eines vollständigen Blockchain-Knotens gegen große Leistungsverbesserungen einzutauschen, die es ermöglichen, Blockchain-Knoten mit sehr geringen Hardwareanforderungen zu betreiben. Blockchain-Knoten, die diesen Kompromiss eingehen, werden als Light Nodes (leichte Knoten) bezeichnet. -## Was ist ein Light-Client? {#what-is-a-light-client} +## Was ist ein Light Client? {#what-is-a-light-client} -Ein leichter Knoten ist ein Knoten, der auf der Software eines leichten Clients betrieben werden kann. Statt lokale Kopien der gesamten Daten der Blockchain zu speichern und unabhängig alle Änderungen mitzuverfolgen, fragen sie die notwendigen Daten von irgendeinem Anbieter ab. Der Anbieter könnte eine direkte Verbindung zu einem vollständigen Knoten oder irgendein zentraler RPC-Server sein. Die Daten werden dann vom leichten Knoten verifiziert. Dadurch kann er mit der Spitze der Blockchain mithalten. Der leichte Knoten verarbeitet nur Block-Header und lädt gelegentlich die echten Inhalte des Blocks herunter. Die Leichtigkeit der Nodes kann variieren, abhängig von den Kombinationen der Light- und vollständigen Client-Software, die sie ausführen. Zum Beispiel würde die leichteste Konfiguration darin bestehen, einen leichten Ausführungs-, sowie Konsensclient zu betreiben. Es ist auch wahrscheinlich, dass viele Knoten sich entscheiden, einen leichten Konsensclient mit einem vollen Ausführungsclient oder andersherum zu betreiben. +Ein Light Node ist ein Blockchain-Knoten, auf dem Light-Client-Software ausgeführt wird. Anstatt lokale Kopien der Blockchain-Daten aufzubewahren und alle Änderungen unabhängig zu verifizieren, fordern sie die erforderlichen Daten stattdessen von einem Anbieter an. Der Anbieter kann eine direkte Verbindung zu einem vollständigen Blockchain-Knoten oder über einen zentralisierten RPC-Server sein. Die Daten werden dann vom Light Node verifiziert, sodass er mit der Spitze der Chain Schritt halten kann. Der Light Node verarbeitet nur Block-Header und lädt nur gelegentlich die tatsächlichen Blockinhalte herunter. Blockchain-Knoten können in ihrer "Leichtigkeit" variieren, abhängig von den Kombinationen aus Light- und Full-Client-Software, die sie ausführen. Die leichteste Konfiguration wäre beispielsweise die Ausführung eines leichten Ausführungs-Clients und eines leichten Konsens-Clients. Es ist auch wahrscheinlich, dass viele Blockchain-Knoten sich dafür entscheiden werden, leichte Konsens-Clients mit vollständigen Ausführungs-Clients auszuführen oder umgekehrt. -## Wie funktionieren leichte Clients? {#how-do-light-clients-work} +## Wie funktionieren Light Clients? {#how-do-light-clients-work} -Als Ethereum damit begann, einen auf Proof-of-Stake basierenden Konsensmechanismus zu nutzen, wurde neue Infrastruktur, vor allem für leichte Clients, aufgebaut. Dabei wird alle 1,1 Tage zufällig eine Teilmenge von 512 Validatoren ausgewählt, die als **Synchronisierungskomitee** fungiert. Das Synchronisierungskomitee unterschreibt den Header von den letzten Blöcken. Jeder Block-Header enthält die aggregierte Signatur der Validatoren im Synchronisierungskomitee und ein "Bitfeld", das anzeigt, welche Validatoren unterschrieben haben und welche nicht. Jeder Header beinhaltet auch eine Liste von Validatoren, von denen erwartet wird, den nächsten Block zu unterschreiben. Das bedeutet, dass ein leichter Client schnell sehen kann, dass das Synchronisierungskomitee den empfangenen Daten zustimmt und dass sie auch überprüfen können, ob das Synchronisierungskomitee das Original ist, indem sie die empfangenen mit den im letzten Block erwarteten Daten vergleichen. So kann der leichte Client sein Wissen über den letzten Ethereum-Block immer wieder erneuern, ohne den Block selbst, sondern nur den Header, herunterzuladen. +Als Ethereum begann, einen auf Proof-of-Stake basierenden Konsensmechanismus zu verwenden, wurde eine neue Infrastruktur speziell zur Unterstützung von Light Clients eingeführt. Dies funktioniert, indem alle 1,1 Tage zufällig eine Teilmenge von 512 Validatoren ausgewählt wird, die als **Sync-Komitee** (Sync Committee) fungieren. Das Sync-Komitee signiert den Header der neuesten Blöcke. Jeder Block-Header enthält die aggregierte Signatur der Validatoren im Sync-Komitee und ein "Bitfeld", das zeigt, welche Validatoren signiert haben und welche nicht. Jeder Header enthält auch eine Liste von Validatoren, von denen erwartet wird, dass sie an der Signierung des nächsten Blocks teilnehmen. Das bedeutet, dass ein Light Client schnell erkennen kann, dass das Sync-Komitee die empfangenen Daten abgezeichnet hat, und er kann auch überprüfen, ob das Sync-Komitee das echte ist, indem er das empfangene mit dem vergleicht, das er im vorherigen Block erwarten sollte. Auf diese Weise kann der Light Client sein Wissen über den neuesten Ethereum-Block ständig aktualisieren, ohne den Block selbst herunterzuladen, sondern nur den Header, der zusammenfassende Informationen enthält. -Auf der Ausführungsebene gibt es keine einzige Spezifikation für einen leichten Ausführungsclient. Der Anwendungsbereich eines leichten Ausführungsclients kann ein „leichter Modus“ eines vollständigen Ausführungsclients sein, der über das gesamte EVM und alle Netzwerkfunktionen eines vollständigen Knotens verfügt, jedoch nur die Block Header verifiziert. Es kann jedoch auch ein stärker zerlegter Client sein, der sich stark darauf stützt, Anfragen an einen RPC-Anbieter weiterzuleiten, um mit Ethereum zu interagieren. +Auf der Ausführungsebene gibt es keine einheitliche Spezifikation für einen leichten Ausführungs-Client. Der Umfang eines leichten Ausführungs-Clients kann von einem "Light-Modus" eines vollständigen Ausführungs-Clients variieren, der über die gesamte EVM- und Netzwerkfunktionalität eines vollständigen Blockchain-Knotens verfügt, aber nur Block-Header verifiziert, ohne die zugehörigen Daten herunterzuladen, oder es kann ein stärker reduzierter Client sein, der sich stark auf die Weiterleitung von Anfragen an einen RPC-Anbieter verlässt, um mit Ethereum zu interagieren. -## Warum sind leichte Clients so wichtig? {#why-are-light-clients-important} +## Warum sind Light Clients wichtig? {#why-are-light-clients-important} -Leichte Clients sind wichtig, da sie Nutzern ermöglichen, eingehende Daten zu verifizieren, statt der Echtheit der Daten des Anbieters blind zu vertrauen. Dabei benötigen sie nur einen Bruchteil der rechnerischen Ressourcen eines vollständigen Knotens. Die Daten, die leichte Clients empfangen, können anhand von Block-Headern überprüft werden, von denen sie wissen, dass mindestens 2/3 einer zufälligen Menge von 512 Ethereum-Validatoren richtig unterschrieben wurden. Das ist ein sehr starker Beweis dafür, dass die Daten korrekt sind. +Light Clients sind wichtig, weil sie es Benutzern ermöglichen, eingehende Daten zu verifizieren, anstatt blind darauf zu vertrauen, dass ihr Datenanbieter korrekt und ehrlich ist, während sie nur einen winzigen Bruchteil der Rechenressourcen eines vollständigen Blockchain-Knotens verbrauchen. Die Daten, die Light Clients erhalten, können mit Block-Headern abgeglichen werden, von denen sie wissen, dass sie von mindestens 2/3 einer zufälligen Gruppe von 512 Ethereum-Validatoren signiert wurden. Dies ist ein sehr starker Beweis dafür, dass die Daten korrekt sind. -Der leichte Client nutzt nur eine kleine Menge an Rechenstärke, Arbeitsspeicher und Speicherplatz, deshalb kann er sogar auf einer Anwendung oder im Browser eines Mobiltelefons ausgeführt werden. Leichte Clients ermöglichen vertrauensminimierten Zugriff auf Ethereum, genauso reibungslos wie einfach einem Drittanbieter zu vertrauen. +Der Light Client verbraucht nur eine winzige Menge an Rechenleistung, Arbeitsspeicher und Speicherplatz, sodass er auf einem Mobiltelefon ausgeführt, in eine App eingebettet oder als Teil eines Browsers verwendet werden kann. Light Clients sind eine Möglichkeit, den vertrauensminimierten Zugang zu Ethereum genauso reibungslos zu gestalten wie das Vertrauen in einen Drittanbieter. -Lassen Sie uns ein einfaches Beispiel nehmen. Stellen Sie sich vor, Sie wollen das Guthaben Ihres Accounts überprüfen. Dafür müssen sie eine Anfrage an einen Ethereum-Knoten stellen. Dieser Knoten wird seine lokale Kopie des Ethereum-Zustands nach Ihrem Guthaben überprüfen und dieses an Sie weiterleiten. Wenn Sie keinen direkten Zugriff auf einen Knoten haben, gibt es zentrale Betreiber, die diese Daten als Service anbieten. Sie können ihnen eine Anfrage schicken, die Betreiber überprüfen dann den Knoten und leiten die Ergebnisse an Sie weiter. Das Problem dabei ist, dass Sie dem Anbieter vertrauen müssen, Ihnen die korrekten Informationen zu geben. Sie wissen nie, ob die Informationen korrekt sind, wenn Sie sie nicht selbst verifizieren können. +Nehmen wir ein einfaches Beispiel. Stellen Sie sich vor, Sie möchten Ihren Kontostand überprüfen. Dazu müssen Sie eine Anfrage an einen Ethereum-Blockchain-Knoten stellen. Dieser Blockchain-Knoten überprüft seine lokale Kopie des Ethereum-Zustands auf Ihren Kontostand und gibt ihn an Sie zurück. Wenn Sie keinen direkten Zugang zu einem Blockchain-Knoten haben, gibt es zentralisierte Betreiber, die diese Daten als Dienstleistung anbieten. Sie können eine Anfrage an sie senden, sie überprüfen ihren Blockchain-Knoten und senden das Ergebnis an Sie zurück. Das Problem dabei ist, dass Sie dann darauf vertrauen müssen, dass der Anbieter Ihnen die richtigen Informationen gibt. Sie können nie wirklich wissen, ob die Informationen korrekt sind, wenn Sie sie nicht selbst verifizieren können. -Ein leichter Client behebt dieses Problem. Sie können die Daten immer noch von einem externen Anbieter abfragen, sobald Sie jedoch die Daten erhalten, kommen diese mit einem Beweis, den Ihr leichter Knoten anhand der Informationen, die er vom Block-Header erhalten hat, überprüft. Statt eines vertrauten Betreibers wird Ethereum die Richtigkeit Ihrer Daten überprüfen. +Ein Light Client löst dieses Problem. Sie fordern weiterhin Daten von einem externen Anbieter an, aber wenn Sie die Daten zurückerhalten, sind sie mit einem Nachweis versehen, den Ihr Light Node mit den Informationen abgleichen kann, die er im Block-Header erhalten hat. Das bedeutet, dass Ethereum die Richtigkeit Ihrer Daten verifiziert und nicht ein vertrauenswürdiger Betreiber. -## Welche Innovationen ermöglichen leichte Clients? {#what-innovations-do-light-clients-enable} +## Welche Innovationen ermöglichen Light Clients? {#what-innovations-do-light-clients-enable} -Der Hauptvorteil von leichten Clients ist, dass mehr Menschen unabhängigen Zugriff auf Ethereum bekommen können. Dabei sind die Hardware-Anforderungen überschaubar und die Abhängigkeit von Dritten minimal. Das ist gut für Nutzer, da diese ihre eigenen Daten verifizieren können, und gut für das Netzwerk, da es mehr und vielfältige Knoten gibt, die die Blockchain verifizieren. +Der Hauptvorteil von Light Clients besteht darin, dass mehr Menschen unabhängig auf Ethereum zugreifen können, mit vernachlässigbaren Hardwareanforderungen und minimaler Abhängigkeit von Dritten. Dies ist gut für die Benutzer, da sie ihre eigenen Daten verifizieren können, und es ist gut für das Netzwerk, da es die Anzahl und Vielfalt der Blockchain-Knoten erhöht, die die Chain verifizieren. -Die Möglichkeit, Ethereum-Knoten auf Geräten mit minimalem Speicherplatz, Arbeitsspeicher und Rechenleistung zu betreiben, ist einer der großen Innovationsbereiche, die von leichten Clients ermöglicht werden. Während Ethereum-Knoten heute große Mengen an Rechenressourcen benötigen, könnten leichte Clients in Browser eingebettet werden und auch auf Mobiltelefonen oder kleineren Geräten wie Smart Watches laufen. Das bedeutet, dass Ethereum Wallets mit integrierten Clients auch auf Mobiltelefonen betrieben werden könnten. Das bedeutet, dass mobile Wallets viel dezentraler sein könnten, da sie sich nicht auf einen Datenanbieter für ihre Daten verlassen müssen. +Die Fähigkeit, Ethereum-Blockchain-Knoten auf Geräten mit sehr geringem Speicherplatz, Arbeitsspeicher und Rechenleistung auszuführen, ist einer der wichtigsten Innovationsbereiche, die durch Light Clients erschlossen werden. Während Ethereum-Blockchain-Knoten heute viele Rechenressourcen benötigen, könnten Light Clients in Browser eingebettet, auf Mobiltelefonen und vielleicht sogar auf kleineren Geräten wie Smartwatches ausgeführt werden. Das bedeutet, dass Ethereum-Wallets mit eingebetteten Clients auf einem Mobiltelefon laufen könnten. Dies bedeutet, dass mobile Wallets viel dezentralisierter sein könnten, da sie für ihre Daten keinen zentralisierten Datenanbietern vertrauen müssten. -Eine Erweiterung davon ist die Unterstützung von **Internet-der-Dinge (IoT)**-Geräten. Ein leichter Client könnte verwendet werden, um schnell das Eigentum an einem Token-Guthaben oder einem NFT beweisen zu können. Mit all den Sicherheiten, die Synchronisierungskomitees anbieten, könnten leichte Clients Veränderungen am IoT hervorrufen. Stellen Sie sich einen [Fahrradverleih](https://youtu.be/ZHNrAXf3RDE?t=929) vor, der eine App mit einem eingebetteten Light-Client nutzt, um schnell zu verifizieren, dass Sie den NFT des Verleihdienstes besitzen und, falls dies der Fall ist, ein Fahrrad für Sie freischaltet, mit dem Sie losfahren können! +Eine Erweiterung davon ist die Ermöglichung von **Internet of Things (IoT)**-Geräten. Ein Light Client könnte verwendet werden, um schnell den Besitz eines Token-Guthabens oder NFTs nachzuweisen, mit allen Sicherheitsgarantien, die von den Sync-Komitees bereitgestellt werden, und so eine Aktion in einem IoT-Netzwerk auszulösen. Stellen Sie sich einen [Fahrradverleih](https://youtu.be/ZHNrAXf3RDE?t=929) vor, der eine App mit einem eingebetteten Light Client verwendet, um schnell zu verifizieren, dass Sie das NFT des Verleihs besitzen, und wenn ja, ein Fahrrad für Sie freischaltet, mit dem Sie losfahren können! -Ethereum-Rollups würden ebenfalls von leichten Clients profitieren. Eines der großen Probleme für Rollups war, dass es bereits Angriffe auf die Brücken gab, die den Transfer von Anlagen vom Ethereum-Hauptnetz zu einem Rollup erlauben. Eine Schwachstelle sind die Oracles, die Rollups verwenden, um zu erkennen, ob ein Benutzer eine Einzahlung auf die Brücke vorgenommen hat. Wenn ein Oracle falsche Daten einspeist, könnte es dem Rollup vorgaukeln, dass eine Einzahlung auf die Brücke stattgefunden hat, und die Mittel fälschlicherweise freigeben. Ein in das Rollup eingebetteter leichter Client könnte zum Schutz vor korrupten Oracles verwendet werden, da die Einzahlung in die Brücke mit einem Nachweis versehen werden könnte, der vom Rollup vor der Freigabe von Token überprüft werden kann. Das gleiche Konzept könnte auch auf andere Brücken innerhalb der Blockchain angewendet werden. +Ethereum-Rollups würden ebenfalls von Light Clients profitieren. Eines der großen Probleme für Rollups waren Hacks, die auf die kettenübergreifenden Brücken abzielten, die den Transfer von Geldern vom Ethereum-Mainnet zu einem Rollup ermöglichen. Eine Schwachstelle sind die Orakel, die Rollups verwenden, um zu erkennen, dass ein Benutzer eine Einzahlung in die kettenübergreifende Brücke getätigt hat. Wenn ein Orakel falsche Daten liefert, könnte es das Rollup täuschen und glauben machen, dass es eine Einzahlung in die kettenübergreifende Brücke gab, und fälschlicherweise Gelder freigeben. Ein in das Rollup eingebetteter Light Client könnte verwendet werden, um sich vor korrumpierten Orakeln zu schützen, da die Einzahlung in die kettenübergreifende Brücke mit einem Nachweis versehen sein könnte, der vom Rollup verifiziert werden kann, bevor Token freigegeben werden. Dasselbe Konzept könnte auch auf andere kettenübergreifende Brücken angewendet werden. -Leichte Clients könnten auch dazu verwendet werden, Ethereum-Wallets zu aktualisieren. Anstatt den von einem RPC-Provider bereitgestellten Daten zu vertrauen, könnte Ihre Wallet die Ihnen präsentierten Daten direkt mit einem eingebetteten leichten Client verifizieren. Dies würde die Sicherheit Ihrer Wallet erhöhen. Wenn Ihr RPC-Anbieter unehrlich war und Ihnen falsche Daten geliefert hat, könnte der eingebettete leichte Client Sie darüber informieren! +Light Clients könnten auch verwendet werden, um Ethereum-Wallets zu aktualisieren. Anstatt Daten zu vertrauen, die von einem RPC-Anbieter bereitgestellt werden, könnte Ihr Wallet die Ihnen präsentierten Daten mithilfe eines eingebetteten Light Clients direkt verifizieren. Dies würde die Sicherheit Ihres Wallets erhöhen. Wenn Ihr RPC-Anbieter unehrlich wäre und Ihnen falsche Daten liefern würde, könnte der eingebettete Light Client Sie darauf hinweisen! -## Wie ist der aktuelle Stand der Entwicklung von leichten Clients? {#current-state-of-development} +## Wie ist der aktuelle Stand der Light-Client-Entwicklung? {#current-state-of-development} -Es befinden sich mehrere leichte Clients in der Entwicklung, darunter Ausführungs-, Konsens- und kombinierte Ausführungs-/Konsens-Light-Clients. Dies sind die Light-Client-Implementierungen, von denen wir zum Zeitpunkt der Erstellung dieser Seite wissen: +Es befinden sich mehrere Light Clients in der Entwicklung, darunter Ausführungs-, Konsens- und kombinierte Ausführungs-/Konsens-Light-Clients. Dies sind die Light-Client-Implementierungen, die uns zum Zeitpunkt des Schreibens dieser Seite bekannt sind: - [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): Konsens-Light-Client in TypeScript - [Helios](https://github.com/a16z/helios): kombinierter Ausführungs- und Konsens-Light-Client in Rust -- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): Light-Modus für Ausführungs-Klient (in Entwicklung) in Go +- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): Light-Modus für Ausführungs-Client (in Entwicklung) in Go - [Nimbus](https://nimbus.guide/el-light-client.html): Konsens-Light-Client in Nim -Unseres Wissens nach ist noch keiner dieser Clients produktionsreif. +Nach unserem Kenntnisstand gilt noch keiner davon als produktionsreif. -Es wird auch intensiv daran gearbeitet, die Art und Weise zu verbessern, wie leichte Clients auf Ethereum-Daten zugreifen können. Derzeit sind Light-Clients auf RPC-Anfragen an Full Nodes angewiesen, die ein Client-Server-Modell verwenden. In Zukunft könnten die Daten jedoch dezentraler über ein dediziertes Netzwerk wie das [Portal Network](https://www.ethportal.net/) angefordert werden, welches die Daten über ein Peer-to-Peer-Gossip-Protokoll an Light-Clients bereitstellen könnte. +Es wird auch viel daran gearbeitet, die Möglichkeiten zu verbessern, wie Light Clients auf Ethereum-Daten zugreifen können. Derzeit verlassen sich Light Clients auf RPC-Anfragen an vollständige Blockchain-Knoten unter Verwendung eines Client/Server-Modells, aber in Zukunft könnten die Daten auf dezentralisiertere Weise über ein dediziertes Netzwerk wie das [Portal Network](https://www.ethportal.net/) angefordert werden, das die Daten den Light Clients über ein Peer-to-Peer-Gossip-Protokoll zur Verfügung stellen könnte. -Andere Punkte auf der [Roadmap](/roadmap/) wie [Verkle-Bäume](/roadmap/verkle-trees/) und [Zustandslosigkeit](/roadmap/statelessness/) werden die Sicherheitsgarantien von Light-Clients schließlich denen von vollständigen Clients angleichen. +Andere Punkte auf der [Roadmap](/roadmap/) wie [Verkle-Bäume](/roadmap/verkle-trees/) und [Zustandslosigkeit](/roadmap/statelessness/) werden die Sicherheitsgarantien von Light Clients letztendlich an die von Full Clients angleichen. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Zsolt Felfodhi über Geth Light-Clients](https://www.youtube.com/watch?v=EPZeFXau-RE) -- [Etan Kissling über Light-Client-Networking](https://www.youtube.com/watch?v=85MeiMA4dD8) -- [Etan Kissling über Light-Clients nach der Zusammenführung](https://www.youtube.com/watch?v=ZHNrAXf3RDE) -- [Piper Merriam: Der kurvenreiche Weg zu funktionalen Light-Clients](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) +- [Zsolt Felfodhi über Geth Light Clients](https://www.youtube.com/watch?v=EPZeFXau-RE) +- [Etan Kissling über Light-Client-Netzwerke](https://www.youtube.com/watch?v=85MeiMA4dD8) +- [Etan Kissling über Light Clients nach The Merge](https://www.youtube.com/watch?v=ZHNrAXf3RDE) +- [Piper Merriam: Der kurvenreiche Weg zu funktionalen Light Clients](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md index ebb5978f1fd..f0f0aef0208 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md @@ -1,59 +1,59 @@ --- -title: Knotenarchitektur -description: Einleitung zum Aufbau von Ethereum-Knoten. +title: Architektur von Blockchain-Knoten +description: "Einführung in die Organisation von Ethereum-Blockchain-Knoten." lang: de --- -Ein Ethereum-Knoten besteht aus zwei Clients: einem [Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-clients) und einem [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients). Damit ein Knoten einen neuen Block vorschlagen kann, muss er auch einen [Validator-Client](#validators) betreiben. +Ein Ethereum-Blockchain-Knoten besteht aus zwei Anwendungen: einem [Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-clients) und einem [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients). Damit ein Blockchain-Knoten einen neuen Block vorschlagen kann, muss er auch einen [Validator-Client](#validators) ausführen. -Als Ethereum noch [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) verwendete, reichte ein Ausführungs-Client aus, um einen vollständigen Ethereum-Knoten zu betreiben. Seit der Implementierung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pow/) muss der Ausführungs-Client jedoch zusammen mit einer anderen Software, einem sogenannten [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients), verwendet werden. +Als Ethereum noch [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) verwendete, reichte ein Ausführungs-Client aus, um einen vollständigen Ethereum-Blockchain-Knoten zu betreiben. Seit der Implementierung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) muss der Ausführungs-Client jedoch zusammen mit einer weiteren Software, dem sogenannten [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients), verwendet werden. -Das folgende Diagramm zeigt die Verbindung zwischen zwei Ethereum-Clients. Die beiden Clients verbinden sich mit ihren eigenen Peer-to-Peer(P2P)-Netzwerken. Es werden separate P2P-Netzwerke benötigt, da der Ausführungsclient Transaktionen über ihr P2P Netzwerk kommuniziert, wodurch sie ihren lokalen Transaktionspool verwalten können. Konsensclients können dabei Blöcke über ihr eigenes P2P-Netzwerk kommunizieren, was Konsens und Wachstum der Blockchain ermöglicht. +Das folgende Diagramm zeigt die Beziehung zwischen den beiden Ethereum-Anwendungen. Die beiden Anwendungen verbinden sich mit ihren jeweiligen Peer-to-Peer-Netzwerken (P2P). Separate P2P-Netzwerke sind erforderlich, da die Ausführungs-Clients Transaktionen über ihr P2P-Netzwerk verbreiten (Gossip), was es ihnen ermöglicht, ihren lokalen Transaktionspool zu verwalten, während die Konsens-Clients Blöcke über ihr P2P-Netzwerk verbreiten, was den Konsens und das Wachstum der Chain ermöglicht. -![Diagramm der Ethereum-Knotenarchitektur mit Darstellung der Ausführungs- und Konsensebenen](node-architecture-text-background.png) +![Diagramm der Architektur eines Ethereum-Blockchain-Knotens, das die Ausführungs- und Konsensebenen zeigt](node-architecture-text-background.png) -_Für den Execution Client stehen verschiedene Optionen zur Wahl, einschließlich Erigon, Nethermind und Besu_. +_Es gibt mehrere Optionen für den Ausführungs-Client, darunter Erigon, Nethermind und Besu_. -Für die Funktionsfähigkeit dieser Zwei-Client-Architektur müssen Consensus Clients Transaktionsbündel an den Execution Client übermitteln. Der Execution Client führt Transaktionen lokal aus, um sicherzustellen, dass sie nicht gegen Ethereum-Regeln verstoßen und das vorgeschlagene Update des Zustands korrekt ist. Sobald eine Node zum Block Producer gewählt wird, fragt der Consensus Client beim Execution Client Transaktionsbündel an. Diese werden in den neuen Block integriert und ausgeführt, um den Global State zu aktualisieren. Der Konsens-Client steuert den Ausführungs-Client über eine lokale RPC-Verbindung unter Verwendung der [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). +Damit diese Zwei-Anwendungen-Struktur funktioniert, müssen Konsens-Clients Bündel von Transaktionen an den Ausführungs-Client weitergeben. Der Ausführungs-Client führt die Transaktionen lokal aus, um zu validieren, dass die Transaktionen nicht gegen Ethereum-Regeln verstoßen und dass die vorgeschlagene Aktualisierung des Ethereum-Zustands korrekt ist. Wenn ein Blockchain-Knoten als Blockproduzent ausgewählt wird, fordert seine Konsens-Client-Instanz Transaktionsbündel vom Ausführungs-Client an, um sie in den neuen Block aufzunehmen und auszuführen, um den globalen Zustand zu aktualisieren. Der Konsens-Client steuert den Ausführungs-Client über eine lokale RPC-Verbindung unter Verwendung der [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). -## Was macht der Ausführungsclient? {#execution-client} +## Was macht der Ausführungs-Client? {#execution-client} -Der Ausführungs-Client ist für die Validierung, die Abwicklung und das Gossip von Transaktionen sowie für die Zustandsverwaltung und die Unterstützung der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)) verantwortlich. Er ist **nicht** für das Block-Building, das Block-Gossiping oder die Handhabung der Konsens-Logik verantwortlich. Dies sind die Aufgaben des Konsensclients. +Der Ausführungs-Client ist verantwortlich für die Validierung, Handhabung und Verbreitung (Gossip) von Transaktionen sowie für die Zustandsverwaltung und die Unterstützung der [Ethereum Virtual Machine](/developers/docs/evm/) (EVM). Er ist **nicht** verantwortlich für die Blockbildung, die Verbreitung von Blöcken oder die Handhabung der Konsenslogik. Diese fallen in den Aufgabenbereich des Konsens-Clients. -Der Ausführungsclient erstellt Ausführungsnutzlasten – die Liste der Transaktionen, die aktualisierten Zustandsbäume, und andere ausführungsbezogene Daten. Konsensclients beinhalten die Ausführungsnutzlast in jedem Block. Der Ausführungsclient ist außerdem zuständig für das Wiederausführen von Transaktionen in einem neuen Block, um sicherzugehen, dass diese gültig sind. Die Ausführung von Transaktionen erfolgt auf dem eingebetteten Computer des Ausführungs-Clients, der als [Ethereum Virtual Machine (EVM)](/developers/docs/evm) bekannt ist. +Der Ausführungs-Client erstellt Ausführungs-Payloads – die Liste der Transaktionen, den aktualisierten Zustands-Trie und andere ausführungsbezogene Daten. Konsens-Clients fügen den Ausführungs-Payload in jeden Block ein. Der Ausführungs-Client ist auch dafür verantwortlich, Transaktionen in neuen Blöcken erneut auszuführen, um sicherzustellen, dass sie gültig sind. Die Ausführung von Transaktionen erfolgt auf dem eingebetteten Computer des Ausführungs-Clients, bekannt als die [Ethereum Virtual Machine (EVM)](/developers/docs/evm). -Der Ausführungs-Client bietet auch eine Benutzeroberfläche für Ethereum über [RPC-Methoden](/developers/docs/apis/json-rpc), die es Benutzern ermöglichen, die Ethereum-Blockchain abzufragen, Transaktionen zu übermitteln und Smart Contracts bereitzustellen. Üblicherweise werden RPC-Aufrufe von einer Bibliothek wie [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/) oder von einer Benutzeroberfläche wie einer Browser-Wallet verarbeitet. +Der Ausführungs-Client bietet auch eine Benutzeroberfläche für Ethereum durch [RPC-Methoden](/developers/docs/apis/json-rpc), die es Benutzern ermöglichen, die Ethereum-Blockchain abzufragen, Transaktionen einzureichen und Smart Contracts bereitzustellen. Es ist üblich, dass RPC-Aufrufe von einer Bibliothek wie [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/) oder von einer Benutzeroberfläche wie einem Browser-Wallet verarbeitet werden. -Zusammengefasst ist der Ausführungsclient: +Zusammenfassend ist der Ausführungs-Client: -- Ein Nutzergateway zu Ethereum -- Das Zuhause der Virtuellen Ethereum-Maschine, des Zustands von Ethereums und des Transaktionspools. +- ein Benutzer-Gateway zu Ethereum +- das Zuhause der Ethereum Virtual Machine, des Ethereum-Zustands und des Transaktionspools. -## Was macht der Konsensclient? {#consensus-client} +## Was macht der Konsens-Client? {#consensus-client} -Der Konsensclient befasst sich mit der gesamten Logik, die ein Knoten braucht, um mit dem Ethereum-Netzwerk synchronisiert zu bleiben. Das beinhaltet das Empfangen von Blöcken von Peers und das Betreiben eines Abspaltungsalgorithmus, um sicherzugehen, dass der Knoten immer der Blockchain mit den meisten Attestierungen (gewichtet nach effektiven Guthaben von Validatoren) folgt. Ähnlich zum Ausführungsclient haben Konsensclients ihr eigenes P2P-Netzwerk, über das sie Blöcke und Attestierungen teilen können. +Der Konsens-Client befasst sich mit der gesamten Logik, die es einem Blockchain-Knoten ermöglicht, mit dem Ethereum-Netzwerk synchron zu bleiben. Dies umfasst den Empfang von Blöcken von Peers und die Ausführung eines Fork-Choice-Algorithmus, um sicherzustellen, dass der Blockchain-Knoten immer der Chain mit der größten Ansammlung von Bestätigungen (gewichtet nach den effektiven Guthaben der Validatoren) folgt. Ähnlich wie der Ausführungs-Client haben Konsens-Clients ihr eigenes P2P-Netzwerk, über das sie Blöcke und Bestätigungen teilen. -Der Konsensclient nimmt nicht an Attestierungen oder dem Vorschlagen von Blöcken teil. Das wird von einem Validator übernommen, eine optionale Erweiterung zu einem Konsensclient. Ein Konsensclient ohne Validator hält nur mit der Spitze der Blockchain mit, was dem Knoten ermöglicht, synchronisiert zu bleiben. Das ermöglicht dem Nutzer, Dinge mit Ethereum über ihren Ausführungsclient abzuwickeln, mit der Sicherheit, dass diese sich auf der richtigen Blockchain befinden. +Der Konsens-Client beteiligt sich nicht an der Bestätigung oder dem Vorschlagen von Blöcken – dies wird von einem Validator durchgeführt, einem optionalen Add-on für einen Konsens-Client. Ein Konsens-Client ohne Validator hält nur mit der Spitze der Chain Schritt, sodass der Blockchain-Knoten synchronisiert bleibt. Dies ermöglicht es einem Benutzer, mit Ethereum über seinen Ausführungs-Client zu interagieren, in der Gewissheit, dass er sich auf der richtigen Chain befindet. ## Validatoren {#validators} -Staking und der Betrieb der Validator-Software machen eine Node berechtigt, als Block-Proposer ausgewählt zu werden. Knotenbetreiber können Validatoren zu ihren Konsensclients hinzufügen, indem sie 32 ETH in den Einzahlungsvertrag einzahlen. Der Validatorclient kommt gebündelt mit dem Konsensclient und kann zu jeder Zeit einem Knoten hinzugefügt werden. Der Validator bearbeitet Attestierungen und Blockvorschläge. Außerdem versetzt es eine Node in die Lage, Belohnungen zu erzielen, aber auch ETH durch Strafen oder Slashing einzubüßen. +Durch Staking und das Ausführen der Validator-Software wird ein Blockchain-Knoten berechtigt, ausgewählt zu werden, um einen neuen Block vorzuschlagen. Betreiber von Blockchain-Knoten können ihren Konsens-Clients einen Validator hinzufügen, indem sie 32 ETH in den Einzahlungsvertrag einzahlen. Der Validator-Client wird mit dem Konsens-Client gebündelt geliefert und kann einem Blockchain-Knoten jederzeit hinzugefügt werden. Der Validator kümmert sich um Bestätigungen und Blockvorschläge. Er ermöglicht es einem Blockchain-Knoten auch, Belohnungen anzusammeln oder ETH durch Strafen oder Slashing zu verlieren. -[Mehr zum Staking](/staking/). +[Mehr über Staking](/staking/). -## Vergleich der Knotenkomponenten {#node-comparison} +## Vergleich der Komponenten eines Blockchain-Knotens {#node-comparison} -| Ausführungsclient | Konsensclient | Validator | -| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -| Verbreitet Transaktionen mittels Gossip über sein P2P-Netzwerk | Verbreitet Blöcke und Attestations über das eigene P2P-Netzwerk | Schlägt Blöcke vor | -| Führt Transaktionen (erneut) aus | Betreibt den Abspaltungsalgorithmus | Sammelt Prämien/Strafen | -| Verifiziert eingehende Zustandsänderungen | Verfolgt die Spitze der Blockchain | Stellt Attestierungen aus | -| Verwaltet Zustands- und Belegsbäume | Verwaltet den Beacon-Zustand (beinhaltet Konsens- und Ausführungsinformationen) | Benötigt 32 ETH, um gestaked zu werden | -| Erzeugt Ausführungsnutzlast | Überwacht den angesammelten Zufall in RANDAO (ein Algorithmus, der verifizierbaren Zufall für die Auswahl von Validatoren und weitere Konsens-Vorgänge liefert) | Kann „abgeschlagen“ (geslashed) werden | -| Deckt JSON-RPC API auf, um mit Ethereum zu interagieren | Behält den Überblick über Begründung und Finalisierung | | +| Ausführungs-Client | Konsens-Client | Validator | +| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| Verbreitet Transaktionen über sein P2P-Netzwerk | Verbreitet Blöcke und Bestätigungen über sein P2P-Netzwerk | Schlägt Blöcke vor | +| Führt Transaktionen aus/erneut aus | Führt den Fork-Choice-Algorithmus aus | Sammelt Belohnungen/Strafen an | +| Verifiziert eingehende Zustandsänderungen | Verfolgt die Spitze der Chain | Nimmt Bestätigungen vor | +| Verwaltet Zustands- und Quittungs-Tries | Verwaltet den Beacon-Zustand (enthält Konsens- und Ausführungsinformationen) | Erfordert das Staking von 32 ETH | +| Erstellt Ausführungs-Payload | Verfolgt die angesammelte Zufälligkeit in RANDAO (ein Algorithmus, der überprüfbare Zufälligkeit für die Validator-Auswahl und andere Konsensoperationen bietet) | Kann von Slashing betroffen sein | +| Stellt JSON-RPC-API für die Interaktion mit Ethereum bereit | Verfolgt Rechtfertigung und Finalität | | -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) -- [Block-Vorschlag](/developers/docs/consensus-mechanisms/pos/block-proposal) -- [Belohnungen und Strafen für Validatoren](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) +- [Blockvorschlag](/developers/docs/consensus-mechanisms/pos/block-proposal) +- [Belohnungen und Strafen für Validatoren](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index e39209e5fba..094d8eb9e5a 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -1,112 +1,112 @@ --- -title: Nodes als Dienstleistung -description: "Eine Einstiegsübersicht über Node-Dienste, die Vor- und Nachteile und beliebte Anbieter." +title: Blockchain-Knoten als Dienstleistung +description: "Ein grundlegender Überblick über Blockchain-Knoten-Dienste, deren Vor- und Nachteile sowie beliebte Anbieter." lang: de sidebarDepth: 2 --- ## Einführung {#Introduction} -Das Betreiben eines eigenen [Ethereum-Nodes](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) kann eine Herausforderung sein, insbesondere beim Einstieg oder bei einer schnellen Skalierung. Es gibt eine [Reihe von Diensten](#popular-node-services), die für Sie optimierte Node-Infrastrukturen betreiben, sodass Sie sich stattdessen auf die Entwicklung Ihrer Anwendung oder Ihres Produkts konzentrieren können. Wir erklären Ihnen, wie Node-Dienste funktionieren, welche Vor- und Nachteile sie haben und listen Anbieter auf, falls Sie anfangen möchten, sie zu verwenden. +Den eigenen [Ethereum-Blockchain-Knoten](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) zu betreiben, kann eine Herausforderung sein, besonders zu Beginn oder bei schneller Skalierung. Es gibt eine [Reihe von Diensten](#popular-node-services), die optimierte Blockchain-Knoten-Infrastrukturen für Sie betreiben, sodass Sie sich stattdessen auf die Entwicklung Ihrer Anwendung oder Ihres Produkts konzentrieren können. Wir erklären, wie Blockchain-Knoten-Dienste funktionieren, welche Vor- und Nachteile ihre Nutzung hat, und listen Anbieter auf, falls Sie daran interessiert sind, loszulegen. ## Voraussetzungen {#prerequisites} -Wenn Sie noch nicht wissen, was Nodes und Clients sind, schauen Sie sich [Nodes und Clients](/developers/docs/nodes-and-clients/) an. +Wenn Sie noch nicht wissen, was Blockchain-Knoten und Anwendungen (Clients) sind, lesen Sie sich [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) durch. ## Staker {#stakoooooooooooooors} -Solo-Staker müssen ihre eigene Infrastruktur betreiben, anstatt sich auf Drittanbieter zu verlassen. Das bedeutet, dass ein Ausführungsclient zusammen mit einem Konsensclient betrieben wird. Vor [The Merge](/roadmap/merge) war es möglich, nur einen Konsens-Client zu betreiben und einen zentralisierten Anbieter für Ausführungsdaten zu nutzen. Dies ist nicht mehr möglich – ein Solo-Staker muss beide Clients betreiben. Es gibt jedoch Dienste, die diesen Prozess erleichtern können. +Solo-Staker müssen ihre eigene Infrastruktur betreiben, anstatt sich auf Drittanbieter zu verlassen. Das bedeutet, dass sie einen Ausführungs-Client in Verbindung mit einem Konsens-Client betreiben müssen. Vor [dem Merge](/roadmap/merge) war es möglich, nur einen Konsens-Client zu betreiben und einen zentralisierten Anbieter für Ausführungsdaten zu nutzen; dies ist nicht mehr möglich – ein Solo-Staker muss beide Clients betreiben. Es gibt jedoch Dienste, die diesen Prozess erleichtern. -[Erfahren Sie mehr über das Betreiben eines Nodes](/developers/docs/nodes-and-clients/run-a-node/). +[Mehr über den Betrieb eines Blockchain-Knotens lesen](/developers/docs/nodes-and-clients/run-a-node/). -Die auf dieser Seite beschriebenen Dienste gelten für Nicht-Staking-Nodes. +Die auf dieser Seite beschriebenen Dienste sind für Blockchain-Knoten ohne Staking gedacht. -## Wie funktionieren Node-Dienste? {#how-do-node-services-work} +## Wie funktionieren Blockchain-Knoten-Dienste? {#how-do-node-services-work} -Node-Dienste betreiben im Hintergrund dezentralisierte Node-Clients für Sie, so dass Sie sich nicht darum kümmern müssen. +Anbieter von Blockchain-Knoten-Diensten betreiben im Hintergrund verteilte Blockchain-Knoten-Anwendungen für Sie, sodass Sie dies nicht tun müssen. -Diese Dienste bieten in der Regel einen API-Schlüssel an, den Sie verwenden können, um in der Blockchain zu schreiben und zu lesen. Sie bieten oft zusätzlich zum Mainnet auch Zugang zu [Ethereum-Testnets](/developers/docs/networks/#ethereum-testnets). +Diese Dienste stellen in der Regel einen API-Schlüssel zur Verfügung, mit dem Sie auf die Blockchain schreiben und von ihr lesen können. Sie beinhalten oft neben dem Mainnet auch Zugang zu [Ethereum-Testnets](/developers/docs/networks/#ethereum-testnets). -Einige Dienste bieten Ihnen ihren eigenen speziellen Node, den sie für Sie verwalten, während andere Load Balancer nutzen, um die Aktivität auf mehrere Nodes zu verteilen. +Einige Dienste bieten Ihnen einen eigenen dedizierten Blockchain-Knoten, den sie für Sie verwalten, während andere Load-Balancer verwenden, um die Aktivität auf verschiedene Blockchain-Knoten zu verteilen. -Fast alle Node-Dienste sind extrem einfach mit einer Zeilenänderung in Ihren Code zu integrieren, um Ihren selbst gehosteten Node auszutauschen oder sogar zwischen den Diensten selbst zu wechseln. +Fast alle Blockchain-Knoten-Dienste sind extrem einfach zu integrieren und erfordern nur einzeilige Änderungen in Ihrem Code, um Ihren selbst gehosteten Blockchain-Knoten auszutauschen oder sogar zwischen den Diensten selbst zu wechseln. -Node-Dienste betreiben oft eine Vielzahl von [Node-Clients](/developers/docs/nodes-and-clients/#execution-clients) und [-Typen](/developers/docs/nodes-and-clients/#node-types), sodass Sie über eine einzige API auf Full- und Archive-Nodes sowie auf clientspezifische Methoden zugreifen können. +Oftmals betreiben Blockchain-Knoten-Dienste eine Vielzahl von [Blockchain-Knoten-Anwendungen](/developers/docs/nodes-and-clients/#execution-clients) und [-Typen](/developers/docs/nodes-and-clients/#node-types), was Ihnen den Zugriff auf vollständige und Archiv-Blockchain-Knoten zusätzlich zu anwendungsspezifischen Methoden in einer API ermöglicht. -Es ist wichtig zu beachten, dass Node-Dienste keinesfalls Ihre privaten Schlüssel oder Informationen speichern können und sollten. +Es ist wichtig zu beachten, dass Blockchain-Knoten-Dienste Ihre Private-Keys oder Informationen nicht speichern und dies auch nicht tun sollten. -## Was sind die Vorteile bei der Verwendung eines Node-Dienstes? Vorteile der Nutzung eines Node-Dienstes {#benefits-of-using-a-node-service} +## Was sind die Vorteile der Nutzung eines Blockchain-Knoten-Dienstes? {#benefits-of-using-a-node-service} -Der Hauptvorteil bei der Nutzung eines Node-Dienstes besteht darin, dass keine Entwicklungszeit benötigt wird, um die Nodes selbst warten und zu verwalten. So können Sie sich auf den Aufbau Ihres Produkts konzentrieren, anstatt sich um die Wartung der Infrastruktur kümmern zu müssen. +Der Hauptvorteil bei der Nutzung eines Blockchain-Knoten-Dienstes besteht darin, dass Sie keine Entwicklungszeit für die eigene Wartung und Verwaltung von Blockchain-Knoten aufwenden müssen. Dadurch können Sie sich auf die Entwicklung Ihres Produkts konzentrieren, anstatt sich um die Wartung der Infrastruktur kümmern zu müssen. -Der Betrieb eigener Nodes kann sehr kostspielig sein, vom Speicherplatz über die Bandbreite bis hin zu wertvoller Entwicklungszeit. Dinge wie das Starten weiterer Nodes bei der Skalierung, das Aufrüsten von Nodes auf die neueste Version und die Sicherstellung der Zustandskonsistenz können von der Entwicklung und dem Einsatz von Ressourcen für Ihr gewünschtes Web3-Produkt ablenken. +Der Betrieb eigener Blockchain-Knoten kann sehr teuer sein, von Speicherplatz über Bandbreite bis hin zu wertvoller Entwicklungszeit. Dinge wie das Hochfahren weiterer Blockchain-Knoten bei der Skalierung, das Aktualisieren von Blockchain-Knoten auf die neuesten Versionen und die Sicherstellung der Zustandskonsistenz können davon ablenken, Ihr gewünschtes Web3-Produkt zu entwickeln und Ressourcen dafür aufzuwenden. -## Was sind die Nachteile eines Node-Dienstes? Nachteile der Nutzung eines Node-Dienstes {#cons-of-using-a-node-service} +## Was sind die Nachteile der Nutzung eines Blockchain-Knoten-Dienstes? {#cons-of-using-a-node-service} -Durch den Einsatz eines Node-Dienstes zentralisieren Sie den Infrastrukturaspekt Ihres Produkts. Aus diesem Grund bevorzugen Projekte, für die Dezentralisierung die oberste Priorität hat, eher selbst bereitgestellte Nodes gegenüber Outsourcing an Dritte. +Durch die Nutzung eines Blockchain-Knoten-Dienstes zentralisieren Sie den Infrastrukturaspekt Ihres Produkts. Aus diesem Grund bevorzugen Projekte, die größten Wert auf Dezentralisierung legen, möglicherweise das Selbst-Hosting von Blockchain-Knoten anstelle der Auslagerung an einen Drittanbieter. -Lesen Sie mehr über die [Vorteile des Betreibens eines eigenen Nodes](/developers/docs/nodes-and-clients/#benefits-to-you). +Lesen Sie mehr über die [Vorteile des Betriebs eines eigenen Blockchain-Knotens](/developers/docs/nodes-and-clients/#benefits-to-you). -## Beliebte Node-Dienste {#popular-node-services} +## Beliebte Blockchain-Knoten-Dienste {#popular-node-services} -Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neue hinzu, die noch fehlen! Jeder Node-Dienst bietet zusätzlich zu kostenlosen oder bezahlten Stufen verschiedene Vorteile und Funktionen. Bevor Sie sich entscheiden, sollten Sie prüfen, welcher am besten zu Ihren Bedürfnissen passt. +Hier ist eine Liste einiger der beliebtesten Ethereum-Blockchain-Knoten-Anbieter. Fügen Sie gerne fehlende hinzu! Jeder Blockchain-Knoten-Dienst bietet unterschiedliche Vorteile und Funktionen sowie kostenlose oder kostenpflichtige Tarife. Sie sollten vor einer Entscheidung prüfen, welche am besten zu Ihren Anforderungen passen. - [**Alchemy**](https://alchemy.com/) - - [Doku](https://www.alchemy.com/docs/) - - Eigenschaften - - Die größte kostenlose Stufe bietet 300 Millionen Recheneinheiten pro Monat (ca. 30 Millionen getLatestBlock-Anfragen) - - Multichain-Unterstützung für Polygon, Starknet, Optimism, Arbitrum - - Verantwortlich für etwa 70 % der größten dApps und DeFi-Transaktionsvolumina von Ethereum - - Webhook-Benachrichtigungen in Echtzeit über Alchemy Notify - - Branchenführender Support und Zuverlässigkeit/Stabilität - - NFT-API von Alchemy + - [Dokumentation](https://www.alchemy.com/docs/) + - Funktionen + - Größter kostenloser Tarif mit 300 Mio. Recheneinheiten pro Monat (\~30 Mio. getLatestBlock-Anfragen) + - Multi-Chain-Unterstützung für Polygon, Starknet, Optimism, Arbitrum + - Unterstützt ~70 % der größten Ethereum-Dapps und des DeFi-Transaktionsvolumens + - Echtzeit-Webhook-Benachrichtigungen über Alchemy Notify + - Erstklassiger Support und Zuverlässigkeit/Stabilität + - Alchemys NFT-API - Dashboard mit Request Explorer, Mempool Watcher und Composer - - Integrierter Testnetz-Faucet-Zugang - - Aktive Discord-Entwicklergemeinschaft mit 18.000 Nutzern + - Integrierter Testnet-Faucet-Zugang + - Aktive Discord-Entwickler-Community mit 18.000 Nutzern - [**Allnodes**](https://www.allnodes.com/) - - [Doku](https://docs.allnodes.com/) - - Eigenschaften - - Ein auf der Allnodes-Portfolio-Seite erstellter PublicNode-Token unterliegt keiner Ratenbegrenzung. - - Auf den Datenschutz ausgerichtete, kostenlose RPC-Endpunkte (100+ Blockchains) auf [PublicNode](https://www.publicnode.com) - - Deine eigenen dedizierten Nodes für über 90 Blockchains ohne Ratenbegrenzung - - Voller Zugriff auf dedizierte Archive Nodes für über 30 Blockchains + - [Dokumentation](https://docs.allnodes.com/) + - Funktionen + - Keine Ratenbegrenzungen mit dem PublicNode-Token, der auf der Allnodes-Portfolio-Seite erstellt wird. + - Datenschutzorientierte kostenlose RPC-Endpunkte (100+ Blockchains) auf [PublicNode](https://www.publicnode.com) + - Dedizierte Blockchain-Knoten ohne Ratenbegrenzungen für 90+ Blockchains + - Dedizierte Archiv-Blockchain-Knoten für 30+ Blockchains - Verfügbar in 3 Regionen (USA, EU, Asien) - Snapshots für 100+ Blockchains auf [PublicNode](https://www.publicnode.com/snapshots) - - 24/7-Support & 99,90%-99.98% Uptime-SLA (planabhängig). - - Bezahlung pro Stunde - - Zahlung per Kreditkarte, PayPal oder Krypto + - Technischer 24/7-Support mit 99,90 %–99,98 % Uptime-SLA (abhängig vom Tarif). + - Preisgestaltung pro Stunde + - Zahlung mit Kreditkarte, PayPal oder Krypto - [**All That Node**](https://allthatnode.com/) - - [Doku](https://docs.allthatnode.com/) - - Eigenschaften - - 50,000 Anfragen pro Tag mit kostenloser Variante + - [Dokumentation](https://docs.allthatnode.com/) + - Funktionen + - 50.000 Anfragen pro Tag im kostenlosen Tarif - Unterstützung für über 40 Protokolle - - JSON-RPC(EVM, Tendermint)-, REST- und Websocket-API unterstützt - - Unbegrenzter Zugang zu Archivdaten - - Technischer Support rund um die Uhr und über 99,9 % Uptime - - Ein Faucet ist auf mehreren Chains verfügbar - - Unbegrenzter Endpunktzugang mit unbegrenzter Anzahl an API-Schlüsseln - - Trace-/Debug-API unterstützt + - JSON-RPC (EVM, Tendermint), REST und Websocket-APIs werden unterstützt + - Unbegrenzter Zugriff auf Archivdaten + - Technischer 24/7-Support und über 99,9 % Verfügbarkeit + - Faucet auf mehreren Chains verfügbar + - Unbegrenzter Endpunktzugriff mit einer unbegrenzten Anzahl von API-Schlüsseln + - Trace/Debug-API wird unterstützt - Automatisierte Updates - [**Amazon Managed Blockchain**](https://aws.amazon.com/managed-blockchain/) - - [Doku](https://aws.amazon.com/managed-blockchain/resources/) - - Eigenschaften - - Vollständig verwaltete Ethereum-Nodes + - [Dokumentation](https://aws.amazon.com/managed-blockchain/resources/) + - Funktionen + - Vollständig verwaltete Ethereum-Blockchain-Knoten - Verfügbar in sechs Regionen - JSON-RPC über HTTP und sichere WebSockets - - Unterstützt 3 Chains - - SLAs, AWS-Support rund um die Uhr - - Go-Ethereum und Lighthouse + - Unterstützt 3 Chains + - SLAs, AWS-Support 24/7 + - Go-ethereum und Lighthouse - [**Ankr**](https://www.ankr.com/) - - [Doku](https://docs.ankr.com/) - - Eigenschaften - - Ankr-Protokoll – offener Zugang zu öffentlichen RPC-API-Endpunkten für über 8 Chains - - Lastausgleich und Überwachung der Node-Sicherheit für ein schnelles und zuverlässiges Gateway zum nächstgelegenen verfügbaren Node - - Premium-Tier mit WSS-Endpunkt und unbegrenzter Rate - - Bereitstellung von vollständigen Nodes und Validierungs-Nodes für über 40 Chains mit einem Klick + - [Dokumentation](https://docs.ankr.com/) + - Funktionen + - Ankr Protocol – offener Zugang zu öffentlichen RPC-API-Endpunkten für 8+ Chains + - Lastausgleich und Überwachung des Blockchain-Knoten-Zustands für ein schnelles und zuverlässiges Gateway zum nächsten verfügbaren Blockchain-Knoten + - Premium-Tarif, der WSS-Endpunkte und unbegrenzte Ratenlimits ermöglicht + - Ein-Klick-Bereitstellung von vollständigen Blockchain-Knoten und Validator-Blockchain-Knoten für 40+ Chains - Skalierung nach Bedarf - Analysetools - Dashboard @@ -114,149 +114,149 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Direkter Support - [**Blast**](https://blastapi.io/) - - [Doku](https://docs.blastapi.io/) - - Eigenschaften - - Support für RPC und WSS - - Hosting von Nodes in mehreren Regionen - - Dezentrale Infrastruktur + - [Dokumentation](https://docs.blastapi.io/) + - Funktionen + - RPC- und WSS-Unterstützung + - Multi-Region-Hosting von Blockchain-Knoten + - Dezentralisierte Infrastruktur - Öffentliche API - - Spezifischer kostenloser Plan - - Unterstützung für mehrere Blockchains (über 17 Blockchains) - - Archivierte Nodes - - Discord-Support rund um die Uhr - - Überwachung und Benachrichtigungen rund um die Uhr - - Eine Gesamt-Service-Level-Vereinbarung (SLA) von 99,9 % - - Mit Kryptowährungen bezahlen + - Dedizierter kostenloser Tarif + - Multi-Chain-Unterstützung (17+ Blockchains) + - Archiv-Blockchain-Knoten + - 24/7-Discord-Support + - 24/7-Überwachung und -Benachrichtigungen + - Ein Gesamt-SLA von 99,9 % + - Zahlung in Krypto - [**BlockDaemon**](https://blockdaemon.com/) - - [Doku](https://ubiquity.docs.blockdaemon.com/) + - [Dokumentation](https://ubiquity.docs.blockdaemon.com/) - Vorteile - Dashboard - - Pro-Node-Basis + - Pro-Blockchain-Knoten-Basis - Analysen - [**BlockPI**](https://blockpi.io/) - - [Doku](https://docs.blockpi.io/) - - Eigenschaften - - Robuste und verteilte Node-Struktur + - [Dokumentation](https://docs.blockpi.io/) + - Funktionen + - Robuste & verteilte Blockchain-Knoten-Struktur - Bis zu 40 HTTPS- und WSS-Endpunkte - Kostenloses Anmeldepaket und monatliches Paket - - Support für Trace-Methode und Archivdaten - - Pakete mit einer Gültigkeit von bis zu 90 Tagen - - Individueller Plan und Zahlung nach Verbrauch (Pay-as-you-go) - - Mit Kryptowährungen bezahlen + - Trace-Methode + Unterstützung für Archivdaten + - Pakete mit bis zu 90 Tagen Gültigkeit + - Benutzerdefinierter Tarif und Pay-as-you-go-Zahlung + - Zahlung in Krypto - Direkter Support & Technischer Support - [**Chainbase**](https://www.chainbase.com/) - - [Doku](https://docs.chainbase.com) - - Eigenschaften + - [Dokumentation](https://docs.chainbase.com) + - Funktionen - Hochverfügbarer, schneller und skalierbarer RPC-Dienst - - Unterstützung für mehrere Blockchains + - Multi-Chain-Unterstützung - Kostenlose Tarife - Benutzerfreundliches Dashboard - Bietet Blockchain-Datendienste über RPC hinaus - [**Chainstack**](https://chainstack.com/) - - [Doku](https://docs.chainstack.com/) - - Eigenschaften - - Kostenloses Teilen von Nodes - - Gemeinsam genutzte Archiv-Nodes - - GraphQL Support + - [Dokumentation](https://docs.chainstack.com/) + - Funktionen + - Kostenlose geteilte Blockchain-Knoten + - Geteilte Archiv-Blockchain-Knoten + - GraphQL-Unterstützung - RPC- und WSS-Endpunkte - - Speziielle Voll- und Archiv-Nodes - - Schnelle Synchronisierungszeit für gezielte Einsätze - - Bringen Sie Ihre Cloud mit - - Bezahlung pro Stunde - - Direkter Support rund um die Uhr + - Dedizierte vollständige und Archiv-Blockchain-Knoten + - Schnelle Synchronisierungszeit für dedizierte Bereitstellungen + - Bring Your Own Cloud + - Preisgestaltung pro Stunde + - Direkter 24/7-Support - [**dRPC**](https://drpc.org/) - - [Doku](https://drpc.org/docs) + - [Dokumentation](https://drpc.org/docs) - NodeCloud: Plug-and-Play-RPC-Infrastruktur ab 10 $ (USD) – volle Geschwindigkeit, keine Limits - NodeCloud-Funktionen: - API-Unterstützung für 185 Netzwerke - - Verteilter Pool von über 40 Anbietern + - Verteilter Pool von 40+ Anbietern - Globale Abdeckung mit neun (9) Geo-Clustern - - KI-gestütztes Lastverteilungssystem - - Nutzungsbasierte Pauschalpreise – keine Preiserhöhungen, kein Verfall, keine Anbieterbindung - - Unbegrenzte Schlüssel, granulare Schlüsselanpassungen, Teamrollen, Frontend-Schutz - - Methodenpauschale von 20 Recheneinheiten (CUs) pro Methode - - [Chainlist öffentlicher Endpunkte](https://drpc.org/chainlist) + - KI-gestütztes Lastausgleichssystem + - Pay-as-you-go-Pauschalpreise – keine Preiserhöhungen, kein Verfall, keine Bindung + - Unbegrenzte Schlüssel, granulare Schlüsselanpassungen, Teamrollen, Front-End-Schutz + - Methoden-Pauschale von 20 Recheneinheiten (CUs) pro Methode + - [Öffentliche Endpunkt-Chainlist](https://drpc.org/chainlist) - [Preisrechner](https://drpc.org/pricing#calculator) - NodeCore: Open-Source-Stack für Organisationen, die volle Kontrolle wünschen - [**GetBlock**](https://getblock.io/) - - [Doku](https://getblock.io/docs/get-started/authentication-with-api-key/) - - Eigenschaften - - Zugang zu über 40 Blockchain-Knoten - - 40.000 kostenlose und tägliche Anfragen + - [Dokumentation](https://getblock.io/docs/get-started/authentication-with-api-key/) + - Funktionen + - Zugriff auf 40+ Blockchain-Knoten + - 40.000 kostenlose tägliche Anfragen - Unbegrenzte Anzahl von API-Schlüsseln - - Hohe Verbindungsgeschwindigkeit mit 1GB/sec - - Verfolgen+Archivieren + - Hohe Verbindungsgeschwindigkeit mit 1 GB/s + - Trace+Archiv - Erweiterte Analysen - Automatisierte Updates - Technischer Support - [**InfStones**](https://infstones.com/) - - Eigenschaften - - Option für kostenlose Stufe + - Funktionen + - Kostenlose Tarifoption - Skalierung nach Bedarf - Analysen - Dashboard - Einzigartige API-Endpunkte - - Dedizierte vollständige Nodes - - Schnelle Synchronisierungszeit für gezielte Einsätze - - Direkter Support rund um die Uhr - - Zugang zu mehr als 50 Blockchain-Nodes + - Dedizierte vollständige Blockchain-Knoten + - Schnelle Synchronisierungszeit für dedizierte Bereitstellungen + - Direkter 24/7-Support + - Zugriff auf 50+ Blockchain-Knoten - [**Infura**](https://infura.io/) - - [Doku](https://infura.io/docs) - - Eigenschaften - - Option für kostenlose Stufe + - [Dokumentation](https://infura.io/docs) + - Funktionen + - Kostenlose Tarifoption - Skalierung nach Bedarf - - Kostenpflichtige Archivierungsdaten + - Kostenpflichtige Archivdaten - Direkter Support - Dashboard - [**Kaleido**](https://kaleido.io/) - - [Doku](https://docs.kaleido.io/) - - Eigenschaften - - Kostenlose Starter-Stufe - - Bereitstellung von Ethereum-Nodes mit einem Klick + - [Dokumentation](https://docs.kaleido.io/) + - Funktionen + - Kostenloser Einsteigertarif + - Ein-Klick-Bereitstellung von Ethereum-Blockchain-Knoten - Anpassbare Clients und Algorithmen (Geth, Quorum & Besu || PoA, IBFT & Raft) - - Mehr als 500 Verwaltungs- und Service-APIs - - RESTful-Schnittstelle für die Übermittlung von Ethereum-Transaktionen (unterstützt von Apache Kafka) - - Ausgehende Streams für die Zustellung von Ereignissen (unterstützt von Apache Kafka) - - Umfangreiche Sammlung von "Offchain"- und Zusatzdiensten (z. B. bilateraler verschlüsselter Nachrichtentransport) + - 500+ Verwaltungs- und Service-APIs + - RESTful-Schnittstelle für die Übermittlung von Ethereum-Transaktionen (unterstützt durch Apache Kafka) + - Ausgehende Streams für die Ereignisbereitstellung (unterstützt durch Apache Kafka) + - Umfangreiche Sammlung von Off-Chain- und Zusatzdiensten (z. B. bilateraler verschlüsselter Nachrichtentransport) - Unkompliziertes Netzwerk-Onboarding mit Governance und rollenbasierter Zugriffskontrolle - Ausgefeilte Benutzerverwaltung für Administratoren und Endbenutzer - - Hochgradig skalierbare, belastbare, unternehmensgerechte Infrastruktur - - Verwaltung privater HSM-Schlüssel in der Cloud - - Ethereum Mainnet-Tethering - - ISO 27000 und SOC 2, Typ-2-Zertifizierungen - - Dynamische Laufzeitkonfiguration (z. B. Hinzufügen von Cloud-Integrationen, Ändern von Node-Ingresses usw.) - - Unterstützung für Orchestrierungen von Multi-Cloud-, Multi-Region- und Hybrid-Bereitstellungen - - Einfache SaaS-Preise auf Stundenbasis - - SLA- und 24/7-Support + - Hochskalierbare, belastbare Infrastruktur auf Unternehmensniveau + - Cloud-HSM-Private-Key-Verwaltung + - Ethereum-Mainnet-Tethering + - ISO 27k- und SOC 2, Typ 2-Zertifizierungen + - Dynamische Laufzeitkonfiguration (z. B. Hinzufügen von Cloud-Integrationen, Ändern von Blockchain-Knoten-Zugängen usw.) + - Unterstützung für Multi-Cloud-, Multi-Region- und hybride Bereitstellungsorchestrierungen + - Einfache stündliche SaaS-basierte Preisgestaltung + - SLAs und 24/7-Support - [**Lava Network**](https://www.lavanet.xyz/) - - [Doku](https://docs.lavanet.xyz/) - - Eigenschaften - - Kostenlose Testnetz-Nutzung - - Dezentrale Redundanz für hohe Verfügbarkeit + - [Dokumentation](https://docs.lavanet.xyz/) + - Funktionen + - Kostenlose Testnet-Nutzung + - Dezentralisierte Redundanz für hohe Verfügbarkeit - Open-Source - - Vollständig dezentralisierte SDK - - Integration von Ethers.js - - Intuitive Projektmanagement-Benutzeroberfläche + - Vollständig dezentralisiertes SDK + - Ethers.js-Integration + - Intuitive Projektmanagement-Schnittstelle - Konsensbasierte Datenintegrität - - Unterstützung für mehrere Blockchains + - Multi-Chain-Unterstützung - [**Moralis**](https://moralis.io/) - - [Doku](https://docs.moralis.io/) - - Eigenschaften - - Kostenloses Teilen von Nodes - - Kostenlose gemeinsam genutzte Archiv-Nodes - - Datenschutzorientiert (keine Protokollrichtlinien) - - Chain-übergreifender Support + - [Dokumentation](https://docs.moralis.io/) + - Funktionen + - Kostenlose geteilte Blockchain-Knoten + - Kostenlose geteilte Archiv-Blockchain-Knoten + - Datenschutzorientiert (Keine-Logs-Richtlinie) + - Cross-Chain-Unterstützung - Skalierung nach Bedarf - Dashboard - Einzigartiges Ethereum-SDK @@ -264,153 +264,154 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Direkter, technischer Support - [**NodeReal MegaNode**](https://nodereal.io/) - - [Doku](https://docs.nodereal.io/docs/introduction) - - Eigenschaften - - Zuverlässige, schnelle und skalierbare RPC-API-Services - - Verbesserte API für Web3-Entwickler - - Unterstützung für mehrere Blockchains - - Kostenloser Einstieg + - [Dokumentation](https://docs.nodereal.io/docs/introduction) + - Funktionen + - Zuverlässige, schnelle und skalierbare RPC-API-Dienste + - Erweiterte API für Web3-Entwickler + - Multi-Chain-Unterstützung + - Kostenlos loslegen - [**NOWNodes**](https://nownodes.io/) - - Eigenschaften - - Zugang zu mehr als 50 Blockchain-Nodes + - Funktionen + - Zugriff auf 50+ Blockchain-Knoten - Kostenloser API-Schlüssel - - Block-Explorer - - API-Antwortzeit ≤ 1 Sekunde - - Support-Team rund um die Uhr (24/7) - - Persönlicher Account Manager - - Geteilte, archivierte, Backup- und Spezial-Nodes + - Blocksuchmaschinen + - API-Antwortzeit ⩽ 1 Sek. + - 24/7-Support-Team + - Persönlicher Account-Manager + - Geteilte, Archiv-, Backup- und dedizierte Blockchain-Knoten - [**Pocket Network**](https://www.pokt.network/) - - [Doku](https://docs.pokt.network/) - - Eigenschaften - - Dezentrales RPC-Protokoll und Marktplatz - - 1 Mio. Anfragen pro Tag für kostenlose Stufen (pro Endpunkt, max. 2) + - [Dokumentation](https://docs.pokt.network/) + - Funktionen + - Dezentralisiertes RPC-Protokoll und Marktplatz + - Kostenloser Tarif mit 1 Mio. Anfragen pro Tag (pro Endpunkt, max. 2) - Pre-Stake+-Programm (wenn Sie mehr als 1 Mio. Anfragen pro Tag benötigen) - - Support für mehr als 15 Blockchains - - Über 6400 Nodes verdienen POKT für die Bedienung von Anwendungen - - Archiv-Node, Archiv-Node mit Tracing & Unterstützung für Testnet-Nodes - - Client-Diversität für Ethereum Mainnet Node - - Kein einzelner Ausfallpunkt - - Keine Ausfallzeit - - Kosteneffiziente nahe-Null Tokenomics (POKT einmal für Netzwerkbandbreite einsetzen) - - Keine monatlichen, verlorenen Kosten: Verwandeln Sie Ihre Infrastruktur in einen Vermögenswert - - Im Protokoll integrierter Lastausgleich - - Unendliche Skalierung der Anzahl von Anfragen pro Tag und der Nodes pro Stunde nach Bedarf - - Die Option für höchste Privatsphäre und Zensurresistenz - - Praktische Unterstützung für Entwickler + - 15+ unterstützte Blockchains + - 6400+ Blockchain-Knoten, die POKT für die Bereitstellung von Anwendungen verdienen + - Unterstützung für Archiv-Blockchain-Knoten, Archiv-Blockchain-Knoten mit Tracing & Testnet-Blockchain-Knoten + - Client-Vielfalt für Ethereum-Mainnet-Blockchain-Knoten + - Kein Single Point of Failure + - Keine Ausfallzeiten + - Kostengünstige Near-Zero-Tokenomics (einmaliges Staking von POKT für Netzwerkbandbreite) + - Keine monatlichen versunkenen Kosten, machen Sie Ihre Infrastruktur zu einem Vermögenswert + - In das Protokoll integrierter Lastausgleich + - Unendliche Skalierung der Anzahl von Anfragen pro Tag und Blockchain-Knoten pro Stunde nach Bedarf + - Die privateste, zensurresistenteste Option + - Praktischer Entwickler-Support - [Pocket Portal](https://bit.ly/ETHorg_POKTportal) Dashboard und Analysen - [**QuickNode**](https://www.quicknode.com) - - [Doku](https://www.quicknode.com/docs/) - - Eigenschaften - - Technischer Support rund um die Uhr & Entwickler-Discord-Community - - Geobalanciertes, Multi-Cloud/Metal-unterstütztes Netzwerk mit geringer Latenz - - Unterstützung für mehrere Blockchains (Optimism, Arbitrum, Polygon + 11 weitere) - - Zwischenschichten für Geschwindigkeit und Stabilität (Anfragen-Routing, Cache, Indizierung) - - Smart Contract-Überwachung über Webhooks - - Intuitives Dashboard, Analysesuite, RPC-Composer + - [Dokumentation](https://www.quicknode.com/docs/) + - Funktionen + - Technischer 24/7-Support & Entwickler-Discord-Community + - Geografisch ausbalanciertes, Multi-Cloud/Metal-Netzwerk mit geringer Latenz + - Multi-Chain-Unterstützung (Optimism, Arbitrum, Polygon + 11 weitere) + - Mittlere Ebenen für Geschwindigkeit & Stabilität (Anrufweiterleitung, Cache, Indizierung) + - Smart-Contract-Überwachung über Webhooks + - Intuitives Dashboard, Analyse-Suite, RPC-Composer - Erweiterte Sicherheitsfunktionen (JWT, Maskierung, Whitelisting) - NFT-Daten- und Analyse-API - [SOC2-zertifiziert](https://www.quicknode.com/security) - - Geeignet für Entwickler und Unternehmen + - Geeignet für Entwickler bis hin zu Unternehmen - [**Rivet**](https://rivet.cloud/) - - [Doku](https://rivet.readthedocs.io/en/latest/) - - Eigenschaften - - Option für kostenlose Stufe + - [Dokumentation](https://rivet.readthedocs.io/en/latest/) + - Funktionen + - Kostenlose Tarifoption - Skalierung nach Bedarf - [**SenseiNode**](https://senseinode.com) - - [Doku](https://docs.senseinode.com/) - - Eigenschaften - - Spezielle und gemeinsam genutzte Nodes + - [Dokumentation](https://docs.senseinode.com/) + - Funktionen + - Dedizierte und geteilte Blockchain-Knoten - Dashboard - - Hosting außerhalb von AWS auf mehreren Hosting-Anbietern an verschiedenen Standorten in Lateinamerika + - Hosting außerhalb von AWS bei mehreren Hosting-Anbietern an verschiedenen Standorten in Lateinamerika - Prysm- und Lighthouse-Clients - [**SettleMint**](https://console.settlemint.com/) - - [Doku](https://docs.settlemint.com/) - - Eigenschaften - - Kostenlose Testphase + - [Dokumentation](https://docs.settlemint.com/) + - Funktionen + - Kostenlose Testversion - Skalierung nach Bedarf - - GraphQL Support + - GraphQL-Unterstützung - RPC- und WSS-Endpunkte - - Dedizierte vollständige Nodes - - Bringen Sie Ihre Cloud mit + - Dedizierte vollständige Blockchain-Knoten + - Bring Your Own Cloud - Analysetools - Dashboard - - Bezahlung pro Stunde + - Preisgestaltung pro Stunde - Direkter Support - [**Tenderly**](https://tenderly.co/web3-gateway) - - [Doku](https://docs.tenderly.co/web3-gateway/web3-gateway) - - Eigenschaften - - Kostenlose Stufe einschließlich 25 Millionen Tenderly-Einheiten pro Monat - - Kostenloser Zugang zu historischen Daten - - Bis zu 8-mal schnellere Lesevorgänge bei lastintensiven Workloads + - [Dokumentation](https://docs.tenderly.co/web3-gateway/web3-gateway) + - Funktionen + - Kostenloser Tarif mit 25 Millionen Tenderly-Einheiten pro Monat + - Kostenloser Zugriff auf historische Daten + - Bis zu 8-mal schnellere leseintensive Workloads - 100 % konsistenter Lesezugriff - JSON-RPC-Endpunkte - - UI-basierter RPC-Anforderungs-Builder und Vorschau der Anforderung - - Eng integriert mit Tenderlys Entwicklungs-, Debugging- und Testwerkzeugen + - UI-basierter RPC-Anfrage-Builder und Anfragevorschau + - Eng integriert mit den Entwicklungs-, Debugging- und Testtools von Tenderly - Transaktionssimulationen - Nutzungsanalysen und Filterung - - Einfache Zugriffsschlüssel-Verwaltung + - Einfache Verwaltung von Zugriffsschlüsseln - Dedizierter technischer Support per Chat, E-Mail und Discord - [**Tokenview**](https://services.tokenview.io/) - - [Doku](https://services.tokenview.io/docs?type=nodeService) - - Eigenschaften - - Technischer Support rund um die Uhr & Entwickler-Telegram-Community - - Multichain-Unterstützung (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic) - - Sowohl RPC- als auch WSS-Endpunkte können verwendet werden - - Unbegrenzter Zugang zur Archivdaten-API + - [Dokumentation](https://services.tokenview.io/docs?type=nodeService) + - Funktionen + - Technischer 24/7-Support & Entwickler-Telegram-Community + - Multi-Chain-Unterstützung (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic) + - Sowohl RPC- als auch WSS-Endpunkte sind offen nutzbar + - Unbegrenzter Zugriff auf die Archivdaten-API - Dashboard mit Request Explorer und Mempool Watcher - NFT-Daten-API und Webhook-Benachrichtigung - - Mit Kryptowährung zahlen - - Externe Unterstützung für zusätzliche Verhaltenskriterien + - Zahlung in Krypto + - Externer Support für zusätzliche Verhaltensanforderungen - [**Watchdata**](https://watchdata.io/) - - [Doku](https://docs.watchdata.io/) - - Eigenschaften - - Zuverlässigkeit der Daten - - Ununterbrochene Verbindung ohne Ausfallzeiten + - [Dokumentation](https://docs.watchdata.io/) + - Funktionen + - Datenzuverlässigkeit + - Unterbrechungsfreie Verbindung ohne Ausfallzeiten - Prozessautomatisierung - Kostenlose Tarife - - Hohe Limits, für jeden Benutzer geeignet - - Unterstützung für unterschiedliche Nodes + - Hohe Limits, die für jeden Benutzer geeignet sind + - Unterstützung für verschiedene Blockchain-Knoten - Ressourcenskalierung - - Hohe Verarbeitungsgeschwindigkeit + - Hohe Verarbeitungsgeschwindigkeiten - [**ZMOK**](https://zmok.io/) - - [Doku](https://docs.zmok.io/) - - Eigenschaften - - Front-Running als Service - - Globale Transaktions-Mempool mit Such- und Filtermethoden - - Unbegrenzte Transaktionsgebühr und unendliches Gas für den Versand von Transaktionen - - Schnellster Zugriff auf den neuen Block und Lesen der Blockchain - - Die beste Preisgarantie pro API-Aufruf + - [Dokumentation](https://docs.zmok.io/) + - Funktionen + - Front-Running als Dienstleistung + - Globaler Transaktions-Mempool mit Such-/Filtermethoden + - Unbegrenzte Transaktionsgebühr und unendliches Gas für das Senden von Transaktionen + - Schnellster Abruf des neuen Blocks und Lesen der Blockchain + - Garantie für den besten Preis pro API-Aufruf - [**Zeeve**](https://www.zeeve.io/) - - [Doku](https://www.zeeve.io/docs/) - - Eigenschaften - - No-Code-Automatisierungsplattform auf Unternehmensebene, die die Bereitstellung, Überwachung und Verwaltung von Blockchain-Knoten und -Netzwerken ermöglicht - - Über 30 unterstützte Protokolle & Integrationen, und es werden immer mehr - - Wertsteigernde Web3-Infrastrukturdienste wie dezentraler Speicher, dezentrale Identität und Blockchain-Ledger-Daten-APIs für reale Anwendungsfälle - - Support und proaktives Monitoring rund um die Uhr stellen die Sicherheit der Knoten zu jeder Zeit sicher. - - RPC-Endpunkte bieten authentifizierten Zugriff auf APIs, eine unkomplizierte Verwaltung mit einem intuitiven Dashboard und Analysen. - - Bietet sowohl Optionen für verwaltete Clouds und Nutzung der eigenen Cloud und Support für die wichtigsten Cloud-Anbieter wie AWS, Azure, Google Cloud, Digital Ocean andere lokale Anbieter. - - Wir verwenden intelligentes Routing, um bei jeder Anfrage den dem Benutzer am nächsten gelegenen Knoten anzusteuern + - [Dokumentation](https://www.zeeve.io/docs/) + - Funktionen + - No-Code-Automatisierungsplattform auf Unternehmensniveau, die Bereitstellung, Überwachung und Verwaltung von Blockchain-Knoten und Netzwerken bietet + - 30+ unterstützte Protokolle & Integrationen, und es werden mehr + - Mehrwertige Web3-Infrastrukturdienste wie dezentralisierte Speicherung, dezentralisierte Identität und Blockchain-Ledger-Daten-APIs für reale Anwendungsfälle + - 24/7-Support und proaktive Überwachung gewährleisten jederzeit die Gesundheit der Blockchain-Knoten. + - RPC-Endpunkte bieten authentifizierten Zugriff auf APIs, problemlose Verwaltung mit intuitivem Dashboard und Analysen. + - Bietet sowohl Managed-Cloud- als auch Bring-Your-Own-Cloud-Optionen zur Auswahl und unterstützt alle großen Cloud-Anbieter wie AWS, Azure, Google Cloud, Digital Ocean und On-Premise. + - Wir verwenden intelligentes Routing, um jedes Mal den Blockchain-Knoten zu erreichen, der Ihrem Benutzer am nächsten ist -## Weiterführende Lektüre {#further-reading} -- [Liste von Ethereum-Node-Diensten](https://ethereumnodes.com/) +## Weiterführende Literatur {#further-reading} + +- [Liste von Ethereum-Blockchain-Knoten-Diensten](https://ethereumnodes.com/) ## Verwandte Themen {#related-topics} -- [Nodes und Clients](/developers/docs/nodes-and-clients/) +- [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) ## Verwandte Tutorials {#related-tutorials} -- [Erste Schritte in der Ethereum-Entwicklung mit Alchemy](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) -- [Anleitung zum Senden von Transaktionen mit Web3 und Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +- [Erste Schritte mit der Ethereum-Entwicklung unter Verwendung von Alchemy](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) +- [Leitfaden zum Senden von Transaktionen mit Web3 und Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index 911146a3a5c..2a99668182c 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -1,184 +1,184 @@ --- -title: Errichten Sie Ihren eigenen Ethereum-Node -description: "Allgemeine Einführung in den Betrieb einer eigenen Ethereum-Client-Instanz." +title: Richten Sie Ihren eigenen Ethereum-Blockchain-Knoten ein +description: "Allgemeine Einführung in den Betrieb einer eigenen Instanz einer Ethereum-Anwendung." lang: de sidebarDepth: 2 --- -Der Betrieb eines eigenen Nodes bietet Ihnen verschiedene Vorteile, eröffnet neue Möglichkeiten und trägt zur Unterstützung des Ökosystems bei. Diese Seite führt Sie durch die Einrichtung Ihres eigenen Nodes und die Teilnahme an der Validierung von Ethereum-Transaktionen. +Der Betrieb Ihres eigenen Blockchain-Knotens bietet Ihnen verschiedene Vorteile, eröffnet neue Möglichkeiten und hilft, das Ökosystem zu unterstützen. Diese Seite führt Sie durch die Einrichtung Ihres eigenen Blockchain-Knotens und die Teilnahme an der Validierung von [Ethereum](/)-Transaktionen. -Beachten Sie, dass nach [The Merge](/roadmap/merge) zwei Clients erforderlich sind, um einen Ethereum-Node zu betreiben; ein Client für die **Ausführungsebene (EL)** und ein Client für die **Konsensebene (CL)**. Auf dieser Seite zeigen wir Ihnen die Installation, Konfiguration und Verbindung dieser beiden Clients, um einen Ethereum-Knoten zu betreiben. +Beachten Sie, dass nach dem [Merge](/roadmap/merge) zwei Anwendungen erforderlich sind, um einen Ethereum-Blockchain-Knoten zu betreiben: ein Client der **Ausführungsebene (EL)** (Ausführungs-Client) und ein Client der **Konsensebene (CL)** (Konsens-Client). Diese Seite zeigt, wie Sie diese beiden Anwendungen installieren, konfigurieren und verbinden, um einen Ethereum-Blockchain-Knoten zu betreiben. ## Voraussetzungen {#prerequisites} -Sie sollten verstehen, was ein Ethereum-Knoten ist und warum Sie ggf. einen Client betreiben sollten. Dies wird unter [Nodes und Clients](/developers/docs/nodes-and-clients/) behandelt. +Sie sollten verstehen, was ein Ethereum-Blockchain-Knoten ist und warum Sie eine Anwendung betreiben möchten. Dies wird unter [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) behandelt. -Wenn das Thema für Sie neu ist oder Sie nach einem weniger technischen Weg suchen, empfehlen wir Ihnen, sich zuerst unsere benutzerfreundliche Einführung zum Thema [Betrieb eines Ethereum-Nodes](/run-a-node) anzusehen. +Wenn das Thema des Betriebs eines Blockchain-Knotens neu für Sie ist oder Sie nach einem weniger technischen Weg suchen, empfehlen wir Ihnen, sich zuerst unsere benutzerfreundliche Einführung zum [Betrieb eines Ethereum-Blockchain-Knotens](/run-a-node) anzusehen. -## Wahl eines Ansatzes {#choosing-approach} +## Einen Ansatz wählen {#choosing-approach} -Der erste Schritt beim Einrichten Ihres Knotens besteht in der Wahl der Herangehensweise. Auf der Grundlage der Anforderungen und der verschiedenen Möglichkeiten müssen Sie die Client-Implementierung (sowohl für Ausführungs- als auch für Konsensclients), die Umgebung (Hardware, System) und die Parameter für die Client-Einstellungen auswählen. +Der erste Schritt bei der Einrichtung Ihres Blockchain-Knotens ist die Wahl Ihres Ansatzes. Basierend auf den Anforderungen und verschiedenen Möglichkeiten müssen Sie die Anwendungsimplementierung (sowohl von Ausführungs-Clients als auch von Konsens-Clients), die Umgebung (Hardware, System) und die Parameter für die Anwendungseinstellungen auswählen. -Diese Seite wird Sie dabei unterstützen, diese Entscheidungen zu treffen und die am besten geeignete Methode für den Betrieb Ihrer Ethereum-Instanz zu finden. +Diese Seite wird Sie durch diese Entscheidungen führen und Ihnen helfen, den am besten geeigneten Weg zum Betrieb Ihrer Ethereum-Instanz zu finden. -Um aus den Client-Implementierungen zu wählen, sehen Sie sich alle verfügbaren Mainnet-fähigen [Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) und [Konsens-Clients](/developers/docs/nodes-and-clients/#consensus-clients) an und erfahren Sie mehr über [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity). +Um aus den Anwendungsimplementierungen auszuwählen, sehen Sie sich alle verfügbaren Mainnet-bereiten [Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) und [Konsens-Clients](/developers/docs/nodes-and-clients/#consensus-clients) an und erfahren Sie mehr über [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity). -Entscheiden Sie, ob Sie die Software auf Ihrer eigenen [Hardware oder in der Cloud](#local-vs-cloud) ausführen möchten, und berücksichtigen Sie dabei die [Anforderungen](#requirements) der Clients. +Entscheiden Sie, ob Sie die Software auf Ihrer eigenen [Hardware oder in der Cloud](#local-vs-cloud) ausführen möchten, und berücksichtigen Sie dabei die [Anforderungen](#requirements) der Anwendungen. -Nachdem Sie die Umgebung vorbereitet haben, installieren Sie die ausgewählten Clients entweder über eine [einsteigerfreundliche Oberfläche](#automatized-setup) oder [manuell](#manual-setup) über ein Terminal mit erweiterten Optionen. +Nach der Vorbereitung der Umgebung installieren Sie die ausgewählten Anwendungen entweder über eine [anfängerfreundliche Benutzeroberfläche](#automatized-setup) oder [manuell](#manual-setup) über ein Terminal mit erweiterten Optionen. -Wenn der Node läuft und synchronisiert, sind Sie bereit, ihn zu [verwenden](#using-the-node), aber achten Sie darauf, seine [Wartung](#operating-the-node) im Auge zu behalten. +Wenn der Blockchain-Knoten läuft und synchronisiert wird, sind Sie bereit, ihn zu [nutzen](#using-the-node), aber achten Sie darauf, seine [Wartung](#operating-the-node) im Auge zu behalten. -![Client-Einrichtung](./diagram.png) +![Anwendungseinrichtung](./diagram.png) ### Umgebung und Hardware {#environment-and-hardware} #### Lokal oder Cloud {#local-vs-cloud} -Ethereum-Clients können auf gewöhnlichen Heim-Computern ausgeführt werden und benötigen keine spezielle Hardware, wie z. B. Mining-Maschinen. Sie haben also verschiedene Möglichkeiten, den Knoten je nach Ihren Bedürfnissen zu betreiben. -Zur Vereinfachung stellen wir uns vor, dass ein Knoten sowohl auf einem lokalen physischen Computer als auch auf einem Cloud-Server ausgeführt werden kann: +Ethereum-Anwendungen können auf handelsüblichen Computern ausgeführt werden und erfordern keine spezielle Hardware, wie zum Beispiel Mining-Maschinen. Daher haben Sie je nach Ihren Bedürfnissen verschiedene Optionen für die Bereitstellung des Blockchain-Knotens. +Zur Vereinfachung betrachten wir den Betrieb eines Blockchain-Knotens sowohl auf einer lokalen physischen Maschine als auch auf einem Cloud-Server: - Cloud - - Anbieter bieten eine hohe Serververfügbarkeit und statische öffentliche IP-Adressen - - Ein dedizierter oder virtueller Server kann bequemer sein als ein eigener - - Die Gegenleistung ist das Vertrauen in eine dritte Partei – den Serveranbieter - - Aufgrund der erforderlichen Speichergröße für vollständige Knoten kann der Preis für einen gemieteten Server hoch sein + - Anbieter bieten eine hohe Serververfügbarkeit und statische öffentliche IP-Adressen. + - Einen dedizierten oder virtuellen Server zu mieten, kann bequemer sein, als einen eigenen zu bauen. + - Der Kompromiss besteht darin, einem Dritten – dem Serveranbieter – vertrauen zu müssen. + - Aufgrund der erforderlichen Speichergröße für einen vollständigen Blockchain-Knoten kann der Preis für einen gemieteten Server hoch werden. - Eigene Hardware - - Vertrauenslosere und souveränere Vorgehensweise - - Einmalige Investition - - Option zum Kauf vorkonfigurierter Maschinen - - Sie müssen den Rechner und das Netzwerk technisch vorbereiten, warten und möglicherweise Fehler beheben + - Vertrauensloserer und souveränerer Ansatz. + - Einmalige Investition. + - Die Möglichkeit, vorkonfigurierte Maschinen zu kaufen. + - Sie müssen die Maschine und das Netzwerk physisch vorbereiten, warten und potenziell Fehler beheben. -Beide Optionen haben verschiedene Vorteile, die oben zusammengefasst sind. Wenn Sie eine Cloud-Lösung suchen, gibt es neben vielen traditionellen Cloud-Computing-Anbietern auch Dienste, die sich auf die Bereitstellung von Knoten konzentrieren. Weitere Optionen für gehostete Nodes finden Sie unter [Nodes as a Service](/developers/docs/nodes-and-clients/nodes-as-a-service/). +Beide Optionen haben verschiedene Vorteile, die oben zusammengefasst sind. Wenn Sie nach einer Cloud-Lösung suchen, gibt es neben vielen traditionellen Cloud-Computing-Anbietern auch Dienste, die sich auf die Bereitstellung von Blockchain-Knoten konzentrieren. Sehen Sie sich [Blockchain-Knoten als Dienstleistung (Nodes as a Service)](/developers/docs/nodes-and-clients/nodes-as-a-service/) für weitere Optionen zu gehosteten Blockchain-Knoten an. #### Hardware {#hardware} -Ein zensurresistentes, dezentrales Netz sollte sich jedoch nicht auf Cloudanbieter verlassen. Stattdessen ist es für das Ökosystem gesünder, wenn Sie Ihren Node auf Ihrer eigenen lokalen Hardware betreiben. [Schätzungen](https://www.ethernodes.org/networkType/cl/Hosting) zeigen, dass ein großer Teil der Nodes in der Cloud betrieben wird, was zu einem Single Point of Failure werden könnte. +Ein zensurresistentes, dezentralisiertes Netzwerk sollte sich jedoch nicht auf Cloud-Anbieter verlassen. Stattdessen ist der Betrieb Ihres Blockchain-Knotens auf Ihrer eigenen lokalen Hardware gesünder für das Ökosystem. [Schätzungen](https://www.ethernodes.org/networkType/cl/Hosting) zeigen, dass ein großer Teil der Blockchain-Knoten in der Cloud läuft, was zu einem Single Point of Failure (einzelner Ausfallpunkt) werden könnte. -Ethereum-Clients können auf Ihrem Computer, Laptop, Server oder sogar auf einem Einplatinencomputer ausgeführt werden. Es ist zwar möglich, Clients auf Ihrem Heimcomputer auszuführen, jedoch kann ein eigens für Ihren Knoten eingerichteter Rechner dessen Leistung und Sicherheit erheblich verbessern und gleichzeitig die Auswirkungen auf Ihren primären Computer minimieren. +Ethereum-Anwendungen können auf Ihrem Computer, Laptop, Server oder sogar auf einem Einplatinencomputer ausgeführt werden. Obwohl die Ausführung von Anwendungen auf Ihrem PC möglich ist, kann eine dedizierte Maschine nur für Ihren Blockchain-Knoten dessen Leistung und Sicherheit erheblich verbessern und gleichzeitig die Auswirkungen auf Ihren Hauptcomputer minimieren. -Die Verwendung Ihrer eigenen Hardware kann sehr einfach sein. Es gibt viele einfache Optionen, aber auch fortgeschrittene Einstellungen für technisch versierte Personen. Schauen wir uns also die Voraussetzungen und Mittel für die Ausführung von Ethereum-Clients auf Ihrem Rechner an. +Die Verwendung eigener Hardware kann sehr einfach sein. Es gibt viele einfache Optionen sowie fortgeschrittene Setups für technisch versiertere Personen. Lassen Sie uns also die Anforderungen und Mittel für den Betrieb von Ethereum-Anwendungen auf Ihrer Maschine betrachten. #### Anforderungen {#requirements} -Die Hardware-Anforderungen sind je nach Client unterschiedlich, aber im Allgemeinen nicht besonders hoch, da der Knoten nur synchronisiert bleiben muss. Verwechseln Sie das nicht mit dem Mining, das viel mehr Rechenleistung erfordert. Die Synchronisation von Zeit und Leistung verbessert sich jedoch mit leistungsstärkerer Hardware. +Die Hardwareanforderungen unterscheiden sich je nach Anwendung, sind aber im Allgemeinen nicht so hoch, da der Blockchain-Knoten nur synchronisiert bleiben muss. Verwechseln Sie dies nicht mit Mining, das viel mehr Rechenleistung erfordert. Synchronisationszeit und Leistung verbessern sich jedoch mit leistungsfähigerer Hardware. -Bevor Sie einen Client installieren, stellen Sie bitte sicher, dass Ihr Computer über genügend Ressourcen verfügt, um ihn auszuführen. Im Folgenden finden Sie die Mindestanforderungen und die empfohlenen Voraussetzungen. +Bevor Sie eine Anwendung installieren, stellen Sie bitte sicher, dass Ihr Computer über genügend Ressourcen verfügt, um sie auszuführen. Sie finden die minimalen und empfohlenen Anforderungen unten. -Der Engpass für Ihre Hardware ist meist der Speicherplatz. Die Synchronisierung der Ethereum-Blockchain ist sehr ein- und ausgabeintensiv und benötigt viel Speicherplatz. Am besten ist es, ein **Solid-State-Drive (SSD)** mit Hunderten von GB freiem Speicherplatz zu haben, der auch nach der Synchronisierung noch verfügbar ist. +Der Engpass für Ihre Hardware ist meistens der Speicherplatz. Die Synchronisierung der Ethereum-Blockchain ist sehr ein-/ausgabeintensiv und erfordert viel Platz. Es ist am besten, ein **Solid-State-Drive (SSD)** mit Hunderten von GB freiem Speicherplatz zu haben, der auch nach der Synchronisierung noch zur Verfügung steht. -Die Größe der Datenbank und die Geschwindigkeit der anfänglichen Synchronisierung hängen vom gewählten Client, seiner Konfiguration und [Synchronisierungsstrategie](/developers/docs/nodes-and-clients/#sync-modes) ab. +Die Größe der Datenbank und die Geschwindigkeit der anfänglichen Synchronisierung hängen von der gewählten Anwendung, ihrer Konfiguration und der [Synchronisationsstrategie](/developers/docs/nodes-and-clients/#sync-modes) ab. -Stellen Sie außerdem sicher, dass Ihre Internetverbindung nicht durch eine [Bandbreitenbegrenzung](https://wikipedia.org/wiki/Data_cap) eingeschränkt ist. Es wird empfohlen, eine nicht gebührenpflichtige Verbindung zu verwenden, da die anfängliche Synchronisierung und die an das Netzwerk übertragenen Daten Ihr Limit überschreiten könnten. +Stellen Sie außerdem sicher, dass Ihre Internetverbindung nicht durch eine [Bandbreitenbeschränkung](https://wikipedia.org/wiki/Data_cap) limitiert ist. Es wird empfohlen, eine unbegrenzte Verbindung zu verwenden, da die anfängliche Synchronisierung und die an das Netzwerk gesendeten Daten Ihr Limit überschreiten könnten. ##### Betriebssystem -Alle Clients unterstützen die wichtigsten Betriebssysteme: Linux, MacOS, Windows. Das bedeutet, dass Ihre Knoten auf normalen Desktop- oder Server-Rechnern mit dem Betriebssystem (OS), welches Ihnen am besten passt, betrieben werden können. Stellen Sie sicher, dass Ihr Betriebssystem auf dem neuesten Stand ist, um mögliche Probleme und Sicherheitslücken zu vermeiden. +Alle Anwendungen unterstützen die gängigen Betriebssysteme – Linux, MacOS, Windows. Das bedeutet, dass Sie Blockchain-Knoten auf normalen Desktop- oder Servermaschinen mit dem Betriebssystem (OS) ausführen können, das am besten zu Ihnen passt. Stellen Sie sicher, dass Ihr Betriebssystem auf dem neuesten Stand ist, um potenzielle Probleme und Sicherheitslücken zu vermeiden. ##### Mindestanforderungen -- CPU mit mind. 2 Kernen +- CPU mit 2+ Kernen - 8 GB RAM -- 2TB SSD -- Mind. 10 MBit/s Bandbreite +- 2 TB SSD +- 10+ MBit/s Bandbreite ##### Empfohlene Spezifikationen -- Schnelle CPU mit mind. 4 Kernen -- Mind. 16 GB RAM -- Schnelle SSD mit mind. 2 TB -- Mind. 25 MBit/s Bandbreite +- Schnelle CPU mit 4+ Kernen +- 16 GB+ RAM +- Schnelle SSD mit 2+ TB +- 25+ MBit/s Bandbreite -Der von Ihnen gewählte Synchronisierungsmodus und Client wirken sich auf den Speicherplatzbedarf aus, wir haben jedoch den Speicherplatz, den Sie für jeden Client benötigen, im Folgenden geschätzt. +Der Synchronisationsmodus und die Anwendung, die Sie wählen, wirken sich auf den Speicherbedarf aus, aber wir haben den Speicherplatz, den Sie für jede Anwendung benötigen, unten geschätzt. -| Client | Festplattengröße (Snap-Synchronisation) | Festplattengröße (Vollständiges Archiv) | -| ---------- | ---------------------------------------------------------- | ---------------------------------------------------------- | -| Besu | Mind. 800 GB | Mind. 12TB | -| Erigon | N/V | Mind. 2,5 TB | -| Geth | Mind. 500 GB | Mind. 12TB | -| Nethermind | Mind. 500 GB | Mind. 12TB | -| Reth | N/V | Über 2,2 TB | +| Anwendung | Festplattengröße (Snap-Sync) | Festplattengröße (vollständiges Archiv) | +| ---------- | ---------------------------- | --------------------------------------- | +| Besu | 800 GB+ | 12 TB+ | +| Erigon | N/A | 2,5 TB+ | +| Geth | 500 GB+ | 12 TB+ | +| Nethermind | 500 GB+ | 12 TB+ | +| Reth | N/A | 2,2 TB+ | -- Hinweis: Erigon und Reth bieten keine Snap-Synchronisierung, aber vollständiges Pruning ist möglich (ca. 2 TB für Erigon, ca. 1,2 TB für Reth) +- Hinweis: Erigon und Reth bieten keinen Snap-Sync an, aber vollständiges Pruning (Full Pruning) ist möglich (\~2 TB für Erigon, ~1,2 TB für Reth). -Bei Konsens-Clients hängt der Platzbedarf auch von der Client-Implementierung und den aktivierten Funktionen ab (z. B. Validator-Slasher), aber im Allgemeinen sind weitere 200 GB für Beacon-Daten erforderlich. Mit einer großen Anzahl von Validatoren steigt auch die Bandbreitenbelastung. [Details zu den Anforderungen von Konsens-Clients finden Sie in dieser Analyse](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc). +Für Konsens-Clients hängt der Speicherbedarf auch von der Anwendungsimplementierung und den aktivierten Funktionen (z. B. Validator-Slasher) ab, aber rechnen Sie im Allgemeinen mit weiteren 200 GB, die für Beacon-Daten benötigt werden. Mit einer großen Anzahl von Validatoren wächst auch die Bandbreitenbelastung. Sie finden [Details zu den Anforderungen von Konsens-Clients in dieser Analyse](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc). #### Plug-and-Play-Lösungen {#plug-and-play} -Die einfachste Möglichkeit, einen Knoten mit eigener Hardware zu betreiben, ist die Verwendung von Plug-and-Play-Modulen. Vorkonfigurierte Geräte von Anbietern bieten die unkomplizierteste Lösung: bestellen, anschließen, loslegen. Alles ist vorkonfiguriert und läuft automatisch mit einer intuitiven Anleitung und einem Dashboard zur Überwachung und Steuerung der Software. +Die einfachste Option für den Betrieb eines Blockchain-Knotens mit eigener Hardware ist die Verwendung von Plug-and-Play-Boxen. Vorkonfigurierte Maschinen von Anbietern bieten die unkomplizierteste Erfahrung: bestellen, anschließen, ausführen. Alles ist vorkonfiguriert und läuft automatisch mit einer intuitiven Anleitung und einem Dashboard zur Überwachung und Steuerung der Software. - [DappNode](https://dappnode.io/) - [Avado](https://ava.do/) #### Ethereum auf einem Einplatinencomputer {#ethereum-on-a-single-board-computer} -Eine einfache und kostengünstige Möglichkeit, einen Ethereum-Node zu betreiben, ist die Verwendung eines Einplatinenrechners, sogar mit einer ARM-Architektur wie dem Raspberry Pi. [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) bietet einfach auszuführende Images für verschiedene Ausführungs- und Konsens-Clients für Raspberry Pi und andere ARM-Boards. +Eine einfache und günstige Möglichkeit, einen Ethereum-Blockchain-Knoten zu betreiben, ist die Verwendung eines Einplatinencomputers, sogar mit einer ARM-Architektur wie dem Raspberry Pi. [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) bietet einfach auszuführende Images mehrerer Ausführungs- und Konsens-Clients für Raspberry Pi und andere ARM-Boards. -Kleine, kostengünstige und effiziente Geräte wie diese sind ideal für den Betrieb eines Knotens im eigenen Haushalt, doch sollte man ihre begrenzte Leistung nicht überschätzen. +Kleine, erschwingliche und effiziente Geräte wie diese sind ideal für den Betrieb eines Blockchain-Knotens zu Hause, aber bedenken Sie deren begrenzte Leistung. -## Den Node hochfahren {#spinning-up-node} +## Den Blockchain-Knoten einrichten {#spinning-up-node} -Die eigentliche Client-Einrichtung kann entweder mit automatischen Startprogrammen (Launcher) oder manuell erfolgen, indem die Client-Software direkt eingerichtet wird. +Die eigentliche Einrichtung der Anwendung kann entweder mit automatisierten Launchern oder manuell durch direkte Einrichtung der Anwendungssoftware erfolgen. -Für weniger fortgeschrittene Benutzer empfiehlt sich die Verwendung eines „Launchers“, einer Software, die Sie durch die Installation führt und den Client-Einrichtungsprozess automatisiert. Wenn Sie jedoch etwas Erfahrung im Umgang mit einem Terminal haben, sollten die Schritte zur manuellen Einrichtung einfach zu befolgen sein. +Für weniger fortgeschrittene Benutzer ist der empfohlene Ansatz die Verwendung eines Launchers, einer Software, die Sie durch die Installation führt und den Einrichtungsprozess der Anwendung automatisiert. Wenn Sie jedoch etwas Erfahrung mit der Verwendung eines Terminals haben, sollten die Schritte für die manuelle Einrichtung einfach zu befolgen sein. -### Geführtes Setup {#automatized-setup} +### Geführte Einrichtung {#automatized-setup} -Mehrere benutzerfreundliche Projekte zielen darauf ab, die Erfahrungen bei der Einrichtung eines Kunden zu verbessern. Diese Launcher bieten eine automatische Client-Installation und -Konfiguration, wobei einige sogar eine grafische Oberfläche für die geführte Einrichtung und Überwachung der Clients bieten. +Mehrere benutzerfreundliche Projekte zielen darauf ab, die Erfahrung bei der Einrichtung einer Anwendung zu verbessern. Diese Launcher bieten eine automatische Installation und Konfiguration der Anwendung, wobei einige sogar eine grafische Benutzeroberfläche für die geführte Einrichtung und Überwachung von Anwendungen bieten. -Im Folgenden finden Sie einige Projekte, mit denen Sie Clients mit wenigen Klicks installieren und steuern können: +Im Folgenden finden Sie einige Projekte, die Ihnen helfen können, Anwendungen mit nur wenigen Klicks zu installieren und zu steuern: -- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) – DappNode wird nicht nur als Maschine von einem Anbieter geliefert. Die Software, der eigentliche Node Launcher und das Kontrollzentrum mit vielen Funktionen kann auf beliebiger Hardware eingesetzt werden. -- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) – Schnellster und einfachster Weg, einen Full Node einzurichten. Einzeiliges Setup-Tool und Knotenverwaltung TUI. Kostenlos. Open Source. Öffentliche Güter für Ethereum durch Solo-Staker. ARM64- und AMD64-Unterstützung. -- [eth-docker](https://eth-docker.net/) – Automatisierte Einrichtung mit Docker, die auf einfaches und sicheres Staking ausgerichtet ist, grundlegende Terminal- und Docker-Kenntnisse erfordert und für etwas fortgeschrittenere Benutzer empfohlen wird. -- [Stereum](https://stereum-dev.github.io/ethereum-node-web-docs) – Launcher zur Installation von Clients auf einem Remote-Server über eine SSH-Verbindung mit einer GUI-Einrichtungsanleitung, einem Kontrollzentrum und vielen anderen Funktionen. -- [Sedge](https://docs.sedge.nethermind.io/docs/intro) – Node-Setup-Tool, das automatisch eine Docker-Konfiguration mit einem CLI-Assistenten generiert. Geschrieben in Go von Nethermind. +- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) – DappNode wird nicht nur mit einer Maschine von einem Anbieter geliefert. Die Software, der eigentliche Blockchain-Knoten-Launcher und das Kontrollzentrum mit vielen Funktionen können auf beliebiger Hardware verwendet werden. +- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) – Der schnellste und einfachste Weg, einen vollständigen Blockchain-Knoten einzurichten. Einzeiliges Setup-Tool und TUI zur Verwaltung von Blockchain-Knoten. Kostenlos. Open Source. Öffentliche Güter für Ethereum von Solo-Stakern. Unterstützung für ARM64 und AMD64. +- [eth-docker](https://eth-docker.net/) – Automatisiertes Setup mit Docker, das sich auf einfaches und sicheres Staking konzentriert, erfordert grundlegende Terminal- und Docker-Kenntnisse, empfohlen für etwas fortgeschrittenere Benutzer. +- [Stereum](https://stereum-dev.github.io/ethereum-node-web-docs) – Launcher zur Installation von Anwendungen auf einem Remote-Server über eine SSH-Verbindung mit einer GUI-Einrichtungsanleitung, einem Kontrollzentrum und vielen weiteren Funktionen. +- [Sedge](https://docs.sedge.nethermind.io/docs/intro) – Tool zur Einrichtung von Blockchain-Knoten, das mithilfe eines CLI-Assistenten automatisch eine Docker-Konfiguration generiert. Geschrieben in Go von Nethermind. -### Manuelles Einrichten der Clients {#manual-setup} +### Manuelle Einrichtung von Anwendungen {#manual-setup} -Die andere Möglichkeit besteht darin, die Client-Software manuell herunterzuladen, zu überprüfen und zu konfigurieren. Auch wenn einige Clients eine grafische Oberfläche bieten, erfordert eine manuelle Einrichtung immer noch Grundkenntnisse im Umgang mit dem Terminal, bietet aber viel mehr Möglichkeiten. +Die andere Option besteht darin, die Anwendungssoftware manuell herunterzuladen, zu verifizieren und zu konfigurieren. Auch wenn einige Anwendungen eine grafische Benutzeroberfläche bieten, erfordert eine manuelle Einrichtung dennoch grundlegende Kenntnisse im Umgang mit dem Terminal, bietet aber viel mehr Vielseitigkeit. -Wie bereits erläutert, muss für die Einrichtung Ihres eigenen Ethereum-Knotens ein Paar bestehend aus Konsens- und Ausführungsclients ausgeführt werden. Einige Clients können einen „leichten Client“ der alternativen Art enthalten und synchronisieren, ohne dass weitere Software erforderlich ist. Für eine vollständige vertrauenswürdige Überprüfung sind jedoch beide Implementierungen erforderlich. +Wie bereits erklärt, erfordert die Einrichtung Ihres eigenen Ethereum-Blockchain-Knotens den Betrieb eines Paares aus Konsens- und Ausführungs-Clients. Einige Anwendungen enthalten möglicherweise einen Light-Client der anderen Art und synchronisieren sich, ohne dass weitere Software benötigt wird. Eine vollständige vertrauenslose Verifizierung erfordert jedoch beide Implementierungen. -#### Die Client-Software erhalten {#getting-the-client} +#### Beschaffung der Anwendungssoftware {#getting-the-client} -Zuerst müssen Sie die Software für Ihren bevorzugten [Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-clients) und [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients) beschaffen. +Zuerst müssen Sie Ihre bevorzugte [Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-clients)- und [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients)-Software beschaffen. -Sie können einfach eine ausführbare Anwendung oder ein Installationspaket herunterladen, das für Ihr Betriebssystem und Ihre Systemarchitektur geeignet ist. Überprüfen Sie immer die Signaturen und Prüfsummen der heruntergeladenen Pakete. Einige Clients bieten auch Repositories oder Docker-Abbildungen zur einfacheren Installation und Aktualisierung an. Alle Clients sind quelloffen, so dass Sie sie auch aus dem Quellcode erstellen können. Dies ist eine fortgeschrittenere Methode, jedoch kann sie in manchen Fällen erforderlich sein. +Sie können einfach eine ausführbare Anwendung oder ein Installationspaket herunterladen, das zu Ihrem Betriebssystem und Ihrer Architektur passt. Überprüfen Sie immer die Signaturen und Prüfsummen der heruntergeladenen Pakete. Einige Anwendungen bieten auch Repositories oder Docker-Images für eine einfachere Installation und Updates an. Alle Anwendungen sind Open Source, sodass Sie sie auch aus dem Quellcode kompilieren können. Dies ist eine fortgeschrittenere Methode, die jedoch in einigen Fällen erforderlich sein kann. -Anleitungen zur Installation der einzelnen Clients finden Sie in der Dokumentation, die in den Client-Listen oben verlinkt ist. +Anweisungen zur Installation jeder Anwendung finden Sie in der Dokumentation, die in den obigen Anwendungslisten verlinkt ist. -Dort finden Sie die Versionsseiten der Clients, auf denen Sie die vorgefertigten Binärdateien oder Anweisungen zur Installation finden können: +Hier sind die Release-Seiten der Anwendungen, auf denen Sie deren vorkompilierte Binärdateien oder Installationsanweisungen finden können: ##### Ausführungs-Clients - [Besu](https://github.com/hyperledger/besu/releases) - [Erigon](https://github.com/ledgerwatch/erigon/releases) -- [Geth](https://geth.ethereum.org/downloads/) +- [Geth](https://geth.ethereum.org/downloads) - [Nethermind](https://downloads.nethermind.io/) - [Reth](https://reth.rs/installation/installation.html) -Es ist auch erwähnenswert, dass die Client-Diversität ein [Problem auf der Ausführungsebene](/developers/docs/nodes-and-clients/client-diversity/#execution-layer) darstellt. Den Lesern wird empfohlen, einen Minderheitenausführungsclient zu verwenden. +Es ist auch erwähnenswert, dass die Client-Vielfalt ein [Problem auf der Ausführungsebene](/developers/docs/nodes-and-clients/client-diversity/#execution-layer) darstellt. Es wird empfohlen, dass Leser in Erwägung ziehen, einen Ausführungs-Client der Minderheit auszuführen. ##### Konsens-Clients - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source) (Bietet keine vorgefertigte Binärdatei, nur ein Docker-Image oder muss aus dem Quellcode erstellt werden) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Bietet keine vorkompilierte Binärdatei, nur ein Docker-Image oder muss aus dem Quellcode kompiliert werden) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) -[Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) ist für Konsens-Nodes, die Validatoren betreiben, von entscheidender Bedeutung. Wenn die Mehrheit der Validatoren eine einzelne Client-Implementierung ausführt, ist die Netzwerksicherheit gefährdet. Es wird daher empfohlen, einen Minderheits-Client zu wählen. +[Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/) ist entscheidend für Konsens-Knoten, die Validatoren ausführen. Wenn die Mehrheit der Validatoren eine einzige Anwendungsimplementierung ausführt, ist die Netzwerksicherheit gefährdet. Es wird daher empfohlen, die Wahl einer Minderheitsanwendung in Betracht zu ziehen. -[Sehen Sie sich die aktuelle Nutzung von Netzwerk-Clients an](https://clientdiversity.org/) und erfahren Sie mehr über [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity). +[Sehen Sie sich die aktuelle Anwendungsnutzung im Netzwerk an](https://clientdiversity.org/) und erfahren Sie mehr über [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity). ##### Verifizierung der Software -Beim Herunterladen von Software aus dem Internet wird empfohlen, deren Integrität zu überprüfen. Diese Maßnahme ist zwar freiwillig, aber gerade bei essenziellen Infrastrukturkomponenten wie dem Ethereum-Client ist es wichtig, mögliche Angriffsvektoren zu kennen und zu vermeiden. Sofern Sie eine vorgefertigte Binärdatei heruntergeladen haben, ist es erforderlich, darauf zu vertrauen und das damit verbundene Risiko einzugehen, dass ein Angreifer die ausführbare Datei gegen eine bösartige Variante austauschen könnte. +Beim Herunterladen von Software aus dem Internet wird empfohlen, deren Integrität zu überprüfen. Dieser Schritt ist optional, aber besonders bei einem so wichtigen Infrastrukturteil wie der Ethereum-Anwendung ist es wichtig, sich potenzieller Angriffsvektoren bewusst zu sein und diese zu vermeiden. Wenn Sie eine vorkompilierte Binärdatei heruntergeladen haben, müssen Sie ihr vertrauen und riskieren, dass ein Angreifer die ausführbare Datei gegen eine bösartige austauschen könnte. -Entwickler signieren veröffentlichte Binärdateien mit ihren PGP-Schlüsseln, sodass Sie kryptografisch überprüfen können, dass Sie genau die von ihnen erstellte Software ausführen. Sie müssen lediglich die von den Entwicklern verwendeten öffentlichen Schlüssel erhalten, die auf den Client-Versionsseiten oder in der Dokumentation gefunden werden können. Nachdem Sie das Client-Release und seine Signatur heruntergeladen haben, können Sie eine PGP-Implementierung, z. B. [GnuPG](https://gnupg.org/download/index.html), verwenden, um sie einfach zu verifizieren. Sehen Sie sich ein Tutorial zur Verifizierung von Open-Source-Software mit `gpg` unter [Linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) oder [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/) an. +Entwickler signieren veröffentlichte Binärdateien mit ihren PGP-Schlüsseln, sodass Sie kryptografisch überprüfen können, ob Sie genau die von ihnen erstellte Software ausführen. Sie müssen lediglich die von den Entwicklern verwendeten Public-Keys beschaffen, die auf den Release-Seiten der Anwendungen oder in der Dokumentation zu finden sind. Nach dem Herunterladen des Anwendungs-Releases und seiner Signatur können Sie eine PGP-Implementierung, z. B. [GnuPG](https://gnupg.org/download/index.html), verwenden, um diese einfach zu überprüfen. Sehen Sie sich ein Tutorial zur Überprüfung von Open-Source-Software mit `gpg` unter [Linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) oder [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/) an. -Eine weitere Form der Überprüfung besteht darin sicherzustellen, dass der Hash – ein eindeutiger kryptografischer Fingerabdruck – der heruntergeladenen Software mit dem vom Entwickler bereitgestellten übereinstimmt. Diese Vorgehensweise ist sogar unkomplizierter als die Verwendung von PGP, und bei einigen Programmen steht lediglich diese Option zur Verfügung. Führen Sie einfach die Hash-Funktion auf der heruntergeladenen Software aus und vergleichen Sie sie mit der auf der Veröffentlichungsseite angegebenen Funktion. Beispiel: +Eine weitere Form der Überprüfung besteht darin, sicherzustellen, dass der Hash, ein eindeutiger kryptografischer Fingerabdruck, der heruntergeladenen Software mit dem von den Entwicklern bereitgestellten übereinstimmt. Dies ist noch einfacher als die Verwendung von PGP, und einige Anwendungen bieten nur diese Option an. Führen Sie einfach die Hash-Funktion auf der heruntergeladenen Software aus und vergleichen Sie sie mit der auf der Release-Seite. Zum Beispiel: ```sh sha256sum teku-22.6.1.tar.gz @@ -186,60 +186,60 @@ sha256sum teku-22.6.1.tar.gz 9b2f8c1f8d4dab0404ce70ea314ff4b3c77e9d27aff9d1e4c1933a5439767dde ``` -#### Client-Einrichtung {#client-setup} +#### Einrichtung der Anwendung {#client-setup} -Nach der Installation, dem Herunterladen oder dem Kompilieren der Client-Software sind Sie bereit, sie auszuführen. Das bedeutet lediglich, dass es mit der richtigen Konfiguration ausgeführt werden muss. Die Clients bieten eine vielfältige Auswahl an Konfigurationsoptionen, die verschiedene Funktionen aktivieren können. +Nach der Installation, dem Herunterladen oder dem Kompilieren der Anwendungssoftware sind Sie bereit, sie auszuführen. Dies bedeutet nur, dass sie mit der richtigen Konfiguration ausgeführt werden muss. Anwendungen bieten umfangreiche Konfigurationsoptionen, die verschiedene Funktionen aktivieren können. -Lassen Sie uns mit den Optionen beginnen, die sich wesentlich auf die Leistung und die Datennutzung des Clients auswirken können. [Synchronisierungsmodi](/developers/docs/nodes-and-clients/#sync-modes) stellen verschiedene Methoden zum Herunterladen und Validieren von Blockchain-Daten dar. Bevor Sie den Knoten starten, sollten Sie entscheiden, welchen Netzwerk- und Synchronisierungsmodus Sie verwenden möchten. Die wichtigsten Faktoren, die berücksichtigt werden müssen, sind der benötigte Festplattenspeicher und die Synchronisationszeit des Clients. Achten Sie auf die Dokumentation des Clients, um festzustellen, welcher Synchronisationsmodus standardmäßig verwendet wird. Wenn dies nicht geeignet ist, wählen Sie einen anderen Client basierend auf Sicherheitsniveau, verfügbaren Daten und Kosten. Neben dem Synchronisations-Algorithmus können Sie auch verschiedene Arten von alten Daten automatisch reduzieren lassen (Pruning). Pruning ermöglicht das Löschen veralteter Daten, d.h. das Entfernen von State-Trie-Nodes, die von den letzten Blöcken aus nicht erreichbar sind. +Beginnen wir mit Optionen, die die Leistung der Anwendung und die Datennutzung erheblich beeinflussen können. [Synchronisationsmodi](/developers/docs/nodes-and-clients/#sync-modes) stellen verschiedene Methoden zum Herunterladen und Validieren von Blockchain-Daten dar. Bevor Sie den Blockchain-Knoten starten, sollten Sie entscheiden, welches Netzwerk und welchen Synchronisationsmodus Sie verwenden möchten. Die wichtigsten Dinge, die Sie berücksichtigen sollten, sind der Speicherplatz und die Synchronisationszeit, die die Anwendung benötigt. Achten Sie auf die Dokumentation der Anwendung, um festzustellen, welcher Synchronisationsmodus der Standard ist. Wenn Ihnen dieser nicht zusagt, wählen Sie einen anderen basierend auf dem Sicherheitsniveau, den verfügbaren Daten und den Kosten. Abgesehen vom Synchronisationsalgorithmus können Sie auch das Pruning (Bereinigen) verschiedener Arten alter Daten einstellen. Pruning ermöglicht das Löschen veralteter Daten, d. h. das Entfernen von State-Trie-Knoten, die von aktuellen Blöcken aus nicht erreichbar sind. -Andere grundlegende Konfigurationsoptionen sind z. B. die Wahl eines Netzwerks – Mainnet oder Testnets, die Aktivierung des HTTP-Endpunkts für RPC oder WebSockets usw. Sämtliche Funktionen und Optionen finden Sie in der Dokumentation des Clients. Verschiedene Client-Konfigurationen können durch Ausführen des Clients mit den entsprechenden Flaggen direkt in der Befehlszeilenschnittstelle (CLI) oder der Konfigurationsdatei festgelegt werden. Jeder Client ist etwas anders; bitte konsultieren Sie immer die offizielle Dokumentation oder Hilfeseite für Details zu den Konfigurationsoptionen. +Andere grundlegende Konfigurationsoptionen sind z. B. die Auswahl eines Netzwerks – Mainnet oder Testnets, die Aktivierung des HTTP-Endpunkts für RPC oder WebSockets usw. Sie finden alle Funktionen und Optionen in der Dokumentation der Anwendung. Verschiedene Anwendungskonfigurationen können festgelegt werden, indem die Anwendung mit den entsprechenden Flags direkt in der CLI oder der Konfigurationsdatei ausgeführt wird. Jede Anwendung ist ein wenig anders; bitte beziehen Sie sich immer auf die offizielle Dokumentation oder Hilfeseite für Details zu den Konfigurationsoptionen. -Zu Testzwecken sollten Sie einen Client in einem der Testnetzwerke betreiben. [Siehe Übersicht der unterstützten Netzwerke](/developers/docs/nodes-and-clients/#execution-clients). +Zu Testzwecken ziehen Sie es möglicherweise vor, eine Anwendung in einem der Testnet-Netzwerke auszuführen. [Siehe Übersicht der unterstützten Netzwerke](/developers/docs/nodes-and-clients/#execution-clients). -Beispiele für laufende Ausführungsclients mit Grundkonfiguration finden Sie im nächsten Abschnitt. +Beispiele für die Ausführung von Ausführungs-Clients mit grundlegender Konfiguration finden Sie im nächsten Abschnitt. #### Starten des Ausführungs-Clients {#starting-the-execution-client} -Bevor Sie die Ethereum-Client-Software starten, überprüfen Sie noch einmal, ob Ihre Systemumgebung bereit ist. Stellen Sie beispielsweise Folgendes sicher: +Bevor Sie die Ethereum-Anwendungssoftware starten, führen Sie eine letzte Überprüfung durch, ob Ihre Umgebung bereit ist. Stellen Sie beispielsweise sicher: -- Dass unter Berücksichtigung des gewählten Netzwerk- und Synchronisierungsmodus genügend Speicherplatz vorhanden ist. -- Dass Speicher und CPU nicht durch andere Programme angehalten werden. -- Dass das Betriebssystem über die neueste Version verfügt. -- Dass das System die richtige Uhrzeit und das richtige Datum anzeigt. -- Dass Ihr Router und Ihre Firewall Verbindungen an abhörenden Ports akzeptiert. Standardmäßig verwenden Ethereum-Clients einen Listener(TCP)-Port und einen Discovery(UDP)-Port, beide standardmäßig 30303. +- Es ist genügend Speicherplatz vorhanden, wenn man das gewählte Netzwerk und den Synchronisationsmodus berücksichtigt. +- Arbeitsspeicher und CPU werden nicht durch andere Programme blockiert. +- Das Betriebssystem ist auf die neueste Version aktualisiert. +- Das System hat die richtige Uhrzeit und das richtige Datum. +- Ihr Router und Ihre Firewall akzeptieren Verbindungen auf den Listening-Ports. Standardmäßig verwenden Ethereum-Anwendungen einen Listener-Port (TCP) und einen Discovery-Port (UDP), beide standardmäßig auf 30303. -Führen Sie Ihren Client zunächst in einem Testnetz aus, um sicherzustellen, dass alles korrekt funktioniert. +Führen Sie Ihre Anwendung zuerst in einem Testnet aus, um sicherzustellen, dass alles ordnungsgemäß funktioniert. -Sie müssen alle Client-Einstellungen, die nicht standardmäßig sind, zu Beginn angeben. Sie können Flags oder die Konfigurationsdatei verwenden, um Ihre bevorzugte Konfiguration anzugeben. Der Funktionsumfang und die Konfigurationssyntax jedes Clients unterscheiden sich. Schauen Sie sich die Dokumentation Ihres Clients für die Einzelheiten an. +Sie müssen alle Anwendungseinstellungen, die nicht dem Standard entsprechen, beim Start deklarieren. Sie können Flags oder die Konfigurationsdatei verwenden, um Ihre bevorzugte Konfiguration zu deklarieren. Der Funktionsumfang und die Konfigurationssyntax jeder Anwendung unterscheiden sich. Sehen Sie sich die Dokumentation Ihrer Anwendung für die spezifischen Details an. -Ausführungs- und Konsens-Clients kommunizieren über einen authentifizierten Endpunkt, der in der [Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine) spezifiziert ist. Um eine Verbindung zu einem Konsens-Client herzustellen, muss der Ausführungs-Client ein [`jwtsecret`](https://jwt.io/) in einem bekannten Pfad generieren. Aus Sicherheits- und Stabilitätsgründen sollten die Clients auf derselben Maschine ausgeführt werden, und beide Clients müssen diesen Pfad kennen, da dieser zur Authentifizierung einer lokalen RPC-Verbindung zwischen ihnen verwendet wird. Der Ausführungsclient muss auch einen Listening-Port für authentifizierte APIs festlegen. +Ausführungs- und Konsens-Clients kommunizieren über einen authentifizierten Endpunkt, der in der [Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine) spezifiziert ist. Um sich mit einem Konsens-Client zu verbinden, muss der Ausführungs-Client ein [`jwtsecret`](https://jwt.io/) an einem bekannten Pfad generieren. Aus Sicherheits- und Stabilitätsgründen sollten Anwendungen auf derselben Maschine ausgeführt werden, und beide Anwendungen müssen diesen Pfad kennen, da er zur Authentifizierung einer lokalen RPC-Verbindung zwischen ihnen verwendet wird. Der Ausführungs-Client muss außerdem einen Listening-Port für authentifizierte APIs definieren. -Dieser Token wird automatisch von der Client-Software generiert, in manchen Fällen müssen Sie dies jedoch selbst tun. Sie können es mit [OpenSSL](https://www.openssl.org/) generieren: +Dieses Token wird automatisch von der Anwendungssoftware generiert, aber in einigen Fällen müssen Sie dies möglicherweise selbst tun. Sie können es mit [OpenSSL](https://www.openssl.org/) generieren: ```sh openssl rand -hex 32 > jwtsecret ``` -#### Einen Ausführungs-Client betreiben {#running-an-execution-client} +#### Ausführen eines Ausführungs-Clients {#running-an-execution-client} -Dieser Abschnitt führt Sie durch die Einrichtung eines Ausführungsclients. Er dient nur als Beispiel für eine Grundkonfiguration, mit der der Client entsprechend dieser Einstellungen gestartet wird: +Dieser Abschnitt führt Sie durch das Starten von Ausführungs-Clients. Er dient nur als Beispiel für eine grundlegende Konfiguration, die die Anwendung mit diesen Einstellungen startet: -- Gibt das Netzwerk an, mit dem eine Verbindung hergestellt werden soll – in unseren Beispielen Mainnet - - Sie können stattdessen [eines der Testnets](/developers/docs/networks/) für vorläufige Tests Ihres Setups auswählen -- Festlegen des Datenverzeichnisses, in dem alle Daten, einschließlich der Blockchain, gespeichert werden sollen - - Stellen Sie sicher, dass Sie den Pfad durch einen echten ersetzen, der z. B. auf Ihr externes Laufwerk verweist -- Aktivieren von Schnittstellen für die Kommunikation mit dem Client - - Einschließlich JSON-RPC- und Engine-API für die Kommunikation mit dem Konsens-Client -- Definiert den Pfad zum `jwtsecret` für die authentifizierte API - - Stellen Sie sicher, dass Sie den Beispielpfad durch einen echten ersetzen, auf den die Clients zugreifen können, z. B. `/tmp/jwtsecret` +- Gibt das Netzwerk an, mit dem eine Verbindung hergestellt werden soll, in unseren Beispielen das Mainnet. + - Sie können stattdessen [eines der Testnets](/developers/docs/networks/) für vorläufige Tests Ihres Setups auswählen. +- Definiert das Datenverzeichnis, in dem alle Daten einschließlich der Blockchain gespeichert werden. + - Stellen Sie sicher, dass Sie den Pfad durch einen echten ersetzen, der z. B. auf Ihr externes Laufwerk verweist. +- Aktiviert Schnittstellen für die Kommunikation mit der Anwendung. + - Einschließlich JSON-RPC und Engine API für die Kommunikation mit dem Konsens-Client. +- Definiert den Pfad zum `jwtsecret` für die authentifizierte API. + - Stellen Sie sicher, dass Sie den Beispielpfad durch einen echten ersetzen, auf den die Anwendungen zugreifen können, z. B. `/tmp/jwtsecret`. -Bitte beachten Sie, dass dies nur ein einfaches Beispiel ist, alle anderen Einstellungen werden auf die Standardeinstellung gesetzt. Beachten Sie die Dokumentation der einzelnen Clients, um sich über standardmäßige Werte, Einstellungen und Funktionen zu informieren. Weitere Funktionen, z. B. zur Ausführung von Validatoren, zur Überwachung usw., finden Sie in der Dokumentation des jeweiligen Clients. +Bitte denken Sie daran, dass dies nur ein grundlegendes Beispiel ist; alle anderen Einstellungen werden auf die Standardwerte gesetzt. Achten Sie auf die Dokumentation jeder Anwendung, um mehr über Standardwerte, Einstellungen und Funktionen zu erfahren. Für weitere Funktionen, zum Beispiel für den Betrieb von Validatoren, Überwachung usw., beziehen Sie sich bitte auf die Dokumentation der jeweiligen Anwendung. -> Beachten Sie, dass die Backslashes `` in den Beispielen nur zu Formatierungszwecken dienen; Konfigurations-Flags können in einer einzigen Zeile definiert werden. +> Beachten Sie, dass Backslashes `` in Beispielen nur Formatierungszwecken dienen; Konfigurations-Flags können in einer einzigen Zeile definiert werden. ##### Ausführen von Besu -Dieses Beispiel startet Besu auf Mainnet, speichert Blockchain-Daten im Standardformat unter `/data/ethereum`, aktiviert JSON-RPC und Engine-RPC zum Verbinden des Konsens-Clients. Die Engine-API wird mit dem Token `jwtsecret` authentifiziert und es sind nur Aufrufe von `localhost` erlaubt. +Dieses Beispiel startet Besu im Mainnet, speichert Blockchain-Daten im Standardformat unter `/data/ethereum`, aktiviert JSON-RPC und Engine RPC für die Verbindung des Konsens-Clients. Die Engine API wird mit dem Token `jwtsecret` authentifiziert und es sind nur Aufrufe von `localhost` erlaubt. ```sh besu --network=mainnet \ @@ -251,17 +251,17 @@ besu --network=mainnet \ --engine-jwt-secret=/path/to/jwtsecret ``` -Besu verfügt auch über eine Startoption, die eine Reihe von Fragen stellt und die Konfigurationsdatei generiert. Starten Sie den interaktiven Launcher mit: +Besu bietet auch eine Launcher-Option, die eine Reihe von Fragen stellt und die Konfigurationsdatei generiert. Führen Sie den interaktiven Launcher aus mit: ```sh besu --Xlauncher ``` -Die [Besu-Dokumentation](https://besu.hyperledger.org/public-networks/get-started/start-node/) enthält zusätzliche Optionen und Konfigurationsdetails. +Die [Dokumentation von Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) enthält zusätzliche Optionen und Konfigurationsdetails. ##### Ausführen von Erigon -Dieses Beispiel startet Erigon auf Mainnet, speichert Blockchain-Daten in `/data/ethereum`, aktiviert JSON-RPC, definiert, welche Namespaces erlaubt sind und aktiviert die Authentifizierung zur Verbindung mit dem Konsens-Client, die durch den `jwtsecret`-Pfad definiert ist. +Dieses Beispiel startet Erigon im Mainnet, speichert Blockchain-Daten unter `/data/ethereum`, aktiviert JSON-RPC, definiert, welche Namespaces erlaubt sind, und aktiviert die Authentifizierung für die Verbindung des Konsens-Clients, die durch den `jwtsecret`-Pfad definiert ist. ```sh erigon --chain mainnet \ @@ -270,11 +270,11 @@ erigon --chain mainnet \ --authrpc.jwtsecret=/path/to/jwtsecret ``` -Erigon führt standardmäßig eine vollständige Synchronisierung mit einer 8 GB HDD-Festplatte durch, was zu mehr als 2 TB an Archivdaten führen wird. Stellen Sie sicher, dass `datadir` auf eine Festplatte mit genügend freiem Speicherplatz verweist oder sehen Sie sich das Flag `--prune` an, mit dem verschiedene Arten von Daten getrimmt werden können. Prüfen Sie Erigons `--help` für weitere Informationen. +Erigon führt standardmäßig eine vollständige Synchronisierung mit 8 GB HDD durch, was zu mehr als 2 TB Archivdaten führt. Stellen Sie sicher, dass `datadir` auf eine Festplatte mit ausreichend freiem Speicherplatz verweist, oder sehen Sie sich das Flag `--prune` an, das verschiedene Arten von Daten bereinigen kann. Überprüfen Sie die `--help` von Erigon, um mehr zu erfahren. ##### Ausführen von Geth -Dieses Beispiel startet Geth auf Mainnet, speichert Blockchain-Daten unter `/data/ethereum`, aktiviert JSON-RPC und definiert, welche Namespaces erlaubt sind. Es aktiviert auch die Authentifizierung für die Verbindung mit dem Konsens-Client, was den Pfad zu `jwtsecret` erfordert, sowie eine Option, die definiert, welche Verbindungen erlaubt sind, in unserem Beispiel nur von `localhost`. +Dieses Beispiel startet Geth im Mainnet, speichert Blockchain-Daten unter `/data/ethereum`, aktiviert JSON-RPC und definiert, welche Namespaces erlaubt sind. Es aktiviert auch die Authentifizierung für die Verbindung des Konsens-Clients, was den Pfad zum `jwtsecret` erfordert, sowie eine Option, die definiert, welche Verbindungen erlaubt sind, in unserem Beispiel nur von `localhost`. ```sh geth --mainnet \ @@ -285,11 +285,11 @@ geth --mainnet \ --authrpc.jwtsecret=/path/to/jwtsecret ``` -Überprüfen Sie die [Dokumentation für alle Konfigurationsoptionen](https://geth.ethereum.org/docs/fundamentals/command-line-options) und erfahren Sie mehr über [die Ausführung von Geth mit einem Konsens-Client](https://geth.ethereum.org/docs/getting-started/consensus-clients). +Überprüfen Sie die [Dokumentation für alle Konfigurationsoptionen](https://geth.ethereum.org/docs/fundamentals/command-line-options) und erfahren Sie mehr über das [Ausführen von Geth mit einem Konsens-Client](https://geth.ethereum.org/docs/getting-started/consensus-clients). ##### Ausführen von Nethermind -Nethermind bietet verschiedene [Installationsoptionen](https://docs.nethermind.io/get-started/installing-nethermind). Das Paket enthält verschiedene Binärdateien, darunter einen Launcher mit einem geführten Setup, mit dem Sie die Konfiguration interaktiv erstellen können. Alternativ finden Sie Runner, das die ausführbare Datei selbst ist, und Sie können sie einfach mit Konfigurationsflaggen ausführen. JSON-RPC ist standardmäßig aktiviert. +Nethermind bietet verschiedene [Installationsoptionen](https://docs.nethermind.io/get-started/installing-nethermind). Das Paket enthält verschiedene Binärdateien, einschließlich eines Launchers mit einer geführten Einrichtung, der Ihnen hilft, die Konfiguration interaktiv zu erstellen. Alternativ finden Sie den Runner, der die ausführbare Datei selbst ist und den Sie einfach mit Konfigurations-Flags ausführen können. JSON-RPC ist standardmäßig aktiviert. ```sh Nethermind.Runner --config mainnet \ @@ -297,13 +297,13 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Die Nethermind-Dokumentation bietet eine [vollständige Anleitung](https://docs.nethermind.io/get-started/running-node/) zur Ausführung von Nethermind mit einem Konsens-Client. +Die Nethermind-Dokumentation bietet eine [vollständige Anleitung](https://docs.nethermind.io/get-started/running-node/) zum Ausführen von Nethermind mit einem Konsens-Client. -Ein Ausführungsclient initiiert seine Kernfunktionen, wählt Endpunkte und beginnt mit der Suche nach Peers. Nach erfolgreicher Erkennung von Peers beginnt der Client mit der Synchronisierung. Der Ausführungsclient wartet auf eine Verbindung vom Konsensclient. Die aktuellen Blockchain-Daten sind verfügbar, sobald der Client erfolgreich mit dem aktuellen Zustand synchronisiert wurde. +Ein Ausführungs-Client initiiert seine Kernfunktionen, die ausgewählten Endpunkte und beginnt mit der Suche nach Peers. Nach erfolgreicher Entdeckung von Peers beginnt die Anwendung mit der Synchronisierung. Der Ausführungs-Client wartet auf eine Verbindung vom Konsens-Client. Aktuelle Blockchain-Daten sind verfügbar, sobald die Anwendung erfolgreich auf den aktuellen Zustand synchronisiert ist. -##### Reth ausführen +##### Ausführen von Reth -Dieses Beispiel startet Reth im Mainnet unter Verwendung des Standarddatenspeicherorts. Aktiviert die JSON-RPC- und Engine-RPC-Authentifizierung für die Verbindung mit dem Konsens-Client, der durch den `jwtsecret`-Pfad definiert ist, wobei nur Aufrufe von `localhost` zulässig sind. +Dieses Beispiel startet Reth im Mainnet unter Verwendung des Standard-Speicherorts für Daten. Es aktiviert die JSON-RPC- und Engine-RPC-Authentifizierung für die Verbindung des Konsens-Clients, die durch den `jwtsecret`-Pfad definiert ist, wobei nur Aufrufe von `localhost` erlaubt sind. ```sh reth node \ @@ -312,23 +312,23 @@ reth node \ --authrpc.port 8551 ``` -Siehe [Reth konfigurieren](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth), um mehr über Standard-Datenverzeichnisse zu erfahren. Die [Reth-Dokumentation](https://reth.rs/run/mainnet.html) enthält zusätzliche Optionen und Konfigurationsdetails. +Siehe [Konfigurieren von Reth](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth), um mehr über Standard-Datenverzeichnisse zu erfahren. Die [Dokumentation von Reth](https://reth.rs/run/mainnet.html) enthält zusätzliche Optionen und Konfigurationsdetails. #### Starten des Konsens-Clients {#starting-the-consensus-client} -Der Konsensclient muss mit der richtigen Port-Konfiguration gestartet werden, um eine lokale RPC-Verbindung zum Ausführungsclient herzustellen. Die Konsensclients müssen mit dem offengelegten Ausführungsclient-Port als Konfigurationsargument ausgeführt werden. +Der Konsens-Client muss mit der richtigen Portkonfiguration gestartet werden, um eine lokale RPC-Verbindung zum Ausführungs-Client herzustellen. Die Konsens-Clients müssen mit dem freigegebenen Port des Ausführungs-Clients als Konfigurationsargument ausgeführt werden. -Der Konsens-Client benötigt auch den Pfad zum `jwt-secret` des Ausführungs-Clients, um die RPC-Verbindung zwischen ihnen zu authentifizieren. Ähnlich wie bei den obigen Ausführungsbeispielen verfügt jeder Konsensclient über ein Konfigurationsmerkmal, das den Pfad des jwt-Tokens als Argument annimmt. Dieser muss mit dem `jwtsecret`-Pfad übereinstimmen, der dem Ausführungs-Client zur Verfügung gestellt wird. +Der Konsens-Client benötigt außerdem den Pfad zum `jwt-secret` des Ausführungs-Clients, um die RPC-Verbindung zwischen ihnen zu authentifizieren. Ähnlich wie bei den obigen Ausführungsbeispielen hat jeder Konsens-Client ein Konfigurations-Flag, das den Dateipfad des JWT-Tokens als Argument annimmt. Dies muss mit dem `jwtsecret`-Pfad übereinstimmen, der dem Ausführungs-Client bereitgestellt wurde. -Wenn Sie einen Validator betreiben möchten, fügen Sie unbedingt eine Konfigurationsflagge hinzu, die die Ethereum-Adresse des Gebührenempfängers angibt. Hier sammeln sich die Ether-Prämien für Ihren Validator. Jeder Konsens-Client hat eine Option, z. B. `--suggested-fee-recipient=0xabcd1`, die eine Ethereum-Adresse als Argument entgegennimmt. +Wenn Sie planen, einen Validator auszuführen, stellen Sie sicher, dass Sie ein Konfigurations-Flag hinzufügen, das die Ethereum-Adresse des Gebührenempfängers angibt. Hier sammeln sich die Ether-Belohnungen für Ihren Validator an. Jeder Konsens-Client hat eine Option, z. B. `--suggested-fee-recipient=0xabcd1`, die eine Ethereum-Adresse als Argument annimmt. -Wenn Sie eine Beacon Node auf einem Testnet starten, können Sie durch die Verwendung eines öffentlichen Endpunkts für den [Checkpoint-Sync](https://notes.ethereum.org/@launchpad/checkpoint-sync) erheblich Zeit bei der Synchronisierung sparen. +Wenn Sie einen Beacon-Knoten in einem Testnet starten, können Sie durch die Verwendung eines öffentlichen Endpunkts für den [Checkpoint-Sync](https://notes.ethereum.org/@launchpad/checkpoint-sync) erheblich Synchronisationszeit sparen. -#### Betreiben eines Konsens-Clients {#running-a-consensus-client} +#### Ausführen eines Konsens-Clients {#running-a-consensus-client} ##### Ausführen von Lighthouse -Bevor Sie Lighthouse ausführen, erfahren Sie mehr über die Installation und Konfiguration im [Lighthouse Book](https://lighthouse-book.sigmaprime.io/installation.html). +Bevor Sie Lighthouse ausführen, erfahren Sie im [Lighthouse Book](https://lighthouse-book.sigmaprime.io/installation.html) mehr darüber, wie Sie es installieren und konfigurieren. ```sh lighthouse beacon_node \ @@ -341,7 +341,7 @@ lighthouse beacon_node \ ##### Ausführen von Lodestar -Installieren Sie die Lodestar-Software, indem Sie sie kompilieren oder das Docker-Abbild herunterladen. Erfahren Sie mehr in den [Dokumenten](https://chainsafe.github.io/lodestar/) und in der umfassenderen [Einrichtungsanleitung](https://hackmd.io/@philknows/rk5cDvKmK). +Installieren Sie die Lodestar-Software, indem Sie sie kompilieren oder das Docker-Image herunterladen. Erfahren Sie mehr in der [Dokumentation](https://chainsafe.github.io/lodestar/) und im umfassenderen [Einrichtungsleitfaden](https://hackmd.io/@philknows/rk5cDvKmK). ```sh lodestar beacon \ @@ -354,8 +354,8 @@ lodestar beacon \ ##### Ausführen von Nimbus -Nimbus wird sowohl mit Konsens- als auch mit Ausführungsclients geliefert. Es kann auf verschiedenen Geräten auch mit sehr bescheidener Rechenleistung ausgeführt werden. -Nach der [Installation der Abhängigkeiten und von Nimbus selbst](https://nimbus.guide/quick-start.html), können Sie dessen Konsens-Client ausführen: +Nimbus wird sowohl mit Konsens- als auch mit Ausführungs-Clients geliefert. Es kann auf verschiedenen Geräten ausgeführt werden, selbst mit sehr bescheidener Rechenleistung. +Nach der [Installation der Abhängigkeiten und von Nimbus selbst](https://nimbus.guide/quick-start.html) können Sie dessen Konsens-Client ausführen: ```sh nimbus_beacon_node \ @@ -386,98 +386,98 @@ teku --network mainnet \ --ee-jwt-secret-file "/path/to/jwtsecret" ``` -Wenn sich ein Konsensclient mit dem Ausführungsclient verbindet, um den Einzahlungsvertrag zu lesen und die Validatoren zu identifizieren, verbindet er sich auch mit anderen Beacon Node-Peers und beginnt mit der Synchronisierung der Konsens-Slots ab der Genesis. Sobald der Beacon Node die aktuelle Epoche erreicht, wird die Beacon API für Ihre Validatoren nutzbar. Erfahren Sie mehr über [Beacon Node APIs](https://eth2docs.vercel.app/). +Wenn sich ein Konsens-Client mit dem Ausführungs-Client verbindet, um den Einzahlungsvertrag zu lesen und Validatoren zu identifizieren, verbindet er sich auch mit anderen Beacon-Knoten-Peers und beginnt mit der Synchronisierung von Konsens-Slots ab dem Genesis-Block. Sobald der Beacon-Knoten die aktuelle Epoche erreicht, wird die Beacon API für Ihre Validatoren nutzbar. Erfahren Sie mehr über [Beacon-Knoten-APIs](https://eth2docs.vercel.app/). -### Validatoren hinzufügen {#adding-validators} +### Hinzufügen von Validatoren {#adding-validators} -Ein Konsensclient dient als Beacon Node, mit dem sich Validatoren verbinden können. Jeder Konsensclient verfügt über eine eigene Validierungssoftware, die in der jeweiligen Dokumentation ausführlich beschrieben wird. +Ein Konsens-Client dient als Beacon-Knoten, mit dem sich Validatoren verbinden können. Jeder Konsens-Client verfügt über eine eigene Validator-Software, die in der jeweiligen Dokumentation detailliert beschrieben ist. -Der Betrieb eines eigenen Validators ermöglicht [Solo-Staking](/staking/solo/), die wirkungsvollste und vertrauenswürdigste Methode zur Unterstützung des Ethereum-Netzwerks. Allerdings ist dafür eine Einzahlung von 32 ETH erforderlich. Um einen Validator auf Ihrem eigenen Node mit einem kleineren Betrag zu betreiben, könnte ein dezentraler Pool mit erlaubnisfreien Node-Betreibern, wie [Rocket Pool](https://rocketpool.net/node-operators), für Sie interessant sein. +Der Betrieb eines eigenen Validators ermöglicht [Solo-Staking](/staking/solo/), die wirkungsvollste und vertrauensloseste Methode zur Unterstützung des Ethereum-Netzwerks. Dies erfordert jedoch eine Einzahlung von 32 ETH. Um einen Validator auf Ihrem eigenen Blockchain-Knoten mit einem kleineren Betrag auszuführen, könnte ein dezentralisierter Pool mit erlaubnisfreien Knotenbetreibern, wie z. B. [Rocket Pool](https://rocketpool.net/node-operators), für Sie von Interesse sein. -Der einfachste Weg, um mit dem Staking und der Generierung von Validator-Schlüsseln zu beginnen, ist die Verwendung des [Hoodi Testnet Staking Launchpads](https://hoodi.launchpad.ethereum.org/), mit dem Sie Ihr Setup testen können, indem Sie [Nodes auf Hoodi ausführen](https://notes.ethereum.org/@launchpad/hoodi). Wenn Sie für Mainnet bereit sind, können Sie diese Schritte mit dem [Mainnet Staking Launchpad](https://launchpad.ethereum.org/) wiederholen. +Der einfachste Weg, um mit dem Staking und der Generierung von Validator-Schlüsseln zu beginnen, ist die Verwendung des [Hoodi Testnet Staking Launchpad](https://hoodi.launchpad.ethereum.org/), mit dem Sie Ihr Setup testen können, indem Sie [Blockchain-Knoten auf Hoodi ausführen](https://notes.ethereum.org/@launchpad/hoodi). Wenn Sie bereit für das Mainnet sind, können Sie diese Schritte mit dem [Mainnet Staking Launchpad](https://launchpad.ethereum.org/) wiederholen. -Sehen Sie sich die [Staking-Seite](/staking) an, um einen Überblick über die Staking-Optionen zu erhalten. +Sehen Sie sich die [Staking-Seite](/staking) für einen Überblick über die Staking-Optionen an. -### Verwenden des Nodes {#using-the-node} +### Nutzung des Blockchain-Knotens {#using-the-node} -Ausführungs-Clients bieten [RPC-API-Endpunkte](/developers/docs/apis/json-rpc/) an, die Sie verwenden können, um Transaktionen zu übermitteln, mit Smart Contracts im Ethereum-Netzwerk zu interagieren oder diese auf verschiedene Weisen bereitzustellen: +Ausführungs-Clients bieten [RPC-API-Endpunkte](/developers/docs/apis/json-rpc/), die Sie verwenden können, um Transaktionen einzureichen, mit Smart Contracts zu interagieren oder diese auf verschiedene Weise im Ethereum-Netzwerk bereitzustellen: -- Manueller Aufruf mit einem geeigneten Protokoll (z. B. mit `curl`) +- Manuelles Aufrufen mit einem geeigneten Protokoll (z. B. mit `curl`) - Anhängen einer bereitgestellten Konsole (z. B. `geth attach`) -- Implementierung in Anwendungen mithilfe von web3-Bibliotheken, z. B. [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) +- Implementierung in Anwendungen unter Verwendung von Web3-Bibliotheken, z. B. [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) -Verschiedene Clients verfügen über unterschiedliche Implementierungen der RPC-Endpunkte. Es gibt jedoch einen Standard-JSON-RPC, den Sie mit jedem Client verwenden können. Für einen Überblick [lesen Sie die JSON-RPC-Dokumentation](/developers/docs/apis/json-rpc/). Anwendungen, die Informationen aus dem Ethereum-Netzwerk benötigen, können diesen RPC verwenden. Zum Beispiel ermöglicht die beliebte Wallet MetaMask es Ihnen, sich mit Ihrem [eigenen RPC-Endpunkt zu verbinden](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node), was große Vorteile für Datenschutz und Sicherheit bietet. +Verschiedene Anwendungen haben unterschiedliche Implementierungen der RPC-Endpunkte. Es gibt jedoch einen Standard-JSON-RPC, den Sie mit jeder Anwendung verwenden können. Für einen Überblick [lesen Sie die JSON-RPC-Dokumentation](/developers/docs/apis/json-rpc/). Anwendungen, die Informationen aus dem Ethereum-Netzwerk benötigen, können diesen RPC verwenden. Zum Beispiel ermöglicht Ihnen das beliebte Wallet MetaMask, sich [mit Ihrem eigenen RPC-Endpunkt zu verbinden](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node), was starke Datenschutz- und Sicherheitsvorteile bietet. -Die Konsens-Clients stellen alle eine [Beacon-API](https://ethereum.github.io/beacon-APIs) zur Verfügung, die verwendet werden kann, um den Status des Konsens-Clients zu überprüfen oder Blöcke und Konsensdaten durch Senden von Anfragen mit Tools wie [Curl](https://curl.se) herunterzuladen. Weitere Informationen hierzu finden Sie in der Dokumentation des jeweiligen Konsensclients. +Die Konsens-Clients stellen alle eine [Beacon API](https://ethereum.github.io/beacon-APIs) zur Verfügung, die verwendet werden kann, um den Status des Konsens-Clients zu überprüfen oder Blöcke und Konsensdaten herunterzuladen, indem Anfragen mit Tools wie [Curl](https://curl.se) gesendet werden. Weitere Informationen hierzu finden Sie in der Dokumentation für jeden Konsens-Client. -#### RPC erreichen {#reaching-rpc} +#### Erreichen des RPC {#reaching-rpc} -Der Standardport für den JSON-RPC des Ausführungs-Clients ist `8545`, aber Sie können die Ports der lokalen Endpunkte in der Konfiguration ändern. Standardmäßig ist die RPC-Schnittstelle nur über den localhost Ihres Computers erreichbar. Um es aus der Ferne zugänglich zu machen, möchten Sie es vielleicht der Öffentlichkeit zugänglich machen, indem Sie die Adresse auf `0.0.0.0` ändern. Hierdurch wird sie über das lokale Netz und öffentliche IP-Adressen erreichbar. In den meisten Fällen müssen Sie außerdem eine Portweiterleitung auf Ihrem Router einrichten. +Der Standardport für den JSON-RPC des Ausführungs-Clients ist `8545`, aber Sie können die Ports lokaler Endpunkte in der Konfiguration ändern. Standardmäßig ist die RPC-Schnittstelle nur auf dem Localhost Ihres Computers erreichbar. Um sie aus der Ferne zugänglich zu machen, möchten Sie sie möglicherweise der Öffentlichkeit zugänglich machen, indem Sie die Adresse in `0.0.0.0` ändern. Dadurch wird sie über das lokale Netzwerk und öffentliche IP-Adressen erreichbar. In den meisten Fällen müssen Sie auch eine Portweiterleitung auf Ihrem Router einrichten. -Die Freigabe von Ports für das Internet ist mit Vorsicht zu genießen, da hierdurch jeder im Internet Ihren Knoten kontrollieren kann. Böswillige Akteure könnten auf Ihren Knoten zugreifen, um Ihr System zum Absturz zu bringen oder Ihr Geld zu stehlen, wenn Sie Ihren Client als Wallet verwenden. +Gehen Sie bei der Freigabe von Ports für das Internet mit Vorsicht vor, da dies jedem im Internet ermöglicht, Ihren Blockchain-Knoten zu kontrollieren. Böswillige Akteure könnten auf Ihren Blockchain-Knoten zugreifen, um Ihr System zum Absturz zu bringen oder Ihre Gelder zu stehlen, wenn Sie Ihre Anwendung als Wallet verwenden. -Eine Möglichkeit, dies zu umgehen, besteht darin zu verhindern, dass potenziell schädliche RPC-Methoden geändert werden können. Mit Geth können Sie zum Beispiel modifizierbare Methoden mit einem Flag deklarieren: `--http.api web3,eth,txpool`. +Ein Weg, dies zu umgehen, besteht darin, zu verhindern, dass potenziell schädliche RPC-Methoden modifizierbar sind. Bei Geth können Sie beispielsweise modifizierbare Methoden mit einem Flag deklarieren: `--http.api web3,eth,txpool`. -Der Zugriff auf die RPC-Schnittstelle kann durch die Entwicklung von Edge-Layer-APIs oder Webserver-Anwendungen wie Nginx und deren Verbindung mit der lokalen Adresse und dem Port Ihres Clients erweitert werden. Die Nutzung einer Zwischenschicht kann Entwicklern auch die Möglichkeit geben, ein Zertifikat für sichere `https`-Verbindungen zur RPC-Schnittstelle einzurichten. +Der Zugriff auf die RPC-Schnittstelle kann durch die Entwicklung von Edge-Layer-APIs oder Webserver-Anwendungen wie Nginx und deren Verbindung mit der lokalen Adresse und dem Port Ihrer Anwendung erweitert werden. Die Nutzung einer mittleren Ebene kann Entwicklern auch die Möglichkeit geben, ein Zertifikat für sichere `https`-Verbindungen zur RPC-Schnittstelle einzurichten. -Die Einrichtung eines Webservers, eines Proxys oder einer nach außen gerichteten Rest-API ist nicht die einzige Möglichkeit, den Zugriff auf den RPC-Endpunkt Ihrer Node zu ermöglichen. Eine weitere datenschutzfreundliche Möglichkeit, einen öffentlich erreichbaren Endpunkt einzurichten, ist das Hosten des Nodes auf Ihrem eigenen [Tor](https://www.torproject.org/) Onion-Service. Auf diese Weise können Sie den RPC außerhalb Ihres lokalen Netzes erreichen, ohne eine statische öffentliche IP-Adresse oder geöffnete Ports. Bei dieser Konfiguration kann der RPC-Endpunkt jedoch nur über das Tor-Netzwerk erreichbar sein, was nicht von allen Anwendungen unterstützt wird und zu Verbindungsproblemen führen kann. +Die Einrichtung eines Webservers, eines Proxys oder einer nach außen gerichteten Rest-API ist nicht die einzige Möglichkeit, Zugriff auf den RPC-Endpunkt Ihres Blockchain-Knotens zu gewähren. Eine weitere datenschutzfreundliche Möglichkeit, einen öffentlich erreichbaren Endpunkt einzurichten, besteht darin, den Blockchain-Knoten auf Ihrem eigenen [Tor](https://www.torproject.org/)-Onion-Dienst zu hosten. Dadurch können Sie den RPC außerhalb Ihres lokalen Netzwerks ohne eine statische öffentliche IP-Adresse oder geöffnete Ports erreichen. Die Verwendung dieser Konfiguration ermöglicht jedoch möglicherweise nur den Zugriff auf den RPC-Endpunkt über das Tor-Netzwerk, was nicht von allen Anwendungen unterstützt wird und zu Verbindungsproblemen führen kann. -Dazu müssen Sie Ihren eigenen [Onion-Service](https://community.torproject.org/onion-services/) erstellen. Lesen Sie [die Dokumentation](https://community.torproject.org/onion-services/setup/) zur Einrichtung eines Onion-Dienstes, um Ihren eigenen zu hosten. Sie können ihn auf einen Webserver mit Proxy zum RPC-Port oder direkt auf den RPC verweisen. +Dazu müssen Sie Ihren eigenen [Onion-Dienst](https://community.torproject.org/onion-services/) erstellen. Sehen Sie sich [die Dokumentation](https://community.torproject.org/onion-services/setup/) zur Einrichtung von Onion-Diensten an, um Ihren eigenen zu hosten. Sie können ihn auf einen Webserver mit Proxy zum RPC-Port oder einfach direkt auf den RPC verweisen lassen. -Eine der beliebtesten Möglichkeiten, Zugang zu internen Netzen zu erhalten, ist schließlich eine VPN-Verbindung. Je nach Anwendungsfall und der Anzahl der Benutzer, die Zugang zu Ihrem Knoten benötigen, könnte eine sichere VPN-Verbindung eine Option sein. OpenVPN ist ein SSL-VPN mit vollem Funktionsumfang, das eine sichere Netzwerkerweiterung auf OSI-Ebene 2 oder 3 unter Verwendung des Branchenstandards SSL/TLS-Protokoll implementiert, flexible Client-Authentifizierungsmethoden auf der Grundlage von Zertifikaten, Smartcards und/oder Benutzername/Passwort-Anmeldeinformationen unterstützt und benutzer- oder gruppenspezifische Zugriffskontrollrichtlinien unter Verwendung von Firewall-Regeln für die virtuelle VPN-Schnittstelle ermöglicht. +Schließlich ist eine der beliebtesten Möglichkeiten, Zugriff auf interne Netzwerke zu gewähren, eine VPN-Verbindung. Abhängig von Ihrem Anwendungsfall und der Anzahl der Benutzer, die Zugriff auf Ihren Blockchain-Knoten benötigen, könnte eine sichere VPN-Verbindung eine Option sein. [OpenVPN](https://openvpn.net/) ist ein voll ausgestattetes SSL-VPN, das eine sichere Netzwerkerweiterung auf OSI-Ebene 2 oder 3 unter Verwendung des Industriestandards SSL/TLS-Protokoll implementiert, flexible Client-Authentifizierungsmethoden basierend auf Zertifikaten, Smartcards und/oder Benutzername/Passwort-Anmeldeinformationen unterstützt und benutzer- oder gruppenspezifische Zugriffskontrollrichtlinien mithilfe von Firewall-Regeln ermöglicht, die auf die virtuelle VPN-Schnittstelle angewendet werden. -### Betreiben des Nodes {#operating-the-node} +### Betrieb des Blockchain-Knotens {#operating-the-node} -Sie sollten Ihren Knoten regelmäßig überwachen, um sicherzustellen, dass er ordnungsgemäß funktioniert. Möglicherweise müssen Sie gelegentlich Wartungsarbeiten durchführen. +Sie sollten Ihren Blockchain-Knoten regelmäßig überwachen, um sicherzustellen, dass er ordnungsgemäß läuft. Möglicherweise müssen Sie gelegentlich Wartungsarbeiten durchführen. -#### Einen Node online halten {#keeping-node-online} +#### Einen Blockchain-Knoten online halten {#keeping-node-online} -Ihr Knoten muss nicht die ganze Zeit online sein, Sie sollten ihn jedoch so oft wie möglich online lassen, damit er sich mit dem Netzwerk synchronisieren kann. Sie können ihn ausschalten, um ihn neu zu starten, bedenken Sie jedoch Folgendes: +Ihr Blockchain-Knoten muss nicht ständig online sein, aber Sie sollten ihn so oft wie möglich online halten, um ihn mit dem Netzwerk synchron zu halten. Sie können ihn herunterfahren, um ihn neu zu starten, aber bedenken Sie Folgendes: -- Das Herunterfahren kann einige Minuten dauern, wenn der aktuelle Status noch auf die Festplatte geschrieben wird. -- Erzwungene Abschaltungen können die Datenbank beschädigen, so dass Sie den gesamten Knoten neu synchronisieren müssen. -- Ihr Client wird nicht mehr mit dem Netzwerk synchronisiert und muss neu synchronisiert werden, wenn Sie ihn neu starten. Die Synchronisation des Knotens kann zwar an dem Punkt beginnen, an dem er zuletzt heruntergefahren wurde, aber je nachdem, wie lange er offline war, kann der Prozess einige Zeit dauern. +- Das Herunterfahren kann einige Minuten dauern, wenn der aktuelle Zustand noch auf die Festplatte geschrieben wird. +- Erzwungene Abschaltungen können die Datenbank beschädigen, sodass Sie den gesamten Blockchain-Knoten neu synchronisieren müssen. +- Ihre Anwendung wird nicht mehr mit dem Netzwerk synchronisiert sein und muss beim Neustart neu synchronisiert werden. Während der Blockchain-Knoten mit der Synchronisierung dort beginnen kann, wo er zuletzt heruntergefahren wurde, kann der Prozess je nachdem, wie lange er offline war, einige Zeit in Anspruch nehmen. -_Dies gilt nicht für Validator-Nodes der Konsensebene._ Wenn Sie Ihren Node offline schalten, wirkt sich dies auf alle von ihm abhängigen Dienste aus. Wenn Sie einen Node für _Staking_-Zwecke betreiben, sollten Sie versuchen, die Ausfallzeiten so gering wie möglich zu halten. +_Dies gilt nicht für Validator-Knoten der Konsensebene._ Wenn Sie Ihren Blockchain-Knoten offline nehmen, wirkt sich dies auf alle davon abhängigen Dienste aus. Wenn Sie einen Blockchain-Knoten für _Staking_-Zwecke betreiben, sollten Sie versuchen, die Ausfallzeit so weit wie möglich zu minimieren. -#### Erstellen von Client-Diensten {#creating-client-services} +#### Erstellen von Anwendungsdiensten {#creating-client-services} -Erwägen Sie die Einrichtung eines Dienstes, der Ihren Client automatisch beim Start ausführt. Auf Linux-Servern wäre es zum Beispiel eine gute Praxis, einen Dienst, z. B. mit `systemd`, zu erstellen, der den Client mit der richtigen Konfiguration unter einem Benutzer mit begrenzten Rechten ausführt und automatisch neu startet. +Erwägen Sie die Erstellung eines Dienstes, um Ihre Anwendungen beim Start automatisch auszuführen. Auf Linux-Servern wäre es beispielsweise eine gute Praxis, einen Dienst zu erstellen, z. B. mit `systemd`, der die Anwendung mit der richtigen Konfiguration unter einem Benutzer mit eingeschränkten Rechten ausführt und automatisch neu startet. -#### Clients aktualisieren {#updating-clients} +#### Aktualisieren von Anwendungen {#updating-clients} -Sie müssen Ihre Client-Software mit den neuesten Sicherheitspatches, Funktionen und [EIPs](/eips/) auf dem neuesten Stand halten. Stellen Sie insbesondere vor [Hard Forks](/ethereum-forks/) sicher, dass Sie die richtigen Client-Versionen verwenden. +Sie müssen Ihre Anwendungssoftware mit den neuesten Sicherheitspatches, Funktionen und [EIPs](/eips/) auf dem neuesten Stand halten. Stellen Sie insbesondere vor [Hard Forks](/ethereum-forks/) sicher, dass Sie die richtigen Anwendungsversionen ausführen. -> Vor wichtigen Netzwerk-Updates veröffentlicht die EF einen Beitrag in ihrem [Blog](https://blog.ethereum.org). Sie können [diese Ankündigungen abonnieren](https://blog.ethereum.org/category/protocol#subscribe), um eine Benachrichtigung per E-Mail zu erhalten, wenn Ihr Node eine Aktualisierung benötigt. +> Vor wichtigen Netzwerk-Updates veröffentlicht die EF einen Beitrag auf ihrem [Blog](https://blog.ethereum.org). Sie können [diese Ankündigungen abonnieren](https://blog.ethereum.org/category/protocol#subscribe), um eine Benachrichtigung per E-Mail zu erhalten, wenn Ihr Blockchain-Knoten ein Update benötigt. -Die Aktualisierung der Clients ist sehr einfach. Jeder Client hat spezifische Anweisungen in seiner Dokumentation, im Allgemeinen besteht das Verfahren jedoch nur darin, die neueste Version herunterzuladen und den Client mit der neuen ausführbaren Datei neu zu starten. Der Client sollte dort weitermachen, wo er aufgehört hat, jedoch mit den vorgenommenen Aktualisierungen. +Das Aktualisieren von Anwendungen ist sehr einfach. Jede Anwendung hat spezifische Anweisungen in ihrer Dokumentation, aber der Prozess besteht im Allgemeinen nur darin, die neueste Version herunterzuladen und die Anwendung mit der neuen ausführbaren Datei neu zu starten. Die Anwendung sollte dort weitermachen, wo sie aufgehört hat, jedoch mit den angewendeten Updates. -Jede Client-Implementierung hat eine von Menschen lesbare Versionszeichenfolge, die im Peer-to-Peer-Protokoll verwendet wird, aber auch über die Befehlszeile zugänglich ist. Anhand dieses Versionsstrings können die Nutzer überprüfen, ob sie die richtige Version verwenden. Außerdem ermöglicht er es Blockexplorern und anderen Analysewerkzeugen eine quantitative Analyse der Verteilung bestimmter Clients im Netz. Weitere Informationen zu den Versionsstrings finden Sie in der jeweiligen Client-Dokumentation. +Jede Anwendungsimplementierung verfügt über eine für Menschen lesbare Versionszeichenfolge, die im Peer-to-Peer-Protokoll verwendet wird, aber auch über die Befehlszeile zugänglich ist. Diese Versionszeichenfolge ermöglicht es Benutzern zu überprüfen, ob sie die richtige Version ausführen, und ermöglicht es Blocksuchmaschinen und anderen Analysetools, die an der Quantifizierung der Verteilung bestimmter Anwendungen im Netzwerk interessiert sind, diese zu erfassen. Weitere Informationen zu Versionszeichenfolgen finden Sie in der Dokumentation der jeweiligen Anwendung. #### Ausführen zusätzlicher Dienste {#running-additional-services} -Wenn Sie einen eigenen Knoten betreiben, können Sie Dienste nutzen, die einen direkten Zugang zum Ethereum-Client-RPC erfordern. Dabei handelt es sich um Dienste, die auf Ethereum aufbauen, wie [Layer-2-Lösungen](/developers/docs/scaling/#layer-2-scaling), Backend für Wallets, Block-Explorer, Entwicklertools und andere Ethereum-Infrastruktur. +Der Betrieb Ihres eigenen Blockchain-Knotens ermöglicht es Ihnen, Dienste zu nutzen, die direkten Zugriff auf den Ethereum-Anwendungs-RPC erfordern. Dies sind Dienste, die auf Ethereum aufbauen, wie [Ebene-2-Lösungen](/developers/docs/scaling/#layer-2-scaling), Backends für Wallets, Blocksuchmaschinen, Entwicklertools und andere Ethereum-Infrastruktur. -#### Überwachen des Nodes {#monitoring-the-node} +#### Überwachung des Blockchain-Knotens {#monitoring-the-node} -Um Ihren Knoten ordnungsgemäß zu überwachen, sollten Sie Metriken sammeln. Clients stellen Metrik-Endpunkte bereit, damit Sie umfassende Daten über Ihren Knoten erhalten können. Verwenden Sie Tools wie [InfluxDB](https://www.influxdata.com/get-influxdb/) oder [Prometheus](https://prometheus.io/), um Datenbanken zu erstellen, die Sie in Software wie [Grafana](https://grafana.com/) in Visualisierungen und Diagramme umwandeln können. Es gibt viele Setups für die Verwendung dieser Software und verschiedene Grafana-Dashboards, mit denen Sie Ihre Knoten und das Netzwerk als Ganzes visualisieren können. Sehen Sie sich zum Beispiel das [Tutorial zur Überwachung von Geth](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/) an. +Um Ihren Blockchain-Knoten richtig zu überwachen, sollten Sie das Sammeln von Metriken in Betracht ziehen. Anwendungen bieten Metrik-Endpunkte, sodass Sie umfassende Daten über Ihren Blockchain-Knoten erhalten können. Verwenden Sie Tools wie [InfluxDB](https://www.influxdata.com/get-influxdb/) oder [Prometheus](https://prometheus.io/), um Datenbanken zu erstellen, die Sie in Software wie [Grafana](https://grafana.com/) in Visualisierungen und Diagramme umwandeln können. Es gibt viele Setups für die Verwendung dieser Software und verschiedene Grafana-Dashboards, mit denen Sie Ihren Blockchain-Knoten und das Netzwerk als Ganzes visualisieren können. Sehen Sie sich zum Beispiel das [Tutorial zur Überwachung von Geth](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/) an. -Behalten Sie im Rahmen der Überwachung auch die Leistung Ihres Rechners im Auge. Während der ersten Synchronisierung Ihres Knotens kann die Client-Software sehr viel CPU und RAM beanspruchen. Zusätzlich zu Grafana können Sie dafür die Tools Ihres Betriebssystems wie `htop` oder `uptime` verwenden. +Achten Sie im Rahmen Ihrer Überwachung darauf, die Leistung Ihrer Maschine im Auge zu behalten. Während der anfänglichen Synchronisierung Ihres Blockchain-Knotens kann die Anwendungssoftware CPU und RAM stark beanspruchen. Zusätzlich zu Grafana können Sie die Tools verwenden, die Ihr Betriebssystem bietet, wie `htop` oder `uptime`, um dies zu tun. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) – _Somer Esat, wird häufig aktualisiert_ -- [Anleitung | Wie man einen Validator für Ethereum Staking auf Mainnet einrichtet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, wird häufig aktualisiert_ -- [ETHStaker-Anleitungen zum Ausführen von Validatoren in Testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, wird regelmäßig aktualisiert_ -- [Beispiel AWS Blockchain Node Runner App für Ethereum Nodes](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) – _AWS, wird häufig aktualisiert_ -- [The Merge FAQ für Node-Betreiber](https://notes.ethereum.org/@launchpad/node-faq-merge) – _Juli 2022_ -- [Analyse der Hardware-Anforderungen für einen Ethereum Full Validated Node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24. September 2018_ -- [Ethereum Full Nodes betreiben: Eine Anleitung für die kaum Motivierten](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ -- [Einen Hyperledger Besu Node auf dem Ethereum Mainnet betreiben: Vorteile, Anforderungen und Einrichtung](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7. Mai 2020_ -- [Bereitstellung des Nethermind Ethereum Client mit Monitoring Stack](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8. Juli 2020_ +- [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) – _Somer Esat, wird oft aktualisiert_ +- [Guide | How to setup a validator for Ethereum staking on mainnet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, wird oft aktualisiert_ +- [ETHStaker guides on running validators on testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, wird regelmäßig aktualisiert_ +- [Sample AWS Blockchain Node Runner app for Ethereum Nodes](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) – _AWS, wird oft aktualisiert_ +- [The Merge FAQ for node operators](https://notes.ethereum.org/@launchpad/node-faq-merge) – _Juli 2022_ +- [Analyzing the hardware requirements to be an Ethereum full validated node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24. September 2018_ +- [Running Ethereum Full Nodes: A Guide for the Barely Motivated](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ +- [Running a Hyperledger Besu Node on the Ethereum Mainnet: Benefits, Requirements, and Setup](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7. Mai 2020_ +- [Deploying Nethermind Ethereum Client with Monitoring Stack](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8. Juli 2020_ ## Verwandte Themen {#related-topics} -- [Nodes und Clients](/developers/docs/nodes-and-clients/) +- [Blockchain-Knoten und Anwendungen](/developers/docs/nodes-and-clients/) - [Blöcke](/developers/docs/blocks/) -- [Netzwerke](/developers/docs/networks/) +- [Netzwerke](/developers/docs/networks/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/oracles/index.md b/public/content/translations/de/developers/docs/oracles/index.md index 245bb076abf..3fd6edd1372 100644 --- a/public/content/translations/de/developers/docs/oracles/index.md +++ b/public/content/translations/de/developers/docs/oracles/index.md @@ -1,116 +1,116 @@ --- title: Orakel -description: "Orakel ermöglichen Ethereum-Smart-Contracts den Zugang zu Daten aus der realen Welt, was mehr Anwendungsfälle und einen größeren Nutzen für die Benutzer freischaltet." +description: "Orakel bieten Ethereum-Smart-Contracts Zugriff auf reale Daten, was mehr Anwendungsfälle und einen größeren Wert für die Nutzer erschließt." lang: de --- -Oracles sind Anwendungen, die Datenfeeds erstellen, um Off-Chain-Datenquellen für Smart Contracts auf der Blockchain verfügbar zu machen. Dies ist notwendig, da Ethereum-basierte Smart Contracts standardmäßig nicht auf Informationen zugreifen können, die außerhalb des Blockchain-Netzwerks gespeichert sind. +Orakel sind Anwendungen, die Daten-Feeds erzeugen, welche Off-Chain-Datenquellen für Smart Contracts auf der Blockchain verfügbar machen. Dies ist notwendig, da Ethereum-basierte Smart Contracts standardmäßig nicht auf Informationen zugreifen können, die außerhalb des Blockchain-Netzwerks gespeichert sind. -Durch die Möglichkeit, dass Smart Contracts mit Off-Chain-Daten ausgeführt werden können, wird die Nützlichkeit und der Wert dezentralisierter Anwendungen erweitert. Zum Beispiel stützen sich On-Chain-Prognosemärkte auf Orakel, um Informationen über Ergebnisse bereitzustellen, die sie zur Überprüfung von Benutzervorhersagen verwenden. Angenommen, Alice setzt 20 ETH darauf, wer der nächste US-Präsident wird. Präsident. In diesem Fall benötigt die Vorhersage-Markt-Dapp ein Orakel, um die Wahlergebnisse zu bestätigen und zu ermitteln, ob Alice für eine Auszahlung in Frage kommt. +Smart Contracts die Fähigkeit zu geben, unter Verwendung von Off-Chain-Daten ausgeführt zu werden, erweitert den Nutzen und Wert dezentralisierter Anwendungen. Beispielsweise sind Prognosemärkte auf der Blockchain auf Orakel angewiesen, um Informationen über Ergebnisse bereitzustellen, die sie zur Validierung von Nutzerprognosen verwenden. Angenommen, Alice wettet 20 ETH darauf, wer der nächste US-Präsident wird. In diesem Fall benötigt die Prognosemarkt-Dapp ein Orakel, um die Wahlergebnisse zu bestätigen und festzustellen, ob Alice Anspruch auf eine Auszahlung hat. ## Voraussetzungen {#prerequisites} -Diese Seite setzt voraus, dass der Leser mit den Grundlagen von Ethereum vertraut ist, einschließlich [Nodes](/developers/docs/nodes-and-clients/), [Konsensmechanismen](/developers/docs/consensus-mechanisms/) und der [EVM](/developers/docs/evm/). Sie sollten auch ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/) und der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) haben, insbesondere von [Ereignissen](/glossary/#events). +Diese Seite setzt voraus, dass der Leser mit den Grundlagen von [Ethereum](/) vertraut ist, einschließlich [Blockchain-Knoten](/developers/docs/nodes-and-clients/), [Konsensmechanismen](/developers/docs/consensus-mechanisms/) und der [EVM](/developers/docs/evm/). Sie sollten auch ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/) und der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) haben, insbesondere von [Ereignissen](/glossary/#events). ## Was ist ein Blockchain-Orakel? {#what-is-a-blockchain-oracle} -Oracles sind Anwendungen, die externe Informationen (d. h. Offchain gespeicherte Informationen) beschaffen, überprüfen und an Smart Contracts übermitteln, die auf der Blockchain ausgeführt werden. Neben dem „Abrufen“ von Off-Chain-Daten und dem Übertragen auf Ethereum können Orakel auch Informationen von der Blockchain an externe Systeme „pushen“, z. B. ein Smart Lock entsperren, sobald der Benutzer eine Gebühr über eine Ethereum-Transaktion sendet. +Orakel sind Anwendungen, die externe Informationen (d. h. Off-Chain gespeicherte Informationen) beschaffen, verifizieren und an Smart Contracts übertragen, die auf der Blockchain laufen. Neben dem „Abrufen“ von Off-Chain-Daten und deren Übertragung auf Ethereum können Orakel auch Informationen von der Blockchain an externe Systeme „pushen“, z. B. das Entsperren eines intelligenten Schlosses, sobald der Nutzer eine Gebühr über eine Ethereum-Transaktion sendet. -Ohne ein Oracle wäre ein Smart Contract vollständig auf On-Chain-Daten beschränkt. +Ohne ein Orakel wäre ein Smart Contract vollständig auf Daten auf der Blockchain beschränkt. -Orakles unterscheiden sich in Bezug auf die Datenquelle (eine oder mehrere Quellen), Vertrauensmodelle (zentralisiert oder dezentralisiert) und Systemarchitektur (sofort-lesen, publish-subscribe und request-response). Wir können auch zwischen Orakeln unterscheiden, je nachdem, ob sie externe Daten für die Nutzung durch On-Chain-Verträge abrufen (Input-Orakel), Informationen von der Blockchain zu Off-Chain-Anwendungen senden (Output-Orakel) oder rechnerische Aufgaben außerhalb der Blockchain ausführen (Computational-Orakel). +Orakel unterscheiden sich basierend auf der Datenquelle (eine oder mehrere Quellen), den Vertrauensmodellen (zentralisiert oder dezentralisiert) und der Systemarchitektur (Immediate-Read, Publish-Subscribe und Request-Response). Wir können Orakel auch danach unterscheiden, ob sie externe Daten zur Verwendung durch Verträge auf der Blockchain abrufen (Eingabe-Orakel), Informationen von der Blockchain an Off-Chain-Anwendungen senden (Ausgabe-Orakel) oder Rechenaufgaben Off-Chain ausführen (Rechen-Orakel). ## Warum benötigen Smart Contracts Orakel? {#why-do-smart-contracts-need-oracles} -Viele Entwickler betrachten Smart Contracts als Code, der an spezifischen Adressen auf der Blockchain ausgeführt wird. Eine [allgemeinere Sichtweise auf Smart Contracts](/smart-contracts/) ist jedoch, dass es sich um selbstausführende Softwareprogramme handelt, die in der Lage sind, Vereinbarungen zwischen Parteien durchzusetzen, sobald bestimmte Bedingungen erfüllt sind – daher der Begriff „Smart Contracts“. +Viele Entwickler betrachten Smart Contracts als Code, der an bestimmten Adressen auf der Blockchain ausgeführt wird. Eine [allgemeinere Sichtweise auf Smart Contracts](/smart-contracts/) ist jedoch, dass es sich um selbstausführende Softwareprogramme handelt, die in der Lage sind, Vereinbarungen zwischen Parteien durchzusetzen, sobald bestimmte Bedingungen erfüllt sind – daher der Begriff „Smart Contracts“. -Die Verwendung von Smart Contracts zur Durchsetzung von Vereinbarungen zwischen Personen ist aufgrund der Deterministik von Ethereum nicht einfach. Ein [deterministisches System](https://en.wikipedia.org/wiki/Deterministic_algorithm) ist eines, das bei einem gegebenen Anfangszustand und einer bestimmten Eingabe immer die gleichen Ergebnisse liefert, was bedeutet, dass es bei der Berechnung von Ausgaben aus Eingaben keine Zufälligkeit oder Variation gibt. +Die Verwendung von Smart Contracts zur Durchsetzung von Vereinbarungen zwischen Menschen ist jedoch nicht einfach, da Ethereum deterministisch ist. Ein [deterministisches System](https://en.wikipedia.org/wiki/Deterministic_algorithm) ist ein System, das bei einem Anfangszustand und einer bestimmten Eingabe immer die gleichen Ergebnisse liefert, was bedeutet, dass es bei der Berechnung von Ausgaben aus Eingaben keine Zufälligkeit oder Variation gibt. -Um eine deterministische Ausführung zu erreichen, beschränken Blockchains die Nodes darauf, einen Konsens über einfache binäre (wahr/falsch) Fragen zu erzielen, indem sie _ausschließlich_ Daten verwenden, die auf der Blockchain selbst gespeichert sind. Beispiele für solche Fragen umfassen: +Um eine deterministische Ausführung zu erreichen, beschränken Blockchains Blockchain-Knoten darauf, einen Konsens über einfache binäre (wahr/falsch) Fragen zu erzielen, wobei _nur_ Daten verwendet werden, die auf der Blockchain selbst gespeichert sind. Beispiele für solche Fragen sind: -- „Hat der Kontoinhaber (identifiziert durch einen öffentlichen Schlüssel) diese Transaktion mit dem zugehörigen privaten Schlüssel signiert?“ -- „Verfügt dieses Konto über ausreichende Mittel, um die Transaktion abzudecken?“ +- „Hat der Kontoinhaber (identifiziert durch einen Public-Key) diese Transaktion mit dem zugehörigen Private-Key signiert?“ +- „Verfügt dieses Konto über genügend Geldmittel, um die Transaktion zu decken?“ - „Ist diese Transaktion im Kontext dieses Smart Contracts gültig?“, usw. -Wenn Blockchains Informationen von externen Quellen (d.h. aus der realen Welt) erhielten, wäre eine deterministische Ausführung unmöglich zu erreichen, was die Nodes daran hindern würde, sich über die Gültigkeit von Änderungen am Zustand der Blockchain einig zu werden. Nehmen Sie zum Beispiel einen Smart Contract, der eine Transaktion basierend auf dem aktuellen ETH-USD Wechselkurs ausführt, der von einer traditionellen Preis-API bezogen wird. Diese Zahl wird wahrscheinlich häufig ändern (ganz zu schweigen davon, dass die API veraltet oder gehackt werden könnte), was bedeutet, dass Knoten, die denselben Vertragscode ausführen, zu unterschiedlichen Ergebnissen kommen würden. +Wenn Blockchains Informationen aus externen Quellen (d. h. aus der realen Welt) erhalten würden, wäre Determinismus unmöglich zu erreichen, was Blockchain-Knoten daran hindern würde, sich auf die Gültigkeit von Änderungen am Zustand der Blockchain zu einigen. Nehmen wir zum Beispiel einen Smart Contract, der eine Transaktion basierend auf dem aktuellen ETH-USD-Wechselkurs ausführt, der von einer traditionellen Preis-API bezogen wird. Dieser Wert ändert sich wahrscheinlich häufig (ganz zu schweigen davon, dass die API veraltet sein oder gehackt werden könnte), was bedeutet, dass Blockchain-Knoten, die denselben Vertragscode ausführen, zu unterschiedlichen Ergebnissen kommen würden. -Für eine öffentliche Blockchain wie Ethereum, mit Tausenden von Nodes weltweit, die Transaktionen verarbeiten, ist Determinismus von entscheidender Bedeutung. Ohne eine zentrale Autorität als Quelle der Wahrheit benötigen Nodes Mechanismen, um nach der Anwendung derselben Transaktionen zum gleichen Zustand zu gelangen. Ein Fall, in dem Node A einen Smart Contract ausführt und als Ergebnis "3" erhält, während Node B "7" erhält, nachdem er dieselbe Transaktion ausgeführt hat, würde den Konsens zusammenbrechen lassen und den Wert von Ethereum als dezentralisierte Computing-Plattform zunichte machen. +Für eine öffentliche Blockchain wie Ethereum, bei der Tausende von Blockchain-Knoten auf der ganzen Welt Transaktionen verarbeiten, ist Determinismus von entscheidender Bedeutung. Da es keine zentrale Autorität gibt, die als Quelle der Wahrheit dient, benötigen Blockchain-Knoten Mechanismen, um nach der Anwendung derselben Transaktionen zum selben Zustand zu gelangen. Ein Fall, in dem Blockchain-Knoten A den Code eines Smart Contracts ausführt und als Ergebnis „3“ erhält, während Blockchain-Knoten B nach Ausführung derselben Transaktion „7“ erhält, würde dazu führen, dass der Konsens zusammenbricht und den Wert von Ethereum als dezentralisierte Rechenplattform zunichte macht. -Dieses Szenario hebt auch das Problem hervor, das mit dem Entwurf von Blockchains entsteht, um Informationen aus externen Quellen zu beziehen. Orakel lösen dieses Problem jedoch, indem sie Informationen aus Off-Chain-Quellen entnehmen und diese auf der Blockchain speichern, damit Smart Contracts sie nutzen können. Da auf der Blockchain gespeicherte Informationen unveränderlich und öffentlich zugänglich sind, können Ethereum-Nodes die vom Oracle importierten Off-Chain-Daten sicher verwenden, um Zustandsänderungen zu berechnen, ohne den Konsens zu brechen. +Dieses Szenario verdeutlicht auch das Problem bei der Entwicklung von Blockchains, Informationen aus externen Quellen abzurufen. Orakel lösen dieses Problem jedoch, indem sie Informationen aus Off-Chain-Quellen beziehen und sie auf der Blockchain speichern, damit Smart Contracts sie nutzen können. Da auf der Blockchain gespeicherte Informationen unveränderlich und öffentlich zugänglich sind, können Ethereum-Knoten die vom Orakel importierten Off-Chain-Daten sicher verwenden, um Zustandsänderungen zu berechnen, ohne den Konsens zu brechen. -Um dies zu erreichen, besteht ein Oracle in der Regel aus einem Smart Contract, der auf der Blockchain läuft, und einigen Off-Chain-Komponenten. Der On-Chain-Vertrag erhält Anfragen nach Daten von anderen Smart Contracts, die er an die Off-Chain-Komponente (auch Oracle-Node genannt) weiterleitet. Dieser Oracle-Node kann Datenquellen abfragen – beispielsweise unter Verwendung von Anwendungsprogrammierschnittstellen (APIs) – und Transaktionen senden, um die angeforderten Daten im Speicher des Smart Contracts zu speichern. +Um dies zu tun, besteht ein Orakel typischerweise aus einem Smart Contract, der auf der Blockchain läuft, und einigen Off-Chain-Komponenten. Der Vertrag auf der Blockchain empfängt Datenanfragen von anderen Smart Contracts, die er an die Off-Chain-Komponente (Orakel-Knoten genannt) weiterleitet. Dieser Orakel-Knoten kann Datenquellen abfragen – beispielsweise über Anwendungsprogrammierschnittstellen (APIs) – und Transaktionen senden, um die angeforderten Daten im Speicher des Smart Contracts zu speichern. -Im Wesentlichen überbrückt ein Blockchain-Oracle die Informationslücke zwischen der Blockchain und der externen Umgebung, wodurch „hybride Smart Contracts“ entstehen. Ein hybrider Smart Contract ist einer, der auf einer Kombination aus On-Chain-Vertragscode und Off-Chain-Infrastruktur basiert. Dezentrale Prognosemärkte sind ein hervorragendes Beispiel für hybride Smart Contracts. Andere Beispiele könnten Smart Contracts für Ernteversicherungen sein, die eine Zahlung leisten, wenn eine Gruppe von Orakeln feststellt, dass bestimmte Wetterphänomene eingetreten sind. +Im Wesentlichen überbrückt ein Blockchain-Orakel die Informationslücke zwischen der Blockchain und der externen Umgebung und schafft so „hybride Smart Contracts“. Ein hybrider Smart Contract funktioniert basierend auf einer Kombination aus Vertragscode auf der Blockchain und Off-Chain-Infrastruktur. Dezentralisierte Prognosemärkte sind ein hervorragendes Beispiel für hybride Smart Contracts. Weitere Beispiele könnten Smart Contracts für Ernteversicherungen sein, die auszahlen, wenn eine Reihe von Orakeln feststellt, dass bestimmte Wetterphänomene aufgetreten sind. -## Was ist das Oracle-Problem? Das Oracle-Problem {#the-oracle-problem} +## Was ist das Orakel-Problem? {#the-oracle-problem} -Orakel lösen ein wichtiges Problem, führen aber auch einige Komplikationen ein, zum Beispiel.,: +Orakel lösen ein wichtiges Problem, bringen aber auch einige Komplikationen mit sich, z. B.: -- Wie können wir überprüfen, dass die eingespeiste Information aus der richtigen Quelle extrahiert wurde oder nicht manipuliert wurde? +- Wie überprüfen wir, ob die eingespeisten Informationen aus der richtigen Quelle stammen oder nicht manipuliert wurden? - Wie stellen wir sicher, dass diese Daten immer verfügbar sind und regelmäßig aktualisiert werden? -Das sogenannte "Orakle-Problem" zeigt die Probleme auf, die mit der Verwendung von Blockchain-Orakeln zur Übermittlung von Eingaben an Smart Contracts verbunden sind. Die Daten von einem Orakel müssen korrekt sein, damit ein Smart Contract korrekt ausgeführt wird. Darüber hinaus untergräbt das notwendige 'Vertrauen' in die Betreiber von Orakeln, genaue Informationen zu liefern, den 'vertrauenslosen' Aspekt von Smart Contracts. +Das sogenannte „Orakel-Problem“ zeigt die Schwierigkeiten auf, die mit der Verwendung von Blockchain-Orakeln zum Senden von Eingaben an Smart Contracts einhergehen. Daten von einem Orakel müssen korrekt sein, damit ein Smart Contract korrekt ausgeführt wird. Darüber hinaus untergräbt die Notwendigkeit, Orakel-Betreibern zu „vertrauen“, dass sie genaue Informationen liefern, den „vertrauenslosen“ (trustless) Aspekt von Smart Contracts. -Different oracles offer different solutions to the oracle problem, which we explore later. Orakel werden typischerweise danach bewertet, wie gut sie die folgenden Herausforderungen bewältigen können: +Verschiedene Orakel bieten unterschiedliche Lösungen für das Orakel-Problem, die wir später untersuchen werden. Orakel werden typischerweise danach bewertet, wie gut sie die folgenden Herausforderungen bewältigen können: -1. **Korrektheit**: Ein Oracle sollte nicht dazu führen, dass Smart Contracts Zustandsänderungen auf Basis ungültiger Off-Chain-Daten auslösen. Ein Orakel muss die _Authentizität_ und _Integrität_ der Daten gewährleisten. Authentizität bedeutet, dass die Daten aus der richtigen Quelle stammen, während Integrität bedeutet, dass die Daten intakt geblieben sind (d. h. nicht verändert wurden), bevor sie onchain gesendet wurden. +1. **Korrektheit**: Ein Orakel sollte nicht dazu führen, dass Smart Contracts Zustandsänderungen basierend auf ungültigen Off-Chain-Daten auslösen. Ein Orakel muss die _Authentizität_ und _Integrität_ der Daten garantieren. Authentizität bedeutet, dass die Daten aus der richtigen Quelle stammen, während Integrität bedeutet, dass die Daten intakt geblieben sind (d. h. nicht verändert wurden), bevor sie auf die Blockchain gesendet wurden. -2. **Verfügbarkeit**: Ein Orakel sollte keine Verzögerungen verursachen oder die Ausführung von Aktionen und das Auslösen von Zustandsänderungen durch Smart Contracts verhindern. Das bedeutet, dass die Daten von einem Orakel _auf Anfrage_ ohne Unterbrechung verfügbar sein müssen. +2. **Verfügbarkeit**: Ein Orakel sollte Smart Contracts nicht verzögern oder daran hindern, Aktionen auszuführen und Zustandsänderungen auszulösen. Dies bedeutet, dass Daten von einem Orakel ohne Unterbrechung _auf Anfrage verfügbar_ sein müssen. -3. **Anreizkompatibilität**: Ein Oracle sollte Off-Chain-Datenanbieter dazu anreizen, korrekte Informationen an Smart Contracts zu übermitteln. Anreizkompatibilität beinhaltet _Zurechenbarkeit_ und _Rechenschaftspflicht_. Zurechenbarkeit ermöglicht die Verknüpfung eines Stücks externer Information mit ihrem Anbieter, während Verantwortlichkeit die Datenanbieter an die von ihnen gelieferten Informationen bindet, sodass sie basierend auf der Qualität der bereitgestellten Informationen belohnt oder bestraft werden können. +3. **Anreizkompatibilität**: Ein Orakel sollte Off-Chain-Datenanbietern Anreize bieten, korrekte Informationen an Smart Contracts zu übermitteln. Anreizkompatibilität umfasst _Zurechenbarkeit_ und _Verantwortlichkeit_. Zurechenbarkeit ermöglicht es, eine externe Information mit ihrem Anbieter zu verknüpfen, während Verantwortlichkeit Datenanbieter an die von ihnen bereitgestellten Informationen bindet, sodass sie basierend auf der Qualität der bereitgestellten Informationen belohnt oder bestraft werden können. -## Wie funktioniert ein Blockchain-Orakel-Dienst? Wie funktioniert ein Blockchain-Oracle-Service? {#how-does-a-blockchain-oracle-service-work} +## Wie funktioniert ein Blockchain-Orakel-Dienst? {#how-does-a-blockchain-oracle-service-work} -### Benutzer {#users} +### Nutzer {#users} -Benutzer sind Entitäten (d.h. Smart Contracts), die Informationen benötigen, die extern zur Blockchain liegen, um bestimmte Aktionen abzuschließen. Der grundlegende Arbeitsablauf eines Orakel-Dienstes beginnt damit, dass der Benutzer eine Datenanfrage an den Orakel-Vertrag sendet. Datenanfragen werden gewöhnlich einige oder alle der folgenden Fragen beantworten: +Nutzer sind Entitäten (d. h. Smart Contracts), die Informationen außerhalb der Blockchain benötigen, um bestimmte Aktionen abzuschließen. Der grundlegende Arbeitsablauf eines Orakel-Dienstes beginnt damit, dass der Nutzer eine Datenanfrage an den Orakel-Vertrag sendet. Datenanfragen beantworten in der Regel einige oder alle der folgenden Fragen: -1. Welche Quellen können Off-Chain-Nodes für die angeforderten Informationen konsultieren? +1. Welche Quellen können Off-Chain-Knoten für die angeforderten Informationen konsultieren? 2. Wie verarbeiten Reporter Informationen aus Datenquellen und extrahieren nützliche Datenpunkte? -3. Wie viele Oracle Nodes können an der Datenabfrage teilnehmen? +3. Wie viele Orakel-Knoten können am Abrufen der Daten teilnehmen? -4. Wie sollten Diskrepanzen in Berichten von Orakeln verwaltet werden? +4. Wie sollen Diskrepanzen in Orakel-Berichten gehandhabt werden? -5. Welche Methode sollte implementiert werden, um Einreichungen zu filtern und Berichte zu einem einzigen Wert zu aggregieren? +5. Welche Methode sollte beim Filtern von Einreichungen und beim Aggregieren von Berichten zu einem einzigen Wert implementiert werden? -### Oracle-Vertrag {#oracle-contract} +### Orakel-Vertrag {#oracle-contract} -Der Oracle-Vertrag ist die On-Chain-Komponente des Oracle-Dienstes. Der Oracle Contract ist die On-Chain-Komponente für den Oracle-Service. Dieser Vertrag kann auch einige Berechnungen auf den zurückgegebenen Datenpunkten durchführen, um einen aggregierten Wert zu erzeugen, der an den anfragenden Vertrag gesendet wird. +Der Orakel-Vertrag ist die Komponente auf der Blockchain für den Orakel-Dienst. Er lauscht auf Datenanfragen von anderen Verträgen, leitet Datenabfragen an Orakel-Knoten weiter und überträgt zurückgegebene Daten an Client-Verträge. Dieser Vertrag kann auch einige Berechnungen an den zurückgegebenen Datenpunkten durchführen, um einen aggregierten Wert zu erzeugen, der an den anfragenden Vertrag gesendet wird. -Der Orakelvertrag stellt einige Funktionen bereit, die von Client-Verträgen aufgerufen werden, wenn eine Datenanfrage gestellt wird. Nach Erhalt einer neuen Anfrage gibt der Smart Contract ein [Log-Ereignis](/developers/docs/smart-contracts/anatomy/#events-and-logs) mit den Details der Datenanfrage aus. Dies benachrichtigt Offchain-Nodes, die das Protokoll abonniert haben (normalerweise mit etwas wie dem JSON-RPC-Befehl `eth_subscribe`), die dann die im Log-Ereignis definierten Daten abrufen. +Der Orakel-Vertrag stellt einige Funktionen bereit, die Client-Verträge aufrufen, wenn sie eine Datenanfrage stellen. Nach Erhalt einer neuen Abfrage gibt der Smart Contract ein [Protokollereignis](/developers/docs/smart-contracts/anatomy/#events-and-logs) mit Details zur Datenanfrage aus. Dies benachrichtigt Off-Chain-Knoten, die das Protokoll abonniert haben (normalerweise mit etwas wie dem JSON-RPC-Befehl `eth_subscribe`), welche dann fortfahren, die im Protokollereignis definierten Daten abzurufen. -Nachfolgend finden Sie einen [Beispiel-Oracle-Vertrag](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) von Pedro Costa. Dies ist ein einfacher Oracle-Dienst, der auf Anfrage von anderen Smart Contracts Off-Chain-APIs abfragen und die angeforderten Informationen auf der Blockchain speichern kann: +Unten ist ein [Beispiel für einen Orakel-Vertrag](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) von Pedro Costa. Dies ist ein einfacher Orakel-Dienst, der Off-Chain-APIs auf Anfrage anderer Smart Contracts abfragen und die angeforderten Informationen auf der Blockchain speichern kann: ```solidity pragma solidity >=0.4.21 <0.6.0; contract Oracle { - Request[] requests; //Liste der an den Vertrag gestellten Anfragen - uint currentId = 0; //ansteigende Anforderungs-ID - uint minQuorum = 2; //Mindestanzahl der zu erhaltenden Antworten, bevor das Endergebnis deklariert wird - uint totalOracleCount = 3; // Fest programmierte Oracle-Anzahl + Request[] requests; // Liste der an den Vertrag gestellten Anfragen + uint currentId = 0; // aufsteigende Anfrage-ID + uint minQuorum = 2; // Mindestanzahl an Antworten, die empfangen werden müssen, bevor das Endergebnis deklariert wird + uint totalOracleCount = 3; // Fest codierte Anzahl an Orakeln // definiert eine allgemeine API-Anfrage struct Request { - uint id; //Anforderungs-ID - string urlToQuery; //API-URL - string attributeToFetch; //JSON-Attribut (Schlüssel), das in der Antwort abgerufen werden soll - string agreedValue; //Wert vom Schlüssel - mapping(uint => string) answers; //von den Oracles bereitgestellte Antworten - mapping(address => uint) quorum; //Oracles, die die Antwort abfragen (1=Oracle hat nicht abgestimmt, 2=Oracle hat abgestimmt) + uint id; // Anfrage-ID + string urlToQuery; // API-URL + string attributeToFetch; // JSON-Attribut (Schlüssel), das in der Antwort abgerufen werden soll + string agreedValue; // Wert aus Schlüssel + mapping(uint => string) answers; // von den Orakeln bereitgestellte Antworten + mapping(address => uint) quorum; // Orakel, die die Antwort abfragen werden (1=Orakel hat nicht abgestimmt, 2=Orakel hat abgestimmt) } - //Ereignis, das das Oracle außerhalb der Blockchain auslöst + // Ereignis, das ein Orakel außerhalb der Blockchain auslöst event NewRequest ( uint id, string urlToQuery, string attributeToFetch ); - //wird ausgelöst, wenn ein Konsens über das Endergebnis erzielt wird + // wird ausgelöst, wenn es einen Konsens über das Endergebnis gibt event UpdatedRequest ( uint id, string urlToQuery, @@ -127,23 +127,23 @@ contract Oracle { uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, "")); Request storage r = requests[length-1]; - // Fest programmierte Oracle-Adressen + // Fest codierte Orakel-Adressen r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1; r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1; r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1; - // ein Ereignis auslösen, das vom Oracle außerhalb der Blockchain erkannt wird + // ein Ereignis auslösen, das vom Orakel außerhalb der Blockchain erkannt wird emit NewRequest ( currentId, _urlToQuery, _attributeToFetch ); - // Anforderungs-ID erhöhen + // Anfrage-ID erhöhen currentId++; } - //vom Oracle aufgerufen, um seine Antwort aufzuzeichnen + // wird vom Orakel aufgerufen, um seine Antwort aufzuzeichnen function updateRequest ( uint _id, string memory _valueRetrieved @@ -151,18 +151,18 @@ contract Oracle { Request storage currRequest = requests[_id]; - //prüfen, ob das Oracle in der Liste der vertrauenswürdigen Oracles ist - //und ob das Oracle noch nicht abgestimmt hat + // prüfen, ob das Orakel in der Liste der vertrauenswürdigen Orakel ist + // und ob das Orakel noch nicht abgestimmt hat if(currRequest.quorum[address(msg.sender)] == 1){ - //markieren, dass diese Adresse abgestimmt hat + // markiert, dass diese Adresse abgestimmt hat currRequest.quorum[msg.sender] = 2; - //durch das "Array" der Antworten iterieren, bis eine Position frei ist, und den abgerufenen Wert speichern + // durch das "Array" der Antworten iterieren, bis eine Position frei ist, und den abgerufenen Wert speichern uint tmpI = 0; bool found = false; while(!found) { - //ersten leeren Slot finden + // ersten leeren Platz finden if(bytes(currRequest.answers[tmpI]).length == 0){ found = true; currRequest.answers[tmpI] = _valueRetrieved; @@ -172,8 +172,8 @@ contract Oracle { uint currentQuorum = 0; - //durch die Oracle-Liste iterieren und prüfen, ob genügend Oracles (Mindestquorum) - //für dieselbe Antwort wie die aktuelle gestimmt haben + // durch die Orakel-Liste iterieren und prüfen, ob genügend Orakel (Mindestquorum) + // für dieselbe Antwort wie die aktuelle abgestimmt haben for(uint i = 0; i < totalOracleCount; i++){ bytes memory a = bytes(currRequest.answers[i]); bytes memory b = bytes(_valueRetrieved); @@ -196,129 +196,129 @@ contract Oracle { } ``` -### Oracle-Nodes {#oracle-nodes} +### Orakel-Knoten {#oracle-nodes} -Der Oracle-Node ist die Off-Chain-Komponente des Oracle-Dienstes. Er extrahiert Informationen aus externen Quellen, wie zum Beispiel APIs, die auf Drittanbieterservern gehostet werden, und stellt diese On-Chain für die Nutzung durch Smart Contracts bereit. Oracle-Nodes hören auf Ereignisse aus dem On-Chain-Oracle-Vertrag und führen die in der Protokollmeldung beschriebene Aufgabe aus. +Der Orakel-Knoten ist die Off-Chain-Komponente des Orakel-Dienstes. Er extrahiert Informationen aus externen Quellen, wie z. B. APIs, die auf Servern von Drittanbietern gehostet werden, und stellt sie auf der Blockchain zur Nutzung durch Smart Contracts bereit. Orakel-Knoten lauschen auf Ereignisse vom Orakel-Vertrag auf der Blockchain und fahren fort, die im Protokoll beschriebene Aufgabe abzuschließen. -Eine häufige Aufgabe für Oracle-Nodes ist das Senden einer [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp)-Anfrage an einen API-Dienst, das Parsen der Antwort, um relevante Daten zu extrahieren, das Formatieren in eine Blockchain-lesbare Ausgabe und das Senden onchain durch Einbindung in eine Transaktion an den Oracle-Vertrag. Der Orakel-Node kann auch verpflichtet sein, die Gültigkeit und Integrität der eingereichten Informationen mit „Echtheitsbeweisen“ zu bestätigen, die wir später näher betrachten. +Eine häufige Aufgabe für Orakel-Knoten ist das Senden einer [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp)-Anfrage an einen API-Dienst, das Parsen der Antwort, um relevante Daten zu extrahieren, das Formatieren in eine Blockchain-lesbare Ausgabe und das Senden auf die Blockchain, indem sie in eine Transaktion an den Orakel-Vertrag aufgenommen wird. Der Orakel-Knoten kann auch aufgefordert werden, die Gültigkeit und Integrität der übermittelten Informationen mithilfe von „Authentizitätsnachweisen“ zu bestätigen, die wir später untersuchen werden. -Auch Computations-Oracles verlassen sich auf Off-Chain-Nodes, um rechenintensive Aufgaben auszuführen, die aufgrund von Gas-Kosten und Blockgrößenbeschränkungen nicht praktikabel On-Chain durchgeführt werden könnten. Zum Beispiel kann der Oracle-Node damit beauftragt werden, eine nachweislich zufällige Zahl zu generieren (z.B. für blockchain-basierte Spiele). +Rechen-Orakel verlassen sich ebenfalls auf Off-Chain-Knoten, um Rechenaufgaben auszuführen, deren Ausführung auf der Blockchain angesichts von Gaskosten und Blockgrößenlimits unpraktisch wäre. Beispielsweise kann der Orakel-Knoten damit beauftragt werden, eine verifizierbar zufällige Zahl zu generieren (z. B. für Blockchain-basierte Spiele). -## Oracle-Designmuster {#oracle-design-patterns} +## Orakel-Entwurfsmuster {#oracle-design-patterns} -Oracles gibt es in verschiedenen Typen, einschließlich _Immediate-Read_, _Publish-Subscribe_ und _Request-Response_, wobei die beiden letzteren bei Ethereum-Smart-Contracts am beliebtesten sind. Hier beschreiben wir kurz die Publish-Subscribe- und Request-Response-Modelle. +Orakel gibt es in verschiedenen Arten, einschließlich _Immediate-Read_, _Publish-Subscribe_ und _Request-Response_, wobei die letzteren beiden bei Ethereum-Smart-Contracts am beliebtesten sind. Hier beschreiben wir kurz die Publish-Subscribe- und Request-Response-Modelle. -### Publish-Subscribe-Oracles {#publish-subscribe-oracles} +### Publish-Subscribe-Orakel {#publish-subscribe-oracles} -Dieser Typ von Oracle stellt einen "Datenfeed" zur Verfügung, den andere Verträge regelmäßig für Informationen abrufen können. In diesem Fall wird erwartet, dass sich die Daten häufig ändern, sodass die Client-Verträge auf Aktualisierungen der Daten im Speicher des Oracles achten müssen. Ein Beispiel ist ein Oracle, das Nutzern die neuesten ETH-USD-Preisinformationen zur Verfügung stellt. +Diese Art von Orakel stellt einen „Daten-Feed“ bereit, den andere Verträge regelmäßig auf Informationen lesen können. Es wird erwartet, dass sich die Daten in diesem Fall häufig ändern, sodass Client-Verträge auf Aktualisierungen der Daten im Speicher des Orakels lauschen müssen. Ein Beispiel ist ein Orakel, das den Nutzern die neuesten ETH-USD-Preisinformationen zur Verfügung stellt. -### Request-Response-Oracles {#request-response-oracles} +### Request-Response-Orakel {#request-response-oracles} -Ein Request-Response-Setup ermöglicht es dem Client-Vertrag, beliebige Daten anzufordern, die über die von einem Publish-Subscribe-Oracle bereitgestellten Daten hinausgehen. Request-Response-Oracles sind ideal, wenn der Datensatz zu groß ist, um im Speicher eines Smart Contracts gespeichert zu werden, und/oder die Nutzer zu jedem Zeitpunkt nur einen kleinen Teil der Daten benötigen. +Ein Request-Response-Setup ermöglicht es dem Client-Vertrag, beliebige Daten anzufordern, die nicht von einem Publish-Subscribe-Orakel bereitgestellt werden. Request-Response-Orakel sind ideal, wenn der Datensatz zu groß ist, um im Speicher eines Smart Contracts gespeichert zu werden, und/oder Nutzer zu einem bestimmten Zeitpunkt nur einen kleinen Teil der Daten benötigen. -Obwohl komplexer als Publish-Subscribe-Modelle, sind Request-Response-Oracles im Grunde das, was wir im vorherigen Abschnitt beschrieben haben. Der Oracle wird eine On-Chain-Komponente haben, die eine Datenanfrage empfängt und diese an einen Off-Chain-Node zur Verarbeitung weiterleitet. +Obwohl sie komplexer als Publish-Subscribe-Modelle sind, sind Request-Response-Orakel im Grunde das, was wir im vorherigen Abschnitt beschrieben haben. Das Orakel verfügt über eine Komponente auf der Blockchain, die eine Datenanfrage empfängt und sie zur Verarbeitung an einen Off-Chain-Knoten weiterleitet. -Benutzer, die Datenabfragen initiieren, müssen die Kosten für das Abrufen von Informationen aus der Off-Chain-Quelle übernehmen. Der Client-Vertrag muss auch Mittel bereitstellen, um die Gas-Kosten zu decken, die durch den Oracle-Vertrag beim Zurücksenden der Antwort über die in der Anfrage spezifizierte Callback-Funktion entstehen. +Nutzer, die Datenabfragen initiieren, müssen die Kosten für das Abrufen von Informationen aus der Off-Chain-Quelle tragen. Der Client-Vertrag muss auch Geldmittel bereitstellen, um die Gaskosten zu decken, die dem Orakel-Vertrag bei der Rückgabe der Antwort über die in der Anfrage angegebene Callback-Funktion entstehen. -## Zentralisierte vs. dezentralisierte Oracles {#types-of-oracles} +## Zentralisierte vs. dezentralisierte Orakel {#types-of-oracles} -### Zentralisierte Oracles {#centralized-oracles} +### Zentralisierte Orakel {#centralized-oracles} -Ein zentralisierter Oracle wird von einer einzigen Entität kontrolliert, die für das Sammeln von Off-Chain-Informationen und das Aktualisieren der Daten im Oracle-Vertrag auf Anfrage verantwortlich ist. Zentralisierte Oracles sind effizient, da sie sich auf eine einzige Wahrheitsquelle stützen. Sie können besser funktionieren in Fällen, in denen proprietäre Datensätze direkt vom Besitzer mit einer weit akzeptierten Signatur veröffentlicht werden. Sie bringen jedoch auch Nachteile mit sich: +Ein zentralisiertes Orakel wird von einer einzigen Entität kontrolliert, die dafür verantwortlich ist, Off-Chain-Informationen zu aggregieren und die Daten des Orakel-Vertrags wie angefordert zu aktualisieren. Zentralisierte Orakel sind effizient, da sie sich auf eine einzige Quelle der Wahrheit verlassen. Sie funktionieren möglicherweise besser in Fällen, in denen proprietäre Datensätze direkt vom Eigentümer mit einer weithin akzeptierten Signatur veröffentlicht werden. Sie bringen jedoch auch Nachteile mit sich: #### Geringe Korrektheitsgarantien {#low-correctness-guarantees} -Bei zentralisierten Orakeln gibt es keine Möglichkeit zu bestätigen, ob die bereitgestellten Informationen korrekt sind oder nicht. Selbst "renommierte" Anbieter können unzuverlässig werden oder gehackt werden. Wenn das Orakel korrupt wird, führen Smart Contracts Ausführungen auf Basis fehlerhafter Daten durch. +Bei zentralisierten Orakeln gibt es keine Möglichkeit zu bestätigen, ob die bereitgestellten Informationen korrekt sind oder nicht. Selbst „seriöse“ Anbieter können bösartig handeln oder gehackt werden. Wenn das Orakel korrumpiert wird, werden Smart Contracts basierend auf fehlerhaften Daten ausgeführt. #### Schlechte Verfügbarkeit {#poor-availability} -Zentralisierte Oracles garantieren nicht, dass Off-Chain-Daten immer für andere Smart Contracts verfügbar gemacht werden. Wenn der Anbieter sich entscheidet, den Dienst abzuschalten, oder ein Hacker die Off-Chain-Komponente des Oracles übernimmt, besteht für deinen Smart Contract das Risiko eines Denial-of-Service (DoS)-Angriffs. +Bei zentralisierten Orakeln ist nicht garantiert, dass sie anderen Smart Contracts immer Off-Chain-Daten zur Verfügung stellen. Wenn der Anbieter beschließt, den Dienst abzuschalten, oder ein Hacker die Off-Chain-Komponente des Orakels kapert, ist Ihr Smart Contract dem Risiko eines Denial-of-Service-Angriffs (DoS) ausgesetzt. #### Schlechte Anreizkompatibilität {#poor-incentive-compatibility} -Zentralisierte Orakel haben oft schlecht konzipierte oder nicht vorhandene Anreize für den Datenanbieter, genaue/unveränderte Informationen zu senden. Die Bezahlung eines Orakels für Korrektheit garantiert nicht dessen Ehrlichkeit. Dieses Problem wird größer, je mehr Wert von Smart Contracts kontrolliert wird. +Zentralisierte Orakel haben oft schlecht gestaltete oder nicht vorhandene Anreize für den Datenanbieter, genaue/unveränderte Informationen zu senden. Ein Orakel für Korrektheit zu bezahlen, garantiert keine Ehrlichkeit. Dieses Problem wird größer, je mehr Wert durch Smart Contracts kontrolliert wird. -### Dezentralisierte Oracles {#decentralized-oracles} +### Dezentralisierte Orakel {#decentralized-oracles} -Dezentralisierte Orakel sind darauf ausgelegt, die Einschränkungen zentralisierter Orakel zu überwinden, indem sie einzelne Ausfallpunkte beseitigen. Ein dezentraler Oracle-Dienst besteht aus mehreren Teilnehmern in einem Peer-to-Peer-Netzwerk, die vor dem Senden an einen Smart Contract ein Konsens über die Off-Chain-Daten bilden. +Dezentralisierte Orakel sind so konzipiert, dass sie die Einschränkungen zentralisierter Orakel überwinden, indem sie Single Points of Failure eliminieren. Ein dezentralisierter Orakel-Dienst umfasst mehrere Teilnehmer in einem Peer-to-Peer-Netzwerk, die einen Konsens über Off-Chain-Daten bilden, bevor sie diese an einen Smart Contract senden. -Ein dezentralisiertes Oracle sollte (idealerweise) erlaubnisfrei, vertrauenslos und frei von der Verwaltung durch eine zentrale Partei sein; in der Realität ist die Dezentralisierung bei Oracles ein Spektrum. Es gibt halb-dezentralisierte Orakel Netzwerke wo jeder Teilnehmen kann, aber mit einem "Besitzer" welcher Knoten nach historischer Leistung erlaubt und entfernt. Vollständig dezentralisierte Orakelnetzwerke existieren ebenfalls: Diese funktionieren in der Regel als eigenständige Blockchains und verfügen über definierte Konsensmechanismen zur Koordination der Nodes und zur Bestrafung von Fehlverhalten. +Ein dezentralisiertes Orakel sollte (idealerweise) erlaubnisfrei, vertrauenslos und frei von der Verwaltung durch eine zentrale Partei sein; in der Realität bewegt sich die Dezentralisierung bei Orakeln auf einem Spektrum. Es gibt semi-dezentralisierte Orakel-Netzwerke, an denen jeder teilnehmen kann, jedoch mit einem „Eigentümer“, der Blockchain-Knoten basierend auf der historischen Leistung genehmigt und entfernt. Es gibt auch vollständig dezentralisierte Orakel-Netzwerke: Diese laufen normalerweise als eigenständige Blockchains und haben definierte Konsensmechanismen zur Koordinierung von Blockchain-Knoten und zur Bestrafung von Fehlverhalten. -Die Nutzung dezentralisierter Orakel bietet folgende Vorteile: +Die Verwendung dezentralisierter Orakel bietet die folgenden Vorteile: ### Hohe Korrektheitsgarantien {#high-correctness-guarantees} -Dezentralisierte Orakel versuchen, die Korrektheit von Daten durch verschiedene Ansätze zu gewährleisten. Dazu gehört die Verwendung von Nachweisen, die die Authentizität und Integrität der zurückgegebenen Informationen bestätigen, sowie die Notwendigkeit, dass mehrere Akteure kollektiv die Gültigkeit der Off-Chain-Daten bestätigen. +Dezentralisierte Orakel versuchen, die Korrektheit von Daten mit verschiedenen Ansätzen zu erreichen. Dazu gehört die Verwendung von Nachweisen, die die Authentizität und Integrität der zurückgegebenen Informationen bestätigen, und die Anforderung, dass sich mehrere Entitäten kollektiv auf die Gültigkeit von Off-Chain-Daten einigen. #### Authentizitätsnachweise {#authenticity-proofs} -Authentizitätsnachweise sind kryptografische Mechanismen, die eine unabhängige Überprüfung von Informationen ermöglichen, die aus externen Quellen abgerufen wurden. Diese Nachweise können die Quelle der Informationen validieren und mögliche Veränderungen der Daten nach deren Abruf erkennen. +Authentizitätsnachweise sind kryptografische Mechanismen, die eine unabhängige Überprüfung von Informationen ermöglichen, die aus externen Quellen abgerufen wurden. Diese Nachweise können die Quelle der Informationen validieren und mögliche Änderungen an den Daten nach dem Abruf erkennen. -Beispiele für Authentizitätsnachweise umfassen: +Beispiele für Authentizitätsnachweise sind: -**Transport Layer Security (TLS)-Nachweise**: Oracle-Nodes rufen häufig Daten aus externen Quellen über eine sichere HTTP-Verbindung ab, die auf dem Transport Layer Security (TLS)-Protokoll basiert. Einige dezentralisierte Orakel verwenden Authentizitätsnachweise, um TLS-Sitzungen zu verifizieren (das heißt, den Informationsaustausch zwischen einem Node und einem bestimmten Server zu bestätigen) und um sicherzustellen, dass die Inhalte der Sitzung nicht verändert wurden. +**Transport Layer Security (TLS)-Nachweise**: Orakel-Knoten rufen Daten aus externen Quellen häufig über eine sichere HTTP-Verbindung basierend auf dem Transport Layer Security (TLS)-Protokoll ab. Einige dezentralisierte Orakel verwenden Authentizitätsnachweise, um TLS-Sitzungen zu verifizieren (d. h. den Informationsaustausch zwischen einem Blockchain-Knoten und einem bestimmten Server zu bestätigen) und zu bestätigen, dass der Inhalt der Sitzung nicht verändert wurde. -**Trusted Execution Environment (TEE)-Attestierungen**: Eine [Trusted Execution Environment](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) ist eine abgeschottete Rechenumgebung, die von den Betriebsprozessen ihres Host-Systems isoliert ist. TEEs stellen sicher, dass jeglicher Anwendungscode oder Daten, die in der Rechenumgebung gespeichert oder verwendet werden, ihre Integrität, Vertraulichkeit und Unveränderlichkeit bewahren. Benutzer können auch eine Attestierung erstellen, um zu beweisen, dass eine Anwendungsinstanz innerhalb der Trusted Execution Environment läuft. +**Trusted Execution Environment (TEE)-Bestätigungen**: Eine [Trusted Execution Environment](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) ist eine in einer Sandbox ausgeführte Rechenumgebung, die von den operativen Prozessen ihres Host-Systems isoliert ist. TEEs stellen sicher, dass jeglicher Anwendungscode oder Daten, die in der Rechenumgebung gespeichert/verwendet werden, ihre Integrität, Vertraulichkeit und Unveränderlichkeit behalten. Nutzer können auch eine Bestätigung generieren, um zu beweisen, dass eine Anwendungsinstanz innerhalb der Trusted Execution Environment ausgeführt wird. -Bestimmte Klassen dezentralisierter Orakel erfordern, dass Betreiber von Orakel-Nodes TEE-Attestierungen bereitstellen. Dies bestätigt dem Benutzer, dass der Node-Betreiber eine Instanz des Orakel-Clients in einer Trusted Execution Environment ausführt. TEEs verhindern, dass externe Prozesse den Code und die Daten einer Anwendung ändern oder lesen. Daher beweisen diese Attestierungen, dass der Orakel-Node die Informationen unverändert und vertraulich gehalten hat. +Bestimmte Klassen dezentralisierter Orakel verlangen von Orakel-Knotenbetreibern die Bereitstellung von TEE-Bestätigungen. Dies bestätigt einem Nutzer, dass der Knotenbetreiber eine Instanz des Orakel-Clients in einer Trusted Execution Environment ausführt. TEEs verhindern, dass externe Prozesse den Code und die Daten einer Anwendung ändern oder lesen. Daher beweisen diese Bestätigungen, dass der Orakel-Knoten die Informationen intakt und vertraulich gehalten hat. #### Konsensbasierte Validierung von Informationen {#consensus-based-validation-of-information} -Zentralisierte Orakel stützen sich auf eine einzelne Quelle der Wahrheit, wenn sie Daten an Smart Contracts liefern, was die Möglichkeit der Veröffentlichung ungenauer Informationen mit sich bringt. Dezentrale Oracles lösen dieses Problem, indem sie auf mehrere Oracle-Nodes zurückgreifen, um Off-Chain-Informationen abzufragen. Durch den Vergleich von Daten aus mehreren Quellen reduzieren dezentrale Oracles das Risiko, ungültige Informationen an On-Chain-Verträge weiterzuleiten. +Zentralisierte Orakel verlassen sich bei der Bereitstellung von Daten für Smart Contracts auf eine einzige Quelle der Wahrheit, was die Möglichkeit der Veröffentlichung ungenauer Informationen mit sich bringt. Dezentralisierte Orakel lösen dieses Problem, indem sie sich auf mehrere Orakel-Knoten verlassen, um Off-Chain-Informationen abzufragen. Durch den Vergleich von Daten aus mehreren Quellen verringern dezentralisierte Orakel das Risiko, ungültige Informationen an Verträge auf der Blockchain weiterzugeben. -Dezentrale Oracles müssen jedoch mit Diskrepanzen in den von mehreren Off-Chain-Quellen abgerufenen Informationen umgehen. Um Unterschiede in den Informationen zu minimieren und sicherzustellen, dass die an den Orakel-Vertrag übergebenen Daten die kollektive Meinung der Orakel-Nodes widerspiegeln, verwenden dezentralisierte Orakel folgende Mechanismen: +Dezentralisierte Orakel müssen jedoch mit Diskrepanzen bei Informationen umgehen, die aus mehreren Off-Chain-Quellen abgerufen werden. Um Informationsunterschiede zu minimieren und sicherzustellen, dass die an den Orakel-Vertrag weitergegebenen Daten die kollektive Meinung der Orakel-Knoten widerspiegeln, verwenden dezentralisierte Orakel die folgenden Mechanismen: -##### Abstimmung/Einsatz bezüglich der Genauigkeit von Daten +##### Abstimmung/Staking über die Genauigkeit von Daten -Einige dezentralisierte Orakelnetzwerke erfordern, dass Teilnehmer über die Genauigkeit von Antworten auf Datenanfragen abstimmen oder Einsätze tätigen (z.B. "Wer hat die US-Wahl 2020 gewonnen?") unter Verwendung des nativen Tokens des Netzwerks. Ein Aggregationsprotokoll aggregiert dann die Stimmen und Einsätze und nimmt die von der Mehrheit unterstützte Antwort als die gültige an. +Einige dezentralisierte Orakel-Netzwerke verlangen von den Teilnehmern, dass sie über die Genauigkeit von Antworten auf Datenabfragen (z. B. „Wer hat die US-Wahl 2020 gewonnen?“) unter Verwendung des nativen Tokens des Netzwerks abstimmen oder Staking betreiben. Ein Aggregationsprotokoll aggregiert dann die Stimmen und Einsätze und nimmt die von der Mehrheit unterstützte Antwort als die gültige an. -Ein Aggregationsprotokoll aggregiert dann die Stimmen und Einsätze und nimmt die von der Mehrheit unterstützte Antwort als die gültige an. Das Erfordern einer Kaution von den Nodes, bevor sie Daten bereitstellen, motiviert zu ehrlichen Antworten, da angenommen wird, dass sie rationale ökonomische Akteure sind, die darauf abzielen, ihre Erträge zu maximieren. +Blockchain-Knoten, deren Antworten von der Mehrheitsantwort abweichen, werden bestraft, indem ihre Token an andere verteilt werden, die korrektere Werte liefern. Die Verpflichtung von Blockchain-Knoten, eine Kaution zu hinterlegen, bevor sie Daten bereitstellen, schafft Anreize für ehrliche Antworten, da davon ausgegangen wird, dass sie rationale wirtschaftliche Akteure sind, die auf die Maximierung der Rendite bedacht sind. -Staking/Abstimmungen schützen dezentrale Oracles auch vor [Sybil-Angriffen](/glossary/#sybil-attack), bei denen böswillige Akteure mehrere Identitäten erstellen, um das Konsenssystem zu manipulieren. Allerdings kann Staking „Trittbrettfahren“ (Nodes kopieren Informationen von anderen) und „faule Validierung“ (Nodes folgen der Mehrheit, ohne die Informationen selbst zu überprüfen) nicht verhindern. +Staking/Abstimmung schützt dezentralisierte Orakel auch vor [Sybil-Angriffen](/glossary/#sybil-attack), bei denen böswillige Akteure mehrere Identitäten erstellen, um das Konsenssystem auszutricksen. Staking kann jedoch „Trittbrettfahren“ (Orakel-Knoten kopieren Informationen von anderen) und „faule Validierung“ (Orakel-Knoten folgen der Mehrheit, ohne die Informationen selbst zu überprüfen) nicht verhindern. ##### Schelling-Punkt-Mechanismen -Ein [Schelling-Punkt](https://en.wikipedia.org/wiki/Focal_point_\(game_theory\)) ist ein spieltheoretisches Konzept, das davon ausgeht, dass mehrere Entitäten bei fehlender Kommunikation immer auf eine gemeinsame Lösung für ein Problem zurückgreifen. Schelling-Punkt-Mechanismen werden häufig in dezentralen Orakel-Netzwerken verwendet, um Nodes zu ermöglichen, einen Konsens über Antworten auf Datenanfragen zu erreichen. +Der [Schelling-Punkt]() ist ein spieltheoretisches Konzept, das davon ausgeht, dass mehrere Entitäten in Abwesenheit jeglicher Kommunikation immer auf eine gemeinsame Lösung für ein Problem zurückgreifen. Schelling-Punkt-Mechanismen werden häufig in dezentralisierten Orakel-Netzwerken verwendet, um es Blockchain-Knoten zu ermöglichen, einen Konsens über Antworten auf Datenanfragen zu erzielen. -Eine frühe Idee dafür war [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed), ein vorgeschlagener Datenfeed, bei dem die Teilnehmer Antworten auf „skalare“ Fragen (Fragen, deren Antworten durch eine Größenordnung beschrieben werden, z. B. „Wie hoch ist der Preis von ETH?“) zusammen mit einer Einlage einreichen. Benutzer, die Werte zwischen dem 25. und 75. [Perzentil](https://en.wikipedia.org/wiki/Percentile) angeben, werden belohnt, während diejenigen, deren Werte stark vom Medianwert abweichen, bestraft werden. +Eine frühe Idee dafür war [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed), ein vorgeschlagener Daten-Feed, bei dem Teilnehmer Antworten auf „skalare“ Fragen (Fragen, deren Antworten durch eine Größenordnung beschrieben werden, z. B. „Wie hoch ist der Preis von ETH?“) zusammen mit einer Einzahlung einreichen. Nutzer, die Werte zwischen dem 25. und 75. [Perzentil](https://en.wikipedia.org/wiki/Percentile) angeben, werden belohnt, während diejenigen, deren Werte stark vom Medianwert abweichen, bestraft werden. -Obwohl es SchellingCoin heute nicht mehr gibt, nutzen eine Reihe dezentraler Oracles – insbesondere die [Oracles des Maker-Protokolls](https://docs.makerdao.com/smart-contract-modules/oracle-module) – den Schelling-Punkt-Mechanismus, um die Genauigkeit der Oracle-Daten zu verbessern. Jeder Maker-Oracle besteht aus einem Off-Chain-P2P-Netzwerk von Nodes ("Relayer" und "Feeds"), die Marktpreise für Sicherungsassets einreichen, sowie einem On-Chain-"Medianizer"-Vertrag, der den Median aller bereitgestellten Werte berechnet. Sobald die festgelegte Verzögerungszeit vorüber ist, wird dieser Medianwert zum neuen Referenzpreis für das zugehörige Asset. +Obwohl SchellingCoin heute nicht mehr existiert, verwenden eine Reihe dezentralisierter Orakel – insbesondere die [Orakel des Maker-Protokolls](https://docs.makerdao.com/smart-contract-modules/oracle-module) – den Schelling-Punkt-Mechanismus, um die Genauigkeit von Orakel-Daten zu verbessern. Jedes Maker-Orakel besteht aus einem Off-Chain-P2P-Netzwerk von Blockchain-Knoten („Relayers“ und „Feeds“), die Marktpreise für Sicherheitenwerte übermitteln, und einem „Medianizer“-Vertrag auf der Blockchain, der den Median aller bereitgestellten Werte berechnet. Sobald die angegebene Verzögerungszeit abgelaufen ist, wird dieser Medianwert zum neuen Referenzpreis für den zugehörigen Vermögenswert. -Andere Beispiele für Oracles, die Schelling-Punkt-Mechanismen verwenden, sind [Chainlink Offchain Reporting](https://docs.chain.link/architecture-overview/off-chain-reporting) und [Witnet](https://witnet.io/). In beiden Systemen werden Antworten von Orakel-Nodes im Peer-to-Peer-Netzwerk zu einem einzigen aggregierten Wert wie einem Mittelwert oder Median zusammengefasst. Nodes werden entsprechend dem Grad belohnt oder bestraft, in dem ihre Antworten mit dem aggregierten Wert übereinstimmen oder von ihm abweichen. +Weitere Beispiele für Orakel, die Schelling-Punkt-Mechanismen verwenden, sind [Chainlink Offchain Reporting](https://docs.chain.link/architecture-overview/off-chain-reporting) und [Witnet](https://witnet.io/). In beiden Systemen werden Antworten von Orakel-Knoten im Peer-to-Peer-Netzwerk zu einem einzigen aggregierten Wert, wie z. B. einem Mittelwert oder Median, aggregiert. Blockchain-Knoten werden danach belohnt oder bestraft, inwieweit ihre Antworten mit dem aggregierten Wert übereinstimmen oder davon abweichen. -Schelling-Punkt-Mechanismen sind attraktiv, da sie den On-Chain-Fußabdruck minimieren (es muss nur eine Transaktion gesendet werden), während gleichzeitig Dezentralisierung garantiert wird. Letzteres ist möglich, weil die Nodes die Liste der eingereichten Antworten signieren müssen, bevor sie in den Algorithmus eingespeist wird, der den Mittelwert/Medianwert berechnet. +Schelling-Punkt-Mechanismen sind attraktiv, weil sie den Fußabdruck auf der Blockchain minimieren (es muss nur eine Transaktion gesendet werden) und gleichzeitig Dezentralisierung garantieren. Letzteres ist möglich, weil Blockchain-Knoten die Liste der eingereichten Antworten abzeichnen müssen, bevor sie in den Algorithmus eingespeist wird, der den Mittelwert/Medianwert erzeugt. ### Verfügbarkeit {#availability} -Dezentrale Oracle-Dienste gewährleisten eine hohe Verfügbarkeit von Off-Chain-Daten für Smart Contracts. Dies wird erreicht, indem sowohl die Quelle der Off-Chain-Informationen als auch die Nodes, die für die Übertragung der Informationen On-Chain verantwortlich sind, dezentralisiert werden. +Dezentralisierte Orakel-Dienste gewährleisten eine hohe Verfügbarkeit von Off-Chain-Daten für Smart Contracts. Dies wird erreicht, indem sowohl die Quelle der Off-Chain-Informationen als auch die Blockchain-Knoten, die für die Übertragung der Informationen auf die Blockchain verantwortlich sind, dezentralisiert werden. -Dies gewährleistet Fehlertoleranz, da der Orakelvertrag sich auf mehrere Nodes (die sich auch auf mehrere Datenquellen stützen) verlassen kann, um Abfragen von anderen Verträgen auszuführen. Die Dezentralisierung auf der Ebene der Quelle _und_ des Node-Betreibers ist entscheidend – ein Netzwerk von Oracle-Nodes, das Informationen aus derselben Quelle bereitstellt, wird auf dasselbe Problem stoßen wie ein zentralisiertes Oracle. +Dies gewährleistet Fehlertoleranz, da sich der Orakel-Vertrag auf mehrere Blockchain-Knoten (die sich ebenfalls auf mehrere Datenquellen verlassen) verlassen kann, um Abfragen von anderen Verträgen auszuführen. Dezentralisierung auf der Ebene der Quelle _und_ der Knotenbetreiber ist entscheidend – ein Netzwerk von Orakel-Knoten, das Informationen bereitstellt, die aus derselben Quelle abgerufen wurden, wird auf dasselbe Problem stoßen wie ein zentralisiertes Orakel. -Es ist auch möglich, dass stake-basierte Oracles die Node-Betreiber bestrafen, die nicht schnell auf Datenanfragen reagieren. Dies incentiviert Orakel-Nodes erheblich, in fehlertolerante Infrastruktur zu investieren und Daten rechtzeitig bereitzustellen. +Es ist auch möglich, dass Stake-basierte Orakel Knotenbetreiber durch Slashing bestrafen, die nicht schnell auf Datenanfragen reagieren. Dies bietet Orakel-Knoten einen erheblichen Anreiz, in fehlertolerante Infrastruktur zu investieren und Daten zeitnah bereitzustellen. ### Gute Anreizkompatibilität {#good-incentive-compatibility} -Dezentralisierte Oracles implementieren verschiedene Anreizdesigns, um [byzantinisches](https://en.wikipedia.org/wiki/Byzantine_fault) Verhalten unter Oracle-Nodes zu verhindern. Insbesondere erreichen sie _Zurechenbarkeit_ und _Rechenschaftspflicht_: +Dezentralisierte Orakel implementieren verschiedene Anreizdesigns, um [byzantinisches](https://en.wikipedia.org/wiki/Byzantine_fault) Verhalten unter Orakel-Knoten zu verhindern. Insbesondere erreichen sie _Zurechenbarkeit_ und _Verantwortlichkeit_: -1. Dezentralisierte Orakel-Nodes müssen häufig die Daten signieren, die sie als Antwort auf Datenanfragen bereitstellen. Diese Informationen helfen bei der Bewertung der historischen Leistung von Orakel-Nodes, sodass Nutzer unzuverlässige Orakel-Nodes bei Datenanfragen herausfiltern können. Ein Beispiel ist das [Algorithmische Reputationssystem](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system) von Witnet. +1. Dezentralisierte Orakel-Knoten müssen häufig die Daten signieren, die sie als Antwort auf Datenanfragen bereitstellen. Diese Informationen helfen bei der Bewertung der historischen Leistung von Orakel-Knoten, sodass Nutzer unzuverlässige Orakel-Knoten bei Datenanfragen herausfiltern können. Ein Beispiel ist das [Algorithmic Reputation System](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system) von Witnet. -2. Dezentralisierte Orakel – wie zuvor erläutert – können verlangen, dass Nodes einen Einsatz auf ihre Überzeugung in die Wahrheit der von ihnen übermittelten Daten setzen. Wenn die Behauptung zutrifft, kann dieser Einsatz zusammen mit Belohnungen für ehrlichen Dienst zurückgegeben werden. But it can also be slashed in case the information is incorrect, which provides some measure of accountability. +2. Dezentralisierte Orakel können – wie bereits erläutert – von Blockchain-Knoten verlangen, einen Einsatz (Stake) auf ihr Vertrauen in die Wahrheit der von ihnen übermittelten Daten zu platzieren. Wenn sich die Behauptung als richtig erweist, kann dieser Einsatz zusammen mit Belohnungen für ehrlichen Service zurückgegeben werden. Er kann jedoch auch durch Slashing bestraft werden, falls die Informationen falsch sind, was ein gewisses Maß an Verantwortlichkeit bietet. -## Anwendungen von Oracles in Smart Contracts {#applications-of-oracles-in-smart-contracts} +## Anwendungen von Orakeln in Smart Contracts {#applications-of-oracles-in-smart-contracts} -Die folgenden sind häufige Anwendungsfälle für Orakel in Ethereum: +Im Folgenden sind häufige Anwendungsfälle für Orakel in Ethereum aufgeführt: ### Abrufen von Finanzdaten {#retrieving-financial-data} -[Dezentralisierte Finanzen](/defi/) (DeFi) ermöglichen Peer-to-Peer-Kreditvergabe, -aufnahme und den Handel mit Vermögenswerten. Dies erfordert oft das Einholen verschiedener Finanzinformationen, einschließlich Wechselkursdaten (zur Berechnung des Fiat-Werts von Kryptowährungen oder zum Vergleich von Token-Preisen) und Kapitalmarktdaten (zur Berechnung des Werts tokenisierter Vermögenswerte, wie Gold oder US-Dollar). +Anwendungen für [Dezentralisierte Finanzen](/defi/) (DeFi) ermöglichen das Peer-to-Peer-Verleihen, -Ausleihen und -Handeln von Vermögenswerten. Dies erfordert häufig das Abrufen verschiedener Finanzinformationen, einschließlich Wechselkursdaten (zur Berechnung des Fiat-Werts von Kryptowährungen oder zum Vergleich von Token-Preisen) und Kapitalmarktdaten (zur Berechnung des Werts von tokenisierten Vermögenswerten wie Gold oder dem US-Dollar). -Ein DeFi-Kreditprotokoll muss beispielsweise die aktuellen Marktpreise für als Sicherheit hinterlegte Vermögenswerte (z. B. ETH) abfragen. Dies ermöglicht es dem Vertrag, den Wert der Sicherheitsvermögenswerte zu bestimmen und festzulegen, wie viel er vom System leihen kann. +Ein DeFi-Kreditprotokoll muss beispielsweise aktuelle Marktpreise für Vermögenswerte (z. B. ETH) abfragen, die als Sicherheit hinterlegt sind. Dadurch kann der Vertrag den Wert der Sicherheitenwerte bestimmen und festlegen, wie viel er aus dem System leihen kann. -Beliebte „Preis-Oracles“ (wie sie oft genannt werden) in DeFi umfassen Chainlink Price Feeds, den [Open Price Feed](https://compound.finance/docs/prices) von Compound Protocol, die [zeitgewichteten Durchschnittspreise (TWAPs)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) von Uniswap und die [Maker Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module). +Beliebte „Preis-Orakel“ (wie sie oft genannt werden) in DeFi umfassen Chainlink Price Feeds, den [Open Price Feed](https://compound.finance/docs/prices) des Compound-Protokolls, die [Time-Weighted Average Prices (TWAPs)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) von Uniswap und [Maker-Orakel](https://docs.makerdao.com/smart-contract-modules/oracle-module). -Entwickler sollten die Vorbehalte verstehen, die mit diesen Preis-Orakeln einhergehen, bevor sie sie in ihr Projekt integrieren. Dieser [Artikel](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) bietet eine detaillierte Analyse dessen, was bei der Planung der Verwendung eines der genannten Preis-Oracles zu beachten ist. +Entwickler sollten die Vorbehalte verstehen, die mit diesen Preis-Orakeln einhergehen, bevor sie sie in ihr Projekt integrieren. Dieser [Artikel](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) bietet eine detaillierte Analyse dessen, was bei der Planung der Verwendung eines der genannten Preis-Orakel zu beachten ist. -Im Folgenden finden Sie ein Beispiel, wie Sie den aktuellen ETH-Preis in Ihrem Smart Contract unter Verwendung eines Chainlink-Preisfeeds abrufen können: +Unten ist ein Beispiel dafür, wie Sie den neuesten ETH-Preis in Ihrem Smart Contract mithilfe eines Chainlink-Preis-Feeds abrufen können: ```solidity pragma solidity ^0.6.7; @@ -329,18 +329,24 @@ contract PriceConsumerV3 { AggregatorV3Interface internal priceFeed; - /** - * Network: Kovan + /* * + * Netzwerk: Kovan * Aggregator: ETH/USD - * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331 - */ + * Adresse: 0x9326BFA02ADD2366b30bacB125260Af641031331 */ + + + + + constructor() public { priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); } - /** - * Returns the latest price - */ + /* * + * Gibt den neuesten Preis zurück */ + + + function getLatestPrice() public view returns (int) { ( uint80 roundID, @@ -354,80 +360,84 @@ contract PriceConsumerV3 { } ``` -### Generierung nachweisbarer Zufälligkeit {#generating-verifiable-randomness} +### Generierung verifizierbarer Zufälligkeit {#generating-verifiable-randomness} -Bestimmte Blockchain-Anwendungen, wie blockchain-basierte Spiele oder Lotteriesysteme, benötigen ein hohes Maß an Unvorhersehbarkeit und Zufälligkeit, um effektiv zu funktionieren. Jedoch eliminiert die deterministische Ausführung von Blockchains die Zufälligkeit. +Bestimmte Blockchain-Anwendungen, wie z. B. Blockchain-basierte Spiele oder Lotteriesysteme, erfordern ein hohes Maß an Unvorhersehbarkeit und Zufälligkeit, um effektiv zu funktionieren. Die deterministische Ausführung von Blockchains eliminiert jedoch die Zufälligkeit. -Der ursprüngliche Ansatz war die Verwendung pseudozufälliger kryptografischer Funktionen wie `blockhash`, aber diese konnten von [Minern manipuliert werden](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.) Lösung des Proof-of-Work-Algorithmus. Außerdem bedeutet [Ethereums Umstellung auf Proof-of-Stake](/roadmap/merge/), dass Entwickler sich für die Onchain-Zufälligkeit nicht mehr auf `blockhash` verlassen können. Der [RANDAO-Mechanismus](https://eth2book.info/altair/part2/building_blocks/randomness) der Beacon Chain bietet stattdessen eine alternative Quelle für Zufälligkeit. +Der ursprüngliche Ansatz bestand darin, pseudozufällige kryptografische Funktionen wie `blockhash` zu verwenden, aber diese konnten [von Minern manipuliert werden](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.), die den Proof-of-Work-Algorithmus lösten. Außerdem bedeutet Ethereums [Wechsel zu Proof-of-Stake](/roadmap/merge/), dass sich Entwickler für Zufälligkeit auf der Blockchain nicht mehr auf `blockhash` verlassen können. Der [RANDAO-Mechanismus](https://eth2book.info/altair/part2/building_blocks/randomness) der Beacon Chain bietet stattdessen eine alternative Quelle für Zufälligkeit. -Es ist möglich, den Zufallswert Off-Chain zu generieren und ihn dann On-Chain zu senden, aber dies stellt hohe Vertrauensanforderungen an die Nutzer. Sie müssen glauben, dass der Wert tatsächlich durch unvorhersehbare Mechanismen erzeugt wurde und während der Übertragung nicht verändert wurde. +Es ist möglich, den Zufallswert Off-Chain zu generieren und ihn auf die Blockchain zu senden, aber dies stellt hohe Vertrauensanforderungen an die Nutzer. Sie müssen glauben, dass der Wert wirklich über unvorhersehbare Mechanismen generiert und während der Übertragung nicht verändert wurde. -Oracles, die für Off-Chain-Berechnungen entwickelt wurden, lösen dieses Problem, indem sie zufällige Ergebnisse sicher Off-Chain generieren und diese zusammen mit kryptografischen Beweisen, die die Unvorhersehbarkeit des Prozesses bestätigen, On-Chain übertragen. Ein Beispiel ist [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Verifiable Random Function), ein nachweislich fairer und manipulationssicherer Zufallszahlengenerator (RNG), der für die Erstellung zuverlässiger Smart Contracts für Anwendungen nützlich ist, die auf unvorhersehbaren Ergebnissen beruhen. +Orakel, die für Off-Chain-Berechnungen entwickelt wurden, lösen dieses Problem, indem sie Off-Chain sicher zufällige Ergebnisse generieren, die sie zusammen mit kryptografischen Nachweisen, die die Unvorhersehbarkeit des Prozesses bestätigen, auf die Blockchain übertragen. Ein Beispiel ist [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Verifiable Random Function), ein nachweislich fairer und manipulationssicherer Zufallszahlengenerator (RNG), der nützlich ist, um zuverlässige Smart Contracts für Anwendungen zu erstellen, die auf unvorhersehbare Ergebnisse angewiesen sind. ### Ergebnisse für Ereignisse erhalten {#getting-outcomes-for-events} -Mit Orakeln ist es einfach, Smart Contracts zu erstellen, die auf reale Ereignisse reagieren. Oracle-Dienste machen dies möglich, indem sie Verträgen erlauben, sich über Off-Chain-Komponenten mit externen APIs zu verbinden und Informationen aus diesen Datenquellen zu nutzen. Zum Beispiel könnte die zuvor erwähnte Vorhersage-App ein Oracle anfordern, um Wahlergebnisse von einer vertrauenswürdigen Off-Chain-Quelle (z. B. der Associated Press) zurückzuliefern. +Mit Orakeln ist die Erstellung von Smart Contracts, die auf reale Ereignisse reagieren, einfach. Orakel-Dienste machen dies möglich, indem sie es Verträgen erlauben, sich über Off-Chain-Komponenten mit externen APIs zu verbinden und Informationen aus diesen Datenquellen zu nutzen. Beispielsweise kann die zuvor erwähnte Prognose-Dapp ein Orakel anfordern, um Wahlergebnisse aus einer vertrauenswürdigen Off-Chain-Quelle (z. B. der Associated Press) zurückzugeben. -Die Verwendung von Orakeln, um Daten basierend auf realen Ergebnissen abzurufen, ermöglicht andere neuartige Anwendungsfälle; beispielsweise benötigt ein dezentralisiertes Versicherungsprodukt genaue Informationen über Wetter, Katastrophen usw., um effektiv zu funktionieren. +Die Verwendung von Orakeln zum Abrufen von Daten basierend auf realen Ergebnissen ermöglicht weitere neuartige Anwendungsfälle; beispielsweise benötigt ein dezentralisiertes Versicherungsprodukt genaue Informationen über Wetter, Katastrophen usw., um effektiv zu funktionieren. ### Automatisierung von Smart Contracts {#automating-smart-contracts} -Smart Contracts werden nicht automatisch ausgeführt; vielmehr muss ein externes Eigentümerkonto (EOA) oder ein anderes Vertragskonto die richtigen Funktionen auslösen, um den Code des Vertrags auszuführen. In den meisten Fällen sind der Großteil der Funktionen des Vertrags öffentlich und können von externen Eigentümerkonten (EOAs) und anderen Verträgen aufgerufen werden. +Smart Contracts laufen nicht automatisch ab; vielmehr muss ein extern verwaltetes Konto (EOA) oder ein anderes Vertragskonto die richtigen Funktionen auslösen, um den Code des Vertrags auszuführen. In den meisten Fällen ist der Großteil der Funktionen des Vertrags öffentlich und kann von EOAs und anderen Verträgen aufgerufen werden. + +Es gibt jedoch auch _private Funktionen_ innerhalb eines Vertrags, die für andere unzugänglich sind, aber für die Gesamtfunktionalität einer Dapp von entscheidender Bedeutung sind. Beispiele hierfür sind eine `mintERC721Token()`-Funktion, die regelmäßig neue NFTs für Nutzer prägt, eine Funktion zur Gewährung von Auszahlungen in einem Prognosemarkt oder eine Funktion zum Entsperren von gestakten Token in einer dezentralisierten Börse (DEX). + +Entwickler müssen solche Funktionen in regelmäßigen Abständen auslösen, damit die Anwendung reibungslos läuft. Dies könnte jedoch dazu führen, dass Entwickler mehr Stunden mit alltäglichen Aufgaben verlieren, weshalb die Automatisierung der Ausführung von Smart Contracts attraktiv ist. -Es gibt aber auch _private Funktionen_ innerhalb eines Vertrags, die für andere unzugänglich sind, aber für die allgemeine Funktionalität einer Dapp entscheidend sind. Beispiele hierfür sind eine `mintERC721Token()`-Funktion, die regelmäßig neue NFTs für Benutzer prägt, eine Funktion zur Auszahlung von Gewinnen in einem Prognosemarkt oder eine Funktion zum Freischalten von gestaketen Token in einer DEX. +Einige dezentralisierte Orakel-Netzwerke bieten Automatisierungsdienste an, die es Off-Chain-Orakel-Knoten ermöglichen, Smart-Contract-Funktionen gemäß den vom Nutzer definierten Parametern auszulösen. Typischerweise erfordert dies die „Registrierung“ des Zielvertrags beim Orakel-Dienst, die Bereitstellung von Geldmitteln zur Bezahlung des Orakel-Betreibers und die Angabe der Bedingungen oder Zeiten zum Auslösen des Vertrags. -Entwickler müssen solche Funktionen in Intervallen auslösen, um die Anwendung reibungslos laufen zu lassen. Dies kann jedoch zu mehr verlorenen Stunden bei routinemäßigen Aufgaben für Entwickler führen, weshalb die Automatisierung der Ausführung von Smart Contracts attraktiv ist. +Das [Keeper Network](https://chain.link/keepers) von Chainlink bietet Optionen für Smart Contracts, um regelmäßige Wartungsaufgaben auf vertrauensminimierte und dezentralisierte Weise auszulagern. Lesen Sie die offizielle [Keeper-Dokumentation](https://docs.chain.link/docs/chainlink-keepers/introduction/) für Informationen darüber, wie Sie Ihren Vertrag Keeper-kompatibel machen und den Upkeep-Dienst nutzen können. -Einige dezentrale Oracle-Netzwerke bieten Automatisierungsdienste an, die es Off-Chain-Oracle-Nodes ermöglichen, Smart-Contract-Funktionen gemäß von den Nutzern definierten Parametern auszulösen. Üblicherweise erfordert dies die "Registrierung" des Zielvertrags beim Orakeldienst, die Bereitstellung von Mitteln zur Bezahlung des Orakelbetreibers und die Festlegung der Bedingungen oder Zeiten zum Auslösen des Vertrags. +## Wie man Blockchain-Orakel verwendet {#use-blockchain-oracles} -Das [Keeper Network](https://chain.link/keepers) von Chainlink bietet Optionen für Smart Contracts, um regelmäßige Wartungsaufgaben auf eine vertrauensminimierte und dezentralisierte Weise auszulagern. Lesen Sie die offizielle [Keeper-Dokumentation](https://docs.chain.link/docs/chainlink-keepers/introduction/) für Informationen darüber, wie Sie Ihren Vertrag Keeper-kompatibel machen und den Upkeep-Service nutzen können. +Es gibt mehrere Orakel-Anwendungen, die Sie in Ihre Ethereum-Dapp integrieren können: -## Wie man Blockchain-Oracles verwendet {#use-blockchain-oracles} +**[Chainlink](https://chain.link/)** – _Dezentralisierte Orakel-Netzwerke von Chainlink bieten manipulationssichere Eingaben, Ausgaben und Berechnungen zur Unterstützung fortschrittlicher Smart Contracts auf jeder Blockchain._ -Es gibt mehrere Oracle Anwendungen, die du in den Ethereum Dapp integrieren kannst: +**[RedStone Oracles](https://redstone.finance/)** – _RedStone ist ein dezentralisiertes modulares Orakel, das gasoptimierte Daten-Feeds bereitstellt. Es ist darauf spezialisiert, Preis-Feeds für aufstrebende Vermögenswerte wie Liquid Staking Tokens (LSTs), Liquid Restaking Tokens (LRTs) und Bitcoin-Staking-Derivate anzubieten._ -**[Chainlink](https://chain.link/)** – _Dezentrale Oracle-Netzwerke von Chainlink bieten manipulationssichere Eingaben, Ausgaben und Berechnungen zur Unterstützung fortschrittlicher Smart Contracts auf jeder Blockchain._ +**[Chronicle](https://chroniclelabs.org/)** – _Chronicle überwindet die aktuellen Einschränkungen der Datenübertragung auf der Blockchain durch die Entwicklung wirklich skalierbarer, kosteneffizienter, dezentralisierter und verifizierbarer Orakel._ -**[RedStone Oracles](https://redstone.finance/)** – _RedStone ist ein dezentrales, modulares Oracle, das gasoptimierte Datenfeeds bereitstellt. Er spezialisiert sich darauf, Preisfeeds für aufstrebende Assets anzubieten, wie zum Beispiel Liquid-Staking-Token (LSTs), Liquid-Restaking-Token (LRTs) und Bitcoin-Staking-Derivate._ +**[Witnet](https://witnet.io/)** – _Witnet ist ein erlaubnisfreies, dezentralisiertes und zensurresistentes Orakel, das Smart Contracts hilft, auf reale Ereignisse mit starken kryptoökonomischen Garantien zu reagieren._ -**[Chronicle](https://chroniclelabs.org/)** – _Chronicle überwindet die aktuellen Einschränkungen bei der Übertragung von Daten onchain durch die Entwicklung wirklich skalierbarer, kosteneffizienter, dezentraler und verifizierbarer Oracles._ +**[UMA Oracle](https://uma.xyz)** – _Das optimistische Orakel von UMA ermöglicht es Smart Contracts, schnell jede Art von Daten für verschiedene Anwendungen zu empfangen, einschließlich Versicherungen, Finanzderivaten und Prognosemärkten._ -**[Witnet](https://witnet.io/)** – _Witnet ist ein erlaubnisfreies, dezentrales und zensurresistentes Oracle, das Smart Contracts dabei hilft, auf Ereignisse in der realen Welt mit starken krypto-ökonomischen Garantien zu reagieren._ +**[Tellor](https://tellor.io/)** – _Tellor ist ein transparentes und erlaubnisfreies Orakel-Protokoll für Ihren Smart Contract, um problemlos alle Daten zu erhalten, wann immer er sie benötigt._ -**[UMA Oracle](https://uma.xyz)** – _Das optimistische Oracle von UMA ermöglicht es Smart Contracts, schnell jede Art von Daten für verschiedene Anwendungen zu empfangen, einschließlich Versicherungen, Finanzderivaten und Prognosemärkten._ +**[Band Protocol](https://bandprotocol.com/)** – _Band Protocol ist eine kettenübergreifende Daten-Orakel-Plattform, die reale Daten und APIs aggregiert und mit Smart Contracts verbindet._ -**[Tellor](https://tellor.io/)** – _Tellor ist ein transparentes und erlaubnisfreies Oracle-Protokoll, mit dem Ihr Smart Contract problemlos alle Daten abrufen kann, wann immer er sie benötigt._ +**[Pyth Network](https://pyth.network/)** – _Das Pyth-Netzwerk ist ein First-Party-Finanz-Orakel-Netzwerk, das entwickelt wurde, um kontinuierliche reale Daten auf der Blockchain in einer manipulationssicheren, dezentralisierten und selbsterhaltenden Umgebung zu veröffentlichen._ -**[Band Protocol](https://bandprotocol.com/)** – _Band Protocol ist eine kettenübergreifende Daten-Oracle-Plattform, die reale Daten und APIs aggregiert und mit Smart Contracts verbindet._ +**[API3 DAO](https://www.api3.org/)** – _API3 DAO liefert First-Party-Orakel-Lösungen, die eine größere Quellentransparenz, Sicherheit und Skalierbarkeit in einer dezentralisierten Lösung für Smart Contracts bieten._ -**[Pyth Network](https://pyth.network/)** – _Das Pyth-Netzwerk ist ein First-Party-Finanz-Oracle-Netzwerk, das darauf ausgelegt ist, kontinuierlich Daten aus der realen Welt onchain in einer manipulationssicheren, dezentralen und autarken Umgebung zu veröffentlichen._ +**[Supra](https://supra.com/)** – Ein vertikal integriertes Toolkit kettenübergreifender Lösungen, das alle Blockchains, ob öffentlich (L1s und L2s) oder privat (Unternehmen), miteinander verbindet und dezentralisierte Orakel-Preis-Feeds bereitstellt, die für Anwendungsfälle auf der Blockchain und Off-Chain verwendet werden können. -**[API3 DAO](https://www.api3.org/)** – _API3 DAO liefert First-Party-Oracle-Lösungen, die eine größere Quellentransparenz, Sicherheit und Skalierbarkeit in einer dezentralen Lösung für Smart Contracts bieten_ +**[Gas Network](https://gas.network/)** – Eine verteilte Orakel-Plattform, die Echtzeit-Gaspreisdaten über Blockchains hinweg bereitstellt. Indem Daten von führenden Gaspreisdatenanbietern auf die Blockchain gebracht werden, trägt Gas Network dazu bei, die Interoperabilität voranzutreiben. Gas Network unterstützt Daten für über 35 Chains, einschließlich des Ethereum-Mainnets und vieler führender L2s. -**[Supra](https://supra.com/)** – Ein vertikal integriertes Toolkit mit kettenübergreifenden Lösungen, das alle Blockchains, ob öffentlich (L1s und L2s) oder privat (Unternehmen), miteinander verbindet und dezentrale Oracle-Preis-Feeds bereitstellt, die für Onchain- und Offchain-Anwendungsfälle genutzt werden können. +**[DIA](https://www.diadata.org/)** – Ein kettenübergreifendes Orakel-Netzwerk, das verifizierbare Daten-Feeds für über 20.000 Vermögenswerte in allen wichtigen Anlageklassen liefert. DIA bezieht rohe Handelsdaten direkt von über 100 Primärmärkten und berechnet sie auf der Blockchain, wodurch vollständige Datentransparenz und Verifizierbarkeit mit benutzerdefinierten Konfigurationen für jeden Anwendungsfall gewährleistet werden. -**[Gas Network](https://gas.network/)** – Eine dezentrale Oracle-Plattform, die Echtzeit-Gaspreisdaten über die Blockchain hinweg bereitstellt. Indem es Daten von führenden Gaspreis-Datenanbietern onchain bereitstellt, trägt das Gas Network zur Förderung der Interoperabilität bei. Das Gas Network unterstützt Daten für über 35 Chains, einschließlich des Ethereum Mainnets und vieler führender L2s. +**[Stork](https://stork.network)** – Stork liefert Preisdaten mit extrem niedriger Latenz und unterstützt eine breite Palette von Anwendungsfällen, einschließlich Perpetuals-Märkten, Kreditprotokollen und DeFi-Ökosystemen, wobei neue Vermögenswerte bei der Notierung schnell unterstützt werden. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} **Artikel** -- [Was ist ein Blockchain-Oracle?](https://chain.link/education/blockchain-oracles) – _Chainlink_ -- [Was ist ein Blockchain-Oracle?](https://medium.com/better-programming/what-is-a-blockchain-oracle-f5ccab8dbd72) – _Patrick Collins_ -- [Dezentrale Oracles: ein umfassender Überblick](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) – _Julien Thevenard_ -- [Implementierung eines Blockchain-Oracles auf Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_ -- [Warum können Smart Contracts keine API-Aufrufe tätigen?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) – _StackExchange_ -- [Sie möchten also ein Preis-Oracle verwenden](https://samczsun.com/so-you-want-to-use-a-price-oracle/) – _samczsun_ +- [What Is a Blockchain Oracle?](https://chain.link/education/blockchain-oracles) – _Chainlink_ +- [What is a Blockchain Oracle?](https://medium.com/better-programming/what-is-a-blockchain-oracle-f5ccab8dbd72) – _Patrick Collins_ +- [Decentralised Oracles: a comprehensive overview](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) – _Julien Thevenard_ +- [Implementing a Blockchain Oracle on Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_ +- [Why can't smart contracts make API calls?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) – _StackExchange_ +- [So you want to use a price oracle](https://samczsun.com/so-you-want-to-use-a-price-oracle/) – _samczsun_ **Videos** -- [Oracles und die Erweiterung des Nutzens der Blockchain](https://youtu.be/BVUZpWa8vpw) – _Real Vision Finance_ +- [Oracles and the Expansion of Blockchain Utility](https://youtu.be/BVUZpWa8vpw) – _Real Vision Finance_ **Tutorials** -- [Wie man den aktuellen Preis von Ethereum in Solidity abruft](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) – _Chainlink_ -- [Oracle-Daten konsumieren](https://docs.chroniclelabs.org/Developers/tutorials/Remix) – _Chronicle_ +- [How to Fetch the Current Price of Ethereum in Solidity](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) – _Chainlink_ +- [Consuming Oracle Data](https://docs.chroniclelabs.org/Developers/tutorials/Remix) – _Chronicle_ **Beispielprojekte** -- [Vollständiges Chainlink-Starterprojekt für Ethereum in Solidity](https://github.com/hackbg/chainlink-fullstack) – _HackBG_ +- [Full Chainlink starter project for Ethereum in Solidity](https://github.com/hackbg/chainlink-fullstack) – _HackBG_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/dart/index.md b/public/content/translations/de/developers/docs/programming-languages/dart/index.md index 11afd519ad0..8fc68db19d0 100644 --- a/public/content/translations/de/developers/docs/programming-languages/dart/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/dart/index.md @@ -1,6 +1,6 @@ --- title: "Ethereum für Dart-Entwickler" -description: "Lernen, wie Sie die Sprache Dart für die Entwicklung auf Ethereum nutzen" +description: "Erfahren Sie, wie Sie mit der Programmiersprache Dart für Ethereum entwickeln" lang: de incomplete: true --- @@ -10,23 +10,22 @@ incomplete: true ## Tutorials {#tutorials} - [Flutter and Blockchain – Hello World Dapp](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) führt Sie durch alle Schritte für den Einstieg: - 1. Einen Smart Contract in [Solidity](https://soliditylang.org/) schreiben - 2. Benutzeroberfläche in Dart schreiben -- [Building a Mobile dapp with Flutter](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) ist viel kürzer und eignet sich möglicherweise besser, - wenn Sie die Grundlagen bereits kennen -- Wenn Sie lieber durch das Ansehen eines Videos lernen, können Sie sich [Build Your First Blockchain Flutter App](https://www.youtube.com/watch?v=3Eeh3pJ6PeA) ansehen, das etwa eine Stunde dauert. -- Wenn Sie ungeduldig sind, bevorzugen Sie vielleicht [Building a Blockchain Decentralized-app with Flutter and Dart on Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s), das nur etwa zwanzig Minuten dauert. -- [Integrating MetaMask in Flutter application with Web3Modal by WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) – dieses kurze Video führt Sie durch die Schritte zur Integration von MetaMask in Ihre Flutter-Anwendungen mit der [Web3Modal](https://pub.dev/packages/web3modal_flutter)-Bibliothek von WalletConnect. -- [Mobile Blockchain Developer Bootcamp Course With Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) – Playlist eines Kurses für Full-Stack-Entwickler mobiler Blockchain-Anwendungen + 1. Schreiben eines Smart Contracts in [Solidity](https://soliditylang.org/) + 2. Schreiben einer Benutzeroberfläche in Dart +- [Building a Mobile dapp with Flutter](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) ist viel kürzer, was besser sein könnte, wenn Sie die Grundlagen bereits kennen +- Wenn Sie lieber durch das Ansehen eines Videos lernen, können Sie sich [Build Your First Blockchain Flutter App](https://www.youtube.com/watch?v=3Eeh3pJ6PeA) ansehen, das etwa eine Stunde dauert +- Wenn Sie ungeduldig sind, bevorzugen Sie vielleicht [Building a Blockchain Decentralized-app with Flutter and Dart on Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s), das nur etwa zwanzig Minuten dauert +- [Integrating MetaMask in Flutter application with Web3Modal by WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) – dieses kurze Video führt Sie durch die Schritte zur Integration von MetaMask in Ihre Flutter-Anwendungen mit der [Web3Modal](https://pub.dev/packages/web3modal_flutter)-Bibliothek von WalletConnect +- [Mobile Blockchain Developer Bootcamp Course With Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) – Playlist für einen Full-Stack-Kurs für mobile Blockchain-Entwickler ## Arbeiten mit Ethereum-Clients {#working-with-ethereum-clients} -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die sich die Vorteile von Kryptowährung und der Blockchain-Technologie zu eigen machen. -Es gibt mindestens zwei derzeit gepflegte Bibliotheken für Dart, um die -[JSON-RPC API](/developers/docs/apis/json-rpc/) für Ethereum zu verwenden. +Sie können Ethereum verwenden, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. +Es gibt mindestens zwei aktuell gepflegte Bibliotheken für Dart, um die +[JSON-RPC-API](/developers/docs/apis/json-rpc/) für Ethereum zu nutzen. 1. [Web3dart von pwa.ir](https://pub.dev/packages/web3dart) -2. [Ethereum 5.0.0 von darticulate.com](https://pub.dev/packages/ethereum) +1. [Ethereum 5.0.0 von darticulate.com](https://pub.dev/packages/ethereum) -Außerdem gibt es zusätzliche Bibliotheken, mit denen Sie bestimmte Ethereum-Adressen bearbeiten könnten oder mit denen sich die Preise verschiedener Kryptowährungen abrufen lassen. -[Die vollständige Liste finden Sie hier](https://pub.dev/dart/packages?q=ethereum). +Es gibt auch zusätzliche Bibliotheken, mit denen Sie bestimmte Ethereum-Adressen manipulieren oder die Preise verschiedener Kryptowährungen abrufen können. +[Die vollständige Liste finden Sie hier](https://pub.dev/dart/packages?q=ethereum). \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/delphi/index.md b/public/content/translations/de/developers/docs/programming-languages/delphi/index.md index dbf47d1aa52..ab82e8ea9bf 100644 --- a/public/content/translations/de/developers/docs/programming-languages/delphi/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/delphi/index.md @@ -1,50 +1,50 @@ --- title: "Ethereum für Delphi-Entwickler" -description: "Lernen, mit der Programmiersprache Delphi für Ethereum zu entwickeln" +description: "Erfahren Sie, wie Sie mit der Programmiersprache Delphi für Ethereum entwickeln" lang: de incomplete: true --- -Lernen, mit der Programmiersprache Delphi für Ethereum zu entwickeln +Erfahren Sie, wie Sie mit der Programmiersprache Delphi für Ethereum entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder "Dapps") zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenswürdig sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte kontrollieren, um neue Arten von Finanzanwendungen zu erstellen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. -Erstellen Sie dezentrale Anwendungen auf Ethereum und interagieren Sie mit Smart Contracts in der Programmiersprache Delphi. +Bauen Sie dezentralisierte Anwendungen auf Ethereum auf und interagieren Sie mit Smart Contracts unter Verwendung der Programmiersprache Delphi! ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} -**Erste Schritte bei der Integration von Delphi mit Ethereum** +**Machen Sie Ihre ersten Schritte zur Integration von Delphi mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Lernen Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Referenzen und Links für Anfänger {#beginner-references-and-links} -**Einführung der Delphereum-Bibliothek** +**Einführung in die Delphereum-Bibliothek** - [Was ist Delphereum?](https://github.com/svanas/delphereum/blob/master/README.md) -- [Verbinden von Delphi mit einer lokalen (In-Memory) Blockchain](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) -- [Verbinden von Delphi mit dem Ethereum Mainnet](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) -- [Verbinden von Delphi mit Smart Contracts](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) +- [Verbindung von Delphi mit einer lokalen (In-Memory) Blockchain](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) +- [Verbindung von Delphi mit dem Ethereum-Mainnet](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) +- [Verbindung von Delphi mit Smart Contracts](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) -**Möchten Sie die Einrichtung erst einmal überspringen und direkt zu den Beispielen gehen?** +**Möchten Sie die Einrichtung vorerst überspringen und direkt zu den Beispielen springen?** -- [Ein 3-Minuten Smart Contract und Delphi – Teil 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) -- [Ein 3-Minuten Smart Contract und Delphi – Teil 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) +- [Ein 3-Minuten Smart Contract und Delphi - Teil 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) +- [Ein 3-Minuten Smart Contract und Delphi - Teil 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Erstellen einer von Ethereum signierten Nachrichtensignatur in Delphi](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) -- [Ether mit Delphi überweisen](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) -- [ERC-20-Tokens mit Delphi überweisen](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) +- [Generieren einer Ethereum-signierten Nachrichtensignatur in Delphi](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) +- [Ether mit Delphi übertragen](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) +- [ERC-20-Token mit Delphi übertragen](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} @@ -53,4 +53,4 @@ Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethe - [Delphi und der Ethereum Dark Forest](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93) - [Einen Token gegen einen anderen in Delphi tauschen](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) -Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers](/developers/) an. +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [ethereum.org/developers](/developers/). \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md index f83d520c001..246e39cbb1e 100644 --- a/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md @@ -1,58 +1,58 @@ --- title: "Ethereum für .NET-Entwickler" -description: "Lernen, wie Sie .NET-basierte Projekte und Tools für die Ethereum-Entwicklung nutzen können" +description: "Erfahren Sie, wie Sie mit .NET-basierten Projekten und Tools für Ethereum entwickeln" lang: de incomplete: true --- -Lernen Sie, wie Sie für Ethereum mithilfe von .NET-basierten Projekten und Tools entwickeln +Erfahren Sie, wie Sie mit .NET-basierten Projekten und Tools für Ethereum entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenswürdig sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte steuern, um neue Arten von Finanzanwendungen zu schaffen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. -Erstellen Sie dezentrale Anwendungen auf Ethereum und interagieren Sie mit Smart Contracts unter Verwendung von Tools und Sprachen aus dem Microsoft-Technologie-Stack – unterstützt C#, Visual Basic .NET, F#, über Tools wie VSCode und Visual Studio, mit dem .NET Framework/.NET Core/.NET Standard. Stellen Sie eine Ethereum-Blockchain mit Microsoft Azure Blockchain in wenigen Minuten bereit. Ethereum lässt sich eben so gut einsetzen wie .NET. +Erstellen Sie dezentralisierte Anwendungen auf Ethereum und interagieren Sie mit Smart Contracts unter Verwendung von Tools und Sprachen aus dem Microsoft-Technologie-Stack – mit Unterstützung für C#, # Visual Basic .NET, F#, auf Tools wie VSCode und Visual Studio, über .NET Framework/.NET Core/.NET Standard hinweg. Stellen Sie in wenigen Minuten eine Ethereum-Blockchain auf Azure mit Microsoft Azure Blockchain bereit. Bringen Sie die Liebe zu .NET zu Ethereum! ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} -**Erste Schritte bei der Integration von .Net mit Ethereum** +**Machen Sie Ihre ersten Schritte zur Integration von .NET mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Erfahren Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Referenzen und Links für Anfänger {#beginner-references-and-links} -**Einführung der Nethereum Bibliothek und VS Code Solidity** +**Einführung in die Nethereum-Bibliothek und VS Code Solidity** - [Nethereum, Erste Schritte](https://docs.nethereum.com/en/latest/getting-started/) - [Installation von VS Code Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) -- [Ein Workflow für .NET-Entwickler zum Erstellen und Aufrufen von Ethereum Smart Contracts](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) +- [Der Workflow eines .NET-Entwicklers zum Erstellen und Aufrufen von Ethereum Smart Contracts](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) - [Integration von Smart Contracts mit Nethereum](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm) -- [Anbindung von .NET- und Ethereum-Blockchain-Smart-Contracts mit Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), auch in [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) -- [Nethereum – Eine Open-Source-.NET-Integrationsbibliothek für die Blockchain](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) -- [Ethereum-Transaktionen mit Nethereum in eine SQL-Datenbank schreiben](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) +- [Verbindung von .NET und Ethereum-Blockchain Smart Contracts mit Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), auch auf [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) +- [Nethereum - Eine Open-Source-.NET-Integrationsbibliothek für die Blockchain](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) +- [Schreiben von Ethereum-Transaktionen in eine SQL-Datenbank mit Nethereum](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) - [Sehen Sie, wie Sie Ethereum Smart Contracts einfach mit C# und VisualStudio bereitstellen können](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) -**Möchten Sie die Einrichtung erst einmal überspringen und direkt zu den Beispielen gehen?** +**Möchten Sie die Einrichtung vorerst überspringen und direkt zu den Beispielen springen?** -- [Playground](http://playground.nethereum.com/) – Interagieren Sie mit Ethereum und lernen Sie, wie man Nethereum im Browser verwendet. +- [Playground](http://playground.nethereum.com/) - Interagieren Sie mit Ethereum und lernen Sie, wie Sie Nethereum über den Browser verwenden. - Kontostand abfragen [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001) - - ERC20-Smart-Contract-Guthaben abfragen [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) + - ERC20 Smart Contract-Guthaben abfragen [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) - Ether auf ein Konto überweisen [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) - - ... und mehr + - ... Und mehr! ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Nethereum-Arbeitsmappe/Beispielliste](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) +- [Nethereum Arbeitsbuch/Beispielliste](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) - [Stellen Sie Ihre eigenen Entwicklungs-Testchains bereit](https://github.com/Nethereum/Testchains) -- [VSCode-Codegen-Plugin für Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) -- [Unity und Ethereum: Warum und Wie](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) -- [Erstellen einer ASP.NET Core Web API für Ethereum-Dapps](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) -- [Verwendung von Nethereum Web3 zur Implementierung eines Lieferketten-Verfolgungssystems](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) -- [Nethereum-Blockverarbeitung](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), mit [C#-Playground-Beispiel](http://playground.nethereum.com/csharp/id/1025) -- [Nethereum-Websocket-Streaming](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) +- [VSCode Codegen-Plugin für Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) +- [Unity und Ethereum: Warum und wie](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) +- [Erstellen einer ASP.NET Core Web-API für Ethereum-Dapps](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) +- [Verwendung von Nethereum Web3 zur Implementierung eines Supply-Chain-Tracking-Systems](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) +- [Nethereum Block-Verarbeitung](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), mit [C# Playground-Beispiel](http://playground.nethereum.com/csharp/id/1025) +- [Nethereum Websocket-Streaming](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) - [Kaleido und Nethereum](https://kaleido.io/kaleido-and-nethereum/) - [Quorum und Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md) @@ -60,27 +60,27 @@ Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethe - [Azure Key Vault und Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum) - [Nethereum.DappHybrid](https://github.com/Nethereum/Nethereum.DappHybrid) -- [Ujo-Nethereum-Backend-Referenzarchitektur](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) +- [Ujo Nethereum Backend-Referenzarchitektur](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) -## .NET-Projekte, Tools und andere tolle Dinge {#dot-net-projects-tools-and-other-fun-stuff} +## .NET-Projekte, Tools und andere interessante Dinge {#dot-net-projects-tools-and-other-fun-stuff} -- [Nethereum Playground](http://playground.nethereum.com/) – _Kompilieren, Erstellen und Ausführen von Nethereum-Code-Snippets im Browser_ -- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) – _Nethereum-Codegen mit Benutzeroberfläche in Blazor_ -- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) – _Ein schlanker .NET Wasm SPA Blockchain-Explorer und eine einfache Wallet_ -- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) – _Eine Business-Rules-Engine (sowohl für die .NET- als auch für die Ethereum-Plattform), die von Natur aus metadatengesteuert ist_ -- [Nethermind](https://github.com/NethermindEth/nethermind) – _Ein .NET-Core-Ethereum-Client für Linux, Windows und macOS_ -- [eth-utils](https://github.com/ethereum/eth-utils/) – _Hilfsfunktionen für die Arbeit mit Ethereum-bezogenen Codebasen_ -- [TestChains](https://github.com/Nethereum/TestChains) – _Vorkonfigurierte .NET-Devchains für schnelle Antwortzeiten (PoA)_ +- [Nethereum Playground](http://playground.nethereum.com/) - _Kompilieren, erstellen und ausführen von Nethereum-Code-Snippets im Browser_ +- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) - _Nethereum Codegen mit Benutzeroberfläche in Blazor_ +- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) - _Eine .NET Wasm SPA Light-Blocksuchmaschine und ein einfaches Wallet_ +- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) - _Eine Business-Rules-Engine (sowohl für die .NET-Plattform als auch für die Ethereum-Plattform), die von Natur aus metadatengesteuert ist_ +- [Nethermind](https://github.com/NethermindEth/nethermind) - _Eine .NET Core Ethereum-Anwendung für Linux, Windows, MacOS_ +- [eth-utils](https://github.com/ethereum/eth-utils/) - _Hilfsfunktionen für die Arbeit mit Ethereum-bezogenen Codebasen_ +- [TestChains](https://github.com/Nethereum/TestChains) - _Vorkonfigurierte .NET-Devchains für schnelle Reaktionen (PoA)_ -Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers](/developers/) an. +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [ethereum.org/developers](/developers/). ## Mitwirkende der .NET-Community {#dot-net-community-contributors} -Bei Nethereum sind wir meistens auf [Gitter](https://gitter.im/Nethereum/Nethereum) zu finden, wo jeder willkommen ist, Fragen zu stellen und zu beantworten, Hilfe zu erhalten oder einfach nur dabei zu sein. Erstellen Sie gerne einen PR oder eröffnen Sie ein Issue im [Nethereum-GitHub-Repository](https://github.com/Nethereum), oder stöbern Sie einfach durch die vielen Neben- und Beispielprojekte, die wir haben. Sie finden uns auch auf [Discord](https://discord.gg/jQPrR58FxX)! +Bei Nethereum halten wir uns meistens auf [Gitter](https://gitter.im/Nethereum/Nethereum) auf, wo jeder willkommen ist, Fragen zu stellen/beantworten, Hilfe zu erhalten oder einfach nur zu entspannen. Fühlen Sie sich frei, einen PR zu erstellen oder ein Issue im [Nethereum GitHub-Repository](https://github.com/Nethereum) zu eröffnen, oder stöbern Sie einfach durch die vielen Neben-/Beispielprojekte, die wir haben. Sie finden uns auch auf [Discord](https://discord.gg/jQPrR58FxX)! -Wenn Sie neu bei Nethermind sind und Hilfe bei den ersten Schritten benötigen, treten Sie unserem [Discord](http://discord.gg/PaCMRFdvWT) bei. Unsere Entwickler stehen Ihnen gerne bei Fragen zur Verfügung. Zögern Sie nicht, einen PR zu eröffnen oder im [Nethermind-GitHub-Repository](https://github.com/NethermindEth/nethermind) Issues zu melden. +Wenn Sie neu bei Nethermind sind und Hilfe beim Einstieg benötigen, treten Sie unserem [Discord](http://discord.gg/PaCMRFdvWT) bei. Unsere Entwickler stehen bereit, um Ihre Fragen zu beantworten. Zögern Sie nicht, einen PR zu eröffnen oder Probleme im [Nethermind GitHub-Repository](https://github.com/NethermindEth/nethermind) zu melden. -## Andere zusammengefasste Listen {#other-aggregated-lists} +## Weitere aggregierte Listen {#other-aggregated-lists} [Offizielle Nethereum-Website](https://nethereum.com/) -[Offizielle Nethermind-Website](https://nethermind.io/) +[Offizielle Nethermind-Website](https://nethermind.io/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/elixir/index.md b/public/content/translations/de/developers/docs/programming-languages/elixir/index.md index 9c7ebffae5f..ff526e4be15 100644 --- a/public/content/translations/de/developers/docs/programming-languages/elixir/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/elixir/index.md @@ -1,55 +1,55 @@ --- title: "Ethereum für Elixir-Entwickler" -description: "Lernen Sie, wie Sie für Ethereum entwickeln, mit Elixir-basierten Projekten und Werkzeugen." +description: "Erfahren Sie, wie Sie mit Elixir-basierten Projekten und Tools für Ethereum entwickeln." lang: de incomplete: false --- -Lernen Sie, wie Sie für Ethereum entwickeln, mit Elixir-basierten Projekten und Werkzeugen. +Erfahren Sie, wie Sie mit Elixir-basierten Projekten und Tools für Ethereum entwickeln. -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Verwenden Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenslos sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte steuern, um neue Arten von Finanzanwendungen zu schaffen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} -**Starten Sie Ihre ersten Schritte, um Elixir in Ethereum-Projekte zu integrieren.** +**Machen Sie Ihre ersten Schritte zur Integration von Elixir mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Erfahren Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Artikel für Anfänger {#beginner-articles} -- [Ethereum-Accounts endlich verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) -- [Ethers — Eine erstklassige Ethereum-Web3-Bibliothek für Elixir](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122) +- [Ethereum-Konten endlich verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Ethers – Eine erstklassige Ethereum-Web3-Bibliothek für Elixir](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122) ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Wie Sie rohe Ethereum-Contract-Transaktionen mit Elixir signieren](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b) +- [Wie man rohe Ethereum-Vertragstransaktionen mit Elixir signiert](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b) - [Ethereum Smart Contracts und Elixir](https://medium.com/agile-alpha/ethereum-smart-contracts-and-elixir-c7c4b239ddb4) -## Elixir Projekte und Werkzeuge {#elixir-projects-and-tools} +## Elixir-Projekte und -Tools {#elixir-projects-and-tools} ### Aktiv {#active} -- [block_keys](https://github.com/ExWeb3/block_keys) - _BIP32 & BIP44 Implementation in Elixir (Multi-Account Hierarchy for Deterministic Wallets)_ -- ethereumex](https://github.com/mana-ethereum/ethereumex) - _Elixir JSON-RPC client for the Ethereum blockchain_ -- ethers](https://github.com/ExWeb3/elixir_ethers) - _A comprehensive Web3 library for interacting with smart contracts on Ethereum using Elixir_ -- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms) - _A KMS signer library for Ethers (sign transactions with AWS KMS)_ -- [ex_abi](https://github.com/poanetwork/ex_abi) - _Ethereum ABI parser/decoder/encoder implementation in Elixir_ -- [ex_keccak](https://github.com/ExWeb3/ex_keccak) - _Elixir library for computing Keccak SHA3-256 hashes using a NIF built tiny-keccak Rust crate_ -- ex_rlp](https://github.com/mana-ethereum/ex_rlp) - _Elixir implementation of Ethereum's RLP (Recursive Length Prefix) encoding_ +- [block_keys](https://github.com/ExWeb3/block_keys) – _BIP32- & BIP44-Implementierung in Elixir (Multi-Account-Hierarchie für deterministische Wallets)_ +- [ethereumex](https://github.com/mana-ethereum/ethereumex) – _Elixir-JSON-RPC-Client für die Ethereum-Blockchain_ +- [ethers](https://github.com/ExWeb3/elixir_ethers) – _Eine umfassende Web3-Bibliothek zur Interaktion mit Smart Contracts auf Ethereum unter Verwendung von Elixir_ +- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms) – _Eine KMS-Signer-Bibliothek für Ethers (Transaktionen mit AWS KMS signieren)_ +- [ex_abi](https://github.com/poanetwork/ex_abi) – _Ethereum-ABI-Parser/-Decoder/-Encoder-Implementierung in Elixir_ +- [ex_keccak](https://github.com/ExWeb3/ex_keccak) – _Elixir-Bibliothek zur Berechnung von Keccak-SHA3-256-Hashes unter Verwendung eines NIF-erstellten tiny-keccak-Rust-Crates_ +- [ex_rlp](https://github.com/mana-ethereum/ex_rlp) – _Elixir-Implementierung der RLP-Codierung (Recursive Length Prefix) von Ethereum_ ### Archiviert / Wird nicht mehr gepflegt {#archived--no-longer-maintained} -- [eth](https://hex.pm/packages/eth) - _Ethereum utilities for Elixir_ -- [exw3](https://github.com/hswick/exw3) - _High level Ethereum RPC Client for Elixir_ -- [mana](https://github.com/mana-ethereum/mana) - _Ethereum full node implementation written in Elixir_ +- [eth](https://hex.pm/packages/eth) – _Ethereum-Dienstprogramme für Elixir_ +- [exw3](https://github.com/hswick/exw3) – _High-Level-Ethereum-RPC-Client für Elixir_ +- [mana](https://github.com/mana-ethereum/mana) – _In Elixir geschriebene Implementierung eines vollständigen Ethereum-Blockchain-Knotens_ -Sind Sie an weiteren Informationen interessiert? Besuchen Sie [unser Entwickler-Portal](/developers/). +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [unsere Entwickler-Startseite](/developers/). -## Elixir Community Mitwirkende {#elixir-community-contributors} +## Mitwirkende aus der Elixir-Community {#elixir-community-contributors} -Der [Elixir's Slack #ethereum channel](https://elixir-lang.slack.com/archives/C5RPZ3RJL) bietet einer schnell wachsenden Community ein Zuhause und ist die Anlaufstelle für alle Diskussionen rund um die genannten Projekte und verwandte Themen. +Der [#ethereum-Kanal im Elixir-Slack](https://elixir-lang.slack.com/archives/C5RPZ3RJL) beherbergt eine schnell wachsende Community und ist die dedizierte Ressource für Diskussionen über alle oben genannten Projekte und verwandte Themen. \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/golang/index.md b/public/content/translations/de/developers/docs/programming-languages/golang/index.md index 5e4ba778b4d..d94cf486561 100644 --- a/public/content/translations/de/developers/docs/programming-languages/golang/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/golang/index.md @@ -1,84 +1,84 @@ --- title: "Ethereum für Go-Entwickler" -description: "Lernen, wie Sie mit Go-basierten Projekten und Werkzeugen für Ethereum entwickeln können" +description: "Erfahren Sie, wie Sie mit Go-basierten Projekten und Tools für Ethereum entwickeln" lang: de incomplete: true --- -Lernen Sie, wie Sie mit Go-basierten Projekten und Tools für Ethereum entwickeln +Erfahren Sie, wie Sie mit Go-basierten Projekten und Tools für Ethereum entwickeln -Verwenden Sie Ethereum, um dezentrale Anwendungen (oder "dApps") zu erstellen. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Sie sind dezentralisiert. Das bedeutet, dass sie auf einem Peer-to-Peer-Netzwerk laufen und es keine einzelne Fehlerquelle gibt. Keine einzelne Eintität oder Person kontrolliert sie und es ist fast unmöglich, sie zu zensieren. Sie können digitale Vermögenswerte kontrollieren, um neue Arten von Anwendungen zu erstellen. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen. Diese Dapps können vertrauenswürdig sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie sind dezentralisiert, was bedeutet, dass sie in einem Peer-to-Peer-Netzwerk laufen und es keinen Single Point of Failure gibt. Keine einzelne Entität oder Person kontrolliert sie und sie sind fast unmöglich zu zensieren. Sie können digitale Vermögenswerte steuern, um neue Arten von Anwendungen zu schaffen. ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} -**Starten Sie mit der Integration von Go mit Ethereum durch** +**Machen Sie Ihre ersten Schritte zur Integration von Go mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -- [Vertrags-Tutorial](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) +- [Lernen Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Contract-Tutorial](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) ## Artikel und Bücher für Anfänger {#beginner-articles-and-books} - [Erste Schritte mit Geth](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458) -- [Mit Golang mit Ethereum verbinden](https://www.youtube.com/watch?v=-7uChuO_VzM) -- [Ethereum Smart Contracts mit Golang bereitstellen](https://www.youtube.com/watch?v=pytGqQmDslE) +- [Verwendung von Golang zur Verbindung mit Ethereum](https://www.youtube.com/watch?v=-7uChuO_VzM) +- [Bereitstellung von Ethereum Smart Contracts mit Golang](https://www.youtube.com/watch?v=pytGqQmDslE) - [Eine Schritt-für-Schritt-Anleitung zum Testen und Bereitstellen von Ethereum Smart Contracts in Go](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) -- [eBook: Ethereum-Entwicklung mit Go](https://goethereumbook.org/) – _Ethereum-Anwendungen mit Go entwickeln_ +- [eBook: Ethereum-Entwicklung mit Go](https://goethereumbook.org/) - _Entwickeln Sie Ethereum-Anwendungen mit Go_ ## Artikel und Dokumentationen für Fortgeschrittene {#intermediate-articles-and-docs} -- [Go-Ethereum-Dokumentation](https://geth.ethereum.org/docs/) – _Die Dokumentation für das offizielle Ethereum Golang_ -- [Erigon Programmierleitfaden](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) – _Illustrierter Leitfaden mit Zustandsbaum, Multi-Proofs und Transaktionsverarbeitung_ -- [Erigon und zustandsloses Ethereum](https://youtu.be/3-Mn7OckSus?t=394) – _Ethereum Community Conference 2020 (EthCC 3)_ -- [Erigon: Optimierung von Ethereum-Clients](https://www.youtube.com/watch?v=CSpc1vZQW2Q) – _Devcon 4, 2018_ +- [Go Ethereum-Dokumentation](https://geth.ethereum.org/docs) - _Die Dokumentation für das offizielle Ethereum Golang_ +- [Erigon-Programmierhandbuch](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _Illustrierter Leitfaden einschließlich Zustandsbaum, Multi-Proofs und Transaktionsverarbeitung_ +- [Erigon und zustandsloses Ethereum](https://youtu.be/3-Mn7OckSus?t=394) - _2020 Ethereum Community Conference (EthCC 3)_ +- [Erigon: Optimierung von Ethereum-Anwendungen](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _2018 Devcon 4_ - [Go Ethereum GoDoc](https://godoc.org/github.com/ethereum/go-ethereum) - [Erstellen einer Dapp in Go mit Geth](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) - [Arbeiten mit einem privaten Ethereum-Netzwerk mit Golang und Geth](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) -- [Unit-Tests für Solidity-Verträge auf Ethereum mit Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) -- [Kurzanleitung zur Verwendung von Geth als Bibliothek](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) +- [Unit-Testing von Solidity-Verträgen auf Ethereum mit Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) +- [Kurzreferenz zur Verwendung von Geth als Bibliothek](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} - [Das simulierte GETH-Backend](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) - [Blockchain-as-a-Service-Apps mit Ethereum und Quorum](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) -- [Verteilter Speicher IPFS und Swarm in Ethereum-Blockchain-Anwendungen](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) -- [Mobile Clients: Bibliotheken und Inproc-Ethereum-Knoten](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) +- [Verteilte Speicherung mit IPFS und Swarm in Ethereum-Blockchain-Anwendungen](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) +- [Mobile Anwendungen: Bibliotheken und Inproc-Ethereum-Blockchain-Knoten](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) - [Native Dapps: Go-Bindings für Ethereum-Verträge](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) ## Go-Projekte und -Tools {#go-projects-and-tools} -- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) – _Offizielle Go-Implementierung des Ethereum-Protokolls_ -- [Go Ethereum Code-Analyse](https://github.com/ZtesoftCS/go-ethereum-code-analysis) – _Überprüfung und Analyse des Go Ethereum-Quellcodes_ -- [Erigon](https://github.com/ledgerwatch/erigon) – _Eine schnellere Variante von Go Ethereum mit Schwerpunkt auf Archivierungsknoten_ -- [Golem](https://github.com/golemfactory/golem) – _Golem schafft einen globalen Markt für Rechenleistung_ -- [Quorum](https://github.com/jpmorganchase/quorum) – _Eine zugangsbeschränkte Implementierung von Ethereum, die den Datenschutz unterstützt_ -- [Prysm](https://github.com/prysmaticlabs/prysm) – _Go-Implementierung von Ethereum „Serenity“ 2.0_ -- [Eth Tweet](https://github.com/yep/eth-tweet) – _Dezentralisiertes Twitter: Ein Microblogging-Dienst, der auf der Ethereum-Blockchain läuft_ +- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) - _Offizielle Go-Implementierung des Ethereum-Protokolls_ +- [Go Ethereum Code-Analyse](https://github.com/ZtesoftCS/go-ethereum-code-analysis) - _Überprüfung und Analyse des Go Ethereum-Quellcodes_ +- [Erigon](https://github.com/ledgerwatch/erigon) - _Schnelleres Derivat von Go Ethereum, mit Fokus auf Archiv-Blockchain-Knoten_ +- [Golem](https://github.com/golemfactory/golem) - _Golem schafft einen globalen Markt für Rechenleistung_ +- [Quorum](https://github.com/jpmorganchase/quorum) - _Eine zugelassene (permissioned) Implementierung von Ethereum, die Datenschutz unterstützt_ +- [Prysm](https://github.com/prysmaticlabs/prysm) - _Ethereum 'Serenity' 2.0 Go-Implementierung_ +- [Eth Tweet](https://github.com/yep/eth-tweet) - _Dezentralisiertes Twitter: Ein Microblogging-Dienst, der auf der Ethereum-Blockchain läuft_ - [Plasma MVP Golang](https://github.com/kyokan/plasma) — _Golang-Implementierung und Erweiterung der Minimum Viable Plasma-Spezifikation_ -- [Open Ethereum Mining-Pool](https://github.com/sammy007/open-ethereum-pool) – _Ein Open-Source-Ethereum-Mining-Pool_ -- [Ethereum-HD-Wallet](https://github.com/miguelmota/go-ethereum-hdwallet) – _Ableitungen für Ethereum-HD-Wallets in Go_ -- [Multi Geth](https://github.com/multi-geth/multi-geth) – _Unterstützung für viele Arten von Ethereum-Netzwerken_ -- [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) – _Geth-Implementierung des Light Ethereum Subprotocol_ -- [Ethereum Golang SDK](https://github.com/everFinance/goether) – _Eine einfache Ethereum-Wallet-Implementierung und Dienstprogramme in Golang_ -- [Covalent Golang SDK](https://github.com/covalenthq/covalent-api-sdk-go) – _Effizienter Zugriff auf Blockchain-Daten über das Go-SDK für über 200 Blockchains_ +- [Open Ethereum Mining Pool](https://github.com/sammy007/open-ethereum-pool) - _Ein Open-Source-Ethereum-Mining-Pool_ +- [Ethereum HD Wallet](https://github.com/miguelmota/go-ethereum-hdwallet) - _Ethereum HD Wallet-Ableitungen in Go_ +- [Multi Geth](https://github.com/multi-geth/multi-geth) - _Unterstützung für viele Arten von Ethereum-Netzwerken_ +- [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _Geth-Implementierung des Light Ethereum Subprotocols_ +- [Ethereum Golang SDK](https://github.com/everFinance/goether) - _Eine einfache Ethereum-Wallet-Implementierung und Dienstprogramme in Golang_ +- [Covalent Golang SDK](https://github.com/covalenthq/covalent-api-sdk-go) - _Effizienter Blockchain-Datenzugriff über das Go SDK für über 200 Blockchains_ -Sind Sie an weiteren Informationen interessiert? Besuchen Sie [ethereum.org/developers](/developers/) +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [ethereum.org/developers](/developers/) ## Mitwirkende der Go-Community {#go-community-contributors} - [Geth Discord](https://discordapp.com/invite/nthXNEv) - [Geth Gist](https://gitter.im/ethereum/go-ethereum) -- [Gophers Slack](https://invite.slack.golangbridge.org/) – [Kanal #ethereum](https://gophers.slack.com/messages/C9HP1S9V2) -- [StackExchange – Ethereum](https://ethereum.stackexchange.com/) +- [Gophers Slack](https://invite.slack.golangbridge.org/) - [#ethereum-Kanal](https://gophers.slack.com/messages/C9HP1S9V2) +- [StackExchange - Ethereum](https://ethereum.stackexchange.com/) - [Multi Geth Gitter](https://gitter.im/ethoxy/multi-geth) - [Ethereum Gitter](https://gitter.im/ethereum/home) - [Geth Light Client Gitter](https://gitter.im/ethereum/light-client) -## Andere zusammengefasste Listen {#other-aggregated-lists} +## Weitere aggregierte Listen {#other-aggregated-lists} - [Awesome Ethereum](https://github.com/btomashvili/awesome-ethereum) -- [Consensys: Eine endgültige Liste von Ethereum-Entwickler-Tools](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub-Quelle](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [Consensys: Eine definitive Liste von Ethereum-Entwicklertools](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub-Quelle](https://github.com/ConsenSys/ethereum-developer-tools-list) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/index.md b/public/content/translations/de/developers/docs/programming-languages/index.md index 80eaad705c7..ae9f07e506e 100644 --- a/public/content/translations/de/developers/docs/programming-languages/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/index.md @@ -1,17 +1,17 @@ --- title: Programmiersprachen -description: "Entdecken Sie Ethereum-Entwicklungsressourcen für verschiedene Programmiersprachen, darunter JavaScript, Python, Go, Rust und mehr." +description: "Entdecke Ethereum-Entwicklungsressourcen für verschiedene Programmiersprachen, darunter JavaScript, Python, Go, Rust und mehr." lang: de --- -Ein häufiges Missverständnis ist, dass Entwickler [Smart Contracts](/developers/docs/smart-contracts/) schreiben müssen, um auf Ethereum aufzubauen. Doch das ist falsch. -Einer der Vorteile des Ethereum-Netzwerks und der Community ist, dass man in so ziemlich jeder Programmiersprache [teilnehmen](/community/) kann. +Ein weit verbreiteter Irrglaube ist, dass Entwickler [Smart Contracts](/developers/docs/smart-contracts/) schreiben müssen, um auf Ethereum aufzubauen. Das ist falsch. +Eines der schönen Dinge am Ethereum-Netzwerk und der Community ist, dass man sich in fast jeder Programmiersprache [beteiligen](/community/) kann. -Die Community von Ethereum und Ethereum selbst ist offen für Open Source, also Quelloffenheit. Zu finden sind Community Projekte – Kundenumsetzungen, APIs (Programmierschnittstellen), Entwickleroberflächen, Tools zu Testzwecken – in einer großen Auswahl an Sprachen. +Ethereum und seine Community setzen auf Open Source. Du findest Community-Projekte – Client-Implementierungen, APIs, Entwicklungs-Frameworks, Test-Tools – in einer Vielzahl von Sprachen. -## Wählen Sie Ihre Sprache {#data} +## Wähle deine Sprache {#data} -Wählen Sie eine Programmiersprache, um Projekte, Ressourcen und virtuelle Communitys zu finden: +Wähle deine bevorzugte Programmiersprache, um Projekte, Ressourcen und virtuelle Communities zu finden: - [Ethereum für Dart-Entwickler](/developers/docs/programming-languages/dart/) - [Ethereum für Delphi-Entwickler](/developers/docs/programming-languages/delphi/) @@ -24,9 +24,8 @@ Wählen Sie eine Programmiersprache, um Projekte, Ressourcen und virtuelle Commu - [Ethereum für Ruby-Entwickler](/developers/docs/programming-languages/ruby/) - [Ethereum für Rust-Entwickler](/developers/docs/programming-languages/rust/) -### Was, wenn meine Sprache nicht unterstützt wird {#other-lang} +### Was ist, wenn meine Sprache nicht unterstützt wird? {#other-lang} -Wenn Sie auf Ressourcen verlinken oder auf eine virtuelle Gemeinschaft für eine weitere Programmiersprache hinweisen möchten, können Sie eine neue Seite beantragen, indem Sie [ein Thema eröffnen](https://github.com/ethereum/ethereum-org-website/issues/new/choose). +Wenn du auf Ressourcen verlinken oder auf eine virtuelle Community für eine zusätzliche Programmiersprache hinweisen möchtest, kannst du eine neue Seite anfordern, indem du [ein Issue eröffnest](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -Wenn Sie nur Code schreiben möchten, um mit einer derzeit nicht unterstützten Sprache mit der Blockchain zu kommunizieren, -können Sie die [JSON-RPC-Schnittstelle](/developers/docs/apis/json-rpc/) verwenden, um sich mit dem Ethereum-Netzwerk zu verbinden. Jede Programmiersprache, die TCP/IP verwenden kann, kann diese Schnittstelle nutzen. +Wenn du einfach nur Code schreiben möchtest, um mit der Blockchain über eine derzeit nicht unterstützte Sprache zu interagieren, kannst du die [JSON-RPC-Schnittstelle](/developers/docs/apis/json-rpc/) verwenden, um dich mit dem Ethereum-Netzwerk zu verbinden. Jede Programmiersprache, die TCP/IP nutzen kann, kann diese Schnittstelle verwenden. \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/java/index.md b/public/content/translations/de/developers/docs/programming-languages/java/index.md index 914e0da424c..3cdd8c12f39 100644 --- a/public/content/translations/de/developers/docs/programming-languages/java/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/java/index.md @@ -1,48 +1,47 @@ --- title: "Ethereum für Java-Entwickler" -description: "Lernen, wie Sie mit Java-basierten Projekten und Werkzeugen für Ethereum entwickeln können" +description: "Erfahren Sie, wie Sie mit Java-basierten Projekten und Tools für Ethereum entwickeln" lang: de incomplete: true --- -Lernen Sie, wie Sie mit Java-basierten Projekten und Tools für Ethereum entwickeln +Erfahren Sie, wie Sie mit Java-basierten Projekten und Tools für Ethereum entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenswürdig sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte kontrollieren, um neue Arten von Finanzanwendungen zu schaffen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} -**Erste Schritte bei der Integration von Java mit Ethereum** +**Machen Sie Ihre ersten Schritte zur Integration von Java mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers.](/developers/) +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers.](/developers/) - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Lernen Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Arbeiten mit Ethereum-Clients {#working-with-ethereum-clients} -Lernen Sie, wie Sie [Web3J](https://github.com/web3j/web3j) und Hyperledger Besu, zwei führende Java-Ethereum-Clients, nutzen +Erfahren Sie, wie Sie [Web3J](https://github.com/web3j/web3j) und Hyperledger Besu verwenden, zwei führende Java-Ethereum-Clients -- [Verbindung zu einem Ethereum-Client mit Java, Eclipse und Web3J](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) -- [Verwaltung eines Ethereum-Kontos mit Java und Web3j](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) +- [Verbindung zu einem Ethereum-Client mit Java, Eclipse und Web3J herstellen](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) +- [Verwalten eines Ethereum-Kontos mit Java und Web3j](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) - [Generieren eines Java-Wrappers aus Ihrem Smart Contract](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) -- [Interagieren mit einem Ethereum Smart Contract](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) -- [Warten auf Ethereum Smart Contract-Ereignisse](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) -- [Verwendung von Besu (Pantheon), dem Java-Ethereum-Client, unter Linux](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) -- [Ausführen eines Hyperledger Besu (Pantheon)-Nodes in Java-Integrationstests](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) -- [Web3j-Spickzettel](https://kauri.io/web3j-cheat-sheet-\(java-ethereum\)/5dfa1ea941ac3d0001ce1d90/c) - -Lernen Sie, wie Sie [ethers-kt](https://github.com/Kr1ptal/ethers-kt) verwenden – eine asynchrone, hochleistungsfähige Kotlin-Bibliothek zur Interaktion mit EVM-basierten Blockchains. Ausgelegt für JVM und Android-Plattfomen. - -- [Übertragen von ERC20-Tokens](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) -- [UniswapV2-Swap mit Ereignisüberwachung](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) +- [Interaktion mit einem Ethereum Smart Contract](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) +- [Auf Ethereum Smart Contract-Ereignisse hören](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) +- [Verwendung von Besu (Pantheon), dem Java-Ethereum-Client mit Linux](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) +- [Ausführen eines Hyperledger Besu (Pantheon) Blockchain-Knotens in Java-Integrationstests](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) +- [Web3j Spickzettel]() + +Erfahren Sie, wie Sie [ethers-kt](https://github.com/Kr1ptal/ethers-kt) verwenden, eine asynchrone, hochleistungsfähige Kotlin-Bibliothek zur Interaktion mit EVM-basierten Blockchains. Ausgerichtet auf JVM- und Android-Plattformen. +- [ERC20-Token übertragen](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) +- [UniswapV2-Tausch mit Ereignisüberwachung](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) - [ETH / ERC20-Guthaben-Tracker](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt) ## Artikel für Fortgeschrittene {#intermediate-articles} - [Speicherverwaltung in einer Java-Anwendung mit IPFS](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) -- [Verwaltung von ERC20-Tokens in Java mit Web3j](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) +- [Verwalten von ERC20-Token in Java mit Web3j](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) - [Web3j-Transaktionsmanager](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} @@ -51,14 +50,14 @@ Lernen Sie, wie Sie [ethers-kt](https://github.com/Kr1ptal/ethers-kt) verwenden ## Java-Projekte und -Tools {#java-projects-and-tools} -- [Web3J (Bibliothek für die Interaktion mit Ethereum-Clients)](https://github.com/web3j/web3j) -- [ethers-kt (Asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains.)](https://github.com/Kr1ptal/ethers-kt) -- [Eventeum (Event-Listener)](https://github.com/ConsenSys/eventeum) -- [Mahuta (IPFS-Entwickler-Tools)](https://github.com/ConsenSys/mahuta) +- [Web3J (Bibliothek zur Interaktion mit Ethereum-Clients)](https://github.com/web3j/web3j) +- [ethers-kt (Asynchrone, hochleistungsfähige Kotlin/Java/Android-Bibliothek für EVM-basierte Blockchains.)](https://github.com/Kr1ptal/ethers-kt) +- [Eventeum (Ereignis-Listener)](https://github.com/ConsenSys/eventeum) +- [Mahuta (IPFS-Entwicklertools)](https://github.com/ConsenSys/mahuta) -Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers.](/developers/) an. +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [ethereum.org/developers.](/developers/) -## Mitwirkende der Java-Community {#java-community-contributors} +## Mitwirkende aus der Java-Community {#java-community-contributors} - [IO Builders](https://io.builders) -- [Kauri](https://kauri.io) +- [Kauri](https://kauri.io) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/javascript/index.md b/public/content/translations/de/developers/docs/programming-languages/javascript/index.md index c3d8b533801..713133fc9be 100644 --- a/public/content/translations/de/developers/docs/programming-languages/javascript/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/javascript/index.md @@ -1,10 +1,10 @@ --- title: "Ethereum für JavaScript-Entwickler" -description: "Lernen, wie Sie JavaScript-basierte Projekte und Tools für die Ethereum-Entwicklung nutzen können" +description: "Erfahren Sie, wie Sie mit JavaScript-basierten Projekten und Tools für Ethereum entwickeln." lang: de --- -JavaScript ist eine der beliebtesten Sprachen im Ethereum-Ökosystem. Tatsächlich gibt es ein [Team](https://github.com/ethereumjs), das sich dafür einsetzt, so viel von Ethereum wie möglich auf JavaScript zu bringen. +JavaScript gehört zu den beliebtesten Sprachen im Ethereum-Ökosystem. Tatsächlich gibt es ein [Team](https://github.com/ethereumjs), das sich der Aufgabe widmet, so viel von Ethereum wie möglich in JavaScript umzusetzen. Es gibt Möglichkeiten, JavaScript (oder etwas Ähnliches) auf [allen Ebenen des Stacks](/developers/docs/ethereum-stack/) zu schreiben. @@ -12,20 +12,20 @@ Es gibt Möglichkeiten, JavaScript (oder etwas Ähnliches) auf [allen Ebenen des ### JavaScript-API-Bibliotheken {#javascript-api-libraries} -Wenn du JavaScript schreiben möchtest, um die Blockchain abzufragen, Transaktionen zu senden und mehr, ist die Verwendung einer [JavaScript-API-Bibliothek](/developers/docs/apis/javascript/) der bequemste Weg. Diese APIs ermöglichen es Entwicklern, einfach mit den [Nodes im Ethereum-Netzwerk](/developers/docs/nodes-and-clients/) zu interagieren. +Wenn Sie JavaScript schreiben möchten, um die Blockchain abzufragen, Transaktionen zu senden und mehr, ist der bequemste Weg dafür die Verwendung einer [JavaScript-API-Bibliothek](/developers/docs/apis/javascript/). Diese APIs ermöglichen es Entwicklern, einfach mit den [Blockchain-Knoten im Ethereum-Netzwerk](/developers/docs/nodes-and-clients/) zu interagieren. -Sie können diese Bibliotheken verwenden, um mit Smart Contracts auf Ethereum zu interagieren. Das ermöglicht es, eine dApp für Fälle zu erstellen, in denen Sie nur JavaScript verwenden, um mit bereits bestehenden Verträgen zu interagieren. +Sie können diese Bibliotheken verwenden, um mit Smart Contracts auf Ethereum zu interagieren. So ist es möglich, eine Dapp zu erstellen, bei der Sie nur JavaScript verwenden, um mit bereits bestehenden Verträgen zu interagieren. -**Ansehen** +**Sehen Sie sich Folgendes an:** - [Web3.js](https://web3js.readthedocs.io) -- [Ethers.js](https://ethers.org) – _beinhaltet die Implementierung von Ethereum-Wallets und Utilities in JavaScript und TypeScript._ +- [Ethers.js](https://ethers.org) – _enthält eine Ethereum-Wallet-Implementierung und Dienstprogramme in JavaScript und TypeScript._ - [viem](https://viem.sh) – _eine TypeScript-Schnittstelle für Ethereum, die zustandslose Low-Level-Primitive für die Interaktion mit Ethereum bereitstellt._ - [Drift](https://ryangoree.github.io/drift/) – _eine TypeScript-Meta-Bibliothek mit integriertem Caching, Hooks und Test-Mocks für eine mühelose Ethereum-Entwicklung über Web3-Bibliotheken hinweg._ ### Smart Contracts {#smart-contracts} -Wenn du ein JavaScript-Entwickler bist und deinen eigenen Smart Contract schreiben möchtest, solltest du dich mit [Solidity](https://solidity.readthedocs.io) vertraut machen. Das ist die am weitesten verbreitete Smart-Contract-Sprache. Sie ist syntaktisch ähnlich wie JavaScript und erleichtert damit das Lernen. +Wenn Sie ein JavaScript-Entwickler sind und Ihren eigenen Smart Contract schreiben möchten, sollten Sie sich mit [Solidity](https://solidity.readthedocs.io) vertraut machen. Dies ist die beliebteste Smart-Contract-Sprache und sie ist syntaktisch ähnlich wie JavaScript, was das Erlernen erleichtern kann. Mehr über [Smart Contracts](/developers/docs/smart-contracts/). @@ -33,40 +33,40 @@ Mehr über [Smart Contracts](/developers/docs/smart-contracts/). ### Die Ethereum Virtual Machine {#the-ethereum-virtual-machine} -Es gibt eine JavaScript-Implementierung der [Ethereum Virtual Machine](/developers/docs/evm/). Sie unterstützt die neuesten Fork-Regeln. Fork-Regeln beziehen sich auf Änderungen, die durch geplante Upgrades an EVM vorgenommen wurden. +Es gibt eine JavaScript-Implementierung der [Ethereum Virtual Machine](/developers/docs/evm/). Sie unterstützt die neuesten Fork-Regeln. Fork-Regeln beziehen sich auf Änderungen an der EVM als Folge von geplanten Upgrades. -Aufteteilt wird sie in verschiedene JavaScript-Pakete. Die können Sie sich ansehen, um ein besseres Verständnis zu erlangen: +Sie ist in verschiedene JavaScript-Pakete aufgeteilt, die Sie sich ansehen können, um Folgendes besser zu verstehen: - Konten - Blöcke - Die Blockchain selbst - Transaktionen -- Und mehr... +- Und mehr ... -Auf diese Weise werden Fragen wie "Was ist die Datenstruktur eines Kontos?" leichter verständlich. +Dies wird Ihnen helfen, Dinge zu verstehen wie „Wie sieht die Datenstruktur eines Kontos aus?“. -Wenn Sie sich lieber den geschriebenen Code durchlesen, ist dieses JavaScript eine gute Alternative, um sich all unsere Dokumente durchzulesen. +Wenn Sie lieber Code lesen, könnte dieses JavaScript eine großartige Alternative zum Lesen unserer Dokumentation sein. -**Schau dir die EVM an** +**Sehen Sie sich die EVM an** [`@ethereumjs/evm`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/evm) -### Nodes und Clients {#nodes-and-clients} +### Blockchain-Knoten und Anwendungen {#nodes-and-clients} -Einer der Clients von Ethereum befindet sich derzeit in der aktiven Entwicklungsphase, sodass Sie einen Einblick in die Funktionsweise der Ethereum-Clients erhalten können, in einer Programmiersprache, die Sie verstehen: JavaScript! +Eine Ethereumjs-Anwendung befindet sich in aktiver Entwicklung, mit der Sie in einer Sprache, die Sie verstehen, nämlich JavaScript, untersuchen können, wie Ethereum-Anwendungen funktionieren! -**Schau dir den Client an** +**Sehen Sie sich die Anwendung an** [`@ethereumjs/client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) ## Weitere Projekte {#other-projects} -Im Bereich Ethereum-JavaScript gibt es noch weitere Neuerungen, darunter: +Es gibt auch viele andere Dinge, die im Bereich Ethereum-JavaScript passieren, darunter: -- Bibliotheken mit Wallet-Dienstprogrammen -- Tools zum Erstellen, Importieren und Exportieren von Ethereum-Schlüsseln -- eine Implementierung des `merkle-patricia-tree` – eine Datenstruktur, die im Ethereum Yellow Paper beschrieben wird. +- Bibliotheken für Wallet-Dienstprogramme. +- Tools zum Generieren, Importieren und Exportieren von Ethereum-Schlüsseln. +- eine Implementierung des `merkle-patricia-tree` – einer Datenstruktur, die im Ethereum Yellow Paper beschrieben wird. -Tauche im [EthereumJS-Repo](https://github.com/ethereumjs) in das ein, was dich am meisten interessiert. +Vertiefen Sie sich in das, was Sie am meisten interessiert, im [EthereumJS-Repo](https://github.com/ethereumjs). -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/python/index.md b/public/content/translations/de/developers/docs/programming-languages/python/index.md index 16388a81429..8372545d5f4 100644 --- a/public/content/translations/de/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/python/index.md @@ -1,32 +1,32 @@ --- title: "Ethereum für Python-Entwickler" -description: "Erfahre, wie du mit Python-basierten Projekten und Werkzeugen für Ethereum entwickeln kannst" +description: "Erfahren Sie, wie Sie mit Python-basierten Projekten und Tools für Ethereum entwickeln" lang: de incomplete: true --- -Lernen Sie, wie Sie mit Python-basierten Projekten und Tools für Ethereum entwickeln +Erfahren Sie, wie Sie mit Python-basierten Projekten und Tools für Ethereum entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenswürdig sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte kontrollieren, um neue Arten von Finanzanwendungen zu schaffen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} -**Starten Sie mit der Integration von Python mit Ethereum durch** +**Machen Sie Ihre ersten Schritte zur Integration von Python mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Erfahren Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) - [Bericht über den Stand von Python in der Blockchain 2023](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) ## Artikel für Anfänger {#beginner-articles} -- [web3.py-Überblick](https://web3py.readthedocs.io/en/latest/overview.html) +- [web3.py Übersicht](https://web3py.readthedocs.io/en/latest/overview.html) - [Tour durch das Ethereum-Python-Ökosystem](https://snakecharmers.ethereum.org/python-ecosystem/) -- [Ein Leitfaden für (Python-)Entwickler zu Ethereum](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) -- [Preiswürdig: Ein Leitfaden für den Ethereum-Python-Hackathon](https://snakecharmers.ethereum.org/prize-worthy/) +- [Ein (Python-)Entwickler-Leitfaden für Ethereum](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) +- [Preiswürdig: Ein Ethereum-Python-Hackathon-Leitfaden](https://snakecharmers.ethereum.org/prize-worthy/) - [Eine Einführung in Smart Contracts mit Vyper](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) - [Wie entwickelt man einen Ethereum-Vertrag mit Python Flask?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) - [Einführung in Web3.py · Ethereum für Python-Entwickler](https://www.dappuniversity.com/articles/web3-py-intro) @@ -37,19 +37,19 @@ Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethe - [Freunde von web3.py: Einführung in Ape](https://snakecharmers.ethereum.org/intro-to-ape/) - [Dapp-Entwicklung für Python-Programmierer](https://www.youtube.com/watch?v=tE-8bG35VNw) - [Erstellen einer Python-Ethereum-Schnittstelle: Teil 1](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) -- [Ethereum Smart Contracts in Python: ein (fast) umfassender Leitfaden](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) +- [Ethereum Smart Contracts in Python: ein (ziemlich) umfassender Leitfaden](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} -- [web3.py-Muster: Echtzeit-Ereignis-Abonnements](https://snakecharmers.ethereum.org/subscriptions/) +- [web3.py-Muster: Echtzeit-Ereignisabonnements](https://snakecharmers.ethereum.org/subscriptions/) - [web3.py-Muster: WebSocketProvider](https://snakecharmers.ethereum.org/websocketprovider/) -- [Kompilieren, Bereitstellen und Aufrufen von Ethereum-Smart-Contracts mit Python](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) +- [Kompilieren, Bereitstellen und Aufrufen von Ethereum-Smart Contracts mit Python](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) - [Analysieren von Solidity Smart Contracts mit Slither](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) -- [Blockchain-Fintech-Tutorial: Leihen und Verleihen mit Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) +- [Blockchain-Fintech-Tutorial: Verleihen und Ausleihen mit Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) ## Archivierte Artikel -- [Bereitstellen Ihres eigenen ERC20-Tokens mit Python und Brownie](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) +- [Stellen Sie Ihren eigenen ERC20-Token mit Python und Brownie bereit](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) - [Verwendung von Brownie und Python zur Bereitstellung von Smart Contracts](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) - [Erstellen von NFTs auf OpenSea mit Brownie](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) @@ -57,43 +57,43 @@ Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethe ### Aktiv: {#active} -- [Web3.py](https://github.com/ethereum/web3.py) – _Python-Bibliothek für die Interaktion mit Ethereum_ -- [Vyper](https://github.com/ethereum/vyper/) – _Pythonische Smart-Contract-Sprache für die EVM_ -- [Ape](https://github.com/ApeWorX/ape) – _Das Entwicklungstool für Smart Contracts für Python-Experten, Datenwissenschaftler und Sicherheitsexperten_ +- [Web3.py](https://github.com/ethereum/web3.py) – _Python-Bibliothek zur Interaktion mit Ethereum_ +- [Vyper](https://github.com/ethereum/vyper/) – _Pythonische Smart Contract-Sprache für die EVM_ +- [Ape](https://github.com/ApeWorX/ape) – _Das Smart Contract-Entwicklungstool für Pythonistas, Datenwissenschaftler und Sicherheitsexperten_ - [py-evm](https://github.com/ethereum/py-evm) – _Implementierung der Ethereum Virtual Machine_ -- [eth-tester](https://github.com/ethereum/eth-tester) – _Tools zum Testen Ethereum-basierter Anwendungen_ +- [eth-tester](https://github.com/ethereum/eth-tester) – _Tools zum Testen von Ethereum-basierten Anwendungen_ - [eth-utils](https://github.com/ethereum/eth-utils/) – _Hilfsfunktionen für die Arbeit mit Ethereum-bezogenen Codebasen_ -- [py-solc-x](https://pypi.org/project/py-solc-x/) – _Python-Wrapper um den solc Solidity-Compiler mit Unterstützung für 0.5.x_ +- [py-solc-x](https://pypi.org/project/py-solc-x/) – _Python-Wrapper um den solc-Solidity-Compiler mit 0.5.x-Unterstützung_ - [pymaker](https://github.com/makerdao/pymaker) – _Python-API für Maker-Verträge_ - [siwe](https://github.com/signinwithethereum/siwe-py) – _Sign in with Ethereum (siwe) für Python_ - [Web3 DeFi für Ethereum-Integrationen](https://github.com/tradingstrategy-ai/web3-ethereum-defi) – _Ein Python-Paket mit fertigen Integrationen für ERC-20, Uniswap und andere beliebte Projekte_ -- [Wake](https://getwake.io) – _All-in-one Python-Framework zum Testen von Verträgen, Fuzzing, Bereitstellung, Scannen von Sicherheitslücken und Code-Navigation (Sprachserver – [Tools für Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ +- [Wake](https://getwake.io) – _All-in-One-Python-Framework für das Testen von Verträgen, Fuzzing, Bereitstellung, Schwachstellen-Scans und Code-Navigation (Sprachserver – [Tools for Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ -### Archiviert / Wird nicht mehr gepflegt: {#archived--no-longer-maintained} +### Archiviert / Nicht mehr gepflegt: {#archived--no-longer-maintained} - [Trinity](https://github.com/ethereum/trinity) – _Ethereum-Python-Client_ -- [Mamba](https://github.com/arjunaskykok/mamba) – _Framework zum Schreiben, Kompilieren und Bereitstellen von Smart Contracts in der Sprache Vyper_ -- [Brownie](https://github.com/eth-brownie/brownie) – _Python-Framework zum Bereitstellen, Testen und Interagieren mit Ethereum Smart Contracts_ +- [Mamba](https://github.com/arjunaskykok/mamba) – _Framework zum Schreiben, Kompilieren und Bereitstellen von Smart Contracts, die in der Sprache Vyper geschrieben sind_ +- [Brownie](https://github.com/eth-brownie/brownie) – _Python-Framework für die Bereitstellung, das Testen und die Interaktion mit Ethereum Smart Contracts_ - [pydevp2p](https://github.com/ethereum/pydevp2p) – _Implementierung des Ethereum-P2P-Stacks_ -- [py-wasm](https://github.com/ethereum/py-wasm) – _Python-Implementierung des Web-Assembly-Interpreters_ +- [py-wasm](https://github.com/ethereum/py-wasm) – _Python-Implementierung des WebAssembly-Interpreters_ -Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers](/developers/) an. +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [ethereum.org/developers](/developers/). ## Projekte, die Python-Tools verwenden {#projects-using-python-tooling} -Die folgenden Ethereum-basierten Projekte verwenden die auf dieser Seite erwähnten Tools. Die zugehörigen Open-Source-Repositorys dienen als gute Referenz für Beispielcode und Best-Practice -Ansätze. +Die folgenden Ethereum-basierten Projekte verwenden die auf dieser Seite erwähnten Tools. Die zugehörigen Open-Source-Repositories dienen als gute Referenz für Beispielcode und Best Practices. -- [Yearn Finance](https://yearn.finance/) und [Yearn Vault Contracts-Repository](https://github.com/yearn/yearn-vaults) -- [Curve](https://www.curve.finance/) und [Curve-Smart-Contracts-Repository](https://github.com/curvefi/curve-contract) +- [Yearn Finance](https://yearn.finance/) und das [Yearn Vault Contracts-Repository](https://github.com/yearn/yearn-vaults) +- [Curve](https://www.curve.finance/) und das [Curve Smart Contracts-Repository](https://github.com/curvefi/curve-contract) - [BadgerDAO](https://badger.com/) und [Smart Contracts, die die Brownie-Toolchain verwenden](https://github.com/Badger-Finance/badger-system) -- [Sushi](https://sushi.com/) verwendet [Python bei der Verwaltung und Bereitstellung seiner Vesting-Verträge](https://github.com/sushiswap/sushi-vesting-protocols) -- [Alpha Venture DAO](https://alphaventuredao.io/), bekannt für Alpha Homora, verwendet [Brownie zum Testen und Bereitstellen von Smart Contracts](https://github.com/AlphaFinanceLab/alpha-staking-contract) +- [Sushi](https://sushi.com/) verwendet [Python zur Verwaltung und Bereitstellung ihrer Vesting-Verträge](https://github.com/sushiswap/sushi-vesting-protocols) +- [Alpha Finance](https://alphaventuredao.io/), bekannt durch Alpha Homora, verwendet [Brownie zum Testen und Bereitstellen von Smart Contracts](https://github.com/AlphaFinanceLab/alpha-staking-contract) -## Python-Community-Diskussion {#python-community-contributors} +## Diskussionen in der Python-Community {#python-community-contributors} - [Ethereum Python Community Discord](https://discord.gg/9zk7snTfWe) für Diskussionen über Web3.py und andere Python-Frameworks -- [Vyper Discord](https://discord.gg/SdvKC79cJk) für Diskussionen zur Programmierung von Vyper Smart Contracts +- [Vyper Discord](https://discord.gg/SdvKC79cJk) für Diskussionen über die Programmierung von Vyper Smart Contracts -## Andere zusammengefasste Listen {#other-aggregated-lists} +## Weitere aggregierte Listen {#other-aggregated-lists} Das Vyper-Wiki enthält eine [unglaubliche Liste von Ressourcen für Vyper](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/ruby/index.md b/public/content/translations/de/developers/docs/programming-languages/ruby/index.md index ef72c64fb82..a6f2ef2a97a 100644 --- a/public/content/translations/de/developers/docs/programming-languages/ruby/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/ruby/index.md @@ -1,60 +1,60 @@ --- title: "Ethereum für Ruby-Entwickler" -description: "Lernen, wie Sie mit Ruby-basierten Projekten und Tools für Ethereum entwickeln" +description: "Erfahren Sie, wie Sie mit Ruby-basierten Projekten und Tools für Ethereum entwickeln." lang: de incomplete: false --- -Lernen Sie, wie Sie mit Ruby-basierten Projekten und Werkzeugen für Ethereum entwickeln. +Erfahren Sie, wie Sie mit Ruby-basierten Projekten und Tools für Ethereum entwickeln. -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenslos sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte steuern, um neue Arten von Finanzanwendungen zu schaffen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} -**Starten Sie mit der Integration von Ruby mit Ethereum durch** +**Machen Sie Ihre ersten Schritte zur Integration von Ruby mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Lernen Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Artikel für Anfänger {#beginner-articles} -- [Ethereum-Accounts endlich verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) -- [Endlich Rails-Benutzer mit MetaMask authentifizieren](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) +- [Ethereum-Konten endlich verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Rails-Benutzer endlich mit MetaMask authentifizieren](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) - [Wie man sich mit Ruby mit dem Ethereum-Netzwerk verbindet](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby) - [Wie man eine neue Ethereum-Adresse in Ruby generiert](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) ## Artikel für Fortgeschrittene {#intermediate-articles} - [Blockchain-App mit Ruby](https://www.nopio.com/blog/blockchain-app-ruby/) -- [Den Smart Contract mit Ruby ausführen, das mit Ethereum verbunden ist](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) +- [Verwenden Sie Ruby, verbunden mit Ethereum, um den Smart Contract auszuführen](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) -## Ruby-Projekte und -Werkzeuge {#ruby-projects-and-tools} +## Ruby-Projekte und -Tools {#ruby-projects-and-tools} ### Aktiv {#active} -- [eth.rb](https://github.com/q9f/eth.rb) – _Ruby-Bibliothek und RPC-Client zur Verwaltung von Ethereum-Konten, Nachrichten und Transaktionen_ -- [keccak.rb](https://github.com/q9f/keccak.rb) – _Der von Ethereum verwendete Keccak-(SHA3-)Hash_ -- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) – _Ruby-Implementierung von „Sign-In with Ethereum“_ -- [siwe-rails](https://github.com/signinwithethereum/siwe-rails) – _Rails-Gem, das lokale SIWE-Anmelderouten hinzufügt_ -- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) – _SIWE-Beispiel unter Verwendung von Ruby on Rails mit benutzerdefiniertem Controller_ -- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) – _OmniAuth-Strategie für Sign In With Ethereum (SIWE)_ -- [omniauth-nft](https://github.com/valthon/omniauth-nft) – _OmniAuth-Strategie für die Authentifizierung über NFT-Besitz_ -- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) – _Ethereum on Rails-Vorlage, die es ermöglicht, MetaMask mit Ruby on Rails zu verbinden_ +- [eth.rb](https://github.com/q9f/eth.rb) - _Ruby-Bibliothek und RPC-Client zur Handhabung von Ethereum-Konten, Nachrichten und Transaktionen_ +- [keccak.rb](https://github.com/q9f/keccak.rb) - _Der von Ethereum verwendete Keccak (SHA3) Hash_ +- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) - _Ruby-Implementierung von Sign-In with Ethereum_ +- [siwe-rails](https://github.com/signinwithethereum/siwe-rails) - _Rails-Gem, das lokale SIWE-Anmelderouten hinzufügt_ +- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) - _SIWE-Beispiel unter Verwendung von Ruby on Rails mit benutzerdefiniertem Controller_ +- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) - _OmniAuth-Strategie für Sign In With Ethereum (SIWE)_ +- [omniauth-nft](https://github.com/valthon/omniauth-nft) - _OmniAuth-Strategie zur Authentifizierung über NFT-Besitz_ +- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) - _Ethereum on Rails-Vorlage, die es ermöglicht, MetaMask mit Ruby on Rails zu verbinden_ ### Archiviert / Wird nicht mehr gepflegt {#archived--no-longer-maintained} -- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) – _Aufrufen von RPC-Methoden eines Ethereum-Nodes mit Ruby_ -- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) – _Ruby-Bibliothek zur Generierung von ETH-Adressen aus einer Hierarchical Deterministic Wallet nach dem BIP32-Standard_ -- [etherlite](https://github.com/budacom/etherlite) – _Ethereum-Integration für Ruby on Rails_ -- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) – _Ruby-Ethereum-Client mit JSON-RPC-Schnittstelle zum Senden von Transaktionen, Erstellen und Interagieren mit Verträgen sowie ein nützliches Toolkit für die Arbeit mit einem Ethereum-Node_ -- [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) – _Implementiert die Ethereum-Anbieterstrategie für OmniAuth_ +- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) - _Aufrufen von RPC-Methoden eines Ethereum-Blockchain-Knotens mit Ruby_ +- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) - _Ruby-Bibliothek zur Generierung von ETH-Adressen aus einem hierarchisch deterministischen Wallet gemäß dem BIP32-Standard_ +- [etherlite](https://github.com/budacom/etherlite) - _Ethereum-Integration für Ruby on Rails_ +- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) - _Ruby-Ethereum-Client, der die JSON-RPC-Schnittstelle zum Senden von Transaktionen, Erstellen und Interagieren mit Verträgen sowie ein nützliches Toolkit für die Arbeit mit einem Ethereum-Blockchain-Knoten verwendet_ +- [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) - _Implementiert die Ethereum-Anbieterstrategie für OmniAuth_ -Sind Sie an weiteren Informationen interessiert? Besuchen Sie [unser Entwickler-Portal](/developers/). +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [unsere Entwickler-Startseite](/developers/). -## Mitwirkende der Ruby-Community {#ruby-community-contributors} +## Mitwirkende aus der Ruby-Community {#ruby-community-contributors} -Die [Ethereum Ruby Telegram-Gruppe](https://t.me/ruby_eth) beherbergt eine schnell wachsende Community und ist die zentrale Anlaufstelle für Diskussionen über die oben genannten Projekte und verwandte Themen. +Die [Ethereum Ruby Telegram-Gruppe](https://t.me/ruby_eth) beherbergt eine schnell wachsende Community und ist die dedizierte Ressource für Diskussionen über alle oben genannten Projekte und verwandte Themen. \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/rust/index.md b/public/content/translations/de/developers/docs/programming-languages/rust/index.md index 241e57b0654..9346de17866 100644 --- a/public/content/translations/de/developers/docs/programming-languages/rust/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/rust/index.md @@ -1,65 +1,63 @@ --- title: "Ethereum für Rust-Entwickler" -description: "Lernen, wie Sie mit Rust-basierten Projekten und Tools für Ethereum entwickeln können" +description: "Erfahren Sie, wie Sie mit Rust-basierten Projekten und Tools für Ethereum entwickeln" lang: de incomplete: true --- -Lernen Sie, wie Sie für Ethereum mit Rust-basierten Projekten und Werkzeugen entwickeln +Erfahren Sie, wie Sie mit Rust-basierten Projekten und Tools für Ethereum entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Nutzen Sie Ethereum, um dezentralisierte Anwendungen (oder „Dapps“) zu erstellen, die die Vorteile von Kryptowährung und Blockchain-Technologie nutzen. Diese Dapps können vertrauenswürdig sein, was bedeutet, dass sie, sobald sie auf Ethereum bereitgestellt wurden, immer wie programmiert ausgeführt werden. Sie können digitale Vermögenswerte kontrollieren, um neue Arten von Finanzanwendungen zu schaffen. Sie können dezentralisiert sein, was bedeutet, dass keine einzelne Entität oder Person sie kontrolliert und sie fast unmöglich zu zensieren sind. ## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} -**Starten Sie mit der Integration von Rust mit Ethereum durch** +**Machen Sie Ihre ersten Schritte zur Integration von Rust mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Benötigen Sie zuerst eine grundlegendere Einführung? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Lernen Sie, wie man Solidity kompiliert und bereitstellt](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Artikel für Anfänger {#beginner-articles} -- [Der Rust Ethereum-Client](https://openethereum.github.io/) \* **Bitte beachten Sie, dass OpenEthereum [veraltet ist](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) und nicht mehr gewartet wird.** Verwenden Sie es mit Vorsicht und wechseln Sie vorzugsweise zu einer anderen Client-Implementierung. +- [Die Rust-Ethereum-Anwendung](https://openethereum.github.io/) \* **Beachten Sie, dass OpenEthereum [veraltet ist](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) und nicht mehr gepflegt wird.** Verwenden Sie es mit Vorsicht und wechseln Sie vorzugsweise zu einer anderen Anwendungs-Implementierung. - [Senden einer Transaktion an Ethereum mit Rust](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) -- [Eine Schritt-für-Schritt-Anleitung, wie Sie Contracts in Rust Wasm für Kovan schreiben](https://github.com/paritytech/pwasm-tutorial) +- [Ein Schritt-für-Schritt-Tutorial zum Schreiben von Verträgen in Rust Wasm für Kovan](https://github.com/paritytech/pwasm-tutorial) ## Artikel für Fortgeschrittene {#intermediate-articles} ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} -- [pwasm_ethereum externs-Bibliothek zur Interaktion mit einem Ethereum-ähnlichen Netzwerk](https://github.com/openethereum/pwasm-ethereum) +- [pwasm_ethereum Externs-Bibliothek zur Interaktion mit einem Ethereum-ähnlichen Netzwerk](https://github.com/openethereum/pwasm-ethereum) +- [Erstellen Sie einen dezentralisierten Chat mit JavaScript und Rust](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) +- [Erstellen Sie eine dezentralisierte Todo-App mit Vue.js & Rust](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) -- [Erstellen eines dezentralen Chats mit JavaScript und Rust](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) +- [Erstellen Sie eine Blockchain in Rust](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) -- [Erstellen einer dezentralen To-do-App mit Vue.js & Rust](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) +## Rust-Projekte und -Tools {#rust-projects-and-tools} -- [Eine Blockchain in Rust erstellen](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) +- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) – _Sammlung von Externs zur Interaktion mit einem Ethereum-ähnlichen Netzwerk_ +- [Lighthouse](https://github.com/sigp/lighthouse) – _Schnelle Anwendung für die Ethereum-Konsensebene_ +- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) – _Vorgeschlagenes Redesign der Ausführungsebene für Ethereum-Smart-Contracts unter Verwendung einer deterministischen Teilmenge von WebAssembly_ +- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) – _OASIS-API-Referenz_ +- [Solaris](https://github.com/paritytech/sol-rs) – _Unit-Test-Umgebung für Solidity-Smart-Contracts unter Verwendung der nativen Parity-Anwendungs-EVM._ +- [SputnikVM](https://github.com/rust-blockchain/evm) – _Rust-Implementierung der Ethereum Virtual Machine_ +- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) – _Wavelet-Smart-Contract in Rust_ +- [Foundry](https://github.com/foundry-rs/foundry) – _Toolkit für die Entwicklung von Ethereum-Anwendungen_ +- [Alloy](https://alloy.rs) – _Leistungsstarke, gut getestete und dokumentierte Bibliotheken für die Interaktion mit Ethereum und anderen EVM-basierten Chains._ +- [Ethers_rs](https://github.com/gakonst/ethers-rs) – _Ethereum-Bibliothek und Wallet-Implementierung_ +- [SewUp](https://github.com/second-state/SewUp) – _Eine Bibliothek, die Ihnen hilft, Ihren Ethereum-WebAssembly-Vertrag mit Rust zu erstellen, ähnlich wie bei der Entwicklung in einem herkömmlichen Backend_ +- [Substreams](https://github.com/streamingfast/substreams) – _Parallelisierte Technologie zur Indexierung von Blockchain-Daten_ +- [Reth](https://github.com/paradigmxyz/reth) Reth (kurz für Rust Ethereum) ist eine neue Implementierung eines vollständigen Ethereum-Blockchain-Knotens +- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) – _Eine kuratierte Sammlung von Projekten im Ethereum-Ökosystem, die in Rust geschrieben wurden_ -## Rust-Projekte und -Werkzeuge {#rust-projects-and-tools} +Suchen Sie nach weiteren Ressourcen? Besuchen Sie [ethereum.org/developers.](/developers/) -- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) – _Sammlung von externen Komponenten zur Interaktion mit einem Ethereum-ähnlichen Netzwerk_ -- [Lighthouse](https://github.com/sigp/lighthouse) - _Schneller Client für die Ethereum-Konsens-Ebene_ -- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) – _Vorgeschlagene Neugestaltung der Ausführungsebene für Ethereum Smart Contracts mit einer deterministischen Teilmenge von WebAssembly_ -- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) - _OASIS API-Referenz_ -- [Solaris](https://github.com/paritytech/sol-rs) – _Testumgebung für Solidity Smart Contracts Einheitstests unter Verwendung der nativen Parity Client EVM._ -- [SputnikVM](https://github.com/rust-blockchain/evm) - _Rust-Implementierung der Ethereum Virtual Machine_ -- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _Wavelet Smart Contract in Rust_ -- [Foundry](https://github.com/foundry-rs/foundry) - _Toolkit für die Entwicklung von Ethereum-Anwendungen_ -- [Alloy](https://alloy.rs) – _Hochleistungsfähige, gut getestete und dokumentierte Bibliotheken zur Interaktion mit Ethereum und anderen EVM-basierten Ketten._ -- [Ethers_rs](https://github.com/gakonst/ethers-rs) - _Ethereum-Bibliothek und Wallet-Implementierung_ -- [SewUp](https://github.com/second-state/SewUp) – _Eine Bibliothek, die Ihnen hilft, Ihren Ethereum-Webassembly-Vertrag mit Rust zu erstellen und genau wie in einem gängigen Backend zu entwickeln_ -- [Substreams](https://github.com/streamingfast/substreams) - _Parallelisierte Technologie zur Indexierung von Blockchain-Daten_ -- [Reth](https://github.com/paradigmxyz/reth) – Reth (kurz für Rust Ethereum) ist eine neue Full-Node-Implementierung für Ethereum -- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) – _Eine kuratierte Sammlung von Projekten im Ethereum-Ökosystem, die in Rust geschrieben sind_ - -Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers.](/developers/) an. - -## Rust-Community-Mitwirkende {#rust-community-contributors} +## Mitwirkende aus der Rust-Community {#rust-community-contributors} - [Ethereum WebAssembly](https://gitter.im/ewasm/Lobby) - [Oasis Gitter](https://gitter.im/Oasis-official/Lobby) - [Parity Gitter](https://gitter.im/paritytech/parity) -- [Enigma](https://discord.gg/SJK32GY) +- [Enigma](https://discord.gg/SJK32GY) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/index.md b/public/content/translations/de/developers/docs/scaling/index.md index 2d923664cab..8cdddd9b714 100644 --- a/public/content/translations/de/developers/docs/scaling/index.md +++ b/public/content/translations/de/developers/docs/scaling/index.md @@ -1,113 +1,118 @@ --- title: Skalierung -description: "Eine Einführung in die verschiedenen Skalierungsoptionen, die derzeit von der Ethereum Community entwickelt werden." +description: "Eine Einführung in die verschiedenen Skalierungsoptionen, die derzeit von der Ethereum-Community entwickelt werden." lang: de sidebarDepth: 3 --- ## Skalierungsübersicht {#scaling-overview} -Da die Zahl der Nutzer von Ethereum gestiegen ist, hat die Blockchain gewisse Kapazitätsgrenzen erreicht. Dies hat die Kosten für die Nutzung des Netzes in die Höhe getrieben und den Bedarf an „Skalierungslösungen" geschaffen. Es gibt mehrere Lösungen, die erforscht, getestet und umgesetzt werden, die unterschiedliche Ansätze verfolgen, um ähnliche Ziele zu erreichen. +Da die Anzahl der Menschen, die [Ethereum](/) nutzen, gewachsen ist, hat die Blockchain bestimmte Kapazitätsgrenzen erreicht. Dies hat die Kosten für die Nutzung des Netzwerks in die Höhe getrieben und den Bedarf an „Skalierungslösungen“ geschaffen. Es werden mehrere Lösungen erforscht, getestet und implementiert, die unterschiedliche Ansätze verfolgen, um ähnliche Ziele zu erreichen. -Das Hauptziel der Skalierbarkeit besteht darin, die Transaktionsgeschwindigkeit (schnellere Finalität) und den Transaktionsdurchsatz (höhere Anzahl von Transaktionen pro Sekunde) zu erhöhen, ohne die Dezentralisierung oder die Sicherheit zu beeinträchtigen. Auf der Layer-1-Ethereum-Blockchain führt eine hohe Nachfrage zu langsameren Transaktionen und untragbaren [Gaspreisen](/developers/docs/gas/). Die Erhöhung der Netzwerkkapazität in Bezug auf Geschwindigkeit und Durchsatz ist von grundlegender Bedeutung für eine sinnvolle und massenhafte Einführung von Ethereum. +Das Hauptziel der Skalierbarkeit ist es, die Transaktionsgeschwindigkeit (schnellere Finalität) und den Transaktionsdurchsatz (höhere Anzahl von Transaktionen pro Sekunde) zu erhöhen, ohne die Dezentralisierung oder Sicherheit zu opfern. Auf der Ebene 1 der Ethereum-Blockchain führt eine hohe Nachfrage zu langsameren Transaktionen und unrentablen [Gaspreisen](/developers/docs/gas/). Die Erhöhung der Netzwerkkapazität in Bezug auf Geschwindigkeit und Durchsatz ist grundlegend für eine sinnvolle und massenhafte Akzeptanz von Ethereum. -Geschwindigkeit und Durchsatz sind zwar von Bedeutung, aber es ist entscheidend, dass Skalierungslösungen, die diese Ziele ermöglichen, dezentralisiert und sicher bleiben. Eine niedrige Einstiegshürde für die Betreiber von Knotenpunkten ist von entscheidender Bedeutung, um eine Entwicklung hin zu zentralisierter und unsicherer Rechenleistung zu verhindern. +Während Geschwindigkeit und Durchsatz wichtig sind, ist es unerlässlich, dass Skalierungslösungen, die diese Ziele ermöglichen, dezentralisiert und sicher bleiben. Die Eintrittsbarriere für Betreiber von Blockchain-Knoten niedrig zu halten, ist entscheidend, um eine Entwicklung hin zu zentralisierter und unsicherer Rechenleistung zu verhindern. -Konzeptionell kategorisieren wir Skalierung zunächst entweder als Onchain-Skalierung oder Offchain-Skalierung. +Konzeptionell kategorisieren wir die Skalierung zunächst entweder als Skalierung auf der Blockchain oder als Off-Chain-Skalierung. ## Voraussetzungen {#prerequisites} -Sie sollten über ein gutes Verständnis aller grundlegenden Themen verfügen. Die Umsetzung von Skalierungslösungen ist weit fortgeschritten, da die Technologie weniger erprobt ist und weiter erforscht und entwickelt wird. +Sie sollten ein gutes Verständnis aller grundlegenden Themen haben. Die Implementierung von Skalierungslösungen ist für Fortgeschrittene, da die Technologie weniger praxiserprobt ist und weiterhin erforscht und entwickelt wird. -## Onchain-Skalierung {#onchain-scaling} +## Skalierung auf der Blockchain {#onchain-scaling} -Onchain-Skalierung erfordert Änderungen am Ethereum-Protokoll (Layer-1-[Mainnet](/glossary/#mainnet)). Seit langem wurde die Partitionierung von Ethereum erwartet: Eine Skalierungslösung für Ethereum. Dies würde beinhalten, die Blockchain in diskrete Stücke (Shards) aufzuteilen, die von Teilgruppen von Validatoren verifiziert werden. Jedoch hat das Skalieren durch Layer-2 Rollups als primäre Skalierungstechnik die Führung übernommen. Dies wird durch die Hinzufügung einer neuen kostengünstigeren Form von Daten unterstützt, die an Ethereum-Blöcke angehängt ist und speziell entwickelt wurde, um Rollups für Benutzer kostengünstig zu machen. +Die Skalierung auf der Blockchain erfordert Änderungen am Ethereum-Protokoll (Ebene 1 [Mainnet](/glossary/#mainnet)). Lange Zeit wurde erwartet, dass das Sharding der Blockchain Ethereum skalieren würde. Dies hätte bedeutet, die Blockchain in diskrete Teile (Shards) aufzuteilen, die von Teilmengen von Validatoren verifiziert werden. Die Skalierung durch Ebene-2-Rollups hat jedoch als primäre Skalierungstechnik übernommen. Dies wird durch die Hinzufügung einer neuen, günstigeren Form von Daten unterstützt, die an Ethereum-Blöcke angehängt werden und speziell dafür entwickelt wurden, Rollups für Benutzer günstig zu machen. ### Sharding {#sharding} -Sharding ist ein Prozess der Datenverwaltung, bei dem alle gespeicherten Daten in mehrere Fragmente aufgeteilt werden. Unterklassen von Validatoren wären für ihre eigenen Shards verantwortlich, anstatt dafür zu sorgen, dass die Gesamtlast des Ethereum-Systems aufrechterhalten wird. Sharding war lange Zeit Teil der Ethereum-[Roadmap](/roadmap/) und sollte ursprünglich vor The Merge zum Proof-of-Stake-Verfahren implementiert werden. Die schnelle Entwicklung von [Layer-2-Rollups](#layer-2-scaling) und die Erfindung von [Danksharding](/roadmap/danksharding) (das Hinzufügen von Blobs mit Rollup-Daten zu Ethereum-Blöcken, die von Validatoren sehr effizient verifiziert werden können) hat jedoch dazu geführt, dass die Ethereum-Community eine Rollup-zentrierte Skalierung anstelle der Skalierung durch Sharding bevorzugt. Dies wird auch dazu beitragen, die Konsenslogik von Ethereum einfacher zu halten. +Sharding ist der Prozess der Aufteilung einer Datenbank. Teilmengen von Validatoren wären für einzelne Shards verantwortlich, anstatt das gesamte Ethereum im Auge zu behalten. Sharding stand lange Zeit auf der Ethereum-[Roadmap](/roadmap/) und sollte einst vor dem Merge zu Proof-of-Stake ausgeliefert werden. Die rasante Entwicklung von [Ebene-2-Rollups](#layer-2-scaling) und die Erfindung von [Danksharding](/roadmap/danksharding) (das Hinzufügen von Blobs mit Rollup-Daten zu Ethereum-Blöcken, die von Validatoren sehr effizient verifiziert werden können) haben jedoch dazu geführt, dass die Ethereum-Community eine Rollup-zentrierte Skalierung anstelle einer Skalierung durch Sharding bevorzugt. Dies wird auch dazu beitragen, die Konsenslogik von Ethereum einfacher zu halten. -## Offchain-Skalierung {#offchain-scaling} +## Off-Chain-Skalierung {#offchain-scaling} -Offchain-Lösungen werden separat von Layer 1 Mainnet implementiert – sie erfordern keine Änderungen am bestehenden Ethereum-Protokoll. Einige Lösungen, die als „Layer-2“-Lösungen bekannt sind, leiten ihre Sicherheit direkt vom Layer-1-Ethereum-Konsens ab, wie z. B. [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/), [Zero-Knowledge-Rollups](/developers/docs/scaling/zk-rollups/) oder [State Channels](/developers/docs/scaling/state-channels/). Andere Lösungen umfassen die Erstellung neuer Chains in verschiedenen Formen, die ihre Sicherheit separat vom Mainnet ableiten, wie z. B. [Sidechains](#sidechains), [Validiums](#validium) oder [Plasma-Chains](#plasma). Diese Lösungen kommunizieren mit dem Mainnet, leiten aber ihre Sicherheit anders ab, um eine Vielzahl von Zielen zu erreichen. +Off-Chain-Lösungen werden getrennt vom Ebene-1-Mainnet implementiert – sie erfordern keine Änderungen am bestehenden Ethereum-Protokoll. Einige Lösungen, bekannt als „Ebene 2“-Lösungen, leiten ihre Sicherheit direkt vom Ebene-1-Ethereum-Konsens ab, wie z. B. [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/), [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) oder [State Channels](/developers/docs/scaling/state-channels/). Andere Lösungen beinhalten die Schaffung neuer Ketten in verschiedenen Formen, die ihre Sicherheit getrennt vom Mainnet ableiten, wie z. B. [Sidechains](#sidechains), [Validiums](#validium) oder [Plasma-Ketten](#plasma). Diese Lösungen kommunizieren mit dem Mainnet, leiten ihre Sicherheit jedoch unterschiedlich ab, um eine Vielzahl von Zielen zu erreichen. -### Layer-2-Skalierung {#layer-2-scaling} +### Ebene-2-Skalierung {#layer-2-scaling} -Diese Kategorie von Offchain-Lösungen bezieht ihre Sicherheit aus dem Ethereum-Mainnet. +Diese Kategorie von Off-Chain-Lösungen leitet ihre Sicherheit vom Mainnet-Ethereum ab. -Layer-2 ist ein Sammelbegriff für Lösungen, die dazu dienen, Ihre Anwendung zu skalieren, indem sie Transaktionen außerhalb des Ethereum Mainnet (Layer-1) abwickeln und gleichzeitig das robuste dezentrale Sicherheitsmodell vom Mainnet nutzen. Die Transaktionsgeschwindigkeit leidet, wenn das Netzwerk ausgelastet ist, was die Benutzererfahrung im Umgang mit bestimmten Arten von dApps verschlechtert. Und wenn die Netzwerk-Aktivitäten steigen, dann steigen auch die Gaspreise, während sich Transaktionsabsender gegenseitig überbieten wollen. Dies kann die Verwendung von Ethereum sehr teuer machen. +Ebene 2 ist ein Sammelbegriff für Lösungen, die entwickelt wurden, um bei der Skalierung Ihrer Anwendung zu helfen, indem Transaktionen außerhalb des Ethereum-Mainnets (Ebene 1) abgewickelt werden, während gleichzeitig das robuste dezentralisierte Sicherheitsmodell des Mainnets genutzt wird. Die Transaktionsgeschwindigkeit leidet, wenn das Netzwerk ausgelastet ist, was die Benutzererfahrung für bestimmte Arten von Dapps verschlechtert. Und wenn das Netzwerk stärker ausgelastet ist, steigen die Gaspreise, da die Absender von Transaktionen versuchen, sich gegenseitig zu überbieten. Dies kann die Nutzung von Ethereum sehr teuer machen. -Die meisten Layer-2-Lösungen basieren auf einem Server oder einer Gruppe von Servern, von denen jeder als Knotenpunkt, Validator, Operator, Sequenzer, Blockproduzent oder ähnlich bezeichnet wird. Je nach Implementierung können diese Layer-2-Knotenpunkte von Einzelpersonen, Unternehmen oder Einrichtungen, die sie nutzen, oder von einem Drittanbieter oder von einer großen Gruppe von Einzelpersonen (ähnlich wie beim Mainnet) betrieben werden. Im Allgemeinen werden die Transaktionen an diese Layer-2-Knotenpunkte übermittelt, anstatt direkt an Layer-1 (Mainnet) übermittelt zu werden. Bei einigen Lösungen fasst die Layer-2-Instanz diese dann in Gruppen zusammen, bevor sie sie an Layer 1 anheftet, wonach sie durch Layer 1 gesichert sind und nicht mehr geändert werden können. Die Details, wie dies geschieht, variieren erheblich zwischen verschiedenen Layer-2-Technologien und -Implementierungen. +Die meisten Ebene-2-Lösungen konzentrieren sich auf einen Server oder einen Cluster von Servern, von denen jeder als Blockchain-Knoten, Validator, Betreiber, Sequencer, Blockproduzent oder mit einem ähnlichen Begriff bezeichnet werden kann. Abhängig von der Implementierung können diese Ebene-2-Blockchain-Knoten von den Einzelpersonen, Unternehmen oder Entitäten betrieben werden, die sie nutzen, oder von einem Drittanbieter oder von einer großen Gruppe von Einzelpersonen (ähnlich wie beim Mainnet). Im Allgemeinen werden Transaktionen an diese Ebene-2-Blockchain-Knoten übermittelt, anstatt direkt an Ebene 1 (Mainnet) übermittelt zu werden. Bei einigen Lösungen bündelt die Ebene-2-Instanz sie dann in Gruppen, bevor sie in Ebene 1 verankert werden, wonach sie durch Ebene 1 gesichert sind und nicht mehr geändert werden können. Die Details, wie dies geschieht, variieren erheblich zwischen verschiedenen Ebene-2-Technologien und -Implementierungen. -Eine bestimmte Layer-2-Instanz kann offen sein und von vielen Anwendungen gemeinsam genutzt werden, oder sie kann von einem Projekt bereitgestellt werden und nur dessen Anwendung unterstützen. +Eine spezifische Ebene-2-Instanz kann offen sein und von vielen Anwendungen gemeinsam genutzt werden, oder sie kann von einem Projekt bereitgestellt werden und ausschließlich der Unterstützung ihrer eigenen Anwendung dienen. -#### Warum wird Layer-2 gebraucht? {#why-is-layer-2-needed} +#### Warum wird Ebene 2 benötigt? {#why-is-layer-2-needed} -- Mehr Transaktionen pro Sekunde verbessern die Benutzererfahrung erheblich und reduzieren die Netzwerküberlastung auf dem Ethereum Mainnet. -- Transaktionen werden in einer einzigen Transaktion an das Ethereum-Mainnet gebündelt, was die Gasgebühren für die Nutzer reduziert und Ethereum für Menschen überall integrativer und zugänglicher macht. -- Keine Aktualisierungen der Skalierbarkeit sollten auf Kosten der Dezentralisierung oder Sicherheit gehen - Layer-2 baut auf Ethereum auf. -- Es gibt anwendungsspezifische Layer-2-Netzwerke, die ihre eigenen Vorteile im Umgang mit Assets im großen Maßstab mit sich bringen. +- Erhöhte Transaktionen pro Sekunde verbessern die Benutzererfahrung erheblich und reduzieren die Netzwerküberlastung im Mainnet-Ethereum. +- Transaktionen werden zu einer einzigen Transaktion an das Mainnet-Ethereum zusammengefasst (Rollups), was die Gasgebühren für Benutzer senkt und Ethereum für Menschen überall inklusiver und zugänglicher macht. +- Jegliche Aktualisierungen der Skalierbarkeit sollten nicht auf Kosten der Dezentralisierung oder Sicherheit gehen – Ebene 2 baut auf Ethereum auf. +- Es gibt anwendungsspezifische Ebene-2-Netzwerke, die ihre eigenen Effizienzen mitbringen, wenn sie mit Vermögenswerten in großem Maßstab arbeiten. -[Mehr über Layer 2](/layer-2/). +[Mehr zu Ebene 2](/layer-2/). #### Rollups {#rollups} -Rollups führen Transaktionen außerhalb von Layer-1 aus, und die Daten werden dann an Layer-1 weitergeleitet, wo ein Konsens erzielt wird. Da die Transaktionsdaten in Layer-1-Blöcken enthalten sind, können Rollups durch die eigene Ethereum-Sicherheit gesichert werden. +Rollups führen die Transaktionsausführung außerhalb von Ebene 1 durch, und dann werden die Daten auf Ebene 1 veröffentlicht, wo ein Konsens erzielt wird. Da Transaktionsdaten in Ebene-1-Blöcke aufgenommen werden, ermöglicht dies, dass Rollups durch die native Ethereum-Sicherheit gesichert werden. -Es gibt zwei Arten von Rollups mit verschiedenen Sicherheitsmodellen: +Es gibt zwei Arten von Rollups mit unterschiedlichen Sicherheitsmodellen: -- **Optimistic Rollups**: Gehen standardmäßig davon aus, dass Transaktionen gültig sind, und führen Berechnungen nur im Falle einer Anfechtung mittels eines [**Betrugsbeweises**](/glossary/#fraud-proof) durch. [Mehr über Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/). -- **Zero-Knowledge-Rollups**: Führen Berechnungen offchain durch und übermitteln einen [**Gültigkeitsnachweis**](/glossary/#validity-proof) an die Chain. [Mehr über Zero-Knowledge-Rollups](/developers/docs/scaling/zk-rollups/). +- **Optimistic Rollups**: Gehen standardmäßig davon aus, dass Transaktionen gültig sind, und führen Berechnungen über einen [**Betrugsnachweis**](/glossary/#fraud-proof) nur im Falle einer Anfechtung durch. [Mehr zu Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/). +- **Zero-Knowledge Rollups**: Führen Berechnungen Off-Chain durch und übermitteln einen [**Validitätsnachweis**](/glossary/#validity-proof) an die Blockchain. [Mehr zu Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/). #### State Channels {#channels} -State Channels nutzen Multisig-Verträge, um Teilnehmern schnelle und freie Transaktionen offchain zu ermöglichen, bevor sie die Endgültigkeit mit dem Mainnet abwickeln. Dadurch werden Netzwerküberlastungen, Gebühren und Verzögerungen auf ein Minimum reduziert. Die beiden Arten von Kanälen sind derzeit Zustandskanäle und Zahlungskanäle. +State Channels nutzen Verträge mit Mehrfachsignatur, um es den Teilnehmern zu ermöglichen, schnell und frei Off-Chain zu transagieren und dann die Finalität mit dem Mainnet abzurechnen. Dies minimiert Netzwerküberlastungen, Gebühren und Verzögerungen. Die beiden Arten von Kanälen sind derzeit State Channels und Payment Channels. Erfahren Sie mehr über [State Channels](/developers/docs/scaling/state-channels/). ### Sidechains {#sidechains} -Eine Sidechain ist eine unabhängige, EVM-kompatible Blockchain, die parallel zum Mainnet läuft. Diese sind über zweiseitige kettenübergreifende Brücken mit Ethereum kompatibel und laufen nach ihren eigenen gewählten Konsensregeln und Blockparametern. +Eine Sidechain ist eine unabhängige EVM-kompatible Blockchain, die parallel zum Mainnet läuft. Diese sind über kettenübergreifende Brücken in beide Richtungen mit Ethereum kompatibel und laufen unter ihren eigenen gewählten Regeln für Konsens und Blockparameter. Erfahren Sie mehr über [Sidechains](/developers/docs/scaling/sidechains/). ### Plasma {#plasma} -Eine Plasma-Chain ist eine separate Blockchain, die an der Ethereum-Hauptchain verankert ist und Betrugsbeweise (wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/)) verwendet, um Streitigkeiten beizulegen. +Eine Plasma-Kette ist eine separate Blockchain, die an der Haupt-Ethereum-Kette verankert ist und Betrugsnachweise (wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/)) verwendet, um Streitigkeiten zu schlichten. Erfahren Sie mehr über [Plasma](/developers/docs/scaling/plasma/). ### Validium {#validium} -Eine Validium-Kette nutzt Gültigkeitsnachweise wie Zero-Knowledge-Rollups, aber Daten werden nicht auf der Main Layer-1 Ethereum Chain gespeichert. Dies kann zu 10.000 Transaktionen pro Sekunde pro Validium-Kette führen, zudem können mehrere Ketten parallel laufen. +Eine Validium-Kette verwendet Validitätsnachweise wie Zero-Knowledge Rollups, aber die Daten werden nicht auf der Haupt-Ebene-1-Ethereum-Kette gespeichert. Dies kann zu 10.000 Transaktionen pro Sekunde pro Validium-Kette führen, und mehrere Ketten können parallel betrieben werden. Erfahren Sie mehr über [Validium](/developers/docs/scaling/validium/). ## Warum werden so viele Skalierungslösungen benötigt? {#why-do-we-need-these} -- Mehrere Lösungen können helfen, die allgemeine Überlastung eines Teils des Netzwerks zu reduzieren und einzelne Fehlerquellen zu vermeiden. -- Das Ganze ist größer als die Summe seiner Teile. Es können verschiedene Lösungen existieren und miteinander harmonieren, was einen exponentiellen Effekt auf die künftige Transaktionsgeschwindigkeit und den Durchsatz ermöglicht. -- Nicht alle Lösungen erfordern die direkte Nutzung des Ethereum-Konsens-Algorithmus, und Alternativen können Vorteile bieten, die sonst nur schwer zu erreichen wären. +- Mehrere Lösungen können dazu beitragen, die allgemeine Überlastung in jedem Teil des Netzwerks zu verringern und auch Single Points of Failure zu verhindern. +- Das Ganze ist mehr als die Summe seiner Teile. Verschiedene Lösungen können existieren und harmonisch zusammenarbeiten, was einen exponentiellen Effekt auf die zukünftige Transaktionsgeschwindigkeit und den Durchsatz ermöglicht. +- Nicht alle Lösungen erfordern die direkte Nutzung des Ethereum-Konsensalgorithmus, und Alternativen können Vorteile bieten, die sonst schwer zu erreichen wären. -## Eher der visuelle Lernende? {#visual-learner} +## Lernen Sie besser visuell? {#visual-learner} -_Beachten Sie, dass die Erklärung im Video den Begriff "Layer 2" verwendet, um alle Offchain-Skalierungslösungen zu beschreiben, während wir "Layer 2" als eine Offchain-Lösung differenzieren, die ihre Sicherheit durch das Layer-1-Mainnet-Konsensverfahren erhält._ +_Beachten Sie, dass die Erklärung im Video den Begriff „Ebene 2“ verwendet, um sich auf alle Off-Chain-Skalierungslösungen zu beziehen, während wir „Ebene 2“ als eine Off-Chain-Lösung differenzieren, die ihre Sicherheit durch den Ebene-1-Mainnet-Konsens ableitet._ -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Eine Rollup-zentrierte Ethereum-Roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ -- [Aktuelle Analysen zu Layer-2-Skalierungslösungen für Ethereum](https://www.l2beat.com/) -- [Bewertung von Ethereum-Layer-2-Skalierungslösungen: Ein Vergleichsrahmen](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Ein unvollständiger Leitfaden für Rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) -- [Ethereum-betriebene ZK-Rollups: Weltklasse](https://hackmd.io/@canti/rkUT0BD8K) -- [Optimistic Rollups vs. ZK-Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Warum Rollups + Data Shards die einzig nachhaltige Lösung für hohe Skalierbarkeit sind](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [Welche Art von Layer-3s sind sinnvoll?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) +- [A rollup-centric Ethereum roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ +- [Up-to-date analytics on Layer 2 scaling solutions for Ethereum](https://www.l2beat.com/) +- [Evaluating Ethereum layer 2 Scaling Solutions: A Comparison Framework](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) +- [An Incomplete Guide to Rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) +- [Ethereum-powered ZK-Rollups: World Beaters](https://hackmd.io/@canti/rkUT0BD8K) +- [Optimistic Rollups vs ZK Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) +- [Why rollups + data shards are the only sustainable solution for high scalability](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) +- [What kind of Layer 3s make sense?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) - [Data Availability Or: How Rollups Learned To Stop Worrying And Love Ethereum](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) -- [Der praktische Leitfaden für Ethereum-Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [The Practical Guide to Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ + +## Tutorials: Erstellen Sie skalierbare Ebene 2 auf Ethereum {#tutorials} + +- [All you can cache](/developers/tutorials/all-you-can-cache/) _– Wie man einen Caching-Vertrag erstellt und verwendet, um Calldata-Kosten bei Rollups zu reduzieren._ +- [Short ABIs for Calldata Optimization](/developers/tutorials/short-abi/) _– Wie man kürzere ABIs verwendet, um Calldata-Kosten für Ebene-2-Transaktionen zu reduzieren._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md index 058468f9621..b67216f8f26 100644 --- a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md @@ -1,265 +1,269 @@ --- -title: Optimistische Rollups (Optimistic Rollups) -description: "Eine Einführung in optimistische Rollups – eine Skalierungslösung, die von der Ethereum-Community verwendet wird." +title: Optimistic Rollups +description: "Eine Einführung in Optimistic Rollups – eine Skalierungslösung, die von der Ethereum-Community verwendet wird." lang: de --- -Optimistic Rollups sind Layer-2-Protokolle (L2-Protokolle), die den Durchsatz des Ethereum Base Layers erhöhen sollen. Sie reduzieren den Rechenaufwand in der Ethereum-Hauptkette, indem sie Transaktionen außerhalb der Kette verarbeiten, und bieten so erhebliche Verbesserungen der Verarbeitungsgeschwindigkeit. Im Gegensatz zu anderen Skalierungslösungen, wie zum Beispiel [Sidechains](/developers/docs/scaling/sidechains/), leiten Optimistic Rollups ihre Sicherheit vom Mainnet ab, indem sie Transaktionsergebnisse onchain veröffentlichen, oder [Plasmaketten](/developers/docs/scaling/plasma/), die ebenfalls Transaktionen auf Ethereum mit Betrugsnachweisen verifizieren, aber Transaktionsdaten an anderer Stelle speichern. +Optimistic Rollups sind Protokolle der Ebene 2 (L2), die entwickelt wurden, um den Durchsatz der Ethereum-Basisebene zu erweitern. Sie reduzieren die Rechenleistung auf der Haupt-[Ethereum](/)-Blockchain, indem sie Transaktionen Off-Chain verarbeiten, was erhebliche Verbesserungen der Verarbeitungsgeschwindigkeiten bietet. Im Gegensatz zu anderen Skalierungslösungen wie [Sidechains](/developers/docs/scaling/sidechains/) leiten Optimistic Rollups ihre Sicherheit vom Mainnet ab, indem sie Transaktionsergebnisse auf der Blockchain veröffentlichen, oder [Plasma-Chains](/developers/docs/scaling/plasma/), die ebenfalls Transaktionen auf Ethereum mit Betrugsnachweisen verifizieren, aber Transaktionsdaten woanders speichern. -Da die Berechnung der langsame und teure Teil der Nutzung von Ethereum ist, können Optimistic Rollups eine bis zu 10-100-fache Verbesserung der Skalierbarkeit bieten. Optimistic Rollups schreiben Transaktionen auch als `calldata` oder in [Blobs](/roadmap/danksharding/) nach Ethereum und reduzieren so die Gaskosten für die Nutzer. +Da die Berechnung der langsame und teure Teil der Nutzung von Ethereum ist, können Optimistic Rollups eine bis zu 10- bis 100-fache Verbesserung der Skalierung bieten. Optimistic Rollups schreiben Transaktionen auch als `calldata` oder in [Blobs](/roadmap/danksharding/) auf Ethereum, was die Gaskosten für Benutzer senkt. ## Voraussetzungen {#prerequisites} -Sie sollten unsere Seiten zu [Skalierungslösungen für Ethereum](/developers/docs/scaling/) und [Layer 2](/layer-2/) gelesen und verstanden haben. +Sie sollten unsere Seiten über [Ethereum-Skalierung](/developers/docs/scaling/) und [Ebene 2](/layer-2/) gelesen und verstanden haben. ## Was ist ein Optimistic Rollup? {#what-is-an-optimistic-rollup} -Ein optimistischer Rollup ist ein Ansatz zur Skalierung von Ethereum, bei dem Berechnungen und Statusspeicherung außerhalb der Kette verschoben werden. Optimistic Rollups führen Transaktionen außerhalb von Ethereum aus, aber veröffentlichen Transaktionsdaten im Mainnet als `calldata` oder in [Blobs](/roadmap/danksharding/). +Ein Optimistic Rollup ist ein Ansatz zur Skalierung von Ethereum, der die Verlagerung von Berechnungen und Zustandsspeicherung Off-Chain beinhaltet. Optimistic Rollups führen Transaktionen außerhalb von Ethereum aus, veröffentlichen aber Transaktionsdaten als `calldata` oder in [Blobs](/roadmap/danksharding/) im Mainnet. -Optimistische Rollup Operatoren bündeln mehrere Offchain Transaktionen in großen Stapeln, bevor sie an Ethereum übermittelt werden. Dieser Ansatz ermöglicht es, die Fixkosten auf mehrere Transaktionen in jedem Batch zu verteilen und so die Gebühren für die Endnutzer zu senken. Optimistic Rollups verwenden auch Komprimierungstechniken, um die Menge der auf Ethereum veröffentlichten Daten zu reduzieren. +Betreiber von Optimistic Rollups bündeln mehrere Off-Chain-Transaktionen in großen Stapeln (Batches), bevor sie diese an Ethereum übermitteln. Dieser Ansatz ermöglicht es, Fixkosten auf mehrere Transaktionen in jedem Stapel zu verteilen, was die Gebühren für Endbenutzer senkt. Optimistic Rollups verwenden auch Komprimierungstechniken, um die Datenmenge zu reduzieren, die auf Ethereum veröffentlicht wird. -Optimistische Rollups gelten als „optimistisch“, da sie davon ausgehen, dass Offchain Transaktionen gültig sind, und keine Gültigkeitsnachweise für Offchain Transaktionsstapel veröffentlichen. Dies unterscheidet Optimistic Rollups von [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups), die kryptografische [Gültigkeitsnachweise](/glossary/#validity-proof) für Offchain-Transaktionen veröffentlichen. +Optimistic Rollups gelten als „optimistisch“, da sie davon ausgehen, dass Off-Chain-Transaktionen gültig sind, und keine Validitätsnachweise für Transaktionsstapel veröffentlichen, die auf der Blockchain gepostet werden. Dies unterscheidet Optimistic Rollups von [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups), die kryptografische [Validitätsnachweise](/glossary/#validity-proof) für Off-Chain-Transaktionen veröffentlichen. -Optimistische Rollups basieren stattdessen auf einem Betrugserkennungssystem, um Fälle zu erkennen, in denen Transaktionen nicht korrekt berechnet werden. Nachdem ein Rollup-Batch auf Ethereum eingereicht wurde, gibt es ein Zeitfenster (eine sogenannte Anfechtungsfrist), in dem jeder die Ergebnisse einer Rollup-Transaktion anfechten kann, indem er einen [Betrugsnachweis](/glossary/#fraud-proof) berechnet. +Optimistic Rollups verlassen sich stattdessen auf ein Betrugsnachweis-Schema, um Fälle zu erkennen, in denen Transaktionen nicht korrekt berechnet wurden. Nachdem ein Rollup-Stapel auf Ethereum übermittelt wurde, gibt es ein Zeitfenster (die sogenannte Anfechtungsfrist), in dem jeder die Ergebnisse einer Rollup-Transaktion anfechten kann, indem er einen [Betrugsnachweis](/glossary/#fraud-proof) berechnet. -Wenn der Betrugsnachweis erfolgreich ist, führt das Rollup Protokoll die Transaktion(en) erneut aus und aktualisiert den Status des Rollups entsprechend. Die andere Auswirkung eines erfolgreichen Betrugsnachweises besteht darin, dass der Sequenzer, der für die Aufnahme der falsch ausgeführten Transaktion in einen Block verantwortlich ist, eine Strafe erhält. +Wenn der Betrugsnachweis erfolgreich ist, führt das Rollup-Protokoll die Transaktion(en) erneut aus und aktualisiert den Zustand des Rollups entsprechend. Der andere Effekt eines erfolgreichen Betrugsnachweises ist, dass der Sequencer, der für die Aufnahme der falsch ausgeführten Transaktion in einen Block verantwortlich ist, eine Strafe erhält. -Wenn der Rollup Batch nach Ablauf der Einspruchsfrist unbestritten bleibt (d. h. alle Transaktionen korrekt ausgeführt werden), gilt er als gültig und wird auf Ethereum akzeptiert. Andere können weiterhin auf einem unbestätigten Rollup Block aufbauen, allerdings mit einer Einschränkung: Transaktionsergebnisse werden rückgängig gemacht, wenn sie auf einer zuvor veröffentlichten, falsch ausgeführten Transaktion basieren. +Wenn der Rollup-Stapel nach Ablauf der Anfechtungsfrist unangefochten bleibt (d. h. alle Transaktionen wurden korrekt ausgeführt), gilt er als gültig und wird auf Ethereum akzeptiert. Andere können weiterhin auf einem unbestätigten Rollup-Block aufbauen, jedoch mit einem Vorbehalt: Transaktionsergebnisse werden rückgängig gemacht, wenn sie auf einer zuvor veröffentlichten, falsch ausgeführten Transaktion basieren. -## Wie interagieren optimistische Rollups mit Ethereum? Optimistic Rollups und Ethereum {#optimistic-rollups-and-Ethereum} +## Wie interagieren Optimistic Rollups mit Ethereum? {#optimistic-rollups-and-Ethereum} -Optimistic Rollups sind [Offchain-Skalierungslösungen](/developers/docs/scaling/#offchain-scaling), die für den Betrieb auf Ethereum ausgelegt sind. Jeder optimistische Rollup wird durch eine Reihe von Smart Contracts verwaltet, die im Ethereum-Netzwerk bereitgestellt werden. Optimistische Rollups verarbeiten Transaktionen außerhalb der Ethereum-Hauptkette, buchen Offchain Transaktionen jedoch (stapelweise) in einen Offchain Rollup Vertrag. Wie die Ethereum-Blockchain ist dieser Transaktionsdatensatz unveränderlich und bildet die „optimistische Rollup Kette“. +Optimistic Rollups sind [Off-Chain-Skalierungslösungen](/developers/docs/scaling/#offchain-scaling), die entwickelt wurden, um auf Ethereum zu operieren. Jedes Optimistic Rollup wird von einer Reihe von Smart Contracts verwaltet, die im Ethereum-Netzwerk bereitgestellt werden. Optimistic Rollups verarbeiten Transaktionen außerhalb der Haupt-Ethereum-Blockchain, veröffentlichen jedoch Off-Chain-Transaktionen (in Stapeln) an einen Rollup-Vertrag auf der Blockchain. Wie die Ethereum-Blockchain ist dieser Transaktionsdatensatz unveränderlich und bildet die „Optimistic Rollup-Chain“. -Die Architektur eines optimistischen Rollups umfasst die folgenden Teile: +Die Architektur eines Optimistic Rollups umfasst die folgenden Teile: -**Onchain-Verträge**: Der Betrieb des Optimistic Rollups wird durch Smart Contracts gesteuert, die auf Ethereum laufen. Dazu gehören Verträge, die Rollup Blöcke speichern, Statusaktualisierungen des Rollups überwachen und Benutzereinzahlungen verfolgen. In diesem Sinne dient Ethereum als Basisschicht oder „Schicht 1“ für optimistische Rollups. +**Verträge auf der Blockchain**: Der Betrieb des Optimistic Rollups wird durch Smart Contracts gesteuert, die auf Ethereum ausgeführt werden. Dazu gehören Verträge, die Rollup-Blöcke speichern, Zustandsaktualisierungen auf dem Rollup überwachen und Benutzereinzahlungen verfolgen. In diesem Sinne dient Ethereum als Basisebene oder „Ebene 1“ für Optimistic Rollups. -**Offchain Virtual Machine (VM)**: Obwohl die Verträge, die das Optimistic-Rollup-Protokoll verwalten, auf Ethereum laufen, führt das Rollup-Protokoll Berechnungen und Zustandsspeicherung auf einer anderen virtuellen Maschine durch, die von der [Ethereum Virtual Machine](/developers/docs/evm/) getrennt ist. Die Offchain VM ist der Ort, an dem Anwendungen ausgeführt werden und Statusänderungen ausgeführt werden. Sie dient als obere Schicht oder „Schicht 2“ für ein optimistisches Rollup. +**Off-Chain Virtual Machine (VM)**: Obwohl die Verträge, die das Optimistic Rollup-Protokoll verwalten, auf Ethereum ausgeführt werden, führt das Rollup-Protokoll Berechnungen und Zustandsspeicherung auf einer anderen virtuellen Maschine durch, die von der [Ethereum Virtual Machine](/developers/docs/evm/) getrennt ist. Die Off-Chain-VM ist der Ort, an dem Anwendungen leben und Zustandsänderungen ausgeführt werden; sie dient als obere Ebene oder „Ebene 2“ für ein Optimistic Rollup. -Da optimistische Rollups zum Ausführen von Programmen konzipiert sind, die entweder für die EVM geschrieben oder kompiliert wurden, enthält die Offchain VM viele EVM Designspezifikationen. Darüber hinaus ermöglichen onchain berechnete Betrugsnachweise dem Ethereum-Netzwerk, die Gültigkeit von Zustandsänderungen durchzusetzen, die in der Offchain-VM berechnet werden. +Da Optimistic Rollups darauf ausgelegt sind, Programme auszuführen, die entweder für die EVM geschrieben oder kompiliert wurden, integriert die Off-Chain-VM viele EVM-Designspezifikationen. Zusätzlich ermöglichen auf der Blockchain berechnete Betrugsnachweise dem Ethereum-Netzwerk, die Gültigkeit von Zustandsänderungen durchzusetzen, die in der Off-Chain-VM berechnet wurden. -Optimistische Rollups werden als „hybride Skalierungslösungen“ bezeichnet, da sie zwar als separate Protokolle existieren, ihre Sicherheitseigenschaften jedoch von Ethereum abgeleitet sind. Ethereum garantiert unter anderem die Richtigkeit der Offchain Berechnung eines Rollups und die Verfügbarkeit der der Berechnung zugrunde liegenden Daten. Dies macht Optimistic Rollups sicherer als reine Offchain-Skalierungsprotokolle (z. B. [Sidechains](/developers/docs/scaling/sidechains/)), die sich für die Sicherheit nicht auf Ethereum verlassen. +Optimistic Rollups werden als „hybride Skalierungslösungen“ beschrieben, da sie zwar als separate Protokolle existieren, ihre Sicherheitseigenschaften jedoch von Ethereum abgeleitet sind. Unter anderem garantiert Ethereum die Korrektheit der Off-Chain-Berechnung eines Rollups und die Verfügbarkeit der Daten hinter der Berechnung. Dies macht Optimistic Rollups sicherer als reine Off-Chain-Skalierungsprotokolle (z. B. [Sidechains](/developers/docs/scaling/sidechains/)), die sich für die Sicherheit nicht auf Ethereum verlassen. -Optimistische Rollups basieren für Folgendes auf dem Hauptprotokoll von Ethereum: +Optimistic Rollups verlassen sich für Folgendes auf das Haupt-Ethereum-Protokoll: ### Datenverfügbarkeit {#data-availability} -Wie bereits erwähnt, veröffentlichen Optimistic Rollups Transaktionsdaten als `calldata` oder in [Blobs](/roadmap/danksharding/) auf Ethereum. Da die Ausführung der Rollup Kette auf übermittelten Transaktionen basiert, kann jeder diese Informationen – verankert in der Basisschicht von Ethereum – verwenden, um den Status des Rollups auszuführen und die Richtigkeit der Statusübergänge zu überprüfen. +Wie bereits erwähnt, veröffentlichen Optimistic Rollups Transaktionsdaten als `calldata` oder [Blobs](/roadmap/danksharding/) auf Ethereum. Da die Ausführung der Rollup-Chain auf übermittelten Transaktionen basiert, kann jeder diese Informationen – verankert auf der Basisebene von Ethereum – verwenden, um den Zustand des Rollups auszuführen und die Korrektheit von Zustandsübergängen zu überprüfen. -[Datenverfügbarkeit](/developers/docs/data-availability/) ist von entscheidender Bedeutung, da Herausforderer ohne Zugriff auf Zustandsdaten keine Betrugsnachweise erstellen können, um ungültige Rollup-Operationen anzufechten. Da Ethereum Datenverfügbarkeit bietet, verringert sich das Risiko, dass Rollup Betreiber mit böswilligen Handlungen (z. B. dem Einreichen ungültiger Blöcke) davonkommen. +[Datenverfügbarkeit](/developers/docs/data-availability/) ist von entscheidender Bedeutung, da Herausforderer ohne Zugriff auf Zustandsdaten keine Betrugsnachweise erstellen können, um ungültige Rollup-Operationen anzufechten. Da Ethereum die Datenverfügbarkeit sicherstellt, wird das Risiko verringert, dass Rollup-Betreiber mit böswilligen Handlungen (z. B. dem Übermitteln ungültiger Blöcke) davonkommen. ### Zensurresistenz {#censorship-resistance} -Optimistische Rollups verlassen sich auch auf Ethereum, um Zensur zu widerstehen. Bei einem optimistischen Rollup ist eine zentrale Einheit (der Betreiber) für die Verarbeitung von Transaktionen und die Übermittlung von Rollup Blöcken an Ethereum verantwortlich. Dies hat einige Auswirkungen: +Optimistic Rollups verlassen sich auch auf Ethereum für die Zensurresistenz. In einem Optimistic Rollup ist eine zentralisierte Entität (der Betreiber) für die Verarbeitung von Transaktionen und die Übermittlung von Rollup-Blöcken an Ethereum verantwortlich. Dies hat einige Auswirkungen: -- Rollup Betreiber können Benutzer zensieren, indem sie vollständig offline gehen oder sich weigern, Blöcke zu erstellen, die bestimmte Transaktionen enthalten. +- Rollup-Betreiber können Benutzer zensieren, indem sie komplett offline gehen oder sich weigern, Blöcke zu produzieren, die bestimmte Transaktionen enthalten. -- Rollup Betreiber können Benutzer daran hindern, im Rollup Vertrag hinterlegte Gelder abzuheben, indem sie die für Merkle Eigentumsnachweise erforderlichen Statusdaten zurückhalten. Durch das Zurückhalten von Statusdaten kann außerdem der Status des Rollups vor Benutzern verborgen werden und sie daran gehindert werden, mit dem Rollup zu interagieren. +- Rollup-Betreiber können Benutzer daran hindern, im Rollup-Vertrag eingezahlte Gelder abzuheben, indem sie Zustandsdaten zurückhalten, die für Merkle-Eigentumsnachweise erforderlich sind. Das Zurückhalten von Zustandsdaten kann auch den Zustand des Rollups vor Benutzern verbergen und sie daran hindern, mit dem Rollup zu interagieren. -Optimistische Rollups lösen dieses Problem, indem sie die Betreiber zwingen, Daten zu veröffentlichen, die mit Statusaktualisierungen auf Ethereum verbunden sind. Die Veröffentlichung von Rollup Daten in der Kette bietet folgende Vorteile: +Optimistic Rollups lösen dieses Problem, indem sie Betreiber zwingen, Daten im Zusammenhang mit Zustandsaktualisierungen auf Ethereum zu veröffentlichen. Die Veröffentlichung von Rollup-Daten auf der Blockchain hat folgende Vorteile: -- Wenn ein optimistischer Rollup Operator offline geht oder die Produktion von Transaktionsstapeln einstellt, kann ein anderer Knoten die verfügbaren Daten verwenden, um den letzten Zustand des Rollups zu reproduzieren und die Blockproduktion fortzusetzen. +- Wenn ein Betreiber eines Optimistic Rollups offline geht oder aufhört, Transaktionsstapel zu produzieren, kann ein anderer Blockchain-Knoten verfügbare Daten verwenden, um den letzten Zustand des Rollups zu reproduzieren und die Blockproduktion fortzusetzen. -- Benutzer können Transaktionsdaten verwenden, um Merkle Beweise zu erstellen, die den Besitz von Geldern belegen, und ihre Vermögenswerte aus der Zusammenfassung abheben. +- Benutzer können Transaktionsdaten verwenden, um Merkle-Nachweise zu erstellen, die das Eigentum an Geldern belegen, und ihre Vermögenswerte aus dem Rollup abheben. -- Benutzer können Transaktionsdaten verwenden, um Merkle Beweise zu erstellen, die den Besitz von Geldern belegen, und ihre Vermögenswerte aus der Zusammenfassung abheben. +- Benutzer können ihre Transaktionen auch auf L1 anstatt an den Sequencer übermitteln. In diesem Fall muss der Sequencer die Transaktion innerhalb eines bestimmten Zeitlimits einschließen, um weiterhin gültige Blöcke zu produzieren. -### Abwicklung {#settlement} +### Abwicklung (Settlement) {#settlement} -Eine weitere Rolle, die Ethereum im Zusammenhang mit optimistischen Rollups spielt, ist die einer Abwicklungsschicht. Eine Abwicklungsebene verankert das gesamte Blockchain-Ökosystem, sorgt für Sicherheit und bietet objektive Endgültigkeit, wenn auf einer anderen Kette ein Streitfall auftritt (in diesem Fall optimistische Rollups), der ein Schiedsverfahren erfordert. +Eine weitere Rolle, die Ethereum im Kontext von Optimistic Rollups spielt, ist die einer Abwicklungsebene (Settlement Layer). Eine Abwicklungsebene verankert das gesamte Blockchain-Ökosystem, stellt Sicherheit her und bietet objektive Finalität, falls auf einer anderen Chain (in diesem Fall Optimistic Rollups) ein Streitfall auftritt, der eine Schlichtung erfordert. -Das Ethereum Mainnet bietet einen Hub für optimistische Rollups, um Betrugsnachweise zu überprüfen und Streitigkeiten beizulegen. Darüber hinaus sind auf dem Rollup durchgeführte Transaktionen erst _nachdem_ der Rollup-Block auf Ethereum akzeptiert wurde, endgültig. Sobald eine Rollup Transaktion in der Basisschicht von Ethereum festgeschrieben ist, kann sie nicht mehr zurückgesetzt werden (außer im höchst unwahrscheinlichen Fall einer Kettenneuorganisation). +Das Ethereum-Mainnet bietet einen Knotenpunkt für Optimistic Rollups, um Betrugsnachweise zu verifizieren und Streitigkeiten beizulegen. Darüber hinaus sind Transaktionen, die auf dem Rollup durchgeführt werden, erst dann endgültig, _nachdem_ der Rollup-Block auf Ethereum akzeptiert wurde. Sobald eine Rollup-Transaktion auf der Basisebene von Ethereum festgeschrieben ist, kann sie nicht mehr rückgängig gemacht werden (außer im höchst unwahrscheinlichen Fall einer Chain-Reorganisation). -## Wie funktionieren optimistische Rollups? {#how-optimistic-rollups-work} +## Wie funktionieren Optimistic Rollups? {#how-optimistic-rollups-work} ### Transaktionsausführung und -aggregation {#transaction-execution-and-aggregation} -Benutzer übermitteln Transaktionen an „Operatoren“, bei denen es sich um Knoten handelt, die für die Verarbeitung von Transaktionen im optimistischen Rollup verantwortlich sind. Der Betreiber, auch als „Validator“ oder „Aggregator“ bezeichnet, aggregiert Transaktionen, komprimiert die zugrunde liegenden Daten und veröffentlicht den Block auf Ethereum. +Benutzer übermitteln Transaktionen an „Betreiber“, das sind Blockchain-Knoten, die für die Verarbeitung von Transaktionen auf dem Optimistic Rollup verantwortlich sind. Auch als „Validator“ oder „Aggregator“ bekannt, aggregiert der Betreiber Transaktionen, komprimiert die zugrunde liegenden Daten und veröffentlicht den Block auf Ethereum. -Obwohl jeder ein Validator werden kann, müssen die Validatoren von Optimistic Rollups eine Kaution hinterlegen, bevor sie Blöcke produzieren, ähnlich wie bei einem [Proof-of-Stake-System](/developers/docs/consensus-mechanisms/pos/). Diese Bindung kann gekürzt werden, wenn der Prüfer einen ungültigen Block postet oder auf einem alten, aber ungültigen Block aufbaut (auch wenn sein Block gültig ist). Auf diese Weise nutzen optimistische Rollups kryptoökonomische Anreize, um sicherzustellen, dass die Validierer ehrlich handeln. +Obwohl jeder ein Validator werden kann, müssen Validatoren von Optimistic Rollups eine Kaution hinterlegen, bevor sie Blöcke produzieren, ähnlich wie bei einem [Proof-of-Stake-System](/developers/docs/consensus-mechanisms/pos/). Diese Kaution kann durch Slashing gekürzt werden, wenn der Validator einen ungültigen Block postet oder auf einem alten, aber ungültigen Block aufbaut (selbst wenn sein eigener Block gültig ist). Auf diese Weise nutzen Optimistic Rollups kryptoökonomische Anreize, um sicherzustellen, dass Validatoren ehrlich handeln. -Von anderen Validatoren in der optimistischen Rollup Kette wird erwartet, dass sie die übermittelten Transaktionen mithilfe ihrer Kopie der Rollup Statistik ausführen. Wenn der Endzustand eines Validators vom vorgeschlagenen Zustand des Betreibers abweicht, kann dieser eine Herausforderung starten und einen Betrugsnachweis berechnen. +Von anderen Validatoren auf der Optimistic Rollup-Chain wird erwartet, dass sie die übermittelten Transaktionen mit ihrer Kopie des Rollup-Zustands ausführen. Wenn sich der Endzustand eines Validators von dem vom Betreiber vorgeschlagenen Zustand unterscheidet, kann er eine Anfechtung starten und einen Betrugsnachweis berechnen. -Einige optimistische Rollups verzichten möglicherweise auf ein erlaubnisfreies Validierungs system und verwenden einen einzelnen „Sequenzer“ zur Ausführung der Kette. Wie ein Validator verarbeitet der Sequenzer Transaktionen, erstellt Rollup Blöcke und übermittelt Rollup Transaktionen an die L1-Kette (Ethereum). +Einige Optimistic Rollups verzichten möglicherweise auf ein erlaubnisfreies Validator-System und verwenden einen einzigen „Sequencer“, um die Chain auszuführen. Wie ein Validator verarbeitet der Sequencer Transaktionen, produziert Rollup-Blöcke und übermittelt Rollup-Transaktionen an die L1-Chain (Ethereum). -Der Sequenzer unterscheidet sich von einem normalen Rollup Operator, da er eine größere Kontrolle über die Reihenfolge der Transaktionen hat. Darüber hinaus hat der Sequenzer vorrangigen Zugriff auf die Rollup Kette und ist die einzige Entität, die berechtigt ist, Transaktionen an den Onchain Vertrag zu übermitteln. Transaktionen von Nicht-Sequenzer knoten oder regulären Benutzern werden einfach in einem separaten Posteingang in die Warteschlange gestellt, bis der Sequenzer sie in einen neuen Stapel aufnimmt. +Der Sequencer unterscheidet sich von einem regulären Rollup-Betreiber, da er eine größere Kontrolle über die Reihenfolge der Transaktionen hat. Außerdem hat der Sequencer vorrangigen Zugriff auf die Rollup-Chain und ist die einzige Entität, die berechtigt ist, Transaktionen an den Vertrag auf der Blockchain zu übermitteln. Transaktionen von Nicht-Sequencer-Knoten oder regulären Benutzern werden einfach in einem separaten Posteingang in die Warteschlange gestellt, bis der Sequencer sie in einen neuen Stapel aufnimmt. -#### Einreichen von Rollup-Blöcken bei Ethereum {#submitting-blocks-to-ethereum} +#### Übermittlung von Rollup-Blöcken an Ethereum {#submitting-blocks-to-ethereum} -Wie bereits erwähnt, bündelt der Betreiber eines optimistischen Rollups Offchain Transaktionen in einem Stapel und sendet diesen zur notariellen Beglaubigung an Ethereum. Dieser Prozess beinhaltet das Komprimieren von transaktionsbezogenen Daten und deren Veröffentlichung auf Ethereum als `calldata` oder in Blobs. +Wie bereits erwähnt, bündelt der Betreiber eines Optimistic Rollups Off-Chain-Transaktionen in einem Stapel und sendet ihn zur Beglaubigung an Ethereum. Dieser Prozess beinhaltet die Komprimierung transaktionsbezogener Daten und deren Veröffentlichung auf Ethereum als `calldata` oder in Blobs. -`calldata` ist ein nicht veränderbarer, nicht persistenter Bereich in einem Smart Contract, der sich größtenteils wie der [Speicher](/developers/docs/smart-contracts/anatomy/#memory) verhält. Obwohl `calldata` onchain als Teil der [Verlaufsprotokolle](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) der Blockchain bestehen bleibt, wird es nicht als Teil des Zustands von Ethereum gespeichert. Da `calldata` keinen Teil des Ethereum-Zustands berührt, ist es für die Speicherung von Daten onchain günstiger als der Zustand. +`calldata` ist ein nicht modifizierbarer, nicht persistenter Bereich in einem Smart Contract, der sich größtenteils wie [Speicher (Memory)](/developers/docs/smart-contracts/anatomy/#memory) verhält. Während `calldata` auf der Blockchain als Teil der [Verlaufsprotokolle](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) der Blockchain verbleibt, wird es nicht als Teil des Zustands von Ethereum gespeichert. Da `calldata` keinen Teil des Zustands von Ethereum berührt, ist es günstiger als der Zustand, um Daten auf der Blockchain zu speichern. -Das `calldata`-Schlüsselwort wird auch in Solidity verwendet, um Argumente zur Ausführungszeit an eine Smart-Contract-Funktion zu übergeben. `calldata` identifiziert die Funktion, die während einer Transaktion aufgerufen wird, und enthält die Eingaben für die Funktion in Form einer beliebigen Byte-Sequenz. +Das Schlüsselwort `calldata` wird in Solidity auch verwendet, um Argumente zur Ausführungszeit an eine Smart Contract-Funktion zu übergeben. `calldata` identifiziert die Funktion, die während einer Transaktion aufgerufen wird, und enthält Eingaben für die Funktion in Form einer beliebigen Bytefolge. -Im Kontext von Optimistic Rollups wird `calldata` verwendet, um komprimierte Transaktionsdaten an den Onchain-Vertrag zu senden. Der Rollup Operator fügt einen neuen Stapel hinzu, indem er die erforderliche Funktion im Rollup Vertrag aufruft und die komprimierten Daten als Funktionsargumente übergibt. Die Verwendung von `calldata` reduziert die Nutzergebühren, da die meisten Kosten, die bei Rollups anfallen, durch die Speicherung von Daten onchain entstehen. +Im Kontext von Optimistic Rollups wird `calldata` verwendet, um komprimierte Transaktionsdaten an den Vertrag auf der Blockchain zu senden. Der Rollup-Betreiber fügt einen neuen Stapel hinzu, indem er die erforderliche Funktion im Rollup-Vertrag aufruft und die komprimierten Daten als Funktionsargumente übergibt. Die Verwendung von `calldata` senkt die Benutzergebühren, da die meisten Kosten, die Rollups verursachen, aus der Speicherung von Daten auf der Blockchain resultieren. -Hier ist [ein Beispiel](https://eth.blockscout.com/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) für die Einreichung eines Rollup-Batches, um zu zeigen, wie dieses Konzept funktioniert. Der Sequencer rief die Methode `appendSequencerBatch()` auf und übergab die komprimierten Transaktionsdaten als Eingaben mittels `calldata`. +Hier ist [ein Beispiel](https://eth.blockscout.com/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) für die Übermittlung eines Rollup-Stapels, um zu zeigen, wie dieses Konzept funktioniert. Der Sequencer rief die Methode `appendSequencerBatch()` auf und übergab die komprimierten Transaktionsdaten als Eingaben unter Verwendung von `calldata`. -Einige Rollups verwenden jetzt blobs, um Transaktionsstapel an Ethereum zu senden. +Einige Rollups verwenden nun Blobs, um Transaktionsstapel auf Ethereum zu posten. -Blobs sind nicht modifizierbar und nicht persistent (genau wie `calldata`), werden aber nach ca. 18 Tagen aus dem Verlauf entfernt. Weitere Informationen zu Blobs finden Sie unter [Danksharding](/roadmap/danksharding). +Blobs sind nicht modifizierbar und nicht persistent (genau wie `calldata`), werden aber nach ca. 18 Tagen aus dem Verlauf gelöscht. Weitere Informationen zu Blobs finden Sie unter [Danksharding](/roadmap/danksharding). -### Zustands-Commitments {#state-commitments} +### Zustandsverpflichtungen (State Commitments) {#state-commitments} -Zu jedem Zeitpunkt ist der Zustand des Optimistic Rollups (Konten, Guthaben, Vertragscode usw.) als ein [Merkle Tree](/whitepaper/#merkle-trees) organisiert, der „Zustandsbaum“ genannt wird. Die Wurzel dieses Merkle Baums (Statuswurzel), die auf den neuesten Status des Rollups verweist, wird gehasht und im Rollup Vertrag gespeichert. Jeder Zustandsübergang in der Kette erzeugt einen neuen Rollup Zustand, den ein Operator durch Berechnung einer neuen Zustandswurzel festlegt. +Zu jedem Zeitpunkt ist der Zustand des Optimistic Rollups (Konten, Salden, Vertragscode usw.) als [Merkle-Baum](/whitepaper/#merkle-trees) organisiert, der als „Zustandsbaum“ (State Tree) bezeichnet wird. Die Wurzel dieses Merkle-Baums (State Root), die auf den neuesten Zustand des Rollups verweist, wird gehasht und im Rollup-Vertrag gespeichert. Jeder Zustandsübergang auf der Chain erzeugt einen neuen Rollup-Zustand, zu dem sich ein Betreiber verpflichtet, indem er eine neue State Root berechnet. -Der Betreiber ist verpflichtet, bei der Stapelveröffentlichung sowohl alte als auch neue Statuswurzeln anzugeben. Wenn die alte State Root mit der bestehenden State Root im Offchain Vertrag übereinstimmt, wird letztere verworfen und durch die neue State Root ersetzt. +Der Betreiber ist verpflichtet, beim Posten von Stapeln sowohl alte als auch neue State Roots zu übermitteln. Wenn die alte State Root mit der vorhandenen State Root im Vertrag auf der Blockchain übereinstimmt, wird letztere verworfen und durch die neue State Root ersetzt. -Der Rollup Operator muss außerdem eine Merkle Wurzel für den Transaktionsstapel selbst festlegen. Dies ermöglicht es jedem, die Aufnahme einer Transaktion in den Batch (auf L1) durch Vorlage eines [Merkle-Beweises](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) nachzuweisen. +Der Rollup-Betreiber ist außerdem verpflichtet, eine Merkle-Wurzel für den Transaktionsstapel selbst zu übergeben. Dies ermöglicht es jedem, die Aufnahme einer Transaktion in den Stapel (auf L1) zu beweisen, indem er einen [Merkle-Nachweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) vorlegt. -Zustandsverpflichtungen, insbesondere Zustandswurzeln, sind notwendig, um die Richtigkeit von Zustandsänderungen in einem optimistischen Rollup nachzuweisen. Der Rollup Vertrag akzeptiert neue Statuswurzeln von Operatoren unmittelbar nach ihrer Veröffentlichung, kann jedoch später ungültige Statuswurzeln löschen, um das Rollup wieder in den richtigen Zustand zu versetzen. +Zustandsverpflichtungen, insbesondere State Roots, sind notwendig, um die Korrektheit von Zustandsänderungen in einem Optimistic Rollup zu beweisen. Der Rollup-Vertrag akzeptiert neue State Roots von Betreibern unmittelbar nach deren Veröffentlichung, kann aber später ungültige State Roots löschen, um das Rollup in seinen korrekten Zustand zurückzuversetzen. -### Betrugsnachweisverfahren {#fraud-proving} +### Betrugsnachweise {#fraud-proving} -Wie erläutert, ermöglichen optimistische Rollups jedem, Blöcke zu veröffentlichen, ohne Gültigkeitsnachweise vorlegen zu müssen. Um jedoch sicherzustellen, dass die Kette sicher bleibt, legen optimistische Rollups ein Zeitfenster fest, in dem jeder einen Zustandsübergang anfechten kann. Daher werden Rollup Blöcke als „Behauptungen“ bezeichnet, da jeder ihre Gültigkeit bestreiten kann. +Wie erklärt, ermöglichen Optimistic Rollups jedem, Blöcke zu veröffentlichen, ohne Validitätsnachweise zu erbringen. Um jedoch sicherzustellen, dass die Chain sicher bleibt, legen Optimistic Rollups ein Zeitfenster fest, in dem jeder einen Zustandsübergang anfechten kann. Daher werden Rollup-Blöcke als „Behauptungen“ (Assertions) bezeichnet, da jeder ihre Gültigkeit anfechten kann. -Wenn jemand eine Behauptung bestreitet, leitet das Rollup Protokoll die Betrugsschutzberechnung ein. Jede Art von Betrugsnachweis ist interaktiv – jemand muss eine Behauptung posten, bevor eine andere Person sie anfechten kann. Der Unterschied liegt darin, wie viele Interaktionsrunden erforderlich sind, um den Betrugsnachweis zu berechnen. +Wenn jemand eine Behauptung anficht, initiiert das Rollup-Protokoll die Berechnung des Betrugsnachweises. Jede Art von Betrugsnachweis ist interaktiv – jemand muss eine Behauptung aufstellen, bevor eine andere Person sie anfechten kann. Der Unterschied liegt darin, wie viele Interaktionsrunden erforderlich sind, um den Betrugsnachweis zu berechnen. -Interaktive Einzelrunden-Beweisschemata spielen umstrittene Transaktionen auf L1 erneut ab, um ungültige Behauptungen zu erkennen. Das Rollup Protokoll emuliert die erneute Ausführung der umstrittenen Transaktion auf L1 (Ethereum) mithilfe eines Prüfer Vertrags, wobei die berechnete Statuswurzel bestimmt, wer die Herausforderung gewinnt. Wenn die Behauptung des anfechters über den korrekten Zustand des Rollups zutrifft, wird der Betreiber mit einer Kürzung seiner Kaution bestraft. +Interaktive Nachweisschemata mit einer einzigen Runde spielen angefochtene Transaktionen auf L1 erneut ab, um ungültige Behauptungen zu erkennen. Das Rollup-Protokoll emuliert die erneute Ausführung der angefochtenen Transaktion auf L1 (Ethereum) mithilfe eines Verifizierungsvertrags, wobei die berechnete State Root bestimmt, wer die Anfechtung gewinnt. Wenn die Behauptung des Herausforderers über den korrekten Zustand des Rollups richtig ist, wird der Betreiber bestraft, indem seine Kaution durch Slashing gekürzt wird. -Die erneute Ausführung von Transaktionen auf L1 zur Erkennung von Betrug erfordert jedoch die Veröffentlichung von Statusverpflichtungen für einzelne Transaktionen und erhöht die Daten Rollups, die in der Kette veröffentlicht werden müssen. Auch die Wiederholung von Transaktionen verursacht erhebliche Gaskosten. Aus diesen Gründen wechseln optimistische Rollups zu interaktiven Beweisverfahren mit mehreren Runden, mit denen das gleiche Ziel (d. h. das Erkennen ungültiger Rollup Vorgänge) effizienter erreicht wird. +Die erneute Ausführung von Transaktionen auf L1 zur Erkennung von Betrug erfordert jedoch die Veröffentlichung von Zustandsverpflichtungen für einzelne Transaktionen und erhöht die Datenmenge, die Rollups auf der Blockchain veröffentlichen müssen. Das erneute Abspielen von Transaktionen verursacht zudem erhebliche Gaskosten. Aus diesen Gründen wechseln Optimistic Rollups zu mehrrundigen interaktiven Nachweisen, die dasselbe Ziel (d. h. die Erkennung ungültiger Rollup-Operationen) mit höherer Effizienz erreichen. -#### Interaktives Beweisverfahren mit mehreren Runden {#multi-round-interactive-proving} +#### Mehrrundige interaktive Nachweise {#multi-round-interactive-proving} -Bei der interaktiven Beweisführung über mehrere Runden handelt es sich um ein Hin- und Her-Protokoll zwischen dem behauptet und dem Herausforderer, das von einem L1-Prüfer vertrag überwacht wird, der letztendlich über die lügende Partei entscheidet. Nachdem ein L2-Knoten eine Behauptung angefochten hat, muss der behauptet die umstrittene Behauptung in zwei gleiche Hälften teilen. Jede einzelne Behauptung enthält in diesem Fall genauso viele Berechnungsschritte wie die anderen. +Mehrrundige interaktive Nachweise beinhalten ein Hin-und-Her-Protokoll zwischen dem Behauptenden und dem Herausforderer, das von einem L1-Verifizierungsvertrag überwacht wird, der letztendlich entscheidet, welche Partei lügt. Nachdem ein L2-Knoten eine Behauptung angefochten hat, muss der Behauptende die umstrittene Behauptung in zwei gleiche Hälften teilen. Jede einzelne Behauptung in diesem Fall enthält genauso viele Berechnungsschritte wie die andere. -Der Herausforderer wählt dann aus, welche Behauptung er anfechten möchte. Der Teilungsprozess (ein sogenanntes „Bisektionsprotokoll“) wird fortgesetzt, bis beide Parteien eine Behauptung über einen _einzigen_ Ausführungsschritt anfechten. An diesem Punkt wird der L1-Vertrag den Streit beilegen, indem er die Anweisung (und ihr Ergebnis) auswertet, um die betrügerische Partei zu fassen. +Der Herausforderer wählt dann aus, welche Behauptung er anfechten möchte. Der Teilungsprozess (als „Bisektionsprotokoll“ bezeichnet) wird fortgesetzt, bis beide Parteien eine Behauptung über einen _einzigen_ Ausführungsschritt anfechten. An diesem Punkt wird der L1-Vertrag den Streit beilegen, indem er die Anweisung (und ihr Ergebnis) auswertet, um die betrügerische Partei zu überführen. -Der behauptet muss einen „Ein-Schritt-Beweis“ vorlegen, der die Gültigkeit der umstrittenen Ein-Schritt-Berechnung bestätigt. Wenn der behauptet den Ein-Schritt-Beweis nicht vorlegen kann oder der L1-Verifizierer den Beweis für ungültig hält, verliert er die Anfechtung. +Der Behauptende muss einen „Ein-Schritt-Nachweis“ erbringen, der die Gültigkeit der umstrittenen Ein-Schritt-Berechnung verifiziert. Wenn der Behauptende den Ein-Schritt-Nachweis nicht erbringt oder der L1-Verifizierer den Nachweis für ungültig hält, verliert er die Anfechtung. -Einige Hinweise zu dieser Art des Betrugsnachweises: +Einige Anmerkungen zu dieser Art von Betrugsnachweis: -1. Der interaktive Betrugsnachweis in mehreren Runden gilt als effizient, da er den Aufwand der L1-Kette bei der Streitschlichtung minimiert. Anstatt die gesamte Transaktion erneut abzuspielen, muss die L1-Kette nur einen Schritt bei der Ausführung des Rollups erneut ausführen. +1. Mehrrundige interaktive Betrugsnachweise gelten als effizient, da sie die Arbeit minimieren, die die L1-Chain bei der Streitschlichtung leisten muss. Anstatt die gesamte Transaktion erneut abzuspielen, muss die L1-Chain nur einen Schritt in der Ausführung des Rollups erneut ausführen. -2. Halbierung Protokoll reduzieren die Menge der in der Kette veröffentlichten Daten (es ist nicht erforderlich, für jede Transaktion Status-Commits zu veröffentlichen). Darüber hinaus unterliegen optimistische Rollup Transaktionen nicht der Gasgrenze von Ethereum. Umgekehrt müssen optimistische Rollups, die Transaktionen erneut ausführen, sicherstellen, dass eine L2-Transaktion ein niedrigeres Gaslimit hat, um ihre Ausführung innerhalb einer einzelnen Ethereum-Transaktion zu emulieren. +2. Bisektionsprotokolle reduzieren die Datenmenge, die auf der Blockchain gepostet wird (es müssen keine Zustandsverpflichtungen für jede Transaktion veröffentlicht werden). Außerdem sind Transaktionen von Optimistic Rollups nicht durch das Gaslimit von Ethereum eingeschränkt. Umgekehrt müssen Optimistic Rollups, die Transaktionen erneut ausführen, sicherstellen, dass eine L2-Transaktion ein niedrigeres Gaslimit hat, um ihre Ausführung innerhalb einer einzigen Ethereum-Transaktion zu emulieren. -3. Ein Teil der Anleihe des böswilligen Behauptet wird dem Herausforderer zugesprochen, während der andere Teil verbrannt wird. Das Verbrennen verhindert Absprachen zwischen Validatoren. Wenn zwei Validierer zusammenarbeiten, um Scheinherausforderungen zu initiieren, verlieren sie dennoch einen beträchtlichen Teil des gesamten Einsatzes. +3. Ein Teil der Kaution des böswilligen Behauptenden wird dem Herausforderer zugesprochen, während der andere Teil verbrannt wird. Das Verbrennen verhindert Absprachen zwischen Validatoren; wenn zwei Validatoren zusammenarbeiten, um gefälschte Anfechtungen zu initiieren, verlieren sie dennoch einen beträchtlichen Teil des gesamten Einsatzes. -4. Bei der interaktiven Beweisführung über mehrere Runden müssen beide Parteien (der Behauptet und der Challenger) innerhalb des angegebenen Zeitfensters ihre Züge machen. Wird die Frist nicht eingehalten, verfällt die Anfechtung für die säumige Partei. +4. Mehrrundige interaktive Nachweise erfordern, dass beide Parteien (der Behauptende und der Herausforderer) innerhalb des angegebenen Zeitfensters handeln. Ein Versäumnis, vor Ablauf der Frist zu handeln, führt dazu, dass die säumige Partei die Anfechtung verliert. #### Warum Betrugsnachweise für Optimistic Rollups wichtig sind {#fraud-proof-benefits} -Betrugsnachweise sind wichtig, weil sie die _vertrauenslose Finalität_ in Optimistic Rollups ermöglichen. Vertrauenslose Endgültigkeit ist eine Eigenschaft optimistischer Rollups, die garantiert, dass eine Transaktion sofern sie gültig ist letztendlich bestätigt wird. +Betrugsnachweise sind wichtig, da sie eine _vertrauenslose Finalität_ in Optimistic Rollups ermöglichen. Vertrauenslose Finalität ist eine Eigenschaft von Optimistic Rollups, die garantiert, dass eine Transaktion – solange sie gültig ist – letztendlich bestätigt wird. -Böswillige Knoten können versuchen, die Bestätigung eines gültigen Rollup Blocks durch das Starten falscher Herausforderungen zu verzögern. Betrugsnachweise werden jedoch letztendlich die Gültigkeit des Rollup Blocks beweisen und zu seiner Bestätigung führen. +Böswillige Blockchain-Knoten können versuchen, die Bestätigung eines gültigen Rollup-Blocks zu verzögern, indem sie falsche Anfechtungen starten. Betrugsnachweise werden jedoch letztendlich die Gültigkeit des Rollup-Blocks beweisen und dazu führen, dass er bestätigt wird. -Dies bezieht sich auch auf eine weitere Sicherheitseigenschaft von Optimistic Rollups: Die Gültigkeit der Kette hängt von der Existenz _eines_ ehrlichen Knotens ab. Der ehrliche Knoten kann die Kette korrekt voranbringen, indem er entweder gültige Behauptungen postet oder ungültige Behauptungen bestreitet. Wie dem auch sei, böswillige Knoten, die in einen Streit mit dem ehrlichen Knoten geraten, verlieren im Laufe des Betrugsnachweisprozesses ihren Einsatz. +Dies bezieht sich auch auf eine weitere Sicherheitseigenschaft von Optimistic Rollups: Die Gültigkeit der Chain beruht auf der Existenz _eines_ ehrlichen Blockchain-Knotens. Der ehrliche Knoten kann die Chain korrekt vorantreiben, indem er entweder gültige Behauptungen postet oder ungültige Behauptungen anficht. In jedem Fall werden böswillige Knoten, die in Streitigkeiten mit dem ehrlichen Knoten geraten, ihre Einsätze während des Betrugsnachweisprozesses verlieren. ### L1/L2-Interoperabilität {#l1-l2-interoperability} -Optimistische Rollups sind für die Interoperabilität mit dem Ethereum-Mainnet konzipiert und ermöglichen Benutzern die Übertragung von Nachrichten und beliebigen Daten zwischen L1 und L2. Sie sind auch mit der EVM kompatibel, sodass Sie bestehende [Dapps](/developers/docs/dapps/) auf Optimistic Rollups portieren oder mit den Entwicklungstools von Ethereum neue Dapps erstellen können. +Optimistic Rollups sind für die Interoperabilität mit dem Ethereum-Mainnet konzipiert und ermöglichen es Benutzern, Nachrichten und beliebige Daten zwischen L1 und L2 zu übertragen. Sie sind auch mit der EVM kompatibel, sodass Sie bestehende [Dapps](/developers/docs/dapps/) auf Optimistic Rollups portieren oder neue Dapps mit Ethereum-Entwicklungstools erstellen können. -#### 1. Asset-Bewegung {#asset-movement} +#### 1. Bewegung von Vermögenswerten {#asset-movement} -##### Eingabe des Rollups +##### Eintritt in das Rollup -Um einen Optimistic Rollup zu verwenden, zahlen Nutzer ETH, ERC-20-Token und andere akzeptierte Vermögenswerte in den Vertrag der [kettenübergreifenden Brücke](/developers/docs/bridges/) des Rollups auf L1 ein. Der Brückenvertrag leitet die Transaktion an L2 weiter, wo ein entsprechender Betrag an Vermögenswerten geprägt und an die vom Benutzer gewählte Adresse im optimistischen Rollup gesendet wird. +Um ein Optimistic Rollup zu nutzen, zahlen Benutzer ETH, ERC-20-Token und andere akzeptierte Vermögenswerte in den Vertrag der [kettenübergreifenden Brücke](/developers/docs/bridges/) des Rollups auf L1 ein. Der Brückenvertrag leitet die Transaktion an L2 weiter, wo eine entsprechende Menge an Vermögenswerten geprägt und an die vom Benutzer gewählte Adresse auf dem Optimistic Rollup gesendet wird. -Vom Benutzer generierte Transaktionen (wie eine L1 > L2 Einzahlung) werden normalerweise in eine Warteschlange gestellt, bis der Sequencer sie erneut an den Rollup-Vertrag übermittelt. Um jedoch die Zensurresistenz aufrechtzuerhalten, ermöglichen optimistische Rollups den Benutzern, eine Transaktion direkt an den Onchain Rollup Vertrag zu senden, wenn sie über die maximal zulässige Zeit hinaus verzögert wurde. +Benutzergenerierte Transaktionen (wie eine L1 > L2-Einzahlung) werden normalerweise in die Warteschlange gestellt, bis der Sequencer sie erneut an den Rollup-Vertrag übermittelt. Um jedoch die Zensurresistenz zu wahren, ermöglichen Optimistic Rollups Benutzern, eine Transaktion direkt an den Rollup-Vertrag auf der Blockchain zu übermitteln, wenn sie über die maximal zulässige Zeit hinaus verzögert wurde. -Einige optimistische Rollups verfolgen einen direkteren Ansatz, um zu verhindern, dass Sequenzer Benutzer zensieren. Hier wird ein Block durch alle Transaktionen definiert, die seit dem vorherigen Block an den L1-Vertrag übermittelt wurden (z. B. Einzahlungen), zusätzlich zu den Transaktionen, die in der Rollup Kette verarbeitet wurden. Wenn ein Sequenzer eine L1-Transaktion ignoriert, veröffentlicht er den (nachweislich) falschen Statusstamm. Daher können Sequenzer benutzergenerierte Nachrichten nicht verzögern, sobald sie auf L1 gepostet wurden. +Einige Optimistic Rollups verfolgen einen direkteren Ansatz, um zu verhindern, dass Sequencer Benutzer zensieren. Hier wird ein Block durch alle Transaktionen definiert, die seit dem vorherigen Block an den L1-Vertrag übermittelt wurden (z. B. Einzahlungen), zusätzlich zu den auf der Rollup-Chain verarbeiteten Transaktionen. Wenn ein Sequencer eine L1-Transaktion ignoriert, veröffentlicht er die (nachweislich) falsche State Root; daher können Sequencer benutzergenerierte Nachrichten nicht verzögern, sobald sie auf L1 gepostet wurden. -##### Beenden des Rollups +##### Verlassen des Rollups -Aufgrund des Betrugsnachweissystems ist die Auszahlung aus einem optimistischen Rollup auf Ethereum schwieriger. Wenn ein Nutzer eine L2 > L1 Transaktion initiiert, um auf L1 hinterlegte Gelder abzuheben, muss er warten, bis die Anfechtungsfrist – die ungefähr sieben Tage dauert – abgelaufen ist. Der Auszahlungsprozess selbst ist jedoch ziemlich unkompliziert. +Das Abheben von einem Optimistic Rollup zu Ethereum ist aufgrund des Betrugsnachweisschemas schwieriger. Wenn ein Benutzer eine L2 > L1-Transaktion initiiert, um auf L1 treuhänderisch verwahrte Gelder abzuheben, muss er warten, bis die Anfechtungsfrist – die etwa sieben Tage dauert – abgelaufen ist. Dennoch ist der Abhebungsprozess selbst ziemlich unkompliziert. -Nachdem die Auszahlungsanforderung auf dem L2 Rollup initiiert wurde, wird die Transaktion in den nächsten Stapel aufgenommen, während die Vermögenswerte des Benutzers auf dem Rollup verbrannt werden. Sobald der Stapel auf Ethereum veröffentlicht ist, kann der Benutzer einen Merkle Beweis berechnen, der die Aufnahme seiner Exit-Transaktion in den Block bestätigt. Dann muss die Verzögerungszeit abgewartet werden, um die Transaktion auf L1 abzuschließen und die Gelder auf das Mainnet abzuheben. +Nachdem die Abhebungsanforderung auf dem L2-Rollup initiiert wurde, wird die Transaktion in den nächsten Stapel aufgenommen, während die Vermögenswerte des Benutzers auf dem Rollup verbrannt werden. Sobald der Stapel auf Ethereum veröffentlicht ist, kann der Benutzer einen Merkle-Nachweis berechnen, der die Aufnahme seiner Exit-Transaktion in den Block verifiziert. Dann geht es nur noch darum, die Verzögerungszeit abzuwarten, um die Transaktion auf L1 zu finalisieren und Gelder auf das Mainnet abzuheben. -Um eine Woche Wartezeit vor der Abhebung von Geldern auf Ethereum zu vermeiden, können Nutzer von Optimistic Rollups einen **Liquiditätsanbieter** (LP) einsetzen. Ein Liquiditätsanbieter übernimmt das Eigentum an einer ausstehenden L2-Auszahlung und zahlt den Benutzer auf L1 aus (gegen eine Gebühr). +Um nicht eine Woche warten zu müssen, bevor Gelder auf Ethereum abgehoben werden, können Benutzer von Optimistic Rollups einen **Liquiditätsanbieter** (Liquidity Provider, LP) einsetzen. Ein Liquiditätsanbieter übernimmt das Eigentum an einer ausstehenden L2-Abhebung und bezahlt den Benutzer auf L1 (gegen eine Gebühr). -Liquiditätsanbieter können die Gültigkeit der Auszahlungsanforderung des Benutzers überprüfen (indem sie die Kette selbst ausführen), bevor sie Gelder freigeben. Auf diese Weise haben sie die Gewissheit, dass die Transaktion letztendlich bestätigt wird (d. h. vertrauenslose Endgültigkeit). +Liquiditätsanbieter können die Gültigkeit der Abhebungsanforderung des Benutzers überprüfen (indem sie die Chain selbst ausführen), bevor sie Gelder freigeben. Auf diese Weise haben sie die Gewissheit, dass die Transaktion letztendlich bestätigt wird (d. h. vertrauenslose Finalität). #### 2. EVM-Kompatibilität {#evm-compatibility} -Für Entwickler liegt der Vorteil von Optimistic Rollups in ihrer Kompatibilität – oder, besser noch, Äquivalenz – mit der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/). EVM-kompatible Rollups entsprechen den Spezifikationen im [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) und unterstützen die EVM auf Bytecode-Ebene. +Für Entwickler ist der Vorteil von Optimistic Rollups ihre Kompatibilität – oder besser noch, Äquivalenz – mit der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/). EVM-kompatible Rollups entsprechen den Spezifikationen im [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) und unterstützen die EVM auf Bytecode-Ebene. -Die EVM Kompatibilität in optimistischen Rollups bietet die folgenden Vorteile: +Die EVM-Kompatibilität in Optimistic Rollups hat folgende Vorteile: -ich. Entwickler können vorhandene Smart Contracts auf Ethereum auf optimistische Rollup Ketten migrieren, ohne die Codebasis umfassend ändern zu müssen. Dies kann Entwicklungsteams Zeit sparen, wenn sie Ethereum Smart Contracts auf L2 bereitstellen. +i. Entwickler können bestehende Smart Contracts auf Ethereum auf Optimistic Rollup-Chains migrieren, ohne Codebasen umfassend ändern zu müssen. Dies kann Entwicklungsteams Zeit sparen, wenn sie Ethereum-Smart Contracts auf L2 bereitstellen. -ii. Entwickler und Projektteams, die optimistische Rollups verwenden, können die Infrastruktur von Ethereum nutzen. Dazu gehören Programmiersprachen, Codebibliotheken, Testtools, Clientsoftware, Bereitstellungsinfrastruktur usw. +ii. Entwickler und Projektteams, die Optimistic Rollups verwenden, können die Infrastruktur von Ethereum nutzen. Dazu gehören Programmiersprachen, Codebibliotheken, Testwerkzeuge, Client-Software, Bereitstellungsinfrastruktur und so weiter. -Die Verwendung vorhandener Tools ist wichtig, da diese Tools im Laufe der Jahre umfassend geprüft, debuggt und verbessert wurden. Außerdem müssen Ethereum-Entwickler nicht mehr lernen, wie man mit einem völlig neuen Entwicklungs-Stack erstellt. +Die Verwendung vorhandener Tools ist wichtig, da diese Tools im Laufe der Jahre umfassend geprüft, debuggt und verbessert wurden. Es beseitigt auch die Notwendigkeit für Ethereum-Entwickler, zu lernen, wie man mit einem völlig neuen Entwicklungs-Stack baut. #### 3. Kettenübergreifende Vertragsaufrufe {#cross-chain-contract-calls} -Benutzer (externe Konten) interagieren mit L2-Verträgen, indem sie eine Transaktion an den Rollup Vertrag übermitteln oder dies von einem Sequenzer oder Validator für sie erledigen lassen. Optimistische Rollups ermöglichen Vertragskonten auf Ethereum außerdem die Interaktion mit L2-Verträgen mithilfe von Überbrückungsverträgen, um Nachrichten weiterzuleiten und Daten zwischen L1 und L2 zu übertragen. Das bedeutet, dass Sie einen L1 Vertrag im Ethereum Mainnet so programmieren können, dass er Funktionen aufruft, die zu Verträgen in einem optimistischen L2 Rollup gehören. +Benutzer (Extern verwaltete Konten) interagieren mit L2-Verträgen, indem sie eine Transaktion an den Rollup-Vertrag übermitteln oder dies von einem Sequencer oder Validator für sie erledigen lassen. Optimistic Rollups ermöglichen es auch Vertragskonten auf Ethereum, mit L2-Verträgen zu interagieren, indem sie Brückenverträge verwenden, um Nachrichten weiterzuleiten und Daten zwischen L1 und L2 zu übertragen. Das bedeutet, dass Sie einen L1-Vertrag im Ethereum-Mainnet so programmieren können, dass er Funktionen aufruft, die zu Verträgen auf einem L2-Optimistic Rollup gehören. -Kreuzkette Vertragsaufrufe erfolgen asynchron, d. h. der Aufruf wird zuerst initiiert und dann zu einem späteren Zeitpunkt ausgeführt. Dies unterscheidet sich von Aufrufen zwischen den beiden Verträgen auf Ethereum, bei denen der Aufruf sofort Ergebnisse liefert. +Kettenübergreifende Vertragsaufrufe erfolgen asynchron – das bedeutet, der Aufruf wird zuerst initiiert und dann zu einem späteren Zeitpunkt ausgeführt. Dies unterscheidet sich von Aufrufen zwischen zwei Verträgen auf Ethereum, bei denen der Aufruf sofort Ergebnisse liefert. -Ein Beispiel für einen kettenübergreifenden Vertragsaufruf ist die zuvor beschriebene Token-Einzahlung. Ein Vertrag auf L1 verwaltet die Token des Benutzers treuhänderisch und sendet eine Nachricht an einen gepaarten L2 Vertrag, um eine gleiche Anzahl von Token auf der Rollup Liste zu prägen. +Ein Beispiel für einen kettenübergreifenden Vertragsaufruf ist die zuvor beschriebene Token-Einzahlung. Ein Vertrag auf L1 verwahrt die Token des Benutzers treuhänderisch und sendet eine Nachricht an einen gekoppelten L2-Vertrag, um eine gleiche Menge an Token auf dem Rollup zu prägen. -Da kettenübergreifende Nachrichtenaufrufe zur Ausführung von Verträgen führen, muss der Absender in der Regel die [Gaskosten](/developers/docs/gas/) für die Berechnung übernehmen. Es ist ratsam, ein hohes Gaslimit festzulegen, um zu verhindern, dass die Transaktion in der Zielkette fehlschlägt. Das Token Überbrückung Szenario ist ein gutes Beispiel: Wenn die L1-Seite der Transaktion (Hinterlegung der Token) funktioniert, die L2-Seite (Prägung neuer Token) jedoch aufgrund von niedrigem Gasstand ausfällt, ist die Einzahlung nicht wiederherstellbar. +Da kettenübergreifende Nachrichtenaufrufe zur Vertragsausführung führen, muss der Absender in der Regel die [Gaskosten](/developers/docs/gas/) für die Berechnung tragen. Es ist ratsam, ein hohes Gaslimit festzulegen, um zu verhindern, dass die Transaktion auf der Ziel-Chain fehlschlägt. Das Token-Bridging-Szenario ist ein gutes Beispiel; wenn die L1-Seite der Transaktion (Einzahlung der Token) funktioniert, aber die L2-Seite (Prägen neuer Token) aufgrund von zu wenig Gas fehlschlägt, wird die Einzahlung unwiederbringlich. -Schließlich ist zu beachten, dass L2 > L1-Nachrichtenaufrufe zwischen Verträgen Verzögerungen berücksichtigen müssen (L1 > L2-Aufrufe werden in der Regel nach einigen Minuten ausgeführt). Dies liegt daran, dass Nachrichten, die vom optimistischen Rollup an Mainnet gesendet werden, erst ausgeführt werden können, wenn das Challenge-Fenster abgelaufen ist. +Schließlich sollten wir beachten, dass L2 > L1-Nachrichtenaufrufe zwischen Verträgen Verzögerungen berücksichtigen müssen (L1 > L2-Aufrufe werden typischerweise nach einigen Minuten ausgeführt). Dies liegt daran, dass Nachrichten, die vom Optimistic Rollup an das Mainnet gesendet werden, erst ausgeführt werden können, wenn das Anfechtungsfenster abläuft. -## Wie funktionieren optimistische Rollup Gebühren? {#how-do-optimistic-rollup-fees-work} +## Wie funktionieren die Gebühren für Optimistic Rollups? {#how-do-optimistic-rollup-fees-work} -Optimistische Rollups verwenden ein Gasgebührenschema, ähnlich wie Ethereum, um anzugeben, wie viel Benutzer pro Transaktion zahlen. Die auf Optimistic Rollups erhobenen Gebühren hängen von den folgenden Komponenten ab: +Optimistic Rollups verwenden ein Gasgebühren-Schema, ähnlich wie Ethereum, um anzugeben, wie viel Benutzer pro Transaktion zahlen. Die auf Optimistic Rollups erhobenen Gebühren hängen von den folgenden Komponenten ab: -1. **Zustandsschreiben**: Optimistic Rollups veröffentlichen Transaktionsdaten und Block-Header (bestehend aus dem vorherigen Block-Header-Hash, dem Zustands-Root und dem Batch-Root) als `Blob` oder "Binary Large Object" auf Ethereum. [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) führte eine kostengünstige Lösung für die Einbeziehung von Daten onchain ein. Ein `Blob` ist ein neues Transaktionsfeld, das es Rollups ermöglicht, komprimierte Zustandsübergangsdaten an Ethereum L1 zu senden. Im Gegensatz zu `calldata`, das permanent onchain verbleibt, sind Blobs kurzlebig und können nach [4096 Epochen](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (ungefähr 18 Tage) von den Clients entfernt werden. Durch die Verwendung von Klecks zum Posten von Batches komprimierter Transaktionen können optimistische Rollups die Kosten für das Schreiben von Transaktionen in L1 erheblich reduzieren. +1. **Zustandsschreiben (State write)**: Optimistic Rollups veröffentlichen Transaktionsdaten und Block-Header (bestehend aus dem vorherigen Block-Header-Hash, State Root, Batch Root) auf Ethereum als `blob` oder „Binary Large Object“. [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) führte eine kostengünstige Lösung für die Einbindung von Daten auf der Blockchain ein. Ein `blob` ist ein neues Transaktionsfeld, das es Rollups ermöglicht, komprimierte Zustandsübergangsdaten auf Ethereum L1 zu posten. Im Gegensatz zu `calldata`, das dauerhaft auf der Blockchain verbleibt, sind Blobs kurzlebig und können nach [4096 Epochen](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (etwa 18 Tagen) von Clients gelöscht werden. Durch die Verwendung von Blobs zum Posten von Stapeln komprimierter Transaktionen können Optimistic Rollups die Kosten für das Schreiben von Transaktionen auf L1 erheblich senken. -2. **Verwendetes Blob-Gas**: Blob-tragende Transaktionen verwenden einen dynamischen Gebührenmechanismus, ähnlich dem, der durch [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) eingeführt wurde. Die Gasgebühr für Typ-3-Transaktionen berücksichtigt die Grundgebühr für Klecks, die vom Netzwerk basierend auf der Klecks-Speicherplatznachfrage und der Klecks-Speicherplatznutzung der gesendeten Transaktion bestimmt wird. +2. **Verwendetes Blob-Gas**: Blob-tragende Transaktionen verwenden einen dynamischen Gebührenmechanismus, ähnlich dem durch [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) eingeführten. Die Gasgebühr für Typ-3-Transaktionen berücksichtigt die Grundgebühr für Blobs, die vom Netzwerk basierend auf der Nachfrage nach Blob-Speicherplatz und der Blob-Speicherplatznutzung der gesendeten Transaktion bestimmt wird. -3. **L2-Betreibergebühren**: Dies ist der Betrag, der an die Rollup-Knoten als Ausgleich für die Rechenkosten gezahlt wird, die bei der Verarbeitung von Transaktionen anfallen, ähnlich wie die Gasgebühren auf Ethereum. Rollup Knoten erheben niedrigere Transaktionsgebühren, da L2s über höhere Verarbeitungskapazitäten verfügen und nicht mit den Netzwerküberlastungen konfrontiert sind, die Validierer auf Ethereum dazu zwingen, Transaktionen mit höheren Gebühren zu priorisieren. +3. **L2-Betreibergebühren**: Dies ist der Betrag, der an die Rollup-Knoten als Entschädigung für die bei der Verarbeitung von Transaktionen anfallenden Rechenkosten gezahlt wird, ähnlich wie Gasgebühren auf Ethereum. Rollup-Knoten berechnen niedrigere Transaktionsgebühren, da L2s höhere Verarbeitungskapazitäten haben und nicht mit den Netzwerküberlastungen konfrontiert sind, die Validatoren auf Ethereum zwingen, Transaktionen mit höheren Gebühren zu priorisieren. -Optimistic Rollups wenden verschiedene Mechanismen zur Reduzierung der Gebühren für Nutzer an, einschließlich der Bündelung von Transaktionen und der Komprimierung von `calldata`, um die Kosten für die Datenveröffentlichung zu senken. Sie können den [L2-Gebühren-Tracker](https://l2fees.info/) für eine Echtzeit-Übersicht über die Kosten der Nutzung von Ethereum-basierten Optimistic Rollups überprüfen. +Optimistic Rollups wenden mehrere Mechanismen an, um die Gebühren für Benutzer zu senken, einschließlich der Bündelung von Transaktionen und der Komprimierung von `calldata`, um die Kosten für die Datenveröffentlichung zu reduzieren. Sie können den [L2-Gebühren-Tracker](https://l2fees.info/) für eine Echtzeit-Übersicht darüber überprüfen, wie viel es kostet, Ethereum-basierte Optimistic Rollups zu nutzen. -## Wie skalieren optimistische Rollups Ethereum? Skalierung von Ethereum mit Optimistic Rollups {#scaling-ethereum-with-optimistic-rollups} +## Wie skalieren Optimistic Rollups Ethereum? {#scaling-ethereum-with-optimistic-rollups} -Wie erläutert, veröffentlichen optimistische Rollups komprimierte Transaktionsdaten auf Ethereum, um die Datenverfügbarkeit zu gewährleisten. Die Fähigkeit, in der Kette veröffentlichte Daten zu komprimieren, ist entscheidend für die Skalierung des Durchsatzes auf Ethereum mit optimistischen Rollups. +Wie erklärt, veröffentlichen Optimistic Rollups komprimierte Transaktionsdaten auf Ethereum, um die Datenverfügbarkeit zu garantieren. Die Fähigkeit, auf der Blockchain veröffentlichte Daten zu komprimieren, ist entscheidend für die Skalierung des Durchsatzes auf Ethereum mit Optimistic Rollups. -Die Haupt-Ethereum-Kette begrenzt, wie viele Datenblöcke enthalten können, ausgedrückt in Gaseinheiten (die [durchschnittliche Blockgröße](/developers/docs/blocks/#block-size) beträgt 15 Millionen Gas). Dadurch wird zwar der Gasverbrauch jeder Transaktion eingeschränkt, es bedeutet aber auch, dass wir die Anzahl der pro Block verarbeiteten Transaktionen erhöhen können, indem wir die Transaktion bezogenen Daten reduzieren – was die Skalierbarkeit direkt verbessert. +Die Haupt-Ethereum-Chain setzt Grenzen dafür, wie viele Daten Blöcke aufnehmen können, angegeben in Gaseinheiten (die [durchschnittliche Blockgröße](/developers/docs/blocks/#block-size) beträgt 15 Millionen Gas). Während dies einschränkt, wie viel Gas jede Transaktion verbrauchen kann, bedeutet es auch, dass wir die pro Block verarbeiteten Transaktionen erhöhen können, indem wir transaktionsbezogene Daten reduzieren – was die Skalierung direkt verbessert. -Optimistische Rollups verwenden mehrere Techniken, um eine Komprimierung der Transaktionsdaten zu erreichen und die TPS Raten zu verbessern. Dieser [Artikel](https://vitalik.eth.limo/general/2021/01/05/rollup.html) vergleicht beispielsweise die Daten, die eine einfache Nutzertransaktion (Senden von Ether) auf dem Mainnet generiert, mit der Datenmenge, die dieselbe Transaktion auf einem Rollup generiert: +Optimistic Rollups verwenden verschiedene Techniken, um eine Komprimierung von Transaktionsdaten zu erreichen und die TPS-Raten (Transaktionen pro Sekunde) zu verbessern. Zum Beispiel vergleicht dieser [Artikel](https://vitalik.eth.limo/general/2021/01/05/rollup.html) die Daten, die eine einfache Benutzertransaktion (Senden von Ether) im Mainnet generiert, mit der Datenmenge, die dieselbe Transaktion auf einem Rollup generiert: -| Parameter | Ethereum (L1) | Rollup (L2) | -| ------------ | --------------------------------------------------------- | ------------------------------------ | -| Nonce | ~3 | 0 | -| Benzinpreis | ~8 | 0-0.5 | -| Gas | 3 | 0-0.5 | -| Zu | 21 | 4 | -| Wert | 9 | ~3 | -| Unterschrift | ~68 (2 + 33 + 33) | ~0.5 | -| Aus | 0 (aus der Signatur wiederhergestellt) | 4 | -| **Gesamt** | **~112 Bytes** | **~12 Byte** | +| Parameter | Ethereum (L1) | Rollup (L2) | +| --------- | ---------------------- | ------------- | +| Nonce | ~3 | 0 | +| Gaspreis | ~8 | 0-0.5 | +| Gas | 3 | 0-0.5 | +| An | 21 | 4 | +| Wert | 9 | ~3 | +| Signatur | ~68 (2 + 33 + 33) | ~0.5 | +| Von | 0 (aus Signatur wiederhergestellt) | 4 | +| **Gesamt** | **\~112 Bytes** | **\~12 Bytes** | -Durch grobe Berechnungen dieser Zahlen können die durch ein optimistisches Rollup erzielten Skalierbar keitsverbesserungen aufgezeigt werden: +Einige grobe Berechnungen mit diesen Zahlen können helfen, die Skalierungsverbesserungen zu zeigen, die ein Optimistic Rollup bietet: -1. Die Zielgröße für jeden Block beträgt 15 Millionen Gas und die Überprüfung eines Datenbytes kostet 16 Gas. Die Division der durchschnittlichen Blockgröße durch 16 Gas (15.000.000/16) zeigt, dass der durchschnittliche Block **937.500 Bytes an Daten** aufnehmen kann. -2. Wenn eine einfache Rollup-Transaktion 12 Bytes verwendet, kann der durchschnittliche Ethereum-Block **78.125 Rollup-Transaktionen** (937.500/12) oder **39 Rollup-Batches** verarbeiten (wenn jeder Batch durchschnittlich 2.000 Transaktionen enthält). -3. Wenn alle 15 Sekunden ein neuer Block auf Ethereum produziert wird, würde die Verarbeitungsgeschwindigkeit des Rollups ungefähr **5.208 Transaktionen pro Sekunde** betragen. Dies geschieht, indem die Anzahl der grundlegenden Rollup-Transaktionen, die ein Ethereum-Block aufnehmen kann (**78.125**), durch die durchschnittliche Blockzeit (**15 Sekunden**) geteilt wird. +1. Die Zielgröße für jeden Block beträgt 15 Millionen Gas und es kostet 16 Gas, ein Byte an Daten zu verifizieren. Teilt man die durchschnittliche Blockgröße durch 16 Gas (15.000.000/16), zeigt sich, dass der durchschnittliche Block **937.500 Bytes an Daten** aufnehmen kann. +2. Wenn eine einfache Rollup-Transaktion 12 Bytes verwendet, kann der durchschnittliche Ethereum-Block **78.125 Rollup-Transaktionen** (937.500/12) oder **39 Rollup-Stapel** verarbeiten (wenn jeder Stapel durchschnittlich 2.000 Transaktionen enthält). +3. Wenn alle 15 Sekunden ein neuer Block auf Ethereum produziert wird, würden sich die Verarbeitungsgeschwindigkeiten des Rollups auf etwa **5.208 Transaktionen pro Sekunde** belaufen. Dies wird berechnet, indem die Anzahl der einfachen Rollup-Transaktionen, die ein Ethereum-Block aufnehmen kann (**78.125**), durch die durchschnittliche Blockzeit (**15 Sekunden**) geteilt wird. -Dies ist eine ziemlich optimistische Schätzung, da optimistische Rollup Transaktionen unmöglich einen ganzen Block auf Ethereum umfassen können. Es kann jedoch eine ungefähre Vorstellung davon vermitteln, wie viel Skalierbar keits gewinn optimistische Rollups Ethereum-Benutzern bieten können (aktuelle Implementierungen bieten bis zu 2.000 TPS). +Dies ist eine ziemlich optimistische Schätzung, da Transaktionen von Optimistic Rollups unmöglich einen gesamten Block auf Ethereum umfassen können. Es kann jedoch eine grobe Vorstellung davon geben, wie viel Skalierungsgewinne Optimistic Rollups den Ethereum-Benutzern bieten können (aktuelle Implementierungen bieten bis zu 2.000 TPS). -Die Einführung von [Data Sharding](/roadmap/danksharding/) auf Ethereum wird voraussichtlich die Skalierbarkeit von Optimistic Rollups verbessern. Da Rollup Transaktionen den Block Raum mit anderen Nicht Rollup Transaktionen teilen müssen, ist ihre Verarbeitungskapazität durch den Datendurchsatz in der Hauptkette von Ethereum begrenzt. Danksharding wird den für L2-Ketten verfügbaren Platz zur Veröffentlichung von Daten pro Block erhöhen, indem es günstigeren, nicht-permanenten "Blob"-Speicher anstelle von teurem, permanentem `CALLDATA` verwendet. +Es wird erwartet, dass die Einführung von [Daten-Sharding](/roadmap/danksharding/) auf Ethereum die Skalierung in Optimistic Rollups verbessern wird. Da Rollup-Transaktionen den Blockspeicherplatz mit anderen Nicht-Rollup-Transaktionen teilen müssen, ist ihre Verarbeitungskapazität durch den Datendurchsatz auf der Haupt-Ethereum-Chain begrenzt. Danksharding wird den Platz vergrößern, der L2-Chains zur Verfügung steht, um Daten pro Block zu veröffentlichen, indem günstigerer, nicht permanenter „Blob“-Speicher anstelle von teurem, permanentem `CALLDATA` verwendet wird. ### Vor- und Nachteile von Optimistic Rollups {#optimistic-rollups-pros-and-cons} -| Pro | Nachteile | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Bietet massive Verbesserungen der Skalierbarkeit ohne Einbußen bei Sicherheit oder Vertrauenslosigkeit. | Verzögerungen bei der Transaktionsabwicklung aufgrund potenzieller Betrugsprobleme. | -| Transaktionsdaten werden in der Layer-1-Kette gespeichert, was Transparenz, Sicherheit, Zensurresistenz und Dezentralisierung verbessert. | Zentralisierte Rollup Operatoren (Sequenzer) können die Reihenfolge der Transaktionen beeinflussen. | -| Der Betrugsnachweis garantiert eine vertrauenslose Endgültigkeit und ermöglicht es ehrlichen Minderheiten, die Kette zu sichern. | Wenn es keine ehrlichen Knoten gibt, kann ein böswilliger Betreiber Geld stehlen, indem er ungültige Blöcke und Statusverpflichtungen veröffentlicht. | -| Die Berechnung von Betrugsnachweisen steht regulären L2-Knoten offen, im Gegensatz zu Gültigkeitsnachweisen (die in ZK-Rollups verwendet werden), die spezielle Hardware erfordern. | Das Sicherheitsmodell basiert darauf, dass mindestens ein ehrlicher Knoten Rollup Transaktionen ausführt und Betrugsnachweise einreicht, um ungültige Zustandsübergänge anzufechten. | -| Rollups profitieren von vertrauens loser Lebendigkeit“ (jeder kann die Kette zum Fortschreiten zwingen, indem er Transaktionen ausführt und Behauptungen postet). | Benutzer müssen warten, bis die einwöchige Heraus forderung phase abgelaufen ist, bevor sie Gelder zurück auf Ethereum abheben können. | -| Optimistische Rollups basieren auf gut konzipierten Krypton wirtschaftlich Anreizen, um die Sicherheit in der Kette zu erhöhen. | Rollups müssen alle Transaktionsdaten in der Kette veröffentlichen, was die Kosten erhöhen kann. | -| Durch die Kompatibilität mit EVM und Solidity können Entwickler Ethereum-native Smart Contracts auf Rollups portieren oder vorhandene Tools zum Erstellen neuer Dapp verwenden. | | +| Vorteile | Nachteile | +| -------- | --------- | +| Bietet massive Verbesserungen der Skalierung, ohne Sicherheit oder Vertrauenslosigkeit zu opfern. | Verzögerungen bei der Transaktionsfinalität aufgrund möglicher Betrugsanfechtungen. | +| Transaktionsdaten werden auf der Ebene-1-Chain gespeichert, was Transparenz, Sicherheit, Zensurresistenz und Dezentralisierung verbessert. | Zentralisierte Rollup-Betreiber (Sequencer) können die Reihenfolge der Transaktionen beeinflussen. | +| Betrugsnachweise garantieren vertrauenslose Finalität und ermöglichen es ehrlichen Minderheiten, die Chain zu sichern. | Wenn es keine ehrlichen Blockchain-Knoten gibt, kann ein böswilliger Betreiber Gelder stehlen, indem er ungültige Blöcke und Zustandsverpflichtungen postet. | +| Die Berechnung von Betrugsnachweisen steht regulären L2-Knoten offen, im Gegensatz zu Validitätsnachweisen (die in ZK-Rollups verwendet werden), die spezielle Hardware erfordern. | Das Sicherheitsmodell beruht auf mindestens einem ehrlichen Blockchain-Knoten, der Rollup-Transaktionen ausführt und Betrugsnachweise übermittelt, um ungültige Zustandsübergänge anzufechten. | +| Rollups profitieren von „vertrauensloser Lebendigkeit“ (jeder kann die Chain zwingen, voranzukommen, indem er Transaktionen ausführt und Behauptungen postet). | Benutzer müssen warten, bis die einwöchige Anfechtungsfrist abgelaufen ist, bevor sie Gelder zurück zu Ethereum abheben können. | +| Optimistic Rollups verlassen sich auf gut durchdachte kryptoökonomische Anreize, um die Sicherheit auf der Chain zu erhöhen. | Rollups müssen alle Transaktionsdaten auf der Blockchain posten, was die Kosten erhöhen kann. | +| Die Kompatibilität mit EVM und Solidity ermöglicht es Entwicklern, Ethereum-native Smart Contracts auf Rollups zu portieren oder vorhandene Tools zu verwenden, um neue Dapps zu erstellen. | | ### Eine visuelle Erklärung von Optimistic Rollups {#optimistic-video} -Eher der visuelle Lernende? Sehen Sie, wie Finematics optimistische Rollups erklärt: +Lernen Sie eher visuell? Sehen Sie sich an, wie Finematics Optimistic Rollups erklärt: -## Weitere Informationen zu optimistischen Rollups +## Weiterführende Literatur zu Optimistic Rollups -- [Wie funktionieren Optimistic Rollups (Der komplette Leitfaden)](https://www.alchemy.com/overviews/optimistic-rollups) -- [Was ist ein Blockchain Rollup? Eine technische Einführung](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Der unverzichtbare Leitfaden zu Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Der praktische Leitfaden für Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) -- [Der Stand der Betrugsnachweise in Ethereum L2s](https://web.archive.org/web/20241124154627/https://research.2077.xyz/the-state-of-fraud-proofs-in-ethereum-l2s) -- [Wie funktioniert der Rollup von Optimism wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) +- [How do optimistic rollups work (The Complete guide)](https://www.alchemy.com/overviews/optimistic-rollups) +- [What is a Blockchain Rollup? A Technical Introduction](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) +- [The Essential Guide to Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) +- [The Practical Guide To Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [The State Of Fraud Proofs In Ethereum L2s](https://web.archive.org/web/20241124154627/https://research.2077.xyz/the-state-of-fraud-proofs-in-ethereum-l2s) +- [How does Optimism's Rollup really work?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) -- [Was ist die Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) +- [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) + +## Tutorials: Optimistic Rollups und Brücken auf Ethereum {#tutorials} + +- [Walkthrough des Optimism-Standard-Brückenvertrags](/developers/tutorials/optimism-std-bridge-annotated-code/) _– Ein kommentierter Code-Walkthrough der Optimism-Standardbrücke zum Verschieben von Vermögenswerten zwischen L1 und L2._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/plasma/index.md b/public/content/translations/de/developers/docs/scaling/plasma/index.md index 328c77873e6..3c8327427ef 100644 --- a/public/content/translations/de/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/de/developers/docs/scaling/plasma/index.md @@ -1,14 +1,14 @@ --- -title: Plasma-Kette -description: "Eine Einführung in Plasma-Ketten als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird." +title: Plasma-Chains +description: "Eine Einführung in Plasma-Chains als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird." lang: de incomplete: true sidebarDepth: 3 --- -Eine Plasma-Chain ist eine separate Blockchain, die an das Ethereum-Mainnet angebunden ist, aber Transaktionen Off-Chain mit ihrem eigenen Mechanismus zur Block-Validierung ausführt. Plasmaketten werden manchmal als "Kind"-Ketten bezeichnet, im Wesentlichen kleinere Kopien des Ethereum-Mainnets. Plasma-Chains verwenden [Betrugsbeweise](/glossary/#fraud-proof) (wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/)), um Streitigkeiten zu schlichten. +Eine Plasma-Chain ist eine separate Blockchain, die im [Ethereum](/) Mainnet verankert ist, aber Transaktionen Off-Chain mit einem eigenen Mechanismus zur Blockvalidierung ausführt. Plasma-Chains werden manchmal als „Child“-Chains bezeichnet und sind im Wesentlichen kleinere Kopien des Ethereum Mainnets. Plasma-Chains verwenden [Betrugsnachweise](/glossary/#fraud-proof) (wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/)), um Streitigkeiten zu schlichten. -Merkle-Bäume ermöglichen die Erstellung eines endlosen Stapels dieser Ketten, die dazu dienen können, Bandbreite von übergeordneten Ketten (einschließlich des Ethereum-Mainnets) zu entlasten. Allerdings leiten diese Ketten zwar einige Sicherheitsaspekte von Ethereum ab (über Betrugsbeweise), jedoch werden ihre Sicherheit und Effizienz durch mehrere Designbeschränkungen beeinflusst. +Merkle-Bäume ermöglichen die Erstellung eines endlosen Stapels dieser Chains, die dazu beitragen können, die Bandbreite von Parent-Chains (einschließlich des Ethereum Mainnets) zu entlasten. Obwohl diese Chains eine gewisse Sicherheit von Ethereum ableiten (über Betrugsnachweise), werden ihre Sicherheit und Effizienz jedoch durch mehrere Designbeschränkungen beeinträchtigt. ## Voraussetzungen {#prerequisites} @@ -16,9 +16,9 @@ Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein allgemeine ## Was ist Plasma? -Plasma ist ein Framework zur Verbesserung der Skalierbarkeit in öffentlichen Blockchains wie Ethereum. Wie im ursprünglichen [Plasma-Whitepaper](http://plasma.io/plasma.pdf) beschrieben, werden Plasma-Ketten auf einer anderen Blockchain (einer sogenannten „Root-Chain“) aufgebaut. Jede "Kind-Kette" erstreckt sich von der Wurzelkette und wird in der Regel von einem Smart Contract verwaltet, der auf der übergeordneten Kette bereitgestellt wird. +Plasma ist ein Framework zur Verbesserung der Skalierbarkeit in öffentlichen Blockchains wie Ethereum. Wie im ursprünglichen [Plasma-Whitepaper](http://plasma.io/plasma.pdf) beschrieben, werden Plasma-Chains auf einer anderen Blockchain (einer sogenannten „Root-Chain“) aufgebaut. Jede „Child-Chain“ geht von der Root-Chain aus und wird im Allgemeinen durch einen Smart Contract verwaltet, der auf der Parent-Chain bereitgestellt wird. -Der Plasma-Vertrag fungiert unter anderem als [kettenübergreifende Brücke](/developers/docs/bridges/), die es Benutzern ermöglicht, Vermögenswerte zwischen dem Ethereum Mainnet und der Plasma-Chain zu bewegen. Obwohl sie dadurch [Sidechains](/developers/docs/scaling/sidechains/) ähneln, profitieren Plasma-Chains – zumindest bis zu einem gewissen Grad – von der Sicherheit des Ethereum Mainnets. Dies unterscheidet sich von Sidechains, die allein für ihre Sicherheit verantwortlich sind. +Der Plasma-Contract fungiert unter anderem als [kettenübergreifende Brücke](/developers/docs/bridges/), die es Benutzern ermöglicht, Vermögenswerte zwischen dem Ethereum Mainnet und der Plasma-Chain zu verschieben. Obwohl sie dadurch [Sidechains](/developers/docs/scaling/sidechains/) ähneln, profitieren Plasma-Chains – zumindest bis zu einem gewissen Grad – von der Sicherheit des Ethereum Mainnets. Dies steht im Gegensatz zu Sidechains, die allein für ihre Sicherheit verantwortlich sind. ## Wie funktioniert Plasma? @@ -26,151 +26,155 @@ Die grundlegenden Komponenten des Plasma-Frameworks sind: ### Off-Chain-Berechnung {#offchain-computation} -Die aktuelle Verarbeitungsgeschwindigkeit von Ethereum ist auf etwa 15-20 Transaktionen pro Sekunde begrenzt, was die kurzfristige Möglichkeit der Skalierung zur Bewältigung von mehr Nutzern verringert. Dieses Problem besteht hauptsächlich, weil der [Konsensmechanismus](/developers/docs/consensus-mechanisms/) von Ethereum erfordert, dass viele Peer-to-Peer-Knoten jede Aktualisierung des Blockchain-Zustands überprüfen. +Die aktuelle Verarbeitungsgeschwindigkeit von Ethereum ist auf ca. 15–20 Transaktionen pro Sekunde begrenzt, was die kurzfristige Möglichkeit der Skalierung zur Bewältigung von mehr Benutzern verringert. Dieses Problem besteht hauptsächlich, weil der [Konsensmechanismus](/developers/docs/consensus-mechanisms/) von Ethereum erfordert, dass viele Peer-to-Peer-Blockchain-Knoten jede Aktualisierung des Zustands der Blockchain verifizieren. -Obwohl der Konsensmechanismus von Ethereum für die Sicherheit notwendig ist, ist er möglicherweise nicht für jeden Anwendungsfall geeignet. Zum Beispiel benötigt Alice möglicherweise nicht, dass ihre täglichen Zahlungen an Bob für eine Tasse Kaffee vom gesamten Ethereum-Netzwerk überprüft werden, da zwischen beiden Parteien bereits ein gewisses Vertrauen besteht. +Obwohl der Konsensmechanismus von Ethereum für die Sicherheit notwendig ist, gilt er möglicherweise nicht für jeden Anwendungsfall. Zum Beispiel muss Alice ihre täglichen Zahlungen an Bob für eine Tasse Kaffee nicht vom gesamten Ethereum-Netzwerk verifizieren lassen, da zwischen beiden Parteien ein gewisses Vertrauen besteht. -Plasma geht davon aus, dass das Ethereum-Mainnet nicht alle Transaktionen überprüfen muss. Stattdessen können wir Transaktionen außerhalb des Mainnets verarbeiten, wodurch die Knoten nicht jede Transaktion validieren müssen. +Plasma geht davon aus, dass das Ethereum Mainnet nicht alle Transaktionen verifizieren muss. Stattdessen können wir Transaktionen außerhalb des Mainnets verarbeiten und so die Blockchain-Knoten davon befreien, jede Transaktion validieren zu müssen. -Offchain-Berechnungen sind notwendig, da Plasma-Chains für Geschwindigkeit und Kosten optimiert werden können. Zum Beispiel kann eine Plasma-Chain – und tut dies in den meisten Fällen – einen einzigen "Operator" verwenden, um die Reihenfolge und Ausführung von Transaktionen zu verwalten. Da nur eine einzige Entität die Transaktionen überprüft, sind die Verarbeitungszeiten auf einer Plasma-Chain schneller als auf dem Ethereum-Mainnet. +Off-Chain-Berechnungen sind notwendig, da Plasma-Chains auf Geschwindigkeit und Kosten optimiert werden können. Zum Beispiel kann eine Plasma-Chain – und das tut sie meistens auch – einen einzigen „Betreiber“ (Operator) verwenden, um die Reihenfolge und Ausführung von Transaktionen zu verwalten. Da nur eine Entität Transaktionen verifiziert, sind die Verarbeitungszeiten auf einer Plasma-Chain schneller als im Ethereum Mainnet. -### Zustands-Commitments {#state-commitments} +### Zustandsverpflichtungen (State Commitments) {#state-commitments} -Während Plasma Transaktionen Off-Chain ausführt, werden sie auf der Haupt-Ethereum-Ausführungsschicht abgerechnet – andernfalls können Plasma-Chains nicht von den Sicherheitsgarantien von Ethereum profitieren. Aber das Finalisieren von Offchain-Transaktionen, ohne den Zustand der Plasma-Chain zu kennen, würde das Sicherheitsmodell untergraben und die Verbreitung ungültiger Transaktionen ermöglichen. Aus diesem Grund ist der Operator, die für die Erstellung von Blöcken auf der Plasma-Chain verantwortliche Entität, verpflichtet, in regelmäßigen Abständen "Zustandsverpflichtungen" (State Commitments) auf Ethereum zu veröffentlichen. +Während Plasma Transaktionen Off-Chain ausführt, werden sie auf der primären Ethereum-Ausführungsebene abgewickelt – andernfalls können Plasma-Chains nicht von den Sicherheitsgarantien von Ethereum profitieren. Aber die Finalisierung von Off-Chain-Transaktionen ohne Kenntnis des Zustands der Plasma-Chain würde das Sicherheitsmodell brechen und die Verbreitung ungültiger Transaktionen ermöglichen. Aus diesem Grund ist der Betreiber, die Entität, die für die Produktion von Blöcken auf der Plasma-Chain verantwortlich ist, verpflichtet, regelmäßig „State Commitments“ auf Ethereum zu veröffentlichen. -Ein [Commitment-Schema](https://en.wikipedia.org/wiki/Commitment_scheme) ist eine kryptografische Technik, um sich auf einen Wert oder eine Aussage festzulegen, ohne diesen einer anderen Partei preiszugeben. Verpflichtungen sind „bindend“ in dem Sinne, dass man den Wert oder die Aussage nicht mehr ändern kann, sobald man sich darauf festgelegt hat. Zustands-Commitments in Plasma nehmen die Form von "Merkle-Wurzeln" an (abgeleitet von einem [Merkle-Baum](/whitepaper/#merkle-trees)), die der Betreiber in Intervallen an den Plasma-Vertrag auf der Ethereum-Chain sendet. +Ein [Commitment-Verfahren](https://en.wikipedia.org/wiki/Commitment_scheme) ist eine kryptografische Technik, um sich auf einen Wert oder eine Aussage festzulegen, ohne diese einer anderen Partei preiszugeben. Commitments sind in dem Sinne „bindend“, dass man den Wert oder die Aussage nicht mehr ändern kann, sobald man sich darauf festgelegt hat. State Commitments in Plasma nehmen die Form von „Merkle-Wurzeln“ (abgeleitet von einem [Merkle-Baum](/whitepaper/#merkle-trees)) an, die der Betreiber in regelmäßigen Abständen an den Plasma-Contract auf der Ethereum-Chain sendet. -Merkle-Wurzeln sind kryptografische Primitiven, die die Komprimierung großer Informationsmengen ermöglichen. Merkle-Wurzeln sind kryptografische Primitiven, die die Komprimierung großer Informationsmengen ermöglichen. Merkle-Wurzeln erleichtern auch die Überprüfung, ob ein kleiner Teil der Daten Teil des größeren Datensatzes ist. Ein Benutzer kann beispielsweise einen [Merkle-Beweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) erbringen, um die Aufnahme einer Transaktion in einen bestimmten Block nachzuweisen. +Merkle-Wurzeln sind kryptografische Primitive, die das Komprimieren großer Informationsmengen ermöglichen. Eine Merkle-Wurzel (in diesem Fall auch „Block-Wurzel“ genannt) könnte alle Transaktionen in einem Block repräsentieren. Merkle-Wurzeln erleichtern es auch zu verifizieren, dass ein kleines Datenstück Teil des größeren Datensatzes ist. Zum Beispiel kann ein Benutzer einen [Merkle-Beweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) erstellen, um die Aufnahme einer Transaktion in einen bestimmten Block zu beweisen. -Merkle-Wurzeln sind wichtig, um Informationen über den Off-Chain-Zustand an Ethereum zu übermitteln. Man kann sich Merkle-Wurzeln als „Speicherpunkte“ vorstellen: Der Operator sagt: „Dies ist der Zustand der Plasma-Chain zum Zeitpunkt x, und dies ist die Merkle-Wurzel als Beweis.“. Der Betreiber verpflichtet sich mit einer Merkle-Root auf den _aktuellen Zustand_ der Plasma-Chain, weshalb dies als "Zustands-Commitment" bezeichnet wird. +Merkle-Wurzeln sind wichtig, um Ethereum Informationen über den Off-Chain-Zustand bereitzustellen. Man kann sich Merkle-Wurzeln als „Speicherpunkte“ vorstellen: Der Betreiber sagt: „Dies ist der Zustand der Plasma-Chain zum Zeitpunkt x, und dies ist die Merkle-Wurzel als Beweis.“ Der Betreiber legt sich mit einer Merkle-Wurzel auf den _aktuellen Zustand_ der Plasma-Chain fest, weshalb dies als „State Commitment“ bezeichnet wird. -### Ein- und Austritte {#entries-and-exits} +### Ein- und Ausgänge {#entries-and-exits} -Damit Ethereum-Benutzer Plasma nutzen können, muss es einen Mechanismus geben, um Gelder zwischen dem Mainnet und Plasma-Chains zu verschieben. Wir können jedoch nicht willkürlich Ether an eine Adresse auf der Plasma-Chain senden – diese Chains sind inkompatibel, sodass die Transaktion entweder fehlschlagen oder zu verlorenen Geldern führen würde. +Damit Ethereum-Benutzer die Vorteile von Plasma nutzen können, muss es einen Mechanismus geben, um Gelder zwischen dem Mainnet und den Plasma-Chains zu verschieben. Wir können jedoch nicht willkürlich Ether an eine Adresse auf der Plasma-Chain senden – diese Chains sind inkompatibel, sodass die Transaktion entweder fehlschlagen oder zum Verlust von Geldern führen würde. -Plasma verwendet einen Mastervertrag, der auf Ethereum läuft, um Benutzereinträge und -austritte zu verarbeiten. Dieser Mastervertrag ist auch dafür verantwortlich, Statuszusagen zu verfolgen (früher erklärt) und unehrliches Verhalten durch Betrugsnachweise zu bestrafen (mehr dazu später). +Plasma verwendet einen Master-Contract, der auf Ethereum läuft, um Benutzerein- und -ausgänge zu verarbeiten. Dieser Master-Contract ist auch dafür verantwortlich, State Commitments (wie zuvor erklärt) zu verfolgen und unehrliches Verhalten durch Betrugsnachweise zu bestrafen (dazu später mehr). -#### Eintritt in die Plasma-Chain {#entering-the-plasma-chain} +#### Betreten der Plasma-Chain {#entering-the-plasma-chain} -Um in die Plasma-Chain einzutreten, muss Alice (die Nutzerin) ETH oder einen beliebigen ERC-20 Token in den Plasma-Vertrag einzahlen. Der Plasma-Operator, der die Vertragseinzahlungen überwacht, stellt einen Betrag in Höhe von Alice' ursprünglicher Einzahlung wieder her und gibt ihn an ihre Adresse in der Plasma-Chain frei. Alice muss den Empfang der Gelder auf der Neben-Chain bestätigen und kann diese dann für Transaktionen verwenden. +Um die Plasma-Chain zu betreten, muss Alice (die Benutzerin) ETH oder einen beliebigen ERC-20-Token in den Plasma-Contract einzahlen. Der Plasma-Betreiber, der die Einzahlungen in den Contract überwacht, erstellt einen Betrag in Höhe von Alices ursprünglicher Einzahlung neu und gibt ihn an ihre Adresse auf der Plasma-Chain frei. Alice muss den Erhalt der Gelder auf der Child-Chain bestätigen und kann diese Gelder dann für Transaktionen verwenden. -#### Austritt aus der Plasma-Chain {#exiting-the-plasma-chain} +#### Verlassen der Plasma-Chain {#exiting-the-plasma-chain} -Der Austritt aus der Plasma-Chain ist aus mehreren Gründen komplizierter als der Eintritt. Der größte Grund ist, dass Ethereum zwar Informationen über den Zustand der Plasma-Chain hat, aber nicht überprüfen kann, ob die Informationen wahr sind oder nicht. Ein böswilliger Benutzer könnte eine falsche Behauptung aufstellen ("Ich habe 1000 ETH") und damit durchkommen, indem er gefälschte Nachweise vorlegt, um die Behauptung zu stützen. +Das Verlassen der Plasma-Chain ist aus mehreren Gründen komplexer als das Betreten. Der wichtigste Grund ist, dass Ethereum zwar Informationen über den Zustand der Plasma-Chain hat, aber nicht verifizieren kann, ob die Informationen wahr sind oder nicht. Ein böswilliger Benutzer könnte eine falsche Behauptung aufstellen („Ich habe 1000 ETH“) und damit durchkommen, indem er gefälschte Beweise liefert, um die Behauptung zu untermauern. -Um böswillige Abhebungen zu verhindern, wird eine "Herausforderungsperiode" eingeführt. Während der Herausforderungsperiode (normalerweise eine Woche) kann jeder einen Abhebungsantrag mithilfe eines Betrugsnachweises anfechten. Wenn die Herausforderung erfolgreich ist, wird der Abhebungsantrag abgelehnt. +Um böswillige Abhebungen zu verhindern, wird eine „Herausforderungsfrist“ (Challenge Period) eingeführt. Während der Herausforderungsfrist (normalerweise eine Woche) kann jeder eine Abhebungsanforderung mithilfe eines Betrugsnachweises anfechten. Wenn die Anfechtung erfolgreich ist, wird die Abhebungsanforderung abgelehnt. -Es ist jedoch normalerweise der Fall, dass Benutzer ehrlich sind und korrekte Angaben über die von ihnen besessenen Gelder machen. In diesem Szenario wird Alice eine Abhebungsanforderung auf der Haupt-Chain (Ethereum) einleiten, indem sie eine Transaktion an den Plasma-Vertrag sendet. +In der Regel sind die Benutzer jedoch ehrlich und machen korrekte Angaben zu den Geldern, die sie besitzen. In diesem Szenario wird Alice eine Abhebungsanforderung auf der Root-Chain (Ethereum) initiieren, indem sie eine Transaktion an den Plasma-Contract übermittelt. -Sie muss auch einen Merkle-Nachweis erbringen, der bestätigt, dass eine Transaktion, die ihre Gelder auf der Plasma-Chain erstellt hat, in einem Block enthalten war. Dies ist für Iterationen von Plasma, wie z. B. [Plasma MVP](https://www.learnplasma.org/en/learn/mvp.html), erforderlich, die ein [Unspent Transaction Output (UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output)-Modell verwenden. +Sie muss außerdem einen Merkle-Beweis vorlegen, der verifiziert, dass eine Transaktion, die ihre Gelder auf der Plasma-Chain erstellt hat, in einen Block aufgenommen wurde. Dies ist für Iterationen von Plasma wie [Plasma MVP](https://www.learnplasma.org/en/learn/mvp.html) erforderlich, die ein [Unspent Transaction Output (UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output)-Modell verwenden. -Andere, wie [Plasma Cash](https://www.learnplasma.org/en/learn/cash.html), stellen Gelder als [nicht-fungible Token](/developers/docs/standards/tokens/erc-721/) anstelle von UTXOs dar. In diesem Fall erfordert der Austritt den Nachweis des Eigentums an Token auf der Plasma-Chain. Dies wird durch das Einreichen der beiden letzten Transaktionen, die den Token betreffen, und durch das Vorlegen eines Merkle-Nachweises, der die Einbeziehung dieser Transaktionen in einen Block bestätigt, durchgeführt. +Andere, wie [Plasma Cash](https://www.learnplasma.org/en/learn/cash.html), repräsentieren Gelder als [nicht-fungible Token](/developers/docs/standards/tokens/erc-721/) anstelle von UTXOs. Eine Abhebung erfordert in diesem Fall den Nachweis des Eigentums an Token auf der Plasma-Chain. Dies geschieht durch die Übermittlung der beiden letzten Transaktionen, an denen der Token beteiligt war, und die Bereitstellung eines Merkle-Beweises, der die Aufnahme dieser Transaktionen in einen Block verifiziert. -Der Benutzer muss auch eine Sicherheit zur Abholanfrage als Garantie für ehrliches Verhalten hinzufügen. Wenn ein Herausforderer beweist, dass Alices Abholanfrage ungültig ist, wird ihre Sicherheit beschlagnahmt, und ein Teil davon wird als Belohnung an den Herausforderer überwiesen. +Der Benutzer muss der Abhebungsanforderung außerdem eine Kaution (Bond) als Garantie für ehrliches Verhalten hinzufügen. Wenn ein Herausforderer beweist, dass Alices Abhebungsanforderung ungültig ist, wird ihre Kaution einem Slashing unterzogen und ein Teil davon geht als Belohnung an den Herausforderer. -Wenn die Challengeperiode abgelaufen ist, ohne dass jemand einen Betrugsbeweis vorgelegt hat, gilt Alices Abholanfrage als gültig. Dies ermöglicht ihr, ihre Einlagen aus dem Plasma-Vertrag auf Ethereum zurückzubekommen. +Wenn die Herausforderungsfrist verstreicht, ohne dass jemand einen Betrugsnachweis erbringt, gilt Alices Abhebungsanforderung als gültig, sodass sie Einzahlungen aus dem Plasma-Contract auf Ethereum abrufen kann. -### Streitschlichtung {#dispute-arbitration} +### Streitbeilegung {#dispute-arbitration} -Wie jede Blockchain benötigen Plasma-Chains einen Mechanismus, um die Integrität der Transaktionen zu gewährleisten, falls Teilnehmer böswillig handeln (z. B. durch doppeltes Ausgeben von Geldern). Zu diesem Zweck verwenden Plasma-Chains Betrugsbeweise, um Streitigkeiten bezüglich der Gültigkeit von Zustandsübergängen zu schlichten und schädigendes Verhalten zu bestrafen. Betrugsbeweise dienen als Mechanismus, durch den eine Plasma-Child-Chain eine Beschwerde an ihre Parent-Chain oder an die Root-Chain einreicht. +Wie jede Blockchain benötigen Plasma-Chains einen Mechanismus zur Durchsetzung der Integrität von Transaktionen für den Fall, dass Teilnehmer böswillig handeln (z. B. Double-Spending von Geldern). Zu diesem Zweck verwenden Plasma-Chains Betrugsnachweise, um Streitigkeiten über die Gültigkeit von Zustandsübergängen zu schlichten und schlechtes Verhalten zu bestrafen. Betrugsnachweise werden als Mechanismus verwendet, durch den eine Plasma-Child-Chain eine Beschwerde bei ihrer Parent-Chain oder der Root-Chain einreicht. -Ein Betrugsbeweis ist einfach eine Behauptung, dass ein spezifischer Zustandsübergang ungültig ist. Ein Beispiel ist, wenn ein Benutzer (Alice) versucht, das gleiche Guthaben doppelt auszugeben. Vielleicht hat sie das UTXO in einer Transaktion mit Bob ausgegeben und möchte dasselbe UTXO (das nun Bobs ist) in einer anderen Transaktion erneut ausgeben. +Ein Betrugsnachweis ist einfach die Behauptung, dass ein bestimmter Zustandsübergang ungültig ist. Ein Beispiel ist, wenn ein Benutzer (Alice) versucht, dieselben Gelder zweimal auszugeben. Vielleicht hat sie das UTXO in einer Transaktion mit Bob ausgegeben und möchte dasselbe UTXO (das jetzt Bob gehört) in einer anderen Transaktion ausgeben. -Um die Abholung zu verhindern, wird Bob einen Betrugsbeweis erstellen, indem er Beweise vorlegt, dass Alice das genannte UTXO in einer vorherigen Transaktion ausgegeben hat, sowie einen Merkle-Beweis für die Aufnahme der Transaktion in einen Block. Der gleiche Prozess funktioniert auch in Plasma Cash—Bob müsste einen Betrugsbeweis erbringen, indem er nachweist, dass Alice die Tokens, die sie zurückholen möchte, bereits zuvor an jemand anderen übertragen hat. +Um die Abhebung zu verhindern, wird Bob einen Betrugsnachweis konstruieren, indem er Beweise dafür liefert, dass Alice das besagte UTXO in einer vorherigen Transaktion ausgegeben hat, sowie einen Merkle-Beweis für die Aufnahme der Transaktion in einen Block. Derselbe Prozess funktioniert in Plasma Cash – Bob müsste den Beweis erbringen, dass Alice die Token, die sie abzuheben versucht, zuvor übertragen hat. -Wenn Bobs Herausforderung erfolgreich ist, wird Alices Abholanfrage storniert. Allerdings beruht dieser Ansatz darauf, dass Bob die Chain nach Abholanfragen überwachen kann. Wenn Bob offline ist, kann Alice die schädliche Abholung durchführen, sobald die Challengeperiode abgelaufen ist. +Wenn Bobs Anfechtung erfolgreich ist, wird Alices Abhebungsanforderung storniert. Dieser Ansatz beruht jedoch auf Bobs Fähigkeit, die Chain auf Abhebungsanforderungen zu überwachen. Wenn Bob offline ist, kann Alice die böswillige Abhebung verarbeiten, sobald die Herausforderungsfrist abgelaufen ist. -## Das Massenabwanderungsproblem in Plasma {#the-mass-exit-problem-in-plasma} +## Das Mass-Exit-Problem in Plasma {#the-mass-exit-problem-in-plasma} -Das Massenausstiegsproblem tritt auf, wenn eine große Anzahl von Benutzern gleichzeitig versuchen, von einer Plasma-Chain abzuheben. Der Grund für dieses Problem hängt mit einem der größten Probleme von Plasma zusammen: **Datenunverfügbarkeit**. +Das Mass-Exit-Problem tritt auf, wenn eine große Anzahl von Benutzern gleichzeitig versucht, Gelder von einer Plasma-Chain abzuheben. Warum dieses Problem existiert, hat mit einem der größten Probleme von Plasma zu tun: **fehlende Datenverfügbarkeit**. -Datenverfügbarkeit ist die Fähigkeit, zu überprüfen, dass die Informationen für einen vorgeschlagenen Block tatsächlich im Blockchain-Netzwerk veröffentlicht wurden. Ein Block ist "nicht verfügbar", wenn sein Ersteller zwar den Block selbst veröffentlicht, die zum Erstellen des Blocks verwendeten Daten jedoch zurückhält. +Datenverfügbarkeit ist die Fähigkeit zu verifizieren, dass die Informationen für einen vorgeschlagenen Block tatsächlich im Blockchain-Netzwerk veröffentlicht wurden. Ein Block ist „nicht verfügbar“, wenn der Produzent den Block selbst veröffentlicht, aber Daten zurückhält, die zur Erstellung des Blocks verwendet wurden. -Blocks müssen verfügbar sein, damit Knoten den Block herunterladen und die Gültigkeit von Transaktionen überprüfen können. Blockchains gewährleisten die Datenverfügbarkeit, indem sie die Blockproduzenten dazu zwingen, alle Transaktionsdaten On-Chain zu veröffentlichen. +Blöcke müssen verfügbar sein, damit Blockchain-Knoten den Block herunterladen und die Gültigkeit von Transaktionen verifizieren können. Blockchains stellen die Datenverfügbarkeit sicher, indem sie Blockproduzenten zwingen, alle Transaktionsdaten auf der Blockchain zu veröffentlichen. -Die Datenverfügbarkeit hilft auch dabei, Offchain-Skalierungsprotokolle zu sichern, die auf der Basisschicht von Ethereum aufbauen. Durch die Verpflichtung der Betreiber dieser Chains, Transaktionsdaten auf Ethereum zu veröffentlichen, kann jeder ungültige Blöcke durch die Erstellung von Betrugsbeweisen anfechten, die auf den korrekten Zustand der Chain verweisen. +Datenverfügbarkeit hilft auch bei der Sicherung von Off-Chain-Skalierungsprotokollen, die auf der Basisschicht von Ethereum aufbauen. Indem Betreiber dieser Chains gezwungen werden, Transaktionsdaten auf Ethereum zu veröffentlichen, kann jeder ungültige Blöcke anfechten, indem er Betrugsnachweise konstruiert, die sich auf den korrekten Zustand der Chain beziehen. -Plasma-Chains speichern Transaktionsdaten hauptsächlich beim Betreiber und **veröffentlichen keine Daten auf dem Mainnet** (d.h. außer periodischen Zustands-Commitments). Dies bedeutet, dass Benutzer auf den Operator angewiesen sind, um Blockdaten bereitzustellen, falls sie Betrugsbeweise erstellen müssen, die ungültige Transaktionen anfechten. Wenn dieses System funktioniert, können Benutzer ihre Guthaben stets durch Betrugsbeweise sichern. +Plasma-Chains speichern Transaktionsdaten in erster Linie beim Betreiber und **veröffentlichen keine Daten im Mainnet** (d. h. außer regelmäßigen State Commitments). Das bedeutet, dass sich Benutzer darauf verlassen müssen, dass der Betreiber Blockdaten bereitstellt, wenn sie Betrugsnachweise erstellen müssen, um ungültige Transaktionen anzufechten. Wenn dieses System funktioniert, können Benutzer jederzeit Betrugsnachweise verwenden, um Gelder zu sichern. -Das Problem tritt auf, wenn der Operator – und nicht nur ein beliebiger Benutzer – schädigend handelt. Da der Operator die exklusive Kontrolle über die Blockchain hat, hat er einen stärkeren Anreiz, ungültige Zustandsübergänge in größerem Umfang durchzusetzen, wie zum Beispiel Guthaben der Benutzer auf der Plasma-Chain zu stehlen. +Das Problem beginnt, wenn der Betreiber, und nicht nur irgendein Benutzer, die böswillig handelnde Partei ist. Da der Betreiber die alleinige Kontrolle über die Blockchain hat, hat er einen größeren Anreiz, ungültige Zustandsübergänge in größerem Maßstab voranzutreiben, wie z. B. den Diebstahl von Geldern, die Benutzern auf der Plasma-Chain gehören. -In diesem Fall funktioniert das klassische Betrugsbeweissystem nicht. Der Operator könnte leicht eine ungültige Transaktion durchführen, die die Guthaben von Alice und Bob auf ihr eigenes Wallet überträgt, und die zur Erstellung eines Betrugsbeweises erforderlichen Daten zurückhalten. Das ist möglich, da der Operator nicht verpflichtet ist, Daten für Benutzer oder Mainnet verfügbar zu machen. +In diesem Fall funktioniert die Verwendung des klassischen Betrugsnachweissystems nicht. Der Betreiber könnte leicht eine ungültige Transaktion durchführen, die die Gelder von Alice und Bob in sein Wallet überträgt, und die Daten verbergen, die zur Erstellung des Betrugsnachweises erforderlich sind. Dies ist möglich, da der Betreiber nicht verpflichtet ist, Daten für Benutzer oder das Mainnet verfügbar zu machen. -Die optimistischste Lösung besteht darin, einen "Massenausstieg" der Benutzer aus der Plasma-Chain zu versuchen. Der Massenausstieg verlangsamt die Pläne des schädigenden Operators, Guthaben zu stehlen, und bietet ein gewisses Maß an Schutz für die Benutzer. Abholanfragen werden gemäß der Erstellungszeit jedes UTXO (oder Tokens) sortiert, was schädigende Betreiber daran hindert, ehrliche Benutzer durch Front-running zu schädigen. +Daher ist die optimistischste Lösung der Versuch eines „Mass Exits“ der Benutzer aus der Plasma-Chain. Der Mass Exit verlangsamt den Plan des böswilligen Betreibers, Gelder zu stehlen, und bietet den Benutzern ein gewisses Maß an Schutz. Abhebungsanforderungen werden basierend darauf geordnet, wann jedes UTXO (oder jeder Token) erstellt wurde, was verhindert, dass böswillige Betreiber ehrlichen Benutzern zuvorkommen (Front-Running). -Dennoch benötigen wir eine Methode, um die Gültigkeit von Abholanfragen während eines Massenausstiegs zu überprüfen – um opportunistiche Individuen daran zu hindern, vom Chaos durch die Bearbeitung ungültiger Ausstiege zu profitieren. Die Lösung ist einfach: die Benutzer müssen den letzten **gültigen Zustand der Chain** veröffentlichen, um ihr Geld abzuheben. +Dennoch benötigen wir eine Möglichkeit, die Gültigkeit von Abhebungsanforderungen während eines Mass Exits zu verifizieren – um zu verhindern, dass opportunistische Personen aus dem Chaos Kapital schlagen, indem sie ungültige Exits verarbeiten. Die Lösung ist einfach: Benutzer müssen den letzten **gültigen Zustand der Chain** veröffentlichen, um ihr Geld abzuheben. -Aber dieser Ansatz hat jedoch weiterhin Probleme. Zum Beispiel, wenn alle Benutzer einer Plasma-Chain einen Austritt benötigen (was im Falle eines schädigenden Operators möglich ist), muss der gesamte gültige Zustand der Plasma-Chain auf Ethereums Basislayer auf einmal hochgeladen werden. Bei der beliebigen Größe von Plasma-Chains (hoher Durchsatz = mehr Daten) und den Beschränkungen bei den Verarbeitungsgeschwindigkeiten von Ethereum ist dies keine ideale Lösung. +Aber dieser Ansatz hat immer noch Probleme. Wenn beispielsweise alle Benutzer einer Plasma-Chain aussteigen müssen (was im Falle eines böswilligen Betreibers möglich ist), muss der gesamte gültige Zustand der Plasma-Chain auf einmal auf die Basisschicht von Ethereum übertragen werden. Angesichts der beliebigen Größe von Plasma-Chains (hoher Durchsatz = mehr Daten) und der Einschränkungen der Verarbeitungsgeschwindigkeiten von Ethereum ist dies keine ideale Lösung. -Obwohl Exit-Games in der Theorie verlockend klingen, könnten realisierte Massenausstiege vermutlich Netzwerkauslastung auf Ethereum selbst auslösen. Zusätzlich zur Beeinträchtigung der Funktionalität von Ethereum bedeutet ein ungenügend koordinierter Massenausstieg, dass Benutzer möglicherweise nicht in der Lage sind, ihr Geld abzuheben, bevor der Betreiber alle Konten auf der Plasma-Chain entleert. +Obwohl Exit-Spiele in der Theorie gut klingen, werden Mass Exits im wirklichen Leben wahrscheinlich netzwerkweite Überlastungen auf Ethereum selbst auslösen. Abgesehen von der Beeinträchtigung der Funktionalität von Ethereum bedeutet ein schlecht koordinierter Mass Exit, dass Benutzer möglicherweise keine Gelder abheben können, bevor der Betreiber jedes Konto auf der Plasma-Chain leert. ## Vor- und Nachteile von Plasma {#pros-and-cons-of-plasma} -| Pro | Nachteile | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Bietet hohen Durchsatz und niedrige Kosten pro Transaktion. | Unterstützt keine allgemeine Berechnung (kann keine Smart Contracts ausführen). Nur grundlegende Token-Transfers, Swaps und ein paar andere Transaktionstypen werden über Prädikatslogik unterstützt. | -| Gut für Transaktionen zwischen beliebigen Benutzern (kein Overhead pro Benutzer-Paar, wenn beide auf der Plasma-Chain festgelegt sind) | Benötigt ein regelmäßiges Beobachten des Netzwerks (Lebendigkeitserfordernis) oder das Delegieren dieser Verantwortung an andere, um die Sicherheit der eingesetzten Gelder zu gewährleisten. | -| Plasma-Chains können an spezifische Use-Cases angepasst werden, die unabhängig von der Main-Chain sind. Jeder, einschließlich Unternehmen, kann Plasma-Smart-Contracts anpassen, um skalierbare Infrastruktur bereitzustellen, die in verschiedenen Kontexten funktioniert. | Verlässt sich auf einen oder mehrere Operatoren, um Daten zu speichern und abzufragen. | -| Entlastet das Ethereum-Mainnet, indem Rechenleistung und Speicher offchain verlagert werden. | Auszahlungen werden um mehrere Tage verzögert, um Herausforderungen zu ermöglichen und potenzielle Streitigkeiten zu lösen. Für fungible Vermögenswerte kann dies durch Liquiditätsanbieter gemindert werden, aber es entstehen damit verbundene Kapitalkosten. | -| | Wenn zu viele Benutzer gleichzeitig einen Austritt beantragen, könnte Ethereum Mainnet überlastet werden. | +| Vorteile | Nachteile | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Bietet hohen Durchsatz und niedrige Kosten pro Transaktion. | Unterstützt keine allgemeinen Berechnungen (kann keine Smart Contracts ausführen). Nur grundlegende Token-Transfers, Swaps und einige andere Transaktionstypen werden über Prädikatenlogik unterstützt. | +| Gut für Transaktionen zwischen beliebigen Benutzern (kein Overhead pro Benutzerpaar, wenn beide auf der Plasma-Chain etabliert sind). | Man muss das Netzwerk regelmäßig überwachen (Liveness-Anforderung) oder diese Verantwortung an jemand anderen delegieren, um die Sicherheit der Gelder zu gewährleisten. | +| Plasma-Chains können an spezifische Anwendungsfälle angepasst werden, die nichts mit der Main-Chain zu tun haben. Jeder, einschließlich Unternehmen, kann Plasma-Smart-Contracts anpassen, um eine skalierbare Infrastruktur bereitzustellen, die in verschiedenen Kontexten funktioniert. | Verlässt sich auf einen oder mehrere Betreiber, um Daten zu speichern und auf Anfrage bereitzustellen. | +| Reduziert die Last auf dem Ethereum Mainnet, indem Berechnungen und Speicherung Off-Chain verlagert werden. | Abhebungen verzögern sich um mehrere Tage, um Anfechtungen zu ermöglichen. Bei fungiblen Vermögenswerten kann dies durch Liquiditätsanbieter gemildert werden, ist jedoch mit Kapitalkosten verbunden. | +| | Wenn zu viele Benutzer gleichzeitig versuchen auszusteigen, könnte das Ethereum Mainnet überlastet werden. | -## Plasma vs. Layer-2-Skalierungsprotokolle {#plasma-vs-layer-2} +## Plasma vs. Ebene 2 Skalierungsprotokolle {#plasma-vs-layer-2} -Obwohl Plasma einst als nützliche Skalierungslösung für Ethereum galt, wurde es inzwischen zugunsten von [Layer-2 (L2)-Skalierungsprotokollen](/layer-2/) aufgegeben. L2-Skalierungsprotokolle beheben mehrere Probleme von Plasma: +Während Plasma einst als nützliche Skalierungslösung für Ethereum galt, wurde es inzwischen zugunsten von [Ebene 2 (L2) Skalierungsprotokollen](/layer-2/) aufgegeben. L2-Skalierungslösungen beheben mehrere Probleme von Plasma: ### Effizienz {#efficiency} -[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups) erzeugen kryptografische Beweise für die Gültigkeit jedes Transaktionsstapels, der off-chain verarbeitet wird. Dies verhindert, dass Benutzer (und Betreiber) ungültige Zustandsübergänge vorantreiben, was die Notwendigkeit von Challengeperioden und Exit-Games beseitigt. Damit müssen Benutzer ihre Guthaben nicht mehr regelmäßig über die Chain überwachen, um sie zu schützen. +[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups) generieren kryptografische Beweise für die Gültigkeit jedes Stapels von Transaktionen, die Off-Chain verarbeitet werden. Dies hindert die Benutzer (und Betreiber) daran, ungültige Zustandsübergänge voranzutreiben, wodurch die Notwendigkeit von Herausforderungsfristen und Exit-Spielen entfällt. Es bedeutet auch, dass Benutzer die Chain nicht regelmäßig überwachen müssen, um ihre Gelder zu sichern. ### Unterstützung für Smart Contracts {#support-for-smart-contracts} -Ein weiteres Problem mit dem Plasma-Framework war [die Unfähigkeit, die Ausführung von Ethereum Smart Contracts zu unterstützen](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4). Daher wurden die meisten Plasma-Implementierungen hauptsächlich für einfache Zahlungen oder den Austausch von ERC-20-Tokens entwickelt. +Ein weiteres Problem mit dem Plasma-Framework war [die Unfähigkeit, die Ausführung von Ethereum-Smart-Contracts zu unterstützen](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4). Infolgedessen wurden die meisten Implementierungen von Plasma hauptsächlich für einfache Zahlungen oder den Austausch von ERC-20-Token entwickelt. -Im Gegensatz dazu sind Optimistic Rollups mit der [Ethereum Virtual Machine](/developers/docs/evm/) kompatibel und können native Ethereum-[Smart Contracts](/developers/docs/smart-contracts/) ausführen, was sie zu einer nützlichen und _sicheren_ Lösung für die Skalierung [dezentralisierter Anwendungen](/developers/docs/dapps/) macht. In ähnlicher Weise gibt es Pläne, eine [Zero-Knowledge-Implementierung der EVM (zkEVM) zu erstellen](https://ethresear.ch/t/a-zk-evm-specification/11549), die es ZK-Rollups ermöglichen würde, beliebige Logik zu verarbeiten und Smart Contracts auszuführen. +Im Gegensatz dazu sind Optimistic Rollups mit der [Ethereum Virtual Machine](/developers/docs/evm/) kompatibel und können Ethereum-native [Smart Contracts](/developers/docs/smart-contracts/) ausführen, was sie zu einer nützlichen und _sicheren_ Lösung für die Skalierung [dezentralisierter Anwendungen](/developers/docs/dapps/) macht. Ebenso gibt es Pläne, [eine Zero-Knowledge-Implementierung der EVM (zkEVM) zu erstellen](https://ethresear.ch/t/a-zk-evm-specification/11549), die es ZK-Rollups ermöglichen würde, beliebige Logik zu verarbeiten und Smart Contracts auszuführen. -### Datenunverfügbarkeit {#data-unavailability} +### Fehlende Datenverfügbarkeit {#data-unavailability} -Wie bereits erläutert, leidet Plasma unter einem Datenverfügbarkeitsproblem. Wenn ein schädigender Operator einen ungültigen Zustandsübergang in der Plasma-Chain vorantreibt, könnten Benutzer ihn nicht anfechten, da der Operator die zum Erstellen eines Betrugsbeweises benötigten Daten zurückhalten kann. Rollups lösen dieses Problem, indem sie Betreiber verpflichten, Transaktionsdaten auf Ethereum zu veröffentlichen. Dies ermöglicht es jedem, den Zustand der Chain zu überprüfen und gegebenenfalls Betrugsbeweise zu erstellen. +Wie bereits erklärt, leidet Plasma unter einem Datenverfügbarkeitsproblem. Wenn ein böswilliger Betreiber einen ungültigen Übergang auf der Plasma-Chain vorantreibt, könnten Benutzer diesen nicht anfechten, da der Betreiber Daten zurückhalten kann, die zur Erstellung des Betrugsnachweises erforderlich sind. Rollups lösen dieses Problem, indem sie Betreiber zwingen, Transaktionsdaten auf Ethereum zu veröffentlichen, sodass jeder den Zustand der Chain verifizieren und bei Bedarf Betrugsnachweise erstellen kann. -### Massenabwanderungsproblem {#mass-exit-problem} +### Mass-Exit-Problem {#mass-exit-problem} -ZK-Rollups und Optimistische Rollups lösen das Massenausstiegsproblem von Plasma auf verschiedene Weise. Ein ZK-Rollup verlässt sich auf kryptografische Mechanismen, die gewährleisten, dass Betreiber keine Guthaben von Nutzern stehlen können, unabhängig vom Szenario. +ZK-Rollups und Optimistic Rollups lösen beide das Mass-Exit-Problem von Plasma auf verschiedene Weise. Zum Beispiel verlässt sich ein ZK-Rollup auf kryptografische Mechanismen, die sicherstellen, dass Betreiber unter keinen Umständen Benutzergelder stehlen können. -Optimistische Rollups legen eine Verzögerungsperiode für Abhebungen fest, in der jeder eine Herausforderung einleiten und schädliche Abhebeanträge verhindern kann. Obwohl dies ähnlich wie Plasma ist, besteht der Unterschied jedoch darin, dass Verifizierer auf die benötigten Daten zum Erstellen von Betrugsbeweisen zugreifen können. Daher besteht für Benutzer von Rollups kein Grund, eine panische "Erstausstiegs"-Migration nach Ethereum Mainnet zu starten. +Ebenso erlegen Optimistic Rollups Abhebungen eine Verzögerungsfrist auf, während der jeder eine Anfechtung initiieren und böswillige Abhebungsanforderungen verhindern kann. Obwohl dies Plasma ähnelt, besteht der Unterschied darin, dass Verifizierer Zugriff auf Daten haben, die zur Erstellung von Betrugsnachweisen erforderlich sind. Daher besteht für Rollup-Benutzer keine Notwendigkeit, sich an einer hektischen „Wer-zuerst-raus-ist“-Migration zum Ethereum Mainnet zu beteiligen. ## Wie unterscheidet sich Plasma von Sidechains und Sharding? {#plasma-sidechains-sharding} -Plasma, Sidechains und Sharding sind ziemlich ähnlich, da sie alle auf unterschiedliche Weise mit Ethereum Mainnet verbunden sind. Allerdings variieren die Stufe und Stärke dieser Verbindungen, was die Sicherheitsmerkmale jeder Skalierungslösung beeinflusst. +Plasma, Sidechains und Sharding sind sich ziemlich ähnlich, da sie alle auf irgendeine Weise mit dem Ethereum Mainnet verbunden sind. Das Niveau und die Stärke dieser Verbindungen variieren jedoch, was sich auf die Sicherheitseigenschaften jeder Skalierungslösung auswirkt. ### Plasma vs. Sidechains {#plasma-vs-sidechains} -Eine [Sidechain](/developers/docs/scaling/sidechains/) ist eine unabhängig betriebene Blockchain, die über eine bidirektionale kettenübergreifende Brücke mit dem Ethereum Mainnet verbunden ist. [Kettenübergreifende Brücken](/bridges/) ermöglichen es Benutzern, Token zwischen den beiden Blockchains auszutauschen, um Transaktionen auf der Sidechain durchzuführen. Dies reduziert die Überlastung des Ethereum Mainnets und verbessert die Skalierbarkeit. -Sidechains verwenden einen eigenen Konsensmechanismus und sind im Allgemeinen deutlich kleiner als Ethereum Mainnet. Als Ergebnis birgt das Übertragen von Assets über Bridges auf diese Ketten ein erhöhtes Risiko; da die Sicherheitsgarantien von Ethereum Mainnet im Sidechain-Modell nicht übernommen werden, riskieren Benutzer bei einem Angriff auf die Sidechain den Verlust ihrer Guthaben. +Eine [Sidechain](/developers/docs/scaling/sidechains/) ist eine unabhängig betriebene Blockchain, die über eine Zwei-Wege-Brücke mit dem Ethereum Mainnet verbunden ist. [Kettenübergreifende Brücken](/bridges/) ermöglichen es Benutzern, Token zwischen den beiden Blockchains auszutauschen, um auf der Sidechain zu transagieren, was die Überlastung im Ethereum Mainnet reduziert und die Skalierbarkeit verbessert. +Sidechains verwenden einen separaten Konsensmechanismus und sind in der Regel viel kleiner als das Ethereum Mainnet. Infolgedessen ist das Überbrücken von Vermögenswerten auf diese Chains mit einem erhöhten Risiko verbunden; angesichts der fehlenden Sicherheitsgarantien, die im Sidechain-Modell vom Ethereum Mainnet geerbt werden, riskieren Benutzer den Verlust von Geldern bei einem Angriff auf die Sidechain. -Im Gegensatz dazu leiten Plasma-Chains ihre Sicherheit von Mainnet ab. Dies macht sie messbar sicherer als Sidechains. Sowohl Sidechains als auch Plasma-Chains können unterschiedliche Konsensprotokolle haben, aber der Unterschied besteht darin, dass Plasma-Chains die Merkle-Wurzel jedes Blocks auf Ethereum Mainnet veröffentlichen. Merkle-Wurzeln sind kleine Datenstücke, die wir verwenden können, um Informationen über Transaktionen zu überprüfen, die auf einer Plasma-Chain durchgeführt werden. Falls auf einer Plasma-Chain ein Angriff geschieht, können Benutzer ihr Guthaben sicher zurück auf Mainnet abheben, indem sie die entsprechenden Beweise verwenden. +Im Gegensatz dazu leiten Plasma-Chains ihre Sicherheit vom Mainnet ab. Dies macht sie messbar sicherer als Sidechains. Sowohl Sidechains als auch Plasma-Chains können unterschiedliche Konsensprotokolle haben, aber der Unterschied besteht darin, dass Plasma-Chains Merkle-Wurzeln für jeden Block im Ethereum Mainnet veröffentlichen. Block-Wurzeln sind kleine Informationseinheiten, die wir verwenden können, um Informationen über Transaktionen zu verifizieren, die auf einer Plasma-Chain stattfinden. Wenn ein Angriff auf eine Plasma-Chain stattfindet, können Benutzer ihre Gelder mithilfe der entsprechenden Beweise sicher auf das Mainnet zurückziehen. ### Plasma vs. Sharding {#plasma-vs-sharding} -Sowohl Plasma-Chains als auch Shard-Chains veröffentlichen periodisch kryptografische Beweise auf Ethereum Mainnet. Beide haben jedoch unterschiedliche Sicherheitseigenschaften. +Sowohl Plasma-Chains als auch Shard-Chains veröffentlichen regelmäßig kryptografische Beweise im Ethereum Mainnet. Beide haben jedoch unterschiedliche Sicherheitseigenschaften. -Shard-Chains senden "Kollationsköpfe" an das Mainnet, die detaillierte Informationen über jeden Datenshard enthalten. Nodes im Mainnet überprüfen und erzwingen die Gültigkeit der Datenshards, wodurch die Möglichkeit ungültiger Shard-Übergänge reduziert und das Netzwerk vor bösartigen Aktivitäten geschützt wird. +Shard-Chains übermitteln „Collation-Header“ an das Mainnet, die detaillierte Informationen über jeden Daten-Shard enthalten. Blockchain-Knoten im Mainnet verifizieren und erzwingen die Gültigkeit von Daten-Shards, was die Möglichkeit ungültiger Shard-Übergänge verringert und das Netzwerk vor böswilligen Aktivitäten schützt. -Plasma unterscheidet sich, da das Mainnet nur minimale Informationen über den Zustand der Child-Chains erhält. Das bedeutet, dass das Mainnet Transaktionen, die auf Child-Chains durchgeführt werden, nicht effektiv überprüfen kann, was diese weniger sicher macht. +Plasma ist anders, weil das Mainnet nur minimale Informationen über den Zustand von Child-Chains erhält. Das bedeutet, dass das Mainnet Transaktionen, die auf Child-Chains durchgeführt werden, nicht effektiv verifizieren kann, was sie weniger sicher macht. -**Hinweis**: Das Sharding der Ethereum-Blockchain steht nicht mehr auf dem Fahrplan. Es wurde durch die Skalierung über Rollups und [Danksharding](/roadmap/danksharding) ersetzt. +**Hinweis:** Das Sharding der Ethereum-Blockchain steht nicht mehr auf der Roadmap. Es wurde durch die Skalierung über Rollups und [Danksharding](/roadmap/danksharding) ersetzt. ### Plasma verwenden {#use-plasma} -Mehrere Projekte bieten Implementierungen von Plasma an, die Sie in Ihre dApps integrieren können: +Mehrere Projekte bieten Implementierungen von Plasma an, die Sie in Ihre Dapps integrieren können: -- [Polygon](https://polygon.technology/) (früher Matic Network) +- [Polygon](https://polygon.technology/) (ehemals Matic Network) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Mehr über Plasma erfahren](https://www.learnplasma.org/en/) -- [Eine kurze Erinnerung daran, was "geteilte Sicherheit" bedeutet und warum sie so wichtig ist](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) +- [Learn Plasma](https://www.learnplasma.org/en/) +- [Eine kurze Erinnerung daran, was „Shared Security“ bedeutet und warum sie so wichtig ist](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) - [Sidechains vs. Plasma vs. Sharding](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) - [Plasma verstehen, Teil 1: Die Grundlagen](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) -- [Aufstieg und Fall von Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) +- [Das Leben und Sterben von Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ + +## Tutorials: Plasma-Chains auf Ethereum {#tutorials} + +- [Schreiben Sie ein App-spezifisches Plasma, das die Privatsphäre wahrt](/developers/tutorials/app-plasma/) _– Erstellen Sie eine datenschutzfreundliche Plasma-Anwendung unter Verwendung von Zero-Knowledge-Beweisen und Off-Chain-Komponenten._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/sidechains/index.md b/public/content/translations/de/developers/docs/scaling/sidechains/index.md index 19d12d15c0b..10b3bab7c20 100644 --- a/public/content/translations/de/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/de/developers/docs/scaling/sidechains/index.md @@ -1,64 +1,64 @@ --- -title: Seitenketten +title: Sidechains description: "Eine Einführung in Sidechains als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird." lang: de sidebarDepth: 3 --- -Eine Sidechain ist eine separate Blockchain, die unabhängig von Ethereum läuft und durch eine Zwei-Wege-Brücke mit Ethereum Mainnet verbunden ist. Sidechains können separate Blockparameter und [Konsensalgorithmen](/developers/docs/consensus-mechanisms/) haben, die oft für die effiziente Verarbeitung von Transaktionen ausgelegt sind. Die Nutzung einer Sidechain bringt jedoch Kompromisse mit sich, da sie nicht die Sicherheitseigenschaften von Ethereum erben. Anders als [Layer-2-Skalierungslösungen](/layer-2/) übertragen Sidechains keine Zustandsänderungen und Transaktionsdaten zurück an das Ethereum-Mainnet. +Eine Sidechain ist eine separate Blockchain, die unabhängig von [Ethereum](/) läuft und über eine kettenübergreifende Zwei-Wege-Brücke mit dem Ethereum-Mainnet verbunden ist. Sidechains können separate Blockparameter und [Konsensalgorithmen](/developers/docs/consensus-mechanisms/) haben, die oft für die effiziente Verarbeitung von Transaktionen ausgelegt sind. Die Nutzung einer Sidechain ist jedoch mit Kompromissen verbunden, da sie nicht die Sicherheitseigenschaften von Ethereum erben. Im Gegensatz zu [Skalierungslösungen der Ebene 2](/layer-2/) senden Sidechains keine Zustandsänderungen und Transaktionsdaten an das Ethereum-Mainnet zurück. -Sidechains opfern auch ein gewisses Maß an Dezentralisierung oder Sicherheit, um einen hohen Durchsatz zu erreichen ([Skalierbarkeitstrilemma](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Ethereum setzt sich jedoch für eine Skalierung ein, ohne Kompromisse bei Dezentralisierung und Sicherheit einzugehen. +Sidechains opfern zudem ein gewisses Maß an Dezentralisierung oder Sicherheit, um einen hohen Durchsatz zu erreichen ([Skalierbarkeits-Trilemma](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Ethereum hat sich jedoch der Skalierung verschrieben, ohne Kompromisse bei Dezentralisierung und Sicherheit einzugehen. ## Wie funktionieren Sidechains? {#how-do-sidechains-work} -Sidechains sind unabhängige Blockchains mit unterschiedlichen Historien, Entwicklungs-Roadmaps und Designüberlegungen. Während eine Sidechain oberflächliche Ähnlichkeiten mit Ethereum aufweisen kann, hat sie mehrere besondere Merkmale. +Sidechains sind unabhängige Blockchains mit unterschiedlichen Historien, Entwicklungs-Roadmaps und Designüberlegungen. Während eine Sidechain oberflächliche Ähnlichkeiten mit Ethereum aufweisen kann, hat sie mehrere charakteristische Merkmale. ### Konsensalgorithmen {#consensus-algorithms} -Eines der Merkmale, die Sidechains einzigartig machen (d. h. anders als Ethereum), ist der verwendete Konsensalgorithmus. Sidechains verlassen sich nicht auf Ethereum für den Konsens und können alternative Konsensprotokolle wählen, die ihren Bedürfnissen entsprechen. Einige Beispiele für Konsensalgorithmen, die auf Sidechains verwendet werden, sind: +Eine der Eigenschaften, die Sidechains einzigartig machen (d. h. anders als Ethereum), ist der verwendete Konsensalgorithmus. Sidechains sind für den Konsens nicht auf Ethereum angewiesen und können alternative Konsensprotokolle wählen, die ihren Anforderungen entsprechen. Einige Beispiele für Konsensalgorithmen, die auf Sidechains verwendet werden, sind: - [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) -- [Delegierter Proof-of-Stake](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) +- [Delegated Proof-of-Stake](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) - [Byzantinische Fehlertoleranz](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained). -Wie Ethereum haben auch Sidechains validierende Nodes, die Transaktionen verifizieren und verarbeiten, Blöcke produzieren und den Blockchain-Zustand speichern. Validatoren sind auch dafür verantwortlich, den Konsens im Netzwerk aufrechtzuerhalten und es vor böswilligen Angriffen zu schützen. +Wie Ethereum verfügen Sidechains über validierende Blockchain-Knoten, die Transaktionen verifizieren und verarbeiten, Blöcke produzieren und den Blockchain-Zustand speichern. Validatoren sind auch dafür verantwortlich, den Konsens im gesamten Netzwerk aufrechtzuerhalten und es gegen böswillige Angriffe abzusichern. -#### Block-Parameter {#block-parameters} +#### Blockparameter {#block-parameters} -Ethereum setzt Grenzen für [Blockzeiten](/developers/docs/blocks/#block-time) (d. h. die Zeit, die für die Erzeugung neuer Blöcke benötigt wird) und [Blockgrößen](/developers/docs/blocks/#block-size) (d. h. die in einem Block enthaltene Datenmenge, die in Gas angegeben wird). Umgekehrt verwenden Sidechains oft andere Parameter, wie z. B. schnellere Blockzeiten und höhere Gaslimits, um einen hohen Durchsatz, schnelle Transaktionen und niedrige Gebühren zu erreichen. +Ethereum setzt Grenzen für [Blockzeiten](/developers/docs/blocks/#block-time) (d. h. die Zeit, die benötigt wird, um neue Blöcke zu produzieren) und [Blockgrößen](/developers/docs/blocks/#block-size) (d. h. die in Gas angegebene Datenmenge pro Block). Im Gegensatz dazu verwenden Sidechains oft andere Parameter, wie schnellere Blockzeiten und höhere Gaslimits, um einen hohen Durchsatz, schnelle Transaktionen und niedrige Gebühren zu erreichen. -Während dies einige Vorteile hat, hat es kritische Auswirkungen auf die Netzwerkdezentralisierung und Sicherheit. Blockparameter, wie schnelle Blockzeiten und große Blockgrößen, erhöhen die Schwierigkeit, einen vollständigen Node zu betreiben – wodurch einige wenige "Supernodes" für die Sicherung der Chain verantwortlich sind. In einem solchen Szenario steigt die Möglichkeit von Validator-Absprachen oder einer böswilligen Übernahme der Chain. +Obwohl dies einige Vorteile hat, bringt es kritische Auswirkungen auf die Dezentralisierung und Sicherheit des Netzwerks mit sich. Blockparameter wie schnelle Blockzeiten und große Blockgrößen erhöhen die Schwierigkeit, einen vollständigen Blockchain-Knoten zu betreiben – wodurch nur wenige „Superknoten“ für die Sicherung der Chain verantwortlich bleiben. In einem solchen Szenario steigt die Wahrscheinlichkeit von Absprachen zwischen Validatoren oder einer böswilligen Übernahme der Chain. -Damit Blockchains skalieren können, ohne die Dezentralisierung zu beeinträchtigen, muss der Betrieb eines Nodes für jeden offen sein – nicht unbedingt für Parteien mit spezialisierter Hardware. Deshalb wird daran gearbeitet, sicherzustellen, dass jeder im Ethereum-Netzwerk [einen Full-Node betreiben](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) kann. +Damit Blockchains skalieren können, ohne die Dezentralisierung zu beeinträchtigen, muss der Betrieb eines Blockchain-Knotens für jeden offen sein – nicht nur für Parteien mit spezialisierter Hardware. Aus diesem Grund laufen Bemühungen, um sicherzustellen, dass jeder einen [vollständigen Blockchain-Knoten](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) im Ethereum-Netzwerk betreiben kann. ### EVM-Kompatibilität {#evm-compatibility} -Einige Sidechains sind EVM-kompatibel und können Verträge ausführen, die für die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) entwickelt wurden. EVM-kompatible Sidechains unterstützen Smart Contracts, [die in Solidity geschrieben wurden](/developers/docs/smart-contracts/languages/), sowie andere EVM-Smart-Contract-Sprachen. Das bedeutet, dass für das Ethereum-Mainnet geschriebene Smart Contracts auch auf EVM-kompatiblen Sidechains funktionieren. +Einige Sidechains sind EVM-kompatibel und können Verträge ausführen, die für die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) entwickelt wurden. EVM-kompatible Sidechains unterstützen Smart Contracts, die [in Solidity geschrieben](/developers/docs/smart-contracts/languages/) wurden, sowie andere EVM-Smart-Contract-Sprachen. Das bedeutet, dass Smart Contracts, die für das Ethereum-Mainnet geschrieben wurden, auch auf EVM-kompatiblen Sidechains funktionieren. -Das bedeutet, wenn Sie Ihre [Dapp](/developers/docs/dapps/) auf einer Sidechain verwenden möchten, müssen Sie lediglich Ihren [Smart Contract](/developers/docs/smart-contracts/) auf dieser Sidechain bereitstellen. Es sieht aus, fühlt sich an und verhält sich genau wie Mainnet – Sie schreiben Verträge in Solidity und interagieren mit der Chain über die Sidechain-RPC. +Das bedeutet, wenn Sie Ihre [Dapp](/developers/docs/dapps/) auf einer Sidechain nutzen möchten, müssen Sie lediglich Ihren [Smart Contract](/developers/docs/smart-contracts/) auf dieser Sidechain bereitstellen. Es sieht aus, fühlt sich an und verhält sich genau wie das Mainnet – Sie schreiben Verträge in Solidity und interagieren mit der Chain über den RPC der Sidechain. -Da Sidechains EVM-kompatibel sind, gelten sie als nützliche [Skalierungslösung](/developers/docs/scaling/) für Ethereum-native Dapps. Mit Ihrer Dapp auf einer Sidechain können Nutzer niedrigere Gasgebühren und schnellere Transaktionen genießen, besonders wenn Mainnet überlastet ist. +Da Sidechains EVM-kompatibel sind, gelten sie als nützliche [Skalierungslösung](/developers/docs/scaling/) für Ethereum-native Dapps. Mit Ihrer Dapp auf einer Sidechain können Benutzer von niedrigeren Gasgebühren und schnelleren Transaktionen profitieren, insbesondere wenn das Mainnet überlastet ist. -Jedoch bringt die Verwendung einer Sidechain, wie bereits erläutert, erhebliche Nachteile mit sich. Jede Sidechain ist für ihre eigene Sicherheit verantwortlich und erbt nicht die Sicherheitseigenschaften von Ethereum. Dies erhöht die Möglichkeit bösartigen Verhaltens, was Ihre Nutzer beeinträchtigen oder ihre Gelder gefährden kann. +Wie bereits erklärt, ist die Nutzung einer Sidechain jedoch mit erheblichen Kompromissen verbunden. Jede Sidechain ist für ihre eigene Sicherheit verantwortlich und erbt nicht die Sicherheitseigenschaften von Ethereum. Dies erhöht die Wahrscheinlichkeit von böswilligem Verhalten, das Ihre Benutzer beeinträchtigen oder deren Gelder gefährden kann. -### Asset-Bewegung {#asset-movement} +### Bewegung von Vermögenswerten {#asset-movement} -Damit eine separate Blockchain zu einer Sidechain des Ethereum Mainnets werden kann, braucht sie die Fähigkeit, den Transfer von Vermögenswerten vom und zum Ethereum Mainnet zu ermöglichen. Diese Interoperabilität mit Ethereum wird durch eine Blockchain-Brücke erreicht. [Kettenübergreifende Brücken](/bridges/) verwenden Smart Contracts, die auf dem Ethereum-Mainnet und einer Sidechain bereitgestellt werden, um das Bridging von Geldern zwischen ihnen zu steuern. +Damit eine separate Blockchain zu einer Sidechain des Ethereum-Mainnets werden kann, muss sie in der Lage sein, den Transfer von Vermögenswerten vom und zum Ethereum-Mainnet zu erleichtern. Diese Interoperabilität mit Ethereum wird durch eine kettenübergreifende Brücke erreicht. [Kettenübergreifende Brücken](/bridges/) verwenden Smart Contracts, die auf dem Ethereum-Mainnet und einer Sidechain bereitgestellt werden, um die Überbrückung von Geldern zwischen ihnen zu steuern. -Während Brücken Nutzern helfen, Gelder zwischen Ethereum und der Sidechain zu bewegen, werden die Vermögenswerte nicht physisch über die beiden Ketten bewegt. Stattdessen werden Mechanismen, die typischerweise Minting und Burning beinhalten, für die Wertübertragung zwischen Ketten verwendet. Mehr darüber, [wie kettenübergreifende Brücken funktionieren](/developers/docs/bridges/#how-do-bridges-work). +Während kettenübergreifende Brücken Benutzern helfen, Gelder zwischen Ethereum und der Sidechain zu bewegen, werden die Vermögenswerte nicht physisch über die beiden Chains hinweg verschoben. Stattdessen werden Mechanismen, die typischerweise das Prägen und Verbrennen umfassen, für den Werttransfer über Chains hinweg verwendet. Mehr darüber, [wie kettenübergreifende Brücken funktionieren](/developers/docs/bridges/#how-do-bridges-work). ## Vor- und Nachteile von Sidechains {#pros-and-cons-of-sidechains} -| Pro | Nachteile | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Die Technologie, die Sidechains untermauert, ist bewährt und profitiert von umfangreicher Forschung und Designverbesserungen. | Sidechains tauschen ein gewisses Maß an Dezentralisierung und Vertrauenslosigkeit gegen Skalierbarkeit ein. | -| Sidechains unterstützen allgemeine Berechnungen und bieten EVM-Kompatibilität (sie können Ethereum-eigene DApps ausführen). | Eine Sidechain nutzt einen separaten Konsensmechanismus und profitiert nicht von Ethereums Sicherheitsgarantien. | -| Sidechains verwenden verschiedene Konsensmodelle, um Transaktionen effizient zu verarbeiten und Transaktionsgebühren für Nutzer zu senken. | idechains erfordern höhere Vertrauensvoraussetzungen (z.B. kann ein Quorum bösartiger Sidechain-Validatoren Betrug begehen). | -| EVM-kompatible Sidechains ermöglichen es DApps, ihr Ökosystem zu erweitern. | | +| Vorteile | Nachteile | +| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| Die Technologie, die Sidechains zugrunde liegt, ist gut etabliert und profitiert von umfangreicher Forschung und Designverbesserungen. | Sidechains opfern ein gewisses Maß an Dezentralisierung und Vertrauenslosigkeit für Skalierbarkeit. | +| Sidechains unterstützen allgemeine Berechnungen und bieten EVM-Kompatibilität (sie können Ethereum-native Dapps ausführen). | Eine Sidechain verwendet einen separaten Konsensmechanismus und profitiert nicht von den Sicherheitsgarantien von Ethereum. | +| Sidechains verwenden unterschiedliche Konsensmodelle, um Transaktionen effizient zu verarbeiten und die Transaktionsgebühren für Benutzer zu senken. | Sidechains erfordern höhere Vertrauensannahmen (z. B. kann ein Quorum böswilliger Sidechain-Validatoren Betrug begehen). | +| EVM-kompatible Sidechains ermöglichen es Dapps, ihr Ökosystem zu erweitern. | | -### Sidechains verwenden {#use-sidechains} +### Sidechains nutzen {#use-sidechains} -Mehrere Projekte bieten Implementierungen von Sidechains, die Sie in Ihre dApps integrieren können: +Mehrere Projekte bieten Implementierungen von Sidechains an, die Sie in Ihre Dapps integrieren können: - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) @@ -66,8 +66,8 @@ Mehrere Projekte bieten Implementierungen von Sidechains, die Sie in Ihre dApps - [Loom Network](https://loomx.io/) - [Metis Andromeda](https://www.metis.io/) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Skalierung von Ethereum-Dapps durch Sidechains](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _8. Feb. 2018 – Georgios Konstantopoulos_ +- [Scaling Ethereum dapps through Sidechains](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _8. Feb. 2018 – Georgios Konstantopoulos_ -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/state-channels/index.md b/public/content/translations/de/developers/docs/scaling/state-channels/index.md index 1b977461cd6..bdb25a17796 100644 --- a/public/content/translations/de/developers/docs/scaling/state-channels/index.md +++ b/public/content/translations/de/developers/docs/scaling/state-channels/index.md @@ -1,247 +1,247 @@ --- -title: "Zustandskanäle" -description: "Eine Einführung in Zustandskanäle und Zahlungskanäle als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird." +title: State Channels +description: "Eine Einführung in State Channels und Payment Channels als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird." lang: de sidebarDepth: 3 --- -State Channels ermöglichen es Teilnehmenden, sicher außerhalb der Blockchain (offchain) zu transaktieren, während die Interaktion mit dem Ethereum-Mainnet auf ein Minimum reduziert bleibt. Die Peers eines Channels können eine beliebige Anzahl von Offchain-Transaktionen durchführen, wobei lediglich zwei Onchain-Transaktionen erforderlich sind – zum Öffnen und Schließen des Channels. Dadurch wird eine äußerst hohe Transaktionsdurchsatzrate erreicht und die Kosten für Nutzer:innen gesenkt. +State Channels ermöglichen es den Teilnehmern, sicher Off-Chain zu transagieren, während die Interaktion mit dem [Ethereum](/)-Mainnet auf ein Minimum beschränkt bleibt. Kanal-Peers können eine beliebige Anzahl von Off-Chain-Transaktionen durchführen, während sie nur zwei Transaktionen auf der Blockchain einreichen, um den Kanal zu öffnen und zu schließen. Dies ermöglicht einen extrem hohen Transaktionsdurchsatz und führt zu geringeren Kosten für die Nutzer. ## Voraussetzungen {#prerequisites} -Sie sollten unsere Seiten zu [Skalierungslösungen für Ethereum](/developers/docs/scaling/) und [Layer 2](/layer-2/) gelesen und verstanden haben. +Sie sollten unsere Seiten zur [Ethereum-Skalierung](/developers/docs/scaling/) und zu [Ebene 2](/layer-2/) gelesen und verstanden haben. -## Was sind Channels? {#what-are-channels} +## Was sind Kanäle? {#what-are-channels} -Öffentliche Blockchains wie Ethereum stoßen aufgrund ihrer dezentralen Architektur an Skalierungsgrenzen: Onchain-Transaktionen müssen von allen Knoten ausgeführt werden. Um die Dezentralisierung des Netzwerks zu bewahren, müssen Knoten in der Lage sein, das Transaktionsvolumen eines Blocks auch mit bescheidener Hardware zu verarbeiten. Dies begrenzt den maximalen Transaktionsdurchsatz. Blockchain-Channels lösen dieses Problem, indem sie Nutzer:innen ermöglichen, außerhalb der Hauptkette zu interagieren, dabei aber weiterhin die Sicherheit der Mainchain für die finale Abrechnung nutzen. +Öffentliche Blockchains wie Ethereum stehen aufgrund ihrer verteilten Architektur vor Skalierbarkeitsherausforderungen: Transaktionen auf der Blockchain müssen von allen Blockchain-Knoten ausgeführt werden. Blockchain-Knoten müssen in der Lage sein, das Transaktionsvolumen in einem Block mit bescheidener Hardware zu bewältigen, was dem Transaktionsdurchsatz eine Grenze setzt, um das Netzwerk dezentralisiert zu halten. Blockchain-Kanäle lösen dieses Problem, indem sie es den Nutzern ermöglichen, Off-Chain zu interagieren, während sie sich für die endgültige Abwicklung weiterhin auf die Sicherheit der Hauptkette verlassen. -Channels sind einfache Peer-to-Peer-Protokolle, die es zwei Parteien erlauben, zahlreiche Transaktionen untereinander durchzuführen und lediglich das Endergebnis in die Blockchain einzutragen. Mithilfe kryptografischer Verfahren wird nachgewiesen, dass die zusammengefassten Daten tatsächlich das Ergebnis einer gültigen Sequenz von Zwischentransaktionen sind. Ein Smart Contract vom Typ ["Multisignatur" (Multisig)](/developers/docs/smart-contracts/#multisig) stellt sicher, dass die Transaktionen von den berechtigten Parteien signiert wurden. +Kanäle sind einfache Peer-to-Peer-Protokolle, die es zwei Parteien ermöglichen, viele Transaktionen untereinander durchzuführen und dann nur die Endergebnisse auf der Blockchain zu veröffentlichen. Der Kanal verwendet Kryptografie, um zu beweisen, dass die von ihnen generierten Zusammenfassungsdaten tatsächlich das Ergebnis einer gültigen Menge von Zwischentransaktionen sind. Ein ["Mehrfachsignatur"](/developers/docs/smart-contracts/#multisig)-Smart Contract stellt sicher, dass die Transaktionen von den richtigen Parteien signiert werden. -Bei Channels werden Zustandsänderungen von den beteiligten Parteien selbst ausgeführt und validiert, wodurch die Rechenlast auf der Ausführungsebene von Ethereum minimiert wird. Dies verringert die Netzwerkbelastung auf Ethereum und beschleunigt gleichzeitig die Transaktionsverarbeitung für Nutzer:innen. +Mit Kanälen werden Zustandsänderungen von interessierten Parteien ausgeführt und validiert, was die Berechnungen auf der Ausführungsebene von Ethereum minimiert. Dies verringert die Überlastung auf Ethereum und erhöht zudem die Transaktionsverarbeitungsgeschwindigkeiten für die Nutzer. -Jeder Channel wird durch einen [Multisignatur-Smart-Contract (Multisig)](/developers/docs/smart-contracts/#multisig) verwaltet, der auf Ethereum ausgeführt wird. Um einen Channel zu eröffnen, stellen die Teilnehmenden den Channel-Contract onchain bereit und zahlen Guthaben in diesen ein. Anschließend signieren beide Parteien gemeinsam eine Zustandsaktualisierung, um den Anfangszustand des Channels festzulegen; danach können sie schnell und ohne Einschränkungen offchain transaktieren. +Jeder Kanal wird von einem [Mehrfachsignatur-Smart Contract](/developers/docs/smart-contracts/#multisig) verwaltet, der auf Ethereum läuft. Um einen Kanal zu öffnen, stellen die Teilnehmer den Kanalvertrag auf der Blockchain bereit und zahlen Gelder in diesen ein. Beide Parteien signieren gemeinsam eine Zustandsaktualisierung, um den Zustand des Kanals zu initialisieren, wonach sie schnell und frei Off-Chain transagieren können. -Zum Schließen des Channels reichen die Teilnehmenden den zuletzt vereinbarten Zustand des Channels onchain ein. Danach verteilt der Smart Contract die eingesperrten Mittel entsprechend der jeweiligen Guthabenstände im endgültigen Zustand des Channels. +Um den Kanal zu schließen, reichen die Teilnehmer den zuletzt vereinbarten Zustand des Kanals auf der Blockchain ein. Anschließend verteilt der Smart Contract die gesperrten Gelder entsprechend dem Guthaben jedes Teilnehmers im Endzustand des Kanals. -Peer-to-Peer-Channels eignen sich besonders gut für Szenarien, in denen eine festgelegte Gruppe von Teilnehmenden häufig miteinander transaktieren möchte, ohne dabei sichtbare Overhead-Kosten zu verursachen. Blockchain-Channels lassen sich in zwei Kategorien einteilen: **Payment Channels** (Zahlungs-Channels) und **State Channels** (Zustands-Channels). +Peer-to-Peer-Kanäle sind besonders nützlich für Situationen, in denen einige vordefinierte Teilnehmer mit hoher Frequenz transagieren möchten, ohne dass ein sichtbarer Mehraufwand entsteht. Blockchain-Kanäle fallen in zwei Kategorien: **Payment Channels** und **State Channels**. -## Zahlungs-Channels {#payment-channels} +## Payment Channels {#payment-channels} -Ein Zahlungs-Channel lässt sich am besten als ein „zweiseitiges Kassenbuch“ beschreiben, das gemeinsam von zwei Nutzer:innen geführt wird. Der Anfangssaldo dieses Kassenbuchs entspricht der Summe der Einlagen, die beim Öffnen des Channels in den Onchain-Contract eingesperrt wurden. Überweisungen innerhalb eines Zahlungs-Channels können augenblicklich erfolgen und benötigen – abgesehen von einer einmaligen Onchain-Transaktion zur Eröffnung sowie einer abschließenden Transaktion zum Schließen des Channels – keine direkte Interaktion mit der eigentlichen Blockchain. +Ein Payment Channel lässt sich am besten als ein „Zwei-Wege-Ledger“ beschreiben, der von zwei Nutzern gemeinsam geführt wird. Das anfängliche Guthaben des Ledgers ist die Summe der Einlagen, die während der Kanaleröffnungsphase im Vertrag auf der Blockchain gesperrt wurden. Transfers über Payment Channels können sofort und ohne Beteiligung der eigentlichen Blockchain selbst durchgeführt werden, mit Ausnahme einer anfänglichen einmaligen Erstellung auf der Blockchain und einer eventuellen Schließung des Kanals. -Aktualisierungen des Kassenbuchsaldos (d. h. des Zustands des Zahlungs-Channels) bedürfen der Zustimmung aller am Channel beteiligten Parteien. Eine Channel-Aktualisierung, die von allen Teilnehmenden signiert wurde, gilt als final – vergleichbar mit einer Transaktion auf Ethereum. +Aktualisierungen des Ledger-Guthabens (d. h. des Zustands des Payment Channels) erfordern die Zustimmung aller Parteien im Kanal. Eine Kanalaktualisierung, die von allen Kanalteilnehmern signiert wurde, gilt als abgeschlossen, ähnlich wie eine Transaktion auf Ethereum. -Zahlungs-Channels zählten zu den frühesten Skalierungslösungen und wurden entwickelt, um teure Onchain-Aktivitäten bei einfachen Nutzerinteraktionen (z. B. ETH-Überweisungen, atomare Swaps, Mikrozahlungen) auf ein Minimum zu reduzieren. Die Teilnehmenden eines Channels können beliebig viele sofortige und gebührenfreie Transaktionen untereinander durchführen, solange die Bilanz ihrer gegenseitigen Überweisungen den Betrag der eingezahlten Tokens nicht überschreitet. +Payment Channels gehörten zu den frühesten Skalierungslösungen, die entwickelt wurden, um teure Aktivitäten auf der Blockchain bei einfachen Nutzerinteraktionen (z. B. ETH-Transfers, Atomic Swaps, Mikrozahlungen) zu minimieren. Kanalteilnehmer können eine unbegrenzte Anzahl von sofortigen, gebührenfreien Transaktionen untereinander durchführen, solange die Nettosumme ihrer Transfers die eingezahlten Token nicht übersteigt. -## Zustands-Channels {#state-channels} +## State Channels {#state-channels} -Abgesehen von der Unterstützung von Offchain-Zahlungen haben sich Zahlungs-Channels für die Verarbeitung allgemeiner Zustandsübergangslogik als ungeeignet erwiesen. Zustands-Channels (State Channels) wurden entwickelt, um dieses Problem zu lösen und Channels für die Skalierung allgemeiner Berechnungen nutzbar zu machen. +Abgesehen von der Unterstützung von Off-Chain-Zahlungen haben sich Payment Channels nicht als nützlich für die Handhabung allgemeiner Zustandsübergangslogik erwiesen. State Channels wurden geschaffen, um dieses Problem zu lösen und Kanäle für die Skalierung von Allzweckberechnungen nutzbar zu machen. -Zustands-Channels weisen nach wie vor viele Gemeinsamkeiten mit Zahlungs-Channels auf. Zum Beispiel interagieren Nutzer:innen durch den Austausch kryptografisch signierter Nachrichten (Transaktionen), die auch von den übrigen Channel-Teilnehmenden signiert werden müssen. Wird eine vorgeschlagene Zustandsaktualisierung nicht von allen Teilnehmenden signiert, gilt sie als ungültig. +State Channels haben immer noch viel mit Payment Channels gemeinsam. Zum Beispiel interagieren Nutzer, indem sie kryptografisch signierte Nachrichten (Transaktionen) austauschen, die die anderen Kanalteilnehmer ebenfalls signieren müssen. Wenn eine vorgeschlagene Zustandsaktualisierung nicht von allen Teilnehmern signiert wird, gilt sie als ungültig. -Im Unterschied zu Zahlungs-Channels verwaltet ein Zustands-Channel jedoch nicht nur die Guthaben der Nutzer:innen, sondern führt zudem den aktuellen Zustand des Contract-Speichers (d. h. die Werte der Contract-Variablen) fortlaufend mit. +Zusätzlich zur Speicherung der Nutzerguthaben verfolgt der Kanal jedoch auch den aktuellen Zustand des Vertragsspeichers (d. h. die Werte der Vertragsvariablen). -Dadurch wird es möglich, einen Smart Contract außerhalb der Blockchain (offchain) zwischen zwei Nutzer:innen auszuführen. In diesem Szenario bedürfen Aktualisierungen des internen Zustands des Smart Contracts lediglich der Zustimmung derjenigen Peers, die den Channel eingerichtet haben. +Dies macht es möglich, einen Smart Contract Off-Chain zwischen zwei Nutzern auszuführen. In diesem Szenario erfordern Aktualisierungen des internen Zustands des Smart Contracts nur die Zustimmung der Peers, die den Kanal erstellt haben. -Obwohl dies das zuvor beschriebene Skalierbarkeitsproblem löst, hat es Auswirkungen auf die Sicherheit. Auf Ethereum wird die Gültigkeit von Zustandsübergängen durch das Konsensprotokoll des Netzwerks sichergestellt. Dadurch ist es unmöglich, ungültige Zustandsaktualisierungen für einen Smart Contract vorzuschlagen oder dessen Ausführung zu manipulieren. +Während dies das zuvor beschriebene Skalierbarkeitsproblem löst, hat es Auswirkungen auf die Sicherheit. Auf Ethereum wird die Gültigkeit von Zustandsübergängen durch das Konsensprotokoll des Netzwerks durchgesetzt. Dies macht es unmöglich, eine ungültige Aktualisierung des Zustands eines Smart Contracts vorzuschlagen oder die Ausführung des Smart Contracts zu ändern. -Zustands-Channels bieten nicht dieselben Sicherheitsgarantien. Ein Zustands-Channel stellt gewissermaßen eine Miniaturversion des Mainnets dar. Da nur eine begrenzte Anzahl von Teilnehmenden die Regeln durchsetzt, steigt die Wahrscheinlichkeit böswilligen Verhaltens (z. B. das Vorschlagen ungültiger Zustandsaktualisierungen). Die Sicherheit von Zustands-Channels beruht auf einem Streitschlichtungssystem, das auf [Betrugsnachweisen](/glossary/#fraud-proof) basiert. +State Channels haben nicht die gleichen Sicherheitsgarantien. Bis zu einem gewissen Grad ist ein State Channel eine Miniaturversion des Mainnets. Da nur eine begrenzte Anzahl von Teilnehmern die Regeln durchsetzt, steigt die Wahrscheinlichkeit von böswilligem Verhalten (z. B. das Vorschlagen ungültiger Zustandsaktualisierungen). State Channels beziehen ihre Sicherheit aus einem Streitschlichtungssystem, das auf [Betrugsnachweisen](/glossary/#fraud-proof) basiert. -## Wie Zustands-Channels funktionieren {#how-state-channels-work} +## Wie State Channels funktionieren {#how-state-channels-work} -Im Grunde ist die Aktivität in einem Zustands-Channel eine Sitzung von Interaktionen zwischen Benutzern und einem Blockchain-System. Nutzer:innen kommunizieren überwiegend außerhalb der Blockchain (offchain) miteinander und interagieren mit der zugrundeliegenden Blockchain lediglich zum Öffnen oder Schließen des Channels sowie zur Beilegung allfälliger Streitigkeiten zwischen den Teilnehmenden. +Grundsätzlich ist die Aktivität in einem State Channel eine Sitzung von Interaktionen, an der Nutzer und ein Blockchain-System beteiligt sind. Die Nutzer kommunizieren meist Off-Chain miteinander und interagieren nur mit der zugrunde liegenden Blockchain, um den Kanal zu öffnen, den Kanal zu schließen oder mögliche Streitigkeiten zwischen den Teilnehmern beizulegen. -Der folgende Abschnitt beschreibt den grundlegenden Arbeitsablauf eines Zustands-Channels: +Der folgende Abschnitt skizziert den grundlegenden Arbeitsablauf eines State Channels: -### Öffnen des Channels {#opening-the-channel} +### Öffnen des Kanals {#opening-the-channel} -Das Öffnen eines Channels erfordert, dass die Teilnehmer Mittel in einen Smart Contract im Mainnet einbringen. Die Einlage fungiert auch als virtueller Deckel, so dass die teilnehmenden Akteure frei Transaktionen durchführen können, ohne Zahlungen sofort abwickeln zu müssen. Erst wenn der Channel onchain finalisiert ist, rechnen die Parteien untereinander ab und heben den Rest ihres Deckels ab. +Das Öffnen eines Kanals erfordert, dass die Teilnehmer Gelder in einen Smart Contract im Mainnet einzahlen. Die Einzahlung fungiert auch als virtueller Deckel, sodass die teilnehmenden Akteure frei transagieren können, ohne Zahlungen sofort begleichen zu müssen. Erst wenn der Kanal auf der Blockchain finalisiert wird, rechnen die Parteien miteinander ab und heben ab, was von ihrem Deckel übrig ist. -Diese Einlage dient auch als Sicherheit, um ehrliches Verhalten von jedem Teilnehmer zu garantieren. Wenn Einleger während der Streitbeilegungsphase bösartiger Handlungen für schuldig befunden werden, wird ihre Einlage durch den Vertrag gekürzt (Slashing). +Diese Einzahlung dient auch als Kaution, um ehrliches Verhalten jedes Teilnehmers zu garantieren. Wenn Einleger während der Streitschlichtungsphase böswilliger Handlungen für schuldig befunden werden, führt der Vertrag ein Slashing ihrer Einzahlung durch. -Die Channel-Peers müssen einen Anfangszustand unterzeichnen, dem sie alle zustimmen. Dies dient als Genesis des Zustands-Channels, nach der die Benutzer mit Transaktionen beginnen können. +Kanal-Peers müssen einen Anfangszustand signieren, auf den sie sich alle einigen. Dies dient als Genesis des State Channels, wonach die Nutzer mit dem Transagieren beginnen können. -### Nutzung des Channels {#using-the-channel} +### Nutzung des Kanals {#using-the-channel} -Nach der Initialisierung des Zustands des Channels interagieren die Peers, indem sie Transaktionen unterzeichnen und sie sich zur Genehmigung gegenseitig zusenden. Die Teilnehmer initiieren mit diesen Transaktionen Zustandsaktualisierungen und unterzeichnen Zustandsaktualisierungen von anderen. Jede Transaktion umfasst Folgendes: +Nach der Initialisierung des Kanalzustands interagieren die Peers, indem sie Transaktionen signieren und sie sich gegenseitig zur Genehmigung senden. Die Teilnehmer initiieren mit diesen Transaktionen Zustandsaktualisierungen und signieren Zustandsaktualisierungen von anderen. Jede Transaktion umfasst Folgendes: -- Eine **Nonce**, die als eindeutige ID für Transaktionen dient und Replay-Angriffe verhindert. Sie identifiziert auch die Reihenfolge, in der Zustandsaktualisierungen stattgefunden haben (was für die Streitbeilegung wichtig ist). +- Eine **Nonce**, die als eindeutige ID für Transaktionen fungiert und Replay-Angriffe verhindert. Sie identifiziert auch die Reihenfolge, in der Zustandsaktualisierungen aufgetreten sind (was für die Streitschlichtung wichtig ist) -- Der alte Zustand des Channels +- Den alten Zustand des Kanals -- Der neue Zustand des Channels +- Den neuen Zustand des Kanals -- Die Transaktion, die den Zustandsübergang auslöst (z. B. sendet Alice 5 ETH an Bob). +- Die Transaktion, die den Zustandsübergang auslöst (z. B. Alice sendet 5 ETH an Bob) -Zustandsaktualisierungen im Channel werden nicht onchain übertragen, wie es normalerweise der Fall ist, wenn Benutzer im Mainnet interagieren, was mit dem Ziel von Zustands-Channels übereinstimmt, den Onchain-Fußabdruck zu minimieren. Solange sich die Teilnehmer über Zustandsaktualisierungen einig sind, sind diese so endgültig wie eine Ethereum-Transaktion. Die Teilnehmer müssen sich nur auf den Konsens des Mainnets verlassen, wenn es zu einem Streitfall kommt. +Zustandsaktualisierungen im Kanal werden nicht auf der Blockchain übertragen, wie es normalerweise der Fall ist, wenn Nutzer im Mainnet interagieren, was mit dem Ziel von State Channels übereinstimmt, den Fußabdruck auf der Blockchain zu minimieren. Solange sich die Teilnehmer auf Zustandsaktualisierungen einigen, sind diese so endgültig wie eine Ethereum-Transaktion. Die Teilnehmer müssen sich nur dann auf den Konsens des Mainnets verlassen, wenn ein Streitfall auftritt. -### Schließen des Channels {#closing-the-channel} +### Schließen des Kanals {#closing-the-channel} -Das Schließen eines Zustands-Channels erfordert die Übermittlung des endgültigen, vereinbarten Zustands des Channels an den Onchain-Smart-Contract. Zu den in der Zustandsaktualisierung referenzierten Details gehören die Anzahl der Züge jedes Teilnehmers und eine Liste der genehmigten Transaktionen. +Das Schließen eines State Channels erfordert die Übermittlung des endgültigen, vereinbarten Zustands des Kanals an den Smart Contract auf der Blockchain. Zu den in der Zustandsaktualisierung referenzierten Details gehören die Anzahl der Züge jedes Teilnehmers und eine Liste der genehmigten Transaktionen. -Nach der Überprüfung, dass die Zustandsaktualisierung gültig ist (d. h. von allen Parteien unterzeichnet wurde), finalisiert der Smart Contract den Channel und verteilt die gesperrten Gelder entsprechend dem Ergebnis des Channels. Offchain getätigte Zahlungen werden auf den Zustand von Ethereum angewendet und jeder Teilnehmer erhält seinen verbleibenden Anteil der gesperrten Gelder. +Nach der Überprüfung, ob die Zustandsaktualisierung gültig ist (d. h. sie ist von allen Parteien signiert), finalisiert der Smart Contract den Kanal und verteilt die gesperrten Gelder entsprechend dem Ergebnis des Kanals. Off-Chain getätigte Zahlungen werden auf den Zustand von Ethereum angewendet und jeder Teilnehmer erhält seinen verbleibenden Anteil der gesperrten Gelder. -Das oben beschriebene Szenario stellt dar, was im Idealfall („Happy Case“) passiert. Manchmal können Benutzer keine Einigung erzielen und den Channel nicht finalisieren (der „Sad Case“). Jeder der folgenden Punkte könnte auf die Situation zutreffen: +Das oben beschriebene Szenario stellt dar, was im Idealfall passiert. Manchmal können sich die Nutzer jedoch nicht einigen und den Kanal finalisieren (der Problemfall). Eines der folgenden Dinge könnte auf die Situation zutreffen: - Teilnehmer gehen offline und schlagen keine Zustandsübergänge vor -- Teilnehmer weigern sich, gültige Zustandsaktualisierungen mitzuzeichnen +- Teilnehmer weigern sich, gültige Zustandsaktualisierungen mitzuunterzeichnen -- Teilnehmer versuchen, den Channel zu finalisieren, indem sie eine alte Zustandsaktualisierung an den Onchain-Vertrag vorschlagen +- Teilnehmer versuchen, den Kanal zu finalisieren, indem sie dem Vertrag auf der Blockchain eine alte Zustandsaktualisierung vorschlagen -- Teilnehmer schlagen ungültige Zustandsübergänge zur Unterzeichnung durch andere vor +- Teilnehmer schlagen ungültige Zustandsübergänge vor, die andere signieren sollen -Immer wenn der Konsens zwischen den teilnehmenden Akteuren in einem Channel zusammenbricht, ist die letzte Option, sich auf den Konsens des Mainnets zu verlassen, um den endgültigen, gültigen Zustand des Channels durchzusetzen. In diesem Fall erfordert das Schließen des Zustands-Channels die Beilegung von Streitigkeiten onchain. +Wann immer der Konsens zwischen den teilnehmenden Akteuren in einem Kanal zusammenbricht, besteht die letzte Option darin, sich auf den Konsens des Mainnets zu verlassen, um den endgültigen, gültigen Zustand des Kanals durchzusetzen. In diesem Fall erfordert das Schließen des State Channels die Beilegung von Streitigkeiten auf der Blockchain. ### Beilegung von Streitigkeiten {#settling-disputes} -Normalerweise einigen sich die Parteien in einem Channel im Voraus auf die Schließung des Channels und unterzeichnen gemeinsam den letzten Zustandsübergang, den sie an den Smart Contract übermitteln. Sobald die Aktualisierung onchain genehmigt ist, endet die Ausführung des Offchain-Smart-Contracts und die Teilnehmer verlassen den Channel mit ihrem Geld. +Typischerweise einigen sich die Parteien in einem Kanal im Voraus auf die Schließung des Kanals und unterzeichnen gemeinsam den letzten Zustandsübergang, den sie an den Smart Contract übermitteln. Sobald die Aktualisierung auf der Blockchain genehmigt ist, endet die Ausführung des Off-Chain-Smart Contracts und die Teilnehmer verlassen den Kanal mit ihrem Geld. -Jedoch kann eine Partei eine Onchain-Anfrage stellen, um die Ausführung des Smart Contracts zu beenden und den Channel zu finalisieren – ohne auf die Zustimmung ihres Gegenübers zu warten. Wenn eine der zuvor beschriebenen Situationen eintritt, die den Konsens brechen, kann jede Partei den Onchain-Vertrag auslösen, um den Channel zu schließen und Gelder zu verteilen. Dies sorgt für **Vertrauenslosigkeit** (Trustlessness) und stellt sicher, dass ehrliche Parteien ihre Einlagen jederzeit abziehen können, unabhängig von den Handlungen der anderen Partei. +Eine Partei kann jedoch eine Anfrage auf der Blockchain einreichen, um die Ausführung des Smart Contracts zu beenden und den Kanal zu finalisieren – ohne auf die Zustimmung ihres Gegenübers zu warten. Wenn eine der zuvor beschriebenen konsensbrechenden Situationen eintritt, kann jede Partei den Vertrag auf der Blockchain auslösen, um den Kanal zu schließen und die Gelder zu verteilen. Dies sorgt für **Vertrauenslosigkeit** und stellt sicher, dass ehrliche Parteien ihre Einlagen jederzeit abheben können, unabhängig von den Handlungen der anderen Partei. -Um den Austritt aus dem Channel zu verarbeiten, muss der Benutzer die letzte gültige Zustandsaktualisierung der Anwendung an den Onchain-Vertrag übermitteln. Wenn dies bestätigt wird (d. h. es trägt die Unterschrift aller Parteien), werden die Gelder zu ihren Gunsten umverteilt. +Um den Kanalaustritt zu verarbeiten, muss der Nutzer die letzte gültige Zustandsaktualisierung der Anwendung an den Vertrag auf der Blockchain übermitteln. Wenn dies bestätigt wird (d. h. es trägt die Signatur aller Parteien), werden die Gelder zu ihren Gunsten umverteilt. -Es gibt jedoch eine Verzögerung bei der Ausführung von Austrittsanfragen einzelner Benutzer. Wenn der Antrag auf Abschluss des Channels einstimmig genehmigt wurde, wird die Onchain-Austrittstransaktion sofort ausgeführt. +Es gibt jedoch eine Verzögerung bei der Ausführung von Austrittsanfragen einzelner Nutzer. Wenn die Anfrage zum Abschluss des Kanals einstimmig genehmigt wurde, wird die Austrittstransaktion auf der Blockchain sofort ausgeführt. -Die Verzögerung kommt bei Austritten einzelner Benutzer aufgrund der Möglichkeit betrügerischer Handlungen ins Spiel. Zum Beispiel könnte ein Channel-Teilnehmer versuchen, den Channel auf Ethereum zu finalisieren, indem er eine ältere Zustandsaktualisierung onchain einreicht. +Die Verzögerung kommt bei Einzelnutzeraustritten aufgrund der Möglichkeit betrügerischer Handlungen ins Spiel. Zum Beispiel könnte ein Kanalteilnehmer versuchen, den Kanal auf Ethereum zu finalisieren, indem er eine ältere Zustandsaktualisierung auf der Blockchain einreicht. -Als Gegenmaßnahme ermöglichen Zustands-Channels ehrlichen Benutzern, ungültige Zustandsaktualisierungen anzufechten, indem sie den neuesten, gültigen Zustand des Channels onchain einreichen. Zustands-Channels sind so konzipiert, dass neuere, vereinbarte Zustandsaktualisierungen ältere Zustandsaktualisierungen übertrumpfen. +Als Gegenmaßnahme ermöglichen State Channels ehrlichen Nutzern, ungültige Zustandsaktualisierungen anzufechten, indem sie den neuesten, gültigen Zustand des Kanals auf der Blockchain einreichen. State Channels sind so konzipiert, dass neuere, vereinbarte Zustandsaktualisierungen ältere Zustandsaktualisierungen übertrumpfen. -Sobald ein Peer das Onchain-Streitbeilegungssystem auslöst, muss die andere Partei innerhalb einer Frist (dem sogenannten „Challenge Window“) antworten. Dies ermöglicht es Benutzern, die Austrittstransaktion anzufechten, insbesondere wenn die andere Partei eine veraltete Aktualisierung anwendet. +Sobald ein Peer das Streitschlichtungssystem auf der Blockchain auslöst, muss die andere Partei innerhalb einer Frist (dem sogenannten Anfechtungsfenster) reagieren. Dies ermöglicht es den Nutzern, die Austrittstransaktion anzufechten, insbesondere wenn die andere Partei eine veraltete Aktualisierung anwendet. -Wie auch immer der Fall sein mag, Channel-Benutzer haben immer starke Finalitätsgarantien: Wenn der in ihrem Besitz befindliche Zustandsübergang von allen Mitgliedern unterzeichnet wurde und die jüngste Aktualisierung ist, dann hat er die gleiche Finalität wie eine reguläre Onchain-Transaktion. Sie müssen die andere Partei zwar immer noch onchain anfechten, aber das einzig mögliche Ergebnis ist die Finalisierung des letzten gültigen Zustands, den sie besitzen. +Wie auch immer der Fall sein mag, Kanalnutzer haben immer starke Finalitätsgarantien: Wenn der Zustandsübergang in ihrem Besitz von allen Mitgliedern signiert wurde und die jüngste Aktualisierung ist, dann hat er die gleiche Finalität wie eine reguläre Transaktion auf der Blockchain. Sie müssen die andere Partei zwar immer noch auf der Blockchain anfechten, aber das einzig mögliche Ergebnis ist die Finalisierung des letzten gültigen Zustands, den sie besitzen. -### Wie interagieren Zustands-Channels mit Ethereum? {#how-do-state-channels-interact-with-ethereum} +### Wie interagieren State Channels mit Ethereum? {#how-do-state-channels-interact-with-ethereum} -Obwohl sie als Offchain-Protokolle existieren, haben Zustands-Channels eine Onchain-Komponente: den Smart Contract, der beim Öffnen des Channels auf Ethereum bereitgestellt wird. Dieser Vertrag kontrolliert die in den Channel eingezahlten Vermögenswerte, überprüft Zustandsaktualisierungen und schlichtet Streitigkeiten zwischen den Teilnehmern. +Obwohl sie als Off-Chain-Protokolle existieren, haben State Channels eine Komponente auf der Blockchain: den Smart Contract, der beim Öffnen des Kanals auf Ethereum bereitgestellt wird. Dieser Vertrag kontrolliert die in den Kanal eingezahlten Vermögenswerte, verifiziert Zustandsaktualisierungen und schlichtet Streitigkeiten zwischen den Teilnehmern. -Zustands-Channels veröffentlichen keine Transaktionsdaten oder Zustands-Commitments im Mainnet, im Gegensatz zu [Layer-2](/layer-2/)-Skalierungslösungen. Sie sind jedoch stärker mit dem Mainnet verbunden als beispielsweise [Sidechains](/developers/docs/scaling/sidechains/), was sie etwas sicherer macht. +State Channels veröffentlichen im Gegensatz zu [Ebene 2](/layer-2/)-Skalierungslösungen keine Transaktionsdaten oder Zustandsverpflichtungen im Mainnet. Sie sind jedoch stärker mit dem Mainnet verbunden als beispielsweise [Sidechains](/developers/docs/scaling/sidechains/), was sie etwas sicherer macht. -Zustands-Channels stützen sich für die folgenden Punkte auf das Ethereum-Hauptprotokoll: +State Channels verlassen sich für Folgendes auf das Haupt-Ethereum-Protokoll: #### 1. Liveness {#liveness} -Der Onchain-Vertrag, der beim Öffnen des Channels bereitgestellt wird, ist für die Funktionalität des Channels verantwortlich. Wenn der Vertrag auf Ethereum läuft, ist der Channel immer zur Nutzung verfügbar. Umgekehrt kann eine Sidechain immer ausfallen, selbst wenn das Mainnet betriebsbereit ist, was die Gelder der Benutzer gefährdet. +Der beim Öffnen des Kanals bereitgestellte Vertrag auf der Blockchain ist für die Funktionalität des Kanals verantwortlich. Wenn der Vertrag auf Ethereum läuft, ist der Kanal immer für die Nutzung verfügbar. Umgekehrt kann eine Sidechain jederzeit ausfallen, selbst wenn das Mainnet betriebsbereit ist, was die Gelder der Nutzer gefährdet. #### 2. Sicherheit {#security} -Bis zu einem gewissen Grad stützen sich Zustands-Channels auf Ethereum, um Sicherheit zu bieten und Benutzer vor bösartigen Peers zu schützen. Wie in späteren Abschnitten erörtert, verwenden Channels einen Betrugsnachweis-Mechanismus, der es Benutzern ermöglicht, Versuche, den Channel mit einer ungültigen oder veralteten Aktualisierung zu finalisieren, anzufechten. +Bis zu einem gewissen Grad verlassen sich State Channels auf Ethereum, um Sicherheit zu bieten und Nutzer vor böswilligen Peers zu schützen. Wie in späteren Abschnitten besprochen, verwenden Kanäle einen Betrugsnachweis-Mechanismus, der es Nutzern ermöglicht, Versuche anzufechten, den Kanal mit einer ungültigen oder veralteten Aktualisierung zu finalisieren. -In diesem Fall legt die ehrliche Partei den neuesten gültigen Zustand des Channels als Betrugsnachweis dem Onchain-Vertrag zur Überprüfung vor. Betrugsnachweise ermöglichen es sich gegenseitig misstrauenden Parteien, Offchain-Transaktionen durchzuführen, ohne dabei ihre Gelder zu riskieren. +In diesem Fall stellt die ehrliche Partei den neuesten gültigen Zustand des Kanals als Betrugsnachweis für den Vertrag auf der Blockchain zur Überprüfung bereit. Betrugsnachweise ermöglichen es Parteien, die einander misstrauen, Off-Chain-Transaktionen durchzuführen, ohne dabei ihre Gelder zu riskieren. -#### 3. Endgültigkeit {#finality} +#### 3. Finalität {#finality} -Zustandsaktualisierungen, die von Channel-Benutzern gemeinsam unterzeichnet werden, gelten als so gut wie Onchain-Transaktionen. Dennoch erreicht jede Aktivität innerhalb des Channels erst dann echte Finalität, wenn der Channel auf Ethereum geschlossen wird. +Zustandsaktualisierungen, die von Kanalnutzern gemeinsam signiert wurden, gelten als genauso gut wie Transaktionen auf der Blockchain. Dennoch erreicht die gesamte Aktivität im Kanal erst dann echte Finalität, wenn der Kanal auf Ethereum geschlossen wird. -Im optimistischen Fall können beide Parteien kooperieren, die endgültige Zustandsaktualisierung unterzeichnen und onchain einreichen, um den Channel zu schließen, woraufhin die Gelder entsprechend dem endgültigen Zustand des Channels verteilt werden. Im pessimistischen Fall, in dem jemand versucht zu betrügen, indem er eine falsche Zustandsaktualisierung onchain postet, wird seine Transaktion erst nach Ablauf des „Challenge Window“ finalisiert. +Im optimistischen Fall können beide Parteien kooperieren, die endgültige Zustandsaktualisierung signieren und auf der Blockchain einreichen, um den Kanal zu schließen, wonach die Gelder entsprechend dem Endzustand des Kanals verteilt werden. Im pessimistischen Fall, in dem jemand versucht zu betrügen, indem er eine falsche Zustandsaktualisierung auf der Blockchain veröffentlicht, wird seine Transaktion erst finalisiert, wenn das Anfechtungsfenster abgelaufen ist. -## Virtuelle Zustands-Channels {#virtual-state-channels} +## Virtuelle State Channels {#virtual-state-channels} -Die naive Implementierung eines Zustands-Channels wäre, einen neuen Vertrag bereitzustellen, wenn zwei Benutzer eine Anwendung offchain ausführen möchten. Dies ist nicht nur undurchführbar, sondern hebt auch die Kosteneffizienz von Zustands-Channels auf (Onchain-Transaktionskosten können sich schnell summieren). +Die naive Implementierung eines State Channels bestünde darin, einen neuen Vertrag bereitzustellen, wenn zwei Nutzer eine Anwendung Off-Chain ausführen möchten. Dies ist nicht nur unpraktikabel, sondern macht auch die Kosteneffizienz von State Channels zunichte (Transaktionskosten auf der Blockchain können sich schnell summieren). -Um dieses Problem zu lösen, wurden „virtuelle Channels“ geschaffen. Im Gegensatz zu regulären Channels, die Onchain-Transaktionen zum Öffnen und Schließen erfordern, kann ein virtueller Channel geöffnet, ausgeführt und finalisiert werden, ohne mit der Hauptkette zu interagieren. Mit dieser Methode ist es sogar möglich, Streitigkeiten offchain beizulegen. +Um dieses Problem zu lösen, wurden „virtuelle Kanäle“ geschaffen. Im Gegensatz zu regulären Kanälen, die Transaktionen auf der Blockchain zum Öffnen und Beenden erfordern, kann ein virtueller Kanal ohne Interaktion mit der Hauptkette geöffnet, ausgeführt und finalisiert werden. Mit dieser Methode ist es sogar möglich, Streitigkeiten Off-Chain beizulegen. -Dieses System beruht auf der Existenz sogenannter „Ledger-Channels“, die onchain finanziert wurden. Virtuelle Channels zwischen zwei Parteien können auf einem bestehenden Ledger-Channel aufgebaut werden, wobei der/die Eigentümer des Ledger-Channels als Vermittler dienen. +Dieses System beruht auf der Existenz sogenannter „Ledger-Kanäle“, die auf der Blockchain finanziert wurden. Virtuelle Kanäle zwischen zwei Parteien können auf einem bestehenden Ledger-Kanal aufgebaut werden, wobei der oder die Eigentümer des Ledger-Kanals als Vermittler dienen. -Benutzer in jedem virtuellen Channel interagieren über eine neue Vertragsinstanz, wobei der Ledger-Channel mehrere Vertragsinstanzen unterstützen kann. Der Zustand des Ledger-Channels enthält auch mehr als einen Vertragsspeicherzustand, was die parallele Ausführung von Anwendungen offchain zwischen verschiedenen Benutzern ermöglicht. +Nutzer in jedem virtuellen Kanal interagieren über eine neue Vertragsinstanz, wobei der Ledger-Kanal mehrere Vertragsinstanzen unterstützen kann. Der Zustand des Ledger-Kanals enthält auch mehr als einen Vertragsspeicherzustand, was die parallele Ausführung von Anwendungen Off-Chain zwischen verschiedenen Nutzern ermöglicht. -Genau wie bei regulären Channels tauschen die Benutzer Zustandsaktualisierungen aus, um die Zustandsmaschine voranzubringen. Sofern kein Streitfall auftritt, muss der Vermittler nur beim Öffnen oder Schließen des Channels kontaktiert werden. +Genau wie bei regulären Kanälen tauschen die Nutzer Zustandsaktualisierungen aus, um die Zustandsmaschine (State Machine) voranzutreiben. Sofern kein Streitfall auftritt, muss der Vermittler nur beim Öffnen oder Beenden des Kanals kontaktiert werden. -### Virtuelle Zahlungs-Channels {#virtual-payment-channels} +### Virtuelle Payment Channels {#virtual-payment-channels} -Virtuelle Zahlungs-Channels funktionieren nach der gleichen Idee wie virtuelle Zustands-Channels: Teilnehmer, die mit demselben Netzwerk verbunden sind, können Nachrichten weiterleiten, ohne einen neuen Channel onchain öffnen zu müssen. In virtuellen Zahlungs-Channels werden Wertübertragungen über einen oder mehrere Vermittler geleitet, mit der Garantie, dass nur der beabsichtigte Empfänger die überwiesenen Gelder erhalten kann. +Virtuelle Payment Channels basieren auf derselben Idee wie virtuelle State Channels: Teilnehmer, die mit demselben Netzwerk verbunden sind, können Nachrichten weiterleiten, ohne einen neuen Kanal auf der Blockchain öffnen zu müssen. In virtuellen Payment Channels werden Werttransfers über einen oder mehrere Vermittler geleitet, mit der Garantie, dass nur der beabsichtigte Empfänger die transferierten Gelder erhalten kann. -## Anwendungen von Zustands-Channels {#applications-of-state-channels} +## Anwendungen von State Channels {#applications-of-state-channels} ### Zahlungen {#payments} -Frühe Blockchain-Channels waren einfache Protokolle, die es zwei Teilnehmern ermöglichten, schnelle, kostengünstige Übertragungen offchain durchzuführen, ohne hohe Transaktionsgebühren im Mainnet zahlen zu müssen. Heute sind Zahlungs-Channels immer noch nützlich für Anwendungen, die für den Austausch und die Einzahlung von Ether und Token konzipiert sind. +Frühe Blockchain-Kanäle waren einfache Protokolle, die es zwei Teilnehmern ermöglichten, schnelle, gebührenarme Transfers Off-Chain durchzuführen, ohne hohe Transaktionsgebühren im Mainnet zahlen zu müssen. Heute sind Payment Channels immer noch nützlich für Anwendungen, die für den Austausch und die Einzahlung von Ether und Token konzipiert sind. -Channel-basierte Zahlungen haben die folgenden Vorteile: +Kanalbasierte Zahlungen haben die folgenden Vorteile: -1. **Durchsatz**: Die Menge an Offchain-Transaktionen pro Channel ist nicht mit dem Durchsatz von Ethereum verbunden, der von verschiedenen Faktoren beeinflusst wird, insbesondere von der Blockgröße und der Blockzeit. Durch die Ausführung von Transaktionen offchain können Blockchain-Channels einen höheren Durchsatz erzielen. +1. **Durchsatz**: Die Menge der Off-Chain-Transaktionen pro Kanal ist unabhängig vom Durchsatz von Ethereum, der von verschiedenen Faktoren beeinflusst wird, insbesondere von der Blockgröße und der Blockzeit. Durch die Ausführung von Transaktionen Off-Chain können Blockchain-Kanäle einen höheren Durchsatz erzielen. -2. **Datenschutz**: Da Channels offchain existieren, werden Details der Interaktionen zwischen den Teilnehmern nicht auf der öffentlichen Blockchain von Ethereum aufgezeichnet. Channel-Benutzer müssen nur beim Finanzieren und Schließen von Channels oder bei der Beilegung von Streitigkeiten onchain interagieren. Daher sind Channels für Personen nützlich, die privatere Transaktionen wünschen. +2. **Privatsphäre**: Da Kanäle Off-Chain existieren, werden Details der Interaktionen zwischen den Teilnehmern nicht auf der öffentlichen Blockchain von Ethereum aufgezeichnet. Kanalnutzer müssen nur dann auf der Blockchain interagieren, wenn sie Kanäle finanzieren und schließen oder Streitigkeiten beilegen. Daher sind Kanäle nützlich für Personen, die privatere Transaktionen wünschen. -3. **Latenz**: Offchain-Transaktionen, die zwischen Channel-Teilnehmern durchgeführt werden, können sofort abgewickelt werden, wenn beide Parteien kooperieren, was Verzögerungen reduziert. Im Gegensatz dazu erfordert das Senden einer Transaktion im Mainnet das Warten darauf, dass Knoten die Transaktion verarbeiten, einen neuen Block mit der Transaktion erstellen und einen Konsens erzielen. Benutzer müssen möglicherweise auch auf weitere Block-Bestätigungen warten, bevor sie eine Transaktion als finalisiert betrachten. +3. **Latenz**: Off-Chain-Transaktionen, die zwischen Kanalteilnehmern durchgeführt werden, können sofort abgewickelt werden, wenn beide Parteien kooperieren, was Verzögerungen reduziert. Im Gegensatz dazu erfordert das Senden einer Transaktion im Mainnet das Warten darauf, dass Blockchain-Knoten die Transaktion verarbeiten, einen neuen Block mit der Transaktion produzieren und einen Konsens erzielen. Nutzer müssen möglicherweise auch auf weitere Blockbestätigungen warten, bevor sie eine Transaktion als finalisiert betrachten. -4. **Kosten**: Zustands-Channels sind besonders nützlich in Situationen, in denen eine Gruppe von Teilnehmern über einen langen Zeitraum viele Zustandsaktualisierungen austauschen wird. Die einzigen anfallenden Kosten sind das Öffnen und Schließen des Smart Contracts des Zustands-Channels; jede Zustandsänderung zwischen dem Öffnen und Schließen des Channels wird billiger als die letzte, da die Abwicklungskosten entsprechend verteilt werden. +4. **Kosten**: State Channels sind besonders nützlich in Situationen, in denen eine Gruppe von Teilnehmern über einen langen Zeitraum viele Zustandsaktualisierungen austauscht. Die einzigen anfallenden Kosten sind das Öffnen und Schließen des State Channel-Smart Contracts; jede Zustandsänderung zwischen dem Öffnen und Schließen des Kanals wird billiger als die vorherige sein, da die Abwicklungskosten entsprechend verteilt werden. -Die Implementierung von Zustands-Channels auf Layer-2-Lösungen wie [Rollups](/developers/docs/scaling/#rollups) könnte sie für Zahlungen noch attraktiver machen. Obwohl Channels günstige Zahlungen ermöglichen, können die Kosten für die Einrichtung des Onchain-Vertrags im Mainnet während der Eröffnungsphase teuer werden – besonders wenn die Gasgebühren in die Höhe schnellen. Auf Ethereum basierende Rollups bieten [niedrigere Transaktionsgebühren](https://l2fees.info/) und können den Overhead für Channel-Teilnehmer reduzieren, indem sie die Einrichtungsgebühren senken. +Die Implementierung von State Channels auf Ebene 2-Lösungen, wie z. B. [Rollups](/developers/docs/scaling/#rollups), könnte sie für Zahlungen noch attraktiver machen. Während Kanäle günstige Zahlungen bieten, können die Kosten für die Einrichtung des Vertrags auf der Blockchain im Mainnet während der Eröffnungsphase teuer werden – insbesondere wenn die Gasgebühren in die Höhe schnellen. Ethereum-basierte Rollups bieten [niedrigere Transaktionsgebühren](https://l2fees.info/) und können den Mehraufwand für Kanalteilnehmer reduzieren, indem sie die Einrichtungsgebühren senken. -### Mikrotransaktionen {#microtransactions} +### Mikrozahlungen {#microtransactions} -Mikrotransaktionen sind Zahlungen mit geringem Wert (z. B. weniger als ein Bruchteil eines Dollars), die Unternehmen nicht ohne Verluste abwickeln können. Diese Unternehmen müssen Zahlungsdienstleister bezahlen, was sie nicht können, wenn die Marge bei Kundenzahlungen zu gering ist, um einen Gewinn zu erzielen. +Mikrozahlungen sind Zahlungen mit geringem Wert (z. B. weniger als ein Bruchteil eines Dollars), die Unternehmen nicht ohne Verluste verarbeiten können. Diese Unternehmen müssen Zahlungsdienstleister bezahlen, was sie nicht tun können, wenn die Marge bei Kundenzahlungen zu gering ist, um einen Gewinn zu erzielen. -Zahlungskanäle lösen dieses Problem, indem sie den mit Mikrotransaktionen verbundenen Overhead reduzieren. Zum Beispiel kann ein Internetdienstanbieter (ISP) einen Zahlungskanal mit einem Kunden eröffnen, der es ermöglicht, bei jeder Nutzung des Dienstes kleine Zahlungen zu streamen. +Payment Channels lösen dieses Problem, indem sie den mit Mikrozahlungen verbundenen Mehraufwand reduzieren. Zum Beispiel kann ein Internetdienstanbieter (ISP) einen Payment Channel mit einem Kunden eröffnen, der es ihm ermöglicht, jedes Mal, wenn er den Dienst nutzt, kleine Zahlungen zu streamen. -Abgesehen von den Kosten für das Öffnen und Schließen des Kanals entstehen den Teilnehmern keine weiteren Kosten für Mikrotransaktionen (keine Gasgebühren). Dies ist eine Win-Win-Situation, da Kunden mehr Flexibilität bei der Höhe ihrer Zahlungen für Dienstleistungen haben und Unternehmen bei profitablen Mikrotransaktionen keine Einbußen erleiden. +Über die Kosten für das Öffnen und Schließen des Kanals hinaus entstehen den Teilnehmern keine weiteren Kosten für Mikrozahlungen (keine Gasgebühren). Dies ist eine Win-Win-Situation, da Kunden mehr Flexibilität bei der Bezahlung von Dienstleistungen haben und Unternehmen keine profitablen Mikrozahlungen entgehen. ### Dezentralisierte Anwendungen {#decentralized-applications} -Ähnlich wie Zahlungskanäle können Zustandskanäle (State Channels) bedingte Zahlungen gemäß den Endzuständen der Zustandsmaschine durchführen. Zustandskanäle können auch beliebige Zustandsübergangslogik unterstützen, was sie für die Ausführung generischer Anwendungen Off-Chain nützlich macht. +Wie Payment Channels können State Channels bedingte Zahlungen entsprechend den Endzuständen der Zustandsmaschine vornehmen. State Channels können auch beliebige Zustandsübergangslogik unterstützen, was sie nützlich für die Ausführung generischer Apps Off-Chain macht. -Zustandskanäle sind oft auf einfache rundenbasierte Anwendungen beschränkt, da dies die Verwaltung der an den On-Chain-Vertrag gebundenen Mittel erleichtert. Außerdem ist es bei einer begrenzten Anzahl von Parteien, die den Zustand der Off-Chain-Anwendung in Abständen aktualisieren, relativ einfach, unehrliches Verhalten zu bestrafen. +State Channels sind oft auf einfache rundenbasierte Anwendungen beschränkt, da dies die Verwaltung der an den Vertrag auf der Blockchain gebundenen Gelder erleichtert. Da außerdem nur eine begrenzte Anzahl von Parteien den Zustand der Off-Chain-Anwendung in Intervallen aktualisiert, ist die Bestrafung unehrlichen Verhaltens relativ unkompliziert. -Die Effizienz einer Zustandskanal-Anwendung hängt auch von ihrem Design ab. Zum Beispiel könnte ein Entwickler den App-Kanalvertrag einmal On-Chain bereitstellen und anderen Spielern ermöglichen, die App wiederzuverwenden, ohne On-Chain gehen zu müssen. In diesem Fall dient der ursprüngliche App-Kanal als Hauptkanal (Ledger Channel), der mehrere virtuelle Kanäle unterstützt, von denen jeder eine neue Instanz des Smart Contracts der App Off-Chain ausführt. +Die Effizienz einer State Channel-Anwendung hängt auch von ihrem Design ab. Zum Beispiel könnte ein Entwickler den App-Kanalvertrag einmal auf der Blockchain bereitstellen und anderen Spielern erlauben, die App wiederzuverwenden, ohne auf die Blockchain gehen zu müssen. In diesem Fall dient der anfängliche App-Kanal als Ledger-Kanal, der mehrere virtuelle Kanäle unterstützt, von denen jeder eine neue Instanz des Smart Contracts der App Off-Chain ausführt. -Ein möglicher Anwendungsfall für Zustandskanal-Anwendungen sind einfache Zweispieler-Spiele, bei denen Mittel basierend auf dem Spielergebnis verteilt werden. Der Vorteil hierbei ist, dass Spieler sich nicht gegenseitig vertrauen müssen (Vertrauenslosigkeit) und der On-Chain-Vertrag, nicht die Spieler, die Zuteilung der Mittel und die Beilegung von Streitigkeiten kontrolliert (Dezentralisierung). +Ein potenzieller Anwendungsfall für State Channel-Anwendungen sind einfache Zwei-Spieler-Spiele, bei denen die Gelder basierend auf dem Spielergebnis verteilt werden. Der Vorteil hierbei ist, dass die Spieler einander nicht vertrauen müssen (Vertrauenslosigkeit) und der Vertrag auf der Blockchain, nicht die Spieler, die Zuweisung von Geldern und die Beilegung von Streitigkeiten kontrolliert (Dezentralisierung). -Weitere mögliche Anwendungsfälle für Zustandskanal-Apps umfassen ENS-Namenseigentum, NFT-Ledger und viele mehr. +Weitere mögliche Anwendungsfälle für State Channel-Apps umfassen den Besitz von ENS-Namen, NFT-Ledger und viele mehr. ### Atomare Transfers {#atomic-transfers} -Frühe Zahlungskanäle waren auf Transfers zwischen zwei Parteien beschränkt, was ihre Nutzbarkeit einschränkte. Die Einführung virtueller Kanäle ermöglichte es jedoch Einzelpersonen, Transfers über Zwischenstellen (d. h. mehrere P2P-Kanäle) weiterzuleiten, ohne einen neuen Kanal On-Chain eröffnen zu müssen. +Frühe Payment Channels waren auf Transfers zwischen zwei Parteien beschränkt, was ihre Nutzbarkeit einschränkte. Die Einführung virtueller Kanäle ermöglichte es Einzelpersonen jedoch, Transfers über Vermittler (d. h. mehrere P2P-Kanäle) zu leiten, ohne einen neuen Kanal auf der Blockchain öffnen zu müssen. -Häufig als „Multi-Hop-Transfers“ beschrieben, sind geroutete Zahlungen atomar (d. h., entweder gelingen alle Teile der Transaktion oder sie scheitert insgesamt). Atomare Transfers verwenden [Hash-Zeitsperren-Verträge (HTLCs)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts), um sicherzustellen, dass die Zahlung nur freigegeben wird, wenn bestimmte Bedingungen erfüllt sind, wodurch das Kontrahentenrisiko verringert wird. +Gemeinhin als „Multi-Hop-Transfers“ beschrieben, sind geroutete Zahlungen atomar (d. h. entweder sind alle Teile der Transaktion erfolgreich oder sie schlägt insgesamt fehl). Atomare Transfers verwenden [Hashed Timelock Contracts (HTLCs)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts), um sicherzustellen, dass die Zahlung nur freigegeben wird, wenn bestimmte Bedingungen erfüllt sind, wodurch das Kontrahentenrisiko verringert wird. -## Nachteile der Verwendung von Zustands-Channels {#drawbacks-of-state-channels} +## Nachteile der Nutzung von State Channels {#drawbacks-of-state-channels} ### Liveness-Annahmen {#liveness-assumptions} -Um die Effizienz zu gewährleisten, setzen Zustands-Channels Zeitlimits für die Fähigkeit der Channel-Teilnehmer, auf Streitigkeiten zu reagieren. Diese Regel geht davon aus, dass die Peers immer online sein werden, um die Channel-Aktivität zu überwachen und bei Bedarf Anfechtungen zu bestreiten. +Um die Effizienz zu gewährleisten, legen State Channels zeitliche Begrenzungen für die Fähigkeit der Kanalteilnehmer fest, auf Streitigkeiten zu reagieren. Diese Regel geht davon aus, dass Peers immer online sind, um die Kanalaktivität zu überwachen und Anfechtungen bei Bedarf zu bestreiten. -In der Realität können Benutzer aus Gründen, die außerhalb ihrer Kontrolle liegen (z. B. schlechte Internetverbindung, mechanischer Defekt usw.), offline gehen. Wenn ein ehrlicher Benutzer offline geht, kann ein bösartiger Peer die Situation ausnutzen, indem er dem Schiedsrichtervertrag alte Zwischenzustände vorlegt und die zugesagten Gelder stiehlt. +In der Realität können Nutzer aus Gründen, die außerhalb ihrer Kontrolle liegen, offline gehen (z. B. schlechte Internetverbindung, mechanisches Versagen usw.). Wenn ein ehrlicher Nutzer offline geht, kann ein böswilliger Peer die Situation ausnutzen, indem er dem Schiedsrichtervertrag alte Zwischenzustände präsentiert und die gebundenen Gelder stiehlt. -Einige Channels verwenden „Watchtowers“ – Entitäten, die dafür verantwortlich sind, Onchain-Streitigkeiten im Namen anderer zu beobachten und die notwendigen Maßnahmen zu ergreifen, wie z. B. die Benachrichtigung der betroffenen Parteien. Dies kann jedoch die Kosten für die Nutzung eines Zustands-Channels erhöhen. +Einige Kanäle verwenden „Watchtowers“ (Wachtürme) – Entitäten, die dafür verantwortlich sind, Streitfälle auf der Blockchain im Namen anderer zu beobachten und notwendige Maßnahmen zu ergreifen, wie z. B. die Alarmierung der betroffenen Parteien. Dies kann jedoch die Kosten für die Nutzung eines State Channels erhöhen. ### Datenunverfügbarkeit {#data-unavailability} -Wie bereits erläutert, erfordert die Anfechtung einer ungültigen Streitigkeit die Vorlage des neuesten, gültigen Zustands des Zustands-Channels. Dies ist eine weitere Regel, die auf einer Annahme beruht – dass Benutzer Zugriff auf den neuesten Zustand des Channels haben. +Wie bereits erklärt, erfordert die Anfechtung eines ungültigen Streits die Präsentation des neuesten, gültigen Zustands des State Channels. Dies ist eine weitere Regel, die auf einer Annahme basiert – dass die Nutzer Zugriff auf den neuesten Zustand des Kanals haben. -Obwohl es vernünftig ist, von den Channel-Benutzern zu erwarten, dass sie Kopien des Offchain-Anwendungszustands speichern, können diese Daten aufgrund von Fehlern oder mechanischen Ausfällen verloren gehen. Wenn der Benutzer die Daten nicht gesichert hat, kann er nur hoffen, dass die andere Partei keine ungültige Austrittsanfrage mit alten Zustandsübergängen in ihrem Besitz finalisiert. +Obwohl es vernünftig ist zu erwarten, dass Kanalnutzer Kopien des Zustands der Off-Chain-Anwendung speichern, können diese Daten durch Fehler oder mechanisches Versagen verloren gehen. Wenn der Nutzer die Daten nicht gesichert hat, kann er nur hoffen, dass die andere Partei keine ungültige Austrittsanfrage unter Verwendung alter Zustandsübergänge in ihrem Besitz finalisiert. -Ethereum-Benutzer müssen sich nicht mit diesem Problem befassen, da das Netzwerk Regeln zur Datenverfügbarkeit durchsetzt. Transaktionsdaten werden von allen Knoten gespeichert und verbreitet und stehen den Benutzern bei Bedarf zum Herunterladen zur Verfügung. +Ethereum-Nutzer müssen sich nicht mit diesem Problem auseinandersetzen, da das Netzwerk Regeln zur Datenverfügbarkeit durchsetzt. Transaktionsdaten werden von allen Blockchain-Knoten gespeichert und verbreitet und stehen den Nutzern bei Bedarf zum Download zur Verfügung. ### Liquiditätsprobleme {#liquidity-issues} -Um einen Blockchain-Channel einzurichten, müssen die Teilnehmer für die Lebensdauer des Channels Gelder in einem Onchain-Smart-Contract sperren. Dies reduziert die Liquidität der Channel-Benutzer und beschränkt Channels auch auf diejenigen, die es sich leisten können, Gelder im Mainnet gesperrt zu halten. +Um einen Blockchain-Kanal einzurichten, müssen die Teilnehmer Gelder in einem Smart Contract auf der Blockchain für den Lebenszyklus des Kanals sperren. Dies verringert die Liquidität der Kanalnutzer und beschränkt Kanäle auch auf diejenigen, die es sich leisten können, Gelder im Mainnet gesperrt zu halten. -Jedoch können Ledger-Channels – betrieben von einem Offchain-Dienstanbieter (OSP) – Liquiditätsprobleme für Benutzer reduzieren. Zwei Peers, die mit einem Ledger-Channel verbunden sind, können einen virtuellen Channel erstellen, den sie jederzeit vollständig offchain öffnen und finalisieren können. +Ledger-Kanäle – betrieben von einem Off-Chain-Dienstleister (OSP) – können jedoch Liquiditätsprobleme für Nutzer verringern. Zwei Peers, die mit einem Ledger-Kanal verbunden sind, können einen virtuellen Kanal erstellen, den sie jederzeit komplett Off-Chain öffnen und finalisieren können. -Offchain-Dienstanbieter könnten auch Channels mit mehreren Peers eröffnen, was sie für die Weiterleitung von Zahlungen nützlich macht. Natürlich müssen Benutzer Gebühren an OSPs für ihre Dienste zahlen, was für einige unerwünscht sein kann. +Off-Chain-Dienstleister könnten auch Kanäle mit mehreren Peers öffnen, was sie nützlich für das Routing von Zahlungen macht. Natürlich müssen die Nutzer Gebühren an OSPs für deren Dienste zahlen, was für einige unerwünscht sein könnte. ### Griefing-Angriffe {#griefing-attacks} -Griefing-Angriffe sind ein häufiges Merkmal von auf Betrugsnachweisen basierenden Systemen. Ein Griefing-Angriff nützt dem Angreifer nicht direkt, sondern fügt dem Opfer Leid (d. h. Schaden) zu, daher der Name. +Griefing-Angriffe sind ein häufiges Merkmal von Systemen, die auf Betrugsnachweisen basieren. Ein Griefing-Angriff nützt dem Angreifer nicht direkt, sondern verursacht dem Opfer Kummer (d. h. Schaden), daher der Name. -Betrugsnachweise sind anfällig für Griefing-Angriffe, da die ehrliche Partei auf jede Streitigkeit, auch auf ungültige, reagieren muss, sonst riskiert sie, ihre Gelder zu verlieren. Ein bösartiger Teilnehmer kann sich entscheiden, wiederholt veraltete Zustandsübergänge onchain zu posten, was die ehrliche Partei zwingt, mit dem gültigen Zustand zu antworten. Die Kosten für diese Onchain-Transaktionen können sich schnell summieren, was dazu führt, dass ehrliche Parteien dabei Verluste erleiden. +Der Betrugsnachweis ist anfällig für Griefing-Angriffe, da die ehrliche Partei auf jeden Streitfall reagieren muss, auch auf ungültige, oder riskiert, ihre Gelder zu verlieren. Ein böswilliger Teilnehmer kann beschließen, wiederholt veraltete Zustandsübergänge auf der Blockchain zu veröffentlichen, was die ehrliche Partei zwingt, mit dem gültigen Zustand zu antworten. Die Kosten für diese Transaktionen auf der Blockchain können sich schnell summieren, was dazu führt, dass ehrliche Parteien dabei den Kürzeren ziehen. ### Vordefinierte Teilnehmergruppen {#predefined-participant-sets} -Konstruktionsbedingt bleibt die Anzahl der Teilnehmer, die einen Zustands-Channel bilden, während seiner gesamten Lebensdauer fest. Dies liegt daran, dass eine Aktualisierung der Teilnehmergruppe den Betrieb des Kanals, insbesondere bei der Finanzierung des Kanals oder der Beilegung von Streitigkeiten, komplizieren würde. Das Hinzufügen oder Entfernen von Teilnehmern würde auch zusätzliche Onchain-Aktivitäten erfordern, was den Aufwand für die Benutzer erhöht. +Konstruktionsbedingt bleibt die Anzahl der Teilnehmer, die einen State Channel bilden, während seiner gesamten Lebensdauer fest. Dies liegt daran, dass die Aktualisierung der Teilnehmergruppe den Betrieb des Kanals verkomplizieren würde, insbesondere bei der Finanzierung des Kanals oder der Beilegung von Streitigkeiten. Das Hinzufügen oder Entfernen von Teilnehmern würde auch zusätzliche Aktivitäten auf der Blockchain erfordern, was den Mehraufwand für die Nutzer erhöht. -Obwohl dies Zustands-Channels leichter verständlich macht, schränkt es die Nützlichkeit von Channel-Designs für Anwendungsentwickler ein. Dies erklärt zum Teil, warum Zustands-Channels zugunsten anderer Skalierungslösungen wie Rollups aufgegeben wurden. +Während dies das Nachdenken über State Channels erleichtert, schränkt es die Nützlichkeit von Kanaldesigns für Anwendungsentwickler ein. Dies erklärt teilweise, warum State Channels zugunsten anderer Skalierungslösungen, wie z. B. Rollups, aufgegeben wurden. ### Parallele Transaktionsverarbeitung {#parallel-transaction-processing} -Die Teilnehmer im Zustands-Channel senden abwechselnd Zustandsaktualisierungen, weshalb sie am besten für „rundenbasierte Anwendungen“ (z. B. ein Zwei-Spieler-Schachspiel) geeignet sind. Dies eliminiert die Notwendigkeit, gleichzeitige Zustandsaktualisierungen zu handhaben und reduziert die Arbeit, die der Onchain-Vertrag leisten muss, um Poster von veralteten Aktualisierungen zu bestrafen. Ein Nebeneffekt dieses Designs ist jedoch, dass Transaktionen voneinander abhängig sind, was die Latenz erhöht und die allgemeine Benutzererfahrung beeinträchtigt. +Die Teilnehmer im State Channel senden Zustandsaktualisierungen abwechselnd, weshalb sie am besten für „rundenbasierte Anwendungen“ (z. B. ein Zwei-Spieler-Schachspiel) funktionieren. Dies beseitigt die Notwendigkeit, gleichzeitige Zustandsaktualisierungen zu handhaben, und reduziert die Arbeit, die der Vertrag auf der Blockchain leisten muss, um Poster veralteter Aktualisierungen zu bestrafen. Ein Nebeneffekt dieses Designs ist jedoch, dass Transaktionen voneinander abhängig sind, was die Latenz erhöht und die allgemeine Nutzererfahrung verschlechtert. -Einige Zustands-Channels lösen dieses Problem, indem sie ein „Vollduplex“-Design verwenden, das den Offchain-Zustand in zwei unidirektionale „Simplex“-Zustände aufteilt und so gleichzeitige Zustandsaktualisierungen ermöglicht. Solche Designs verbessern den Offchain-Durchsatz und verringern Transaktionsverzögerungen. +Einige State Channels lösen dieses Problem durch die Verwendung eines „Vollduplex“-Designs, das den Off-Chain-Zustand in zwei unidirektionale „Simplex“-Zustände trennt, was gleichzeitige Zustandsaktualisierungen ermöglicht. Solche Designs verbessern den Off-Chain-Durchsatz und verringern Transaktionsverzögerungen. -## Zustands-Channels verwenden {#use-state-channels} +## State Channels nutzen {#use-state-channels} -Mehrere Projekte bieten Implementierungen von Zustandskanälen, die Sie in Ihre dApps integrieren können: +Mehrere Projekte bieten Implementierungen von State Channels an, die Sie in Ihre Dapps integrieren können: - [Connext](https://connext.network/) - [Kchannels](https://www.kchannels.io/) @@ -249,13 +249,13 @@ Mehrere Projekte bieten Implementierungen von Zustandskanälen, die Sie in Ihre - [Raiden](https://raiden.network/) - [Statechannels.org](https://statechannels.org/) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -**Statuskanäle** +**State Channels** -- [Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, 12. Februar 2018_ -- [State Channels – eine Erklärung](https://www.jeffcoleman.ca/state-channels/) _6. Nov. 2015 – Jeff Coleman_ -- [Grundlagen von State Channels](https://unlock-protocol.github.io/ethhub/ethereum-roadmap/layer-2-scaling/state-channels/) _District0x_ -- [Blockchain State Channels: Ein Stand der Technik](https://ieeexplore.ieee.org/document/9627997) +- [Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, Feb 12 2018_ +- [State Channels - an explanation](https://www.jeffcoleman.ca/state-channels/) _Nov 6, 2015 - Jeff Coleman_ +- [Basics of State Channels](https://unlock-protocol.github.io/ethhub/ethereum-roadmap/layer-2-scaling/state-channels/) _District0x_ +- [Blockchain State Channels: A State of the Art](https://ieeexplore.ieee.org/document/9627997) -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/validium/index.md b/public/content/translations/de/developers/docs/scaling/validium/index.md index fda1ca50290..c7aabee8445 100644 --- a/public/content/translations/de/developers/docs/scaling/validium/index.md +++ b/public/content/translations/de/developers/docs/scaling/validium/index.md @@ -5,162 +5,161 @@ lang: de sidebarDepth: 3 --- -Validium ist eine [Skalierungslösung](/developers/docs/scaling/), die die Integrität von Transaktionen mithilfe von Gültigkeitsnachweisen wie [ZK-Rollups](/developers/docs/scaling/zk-rollups/) gewährleistet, aber keine Transaktionsdaten auf dem Ethereum Mainnet speichert. Während die Verfügbarkeit von Off-Chain-Daten Kompromisse mit sich bringt, kann sie zu massiven Verbesserungen der Skalierbarkeit führen (Validiums können [ca. 9.000 Transaktionen oder mehr pro Sekunde](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) verarbeiten). +Validium ist eine [Skalierungslösung](/developers/docs/scaling/), die die Integrität von Transaktionen mithilfe von Validitätsnachweisen wie [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) erzwingt, aber keine Transaktionsdaten im [Ethereum](/)-Mainnet speichert. Während die Off-Chain-Datenverfügbarkeit Kompromisse mit sich bringt, kann sie zu massiven Verbesserungen der Skalierbarkeit führen (Validiums können [\~9.000 Transaktionen oder mehr pro Sekunde](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) verarbeiten). ## Voraussetzungen {#prerequisites} -Sie sollten unsere Seite über die [Ethereum-Skalierung](/developers/docs/scaling/) und [Layer 2](/layer-2) gelesen und verstanden haben. +Sie sollten unsere Seiten zur [Ethereum-Skalierung](/developers/docs/scaling/) und zu [Ebene 2](/layer-2) gelesen und verstanden haben. ## Was ist Validium? {#what-is-validium} -Validiums sind Skalierungslösungen, die Off-Chain-Datenverfügbarkeit und -berechnung nutzen, um den Durchsatz zu verbessern, indem Transaktionen außerhalb des Ethereum Mainnets verarbeitet werden. Wie Zero-Knowledge Rollups (ZK-Rollups) veröffentlichen Validiums [Zero-Knowledge-Proofs](/glossary/#zk-proof), um Off-Chain-Transaktionen auf Ethereum zu verifizieren. Dies verhindert ungültige Zustandsübergänge und verbessert die Sicherheitsgarantien einer Validium-Kette. +Validiums sind Skalierungslösungen, die Off-Chain-Datenverfügbarkeit und -Berechnungen nutzen, um den Durchsatz zu verbessern, indem Transaktionen außerhalb des Ethereum-Mainnets verarbeitet werden. Wie Zero-Knowledge Rollups (ZK-Rollups) veröffentlichen Validiums [Zero-Knowledge-Beweise](/glossary/#zk-proof), um Off-Chain-Transaktionen auf Ethereum zu verifizieren. Dies verhindert ungültige Zustandsübergänge und verbessert die Sicherheitsgarantien einer Validium-Chain. -Diese "Gültigkeitsnachweise" können in Form von ZK-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) oder ZK-STARKs (Zero-Knowledge Scalable Transparent ARgument of Knowledge) vorliegen. Mehr zu [Zero-Knowledge-Proofs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/). +Diese „Validitätsnachweise“ können in Form von ZK-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) oder ZK-STARKs (Zero-Knowledge Scalable Transparent ARgument of Knowledge) vorliegen. Mehr zu [Zero-Knowledge-Beweisen](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/). -Die Gelder der Validium-Nutzer werden von einem Smart Contract auf Ethereum verwaltet. Validiums bieten nahezu sofortige Auszahlungen, ähnlich wie ZK-Rollups; sobald der Gültigkeitsnachweis für eine Auszahlungsanforderung auf dem Mainnet verifiziert wurde, können Nutzer Gelder abheben, indem sie [Merkle-Nachweise](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) vorlegen. Der Merkle-Beweis überprüft, ob die Auszahlungstransaktion des Nutzers in einem verifizierten Transaktionsbatch enthalten ist, und ermöglicht es dem On-Chain-Vertrag, die Auszahlung zu bearbeiten. +Guthaben, die Validium-Nutzern gehören, werden durch einen Smart Contract auf Ethereum kontrolliert. Validiums bieten nahezu sofortige Auszahlungen, ähnlich wie ZK-Rollups; sobald der Validitätsnachweis für eine Auszahlungsanforderung im Mainnet verifiziert wurde, können Nutzer Guthaben abheben, indem sie [Merkle-Beweise](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) vorlegen. Der Merkle-Beweis validiert die Aufnahme der Auszahlungstransaktion des Nutzers in einen verifizierten Transaktions-Batch, wodurch der Vertrag auf der Blockchain die Auszahlung verarbeiten kann. -Allerdings können die Gelder der Validium-Nutzer eingefroren und Auszahlungen eingeschränkt werden. Das kann passieren, wenn Datenverfügbarkeits-Manager auf der Validium-Chain die Off-Chain-State-Daten vor Nutzern zurückhalten. Ohne Zugriff auf Transaktionsdaten können die Nutzer den für den Nachweis des Eigentums an den Geldern und die Durchführung von Auszahlungen erforderlichen Merkle-Nachweis nicht berechnen. +Allerdings können die Guthaben von Validium-Nutzern eingefroren und Auszahlungen eingeschränkt werden. Dies kann passieren, wenn Datenverfügbarkeitsmanager auf der Validium-Chain den Nutzern Off-Chain-Zustandsdaten vorenthalten. Ohne Zugriff auf Transaktionsdaten können Nutzer den Merkle-Beweis nicht berechnen, der erforderlich ist, um den Besitz von Guthaben nachzuweisen und Auszahlungen auszuführen. -Dies ist der Hauptunterschied zwischen Validiums und ZK-Rollups – ihre Positionen im Datenverfügbarkeitsspektrum. Beide Lösungen gehen unterschiedlich mit der Datenspeicherung um, was Auswirkungen auf Sicherheit und Vertrauenswürdigkeit hat. +Dies ist der Hauptunterschied zwischen Validiums und ZK-Rollups – ihre Positionen im Spektrum der Datenverfügbarkeit. Beide Lösungen gehen die Datenspeicherung unterschiedlich an, was Auswirkungen auf Sicherheit und Vertrauenslosigkeit hat. ## Wie interagieren Validiums mit Ethereum? {#how-do-validiums-interact-with-ethereum} -Validiums sind Skalierungsprotokolle, die auf der bestehenden Ethereum-Blockchain aufgebaut sind. Obwohl die Transaktionen Off-Chain ausgeführt werden, wird eine Validium-Chain von mehreren Smart Contracts verwaltet, die im Mainnet eingesetzt sind, darunter: +Validiums sind Skalierungsprotokolle, die auf der bestehenden Ethereum-Chain aufbauen. Obwohl sie Transaktionen Off-Chain ausführen, wird eine Validium-Chain durch eine Sammlung von Smart Contracts verwaltet, die im Mainnet bereitgestellt werden, darunter: -1. **Verifier-Vertrag**: Der Verifier-Vertrag überprüft die Gültigkeit der vom Validium-Operator eingereichten Nachweise bei der Durchführung von Statusaktualisierungen. Das umfasst Gültigkeitsnachweise, die die Korrektheit der Offchain-Transaktionen belegen, sowie Datenverfügbarkeitsnachweise, die bestätigen, dass die Offchain-Transaktionsdaten vorhanden sind. +1. **Verifizierungsvertrag (Verifier Contract)**: Der Verifizierungsvertrag überprüft die Gültigkeit von Beweisen, die vom Validium-Betreiber bei Zustandsaktualisierungen eingereicht werden. Dies umfasst Validitätsnachweise, die die Richtigkeit von Off-Chain-Transaktionen bescheinigen, und Datenverfügbarkeitsbeweise, die die Existenz von Off-Chain-Transaktionsdaten verifizieren. -2. **Hauptvertrag**: Der Hauptvertrag speichert State-Commitments (Merkle-Roots), die von Block-Produzenten eingereicht werden, und aktualisiert den Status des Validiums, sobald ein Gültigkeitsnachweis on-chain verifiziert wurde. Dieser Vertrag verarbeitet auch Einzahlungen in die Validium-Kette und Abhebungen aus dieser. +2. **Hauptvertrag (Main Contract)**: Der Hauptvertrag speichert Zustandsverpflichtungen (Merkle-Wurzeln), die von Blockproduzenten eingereicht werden, und aktualisiert den Zustand des Validiums, sobald ein Validitätsnachweis auf der Blockchain verifiziert wurde. Dieser Vertrag verarbeitet auch Einzahlungen in und Auszahlungen aus der Validium-Chain. -Validiums verlassen sich auch auf die Haupt-Ethereum-Blockchain für Folgendes: +Validiums sind zudem für Folgendes auf die Ethereum-Hauptchain angewiesen: -### Abwicklung {#settlement} +### Abwicklung (Settlement) {#settlement} -Transaktionen, die auf einem Validium ausgeführt werden, können erst vollständig bestätigt werden, wenn die Haupt-Blockchain ihre Gültigkeit überprüft hat. Alle Geschäfte, die auf einem Validium durchgeführt werden, müssen schließlich auf dem Mainnet abgewickelt werden. Die Ethereum-Blockchain bietet Validium-Nutzern auch "Settlement-Garantien", was bedeutet: Sobald Off-Chain-Transaktionen auf die Blockchain übertragen sind, können sie nicht mehr rückgängig gemacht oder verändert werden. +Transaktionen, die auf einem Validium ausgeführt werden, können erst vollständig bestätigt werden, wenn die übergeordnete Chain ihre Gültigkeit verifiziert. Alle auf einem Validium durchgeführten Geschäfte müssen letztendlich im Mainnet abgewickelt werden. Die Ethereum-Blockchain bietet Validium-Nutzern auch „Abwicklungsgarantien“, was bedeutet, dass Off-Chain-Transaktionen nicht rückgängig gemacht oder geändert werden können, sobald sie auf der Blockchain festgeschrieben wurden. ### Sicherheit {#security} -Ethereum, das als Abwicklungsschicht fungiert, garantiert auch die Gültigkeit der Statusübergänge auf Validium. Off-Chain-Transaktionen, die auf der Validium-Chain ausgeführt werden, werden über einen Smart Contract auf der Basis-Ethereum-Schicht verifiziert. +Ethereum fungiert als Abwicklungsebene und garantiert auch die Gültigkeit von Zustandsübergängen auf dem Validium. Off-Chain-Transaktionen, die auf der Validium-Chain ausgeführt werden, werden über einen Smart Contract auf der Ethereum-Basisebene verifiziert. -Hält der On-Chain-Verifizierungsvertrag den Nachweis für ungültig, werden die Transaktionen abgelehnt. Das bedeutet, dass die Betreiber die vom Ethereum-Protokoll durchgesetzten Gültigkeitsbedingungen erfüllen müssen, bevor sie den Status des Validiums aktualisieren. +Wenn der Verifizierungsvertrag auf der Blockchain den Beweis als ungültig erachtet, werden die Transaktionen abgelehnt. Dies bedeutet, dass Betreiber die vom Ethereum-Protokoll erzwungenen Gültigkeitsbedingungen erfüllen müssen, bevor sie den Zustand des Validiums aktualisieren. ## Wie funktioniert Validium? {#how-does-validium-work} ### Transaktionen {#transactions} -Benutzer übermitteln Transaktionen an den Betreiber, eine Node, der für die Ausführung von Transaktionen auf der Validium-Kette verantwortlich ist. Einige Validiums können einen einzelnen Betreiber verwenden, um die Chain auszuführen, oder sich auf einen [Proof-of-Stake (PoS)](/developers/docs/consensus-mechanisms/pos/)-Mechanismus für rotierende Betreiber verlassen. +Nutzer übermitteln Transaktionen an den Betreiber, einen Blockchain-Knoten, der für die Ausführung von Transaktionen auf der Validium-Chain verantwortlich ist. Einige Validiums verwenden möglicherweise einen einzigen Betreiber zur Ausführung der Chain oder verlassen sich auf einen [Proof-of-Stake (PoS)](/developers/docs/consensus-mechanisms/pos/)-Mechanismus für rotierende Betreiber. -Der Betreiber fasst Transaktionen zu einem Batch zusammen und sendet diesen an eine Beweisschaltung zur Verifizierung. Die Beweisschaltung akzeptiert das Transaktionsbatch (und andere relevante Daten) als Eingaben und gibt einen Gültigkeitsnachweis aus, der bestätigt, dass die Operationen korrekt durchgeführt wurden. +Der Betreiber fasst Transaktionen zu einem Batch zusammen und sendet ihn zur Beweisführung an eine Beweisschaltung (Proving Circuit). Die Beweisschaltung akzeptiert den Transaktions-Batch (und andere relevante Daten) als Eingaben und gibt einen Validitätsnachweis aus, der verifiziert, dass die Operationen korrekt durchgeführt wurden. -### Zustands-Commitments {#state-commitments} +### Zustandsverpflichtungen (State Commitments) {#state-commitments} -Der Zustand des Validiums wird als Merkle-Baum gehasht, wobei die Wurzel im Hauptvertrag auf Ethereum gespeichert wird. Die Merkle-Wurzel, auch bekannt als Zustandswurzel, dient als kryptografische Verpflichtung zum aktuellen Zustand der Konten und Salden auf dem Validium. +Der Zustand des Validiums wird als Merkle-Baum gehasht, wobei die Wurzel im Hauptvertrag auf Ethereum gespeichert wird. Die Merkle-Wurzel, auch bekannt als Zustandswurzel (State Root), fungiert als kryptografische Verpflichtung auf den aktuellen Zustand von Konten und Salden auf dem Validium. -Um den Zustand zu aktualisieren, muss der Betreiber (nachdem er Transaktionen ausgeführt hat) einen neuen Zustands-Hashwert (State-Root) berechnen und diesen an den On-Chain-Vertrag übermitteln. Wenn der Gültigkeitsnachweis erfolgreich ist, wird der vorgeschlagene Zustand akzeptiert und das Validium wechselt zum neuen Zustands-Root. +Um eine Zustandsaktualisierung durchzuführen, muss der Betreiber eine neue Zustandswurzel berechnen (nach Ausführung der Transaktionen) und diese an den Vertrag auf der Blockchain übermitteln. Wenn der Validitätsnachweis erfolgreich geprüft wird, wird der vorgeschlagene Zustand akzeptiert und das Validium wechselt zur neuen Zustandswurzel. -### Einzahlungen und Auszahlungen {#deposits-and-withdrawals} +### Ein- und Auszahlungen {#deposits-and-withdrawals} -Nutzer verschieben ihre Gelder von Ethereum auf ein Validium, indem sie ETH (oder irgendeinen ERC-kompatiblen Token) im On-Chain-Vertrag einzahlen. Der Vertrag leitet das Einzahlungsereignis Off-Chain an das Validium weiter, wo die Adresse des Benutzers mit einem Betrag gutgeschrieben wird, der seiner Einzahlung entspricht. Der Betreiber fügt diese Einzahlungstransaktion auch einem neuen Batch hinzu. +Nutzer verschieben Guthaben von Ethereum auf ein Validium, indem sie ETH (oder einen beliebigen ERC-kompatiblen Token) in den Vertrag auf der Blockchain einzahlen. Der Vertrag leitet das Einzahlungsereignis an das Validium Off-Chain weiter, wo der Adresse des Nutzers ein Betrag in Höhe seiner Einzahlung gutgeschrieben wird. Der Betreiber nimmt diese Einzahlungstransaktion auch in einen neuen Batch auf. -Um Gelder zurück ins Mainnet zu bewegen, initiiert ein Validium-Benutzer eine Auszahlungstransaktion und übermittelt sie an den Betreiber, der die Auszahlungsanfrage validiert und sie in einen Batch aufnimmt. Die Vermögenswerte des Benutzers auf der Validium-Chain werden ebenfalls vernichtet, bevor er das System verlassen kann. Sobald der mit dem Batch verbundene Gültigkeitsnachweis verifiziert ist, kann der Benutzer den Hauptvertrag aufrufen, um den Rest seiner ursprünglichen Einzahlung abzuheben. +Um Guthaben zurück ins Mainnet zu verschieben, initiiert ein Validium-Nutzer eine Auszahlungstransaktion und übermittelt sie an den Betreiber, der die Auszahlungsanforderung validiert und in einen Batch aufnimmt. Die Vermögenswerte des Nutzers auf der Validium-Chain werden ebenfalls zerstört, bevor sie das System verlassen können. Sobald der mit dem Batch verbundene Validitätsnachweis verifiziert ist, kann der Nutzer den Hauptvertrag aufrufen, um den Rest seiner ursprünglichen Einzahlung abzuheben. -Als Mechanismus gegen Zensur erlaubt das Validium-Protokoll Benutzern, sich direkt vom Validium-Vertrag auszuzahlen, ohne den Betreiber zu durchlaufen. In diesem Fall müssen Benutzer dem Verifizierungsvertrag einen Merkle-Proof vorlegen, der die Aufnahme eines Kontos in den Zustands-Root belegt. Wenn der Beweis akzeptiert wird, kann der Benutzer die Auszahlungsfunktion des Hauptvertrags aufrufen, um seine Gelder aus dem Validium auszuzahlen. +Als Anti-Zensur-Mechanismus ermöglicht das Validium-Protokoll den Nutzern, direkt aus dem Validium-Vertrag abzuheben, ohne über den Betreiber zu gehen. In diesem Fall müssen die Nutzer dem Verifizierungsvertrag einen Merkle-Beweis vorlegen, der die Aufnahme eines Kontos in die Zustandswurzel zeigt. Wenn der Beweis akzeptiert wird, kann der Nutzer die Auszahlungsfunktion des Hauptvertrags aufrufen, um sein Guthaben aus dem Validium abzuziehen. -### Batch-Übermittlung {#batch-submission} +### Batch-Einreichung {#batch-submission} -Nach der Ausführung eines Batches von Transaktionen übermittelt der Betreiber den zugehörigen Gültigkeitsnachweis an den Verifizierungsvertrag und schlägt dem Hauptvertrag einen neuen Zustands-Root vor. Wenn der Beweis gültig ist, aktualisiert der Hauptvertrag den Zustand des Validiums und finalisiert die Ergebnisse der Transaktionen im Batch. +Nach der Ausführung eines Transaktions-Batches reicht der Betreiber den zugehörigen Validitätsnachweis beim Verifizierungsvertrag ein und schlägt dem Hauptvertrag eine neue Zustandswurzel vor. Wenn der Beweis gültig ist, aktualisiert der Hauptvertrag den Zustand des Validiums und finalisiert die Ergebnisse der Transaktionen im Batch. -Im Gegensatz zu einem ZK-Rollup müssen Blockproduzenten auf einem Validium keine Transaktionsdaten für Transaktions-Batches veröffentlichen (nur Block-Header). Dies macht Validium zu einem reinen Off-Chain-Skalierungsprotokoll, im Gegensatz zu „hybriden“ Skalierungsprotokollen (d. h. [Layer 2](/layer-2/)), die State-Daten auf der Ethereum-Hauptchain unter Verwendung von Blob-Daten, `calldata` oder einer Kombination aus beidem veröffentlichen. +Im Gegensatz zu einem ZK-Rollup sind Blockproduzenten auf einem Validium nicht verpflichtet, Transaktionsdaten für Transaktions-Batches zu veröffentlichen (nur Block-Header). Dies macht Validium zu einem reinen Off-Chain-Skalierungsprotokoll, im Gegensatz zu „hybriden“ Skalierungsprotokollen (d. h. [Ebene 2](/layer-2/)), die Zustandsdaten auf der Ethereum-Hauptchain unter Verwendung von Blob-Daten, `calldata` oder einer Kombination aus beidem veröffentlichen. ### Datenverfügbarkeit {#data-availability} -Wie bereits erwähnt, nutzen Validiums ein Off-Chain-Datenverfügbarkeitsmodell, bei dem Betreiber alle Transaktionsdaten außerhalb des Ethereum Mainnets speichern. Der geringe Daten-Footprint von Validium in der Blockchain verbessert die Skalierbarkeit (der Durchsatz wird nicht durch die Datenverarbeitungskapazität von Ethereum begrenzt) und senkt die Nutzergebühren (die Kosten für die Veröffentlichung von Daten in der Blockchain sind geringer). +Wie bereits erwähnt, nutzen Validiums ein Off-Chain-Datenverfügbarkeitsmodell, bei dem Betreiber alle Transaktionsdaten außerhalb des Ethereum-Mainnets speichern. Der geringe Datenfußabdruck von Validium auf der Blockchain verbessert die Skalierbarkeit (der Durchsatz wird nicht durch die Datenverarbeitungskapazität von Ethereum begrenzt) und senkt die Nutzergebühren (die Kosten für die Veröffentlichung von Daten auf der Blockchain sind geringer). -Die Off-Chain-Datenverfügbarkeit birgt jedoch ein Problem: Daten, die zum Erstellen oder Überprüfen von Merkle-Proofs erforderlich sind, sind möglicherweise nicht verfügbar. Das bedeutet, dass Nutzer möglicherweise keine Gelder aus dem On-Chain-Vertrag abheben können, falls Betreiber böswillig handeln. +Die Off-Chain-Datenverfügbarkeit stellt jedoch ein Problem dar: Daten, die zum Erstellen oder Verifizieren von Merkle-Beweisen erforderlich sind, könnten nicht verfügbar sein. Dies bedeutet, dass Nutzer möglicherweise keine Guthaben aus dem Vertrag auf der Blockchain abheben können, falls Betreiber böswillig handeln. -Verschiedene Validium-Lösungen versuchen, dieses Problem zu lösen, indem sie die Speicherung von Zustandsdaten dezentralisieren. Dabei werden die Blockproduzenten gezwungen, die zugrunde liegenden Daten an "Datenverfügbarkeits-Manager" zu senden, die dafür zuständig sind, Off-Chain-Daten zu speichern und sie den Nutzern auf Anfrage zur Verfügung zu stellen. +Verschiedene Validium-Lösungen versuchen, dieses Problem zu lösen, indem sie die Speicherung von Zustandsdaten dezentralisieren. Dies beinhaltet, Blockproduzenten zu zwingen, die zugrunde liegenden Daten an „Datenverfügbarkeitsmanager“ zu senden, die für die Speicherung von Off-Chain-Daten verantwortlich sind und diese den Nutzern auf Anfrage zur Verfügung stellen. -Datenverfügbarkeits-Manager in Validium bestätigen die Verfügbarkeit von Daten für Off-Chain-Transaktionen, indem sie jeden Validium-Batch signieren. Diese Signaturen sind eine Art "Verfügbarkeitsnachweis", den der On-Chain-Verifizierungsvertrag prüft, bevor er Status-Updates genehmigt. +Datenverfügbarkeitsmanager in Validium bescheinigen die Verfügbarkeit von Daten für Off-Chain-Transaktionen, indem sie jeden Validium-Batch signieren. Diese Signaturen stellen eine Form von „Verfügbarkeitsbeweis“ dar, den der Verifizierungsvertrag auf der Blockchain prüft, bevor er Zustandsaktualisierungen genehmigt. -Validiums unterscheiden sich in ihrem Ansatz zur Verwaltung der Datenverfügbarkeit. Einige Validium-Lösungen verlassen sich auf vertrauenswürdige Parteien zur Speicherung der Zustandsdaten, während andere zufällig zugewiesene Validatoren für diese Aufgabe nutzen. +Validiums unterscheiden sich in ihrem Ansatz zum Datenverfügbarkeitsmanagement. Einige verlassen sich auf vertrauenswürdige Parteien, um Zustandsdaten zu speichern, während andere zufällig zugewiesene Validatoren für diese Aufgabe verwenden. #### Datenverfügbarkeitskomitee (DAC) {#data-availability-committee} -Um die Verfügbarkeit von Off-Chain-Daten zu garantieren, setzen einige Validium-Lösungen eine Gruppe von vertrauenswürdigen Entitäten ein, die zusammen als Datenverfügbarkeitskomitee (DAC) bekannt sind. Diese speichern Kopien des Status und liefern Nachweise für die Datenverfügbarkeit. DACs sind einfacher zu implementieren und erfordern weniger Koordination, da die Anzahl der Mitglieder gering ist. +Um die Verfügbarkeit von Off-Chain-Daten zu garantieren, ernennen einige Validium-Lösungen eine Gruppe vertrauenswürdiger Entitäten, die gemeinsam als Datenverfügbarkeitskomitee (Data Availability Committee, DAC) bekannt sind, um Kopien des Zustands zu speichern und den Nachweis der Datenverfügbarkeit zu erbringen. DACs sind einfacher zu implementieren und erfordern weniger Koordination, da die Mitgliederzahl gering ist. -Allerdings müssen die Nutzer dem DAC vertrauen, dass die Daten verfügbar gemacht werden, wenn sie benötigt werden (z.B. zum Erstellen von Merkle-Beweisen). Es besteht die Möglichkeit, dass Mitglieder von Datenverfügbarkeitskomitees [von einem böswilligen Akteur kompromittiert werden](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view), der dann Off-Chain-Daten zurückhalten kann. +Nutzer müssen jedoch darauf vertrauen, dass das DAC die Daten bei Bedarf zur Verfügung stellt (z. B. zur Generierung von Merkle-Beweisen). Es besteht die Möglichkeit, dass Mitglieder von Datenverfügbarkeitskomitees [von einem böswilligen Akteur kompromittiert werden](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view), der dann Off-Chain-Daten vorenthalten kann. -[Mehr über Datenverfügbarkeitskomitees in Validiums](https://medium.com/starkware/data-availability-e5564c416424). +[Mehr zu Datenverfügbarkeitskomitees in Validiums](https://medium.com/starkware/data-availability-e5564c416424). -#### Gebundene Datenverfügbarkeit {#bonded-data-availability} +#### Gebundene Datenverfügbarkeit (Bonded Data Availability) {#bonded-data-availability} -Andere Validiums verlangen von den Teilnehmern, die mit der Speicherung von Offline-Daten beauftragt sind, dass sie Tokens in einem Smart Contract hinterlegen (d.h. sperren), bevor sie ihre Rollen übernehmen. Dieser Einsatz dient als "Kaution", um ehrliches Verhalten unter den Datenverfügbarkeitsmanagern zu gewährleisten und die Vertrauensannahmen zu reduzieren. Wenn diese Teilnehmer es versäumen, die Datenverfügbarkeit zu beweisen, wird die Kaution konfisziert. +Andere Validiums verlangen von Teilnehmern, die mit der Speicherung von Offline-Daten beauftragt sind, Token in einem Smart Contract zu staken (d. h. zu sperren), bevor sie ihre Rollen übernehmen. Dieser Einsatz dient als „Kaution“ (Bond), um ehrliches Verhalten unter den Datenverfügbarkeitsmanagern zu garantieren und Vertrauensannahmen zu reduzieren. Wenn diese Teilnehmer die Datenverfügbarkeit nicht nachweisen können, wird die Kaution durch Slashing bestraft. -Bei einem Bonded-Data-Availability-System kann grundsätzlich jeder Off-Chain-Daten speichern, sobald er den nötigen Einsatz (Stake) hinterlegt hat. Dies erweitert den Pool der möglichen Datenverfügbarkeitsmanager und reduziert die Zentralisierung, die Data Availability Committees (DACs) beeinflusst. Noch wichtiger ist, dass dieser Ansatz auf kryptowirtschaftliche Anreize setzt, um bösartiges Verhalten zu verhindern, was erheblich sicherer ist, als vertrauenswürdige Parteien damit zu beauftragen, Offline-Daten im Validium zu sichern. +In einem System mit gebundener Datenverfügbarkeit kann jeder beauftragt werden, Off-Chain-Daten zu halten, sobald er den erforderlichen Einsatz erbringt. Dies erweitert den Pool berechtigter Datenverfügbarkeitsmanager und reduziert die Zentralisierung, die Datenverfügbarkeitskomitees (DACs) betrifft. Noch wichtiger ist, dass dieser Ansatz auf kryptografisch-ökonomischen Anreizen beruht, um böswillige Aktivitäten zu verhindern, was wesentlich sicherer ist, als vertrauenswürdige Parteien zur Sicherung von Offline-Daten im Validium zu ernennen. -[Mehr über gebundene Datenverfügbarkeit in Validiums](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf). +[Mehr zu gebundener Datenverfügbarkeit in Validiums](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf). ## Volitions und Validium {#volitions-and-validium} -Validiums bieten viele Vorteile, aber sie gehen mit Kompromissen einher (vor allem in Bezug auf die Datenverfügbarkeit). Aber wie bei vielen Skalierungslösungen sind Validiums für spezifische Anwendungsfälle geeignet – was der Grund dafür ist, warum Volitions entwickelt wurden. +Validiums bieten viele Vorteile, bringen aber auch Kompromisse mit sich (insbesondere bei der Datenverfügbarkeit). Aber wie bei vielen Skalierungslösungen eignen sich Validiums für spezifische Anwendungsfälle – weshalb Volitions geschaffen wurden. -Volitions kombinieren eine ZK-Rollup- und eine Validium-Kette und ermöglichen es Nutzern, zwischen den beiden Skalierungslösungen zu wechseln. Mit Volitions kannst du für bestimmte Transaktionen die Off-Chain-Datenverfügbarkeit von Validium nutzen, hast aber trotzdem die Freiheit, bei Bedarf auf eine On-Chain-Datenverfügbarkeitslösung (ZK-Rollup) umzusteigen. Dies gibt den Nutzern im Wesentlichen die Freiheit, je nach ihren individuellen Bedürfnissen und Umständen abzuwägen und die für sie passenden Kompromisse zu wählen. +Volitions kombinieren ein ZK-Rollup und eine Validium-Chain und ermöglichen es Nutzern, zwischen den beiden Skalierungslösungen zu wechseln. Mit Volitions können Nutzer die Off-Chain-Datenverfügbarkeit von Validium für bestimmte Transaktionen nutzen, während sie die Freiheit behalten, bei Bedarf zu einer Lösung mit Datenverfügbarkeit auf der Blockchain (ZK-Rollup) zu wechseln. Dies gibt den Nutzern im Wesentlichen die Freiheit, Kompromisse entsprechend ihren individuellen Umständen zu wählen. -Eine dezentrale Börse (DEX) könnte die skalierbare und private Infrastruktur eines Validiums für hochvolumige oder hochwertige Transaktionen bevorzugen. Gleichzeitig könnte sie ein ZK-Rollup für Nutzer verwenden, die die höheren Sicherheitsgarantien und die Vertrauenslosigkeit eines ZK-Rollups bevorzugen. +Eine dezentralisierte Börse (DEX) zieht es möglicherweise vor, die skalierbare und private Infrastruktur eines Validiums für hochwertige Trades zu nutzen. Sie kann auch ein ZK-Rollup für Nutzer verwenden, die die höheren Sicherheitsgarantien und die Vertrauenslosigkeit eines ZK-Rollups wünschen. ## Validiums und EVM-Kompatibilität {#validiums-and-evm-compatibility} -Ähnlich wie ZK-Rollups eignen sich Validiums hauptsächlich für einfache Anwendungen, wie zum Beispiel Token-Swaps und Zahlungen. Die Unterstützung allgemeiner Berechnungen und der Ausführung von Smart Contracts bei Validiums ist schwierig umzusetzen, da der Nachweis von [EVM](/developers/docs/evm/)-Anweisungen in einem Zero-Knowledge-Proof-Schaltkreis einen erheblichen Aufwand bedeutet. +Wie ZK-Rollups eignen sich Validiums meist für einfache Anwendungen wie Token-Swaps und Zahlungen. Die Unterstützung allgemeiner Berechnungen und der Ausführung von Smart Contracts in Validiums ist schwer zu implementieren, angesichts des erheblichen Aufwands, [EVM](/developers/docs/evm/)-Anweisungen in einer Zero-Knowledge-Beweisschaltung nachzuweisen. -Einige Validium-Projekte versuchen, dieses Problem zu umgehen, indem sie EVM-kompatible Sprachen (z. B. Solidity, Vyper) in benutzerdefinierten Bytecode kompilieren, der für effiziente Nachweise optimiert ist. Ein Nachteil dieses Ansatzes ist, dass neue Zero-Knowledge-Proof-fähige virtuelle Maschinen (VMs) möglicherweise nicht alle wichtigen EVM-Opcodes unterstützen, und Entwickler müssen direkt in der Hochsprache programmieren, um eine optimale Erfahrung zu gewährleisten. Dies führt zu weiteren Problemen: Es zwingt Entwickler dazu, dApps mit einem völlig neuen Entwicklungstack zu erstellen, und bricht die Kompatibilität mit der bestehenden Ethereum-Infrastruktur. +Einige Validium-Projekte versuchen, dieses Problem zu umgehen, indem sie EVM-kompatible Sprachen (z. B. Solidity, Vyper) kompilieren, um benutzerdefinierten Bytecode zu erstellen, der für effizientes Beweisen optimiert ist. Ein Nachteil dieses Ansatzes ist, dass neue Zero-Knowledge-Beweis-freundliche VMs möglicherweise wichtige EVM-Opcodes nicht unterstützen und Entwickler für ein optimales Erlebnis direkt in der Hochsprache schreiben müssen. Dies schafft noch mehr Probleme: Es zwingt Entwickler, Dapps mit einem völlig neuen Entwicklungs-Stack zu erstellen, und bricht die Kompatibilität mit der aktuellen Ethereum-Infrastruktur. -Einige Teams versuchen jedoch, bestehende EVM-Opcodes für ZK-Proof-Schaltkreise zu optimieren. Dies wird zur Entwicklung einer Zero-Knowledge Ethereum Virtual Machine (zkEVM) führen, einer EVM-kompatiblen virtuellen Maschine, die Nachweise erzeugt, um die Korrektheit der Programmausführung zu überprüfen. Mit einem zkEVM können Validium-Chains Smart Contracts Off-Chain ausführen und Gültigkeitsnachweise einreichen, um eine Off-Chain-Berechnung auf Ethereum zu verifizieren (ohne sie erneut ausführen zu müssen). +Einige Teams versuchen jedoch, bestehende EVM-Opcodes für ZK-Beweisschaltungen zu optimieren. Dies wird zur Entwicklung einer Zero-Knowledge Ethereum Virtual Machine (zkEVM) führen, einer EVM-kompatiblen VM, die Beweise erzeugt, um die Korrektheit der Programmausführung zu verifizieren. Mit einer zkEVM können Validium-Chains Smart Contracts Off-Chain ausführen und Validitätsnachweise einreichen, um eine Off-Chain-Berechnung (ohne sie erneut ausführen zu müssen) auf Ethereum zu verifizieren. -[Mehr über zkEVMs](https://www.alchemy.com/overviews/zkevm). +[Mehr zu zkEVMs](https://www.alchemy.com/overviews/zkevm). -## Wie skalieren Validiums Ethereum? Skalierung von Ethereum mit Validiums {#scaling-ethereum-with-validiums} +## Wie skalieren Validiums Ethereum? {#scaling-ethereum-with-validiums} ### 1. Off-Chain-Datenspeicherung {#offchain-data-storage} -Layer-2-Skalierungsprojekte wie Optimistic Rollups und ZK-Rollups tauschen die unendliche Skalierbarkeit von reinen Off-Chain-Skalierungsprotokollen (z. B. [Plasma](/developers/docs/scaling/plasma/)) gegen Sicherheit ein, indem sie einige Transaktionsdaten auf L1 veröffentlichen. Das bedeutet jedoch, dass die Skalierbarkeitseigenschaften von Rollups durch die Datenbandbreite auf dem Ethereum Mainnet begrenzt sind ([Data-Sharding](/roadmap/danksharding/) schlägt aus diesem Grund eine Verbesserung der Datenspeicherkapazität von Ethereum vor). +Skalierungsprojekte der Ebene 2, wie Optimistic Rollups und ZK-Rollups, tauschen die unendliche Skalierbarkeit reiner Off-Chain-Skalierungsprotokolle (z. B. [Plasma](/developers/docs/scaling/plasma/)) gegen Sicherheit ein, indem sie einige Transaktionsdaten auf L1 veröffentlichen. Dies bedeutet jedoch, dass die Skalierbarkeitseigenschaften von Rollups durch die Datenbandbreite im Ethereum-Mainnet begrenzt sind (aus diesem Grund schlägt [Data Sharding](/roadmap/danksharding/) vor, die Datenspeicherkapazität von Ethereum zu verbessern). -Validiums erreichen Skalierbarkeit, indem sie alle Transaktionsdaten Off-Chain halten und nur Zustandsverpflichtungen (sowie Gültigkeitsbeweise) veröffentlichen, wenn sie Statusaktualisierungen an die Hauptkette von Ethereum übermitteln. Die Existenz von Gültigkeitsnachweisen verleiht Validiums jedoch höhere Sicherheitsgarantien als andere reine Off-Chain-Skalierungslösungen, einschließlich Plasma und [Sidechains](/developers/docs/scaling/sidechains/). Durch die Reduzierung der Datenmenge, die Ethereum verarbeiten muss, bevor Offchain-Transaktionen validiert werden, erweitern Validium-Designs den Durchsatz im Mainnet erheblich. +Validiums erreichen Skalierbarkeit, indem sie alle Transaktionsdaten Off-Chain halten und nur Zustandsverpflichtungen (und Validitätsnachweise) posten, wenn sie Zustandsaktualisierungen an die Ethereum-Hauptchain weiterleiten. Die Existenz von Validitätsnachweisen verleiht Validiums jedoch höhere Sicherheitsgarantien als anderen reinen Off-Chain-Skalierungslösungen, einschließlich Plasma und [Sidechains](/developers/docs/scaling/sidechains/). Indem sie die Datenmenge reduzieren, die Ethereum verarbeiten muss, bevor Off-Chain-Transaktionen validiert werden, erweitern Validium-Designs den Durchsatz im Mainnet erheblich. -### 2. Rekursive Proofs {#recursive-proofs} +### 2. Rekursive Beweise {#recursive-proofs} -Ein rekursiver Beweis ist ein Gültigkeitsnachweis, der die Gültigkeit anderer Beweise überprüft. Diese „Beweise von Beweisen“ werden erzeugt, indem mehrere Beweise rekursiv aggregiert werden, bis ein finaler Beweis entsteht, der alle vorherigen Beweise verifiziert. Rekursive Beweise skalieren die Verarbeitungsgeschwindigkeit von Blockchains, indem sie die Anzahl der Transaktionen erhöhen, die pro Gültigkeitsnachweis verifiziert werden können. +Ein rekursiver Beweis ist ein Validitätsnachweis, der die Gültigkeit anderer Beweise verifiziert. Diese „Beweise von Beweisen“ werden generiert, indem mehrere Beweise rekursiv aggregiert werden, bis ein finaler Beweis erstellt ist, der alle vorherigen Beweise verifiziert. Rekursive Beweise skalieren die Verarbeitungsgeschwindigkeiten der Blockchain, indem sie die Anzahl der Transaktionen erhöhen, die pro Validitätsnachweis verifiziert werden können. -In der Regel bestätigt jeder Gültigkeitsnachweis, den der Validium-Betreiber zur Überprüfung an Ethereum sendet, die Integrität eines einzelnen Blocks. Wohingegen ein einzelner rekursiver Beweis verwendet werden kann, um die Gültigkeit mehrerer Validium-Blöcke gleichzeitig zu bestätigen – dies ist möglich, da die Schaltung zur Beweiserstellung mehrere Blockbeweise rekursiv in einen finalen Beweis aggregieren kann. Wenn der On-Chain-Verifizierer-Vertrag den rekursiven Beweis akzeptiert, werden alle zugrunde liegenden Blöcke sofort finalisiert. +Typischerweise validiert jeder Validitätsnachweis, den der Validium-Betreiber zur Verifizierung an Ethereum übermittelt, die Integrität eines einzelnen Blocks. Wohingegen ein einzelner rekursiver Beweis verwendet werden kann, um die Gültigkeit mehrerer Validium-Blöcke gleichzeitig zu bestätigen – dies ist möglich, da die Beweisschaltung mehrere Blockbeweise rekursiv zu einem finalen Beweis aggregieren kann. Wenn der Verifizierungsvertrag auf der Blockchain den rekursiven Beweis akzeptiert, werden alle zugrunde liegenden Blöcke sofort finalisiert. ## Vor- und Nachteile von Validium {#pros-and-cons-of-validium} -| Pro | Nachteile | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Gültigkeitsbeweise gewährleisten die Integrität von Off-Chain-Transaktionen und verhindern, dass Betreiber ungültige Statusaktualisierungen finalisieren. | Die Erstellung von Gültigkeitsnachweisen erfordert spezielle Hardware, was ein Zentralisierungsrisiko darstellt. | -| Erhöht die Kapitaleffizienz für Benutzer (keine Verzögerungen beim Zurückziehen von Geldern nach Ethereum) | Eingeschränkte Unterstützung für allgemeine Berechnungen/Smart Contracts; spezialisierte Sprachen sind für die Entwicklung erforderlich. | -| Nicht anfällig für bestimmte wirtschaftliche Angriffe, wie Betrugsnachweis-basierte Systeme in hochwertigen Anwendungen. | Hohe Rechenleistung erforderlich, um ZK-Nachweise zu generieren; nicht kosteneffektiv für Anwendungen mit geringer Durchsatzrate. | -| Reduziert die Gasgebühren für Benutzer, indem keine Calldaten auf dem Ethereum-Mainnet veröffentlicht werden. | Langsamere subjektive Finalitätszeit (10-30 Minuten, um einen ZK-Nachweis zu generieren), aber schneller bis zur vollständigen Finalität, da es keine Verzögerung durch Streitigkeiten gibt. | -| Geeignet für spezifische Anwendungsfälle wie Handel oder Blockchain-Gaming, bei denen die Transaktionsprivatsphäre und Skalierbarkeit priorisiert werden. | Nutzern kann die Auszahlung von Geldern verwehrt werden, da das Erzeugen von Merkle-Nachweisen des Eigentums jederzeit verfügbare Off-Chain-Daten erfordert. | -| Die Verfügbarkeit von Offchain-Daten ermöglicht höhere Durchsatzraten und steigert die Skalierbarkeit. | Das Sicherheitsmodell beruht auf Vertrauensannahmen und kryptoökonomischen Anreizen, im Gegensatz zu ZK-Rollups, die ausschließlich auf kryptografischen Sicherheitsmechanismen basieren. | +| Vorteile | Nachteile | +| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Validitätsnachweise erzwingen die Integrität von Off-Chain-Transaktionen und verhindern, dass Betreiber ungültige Zustandsaktualisierungen finalisieren. | Die Erstellung von Validitätsnachweisen erfordert spezielle Hardware, was ein Zentralisierungsrisiko darstellt. | +| Erhöht die Kapitaleffizienz für Nutzer (keine Verzögerungen bei der Auszahlung von Guthaben zurück zu Ethereum). | Eingeschränkte Unterstützung für allgemeine Berechnungen/Smart Contracts; spezialisierte Sprachen für die Entwicklung erforderlich. | +| Nicht anfällig für bestimmte wirtschaftliche Angriffe, denen auf Betrugsnachweisen basierende Systeme bei hochwertigen Anwendungen ausgesetzt sind. | Hohe Rechenleistung zur Generierung von ZK-Beweisen erforderlich; nicht kosteneffizient für Anwendungen mit geringem Durchsatz. | +| Reduziert Gasgebühren für Nutzer, da keine Calldata im Ethereum-Mainnet gepostet werden. | Langsamere subjektive Finalitätszeit (10-30 Min. zur Generierung eines ZK-Beweises), aber schnellere vollständige Finalität, da es keine Verzögerung durch Streitbeilegungszeiten gibt. | +| Geeignet für spezifische Anwendungsfälle wie Trading oder Blockchain-Gaming, die Transaktionsdatenschutz und Skalierbarkeit priorisieren. | Nutzer können daran gehindert werden, Guthaben abzuheben, da die Generierung von Merkle-Eigentumsbeweisen erfordert, dass Off-Chain-Daten jederzeit verfügbar sind. | +| Off-Chain-Datenverfügbarkeit bietet ein höheres Maß an Durchsatz und erhöht die Skalierbarkeit. | Das Sicherheitsmodell beruht auf Vertrauensannahmen und kryptografisch-ökonomischen Anreizen, im Gegensatz zu ZK-Rollups, die sich rein auf kryptografische Sicherheitsmechanismen verlassen. | -### Validium/Volitions verwenden {#use-validium-and-volitions} +### Validium/Volitions nutzen {#use-validium-and-volitions} -Mehrere Projekte bieten Implementierungen von Validium und Volitions an, die Sie in Ihre Dapps integrieren können: +Mehrere Projekte bieten Implementierungen von Validium und Volitions, die Sie in Ihre Dapps integrieren können: -**StarkWare StarkEx** – _StarkEx ist eine Ethereum Layer 2 (L2) Skalierungslösung, die auf Gültigkeitsnachweisen basiert. Es kann entweder im ZK-Rollup oder im Validium Datenverfügbarkeitsmodus betrieben werden._ +**StarkWare StarkEx** - _StarkEx ist eine Skalierbarkeitslösung für Ethereum Ebene 2 (L2), die auf Validitätsnachweisen basiert. Sie kann entweder im ZK-Rollup- oder im Validium-Datenverfügbarkeitsmodus betrieben werden._ - [Dokumentation](https://docs.starkware.co/starkex-v4/starkex-deep-dive/data-availability-modes#validium) - [Website](https://starkware.co/starkex/) -**Matter Labs zkPorter** – _zkPorter ist ein Layer-2-Skalierungsprotokoll, das die Datenverfügbarkeit mit einem hybriden Ansatz angeht, der die Ideen von zkRollup und Sharding kombiniert. Es kann beliebig viele Shards unterstützen, jeder mit seiner eigenen Datenverfügbarkeitsrichtlinie._ +**Matter Labs zkPorter** - _zkPorter ist ein Skalierungsprotokoll der Ebene 2, das die Datenverfügbarkeit mit einem hybriden Ansatz angeht, der die Ideen von zkRollup und Sharding kombiniert. Es kann beliebig viele Shards unterstützen, von denen jeder seine eigene Datenverfügbarkeitsrichtlinie hat._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) - [Dokumentation](https://docs.zksync.io/zksync-protocol/rollup/data-availability) - [Website](https://zksync.io/) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Validium And The Layer 2 Two-By-Two – Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) +- [Validium And The Layer 2 Two-By-Two — Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [ZK-rollups vs Validium](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) - [Volition and the Emerging Data Availability spectrum](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb) -- [Rollups, Validiums, and Volitions: Learn About the Hottest Ethereum Scaling Solutions](https://medium.com/coinmonks/rollups-vs-validiums-vs-volitions-d76300170f4a) -- [Der praktische Leitfaden für Ethereum-Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [The Practical Guide to Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md index 97b0f20feaf..18e277c581a 100644 --- a/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md @@ -1,257 +1,264 @@ --- -title: Zero-Knowledge Gruppierungen (Rollups) -description: "Eine Einführung in Zero-Knowledge-Rollups – eine Skalierungslösung, die von der Ethereum-Community verwendet wird." +title: Zero-Knowledge Rollups +description: "Eine Einführung in Zero-Knowledge Rollups – eine Skalierungslösung, die von der Ethereum-Community verwendet wird." lang: de --- -Zero-Knowledge-Rollups (ZK-Rollups) sind Layer-2-[Skalierungslösungen](/developers/docs/scaling/), die den Durchsatz auf dem Ethereum Mainnet erhöhen, indem sie Berechnungen und die Zustandsspeicherung offchain verlagern. ZK-Rollups können Tausende von Transaktionen in einem Stapel verarbeiten und dann nur minimale Zusammenfassungsdaten an das Mainnet senden. Diese zusammenfassenden Daten definieren die Änderungen, die am Status von Ethereum vorgenommen werden sollten, sowie einige kryptografische Nachweise dafür, dass diese Änderungen korrekt sind. +Zero-Knowledge Rollups (ZK-Rollups) sind [Skalierungslösungen](/developers/docs/scaling/) der Ebene 2, die den Durchsatz im [Ethereum](/)-Mainnet erhöhen, indem sie Berechnungen und Zustandsspeicherung Off-Chain verlagern. ZK-Rollups können Tausende von Transaktionen in einem Batch verarbeiten und dann nur minimale Zusammenfassungsdaten im Mainnet veröffentlichen. Diese Zusammenfassungsdaten definieren die Änderungen, die am Ethereum-Zustand vorgenommen werden sollen, sowie einen kryptografischen Nachweis, dass diese Änderungen korrekt sind. ## Voraussetzungen {#prerequisites} -Sie sollten unsere Seite über die [Ethereum-Skalierung](/developers/docs/scaling/) und [Layer 2](/layer-2) gelesen und verstanden haben. +Sie sollten unsere Seiten zu [Ethereum-Skalierung](/developers/docs/scaling/) und [Ebene 2](/layer-2) gelesen und verstanden haben. -## Was sind Zero-Knowledge-Rollups? {#what-are-zk-rollups} +## Was sind Zero-Knowledge Rollups? {#what-are-zk-rollups} -**Zero-Knowledge-Rollups (ZK-Rollups)** bündeln (oder ‚rollen auf‘) Transaktionen zu Stapeln, die offchain ausgeführt werden. Indem Berechnungen Off-Chain stattfinden, muss eine geringere Datenmenge auf der Blockchain veröffentlicht werden. ZK-Rollout-Betreiber übermitteln eine Zusammenfassung der erforderlichen Änderungen, um alle Transaktionen in einem Stapel darzustellen, anstatt jede Transaktion einzeln zu senden. Sie erzeugen auch [Gültigkeitsnachweise](/glossary/#validity-proof), um die Korrektheit ihrer Änderungen zu beweisen. +**Zero-Knowledge Rollups (ZK-Rollups)** bündeln (oder „rollen“) Transaktionen in Batches, die Off-Chain ausgeführt werden. Die Off-Chain-Berechnung reduziert die Datenmenge, die auf der Blockchain veröffentlicht werden muss. Betreiber von ZK-Rollups übermitteln eine Zusammenfassung der Änderungen, die erforderlich sind, um alle Transaktionen in einem Batch darzustellen, anstatt jede Transaktion einzeln zu senden. Sie erstellen auch [Validitätsnachweise](/glossary/#validity-proof), um die Richtigkeit ihrer Änderungen zu beweisen. -Der Zustand eines ZK-Rollups wird durch einen Smart Contract verwaltet, der auf dem Ethereum-Netzwerk bereitgestellt wird. ZK-Rollup-Nodes müssen einen Gültigkeitsnachweis zur Überprüfung vorlegen, um diesen Zustand zu aktualisieren. Der Gültigkeitsnachweis dient, wie bereits erklärt, als kryptografischer Beleg dafür, dass die vom Rollup vorgeschlagene Zustandsänderung aus der Ausführung des jeweiligen Transaktions-Batches resultiert. Das bedeutet, dass ZK-Rollups nur Gültigkeitsnachweise erbringen müssen, um Transaktionen auf Ethereum abzuschließen, anstatt alle Transaktionsdaten onchain zu posten wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/). +Der Zustand des ZK-Rollups wird durch einen Smart Contract aufrechterhalten, der im Ethereum-Netzwerk bereitgestellt wird. Um diesen Zustand zu aktualisieren, müssen ZK-Rollup-Blockchain-Knoten einen Validitätsnachweis zur Überprüfung einreichen. Wie bereits erwähnt, ist der Validitätsnachweis eine kryptografische Zusicherung, dass die vom Rollup vorgeschlagene Zustandsänderung tatsächlich das Ergebnis der Ausführung des jeweiligen Transaktions-Batches ist. Das bedeutet, dass ZK-Rollups nur Validitätsnachweise erbringen müssen, um Transaktionen auf Ethereum abzuschließen, anstatt alle Transaktionsdaten auf der Blockchain zu veröffentlichen, wie es bei [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/) der Fall ist. -Der Transfer von Geldern von einem ZK-Rollup zu Ethereum erfolgt ohne Verzögerung, weil der ZK-Rollup-Contract die Exit-Transaktionen sofort nach der Verifizierung des Gültigkeitsnachweises ausführt. Umgekehrt unterliegt die Auszahlung von Geldern aus Optimistic Rollups einer Verzögerung, damit jeder die Austrittstransaktion mit einem [Betrugsbeweis](/glossary/#fraud-proof) anfechten kann. +Es gibt keine Verzögerungen beim Verschieben von Geldern von einem ZK-Rollup zu Ethereum, da Exit-Transaktionen ausgeführt werden, sobald der ZK-Rollup-Vertrag den Validitätsnachweis verifiziert. Im Gegensatz dazu unterliegt das Abheben von Geldern aus Optimistic Rollups einer Verzögerung, damit jeder die Exit-Transaktion mit einem [Betrugsnachweis](/glossary/#fraud-proof) anfechten kann. -ZK-Rollups schreiben Transaktionen als `calldata` auf Ethereum. `calldata` ist der Speicherort für Daten, die in externen Aufrufen an Smart-Contract-Funktionen enthalten sind. Informationen in `calldata` werden auf der Blockchain veröffentlicht, sodass jeder den Zustand des Rollups unabhängig rekonstruieren kann. ZK-Rollups verwenden Komprimierungsverfahren, um die Datenmenge von Transaktionen zu verringern. Beispielsweise werden Accounts nicht durch eine Adresse, sondern durch einen Index repräsentiert, wodurch 28 Bytes an Daten gespart werden. Für Rollups ist die On-Chain-Datenveröffentlichung ein wesentlicher Kostenfaktor; durch Datenkompression lassen sich daher die Gebühren für Nutzer reduzieren. +ZK-Rollups schreiben Transaktionen als `calldata` auf Ethereum. In `calldata` werden Daten gespeichert, die in externen Aufrufen von Smart-Contract-Funktionen enthalten sind. Informationen in `calldata` werden auf der Blockchain veröffentlicht, sodass jeder den Zustand des Rollups unabhängig rekonstruieren kann. ZK-Rollups verwenden Komprimierungstechniken, um Transaktionsdaten zu reduzieren – zum Beispiel werden Konten durch einen Index anstelle einer Adresse dargestellt, was 28 Bytes an Daten spart. Die Veröffentlichung von Daten auf der Blockchain ist ein erheblicher Kostenfaktor für Rollups, sodass die Datenkomprimierung die Gebühren für Benutzer senken kann. -## Wie funktioniert das Zusammenspiel von ZK-Rollups und Ethereum? ZK-Rollups und Ethereum {#zk-rollups-and-ethereum} +## Wie interagieren ZK-Rollups mit Ethereum? {#zk-rollups-and-ethereum} -Eine ZK-Rollup-Chain ist ein Off-Chain-Protokoll, das auf der Ethereum-Blockchain aufbaut und dessen Verwaltung durch On-Chain-Smart-Contracts auf Ethereum erfolgt. ZK-Rollups führen Transaktionen zwar außerhalb des Mainnets aus, schreiben jedoch periodisch Off-Chain-Transaktions-Batches in einen On-Chain-Rollup-Contract. Genau wie die Ethereum-Blockchain ist dieser Transaktionsdatensatz unveränderlich und bildet somit die ZK-Rollup-Chain. +Eine ZK-Rollup-Chain ist ein Off-Chain-Protokoll, das auf der Ethereum-Blockchain aufbaut und von Ethereum-Smart-Contracts auf der Blockchain verwaltet wird. ZK-Rollups führen Transaktionen außerhalb des Mainnets aus, übermitteln aber regelmäßig Off-Chain-Transaktions-Batches an einen Rollup-Vertrag auf der Blockchain. Dieser Transaktionsdatensatz ist unveränderlich, ähnlich wie die Ethereum-Blockchain, und bildet die ZK-Rollup-Chain. -Die folgenden Komponenten bilden die Kernarchitektur eines ZK-Rollups: +Die Kernarchitektur des ZK-Rollups besteht aus den folgenden Komponenten: -1. **On-Chain-Verträge**: Wie bereits erwähnt, wird das ZK-Rollup-Protokoll durch Smart Contracts kontrolliert, die auf Ethereum ausgeführt werden. Dies umfasst den Hauptvertrag, welches Rollup-Blöcke speichert, Einlagen nachverfolgt und Zustandsaktualisierungen überwacht. Éin weiterer On-Chain-Contract, der Verifier-Contract, ist für die Verifizierung der von Block Herstellern eingereichten Zero-Knowledge-Proofs zuständig. Daher fungiert Ethereum als Base Layer oder "Layer 1" für den ZK-Rollup. +1. **Verträge auf der Blockchain**: Wie bereits erwähnt, wird das ZK-Rollup-Protokoll durch Smart Contracts gesteuert, die auf Ethereum laufen. Dazu gehört der Hauptvertrag, der Rollup-Blöcke speichert, Einzahlungen verfolgt und Zustandsaktualisierungen überwacht. Ein weiterer Vertrag auf der Blockchain (der Verifizierer-Vertrag) verifiziert Zero-Knowledge-Nachweise, die von Blockproduzenten eingereicht werden. Somit dient Ethereum als Basisschicht oder „Ebene 1“ für das ZK-Rollup. -2. **Offchain Virtual Machine (VM)**: Während das ZK-Rollup-Protokoll auf Ethereum läuft, finden die Transaktionsausführung und die Zustandsspeicherung auf einer separaten virtuellen Maschine statt, die unabhängig von der [EVM](/developers/docs/evm/) ist. Diese Off-Chain-VM bildet die Ausführungsumgebung für Transaktionen auf dem ZK-Rollup und fungiert gleichzeitig als sekundäre Schicht bzw. "Layer 2" des ZK-Rollup-Protokolls. Auf dem Ethereum Mainnet verifizierte Gültigkeitsnachweise garantieren die Korrektheit der Zustandsübergänge in der Off-Chain-VM. +2. **Off-Chain Virtual Machine (VM)**: Während das ZK-Rollup-Protokoll auf Ethereum existiert, erfolgen die Transaktionsausführung und die Zustandsspeicherung auf einer separaten virtuellen Maschine, die unabhängig von der [EVM](/developers/docs/evm/) ist. Diese Off-Chain-VM ist die Ausführungsumgebung für Transaktionen auf dem ZK-Rollup und dient als sekundäre Schicht oder „Ebene 2“ für das ZK-Rollup-Protokoll. Validitätsnachweise, die im Ethereum-Mainnet verifiziert werden, garantieren die Richtigkeit von Zustandsübergängen in der Off-Chain-VM. -ZK-Rollups sind "hybride Skalierungslösungen" - Protokolle, die zwar unabhängig und Off-Chain arbeiten, ihre Sicherheit aber von Ethereum beziehen. Konkret stellt das Ethereum-Netzwerk die Gültigkeit der State-Updates des ZK-Rollups sicher und gewährleistet die Datenverfügbarkeit für jede Aktualisierung des Rollup-States. Daher sind ZK-Rollups erheblich sicherer als reine Offchain-Skalierungslösungen wie [Sidechains](/developers/docs/scaling/sidechains/), die für ihre eigenen Sicherheitseigenschaften verantwortlich sind, oder [Validiums](/developers/docs/scaling/validium/), die Transaktionen auf Ethereum ebenfalls mit Gültigkeitsnachweisen verifizieren, aber die Transaktionsdaten an anderer Stelle speichern. +ZK-Rollups sind „hybride Skalierungslösungen“ – Off-Chain-Protokolle, die unabhängig arbeiten, aber ihre Sicherheit von Ethereum ableiten. Insbesondere erzwingt das Ethereum-Netzwerk die Gültigkeit von Zustandsaktualisierungen auf dem ZK-Rollup und garantiert die Datenverfügbarkeit hinter jeder Aktualisierung des Rollup-Zustands. Infolgedessen sind ZK-Rollups wesentlich sicherer als reine Off-Chain-Skalierungslösungen wie [Sidechains](/developers/docs/scaling/sidechains/), die für ihre eigenen Sicherheitseigenschaften verantwortlich sind, oder [Validiums](/developers/docs/scaling/validium/), die Transaktionen ebenfalls auf Ethereum mit Validitätsnachweisen verifizieren, aber Transaktionsdaten an anderer Stelle speichern. -ZK-Rollups stützen sich für die folgenden Punkte auf das Ethereum-Hauptprotokoll: +ZK-Rollups verlassen sich für Folgendes auf das Ethereum-Hauptprotokoll: ### Datenverfügbarkeit {#data-availability} -ZK-Rollups veröffentlichen Statusdaten für jede außerhalb der Kette verarbeitete Transaktion an Ethereum. Mit diesen Daten ist es Einzelpersonen oder Unternehmen möglich, den Status des Rollups zu reproduzieren und die Kette selbst zu validieren. Ethereum stellt diese Daten allen Netzwerkteilnehmern als `calldata` zur Verfügung. +ZK-Rollups veröffentlichen Zustandsdaten für jede Off-Chain verarbeitete Transaktion auf Ethereum. Mit diesen Daten ist es für Einzelpersonen oder Unternehmen möglich, den Zustand des Rollups zu reproduzieren und die Chain selbst zu validieren. Ethereum stellt diese Daten allen Teilnehmern des Netzwerks als `calldata` zur Verfügung. -ZK-Rollups müssen nicht viele Transaktionsdaten in der Kette veröffentlichen, da Gültigkeitsnachweise bereits die Authentizität von Zustandsübergängen überprüfen. Dennoch ist die Speicherung von Daten in der Kette weiterhin wichtig, da sie eine erlaubnislos unabhängige Überprüfung des Zustands der L2-Kette ermöglicht, die es wiederum jedem ermöglicht, Stapel von Transaktionen einzureichen und so böswillige Betreiber daran zu hindern, die Kette zu zensieren oder einzufrieren. +ZK-Rollups müssen nicht viele Transaktionsdaten auf der Blockchain veröffentlichen, da Validitätsnachweise bereits die Authentizität von Zustandsübergängen verifizieren. Dennoch ist die Speicherung von Daten auf der Blockchain weiterhin wichtig, da sie eine erlaubnisfreie, unabhängige Verifizierung des Zustands der L2-Chain ermöglicht, was wiederum jedem erlaubt, Transaktions-Batches einzureichen, und verhindert, dass böswillige Betreiber die Chain zensieren oder einfrieren. -Damit Benutzer mit dem Rollup interagieren können, ist onchain erforderlich. Ohne Zugriff auf staatliche Daten können Benutzer weder ihren Kontostand abfragen noch Transaktionen (z. B. Abhebungen) einleiten, die auf staatlichen Informationen beruhen. +Daten auf der Blockchain sind erforderlich, damit Benutzer mit dem Rollup interagieren können. Ohne Zugriff auf Zustandsdaten können Benutzer ihren Kontostand nicht abfragen oder Transaktionen (z. B. Abhebungen) initiieren, die auf Zustandsinformationen angewiesen sind. ### Transaktionsfinalität {#transaction-finality} -Ethereum fungiert als Abwicklungsebene für ZK-Rollups: L2-Transaktionen werden nur abgeschlossen, wenn der L1-Vertrag den Gültigkeitsnachweis akzeptiert. Dadurch wird das Risiko eliminiert, dass böswillige Betreiber die Kette manipulieren (z. B. Rollup Gelder stehlen), da jede Transaktion im Mainnet genehmigt werden muss. Darüber hinaus garantiert Ethereum, dass Benutzervorgänge nach Abschluss auf L1 nicht mehr rückgängig gemacht werden können. +Ethereum fungiert als Abwicklungsschicht für ZK-Rollups: L2-Transaktionen erreichen nur dann Finalität, wenn der L1-Vertrag den Validitätsnachweis akzeptiert. Dies eliminiert das Risiko, dass böswillige Betreiber die Chain korrumpieren (z. B. Rollup-Gelder stehlen), da jede Transaktion im Mainnet genehmigt werden muss. Außerdem garantiert Ethereum, dass Benutzeroperationen nicht rückgängig gemacht werden können, sobald sie auf L1 finalisiert sind. ### Zensurresistenz {#censorship-resistance} -Die meisten ZK-Rollups verwenden einen „Superknoten“ (den Operator), um Transaktionen auszuführen, Stapel zu erstellen und Blöcke an L1 zu senden. Dies gewährleistet zwar die Effizienz, erhöht jedoch das Risiko der Zensur: Böswillige ZK-Rollup Betreiber können Benutzer zensieren, indem sie sich weigern, ihre Transaktionen in Stapel aufzunehmen. +Die meisten ZK-Rollups verwenden einen „Supernode“ (den Betreiber), um Transaktionen auszuführen, Batches zu produzieren und Blöcke an L1 zu übermitteln. Während dies Effizienz gewährleistet, erhöht es das Risiko von Zensur: Böswillige ZK-Rollup-Betreiber können Benutzer zensieren, indem sie sich weigern, deren Transaktionen in Batches aufzunehmen. -Als Sicherheitsmaßnahme ermöglichen ZK-Rollups den Benutzern, Transaktionen direkt an den Rollup Vertrag im Mainnet zu senden, wenn sie der Meinung sind, dass sie vom Betreiber zensiert werden. Dadurch können Benutzer einen Ausstieg aus dem ZK-Rollup zu Ethereum erzwingen, ohne auf die Erlaubnis des Betreibers angewiesen zu sein. +Als Sicherheitsmaßnahme erlauben ZK-Rollups Benutzern, Transaktionen direkt an den Rollup-Vertrag im Mainnet zu übermitteln, wenn sie glauben, vom Betreiber zensiert zu werden. Dies ermöglicht es Benutzern, einen Exit aus dem ZK-Rollup zu Ethereum zu erzwingen, ohne auf die Erlaubnis des Betreibers angewiesen zu sein. ## Wie funktionieren ZK-Rollups? {#how-do-zk-rollups-work} ### Transaktionen {#transactions} -Benutzer im ZK-Rollup signieren Transaktionen und übermitteln sie an L2-Operatoren zur Verarbeitung und Aufnahme in den nächsten Stapel. In einigen Fällen ist der Operator eine zentralisierte Einheit, ein sogenannter Sequenzer, der Transaktionen ausführt, sie in Stapeln zusammenfasst und an L1 übermittelt. Der Sequenzer in diesem System ist die einzige Entität, die L2-Blöcke erstellen und Rollup Transaktionen zum ZK-Rollup-Vertrag hinzufügen darf. +Benutzer im ZK-Rollup signieren Transaktionen und übermitteln sie an L2-Betreiber zur Verarbeitung und Aufnahme in den nächsten Batch. In einigen Fällen ist der Betreiber eine zentralisierte Entität, genannt Sequencer, der Transaktionen ausführt, sie zu Batches aggregiert und an L1 übermittelt. Der Sequencer in diesem System ist die einzige Entität, die L2-Blöcke produzieren und Rollup-Transaktionen zum ZK-Rollup-Vertrag hinzufügen darf. -Andere ZK-Rollups können die Betreiberrolle durch die Verwendung eines [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/)-Validatoren-Sets rotieren lassen. Potenzielle Betreiber zahlen Geld in den Rollup Vertrag ein, wobei die Höhe jedes Einsatzes die Chancen des Spielers beeinflusst, für die Produktion des nächsten Rollup Batches ausgewählt zu werden. Der Einsatz des Betreibers kann bei böswilligem Handeln drastisch reduziert werden, was ihn dazu anregt, gültige Blöcke zu veröffentlichen. +Andere ZK-Rollups können die Betreiberrolle rotieren, indem sie ein [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/)-Validator-Set verwenden. Potenzielle Betreiber hinterlegen Gelder im Rollup-Vertrag, wobei die Größe jedes Einsatzes die Chancen des Stakers beeinflusst, für die Produktion des nächsten Rollup-Batches ausgewählt zu werden. Der Einsatz des Betreibers kann durch Slashing bestraft werden, wenn er böswillig handelt, was einen Anreiz bietet, gültige Blöcke zu veröffentlichen. #### Wie ZK-Rollups Transaktionsdaten auf Ethereum veröffentlichen {#how-zk-rollups-publish-transaction-data-on-ethereum} -Wie bereits erklärt, werden Transaktionsdaten als `calldata` auf Ethereum veröffentlicht. `calldata` ist ein Datenbereich in einem Smart Contract, der dazu dient, Argumente an eine Funktion zu übergeben, und verhält sich ähnlich wie der [Speicher](/developers/docs/smart-contracts/anatomy/#memory). `calldata` wird zwar nicht als Teil des Zustands von Ethereum gespeichert, bleibt aber als Teil der [Verlaufsprotokolle](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) der Ethereum-Kette onchain bestehen. `calldata` beeinflusst den Zustand von Ethereum nicht, was es zu einer günstigen Möglichkeit macht, Daten onchain zu speichern. +Wie erklärt, werden Transaktionsdaten auf Ethereum als `calldata` veröffentlicht. `calldata` ist ein Datenbereich in einem Smart Contract, der verwendet wird, um Argumente an eine Funktion zu übergeben, und verhält sich ähnlich wie [memory](/developers/docs/smart-contracts/anatomy/#memory). Während `calldata` nicht als Teil des Ethereum-Zustands gespeichert wird, bleibt es auf der Blockchain als Teil der [Verlaufsprotokolle](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) der Ethereum-Chain bestehen. `calldata` beeinflusst den Zustand von Ethereum nicht, was es zu einer günstigen Möglichkeit macht, Daten auf der Blockchain zu speichern. -Das Schlüsselwort `calldata` identifiziert oft die Smart-Contract-Methode, die von einer Transaktion aufgerufen wird, und enthält Eingaben für die Methode in Form einer beliebigen Byte-Sequenz. ZK-Rollups verwenden `calldata`, um komprimierte Transaktionsdaten onchain zu veröffentlichen. Der Rollup-Betreiber fügt einfach einen neuen Batch hinzu, indem er die erforderliche Funktion im Rollup-Vertrag aufruft und die komprimierten Daten als Funktionsargumente übergibt. Dies trägt zur Kostensenkung für Benutzer bei, da ein großer Teil der Rollup Gebühren für die Speicherung von Transaktionsdaten in der Kette verwendet wird. +Das Schlüsselwort `calldata` identifiziert oft die Smart-Contract-Methode, die von einer Transaktion aufgerufen wird, und enthält Eingaben für die Methode in Form einer beliebigen Byte-Sequenz. ZK-Rollups verwenden `calldata`, um komprimierte Transaktionsdaten auf der Blockchain zu veröffentlichen; der Rollup-Betreiber fügt einfach einen neuen Batch hinzu, indem er die erforderliche Funktion im Rollup-Vertrag aufruft und die komprimierten Daten als Funktionsargumente übergibt. Dies hilft, die Kosten für Benutzer zu senken, da ein großer Teil der Rollup-Gebühren für die Speicherung von Transaktionsdaten auf der Blockchain anfällt. ### Zustands-Commitments {#state-commitments} -Der Zustand des ZK-Rollups, der L2-Konten und -Guthaben umfasst, wird als [Merkle-Baum](/whitepaper/#merkle-trees) dargestellt. Ein kryptografischer Hash der Wurzel des Merkle Baums (Merkle Wurzel) wird im Onchain Vertrag gespeichert, sodass das Rollup Protokoll Änderungen im Status des ZK-Rollups verfolgen kann. +Der Zustand des ZK-Rollups, der L2-Konten und -Salden umfasst, wird als [Merkle-Baum](/whitepaper/#merkle-trees) dargestellt. Ein kryptografischer Hash der Wurzel des Merkle-Baums (Merkle-Wurzel) wird im Vertrag auf der Blockchain gespeichert, sodass das Rollup-Protokoll Änderungen im Zustand des ZK-Rollups verfolgen kann. -Das Rollup wechselt nach der Ausführung eines neuen Satzes von Transaktionen in einen neuen Status. Der Betreiber, der den Zustandsübergang initiiert hat, muss eine neue Zustandswurzel berechnen und dem Onchain Vertrag unterwerfen. Wenn der mit dem Stapel verbundene Gültigkeitsnachweis durch den Prüfvertrag authentifiziert wird, wird die neue Merkle Wurzel zur kanonischen Statuswurzel des ZK-Rollups. +Das Rollup geht nach der Ausführung eines neuen Satzes von Transaktionen in einen neuen Zustand über. Der Betreiber, der den Zustandsübergang initiiert hat, muss eine neue Zustandswurzel berechnen und an den Vertrag auf der Blockchain übermitteln. Wenn der mit dem Batch verbundene Validitätsnachweis durch den Verifizierer-Vertrag authentifiziert wird, wird die neue Merkle-Wurzel zur kanonischen Zustandswurzel des ZK-Rollups. -Neben der Berechnung von Zustandswurzeln erstellt der ZK-Rollup Operator auch eine Batch-Wurzel – die Wurzel eines Merkle Baums, der alle Transaktionen in einem Batch umfasst. Wenn ein neuer Stapel übermittelt wird, speichert der Rollup Vertrag die Stapelwurzel, sodass Benutzer nachweisen können, dass eine Transaktion (z. B. eine Auszahlungsanforderung) im Stapel enthalten war. Benutzer müssen Transaktionsdetails, die Batch-Root und einen [Merkle-Beweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) vorlegen, der den Inklusionspfad zeigt. +Neben der Berechnung von Zustandswurzeln erstellt der ZK-Rollup-Betreiber auch eine Batch-Wurzel – die Wurzel eines Merkle-Baums, der alle Transaktionen in einem Batch umfasst. Wenn ein neuer Batch eingereicht wird, speichert der Rollup-Vertrag die Batch-Wurzel, sodass Benutzer beweisen können, dass eine Transaktion (z. B. eine Abhebungsanforderung) im Batch enthalten war. Benutzer müssen Transaktionsdetails, die Batch-Wurzel und einen [Merkle-Nachweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) bereitstellen, der den Aufnahmepfad zeigt. -### Gültigkeitsnachweise {#validity-proofs} +### Validitätsnachweise {#validity-proofs} -Die neue Statuswurzel, die der ZK-Rollup Operator an den L1-Vertrag übermittelt, ist das Ergebnis von Aktualisierungen des Rollup Status. Angenommen, Alice sendet 10 Token an Bob. Der Operator verringert einfach Alices Guthaben um 10 und erhöht Bobs Guthaben um 10. Angenommen, Alice sendet 10 Token an Bob. Der Operator verringert einfach Alices Guthaben um 10 und erhöht Bobs Guthaben um 10 +Die neue Zustandswurzel, die der ZK-Rollup-Betreiber an den L1-Vertrag übermittelt, ist das Ergebnis von Aktualisierungen des Rollup-Zustands. Angenommen, Alice sendet 10 Token an Bob, dann verringert der Betreiber einfach den Kontostand von Alice um 10 und erhöht den Kontostand von Bob um 10. Der Betreiber hasht dann die aktualisierten Kontodaten, baut den Merkle-Baum des Rollups neu auf und übermittelt die neue Merkle-Wurzel an den Vertrag auf der Blockchain. -Der Rollup Vertrag akzeptiert die vorgeschlagene Statusverpflichtung jedoch nicht automatisch, bis der Betreiber nachweist, dass die neue Merkle Wurzel aus korrekten Aktualisierungen des Rollup Status resultiert. Der ZK-Rollup Operator tut dies, indem er einen Gültigkeitsnachweis erstellt, eine prägnante kryptografische Verpflichtung, die die Richtigkeit der gebündelten Transaktionen bestätigt. +Aber der Rollup-Vertrag wird das vorgeschlagene Zustands-Commitment nicht automatisch akzeptieren, bis der Betreiber beweist, dass die neue Merkle-Wurzel aus korrekten Aktualisierungen des Rollup-Zustands resultiert. Der ZK-Rollup-Betreiber tut dies, indem er einen Validitätsnachweis erstellt, ein prägnantes kryptografisches Commitment, das die Richtigkeit der gebündelten Transaktionen verifiziert. -Gültigkeitsbeweise ermöglichen es Parteien, die Richtigkeit einer Aussage zu beweisen, ohne die Aussage selbst offenzulegen – daher werden sie auch als Zero-Knowledge-Beweise bezeichnet. ZK-Rollups verwenden Gültigkeitsnachweise, um die Richtigkeit von Offchain Statusübergängen zu bestätigen, ohne Transaktionen auf Ethereum erneut ausführen zu müssen. Diese Beweise können in Form eines [ZK-SNARK](https://arxiv.org/abs/2202.06877) (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) oder [ZK-STARK](https://eprint.iacr.org/2018/046) (Zero-Knowledge Scalable Transparent Argument of Knowledge) vorliegen. +Validitätsnachweise ermöglichen es Parteien, die Richtigkeit einer Aussage zu beweisen, ohne die Aussage selbst preiszugeben – daher werden sie auch Zero-Knowledge-Nachweise genannt. ZK-Rollups verwenden Validitätsnachweise, um die Richtigkeit von Off-Chain-Zustandsübergängen zu bestätigen, ohne Transaktionen auf Ethereum erneut ausführen zu müssen. Diese Nachweise können in Form eines [ZK-SNARK](https://arxiv.org/abs/2202.06877) (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) oder [ZK-STARK](https://eprint.iacr.org/2018/046) (Zero-Knowledge Scalable Transparent Argument of Knowledge) vorliegen. -Sowohl SNARKs als auch STARKs helfen dabei, die Integrität der Offchain Berechnung in ZK-Rollups zu bestätigen, obwohl jeder Beweistyp unterschiedliche Merkmale aufweist. +Sowohl SNARKs als auch STARKs helfen dabei, die Integrität der Off-Chain-Berechnung in ZK-Rollups zu bescheinigen, obwohl jeder Nachweistyp charakteristische Merkmale aufweist. **ZK-SNARKs** -Damit das ZK-SNARK-Protokoll funktioniert, ist die Erstellung eines Common Reference String (CRS) erforderlich: Der CRS stellt öffentliche Parameter zum Nachweis und zur Überprüfung von Gültigkeitsnachweisen bereit. Die Sicherheit des Nachweissystems hängt von der CRS-Einrichtung ab. Wenn Informationen, die zum Erstellen öffentlicher Parameter verwendet werden, in den Besitz böswilliger Akteure gelangen, können diese möglicherweise falsche Gültigkeitsnachweise erstellen. +Damit das ZK-SNARK-Protokoll funktioniert, ist die Erstellung eines Common Reference String (CRS) erforderlich: Das CRS stellt öffentliche Parameter zum Beweisen und Verifizieren von Validitätsnachweisen bereit. Die Sicherheit des Beweissystems hängt von der CRS-Einrichtung ab; wenn Informationen, die zur Erstellung öffentlicher Parameter verwendet wurden, in den Besitz böswilliger Akteure gelangen, könnten diese in der Lage sein, falsche Validitätsnachweise zu generieren. -Manche ZK-Rollups versuchen, dieses Problem durch den Einsatz einer [Multi-Party Computation Ceremony (MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/) zu lösen, bei der vertrauenswürdige Personen öffentliche Parameter für den ZK-SNARK-Circuit erzeugen. Um den CRS zu konstruieren, steuert jede Partei einen zufälligen Wert (bekannt als "Toxic Waste") bei, den sie umgehend vernichten muss. +Einige ZK-Rollups versuchen, dieses Problem zu lösen, indem sie eine [Multi-Party Computation Ceremony (MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/) unter Einbeziehung vertrauenswürdiger Personen verwenden, um öffentliche Parameter für die ZK-SNARK-Schaltung zu generieren. Jede Partei steuert etwas Zufälligkeit (genannt „giftiger Abfall“) zur Konstruktion des CRS bei, die sie sofort zerstören muss. -Trusted Setups kommen zum Einsatz, da sie die Sicherheit des CRS-Setups erhöhen. Wenn auch nur ein einziger ehrlicher Teilnehmer seinen Input zerstört, ist die Sicherheit des ZK-SNARK-Systems gewährleistet. Trotzdem muss man bedenken, dass bei diesen Ansatz vertrauen vorausgesetzt wird, dass die Beteiligten ihre erzeugten Zufallsdaten löschen und die Sicherheitsgarantien des Systems nicht kompromittieren. +Vertrauenswürdige Setups (Trusted Setups) werden verwendet, weil sie die Sicherheit der CRS-Einrichtung erhöhen. Solange ein ehrlicher Teilnehmer seine Eingabe zerstört, ist die Sicherheit des ZK-SNARK-Systems garantiert. Dennoch erfordert dieser Ansatz das Vertrauen in die Beteiligten, dass sie ihre gesampelte Zufälligkeit löschen und die Sicherheitsgarantien des Systems nicht untergraben. -Abgesehen von Vertrauensannahmen sind ZK-SNARKs aufgrund ihrer kleinen Beweisgrößen und der zeitkontinuierlichen Überprüfung beliebt. Da die Beweisüberprüfung auf L1 die größeren Kosten für den Betrieb eines ZK-Rollups darstellt, verwenden L2s ZK-SNARKs, um Beweise zu generieren, die schnell und kostengünstig auf Mainnet überprüft werden können. +Abgesehen von Vertrauensannahmen sind ZK-SNARKs wegen ihrer geringen Nachweisgrößen und der Verifizierung in konstanter Zeit beliebt. Da die Nachweisverifizierung auf L1 den größeren Teil der Kosten für den Betrieb eines ZK-Rollups ausmacht, verwenden L2s ZK-SNARKs, um Nachweise zu generieren, die schnell und kostengünstig im Mainnet verifiziert werden können. **ZK-STARKs** -Wie ZK-SNARKs beweisen ZK-STARKs die Gültigkeit von Offchain Berechnungen, ohne die Eingaben preiszugeben. ZK-STARKs gelten jedoch aufgrund ihrer Skalierbarkeit und Transparenz als Verbesserung gegenüber ZK-SNARKs. +Wie ZK-SNARKs beweisen ZK-STARKs die Gültigkeit von Off-Chain-Berechnungen, ohne die Eingaben preiszugeben. ZK-STARKs gelten jedoch aufgrund ihrer Skalierbarkeit und Transparenz als Verbesserung gegenüber ZK-SNARKs. -ZK-STARKs sind „transparent“, da sie ohne die vertrauenswürdige Einrichtung eines Common Reference String (CRS) funktionieren können. Stattdessen verlassen sich ZK-STARKs auf öffentlich überprüfbare Zufälligkeit, um Parameter für die Generierung und Überprüfung von Beweisen festzulegen. +ZK-STARKs sind „transparent“, da sie ohne das vertrauenswürdige Setup eines Common Reference String (CRS) funktionieren können. Stattdessen verlassen sich ZK-STARKs auf öffentlich verifizierbare Zufälligkeit, um Parameter für die Generierung und Verifizierung von Nachweisen einzurichten. -ZK-STARKs bieten auch mehr Skalierbarkeit, da die Zeit, die für den Nachweis und die Überprüfung von Gültigkeitsnachweisen benötigt wird, _quasilinear_ im Verhältnis zur Komplexität der zugrunde liegenden Berechnung ansteigt. Bei ZK-SNARKs skalieren die Beweis- und Verifizierungszeiten _linear_ im Verhältnis zur Größe der zugrunde liegenden Berechnung. Dies bedeutet, dass ZK-STARKs weniger Zeit als ZK-SNARKs zum Nachweis und zur Überprüfung großer Datensätze benötigen, was sie für Anwendungen mit hohem Volumen nützlich macht. +ZK-STARKs bieten auch mehr Skalierbarkeit, da die Zeit, die zum Beweisen und Verifizieren von Validitätsnachweisen benötigt wird, _quasilinear_ im Verhältnis zur Komplexität der zugrunde liegenden Berechnung steigt. Bei ZK-SNARKs skalieren die Beweis- und Verifizierungszeiten _linear_ im Verhältnis zur Größe der zugrunde liegenden Berechnung. Das bedeutet, dass ZK-STARKs weniger Zeit als ZK-SNARKs zum Beweisen und Verifizieren benötigen, wenn große Datensätze im Spiel sind, was sie für Anwendungen mit hohem Volumen nützlich macht. -ZK-STARKs sind auch gegen Quantencomputer sicher, während die in ZK-SNARKs verwendete Elliptical Curve Cryptography (ECC) allgemein als anfällig für Quantencomputerangriffe gilt. Der Nachteil von ZK-STARKs besteht darin, dass sie größere Proof Größen erzeugen, deren Überprüfung auf Ethereum teurer ist. +ZK-STARKs sind auch sicher gegen Quantencomputer, während die in ZK-SNARKs verwendete Elliptic Curve Cryptography (ECC) weithin als anfällig für Quantencomputer-Angriffe gilt. Der Nachteil von ZK-STARKs ist, dass sie größere Nachweisgrößen produzieren, deren Verifizierung auf Ethereum teurer ist. -#### Wie funktionieren Gültigkeitsnachweise in ZK-Rollups? Gültigkeitsnachweise in ZK-Rollups {#validity-proofs-in-zk-rollups} +#### Wie funktionieren Validitätsnachweise in ZK-Rollups? {#validity-proofs-in-zk-rollups} -##### Beweiserstellung +##### Nachweisgenerierung -Vor der Annahme von Transaktionen führt der Betreiber die üblichen Prüfungen durch. Dazu gehört die Bestätigung, dass: +Vor der Annahme von Transaktionen führt der Betreiber die üblichen Überprüfungen durch. Dazu gehört die Bestätigung, dass: -- Die Absender- und Empfängerkonten sind Teil des Statusbaums. -- Der Absender verfügt über ausreichende Mittel, um die Transaktion abzuwickeln. -- Die Transaktion ist korrekt und stimmt mit dem öffentlichen Schlüssel des Absenders im Rollup überein. -- Der Nonce des Absenders ist korrekt usw. +- Die Konten des Senders und Empfängers Teil des Zustandsbaums sind. +- Der Sender über genügend Gelder verfügt, um die Transaktion zu verarbeiten. +- Die Transaktion korrekt ist und mit dem Public-Key des Senders auf dem Rollup übereinstimmt. +- Die Nonce des Senders korrekt ist usw. -Sobald der ZK Rollup Knoten über genügend Transaktionen verfügt, fasst er diese zu einem Stapel zusammen und kompiliert Eingaben für den Prüfkreis, um daraus einen prägnanten ZK Beweis zu kompilieren. Dazu gehört: +Sobald der ZK-Rollup-Blockchain-Knoten genügend Transaktionen hat, aggregiert er sie zu einem Batch und stellt Eingaben für die Beweisschaltung zusammen, um sie in einen prägnanten ZK-Nachweis zu kompilieren. Dies umfasst: -- Eine Merkle- Baumwurzel, die alle Transaktionen im Stapel umfasst. -- Merkle Beweise für Transaktionen, um die Aufnahme in den Stapel nachzuweisen. -- Merkle Beweise für jedes Sender-Empfänger-Paar in Transaktionen, um zu beweisen, dass diese Konten Teil des Zustandsbaums des Rollups sind. -- Eine Reihe von Zwischenzustandswurzeln, die durch die Aktualisierung der Zustandswurzel nach der Anwendung von Zustandsaktualisierungen für jede Transaktion (d. h. Verringerung der Anzahl der Absenderkonten und Erhöhung der Anzahl der Empfängerkonten) abgeleitet werden. +- Eine Merkle-Baum-Wurzel, die alle Transaktionen im Batch umfasst. +- Merkle-Nachweise für Transaktionen, um die Aufnahme in den Batch zu beweisen. +- Merkle-Nachweise für jedes Sender-Empfänger-Paar in Transaktionen, um zu beweisen, dass diese Konten Teil des Zustandsbaums des Rollups sind. +- Eine Reihe von Zwischenzustandswurzeln, die aus der Aktualisierung der Zustandswurzel nach Anwendung von Zustandsaktualisierungen für jede Transaktion abgeleitet werden (d. h. Verringerung der Senderkonten und Erhöhung der Empfängerkonten). -Der Prüfschaltkreis berechnet den Gültigkeitsnachweis, indem er jede Transaktion in einer „Schleife“ durchläuft und dieselben Prüfungen durchführt, die der Bediener vor der Verarbeitung der Transaktion durchgeführt hat. Zunächst wird mithilfe des bereitgestellten Merkle Beweises überprüft, ob das Konto des Absenders Teil der vorhandenen Statuswurzel ist. Anschließend reduziert es das Guthaben des Absenders, erhöht dessen Nonce, hash die aktualisierten Kontodaten und kombiniert sie mit dem Merkle Beweis, um eine neue Merkle Wurzel zu generieren. +Die Beweisschaltung berechnet den Validitätsnachweis, indem sie über jede Transaktion „schleift“ und dieselben Überprüfungen durchführt, die der Betreiber vor der Verarbeitung der Transaktion abgeschlossen hat. Zuerst verifiziert sie mithilfe des bereitgestellten Merkle-Nachweises, dass das Konto des Senders Teil der bestehenden Zustandswurzel ist. Dann reduziert sie den Kontostand des Senders, erhöht dessen Nonce, hasht die aktualisierten Kontodaten und kombiniert sie mit dem Merkle-Nachweis, um eine neue Merkle-Wurzel zu generieren. -Seine Merkle Wurzel spiegelt die einzige Änderung im Status des ZK-Rollups wider: eine Änderung des Guthabens und der Nonce des Absenders. Dies ist möglich, weil der Merkle Beweis, der zum Nachweis der Existenz des Kontos verwendet wird, zum Ableiten der neuen Zustandswurzel verwendet wird. +Diese Merkle-Wurzel spiegelt die einzige Änderung im Zustand des ZK-Rollups wider: eine Änderung des Kontostands und der Nonce des Senders. Dies ist möglich, weil der Merkle-Nachweis, der zum Beweis der Existenz des Kontos verwendet wird, zur Ableitung der neuen Zustandswurzel verwendet wird. -Der Prüfkreis führt denselben Vorgang auf dem Konto des Empfängers durch. Es prüft, ob das Konto des Empfängers unter der Zwischenzustandswurzel existiert (unter Verwendung des Merkle Beweises), erhöht dessen Guthaben, hasht die Kontodaten erneut und kombiniert sie mit dem Merkle Beweis, um eine neue Zustandswurzel zu generieren.Das Abheben von einem ZK-Rollup auf L1 ist unkompliziert. +Die Beweisschaltung führt denselben Prozess für das Konto des Empfängers durch. Sie prüft, ob das Konto des Empfängers unter der Zwischenzustandswurzel existiert (mithilfe des Merkle-Nachweises), erhöht dessen Kontostand, hasht die Kontodaten neu und kombiniert sie mit dem Merkle-Nachweis, um eine neue Zustandswurzel zu generieren. -Der Vorgang wird für jede Transaktion wiederholt. Jede „Schleife“ erstellt eine neue Statuswurzel durch Aktualisierung des Kontos des Absenders und eine nachfolgende neue Wurzel durch Aktualisierung des Kontos des Empfängers. Wie erläutert, stellt jede Aktualisierung der Statuswurzel eine Änderung eines Teils des Statusbaums des Rollups dar. +Der Prozess wiederholt sich für jede Transaktion; jede „Schleife“ erstellt eine neue Zustandswurzel aus der Aktualisierung des Senderkontos und eine anschließende neue Wurzel aus der Aktualisierung des Empfängerkontos. Wie erklärt, stellt jede Aktualisierung der Zustandswurzel einen Teil des sich ändernden Zustandsbaums des Rollups dar. -Der ZK-Beweisschaltkreis durchläuft den gesamten Transaktionsstapel und überprüft die Abfolge der Aktualisierungen, die nach Ausführung der letzten Transaktion zu einer endgültigen Zustandswurzel führen. Die zuletzt berechnete Merkle Wurzel wird zur neuesten kanonischen Zustandswurzel des ZK-Rollups. +Die ZK-Beweisschaltung iteriert über den gesamten Transaktions-Batch und verifiziert die Sequenz von Aktualisierungen, die nach Ausführung der letzten Transaktion zu einer finalen Zustandswurzel führen. Die zuletzt berechnete Merkle-Wurzel wird zur neuesten kanonischen Zustandswurzel des ZK-Rollups. -##### Nachweisprüfung +##### Nachweisverifizierung -Nachdem der Prüfkreis die Richtigkeit der Statusaktualisierungen überprüft hat, übermittelt der L2-Operator den berechneten Gültigkeitsnachweis an den Prüfvertrag auf L1. Der Verifizierungszeite des Vertrags überprüft die Gültigkeit des Beweises und prüft auch öffentliche Eingaben, die Teil des Beweises sind: +Nachdem die Beweisschaltung die Richtigkeit der Zustandsaktualisierungen verifiziert hat, übermittelt der L2-Betreiber den berechneten Validitätsnachweis an den Verifizierer-Vertrag auf L1. Die Verifizierungsschaltung des Vertrags verifiziert die Gültigkeit des Nachweises und prüft auch öffentliche Eingaben, die Teil des Nachweises sind: -- **Pre-State-Root**: Der alte State-Root des ZK-Rollups (d. h. vor der Ausführung der gebatchten Transaktionen), der den letzten bekannten gültigen Zustand der L2-Kette widerspiegelt. +- **Vor-Zustandswurzel (Pre-state root)**: Die alte Zustandswurzel des ZK-Rollups (d. h. bevor die gebündelten Transaktionen wurden ausgeführt), die den letzten bekannten gültigen Zustand der L2-Chain widerspiegelt. -- **Post-State-Root**: Der neue State-Root des ZK-Rollups (d. h. nach der Ausführung der gebatchten Transaktionen), der den neuesten Zustand der L2-Kette widerspiegelt. Die Post State Wurzel ist die endgültige Wurzel, die nach dem Anwenden von Zustandsaktualisierungen im Prüfschaltkreis abgeleitet wird. +- **Nach-Zustandswurzel (Post-state root)**: Die neue Zustandswurzel des ZK-Rollups (d. h. nach der Ausführung der gebündelten Transaktionen), die den neuesten Zustand der L2-Chain widerspiegelt. Die Nach-Zustandswurzel ist die finale Wurzel, die nach Anwendung der Zustandsaktualisierungen in der Beweisschaltung abgeleitet wird. -- **Batch-Root**: Der Merkle-Root des Batches, der durch das _Merklisieren_ von Transaktionen im Batch und das Hashen des Baum-Roots abgeleitet wird. +- **Batch-Wurzel**: Die Merkle-Wurzel des Batches, abgeleitet durch _Merklisierung_ der Transaktionen im Batch und Hashing der Wurzel des Baums. -- **Transaktionseingaben**: Daten, die mit den Transaktionen verbunden sind, die als Teil des übermittelten Batches ausgeführt werden. +- **Transaktionseingaben**: Daten, die mit den Transaktionen verbunden sind, die als Teil des eingereichten Batches ausgeführt wurden. -Wenn der Beweis den Schaltkreis erfüllt (d. h. gültig ist), bedeutet dies, dass eine Folge gültiger Transaktionen vorhanden ist, die das Rollup vom vorherigen Zustand (kryptografisch durch die Vorzustandswurzel gekennzeichnet) in einen neuen Zustand (kryptografisch durch die Nachzustandswurzel gekennzeichnet) überführen. Wenn die Wurzel vor dem Status mit der im Rollup Vertrag gespeicherten Wurzel übereinstimmt und der Beweis gültig ist, übernimmt der Rollup Vertrag die Wurzel nach dem Status aus dem Beweis und aktualisiert seinen Statusbaum, um den geänderten Status des Rollups widerzuspiegeln. +Wenn der Nachweis die Schaltung erfüllt (d. h. er ist gültig), bedeutet dies, dass eine Sequenz gültiger Transaktionen existiert, die das Rollup vom vorherigen Zustand (kryptografisch durch die Vor-Zustandswurzel gekennzeichnet) in einen neuen Zustand (kryptografisch durch die Nach-Zustandswurzel gekennzeichnet) überführt. Wenn die Vor-Zustandswurzel mit der im Rollup-Vertrag gespeicherten Wurzel übereinstimmt und der Nachweis gültig ist, übernimmt der Rollup-Vertrag die Nach-Zustandswurzel aus dem Nachweis und aktualisiert seinen Zustandsbaum, um den geänderten Zustand des Rollups widerzuspiegeln. -### Ein- und Austritte {#entries-and-exits} +### Ein- und Ausgänge {#entries-and-exits} -Benutzer nehmen am ZK-Rollup teil, indem sie Token im Rollup Vertrag hinterlegen, der auf der L1-Kette bereitgestellt wird. Diese Transaktion wird in die Warteschlange gestellt, da nur Betreiber Transaktionen an den Rollup Vertrag übermitteln können. +Benutzer betreten das ZK-Rollup, indem sie Token in den Rollup-Vertrag einzahlen, der auf der L1-Chain bereitgestellt ist. Diese Transaktion wird in eine Warteschlange eingereiht, da nur Betreiber Transaktionen an den Rollup-Vertrag übermitteln können. -Wenn sich die Warteschlange für ausstehende Einzahlungen zu füllen beginnt, nimmt der ZK Rollup Betreiber die Einzahlungstransaktionen entgegen und übermittelt sie an den Rollup- Vertrag. Sobald sich die Gelder des Benutzers im Rollup befinden, kann er mit der Transaktion beginnen, indem er Transaktionen zur Verarbeitung an den Betreiber sendet. Benutzer können Guthaben auf dem Rollup überprüfen, indem sie ihre Kontodaten hashen, den Hash an den Rollup-Vertrag senden und einen Merkle-Nachweis bereitstellen, um ihn mit der aktuellen Statuswurzel zu vergleichen. +Wenn sich die Warteschlange der ausstehenden Einzahlungen zu füllen beginnt, nimmt der ZK-Rollup-Betreiber die Einzahlungstransaktionen und übermittelt sie an den Rollup-Vertrag. Sobald sich die Gelder des Benutzers im Rollup befinden, kann er mit dem Transaktionsverkehr beginnen, indem er Transaktionen zur Verarbeitung an den Betreiber sendet. Benutzer können Salden auf dem Rollup verifizieren, indem sie ihre Kontodaten hashen, den Hash an den Rollup-Vertrag senden und einen Merkle-Nachweis bereitstellen, um ihn gegen die aktuelle Zustandswurzel zu verifizieren. -Das Abheben von einem ZK-Rollup auf L1 ist unkompliziert. Der Benutzer leitet die Exit Transaktion ein, indem er seine Vermögenswerte auf dem Rollup zum Verbrennen an ein angegebenes Konto sendet. Wenn der Betreiber die Transaktion in den nächsten Stapel aufnimmt, kann der Benutzer eine Auszahlungsanforderung an den Onchain Vertrag senden. Dieser Auszahlungsantrag muss Folgendes enthalten: +Das Abheben von einem ZK-Rollup zu L1 ist unkompliziert. Der Benutzer initiiert die Exit-Transaktion, indem er seine Vermögenswerte auf dem Rollup an ein bestimmtes Konto zum Verbrennen (Burning) sendet. Wenn der Betreiber die Transaktion in den nächsten Batch aufnimmt, kann der Benutzer eine Abhebungsanforderung an den Vertrag auf der Blockchain übermitteln. Diese Abhebungsanforderung umfasst Folgendes: -- Merkle Beweis, der die Einbeziehung der Transaktion des Benutzers in das Burn Konto in einem Transaktionsstapel belegt +- Merkle-Nachweis, der die Aufnahme der Transaktion des Benutzers an das Burn-Konto in einem Transaktions-Batch beweist - Transaktionsdaten -- Batch Root +- Batch-Wurzel -- L1-Adresse zum Empfangen eingezahlter Gelder +- L1-Adresse zum Empfang der eingezahlten Gelder -Der Rollup Vertrag hasht die Transaktionsdaten, prüft, ob die Batch-Root vorhanden ist, und verwendet den Merkle Beweis, um zu prüfen, ob der Transaktions Hash Teil der Batch Root ist. Anschließend führt der Vertrag die Exit-Transaktion aus und sendet Gelder an die vom Benutzer gewählte Adresse auf L1. +Der Rollup-Vertrag hasht die Transaktionsdaten, prüft, ob die Batch-Wurzel existiert, und verwendet den Merkle-Nachweis, um zu prüfen, ob der Transaktions-Hash Teil der Batch-Wurzel ist. Danach führt der Vertrag die Exit-Transaktion aus und sendet die Gelder an die vom Benutzer gewählte Adresse auf L1. ## ZK-Rollups und EVM-Kompatibilität {#zk-rollups-and-evm-compatibility} -Im Gegensatz zu Optimistic Rollups sind ZK-Rollups nicht ohne Weiteres mit der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) kompatibel. Der Nachweis allgemeiner EVM Berechnungen in Schaltkreisen ist schwieriger und ressourcenintensiver als der Nachweis einfacher Berechnungen (wie der zuvor beschriebenen Token Übertragung). +Im Gegensatz zu Optimistic Rollups sind ZK-Rollups nicht ohne Weiteres mit der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) kompatibel. Das Beweisen von Allzweck-EVM-Berechnungen in Schaltungen ist schwieriger und ressourcenintensiver als das Beweisen einfacher Berechnungen (wie der zuvor beschriebene Token-Transfer). -Allerdings wecken [Fortschritte in der Zero-Knowledge-Technologie](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) erneut das Interesse daran, EVM-Berechnungen in Zero-Knowledge-Beweise zu verpacken. Diese Bemühungen zielen darauf ab, eine Zero Knowledge EVM Implementierung (zkEVM) zu erstellen, die die Richtigkeit der Programmausführung effizient überprüfen kann. Ein zkEVM erstellt vorhandene EVM Opcodes zum Nachweis/zur Verifizierung in Schaltkreisen neu und ermöglicht so die Ausführung intelligenter Verträge. +Jedoch wecken [Fortschritte in der Zero-Knowledge-Technologie](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) erneutes Interesse daran, EVM-Berechnungen in Zero-Knowledge-Nachweise zu verpacken. Diese Bemühungen zielen darauf ab, eine Zero-Knowledge-EVM (zkEVM)-Implementierung zu erstellen, die die Richtigkeit der Programmausführung effizient verifizieren kann. Eine zkEVM bildet bestehende EVM-Opcodes zum Beweisen/Verifizieren in Schaltungen nach, was die Ausführung von Smart Contracts ermöglicht. -Wie das EVM wechselt ein zkEVM zwischen Zuständen, nachdem Berechnungen an einigen Eingaben durchgeführt wurden. Der Unterschied besteht darin, dass zkEVM auch Zero Knowledge Beweise erstellt, um die Richtigkeit jedes Schritts bei der Programmausführung zu überprüfen. Gültigkeitsnachweise könnten die Richtigkeit von Operationen überprüfen, die den Zustand der VM (Speicher, Stapel, Speicher) und die Berechnung selbst betreffen (d. h. hat die Operation die richtigen Opcodes aufgerufen und sie korrekt ausgeführt?). +Wie die EVM geht eine zkEVM zwischen Zuständen über, nachdem Berechnungen an einigen Eingaben durchgeführt wurden. Der Unterschied besteht darin, dass die zkEVM auch Zero-Knowledge-Nachweise erstellt, um die Richtigkeit jedes Schritts in der Programmausführung zu verifizieren. Validitätsnachweise könnten die Richtigkeit von Operationen verifizieren, die den Zustand der VM (Speicher, Stack, Storage) berühren, sowie die Berechnung selbst (d. h. hat die Operation die richtigen Opcodes aufgerufen und sie korrekt ausgeführt?). -Die Einführung EVM kompatibler ZK-Rollups soll Entwicklern helfen, die Skalierbarkeit und Sicherheitsgarantien von Zero Knowledge Proof zu nutzen. Noch wichtiger ist, dass Entwickler durch die Kompatibilität mit der nativen Ethereum Infrastruktur ZK freundliche Dapp mit vertrauten (und praxiserprobten) Tools und Sprachen erstellen können. +Es wird erwartet, dass die Einführung EVM-kompatibler ZK-Rollups Entwicklern hilft, die Skalierbarkeit und Sicherheitsgarantien von Zero-Knowledge-Nachweisen zu nutzen. Noch wichtiger ist, dass die Kompatibilität mit der nativen Ethereum-Infrastruktur bedeutet, dass Entwickler ZK-freundliche Dapps mit vertrauten (und praxiserprobten) Tools und Sprachen erstellen können. -## Wie funktionieren ZK-Rollup Gebühren? {#how-do-zk-rollup-fees-work} +## Wie funktionieren ZK-Rollup-Gebühren? {#how-do-zk-rollup-fees-work} -Wie viel Benutzer für Transaktionen auf ZK Rollups zahlen, hängt von der Gasgebühr ab, genau wie beim Ethereum Mainnet. Die Gasgebühren funktionieren auf L2 jedoch anders und werden von den folgenden Kosten beeinflusst: +Wie viel Benutzer für Transaktionen auf ZK-Rollups bezahlen, hängt von der Gasgebühr ab, genau wie im Ethereum-Mainnet. Gasgebühren funktionieren jedoch auf L2 anders und werden von den folgenden Kosten beeinflusst: -1. **Schreiben in den Zustand**: Für das Schreiben in den Zustand von Ethereum (d. h. das Senden einer Transaktion auf der Ethereum-Blockchain) fallen feste Kosten an. ZK-Rollups reduzieren diese Kosten, indem sie Transaktionen bündeln und die Fixkosten auf mehrere Benutzer verteilen. +1. **Zustandsschreiben**: Es gibt feste Kosten für das Schreiben in den Zustand von Ethereum (d. h. das Übermitteln einer Transaktion auf der Ethereum-Blockchain). ZK-Rollups reduzieren diese Kosten, indem sie Transaktionen bündeln und feste Kosten auf mehrere Benutzer verteilen. -2. **Datenveröffentlichung**: ZK-Rollups veröffentlichen Zustandsdaten für jede Transaktion als `calldata` auf Ethereum. Die `calldata`-Kosten werden derzeit durch [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) geregelt, das Kosten von 16 Gas für Nicht-Null-Bytes bzw. 4 Gas für Null-Bytes von `calldata` vorschreibt. Die Kosten für die einzelne Transaktion hängen davon ab, wie viel `calldata` dafür onchain veröffentlicht werden muss. +2. **Datenveröffentlichung**: ZK-Rollups veröffentlichen Zustandsdaten für jede Transaktion auf Ethereum als `calldata`. `calldata`-Kosten werden derzeit durch [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) geregelt, das Kosten von 16 Gas für Nicht-Null-Bytes bzw. 4 Gas für Null-Bytes von `calldata` vorschreibt. Die für jede Transaktion gezahlten Kosten werden davon beeinflusst, wie viel `calldata` dafür auf der Blockchain veröffentlicht werden muss. -3. **L2-Betreibergebühren**: Dies ist der Betrag, der an den Rollup-Betreiber als Ausgleich für die Rechenkosten gezahlt wird, die bei der Verarbeitung von Transaktionen anfallen, ähnlich den [Transaktions-"Prioritätsgebühren (Trinkgelder)"](/developers/docs/gas/#how-are-gas-fees-calculated) auf dem Ethereum Mainnet. +3. **L2-Betreibergebühren**: Dies ist der Betrag, der dem Rollup-Betreiber als Entschädigung für die bei der Verarbeitung von Transaktionen anfallenden Rechenkosten gezahlt wird, ähnlich wie [Transaktions-„Prioritätsgebühren (Trinkgelder)“](/developers/docs/gas/#how-are-gas-fees-calculated) im Ethereum-Mainnet. -4. **Beweiserstellung und -verifizierung**: ZK-Rollup-Betreiber müssen Gültigkeitsnachweise für Transaktions-Batches erstellen, was ressourcenintensiv ist. Die Überprüfung von Zero-Knowledge-Beweisen im Mainnet kostet ebenfalls Gas (~ 500.000 Gas). +4. **Nachweisgenerierung und -verifizierung**: ZK-Rollup-Betreiber müssen Validitätsnachweise für Transaktions-Batches erstellen, was ressourcenintensiv ist. Die Verifizierung von Zero-Knowledge-Nachweisen im Mainnet kostet ebenfalls Gas (~ 500.000 Gas). -Neben der Bündelung von Transaktionen reduzieren ZK Rollups die Gebühren für Benutzer durch die Komprimierung von Transaktionsdaten. Sie können [sich eine Echtzeitübersicht](https://l2fees.info/) darüber ansehen, was die Nutzung von Ethereum-ZK-Rollups kostet. +Abgesehen von der Bündelung von Transaktionen reduzieren ZK-Rollups die Gebühren für Benutzer durch die Komprimierung von Transaktionsdaten. Sie können [eine Echtzeit-Übersicht sehen](https://l2fees.info/), wie viel die Nutzung von Ethereum-ZK-Rollups kostet. -## Wie skalieren ZK-Rollups Ethereum? Skalierung von Ethereum mit ZK-Rollups {#scaling-ethereum-with-zk-rollups} +## Wie skalieren ZK-Rollups Ethereum? {#scaling-ethereum-with-zk-rollups} -### Komprimierung von Transaktionsdaten {#transaction-data-compression} +### Transaktionsdatenkomprimierung {#transaction-data-compression} -ZK Rollups erweitern den Durchsatz auf der Basisschicht von Ethereum, indem sie Berechnungen außerhalb der Kette durchführen. Der eigentliche Schub für die Skalierung kommt jedoch durch die Komprimierung der Transaktionsdaten. Die [Blockgröße](/developers/docs/blocks/#block-size) von Ethereum begrenzt die Datenmenge, die jeder Block enthalten kann, und damit auch die Anzahl der pro Block verarbeiteten Transaktionen. Durch die Komprimierung Transaktion bezogener Daten erhöhen ZK Rollups die Anzahl der pro Block verarbeiteten Transaktionen erheblich. +ZK-Rollups erweitern den Durchsatz auf der Basisschicht von Ethereum, indem sie Berechnungen Off-Chain verlagern, aber der eigentliche Schub für die Skalierung kommt von der Komprimierung von Transaktionsdaten. Die [Blockgröße](/developers/docs/blocks/#block-size) von Ethereum begrenzt die Daten, die jeder Block aufnehmen kann, und damit auch die Anzahl der pro Block verarbeiteten Transaktionen. Durch die Komprimierung transaktionsbezogener Daten erhöhen ZK-Rollups die Anzahl der pro Block verarbeiteten Transaktionen erheblich. -ZK Rollups können Transaktionsdaten besser komprimieren als optimistische Rollups, da sie nicht alle zur Validierung jeder Transaktion erforderlichen Daten veröffentlichen müssen. Sie müssen nur die minimal erforderlichen Daten veröffentlichen, um den aktuellen Stand der Konten und Salden im Rollup wiederherzustellen. +ZK-Rollups können Transaktionsdaten besser komprimieren als Optimistic Rollups, da sie nicht alle Daten veröffentlichen müssen, die zur Validierung jeder Transaktion erforderlich sind. Sie müssen nur die minimalen Daten veröffentlichen, die erforderlich sind, um den neuesten Zustand von Konten und Salden auf dem Rollup wiederherzustellen. -### Rekursive Proofs {#recursive-proofs} +### Rekursive Nachweise {#recursive-proofs} -Ein Vorteil von Zero Knowledge-Beweisen besteht darin, dass Beweise andere Beweise verifizieren können. Beispielsweise kann ein einzelner ZK-SNARK andere ZK-SNARKs verifizieren. Solche „Proof of Proof“ werden als rekursive Proof bezeichnet und erhöhen den Durchsatz bei ZK-Rollups dramatisch. +Ein Vorteil von Zero-Knowledge-Nachweisen ist, dass Nachweise andere Nachweise verifizieren können. Zum Beispiel kann ein einzelner ZK-SNARK andere ZK-SNARKs verifizieren. Solche „Nachweise von Nachweisen“ werden rekursive Nachweise genannt und erhöhen den Durchsatz auf ZK-Rollups drastisch. -Derzeit werden Gültigkeitsnachweise Block für Block generiert und zur Überprüfung an den L1-Vertrag übermittelt. Die Überprüfung einzelner Blocknachweise begrenzt jedoch den Durchsatz, den ZK-Rollups erreichen können, da nur ein Block abgeschlossen werden kann, wenn der Betreiber einen Nachweis einreicht. +Derzeit werden Validitätsnachweise blockweise generiert und zur Verifizierung an den L1-Vertrag übermittelt. Die Verifizierung einzelner Blocknachweise begrenzt jedoch den Durchsatz, den ZK-Rollups erreichen können, da nur ein Block finalisiert werden kann, wenn der Betreiber einen Nachweis einreicht. -Rekursive Beweise ermöglichen es jedoch, mehrere Blöcke mit einem Gültigkeitsnachweis abzuschließen. Dies liegt daran, dass der Beweisschaltkreis mehrere Blockbeweise rekursiv aggregiert, bis ein endgültiger Beweis erstellt ist. Der L2-Operator übermittelt diesen rekursiven Beweis, und wenn der Vertrag ihn akzeptiert, werden alle relevanten Blöcke sofort abgeschlossen. Mit rekursiven Beweisen erhöht sich die Anzahl der ZK-Rollup Transaktionen, die in Intervallen auf Ethereum abgeschlossen werden können. +Rekursive Nachweise machen es jedoch möglich, mehrere Blöcke mit einem Validitätsnachweis zu finalisieren. Dies liegt daran, dass die Beweisschaltung rekursiv mehrere Blocknachweise aggregiert, bis ein finaler Nachweis erstellt ist. Der L2-Betreiber übermittelt diesen rekursiven Nachweis, und wenn der Vertrag ihn akzeptiert, werden alle relevanten Blöcke sofort finalisiert. Mit rekursiven Nachweisen steigt die Anzahl der ZK-Rollup-Transaktionen, die in Intervallen auf Ethereum finalisiert werden können. ### Vor- und Nachteile von ZK-Rollups {#zk-rollups-pros-and-cons} -| Pro | Nachteile | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Gültigkeitsnachweise stellen die Richtigkeit von Offchain Transaktionen sicher und verhindern, dass Betreiber ungültige Zustandsübergänge ausführen. | Die Kosten für die Berechnung und Überprüfung von Gültigkeitsnachweisen sind erheblich und können die Gebühren für Rollup Benutzer erhöhen. | -| Bietet eine schnellere Transaktionsendgültigkeit, da Statusaktualisierungen genehmigt werden, sobald die Gültigkeitsnachweise auf L1 überprüft wurden. | Aufgrund der Komplexität der Zero Knowledge-Technologie ist die Erstellung EVM kompatibler ZK-Rollups schwierig. | -| Baut zur Sicherheit auf vertrauenslose kryptografische Mechanismen, nicht auf die Ehrlichkeit von Akteuren mit Anreizen wie bei [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons). | Für die Erstellung von Gültigkeitsnachweisen ist spezielle Hardware erforderlich, was eine zentrale Kontrolle der Kette durch einige wenige Parteien begünstigen kann. | -| Für die Erstellung von Gültigkeitsnachweisen ist spezielle Hardware erforderlich, was eine zentrale Kontrolle der Kette durch einige wenige Parteien begünstigen kann. | Zentralisierte Operatoren (Sequenzer) können die Reihenfolge der Transaktionen beeinflussen. | -| Zentralisierte Operatoren (Sequenzer) können die Reihenfolge der Transaktionen beeinflussen. | Durch die Hardwareanforderungen kann die Anzahl der Teilnehmer verringert werden, die die Kette zum Fortschreiten zwingen können. Dadurch erhöht sich das Risiko, dass böswillige Betreiber den Status des Rollups einfrieren und Benutzer zensieren. | -| Hängt nicht von Annahmen zur Lebendigkeit ab und Benutzer müssen die Kette nicht validieren, um ihre Gelder zu schützen. | Einige Prüfsysteme (z. B. ZK-SNARK) erfordern eine vertrauenswürdige Einrichtung, die bei unsachgemäßer Handhabung möglicherweise das Sicherheitsmodell eines ZK-Rollups gefährden könnte. | -| Eine bessere Datenkomprimierung kann dazu beitragen, die Kosten für die Veröffentlichung von `calldata` auf Ethereum zu senken und die Rollup-Gebühren für Benutzer zu minimieren. | | +| Vorteile | Nachteile | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Validitätsnachweise stellen die Richtigkeit von Off-Chain-Transaktionen sicher und verhindern, dass Betreiber ungültige Zustandsübergänge ausführen. | Die mit der Berechnung und Verifizierung von Validitätsnachweisen verbundenen Kosten sind erheblich und können die Gebühren für Rollup-Benutzer erhöhen. | +| Bietet schnellere Transaktionsfinalität, da Zustandsaktualisierungen genehmigt werden, sobald Validitätsnachweise auf L1 verifiziert sind. | Der Aufbau EVM-kompatibler ZK-Rollups ist aufgrund der Komplexität der Zero-Knowledge-Technologie schwierig. | +| Verlässt sich für die Sicherheit auf vertrauenslose kryptografische Mechanismen, nicht auf die Ehrlichkeit von Akteuren mit Anreizen wie bei [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons). | Die Erstellung von Validitätsnachweisen erfordert spezialisierte Hardware, was eine zentralisierte Kontrolle der Chain durch wenige Parteien fördern kann. | +| Speichert Daten, die zur Wiederherstellung des Off-Chain-Zustands auf L1 benötigt werden, was Sicherheit, Zensurresistenz und Dezentralisierung garantiert. | Zentralisierte Betreiber (Sequencer) können die Reihenfolge von Transaktionen beeinflussen. | +| Benutzer profitieren von größerer Kapitaleffizienz und können Gelder ohne Verzögerungen von L2 abheben. | Hardwareanforderungen können die Anzahl der Teilnehmer reduzieren, die die Chain zum Fortschritt zwingen können, was das Risiko erhöht, dass böswillige Betreiber den Zustand des Rollups einfrieren und Benutzer zensieren. | +| Hängt nicht von Liveness-Annahmen ab und Benutzer müssen die Chain nicht validieren, um ihre Gelder zu schützen. | Einige Beweissysteme (z. B. ZK-SNARK) erfordern ein vertrauenswürdiges Setup, das bei falscher Handhabung potenziell das Sicherheitsmodell eines ZK-Rollups gefährden könnte. | +| Bessere Datenkomprimierung kann helfen, die Kosten für die Veröffentlichung von `calldata` auf Ethereum zu senken und Rollup-Gebühren für Benutzer zu minimieren. | | ### Eine visuelle Erklärung von ZK-Rollups {#zk-video} -Sehen Sie, wie Finematics ZK-Rollups erklärt: +Sehen Sie sich an, wie Finematics ZK-Rollups erklärt: -## Wer arbeitet an einem zkEVM? zkEVM-Projekte {#zkevm-projects} + +## Wer arbeitet an einer zkEVM? {#zkevm-projects} Zu den Projekten, die an zkEVMs arbeiten, gehören: -- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _zkEVM ist ein von der Ethereum Foundation finanziertes Projekt zur Entwicklung eines EVM-kompatiblen ZK-Rollups und eines Mechanismus zur Erzeugung von Gültigkeitsnachweisen für Ethereum-Blöcke._ +- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** – _zkEVM ist ein von der Ethereum Foundation finanziertes Projekt zur Entwicklung eines EVM-kompatiblen ZK-Rollups und eines Mechanismus zur Generierung von Validitätsnachweisen für Ethereum-Blöcke._ + +- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** – _ist ein dezentralisiertes ZK-Rollup im Ethereum-Mainnet, das an einer Zero-Knowledge Ethereum Virtual Machine (zkEVM) arbeitet, die Ethereum-Transaktionen auf transparente Weise ausführt, einschließlich Smart Contracts mit Zero-Knowledge-Nachweis-Validierungen._ + +- **[Scroll](https://scroll.io/blog/zkEVM)** – _Scroll ist ein technologiegetriebenes Unternehmen, das am Aufbau einer nativen zkEVM-Ebene-2-Lösung für Ethereum arbeitet._ -- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _ist ein dezentraler ZK-Rollup auf dem Ethereum Mainnet, der auf einer Zero-Knowledge Ethereum Virtual Machine (zkEVM) arbeitet, die Ethereum-Transaktionen auf transparente Weise ausführt, einschließlich Smart Contracts mit Zero-Knowledge-Proof-Validierungen._ +- **[Taiko](https://taiko.xyz)** – _Taiko ist ein dezentralisiertes, Ethereum-äquivalentes ZK-Rollup (eine [Typ 1 ZK-EVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ -- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll ist ein technologieorientiertes Unternehmen, das an der Entwicklung einer nativen zkEVM Layer-2-Lösung für Ethereum arbeitet._ +- **[ZKsync](https://docs.zksync.io/)** – _ZKsync Era ist ein EVM-kompatibles ZK-Rollup, das von Matter Labs entwickelt wurde und von seiner eigenen zkEVM angetrieben wird._ -- **[Taiko](https://taiko.xyz)** - _Taiko ist ein dezentralisierter, Ethereum-äquivalenter ZK-Rollup (ein [Typ 1 ZK-EVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ +- **[Starknet](https://starkware.co/starknet/)** – _StarkNet ist eine EVM-kompatible Skalierungslösung der Ebene 2, die von StarkWare entwickelt wurde._ -- **[ZKsync](https://docs.zksync.io/)** - _ZKsync Era ist ein EVM-kompatibler ZK-Rollup, der von Matter Labs entwickelt wurde und von seinem eigenen zkEVM angetrieben wird._ +- **[Morph](https://www.morphl2.io/)** – _Morph ist eine hybride Rollup-Skalierungslösung, die ZK-Nachweise nutzt, um das Problem der Ebene-2-Zustandsherausforderung anzugehen._ -- **[Starknet](https://starkware.co/starknet/)** - _StarkNet ist eine EVM-kompatible Layer-2-Skalierungslösung, die von StarkWare entwickelt wurde._ +- **[Linea](https://linea.build)** – _Linea ist eine Ethereum-äquivalente zkEVM der Ebene 2, die von Consensys entwickelt wurde und vollständig auf das Ethereum-Ökosystem abgestimmt ist._ -- **[Morph](https://www.morphl2.io/)** - _Morph ist eine hybride Rollup-Skalierungslösung, die ZK-Beweise nutzt, um das Problem der Layer-2-Zustandsherausforderung zu lösen._ +## Weiterführende Literatur zu ZK-Rollups {#further-reading-on-zk-rollups} -- **[Linea](https://linea.build)** - _Linea ist eine Ethereum-äquivalente zkEVM Layer 2, die von Consensys entwickelt wurde und vollständig auf das Ethereum-Ökosystem ausgerichtet ist._ +- [What Are Zero-Knowledge Rollups?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) +- [What are zero-knowledge rollups?](https://alchemy.com/blog/zero-knowledge-rollups) +- [The Practical Guide To Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [STARKs vs SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) +- [What is a zkEVM?](https://www.alchemy.com/overviews/zkevm) +- [ZK-EVM types: Ethereum-equivalent, EVM-equivalent, Type 1, Type 4, and other cryptic buzzwords](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4) +- [Intro to zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt) +- [What are ZK-EVM L2s?](https://linea.mirror.xyz/qD18IaQ4BROn_Y40EBMTUTdJHYghUtdECscSWyMvm8M) +- [Awesome-zkEVM resources](https://github.com/LuozhuZhang/awesome-zkevm) +- [ZK-SNARKS under the hood](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [How are SNARKs possible?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) -## Weiterführende Lektüre zu ZK-Rollups {#further-reading-on-zk-rollups} +## Tutorials: Datenschutz & Zero-Knowledge auf Ethereum {#tutorials} -- [Was sind Zero-Knowledge-Rollups?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) -- [Was sind Zero-Knowledge-Rollups?](https://alchemy.com/blog/zero-knowledge-rollups) -- [Der praktische Leitfaden für Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) -- [STARKs vs. SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) -- [Was ist ein zkEVM?](https://www.alchemy.com/overviews/zkevm) -- [ZK-EVM-Typen: Ethereum-äquivalent, EVM-äquivalent, Typ 1, Typ 4 und andere kryptische Schlagwörter](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4) -- [Einführung in zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt) -- [Was sind ZK-EVM L2s?](https://linea.mirror.xyz/qD18IaQ4BROn_Y40EBMTUTdJHYghUtdECscSWyMvm8M) -- [Tolle zkEVM-Ressourcen](https://github.com/LuozhuZhang/awesome-zkevm) -- [ZK-SNARKS unter der Haube](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) -- [Wie sind SNARKs möglich?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) +- [Verwendung von Zero-Knowledge für einen geheimen Zustand](/developers/tutorials/secret-state/) _– Wie man ZK-Nachweise und Off-Chain-Serverkomponenten verwendet, um einen geheimen Spielzustand auf der Blockchain aufrechtzuerhalten._ +- [Verwendung von Stealth-Adressen](/developers/tutorials/stealth-addr/) _– Wie ERC-5564-Stealth-Adressen anonyme ETH-Transfers mithilfe kryptografischer Schlüsselableitung ermöglichen._ +- [Verwendung von Ethereum für Web2-Authentifizierung](/developers/tutorials/ethereum-for-web2-auth/) _– Wie man Ethereum-Wallet-Signaturen in SAML-basierte Web2-Authentifizierungssysteme integriert._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md index 9c397cf0aa8..5ca4b1c0655 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md @@ -1,22 +1,22 @@ --- title: Anatomie von Smart Contracts -description: "Ein tiefgreifender Einblick in die Anatomie eines Smart Contracts: Funktionen, Daten und Variablen" +description: "Ein detaillierter Blick auf die Anatomie eines Smart Contracts – die Funktionen, Daten und Variablen." lang: de --- -Ein Smart Contract ist ein Programm, das auf einer Adresse auf Ethereum läuft. Ein solcher Vertrag besteht aus Daten und Funktionen, die nach dem Erhalt einer Transaktion ausgeführt werden können. Hier ein Überblick darüber, was einen Smart Contract ausmacht. +Ein Smart Contract ist ein Programm, das unter einer Adresse auf Ethereum läuft. Sie bestehen aus Daten und Funktionen, die nach Erhalt einer Transaktion ausgeführt werden können. Hier ist ein Überblick darüber, woraus ein Smart Contract besteht. ## Voraussetzungen {#prerequisites} -Stellen Sie sicher, dass Sie sich zuerst über [Smart Contracts](/developers/docs/smart-contracts/) informiert haben. Die Informationen in diesem Dokument sind für Personen gedacht, die bereits mit Programmiersprachen wie JavaScript oder Python vertraut sind. +Stellen Sie sicher, dass Sie zuerst über [Smart Contracts](/developers/docs/smart-contracts/) gelesen haben. Dieses Dokument setzt voraus, dass Sie bereits mit Programmiersprachen wie JavaScript oder Python vertraut sind. ## Daten {#data} -Alle Vertragsdaten müssen einem Ort zugewiesen werden: entweder `storage` oder `memory`. Speicher in einem Smart Contract zu ändern ist ein kostenintensiver Prozess. Daher sollten Sie sich überlegen, wo Ihre Daten gespeichert werden sollen. +Alle Vertragsdaten müssen einem Speicherort zugewiesen werden: entweder `storage` (Speicher) oder `memory` (Arbeitsspeicher). Es ist teuer, den Speicher in einem Smart Contract zu ändern, daher müssen Sie sich überlegen, wo Ihre Daten abgelegt werden sollen. -### Speicher {#storage} +### Storage {#storage} -Gleichbleibende Daten werden als Speicher oder Storage bezeichnet und über Zustandsvariablen dargestellt. Solche Daten werden dauerhaft auf der Blockchain gespeichert. Sie müssen den Typ deklarieren, damit der Contract beim Kompilieren verfolgen kann, wie viel Speicherplatz er auf der Blockchain benötigt. +Persistente Daten werden als Storage bezeichnet und durch Zustandsvariablen (State Variables) repräsentiert. Diese Werte werden dauerhaft auf der Blockchain gespeichert. Sie müssen den Typ deklarieren, damit der Vertrag beim Kompilieren nachverfolgen kann, wie viel Speicherplatz er auf der Blockchain benötigt. ```solidity // Solidity-Beispiel @@ -27,85 +27,85 @@ contract SimpleStorage { ``` ```python -# Vyper example +# Vyper-Beispiel storedData: int128 ``` -Wenn Sie bereits Erfahrung im Programmieren in objektorientierten Sprachen haben, werden Sie wahrscheinlich mit den meisten Typen vertraut sein. Allerdings sollte Ihnen `address` neu sein, wenn Sie neu in der Ethereum-Entwicklung sind. +Wenn Sie bereits in objektorientierten Sprachen programmiert haben, werden Ihnen die meisten Typen wahrscheinlich vertraut sein. `address` sollte jedoch neu für Sie sein, wenn Sie neu in der [Ethereum](/)-Entwicklung sind. -Ein `address`-Typ kann eine Ethereum-Adresse aufnehmen, was 20 Bytes oder 160 Bits entspricht. Die Ausgabe erfolgt in hexadezimaler Schreibweise mit einem führenden 0x. +Ein `address`-Typ kann eine Ethereum-Adresse aufnehmen, was 20 Bytes oder 160 Bits entspricht. Sie wird in hexadezimaler Schreibweise mit einem führenden 0x zurückgegeben. -Andere Typen umfassen: +Weitere Typen sind: -- boolesch -- Ganzzahl -- Festkommazahlen -- Byte-Arrays mit fester Größe -- Byte-Arrays mit dynamischer Größe -- rationale und ganzzahlige Literale -- Zeichenfolgenliterale -- hexadezimale Literale -- Enums +- Boolean (Wahrheitswerte) +- Integer (Ganzzahlen) +- Fixed Point Numbers (Festkommazahlen) +- Fixed-size Byte Arrays (Byte-Arrays fester Größe) +- Dynamically sized Byte Arrays (Byte-Arrays dynamischer Größe) +- Rational and Integer Literals (Rationale und ganzzahlige Literale) +- String Literals (Zeichenketten-Literale) +- Hexadecimal Literals (Hexadezimale Literale) +- Enums (Aufzählungstypen) -Weitere Erklärungen finden Sie in folgender Dokumentation: +Für weitere Erklärungen werfen Sie einen Blick in die Dokumentation: - [Siehe Vyper-Typen](https://docs.vyperlang.org/en/v0.1.0-beta.6/types.html#value-types) - [Siehe Solidity-Typen](https://docs.soliditylang.org/en/latest/types.html#value-types) -### Speicher {#memory} +### Memory {#memory} -Werte, die nur für die Lebensdauer der Ausführung einer Vertragsfunktion gespeichert werden, werden als Memory Variables (Speichervariablen) bezeichnet. Da diese nicht dauerhaft auf der Blockchain gespeichert werden, sind sie wesentlich preiswerter. +Werte, die nur für die Lebensdauer der Ausführung einer Vertragsfunktion gespeichert werden, nennt man Memory-Variablen. Da diese nicht dauerhaft auf der Blockchain gespeichert werden, sind sie in der Nutzung viel günstiger. -Erfahren Sie in den [Solidity-Dokumenten](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack) mehr darüber, wie die EVM Daten speichert (Storage, Memory und der Stack). +Erfahren Sie mehr darüber, wie die EVM Daten speichert (Storage, Memory und der Stack) in der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack). ### Umgebungsvariablen {#environment-variables} -Zusätzlich zu den Variablen, die Sie in Ihrem Vertrag definieren, gibt es einige spezielle globale Variablen. Sie werden in erster Linie verwendet, um Informationen über die Blockchain oder aktuelle Transaktion bereitzustellen. +Zusätzlich zu den Variablen, die Sie in Ihrem Vertrag definieren, gibt es einige spezielle globale Variablen. Sie werden hauptsächlich verwendet, um Informationen über die Blockchain oder die aktuelle Transaktion bereitzustellen. Beispiele: -| **Eigenschaft** | **Statusvariable** | **Beschreibung** | -| ----------------- | ------------------ | ------------------------------------------------------------ | -| `block.timestamp` | uint256 | Aktueller Zeitstempel der Block-Epoche | -| `msg.sender` | address | Absender der Nachricht (aktueller Aufruf) | +| **Eigenschaft** | **Zustandsvariable** | **Beschreibung** | +| ----------------- | -------------------- | ---------------------------------------------- | +| `block.timestamp` | uint256 | Aktueller Block-Epochen-Zeitstempel | +| `msg.sender` | address | Absender der Nachricht (aktueller Aufruf) | ## Funktionen {#functions} -Vereinfacht gesagt können Funktionen als Antwort auf eingehende Transaktionen Informationen erhalten oder festlegen. +Vereinfacht gesagt können Funktionen als Reaktion auf eingehende Transaktionen Informationen abrufen oder festlegen. -Es gibt zwei Arten von Functionsaufrufen: +Es gibt zwei Arten von Funktionsaufrufen: - `internal` – diese erzeugen keinen EVM-Aufruf - - Auf interne Funktionen und Zustandsvariablen kann nur intern zugegriffen werden (d. h. aus dem aktuellen Vertrag oder von ihm abgeleiteten Verträgen) + - Auf interne Funktionen und Zustandsvariablen kann nur intern zugegriffen werden (d. h. aus dem aktuellen Vertrag oder aus Verträgen, die davon abgeleitet sind). - `external` – diese erzeugen einen EVM-Aufruf - - Externe Funktionen sind Teil der Vertragsschnittstelle. Das bedeutet, dass sie aus anderen Verträgen und über Transaktionen aufgerufen werden können. Eine externe Funktion `f` kann nicht intern aufgerufen werden (d. h. `f()` funktioniert nicht, aber `this.f()` funktioniert). + - Externe Funktionen sind Teil der Vertragsschnittstelle, was bedeutet, dass sie von anderen Verträgen und über Transaktionen aufgerufen werden können. Eine externe Funktion `f` kann nicht intern aufgerufen werden (d. h. `f()` funktioniert nicht, aber `this.f()` funktioniert). -Sie können auch `public` oder `private` sein +Sie können auch `public` oder `private` sein: -- `public`-Funktionen können intern aus dem Vertrag heraus oder extern über Nachrichten aufgerufen werden -- `private`-Funktionen sind nur für den Vertrag sichtbar, in dem sie definiert sind, und nicht in abgeleiteten Verträgen +- `public`-Funktionen können intern aus dem Vertrag heraus oder extern über Nachrichten aufgerufen werden. +- `private`-Funktionen sind nur für den Vertrag sichtbar, in dem sie definiert sind, und nicht in abgeleiteten Verträgen. -Sowohl Funktionen als auch Statusvariablen können öffentlich oder privat gemacht werden. +Sowohl Funktionen als auch Zustandsvariablen können öffentlich (public) oder privat (private) gemacht werden. -Hier ist eine Funktion zum Aktualisieren einer Zustandsvariable für einen Smart Contract: +Hier ist eine Funktion zum Aktualisieren einer Zustandsvariablen in einem Vertrag: ```solidity -// Solidity example +// Solidity-Beispiel function update_name(string value) public { dapp_name = value; } ``` - Der Parameter `value` vom Typ `string` wird an die Funktion übergeben: `update_name` -- Sie ist als `public` deklariert, was bedeutet, dass jeder darauf zugreifen kann -- Sie ist nicht als `view` deklariert, sodass sie den Vertragszustand ändern kann +- Sie ist als `public` deklariert, was bedeutet, dass jeder darauf zugreifen kann. +- Sie ist nicht als `view` deklariert, kann also den Vertragszustand ändern. ### View-Funktionen {#view-functions} -Diese Funktionen verpflichten sich, den Zustand der Vertragsdaten nicht zu ändern. Gängige Beispiele sind "Getter"-Funktionen, mit denen Sie z. B. den Kontostand eines Benutzers abfragen können. +Diese Funktionen versprechen, den Zustand der Vertragsdaten nicht zu verändern. Häufige Beispiele sind "Getter"-Funktionen – Sie könnten diese beispielsweise verwenden, um das Guthaben eines Benutzers abzurufen. ```solidity -// Solidity example +// Solidity-Beispiel function balanceOf(address _owner) public view returns (uint256 _balance) { return ownerPizzaCount[_owner]; } @@ -120,36 +120,36 @@ def readName() -> string: return dappName ``` -Folgende Vorgänge werden als Modifikation des Zustands angesehen: +Was als Änderung des Zustands gilt: -1. In Zustandsvariablen schreiben -2. [Auslösen von Ereignissen](https://docs.soliditylang.org/en/v0.7.0/contracts.html#events). +1. Schreiben in Zustandsvariablen. +2. [Ausgeben von Ereignissen (Events)](https://docs.soliditylang.org/en/v0.7.0/contracts.html#events). 3. [Erstellen anderer Verträge](https://docs.soliditylang.org/en/v0.7.0/control-structures.html#creating-contracts). -4. Verwenden von `selfdestruct`. -5. Ether über Aufrufe senden -6. Aufrufen von Funktionen, die nicht als `view` oder `pure` markiert sind. -7. Low-Level-Aufrufe verwenden -8. Inline-Assembly verwenden, die bestimmte Opcodes enthält +4. Verwendung von `selfdestruct`. +5. Senden von Ether über Aufrufe (Calls). +6. Aufrufen einer Funktion, die nicht als `view` oder `pure` markiert ist. +7. Verwendung von Low-Level-Aufrufen. +8. Verwendung von Inline-Assembly, das bestimmte Opcodes enthält. ### Konstruktor-Funktionen {#constructor-functions} -`constructor`-Funktionen werden nur einmal ausgeführt, wenn der Vertrag zum ersten Mal bereitgestellt wird. Ähnlich wie der `constructor` in vielen klassenbasierten Programmiersprachen initialisieren diese Funktionen oft Zustandsvariablen mit ihren angegebenen Werten. +`constructor`-Funktionen werden nur einmal ausgeführt, wenn der Vertrag zum ersten Mal bereitgestellt wird. Wie der `constructor` in vielen klassenbasierten Programmiersprachen initialisieren diese Funktionen oft Zustandsvariablen auf ihre angegebenen Werte. ```solidity // Solidity-Beispiel -// Initialisiert die Vertragsdaten und setzt den `owner` +// Initialisiert die Daten des Vertrags und setzt den `owner` // auf die Adresse des Vertragserstellers. constructor() public { // Alle Smart Contracts sind auf externe Transaktionen angewiesen, um ihre Funktionen auszulösen. - // `msg` ist eine globale Variable, die relevante Daten über die jeweilige Transaktion enthält, - // wie z. B. die Adresse des Absenders und den in der Transaktion enthaltenen ETH-Wert. + // `msg` ist eine globale Variable, die relevante Daten zur jeweiligen Transaktion enthält, + // wie die Adresse des Absenders und den in der Transaktion enthaltenen ETH-Wert. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties owner = msg.sender; } ``` ```python -# Vyper example +# Vyper-Beispiel @external def __init__(_beneficiary: address, _bidding_time: uint256): @@ -158,23 +158,23 @@ def __init__(_beneficiary: address, _bidding_time: uint256): self.auctionEnd = self.auctionStart + _bidding_time ``` -### Integrierte Funktionen {#built-in-functions} +### Eingebaute Funktionen {#built-in-functions} -Zusätzlich zu den Variablen, die Sie in Ihrem Vertrag definieren, gibt es einige spezielle integrierte Funktionen. Das offensichtlichste Beispiel ist: +Zusätzlich zu den Variablen und Funktionen, die Sie in Ihrem Vertrag definieren, gibt es einige spezielle eingebaute Funktionen. Das offensichtlichste Beispiel ist: - `address.send()` – Solidity - `send(address)` – Vyper -Diese erlauben es Smart Contracts, ETH an andere Konten zu senden. +Diese ermöglichen es Verträgen, ETH an andere Konten zu senden. -## Schreiben von Funktionen {#writing-functions} +## Funktionen schreiben {#writing-functions} -Ihre Funktion benötigt folgende Elemente: +Ihre Funktion benötigt: -- Parametervariable und -typ (wenn Parameter akzeptiert werden) -- interne/externe Deklaration +- Parametervariable und Typ (wenn sie Parameter akzeptiert) +- Deklaration von internal/external - Deklaration von pure/view/payable -- Gibt den Typ zurück (wenn er einen Wert zurückgibt) +- Rückgabetyp (wenn sie einen Wert zurückgibt) ```solidity pragma solidity >=0.4.0 <=0.6.0; @@ -184,7 +184,7 @@ contract ExampleDapp { // Wird aufgerufen, wenn der Vertrag bereitgestellt wird, und initialisiert den Wert constructor() public { - dapp_name = "Meine Beispiel-Dapp"; + dapp_name = "My Example dapp"; } // Get-Funktion @@ -199,26 +199,26 @@ contract ExampleDapp { } ``` -Ein vollständiger Smart Contract könnte so aussehen. Hier liefert die `constructor`-Funktion einen Anfangswert für die Variable `dapp_name`. +Ein vollständiger Vertrag könnte in etwa so aussehen. Hier liefert die `constructor`-Funktion einen Anfangswert für die Variable `dapp_name`. ## Ereignisse und Protokolle {#events-and-logs} -Ereignisse ermöglichen es Ihrem Smart Contract, mit Ihrem Frontend oder anderen abonnierenden Anwendungen zu kommunizieren. Sobald eine Transaktion validiert und einem Block hinzugefügt wurde, können Smart Contracts Ereignisse auslösen und Informationen protokollieren, die das Frontend dann verarbeiten und nutzen kann. +Ereignisse (Events) ermöglichen es Ihrem Smart Contract, mit Ihrem Frontend oder anderen abonnierenden Anwendungen zu kommunizieren. Sobald eine Transaktion validiert und einem Block hinzugefügt wurde, können Smart Contracts Ereignisse ausgeben und Informationen protokollieren, die das Frontend dann verarbeiten und nutzen kann. ## Kommentierte Beispiele {#annotated-examples} -Das sind einige Beispiele in Solidity. Wenn Sie mit dem Code experimentieren möchten, können Sie in [Remix](http://remix.ethereum.org) mit ihnen interagieren. +Dies sind einige in Solidity geschriebene Beispiele. Wenn Sie mit dem Code spielen möchten, können Sie in [Remix](http://remix.ethereum.org) mit ihnen interagieren. -### Hallo Welt {#hello-world} +### Hello World {#hello-world} ```solidity -// Gibt die Version von Solidity an und verwendet die semantische Versionierung. +// Gibt die Solidity-Version unter Verwendung semantischer Versionierung an. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma pragma solidity ^0.5.10; -// Definiert einen Vertrag mit dem Namen `HelloWorld`. +// 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. +// Sobald er bereitgestellt ist, 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 { @@ -229,17 +229,17 @@ contract HelloWorld { 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. + // eine spezielle Funktion, die nur bei der Vertragserstellung 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) public { - // Akzeptiert ein Zeichenfolgen-Argument `initMessage` und setzt den Wert - // in die `message`-Speichervariable des Vertrags). + // Akzeptiert ein String-Argument `initMessage` und setzt den Wert + // in die Speichervariable `message` des Vertrags). message = initMessage; } - // Eine öffentliche Funktion, die ein Zeichenfolgen-Argument akzeptiert - // und die `message`-Speichervariable aktualisiert. + // Eine öffentliche Funktion, die ein String-Argument akzeptiert + // und die Speichervariable `message` aktualisiert. function update(string memory newMessage) public { message = newMessage; } @@ -252,54 +252,54 @@ contract HelloWorld { pragma solidity ^0.5.10; contract Token { - // Eine `address` ist mit einer E-Mail-Adresse vergleichbar – sie wird verwendet, um ein Konto auf Ethereum zu identifizieren. - // Adressen können einen Smart Contract oder externe (Benutzer-)Konten darstellen. + // Eine `address` ist vergleichbar mit einer E-Mail-Adresse - sie wird verwendet, um ein Konto auf Ethereum zu identifizieren. + // Adressen können einen Smart Contract oder externe (Benutzer-)Konten repräsentieren. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/types.html#address address public owner; // Ein `mapping` ist im Wesentlichen eine Hash-Tabellen-Datenstruktur. - // Dieses `mapping` weist einer Adresse (dem Token-Inhaber) eine vorzeichenlose Ganzzahl (das Token-Guthaben) zu. + // Dieses `mapping` weist einer Adresse (dem Token-Inhaber) eine vorzeichenlose Ganzzahl (den Token-Kontostand) zu. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types mapping (address => uint) public balances; - // Ereignisse ermöglichen die Protokollierung von Aktivitäten auf der Blockchain. + // Ereignisse (Events) ermöglichen die Protokollierung von Aktivitäten auf der Blockchain. // Ethereum-Clients können auf Ereignisse lauschen, um auf Änderungen des Vertragszustands zu reagieren. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events event Transfer(address from, address to, uint amount); - // Initialisiert die Vertragsdaten und setzt den `owner` + // Initialisiert die Daten des Vertrags und setzt den `owner` // auf die Adresse des Vertragserstellers. constructor() public { // Alle Smart Contracts sind auf externe Transaktionen angewiesen, um ihre Funktionen auszulösen. - // `msg` ist eine globale Variable, die relevante Daten über die jeweilige Transaktion enthält, - // wie z. B. die Adresse des Absenders und den in der Transaktion enthaltenen ETH-Wert. + // `msg` ist eine globale Variable, die relevante Daten zur jeweiligen Transaktion enthält, + // wie die Adresse des Absenders und den in der Transaktion enthaltenen ETH-Wert. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties owner = msg.sender; } - // Erstellt eine Menge neuer Tokens und sendet sie an eine Adresse. + // Erstellt eine Menge neuer Token und sendet sie an eine Adresse. function mint(address receiver, uint amount) public { - // `require` ist eine Kontrollstruktur, die zur Durchsetzung bestimmter Bedingungen verwendet wird. - // Wenn eine `require`-Anweisung zu `false` ausgewertet wird, wird eine Ausnahme ausgelöst, - // die alle während des aktuellen Aufrufs am Zustand vorgenommenen Änderungen rückgängig macht. + // `require` ist eine Kontrollstruktur, die verwendet wird, um bestimmte Bedingungen zu erzwingen. + // Wenn eine `require`-Anweisung als `false` ausgewertet wird, wird eine Ausnahme ausgelöst, + // die alle Änderungen rückgängig macht, die während des aktuellen Aufrufs am Zustand vorgenommen wurden. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions - // Nur der Vertragsinhaber kann diese Funktion aufrufen - require(msg.sender == owner, "Sie sind nicht der Inhaber."); + // Nur der Vertragseigentümer kann diese Funktion aufrufen + require(msg.sender == owner, "You are not the owner."); - // Erzwingt eine maximale Menge an Tokens - require(amount < 1e60, "Maximale Emission überschritten"); + // Erzwingt eine maximale Menge an Token + require(amount < 1e60, "Maximum issuance exceeded"); - // Erhöht das Guthaben von `receiver` um `amount` + // Erhöht den Kontostand von `receiver` um `amount` balances[receiver] += amount; } - // Sendet eine Menge bestehender Tokens von einem beliebigen Aufrufer an eine Adresse. + // Sendet eine Menge existierender Token von einem beliebigen Aufrufer an eine Adresse. function transfer(address receiver, uint amount) public { - // Der Absender muss über genügend Tokens verfügen, um sie zu senden - require(amount <= balances[msg.sender], "Ungenügendes Guthaben."); + // Der Absender muss genügend Token zum Senden haben + require(amount <= balances[msg.sender], "Insufficient balance."); - // Passt die Token-Guthaben der beiden Adressen an + // Passt die Token-Kontostände der beiden Adressen an balances[msg.sender] -= amount; balances[receiver] += amount; @@ -332,13 +332,13 @@ contract CryptoPizza is IERC721, ERC165 { using SafeMath for uint256; // Konstante Zustandsvariablen in Solidity sind ähnlich wie in anderen Sprachen, - // aber Sie müssen sie aus einem Ausdruck zuweisen, der zur Kompilierungszeit konstant ist. + // aber Sie müssen aus einem Ausdruck zuweisen, der zur Kompilierzeit konstant ist. // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables uint256 constant dnaDigits = 10; uint256 constant dnaModulus = 10 ** dnaDigits; bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; - // Mit Struct-Typen können Sie Ihren eigenen Typ definieren + // Struct-Typen ermöglichen es Ihnen, Ihren eigenen Typ zu definieren // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs struct Pizza { string name; @@ -348,32 +348,32 @@ contract CryptoPizza is IERC721, ERC165 { // Erstellt ein leeres Array von Pizza-Structs Pizza[] public pizzas; - // Mapping von der Pizza-ID zur Adresse ihres Besitzers + // Mapping von der Pizza-ID zur Adresse ihres Eigentümers mapping(uint256 => address) public pizzaToOwner; - // Mapping von der Adresse des Besitzers zur Anzahl der besessenen Tokens + // Mapping von der Adresse des Eigentümers zur Anzahl der besessenen Token mapping(address => uint256) public ownerPizzaCount; // Mapping von der Token-ID zur genehmigten Adresse mapping(uint256 => address) pizzaApprovals; - // Sie können Mappings verschachteln, dieses Beispiel bildet Besitzer auf Betreibergenehmigungen ab + // Sie können Mappings verschachteln, dieses Beispiel mappt Eigentümer auf Operator-Genehmigungen mapping(address => mapping(address => bool)) private operatorApprovals; - // Interne Funktion zum Erstellen einer zufälligen Pizza aus einer Zeichenfolge (Name) und DNA + // Interne Funktion, um eine zufällige Pizza aus einem String (Name) und DNA zu erstellen function _createPizza(string memory _name, uint256 _dna) - // Das Schlüsselwort `internal` bedeutet, dass diese Funktion nur - // innerhalb dieses Vertrags und von Verträgen, die von diesem Vertrag abgeleitet sind, sichtbar ist + // Das Schlüsselwort `internal` bedeutet, dass diese Funktion nur sichtbar ist + // innerhalb dieses Vertrags und Verträgen, die von diesem Vertrag abgeleitet sind // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters internal - // `isUnique` ist ein Funktionsmodifikator, der prüft, ob die Pizza bereits existiert + // `isUnique` ist ein Funktionsmodifikator, der überprüft, ob die Pizza bereits existiert // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers isUnique(_name, _dna) { - // Fügt Pizza zum Array von Pizzen hinzu und erhält die ID + // Fügt Pizza zum Array von Pizzen hinzu und ruft die ID ab uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1); - // Überprüft, ob der Pizzabesitzer mit dem aktuellen Benutzer identisch ist + // Überprüft, ob der Pizza-Eigentümer derselbe wie der aktuelle Benutzer ist // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions // beachten Sie, dass address(0) die Null-Adresse ist, @@ -381,7 +381,7 @@ contract CryptoPizza is IERC721, ERC165 { assert(pizzaToOwner[id] == address(0)); - // Ordnet die Pizza dem Besitzer zu + // Mappt die Pizza auf den Eigentümer pizzaToOwner[id] = msg.sender; ownerPizzaCount[msg.sender] = SafeMath.add( ownerPizzaCount[msg.sender], @@ -389,31 +389,31 @@ contract CryptoPizza is IERC721, ERC165 { ); } - // Erstellt eine zufällige Pizza aus einer Zeichenfolge (Name) + // Erstellt eine zufällige Pizza aus einem String (Name) function createRandomPizza(string memory _name) public { uint256 randDna = generateRandomDna(_name, msg.sender); _createPizza(_name, randDna); } - // Erzeugt eine zufällige DNA aus einer Zeichenfolge (Name) und der Adresse des Besitzers (Erstellers) + // Generiert zufällige DNA aus einem String (Name) und der Adresse des Eigentümers (Erstellers) function generateRandomDna(string memory _str, address _owner) public - // Funktionen, die als `pure` markiert sind, versprechen, den Zustand weder zu lesen noch zu verändern + // Als `pure` markierte Funktionen versprechen, den Zustand weder zu lesen noch zu ändern // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions pure returns (uint256) { - // Erzeugt eine zufällige uint aus einer Zeichenfolge (Name) + Adresse (Besitzer) + // Generiert einen zufälligen uint aus String (Name) + Adresse (Eigentümer) uint256 rand = uint256(keccak256(abi.encodePacked(_str))) + uint256(_owner); rand = rand % dnaModulus; return rand; } - // Gibt ein Array von Pizzen zurück, die nach Besitzer gefunden wurden + // Gibt ein Array von Pizzen zurück, die vom Eigentümer gefunden wurden function getPizzasByOwner(address _owner) public - // Funktionen, die als `view` markiert sind, versprechen, den Zustand nicht zu verändern + // Als `view` markierte Funktionen versprechen, den Zustand nicht zu ändern // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions view returns (uint256[] memory) @@ -432,29 +432,35 @@ contract CryptoPizza is IERC721, ERC165 { return result; } - // Überträgt Pizza und Besitz an eine andere Adresse + // Überträgt Pizza und Eigentum an eine andere Adresse function transferFrom(address _from, address _to, uint256 _pizzaId) public { - require(_from != address(0) && _to != address(0), "Ungültige Adresse."); - require(_exists(_pizzaId), "Pizza existiert nicht."); - require(_from != _to, "Kann nicht an dieselbe Adresse übertragen werden."); - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Adresse ist nicht genehmigt."); + require(_from != address(0) && _to != address(0), "Invalid address."); + require(_exists(_pizzaId), "Pizza does not exist."); + require(_from != _to, "Cannot transfer to the same address."); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1); ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1); pizzaToOwner[_pizzaId] = _to; - // Löst ein Ereignis aus, das im importierten IERC721-Vertrag definiert ist + // Löst das im importierten IERC721-Vertrag definierte Ereignis aus emit Transfer(_from, _to, _pizzaId); _clearApproval(_to, _pizzaId); } - /** - * Überträgt den Besitz einer bestimmten Token-ID sicher an eine andere Adresse + /* * + * Überträgt sicher das Eigentum einer bestimmten Token-ID an eine andere Adresse * Wenn die Zieladresse ein Vertrag ist, muss sie `onERC721Received` implementieren, * was bei einer sicheren Übertragung aufgerufen wird, und den magischen Wert * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` zurückgeben; - * andernfalls wird die Übertragung rückgängig gemacht. - */ + * andernfalls wird die Übertragung rückgängig gemacht. */ + + + + + + + function safeTransferFrom(address from, address to, uint256 pizzaId) public { @@ -462,13 +468,19 @@ contract CryptoPizza is IERC721, ERC165 { this.safeTransferFrom(from, to, pizzaId, ""); } - /** - * Überträgt den Besitz einer bestimmten Token-ID sicher an eine andere Adresse + /* * + * Überträgt sicher das Eigentum einer bestimmten Token-ID an eine andere Adresse * Wenn die Zieladresse ein Vertrag ist, muss sie `onERC721Received` implementieren, * was bei einer sicheren Übertragung aufgerufen wird, und den magischen Wert * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` zurückgeben; - * andernfalls wird die Übertragung rückgängig gemacht. - */ + * andernfalls wird die Übertragung rückgängig gemacht. */ + + + + + + + function safeTransferFrom( address from, address to, @@ -476,13 +488,16 @@ contract CryptoPizza is IERC721, ERC165 { bytes memory _data ) public { this.transferFrom(from, to, pizzaId); - require(_checkOnERC721Received(from, to, pizzaId, _data), "Muss onERC721Received implementieren."); + require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received."); } - /** - * Interne Funktion zum Aufrufen von `onERC721Received` auf einer Zieladresse - * Der Aufruf wird nicht ausgeführt, wenn die Zieladresse kein Vertrag ist - */ + /* * + * Interne Funktion, um `onERC721Received` auf einer Zieladresse aufzurufen + * Der Aufruf wird nicht ausgeführt, wenn die Zieladresse kein Vertrag ist */ + + + + function _checkOnERC721Received( address from, address to, @@ -502,13 +517,13 @@ contract CryptoPizza is IERC721, ERC165 { return (retval == _ERC721_RECEIVED); } - // Verbrennt eine Pizza – zerstört den Token vollständig + // Verbrennt eine Pizza - zerstört den Token vollständig // Der Funktionsmodifikator `external` bedeutet, dass diese Funktion // Teil der Vertragsschnittstelle ist und andere Verträge sie aufrufen können function burn(uint256 _pizzaId) external { - require(msg.sender != address(0), "Ungültige Adresse."); - require(_exists(_pizzaId), "Pizza existiert nicht."); - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Adresse ist nicht genehmigt."); + require(msg.sender != address(0), "Invalid address."); + require(_exists(_pizzaId), "Pizza does not exist."); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); ownerPizzaCount[msg.sender] = SafeMath.sub( ownerPizzaCount[msg.sender], @@ -522,16 +537,16 @@ contract CryptoPizza is IERC721, ERC165 { return ownerPizzaCount[_owner]; } - // Gibt den Besitzer der Pizza zurück, die nach ID gefunden wurde + // Gibt den Eigentümer der Pizza zurück, die anhand der ID gefunden wurde function ownerOf(uint256 _pizzaId) public view returns (address _owner) { address owner = pizzaToOwner[_pizzaId]; - require(owner != address(0), "Ungültige Pizza-ID."); + require(owner != address(0), "Invalid Pizza ID."); return owner; } - // Genehmigt eine andere Adresse, um den Besitz der Pizza zu übertragen + // Genehmigt einer anderen Adresse, das Eigentum an der Pizza zu übertragen function approve(address _to, uint256 _pizzaId) public { - require(msg.sender == pizzaToOwner[_pizzaId], "Muss der Pizzabesitzer sein."); + require(msg.sender == pizzaToOwner[_pizzaId], "Must be the Pizza owner."); pizzaApprovals[_pizzaId] = _to; emit Approval(msg.sender, _to, _pizzaId); } @@ -542,33 +557,38 @@ contract CryptoPizza is IERC721, ERC165 { view returns (address operator) { - require(_exists(_pizzaId), "Pizza existiert nicht."); + require(_exists(_pizzaId), "Pizza does not exist."); return pizzaApprovals[_pizzaId]; } - /** - * Private Funktion, um die aktuelle Genehmigung für eine bestimmte Token-ID zu löschen - * Macht die Aktion rückgängig, wenn die angegebene Adresse nicht tatsächlich der Besitzer des Tokens ist - */ + /* * + * Private Funktion, um die aktuelle Genehmigung einer bestimmten Token-ID zu löschen + * Wird rückgängig gemacht, wenn die angegebene Adresse nicht tatsächlich der Eigentümer des Tokens ist */ + + + + function _clearApproval(address owner, uint256 _pizzaId) private { - require(pizzaToOwner[_pizzaId] == owner, "Muss Pizzabesitzer sein."); - require(_exists(_pizzaId), "Pizza existiert nicht."); + require(pizzaToOwner[_pizzaId] == owner, "Must be pizza owner."); + require(_exists(_pizzaId), "Pizza does not exist."); if (pizzaApprovals[_pizzaId] != address(0)) { pizzaApprovals[_pizzaId] = address(0); } } - /* - * Setzt oder hebt die Genehmigung eines bestimmten Betreibers auf - * Ein Betreiber darf alle Tokens des Absenders in dessen Namen übertragen - */ + /* * Setzt oder hebt die Genehmigung eines bestimmten Operators auf + * Ein Operator darf alle Token des Absenders in dessen Namen übertragen */ + + + + function setApprovalForAll(address to, bool approved) public { - require(to != msg.sender, "Eigene Adresse kann nicht genehmigt werden"); + require(to != msg.sender, "Cannot approve own address"); operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } - // Gibt an, ob ein Betreiber von einem bestimmten Besitzer genehmigt ist + // Gibt an, ob ein Operator von einem bestimmten Eigentümer genehmigt ist function isApprovedForAll(address owner, address operator) public view @@ -577,27 +597,27 @@ contract CryptoPizza is IERC721, ERC165 { return operatorApprovals[owner][operator]; } - // Übernimmt den Besitz der Pizza – nur für genehmigte Benutzer + // Übernimmt das Eigentum an der Pizza - nur für genehmigte Benutzer function takeOwnership(uint256 _pizzaId) public { - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Adresse ist nicht genehmigt."); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); address owner = this.ownerOf(_pizzaId); this.transferFrom(owner, msg.sender, _pizzaId); } - // Prüft, ob Pizza existiert + // Überprüft, ob die Pizza existiert function _exists(uint256 pizzaId) internal view returns (bool) { address owner = pizzaToOwner[pizzaId]; return owner != address(0); } - // Prüft, ob die Adresse der Besitzer ist oder für die Übertragung der Pizza genehmigt ist + // Überprüft, ob die Adresse der Eigentümer ist oder genehmigt ist, die Pizza zu übertragen function _isApprovedOrOwner(address spender, uint256 pizzaId) internal view returns (bool) { address owner = pizzaToOwner[pizzaId]; - // Deaktiviere die Solium-Prüfung wegen + // Deaktiviert die Solium-Prüfung wegen // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return (spender == owner || @@ -605,7 +625,7 @@ contract CryptoPizza is IERC721, ERC165 { this.isApprovedForAll(owner, spender)); } - // Prüfen, ob die Pizza einzigartig ist und noch nicht existiert + // Überprüft, ob die Pizza einzigartig ist und noch nicht existiert modifier isUnique(string memory _name, uint256 _dna) { bool result = true; for (uint256 i = 0; i < pizzas.length; i++) { @@ -617,18 +637,18 @@ contract CryptoPizza is IERC721, ERC165 { result = false; } } - require(result, "Pizza mit diesem Namen existiert bereits."); + require(result, "Pizza with such name already exists."); _; } // Gibt zurück, ob die Zieladresse ein Vertrag ist function isContract(address account) internal view returns (bool) { uint256 size; - // Derzeit gibt es keine bessere Möglichkeit zu prüfen, ob es einen Vertrag an einer Adresse gibt, - // als die Größe des Codes an dieser Adresse zu prüfen. + // Derzeit gibt es keinen besseren Weg, um zu überprüfen, ob sich an einer Adresse ein Vertrag befindet, + // als die Größe des Codes an dieser Adresse zu überprüfen. // Siehe https://ethereum.stackexchange.com/a/14016/36603 - // für weitere Details zur Funktionsweise. - // TODO Dies vor der Serenity-Version erneut prüfen, da dann alle Adressen + // für weitere Details darüber, wie dies funktioniert. + // TODO Dies vor dem Serenity-Release noch einmal überprüfen, da dann alle Adressen // Verträge sein werden. // solium-disable-next-line security/no-inline-assembly assembly { @@ -639,9 +659,9 @@ contract CryptoPizza is IERC721, ERC165 { } ``` -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -Sehen Sie sich auch die Dokumentationen zu Solidity und Vyper an, um einen umfassenderen Überblick über Smart Contracts zu erhalten: +Sehen Sie sich die Dokumentation von Solidity und Vyper an, um einen vollständigeren Überblick über Smart Contracts zu erhalten: - [Solidity](https://docs.soliditylang.org/) - [Vyper](https://docs.vyperlang.org/en/stable/) @@ -653,6 +673,6 @@ Sehen Sie sich auch die Dokumentationen zu Solidity und Vyper an, um einen umfas ## Verwandte Tutorials {#related-tutorials} -- [Verkleinern von Verträgen, um das Vertraggrößenlimit zu bekämpfen](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Einige praktische Tipps zur Reduzierung der Größe Ihres Smart Contracts._ -- [Protokollierung von Daten aus Smart Contracts mit Ereignissen](/developers/tutorials/logging-events-smart-contracts/) _– Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Datenprotokollierung verwenden können._ -- [Mit anderen Verträgen aus Solidity interagieren](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Wie man einen Smart Contract aus einem bestehenden Vertrag bereitstellt und mit ihm interagiert._ +- [Verkleinerung von Verträgen zur Bekämpfung des Vertragslimit](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Einige praktische Tipps zur Reduzierung der Größe Ihres Smart Contracts._ +- [Protokollieren von Daten aus Smart Contracts mit Ereignissen](/developers/tutorials/logging-events-smart-contracts/) _– Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Protokollierung von Daten verwenden können._ +- [Interaktion mit anderen Verträgen aus Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Wie man einen Smart Contract aus einem bestehenden Vertrag bereitstellt und mit ihm interagiert._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md index f3ec0322ec6..b8768a03c7a 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md @@ -1,19 +1,19 @@ --- -title: Smart Contracts erstellen -description: "Eine Erklärung, warum Sie Smart Contracts kompilieren müssen und was bei der Kompilierung tatsächlich passiert" +title: Kompilieren von Smart Contracts +description: "Eine Erklärung, warum Sie Smart Contracts kompilieren müssen und was die Kompilierung eigentlich bewirkt." lang: de incomplete: true --- -Sie müssen Ihren Smart Contract so kompilieren, dass Ihre Web-App und die Ethereum-Virtual Machine (EVM) diesen verstehen können. +Sie müssen Ihren Vertrag kompilieren, damit Ihre Web-App und die Ethereum Virtual Machine (EVM) ihn verstehen können. ## Voraussetzungen {#prerequisites} -Es könnte hilfreich sein, unsere Einführung zu [Smart Contracts](/developers/docs/smart-contracts/) und zur [Ethereum Virtual Machine](/developers/docs/evm/) zu lesen, bevor Sie sich mit dem Thema Kompilierung befassen. +Es könnte hilfreich sein, unsere Einführung zu [Smart Contracts](/developers/docs/smart-contracts/) und der [Ethereum Virtual Machine](/developers/docs/evm/) zu lesen, bevor Sie sich mit der Kompilierung befassen. ## Die EVM {#the-evm} -Damit die [EVM](/developers/docs/evm/) Ihren Vertrag ausführen kann, muss er in **Bytecode** vorliegen. Bei der Kompilierung erfolgt folgende Umwandlung – von: +Damit die [EVM](/developers/docs/evm/) Ihren Vertrag ausführen kann, muss er in **Bytecode** vorliegen. Die Kompilierung verwandelt dies: ```solidity pragma solidity 0.4.24; @@ -27,25 +27,25 @@ contract Greeter { } ``` -**zu diesem** +**in das hier** ``` PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xCFAE3217 EQ PUSH2 0x46 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B PUSH2 0xD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x48656C6C6F000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SLT 0xec 0xe 0xf5 0xf8 SLT 0xc7 0x2d STATICCALL ADDRESS SHR 0xdb COINBASE 0xb1 BALANCE 0xe8 0xf8 DUP14 0xda 0xad DUP13 LOG1 0x4c 0xb4 0x26 0xc2 DELEGATECALL PUSH7 0x8994D3E002900 ``` -Diese werden als **Operationscodes** bezeichnet. EVM-Opcodes sind die niedrigstufigen Anweisungen, die die Ethereum Virtual Machine (EVM) ausführen kann. Jeder Opcode bezeichnet eine spezifische Operation, wie etwa arithmetische Operationen, logische Operationen, Datenmanipulation, Kontrollfluss usw. +Diese werden **Opcodes** genannt. EVM-Opcodes sind die Low-Level-Anweisungen, die die Ethereum Virtual Machine (EVM) ausführen kann. Jeder Opcode repräsentiert eine spezifische Operation, wie z. B. arithmetische Operationen, logische Operationen, Datenmanipulation, Kontrollfluss usw. -[Mehr zu Operationscodes](/developers/docs/evm/opcodes/) +[Mehr zu Opcodes](/developers/docs/evm/opcodes/) ## Webanwendungen {#web-applications} -Der Compiler erzeugt außerdem die **Application Binary Interface (ABI)**, die Sie benötigen, damit Ihre Anwendung den Vertrag verstehen und dessen Funktionen aufrufen kann. +Der Compiler erstellt auch das **Application Binary Interface (ABI)**, das Sie benötigen, damit Ihre Anwendung den Vertrag versteht und die Funktionen des Vertrags aufrufen kann. -Die ABI ist eine JSON-Datei, die den eingesetzten Vertrag und seine Smart-Contract-Funktionen beschreibt. Das hilft dabei, die Lücke zwischen web2 und web3 zu überbrücken. +Das ABI ist eine JSON-Datei, die den bereitgestellten Vertrag und seine Smart Contract-Funktionen beschreibt. Dies hilft, die Lücke zwischen Web2 und Web3 zu schließen. -Eine [JavaScript-Client-Bibliothek](/developers/docs/apis/javascript/) liest die **ABI**, damit Sie Ihren Smart Contract in der Benutzeroberfläche Ihrer Web-App aufrufen können. +Eine [JavaScript-Client-Bibliothek](/developers/docs/apis/javascript/) liest das **ABI**, damit Sie Ihren Smart Contract in der Benutzeroberfläche Ihrer Web-App aufrufen können. -Unten ist die ABI für den ERC-20-Token-Contract. Ein ERC-20 ist ein Tokenstandard, den Sie auf Ethereum handeln können. +Unten sehen Sie das ABI für den ERC-20-Token-Vertrag. Ein ERC-20 ist ein Token, den Sie auf Ethereum handeln können. ```json [ @@ -272,11 +272,11 @@ Unten ist die ABI für den ERC-20-Token-Contract. Ein ERC-20 ist ein Tokenstanda ] ``` -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [ABI-Spezifikation](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ ## Verwandte Themen {#related-topics} - [JavaScript-Client-Bibliotheken](/developers/docs/apis/javascript/) -- [Ethereum Virtual Machine](/developers/docs/evm/) +- [Ethereum Virtual Machine](/developers/docs/evm/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/composability/index.md b/public/content/translations/de/developers/docs/smart-contracts/composability/index.md index c544a79b1fc..9eb528dd9d6 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/composability/index.md @@ -1,76 +1,76 @@ --- -title: Smart-Contract-Kombinierbarkeit -description: "Erfahren Sie, wie Smart Contracts wie Legosteine ​​kombiniert werden können, um durch die Wiederverwendung vorhandener Komponenten komplexe Dapps zu erstellen." +title: Zusammensetzbarkeit von Smart Contracts +description: "Erfahren Sie, wie Smart Contracts wie Legosteine kombiniert werden können, um komplexe Dapps durch die Wiederverwendung bestehender Komponenten zu erstellen." lang: de incomplete: true --- ## Eine kurze Einführung {#a-brief-introduction} -Smart Contracts sind auf Ethereum öffentlich. Sie können sie sich als offene APIs vorstellen. Sie müssen nicht unbedingt Ihren eigenen Smart Contract schreiben, um ein dApp-Entwickler zu werden, sondern nur wissen, wie Sie mit Smart Contracts interagieren können. Zum Beispiel können Sie die bestehenden Smart Contracts von [Uniswap](https://uniswap.exchange/swap), einer dezentralen Börse, verwenden, um die gesamte Token-Tausch-Logik in Ihrer App zu handhaben – Sie müssen nicht bei Null anfangen. Sehen Sie sich einige ihrer [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts)- und [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts)-Contracts an. +Smart Contracts sind auf Ethereum öffentlich und können als offene APIs betrachtet werden. Sie müssen keinen eigenen Smart Contract schreiben, um ein Dapp-Entwickler zu werden, Sie müssen nur wissen, wie man mit ihnen interagiert. Zum Beispiel können Sie die bestehenden Smart Contracts von [Uniswap](https://uniswap.exchange/swap), einer dezentralisierten Börse, verwenden, um die gesamte Token-Tausch-Logik in Ihrer Anwendung zu handhaben – Sie müssen nicht bei null anfangen. Sehen Sie sich einige ihrer [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts)- und [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts)-Verträge an. ## Was ist Zusammensetzbarkeit? {#what-is-composability} -Zusammensetzbarkeit ist die Kombination verschiedener Komponenten zur Schaffung neuer Systeme oder Ergebnisse. In der Softwareentwicklung bedeutet Zusammensetzbarkeit, dass Entwickler vorhandene Softwarekomponenten wiederverwenden können, um neue Anwendungen zu erstellen. Um die Zusammensetzbarkeit zu verstehen, stellen Sie sich einfach zusammensetzbare Elemente als Legosteine vor. Jeder Legostein kann mit einem anderen kombiniert werden, sodass Sie durch die Verbindung verschiedener Legosteine komplexe Strukturen errichten können. +Zusammensetzbarkeit (Composability) ist die Kombination verschiedener Komponenten, um neue Systeme oder Ergebnisse zu schaffen. In der Softwareentwicklung bedeutet Zusammensetzbarkeit, dass Entwickler bestehende Softwarekomponenten wiederverwenden können, um neue Anwendungen zu erstellen. Ein guter Weg, um Zusammensetzbarkeit zu verstehen, ist, sich zusammensetzbare Elemente als Legosteine vorzustellen. Jeder Legostein kann mit einem anderen kombiniert werden, was es Ihnen ermöglicht, komplexe Strukturen durch die Kombination verschiedener Legosteine zu bauen. -Auf Ethereum ist jeder Smart Contract eine Art Legostein – Sie können Smart Contracts aus anderen Projekten als Bausteine für Ihr Projekt verwenden. Das bedeutet, dass Sie keine Zeit damit verschwenden müssen, das Rad neu zu erfinden oder von Grund auf neu zu entwickeln. +In Ethereum ist jeder Smart Contract eine Art Legostein – Sie können Smart Contracts aus anderen Projekten als Bausteine für Ihr Projekt verwenden. Das bedeutet, dass Sie keine Zeit damit verbringen müssen, das Rad neu zu erfinden oder von Grund auf neu zu bauen. ## Wie funktioniert Zusammensetzbarkeit? {#how-does-composability-work} -Ethereum-Smart-Contracts sind wie öffentliche APIs, d. h. jeder kann mit dem Vertrag interagieren oder sie in DApps integrieren, um zusätzliche Funktionen zu erhalten. Die Zusammensetzbarkeit von Smart Contracts beruht im Allgemeinen auf drei Prinzipien: Modularität, Autonomie und Auffindbarkeit: +Ethereum-Smart-Contracts sind wie öffentliche APIs, sodass jeder mit dem Vertrag interagieren oder ihn in Dapps für zusätzliche Funktionalität integrieren kann. Die Zusammensetzbarkeit von Smart Contracts basiert im Allgemeinen auf drei Prinzipien: Modularität, Autonomie und Auffindbarkeit: -\*\*1. **Modularität**: Dies ist die Fähigkeit einzelner Komponenten, eine bestimmte Aufgabe zu erfüllen. Auf Ethereum verfügt jeder Smart Contract über einen bestimmten Anwendungsfall (wie im Beispiel von Uniswap gezeigt). +**1. Modularität**: Dies ist die Fähigkeit einzelner Komponenten, eine bestimmte Aufgabe auszuführen. In Ethereum hat jeder Smart Contract einen spezifischen Anwendungsfall (wie im Uniswap-Beispiel gezeigt). -\*\*2. **Autonomie**: Zusammensetzbare Komponenten müssen in der Lage sein, unabhängig voneinander zu arbeiten. Jeder Smart Contract in Ethereum ist selbstausführend und kann betrieben werden, ohne auf andere Teile des Systems angewiesen zu sein. +**2. Autonomie**: Zusammensetzbare Komponenten müssen in der Lage sein, unabhängig zu arbeiten. Jeder Smart Contract in Ethereum ist selbstausführend und kann funktionieren, ohne sich auf andere Teile des Systems zu verlassen. -\*\*3. **Auffindbarkeit**: Entwickler können keine externen Verträge aufrufen oder Softwarebibliotheken in Anwendungen integrieren, wenn Erstere nicht öffentlich zugänglich sind. Smart Contracts sind bewusst als Open-Source-Software konzipiert, d. h. jeder kann einen Smart Contract aufrufen oder eine Codebasis abspalten. +**3. Auffindbarkeit**: Entwickler können keine externen Verträge aufrufen oder Softwarebibliotheken in Anwendungen integrieren, wenn erstere nicht öffentlich verfügbar sind. Smart Contracts sind von Natur aus Open-Source; jeder kann einen Smart Contract aufrufen oder eine Codebasis forken. ## Vorteile der Zusammensetzbarkeit {#benefits-of-composability} ### Kürzerer Entwicklungszyklus {#shorter-development-cycle} -Zusammensetzbarkeit reduziert den Arbeitsaufwand, den Entwickler bei der Erstellung von [Dapps](/apps/#what-are-dapps) haben. [Wie Naval Ravikant es ausdrückt:](https://twitter.com/naval/status/1444366754650656770) „Open-Source bedeutet, dass jedes Problem nur einmal gelöst werden muss.“ +Zusammensetzbarkeit reduziert die Arbeit, die Entwickler bei der Erstellung von [Dapps](/apps/#what-are-dapps) leisten müssen. [Wie Naval Ravikant es ausdrückt:](https://twitter.com/naval/status/1444366754650656770) „Open Source bedeutet, dass jedes Problem nur einmal gelöst werden muss.“ -Wenn es einen Smart Contract gibt, der ein Problem löst, können andere Entwickler ihn wiederverwenden, damit sie nicht das gleiche Problem lösen müssen. Auf diese Weise können Entwickler bestehenden Softwarebibliotheken zusätzliche Funktionen hinzufügen, um neue DApps zu erstellen. +Wenn es einen Smart Contract gibt, der ein Problem löst, können andere Entwickler ihn wiederverwenden, sodass sie nicht dasselbe Problem lösen müssen. Auf diese Weise können Entwickler bestehende Softwarebibliotheken nehmen und zusätzliche Funktionalität hinzufügen, um neue Dapps zu erstellen. ### Größere Innovation {#greater-innovation} -Die Zusammensetzbarkeit fördert Innovationen und Experimentierfreude, da es den Entwicklern freisteht, Open-Source-Code wiederzuverwenden, abzuändern, zu vervielfältigen oder zu integrieren, um die gewünschten Ergebnisse zu erzielen. Infolgedessen verbringen die Entwicklungsteams weniger Zeit mit der grundlegenden Funktionalität und können mehr Zeit für das Experimentieren mit neuen Funktionen aufwenden. +Zusammensetzbarkeit fördert Innovation und Experimentierfreudigkeit, da Entwickler frei sind, Open-Source-Code wiederzuverwenden, zu modifizieren, zu duplizieren oder zu integrieren, um die gewünschten Ergebnisse zu erzielen. Infolgedessen verbringen Entwicklungsteams weniger Zeit mit grundlegenden Funktionen und können mehr Zeit für das Experimentieren mit neuen Funktionen aufwenden. ### Bessere Benutzererfahrung {#better-user-experience} -Die Interoperabilität zwischen den Komponenten des Ethereum-Ökosystems verbessert das Benutzererlebnis. Wenn DApps externe Smart Contracts integrieren, können die Benutzer auf mehr Funktionen zugreifen als in einem fragmentierten Ökosystem, in dem Anwendungen nicht miteinander kommunizieren können. +Die Interoperabilität zwischen den Komponenten des Ethereum-Ökosystems verbessert die Benutzererfahrung. Benutzer können auf eine größere Funktionalität zugreifen, wenn Dapps externe Smart Contracts integrieren, als in einem fragmentierten Ökosystem, in dem Anwendungen nicht kommunizieren können. -Anhand eines Beispiels aus dem Arbitrage-Handel wollen wir die Vorteile der Interoperabilität verdeutlichen: +Wir verwenden ein Beispiel aus dem Arbitrage-Handel, um die Vorteile der Interoperabilität zu veranschaulichen: -Wenn ein Token auf `Börse A` höher gehandelt wird als auf `Börse B`, können Sie sich den Preisunterschied zunutze machen, um einen Gewinn zu erzielen. Allerdings können Sie das nur tun, wenn Sie über genügend Kapital verfügen, um die Transaktion zu finanzieren (d. h. den Token von `Börse B` zu kaufen und auf `Börse A` zu verkaufen). +Wenn ein Token an `Börse A` höher gehandelt wird als an `Börse B`, können Sie den Preisunterschied nutzen, um Gewinn zu erzielen. Sie können dies jedoch nur tun, wenn Sie über genügend Kapital verfügen, um die Transaktion zu finanzieren (d. h. den Token an `Börse B` zu kaufen und an `Börse A` zu verkaufen). -In einem Szenario, in dem Sie nicht über genügend Geldmittel verfügen, um den Handel zu decken, könnte sich ein Flash Loan ideal eignen. [Flash-Loans](/defi/#flash-loans) sind sehr technisch, aber die Grundidee ist, dass Sie Assets (ohne Sicherheiten) leihen und sie innerhalb _einer einzigen_ Transaktion zurückgeben können. +In einem Szenario, in dem Sie nicht über genügend Mittel verfügen, um den Handel abzudecken, könnte ein Flash-Kredit ideal sein. [Flash-Kredite](/defi/#flash-loans) sind hochtechnisch, aber die Grundidee ist, dass Sie Vermögenswerte (ohne Sicherheiten) leihen und diese innerhalb _einer_ Transaktion zurückgeben können. -Zurück zu unserem anfänglichen Beispiel: Ein Arbitrage-Händler kann einen großen Flash-Loan aufnehmen, Tokens von `Börse B` kaufen, sie auf `Börse A` verkaufen, das Kapital + Zinsen zurückzahlen und den Gewinn innerhalb derselben Transaktion behalten. Diese komplexe Logik erfordert die Kombination von Aufrufen für mehrere Verträge, was nicht möglich wäre, wenn Smart Contracts nicht über Interoperabilität verfügen würden. +Um auf unser anfängliches Beispiel zurückzukommen: Ein Arbitrage-Händler kann einen großen Flash-Kredit aufnehmen, Token an `Börse B` kaufen, sie an `Börse A` verkaufen, das Kapital plus Zinsen zurückzahlen und den Gewinn behalten – alles innerhalb derselben Transaktion. Diese komplexe Logik erfordert die Kombination von Aufrufen an mehrere Verträge, was nicht möglich wäre, wenn es Smart Contracts an Interoperabilität mangeln würde. ## Beispiele für Zusammensetzbarkeit in Ethereum {#composability-in-ethereum} -### Token-Swaps {#token-swaps} +### Token-Tausch {#token-swaps} -Wenn Sie eine DApp erstellen, für die Transaktionen in ETH bezahlt werden müssen, können Sie den Benutzern die Zahlung in anderen ERC-20-Token erlauben, indem Sie eine Token-Tausch-Logik integrieren. Der Code wandelt den Token des Benutzers automatisch in ETH um, bevor der Vertrag die aufgerufene Funktion ausführt. +Wenn Sie eine Dapp erstellen, die erfordert, dass Transaktionen in ETH bezahlt werden, können Sie Benutzern erlauben, in anderen ERC-20-Token zu bezahlen, indem Sie eine Token-Tausch-Logik integrieren. Der Code wird den Token des Benutzers automatisch in ETH umwandeln, bevor der Vertrag die aufgerufene Funktion ausführt. ### Governance {#governance} -Die Entwicklung maßgeschneiderter Governance-Systeme für eine [DAO](/dao/) kann teuer und zeitaufwendig sein. Stattdessen könnten Sie ein Open-Source-Governance-Toolkit wie [Aragon Client](https://client.aragon.org/) verwenden, um Ihre DAO zu bootstrappen und schnell ein Governance-Framework zu erstellen. +Der Aufbau maßgeschneiderter Governance-Systeme für eine [DAO](/dao/) kann teuer und zeitaufwändig sein. Stattdessen könnten Sie ein Open-Source-Governance-Toolkit wie den [Aragon Client](https://client.aragon.org/) verwenden, um Ihre DAO zu bootstrappen und schnell ein Governance-Framework zu erstellen. ### Identitätsmanagement {#identity-management} -Anstatt ein benutzerdefiniertes Authentifizierungssystem zu entwickeln oder sich auf zentrale Anbieter zu verlassen, können Sie zur Verwaltung der Benutzerauthentifizierung Werkzeuge für dezentrale Identität (DID) integrieren. Ein Beispiel ist [SpruceID](https://www.spruceid.com/), ein Open-Source-Toolkit, das eine „Mit Ethereum anmelden“-Funktionalität anbietet, mit der Benutzer ihre Identität mithilfe einer Ethereum-Wallet authentifizieren können. +Anstatt ein benutzerdefiniertes Authentifizierungssystem zu erstellen oder sich auf zentralisierte Anbieter zu verlassen, können Sie dezentralisierte Identitätswerkzeuge (DID) integrieren, um die Authentifizierung für Benutzer zu verwalten. Ein Beispiel ist [SpruceID](https://www.spruceid.com/), ein Open-Source-Toolkit, das eine „Sign in with Ethereum“-Funktionalität bietet, mit der Benutzer Identitäten mit einem Ethereum-Wallet authentifizieren können. ## Verwandte Tutorials {#related-tutorials} -- [Starten Sie die Entwicklung Ihres Dapp-Frontends mit create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Ein Überblick über die Verwendung von create-eth-app, um sofort einsatzbereite Apps mit beliebten Smart Contracts zu erstellen._ +- [Starten Sie Ihre Dapp-Frontend-Entwicklung mit create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Ein Überblick darüber, wie man create-eth-app verwendet, um sofort einsatzbereite Anwendungen mit beliebten Smart Contracts zu erstellen._ -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ -- [Zusammensetzbarkeit ist Innovation](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/) -- [Warum Zusammensetzbarkeit für Web3 wichtig ist](https://hackernoon.com/why-composability-matters-for-web3) -- [Was ist Zusammensetzbarkeit?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) +- [Composability is Innovation](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/) +- [Why Composability Matters For Web3](https://hackernoon.com/why-composability-matters-for-web3) +- [What is Composability?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md index 1d5b1664990..218b9b876a8 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md @@ -1,41 +1,41 @@ --- title: Smart Contracts bereitstellen -description: "Erfahren Sie, wie Sie Smart Contracts in Ethereum Netzwerken bereitstellen, einschließlich Voraussetzungen, Tools und Bereitstellungsschritten." +description: "Erfahren Sie, wie Sie Smart Contracts in Ethereum-Netzwerken bereitstellen, einschließlich Voraussetzungen, Tools und Bereitstellungsschritten." lang: de --- -Sie müssen Ihren Smart Contract auf die Blockchain hochladen, damit er Benutzern eines Ethereum-Netzwerks zur Verfügung steht. +Sie müssen Ihren Smart Contract bereitstellen, damit er für Benutzer eines Ethereum-Netzwerks verfügbar ist. -Die Bereitstellung des Smart Contracts auf der Blockchain ist eigentlich nur das Senden einer Transaktion, die den Code des kompilierten Smart Contracts enthält, ohne Angabe von Empfängern. +Um einen Smart Contract bereitzustellen, senden Sie lediglich eine Ethereum-Transaktion, die den kompilierten Code des Smart Contracts enthält, ohne einen Empfänger anzugeben. ## Voraussetzungen {#prerequisites} Sie sollten [Ethereum-Netzwerke](/developers/docs/networks/), [Transaktionen](/developers/docs/transactions/) und die [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) verstehen, bevor Sie Smart Contracts bereitstellen. -Das Bereitstellen eines Vertrags kostet auch Ether (ETH), da dieser auf der Blockchain gespeichert wird. Sie sollten daher mit [Gas und Gebühren](/developers/docs/gas/) auf Ethereum vertraut sein. +Die Bereitstellung eines Vertrags kostet ebenfalls Ether (ETH), da diese auf der Blockchain gespeichert werden. Daher sollten Sie mit [Gas und Gebühren](/developers/docs/gas/) auf Ethereum vertraut sein. -Schließlich müssen Sie Ihren Vertrag kompilieren, bevor Sie ihn bereitstellen. Stellen Sie also sicher, dass Sie den Artikel über das [Kompilieren von Smart Contracts](/developers/docs/smart-contracts/compiling/) gelesen haben. +Schließlich müssen Sie Ihren Vertrag kompilieren, bevor Sie ihn bereitstellen. Stellen Sie also sicher, dass Sie sich über das [Kompilieren von Smart Contracts](/developers/docs/smart-contracts/compiling/) informiert haben. ## Wie man einen Smart Contract bereitstellt {#how-to-deploy-a-smart-contract} ### Was Sie benötigen {#what-youll-need} -- Der Bytecode Ihres Vertrags – dieser wird durch die [Kompilierung](/developers/docs/smart-contracts/compiling/) generiert -- Ether for gas – Sie setzen Ihre Ressourcengrenze wie bei anderen Transaktionen fest. Beachten Sie dabei jedoch, dass das Integrieren von Smart Contracts viel mehr Ressourcen erfordert als eine einfache ETH-Transaktion. -- Ein Bereitstellungsskript oder Plug-in -- Zugriff auf einen [Ethereum-Node](/developers/docs/nodes-and-clients/), entweder durch den Betrieb eines eigenen, die Verbindung zu einem öffentlichen Node oder über einen API-Schlüssel bei einem [Node-Service](/developers/docs/nodes-and-clients/nodes-as-a-service/) +- Den Bytecode Ihres Vertrags – dieser wird durch [Kompilierung](/developers/docs/smart-contracts/compiling/) generiert +- ETH für Gas – Sie legen Ihr Gaslimit wie bei anderen Transaktionen fest. Beachten Sie jedoch, dass die Bereitstellung von Verträgen viel mehr Gas erfordert als eine einfache ETH-Überweisung +- Ein Bereitstellungsskript oder Plugin +- Zugriff auf einen [Ethereum-Blockchain-Knoten](/developers/docs/nodes-and-clients/), entweder indem Sie Ihren eigenen betreiben, sich mit einem öffentlichen Blockchain-Knoten verbinden oder über einen API-Schlüssel unter Verwendung eines [Knoten-Dienstes](/developers/docs/nodes-and-clients/nodes-as-a-service/) ### Schritte zur Bereitstellung eines Smart Contracts {#steps-to-deploy} -Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum Beispiel können Sie sich die [Dokumentation von Hardhat zur Bereitstellung Ihrer Verträge](https://hardhat.org/docs/tutorial/deploying) oder die [Dokumentation von Foundry zur Bereitstellung und Verifizierung eines Smart Contracts](https://book.getfoundry.sh/forge/deploying) ansehen. Nach der Bereitstellung hat Ihr Vertrag wie andere [Konten](/developers/docs/accounts/) eine Ethereum-Adresse und kann mithilfe von [Tools zur Überprüfung des Quellcodes](/developers/docs/smart-contracts/verifying/#source-code-verification-tools) verifiziert werden. +Die genauen Schritte hängen vom jeweiligen Entwicklungs-Framework ab. Sie können sich beispielsweise die [Dokumentation von Hardhat zur Bereitstellung Ihrer Verträge](https://hardhat.org/docs/tutorial/deploying) oder die [Dokumentation von Foundry zur Bereitstellung und Verifizierung eines Smart Contracts](https://book.getfoundry.sh/forge/deploying) ansehen. Nach der Bereitstellung erhält Ihr Vertrag eine Ethereum-Adresse wie andere [Konten](/developers/docs/accounts/) und kann mithilfe von [Quellcode-Verifizierungstools](/developers/docs/smart-contracts/verifying/#source-code-verification-tools) verifiziert werden. -## Zugehörige Werkzeuge {#related-tools} +## Verwandte Tools {#related-tools} -**Remix – _Remix IDE ermöglicht die Entwicklung, Bereitstellung und Verwaltung von Smart Contracts für Ethereum-ähnliche Blockchains_** +**Remix – _Die Remix IDE ermöglicht die Entwicklung, Bereitstellung und Verwaltung von Smart Contracts für Ethereum-ähnliche Blockchains_** - [Remix](https://remix.ethereum.org) -**Tenderly – _Web3-Entwicklungsplattform, die Debugging, Beobachtbarkeit und Infrastruktur-Bausteine für die Entwicklung, das Testen, die Überwachung und den Betrieb von Smart Contracts bietet_** +**Tenderly – _Web3-Entwicklungsplattform, die Debugging, Beobachtbarkeit und Infrastrukturbausteine für die Entwicklung, das Testen, die Überwachung und den Betrieb von Smart Contracts bietet_** - [tenderly.co](https://tenderly.co/) - [Dokumentation](https://docs.tenderly.co/) @@ -49,11 +49,11 @@ Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum B - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**thirdweb – _Einfache Bereitstellung beliebiger Verträge auf jeder EVM-kompatiblen Chain mit einem einzigen Befehl_** +**thirdweb – _Stellen Sie jeden Vertrag mit einem einzigen Befehl einfach auf jeder EVM-kompatiblen Chain bereit_** - [Dokumentation](https://portal.thirdweb.com/deploy/) -**Crossmint – _Web3-Entwicklungsplattform auf Unternehmensniveau, um Smart Contracts bereitzustellen, Zahlungen per Kreditkarte und über verschiedene Ketten hinweg zu ermöglichen sowie APIs zu nutzen, um NFTs zu erstellen, zu verteilen, zu verkaufen, zu speichern und zu bearbeiten._** +**Crossmint – _Web3-Entwicklungsplattform auf Unternehmensniveau zur Bereitstellung von Smart Contracts, zur Ermöglichung von Kreditkarten- und Cross-Chain-Zahlungen sowie zur Nutzung von APIs zum Erstellen, Verteilen, Verkaufen, Speichern und Bearbeiten von NFTs._** - [crossmint.com](https://www.crossmint.com) - [Dokumentation](https://docs.crossmint.com) @@ -62,20 +62,20 @@ Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum B ## Verwandte Tutorials {#related-tutorials} -- [Bereitstellung Ihres ersten Smart Contracts](/developers/tutorials/deploying-your-first-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts auf einem Ethereum-Testnet._ -- [Hallo Welt | Smart-Contract-Tutorial](/developers/tutorials/hello-world-smart-contract/) _– Ein leicht verständliches Tutorial zur Erstellung und Bereitstellung eines einfachen Smart Contracts auf Ethereum._ +- [Ihren ersten Smart Contract bereitstellen](/developers/tutorials/deploying-your-first-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts in einem Ethereum-Testnet._ +- [Hello World | Smart-Contract-Tutorial](/developers/tutorials/hello-world-smart-contract/) _– Ein leicht verständliches Tutorial zum Erstellen und Bereitstellen eines einfachen Smart Contracts auf Ethereum._ - [Mit anderen Verträgen aus Solidity interagieren](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Wie man einen Smart Contract aus einem bestehenden Vertrag bereitstellt und mit ihm interagiert._ -- [So verkleinern Sie die Größe Ihres Vertrags](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Wie Sie die Größe Ihres Vertrags reduzieren, um das Limit einzuhalten und Gas zu sparen_ +- [Wie Sie die Größe Ihres Vertrags reduzieren](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Wie Sie die Größe Ihres Vertrags verringern, um unter dem Limit zu bleiben und Gas zu sparen_ -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) – _OpenZeppelin_ - [Bereitstellung Ihrer Verträge mit Hardhat](https://hardhat.org/docs/tutorial/deploying) – _Nomic Labs_ -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -- [Einen Ethereum-Node betreiben](/developers/docs/nodes-and-clients/run-a-node/) -- [Nodes-as-a-Service](/developers/docs/nodes-and-clients/nodes-as-a-service) +- [Einen Ethereum-Blockchain-Knoten betreiben](/developers/docs/nodes-and-clients/run-a-node/) +- [Blockchain-Knoten als Dienstleistung (Nodes-as-a-Service)](/developers/docs/nodes-and-clients/nodes-as-a-service) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md index 74c22e54846..87a54c0aea1 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md @@ -4,145 +4,145 @@ description: "Ein Überblick über die formale Verifizierung von Ethereum-Smart- lang: de --- -[Smart Contracts](/developers/docs/smart-contracts/) machen es möglich, dezentrale, vertrauenslose und robuste Anwendungen zu entwickeln, die neue Einsatzmöglichkeiten bieten und den Nutzern einen Mehrwert verschaffen. Da mit Smart Contracts große Mengen an Wert verwaltet werden, ist die Sicherheit ein wichtiger Aspekt für die Entwickler. +[Smart Contracts](/developers/docs/smart-contracts/) machen es möglich, dezentralisierte, vertrauenslose und robuste Anwendungen zu erstellen, die neue Anwendungsfälle einführen und Mehrwert für Benutzer freisetzen. Da Smart Contracts große Werte verwalten, ist Sicherheit ein kritischer Aspekt für Entwickler. -Die formale Verifizierung ist eine der empfohlenen Techniken zur Verbesserung der [Smart-Contract-Sicherheit](/developers/docs/smart-contracts/security/). Die formale Verifizierung, die auf [formale Methoden](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) zur Spezifizierung, zum Entwurf und zur Verifizierung von Programmen zurückgreift, wird seit Jahren eingesetzt, um die Korrektheit von kritischen Hardware- und Softwaresystemen zu gewährleisten. +Die formale Verifizierung ist eine der empfohlenen Techniken zur Verbesserung der [Sicherheit von Smart Contracts](/developers/docs/smart-contracts/security/). Die formale Verifizierung, die [formale Methoden](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) zur Spezifikation, zum Entwurf und zur Verifizierung von Programmen verwendet, wird seit Jahren eingesetzt, um die Korrektheit kritischer Hardware- und Softwaresysteme sicherzustellen. -Wenn die formale Verifizierung in Smart Contracts implementiert wird, lässt sich mit ihr beweisen, dass die Geschäftslogik eines Vertrags einer vordefinierten Spezifizierung entspricht. Im Vergleich zu anderen Methoden zur Bewertung der Korrektheit des Vertragscodes, wie z. B. Tests, bietet die formale Verifizierung stärkere Garantien dafür, dass ein Smart Contract funktional korrekt ist. +Wenn sie in Smart Contracts implementiert wird, kann die formale Verifizierung beweisen, dass die Geschäftslogik eines Vertrags einer vordefinierten Spezifikation entspricht. Im Vergleich zu anderen Methoden zur Beurteilung der Korrektheit von Vertragscode, wie z. B. Tests, bietet die formale Verifizierung stärkere Garantien dafür, dass ein Smart Contract funktional korrekt ist. -## Was ist eine formale Verifizierung? {#what-is-formal-verification} +## Was ist formale Verifizierung? {#what-is-formal-verification} -Unter einer formalen Verifizierung versteht man den Bewertungsprozess der Korrektheit eines Systems in Bezug auf eine formale Spezifizierung. Vereinfacht ausgedrückt, können wir mithilfe der formalen Verifizierung prüfen, ob das Verhalten eines Systems bestimmte Anforderungen erfüllt (d. h., ob es das tut, was wir wollen). +Formale Verifizierung bezieht sich auf den Prozess der Bewertung der Korrektheit eines Systems in Bezug auf eine formale Spezifikation. Einfacher ausgedrückt ermöglicht uns die formale Verifizierung zu überprüfen, ob das Verhalten eines Systems bestimmte Anforderungen erfüllt (d. h. es tut, was wir wollen). -Die erwarteten Verhaltensweisen des Systems (in diesem Fall eines Smart Contracts) werden durch formale Modellierung beschrieben, wohingegen Spezifizierungssprachen die Erstellung formaler Eigenschaften ermöglichen. Mithilfe formaler Verifizierungstechniken lässt sich dann verifizieren, ob die Implementierung eines Vertrags mit seiner Spezifizierung übereinstimmt und es kann ein mathematischer Beweis für die Korrektheit des Vertrags erbracht werden. Entspricht ein Vertrag seiner Spezifizierung, wird er als „funktionell korrekt“, „bewusst korrekt“ oder „designbedingt korrekt“ bezeichnet. +Erwartete Verhaltensweisen des Systems (in diesem Fall ein Smart Contract) werden mithilfe formaler Modellierung beschrieben, während Spezifikationssprachen die Erstellung formaler Eigenschaften ermöglichen. Techniken der formalen Verifizierung können dann überprüfen, ob die Implementierung eines Vertrags seiner Spezifikation entspricht, und einen mathematischen Beweis für die Korrektheit der ersteren ableiten. Wenn ein Vertrag seine Spezifikation erfüllt, wird er als „funktional korrekt“, „correct by design“ (korrekt durch Entwurf) oder „correct by construction“ (korrekt durch Konstruktion) beschrieben. ### Was ist ein formales Modell? {#what-is-a-formal-model} -In der Informatik ist ein [formales Modell](https://en.wikipedia.org/wiki/Model_of_computation) eine mathematische Beschreibung eines Rechenprozesses. Programme werden in mathematische Funktionen (Gleichungen) abgetrennt, wobei das Modell beschreibt, wie die Ausgaben von Funktionen in Abhängigkeit von Eingaben berechnet werden. +In der Informatik ist ein [formales Modell](https://en.wikipedia.org/wiki/Model_of_computation) eine mathematische Beschreibung eines Rechenprozesses. Programme werden in mathematische Funktionen (Gleichungen) abstrahiert, wobei das Modell beschreibt, wie Ausgaben von Funktionen bei einer bestimmten Eingabe berechnet werden. -Formale Modelle bieten eine Abstraktionsebene, auf der die Analyse des Verhaltens eines Programms bewertet werden kann. Das Vorhandensein von formalen Modellen ermöglicht die Erstellung einer _formalen Spezifikation_, die die gewünschten Eigenschaften des betreffenden Modells beschreibt. +Formale Modelle bieten eine Abstraktionsebene, über die die Analyse des Verhaltens eines Programms bewertet werden kann. Die Existenz formaler Modelle ermöglicht die Erstellung einer _formalen Spezifikation_, die gewünschte Eigenschaften des betreffenden Modells beschreibt. -Für die Modellierung von Smart Contracts zur formalen Verifizierung kommen verschiedene Techniken zum Einsatz. Einige Modelle werden beispielsweise verwendet, um Aussagen über das High-Level-Verhalten eines Smart Contracts zu treffen. Diese Modellierungstechniken wenden eine Blackbox-Sichtweise auf Smart Contracts an und betrachten sie als Systeme, die Eingaben akzeptieren und Berechnungen auf der Grundlage dieser Eingaben ausführen. +Für die Modellierung von Smart Contracts zur formalen Verifizierung werden verschiedene Techniken verwendet. Beispielsweise werden einige Modelle verwendet, um über das High-Level-Verhalten eines Smart Contracts nachzudenken. Diese Modellierungstechniken wenden eine Black-Box-Sicht auf Smart Contracts an und betrachten sie als Systeme, die Eingaben akzeptieren und basierend auf diesen Eingaben Berechnungen ausführen. -High-Level-Modelle konzentrieren sich auf die Beziehung zwischen Smart Contracts und externen Agenten, wie z. B. extern geführten Konto (Externally Owned Accounts, EOAs), Vertragskonten und der Blockchain-Umgebung. Solche Modelle sind nützlich, um Eigenschaften zu definieren, die festlegen, wie sich ein Vertrag als Reaktion auf bestimmte Benutzerinteraktionen verhalten soll. +High-Level-Modelle konzentrieren sich auf die Beziehung zwischen Smart Contracts und externen Akteuren, wie z. B. extern verwalteten Konten (EOAs), Vertragskonten und der Blockchain-Umgebung. Solche Modelle sind nützlich, um Eigenschaften zu definieren, die festlegen, wie sich ein Vertrag als Reaktion auf bestimmte Benutzerinteraktionen verhalten soll. -Im Gegensatz dazu konzentrieren sich andere formale Modelle auf das Low-Level-Verhalten eines Smart Contracts. High-Level-Modelle können zwar dabei helfen, Aussagen über die Funktionalität eines Vertrags zu treffen, aber sie erfassen möglicherweise keine Details über die interne Funktionsweise der Implementierung. Low-Level-Modelle wenden eine White-Box-Sicht auf die Programmanalyse an und stützen sich auf Lower-Level-Darstellungen von Smart-Contract-Anwendungen, wie z. B. Programmabläufe und [Kontrollflussdiagramme](https://en.wikipedia.org/wiki/Control-flow_graph), um Aussagen über Eigenschaften zu treffen, die für die Ausführung eines Vertrags relevant sind. +Umgekehrt konzentrieren sich andere formale Modelle auf das Low-Level-Verhalten eines Smart Contracts. Während High-Level-Modelle beim Nachdenken über die Funktionalität eines Vertrags helfen können, erfassen sie möglicherweise keine Details über die internen Abläufe der Implementierung. Low-Level-Modelle wenden eine White-Box-Sicht auf die Programmanalyse an und stützen sich auf Low-Level-Darstellungen von Smart-Contract-Anwendungen, wie z. B. Programm-Traces und [Kontrollflussgraphen](https://en.wikipedia.org/wiki/Control-flow_graph), um über Eigenschaften nachzudenken, die für die Ausführung eines Vertrags relevant sind. -Low-Level-Modelle gelten als ideal, da sie die tatsächliche Ausführung eines Smart Contracts in der Ausführungsumgebung von Ethereum (d. h. der [EVM](/developers/docs/evm/)) darstellen. Low-Level-Modellierungstechniken sind besonders nützlich, um kritische Sicherheitseigenschaften in Smart Contracts festzulegen und potenzielle Schwachstellen zu erkennen. +Low-Level-Modelle gelten als ideal, da sie die tatsächliche Ausführung eines Smart Contracts in der Ausführungsumgebung von Ethereum (d. h. der [EVM](/developers/docs/evm/)) darstellen. Low-Level-Modellierungstechniken sind besonders nützlich, um kritische Sicherheitseigenschaften in Smart Contracts zu etablieren und potenzielle Schwachstellen zu erkennen. -### Was ist eine formale Spezifizierung? {#what-is-a-formal-specification} +### Was ist eine formale Spezifikation? {#what-is-a-formal-specification} -Eine Spezifizierung ist einfach eine technische Anforderung, die ein bestimmtes System erfüllen muss. Beim Programmieren stellen Spezifizierungen allgemeine Vorstellungen über die Ausführung eines Programms dar (d. h., was das Programm tun soll). +Eine Spezifikation ist einfach eine technische Anforderung, die ein bestimmtes System erfüllen muss. In der Programmierung stellen Spezifikationen allgemeine Ideen über die Ausführung eines Programms dar (d. h. was das Programm tun soll). -Im Zusammenhang mit Smart Contracts beziehen sich formale Spezifikationen auf _Eigenschaften_ – formale Beschreibungen der Anforderungen, die ein Vertrag erfüllen muss. Solche Eigenschaften werden als „Invarianten“ bezeichnet und stellen logische Behauptungen über die Ausführung eines Vertrags dar, die unter allen möglichen Umständen und ohne Ausnahmen wahr bleiben müssen. +Im Kontext von Smart Contracts beziehen sich formale Spezifikationen auf _Eigenschaften_ – formale Beschreibungen der Anforderungen, die ein Vertrag erfüllen muss. Solche Eigenschaften werden als „Invarianten“ beschrieben und stellen logische Behauptungen über die Ausführung eines Vertrags dar, die unter allen möglichen Umständen ohne Ausnahmen wahr bleiben müssen. -Wir können uns eine formale Spezifizierung also als eine Sammlung von Aussagen vorstellen, die in einer formalen Sprache geschrieben sind und die beabsichtigte Ausführung eines Smart Contracts beschreiben. Spezifizierungen umfassen die Eigenschaften eines Vertrags und legen fest, wie sich der Vertrag unter verschiedenen Umständen verhalten soll. Der Zweck der formalen Verifizierung besteht darin, festzustellen, ob ein Smart Contract diese Eigenschaften (Invarianten) besitzt, und sicherzugehen, dass während der Ausführung nicht gegen diese Eigenschaften verstoßen wird. +Somit können wir uns eine formale Spezifikation als eine Sammlung von in einer formalen Sprache geschriebenen Anweisungen vorstellen, die die beabsichtigte Ausführung eines Smart Contracts beschreiben. Spezifikationen decken die Eigenschaften eines Vertrags ab und definieren, wie sich der Vertrag unter verschiedenen Umständen verhalten soll. Der Zweck der formalen Verifizierung besteht darin, festzustellen, ob ein Smart Contract diese Eigenschaften (Invarianten) besitzt und dass diese Eigenschaften während der Ausführung nicht verletzt werden. -Formale Spezifizierungen sind entscheidend für die Entwicklung sicherer Implementierungen von Smart Contracts. Verträge, für die eine Implementierung von Invarianten nicht gelingt, oder gegen deren Eigenschaften während der Ausführung verstoßen wird, sind anfällig für Sicherheitslücken, die die Funktionalität beeinträchtigen oder böswillige Angriffe ermöglichen können. +Formale Spezifikationen sind entscheidend für die Entwicklung sicherer Implementierungen von Smart Contracts. Verträge, die Invarianten nicht implementieren oder deren Eigenschaften während der Ausführung verletzt werden, sind anfällig für Schwachstellen, die die Funktionalität beeinträchtigen oder böswillige Exploits verursachen können. -## Arten von formalen Spezifikationen für Smart Contracts {#formal-specifications-for-smart-contracts} +## Arten formaler Spezifikationen für Smart Contracts {#formal-specifications-for-smart-contracts} -Formale Spezifizierungen ermöglichen mathematische Schlussfolgerungen über die Korrektheit der Programmausführung. Wie bei formalen Modellen können formale Spezifizierungen entweder die High-Level-Eigenschaften oder das Low-Level-Verhalten einer Vertragsimplementierung erfassen. +Formale Spezifikationen ermöglichen mathematisches Denken über die Korrektheit der Programmausführung. Wie bei formalen Modellen können formale Spezifikationen entweder High-Level-Eigenschaften oder das Low-Level-Verhalten einer Vertragsimplementierung erfassen. -Formale Spezifikationen werden aus Elementen der [Programmlogik](https://en.wikipedia.org/wiki/Logic_programming) abgeleitet, die formale Schlussfolgerungen über die Eigenschaften eines Programms ermöglichen. Eine Programmlogik enthält formale Regeln, die (in mathematischer Sprache) das erwartete Verhalten eines Programms ausdrücken. Bei der Erstellung formaler Spezifikationen werden verschiedene Programmlogiken verwendet, darunter die [Erreichbarkeitslogik](https://en.wikipedia.org/wiki/Reachability_problem), die [temporale Logik](https://en.wikipedia.org/wiki/Temporal_logic) und die [Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic). +Formale Spezifikationen werden unter Verwendung von Elementen der [Programmlogik](https://en.wikipedia.org/wiki/Logic_programming) abgeleitet, die ein formales Nachdenken über die Eigenschaften eines Programms ermöglichen. Eine Programmlogik hat formale Regeln, die (in mathematischer Sprache) das erwartete Verhalten eines Programms ausdrücken. Bei der Erstellung formaler Spezifikationen werden verschiedene Programmlogiken verwendet, darunter [Erreichbarkeitslogik](https://en.wikipedia.org/wiki/Reachability_problem), [Temporallogik](https://en.wikipedia.org/wiki/Temporal_logic) und [Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic). -Formale Spezifikationen für Smart Contracts lassen sich grob entweder als **High-Level**- oder **Low-Level**-Spezifikationen klassifizieren. Unabhängig davon, zu welcher Kategorie eine Spezifizierung gehört, muss sie die Eigenschaft des zu analysierenden Systems angemessen und eindeutig beschreiben. +Formale Spezifikationen für Smart Contracts können grob in **High-Level**- oder **Low-Level**-Spezifikationen eingeteilt werden. Unabhängig davon, zu welcher Kategorie eine Spezifikation gehört, muss sie die Eigenschaft des zu analysierenden Systems angemessen und eindeutig beschreiben. ### High-Level-Spezifikationen {#high-level-specifications} -Wie der Name schon sagt, beschreibt eine High-Level-Spezifizierung (auch „modellorientierte Spezifizierung“ genannt) das High-Level-Verhalten eines Programms. High-Level-Spezifikationen modellieren einen Smart Contract als [Zustandsmaschine](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM), die durch die Ausführung von Operationen zwischen Zuständen übergehen kann, wobei temporale Logik verwendet wird, um formale Eigenschaften für das FSM-Modell zu definieren. +Wie der Name schon sagt, beschreibt eine High-Level-Spezifikation (auch „modellorientierte Spezifikation“ genannt) das High-Level-Verhalten eines Programms. High-Level-Spezifikationen modellieren einen Smart Contract als [endlichen Automaten](https://en.wikipedia.org/wiki/Finite-state_machine) (Finite State Machine, FSM), der durch Ausführen von Operationen zwischen Zuständen wechseln kann, wobei Temporallogik verwendet wird, um formale Eigenschaften für das FSM-Modell zu definieren. -[Temporale Logiken](https://en.wikipedia.org/wiki/Temporal_logic) sind \ Werden Zeitlogiken auf die formale Verifizierung angewendet, werden mit ihnen Behauptungen über das korrekte Verhalten von Systemen aufgestellt, die als Zustandsmaschinen modelliert werden. Insbesondere beschreibt eine Zeitlogik die zukünftigen Zustände, die ein Smart Contract annehmen kann, und wie er zwischen den Zuständen wechselt. +[Temporallogiken](https://en.wikipedia.org/wiki/Temporal_logic) sind „Regeln für das Nachdenken über Aussagen, die in Bezug auf die Zeit qualifiziert sind (z. B. ‚Ich bin _immer_ hungrig‘ oder ‚Ich werde _irgendwann_ hungrig sein‘).“ Wenn sie auf die formale Verifizierung angewendet werden, werden Temporallogiken verwendet, um Behauptungen über das korrekte Verhalten von als Zustandsautomaten modellierten Systemen aufzustellen. Insbesondere beschreibt eine Temporallogik die zukünftigen Zustände, in denen sich ein Smart Contract befinden kann, und wie er zwischen Zuständen wechselt. -High-Level-Spezifikationen erfassen im Allgemeinen zwei kritische temporale Eigenschaften für Smart Contracts: **Sicherheit** und **Liveness**. Sicherheitseigenschaften stehen für die Vorstellung, dass „nie irgendetwas Schlimmes passiert“, und drücken in der Regel Invarianz aus. Eine Sicherheitseigenschaft kann allgemeine Softwareanforderungen definieren, wie z. B. die Freiheit von [Deadlocks](https://www.techtarget.com/whatis/definition/deadlock), oder domänenspezifische Eigenschaften für Verträge ausdrücken (z. B. Invarianten bei der Zugriffskontrolle für Funktionen, zulässige Werte von Zustandsvariablen oder Bedingungen für Token-Transfers). +High-Level-Spezifikationen erfassen im Allgemeinen zwei kritische temporale Eigenschaften für Smart Contracts: **Sicherheit (Safety)** und **Lebendigkeit (Liveness)**. Sicherheitseigenschaften repräsentieren die Idee, dass „niemals etwas Schlimmes passiert“, und drücken normalerweise Invarianz aus. Eine Sicherheitseigenschaft kann allgemeine Softwareanforderungen definieren, wie z. B. die Freiheit von [Deadlocks](https://www.techtarget.com/whatis/definition/deadlock), oder domänenspezifische Eigenschaften für Verträge ausdrücken (z. B. Invarianten zur Zugriffskontrolle für Funktionen, zulässige Werte von Zustandsvariablen oder Bedingungen für Token-Transfers). -Nehmen Sie zum Beispiel diese Sicherheitsanforderung, die die Bedingungen für die Verwendung von `transfer()` oder `transferFrom()` in ERC-20-Token-Verträgen abdeckt: _„Das Guthaben eines Absenders ist niemals niedriger als die angeforderte Menge der zu sendenden Token.“_. Diese Beschreibung einer Vertragsinvariante in natürlicher Sprache lässt sich in eine formale (mathematische) Spezifizierung übersetzen, die dann rigoros auf ihre Gültigkeit überprüft werden kann. +Nehmen wir zum Beispiel diese Sicherheitsanforderung, die Bedingungen für die Verwendung von `transfer()` oder `transferFrom()` in ERC-20-Token-Verträgen abdeckt: _„Der Kontostand eines Senders ist niemals niedriger als die angeforderte Menge an zu sendenden Token.“_ Diese natürlichsprachliche Beschreibung einer Vertragsinvariante kann in eine formale (mathematische) Spezifikation übersetzt werden, die dann streng auf Gültigkeit geprüft werden kann. -Liveness-Eigenschaften besagen, dass „irgendwann etwas Gutes passiert“ und betreffen die Fähigkeit eines Vertrags, verschiedene Zustände zu durchlaufen. Ein Beispiel für eine Liveness-Eigenschaft ist die „Liquidität“, die sich auf die Fähigkeit eines Vertrags bezieht, sein Guthaben auf Anfrage an die Benutzer zu übertragen. Wenn diese Eigenschaft verletzt wird, könnten Benutzer die im Vertrag gespeicherten Vermögenswerte nicht abheben, so wie es beim [Vorfall mit der Parity-Wallet](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html) geschah. +Lebendigkeitseigenschaften behaupten, dass „irgendwann etwas Gutes passiert“, und betreffen die Fähigkeit eines Vertrags, durch verschiedene Zustände voranzuschreiten. Ein Beispiel für eine Lebendigkeitseigenschaft ist „Liquidität“, die sich auf die Fähigkeit eines Vertrags bezieht, seine Guthaben auf Anfrage an Benutzer zu übertragen. Wenn diese Eigenschaft verletzt wird, könnten Benutzer keine im Vertrag gespeicherten Vermögenswerte abheben, wie es beim [Vorfall mit dem Parity-Wallet](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html) geschah. ### Low-Level-Spezifikationen {#low-level-specifications} -High-Level-Spezifizierungen nehmen als Ausgangspunkt ein endliches Zustandsmodell eines Vertrags und definieren gewünschte Eigenschaften für dieses Modell. Im Gegensatz dazu modellieren Low-Level-Spezifizierungen (auch „eigenschaftsorientierte Spezifizierungen“ genannt) häufig Programme (Smart Contracts) als Systeme, die sich aus einer Sammlung von mathematischen Funktionen zusammensetzen, und beschreiben das korrekte Verhalten solcher Systeme. +High-Level-Spezifikationen nehmen als Ausgangspunkt ein Finite-State-Modell eines Vertrags und definieren gewünschte Eigenschaften dieses Modells. Im Gegensatz dazu modellieren Low-Level-Spezifikationen (auch „eigenschaftsorientierte Spezifikationen“ genannt) Programme (Smart Contracts) oft als Systeme, die eine Sammlung mathematischer Funktionen umfassen, und beschreiben das korrekte Verhalten solcher Systeme. -Einfacher ausgedrückt: Low-Level-Spezifikationen analysieren _Programmabläufe_ und versuchen, Eigenschaften eines Smart Contracts über diese Abläufe zu definieren. Abläufe beziehen sich auf Sequenzen von Funktionsausführungen, die den Zustand eines Smart Contracts verändern; daher helfen Low-Level-Spezifizierungen bei der Festlegung von Anforderungen an die interne Ausführung eines Vertrags. +Einfacher ausgedrückt analysieren Low-Level-Spezifikationen _Programm-Traces_ und versuchen, Eigenschaften eines Smart Contracts über diese Traces zu definieren. Traces beziehen sich auf Sequenzen von Funktionsausführungen, die den Zustand eines Smart Contracts ändern; daher helfen Low-Level-Spezifikationen dabei, Anforderungen für die interne Ausführung eines Vertrags zu spezifizieren. -Formale Spezifizierungen auf Low-Level-Ebene können in Form von entweder Eigenschaften im Hoare-Stil oder Invarianten auf Ausführungspfaden angegeben werden. +Formale Low-Level-Spezifikationen können entweder als Eigenschaften im Hoare-Stil oder als Invarianten auf Ausführungspfaden angegeben werden. ### Eigenschaften im Hoare-Stil {#hoare-style-properties} -[Die Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic) bietet eine Reihe von formalen Regeln für Schlussfolgerungen über die Korrektheit von Programmen, einschließlich Smart Contracts. Eine Eigenschaft im Hoare-Stil wird durch ein Hoare-Tripel `{P}c{Q}` dargestellt, wobei `c` ein Programm ist und `P` und `Q` Prädikate für den Zustand von `c` (d.h. des Programms) sind, die formal als _Vorbedingungen_ bzw. _Nachbedingungen_ beschrieben werden. +Die [Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic) bietet eine Reihe formaler Regeln für das Nachdenken über die Korrektheit von Programmen, einschließlich Smart Contracts. Eine Eigenschaft im Hoare-Stil wird durch ein Hoare-Tripel `{P}c{Q}` dargestellt, wobei `c` ein Programm ist und `P` und `Q` Prädikate über den Zustand von `c` (d. h. dem Programm) sind, die formal als _Vorbedingungen_ bzw. _Nachbedingungen_ beschrieben werden. -Eine Präkondition ist ein Prädikat, das die für die korrekte Ausführung einer Funktion erforderlichen Bedingungen beschreibt; Benutzer, die den Vertrag aufrufen, müssen diese Bedingung erfüllen. Eine Nachbedingung ist ein Prädikat, das die Bedingung beschreibt, die eine Funktion bei korrekter Ausführung festlegt; die Benutzer können davon ausgehen, dass diese Bedingung nach dem Aufruf der Funktion als erfüllt gilt. Eine _Invariante_ in der Hoare-Logik ist ein Prädikat, das bei der Ausführung einer Funktion erhalten bleibt (d. h. es ändert sich nicht). +Eine Vorbedingung ist ein Prädikat, das die für die korrekte Ausführung einer Funktion erforderlichen Bedingungen beschreibt; Benutzer, die den Vertrag aufrufen, müssen diese Anforderung erfüllen. Eine Nachbedingung ist ein Prädikat, das die Bedingung beschreibt, die eine Funktion bei korrekter Ausführung herstellt; Benutzer können erwarten, dass diese Bedingung nach dem Aufruf der Funktion wahr ist. Eine _Invariante_ in der Hoare-Logik ist ein Prädikat, das durch die Ausführung einer Funktion erhalten bleibt (d. h. es ändert sich nicht). -Spezifikationen im Hoare-Stil können entweder _partielle Korrektheit_ oder _totale Korrektheit_ garantieren. Die Implementierung einer Vertragsfunktion ist „teilweise korrekt“, wenn die Vorbedingung erfüllt ist, bevor die Funktion ausgeführt wird, und sobald die Ausführung beendet ist, auch die Nachbedingung erfüllt ist. Ein Beweis für vollständige Korrektheit liegt vor, wenn eine Vorbedingung vor der Ausführung der Funktion wahr ist, die Ausführung garantiert beendet wird und, wenn das der Fall ist, die Nachbedingung wahr ist. +Spezifikationen im Hoare-Stil können entweder _partielle Korrektheit_ oder _totale Korrektheit_ garantieren. Die Implementierung einer Vertragsfunktion ist „partiell korrekt“, wenn die Vorbedingung vor der Ausführung der Funktion wahr ist und, falls die Ausführung beendet wird, auch die Nachbedingung wahr ist. Ein Beweis für die totale Korrektheit wird erbracht, wenn eine Vorbedingung vor der Ausführung der Funktion wahr ist, die Ausführung garantiert beendet wird und, wenn dies der Fall ist, die Nachbedingung wahr ist. -Der Nachweis der vollständigen Korrektheit ist schwierig, da einige Ausführungen sich verzögern können, bevor sie beendet werden, oder überhaupt nicht beendet werden. Abgesehen davon ist die Frage, ob die Ausführung beendet wird, ein strittiger Punkt, da der Gas-Mechanismus von Ethereum unendliche Programmschleifen verhindert (die Ausführung wird entweder erfolgreich beendet oder endet aufgrund eines „Out-of-Gas“-Fehlers). +Den Beweis für die totale Korrektheit zu erbringen, ist schwierig, da sich einige Ausführungen vor der Beendigung verzögern oder überhaupt nicht beendet werden können. Allerdings ist die Frage, ob die Ausführung beendet wird, wohl ein strittiger Punkt, da der Gas-Mechanismus von Ethereum Endlosschleifen in Programmen verhindert (die Ausführung wird entweder erfolgreich beendet oder endet aufgrund eines „Out-of-Gas“-Fehlers). -Die mit Hoare-Logik erstellten Spezifizierungen für Smart Contracts enthalten Vorbedingungen, Nachbedingungen und Invarianten für die Ausführung von Funktionen und Schleifen in einem Vertrag. Vorbedingungen beinhalten oft die Möglichkeit von fehlerhaften Eingaben für eine Funktion, wobei Nachbedingungen die erwartete Reaktion auf solche Eingaben beschreiben (z. B. das Auslösen einer bestimmten Ausnahme). Auf diese Weise sind Eigenschaften im Hoare-Stil eine wirksame Möglichkeit zur Gewährleistung der Korrektheit von Vertragsimplementierungen. +Smart-Contract-Spezifikationen, die mithilfe der Hoare-Logik erstellt wurden, weisen Vorbedingungen, Nachbedingungen und Invarianten auf, die für die Ausführung von Funktionen und Schleifen in einem Vertrag definiert sind. Vorbedingungen beinhalten oft die Möglichkeit fehlerhafter Eingaben in eine Funktion, wobei Nachbedingungen die erwartete Reaktion auf solche Eingaben beschreiben (z. B. das Auslösen einer bestimmten Ausnahme). Auf diese Weise sind Eigenschaften im Hoare-Stil effektiv, um die Korrektheit von Vertragsimplementierungen sicherzustellen. -Viele formale Verifizierungs-Frameworks verwenden Spezifizierungen im Hoare-Stil, um die semantische Korrektheit von Funktionen zu beweisen. Es ist auch möglich, Eigenschaften im Hoare-Stil (als Zusicherungen) durch die Verwendung der `require`- und `assert`-Anweisungen in Solidity direkt zum Vertragscode hinzuzufügen. +Viele Frameworks zur formalen Verifizierung verwenden Spezifikationen im Hoare-Stil, um die semantische Korrektheit von Funktionen zu beweisen. Es ist auch möglich, Eigenschaften im Hoare-Stil (als Zusicherungen) direkt zum Vertragscode hinzuzufügen, indem die Anweisungen `require` und `assert` in Solidity verwendet werden. -`require`-Anweisungen drücken eine Vorbedingung oder Invariante aus und werden oft verwendet, um Benutzereingaben zu validieren, während `assert` eine für die Sicherheit notwendige Nachbedingung erfasst. Beispielsweise kann eine ordnungsgemäße Zugriffskontrolle für Funktionen (ein Beispiel für eine Sicherheitseigenschaft) durch die Verwendung von `require` als Vorbedingungsprüfung der Identität des aufrufenden Kontos erreicht werden. In ähnlicher Weise kann eine Invariante für zulässige Werte von Zustandsvariablen in einem Vertrag (z. B. die Gesamtzahl der im Umlauf befindlichen Token) vor einer Verletzung geschützt werden, indem `assert` verwendet wird, um den Zustand des Vertrags nach der Ausführung der Funktion zu bestätigen. +`require`-Anweisungen drücken eine Vorbedingung oder Invariante aus und werden oft verwendet, um Benutzereingaben zu validieren, während `assert` eine für die Sicherheit notwendige Nachbedingung erfasst. Beispielsweise kann eine ordnungsgemäße Zugriffskontrolle für Funktionen (ein Beispiel für eine Sicherheitseigenschaft) erreicht werden, indem `require` als Vorbedingungsprüfung der Identität des aufrufenden Kontos verwendet wird. In ähnlicher Weise kann eine Invariante für zulässige Werte von Zustandsvariablen in einem Vertrag (z. B. die Gesamtzahl der im Umlauf befindlichen Token) vor Verletzungen geschützt werden, indem `assert` verwendet wird, um den Zustand des Vertrags nach der Funktionsausführung zu bestätigen. -### Eigenschaften auf Trace-Ebene {#trace-level-properties} +### Trace-Level-Eigenschaften {#trace-level-properties} -Trace-basierte Spezifizierungen beschreiben Vorgänge, die für den Wechsel eines Vertrag zwischen verschiedenen Zuständen sorgen, sowie die Beziehungen zwischen diesen Vorgängen. Wie bereits erläutert, handelt es sich bei Traces um Abfolgen von Vorgängen, die den Zustand eines Vertrags auf eine bestimmte Weise verändern. +Trace-basierte Spezifikationen beschreiben Operationen, die einen Vertrag zwischen verschiedenen Zuständen überführen, und die Beziehungen zwischen diesen Operationen. Wie bereits erklärt, sind Traces Sequenzen von Operationen, die den Zustand eines Vertrags auf eine bestimmte Weise ändern. -Dieser Ansatz beruht auf einem Modell von Smart Contracts als Zustandswechselsystemen mit einigen vordefinierten Zuständen (beschrieben durch Zustandsvariablen) und einer Reihe von vordefinierten Wechseln (beschrieben durch Vertragsfunktionen). Darüber hinaus wird häufig ein [Kontrollflussdiagramm](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (CFG), eine grafische Darstellung des Ausführungsflusses eines Programms, zur Beschreibung der operationalen Semantik eines Vertrags verwendet. Hier wird jede Trace als ein Pfad im Kontrollflussdiagramm dargestellt. +Dieser Ansatz beruht auf dem Modell von Smart Contracts als Zustandsübergangssysteme mit einigen vordefinierten Zuständen (beschrieben durch Zustandsvariablen) zusammen mit einer Reihe vordefinierter Übergänge (beschrieben durch Vertragsfunktionen). Darüber hinaus wird häufig ein [Kontrollflussgraph](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (Control Flow Graph, CFG), der eine grafische Darstellung des Ausführungsflusses eines Programms ist, zur Beschreibung der operativen Semantik eines Vertrags verwendet. Hierbei wird jeder Trace als Pfad auf dem Kontrollflussgraphen dargestellt. -In erster Linie werden Spezifizierungen auf Trace-Level eingesetzt, um Schlussfolgerungen über Muster bei der internen Ausführung von Smart Contracts zu ziehen. Durch die Erstellung von Spezifizierungen auf Trace-Level stellen wir die zulässigen Ausführungspfade (d. h. Zustandswechsel) für einen Smart Contract fest. Mithilfe von Techniken wie der symbolischen Ausführung können wir formal verifizieren, dass die Ausführung niemals einem Pfad folgt, der nicht im formalen Modell definiert ist. +In erster Linie werden Trace-Level-Spezifikationen verwendet, um über Muster der internen Ausführung in Smart Contracts nachzudenken. Durch die Erstellung von Trace-Level-Spezifikationen behaupten wir die zulässigen Ausführungspfade (d. h. Zustandsübergänge) für einen Smart Contract. Mithilfe von Techniken wie der symbolischen Ausführung können wir formal verifizieren, dass die Ausführung niemals einem Pfad folgt, der nicht im formalen Modell definiert ist. -Verwenden wir als Beispiel einen [DAO](/dao/)-Vertrag, der einige öffentlich zugängliche Funktionen hat, um Eigenschaften auf Trace-Ebene zu beschreiben. Hier gehen wir davon aus, dass der DAO-Vertrag den Benutzern die folgenden Vorgänge erlaubt: +Verwenden wir ein Beispiel für einen [DAO](/dao/)-Vertrag, der über einige öffentlich zugängliche Funktionen verfügt, um Trace-Level-Eigenschaften zu beschreiben. Hier gehen wir davon aus, dass der DAO-Vertrag Benutzern die Ausführung der folgenden Operationen ermöglicht: -- Geldmittel einzahlen +- Gelder einzahlen -- Über einen Vorschlag nach Einzahlung der Geldmittel abstimmen +- Über einen Vorschlag abstimmen, nachdem Gelder eingezahlt wurden -- Eine Rückerstattung beantragen, wenn nicht über einen Vorschlag abgestimmt wird +- Eine Rückerstattung fordern, wenn sie nicht über einen Vorschlag abstimmen -Beispiele für Eigenschaften auf Trace-Ebene könnten sein: _„Benutzer, die keine Gelder einzahlen, können nicht über einen Vorschlag abstimmen“_ oder _„Benutzer, die nicht über einen Vorschlag abstimmen, sollten immer eine Rückerstattung beantragen können“_. Beide Eigenschaften sichern bevorzugte Ausführungsreihenfolgen zu (eine Abstimmung kann nicht _vor_ der Einzahlung von Geldern stattfinden und die Beantragung einer Rückerstattung kann nicht _nach_ der Abstimmung über einen Vorschlag erfolgen). +Beispielhafte Trace-Level-Eigenschaften könnten sein: _„Benutzer, die keine Gelder einzahlen, können nicht über einen Vorschlag abstimmen“_ oder _„Benutzer, die nicht über einen Vorschlag abstimmen, sollten immer in der Lage sein, eine Rückerstattung zu fordern“_. Beide Eigenschaften behaupten bevorzugte Ausführungssequenzen (eine Abstimmung kann nicht _vor_ der Einzahlung von Geldern erfolgen und die Forderung einer Rückerstattung kann nicht _nach_ der Abstimmung über einen Vorschlag erfolgen). ## Techniken zur formalen Verifizierung von Smart Contracts {#formal-verification-techniques} -### Modellprüfung {#model-checking} +### Model Checking {#model-checking} -Die Modellprüfung ist eine formale Verifizierungstechnik, bei der ein Algorithmus ein formales Modell eines Smart Contracts gegen seine Spezifizierung prüft. Bei einer Modellprüfung werden Smart Contracts oft als Zustandsübergangssysteme dargestellt, wohingegen die Eigenschaften zulässiger Vertragszustände mithilfe der Zeitlogik definiert werden. +Model Checking ist eine formale Verifizierungstechnik, bei der ein Algorithmus ein formales Modell eines Smart Contracts anhand seiner Spezifikation überprüft. Beim Model Checking werden Smart Contracts oft als Zustandsübergangssysteme dargestellt, während Eigenschaften zu zulässigen Vertragszuständen mithilfe von Temporallogik definiert werden. -Die Modellprüfung erfordert die Erstellung einer abstrakten mathematischen Darstellung eines Systems (d. h. eines Vertrags) und den Ausdruck von Eigenschaften dieses Systems mithilfe von Formeln, die in der [Aussagenlogik](https://www.baeldung.com/cs/propositional-logic) verwurzelt sind. Dies vereinfacht die Aufgabe des Modellprüfungsalgorithmus, nämlich zu beweisen, dass ein mathematisches Modell eine gegebene logische Formel erfüllt. +Model Checking erfordert die Erstellung einer abstrakten mathematischen Darstellung eines Systems (d. h. eines Vertrags) und den Ausdruck von Eigenschaften dieses Systems mithilfe von Formeln, die in der [Aussagenlogik](https://www.baeldung.com/cs/propositional-logic) verwurzelt sind. Dies vereinfacht die Aufgabe des Model-Checking-Algorithmus, nämlich zu beweisen, dass ein mathematisches Modell eine gegebene logische Formel erfüllt. -Die Modellprüfung in der formalen Verifizierung dient in erster Linie der Bewertung zeitlicher Eigenschaften, die das Verhalten eines Vertrags im Lauf der Zeit beschreiben. Temporale Eigenschaften für Smart Contracts umfassen _Sicherheit_ und _Liveness_, die wir bereits erklärt haben. +Model Checking in der formalen Verifizierung wird in erster Linie verwendet, um temporale Eigenschaften zu bewerten, die das Verhalten eines Vertrags im Laufe der Zeit beschreiben. Temporale Eigenschaften für Smart Contracts umfassen _Sicherheit_ und _Lebendigkeit_, die wir zuvor erklärt haben. -Beispielsweise kann eine Sicherheitseigenschaft, die sich auf die Zugriffskontrolle bezieht (z. B. _Nur der Eigentümer des Vertrags kann `selfdestruct` aufrufen_), in formaler Logik geschrieben werden. Danach kann der Modellprüfungsalgorithmus verifizieren, ob der Vertrag diese formale Spezifizierung erfüllt. +Beispielsweise kann eine Sicherheitseigenschaft im Zusammenhang mit der Zugriffskontrolle (z. B. _Nur der Eigentümer des Vertrags kann `selfdestruct` aufrufen_) in formaler Logik geschrieben werden. Danach kann der Model-Checking-Algorithmus überprüfen, ob der Vertrag diese formale Spezifikation erfüllt. -Bei der Modellprüfung wird der Zustandsraum erforscht, wobei alle möglichen Zustände eines Smart Contracts konstruiert werden und versucht wird, erreichbare Zustände zu finden, die zu Eigenschaftsverstößen führen. Dies kann jedoch zu einer unendlichen Anzahl von Zuständen führen (bekannt als „Problem der Zustandsexplosion“). Aus diesem Grund sind Modellprüfprogramme auf Abstraktionstechniken angewiesen, um eine effiziente Analyse von Smart Contracts zu ermöglichen. +Model Checking verwendet die Zustandsraumexploration, bei der alle möglichen Zustände eines Smart Contracts konstruiert und versucht wird, erreichbare Zustände zu finden, die zu Eigenschaftsverletzungen führen. Dies kann jedoch zu einer unendlichen Anzahl von Zuständen (bekannt als das „Zustandsexplosionsproblem“), weshalb Model Checker auf Abstraktionstechniken angewiesen sind, um eine effiziente Analyse von Smart Contracts zu ermöglichen. -### Theorembeweis {#theorem-proving} +### Theorembeweisen {#theorem-proving} -Der Theorembeweis ist eine Methode, um mathematische Schlussfolgerungen über die Korrektheit von Programmen, einschließlich Smart Contracts, zu ziehen. Es geht darum, das Modell eines Vertragssystems und seine Spezifizierungen in mathematische Formeln (Logikaussagen) zu transformieren. +Theorembeweisen ist eine Methode des mathematischen Nachdenkens über die Korrektheit von Programmen, einschließlich Smart Contracts. Es beinhaltet die Transformation des Modells des Systems eines Vertrags und seiner Spezifikationen in mathematische Formeln (logische Aussagen). -Das Ziel des Theorembeweises ist es, die logische Äquivalenz zwischen diesen Aussagen zu verifizieren. „Logische Äquivalenz“ (auch „logische Bi-Implikation“ genannt) ist eine Art von Beziehung zwischen zwei Aussagen, bei der die erste Aussage _genau dann_ wahr ist, _wenn_ die zweite Aussage wahr ist. +Das Ziel des Theorembeweisens ist es, die logische Äquivalenz zwischen diesen Aussagen zu verifizieren. „Logische Äquivalenz“ (auch „logische Bi-Implikation“ genannt) ist eine Art von Beziehung zwischen zwei Aussagen, bei der die erste Aussage _genau dann_ wahr ist, wenn die zweite Aussage wahr ist. -Die geforderte Beziehung (logische Äquivalenz) zwischen Aussagen über das Modell eines Vertrages und seiner Eigenschaft wird als beweisbare Aussage (genannt „Theorem“) formuliert. Mithilfe eines formalen Inferenzsystems kann der automatisierte Theoremprüfer die Gültigkeit des Theorems verifizieren. Mit anderen Worten: Ein Theoremprüfer kann schlüssig beweisen, dass das Modell eines Smart Contracts genau seinen Spezifizierungen entspricht. +Die erforderliche Beziehung (logische Äquivalenz) zwischen Aussagen über das Modell eines Vertrags und seine Eigenschaft wird als beweisbare Aussage (Theorem genannt) formuliert. Mithilfe eines formalen Inferenzsystems kann der automatisierte Theorembeweiser die Gültigkeit des Theorems verifizieren. Mit anderen Worten, ein Theorembeweiser kann schlüssig beweisen, dass das Modell eines Smart Contracts genau seinen Spezifikationen entspricht. -Die Modellprüfung modelliert Verträge als Übergangssysteme mit endlichen Zuständen. Mit Theorembeweisen hingegen gelingt die Analyse von Systemen mit unendlichen Zuständen. Das bedeutet jedoch, dass ein automatischer Theoremprüfer nicht immer wissen kann, ob ein Logikproblem „entscheidbar“ ist oder nicht. +Während Model Checking Verträge als Übergangssysteme mit endlichen Zuständen modelliert, kann das Theorembeweisen die Analyse von Systemen mit unendlichen Zuständen handhaben. Dies bedeutet jedoch, dass ein automatisierter Theorembeweiser nicht immer wissen kann, ob ein logisches Problem „entscheidbar“ ist oder nicht. -Daher ist oft menschliche Hilfe erforderlich, um den Theoremprüfer bei der Ableitung von Korrektheitsbeweisen anzuleiten. Der Einsatz menschlicher Arbeitskraft bei Theorembeweisen macht seine Nutzung teurer als die der Modellprüfung, die vollständig automatisiert erfolgt. +Infolgedessen ist oft menschliche Unterstützung erforderlich, um den Theorembeweiser bei der Ableitung von Korrektheitsbeweisen zu leiten. Der Einsatz menschlicher Anstrengung beim Theorembeweisen macht die Verwendung teurer als das Model Checking, das vollständig automatisiert ist. ### Symbolische Ausführung {#symbolic-execution} -Symbolische Ausführung ist eine Methode zur Analyse eines Smart Contracts, bei der Funktionen mit _symbolischen Werten_ (z. B. `x > 5`) anstelle von _konkreten Werten_ (z. B. `x == 5`) ausgeführt werden. Als formale Verifizierungsstechnik wird die symbolische Ausführung eingesetzt, um auf formale Weise Schlussfolgerungen über die Trace-Level-Eigenschaften im Code eines Vertrags zu ziehen. +Die symbolische Ausführung ist eine Methode zur Analyse eines Smart Contracts durch Ausführen von Funktionen unter Verwendung _symbolischer Werte_ (z. B. `x > 5`) anstelle von _konkreten Werten_ (z. B. `x == 5`). Als formale Verifizierungstechnik wird die symbolische Ausführung verwendet, um formal über Trace-Level-Eigenschaften im Code eines Vertrags nachzudenken. -Die symbolische Ausführung stellt einen Ausführungs-Trace als mathematische Formel über symbolischen Eingabewerten dar, auch _Pfadprädikat_ genannt. Ein [SMT-Solver](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) wird verwendet, um zu prüfen, ob ein Pfadprädikat \ Wenn ein anfälliger Pfad erfüllbar ist, erzeugt der SMT Solver einen konkreten Wert, der die Ausführung in Richtung dieses Pfades auslöst und lenkt. +Die symbolische Ausführung stellt einen Ausführungs-Trace als mathematische Formel über symbolische Eingabewerte dar, die auch als _Pfadprädikat_ bezeichnet wird. Ein [SMT-Solver](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) wird verwendet, um zu überprüfen, ob ein Pfadprädikat „erfüllbar“ ist (d. h. es existiert ein Wert, der die Formel erfüllen kann). Wenn ein anfälliger Pfad erfüllbar ist, generiert der SMT-Solver einen konkreten Wert, der die Ausführung in Richtung dieses Pfades lenkt. -Angenommen, die Funktion eines Smart Contracts nimmt einen `uint`-Wert (`x`) als Eingabe entgegen und revertiert, wenn `x` größer als `5` und gleichzeitig kleiner als `10` ist. Einen Wert für `x` zu finden, der den Fehler auslöst, würde bei einem normalen Testverfahren das Durchlaufen von Dutzenden von Testfällen (oder mehr) erfordern, ohne die Gewissheit, tatsächlich eine fehlerverursachende Eingabe zu finden. +Angenommen, die Funktion eines Smart Contracts nimmt als Eingabe einen `uint`-Wert (`x`) und wird rückgängig gemacht (reverts), wenn `x` größer als `5` und gleichzeitig kleiner als `10` ist. Einen Wert für `x` zu finden, der den Fehler mithilfe eines normalen Testverfahrens auslöst, würde das Durchlaufen von Dutzenden von Testfällen (oder mehr) erfordern, ohne die Gewissheit, tatsächlich eine fehlerverursachende Eingabe zu finden. -Umgekehrt würde ein Werkzeug für die symbolische Ausführung die Funktion mit dem symbolischen Wert ausführen: `X > 5 ∧ X < 10` (d. h. `x` ist größer als 5 UND `x` ist kleiner als 10). Das zugehörige Pfadprädikat `x = X > 5 ∧ X < 10` würde dann einem SMT-Solver zur Lösung übergeben. Wenn ein bestimmter Wert die Formel `x = X > 5 ∧ X < 10` erfüllt, berechnet der SMT-Solver diesen – zum Beispiel könnte der Solver `7` als Wert für `x` ausgeben. +Umgekehrt würde ein Tool zur symbolischen Ausführung die Funktion mit dem symbolischen Wert ausführen: `X > 5 ∧ X < 10` (d. h. `x` ist größer als 5 UND `x` ist kleiner als 10). Das zugehörige Pfadprädikat `x = X > 5 ∧ X < 10` würde dann einem SMT-Solver zur Lösung übergeben. Wenn ein bestimmter Wert die Formel `x = X > 5 ∧ X < 10` erfüllt, wird der SMT-Solver ihn berechnen – beispielsweise könnte der Solver `7` als Wert für `x` ausgeben. -Da die symbolische Ausführung auf Eingaben in ein Programm angewiesen ist und die Menge der Eingaben zur Erforschung aller erreichbaren Zustände potenziell unendlich ist, handelt es sich dabei dennoch um eine Form von Tests. Wie das Beispiel zeigt, ist die symbolische Ausführung jedoch effizienter als reguläre Tests, wenn es darum geht, Eingaben zu finden, die Eigenschaftsverstöße auslösen. +Da die symbolische Ausführung auf Eingaben in ein Programm angewiesen ist und die Menge der Eingaben zur Erkundung aller erreichbaren Zustände potenziell unendlich ist, handelt es sich immer noch um eine Form des Testens. Wie im Beispiel gezeigt, ist die symbolische Ausführung jedoch effizienter als reguläres Testen, um Eingaben zu finden, die Eigenschaftsverletzungen auslösen. -Außerdem führt die symbolische Ausführung zu weniger falsch-positiven Ergebnissen als andere eigenschaftsbasierte Techniken (z. B. Fuzzing), bei denen die Eingaben für eine Funktion zufällig generiert werden. Wird bei der symbolischen Ausführung ein Fehlerzustand ausgelöst, so kann ein konkreter Wert erzeugt werden, der den Fehler auslöst und das Problem reproduziert. +Darüber hinaus erzeugt die symbolische Ausführung weniger falsch-positive Ergebnisse als andere eigenschaftsbasierte Techniken (z. B. Fuzzing), die zufällig Eingaben für eine Funktion generieren. Wenn während der symbolischen Ausführung ein Fehlerzustand ausgelöst wird, ist es möglich, einen konkreten Wert zu generieren, der den Fehler auslöst und das Problem reproduziert. -Die symbolische Ausführung kann auch einen gewissen mathematischen Beweis für die Korrektheit liefern. Betrachten Sie das folgende Beispiel für eine Vertragsfunktion mit Überlaufschutz: +Die symbolische Ausführung kann auch ein gewisses Maß an mathematischem Korrektheitsbeweis liefern. Betrachten Sie das folgende Beispiel einer Vertragsfunktion mit Überlaufschutz: ``` function safe_add(uint x, uint y) returns(uint z){ @@ -155,130 +155,130 @@ function safe_add(uint x, uint y) returns(uint z){ } ``` -Ein Ausführungs-Trace, der zu einem Ganzzahlüberlauf führt, müsste die Formel erfüllen: `z = x + y AND (z >= x) AND (z >= y) AND (z < x OR z < y)` Eine solche Formel kann wahrscheinlich nicht gelöst werden, daher dient sie als mathematischer Beweis dafür, dass die Funktion `safe_add` niemals überläuft. +Ein Ausführungs-Trace, der zu einem Integer-Überlauf führt, müsste die Formel erfüllen: `z = x + y AND (z >= x) AND (z >= y) AND (z < x OR z < y)`. Es ist unwahrscheinlich, dass eine solche Formel gelöst wird, daher dient sie als mathematischer Beweis dafür, dass die Funktion `safe_add` niemals überläuft. -### Warum die formale Verifizierung für Smart Contracts? Vorteile der formalen Verifizierung {#benefits-of-formal-verification} +### Warum formale Verifizierung für Smart Contracts verwenden? {#benefits-of-formal-verification} #### Bedarf an Zuverlässigkeit {#need-for-reliability} -Die formale Verifizierung wird eingesetzt, um die Korrektheit sicherheitskritischer Systeme zu bewerten, deren Versagen verheerende Folgen haben kann, wie Tod, Verletzung oder finanziellen Ruin. Smart Contracts sind hochwertige Anwendungen, die enorme Werte kontrollieren, und einfache Designfehler können zu [irreversiblen Verlusten für Benutzer](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/) führen. Die formale Verifizierung eines Vertrags vor der Veröffentlichung kann jedoch die Garantien erhöhen, dass er wie erwartet funktioniert, sobald er auf der Blockchain läuft. +Die formale Verifizierung wird verwendet, um die Korrektheit sicherheitskritischer Systeme zu bewerten, deren Ausfall verheerende Folgen wie Tod, Verletzung oder finanziellen Ruin haben kann. Smart Contracts sind hochwertige Anwendungen, die enorme Werte kontrollieren, und einfache Designfehler können zu [unwiederbringlichen Verlusten für Benutzer](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/) führen. Die formale Verifizierung eines Vertrags vor der Bereitstellung kann jedoch die Garantien erhöhen, dass er wie erwartet funktioniert, sobald er auf der Blockchain läuft. -Zuverlässigkeit ist eine äußerst wünschenswerte Eigenschaft eines jeden Smart Contracts, insbesondere weil Code, der in der Ethereum Virtual Machine (EVM) veröffentlicht wurde, in der Regel unveränderbar ist. Da Upgrades nach dem Launch nicht ohne weiteres möglich sind, ist eine formale Verifizierung erforderlich, um die Zuverlässigkeit der Verträge zu gewährleisten. Dank formaler Verifizierung können heikle Probleme wie Ganzzahlunterläufe und -überläufe, Wiedereintritte und schlechte Gasoptimierungen erkannt werden, die Auditoren und Testern möglicherweise entgehen. +Zuverlässigkeit ist eine sehr erwünschte Eigenschaft in jedem Smart Contract, insbesondere weil Code, der in der [Ethereum](/) Virtual Machine (EVM) bereitgestellt wird, typischerweise unveränderlich ist. Da Upgrades nach dem Start nicht ohne Weiteres zugänglich sind, macht die Notwendigkeit, die Zuverlässigkeit von Verträgen zu garantieren, eine formale Verifizierung erforderlich. Die formale Verifizierung ist in der Lage, knifflige Probleme wie Integer-Unterläufe und -Überläufe, Re-Entrancy und schlechte Gas-Optimierungen zu erkennen, die Prüfern und Testern entgehen könnten. -#### Nachweis der funktionalen Korrektheit {#prove-functional-correctness} +#### Funktionale Korrektheit beweisen {#prove-functional-correctness} -Programmtests sind die gängigste Methode, um zu beweisen, dass ein Smart Contract bestimmte Anforderungen erfüllt. In diesem Zusammenhang wird ein Vertrag mit Beispieldaten, die verarbeitet werden sollen, ausgeführt und sein Verhalten analysiert. Wenn der Vertrag die erwarteten Ergebnisse für die Beispieldaten liefert, dann haben die Entwickler einen objektiven Beweis für seine Korrektheit. +Programmtests sind die häufigste Methode, um zu beweisen, dass ein Smart Contract bestimmte Anforderungen erfüllt. Dies beinhaltet die Ausführung eines Vertrags mit einer Stichprobe der Daten, die er voraussichtlich verarbeiten wird, und die Analyse seines Verhaltens. Wenn der Vertrag die erwarteten Ergebnisse für die Beispieldaten zurückgibt, haben Entwickler einen objektiven Beweis für seine Korrektheit. -Mit diesem Ansatz kann jedoch nicht die korrekte Ausführung für Eingabewerte bewiesen werden, die nicht Teil der Beispieldaten sind. Daher kann das Testen eines Vertrags helfen, Fehler zu entdecken (d. h. wenn einige Codepfade während der Ausführung nicht die gewünschten Ergebnisse liefern), aber **es kann nicht schlüssig die Abwesenheit von Fehlern beweisen**. +Dieser Ansatz kann jedoch keine korrekte Ausführung für Eingabewerte beweisen, die nicht Teil der Stichprobe sind. Daher kann das Testen eines Vertrags helfen, Fehler zu erkennen (d. h. wenn einige Codepfade während der Ausführung nicht die gewünschten Ergebnisse liefern), aber **es kann nicht schlüssig die Abwesenheit von Fehlern beweisen**. -Umgekehrt kann die formale Verifizierung formal beweisen, dass ein Smart Contract die Anforderungen für einen unendlichen Bereich von Ausführungen erfüllt, _ohne_ den Vertrag überhaupt auszuführen. Dies erfordert die Erstellung einer formalen Spezifizierung, die das korrekte Verhalten von Verträgen genau beschreibt, und die Entwicklung eines formalen (mathematischen) Modells für das System des Vertrags. Dann können wir ein formales Beweisverfahren anwenden, um die Konsistenz zwischen dem Vertragsmodell und seiner Spezifizierung zu überprüfen. +Umgekehrt kann die formale Verifizierung formal beweisen, dass ein Smart Contract Anforderungen für eine unendliche Reihe von Ausführungen erfüllt, _ohne_ den Vertrag überhaupt auszuführen. Dies erfordert die Erstellung einer formalen Spezifikation, die korrekte Vertragsverhaltensweisen präzise beschreibt, und die Entwicklung eines formalen (mathematischen) Modells des Vertragssystems. Dann können wir einem formalen Beweisverfahren folgen, um die Konsistenz zwischen dem Modell des Vertrags und seiner Spezifikation zu überprüfen. -Bei der formalen Verifizierung ist die Frage, ob die Geschäftslogik eines Vertrags den Anforderungen entspricht, eine mathematische Proposition, die bewiesen oder widerlegt werden kann. Durch den formalen Beweis einer Proposition können wir eine unendliche Anzahl von Testfällen mit einer endlichen Anzahl von Schritten verifizieren. Auf diese Weise bestehen bei der formalen Verifizierung bessere Aussichten darauf, zu beweisen, dass ein Vertrag in Bezug auf eine Spezifizierung funktional korrekt ist. +Mit der formalen Verifizierung ist die Frage der Überprüfung, ob die Geschäftslogik eines Vertrags die Anforderungen erfüllt, eine mathematische Aussage, die bewiesen oder widerlegt werden kann. Durch den formalen Beweis einer Aussage können wir eine unendliche Anzahl von Testfällen mit einer endlichen Anzahl von Schritten verifizieren. Auf diese Weise hat die formale Verifizierung bessere Aussichten zu beweisen, dass ein Vertrag in Bezug auf eine Spezifikation funktional korrekt ist. #### Ideale Verifizierungsziele {#ideal-verification-targets} -Ein Verifizierungssziel beschreibt das formal zu verifizierende System. Die formale Verifizierung eignet sich am besten für „eingebettete Systeme“ (kleine, einfache Teile einer Software, die zu einem größeren System gehören). Sie sind auch ideal für spezialisierte Domänen, die nur wenigen Regeln unterliegen, da dies die Anpassung von Werkzeugen zur Verifizierung von domänenspezifischen Eigenschaften erleichtert. +Ein Verifizierungsziel beschreibt das System, das formal verifiziert werden soll. Die formale Verifizierung wird am besten in „eingebetteten Systemen“ (kleine, einfache Softwareteile, die Teil eines größeren Systems sind) eingesetzt. Sie sind auch ideal für spezialisierte Domänen, die nur wenige Regeln haben, da dies die Anpassung von Tools zur Verifizierung domänenspezifischer Eigenschaften erleichtert. -Smart Contracts erfüllen – zumindest bis zu einem gewissen Grad – beide Anforderungen. Die geringe Größe von Ethereum-Verträgen bedeutet zum Beispiel, dass sie für eine formale Verifizierung geeignet sind. Auf ähnliche Weise unterliegt die EVM einfachen Regeln, was das Festlegen und die Verifizierung semantischer Eigenschaften für Programme, die auf der EVM laufen, erleichtert. +Smart Contracts erfüllen – zumindest bis zu einem gewissen Grad – beide Anforderungen. Beispielsweise macht die geringe Größe von Ethereum-Verträgen sie für die formale Verifizierung zugänglich. Ebenso folgt die EVM einfachen Regeln, was die Spezifikation und Verifizierung semantischer Eigenschaften für Programme, die in der EVM ausgeführt werden, erleichtert. ### Schnellerer Entwicklungszyklus {#faster-development-cycle} -Formale Verifizierungstechniken wie die Modellprüfung und symbolische Ausführung sind in der Regel effizienter als die reguläre Analyse von Smart-Contract-Code (die im Rahmen von Tests oder Audits durchgeführt wird). Dies liegt daran, dass die formale Verifizierung auf symbolischen Werten beruht, um Zusicherungen zu testen (\ im Gegensatz zu Tests, bei denen konkrete Werte zum Einsatz kommen („Was, wenn ein Benutzer versucht, 5 Ether abzuheben?“). +Techniken der formalen Verifizierung, wie Model Checking und symbolische Ausführung, sind im Allgemeinen effizienter als die reguläre Analyse von Smart-Contract-Code (die während des Testens oder Audits durchgeführt wird). Dies liegt daran, dass die formale Verifizierung auf symbolische Werte angewiesen ist, um Behauptungen zu testen („Was ist, wenn ein Benutzer versucht, _n_ Ether abzuheben?“), im Gegensatz zum Testen, das konkrete Werte verwendet („Was ist, wenn ein Benutzer versucht, 5 Ether abzuheben?“). -Symbolische Eingabevariablen können mehrere Klassen konkreter Werte abdecken, sodass formale Verifizierungsansätze eine größere Codeabdeckung in kürzerer Zeit versprechen. Wenn sie effektiv eingesetzt wird, kann die formale Verifizierung den Entwicklungszyklus für Entwickler beschleunigen. +Symbolische Eingabevariablen können mehrere Klassen konkreter Werte abdecken, sodass formale Verifizierungsansätze mehr Codeabdeckung in einem kürzeren Zeitrahmen versprechen. Wenn sie effektiv eingesetzt wird, kann die formale Verifizierung den Entwicklungszyklus für Entwickler beschleunigen. -Die formale Verifizierung sorgt auch für einen besseren Prozess bei der Entwicklung dezentraler Anwendungen (DApps), indem sie kostspielige Designfehler reduziert. Die Aktualisierung von Verträgen (soweit möglich) zur Behebung von Schwachstellen erfordert eine umfangreiche Umschreibung der Codebasis und einen höheren Entwicklungsaufwand. Durch die formale Verifizierung können viele Fehler in der Vertragsimplementierung aufgedeckt werden, die den Testern und Auditoren entgehen könnten, und es besteht ausreichend Gelegenheit, diese Probleme zu beheben, bevor ein Vertrag veröffentlicht wird. +Die formale Verifizierung verbessert auch den Prozess der Erstellung dezentralisierter Anwendungen (Dapps), indem sie kostspielige Designfehler reduziert. Das Aktualisieren von Verträgen (wo möglich) zur Behebung von Schwachstellen erfordert ein umfangreiches Umschreiben von Codebasen und mehr Aufwand für die Entwicklung. Die formale Verifizierung kann viele Fehler in Vertragsimplementierungen erkennen, die Testern und Prüfern entgehen könnten, und bietet reichlich Gelegenheit, diese Probleme vor der Bereitstellung eines Vertrags zu beheben. ## Nachteile der formalen Verifizierung {#drawbacks-of-formal-verification} ### Kosten für manuelle Arbeit {#cost-of-manual-labor} -Für die formale Verifizierung, insbesondere die halbautomatische Verifizierung, bei der ein Mensch den Prüfer bei der Ableitung von Korrektheitsbeweisen anleitet, ist ein erhebliches Maß an manueller Arbeit erforderlich. Darüber hinaus ist die Erstellung formaler Spezifizierungen eine komplexe Tätigkeit, die ein hohes Maß an Fachwissen erfordert. +Die formale Verifizierung, insbesondere die halbautomatische Verifizierung, bei der ein Mensch den Beweiser anleitet, um Korrektheitsbeweise abzuleiten, erfordert erhebliche manuelle Arbeit. Darüber hinaus ist die Erstellung einer formalen Spezifikation eine komplexe Tätigkeit, die ein hohes Maß an Fähigkeiten erfordert. -Aufgrund dieser Faktoren (Aufwand und Fähigkeiten) ist die formale Verifizierung anspruchsvoller und teurer als die üblichen Methoden zur Bewertung der Korrektheit von Verträgen, wie etwa Tests und Audits. Angesichts der Kosten von Fehlern bei der Implementierung von Smart Contracts ist es jedoch sinnvoll, die Kosten für ein vollständiges Verifizierungsaudit zu tragen. +Diese Faktoren (Aufwand und Fähigkeiten) machen die formale Verifizierung anspruchsvoller und teurer im Vergleich zu den üblichen Methoden zur Beurteilung der Korrektheit in Verträgen, wie Tests und Audits. Dennoch ist es praktisch, die Kosten für ein vollständiges Verifizierungs-Audit zu tragen, angesichts der Kosten von Fehlern in Smart-Contract-Implementierungen. -### Falsch negative Ergebnisse {#false-negatives} +### Falsch-negative Ergebnisse {#false-negatives} -Bei einer formalen Verifizierung kann nur geprüft werden, ob die Ausführung des Smart Contracts der formalen Spezifizierung entspricht. Daher muss sichergestellt werden, dass die Spezifizierung die erwarteten Verhaltensweisen eines Smart Contracts korrekt beschreibt. +Die formale Verifizierung kann nur überprüfen, ob die Ausführung des Smart Contracts mit der formalen Spezifikation übereinstimmt. Daher ist es wichtig sicherzustellen, dass die Spezifikation die erwarteten Verhaltensweisen eines Smart Contracts richtig beschreibt. -Wenn Spezifizierungen schlecht geschrieben sind, können Verstöße gegen Eigenschaften – die auf anfällige Ausführungen hinweisen – durch das formale Verifizierungsaudit nicht entdeckt werden. In diesem Fall könnte der Entwickler irrtümlicherweise zur Annahme verleitet werden, dass der Vertrag keine Bugs enthält. +Wenn Spezifikationen schlecht geschrieben sind, können Verletzungen von Eigenschaften – die auf anfällige Ausführungen hinweisen – durch das formale Verifizierungs-Audit nicht erkannt werden. In diesem Fall könnte ein Entwickler fälschlicherweise annehmen, dass der Vertrag fehlerfrei ist. -### Performance-Probleme {#performance-issues} +### Leistungsprobleme {#performance-issues} -Bei der formalen Verifizierung kommt es zu einer Reihe von Leistungsproblemen. So können beispielsweise Probleme mit Zustands- und Pfadexplosionen, die bei der Modellprüfung bzw. der symbolischen Prüfung auftreten, die Verifizierungsverfahren beeinträchtigen. Außerdem kommen als Werkzeuge für formale Verifizierungen häufig SMT-Solver und andere Constraint-Solver auf ihrer zugrunde liegenden Ebene zum Einsatz, und diese Solver sind auf rechenintensive Verfahren angewiesen. +Die formale Verifizierung stößt auf eine Reihe von Leistungsproblemen. Beispielsweise können Zustands- und Pfadexplosionsprobleme, die während des Model Checkings bzw. der symbolischen Überprüfung auftreten, Verifizierungsverfahren beeinträchtigen. Außerdem verwenden Tools zur formalen Verifizierung häufig SMT-Solver und andere Constraint-Solver in ihrer zugrunde liegenden Schicht, und diese Solver stützen sich auf rechenintensive Verfahren. -Außerdem ist es für Programmverifizierer nicht immer möglich festzustellen, ob eine Eigenschaft (als logische Formel beschrieben) erfüllt werden kann oder nicht (das \ Daher kann es unmöglich sein, einige Eigenschaften eines Vertrags nachzuweisen, selbst wenn er gut spezifiziert ist. +Außerdem ist es für Programmverifizierer nicht immer möglich zu bestimmen, ob eine Eigenschaft (beschrieben als logische Formel) erfüllt werden kann oder nicht (das „[Entscheidungsproblem](https://en.wikipedia.org/wiki/Decision_problem)“), da ein Programm möglicherweise nie beendet wird. Daher kann es unmöglich sein, einige Eigenschaften für einen Vertrag zu beweisen, selbst wenn er gut spezifiziert ist. -## Werkzeuge zur formalen Verifizierung für Ethereum-Smart-Contracts {#formal-verification-tools} +## Tools zur formalen Verifizierung für Ethereum-Smart-Contracts {#formal-verification-tools} ### Spezifikationssprachen zur Erstellung formaler Spezifikationen {#specification-languages} -**Act**: __Act ermöglicht die Spezifikation von Speicher-Updates, Vor-/Nachbedingungen und Vertragsinvarianten.__ Die Tool-Suite verfügt auch über Proof Backends, die viele Eigenschaften über Coq, SMT Solver oder hevm beweisen können.\*_ +**Act**: _*Act ermöglicht die Spezifikation von Speicheraktualisierungen, Vor-/Nachbedingungen und Vertragsinvarianten. Seine Tool-Suite verfügt auch über Beweis-Backends, die in der Lage sind, viele Eigenschaften über Coq, SMT-Solver oder hevm zu beweisen.*_ - [GitHub](https://github.com/ethereum/act) - [Dokumentation](https://github.com/argotorg/act) -**Scribble** – __Scribble wandelt Code-Annotationen in der Scribble-Spezifikationssprache in konkrete Zusicherungen um, die die Spezifikation überprüfen.__ +**Scribble** - _*Scribble wandelt Code-Annotationen in der Scribble-Spezifikationssprache in konkrete Zusicherungen um, die die Spezifikation überprüfen.*_ - [Dokumentation](https://docs.scribble.codes/) -**Dafny** – __Dafny ist eine verifizierungsbereite Programmiersprache, die auf High-Level-Annotationen beruht, um über die Korrektheit von Code zu schlussfolgern und diese zu beweisen.__ +**Dafny** - _*Dafny ist eine verifizierungsbereite Programmiersprache, die sich auf High-Level-Annotationen stützt, um über die Korrektheit von Code nachzudenken und diese zu beweisen.*_ - [GitHub](https://github.com/dafny-lang/dafny) ### Programmverifizierer zur Überprüfung der Korrektheit {#program-verifiers} -**Certora Prover** – _Certora Prover ist ein automatisches formales Verifizierungswerkzeug zur Überprüfung der Code-Korrektheit in Smart Contracts._ Die Spezifizierungen werden in CVL (Certora Verification Language) geschrieben, wobei Verstöße gegen Eigenschaften durch eine Kombination aus statischer Analyse und Constraint Solving aufgedeckt werden._ +**Certora Prover** - _Certora Prover ist ein automatisches Tool zur formalen Verifizierung zur Überprüfung der Codekorrektheit in Smart Contracts. Spezifikationen werden in CVL (Certora Verification Language) geschrieben, wobei Eigenschaftsverletzungen mithilfe einer Kombination aus statischer Analyse und Constraint-Solving erkannt werden._ - [Website](https://www.certora.com/) - [Dokumentation](https://docs.certora.com/en/latest/index.html) -**Solidity SMTChecker** – __Der SMTChecker von Solidity ist ein integrierter Modellprüfer, der auf SMT (Satisfiability Modulo Theories) und Horn-Solving basiert.__ Er bestätigt, ob der Quellcode eines Vertrags während der Kompilierung mit den Spezifizierungen übereinstimmt und prüft statisch auf Verstöße gegen die Sicherheitseigenschaften.\*_ +**Solidity SMTChecker** - _*Der SMTChecker von Solidity ist ein integrierter Model Checker, der auf SMT (Satisfiability Modulo Theories) und Horn-Solving basiert. Er bestätigt, ob der Quellcode eines Vertrags während der Kompilierung mit den Spezifikationen übereinstimmt, und prüft statisch auf Verletzungen von Sicherheitseigenschaften.*_ - [GitHub](https://github.com/ethereum/solidity) -**solc-verify** – __solc-verify ist eine erweiterte Version des Solidity-Compilers, die eine automatisierte formale Verifizierung von Solidity-Code mithilfe von Annotationen und modularer Programmverifizierung durchführen kann.__ +**solc-verify** - _*solc-verify ist eine erweiterte Version des Solidity-Compilers, die mithilfe von Annotationen und modularer Programmverifizierung eine automatisierte formale Verifizierung von Solidity-Code durchführen kann.*_ - [GitHub](https://github.com/SRI-CSL/solidity) -**KEVM** – __KEVM ist eine formale Semantik der Ethereum Virtual Machine (EVM), die im K-Framework geschrieben ist.__ KEVM ist ausführbar und kann bestimmte eigenschaftsbezogene Behauptungen mithilfe der Erreichbarkeitslogik beweisen.\*_ +**KEVM** - _*KEVM ist eine formale Semantik der Ethereum Virtual Machine (EVM), die im K-Framework geschrieben ist. KEVM ist ausführbar und kann bestimmte eigenschaftsbezogene Behauptungen mithilfe von Erreichbarkeitslogik beweisen.*_ - [GitHub](https://github.com/runtimeverification/evm-semantics) - [Dokumentation](https://jellopaper.org/) -### Logische Frameworks für den Theorembeweis {#theorem-provers} +### Logische Frameworks für das Theorembeweisen {#theorem-provers} -**Isabelle** – _Isabelle/HOL ist ein Beweisassistent, der es ermöglicht, mathematische Formeln in einer formalen Sprache auszudrücken und Werkzeuge zum Beweisen dieser Formeln bereitstellt._ Seine Hauptanwendung ist die Formalisierung mathematischer Beweise und insbesondere die formale Verifizierung, die den Nachweis der Korrektheit von Computerhardware oder -software und den Nachweis der Eigenschaften von Computersprachen und -protokollen umfasst._ +**Isabelle** - _Isabelle/HOL ist ein Beweisassistent, der es ermöglicht, mathematische Formeln in einer formalen Sprache auszudrücken, und Tools zum Beweisen dieser Formeln bereitstellt. Die Hauptanwendung ist die Formalisierung mathematischer Beweise und insbesondere die formale Verifizierung, die den Beweis der Korrektheit von Computerhardware oder -software und den Beweis von Eigenschaften von Computersprachen und Protokollen umfasst._ - [GitHub](https://github.com/isabelle-prover) - [Dokumentation](https://isabelle.in.tum.de/documentation.html) -**Rocq** – _Rocq ist ein interaktiver Theorembeweiser, mit dem Sie Programme mithilfe von Theoremen definieren und interaktiv maschinell geprüfte Korrektheitsnachweise erstellen können._ +**Rocq** - _Rocq ist ein interaktiver Theorembeweiser, mit dem Sie Programme mithilfe von Theoremen definieren und interaktiv maschinell geprüfte Korrektheitsbeweise generieren können._ - [GitHub](https://github.com/rocq-prover/rocq) - [Dokumentation](https://rocq-prover.org/docs) -### Auf symbolischer Ausführung basierende Werkzeuge zur Erkennung anfälliger Muster in Smart Contracts {#symbolic-execution-tools} +### Auf symbolischer Ausführung basierende Tools zur Erkennung anfälliger Muster in Smart Contracts {#symbolic-execution-tools} -**Manticore** – __Ein Werkzeug zur Analyse von EVM-Bytecode, das auf symbolischer Ausführung basiert.__ +**Manticore** - _*Ein Tool zur Analyse von EVM-Bytecode, das auf symbolischer Ausführung basiert.*_ - [GitHub](https://github.com/trailofbits/manticore) - [Dokumentation](https://github.com/trailofbits/manticore/wiki) -**hevm** – __hevm ist eine symbolische Ausführungs-Engine und ein Äquivalenzprüfer für EVM-Bytecode.__ +**hevm** - _*hevm ist eine Engine für symbolische Ausführung und ein Äquivalenzprüfer für EVM-Bytecode.*_ - [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm) -**Mythril** – _Ein Werkzeug für die symbolische Ausführung zur Erkennung von Schwachstellen in Ethereum-Smart-Contracts_ +**Mythril** - _Ein Tool zur symbolischen Ausführung zur Erkennung von Schwachstellen in Ethereum-Smart-Contracts_ - [GitHub](https://github.com/ConsenSys/mythril-classic) - [Dokumentation](https://mythril-classic.readthedocs.io/en/develop/) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [Wie die formale Verifizierung von Smart Contracts funktioniert](https://runtimeverification.com/blog/how-formal-verification-of-smart-contracts-works/) -- [Wie formale Verifizierung fehlerfreie Smart Contracts gewährleisten kann](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) -- [Ein Überblick über formale Verifizierungsprojekte im Ethereum-Ökosystem](https://github.com/leonardoalt/ethereum_formal_verification_overview) -- [Durchgängige formale Verifizierung des Ethereum 2.0 Einzahlungs-Smart-Contracts](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) -- [Formale Verifizierung des beliebtesten Smart Contracts der Welt](https://www.zellic.io/blog/formal-verification-weth) -- [SMTChecker und formale Verifizierung](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) +- [Wie formale Verifizierung fehlerfreie Smart Contracts sicherstellen kann](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) +- [Ein Überblick über Projekte zur formalen Verifizierung im Ethereum-Ökosystem](https://github.com/leonardoalt/ethereum_formal_verification_overview) +- [End-to-End formale Verifizierung des Ethereum 2.0 Einzahlungsvertrags](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) +- [Formale Verifizierung des weltweit beliebtesten Smart Contracts](https://www.zellic.io/blog/formal-verification-weth) +- [SMTChecker und formale Verifizierung](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/index.md b/public/content/translations/de/developers/docs/smart-contracts/index.md index c88869f1b8c..0856f0f9d90 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/index.md @@ -1,34 +1,34 @@ --- title: "Einführung in Smart Contracts" -description: "Eine Übersicht zu Smart Contracts mit dem Fokus auf ihre einzigartigen Besonderheiten und Beschränkungen" +description: "Ein Überblick über Smart Contracts mit Fokus auf ihre einzigartigen Eigenschaften und Einschränkungen." lang: de --- ## Was ist ein Smart Contract? {#what-is-a-smart-contract} -Ein "Smart Contract" oder intelligenter Vertrag ist einfach ein Programm, das auf der Ethereum-Blockchain läuft. Es ist eine Sammlung von Anweisungen (seinen Funktionen) und Daten (seinem Zustand), die sich an einer bestimmten Adresse in der Ethereum-Blockchain befindet. +Ein „Smart Contract“ ist einfach ein Programm, das auf der [Ethereum](/)-Blockchain läuft. Es ist eine Sammlung von Code (seine Funktionen) und Daten (sein Zustand), die sich an einer bestimmten Adresse auf der Ethereum-Blockchain befindet. -Smart Contracts sind eine Art [Ethereum-Konto](/developers/docs/accounts/). Das bedeutet, dass sie über ein Guthaben verfügen und Ziel von Transaktionen werden können. Allerdings werden sie nicht von einem Benutzer gesteuert, sondern im Netzwerk bereitgestellt und wie programmiert ausgeführt. Benutzerkonten können dann mit einem Smart Contract interagieren, indem sie Transaktionen übermitteln, die eine im Smart Contract definierte Funktion ausführt. Smart Contracts können, wie auch herkömmliche Verträge, Regeln definieren und diese mittels Programmierung automatisch durchsetzen. Standardmäßig können Smart Contracts nicht gelöscht werden und Interaktionen mit ihnen sind irreversibel. +Smart Contracts sind eine Art von [Ethereum-Konto](/developers/docs/accounts/). Das bedeutet, dass sie ein Guthaben haben und das Ziel von Transaktionen sein können. Sie werden jedoch nicht von einem Benutzer kontrolliert, sondern im Netzwerk bereitgestellt und laufen wie programmiert ab. Benutzerkonten können dann mit einem Smart Contract interagieren, indem sie Transaktionen übermitteln, die eine im Smart Contract definierte Funktion ausführen. Smart Contracts können wie ein regulärer Vertrag Regeln definieren und diese automatisch über den Code durchsetzen. Smart Contracts können standardmäßig nicht gelöscht werden und Interaktionen mit ihnen sind irreversibel. ## Voraussetzungen {#prerequisites} Wenn Sie gerade erst anfangen oder nach einer weniger technischen Einführung suchen, empfehlen wir unsere [Einführung in Smart Contracts](/smart-contracts/). -Lesen Sie unbedingt die Informationen zu [Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und der [Ethereum Virtual Machine](/developers/docs/evm/), bevor Sie in die Welt der Smart Contracts eintauchen. +Stellen Sie sicher, dass Sie sich über [Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und die [Ethereum Virtual Machine](/developers/docs/evm/) informiert haben, bevor Sie in die Welt der Smart Contracts eintauchen. ## Ein digitaler Verkaufsautomat {#a-digital-vending-machine} -Die vielleicht beste Metapher für einen Smart Contract ist ein Verkaufsautomat, wie von [Nick Szabo](https://unenumerated.blogspot.com/) beschrieben. Mit den richtigen Eingaben ist eine bestimmte Ausgabe garantiert. +Die vielleicht beste Metapher für einen Smart Contract ist ein Verkaufsautomat, wie er von [Nick Szabo](https://unenumerated.blogspot.com/) beschrieben wurde. Mit den richtigen Eingaben ist eine bestimmte Ausgabe garantiert. -So bekommen Sie einen Schokoriegel aus einem Verkaufsautomaten: +Um einen Snack aus einem Verkaufsautomaten zu bekommen: ``` -Geld + Produktauswahl = ausgeworfener Riegel +money + snack selection = snack dispensed ``` -Diese Logik ist in den Automaten einprogrammiert. +Diese Logik ist in den Verkaufsautomaten einprogrammiert. -Einem Smart Contract wurde, wie auch einem Verkaufsautomaten, eine Logik einprogrammiert. Hier ist ein einfaches Beispiel dafür, wie dieser Automat aussehen würde, wenn er ein in Solidity geschriebener intelligenter Vertrag wäre: +Ein Smart Contract hat, wie ein Verkaufsautomat, eine einprogrammierte Logik. Hier ist ein einfaches Beispiel dafür, wie dieser Verkaufsautomat aussehen würde, wenn er ein in Solidity geschriebener Smart Contract wäre: ```solidity pragma solidity 0.8.7; @@ -39,74 +39,78 @@ contract VendingMachine { address public owner; mapping (address => uint) public cupcakeBalances; - // Wenn der „VendingMachine“-Vertrag bereitgestellt wird: - // 1. Die bereitstellende Adresse als Eigentümer des Vertrags festlegen - // 2. Den Cupcake-Bestand des bereitgestellten Smart Contracts auf 100 setzen + // Wenn der 'VendingMachine'-Vertrag bereitgestellt wird: + // 1. die bereitstellende Adresse als Eigentümer des Vertrags festlegen + // 2. das Cupcake-Guthaben des bereitgestellten Smart Contracts auf 100 festlegen constructor() { owner = msg.sender; cupcakeBalances[address(this)] = 100; } - // Dem Eigentümer erlauben, den Cupcake-Bestand des Smart Contracts zu erhöhen + // Dem Eigentümer erlauben, das Cupcake-Guthaben des Smart Contracts zu erhöhen function refill(uint amount) public { - require(msg.sender == owner, "Nur der Eigentümer kann nachfüllen."); + require(msg.sender == owner, "Only the owner can refill."); cupcakeBalances[address(this)] += amount; } // Jedem erlauben, Cupcakes zu kaufen function purchase(uint amount) public payable { - require(msg.value >= amount * 1 ether, "Sie müssen mindestens 1 ETH pro Cupcake bezahlen"); - require(cupcakeBalances[address(this)] >= amount, "Nicht genügend Cupcakes auf Lager, um diesen Kauf abzuschließen"); + require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake"); + require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase"); cupcakeBalances[address(this)] -= amount; cupcakeBalances[msg.sender] += amount; } } ``` -Wenn ein Verkaufsautomat vorhanden ist, benötigt man keinen Verkäufer mehr. Genau so können Smart Contracts in vielen Branchen Vermittler ersetzen. +So wie ein Verkaufsautomat den Bedarf an einem Verkäufer überflüssig macht, können Smart Contracts in vielen Branchen Vermittler ersetzen. -## Genehmigungsfrei {#permissionless} +## Erlaubnisfrei {#permissionless} -Jeder kann einen Smart Contract erstellen und ihn im Netzwerk bereitstellen. Sie müssen nur lernen, wie man in einer [Smart-Contract-Sprache](/developers/docs/smart-contracts/languages/) programmiert und genügend ETH besitzt, um Ihren Vertrag bereitzustellen. Das Bereitstellen eines Smart Contracts ist technisch gesehen eine Transaktion, also müssen Sie [Gas](/developers/docs/gas/) auf die gleiche Weise bezahlen wie für eine einfache ETH-Überweisung. Allerdings sind die Gaskosten für die Vertragsbereitstellung weitaus höher. +Jeder kann einen Smart Contract schreiben und im Netzwerk bereitstellen. Sie müssen nur lernen, wie man in einer [Smart-Contract-Sprache](/developers/docs/smart-contracts/languages/) programmiert, und über genügend ETH verfügen, um Ihren Vertrag bereitzustellen. Die Bereitstellung eines Smart Contracts ist technisch gesehen eine Transaktion, daher müssen Sie [Gas](/developers/docs/gas/) auf die gleiche Weise bezahlen, wie Sie Gas für eine einfache ETH-Überweisung bezahlen müssen. Die Gaskosten für die Bereitstellung von Verträgen sind jedoch weitaus höher. -Ethereum bietet entwicklerfreundliche Sprachen zum Schreiben von Smart Contracts: +Ethereum verfügt über entwicklerfreundliche Sprachen zum Schreiben von Smart Contracts: - Solidity - Vyper -[Mehr über Sprachen](/developers/docs/smart-contracts/languages/) +[Mehr zu Sprachen](/developers/docs/smart-contracts/languages/) -Allerdings müssen sie kompiliert werden, bevor sie bereitgestellt werden können, damit die Ethereum-Virtual Machine den Vertrag interpretieren und speichern kann. [Mehr zur Kompilierung](/developers/docs/smart-contracts/compiling/) +Sie müssen jedoch kompiliert werden, bevor sie bereitgestellt werden können, damit die Ethereum Virtual Machine den Vertrag interpretieren und speichern kann. [Mehr zur Kompilierung](/developers/docs/smart-contracts/compiling/) ## Zusammensetzbarkeit {#composability} -Smart Contracts sind auf Ethereum öffentlich. Sie können sie sich als offene APIs vorstellen. Das bedeutet, dass Sie andere Smart Contracts in Ihrem eigenen Smart Contract aufrufen können, um die Anwendungsmöglichkeiten deutlich zu erweitern. Verträge können sogar andere Verträge bereitstellen. +Smart Contracts sind auf Ethereum öffentlich und können als offene APIs betrachtet werden. Das bedeutet, dass Sie andere Smart Contracts in Ihrem eigenen Smart Contract aufrufen können, um die Möglichkeiten erheblich zu erweitern. Verträge können sogar andere Verträge bereitstellen. Erfahren Sie mehr über die [Zusammensetzbarkeit von Smart Contracts](/developers/docs/smart-contracts/composability/). ## Einschränkungen {#limitations} -Smart Contracts allein können keine Informationen über „echte Welt“-Ereignisse erhalten, da sie keine Daten von Offchain-Quellen abrufen können. Das bedeutet, dass sie nicht auf Ereignisse in der realen Welt reagieren können. Das ist beabsichtigt. Sich auf externe Informationen zu verlassen, könnte den für Sicherheit und Dezentralisierung wichtigen Konsens gefährden. +Smart Contracts allein können keine Informationen über Ereignisse in der „realen Welt“ erhalten, da sie keine Daten aus Off-Chain-Quellen abrufen können. Das bedeutet, dass sie nicht auf Ereignisse in der realen Welt reagieren können. Dies ist beabsichtigt. Sich auf externe Informationen zu verlassen, könnte den Konsens gefährden, der für Sicherheit und Dezentralisierung wichtig ist. -Allerdings ist es wichtig, dass Blockchain-Anwendungen Off-Chain-Daten nutzen können. Die Lösung sind [Orakel](/developers/docs/oracles/), Werkzeuge, die Off-Chain-Daten aufnehmen und sie für Smart Contracts verfügbar machen. +Für Blockchain-Anwendungen ist es jedoch wichtig, Off-Chain-Daten nutzen zu können. Die Lösung sind [Orakel](/developers/docs/oracles/), also Werkzeuge, die Off-Chain-Daten aufnehmen und für Smart Contracts verfügbar machen. -Eine weitere Einschränkung von Smart Contracts ist die maximale Vertragsgröße. Ein Smart Contract kann maximal 24 KB groß sein, sonst gehen ihm die Ressourcen aus. Dies kann durch die Verwendung des [Diamond Pattern](https://eips.ethereum.org/EIPS/eip-2535) umgangen werden. +Eine weitere Einschränkung von Smart Contracts ist die maximale Vertragsgröße. Ein Smart Contract darf maximal 24 KB groß sein, andernfalls geht ihm das Gas aus. Dies kann durch die Verwendung des [Diamond Patterns](https://eips.ethereum.org/EIPS/eip-2535) umgangen werden. -## Multisig-Verträge {#multisig} +## Mehrfachsignatur-Verträge {#multisig} -Multisig-Verträge (multiple Signaturen) sind Smart Contract-Accounts, die mehrere gültige Unterschriften erfordern, um eine Transaktion durchzuführen. Dies ist sehr nützlich, um einzelne Schwachstellen bei Verträgen zu vermeiden, die große Mengen an Ether oder anderen Token enthalten. Multisig-Verträge teilen außerdem die Verantwortung für die Vertragsausführung und die Schlüsselverwaltung auf mehrere Parteien auf und verhindern den Verlust eines einzigen privaten Schlüssels, der sonst zu einem irreversiblen Verlust von Geldern führt. Aus diesen Gründen können Multisig-Verträge für eine einfache DAO-Governance verwendet werden. Multisigs erfordern N von M möglichen akzeptablen Signaturen (wobei N ≤ M und M > 1), um ausgeführt zu werden. `N = 3, M = 5` und `N = 4, M = 7` werden häufig verwendet. Ein 4/7-Multisig-Vertrag erfordert vier von sieben möglichen gültigen Unterschriften. Das bedeutet, dass die Gelder auch dann noch abrufbar sind, wenn drei Unterschriften verloren gehen. In diesem Fall bedeutet es auch, dass die Mehrheit der Schlüsselinhaber zustimmen und unterschreiben muss, damit der Vertrag ausgeführt werden kann. +Mehrfachsignatur-Verträge (Multisig) sind Smart-Contract-Konten, die mehrere gültige Signaturen erfordern, um eine Transaktion auszuführen. Dies ist sehr nützlich, um Single Points of Failure bei Verträgen zu vermeiden, die beträchtliche Mengen an Ether oder anderen Token halten. Mehrfachsignaturen teilen auch die Verantwortung für die Vertragsausführung und die Schlüsselverwaltung auf mehrere Parteien auf und verhindern, dass der Verlust eines einzelnen Private-Keys zu einem irreversiblen Verlust von Geldern führt. Aus diesen Gründen können Mehrfachsignatur-Verträge für eine einfache DAO-Governance verwendet werden. Mehrfachsignaturen erfordern N Signaturen von M möglichen akzeptablen Signaturen (wobei N ≤ M und M > 1), um ausgeführt zu werden. `N = 3, M = 5` und `N = 4, M = 7` werden häufig verwendet. Eine 4/7-Mehrfachsignatur erfordert vier von sieben möglichen gültigen Signaturen. Das bedeutet, dass die Gelder auch dann noch abrufbar sind, wenn drei Signaturen verloren gehen. In diesem Fall bedeutet es auch, dass die Mehrheit der Schlüsselbesitzer zustimmen und unterschreiben muss, damit der Vertrag ausgeführt wird. -## Ressourcen für Smart Contracts {#smart-contract-resources} +## Ressourcen zu Smart Contracts {#smart-contract-resources} -**OpenZeppelin Contracts -** **_Bibliothek für die sichere Entwicklung von Smart Contracts._** +**OpenZeppelin Contracts –** **_Bibliothek für die sichere Entwicklung von Smart Contracts._** - [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [Community-Forum](https://forum.openzeppelin.com/c/general/16) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [Coinbase: Was ist ein Smart Contract?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) - [Chainlink: Was ist ein Smart Contract?](https://chain.link/education/smart-contracts) - [Video: Einfach erklärt – Smart Contracts](https://youtu.be/ZE2HxTmxfrI) -- [Cyfrin Updraft: Web3-Lern- und Audit-Plattform](https://updraft.cyfrin.io) +- [Cyfrin Updraft: Web3-Lern- und Auditierungsplattform](https://updraft.cyfrin.io) + +## Tutorials: Smart-Contract-Signaturen (EIP-1271) auf Ethereum {#tutorials} + +- [EIP-1271: Signieren und Verifizieren von Smart-Contract-Signaturen](/developers/tutorials/eip-1271-smart-contract-signatures/) _– Wie EIP-1271 es Smart Contracts ermöglicht, Signaturen zu verifizieren, mit einer exemplarischen Vorgehensweise der Safe-Implementierung._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/languages/index.md b/public/content/translations/de/developers/docs/smart-contracts/languages/index.md index 46ee17b0b47..ebd3d9737ef 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/languages/index.md @@ -1,35 +1,35 @@ --- -title: Sprachen von Smart Contracts -description: "Übersicht und Vergleich der zwei wichtigsten Smart-Contract-Sprachen – Solidity und Vyper" +title: Smart-Contract-Sprachen +description: "Ein Überblick und Vergleich der beiden wichtigsten Smart-Contract-Sprachen – Solidity und Vyper." lang: de --- -Das Tolle an Ethereum ist, dass Smart Contracts mit relativ Entwickler-freundlichen Sprachen programmiert werden können. Wenn Sie Erfahrung mit Python oder einer [Sprache mit geschweiften Klammern](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages) haben, können Sie eine Sprache mit vertrauter Syntax finden. +Ein großartiger Aspekt von [Ethereum](/) ist, dass Smart Contracts mit relativ entwicklerfreundlichen Sprachen programmiert werden können. Wenn Sie Erfahrung mit Python oder einer anderen [Programmiersprache mit geschweiften Klammern](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages) haben, werden Sie eine Sprache mit vertrauter Syntax finden. -Die zwei häufig genutzten und aktuellsten Sprachen sind: +Die beiden aktivsten und am besten gepflegten Sprachen sind: - Solidity - Vyper -Remix IDE bietet eine umfassende Entwicklungsumgebung zum Erstellen und Testen von Contracts in Solidity als auch in Vyper. [Probieren Sie die Remix IDE im Browser aus](https://remix.ethereum.org), um mit dem Programmieren zu beginnen. +Die Remix IDE bietet eine umfassende Entwicklungsumgebung zum Erstellen und Testen von Verträgen in Solidity und Vyper. [Probieren Sie die browserbasierte Remix IDE aus](https://remix.ethereum.org), um mit dem Programmieren zu beginnen. -Erfahrenere Entwickler möchten vielleicht auch Yul, eine Zwischensprache für die [Ethereum Virtual Machine](/developers/docs/evm/), oder Yul+, eine Erweiterung von Yul, verwenden. +Erfahrenere Entwickler möchten vielleicht auch Yul verwenden, eine Zwischensprache für die [Ethereum Virtual Machine](/developers/docs/evm/), oder Yul+, eine Erweiterung von Yul. -Wenn Sie neugierig sind und gerne dabei helfen, neue, noch in der Entwicklung befindliche Sprachen zu testen, können Sie mit Fe experimentieren, einer aufstrebenden Smart-Contract-Sprache, die derzeit noch in den Kinderschuhen steckt. +Wenn Sie neugierig sind und dabei helfen möchten, neue Sprachen zu testen, die sich noch in der intensiven Entwicklung befinden, können Sie mit Fe experimentieren, einer aufstrebenden Smart-Contract-Sprache, die noch in den Kinderschuhen steckt. ## Voraussetzungen {#prerequisites} -Vorwissen über andere Programmiersprachen, insbesondere JavaScript oder Python, ist hilfreich, um Smart-Contract-Sprachen und die Unterschiede zwischen den jeweiligen Sprachen schneller zu verstehen. Wir empfehlen Ihnen außerdem, sich mit dem Grundkonzept von Smart Contracts vertraut zu machen, bevor Sie sich die Unterschiede der Smart-Contract-Sprachen genauer ansehen. [Einführung in Smart Contracts](/developers/docs/smart-contracts/). +Vorkenntnisse in Programmiersprachen, insbesondere in JavaScript oder Python, können Ihnen helfen, die Unterschiede zwischen Smart-Contract-Sprachen zu verstehen. Wir empfehlen Ihnen außerdem, Smart Contracts als Konzept zu verstehen, bevor Sie sich zu tief in die Sprachvergleiche einarbeiten. [Einführung in Smart Contracts](/developers/docs/smart-contracts/). ## Solidity {#solidity} -- Objektorientierte Hochsprache zur Implementierung von Smart Contracts -- Sprache mit geschweiften Klammern, die am stärksten von C++ beeinflusst wurde -- Statisch typisiert (der Typ einer Variable ist zur Kompilationszeit bekannt) +- Objektorientierte Hochsprache zur Implementierung von Smart Contracts. +- Sprache mit geschweiften Klammern, die am stärksten von C++ beeinflusst wurde. +- Statisch typisiert (der Typ einer Variablen ist zur Kompilierzeit bekannt). - Unterstützt: - - Vererbung (Sie können andere Smart Contracts erweitern) - - Bibliotheken (Sie können wiederverwertbaren Code programmieren, den Sie von verschiedenen Smart Contracts aus abrufen können – wie z. B. in statischen Funktionen in einer statischen Klasse in anderen objektorientierten Programmiersprachen) - - Komplexe benutzerdefinierte Typen + - Vererbung (Sie können andere Verträge erweitern). + - Bibliotheken (Sie können wiederverwendbaren Code erstellen, den Sie aus verschiedenen Verträgen aufrufen können – wie statische Funktionen in einer statischen Klasse in anderen objektorientierten Programmiersprachen). + - Komplexe benutzerdefinierte Typen. ### Wichtige Links {#important-links} @@ -37,8 +37,8 @@ Vorwissen über andere Programmiersprachen, insbesondere JavaScript oder Python, - [Solidity-Sprachportal](https://soliditylang.org/) - [Solidity by Example](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Matrix-Chatroom](https://gitter.im/ethereum/solidity) überbrückt zum [Solidity Matrix-Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) -- [Spickzettel](https://reference.auditless.com/cheatsheet) +- [Solidity Gitter-Chatroom](https://gitter.im/ethereum/solidity) überbrückt zum [Solidity Matrix-Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Spickzettel (Cheat Sheet)](https://reference.auditless.com/cheatsheet) - [Solidity-Blog](https://blog.soliditylang.org/) - [Solidity auf Twitter](https://twitter.com/solidity_lang) @@ -50,7 +50,7 @@ pragma solidity >= 0.7.0; contract Coin { // Das Schlüsselwort "public" macht Variablen - // für andere Verträge zugänglich + // von anderen Verträgen aus zugänglich address public minter; mapping (address => uint) public balances; @@ -64,7 +64,7 @@ contract Coin { minter = msg.sender; } - // Sendet eine Menge neu erstellter Münzen an eine Adresse + // Sendet eine Menge neu erstellter Coins an eine Adresse // Kann nur vom Vertragsersteller aufgerufen werden function mint(address receiver, uint amount) public { require(msg.sender == minter); @@ -72,10 +72,10 @@ contract Coin { balances[receiver] += amount; } - // Sendet eine Menge vorhandener Münzen + // Sendet eine Menge existierender Coins // von einem beliebigen Aufrufer an eine Adresse function send(address receiver, uint amount) public { - require(amount <= balances[msg.sender], "Guthaben nicht ausreichend."); + require(amount <= balances[msg.sender], "Insufficient balance."); balances[msg.sender] -= amount; balances[receiver] += amount; emit Sent(msg.sender, receiver, amount); @@ -83,39 +83,39 @@ contract Coin { } ``` -Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Solidity aussieht. Eine detailliertere Beschreibung der Funktionen und Variablen finden Sie [in der Dokumentation](https://docs.soliditylang.org/en/latest/contracts.html). +Dieses Beispiel soll Ihnen ein Gefühl dafür geben, wie die Syntax von Solidity-Verträgen aussieht. Für eine detailliertere Beschreibung der Funktionen und Variablen [siehe die Dokumentation](https://docs.soliditylang.org/en/latest/contracts.html). ## Vyper {#vyper} - Pythonische Programmiersprache -- Starke Typisierung -- Kompilierter Code ist kurz und nachvollziehbar +- Strenge Typisierung +- Kleiner und verständlicher Compiler-Code - Effiziente Bytecode-Generierung -- Hat beabsichtigterweise weniger Funktionen als Solidity – mit dem Ziel, die Smart Contracts sicherer und einfacherer auditierbar zu machen. Vyper bietet keine Untersützung für: - - Modifikationen +- Hat absichtlich weniger Funktionen als Solidity mit dem Ziel, Verträge sicherer und einfacher zu prüfen (auditieren) zu machen. Vyper unterstützt Folgendes nicht: + - Modifikatoren (Modifiers) - Vererbung - Inline-Assembly - Funktionsüberladung - Operatorüberladung - - Rekursive Abfragen - - Schleifen mit unendlicher Länge - - Binäre Fixpunkte + - Rekursive Aufrufe + - Endlosschleifen + - Binäre Festkommazahlen -Für weitere Informationen [lesen Sie die Begründung für Vyper](https://vyper.readthedocs.io/en/latest/index.html). +Für weitere Informationen [lesen Sie die Grundprinzipien von Vyper](https://vyper.readthedocs.io/en/latest/index.html). ### Wichtige Links {#important-links-1} - [Dokumentation](https://vyper.readthedocs.io) - [Vyper by Example](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) -- [More Vyper by Example](https://vyper-by-example.org/) +- [Mehr Vyper by Example](https://vyper-by-example.org/) - [GitHub](https://github.com/vyperlang/vyper) -- [Vyper-Community-Discord-Chat](https://discord.gg/SdvKC79cJk) -- [Spickzettel](https://reference.auditless.com/cheatsheet) -- [Entwicklungsframeworks und Tools für Smart Contracts für Vyper](/developers/docs/programming-languages/python/) -- [VyperPunk – Lernen Sie, Vyper-Smart-Contracts zu sichern und zu hacken](https://github.com/SupremacyTeam/VyperPunk) -- [Vyper-Hub für die Entwicklung](https://github.com/zcor/vyper-dev) -- [Vyper Greatest Hits: Beispiele für Smart Contracts](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) -- [Awesome Vyper – Kuratierte Ressourcen](https://github.com/spadebuilders/awesome-vyper) +- [Vyper-Community Discord-Chat](https://discord.gg/SdvKC79cJk) +- [Spickzettel (Cheat Sheet)](https://reference.auditless.com/cheatsheet) +- [Frameworks und Tools zur Smart-Contract-Entwicklung für Vyper](/developers/docs/programming-languages/python/) +- [VyperPunk – lernen Sie, Vyper Smart Contracts zu sichern und zu hacken](https://github.com/SupremacyTeam/VyperPunk) +- [Vyper Hub für die Entwicklung](https://github.com/zcor/vyper-dev) +- [Vyper Greatest Hits Smart-Contract-Beispiele](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) +- [Awesome Vyper – kuratierte Ressourcen](https://github.com/spadebuilders/awesome-vyper) ### Beispiel {#example} @@ -123,96 +123,78 @@ Für weitere Informationen [lesen Sie die Begründung für Vyper](https://vyper. # Offene Auktion # Auktionsparameter - -# Der Begünstigte erhält Geld vom Höchstbietenden - +# Begünstigter erhält Geld vom Höchstbietenden beneficiary: public(address) auctionStart: public(uint256) auctionEnd: public(uint256) -# Aktueller Stand der Auktion - +# Aktueller Status der Auktion highestBidder: public(address) highestBid: public(uint256) -# Wird am Ende auf „true“ gesetzt, verbietet jede Änderung - +# Wird am Ende auf true gesetzt, verbietet jegliche Änderung ended: public(bool) -# Nachverfolgung der zurückgezahlten Gebote, damit wir dem Auszahlungsmuster folgen können - +# Rückerstattete Gebote nachverfolgen, damit wir dem Auszahlungsmuster folgen können pendingReturns: public(HashMap[address, uint256]) -# Erstellt eine einfache Auktion mit `_bidding_time` - +# Erstelle eine einfache Auktion mit `_bidding_time` # Sekunden Bietzeit im Namen der - # Begünstigten-Adresse `_beneficiary`. - @external def __init__(_beneficiary: address, _bidding_time: uint256): self.beneficiary = _beneficiary self.auctionStart = block.timestamp self.auctionEnd = self.auctionStart + _bidding_time -# Mit dem Wert, der zusammen mit dieser Transaktion - -# gesendet wird, auf die Auktion bieten. - -# Der Wert wird nur dann zurückerstattet, - -# wenn die Auktion nicht gewonnen wird. - +# Biete bei der Auktion mit dem gesendeten Wert +# zusammen mit dieser Transaktion. +# Der Wert wird nur zurückerstattet, wenn die +# Auktion nicht gewonnen wird. @external @payable def bid(): - # Prüfen, ob die Bietfrist abgelaufen ist. + # Prüfe, ob die Bietzeit abgelaufen ist. assert block.timestamp < self.auctionEnd - # Prüfen, ob das Gebot hoch genug ist + # Prüfe, ob das Gebot hoch genug ist assert msg.value > self.highestBid - # Rückerstattung für den vorherigen Höchstbietenden nachverfolgen + # Verfolge die Rückerstattung für den vorherigen Höchstbietenden self.pendingReturns[self.highestBidder] += self.highestBid - # Neues Höchstgebot nachverfolgen + # Verfolge neues Höchstgebot self.highestBidder = msg.sender self.highestBid = msg.value -# Ein zuvor erstattetes Gebot abheben. Das Auszahlungsmuster wird - +# Ein zuvor zurückerstattetes Gebot abheben. Das Auszahlungsmuster wird # hier verwendet, um ein Sicherheitsproblem zu vermeiden. Wenn Rückerstattungen direkt - -# als Teil von bid() gesendet würden, könnte ein bösartiger Bietvertrag - +# als Teil von bid() gesendet würden, könnte ein bösartiger Biet-Vertrag # diese Rückerstattungen blockieren und somit das Eingehen neuer, höherer Gebote verhindern. - @external def withdraw(): pending_amount: uint256 = self.pendingReturns[msg.sender] self.pendingReturns[msg.sender] = 0 send(msg.sender, pending_amount) -# Die Auktion beenden und das höchste Gebot an - -# den Begünstigten senden. - +# Beende die Auktion und sende das Höchstgebot +# an den Begünstigten. @external def endAuction(): - # Es ist eine gute Richtlinie, Funktionen, die mit anderen Verträgen interagieren - # (d. h. sie rufen Funktionen auf oder senden Ether), - # in drei Phasen zu gliedern: - # 1. Überprüfung der Bedingungen - # 2. Ausführung von Aktionen (potenziell ändernde Bedingungen) + # Es ist eine gute Richtlinie, Funktionen, die mit + # anderen Verträgen interagieren (d.h. sie rufen Funktionen auf oder senden Ether), + # in drei Phasen zu strukturieren: + # 1. Bedingungen prüfen + # 2. Aktionen ausführen (möglicherweise Bedingungen ändern) # 3. Interaktion mit anderen Verträgen # Wenn diese Phasen vermischt werden, könnte der andere Vertrag # in den aktuellen Vertrag zurückrufen und den Zustand ändern oder bewirken, - # dass Effekte (Ether-Auszahlung) mehrmals ausgeführt werden. - # Wenn intern aufgerufene Funktionen die Interaktion mit externen + # dass Effekte (Ether-Auszahlung) mehrfach ausgeführt werden. + # Wenn intern aufgerufene Funktionen Interaktionen mit externen # Verträgen beinhalten, müssen sie ebenfalls als Interaktion mit # externen Verträgen betrachtet werden. # 1. Bedingungen - # Prüfen, ob die Endzeit der Auktion erreicht ist + # Prüfe, ob die Endzeit der Auktion erreicht wurde assert block.timestamp >= self.auctionEnd - # Prüfen, ob diese Funktion bereits aufgerufen wurde + # Prüfe, ob diese Funktion bereits aufgerufen wurde assert not self.ended # 2. Effekte @@ -222,23 +204,23 @@ def endAuction(): send(self.beneficiary, self.highestBid) ``` -Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Vyper aussieht. Eine detailliertere Beschreibung der Funktionen und Variablen finden Sie [in der Dokumentation](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). +Dieses Beispiel soll Ihnen ein Gefühl dafür geben, wie die Syntax von Vyper-Verträgen aussieht. Für eine detailliertere Beschreibung der Funktionen und Variablen [siehe die Dokumentation](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). ## Yul und Yul+ {#yul} -Falls Sie noch nicht mit Ethereum vertraut sind und Sie noch nie mit Smart-Contract-Sprachen programmiert haben, empfehlen wir Ihnen, zunächst mit Solidity oder Vyper anzufangen. Verwenden Sie Yul oder Yul+ bitte nur dann, wenn Sie sich mit den bewähren Methoden für sicheres Programmieren mit Smart-Contract-Sprachen und den Besonderheiten beim Arbeiten mit der EVM auskennen. +Wenn Sie neu bei Ethereum sind und noch nicht mit Smart-Contract-Sprachen programmiert haben, empfehlen wir Ihnen, mit Solidity oder Vyper zu beginnen. Beschäftigen Sie sich erst mit Yul oder Yul+, wenn Sie mit den Best Practices für die Sicherheit von Smart Contracts und den Besonderheiten der Arbeit mit der EVM vertraut sind. **Yul** -- Intermediäre Sprache für Ethereum. -- Unterstützt die [EVM](/developers/docs/evm) und [Ewasm](https://github.com/ewasm), ein WebAssembly im Ethereum-Stil, und ist als brauchbarer gemeinsamer Nenner beider Plattformen konzipiert. -- Ein gutes Ziel für High-Level-Optimierungsstufen, von denen sowohl EVM als auch eWASM-Plattformen gleichermaßen profitieren können +- Zwischensprache für Ethereum. +- Unterstützt die [EVM](/developers/docs/evm) und [Ewasm](https://github.com/ewasm), eine Ethereum-spezifische WebAssembly, und ist als nutzbarer gemeinsamer Nenner beider Plattformen konzipiert. +- Gutes Ziel für High-Level-Optimierungsstufen, von denen sowohl EVM- als auch Ewasm-Plattformen gleichermaßen profitieren können. **Yul+** -- Eine hocheffiziente Yul-Erweiterung auf unterer Ebene -- Ursprünglich für einen [Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/)-Vertrag konzipiert. -- Yul+ kann als ein Vorschlag für ein experimentelles Upgrade für Yul betrachtet werden, das neue Funktionen hinzufügt +- Eine Low-Level-, hocheffiziente Erweiterung von Yul. +- Ursprünglich für einen [Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/)-Vertrag entwickelt. +- Yul+ kann als experimenteller Upgrade-Vorschlag für Yul betrachtet werden, der neue Funktionen hinzufügt. ### Wichtige Links {#important-links-2} @@ -248,8 +230,7 @@ Falls Sie noch nicht mit Ethereum vertraut sind und Sie noch nie mit Smart-Contr ### Beispielvertrag {#example-contract-2} -Das folgende einfache Beispiel implementiert eine Power-Funktion. Es kann mit `solc --strict-assembly --bin input.yul` kompiliert werden. Das Beispiel -sollte in der Datei "input.yul" gespeichert werden. +Das folgende einfache Beispiel implementiert eine Potenzfunktion. Es kann mit `solc --strict-assembly --bin input.yul` kompiliert werden. Das Beispiel sollte in der Datei input.yul gespeichert werden. ``` { @@ -270,26 +251,26 @@ sollte in der Datei "input.yul" gespeichert werden. } ``` -Wenn Sie bereits viel Erfahrung mit Smart Contracts haben, finden Sie eine vollständige ERC20-Implementierung in Yul [hier](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example). +Wenn Sie bereits viel Erfahrung mit Smart Contracts haben, finden Sie [hier](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example) eine vollständige ERC20-Implementierung in Yul. ## Fe {#fe} -- Statisch typisierte Sprache für die Ethereum-Virtual Machine (EVM) -- Inspiriert von Python und Rust -- Es soll einfach zu erlernen sein – auch für Entwickler, die neu im Ethereum-Ökosystem sind -- Die Fe-Entwicklung befindet sich noch in der Anfangsphase, die Alpha-Version der Sprache wurde im Januar 2021 veröffentlicht +- Statisch typisierte Sprache für die Ethereum Virtual Machine (EVM). +- Inspiriert von Python und Rust. +- Zielt darauf ab, leicht erlernbar zu sein – auch für Entwickler, die neu im Ethereum-Ökosystem sind. +- Die Entwicklung von Fe befindet sich noch in einem frühen Stadium, die Sprache hatte ihre Alpha-Veröffentlichung im Januar 2021. ### Wichtige Links {#important-links-3} - [GitHub](https://github.com/ethereum/fe) -- [Fe-Ankündigung](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) -- [Fe-Roadmap 2021](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [Fe-Ankündigung](https://blog.fe-lang.org/posts/fe-a-new-language-for-the-ethereum-ecosystem/) +- [Fe 2021 Roadmap](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) - [Fe Discord-Chat](https://discord.com/invite/ywpkAXFjZH) - [Fe auf Twitter](https://twitter.com/official_fe) ### Beispielvertrag {#example-contract-3} -Im Folgenden ist ein einfacher Vertrag in Fe implementiert: +Das Folgende ist ein einfacher Vertrag, der in Fe implementiert ist. ``` type BookMsg = bytes[100] @@ -310,34 +291,34 @@ contract GuestBook: ``` -## Wie Sie die richtige Wahl treffen {#how-to-choose} +## Wie man sich entscheidet {#how-to-choose} -Wie bei jeder anderen Programmiersprache geht es vor allem darum, das geeignete Tool für den richtigen Job nach den persönlichen Präferenzen zu wählen. +Wie bei jeder anderen Programmiersprache geht es meistens darum, das richtige Werkzeug für die richtige Aufgabe zu wählen, sowie um persönliche Vorlieben. -Im Folgenden finden Sie einige Apsekte, die Sie in Betracht ziehen können, wenn Sie noch keine der Sprachen ausprobiert haben: +Hier sind ein paar Dinge, die Sie beachten sollten, wenn Sie noch keine der Sprachen ausprobiert haben: -### Was ist gut an Solidity? {#solidity-advantages} +### Was ist großartig an Solidity? {#solidity-advantages} -- Wenn Sie Anfänger sind, gibt es viele Tutorials und Lerntools. Weitere Informationen dazu finden Sie im Abschnitt [Lernen durch Programmieren](/developers/learning-tools/). -- Gute Entwicklertools verfügbar -- Solidity hat eine große Entwickler-Community. Das bedeutet, dass Sie höchstwahrscheinlich ziemlich schnell Antworten auf Ihre Fragen finden. +- Wenn Sie Anfänger sind, gibt es viele Tutorials und Lernwerkzeuge. Mehr dazu finden Sie im Abschnitt [Lernen durch Programmieren](/developers/learning-tools/). +- Gute Entwickler-Tools verfügbar. +- Solidity hat eine große Entwickler-Community, was bedeutet, dass Sie höchstwahrscheinlich recht schnell Antworten auf Ihre Fragen finden werden. -### Was ist gut an Vyper? {#vyper-advatages} +### Was ist großartig an Vyper? {#vyper-advatages} -- Gute Einstiegsmöglichkeit für Python-Entwickler, um Smart Contracts kennenzulernen und in das Thema einzusteigen -- Vyper bietet weniger Funktionen und das erleichtert ein schnelleres Prototyping von Ideen. -- Vyper hat sich zum Ziel gesetzt, leicht auditierbar und möglichst für Menschen lesbar zu sein. +- Großartiger Einstieg für Python-Entwickler, die Smart Contracts schreiben möchten. +- Vyper hat eine geringere Anzahl von Funktionen, was es ideal für das schnelle Prototyping von Ideen macht. +- Vyper zielt darauf ab, leicht zu prüfen (auditieren) und maximal menschenlesbar zu sein. -### Was ist gut an Yul und Yul+? {#yul-advantages} +### Was ist großartig an Yul und Yul+? {#yul-advantages} -- Einfache und funktionale Low-Level-Sprachen -- Ermöglicht die Annäherung an rohe EVM, was dazu beitragen kann, den Ressourcnverbrauch Ihrer Smart Contracts zu optimieren. +- Vereinfachte und funktionale Low-Level-Sprache. +- Ermöglicht es, viel näher an die rohe EVM heranzukommen, was helfen kann, den Gasverbrauch Ihrer Verträge zu optimieren. ## Sprachvergleiche {#language-comparisons} -Vergleiche von grundlegender Syntax, Vertragslebenszyklus, Schnittstellen, Operatoren, Datenstrukturen, Funktionen, Kontrollfluss und mehr finden Sie in diesem [Spickzettel von Auditless](https://reference.auditless.com/cheatsheet/) +Für Vergleiche der grundlegenden Syntax, des Vertragslebenszyklus, der Schnittstellen, Operatoren, Datenstrukturen, Funktionen, des Kontrollflusses und mehr, schauen Sie sich diesen [Spickzettel von Auditless](https://reference.auditless.com/cheatsheet/) an. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Solidity-Vertragsbibliothek von OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/) -- [Solidity by Example](https://solidity-by-example.org) +- [Solidity Contracts Library von OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/) +- [Solidity by Example](https://solidity-by-example.org) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md index e555015e6c5..e366ee49e7c 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md @@ -1,26 +1,26 @@ --- -title: Smart Contract-Bibliotheken -description: Entdecken Sie wiederverwendbare Smart Contract Bibliotheken und Bausteine, um Ihre Ethereum-Entwicklungsprojekte zu beschleunigen. +title: Smart-Contract-Bibliotheken +description: Entdecken Sie wiederverwendbare Smart-Contract-Bibliotheken und Bausteine, um Ihre Ethereum-Entwicklungsprojekte zu beschleunigen. lang: de --- -Sie müssen in Ihrem Projekt nicht jeden Smart Contract von Grund auf neu erstellen. Es gibt viele Open-Source-Smart-Contract-Bibliotheken, die wiederverwendbare Bausteine für Ihr Projekt bereitstellen. Damit müssen Sie das Rad nicht neu erfinden. +Sie müssen nicht jeden Smart Contract in Ihrem Projekt von Grund auf neu schreiben. Es gibt viele Open-Source-Smart-Contract-Bibliotheken, die wiederverwendbare Bausteine für Ihr Projekt bereitstellen und Ihnen ersparen, das Rad neu erfinden zu müssen. ## Voraussetzungen {#prerequisites} -Bevor wir in die Smart-Contract-Bibliothek einsteigen, ist es ratsam, sich mit den Grundlagen der Smart-Contract-Struktur vertraut zu machen. Schaue bei der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) vorbei, falls du das noch nicht getan hast. +Bevor Sie sich mit Smart-Contract-Bibliotheken befassen, ist es eine gute Idee, ein gutes Verständnis für die Struktur eines Smart Contracts zu haben. Gehen Sie zu [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/), falls Sie dies noch nicht getan haben. -## Was steckt in einer Bibliothek? {#whats-in-a-library} +## Was ist in einer Bibliothek {#whats-in-a-library} -Normalerweise finden Sie zwei Arten von Erstellungsblöcken in einer Smart Contract Bibliothek: wiederverwendbare Verhaltensweisen, die Sie Ihren Verträgen hinzufügen können, und die Implementierungen verschiedener Standards. +In Smart-Contract-Bibliotheken finden Sie normalerweise zwei Arten von Bausteinen: wiederverwendbare Verhaltensweisen, die Sie Ihren Verträgen hinzufügen können, und Implementierungen verschiedener Standards. ### Verhaltensweisen {#behaviors} -Wenn du Smart Contracts schreibst, ist die Wahrscheinlichkeit groß, dass du immer wieder ähnliche Muster schreibst, wie z. B. die Zuweisung einer _Admin_-Adresse zur Durchführung geschützter Operationen in einem Vertrag oder das Hinzufügen einer Notfall-_Pause_-Schaltfläche für den Fall eines unerwarteten Problems. +Beim Schreiben von Smart Contracts ist die Wahrscheinlichkeit groß, dass Sie immer wieder ähnliche Muster schreiben, wie z. B. die Zuweisung einer _Admin_-Adresse zur Ausführung geschützter Operationen in einem Vertrag oder das Hinzufügen einer Notfall-_Pause_-Schaltfläche im Falle eines unerwarteten Problems. -Bibliotheken für Smart Contracts bieten in der Regel wiederverwendbare Implementierungen dieser Verhaltensweisen als [Bibliotheken](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) oder über [Vererbung](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) in Solidity. +Smart-Contract-Bibliotheken bieten in der Regel wiederverwendbare Implementierungen dieser Verhaltensweisen als [Bibliotheken](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) oder über [Vererbung](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) in Solidity. -Als Beispiel folgt eine vereinfachte Version des [`Ownable`-Vertrags](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) aus der [OpenZeppelin Contracts-Bibliothek](https://github.com/OpenZeppelin/openzeppelin-contracts), der eine Adresse als Eigentümer eines Vertrags festlegt und einen Modifikator zur Verfügung stellt, um den Zugriff auf eine Methode nur auf diesen Eigentümer zu beschränken. +Als Beispiel folgt eine vereinfachte Version des [`Ownable`-Vertrags](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) aus der [OpenZeppelin Contracts-Bibliothek](https://github.com/OpenZeppelin/openzeppelin-contracts), der eine Adresse als Eigentümer eines Vertrags festlegt und einen Modifikator bereitstellt, um den Zugriff auf eine Methode nur auf diesen Eigentümer zu beschränken. ```solidity contract Ownable { @@ -37,35 +37,35 @@ contract Ownable { } ``` -Um einen solchen Baustein in Ihrem Vertrag zu verwenden, müssen Sie ihn zuerst importieren und dann in Ihren eigenen Verträgen erweitern. Dadurch kannst du den vom Basisvertrag `Ownable` bereitgestellten Modifikator verwenden, um deine eigenen Funktionen zu sichern. +Um einen solchen Baustein in Ihrem Vertrag zu verwenden, müssen Sie ihn zunächst importieren und dann in Ihren eigenen Verträgen erweitern. Dadurch können Sie den vom Basisvertrag `Ownable` bereitgestellten Modifikator verwenden, um Ihre eigenen Funktionen abzusichern. ```solidity -import ".../Ownable.sol"; // Path to the imported library +import ".../Ownable.sol"; // Pfad zur importierten Bibliothek contract MyContract is Ownable { - // The following function can only be called by the owner + // Die folgende Funktion kann nur vom Eigentümer aufgerufen werden function secured() onlyOwner public { msg.sender.transfer(1 ether); } } ``` -Ein weiteres beliebtes Beispiel ist [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) oder [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Das sind Bibliotheken (im Gegensatz zu Basisverträgen), die arithmetische Funktionen mit Überlaufprüfungen bereitstellen, die von der Sprache nicht bereitgestellt werden. Es empfiehlt sich, eine dieser Bibliotheken anstelle von nativen arithmetischen Operationen zu verwenden, um Ihren Vertrag vor Überläufen zu schützen, die katastrophale Folgen haben können! +Ein weiteres beliebtes Beispiel ist [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) oder [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Dies sind Bibliotheken (im Gegensatz zu Basisverträgen), die arithmetische Funktionen mit Überlaufprüfungen bereitstellen, die von der Sprache nicht bereitgestellt werden. Es ist eine gute Praxis, eine dieser Bibliotheken anstelle nativer arithmetischer Operationen zu verwenden, um Ihren Vertrag vor Überläufen zu schützen, die katastrophale Folgen haben können! ### Standards {#standards} -Um die [Komponierbarkeit und Interoperabilität](/developers/docs/smart-contracts/composability/) zu erleichtern, hat die Ethereum-Community mehrere Standards in Form von **ERCs** definiert. Mehr darüber erfährst du im Abschnitt [Standards](/developers/docs/standards/). +Um die [Zusammensetzbarkeit und Interoperabilität](/developers/docs/smart-contracts/composability/) zu erleichtern, hat die Ethereum-Community mehrere Standards in Form von **ERCs** definiert. Sie können mehr darüber im Abschnitt [Standards](/developers/docs/standards/) lesen. -Wenn Sie einen ERC in Ihre Verträge aufnehmen, sollten Sie nach Standardimplementierungen suchen, anstatt Ihre eigenen einzuführen. Viele Smart-Contract-Bibliotheken enthalten Implementierungen für die gängigsten ERCs. Zum Beispiel ist der allgegenwärtige [Standard für fungible ERC20-Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/) in [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) und [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20) zu finden. Darüber hinaus bieten einige ERCs auch kanonische Implementierungen als Teil des ERC selbst. +Wenn Sie einen ERC als Teil Ihrer Verträge einbeziehen, ist es eine gute Idee, nach Standardimplementierungen zu suchen, anstatt zu versuchen, Ihre eigenen zu entwickeln. Viele Smart-Contract-Bibliotheken enthalten Implementierungen für die beliebtesten ERCs. Zum Beispiel ist der allgegenwärtige [ERC-20-Standard für fungible Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/) in [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) und [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20) zu finden. Darüber hinaus bieten einige ERCs auch kanonische Implementierungen als Teil des ERC selbst. -Es ist erwähnenswert, dass einige ERCs nicht eigenständig sind, sondern Ergänzungen zu anderen ERCs sind. Zum Beispiel fügt [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) eine Erweiterung zu ERC20 hinzu, um dessen Benutzerfreundlichkeit zu verbessern. +Es ist erwähnenswert, dass einige ERCs nicht eigenständig sind, sondern Ergänzungen zu anderen ERCs darstellen. Zum Beispiel fügt [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) dem ERC20 eine Erweiterung hinzu, um dessen Benutzerfreundlichkeit zu verbessern. -## So fügst du eine Bibliothek hinzu {#how-to} +## Wie man eine Bibliothek hinzufügt {#how-to} -Beziehen Sie sich immer auf die Dokumentation der Bibliothek, die Sie einbinden, um genaue Anweisungen zur Einbindung in Ihr Projekt zu bekommen. Mehrere Solidity-Bibliotheken für Verträge werden mit `npm` gepackt, so dass du sie einfach mit `npm install` installieren kannst. Die meisten Tools zum [Kompilieren](/developers/docs/smart-contracts/compiling/) von Verträgen suchen in deinen `node_modules` nach Bibliotheken für Smart Contracts, sodass du Folgendes tun kannst: +Beziehen Sie sich immer auf die Dokumentation der Bibliothek, die Sie einbinden, für spezifische Anweisungen, wie Sie sie in Ihr Projekt aufnehmen. Mehrere Solidity-Vertragsbibliotheken sind mit `npm` verpackt, sodass Sie sie einfach mit `npm install` installieren können. Die meisten Tools zum [Kompilieren](/developers/docs/smart-contracts/compiling/) von Verträgen suchen in Ihren `node_modules` nach Smart-Contract-Bibliotheken, sodass Sie Folgendes tun können: ```solidity -// Dadurch wird die @openzeppelin/contracts-Bibliothek von Ihren node_modules geladen +// Dies lädt die @openzeppelin/contracts-Bibliothek aus Ihren node_modules import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyNFT is ERC721 { @@ -73,19 +73,19 @@ contract MyNFT is ERC721 { } ``` -Unabhängig von der Methode, die du verwendest, solltest du beim Einbinden einer Bibliothek immer die [Sprachversion](/developers/docs/smart-contracts/languages/) im Auge behalten. Sie können beispielsweise keine Bibliothek für Solidity 0.6 verwenden, wenn Sie Ihre Verträge in Solidity 0.5 schreiben. +Unabhängig von der verwendeten Methode sollten Sie beim Einbinden einer Bibliothek immer die [Sprachversion](/developers/docs/smart-contracts/languages/) im Auge behalten. Sie können beispielsweise keine Bibliothek für Solidity 0.6 verwenden, wenn Sie Ihre Verträge in Solidity 0.5 schreiben. -## Wann verwenden {#when-to-use} +## Wann man sie verwendet {#when-to-use} -Wenn Sie eine Smart-Contract-Bibliothek für Ihr Projekt nutzen, bietet das gleich mehrere Vorteile. In erster Linie sparen Sie Zeit, denn die Bibliothek stellt fertige Bausteine zur Verfügung stellt, die Sie einfach in Ihr System integrieren können, anstatt sie selbst schreiben zu müssen. +Die Verwendung einer Smart-Contract-Bibliothek für Ihr Projekt hat mehrere Vorteile. In erster Linie spart es Ihnen Zeit, indem es Ihnen gebrauchsfertige Bausteine zur Verfügung stellt, die Sie in Ihr System integrieren können, anstatt sie selbst programmieren zu müssen. -Sicherheit ist ein großes Plus. Auch Open-Source-Smart-Contract-Bibliotheken werden oft intensiv untersucht. Da viele Projekte von der Bibliothek abhängen, besteht ein starker Anreiz vonseiten der Communty, sie ständig zu überprüfen. Fehler finden sich viel häufiger im Anwendungscode als in wiederverwendbaren Vertragsbibliotheken. Einige Bibliotheken werden für zusätzliche Sicherheit auch [externen Audits](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) unterzogen. +Sicherheit ist ebenfalls ein großes Plus. Open-Source-Smart-Contract-Bibliotheken werden oft streng geprüft. Da viele Projekte von ihnen abhängen, gibt es einen starken Anreiz für die Community, sie ständig zu überprüfen. Es ist viel häufiger, Fehler im Anwendungscode zu finden als in wiederverwendbaren Vertragsbibliotheken. Einige Bibliotheken unterziehen sich auch [externen Audits](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) für zusätzliche Sicherheit. -Die Verwendung von Smart-Contract-Bibliotheken birgt jedoch das Risiko, dass Sie Code in Ihr Projekt integreiren, mit dem Sie nicht vertraut sind. Es ist verlockend, einen Vertrag zu importieren und direkt in Ihr Projekt aufzunehmen, doch ohne ein gutes Verständnis dessen, was dieser Vertrag bewirkt, können Sie aufgrund eines unerwarteten Verhaltens versehentlich ein Problem in Ihrem System einführen. Lesen Sie immer die Dokumentation des Codes, den Sie importieren, und überprüfen Sie dann den Code selbst, bevor Sie ihn in Ihr Projekt aufnehmen. +Die Verwendung von Smart-Contract-Bibliotheken birgt jedoch das Risiko, Code in Ihr Projekt aufzunehmen, mit dem Sie nicht vertraut sind. Es ist verlockend, einen Vertrag zu importieren und ihn direkt in Ihr Projekt aufzunehmen, aber ohne ein gutes Verständnis dafür, was dieser Vertrag tut, könnten Sie aufgrund eines unerwarteten Verhaltens versehentlich ein Problem in Ihr System einführen. Stellen Sie immer sicher, dass Sie die Dokumentation des Codes lesen, den Sie importieren, und überprüfen Sie dann den Code selbst, bevor Sie ihn zu einem Teil Ihres Projekts machen! -Schließlich sollten Sie bei der Entscheidung, ob Sie eine Bibliothek integrieren möchten, ihren Gesamtnutzen berücksichtigen. Eine weit verbreitete Version hat den Vorteil, dass sie eine größere Community hat und Fehler schneller erkannt werden. Beim Erstellen von Smart Contracts sollte Sicherheit sollte Ihr Hauptaugenmerk sein. +Zuletzt sollten Sie bei der Entscheidung, ob Sie eine Bibliothek einbinden, deren allgemeine Nutzung berücksichtigen. Eine weit verbreitete Bibliothek hat den Vorteil, dass sie eine größere Community hat und mehr Augen nach Problemen suchen. Sicherheit sollte Ihr Hauptaugenmerk sein, wenn Sie mit Smart Contracts bauen! -## Zugehörige Werkzeuge {#related-tools} +## Verwandte Tools {#related-tools} **OpenZeppelin Contracts –** **_Die beliebteste Bibliothek für die sichere Entwicklung von Smart Contracts._** @@ -98,20 +98,20 @@ Schließlich sollten Sie bei der Entscheidung, ob Sie eine Bibliothek integriere - [Dokumentation](https://dappsys.readthedocs.io/) - [GitHub](https://github.com/dapphub/dappsys) -**HQ20 –** **_Ein Solidity-Projekt mit Verträgen, Bibliotheken und Beispielen, die dir helfen, voll funktionsfähige, verteilte Anwendungen für die reale Welt zu erstellen._** +**HQ20 –** **_Ein Solidity-Projekt mit Verträgen, Bibliotheken und Beispielen, das Ihnen hilft, voll funktionsfähige verteilte Anwendungen für die reale Welt zu erstellen._** - [GitHub](https://github.com/HQ20/contracts) -**thirdweb Solidity SDK –** **_Bietet die Tools, die zum effizienten Erstellen von benutzerdefinierten Smart Contracts erforderlich sind._** +**thirdweb Solidity SDK –** **_Bietet die Werkzeuge, die benötigt werden, um benutzerdefinierte Smart Contracts effizient zu erstellen_** - [Dokumentation](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) ## Verwandte Tutorials {#related-tutorials} -- [Sicherheitsüberlegungen für Ethereum-Entwickler](/developers/docs/smart-contracts/security/) _– Ein Tutorial zu Sicherheitsaspekten bei der Erstellung von Smart Contracts, einschließlich der Verwendung von Bibliotheken._ -- [Den ERC-20-Token-Smart-Contract verstehen](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Tutorial zum ERC20-Standard, bereitgestellt von mehreren Bibliotheken._ +- [Sicherheitsüberlegungen für Ethereum-Entwickler](/developers/docs/smart-contracts/security/) _– Ein Tutorial zu Sicherheitsüberlegungen beim Erstellen von Smart Contracts, einschließlich der Verwendung von Bibliotheken._ +- [Den ERC-20-Token-Smart-Contract verstehen](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Tutorial zum ERC20-Standard, der von mehreren Bibliotheken bereitgestellt wird._ -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/naming/index.md b/public/content/translations/de/developers/docs/smart-contracts/naming/index.md index b0eb6ffe2c8..79f73e0cb37 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/naming/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/naming/index.md @@ -1,101 +1,101 @@ --- title: Benennung von Smart Contracts -description: "Bewährte Praktiken für die Benennung von Ethereum Smart Contracts mit ENS" +description: "Best Practices für die Benennung von Ethereum-Smart-Contracts mit ENS" lang: de --- -Smart Contracts sind ein Grundpfeiler der dezentralen Infrastruktur von Ethereum und ermöglichen autonome Anwendungen und Protokolle. Doch auch wenn sich die Vertragsfähigkeiten weiterentwickeln, verlassen sich Benutzer und Entwickler immer noch auf hexadezimale Adressen, um diese Verträge zu identifizieren und auf sie zu verweisen. +Smart Contracts sind ein Eckpfeiler der dezentralisierten Infrastruktur von Ethereum und ermöglichen autonome Anwendungen und Protokolle. Aber auch wenn sich die Fähigkeiten von Verträgen weiterentwickeln, verlassen sich Benutzer und Entwickler immer noch auf rohe hexadezimale Adressen, um diese Verträge zu identifizieren und darauf zu verweisen. -Die Benennung von Smart Contracts mit dem [Ethereum Name Service (ENS)](https://ens.domains/) verbessert die Benutzererfahrung, indem hexadezimale Vertragsadressen überflüssig werden, und reduziert das Risiko von Angriffen wie Address-Poisoning- und Spoofing-Angriffen. Dieser Leitfaden erklärt, warum die Benennung von Smart Contracts wichtig ist, wie sie umgesetzt werden kann und welche Tools wie [Enscribe](https://www.enscribe.xyz) zur Verfügung stehen, um den Prozess zu vereinfachen und Entwicklern bei der Übernahme dieser Praxis zu helfen. +Die Benennung von Smart Contracts mit dem [Ethereum Name Service (ENS)](https://ens.domains/) verbessert die Benutzererfahrung, indem hexadezimale Vertragsadressen eliminiert werden, und reduziert das Risiko von Angriffen wie Address-Poisoning und Spoofing-Angriffen. Dieser Leitfaden erklärt, warum die Benennung von Smart Contracts wichtig ist, wie sie implementiert werden kann und welche Tools wie [Enscribe](https://www.enscribe.xyz) verfügbar sind, um den Prozess zu vereinfachen und Entwicklern bei der Übernahme dieser Praxis zu helfen. ## Warum Smart Contracts benennen? {#why-name-contracts} -### Menschenlesbare Bezeichner {#human-readable-identifiers} +### Menschenlesbare Identifikatoren {#human-readable-identifiers} Anstatt mit undurchsichtigen Vertragsadressen wie `0x8f8e...f9e3` zu interagieren, können Entwickler und Benutzer menschenlesbare Namen wie `v2.myapp.eth` verwenden. Dies vereinfacht die Interaktionen mit Smart Contracts. -Dies wird durch den [Ethereum Name Service](https://ens.domains/) ermöglicht, der einen dezentralen Benennungsdienst für Ethereum-Adressen bereitstellt. Dies ist analog dazu, wie der Domain Name Service (DNS) es Internetnutzern ermöglicht, auf Netzwerkadressen zuzugreifen, indem sie einen Namen wie ethereum.org anstelle einer IP-Adresse wie `104.18.176.152` verwenden. +Dies wird durch den [Ethereum Name Service](https://ens.domains/) ermöglicht, der einen dezentralisierten Namensdienst für Ethereum-Adressen bereitstellt. Dies ist analog dazu, wie der Domain Name Service (DNS) es Internetnutzern ermöglicht, auf Netzwerkadressen über einen Namen wie ethereum.org zuzugreifen, anstatt über eine IP-Adresse wie `104.18.176.152`. ### Verbesserte Sicherheit und Vertrauen {#improved-security-and-trust} -Benannte Verträge helfen, versehentliche Transaktionen an die falsche Adresse zu reduzieren. Sie helfen Benutzern auch dabei, Verträge zu identifizieren, die mit bestimmten Apps oder Marken verbunden sind. Dies schafft zusätzliches Vertrauen durch Reputation, insbesondere wenn Namen mit bekannten übergeordneten Domains wie `uniswap.eth` verknüpft sind. +Benannte Verträge helfen, versehentliche Transaktionen an die falsche Adresse zu reduzieren. Sie helfen Benutzern auch, Verträge zu identifizieren, die an bestimmte Apps oder Marken gebunden sind. Dies fügt eine Ebene des Reputationsvertrauens hinzu, insbesondere wenn Namen an bekannte übergeordnete Domains wie `uniswap.eth` angehängt sind. -Aufgrund der Länge von 42 Zeichen einer Ethereum-Adresse ist es für Benutzer sehr schwierig, kleine Änderungen in Adressen zu erkennen, bei denen ein paar Zeichen geändert wurden. Beispielsweise würde eine Adresse wie `0x58068646C148E313CB414E85d2Fe89dDc3426870` von benutzerorientierten Anwendungen wie Wallets normalerweise auf `0x580...870` gekürzt. Es ist unwahrscheinlich, dass ein Benutzer eine bösartige Adresse bemerkt, bei der ein paar Zeichen geändert wurden. +Aufgrund der Länge von 42 Zeichen einer Ethereum-Adresse ist es für Benutzer sehr schwer, kleine Änderungen in Adressen zu erkennen, bei denen ein paar Zeichen geändert wurden. Zum Beispiel würde eine Adresse wie `0x58068646C148E313CB414E85d2Fe89dDc3426870` normalerweise von benutzerorientierten Anwendungen wie Wallets auf `0x580...870` gekürzt werden. Es ist unwahrscheinlich, dass ein Benutzer eine bösartige Adresse bemerkt, bei der ein paar Zeichen verändert wurden. -Diese Art von Technik wird bei Address-Spoofing- und -Poisoning-Angriffen eingesetzt, bei denen Benutzer dazu verleitet werden zu glauben, dass sie mit der richtigen Adresse interagieren oder Gelder an sie senden, obwohl die Adresse in Wirklichkeit der richtigen Adresse nur ähnelt, aber nicht dieselbe ist. +Diese Art von Technik wird bei Address-Spoofing- und Poisoning-Angriffen eingesetzt, bei denen Benutzer in dem Glauben gelassen werden, dass sie mit der richtigen Adresse interagieren oder Gelder an diese senden, während die Adresse in Wirklichkeit nur der richtigen Adresse ähnelt, aber nicht dieselbe ist. -ENS-Namen für Wallets und Verträge schützen vor dieser Art von Angriffen. Ähnlich wie DNS-Spoofing-Angriffe können auch ENS-Spoofing-Angriffe durchgeführt werden, jedoch wird ein Benutzer einen Tippfehler in einem ENS-Namen eher bemerken als eine kleine Änderung an einer hexadezimalen Adresse. +ENS-Namen für Wallets und Verträge schützen vor diesen Arten von Angriffen. Wie bei DNS-Spoofing-Angriffen können auch ENS-Spoofing-Angriffe vorkommen, jedoch ist es wahrscheinlicher, dass ein Benutzer einen Rechtschreibfehler in einem ENS-Namen bemerkt als eine kleine Änderung an einer hexadezimalen Adresse. -### Bessere UX für Wallets und Explorer {#better-ux} +### Bessere UX für Wallets und Blocksuchmaschinen {#better-ux} -Wenn ein Smart Contract mit einem ENS-Namen konfiguriert wurde, können Apps wie Wallets und Blockchain-Explorer ENS-Namen für Smart Contracts anstelle von hexadezimalen Adressen anzeigen. Dies stellt für die Benutzer eine erhebliche Verbesserung der Benutzererfahrung (UX) dar. +Wenn ein Smart Contract mit einem ENS-Namen konfiguriert wurde, ist es für Apps wie Wallets und Blocksuchmaschinen möglich, ENS-Namen für Smart Contracts anstelle von hexadezimalen Adressen anzuzeigen. Dies bietet eine erhebliche Verbesserung der Benutzererfahrung (UX) für die Benutzer. -Wenn Benutzer beispielsweise mit einer App wie Uniswap interagieren, sehen sie normalerweise, dass die App, mit der sie interagieren, auf der Website `uniswap.org` gehostet wird, aber ihnen würde eine hexadezimale Vertragsadresse angezeigt, wenn Uniswap seine Smart Contracts nicht mit ENS benannt hat. Wenn der Vertrag benannt ist, könnten sie stattdessen `v4.contracts.uniswap.eth` sehen, was weitaus nützlicher ist. +Wenn Benutzer beispielsweise mit einer App wie Uniswap interagieren, sehen sie normalerweise, dass die App, mit der sie interagieren, auf der Website `uniswap.org` gehostet wird, aber ihnen würde eine hexadezimale Vertragsadresse präsentiert werden, wenn Uniswap seine Smart Contracts nicht mit ENS benannt hat. Wenn der Vertrag benannt ist, könnten sie stattdessen `v4.contracts.uniswap.eth` sehen, was weitaus nützlicher ist. ## Benennung bei der Bereitstellung vs. nach der Bereitstellung {#when-to-name} Es gibt zwei Zeitpunkte, zu denen Smart Contracts benannt werden können: -- **Zum Zeitpunkt der Bereitstellung**: Zuweisung eines ENS-Namens zum Vertrag bei dessen Bereitstellung. +- **Zum Zeitpunkt der Bereitstellung**: Zuweisung eines ENS-Namens an den Vertrag, während er bereitgestellt wird. - **Nach der Bereitstellung**: Zuordnung einer bestehenden Vertragsadresse zu einem neuen ENS-Namen. -Beide Ansätze setzen voraus, dass man Eigentümer- oder Managerzugriff auf eine ENS-Domain hat, um ENS-Einträge erstellen und festlegen zu können. +Beide Ansätze setzen voraus, dass man Eigentümer- oder Managerzugriff auf eine ENS-Domain hat, damit ENS-Einträge erstellt und festgelegt werden können. ## Wie die ENS-Benennung für Verträge funktioniert {#how-ens-naming-works} -ENS-Namen werden on-chain gespeichert und über ENS-Resolver in Ethereum-Adressen aufgelöst. Um einen Smart Contract zu benennen: +ENS-Namen werden auf der Blockchain gespeichert und über ENS-Resolver in Ethereum-Adressen aufgelöst. Um einen Smart Contract zu benennen: 1. Registrieren oder kontrollieren Sie eine übergeordnete ENS-Domain (z. B. `myapp.eth`) 2. Erstellen Sie eine Subdomain (z. B. `v1.myapp.eth`) 3. Setzen Sie den `address`-Eintrag der Subdomain auf die Vertragsadresse -4. Setzen Sie den Reverse Record des Vertrags auf den ENS, damit der Name über seine Adresse gefunden werden kann +4. Setzen Sie den Reverse-Eintrag des Vertrags im ENS, damit der Name über seine Adresse gefunden werden kann -ENS-Namen sind hierarchisch und unterstützen unbegrenzt viele Unternamen. Das Festlegen dieser Einträge erfordert in der Regel die Interaktion mit den Verträgen der ENS-Registry und des Public Resolvers. +ENS-Namen sind hierarchisch und unterstützen unbegrenzte Unternamen. Das Festlegen dieser Einträge beinhaltet typischerweise die Interaktion mit der ENS-Registry und öffentlichen Resolver-Verträgen. ## Tools zur Benennung von Verträgen {#tools} -Es gibt zwei Ansätze, um Smart Contracts zu benennen. Entweder über die [ENS App](https://app.ens.domains) mit einigen manuellen Schritten oder über [Enscribe](https://www.enscribe.xyz). Diese werden im Folgenden beschrieben. +Es gibt zwei Ansätze zur Benennung von Smart Contracts. Entweder die Verwendung der [ENS App](https://app.ens.domains) mit einigen manuellen Schritten oder die Verwendung von [Enscribe](https://www.enscribe.xyz). Diese werden im Folgenden skizziert. ### Manuelle ENS-Einrichtung {#manual-ens-setup} -Mit der [ENS App](https://app.ens.domains) können Entwickler manuell Unternamen erstellen und Forward-Address-Einträge festlegen. Allerdings können sie über die ENS-App keinen primären Namen für einen Smart Contract festlegen, indem sie den Reverse Record für den Namen setzen. Es müssen manuelle Schritte unternommen werden, die in den [ENS-Dokumenten](https://docs.ens.domains/web/naming-contracts/) behandelt werden. +Mit der [ENS App](https://app.ens.domains/) können Entwickler manuell Unternamen erstellen und Forward-Address-Einträge festlegen. Sie können jedoch keinen primären Namen für einen Smart Contract festlegen, indem sie den Reverse-Eintrag für den Namen über die ENS-App setzen. Es müssen manuelle Schritte unternommen werden, die in den [ENS-Dokumentationen](https://docs.ens.domains/web/naming-contracts/) behandelt werden. ### Enscribe {#enscribe} [Enscribe](https://www.enscribe.xyz) vereinfacht die Benennung von Smart Contracts mit ENS und stärkt das Vertrauen der Benutzer in Smart Contracts. Es bietet: -- **Atomare Bereitstellung und Benennung**: Zuweisung eines ENS-Namens bei der Bereitstellung eines neuen Vertrags -- **Benennung nach der Bereitstellung**: Verknüpfung von Namen mit bereits bereitgestellten Verträgen -- **Multi-Chain-Unterstützung**: Funktioniert auf Ethereum- und L2-Netzwerken, auf denen ENS unterstützt wird -- **Vertragsverifizierungsdaten**: Beinhaltet Vertragsverifizierungsdaten aus mehreren Quellen, um das Vertrauen der Benutzer zu erhöhen +- **Atomare Bereitstellung und Benennung**: Weisen Sie bei der Bereitstellung eines neuen Vertrags einen ENS-Namen zu +- **Benennung nach der Bereitstellung**: Hängen Sie Namen an bereits bereitgestellte Verträge an +- **Multi-Chain-Unterstützung**: Funktioniert über Ethereum und L2-Netzwerke hinweg, in denen ENS unterstützt wird +- **Vertragsverifizierungsdaten**: Enthält Vertragsverifizierungsdaten, die aus mehreren Quellen bezogen werden, um das Vertrauen der Benutzer zu erhöhen -Enscribe unterstützt von Benutzern bereitgestellte ENS-Namen oder seine eigenen Domains, falls der Benutzer keinen ENS-Namen besitzt. +Enscribe unterstützt von Benutzern bereitgestellte ENS-Namen oder eigene Domains, wenn der Benutzer keinen ENS-Namen hat. Sie können auf die [Enscribe App](https://app.enscribe.xyz) zugreifen, um mit der Benennung und Anzeige von Smart Contracts zu beginnen. -## Bewährte Praktiken {#best-practices} +## Best Practices {#best-practices} - **Verwenden Sie klare, versionierte Namen** wie `v1.myapp.eth`, um Vertrags-Upgrades transparent zu machen -- **Legen Sie Reverse Records fest**, um Verträge mit ENS-Namen zu verknüpfen und die Sichtbarkeit in Apps wie Wallets und Blockchain-Explorern zu gewährleisten. -- **Überwachen Sie die Ablaufdaten genau**, um unbeabsichtigte Eigentümerwechsel zu verhindern -- **Überprüfen Sie die Vertragsquelle**, damit Benutzer darauf vertrauen können, dass sich der benannte Vertrag wie erwartet verhält +- **Setzen Sie Reverse-Einträge**, um Verträge mit ENS-Namen zu verknüpfen, für die Sichtbarkeit in Apps wie Wallets und Blocksuchmaschinen. +- **Überwachen Sie Ablauffristen genau**, wenn Sie versehentliche Eigentümerwechsel verhindern möchten +- **Verifizieren Sie die Vertragsquelle**, damit Benutzer darauf vertrauen können, dass sich der benannte Vertrag wie erwartet verhält ## Risiken {#risks} -Die Benennung von Smart Contracts bietet erhebliche Vorteile für die Benutzer von Ethereum, jedoch müssen die Eigentümer von ENS-Domains bei deren Verwaltung wachsam sein. Zu den nennenswerten Risiken gehören: +Die Benennung von Smart Contracts bietet erhebliche Vorteile für Benutzer von Ethereum, jedoch müssen Eigentümer von ENS-Domains hinsichtlich ihrer Verwaltung wachsam sein. Zu den bemerkenswerten Risiken gehören: -- **Ablauf**: Genau wie bei DNS-Namen haben auch ENS-Namensregistrierungen eine begrenzte Dauer. Daher ist es von entscheidender Bedeutung, dass die Eigentümer die Ablaufdaten ihrer Domains überwachen und sie rechtzeitig vor Ablauf erneuern. Sowohl die ENS App als auch Enscribe bieten Domain-Eigentümern visuelle Hinweise, wenn ein Ablaufdatum bevorsteht. -- **Eigentümerwechsel**: ENS-Einträge werden als NFTs auf Ethereum abgebildet, wobei der Eigentümer einer bestimmten `.eth`-Domain den zugehörigen NFT in seinem Besitz hat. Sollte also ein anderes Konto das Eigentum an diesem NFT übernehmen, kann der neue Eigentümer alle ENS-Einträge nach Belieben ändern. +- **Ablauf**: Genau wie bei DNS-Namen sind Registrierungen von ENS-Namen von begrenzter Dauer. Daher ist es wichtig, dass Eigentümer die Ablaufdaten ihrer Domains überwachen und sie rechtzeitig vor ihrem Ablauf erneuern. Sowohl die ENS App als auch Enscribe bieten visuelle Indikatoren für Domain-Eigentümer, wenn der Ablauf bevorsteht. +- **Eigentümerwechsel**: ENS-Einträge werden als NFTs auf Ethereum dargestellt, wobei der Eigentümer einer bestimmten `.eth`-Domain das zugehörige NFT in seinem Besitz hat. Sollte also ein anderes Konto das Eigentum an diesem NFT übernehmen, kann der neue Eigentümer alle ENS-Einträge nach Belieben ändern. -Um solche Risiken zu mindern, sollte das Eigentümerkonto für die `.eth` Second-Level-Domains (2LD) durch eine Multi-Sig-Wallet gesichert werden, wobei Subdomains zur Verwaltung der Vertragsbenennung erstellt werden. Auf diese Weise können im Falle von unbeabsichtigten oder bösartigen Eigentümerwechseln auf Subdomain-Ebene diese vom 2LD-Eigentümer überschrieben werden. +Um solche Risiken zu mindern, sollte das Eigentümerkonto für die `.eth` Second-Level-Domains (2LD) über ein Mehrfachsignatur-Wallet gesichert werden, wobei Subdomains erstellt werden, um die Vertragsbenennung zu verwalten. Auf diese Weise können im Falle von versehentlichen oder böswilligen Eigentümerwechseln auf Subdomain-Ebene diese vom 2LD-Eigentümer überschrieben werden. ## Zukunft der Vertragsbenennung {#future} -Die Vertragsbenennung wird zu einer bewährten Praxis für die Dapp-Entwicklung, ähnlich wie Domainnamen IP-Adressen im Web ersetzt haben. Da immer mehr Infrastrukturen wie Wallets, Explorer und Dashboards die ENS-Auflösung für Verträge integrieren, werden benannte Verträge die Sicherheit verbessern und Fehler im gesamten Ökosystem reduzieren. +Die Vertragsbenennung wird zu einer Best Practice für die Dapp-Entwicklung, ähnlich wie Domainnamen IP-Adressen im Web ersetzt haben. Da immer mehr Infrastrukturen wie Wallets, Blocksuchmaschinen und Dashboards die ENS-Auflösung für Verträge integrieren, werden benannte Verträge die Sicherheit verbessern und Fehler im gesamten Ökosystem reduzieren. -Indem Smart Contracts leichter zu erkennen und nachzuvollziehen sind, hilft die Benennung, die Lücke zwischen Benutzern und Apps auf Ethereum zu schließen, wodurch sowohl die Sicherheit als auch die UX für die Benutzer verbessert werden. +Indem Smart Contracts leichter zu erkennen und zu verstehen sind, hilft die Benennung, die Lücke zwischen Benutzern und Apps auf Ethereum zu schließen und sowohl die Sicherheit als auch die UX für Benutzer zu verbessern. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [Benennung von Smart Contracts mit ENS](https://docs.ens.domains/web/naming-contracts/) -- [Benennung von Smart Contracts mit Enscribe](https://www.enscribe.xyz/docs). +- [Benennung von Smart Contracts mit Enscribe](https://www.enscribe.xyz/docs). \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/security/index.md b/public/content/translations/de/developers/docs/smart-contracts/security/index.md index c1669879695..0b03a2c3af1 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/security/index.md @@ -1,54 +1,54 @@ --- -title: Sicherheit von Smart Contracts -description: "Ein Überblick über die Richtlinien für die Erstellung sicherer Ethereum Smart Contracts" +title: Smart-Contract-Sicherheit +description: "Ein Überblick über die Richtlinien zur Erstellung sicherer Ethereum-Smart-Contracts" lang: de --- -Smart Contracts sind äußerst flexibel und in der Lage, große Mengen an Werten und Daten zu kontrollieren, während sie eine unveränderliche Logik auf der Grundlage von auf der Blockchain bereitgestelltem Code ausführen. So ist ein lebendiges Ökosystem aus vertrauenswürdigen und dezentralisierten Applikationen entstanden, das viele Vorteile gegenüber den alten Systemen bietet. Sie bieten auch eine Chance für Angreifer, die durch die Ausnutzung von Schwachstellen in Smart Contracts Profit machen wollen. +Smart Contracts sind extrem flexibel und in der Lage, große Mengen an Werten und Daten zu kontrollieren, während sie unveränderliche Logik ausführen, die auf Code basiert, der auf der Blockchain bereitgestellt wird. Dies hat ein lebendiges Ökosystem von vertrauenslosen und dezentralisierten Anwendungen geschaffen, die viele Vorteile gegenüber herkömmlichen Systemen bieten. Sie stellen jedoch auch Gelegenheiten für Angreifer dar, die durch die Ausnutzung von Schwachstellen in Smart Contracts profitieren wollen. -Öffentliche Blockchains wie Ethereum erschweren das Problem der Sicherung von Smart Contracts zusätzlich. Der Code eines bereitgestellten Vertrags kann _normalerweise_ nicht geändert werden, um Sicherheitslücken zu schließen, während die aus Smart Contracts gestohlenen Vermögenswerte aufgrund der Unveränderlichkeit extrem schwer zu verfolgen und meistens nicht wiederherstellbar sind. +Öffentliche Blockchains wie [Ethereum](/) machen das Problem der Sicherung von Smart Contracts noch komplexer. Bereitgestellter Vertragscode kann _normalerweise_ nicht geändert werden, um Sicherheitslücken zu schließen, während aus Smart Contracts gestohlene Vermögenswerte extrem schwer zu verfolgen und aufgrund der Unveränderlichkeit meist unwiederbringlich sind. -Obwohl die Zahlen variieren, wird geschätzt, dass der Gesamtbetrag des gestohlenen oder verlorenen Werts aufgrund von Sicherheitsmängeln in Smart Contracts weit über 1 Milliarde US-Dollar beträgt. Dazu gehören hochkarätige Vorfälle wie der [DAO-Hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 Mio. ETH gestohlen, was nach heutigen Preisen über 1 Mrd. USD wert ist), der [Parity Multi-Sig-Wallet-Hack](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 Mio. USD an Hacker verloren) und das [Problem mit der eingefrorenen Parity-Wallet](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (über 300 Mio. USD in ETH für immer gesperrt). +Obwohl die Zahlen variieren, wird geschätzt, dass der Gesamtwert, der aufgrund von Sicherheitsmängeln in Smart Contracts gestohlen wurde oder verloren ging, leicht über 1 Milliarde US-Dollar liegt. Dazu gehören aufsehenerregende Vorfälle wie der [DAO-Hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 Millionen gestohlene ETH, nach heutigen Preisen über 1 Milliarde US-Dollar wert), der [Hack der Parity-Mehrfachsignatur-Wallet](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 Millionen US-Dollar an Hacker verloren) und das [Problem der eingefrorenen Parity-Wallet](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (über 300 Millionen US-Dollar in ETH für immer gesperrt). -Die oben genannten Probleme machen es für Entwickler zwingend erforderlich, in die Entwicklung sicherer, robuster und widerstandsfähiger Smart Contracts zu investieren. Die Sicherheit von Smart Contracts ist eine ernste Angelegenheit, die jeder Entwickler lernen sollte. In diesem Ratgeber werden Sicherheitsüberlegungen für Ethereum-Entwickler behandelt und Ressourcen zur Verbesserung der Smart Contract-Sicherheit vorgestellt. +Die oben genannten Probleme machen es für Entwickler zwingend erforderlich, Aufwand in die Entwicklung sicherer, robuster und widerstandsfähiger Smart Contracts zu investieren. Smart-Contract-Sicherheit ist eine ernste Angelegenheit, und jeder Entwickler tut gut daran, sich damit vertraut zu machen. Dieser Leitfaden behandelt Sicherheitsüberlegungen für Ethereum-Entwickler und untersucht Ressourcen zur Verbesserung der Smart-Contract-Sicherheit. ## Voraussetzungen {#prerequisites} -Stellen Sie sicher, dass Sie mit den [Grundlagen der Smart-Contract-Entwicklung](/developers/docs/smart-contracts/) vertraut sind, bevor Sie sich mit der Sicherheit befassen. +Stelle sicher, dass du mit den [Grundlagen der Smart-Contract-Entwicklung](/developers/docs/smart-contracts/) vertraut bist, bevor du dich mit dem Thema Sicherheit befasst. -## Richtlinien für die Erstellung sicherer Ethereum-Smart-Contracts {#smart-contract-security-guidelines} +## Richtlinien für die Erstellung sicherer Ethereum-Smart Contracts {#smart-contract-security-guidelines} -### 1. Entwerfen Sie ordnungsgemäße Zugriffskontrollen {#design-proper-access-controls} +### 1. Entwerfen Sie angemessene Zugriffskontrollen {#design-proper-access-controls} -In Smart Contracts können Funktionen, die als `public` oder `external` markiert sind, von beliebigen extern verwalteten Konten (EOAs) oder Vertragskonten aufgerufen werden. Die Festlegung der öffentlichen Sichtbarkeit von Funktionen ist notwendig, wenn Sie möchten, dass andere Personen mit Ihrem Vertrag interagieren können. Funktionen, die als `private` gekennzeichnet sind, können jedoch nur von Funktionen innerhalb des Smart Contracts aufgerufen werden, nicht von externen Konten. Jedem Netzwerkteilnehmer Zugang zu Vertragsfunktionen zu gewähren, kann zu Problemen führen, insbesondere wenn dies bedeutet, dass jeder Nutzer sensible Operationen durchführen kann (z. B. das Minting neuer Token). +In Smart Contracts können Funktionen, die als `public` oder `external` markiert sind, von beliebigen extern verwalteten Konten (EOAs) oder Vertragskonten aufgerufen werden. Die Angabe der öffentlichen Sichtbarkeit für Funktionen ist notwendig, wenn Sie möchten, dass andere mit Ihrem Vertrag interagieren. Funktionen, die als `private` markiert sind, können jedoch nur von Funktionen innerhalb des Smart Contracts und nicht von externen Konten aufgerufen werden. Jedem Netzwerk-Teilnehmer Zugriff auf Vertragsfunktionen zu geben, kann Probleme verursachen, insbesondere wenn dies bedeutet, dass jeder sensible Operationen durchführen kann (z. B. das Prägen neuer Token). -Um die unbefugte Nutzung von Smart Contract-Funktionen zu verhindern, müssen sichere Zugriffskontrollen implementiert werden. Die Zugriffskontrolle beschränkt die Möglichkeit, bestimmte Funktionen in einem Smart Contract zu nutzen, auf zugelassene Stellen, wie z. B. die für die Verwaltung des Vertrags zuständigen Konten. Das **Ownable-Muster** und die **rollenbasierte Steuerung** sind zwei nützliche Muster zur Implementierung der Zugriffskontrolle in Smart Contracts: +Um die unbefugte Nutzung von Smart Contract-Funktionen zu verhindern, ist es notwendig, sichere Zugriffskontrollen zu implementieren. Zugriffskontrollmechanismen beschränken die Möglichkeit, bestimmte Funktionen in einem Smart Contract zu nutzen, auf genehmigte Entitäten, wie z. B. Konten, die für die Verwaltung des Vertrags verantwortlich sind. Das **Ownable-Muster** und die **rollenbasierte Kontrolle** sind zwei nützliche Muster zur Implementierung der Zugriffskontrolle in Smart Contracts: #### Ownable-Muster {#ownable-pattern} -Beim Ownable-Modell wird während der Vertragserstellung eine Adresse als „Eigentümer“ des Vertrags festgelegt. Geschützten Funktionen wird ein `OnlyOwner`-Modifikator zugewiesen, der sicherstellt, dass der Vertrag die Identität der aufrufenden Adresse authentifiziert, bevor die Funktion ausgeführt wird. Aufrufe geschützter Funktionen von anderen Adressen als der des Vertragseigentümers werden immer zurückgewiesen, um unerwünschte Zugriffe zu verhindern. +Beim Ownable-Muster wird während des Vertragserstellungsprozesses eine Adresse als „Eigentümer“ (Owner) des Vertrags festgelegt. Geschützten Funktionen wird ein `OnlyOwner`-Modifikator zugewiesen, der sicherstellt, dass der Vertrag die Identität der aufrufenden Adresse authentifiziert, bevor die Funktion ausgeführt wird. Aufrufe von geschützten Funktionen durch andere Adressen als den Vertragseigentümer werden immer rückgängig gemacht (revert), was unerwünschten Zugriff verhindert. #### Rollenbasierte Zugriffskontrolle {#role-based-access-control} -Die Registrierung einer einzigen Adresse als `Owner` in einem Smart Contract birgt das Risiko der Zentralisierung und stellt einen Single Point of Failure dar. Wenn die Kontoschlüssel des Eigentümers gefährdet sind, können Angreifer den entsprechenden Vertrag angreifen. Aus diesem Grund kann die Verwendung eines rollenbasierten Zugriffskontrollmusters mit mehreren administrativen Konten eine bessere Option sein. +Die Registrierung einer einzigen Adresse als `Owner` in einem Smart Contract birgt das Risiko der Zentralisierung und stellt einen Single Point of Failure dar. Wenn die Kontoschlüssel des Eigentümers kompromittiert werden, können Angreifer den entsprechenden Vertrag angreifen. Aus diesem Grund kann die Verwendung eines rollenbasierten Zugriffskontrollmusters mit mehreren administrativen Konten die bessere Option sein. -Bei der rollenbasierten Zugriffskontrolle wird der Zugriff auf sensible Funktionen auf eine Reihe von vertrauenswürdigen Teilnehmern verteilt. So kann beispielsweise ein Konto für das Minting von Token zuständig sein, während ein anderes Konto Upgrades durchführt oder den Vertrag pausiert. Durch diese dezentrale Zugriffskontrolle werden „einzelne Ausfallpunkte“ eliminiert und die Vertrauensvoraussetzungen für Benutzer reduziert. +Bei der rollenbasierten Zugriffskontrolle wird der Zugriff auf sensible Funktionen auf eine Gruppe vertrauenswürdiger Teilnehmer verteilt. Beispielsweise kann ein Konto für das Prägen von Token verantwortlich sein, während ein anderes Konto Upgrades durchführt oder den Vertrag pausiert. Die Dezentralisierung der Zugriffskontrolle auf diese Weise eliminiert Single Points of Failure und reduziert die Vertrauensannahmen für die Benutzer. -##### Verwendung von Wallets mit Multi-Signature-Option +##### Verwendung von Mehrfachsignatur-Wallets -Ein weiterer Ansatz zur Implementierung einer sicheren Zugriffskontrolle ist die Verwendung eines [Multi-Signatur-Kontos](/developers/docs/smart-contracts/#multisig), um einen Vertrag zu verwalten. Im Gegensatz zu einem regulären EOA sind Multi-Signatur-Konten das Eigentum von mehreren Instanzen und erfordern Signaturen von einer Mindestanzahl von Konten, beispielsweise 3 von 5, um Transaktionen auszuführen. +Ein weiterer Ansatz zur Implementierung einer sicheren Zugriffskontrolle ist die Verwendung eines [Mehrfachsignatur-Kontos](/developers/docs/smart-contracts/#multisig) zur Verwaltung eines Vertrags. Im Gegensatz zu einem regulären extern verwalteten Konto (EOA) gehören Mehrfachsignatur-Konten mehreren Entitäten und erfordern Signaturen von einer Mindestanzahl von Konten – sagen wir 3 von 5 –, um Transaktionen auszuführen. -Die Verwendung einer Mehrfachsignatur für die Zugriffskontrolle führt eine zusätzliche Sicherheitsebene ein, da Aktionen auf dem Zielvertrag die Zustimmung von mehreren Parteien erfordern. Dies ist besonders nützlich, wenn die Verwendung der Ownable-Funktion erforderlich ist, da es für einen Angreifer oder einen böswilligen Insider schwieriger ist, sensible Vertragsfunktionen für böswillige Zwecke zu manipulieren. +Die Verwendung einer Mehrfachsignatur für die Zugriffskontrolle führt eine zusätzliche Sicherheitsebene ein, da Aktionen auf dem Zielvertrag die Zustimmung mehrerer Parteien erfordern. Dies ist besonders nützlich, wenn die Verwendung des Ownable-Musters erforderlich ist, da es für einen Angreifer oder böswilligen Insider schwieriger wird, sensible Vertragsfunktionen für böswillige Zwecke zu manipulieren. -### 2. Verwenden Sie die Anweisungen require(), assert() und revert(), um Vertragsoperationen zu schützen {#use-require-assert-revert} +### 2. Verwenden Sie require()-, assert()- und revert()-Anweisungen, um Vertragsoperationen abzusichern {#use-require-assert-revert} -Wie bereits erwähnt, kann jeder Nutzer öffentliche Funktionen in Ihrem Smart Contract aufrufen, sobald dieser auf der Blockchain veröffentlicht wurde. Da Sie nicht im Voraus wissen können, wie externe Konten mit einem Vertrag interagieren werden, ist es ideal, interne Schutzmaßnahmen gegen problematische Funktionen zu implementieren, bevor Sie sie Veröffentlichen. Sie können korrektes Verhalten in Smart Contracts durch die Verwendung der Anweisungen `require()`, `assert()` und `revert()` erzwingen, um Ausnahmen auszulösen und Zustandsänderungen rückgängig zu machen, wenn die Ausführung bestimmte Anforderungen nicht erfüllt. +Wie bereits erwähnt, kann jeder öffentliche Funktionen in Ihrem Smart Contract aufrufen, sobald dieser auf der Blockchain bereitgestellt ist. Da Sie nicht im Voraus wissen können, wie externe Konten mit einem Vertrag interagieren werden, ist es ideal, vor der Bereitstellung interne Schutzmaßnahmen gegen problematische Operationen zu implementieren. Sie können korrektes Verhalten in Smart Contracts erzwingen, indem Sie die Anweisungen `require()`, `assert()` und `revert()` verwenden, um Ausnahmen auszulösen und Zustandsänderungen rückgängig zu machen, wenn die Ausführung bestimmte Anforderungen nicht erfüllt. -**`require()`**: `require` wird am Anfang von Funktionen definiert und stellt sicher, dass vordefinierte Bedingungen erfüllt sind, bevor die aufgerufene Funktion ausgeführt wird. Eine `require`-Anweisung kann verwendet werden, um Nutzereingaben zu validieren, Zustandsvariablen zu überprüfen oder die Identität des aufrufenden Kontos zu authentifizieren, bevor eine Funktion ausgeführt wird. +**`require()`**: `require` wird zu Beginn von Funktionen definiert und stellt sicher, dass vordefinierte Bedingungen erfüllt sind, bevor die aufgerufene Funktion ausgeführt wird. Eine `require`-Anweisung kann verwendet werden, um Benutzereingaben zu validieren, Zustandsvariablen zu überprüfen oder die Identität des aufrufenden Kontos zu authentifizieren, bevor mit einer Funktion fortgefahren wird. -**`assert()`**: `assert()` wird verwendet, um interne Fehler zu erkennen und Verletzungen von „Invarianten“ in Ihrem Code zu überprüfen. Eine Invariante ist eine logische Behauptung über den Zustand eines Vertrags, die für alle Funktionsausführungen gelten soll. Ein Beispiel für eine Invariante ist das maximale Gesamtangebot oder der maximale Saldo eines Token-Vertrags. Die Verwendung von `assert()` stellt sicher, dass Ihr Vertrag niemals einen anfälligen Zustand erreicht, und falls doch, werden alle Änderungen an den Zustandsvariablen rückgängig gemacht. +**`assert()`**: `assert()` wird verwendet, um interne Fehler zu erkennen und auf Verletzungen von „Invarianten“ in Ihrem Code zu prüfen. Eine Invariante ist eine logische Behauptung über den Zustand eines Vertrags, die für alle Funktionsausführungen wahr bleiben sollte. Ein Beispiel für eine Invariante ist das maximale Gesamtangebot oder der Saldo eines Token-Vertrags. Die Verwendung von `assert()` stellt sicher, dass Ihr Vertrag niemals einen anfälligen Zustand erreicht, und falls doch, werden alle Änderungen an Zustandsvariablen rückgängig gemacht. -**`revert()`**: `revert()` kann in einer if-else-Anweisung verwendet werden, die eine Ausnahme auslöst, wenn die erforderliche Bedingung nicht erfüllt ist. Der folgende Beispielvertrag verwendet `revert()`, um die Ausführung von Funktionen zu schützen: +**`revert()`**: `revert()` kann in einer if-else-Anweisung verwendet werden, die eine Ausnahme auslöst, wenn die erforderliche Bedingung nicht erfüllt ist. Der folgende Beispielvertrag verwendet `revert()`, um die Ausführung von Funktionen abzusichern: ``` pragma solidity ^0.8.4; @@ -58,8 +58,8 @@ contract VendingMachine { error Unauthorized(); function buy(uint amount) public payable { if (amount > msg.value / 2 ether) - revert("Nicht genügend Ether bereitgestellt."); - // Führen Sie den Kauf durch. + revert("Not enough Ether provided."); + // Perform the purchase. } function withdraw() public { if (msg.sender != owner) @@ -70,89 +70,89 @@ contract VendingMachine { } ``` -### 3. Testen Sie Smart Contracts und überprüfen Sie die Korrektheit des Codes {#test-smart-contracts-and-verify-code-correctness} +### 3. Testen Sie Smart Contracts und überprüfen Sie die Code-Korrektheit {#test-smart-contracts-and-verify-code-correctness} -Die Unveränderlichkeit des Codes, der in der [Ethereum Virtual Machine](/developers/docs/evm/) läuft, bedeutet, dass Smart Contracts in der Entwicklungsphase ein höheres Maß an Qualitätsbewertung erfordern. Wenn Sie Ihren Vertrag ausgiebig testen und auf unerwartete Ergebnisse achten, verbessern Sie die Sicherheit erheblich und schützen Ihre Nutzer auf lange Sicht. +Die Unveränderlichkeit von Code, der in der [Ethereum Virtual Machine](/developers/docs/evm/) ausgeführt wird, bedeutet, dass Smart Contracts während der Entwicklungsphase ein höheres Maß an Qualitätsbewertung erfordern. Das ausführliche Testen Ihres Vertrags und die Beobachtung auf unerwartete Ergebnisse wird die Sicherheit erheblich verbessern und Ihre Benutzer langfristig schützen. -Die übliche Methode besteht darin, kleine Unit-Tests mit Scheindaten zu schreiben, die der Vertrag von den Nutzern erhalten würde. [Unit-Tests](/developers/docs/smart-contracts/testing/#unit-testing) sind gut geeignet, um die Funktionalität bestimmter Funktionen zu testen und sicherzustellen, dass ein Smart Contract wie erwartet funktioniert. +Die übliche Methode besteht darin, kleine Unit-Tests mit Mock-Daten zu schreiben, die der Vertrag voraussichtlich von Benutzern erhalten wird. [Unit-Tests](/developers/docs/smart-contracts/testing/#unit-testing) eignen sich gut, um die Funktionalität bestimmter Funktionen zu testen und sicherzustellen, dass ein Smart Contract wie erwartet funktioniert. -Leider sind Unit-Tests für die Verbesserung der Sicherheit von Smart Contracts nur wenig effektiv, wenn sie nur isoliert angewendet werden. Ein Unit-Test kann beweisen, dass eine Funktion bei Mock-Daten korrekt ausgeführt wird, Unit-Tests sind jedoch nur so effektiv wie die Tests, die verfasst werden. Das macht es schwierig, unentdeckte Sonderfälle und Schwachstellen zu erkennen, die die Sicherheit Ihres Smart Contracts gefährden könnten. +Leider sind Unit-Tests isoliert betrachtet nur minimal effektiv zur Verbesserung der Smart Contract-Sicherheit. Ein Unit-Test könnte beweisen, dass eine Funktion für Mock-Daten ordnungsgemäß ausgeführt wird, aber Unit-Tests sind nur so effektiv wie die Tests, die geschrieben werden. Dies macht es schwierig, übersehene Randfälle und Schwachstellen zu erkennen, die die Sicherheit Ihres Smart Contracts gefährden könnten. -Ein besserer Ansatz ist es, Unit-Tests mit eigenschaftsbasierten Tests zu kombinieren, die mittels [statischer und dynamischer Analyse](/developers/docs/smart-contracts/testing/#static-dynamic-analysis) durchgeführt werden. Die statische Analyse stützt sich auf Low-Level-Darstellungen wie [Kontrollflussgraphen](https://en.wikipedia.org/wiki/Control-flow_graph) und [abstrakte Syntaxbäume](https://deepsource.io/glossary/ast/), um erreichbare Programmzustände und Ausführungspfade zu analysieren. In der Zwischenzeit führen dynamische Analysetechniken, wie z. B. [Smart-Contract-Fuzzing](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), Vertragscode mit zufälligen Eingabewerten aus, um Operationen zu erkennen, die Sicherheitseigenschaften verletzen. +Ein besserer Ansatz ist die Kombination von Unit-Tests mit eigenschaftsbasierten Tests, die mittels [statischer und dynamischer Analyse](/developers/docs/smart-contracts/testing/#static-dynamic-analysis) durchgeführt werden. Die statische Analyse stützt sich auf Low-Level-Darstellungen wie [Kontrollflussgraphen](https://en.wikipedia.org/wiki/Control-flow_graph) und [abstrakte Syntaxbäume](https://deepsource.io/glossary/ast/), um erreichbare Programmzustände und Ausführungspfade zu analysieren. Währenddessen führen dynamische Analysetechniken, wie z. B. [Smart Contract Fuzzing](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), Vertragscode mit zufälligen Eingabewerten aus, um Operationen zu erkennen, die Sicherheitseigenschaften verletzen. -Die [formale Verifizierung](/developers/docs/smart-contracts/formal-verification) ist eine weitere Technik zur Überprüfung der Sicherheitseigenschaften in Smart Contracts. Im Gegensatz zu regulären Tests kann die formale Verifizierung schlüssig beweisen, dass ein Smart Contract keine Fehler enthält. Dies wird erreicht, indem eine formale Spezifikation erstellt wird, die die gewünschten Sicherheitseigenschaften festhält, um dann zu gewährleisten, dass ein Formmodell des Vertrags mit dieser Spezifikation übereinstimmt. +Die [formale Verifizierung](/developers/docs/smart-contracts/formal-verification) ist eine weitere Technik zur Überprüfung von Sicherheitseigenschaften in Smart Contracts. Im Gegensatz zu regulären Tests kann die formale Verifizierung die Fehlerfreiheit in einem Smart Contract schlüssig beweisen. Dies wird erreicht, indem eine formale Spezifikation erstellt wird, die die gewünschten Sicherheitseigenschaften erfasst, und bewiesen wird, dass ein formales Modell der Verträge dieser Spezifikation entspricht. ### 4. Bitten Sie um eine unabhängige Überprüfung Ihres Codes {#get-independent-code-reviews} -Nachdem Sie Ihren Vertrag getestet haben, sollten Sie andere bitten, den Quellcode auf Sicherheitsprobleme zu prüfen. Beim Testen werden nicht alle Schwachstellen in einem Smart Contract aufgedeckt, eine unabhängige Überprüfung erhöht jedoch die Wahrscheinlichkeit, dass Schwachstellen entdeckt werden. +Nach dem Testen Ihres Vertrags ist es ratsam, andere zu bitten, den Quellcode auf Sicherheitsprobleme zu überprüfen. Tests werden nicht jeden Fehler in einem Smart Contract aufdecken, aber eine unabhängige Überprüfung erhöht die Wahrscheinlichkeit, Schwachstellen zu entdecken. #### Audits {#audits} -Die Beauftragung eines Smart Contract-Audits ist eine Möglichkeit zur Durchführung einer unabhängigen Code-Überprüfung. Prüfer spielen eine wichtige Rolle, wenn es darum geht sicherzustellen, dass Smart Contracts sicher und frei von Qualitätsmängeln und Planungsfehlern sind. +Die Beauftragung eines Smart Contract-Audits ist eine Möglichkeit, eine unabhängige Code-Überprüfung durchzuführen. Auditoren spielen eine wichtige Rolle dabei, sicherzustellen, dass Smart Contracts sicher und frei von Qualitätsmängeln und Designfehlern sind. -Dennoch sollten Sie Audits nicht als Wunderwaffe betrachten. Smart Contract-Audits können nicht jeden Fehler aufspüren und sind hauptsächlich dazu gedacht, eine zusätzliche Runde von Überprüfungen durchzuführen, die dazu beitragen können, Probleme zu entdecken, die von den Entwicklern während der anfänglichen Entwicklung und Tests übersehen wurden. Sie sollten auch die Best Practices für die Zusammenarbeit mit Prüfern befolgen, z. B. den Code ordnungsgemäß dokumentieren und Inline-Kommentare hinzufügen, um den Nutzen eines Smart Contract-Audits zu maximieren. +Dennoch sollten Sie vermeiden, Audits als Allheilmittel zu betrachten. Smart Contract-Audits werden nicht jeden Fehler finden und sind hauptsächlich dazu gedacht, eine zusätzliche Überprüfungsrunde zu bieten, die helfen kann, Probleme zu erkennen, die von Entwicklern während der anfänglichen Entwicklung und beim Testen übersehen wurden. Sie sollten auch Best Practices für die Zusammenarbeit mit Auditoren befolgen, wie z. B. die ordnungsgemäße Dokumentation des Codes und das Hinzufügen von Inline-Kommentaren, um den Nutzen eines Smart Contract-Audits zu maximieren. -- [Tipps & Tricks für das Auditing von Smart Contracts](https://twitter.com/tinchoabbate/status/1400170232904400897) – _@tinchoabbate_ -- [Holen Sie das Beste aus Ihrem Audit heraus](https://inference.ag/blog/2023-08-14-tips/) – _Inference_ +- [Tipps & Tricks für Smart Contract-Audits](https://twitter.com/tinchoabbate/status/1400170232904400897) - _@tinchoabbate_ +- [Machen Sie das Beste aus Ihrem Audit](https://inference.ag/blog/2023-08-14-tips/) - _Inference_ #### Bug-Bounties {#bug-bounties} -Die Einrichtung eines Prämienprogramms für das Aufdecken von Fehlern (Bug Bounty Program) ist ein weiterer Ansatz zur Durchführung externer Codeüberprüfungen. Ein Bug Bounty ist eine finanzielle Belohnung für Personen (in der Regel Whitehat-Hacker), die Schwachstellen in einer Applikation entdecken. +Die Einrichtung eines Bug-Bounty-Programms ist ein weiterer Ansatz zur Implementierung externer Code-Überprüfungen. Ein Bug-Bounty ist eine finanzielle Belohnung, die an Personen (normalerweise White-Hat-Hacker) vergeben wird, die Schwachstellen in einer Anwendung entdecken. -Wenn sie richtig eingesetzt werden, geben Bug Bounties den Mitgliedern der Hacker-Community einen Anreiz, Ihren Code auf kritische Fehler zu untersuchen. Ein Praxisbeispiel ist der „Infinite Money Bug“, der es einem Angreifer ermöglicht hätte, eine unbegrenzte Menge an Ether auf [Optimism](https://www.optimism.io/) zu erzeugen, einem [Layer-2](/layer-2/)-Protokoll, das auf Ethereum läuft. Glücklicherweise [entdeckte ein White-Hat-Hacker den Fehler](https://www.saurik.com/optimism.html) und benachrichtigte das Team, wodurch er [eine hohe Prämie erhielt](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). +Bei richtiger Anwendung geben Bug-Bounties Mitgliedern der Hacker-Community einen Anreiz, Ihren Code auf kritische Fehler zu untersuchen. Ein reales Beispiel ist der „Infinite Money Bug“, der es einem Angreifer ermöglicht hätte, eine unbegrenzte Menge an Ether auf [Optimism](https://www.optimism.io/), einem [Ebene 2](/layer-2/)-Protokoll, das auf Ethereum läuft, zu erstellen. Glücklicherweise [entdeckte ein White-Hat-Hacker den Fehler](https://www.saurik.com/optimism.html) und benachrichtigte das Team, [wobei er eine hohe Auszahlung erhielt](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). -Eine sinnvolle Strategie besteht darin, die Auszahlung eines Bug-Bounty-Programms im Verhältnis zur Höhe der auf dem Spiel stehenden Mittel festzulegen. Dieser Ansatz, der als „[Scaling Bug Bounty](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)“ bezeichnet wird, bietet Einzelpersonen finanzielle Anreize, Schwachstellen verantwortungsvoll offenzulegen, anstatt sie auszunutzen. +Eine nützliche Strategie besteht darin, die Auszahlung eines Bug-Bounty-Programms im Verhältnis zu den auf dem Spiel stehenden Geldern festzulegen. Dieser Ansatz, der als „[skalierendes Bug-Bounty](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)“ beschrieben wird, bietet finanzielle Anreize für Einzelpersonen, Schwachstellen verantwortungsvoll offenzulegen, anstatt sie auszunutzen. -### 5. Befolgen Sie bei der Entwicklung von Smart Contracts bewährte Praktiken {#follow-smart-contract-development-best-practices} +### 5. Befolgen Sie Best Practices bei der Smart Contract-Entwicklung {#follow-smart-contract-development-best-practices} -Die Verfügbarkeit von Audits und Bug Bounties entbindet Sie nicht von Ihrer Verantwortung, qualitativ hochwertigen Code zu schreiben. Die Sicherheit von Smart Contracts beginnt mit der Einhaltung geeigneter Planungs- und Entwicklungsprozesse: +Die Existenz von Audits und Bug-Bounties entbindet Sie nicht von Ihrer Verantwortung, qualitativ hochwertigen Code zu schreiben. Eine gute Smart Contract-Sicherheit beginnt mit der Befolgung ordnungsgemäßer Design- und Entwicklungsprozesse: -- Speichern Sie den gesamten Code in einem Versionskontrollsystem, z. B. Git +- Speichern Sie den gesamten Code in einem Versionskontrollsystem wie Git -- Nehmen Sie alle Codeänderungen über Pull Requests vor +- Nehmen Sie alle Code-Änderungen über Pull-Requests vor -- Stellen Sie sicher, dass Pull-Requests mindestens einen unabhängigen Reviewer haben. Wenn Sie alleine an einem Projekt arbeiten, sollten Sie überlegen, ob Sie nicht andere Entwickler finden und mit diesen Code-Reviews austauschen +- Stellen Sie sicher, dass Pull-Requests mindestens einen unabhängigen Prüfer haben – wenn Sie alleine an einem Projekt arbeiten, sollten Sie in Erwägung ziehen, andere Entwickler zu finden und Code-Überprüfungen auszutauschen - Verwenden Sie eine [Entwicklungsumgebung](/developers/docs/frameworks/) zum Testen, Kompilieren und Bereitstellen von Smart Contracts -- Führen Sie Ihren Code durch grundlegende Code-Analyse-Tools wie [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril und Slither. Idealerweise sollten Sie dies tun, noch bevor eine Pull-Anfrage eingebunden wird, und die Unterschiede in der Ergebnisausgabe vergleichen +- Führen Sie Ihren Code durch grundlegende Code-Analyse-Tools wie [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril und Slither. Idealerweise sollten Sie dies tun, bevor jeder Pull-Request zusammengeführt wird, und die Unterschiede in der Ausgabe vergleichen -- Stellen Sie sicher, dass Ihr Code ohne Fehler kompiliert wird und der Solidity-Compiler keine Warnungen ausgibt +- Stellen Sie sicher, dass Ihr Code fehlerfrei kompiliert wird und der Solidity-Compiler keine Warnungen ausgibt -- Dokumentieren Sie Ihren Code ordnungsgemäß (mit [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) und beschreiben Sie Details zur Vertragsarchitektur in einer leicht verständlichen Sprache. Dies erleichtert es anderen, Ihren Code zu überprüfen und zu kontrollieren. +- Dokumentieren Sie Ihren Code ordnungsgemäß (unter Verwendung von [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) und beschreiben Sie Details zur Vertragsarchitektur in leicht verständlicher Sprache. Dies erleichtert es anderen, Ihren Code zu prüfen und zu überprüfen. ### 6. Implementieren Sie robuste Notfallwiederherstellungspläne {#implement-disaster-recovery-plans} -Die Entwicklung sicherer Zugriffskontrollen, die Implementierung von Funktionsmodifikatoren und andere Vorschläge können die Sicherheit von Smart Contracts verbessern, jedoch können sie die Möglichkeit böswilliger Angriffe nicht ausschließen. Der Aufbau sicherer Smart Contracts erfordert eine „Vorbereitung auf Fehler“ und einen Notfallplan, um wirksam auf Angriffe reagieren zu können. Ein angemessener Notfallwiederherstellungsplan umfasst einige oder alle der folgenden Komponenten: +Das Entwerfen sicherer Zugriffskontrollen, die Implementierung von Funktionsmodifikatoren und andere Vorschläge können die Smart Contract-Sicherheit verbessern, aber sie können die Möglichkeit böswilliger Exploits nicht ausschließen. Der Aufbau sicherer Smart Contracts erfordert die „Vorbereitung auf den Fehlerfall“ und einen Fallback-Plan, um effektiv auf Angriffe reagieren zu können. Ein ordnungsgemäßer Notfallwiederherstellungsplan umfasst einige oder alle der folgenden Komponenten: #### Vertrags-Upgrades {#contract-upgrades} -Obwohl Ethereum Smart Contracts standardmäßig unveränderlich sind, ist es möglich, durch die Verwendung von Upgrade-Mustern einen gewissen Grad an Veränderbarkeit zu erreichen. Die Aktualisierung von Verträgen ist dann erforderlich, wenn ein kritischer Fehler Ihren alten Vertrag unbrauchbar macht und die Einführung einer neuen Logik die sinnvollste Option darstellt. +Während Ethereum-Smart Contracts standardmäßig unveränderlich sind, ist es möglich, durch die Verwendung von Upgrade-Mustern ein gewisses Maß an Veränderlichkeit zu erreichen. Das Aktualisieren von Verträgen ist in Fällen erforderlich, in denen ein kritischer Fehler Ihren alten Vertrag unbrauchbar macht und die Bereitstellung neuer Logik die praktikabelste Option ist. -Die Mechanismen zur Aktualisierung von Verträgen funktionieren unterschiedlich, wobei jedoch das „Proxy-Muster“ einer der beliebtesten Ansätze für die Aktualisierung von Smart Contracts ist. [Proxy-Muster](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) teilen den Zustand und die Logik einer Anwendung auf _zwei_ Verträge auf. Der erste Vertrag (ein so genannter „Proxy-Vertrag“) speichert Zustandsvariablen (z. B. Benutzerguthaben), während der zweite Vertrag (ein so genannter „Logik-Vertrag“) den Code für die Ausführung von Vertragsfunktionen enthält. +Mechanismen für Vertrags-Upgrades funktionieren unterschiedlich, aber das „Proxy-Muster“ ist einer der beliebtesten Ansätze für das Upgrade von Smart Contracts. [Proxy-Muster](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) teilen den Zustand und die Logik einer Anwendung auf _zwei_ Verträge auf. Der erste Vertrag (als „Proxy-Vertrag“ bezeichnet) speichert Zustandsvariablen (z. B. Benutzersalden), während der zweite Vertrag (als „Logik-Vertrag“ bezeichnet) den Code zur Ausführung von Vertragsfunktionen enthält. -Konten interagieren mit dem Proxy-Vertrag, der alle Funktionsaufrufe an den Logikvertrag mithilfe des Low-Level-Aufrufs [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) weiterleitet. Im Gegensatz zu einem regulären Nachrichtenaufruf stellt `delegatecall()` sicher, dass der an der Adresse des Logikvertrags ausgeführte Code im Kontext des aufrufenden Vertrags ausgeführt wird. Das bedeutet, dass der Logikvertrag immer in den Speicher des Proxys schreibt (anstatt in seinen eigenen Speicher) und die ursprünglichen Werte von `msg.sender` und `msg.value` erhalten bleiben. +Konten interagieren mit dem Proxy-Vertrag, der alle Funktionsaufrufe über den Low-Level-Aufruf [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) an den Logik-Vertrag weiterleitet. Im Gegensatz zu einem regulären Nachrichtenaufruf stellt `delegatecall()` sicher, dass der Code, der an der Adresse des Logik-Vertrags ausgeführt wird, im Kontext des aufrufenden Vertrags ausgeführt wird. Dies bedeutet, dass der Logik-Vertrag immer in den Speicher des Proxys (anstelle seines eigenen Speichers) schreibt und die ursprünglichen Werte von `msg.sender` und `msg.value` erhalten bleiben. -Die Übertragung von Aufrufen an den Logikvertrag erfordert die Speicherung seiner Adresse im Speicher des Proxy-Vertrags. Um die Logik des Vertrags zu aktualisieren, muss daher nur ein anderer Logikvertrag eingesetzt und die neue Adresse im Proxy-Vertrag gespeichert werden. Da nachfolgende Aufrufe des Proxy-Vertrags automatisch an den neuen Logik-Vertrag weitergeleitet werden, hätten Sie den Vertrag „aktualisiert“, ohne den Code tatsächlich zu ändern. +Das Delegieren von Aufrufen an den Logik-Vertrag erfordert das Speichern seiner Adresse im Speicher des Proxy-Vertrags. Daher ist das Upgrade der Vertragslogik nur eine Frage der Bereitstellung eines weiteren Logik-Vertrags und der Speicherung der neuen Adresse im Proxy-Vertrag. Da nachfolgende Aufrufe an den Proxy-Vertrag automatisch an den neuen Logik-Vertrag weitergeleitet werden, hätten Sie den Vertrag „aktualisiert“, ohne den Code tatsächlich zu ändern. -[Mehr zum Thema Vertrags-Upgrades](/developers/docs/smart-contracts/upgrading/). +[Mehr zum Upgrade von Verträgen](/developers/docs/smart-contracts/upgrading/). -#### Not-Stopps {#emergency-stops} +#### Notstopps {#emergency-stops} -Wie bereits erwähnt, können umfangreiche Prüfungen und Tests unmöglich alle Fehler in einem Smart Contract aufdecken. Wenn eine Schwachstelle in Ihrem Code nach der Veröffentlichung auftritt, ist es unmöglich, sie zu beheben, da Sie den Code, der unter der Vertragsadresse läuft, nicht ändern können. Außerdem kann die Implementierung von Upgrade-Mechanismen (z. B. Proxy-Muster) einige Zeit in Anspruch nehmen (sie erfordern oft die Zustimmung verschiedener Parteien), was den Angreifern nur mehr Zeit gibt, um mehr Schaden anzurichten. +Wie bereits erwähnt, können umfangreiche Audits und Tests unmöglich alle Fehler in einem Smart Contract entdecken. Wenn nach der Bereitstellung eine Schwachstelle in Ihrem Code auftritt, ist das Patchen unmöglich, da Sie den Code, der an der Vertragsadresse ausgeführt wird, nicht ändern können. Außerdem kann die Implementierung von Upgrade-Mechanismen (z. B. Proxy-Muster) Zeit in Anspruch nehmen (sie erfordern oft die Genehmigung verschiedener Parteien), was Angreifern nur mehr Zeit gibt, um mehr Schaden anzurichten. -Die einzige Möglichkeit besteht darin, eine „Not-Aus“-Funktion zu implementieren, die Aufrufe anfälliger Funktionen in einem Vertrag blockiert. Notausschalter bestehen in der Regel aus den folgenden Komponenten: +Die nukleare Option besteht darin, eine „Notstopp“-Funktion zu implementieren, die Aufrufe an anfällige Funktionen in einem Vertrag blockiert. Notstopps umfassen typischerweise die folgenden Komponenten: -1. Eine globale Boolesche Variable, die angibt, ob sich der Smart Contract in einem gestoppten Zustand befindet oder nicht. Diese Variable wird bei der Einrichtung des Vertrags auf `false` gesetzt, wechselt aber zu `true`, sobald der Vertrag angehalten wird. +1. Eine globale boolesche Variable, die angibt, ob sich der Smart Contract in einem gestoppten Zustand befindet oder nicht. Diese Variable wird beim Einrichten des Vertrags auf `false` gesetzt, ändert sich jedoch auf `true`, sobald der Vertrag gestoppten wird. -2. Funktionen, die bei ihrer Ausführung auf die boolesche Variable verweisen. Auf diese Funktionen kann zugegriffen werden, wenn der Smart Contract in Betrieb ist, und sie werden unzugänglich, wenn die Notausfunktion ausgelöst wird. +2. Funktionen, die bei ihrer Ausführung auf die boolesche Variable verweisen. Solche Funktionen sind zugänglich, wenn der Smart Contract nicht gestoppt ist, und werden unzugänglich, wenn die Notstopp-Funktion ausgelöst wird. -3. Eine Entität, die Zugriff auf die Not-Stopp-Funktion hat, welche die boolesche Variable auf `true` setzt. Um böswillige Aktionen zu verhindern, kann der Aufruf dieser Funktion auf eine vertrauenswürdige Adresse (z. B. den Vertragsinhaber) beschränkt werden. +3. Eine Entität, die Zugriff auf die Notstopp-Funktion hat, welche die boolesche Variable auf `true` setzt. Um böswillige Aktionen zu verhindern, können Aufrufe dieser Funktion auf eine vertrauenswürdige Adresse (z. B. den Vertragseigentümer) beschränkt werden. -Sobald der Vertrag den Notausschalter aktiviert, sind bestimmte Funktionen nicht mehr aufrufbar. Dies wird erreicht, indem die ausgewählten Funktionen in einen Modifikator verpackt werden, der auf die globale Variable verweist. Nachfolgend finden Sie [ein Beispiel](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol), das eine Implementierung dieses Musters in Verträgen beschreibt: +Sobald der Vertrag den Notstopp aktiviert, sind bestimmte Funktionen nicht mehr aufrufbar. Dies wird erreicht, indem ausgewählte Funktionen in einen Modifikator gewickelt werden, der auf die globale Variable verweist. Unten ist [ein Beispiel](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol), das eine Implementierung dieses Musters in Verträgen beschreibt: ```solidity -// Dieser Code wurde nicht professionell geprüft und gibt keine Zusicherungen bezüglich Sicherheit oder Korrektheit. Benutzung auf eigene Gefahr. +// Dieser Code wurde nicht professionell geprüft und macht keine Zusagen über Sicherheit oder Korrektheit. Verwendung auf eigene Gefahr. contract EmergencyStop { @@ -169,7 +169,7 @@ contract EmergencyStop { } modifier onlyAuthorized { - // Autorisierung von msg.sender hier prüfen + // Hier die Autorisierung von msg.sender prüfen _; } @@ -182,63 +182,63 @@ contract EmergencyStop { } function deposit() public payable stoppedInEmergency { - // Einzahlungslogik hier + // Hier findet die Einzahlungslogik statt } function emergencyWithdraw() public onlyWhenStopped { - // Notfall-Auszahlung hier + // Hier findet die Notabhebung statt } } ``` Dieses Beispiel zeigt die grundlegenden Merkmale von Notstopps: -- `isStopped` ist ein Boolescher Wert, der zu Beginn `false` ergibt und `true`, wenn der Vertrag in den Notfallmodus wechselt. +- `isStopped` ist ein boolescher Wert, der zu Beginn als `false` ausgewertet wird und `true` ist, wenn der Vertrag in den Notfallmodus wechselt. -- Die Funktionsmodifikatoren `onlyWhenStopped` und `stoppedInEmergency` überprüfen die Variable `isStopped`. `stoppedInEmergency` wird verwendet, um Funktionen zu steuern, die unzugänglich sein sollten, wenn der Vertrag anfällig ist (z. B. `deposit()`). Aufrufe dieser Funktionen werden einfach zurückgewiesen. +- Die Funktionsmodifikatoren `onlyWhenStopped` und `stoppedInEmergency` überprüfen die Variable `isStopped`. `stoppedInEmergency` wird verwendet, um Funktionen zu steuern, die unzugänglich sein sollten, wenn der Vertrag anfällig ist (z. B. `deposit()`). Aufrufe dieser Funktionen werden einfach rückgängig gemacht. -`onlyWhenStopped` wird für Funktionen verwendet, die während eines Notfalls aufrufbar sein sollten (z. B. `emergencyWithdraw()`). Diese Funktionen können zur Lösung des Problems beitragen, weshalb sie nicht in der Liste der „eingeschränkten Funktionen“ aufgeführt sind. +`onlyWhenStopped` wird für Funktionen verwendet, die während eines Notfalls aufrufbar sein sollten (z. B. `emergencyWithdraw()`). Solche Funktionen können helfen, die Situation zu lösen, daher ihr Ausschluss aus der Liste der „eingeschränkten Funktionen“. -Die Verwendung einer Notstopp-Funktion ist eine wirksame Notlösung für den Umgang mit schwerwiegenden Schwachstellen in Ihrem Smart Contract. Allerdings müssen die Nutzer darauf vertrauen können, dass die Entwickler sie nicht aus eigennützigen Gründen aktivieren. Zu diesem Zweck kann die Kontrolle über den Notstopp dezentralisiert werden, indem er entweder einem On-Chain-Abstimmungsmechanismus, einer Zeitsperre oder der Genehmigung durch eine Multisig-Wallet unterworfen wird. +Die Verwendung einer Notstopp-Funktionalität bietet eine effektive Übergangslösung für den Umgang mit schwerwiegenden Schwachstellen in Ihrem Smart Contract. Es erhöht jedoch die Notwendigkeit für Benutzer, darauf zu vertrauen, dass Entwickler sie nicht aus eigennützigen Gründen aktivieren. Zu diesem Zweck sind die Dezentralisierung der Kontrolle über den Notstopp, indem er einem Abstimmungsmechanismus auf der Blockchain, einem Timelock oder der Genehmigung durch ein Mehrfachsignatur-Wallet unterworfen wird, mögliche Lösungen. #### Ereignisüberwachung {#event-monitoring} -[Ereignisse](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) ermöglichen es Ihnen, Aufrufe von Smart-Contract-Funktionen zu verfolgen und Änderungen an Zustandsvariablen zu überwachen. Ideal ist es, wenn Sie Ihren Smart Contract so programmieren, dass er immer dann ein Ereignis auslöst, wenn eine Partei eine sicherheitskritische Aktion durchführt (z. B. das Abheben von Guthaben). +[Ereignisse (Events)](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) ermöglichen es Ihnen, Aufrufe von Smart Contract-Funktionen zu verfolgen und Änderungen an Zustandsvariablen zu überwachen. Es ist ideal, Ihren Smart Contract so zu programmieren, dass er ein Ereignis ausgibt, wann immer eine Partei eine sicherheitskritische Aktion durchführt (z. B. das Abheben von Geldern). -Die Protokollierung von Ereignissen und deren Überwachung off-chain bietet Einblicke in Vertragsvorgänge und hilft, böswillige Handlungen schneller zu entdecken. Das bedeutet, dass Ihr Team schneller auf Hacks reagieren und Maßnahmen ergreifen kann, um die Auswirkungen auf die Benutzer zu minimieren, z. B. das Anhalten von Funktionen oder die Durchführung eines Upgrades. +Das Protokollieren von Ereignissen und deren Off-Chain-Überwachung bietet Einblicke in Vertragsoperationen und hilft bei der schnelleren Entdeckung böswilliger Aktionen. Dies bedeutet, dass Ihr Team schneller auf Hacks reagieren und Maßnahmen ergreifen kann, um die Auswirkungen auf die Benutzer zu mindern, wie z. B. das Pausieren von Funktionen oder die Durchführung eines Upgrades. -Sie können sich auch für ein handelsübliches Überwachungsprogramm entscheiden, das automatisch Warnmeldungen weiterleitet, sobald jemand mit Ihren Verträgen interagiert. Mit diesen Tools können Sie benutzerdefinierte Warnmeldungen erstellen, die auf verschiedenen Auslösern basieren, z. B. dem Transaktionsvolumen, der Häufigkeit von Funktionsaufrufen oder den spezifischen Funktionen. Sie könnten zum Beispiel eine Warnung programmieren, die eingeht, wenn der in einer einzigen Transaktion abgehobene Betrag einen bestimmten Schwellenwert überschreitet. +Sie können sich auch für ein handelsübliches Überwachungstool entscheiden, das automatisch Warnungen weiterleitet, wann immer jemand mit Ihren Verträgen interagiert. Diese Tools ermöglichen es Ihnen, benutzerdefinierte Warnungen basierend auf verschiedenen Auslösern zu erstellen, wie z. B. Transaktionsvolumen, Häufigkeit von Funktionsaufrufen oder den spezifischen beteiligten Funktionen. Beispielsweise könnten Sie eine Warnung programmieren, die eingeht, wenn der in einer einzigen Transaktion abgehobene Betrag einen bestimmten Schwellenwert überschreitet. ### 7. Entwerfen Sie sichere Governance-Systeme {#design-secure-governance-systems} -Vielleicht möchten Sie Ihre Anwendung dezentralisieren, indem Sie die Kontrolle über die wichtigsten Smart Contracts an Community-Mitglieder übergeben. In diesem Fall wird das Smart-Contract-System ein Governance-Modul enthalten - einen Mechanismus, der es den Mitgliedern der Gemeinschaft ermöglicht, administrative Aktionen über ein On-Chain-Governance-System zu genehmigen. So können die Token-Inhaber beispielsweise über einen Vorschlag abstimmen, einen Proxy-Vertrag auf eine neue Implementierung zu aktualisieren. +Möglicherweise möchten Sie Ihre Anwendung dezentralisieren, indem Sie die Kontrolle über zentrale Smart Contracts an Community-Mitglieder übergeben. In diesem Fall wird das Smart Contract-System ein Governance-Modul enthalten – einen Mechanismus, der es Community-Mitgliedern ermöglicht, administrative Aktionen über ein Governance-System auf der Blockchain zu genehmigen. Beispielsweise kann über einen Vorschlag zum Upgrade eines Proxy-Vertrags auf eine neue Implementierung von Token-Inhabern abgestimmt werden. -Eine dezentrale Verwaltung kann von Vorteil sein, insbesondere weil sie die Interessen von Entwicklern und Endnutzern in Einklang bringt. Dennoch können die Mechanismen zur Steuerung von Smart Contracts bei falscher Umsetzung neue Risiken mit sich bringen. Ein plausibles Szenario ist, dass ein Angreifer enorme Stimmkraft (gemessen an der Anzahl der gehaltenen Token) durch die Aufnahme eines [Flash-Loans](/defi/#flash-loans) erlangt und einen bösartigen Vorschlag durchsetzt. +Dezentralisierte Governance kann vorteilhaft sein, insbesondere weil sie die Interessen von Entwicklern und Endbenutzern in Einklang bringt. Dennoch können Smart Contract-Governance-Mechanismen neue Risiken einführen, wenn sie falsch implementiert werden. Ein plausibles Szenario ist, wenn ein Angreifer durch die Aufnahme eines [Flash-Loans](/defi/#flash-loans) enorme Stimmrechte (gemessen an der Anzahl der gehaltenen Token) erwirbt und einen böswilligen Vorschlag durchsetzt. -Eine Möglichkeit, Probleme im Zusammenhang mit der Onchain-Governance zu vermeiden, ist die [Verwendung eines Timelocks](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Eine Zeitsperre verhindert, dass ein Smart Contract bestimmte Aktionen ausführt, bis eine bestimmte Zeitspanne verstrichen ist. Andere Strategien bestehen darin, jedem Token ein „Stimmgewicht“ zuzuweisen, das sich danach richtet, wie lange er gesperrt war, oder die Stimmkraft einer Adresse in einem historischen Zeitraum (z. B. 2-3 Blöcke in der Vergangenheit) anstelle des aktuellen Blocks zu messen. Beide Methoden reduzieren die Möglichkeit, schnell Stimmrecht anzuhäufen, um On-Chain-Abstimmungen zu beeinflussen. +Eine Möglichkeit, Probleme im Zusammenhang mit der Governance auf der Blockchain zu verhindern, ist die [Verwendung eines Timelocks](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Ein Timelock verhindert, dass ein Smart Contract bestimmte Aktionen ausführt, bis eine bestimmte Zeitspanne verstrichen ist. Andere Strategien umfassen die Zuweisung eines „Stimmgewichts“ zu jedem Token basierend darauf, wie lange er gesperrt war, oder die Messung der Stimmkraft einer Adresse zu einem historischen Zeitraum (zum Beispiel 2-3 Blöcke in der Vergangenheit) anstelle des aktuellen Blocks. Beide Methoden verringern die Möglichkeit, schnell Stimmrechte anzuhäufen, um Abstimmungen auf der Blockchain zu beeinflussen. -Mehr über das [Entwerfen sicherer Governance-Systeme](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), [verschiedene Abstimmungsmechanismen in DAOs](https://hackernoon.com/governance-is-the-holy-grail-for-daos) und [die gängigen DAO-Angriffsvektoren, die DeFi nutzen](https://dacian.me/dao-governance-defi-attacks), finden Sie in den geteilten Links. +Mehr zum [Entwerfen sicherer Governance-Systeme](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), zu [verschiedenen Abstimmungsmechanismen in DAOs](https://hackernoon.com/governance-is-the-holy-grail-for-daos) und zu [den häufigen DAO-Angriffsvektoren, die DeFi nutzen](https://dacian.me/dao-governance-defi-attacks), in den geteilten Links. ### 8. Reduzieren Sie die Komplexität im Code auf ein Minimum {#reduce-code-complexity} -Traditionelle Softwareentwickler sind mit dem KISS-Prinzip („Keep it simple, stupid“) vertraut, das davon abrät, unnötige Komplexität in das Softwaredesign einzubringen. Dies entspricht der seit langem vertretenen Auffassung, dass „komplexe Systeme auf komplexe Weise versagen“ und anfälliger für kostspielige Fehler sind. +Traditionelle Softwareentwickler sind mit dem KISS-Prinzip („keep it simple, stupid“) vertraut, das davon abrät, unnötige Komplexität in das Software-Design einzuführen. Dies folgt dem lang gehegten Gedanken, dass „komplexe Systeme auf komplexe Weise scheitern“ und anfälliger für kostspielige Fehler sind. -Beim Schreiben von Smart Contracts ist es besonders wichtig, die Inhalte einfach zu halten, da Smart Contracts potenziell große Wertbeträge kontrollieren. Ein Tipp zur Vereinfachung beim Schreiben von Smart Contracts ist die Wiederverwendung bestehender Bibliotheken, wie z. B. [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/), wo immer dies möglich ist. Da diese Bibliotheken von den Entwicklern ausgiebig geprüft und getestet wurden, verringert sich durch ihre Verwendung die Wahrscheinlichkeit, dass durch das Schreiben neuer Funktionen von Grund auf Fehler eingeführt werden. +Die Dinge einfach zu halten, ist beim Schreiben von Smart Contracts von besonderer Bedeutung, da Smart Contracts potenziell große Werte kontrollieren. Ein Tipp zur Erreichung von Einfachheit beim Schreiben von Smart Contracts ist die Wiederverwendung bestehender Bibliotheken, wie z. B. [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/), wo immer dies möglich ist. Da diese Bibliotheken von Entwicklern ausgiebig geprüft und getestet wurden, verringert ihre Verwendung die Wahrscheinlichkeit, Fehler einzuführen, indem neue Funktionen von Grund auf neu geschrieben werden. -Ein weiterer allgemeiner Ratschlag lautet, kleine Funktionen zu schreiben und Verträge modulartig zu halten, indem die Logik auf mehrere Verträge aufgeteilt wird. Das Schreiben von einfacherem Code verringert nicht nur die Angriffsfläche in einem Smart Contract, sondern macht es auch einfacher, Rückschlüsse auf die Korrektheit des Gesamtsystems zu ziehen und mögliche Planungsfehler frühzeitig zu erkennen. +Ein weiterer häufiger Ratschlag ist, kleine Funktionen zu schreiben und Verträge modular zu halten, indem die Geschäftslogik auf mehrere Verträge aufgeteilt wird. Das Schreiben von einfacherem Code reduziert nicht nur die Angriffsfläche in einem Smart Contract, sondern erleichtert es auch, über die Korrektheit des Gesamtsystems nachzudenken und mögliche Designfehler frühzeitig zu erkennen. -### 9. Schützen Sie sich vor häufigen Schwachstellen bei Smart Contracts {#mitigate-common-smart-contract-vulnerabilities} +### 9. Verteidigen Sie sich gegen häufige Smart Contract-Schwachstellen {#mitigate-common-smart-contract-vulnerabilities} -#### Reentrancy {#reentrancy} +#### Reentrancy (Wiedereintritt) {#reentrancy} -Die EVM erlaubt keine Nebenläufigkeit, was bedeutet, dass zwei Verträge, die an einem Nachrichtenaufruf beteiligt sind, nicht gleichzeitig ausgeführt werden können. Ein externer Aufruf unterbricht die Ausführung und den Speicher des aufrufenden Vertrags, bis der Aufruf erwidert wird, woraufhin die Ausführung normal fortgesetzt wird. Dieser Prozess kann formell als Übertragung des [Kontrollflusses](https://www.computerhope.com/jargon/c/contflow.htm) an einen anderen Vertrag beschrieben werden. +Die EVM erlaubt keine Nebenläufigkeit (Concurrency), was bedeutet, dass zwei an einem Nachrichtenaufruf beteiligte Verträge nicht gleichzeitig ausgeführt werden können. Ein externer Aufruf pausiert die Ausführung und den Speicher des aufrufenden Vertrags, bis der Aufruf zurückkehrt, woraufhin die Ausführung normal fortgesetzt wird. Dieser Prozess kann formal als Übertragung des [Kontrollflusses](https://www.computerhope.com/jargon/c/contflow.htm) an einen anderen Vertrag beschrieben werden. -Die Übertragung des Kontrollflusses an nicht vertrauenswürdige Verträge ist zwar meist harmlos, kann aber Probleme verursachen, wie z. B. Wiederholungsangriffe. Ein Wiederholungsangriff liegt vor, wenn ein böswilliger Vertrag in einen gefährdeten Vertrag eingreift, bevor der ursprüngliche Funktionsaufruf abgeschlossen ist. Diese Art des Angriffs lässt sich am besten anhand eines Beispiels erklären. +Obwohl meist harmlos, kann die Übertragung des Kontrollflusses an nicht vertrauenswürdige Verträge Probleme verursachen, wie z. B. Reentrancy. Ein Reentrancy-Angriff tritt auf, wenn ein böswilliger Vertrag in einen anfälligen Vertrag zurückruft, bevor der ursprüngliche Funktionsaufruf abgeschlossen ist. Diese Art von Angriff lässt sich am besten an einem Beispiel erklären. -Betrachten Sie einen einfachen Smart Contract („Opfer"), der es jedem ermöglicht, Ether einzuzahlen und abzuheben: +Betrachten Sie einen einfachen Smart Contract („Victim“), der es jedem ermöglicht, Ether einzuzahlen und abzuheben: ```solidity -// Dieser Vertrag ist anfällig. Nicht in der Produktion verwenden +// Dieser Contract ist verwundbar. Nicht in der Produktion verwenden contract Victim { mapping (address => uint256) public balances; @@ -256,17 +256,17 @@ contract Victim { } ``` -Dieser Vertrag stellt eine `withdraw()`-Funktion zur Verfügung, die es Nutzern ermöglicht, zuvor in den Vertrag eingezahlte ETH abzuheben. Bei der Bearbeitung einer Abhebung führt der Vertrag die folgenden Vorgänge durch: +Dieser Vertrag stellt eine `withdraw()`-Funktion zur Verfügung, um Benutzern das Abheben von zuvor in den Vertrag eingezahltem ETH zu ermöglichen. Bei der Verarbeitung einer Abhebung führt der Vertrag die folgenden Operationen durch: -1. Überprüft das ETH-Guthaben des Nutzers -2. Sendet Guthaben an die anrufende Adresse -3. Setzt das Guthaben auf 0 zurück und verhindert so weitere Abhebungen durch den Nutzer +1. Überprüft das ETH-Guthaben des Benutzers +2. Sendet Gelder an die aufrufende Adresse +3. Setzt ihr Guthaben auf 0 zurück, um zusätzliche Abhebungen durch den Benutzer zu verhindern -Die `withdraw()`-Funktion im `Victim`-Vertrag folgt einem „Prüfungen-Interaktionen-Auswirkungen“-Muster. Sie _prüft_, ob die für die Ausführung notwendigen Bedingungen erfüllt sind (d. h. der Nutzer hat ein positives ETH-Guthaben) und führt die _Interaktion_ durch, indem sie ETH an die Adresse des Aufrufers sendet, bevor sie die _Auswirkungen_ der Transaktion anwendet (d. h. das Guthaben des Nutzers verringert). +Die `withdraw()`-Funktion im `Victim`-Vertrag folgt einem „Checks-Interactions-Effects“-Muster. Sie _überprüft_ (checks), ob die für die Ausführung erforderlichen Bedingungen erfüllt sind (d. h. der Benutzer hat ein positives ETH-Guthaben), und führt die _Interaktion_ (interaction) durch, indem sie ETH an die Adresse des Aufrufers sendet, bevor sie die _Auswirkungen_ (effects) der Transaktion anwendet (d. h. das Guthaben des Benutzers reduziert). -Wenn `withdraw()` von einem extern verwalteten Konto (EOA) aufgerufen wird, wird die Funktion wie erwartet ausgeführt: `msg.sender.call.value()` sendet ETH an den Aufrufer. Wenn `msg.sender` jedoch ein Smart-Contract-Konto ist, das `withdraw()` aufruft, löst das Senden von Geldern mit `msg.sender.call.value()` auch die Ausführung von Code aus, der an dieser Adresse gespeichert ist. +Wenn `withdraw()` von einem extern verwalteten Konto (EOA) aufgerufen wird, wird die Funktion wie erwartet ausgeführt: `msg.sender.call.value()` sendet ETH an den Aufrufer. Wenn jedoch `msg.sender` ein Smart Contract-Konto ist, das `withdraw()` aufruft, wird das Senden von Geldern mit `msg.sender.call.value()` auch den an dieser Adresse gespeicherten Code zur Ausführung auslösen. -Stellen Sie sich vor, dass dies der Code ist, der an der Vertragsadresse veröffentlicht wird: +Stellen Sie sich vor, dies ist der Code, der an der Vertragsadresse bereitgestellt wird: ```solidity contract Attacker { @@ -285,32 +285,32 @@ Stellen Sie sich vor, dass dies der Code ist, der an der Vertragsadresse veröff Dieser Vertrag ist darauf ausgelegt, drei Dinge zu tun: -1. Eine Einzahlung von einem anderen Konto akzeptieren (wahrscheinlich von der EOA des Angreifers) -2. 1 ETH in den Vertrag des Opfers einzahlen -3. Die im Smart Contract gespeicherten 1 ETH abheben +1. Eine Einzahlung von einem anderen Konto akzeptieren (wahrscheinlich das EOA des Angreifers) +2. 1 ETH in den Victim-Vertrag einzahlen +3. Die 1 ETH abheben, die im Smart Contract gespeichert sind -Daran ist nichts auszusetzen, außer dass `Attacker` eine weitere Funktion hat, die `withdraw()` in `Victim` erneut aufruft, wenn das vom eingehenden `msg.sender.call.value` übrig gebliebene Gas mehr als 40.000 beträgt. Dies gibt `Attacker` die Möglichkeit, `Victim` erneut aufzurufen und mehr Geld abzuheben, _bevor_ die erste Ausführung von `withdraw` abgeschlossen ist. Der Kreislauf sieht folgendermaßen aus: +Daran ist nichts falsch, außer dass `Attacker` eine weitere Funktion hat, die `withdraw()` in `Victim` erneut aufruft, wenn das vom eingehenden `msg.sender.call.value` übrig gebliebene Gas mehr als 40.000 beträgt. Dies gibt `Attacker` die Möglichkeit, wieder in `Victim` einzutreten und mehr Gelder abzuheben, _bevor_ der erste Aufruf von `withdraw` abgeschlossen ist. Der Zyklus sieht so aus: ```solidity -- EOA des Angreifers ruft `Attacker.beginAttack()` mit 1 ETH auf -- `Attacker.beginAttack()` zahlt 1 ETH in `Victim` ein -- `Attacker` ruft `withdraw()` in `Victim` auf -- `Victim` prüft das Guthaben von `Attacker` (1 ETH) -- `Victim` sendet 1 ETH an `Attacker` (was die Standardfunktion auslöst) -- `Attacker` ruft `Victim.withdraw()` erneut auf (beachten Sie, dass `Victim` das Guthaben von `Attacker` aus der ersten Auszahlung noch nicht reduziert hat) -- `Victim` prüft das Guthaben von `Attacker` (das immer noch 1 ETH beträgt, da die Auswirkungen des ersten Aufrufs noch nicht angewendet wurden) -- `Victim` sendet 1 ETH an `Attacker` (was die Standardfunktion auslöst und `Attacker` erlaubt, die `withdraw`-Funktion erneut aufzurufen) -- Der Prozess wiederholt sich, bis `Attacker` das Gas ausgeht. An diesem Punkt kehrt `msg.sender.call.value` zurück, ohne weitere Auszahlungen auszulösen -- `Victim` wendet schließlich die Ergebnisse der ersten Transaktion (und der nachfolgenden) auf seinen Zustand an, so dass das Guthaben von `Attacker` auf 0 gesetzt wird +- Attacker's EOA calls `Attacker.beginAttack()` with 1 ETH +- `Attacker.beginAttack()` deposits 1 ETH into `Victim` +- `Attacker` calls `withdraw() in `Victim` +- `Victim` checks `Attacker`’s balance (1 ETH) +- `Victim` sends 1 ETH to `Attacker` (which triggers the default function) +- `Attacker` calls `Victim.withdraw()` again (note that `Victim` hasn’t reduced `Attacker`’s balance from the first withdrawal) +- `Victim` checks `Attacker`’s balance (which is still 1 ETH because it hasn’t applied the effects of the first call) +- `Victim` sends 1 ETH to `Attacker` (which triggers the default function and allows `Attacker` to reenter the `withdraw` function) +- The process repeats until `Attacker` runs out of gas, at which point `msg.sender.call.value` returns without triggering additional withdrawals +- `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Da das Guthaben des Aufrufers nicht auf 0 gesetzt wird, bevor die Funktion ausgeführt wurde, können nachfolgende Aufrufe erfolgreich sein und dem Aufrufer ermöglichen, sein Guthaben mehrmals abzuheben. Diese Art von Angriff kann genutzt werden, um die Gelder eines Smart Contracts zu entwenden, so wie es beim [DAO-Hack von 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) geschah. Reentrancy-Angriffe sind auch heute noch ein kritisches Problem für Smart Contracts, wie [öffentliche Listen von Reentrancy-Exploits](https://github.com/pcaversaccio/reentrancy-attacks) zeigen. +Zusammenfassend lässt sich sagen, dass, da das Guthaben des Aufrufers erst auf 0 gesetzt wird, wenn die Funktionsausführung abgeschlossen ist, nachfolgende Aufrufe erfolgreich sein werden und es dem Aufrufer ermöglichen, sein Guthaben mehrmals abzuheben. Diese Art von Angriff kann verwendet werden, um einen Smart Contract von seinen Geldern zu leeren, wie es beim [DAO-Hack 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) geschah. Reentrancy-Angriffe sind auch heute noch ein kritisches Problem für Smart Contracts, wie [öffentliche Auflistungen von Reentrancy-Exploits](https://github.com/pcaversaccio/reentrancy-attacks) zeigen. -##### So verhindert man Wiederholungsangriffe +##### Wie man Reentrancy-Angriffe verhindert -Ein Ansatz zum Umgang mit Reentrancy ist die Befolgung des [Checks-Effects-Interactions-Musters](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Dieses Modell ordnet die Ausführung von Funktionen so an, dass Code, der vor der Ausführung notwendige Überprüfungen durchführt, zuerst kommt, gefolgt von Code, der den Vertragsstatus manipuliert, und Code, der mit anderen Verträgen oder EOAs interagiert, als letztes erfolgt. +Ein Ansatz zum Umgang mit Reentrancy ist die Befolgung des [Checks-Effects-Interactions-Musters](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Dieses Muster ordnet die Ausführung von Funktionen so an, dass Code, der notwendige Überprüfungen durchführt, bevor er mit der Ausführung fortfährt, an erster Stelle steht, gefolgt von Code, der den Vertragszustand manipuliert, wobei Code, der mit anderen Verträgen oder EOAs interagiert, als letztes kommt. -Das Prüfungen-Auswirkungen-Interaktionen-Muster wird in einer überarbeiteten Version des `Victim`-Vertrags verwendet, die unten gezeigt wird: +Das Checks-Effects-Interactions-Muster wird in einer überarbeiteten Version des unten gezeigten `Victim`-Vertrags verwendet: ```solidity contract NoLongerAVictim { @@ -323,9 +323,9 @@ contract NoLongerAVictim { } ``` -Dieser Vertrag führt eine _Prüfung_ des Guthabens des Nutzers durch, wendet die _Auswirkungen_ der `withdraw()`-Funktion an (indem das Guthaben des Nutzers auf 0 zurückgesetzt wird) und fährt dann mit der _Interaktion_ fort (dem Senden von ETH an die Adresse des Nutzers). Auf diese Weise wird sichergestellt, dass der Vertrag seinen Speicher vor dem externen Aufruf aktualisiert und die Bedingung der Wiederverknüpfung, die den ersten Angriff ermöglichte, beseitigt. Der `Attacker`-Vertrag könnte immer noch `NoLongerAVictim` zurückrufen, aber da `balances[msg.sender]` auf 0 gesetzt wurde, werden zusätzliche Abhebungen einen Fehler auslösen. +Dieser Vertrag führt eine _Überprüfung_ (check) des Benutzerguthabens durch, wendet die _Auswirkungen_ (effects) der `withdraw()`-Funktion an (indem das Benutzerguthaben auf 0 zurückgesetzt wird) und fährt fort, die _Interaktion_ (interaction) durchzuführen (Senden von ETH an die Adresse des Benutzers). Dies stellt sicher, dass der Vertrag seinen Speicher vor dem externen Aufruf aktualisiert, wodurch die Reentrancy-Bedingung beseitigt wird, die den ersten Angriff ermöglichte. Der `Attacker`-Vertrag könnte immer noch in `NoLongerAVictim` zurückrufen, aber da `balances[msg.sender]` auf 0 gesetzt wurde, werden zusätzliche Abhebungen einen Fehler auslösen. -Eine andere Möglichkeit ist die Verwendung einer gegenseitigen Ausschlusssperre (allgemein als „Mutex“ bezeichnet), die einen Teil des Vertragsstatus sperrt, bis ein Funktionsaufruf abgeschlossen ist. Dies wird durch eine boolesche Variable implementiert, die vor der Ausführung der Funktion auf `true` gesetzt wird und nach Abschluss des Aufrufs auf `false` zurückgesetzt wird. Wie im folgenden Beispiel zu sehen ist, schützt die Verwendung einer „Mutex“ eine Funktion vor wiederholten Aufrufen, während der ursprüngliche Aufruf noch in Bearbeitung ist, wodurch Wiederholungsangriffe effektiv verhindert werden. +Eine weitere Option ist die Verwendung einer gegenseitigen Ausschluss-Sperre (allgemein als „Mutex“ beschrieben), die einen Teil des Zustands eines Vertrags sperrt, bis ein Funktionsaufruf abgeschlossen ist. Dies wird mithilfe einer booleschen Variablen implementiert, die vor der Ausführung der Funktion auf `true` gesetzt wird und nach Abschluss des Aufrufs wieder auf `false` zurückgesetzt wird. Wie im folgenden Beispiel zu sehen ist, schützt die Verwendung eines Mutex eine Funktion vor rekursiven Aufrufen, während der ursprüngliche Aufruf noch verarbeitet wird, wodurch Reentrancy effektiv gestoppt wird. ```solidity pragma solidity ^0.7.0; @@ -335,15 +335,15 @@ contract MutexPattern { mapping(address => uint256) public balances; modifier noReentrancy() { - require(!locked, "Wiedereintritt blockiert."); + require(!locked, "Blocked from reentrancy."); locked = true; _; locked = false; } - // Diese Funktion ist durch einen Mutex geschützt, so dass reentrante Aufrufe von innerhalb `msg.sender.call` `withdraw` nicht erneut aufrufen können. - // Die `return`-Anweisung wird zu `true` ausgewertet, wertet aber dennoch die `locked = false`-Anweisung im Modifikator aus + // Diese Funktion ist durch einen Mutex geschützt, sodass reentrante Aufrufe aus `msg.sender.call` heraus `withdraw` nicht erneut aufrufen können. + // Die `return`-Anweisung ergibt `true`, wertet aber dennoch die `locked = false`-Anweisung im Modifier aus function withdraw(uint _amount) public payable noReentrancy returns(bool) { - require(balances[msg.sender] >= _amount, "Kein Guthaben zum Abheben."); + require(balances[msg.sender] >= _amount, "No balance to withdraw."); balances[msg.sender] -= _amount; (bool success, ) = msg.sender.call{value: _amount}(""); @@ -354,30 +354,32 @@ contract MutexPattern { } ``` -Sie können auch ein [Pull-Payments](https://docs.openzeppelin.com/contracts/5.x/api/utils#security#PullPayment)-System verwenden, bei dem Nutzer Gelder von den Smart Contracts abheben müssen, anstatt eines „Push-Payments“-Systems, das Gelder an Konten sendet. Dies verhindert die Möglichkeit, unbeabsichtigt Code an unbekannten Adressen auszulösen (und kann auch bestimmte Denial-of-Service-Angriffe verhindern). +Sie können auch ein [Pull-Payments](https://docs.openzeppelin.com/contracts/5.x/api/utils#security#PullPayment)-System verwenden, das von Benutzern verlangt, Gelder aus den Smart Contracts abzuheben, anstelle eines „Push-Payments“-Systems, das Gelder an Konten sendet. Dies beseitigt die Möglichkeit, versehentlich Code an unbekannten Adressen auszulösen (und kann auch bestimmte Denial-of-Service-Angriffe verhindern). -#### Ganzzahl-Unterläufe und -Überläufe {#integer-underflows-and-overflows} +#### Integer-Underflows und -Overflows {#integer-underflows-and-overflows} -Ein Integer-Überlauf tritt auf, wenn das Ergebnis einer arithmetischen Operation außerhalb des zulässigen Wertebereichs liegt, so dass es auf den niedrigsten darstellbaren Wert „überläuft“. Zum Beispiel kann ein `uint8` nur Werte bis zu 2^8-1=255 speichern. Arithmetische Operationen, die zu Werten führen, die höher als `255` sind, führen zu einem Überlauf und setzen `uint` auf `0` zurück, ähnlich wie der Kilometerzähler eines Autos auf 0 zurückgesetzt wird, sobald er den maximalen Kilometerstand (999999) erreicht. +Ein Integer-Overflow (Überlauf) tritt auf, wenn die Ergebnisse einer arithmetischen Operation außerhalb des akzeptablen Wertebereichs liegen, was dazu führt, dass sie auf den niedrigsten darstellbaren Wert „überrollen“. Beispielsweise kann ein `uint8` nur Werte bis zu 2^8-1=255 speichern. Arithmetische Operationen, die zu Werten über `255` führen, laufen über und setzen `uint` auf `0` zurück, ähnlich wie der Kilometerzähler eines Autos auf 0 zurückgesetzt wird, sobald er den maximalen Kilometerstand (999999) erreicht. -Ganzzahl-Unterläufe treten aus ähnlichen Gründen auf: die Ergebnisse einer arithmetischen Operation fallen unter den zulässigen Bereich. Angenommen, Sie versuchen, `0` in einem `uint8` zu dekrementieren, würde das Ergebnis einfach auf den maximal darstellbaren Wert (`255`) überlaufen. +Integer-Underflows (Unterlauf) passieren aus ähnlichen Gründen: Die Ergebnisse einer arithmetischen Operation fallen unter den akzeptablen Bereich. Angenommen, Sie versuchen, `0` in einem `uint8` zu dekrementieren, würde das Ergebnis einfach auf den maximal darstellbaren Wert (`255`) überrollen. -Sowohl Integer-Überläufe als auch -Unterläufe können zu unerwarteten Änderungen an den Zustandsvariablen eines Vertrags führen und eine ungeplante Ausführung zur Folge haben. Das folgende Beispiel zeigt, wie ein Angreifer einen arithmetischen Überlauf in einem Smart Contract ausnutzen kann, um eine ungültige Operation durchzuführen: +Sowohl Integer-Overflows als auch -Underflows können zu unerwarteten Änderungen an den Zustandsvariablen eines Vertrags führen und eine ungeplante Ausführung zur Folge haben. Unten ist ein Beispiel, das zeigt, wie ein Angreifer einen arithmetischen Überlauf in einem Smart Contract ausnutzen kann, um eine ungültige Operation durchzuführen: ``` pragma solidity ^0.7.6; -// Dieser Vertrag soll als Zeit-Tresor dienen. -// Nutzer können in diesen Vertrag einzahlen, aber für mindestens eine Woche nicht abheben. -// Nutzer können die Wartezeit auch über die einwöchige Wartezeit hinaus verlängern. +// This contract is designed to act as a time vault. +// User can deposit into this contract but cannot withdraw for at least a week. +// User can also extend the wait time beyond the 1 week waiting period. /* -1. TimeLock bereitstellen -2. Attack mit der Adresse von TimeLock bereitstellen -3. Attack.attack aufrufen und 1 Ether senden. Sie können Ihren Ether sofort abheben. - -Was ist passiert? -Attack hat einen Überlauf bei TimeLock.lockTime verursacht und konnte vor Ablauf der einwöchigen Wartezeit abheben. +1. Deploy TimeLock +2. Deploy Attack with address of TimeLock +3. Call Attack.attack sending 1 ether. You will immediately be able to + withdraw your ether. + +What happened? +Attack caused the TimeLock.lockTime to overflow and was able to withdraw +before the 1 week waiting period. */ contract TimeLock { @@ -394,14 +396,14 @@ contract TimeLock { } function withdraw() public { - require(balances[msg.sender] > 0, "Unzureichendes Guthaben"); - require(block.timestamp > lockTime[msg.sender], "Sperrzeit nicht abgelaufen"); + require(balances[msg.sender] > 0, "Insufficient funds"); + require(block.timestamp > lockTime[msg.sender], "Lock time not expired"); uint amount = balances[msg.sender]; balances[msg.sender] = 0; (bool sent, ) = msg.sender.call{value: amount}(""); - require(sent, "Senden von Ether fehlgeschlagen"); + require(sent, "Failed to send Ether"); } } @@ -417,11 +419,11 @@ contract Attack { function attack() public payable { timeLock.deposit{value: msg.value}(); /* - wenn t = aktuelle Sperrzeit, dann müssen wir x so finden, dass + if t = current lock time then we need to find x such that x + t = 2**256 = 0 - also x = -t + so x = -t 2**256 = type(uint).max + 1 - also x = type(uint).max + 1 - t + so x = type(uint).max + 1 - t */ timeLock.increaseLockTime( type(uint).max + 1 - timeLock.lockTime(address(this)) @@ -431,144 +433,144 @@ contract Attack { } ``` -##### Wie man Integer-Unterläufe und -Überläufe verhindert +##### Wie man Integer-Underflows und -Overflows verhindert -Ab Version 0.8.0 weist der Solidity-Compiler Code zurück, der zu Integer-Unterläufen und -Überläufen führt. Verträge, die mit einer niedrigeren Compiler-Version kompiliert wurden, sollten jedoch entweder Prüfungen für Funktionen durchführen, die arithmetische Operationen beinhalten, oder eine Bibliothek (z. B. [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) verwenden, die auf Unter-/Überlauf prüft. +Ab Version 0.8.0 lehnt der Solidity-Compiler Code ab, der zu Integer-Underflows und -Overflows führt. Verträge, die mit einer niedrigeren Compiler-Version kompiliert wurden, sollten jedoch entweder Überprüfungen bei Funktionen durchführen, die arithmetische Operationen beinhalten, oder eine Bibliothek (z. B. [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) verwenden, die auf Underflow/Overflow prüft. #### Orakel-Manipulation {#oracle-manipulation} -[Orakel](/developers/docs/oracles/) beziehen Off-Chain-Informationen und senden sie On-Chain, damit Smart Contracts sie verwenden können. Mit Oracles können Sie Smart Contracts entwickeln, die mit Off-Chain-Systemen wie Kapitalmärkten zusammenarbeiten und dadurch ihre Anwendungsmöglichkeiten stark erweitern. +[Orakel](/developers/docs/oracles/) beziehen Off-Chain-Informationen und senden sie auf die Blockchain, damit Smart Contracts sie nutzen können. Mit Orakeln können Sie Smart Contracts entwerfen, die mit Off-Chain-Systemen wie Kapitalmärkten interagieren, was ihre Anwendungsmöglichkeiten erheblich erweitert. -Aber wenn das Oracle manipuliert wird und falsche Daten auf die Blockchain sendet, werden Smart Contracts basierend auf falschen Eingaben ausgeführt, was Probleme verursachen kann. Dies ist die Grundlage des „Orakelproblems“, bei dem es darum geht sicherzustellen, dass die Informationen aus einem Blockchain-Orakel korrekt, aktuell und zeitnah sind. +Wenn das Orakel jedoch korrumpiert ist und falsche Informationen auf die Blockchain sendet, werden Smart Contracts basierend auf fehlerhaften Eingaben ausgeführt, was Probleme verursachen kann. Dies ist die Grundlage des „Orakel-Problems“, das sich mit der Aufgabe befasst, sicherzustellen, dass Informationen von einem Blockchain-Orakel genau, aktuell und rechtzeitig sind. -Ein ähnliches Sicherheitsproblem ist die Nutzung eines On-Chain-Oracles, wie zum Beispiel einer dezentralen Börse, um den aktuellen Preis eines Assets zu ermitteln. Kreditplattformen in der Branche der [dezentralen Finanzen (DeFi)](/defi/) tun dies oft, um den Wert der Sicherheiten eines Nutzers zu bestimmen und festzulegen, wie viel er sich leihen kann. +Ein damit verbundenes Sicherheitsproblem ist die Verwendung eines Orakels auf der Blockchain, wie z. B. einer dezentralisierten Börse, um den Spotpreis für einen Vermögenswert zu erhalten. Kreditplattformen in der Branche der [dezentralisierten Finanzen (DeFi)](/defi/) tun dies häufig, um den Wert der Sicherheiten eines Benutzers zu bestimmen und festzulegen, wie viel er leihen kann. -Die DEX-Preise sind häufig korrekt, was vor allem darauf zurückzuführen ist, dass Arbitrageure die Gleichheit auf den Märkten wiederherstellen. Die sind aber anfällig für Manipulationen, besonders wenn das On-Chain-Oracle die Assetpreise anhand von historischen Handelsmustern berechnet (was meistens der Fall ist). +DEX-Preise sind oft genau, was größtenteils Arbitrageuren zu verdanken ist, die die Parität auf den Märkten wiederherstellen. Sie sind jedoch anfällig für Manipulationen, insbesondere wenn das Orakel auf der Blockchain die Vermögenspreise basierend auf historischen Handelsmustern berechnet (wie es normalerweise der Fall ist). -So könnte ein Angreifer beispielsweise den Spotpreis eines Assets künstlich in die Höhe treiben, indem er einen Blitzkredit aufnimmt, kurz bevor er mit Ihrem Kreditvertrag interagiert. Die Abfrage der DEX nach dem Preis des Assets würde einen höheren als den normalen Wert ergeben (da die große „Kaufbestellung“ des Angreifers die Nachfrage nach dem Asset verzerrt), so dass er mehr Geld leihen kann, als er sollte. Solche „Flash-Darlehensangriffe“ wurden genutzt, um das Vertrauen in Preis-Orakel bei DeFi-Anwendungen auszunutzen, was Protokolle Millionen an verlorenen Guthaben gekostet hat. +Beispielsweise könnte ein Angreifer den Spotpreis eines Vermögenswerts künstlich in die Höhe treiben, indem er einen Flash-Loan aufnimmt, kurz bevor er mit Ihrem Kreditvertrag interagiert. Die Abfrage des Vermögenspreises bei der DEX würde einen überdurchschnittlich hohen Wert zurückgeben (da die große „Kauforder“ des Angreifers die Nachfrage nach dem Vermögenswert verzerrt), was es ihm ermöglicht, mehr zu leihen, als er sollte. Solche „Flash-Loan-Angriffe“ wurden genutzt, um die Abhängigkeit von Preis-Orakeln bei DeFi-Anwendungen auszunutzen, was Protokolle Millionen an verlorenen Geldern kostete. -##### So verhindert man Orakelmanipulation +##### Wie man Orakel-Manipulation verhindert -Die Mindestanforderung zur [Vermeidung von Orakel-Manipulation](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) ist die Verwendung eines dezentralen Orakel-Netzwerks, das Informationen aus mehreren Quellen abfragt, um Single Points of Failure zu vermeiden. In den meisten Fällen verfügen dezentrale Orakel über eingebaute kryptoökonomische Anreize, die die Nodes des Orakels dazu bringen, korrekte Informationen zu melden, was sie sicherer macht als zentralisierte Orakel. +Die Mindestanforderung zur [Vermeidung von Orakel-Manipulation](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) ist die Verwendung eines dezentralisierten Orakel-Netzwerks, das Informationen aus mehreren Quellen abfragt, um Single Points of Failure zu vermeiden. In den meisten Fällen verfügen dezentralisierte Orakel über integrierte kryptoökonomische Anreize, um Orakel-Knoten zu ermutigen, korrekte Informationen zu melden, was sie sicherer macht als zentralisierte Orakel. -Wenn Sie vorhaben, ein On-Chain-Oracle nach Assetpreisen zu befragen, sollten Sie eines in Erwägung ziehen, das einen zeitgewichteten Durchschnittspreis (TWAP) verwendet. Ein [TWAP-Orakel](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) fragt den Preis eines Vermögenswerts zu zwei verschiedenen Zeitpunkten ab (die Sie ändern können) und berechnet den Kassakurs auf der Grundlage des erhaltenen Durchschnitts. Die Wahl längerer Zeiträume schützt Ihr Protokoll vor Preismanipulationen, da große Aufträge, die erst kürzlich ausgeführt wurden, keinen Einfluss auf die Preise der Assets haben können. +Wenn Sie planen, ein Orakel auf der Blockchain nach Vermögenspreisen abzufragen, sollten Sie die Verwendung eines Orakels in Betracht ziehen, das einen zeitgewichteten Durchschnittspreis-Mechanismus (TWAP) implementiert. Ein [TWAP-Orakel](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) fragt den Preis eines Vermögenswerts zu zwei verschiedenen Zeitpunkten ab (die Sie ändern können) und berechnet den Spotpreis basierend auf dem ermittelten Durchschnitt. Die Wahl längerer Zeiträume schützt Ihr Protokoll vor Preismanipulationen, da große, kürzlich ausgeführte Aufträge die Vermögenspreise nicht beeinflussen können. -## Ressourcen zur Smart-Contract-Sicherheit für Entwickler {#smart-contract-security-resources-for-developers} +## Sicherheitsressourcen für Smart Contracts für Entwickler {#smart-contract-security-resources-for-developers} ### Tools zur Analyse von Smart Contracts und zur Überprüfung der Code-Korrektheit {#code-analysis-tools} -- **[Test-Tools und -Bibliotheken](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** – _Sammlung von branchenüblichen Tools und Bibliotheken zur Durchführung von Unit-Tests, statischer Analyse und dynamischer Analyse von Smart Contracts._ +- **[Test-Tools und Bibliotheken](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** - _Sammlung von branchenüblichen Tools und Bibliotheken zur Durchführung von Unit-Tests, statischer Analyse und dynamischer Analyse von Smart Contracts._ -- **[Tools zur formalen Verifizierung](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** – _Tools zur Überprüfung der funktionalen Korrektheit in Smart Contracts und zur Prüfung von Invarianten._ +- **[Tools zur formalen Verifizierung](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** - _Tools zur Überprüfung der funktionalen Korrektheit in Smart Contracts und zur Prüfung von Invarianten._ -- **[Smart-Contract-Auditing-Dienste](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** – _Liste von Organisationen, die Smart-Contract-Auditing-Dienste für Ethereum-Entwicklungsprojekte anbieten._ +- **[Audit-Dienste für Smart Contracts](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** - _Liste von Organisationen, die Audit-Dienste für Smart Contracts für Ethereum-Entwicklungsprojekte anbieten._ -- **[Bug-Bounty-Plattformen](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** – _Plattformen zur Koordinierung von Bug-Bounties und zur Belohnung der verantwortungsvollen Offenlegung kritischer Schwachstellen in Smart Contracts._ +- **[Bug-Bounty-Plattformen](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _Plattformen zur Koordinierung von Bug-Bounties und zur Belohnung der verantwortungsvollen Offenlegung kritischer Schwachstellen in Smart Contracts._ -- **[Fork Checker](https://forkchecker.hashex.org/)** – _Ein kostenloses Online-Tool zur Überprüfung aller verfügbaren Informationen zu einem geforkten Vertrag._ +- **[Fork Checker](https://forkchecker.hashex.org/)** - _Ein kostenloses Online-Tool zur Überprüfung aller verfügbaren Informationen bezüglich eines geforkten Vertrags._ -- **[ABI Encoder](https://abi.hashex.org/)** – _Ein kostenloser Online-Dienst zur Kodierung Ihrer Solidity-Vertragsfunktionen und Konstruktorargumente._ +- **[ABI Encoder](https://abi.hashex.org/)** - _Ein kostenloser Online-Dienst zur Codierung Ihrer Solidity-Vertragsfunktionen und Konstruktorargumente._ -- **[Aderyn](https://github.com/Cyfrin/aderyn)** – _Statischer Analysator für Solidity, der die abstrakten Syntaxbäume (AST) durchläuft, um vermutete Schwachstellen zu identifizieren und Probleme in einem leicht verständlichen Markdown-Format auszugeben._ +- **[Aderyn](https://github.com/Cyfrin/aderyn)** - _Statischer Analysator für Solidity, der die abstrakten Syntaxbäume (AST) durchläuft, um vermutete Schwachstellen zu lokalisieren und Probleme in einem leicht verständlichen Markdown-Format auszugeben._ ### Tools zur Überwachung von Smart Contracts {#smart-contract-monitoring-tools} -- **[Tenderly Real-Time Alerting](https://tenderly.co/monitoring)** – _Ein Tool, um Echtzeit-Benachrichtigungen zu erhalten, wenn ungewöhnliche oder unerwartete Ereignisse auf Ihren Smart Contracts oder Wallets auftreten._ +- **[Tenderly Real-Time Alerting](https://tenderly.co/monitoring)** - _Ein Tool, um Echtzeit-Benachrichtigungen zu erhalten, wenn ungewöhnliche oder unerwartete Ereignisse bei Ihren Smart Contracts oder Wallets auftreten._ -### Tools für die sichere Verwaltung von Smart Contracts {#smart-contract-administration-tools} +### Tools zur sicheren Verwaltung von Smart Contracts {#smart-contract-administration-tools} -- **[Safe](https://safe.global/)** – _Eine auf Ethereum laufende Smart-Contract-Wallet, die eine Mindestanzahl von Personen zur Genehmigung einer Transaktion erfordert, bevor sie stattfinden kann (M-aus-N)._ +- **[Safe](https://safe.global/)** - _Ein auf Ethereum laufendes Smart Contract Wallet, das eine Mindestanzahl von Personen erfordert, um eine Transaktion zu genehmigen, bevor sie stattfinden kann (M-von-N)._ -- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** – _Vertragsbibliotheken zur Implementierung von Verwaltungsfunktionen, einschließlich Vertragseigentum, Upgrades, Zugriffskontrollen, Governance, Anhaltbarkeit und mehr._ +- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** - _Vertragsbibliotheken zur Implementierung administrativer Funktionen, einschließlich Vertragsbesitz, Upgrades, Zugriffskontrollen, Governance, Pausierbarkeit und mehr._ -### Smart-Contract-Auditing-Dienste {#smart-contract-auditing-services} +### Audit-Dienste für Smart Contracts {#smart-contract-auditing-services} -- **[ConsenSys Diligence](https://diligence.consensys.io/)** – _Ein Smart-Contract-Auditing-Dienst, der Projekte im gesamten Blockchain-Ökosystem dabei unterstützt sicherzustellen, dass ihre Protokolle startklar und zum Schutz der Nutzer ausgelegt sind._ +- **[ConsenSys Diligence](https://diligence.consensys.io/)** - _Audit-Dienst für Smart Contracts, der Projekten im gesamten Blockchain-Ökosystem hilft, sicherzustellen, dass ihre Protokolle startklar sind und zum Schutz der Benutzer entwickelt wurden._ -- **[CertiK](https://www.certik.com/)** – _Ein Blockchain-Sicherheitsunternehmen, das Pionierarbeit bei der Anwendung modernster formaler Verifizierungstechnologie auf Smart Contracts und Blockchain-Netzwerke leistet._ +- **[CertiK](https://www.certik.com/)** - _Blockchain-Sicherheitsunternehmen, das Pionierarbeit beim Einsatz modernster formaler Verifizierungstechnologie für Smart Contracts und Blockchain-Netzwerke leistet._ -- **[Trail of Bits](https://www.trailofbits.com/)** – _Ein Cybersicherheitsunternehmen, das Sicherheitsforschung mit einer Angreifermentalität kombiniert, um Risiken zu reduzieren und Code zu stärken._ +- **[Trail of Bits](https://www.trailofbits.com/)** - _Cybersicherheitsunternehmen, das Sicherheitsforschung mit einer Angreifermentalität kombiniert, um Risiken zu reduzieren und Code zu stärken._ -- **[PeckShield](https://peckshield.com/)** – _Ein Blockchain-Sicherheitsunternehmen, das Produkte und Dienstleistungen für die Sicherheit, den Datenschutz und die Benutzerfreundlichkeit des gesamten Blockchain-Ökosystems anbietet._ +- **[PeckShield](https://peckshield.com/)** - _Blockchain-Sicherheitsunternehmen, das Produkte und Dienstleistungen für die Sicherheit, den Datenschutz und die Benutzerfreundlichkeit des gesamten Blockchain-Ökosystems anbietet._ -- **[QuantStamp](https://quantstamp.com/)** – _Ein Auditing-Dienst, der die allgemeine Einführung der Blockchain-Technologie durch Sicherheits- und Risikobewertungsdienste erleichtert._ +- **[QuantStamp](https://quantstamp.com/)** - _Audit-Dienst, der die breite Akzeptanz der Blockchain-Technologie durch Sicherheits- und Risikobewertungsdienste erleichtert._ -- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** – _Ein auf Smart-Contract-Sicherheit spezialisiertes Unternehmen, das Sicherheitsaudits für verteilte Systeme anbietet._ +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _Sicherheitsunternehmen für Smart Contracts, das Sicherheitsaudits für verteilte Systeme anbietet._ -- **[Runtime Verification](https://runtimeverification.com/)** – _Ein Sicherheitsunternehmen, das sich auf die formale Modellierung und Verifizierung von Smart Contracts spezialisiert hat._ +- **[Runtime Verification](https://runtimeverification.com/)** - _Sicherheitsunternehmen, das sich auf die formale Modellierung und Verifizierung von Smart Contracts spezialisiert hat._ -- **[Hacken](https://hacken.io)** – _Ein Web3-Cybersicherheits-Auditor, der einen 360-Grad-Ansatz für die Blockchain-Sicherheit verfolgt._ +- **[Hacken](https://hacken.io)** - _Web3-Cybersicherheitsauditor, der einen 360-Grad-Ansatz für die Blockchain-Sicherheit bietet._ -- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** – _Solidity- und Cairo-Auditing-Dienste, die die Integrität von Smart Contracts und die Sicherheit der Nutzer auf Ethereum und Starknet gewährleisten._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Audit-Dienste für Solidity und Cairo, die die Integrität von Smart Contracts und die Sicherheit der Benutzer in Ethereum und Starknet gewährleisten._ -- **[HashEx](https://hashex.org/)** – _HashEx konzentriert sich auf die Prüfung von Blockchains und Smart Contracts, um die Sicherheit von Kryptowährungen zu gewährleisten, und bietet Dienstleistungen wie die Entwicklung von Smart Contracts, Penetrationstests und Blockchain-Beratung an._ +- **[HashEx](https://hashex.org/)** - _HashEx konzentriert sich auf das Auditing von Blockchains und Smart Contracts, um die Sicherheit von Kryptowährungen zu gewährleisten, und bietet Dienstleistungen wie die Entwicklung von Smart Contracts, Penetrationstests und Blockchain-Beratung an._ -- **[Code4rena](https://code4rena.com/)** – _Eine wettbewerbsorientierte Audit-Plattform, die Anreize für Experten im Bereich Smart-Contract-Sicherheit schafft, Schwachstellen zu finden und dabei zu helfen, Web3 sicherer zu machen._ +- **[Code4rena](https://code4rena.com/)** - _Wettbewerbsorientierte Audit-Plattform, die Sicherheitsexperten für Smart Contracts dazu anregt, Schwachstellen zu finden und dazu beizutragen, Web3 sicherer zu machen._ -- **[CodeHawks](https://codehawks.com/)** – _Eine Plattform für wettbewerbsorientierte Audits, die Wettbewerbe zum Auditing von Smart Contracts für Sicherheitsforscher veranstaltet._ +- **[CodeHawks](https://codehawks.com/)** - _Wettbewerbsorientierte Audit-Plattform, die Audit-Wettbewerbe für Smart Contracts für Sicherheitsforscher veranstaltet._ -- **[Cyfrin](https://cyfrin.io)** – _Ein Kraftpaket für Web3-Sicherheit, das Krypto-Sicherheit durch Produkte und Smart-Contract-Auditing-Dienste fördert._ +- **[Cyfrin](https://cyfrin.io)** - _Web3-Sicherheitsunternehmen, das Krypto-Sicherheit durch Produkte und Audit-Dienste für Smart Contracts fördert._ -- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** – _Ein Web3-Sicherheitsunternehmen, das Sicherheitsaudits für Blockchain-Systeme durch ein Team erfahrener Prüfer und erstklassiger Tools anbietet._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Web3-Sicherheitsfirma, die Sicherheitsaudits für Blockchain-Systeme durch ein Team erfahrener Auditoren und erstklassiger Tools anbietet._ -- **[Oxorio](https://oxor.io/)** – _Smart-Contract-Audits und Blockchain-Sicherheitsdienste mit Expertise in EVM, Solidity, ZK, Cross-Chain-Technologie für Krypto-Unternehmen und DeFi-Projekte._ +- **[Oxorio](https://oxor.io/)** - _Audits für Smart Contracts und Blockchain-Sicherheitsdienste mit Expertise in EVM, Solidity, ZK und Cross-Chain-Technologie für Krypto-Firmen und DeFi-Projekte._ -- **[Inference](https://inference.ag/)** – _Sicherheits-Audit-Unternehmen, spezialisiert auf Smart-Contract-Audits für EVM-basierte Blockchains. Dank der fachkundigen Prüfer werden potenzielle Probleme identifiziert und umsetzbare Lösungen vorgeschlagen, um diese Probleme vor der Bereitstellung zu beheben._ +- **[Inference](https://inference.ag/)** - _Sicherheits-Audit-Unternehmen, das sich auf das Auditing von Smart Contracts für EVM-basierte Blockchains spezialisiert hat. Dank seiner erfahrenen Auditoren identifizieren sie potenzielle Probleme und schlagen umsetzbare Lösungen vor, um diese vor der Bereitstellung zu beheben._ ### Bug-Bounty-Plattformen {#bug-bounty-platforms} -- **[Immunefi](https://immunefi.com/)** – _Eine Bug-Bounty-Plattform für Smart Contracts und DeFi-Projekte, auf der Sicherheitsforscher Code überprüfen, Schwachstellen aufdecken, bezahlt werden und Krypto sicherer machen._ +- **[Immunefi](https://immunefi.com/)** - _Bug-Bounty-Plattform für Smart Contracts und DeFi-Projekte, auf der Sicherheitsforscher Code überprüfen, Schwachstellen offenlegen, bezahlt werden und Krypto sicherer machen._ -- **[HackerOne](https://www.hackerone.com/)** – _Eine Plattform zur Koordination von Schwachstellen und Bug-Bounties, die Unternehmen mit Penetrationstestern und Cybersicherheitsforschern verbindet._ +- **[HackerOne](https://www.hackerone.com/)** - _Plattform für Schwachstellenkoordination und Bug-Bounties, die Unternehmen mit Penetrationstestern und Cybersicherheitsforschern verbindet._ -- **[HackenProof](https://hackenproof.com/)** – _Eine Experten-Bug-Bounty-Plattform für Krypto-Projekte (DeFi, Smart Contracts, Wallets, CEX und mehr), auf der Sicherheitsprofis Triage-Dienste anbieten und Forscher für relevante, verifizierte Fehlerberichte bezahlt werden._ +- **[HackenProof](https://hackenproof.com/)** - _Experten-Bug-Bounty-Plattform für Krypto-Projekte (DeFi, Smart Contracts, Wallets, CEX und mehr), auf der Sicherheitsexperten Triage-Dienste anbieten und Forscher für relevante, verifizierte Fehlerberichte bezahlt werden._ -- **[Sherlock](https://www.sherlock.xyz/)** – _Ein Underwriter in Web3 für die Sicherheit von Smart Contracts, bei dem Auszahlungen an Auditoren über Smart Contracts verwaltet werden, um sicherzustellen, dass relevante Fehler fair bezahlt werden._ +- **[Sherlock](https://www.sherlock.xyz/)** - _Underwriter im Web3 für die Sicherheit von Smart Contracts, mit Auszahlungen für Auditoren, die über Smart Contracts verwaltet werden, um sicherzustellen, dass relevante Fehler fair bezahlt werden._ -- **[CodeHawks](https://www.codehawks.com/)** – _Eine wettbewerbsorientierte Bug-Bounty-Plattform, auf der Auditoren an Sicherheitswettbewerben und -herausforderungen sowie (bald) an ihren eigenen privaten Audits teilnehmen._ +- **[CodeHawks](https://www.codehawks.com/)** - _Wettbewerbsorientierte Bug-Bounty-Plattform, auf der Auditoren an Sicherheitswettbewerben und Herausforderungen sowie (bald) an ihren eigenen privaten Audits teilnehmen._ -### Veröffentlichungen bekannter Schwachstellen und Exploits von Smart Contracts {#common-smart-contract-vulnerabilities-and-exploits} +### Publikationen bekannter Schwachstellen und Exploits in Smart Contracts {#common-smart-contract-vulnerabilities-and-exploits} -- **[ConsenSys: Bekannte Angriffe auf Smart Contracts](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** – _Eine anfängerfreundliche Erklärung der wichtigsten Vertragsschwachstellen, mit Beispielcode für die meisten Fälle._ +- **[ConsenSys: Smart Contract Known Attacks](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** - _Anfängerfreundliche Erklärung der wichtigsten Vertragsschwachstellen, mit Beispielcode für die meisten Fälle._ -- **[SWC Registry](https://swcregistry.io/)** – _Eine kuratierte Liste von Common Weakness Enumeration (CWE)-Einträgen, die für Ethereum Smart Contracts gelten._ +- **[SWC Registry](https://swcregistry.io/)** - _Kuratierte Liste von Common Weakness Enumeration (CWE)-Einträgen, die für Ethereum Smart Contracts gelten._ -- **[Rekt](https://rekt.news/)** – _Eine regelmäßig aktualisierte Veröffentlichung von hochkarätigen Krypto-Hacks und -Exploits, zusammen mit detaillierten Post-Mortem-Berichten._ +- **[Rekt](https://rekt.news/)** - _Regelmäßig aktualisierte Publikation von hochkarätigen Krypto-Hacks und Exploits, zusammen mit detaillierten Post-Mortem-Berichten._ -### Herausforderungen zum Erlernen der Smart-Contract-Sicherheit {#challenges-for-learning-smart-contract-security} +### Herausforderungen zum Erlernen der Sicherheit von Smart Contracts {#challenges-for-learning-smart-contract-security} -- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** – _Eine kuratierte Liste von Blockchain-Sicherheits-Wargames, Herausforderungen und [Capture-The-Flag](https://www.webopedia.com/definitions/ctf-event/amp/)-Wettbewerben sowie Lösungsbeschreibungen._ +- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _Kuratierte Liste von Blockchain-Sicherheits-Wargames, Herausforderungen und [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/)-Wettbewerben sowie Lösungsberichten._ -- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** – _Ein Wargame, um die offensive Sicherheit von DeFi-Smart-Contracts zu erlernen und Fähigkeiten in der Fehlersuche und im Sicherheitsaudit aufzubauen._ +- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _Wargame zum Erlernen der offensiven Sicherheit von DeFi Smart Contracts und zum Aufbau von Fähigkeiten in der Fehlersuche und im Sicherheits-Auditing._ -- **[Ethernaut](https://ethernaut.openzeppelin.com/)** – _Ein Web3-/Solidity-basiertes Wargame, bei dem jedes Level ein Smart Contract ist, der „gehackt“ werden muss._ +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _Web3/Solidity-basiertes Wargame, bei dem jedes Level ein Smart Contract ist, der „gehackt“ werden muss._ -- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** – _Eine Smart-Contract-Hacking-Herausforderung in einem Fantasy-Abenteuer. Der erfolgreiche Abschluss der Herausforderung bietet außerdem Zugang zu einem privaten Bug-Bounty-Programm._ +- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** - _Hacking-Herausforderung für Smart Contracts, angesiedelt in einem Fantasy-Abenteuer. Der erfolgreiche Abschluss der Herausforderung gewährt auch Zugang zu einem privaten Bug-Bounty-Programm._ -### Bewährte Praktiken zur Sicherung von Smart Contracts {#smart-contract-security-best-practices} +### Best Practices zur Sicherung von Smart Contracts {#smart-contract-security-best-practices} -- **[ConsenSys: Bewährte Praktiken für die Sicherheit von Ethereum Smart Contracts](https://consensys.github.io/smart-contract-best-practices/)** – _Eine umfassende Liste von Richtlinien zur Sicherung von Ethereum Smart Contracts._ +- **[ConsenSys: Ethereum Smart Contract Security Best Practices](https://consensys.github.io/smart-contract-best-practices/)** - _Umfassende Liste von Richtlinien zur Sicherung von Ethereum Smart Contracts._ -- **[Nascent: Simple Security Toolkit](https://github.com/nascentxyz/simple-security-toolkit)** – _Eine Sammlung praktischer, sicherheitsorientierter Anleitungen und Checklisten für die Entwicklung von Smart Contracts._ +- **[Nascent: Simple Security Toolkit](https://github.com/nascentxyz/simple-security-toolkit)** - _Sammlung praktischer, sicherheitsorientierter Leitfäden und Checklisten für die Entwicklung von Smart Contracts._ -- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** – _Eine nützliche Zusammenstellung von sicheren Mustern und bewährten Praktiken für die Smart-Contract-Programmiersprache Solidity._ +- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** - _Nützliche Zusammenstellung sicherer Muster und Best Practices für die Smart-Contract-Programmiersprache Solidity._ -- **[Solidity-Dokumentation: Sicherheitsüberlegungen](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** – _Richtlinien zum Schreiben sicherer Smart Contracts mit Solidity._ +- **[Solidity Docs: Security Considerations](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _Richtlinien zum Schreiben sicherer Smart Contracts mit Solidity._ -- **[Smart Contract Security Verification Standard](https://github.com/securing/SCSVS)** – _Eine vierzehnteilige Checkliste, die erstellt wurde, um die Sicherheit von Smart Contracts für Entwickler, Architekten, Sicherheitsprüfer und Anbieter zu standardisieren._ +- **[Smart Contract Security Verification Standard](https://github.com/securing/SCSVS)** - _Vierzehnteilige Checkliste, die erstellt wurde, um die Sicherheit von Smart Contracts für Entwickler, Architekten, Sicherheitsprüfer und Anbieter zu standardisieren._ -- **[Smart-Contract-Sicherheit und Auditing lernen](https://updraft.cyfrin.io/courses/security)** – _Der ultimative Kurs zu Smart-Contract-Sicherheit und Auditing, entwickelt für Smart-Contract-Entwickler, die ihre Security-Best-Practices verbessern und Sicherheitsforscher werden möchten._ +- **[Learn Smart Contract Security and Auditing](https://updraft.cyfrin.io/courses/security)** - _Ultimativer Kurs für Sicherheit und Auditing von Smart Contracts, erstellt für Smart-Contract-Entwickler, die ihre Sicherheits-Best-Practices verbessern und Sicherheitsforscher werden möchten._ ### Tutorials zur Sicherheit von Smart Contracts {#tutorials-on-smart-contract-security} - [Wie man sichere Smart Contracts schreibt](/developers/tutorials/secure-development-workflow/) -- [Wie man Slither verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [Wie man Slither verwendet, um Fehler in Smart Contracts zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) -- [Wie man Manticore verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [Wie man Manticore verwendet, um Fehler in Smart Contracts zu finden](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) -- [Richtlinien zur Sicherheit von Smart Contracts](/developers/tutorials/smart-contract-security-guidelines/) +- [Sicherheitsrichtlinien für Smart Contracts](/developers/tutorials/smart-contract-security-guidelines/) - [Wie Sie Ihren Token-Vertrag sicher mit beliebigen Token integrieren](/developers/tutorials/token-integration-checklist/) -- [Cyfrin Updraft – vollständiger Kurs zu Sicherheit und Auditing von Smart Contracts](https://updraft.cyfrin.io/courses/security) +- [Cyfrin Updraft - Vollständiger Kurs zu Sicherheit und Auditing von Smart Contracts](https://updraft.cyfrin.io/courses/security) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md index bafd2c0b896..a05a0a490cd 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md @@ -1,60 +1,60 @@ --- -title: Smart Contracts testen -description: "Ein Überblick über Techniken und Überlegungen zum Testen von Ethereum Smart Contracts." +title: Testen von Smart Contracts +description: "Ein Überblick über Techniken und Überlegungen zum Testen von Ethereum-Smart-Contracts." lang: de --- -Öffentliche Blockchains wie Ethereum sind unveränderlich, was es schwierig macht, den Code von Smart Contracts nach der Veröffentlichung zu verändern. [Upgrade-Muster für Verträge](/developers/docs/smart-contracts/upgrading/) zur Durchführung von „virtuellen Upgrades“ existieren, aber deren Implementierung ist schwierig und erfordert sozialen Konsens. Zudem kann ein Upgrade einen Fehler nur beheben, _nachdem_ er entdeckt wurde – wenn ein Angreifer die Schwachstelle zuerst entdeckt, besteht für Ihren Smart Contract das Risiko eines Exploits. +Öffentliche Blockchains wie Ethereum sind unveränderlich, was es schwierig macht, den Code eines Smart Contracts nach der Bereitstellung zu ändern. Es gibt [Muster für Vertragsaktualisierungen](/developers/docs/smart-contracts/upgrading/) zur Durchführung „virtueller Upgrades“, aber diese sind schwer zu implementieren und erfordern sozialen Konsens. Darüber hinaus kann ein Upgrade einen Fehler nur beheben, _nachdem_ er entdeckt wurde – wenn ein Angreifer die Schwachstelle zuerst entdeckt, ist Ihr Smart Contract dem Risiko eines Exploits ausgesetzt. -Aus diesen Gründen ist das Testen von Smart Contracts vor dem [Bereitstellen](/developers/docs/smart-contracts/deploying/) auf dem Mainnet eine Mindestanforderung für die [Sicherheit](/developers/docs/smart-contracts/security/). Es gibt viele Techniken zum Testen von Verträgen und zur Bewertung der Korrektheit des Codes. Für welche davon Sie sich entscheiden, hängt von Ihren Anforderungen ab. Nichtsdestotrotz ist eine Test-Suite, die sich aus verschiedenen Werkzeugen und Ansätzen zusammensetzt, ideal für das Aufspüren sowohl kleinerer als auch größerer Sicherheitslücken im Vertragscode. +Aus diesen Gründen ist das Testen von Smart Contracts vor der [Bereitstellung](/developers/docs/smart-contracts/deploying/) im Mainnet eine Mindestanforderung für die [Sicherheit](/developers/docs/smart-contracts/security/). Es gibt viele Techniken zum Testen von Verträgen und zur Bewertung der Code-Korrektheit; welche Sie wählen, hängt von Ihren Anforderungen ab. Dennoch ist eine Test-Suite, die aus verschiedenen Tools und Ansätzen besteht, ideal, um sowohl kleinere als auch größere Sicherheitslücken im Vertragscode zu finden. ## Voraussetzungen {#prerequisites} -Auf dieser Seite wird erklärt, wie Smart Contracts vor ihrer Veröffentlichung im Ethereum-Netzwerk getestet werden können. Dabei wird davon ausgegangen, dass Sie mit [Smart Contracts](/developers/docs/smart-contracts/) vertraut sind. +Diese Seite erklärt, wie man Smart Contracts testet, bevor man sie im Ethereum-Netzwerk bereitstellt. Es wird vorausgesetzt, dass Sie mit [Smart Contracts](/developers/docs/smart-contracts/) vertraut sind. -## Was sind Smart-Contract-Tests? {#what-is-smart-contract-testing} +## Was ist das Testen von Smart Contracts? {#what-is-smart-contract-testing} -Beim Testen von Smart Contracts wird überprüft, ob der Code eines Smart Contracts wie erwartet funktioniert. Die Tests sind nützlich, um zu prüfen, ob ein bestimmter Smart Contract die Anforderungen an Zuverlässigkeit, Benutzerfreundlichkeit und Sicherheit erfüllt. +Das Testen von Smart Contracts ist der Prozess der Überprüfung, ob der Code eines Smart Contracts wie erwartet funktioniert. Tests sind nützlich, um zu überprüfen, ob ein bestimmter Smart Contract die Anforderungen an Zuverlässigkeit, Benutzerfreundlichkeit und Sicherheit erfüllt. -Es gibt verschiedene Vorgehensweisen. Für die meisten Testmethoden ist es jedoch erforderlich, einen Smart Contract mit einer kleinen Stichprobe der Daten, die er voraussichtlich verarbeiten soll, auszuführen. Wenn der Vertrag korrekte Ergebnisse für die Beispieldaten liefert, wird davon ausgegangen, dass er ordnungsgemäß funktioniert. Die meisten Testwerkzeuge bieten Ressourcen zum Schreiben und Ausführen von [Testfällen](https://en.m.wikipedia.org/wiki/Test_case), um zu prüfen, ob die Ausführung eines Vertrags mit den erwarteten Ergebnissen übereinstimmt. +Obwohl die Ansätze variieren, erfordern die meisten Testmethoden die Ausführung eines Smart Contracts mit einer kleinen Stichprobe der Daten, die er verarbeiten soll. Wenn der Vertrag korrekte Ergebnisse für die Beispieldaten liefert, wird davon ausgegangen, dass er ordnungsgemäß funktioniert. Die meisten Test-Tools bieten Ressourcen zum Schreiben und Ausführen von [Testfällen](https://en.m.wikipedia.org/wiki/Test_case), um zu überprüfen, ob die Ausführung eines Vertrags mit den erwarteten Ergebnissen übereinstimmt. ### Warum ist es wichtig, Smart Contracts zu testen? {#importance-of-testing-smart-contracts} -Da Smart Contracts oft hochwertige finanzielle Vermögenswerte verwalten, können bereits kleine Programmierfehler zu [massiven Verlusten für die Benutzer](https://rekt.news/leaderboard/) führen und tun dies auch häufig. Gründliches Testen kann jedoch dazu beitragen, Fehler und Probleme im Code eines Smart Contracts frühzeitig zu entdecken und zu beheben, bevor dieser im Mainnet veröffentlicht wird. +Da Smart Contracts oft hochwertige finanzielle Vermögenswerte verwalten, können kleinere Programmierfehler zu [massiven Verlusten für Benutzer](https://rekt.news/leaderboard/) führen und tun dies auch oft. Rigoroses Testen kann Ihnen jedoch helfen, Fehler und Probleme im Code eines Smart Contracts frühzeitig zu entdecken und zu beheben, bevor er im Mainnet gestartet wird. -Es ist zwar möglich, einen Vertrag zu aktualisieren, wenn ein Bug entdeckt wird, aber Upgrades sind komplex und können bei unsachgemäßer Handhabung zu [Fehlern führen](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Durch die Aktualisierung eines Vertrags wird der Grundsatz der Unveränderlichkeit weiter ausgehebelt. Außerdem ist sie für die Benutzer mit zusätzlichen Vertrauensvorbehalten verbunden. Umgekehrt mindert ein umfassender Plan zum Testen Ihres Vertrags die Sicherheitsrisiken von Smart Contracts und reduziert die Notwendigkeit, nach der Veröffentlichung komplexe Logik-Upgrades durchzuführen. +Während es möglich ist, einen Vertrag zu aktualisieren, wenn ein Fehler entdeckt wird, sind Upgrades komplex und können bei unsachgemäßer Handhabung [zu Fehlern führen](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Die Aktualisierung eines Vertrags negiert zudem das Prinzip der Unveränderlichkeit und belastet die Benutzer mit zusätzlichen Vertrauensannahmen. Umgekehrt mindert ein umfassender Plan zum Testen Ihres Vertrags die Sicherheitsrisiken von Smart Contracts und reduziert die Notwendigkeit, nach der Bereitstellung komplexe Logik-Upgrades durchzuführen. ## Methoden zum Testen von Smart Contracts {#methods-for-testing-smart-contracts} -Methoden zum Testen von Ethereum-Smart-Contracts lassen sich in zwei große Kategorien einteilen: **automatisiertes Testen** und **manuelles Testen**. Automatisierte Tests und manuelle Tests bieten einzigartige Vorteile, es müssen für sie aber auch Kompromisse eingegangen werden. Sie können beide Methoden kombinieren, um einen robusten Plan zur Analyse Ihrer Verträge zu entwerfen. +Methoden zum Testen von Ethereum-Smart-Contracts fallen in zwei breite Kategorien: **automatisiertes Testen** und **manuelles Testen**. Automatisiertes Testen und manuelles Testen bieten einzigartige Vorteile und Kompromisse, aber Sie können beide kombinieren, um einen robusten Plan zur Analyse Ihrer Verträge zu erstellen. ### Automatisiertes Testen {#automated-testing} -Beim automatisierten Testen werden Werkzeuge eingesetzt, die den Code eines Smart Contracts automatisch auf Fehler bei seiner Ausführung überprüfen. Der Vorteil des automatisierten Testens liegt in der Verwendung von [Skripten](https://www.techtarget.com/whatis/definition/script?amp=1), um die Evaluierung der Vertragsfunktionalitäten zu steuern. Skriptgesteuerte Tests können so geplant werden, dass sie mit minimalen menschlichen Eingriffen wiederholt ausgeführt werden. Dies bedeutet, dass automatisierte Tests effizienter sind als manuelle Testverfahren. +Automatisiertes Testen verwendet Tools, die den Code eines Smart Contracts automatisch auf Ausführungsfehler überprüfen. Der Vorteil des automatisierten Testens liegt in der Verwendung von [Skripten](https://www.techtarget.com/whatis/definition/script?amp=1) zur Steuerung der Bewertung von Vertragsfunktionen. Skriptbasierte Tests können so geplant werden, dass sie wiederholt mit minimalem menschlichen Eingreifen ausgeführt werden, was automatisiertes Testen effizienter macht als manuelle Testansätze. -Automatisierte Tests sind vor allem in den folgenden Fällen sinnvoll: bei sich wiederholenden und zeitaufwändigen Tests; wenn sie manuell nur schwer durchführbar sind; bei Anfälligkeit für menschliche Fehler; bei der Bewertung kritischer Vertragsfunktionen. Aber automatisierte Testwerkzeuge können auch Nachteile haben – sie können bestimmte Bugs übersehen und viele [falsch-positive Ergebnisse](https://www.contrastsecurity.com/glossary/false-positive) produzieren. Daher ist es ideal, automatisierte Tests mit manuellen Tests für Smart Contracts zu kombinieren. +Automatisiertes Testen ist besonders nützlich, wenn Tests repetitiv und zeitaufwändig sind, manuell schwer durchzuführen sind, anfällig für menschliche Fehler sind oder die Bewertung kritischer Vertragsfunktionen beinhalten. Aber automatisierte Test-Tools können Nachteile haben – sie übersehen möglicherweise bestimmte Fehler und produzieren viele [falsch positive Ergebnisse](https://www.contrastsecurity.com/glossary/false-positive). Daher ist die Kombination von automatisiertem Testen mit manuellem Testen für Smart Contracts ideal. ### Manuelles Testen {#manual-testing} -Manuelle Tests werden von Menschen durchgeführt, wobei jeder Testfall in Ihrer Test-Suite nacheinander ausgeführt wird, um die Korrektheit eines Smart Contracts zu analysieren. Dies steht im Gegensatz zu automatisierten Tests, bei denen Sie gleichzeitig mehrere isolierte Tests für einen Smart Contract durchführen können und einen Bericht mit allen fehlgeschlagenen und bestandenen Tests erhalten. +Manuelles Testen wird von Menschen unterstützt und beinhaltet die Ausführung jedes Testfalls in Ihrer Test-Suite nacheinander bei der Analyse der Korrektheit eines Smart Contracts. Dies unterscheidet sich vom automatisierten Testen, bei dem Sie gleichzeitig mehrere isolierte Tests für einen Vertrag ausführen und einen Bericht erhalten können, der alle fehlgeschlagenen und bestandenen Tests anzeigt. -Manuelle Tests können von einer einzelnen Person gemäß eines schriftlichen Testplans durchgeführt werden, der verschiedene Testszenarien abdeckt. Im Rahmen manueller Tests können Sie auch mehrere Personen oder Gruppen über einen bestimmten Zeitraum mit einem Smart Contract interagieren lassen. Der Prüfer vergleicht das tatsächliche Verhalten des Smart Contracts mit dem erwarteten Verhalten und kennzeichnet jede Abweichung als Bug. +Manuelles Testen kann von einer einzelnen Person durchgeführt werden, die einem schriftlichen Testplan folgt, der verschiedene Testszenarien abdeckt. Sie könnten auch mehrere Personen oder Gruppen über einen bestimmten Zeitraum im Rahmen des manuellen Testens mit einem Smart Contract interagieren lassen. Tester vergleichen das tatsächliche Verhalten des Vertrags mit dem erwarteten Verhalten und markieren jeden Unterschied als Fehler. -Effektive manuelle Tests erfordern erhebliche Ressourcen („Fähigkeiten“, „Zeit“, „Geld“ und „Aufwand“) und es kann – aufgrund menschlichen Irrtums – passieren, dass bestimmte Fehler bei der Ausführung von Tests übersehen werden. Aber auch manuelle Tests können von Vorteil sein – so kann ein menschlicher Tester (z. B. ein Auditor) mithilfe seiner Intuition Grenzfälle aufdecken, die ein automatisiertes Testwerkzeug übersehen würde. +Effektives manuelles Testen erfordert erhebliche Ressourcen (Fähigkeiten, Zeit, Geld und Aufwand), und es ist möglich – aufgrund menschlicher Fehler –, bestimmte Fehler bei der Ausführung von Tests zu übersehen. Aber manuelles Testen kann auch vorteilhaft sein – zum Beispiel kann ein menschlicher Tester (z. B. ein Prüfer) Intuition nutzen, um Randfälle zu erkennen, die ein automatisiertes Test-Tool übersehen würde. -## Automatisiertes Testen von Smart Contracts {#automated-testing-for-smart-contracts} +## Automatisiertes Testen für Smart Contracts {#automated-testing-for-smart-contracts} -### Unit-Tests {#unit-testing-for-smart-contracts} +### Unit-Testing {#unit-testing-for-smart-contracts} -Beim Unit-Testing werden die Vertragsfunktionen separat bewertet und die korrekte Funktionsweise jeder Komponente überprüft. Gute Unit-Tests sollten einfach und schnell durchführbar sein und eine klare Vorstellung davon vermitteln, was falsch gelaufen ist, wenn Tests fehlschlagen. +Unit-Testing bewertet Vertragsfunktionen separat und überprüft, ob jede Komponente korrekt funktioniert. Gute Unit-Tests sollten einfach sein, schnell ausgeführt werden können und eine klare Vorstellung davon vermitteln, was schiefgelaufen ist, wenn Tests fehlschlagen. -Unit-Tests sind nützlich, um zu prüfen, ob Funktionen die erwarteten Werte zurückgeben und ob der Datenspeicher des Vertrags nach Ausführung der Funktion ordnungsgemäß aktualisiert wird. Darüber hinaus wird durch die Durchführung von Unit-Tests nach Änderungen an der Codebasis eines Vertrags sichergestellt, dass durch das Hinzufügen neuer Logik keine Fehler entstehen. Im Folgenden finden Sie einige Richtlinien für die Durchführung effektiver Unit-Tests: +Unit-Tests sind nützlich, um zu überprüfen, ob Funktionen erwartete Werte zurückgeben und ob der Vertragsspeicher nach der Funktionsausführung ordnungsgemäß aktualisiert wird. Darüber hinaus stellt die Ausführung von Unit-Tests nach Änderungen an der Codebasis eines Vertrags sicher, dass das Hinzufügen neuer Logik keine Fehler einführt. Im Folgenden finden Sie einige Richtlinien für die Ausführung effektiver Unit-Tests: -#### Richtlinien für Unit-Tests von Smart Contracts {#unit-testing-guidelines} +#### Richtlinien für das Unit-Testing von Smart Contracts {#unit-testing-guidelines} -##### 1. Die Geschäftslogik und den Arbeitsablauf Ihrer Smart Contracts verstehen +##### 1. Verstehen Sie die Geschäftslogik und den Workflow Ihres Vertrags -Bevor Sie Unit-Tests schreiben, ist es hilfreich zu wissen, welche Funktionalitäten ein Smart Contract bietet und wie die Benutzer auf diese Funktionen zugreifen und sie nutzen. Dies ist besonders nützlich für die Durchführung von [Happy-Path-Tests](https://en.m.wikipedia.org/wiki/Happy_path), mit denen festgestellt wird, ob Funktionen in einem Vertrag die richtige Ausgabe für gültige Benutzereingaben zurückgeben. Wir erklären dieses Konzept anhand dieses (gekürzten) Beispiels eines [Auktionsvertrags](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) +Bevor Sie Unit-Tests schreiben, ist es hilfreich zu wissen, welche Funktionalitäten ein Smart Contract bietet und wie Benutzer auf diese Funktionen zugreifen und sie nutzen werden. Dies ist besonders nützlich für die Ausführung von [Happy-Path-Tests](https://en.m.wikipedia.org/wiki/Happy_path), die bestimmen, ob Funktionen in einem Vertrag die korrekte Ausgabe für gültige Benutzereingaben zurückgeben. Wir erklären dieses Konzept anhand dieses (gekürzten) Beispiels eines [Auktionsvertrags](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) ```solidity constructor( @@ -108,35 +108,35 @@ function auctionEnd() external { } ``` -Hierbei handelt es sich um einen einfachen Auktionsvertrag, der für die Entgegennahme von Geboten während der Gebotsfrist entworfen wurde. Wenn das `highestBid` steigt, erhält der vorherige Höchstbietende sein Geld zurück. Sobald die Gebotsfrist vorbei ist, ruft der `beneficiary` den Vertrag auf, um sein Geld zu erhalten. +Dies ist ein einfacher Auktionsvertrag, der darauf ausgelegt ist, Gebote während der Bietzeit zu empfangen. Wenn das `highestBid` steigt, erhält der vorherige Höchstbietende sein Geld zurück; sobald die Bietzeit abgelaufen ist, ruft der `beneficiary` den Vertrag auf, um sein Geld zu erhalten. -Unit-Tests für einen Vertrag wie diesen würden verschiedene Funktionen abdecken, die ein Benutzer bei der Interaktion mit dem Vertrag aufrufen könnte. Ein Beispiel wäre ein Unit-Test, der prüft, ob ein Benutzer ein Gebot abgeben kann, während die Auktion läuft (d. h. Aufrufe von `bid()` sind erfolgreich), oder einer, der prüft, ob ein Benutzer ein höheres Gebot als das aktuelle `highestBid` abgeben kann. +Unit-Tests für einen solchen Vertrag würden verschiedene Funktionen abdecken, die ein Benutzer bei der Interaktion mit dem Vertrag aufrufen könnte. Ein Beispiel wäre ein Unit-Test, der überprüft, ob ein Benutzer ein Gebot abgeben kann, während die Auktion läuft (d. h. Aufrufe von `bid()` sind erfolgreich), oder einer, der überprüft, ob ein Benutzer ein höheres Gebot als das aktuelle `highestBid` abgeben kann. -Ein Verständnis des operativen Arbeitsablaufs von Verträgen hilft auch beim Schreiben von Unit-Tests, die prüfen, ob die Ausführung den Anforderungen entspricht. Der Auktionsvertrag legt zum Beispiel fest, dass Benutzer keine Gebote abgeben können, sobald die Auktion beendet ist (d. h. wenn `auctionEndTime` niedriger ist als `block.timestamp`). Ein Entwickler könnte also einen Unit-Test durchführen, der prüft, ob Aufrufe der `bid()`-Funktion erfolgreich sind oder fehlschlagen, wenn die Auktion beendet ist (d. h. wenn `auctionEndTime` > `block.timestamp`). +Das Verständnis des operativen Workflows eines Vertrags hilft auch beim Schreiben von Unit-Tests, die überprüfen, ob die Ausführung den Anforderungen entspricht. Zum Beispiel legt der Auktionsvertrag fest, dass Benutzer keine Gebote abgeben können, wenn die Auktion beendet ist (d. h. wenn `auctionEndTime` niedriger als `block.timestamp` ist). Daher könnte ein Entwickler einen Unit-Test ausführen, der überprüft, ob Aufrufe der Funktion `bid()` erfolgreich sind oder fehlschlagen, wenn die Auktion vorbei ist (d. h. wenn `auctionEndTime` > `block.timestamp`). -##### 2. Alle Annahmen im Zusammenhang mit der Vertragsausführung bewerten +##### 2. Bewerten Sie alle Annahmen im Zusammenhang mit der Vertragsausführung -Es ist wichtig, alle Annahmen über die Ausführung eines Vertrags zu dokumentieren und Unit-Tests zur Überprüfung der Korrektheit dieser Annahmen zu schreiben. Das Testen von Behauptungen bietet nicht nur Schutz vor unerwarteter Ausführung, sondern zwingt Sie auch dazu, über Vorgänge nachzudenken, die das Sicherheitsmodell eines Smart Contracts gefährden könnten. Ein nützlicher Tipp lautet, über „Glückliche-Benutzer-Tests“ hinauszugehen und negative Tests zu schreiben, die prüfen, ob eine Funktion bei falschen Eingaben fehlschlägt. +Es ist wichtig, alle Annahmen über die Ausführung eines Vertrags zu dokumentieren und Unit-Tests zu schreiben, um die Gültigkeit dieser Annahmen zu überprüfen. Abgesehen vom Schutz vor unerwarteter Ausführung zwingt Sie das Testen von Zusicherungen (Assertions) dazu, über Operationen nachzudenken, die das Sicherheitsmodell eines Smart Contracts brechen könnten. Ein nützlicher Tipp ist, über „Happy-User-Tests“ hinauszugehen und negative Tests zu schreiben, die überprüfen, ob eine Funktion bei falschen Eingaben fehlschlägt. -Viele Unit-Test-Frameworks ermöglichen das Aufstellen von Behauptungen – einfache Aussagen, die angeben, zu was ein Vertrag fähig ist und zu was nicht – und das Ausführen von Tests, um zu sehen, ob diese Behauptungen bei der Ausführung zutreffen. Ein Entwickler, der an dem oben beschriebenen Auktionsvertrag arbeitet, könnte vor der Ausführung negativer Tests die folgenden Behauptungen über sein Verhalten aufstellen: +Viele Unit-Testing-Frameworks ermöglichen es Ihnen, Zusicherungen zu erstellen – einfache Aussagen, die angeben, was ein Vertrag tun kann und was nicht – und Tests auszuführen, um zu sehen, ob diese Zusicherungen bei der Ausführung Bestand haben. Ein Entwickler, der an dem zuvor beschriebenen Auktionsvertrag arbeitet, könnte vor der Ausführung negativer Tests die folgenden Zusicherungen über dessen Verhalten machen: - Benutzer können keine Gebote abgeben, wenn die Auktion beendet ist oder noch nicht begonnen hat. -- Der Auktionsvertrag bricht ab, wenn ein Gebot unter dem akzeptablen Schwellenwert liegt. +- Der Auktionsvertrag wird rückgängig gemacht (reverts), wenn ein Gebot unter dem akzeptablen Schwellenwert liegt. -- Benutzer, die den Zuschlag nicht erhalten, bekommen ihr Geld wieder gutgeschrieben. +- Benutzern, die den Zuschlag nicht erhalten, werden ihre Gelder gutgeschrieben. **Hinweis**: Eine weitere Möglichkeit, Annahmen zu testen, besteht darin, Tests zu schreiben, die [Funktionsmodifikatoren](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) in einem Vertrag auslösen, insbesondere `require`-, `assert`- und `if…else`-Anweisungen. -##### 3. Codeabdeckung messen +##### 3. Messen Sie die Codeabdeckung -[Codeabdeckung](https://en.m.wikipedia.org/wiki/Code_coverage) ist eine Testmetrik, die die Anzahl der Verzweigungen, Zeilen und Anweisungen in Ihrem Code verfolgt, die während der Tests ausgeführt werden. Tests sollten eine gute Code-Abdeckung haben, um das Risiko ungetesteter Schwachstellen zu minimieren. Ohne ausreichende Abdeckung könntest du fälschlicherweise annehmen, dass dein Vertrag sicher ist, weil alle Tests bestanden werden, während Schwachstellen in ungetesteten Code-Pfaden weiterhin bestehen. Der Nachweis einer hohen Code-Abdeckung gibt jedoch Gewissheit, dass alle Aussagen/Funktionen in einem Smart Contract ausreichend auf ihre Korrektheit getestet wurden. +[Codeabdeckung](https://en.m.wikipedia.org/wiki/Code_coverage) (Code Coverage) ist eine Testmetrik, die die Anzahl der Zweige, Zeilen und Anweisungen in Ihrem Code verfolgt, die während der Tests ausgeführt werden. Tests sollten eine gute Codeabdeckung aufweisen, um das Risiko ungetesteter Schwachstellen zu minimieren. Ohne ausreichende Abdeckung könnten Sie fälschlicherweise annehmen, dass Ihr Vertrag sicher ist, weil alle Tests bestanden wurden, während in ungetesteten Codepfaden weiterhin Schwachstellen existieren. Die Aufzeichnung einer hohen Codeabdeckung gibt jedoch die Gewissheit, dass alle Anweisungen/Funktionen in einem Smart Contract ausreichend auf Korrektheit getestet wurden. -##### 4. Gut entwickelte Test-Frameworks verwenden +##### 4. Verwenden Sie gut entwickelte Test-Frameworks -Die Qualität der Werkzeuge, die für die Durchführung von Unit-Tests für Ihre Smart Contracts verwendet werden, ist entscheidend. Ein ideales Test-Framework ist eines, das regelmäßig gepflegt wird, nützliche Funktionen bietet (z. B. Protokollierungs- und Berichtsfunktionen) und von anderen Entwicklern ausgiebig genutzt und geprüft wurde. +Die Qualität der Tools, die zur Ausführung von Unit-Tests für Ihre Smart Contracts verwendet werden, ist entscheidend. Ein ideales Test-Framework ist eines, das regelmäßig gewartet wird, nützliche Funktionen bietet (z. B. Protokollierungs- und Berichtsfunktionen) und von anderen Entwicklern ausgiebig genutzt und geprüft wurde. -Unit-Test-Frameworks für Solidity Smart Contracts liegen in verschiedenen Sprachen vor (hauptsächlich in JavaScript, Python und Rust). In den folgenden Anleitungen finden Sie Informationen darüber, wie Sie Unit-Tests mit verschiedenen Test-Frameworks durchführen können: +Unit-Testing-Frameworks für Solidity-Smart-Contracts gibt es in verschiedenen Sprachen (hauptsächlich JavaScript, Python und Rust). In einigen der folgenden Leitfäden finden Sie Informationen darüber, wie Sie mit der Ausführung von Unit-Tests mit verschiedenen Test-Frameworks beginnen können: - **[Ausführen von Unit-Tests mit Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - **[Ausführen von Unit-Tests mit Foundry](https://book.getfoundry.sh/forge/writing-tests)** @@ -148,45 +148,45 @@ Unit-Test-Frameworks für Solidity Smart Contracts liegen in verschiedenen Sprac ### Integrationstests {#integration-testing-for-smart-contracts} -Bei Unit-Tests wird das Debugging für Vertragsfunktionen isoliert durchgeführt. Mithilfe von Integrationstests hingegen lassen sich die Komponenten eines Smart Contracts als Ganzes bewerten. Integrationstests können Probleme aufdecken, die sich aus vertragsübergreifenden Aufrufen oder Interaktionen zwischen verschiedenen Funktionen im selben Smart Contract ergeben. Integrationstests können beispielsweise dabei helfen zu prüfen, ob Dinge wie [Vererbung](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) und Dependency Injection ordnungsgemäß funktionieren. +Während Unit-Testing Vertragsfunktionen isoliert debuggt, bewerten Integrationstests die Komponenten eines Smart Contracts als Ganzes. Integrationstests können Probleme erkennen, die sich aus vertragsübergreifenden Aufrufen oder Interaktionen zwischen verschiedenen Funktionen im selben Smart Contract ergeben. Zum Beispiel können Integrationstests helfen zu überprüfen, ob Dinge wie [Vererbung](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) und Dependency Injection ordnungsgemäß funktionieren. -Integrationstests sind nützlich, wenn dein Vertrag eine modulare Architektur verwendet oder während der Ausführung mit anderen Onchain-Verträgen interagiert. Eine Möglichkeit, Integrationstests durchzuführen, besteht darin, bei einer bestimmten Höhe einen [Fork der Blockchain zu erstellen](/glossary/#fork) (mit einem Tool wie [Forge](https://book.getfoundry.sh/forge/fork-testing) oder [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)) und Interaktionen zwischen Ihrem Vertrag und den bereitgestellten Verträgen zu simulieren. +Integrationstests sind nützlich, wenn Ihr Vertrag eine modulare Architektur annimmt oder während der Ausführung mit anderen Verträgen auf der Blockchain (onchain) interagiert. Eine Möglichkeit, Integrationstests durchzuführen, besteht darin, einen [Fork](/glossary/#fork) der Blockchain auf einer bestimmten Höhe zu erstellen (mit einem Tool wie [Forge](https://book.getfoundry.sh/forge/fork-testing) oder [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)) und Interaktionen zwischen Ihrem Vertrag und bereitgestellten Verträgen zu simulieren. -Die abgespaltete Blockchain verhält sich ähnlich wie das Mainnet und verfügt über Konten mit zugehörigen Zuständen und Guthaben. Sie fungiert jedoch nur als lokale Entwicklungsumgebung in einer Sandbox, d. h. Sie benötigen weder echte ETH für Transaktionen noch werden sich Ihre Änderungen auf das tatsächliche Ethereum-Protokoll auswirken. +Die geforkte Blockchain verhält sich ähnlich wie das Mainnet und verfügt über Konten mit zugehörigen Zuständen und Salden. Sie fungiert jedoch nur als isolierte lokale Entwicklungsumgebung (Sandbox), was bedeutet, dass Sie beispielsweise keine echten ETH für Transaktionen benötigen und Ihre Änderungen das echte Ethereum-Protokoll nicht beeinflussen. ### Eigenschaftsbasiertes Testen {#property-based-testing-for-smart-contracts} -Beim eigenschaftsbasierten Testen wird geprüft, ob ein Smart Contract eine bestimmte Eigenschaft erfüllt. Eigenschaften geben Fakten über das Verhalten eines Vertrags an, von denen erwartet wird, dass sie in verschiedenen Szenarien wahr bleiben. Ein Beispiel für eine Smart-Contract-Eigenschaft könnte sein: „Bei arithmetischen Operationen im Vertrag darf es niemals zu einem Über- oder Unterlauf kommen.“ +Eigenschaftsbasiertes Testen ist der Prozess der Überprüfung, ob ein Smart Contract eine bestimmte definierte Eigenschaft erfüllt. Eigenschaften behaupten Fakten über das Verhalten eines Vertrags, von denen erwartet wird, dass sie in verschiedenen Szenarien wahr bleiben – ein Beispiel für eine Smart-Contract-Eigenschaft könnte sein: „Arithmetische Operationen im Vertrag führen niemals zu einem Überlauf oder Unterlauf.“ -**Statische Analyse** und **dynamische Analyse** sind zwei gängige Techniken zur Durchführung von eigenschaftsbasierten Tests. Mit beiden lässt sich verifizieren, dass der Code für ein Programm (in diesem Fall ein Smart Contract) eine vordefinierte Eigenschaft erfüllt. Für einige eigenschaftsbasierte Testwerkzeuge sind vordefinierte Regeln für erwartete Vertragseigenschaften festgelegt. Der Code wird dann anhand dieser Regeln geprüft. Andere Werkzeuge ermöglichen es Ihnen, benutzerdefinierte Eigenschaften für einen Smart Contract zu bestimmen. +**Statische Analyse** und **dynamische Analyse** sind zwei gängige Techniken zur Ausführung von eigenschaftsbasiertem Testen, und beide können überprüfen, ob der Code für ein Programm (in diesem Fall ein Smart Contract) eine vordefinierte Eigenschaft erfüllt. Einige Tools für eigenschaftsbasiertes Testen verfügen über vordefinierte Regeln zu erwarteten Vertragseigenschaften und überprüfen den Code anhand dieser Regeln, während andere es Ihnen ermöglichen, benutzerdefinierte Eigenschaften für einen Smart Contract zu erstellen. #### Statische Analyse {#static-analysis} -Beim statischen Analyseprozess wird der Quellcode eines Smart Contracts als Eingabe verwendet. Die ausgegebenen Ergebnisse erklären, ob ein Vertrag eine Eigenschaft erfüllt oder nicht. Im Gegensatz zur dynamischen Analyse wird bei der statischen Analyse ein Vertrag nicht ausgeführt, um ihn auf seine Korrektheit zu prüfen. Bei der statischen Analyse werden stattdessen alle möglichen Pfade ermittelt, die ein Smart Contract während der Ausführung einschlagen könnte (d. h. sie untersucht die Struktur des Quellcodes, um festzustellen, was diese für den Betrieb des Vertrags während der Laufzeit bedeuten könnte).Laufzeit +Ein statischer Analysator nimmt den Quellcode eines Smart Contracts als Eingabe und gibt Ergebnisse aus, die erklären, ob ein Vertrag eine Eigenschaft erfüllt oder nicht. Im Gegensatz zur dynamischen Analyse beinhaltet die statische Analyse nicht die Ausführung eines Vertrags, um ihn auf Korrektheit zu analysieren. Die statische Analyse argumentiert stattdessen über alle möglichen Pfade, die ein Smart Contract während der Ausführung nehmen könnte (d. h. durch Untersuchung der Struktur des Quellcodes, um zu bestimmen, was dies für den Betrieb des Vertrags zur Laufzeit bedeuten würde). -[Linting](https://www.perforce.com/blog/qac/what-is-linting) und [statisches Testen](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) sind gängige Methoden zur Durchführung statischer Analysen von Verträgen. Beide erfordern die Analyse von Low-Level-Darstellungen einer Vertragsausführung, wie z. B. [abstrakten Syntaxbäumen](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) und [Kontrollflussgraphen](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/), die vom Compiler ausgegeben werden. +[Linting](https://www.perforce.com/blog/qac/what-is-linting) und [statisches Testen](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) sind gängige Methoden zur Durchführung statischer Analysen von Verträgen. Beide erfordern die Analyse von Low-Level-Darstellungen der Ausführung eines Vertrags, wie z. B. [abstrakte Syntaxbäume](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) und [Kontrollflussgraphen](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/), die vom Compiler ausgegeben werden. -In den meisten Fällen ist die statische Analyse nützlich, um Sicherheitsprobleme wie die Verwendung unsicherer Konstrukte, Syntaxfehler oder Verstöße gegen Codierungsstandards in einem Vertragscode zu erkennen. Es ist jedoch bekannt, dass statische Analysen im Allgemeinen nicht dazu geeignet sind, tiefer liegende Schwachstellen zu erkennen, und dass sie zu viele falsch-positive Ergebnisse liefern können. +In den meisten Fällen ist die statische Analyse nützlich, um Sicherheitsprobleme wie die Verwendung unsicherer Konstrukte, Syntaxfehler oder Verstöße gegen Codierungsstandards im Code eines Vertrags zu erkennen. Es ist jedoch bekannt, dass statische Analysatoren im Allgemeinen unzuverlässig bei der Erkennung tieferer Schwachstellen sind und übermäßig viele falsch positive Ergebnisse produzieren können. #### Dynamische Analyse {#dynamic-analysis} -Die dynamische Analyse generiert symbolische Eingaben (z. B. bei der [symbolischen Ausführung](https://en.m.wikipedia.org/wiki/Symbolic_execution)) oder konkrete Eingaben (z. B. beim [Fuzzing](https://owasp.org/www-community/Fuzzing)) für die Funktionen eines Smart Contracts, um zu sehen, ob eine oder mehrere Ausführungsspuren bestimmte Eigenschaften verletzen. Diese Form des eigenschaftsbasierten Testens unterscheidet sich von Unit-Tests dadurch, dass die Testfälle mehrere Szenarien abdecken und ein Programm die Erstellung der Testfälle übernimmt. +Die dynamische Analyse generiert symbolische Eingaben (z. B. bei der [symbolischen Ausführung](https://en.m.wikipedia.org/wiki/Symbolic_execution)) oder konkrete Eingaben (z. B. beim [Fuzzing](https://owasp.org/www-community/Fuzzing)) für die Funktionen eines Smart Contracts, um zu sehen, ob Ausführungsspuren bestimmte Eigenschaften verletzen. Diese Form des eigenschaftsbasierten Testens unterscheidet sich von Unit-Tests dadurch, dass Testfälle mehrere Szenarien abdecken und ein Programm die Generierung von Testfällen übernimmt. -[Fuzzing](https://www.halborn.com/blog/post/what-is-fuzz-testing-fuzzing) ist ein Beispiel für eine dynamische Analysetechnik zur Verifizierung beliebiger Eigenschaften in Smart Contracts. Ein Fuzzer ruft Funktionen in einem Zielvertrag mit zufälligen oder missgebildeten Variationen eines definierten Eingabewerts auf. Wenn der Smart Contract in einen Fehlerzustand eintritt (z. B. wenn eine Behauptung fehlschlägt), wird das Problem gekennzeichnet, und die Eingaben, die die Ausführung in Richtung des anfälligen Pfads steuern, werden in einem Bericht aufgeführt. +[Fuzzing](https://www.halborn.com/blog/post/what-is-fuzz-testing-fuzzing) ist ein Beispiel für eine dynamische Analysetechnik zur Überprüfung beliebiger Eigenschaften in Smart Contracts. Ein Fuzzer ruft Funktionen in einem Zielvertrag mit zufälligen oder fehlerhaften Variationen eines definierten Eingabewerts auf. Wenn der Smart Contract in einen Fehlerzustand übergeht (z. B. einen, bei dem eine Zusicherung fehlschlägt), wird das Problem markiert und Eingaben, die die Ausführung in Richtung des anfälligen Pfads treiben, werden in einem Bericht ausgegeben. -Fuzzing ist nützlich, um den Mechanismus zur Eingabevalidierung von Smart Contracts zu bewerten, da eine unsachgemäße Handhabung unerwarteter Eingaben eine unbeabsichtigte Ausführung zur Folge und gefährliche Auswirkungen haben kann. Diese Form eigentumsbasierter Tests kann aus vielen Gründen ideal sein: +Fuzzing ist nützlich zur Bewertung des Eingabevalidierungsmechanismus eines Smart Contracts, da eine unsachgemäße Handhabung unerwarteter Eingaben zu einer unbeabsichtigten Ausführung führen und gefährliche Auswirkungen haben kann. Diese Form des eigenschaftsbasierten Testens kann aus vielen Gründen ideal sein: -1. **Das Schreiben von Testfällen, die viele Szenarien abdecken, ist schwierig.** Für einen Eigenschaftstest müssen Sie lediglich ein Verhalten und einen Datenbereich festlegen, mit dem das Verhalten getestet werden soll. Das Programm generiert automatisch Testfälle auf der Grundlage der festgelegten Eigenschaft. +1. **Das Schreiben von Testfällen zur Abdeckung vieler Szenarien ist schwierig.** Ein Eigenschaftstest erfordert nur, dass Sie ein Verhalten und einen Datenbereich definieren, mit dem das Verhalten getestet werden soll – das Programm generiert automatisch Testfälle basierend auf der definierten Eigenschaft. -2. **Ihre Test-Suite deckt möglicherweise nicht alle möglichen Pfade innerhalb des Programms ausreichend ab.** Selbst bei einer 100-prozentigen Abdeckung ist es möglich, Grenzfälle zu übersehen. +2. **Ihre Test-Suite deckt möglicherweise nicht alle möglichen Pfade innerhalb des Programms ausreichend ab.** Selbst bei 100 % Abdeckung ist es möglich, Randfälle zu übersehen. -3. **Unit-Tests beweisen, dass ein Vertrag für Beispieldaten korrekt ausgeführt wird, aber ob der Vertrag auch für Eingaben außerhalb der Stichprobe korrekt ausgeführt wird, bleibt unbekannt.** Eigenschaftstests führen einen Zielvertrag mit mehreren Variationen eines bestimmten Eingabewerts aus, um Ausführungsspuren zu finden, die zu Assertionsfehlern führen. Somit bietet ein Eigenschaftstest mehr Garantien, dass ein Vertrag für eine breite Klasse von Eingabedaten korrekt ausgeführt wird. +3. **Unit-Tests beweisen, dass ein Vertrag für Beispieldaten korrekt ausgeführt wird, aber ob der Vertrag für Eingaben außerhalb der Stichprobe korrekt ausgeführt wird, bleibt unbekannt.** Eigenschaftstests führen einen Zielvertrag mit mehreren Variationen eines bestimmten Eingabewerts aus, um Ausführungsspuren zu finden, die Fehler bei Zusicherungen verursachen. Somit bietet ein Eigenschaftstest mehr Garantien dafür, dass ein Vertrag für eine breite Klasse von Eingabedaten korrekt ausgeführt wird. -### Richtlinien für die Durchführung von eigenschaftsbasierten Tests für Smart Contracts {#running-property-based-tests} +### Richtlinien für die Ausführung von eigenschaftsbasiertem Testen für Smart Contracts {#running-property-based-tests} -Die Durchführung von eigenschaftsbasierten Tests beginnt in der Regel mit der Definition einer Eigenschaft (z. B. der Abwesenheit von [Ganzzahl-Überläufen](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) oder einer Sammlung von Eigenschaften, die Sie in einem Smart Contract überprüfen möchten. Möglicherweise müssen Sie beim Schreiben von Eigenschaftstests auch einen Wertebereich festlegen, innerhalb dessen das Programm Daten für Transaktionseingaben generieren kann. +Die Ausführung von eigenschaftsbasiertem Testen beginnt typischerweise mit der Definition einer Eigenschaft (z. B. Fehlen von [Integer-Überläufen](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) oder einer Sammlung von Eigenschaften, die Sie in einem Smart Contract überprüfen möchten. Möglicherweise müssen Sie auch einen Wertebereich definieren, innerhalb dessen das Programm Daten für Transaktionseingaben generieren kann, wenn Sie Eigenschaftstests schreiben. -Sobald das Eigenschafts-Testwerkzeug richtig konfiguriert ist, führt es Ihre Smart-Contract-Funktionen mit zufällig generierten Eingaben aus. Wenn irgendwelche Verstöße gegen Behauptungen vorliegen, sollten Sie einen Bericht mit konkreten Eingabedaten erhalten, die gegen die zu bewertende Eigenschaft verstoßen. In den folgenden Anleitungen finden Sie Informationen für den Einstieg in die Durchführung von eigenschaftsbasierten Tests mit verschiedenen Werkzeugen: +Sobald es richtig konfiguriert ist, führt das Tool für Eigenschaftstests die Funktionen Ihres Smart Contracts mit zufällig generierten Eingaben aus. Wenn es Verletzungen von Zusicherungen gibt, sollten Sie einen Bericht mit konkreten Eingabedaten erhalten, die die zu bewertende Eigenschaft verletzen. In einigen der folgenden Leitfäden erfahren Sie, wie Sie mit der Ausführung von eigenschaftsbasiertem Testen mit verschiedenen Tools beginnen können: - **[Statische Analyse von Smart Contracts mit Slither](https://github.com/crytic/slither)** - **[Statische Analyse von Smart Contracts mit Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** @@ -197,114 +197,120 @@ Sobald das Eigenschafts-Testwerkzeug richtig konfiguriert ist, führt es Ihre Sm - **[Symbolische Ausführung von Smart Contracts mit Manticore](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore#manticore-tutorial)** - **[Symbolische Ausführung von Smart Contracts mit Mythril](https://mythril-classic.readthedocs.io/en/master/tutorial.html)** -## Manuelles Testen von Smart Contracts {#manual-testing-for-smart-contracts} +## Manuelles Testen für Smart Contracts {#manual-testing-for-smart-contracts} -Das manuelle Testen von Smart Contracts erfolgt oft erst später im Entwicklungszyklus, nachdem automatisierte Tests durchgeführt wurden. Bei dieser Form des Testens wird der Smart Contract als vollständig integriertes Produkt bewertet, um festzustellen, ob er die in den technischen Anforderungen festgelegten Leistungen erbringt. +Das manuelle Testen von Smart Contracts erfolgt oft später im Entwicklungszyklus nach der Ausführung automatisierter Tests. Diese Form des Testens bewertet den Smart Contract als ein vollständig integriertes Produkt, um zu sehen, ob er wie in den technischen Anforderungen spezifiziert funktioniert. ### Testen von Verträgen auf einer lokalen Blockchain {#testing-on-local-blockchain} -Automatisierte Tests, die in einer lokalen Entwicklungsumgebung durchgeführt werden, können zwar nützliche Debugging-Informationen liefern. Für Sie ist es allerdings wichtig, zu wissen, wie sich Ihr Smart Contract in einer Produktionsumgebung verhält. Bei einer Veröffentlichung auf dem Ethereum-Mainnet fallen jedoch Gas-Gebühren an – ganz zu schweigen davon, dass Sie oder Ihre Benutzer echtes Geld verlieren können, wenn Ihr Smart Contract noch Fehler aufweist. +Während automatisiertes Testen in einer lokalen Entwicklungsumgebung nützliche Debugging-Informationen liefern kann, möchten Sie wissen, wie sich Ihr Smart Contract in einer Produktionsumgebung verhält. Die Bereitstellung auf der Haupt-Ethereum-Chain verursacht jedoch Gasgebühren – ganz zu schweigen davon, dass Sie oder Ihre Benutzer echtes Geld verlieren können, wenn Ihr Smart Contract noch Fehler aufweist. -Das Testen Ihres Vertrags auf einer lokalen Blockchain (auch als [Entwicklungsnetzwerk](/developers/docs/development-networks/) bezeichnet) ist eine empfohlene Alternative zum Testen auf dem Mainnet. Eine lokale Blockchain ist eine Kopie der Ethereum-Blockchain, die lokal auf Ihrem Computer läuft und das Verhalten der Ausführungsebene von Ethereum simuliert. Dementsprechend können Sie Transaktionen so programmieren, dass sie mit einem Vertrag interagieren, ohne signifikante zusätzliche Kosten zu verursachen. +Das Testen Ihres Vertrags auf einer lokalen Blockchain (auch bekannt als [Entwicklungsnetzwerk](/developers/docs/development-networks/)) ist eine empfohlene Alternative zum Testen im Mainnet. Eine lokale Blockchain ist eine Kopie der Ethereum-Blockchain, die lokal auf Ihrem Computer läuft und das Verhalten der Ausführungsebene von Ethereum simuliert. Als solches können Sie Transaktionen programmieren, um mit einem Vertrag zu interagieren, ohne erheblichen Mehraufwand zu verursachen. -Die Ausführung von Verträgen auf einer lokalen Blockchain könnte als eine Form manueller Integrationstests nützlich sein. [Smart Contracts sind hochgradig komponierbar](/developers/docs/smart-contracts/composability/), was es Ihnen ermöglicht, sie mit bestehenden Protokollen zu integrieren – Sie müssen jedoch trotzdem sicherstellen, dass solch komplexe Onchain-Interaktionen die korrekten Ergebnisse liefern. +Die Ausführung von Verträgen auf einer lokalen Blockchain könnte als eine Form des manuellen Integrationstests nützlich sein. [Smart Contracts sind hochgradig zusammensetzbar](/developers/docs/smart-contracts/composability/), was es Ihnen ermöglicht, sie in bestehende Protokolle zu integrieren – aber Sie müssen dennoch sicherstellen, dass solch komplexe Interaktionen auf der Blockchain (onchain) die korrekten Ergebnisse liefern. [Mehr über Entwicklungsnetzwerke.](/developers/docs/development-networks/) -### Testen von Verträgen auf Testnets {#testing-contracts-on-testnets} +### Testen von Verträgen in Testnets {#testing-contracts-on-testnets} -Ein Testnetzwerk oder Testnet funktioniert genau wie das Ethereum-Mainnet, außer dass es Ether (ETH) verwendet, das keinen realen Wert hat. Das Bereitstellen Ihres Vertrags auf einem [Testnet](/developers/docs/networks/#ethereum-testnets) bedeutet, dass jeder damit interagieren kann (z. B. über das Frontend der Dapp), ohne Gelder zu riskieren. +Ein Testnetzwerk oder Testnet funktioniert genau wie das Ethereum-Mainnet, außer dass es Ether (ETH) ohne realen Wert verwendet. Die Bereitstellung Ihres Vertrags in einem [Testnet](/developers/docs/networks/#ethereum-testnets) bedeutet, dass jeder damit interagieren kann (z. B. über das Frontend der Dapp), ohne Gelder zu gefährden. -Diese Form manueller Tests ist nützlich, um den End-to-End-Flow Ihrer Anwendung aus der Sicht des Benutzers zu bewerten. Hier können Beta-Tester auch Testläufe durchführen und etwaige Probleme mit der Geschäftslogik und der Gesamtfunktionalität des Vertrags melden. +Diese Form des manuellen Testens ist nützlich zur Bewertung des End-to-End-Ablaufs Ihrer Anwendung aus der Sicht eines Benutzers. Hier können Beta-Tester auch Probeläufe durchführen und Probleme mit der Geschäftslogik und der allgemeinen Funktionalität des Vertrags melden. -Die Veröffentlichung in einem Testnetz nach dem Testen auf einer lokalen Blockchain ist ideal, da Ersteres eher dem Verhalten der Ethereum Virtual Machine entspricht. Daher ist es bei vielen Ethereum-nativen Projekten üblich, DApps in Testnetzen zu veröffentlichen, um so den Betrieb von Smart Contracts unter realen Bedingungen zu simulieren. +Die Bereitstellung in einem Testnet nach dem Testen auf einer lokalen Blockchain ist ideal, da ersteres dem Verhalten der Ethereum Virtual Machine näher kommt. Daher ist es für viele Ethereum-native Projekte üblich, Dapps in Testnets bereitzustellen, um den Betrieb eines Smart Contracts unter realen Bedingungen zu bewerten. [Mehr über Ethereum-Testnets.](/developers/docs/development-networks/#public-beacon-testchains) -## Testen vs. formale Verifizierung {#testing-vs-formal-verification} +## Testen vs. formale Verifikation {#testing-vs-formal-verification} -Zwar helfen Tests bei der Bestätigung, dass ein Vertrag für einige Dateneingaben die erwarteten Ergebnisse liefert. Sie können jedoch nicht schlüssig beweisen, dass dies auch für Eingaben gilt, die während der Tests nicht verwendet wurden. Das Testen eines Smart Contracts kann daher keine „funktionale Korrektheit“ garantieren (d. h. es kann nicht beweisen, dass sich ein Programm für _alle_ Sätze von Eingabewerten wie erforderlich verhält). +Während das Testen hilft zu bestätigen, dass ein Vertrag die erwarteten Ergebnisse für einige Dateneingaben zurückgibt, kann es dies nicht schlüssig für Eingaben beweisen, die während der Tests nicht verwendet wurden. Das Testen eines Smart Contracts kann daher keine „funktionale Korrektheit“ garantieren (d. h. es kann nicht zeigen, dass sich ein Programm für _alle_ Sätze von Eingabewerten wie erforderlich verhält). -Die formale Verifizierung ist ein Ansatz zur Bewertung der Korrektheit von Software, indem geprüft wird, ob ein formales Modell des Programms mit der formalen Spezifikation übereinstimmt. Ein formales Modell ist eine abstrakte mathematische Darstellung eines Programms, wohingegen eine formale Spezifikation die Eigenschaften eines Programms definiert (d. h. logische Behauptungen über die Ausführung des Programms). +Die formale Verifikation ist ein Ansatz zur Bewertung der Korrektheit von Software, indem überprüft wird, ob ein formales Modell des Programms mit der formalen Spezifikation übereinstimmt. Ein formales Modell ist eine abstrakte mathematische Darstellung eines Programms, während eine formale Spezifikation die Eigenschaften eines Programms definiert (d. h. logische Zusicherungen über die Ausführung des Programms). -Da die Eigenschaften in mathematischen Begriffen geschrieben sind, ist es möglich, zu verifizieren, ob ein formales (mathematisches) Modell des Systems eine Spezifikation mithilfe logischer Inferenzregeln erfüllt. Daher liefern formale Verifizierungswerkzeuge angeblich einen „mathematischen Beweis“ für die Korrektheit eines Systems. +Da Eigenschaften in mathematischen Begriffen geschrieben sind, wird es möglich zu überprüfen, ob ein formales (mathematisches) Modell des Systems eine Spezifikation unter Verwendung logischer Schlussfolgerungsregeln erfüllt. Daher wird gesagt, dass formale Verifikations-Tools einen „mathematischen Beweis“ für die Korrektheit eines Systems liefern. -Im Gegensatz zum Testen kann die formale Verifizierung verwendet werden, um zu überprüfen, ob die Ausführung eines Smart Contracts eine formale Spezifikation für _alle_ Ausführungen erfüllt (d. h. keine Bugs aufweist), ohne sie mit Beispieldaten ausführen zu müssen. Dies reduziert nicht nur den Zeitaufwand für die Durchführung von Dutzenden von Unit-Tests, sondern ist auch effektiver beim Aufspüren versteckter Schwachstellen. Abgesehen davon liegen die formalen Verifizierungstechniken auf einem Spektrum, das sich nach der erforderlichen Rechenleistung der Implementierung und ihrer Nützlichkeit richtet. +Im Gegensatz zum Testen kann die formale Verifikation verwendet werden, um zu überprüfen, ob die Ausführung eines Smart Contracts eine formale Spezifikation für _alle_ Ausführungen erfüllt (d. h. er hat keine Fehler), ohne ihn mit Beispieldaten ausführen zu müssen. Dies reduziert nicht nur die Zeit, die für die Ausführung von Dutzenden von Unit-Tests aufgewendet wird, sondern ist auch effektiver beim Aufspüren versteckter Schwachstellen. Allerdings liegen formale Verifikationstechniken auf einem Spektrum, abhängig von ihrer Schwierigkeit bei der Implementierung und ihrer Nützlichkeit. -[Mehr zur formalen Verifizierung von Smart Contracts.](/developers/docs/smart-contracts/formal-verification) +[Mehr über formale Verifikation für Smart Contracts.](/developers/docs/smart-contracts/formal-verification) ## Testen vs. Audits und Bug-Bounties {#testing-vs-audits-bug-bounties} -Wie bereits erwähnt, können strenge Tests nur selten das Fehlen von Bugs in einem Vertrag garantieren. Formale Verifizierungsansätze können eine stärkere Garantie für die Korrektheit bieten, sind aber derzeit schwierig anzuwenden und mit erheblichen Kosten verbunden. +Wie bereits erwähnt, kann rigoroses Testen selten die Abwesenheit von Fehlern in einem Vertrag garantieren; formale Verifikationsansätze können stärkere Zusicherungen der Korrektheit bieten, sind aber derzeit schwierig zu verwenden und verursachen erhebliche Kosten. -Dennoch können Sie die Wahrscheinlichkeit weiter erhöhen, dass Schwachstellen im Vertrag entdeckt werden, indem Sie eine unabhängige Code-Prüfung durchführen lassen. [Smart-Contract-Audits](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) und [Bug-Bounties](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) sind zwei Möglichkeiten, um Ihre Verträge von anderen analysieren zu lassen. +Dennoch können Sie die Wahrscheinlichkeit, Vertragsschwachstellen zu finden, weiter erhöhen, indem Sie eine unabhängige Codeüberprüfung durchführen lassen. [Smart-Contract-Audits](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) und [Bug-Bounties](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) sind zwei Möglichkeiten, andere dazu zu bringen, Ihre Verträge zu analysieren. -Die Audits werden von Auditoren durchgeführt, die erfahren darin sind, Sicherheitslücken und schlechte Entwicklungspraktiken in Smart Contracts aufzudecken. Ein Audit umfasst in der Regel Tests (und möglicherweise eine formale Verifizierung) sowie eine manuelle Überprüfung der gesamten Codebasis. +Audits werden von Prüfern durchgeführt, die Erfahrung darin haben, Fälle von Sicherheitslücken und schlechten Entwicklungspraktiken in Smart Contracts zu finden. Ein Audit umfasst in der Regel Tests (und möglicherweise formale Verifikation) sowie eine manuelle Überprüfung der gesamten Codebasis. -Umgekehrt beinhaltet ein Bug-Bounty-Programm in der Regel das Anbieten einer finanziellen Belohnung für eine Person (allgemein als [White-Hat-Hacker](https://en.wikipedia.org/wiki/White_hat_\(computer_security\)>) beschrieben), die eine Schwachstelle in einem Smart Contract entdeckt und sie den Entwicklern offenlegt. Bug-Kopfgeld ähnelt insofern Audits, da seine Funktionsweise mit einschließt, dass andere gebeten werden, bei der Suche nach Fehlern in Smart Contracts zu helfen. +Umgekehrt beinhaltet ein Bug-Bounty-Programm in der Regel das Anbieten einer finanziellen Belohnung für eine Person (allgemein als [White-Hat-Hacker]() bezeichnet), die eine Schwachstelle in einem Smart Contract entdeckt und sie den Entwicklern offenlegt. Bug-Bounties ähneln Audits, da sie beinhalten, andere zu bitten, bei der Suche nach Fehlern in Smart Contracts zu helfen. -Der Hauptunterschied besteht darin, dass Bug-Kopfgeld-Programme der breiteren Entwickler-/Hacker-Community offenstehen und eine breite Klasse von ethischen Hackern und unabhängigen Sicherheitsexperten mit einzigartigen Fähigkeiten und einzigartiger Erfahrung ansprechen. Dies kann ein Vorteil gegenüber Audits von Smart Contracts sein, die sich hauptsächlich auf Teams stützen, die möglicherweise nur über begrenzte oder eingeschränkte Fachkenntnisse verfügen. +Der Hauptunterschied besteht darin, dass Bug-Bounty-Programme der breiteren Entwickler-/Hacker-Community offenstehen und eine breite Klasse von ethischen Hackern und unabhängigen Sicherheitsexperten mit einzigartigen Fähigkeiten und Erfahrungen anziehen. Dies kann ein Vorteil gegenüber Smart-Contract-Audits sein, die sich hauptsächlich auf Teams stützen, die möglicherweise über begrenzte oder enge Fachkenntnisse verfügen. -## Testwerkzeuge und -bibliotheken {#testing-tools-and-libraries} +## Test-Tools und Bibliotheken {#testing-tools-and-libraries} -### Unit-Test-Werkzeuge {#unit-testing-tools} +### Unit-Testing-Tools {#unit-testing-tools} -- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** – _Code-Abdeckungs-Tool für in Solidity geschriebene Smart Contracts._ +- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** – _Codeabdeckungs-Tool für in Solidity geschriebene Smart Contracts._ -- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** – _Framework für die fortgeschrittene Entwicklung und das Testen von Smart Contracts (basiert auf ethers.js)_. +- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** – _Framework für fortgeschrittene Smart-Contract-Entwicklung und -Tests (basierend auf ethers.js)._ -- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** – _Tool zum Testen von Solidity Smart Contracts._ Arbeitet unter dem Remix IDE „Solidity Unit Testing“-Plug-in, das zum Schreiben und Ausführen von Testfällen für einen Vertrag verwendet wird._ +- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** – _Tool zum Testen von Solidity-Smart-Contracts. Funktioniert unter dem Remix-IDE-Plugin „Solidity Unit Testing“, das zum Schreiben und Ausführen von Testfällen für einen Vertrag verwendet wird._ -- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** – _Assertionsbibliothek für das Testen von Ethereum Smart Contracts._ Stellen Sie sicher, dass sich Ihre Verträge wie erwartet verhalten!_ +- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** – _Zusicherungsbibliothek (Assertion Library) für das Testen von Ethereum-Smart-Contracts. Stellen Sie sicher, dass sich Ihre Verträge wie erwartet verhalten!_ -- **[Brownie Unit-Testing-Framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie nutzt Pytest, ein funktionsreiches Testframework, mit dem Sie kleine Tests mit minimalem Code schreiben können, das gut für große Projekte skaliert und in hohem Maße erweiterbar ist._ +- **[Brownie Unit-Testing-Framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _Brownie nutzt Pytest, ein funktionsreiches Test-Framework, mit dem Sie kleine Tests mit minimalem Code schreiben können, das gut für große Projekte skaliert und hochgradig erweiterbar ist._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testframework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry bietet Forge, ein schnelles und flexibles Ethereum-Test-Framework, das in der Lage ist, einfache Unit-Tests, Gasoptimierungsprüfungen und Vertrags-Fuzzing auszuführen._ -- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework zum Testen von Smart Contracts, basierend auf ethers.js, Mocha und Chai._ +- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework zum Testen von Smart Contracts basierend auf ethers.js, Mocha und Chai._ -- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** – _Python-basiertes Entwicklungs- und Testframework für Smart Contracts, die auf die Ethereum Virtual Machine abzielen._ +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** – _Python-basiertes Entwicklungs- und Test-Framework für Smart Contracts, das auf die Ethereum Virtual Machine abzielt._ -- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** – _Python-basiertes Framework für Unit-Tests und Fuzzing mit starken Debugging-Funktionen und Cross-Chain-Testunterstützung, das Pytest und Anvil für die beste Benutzererfahrung und Leistung nutzt._ +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** – _Python-basiertes Framework für Unit-Testing und Fuzzing mit starken Debugging-Funktionen und Unterstützung für Cross-Chain-Tests, das pytest und Anvil für beste Benutzererfahrung und Leistung nutzt._ -### Eigenschaftsbasierte Testwerkzeuge {#property-based-testing-tools} +### Tools für eigenschaftsbasiertes Testen {#property-based-testing-tools} -#### Werkzeuge für die statische Analyse {#static-analysis-tools} +#### Tools für statische Analyse {#static-analysis-tools} -- **[Slither](https://github.com/crytic/slither)** – _Python-basiertes Framework für die statische Analyse von Solidity zum Finden von Schwachstellen, zur Verbesserung des Code-Verständnisses und zum Schreiben benutzerdefinierter Analysen für Smart Contracts._ +- **[Slither](https://github.com/crytic/slither)** – _Python-basiertes Framework zur statischen Analyse von Solidity zum Finden von Schwachstellen, zur Verbesserung des Codeverständnisses und zum Schreiben benutzerdefinierter Analysen für Smart Contracts._ -- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** – _Linter zur Durchsetzung von Stil- und Sicherheits-Best-Practices für die Smart-Contract-Programmiersprache Solidity._ +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** – _Linter zur Durchsetzung von Stil- und Sicherheits-Best-Practices für die Programmiersprache Solidity für Smart Contracts._ -- **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)** – _Rust-basiertes statisches Analysetool, das speziell für die Sicherheit und Entwicklung von Web3-Smart-Contracts konzipiert wurde._ +- **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)** – _Rust-basierter statischer Analysator, der speziell für die Sicherheit und Entwicklung von Web3-Smart-Contracts entwickelt wurde._ -- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** – _Python-basiertes Framework für statische Analyse mit Detektoren für Schwachstellen und Codequalität, Printern zum Extrahieren nützlicher Informationen aus dem Code und Unterstützung für das Schreiben benutzerdefinierter Submodule._ +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** – _Python-basiertes Framework zur statischen Analyse mit Detektoren für Schwachstellen und Codequalität, Druckern zum Extrahieren nützlicher Informationen aus Code und Unterstützung für das Schreiben benutzerdefinierter Submodule._ - **[Slippy](https://github.com/fvictorio/slippy)** – _Ein einfacher und leistungsstarker Linter für Solidity._ -#### Werkzeuge für die dynamische Analyse {#dynamic-analysis-tools} +#### Tools für dynamische Analyse {#dynamic-analysis-tools} -- **[Echidna](https://github.com/crytic/echidna/)** – _Schneller Vertrags-Fuzzer zum Aufspüren von Schwachstellen in Smart Contracts mithilfe von eigenschaftsbasierten Tests._ +- **[Echidna](https://github.com/crytic/echidna/)** – _Schneller Vertrags-Fuzzer zur Erkennung von Schwachstellen in Smart Contracts durch eigenschaftsbasiertes Testen._ -- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** – _Automatisiertes Fuzzing-Werkzeug zum Aufspüren von Eigenschaftsverstößen im Smart-Contract-Code._ +- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** – _Automatisiertes Fuzzing-Tool, das nützlich ist, um Eigenschaftsverletzungen im Smart-Contract-Code zu erkennen._ -- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** – _Dynamisches symbolisches Ausführungs-Framework zur Analyse von EVM-Bytecode._ +- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** – _Framework zur dynamischen symbolischen Ausführung zur Analyse von EVM-Bytecode._ -- **[Mythril](https://github.com/ConsenSys/mythril-classic)** – _EVM-Bytecode-Analysewerkzeug zum Aufspüren von Vertragsschwachstellen mithilfe von Taint-Analysen, concolischer Analyse und Kontrollflussprüfungen._ +- **[Mythril](https://github.com/ConsenSys/mythril-classic)** – _EVM-Bytecode-Bewertungstool zur Erkennung von Vertragsschwachstellen mithilfe von Taint-Analyse, concolic Analyse und Kontrollflussprüfung._ -- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** – _Scribble ist eine Spezifikationssprache und ein Laufzeit-Verifizierungstool, mit dem Sie Smart Contracts mit Eigenschaften versehen können, die es Ihnen ermöglichen, die Verträge automatisch mit Tools wie Diligence Fuzzing oder MythX zu testen._ +- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** – _Scribble ist eine Spezifikationssprache und ein Laufzeit-Verifikations-Tool, mit dem Sie Smart Contracts mit Eigenschaften annotieren können, die es Ihnen ermöglichen, die Verträge automatisch mit Tools wie Diligence Fuzzing oder MythX zu testen._ ## Verwandte Tutorials {#related-tutorials} - [Ein Überblick und Vergleich verschiedener Testprodukte](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ -- [Wie man Echidna zum Testen von Smart Contracts verwendet](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [Wie man Manticore verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) -- [Wie man Slither verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [Wie man Echidna verwendet, um Smart Contracts zu testen](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) +- [Wie man Manticore verwendet, um Fehler in Smart Contracts zu finden](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [Wie man Slither verwendet, um Fehler in Smart Contracts zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [Wie man Solidity-Verträge für Tests mockt](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) -- [Wie man Unit-Tests in Solidity mit Foundry durchführt](https://www.rareskills.io/post/foundry-testing-solidity) +- [Wie man Unit-Tests in Solidity mit Foundry ausführt](https://www.rareskills.io/post/foundry-testing-solidity) -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Ein ausführlicher Leitfaden zum Testen von Ethereum Smart Contracts](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) -- [Wie man Ethereum Smart Contracts testet](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) -- [MolochDAOs Leitfaden für Unit-Tests für Entwickler](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) +- [Ein ausführlicher Leitfaden zum Testen von Ethereum-Smart-Contracts](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) +- [Wie man Ethereum-Smart-Contracts testet](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) +- [MolochDAOs Unit-Testing-Leitfaden für Entwickler](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) - [Wie man Smart Contracts wie ein Rockstar testet](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) + +## Tutorials: Testen von Smart Contracts auf Ethereum {#tutorials} + +- [Wie man eine Dapp in einem lokalen Multi-Client-Testnet entwickelt und testet](/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/) _– Anleitung zur Bereitstellung eines Smart Contracts in einem lokalen Testnet und zur Durchführung von Tests._ +- [Wie man Solidity-Smart-Contracts für Tests mockt](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) _– Fortgeschrittenes Tutorial zur Verwendung von Mock-Daten und zur Implementierung von Unit-Testing._ +- [Wie man Echidna verwendet, um Smart Contracts zu testen](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) _– Fortgeschrittene Ansätze für Fuzzing und das Testen von Smart Contracts._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md index 2d43ed1a166..fde324c3956 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md @@ -1,165 +1,165 @@ --- -title: Aktualisierung von Smart Contracts +title: Smart Contracts aktualisieren description: "Ein Überblick über Upgrade-Muster für Ethereum-Smart-Contracts" lang: de --- -Smart Contracts auf Ethereum sind selbstausführende Programme, die in der Ethereum Virtual Machine (EVM) laufen. Diese Programme sind von vornherein unveränderlich, sodass sich die Geschäftslogik nach der Veröffentlichung des Vertrags nicht mehr aktualisieren lässt. +Smart Contracts auf Ethereum sind selbstausführende Programme, die in der Ethereum Virtual Machine (EVM) laufen. Diese Programme sind von Natur aus unveränderlich, was jegliche Aktualisierungen der Geschäftslogik verhindert, sobald der Vertrag bereitgestellt wurde. -Zwar ist die Unveränderlichkeit für die Vertrauenslosigkeit, Dezentralisierung und Sicherheit von Smart Contracts unabdinglich, sie kann jedoch in bestimmten Fällen ein Nachteil sein. So kann unveränderlicher Code es den Entwicklern unmöglich machen, anfällige Verträge zu reparieren. +Während Unveränderlichkeit für Vertrauenslosigkeit, Dezentralisierung und Sicherheit von Smart Contracts notwendig ist, kann sie in bestimmten Fällen ein Nachteil sein. Zum Beispiel kann unveränderlicher Code es Entwicklern unmöglich machen, anfällige Verträge zu reparieren. -Die zunehmende Forschung zur Verbesserung von Smart Contracts hat jedoch zur Einführung verschiedener Upgrade-Muster geführt. Diese Upgrade-Muster ermöglichen es Entwicklern, Smart Contracts zu aktualisieren (unter Beibehaltung der Unveränderlichkeit), indem sie die Geschäftslogik in verschiedenen Verträgen unterbringen. +Die verstärkte Forschung zur Verbesserung von Smart Contracts hat jedoch zur Einführung mehrerer Upgrade-Muster geführt. Diese Upgrade-Muster ermöglichen es Entwicklern, Smart Contracts zu aktualisieren (wobei die Unveränderlichkeit erhalten bleibt), indem sie die Geschäftslogik in verschiedene Verträge auslagern. ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/), der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) und der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) haben. In diesem Leitfaden wird außerdem davon ausgegangen, dass die Leser über Kenntnisse in der Programmierung von Smart Contracts verfügen. +Sie sollten ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/), der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) und der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) haben. Dieser Leitfaden setzt außerdem voraus, dass die Leser die Programmierung von Smart Contracts beherrschen. ## Was ist ein Smart-Contract-Upgrade? {#what-is-a-smart-contract-upgrade} -Bei einem Smart-Contract-Upgrade wird die Geschäftslogik eines Smart Contracts geändert, wobei der Zustand des Vertrags erhalten bleibt. Es ist wichtig, klarzustellen, dass Aktualisierbarkeit und Veränderbarkeit nicht dasselbe sind, insbesondere im Zusammenhang mit Smart Contracts. +Ein Smart-Contract-Upgrade beinhaltet die Änderung der Geschäftslogik eines Smart Contracts, während der Zustand des Vertrags erhalten bleibt. Es ist wichtig klarzustellen, dass Aktualisierbarkeit und Veränderlichkeit nicht dasselbe sind, insbesondere im Kontext von Smart Contracts. -Sie können ein Programm, das auf einer Adresse im Ethereum-Netzwerk veröffentlicht wird, trotzdem nicht ändern. Aber Sie können den Code ändern, der ausgeführt wird, wenn Benutzer mit einem Smart Contract interagieren. +Sie können ein Programm, das an einer Adresse im Ethereum-Netzwerk bereitgestellt wurde, weiterhin nicht ändern. Aber Sie können den Code ändern, der ausgeführt wird, wenn Benutzer mit einem Smart Contract interagieren. -Dies kann mit den folgenden Methoden geschehen: +Dies kann über die folgenden Methoden erfolgen: -1. Erstellung mehrerer Versionen eines Smart Contracts und Migration des Zustands (d. h. der Daten) vom alten Vertrag auf eine neue Instanz des Vertrags. +1. Erstellen mehrerer Versionen eines Smart Contracts und Migrieren des Zustands (d. h. der Daten) vom alten Vertrag zu einer neuen Instanz des Vertrags. -2. Erstellung separater Verträge zur Speicherung der Geschäftslogik und des Status. +2. Erstellen separater Verträge zur Speicherung von Geschäftslogik und Zustand. -3. Verwendung von Proxy-Mustern, um Funktionsaufrufe von einem unveränderlichen Proxy-Vertrag an einen modifizierbaren Logik-Vertrag zu delegieren. +3. Verwendung von Proxy-Mustern, um Funktionsaufrufe von einem unveränderlichen Proxy-Vertrag an einen modifizierbaren Logikvertrag zu delegieren. -4. Erstellung eines unveränderlichen Haupt-Vertrags, der über Schnittstellen mit flexiblen Satelliten-Verträgen verbunden ist und sich auf diese stützt, um bestimmte Funktionen auszuführen. +4. Erstellen eines unveränderlichen Hauptvertrags, der mit flexiblen Satellitenverträgen interagiert und sich auf diese verlässt, um bestimmte Funktionen auszuführen. -5. Verwendung des Diamond-Musters, um Funktionsaufrufe von einem Proxy-Vertrag an Logik-Verträge zu delegieren. +5. Verwendung des Diamond-Musters, um Funktionsaufrufe von einem Proxy-Vertrag an Logikverträge zu delegieren. ### Upgrade-Mechanismus #1: Vertragsmigration {#contract-migration} -Die Migration von Verträgen basiert auf Versioning – also der Erstellung und Verwaltung eindeutiger Zustände derselben Software. Bei der Vertragsmigration wird eine neue Instanz eines bestehenden Smart Contracts veröffentlicht, wobei Speicher und Guthaben auf den neuen Vertrage übergehen. +Die Vertragsmigration basiert auf Versionierung – der Idee, eindeutige Zustände derselben Software zu erstellen und zu verwalten. Die Vertragsmigration umfasst die Bereitstellung einer neuen Instanz eines bestehenden Smart Contracts und die Übertragung von Speicher und Guthaben auf den neuen Vertrag. -Der neu veröffentlichte Vertrag hat einen leeren Speicher, sodass Sie Daten aus dem alten Vertrag wiederherstellen und in die neue Implementierung schreiben können. Danach müssen Sie alle Verträge, die mit dem alten Vertrag interagierten, auf die neue Adresse umstellen. +Der neu bereitgestellte Vertrag wird einen leeren Speicher haben, was es Ihnen ermöglicht, Daten aus dem alten Vertrag wiederherzustellen und in die neue Implementierung zu schreiben. Danach müssen Sie alle Verträge, die mit dem alten Vertrag interagiert haben, aktualisieren, um die neue Adresse widerzuspiegeln. -Der letzte Schritt der Vertragsmigration besteht darin, die Benutzer davon zu überzeugen, den neuen Vertrag zu nutzen. In der neuen Vertragsversion bleiben die Guthaben und Adressen der Benutzer erhalten, so dass die Unveränderlichkeit gewahrt bleibt. Wenn es sich um einen Token-basierten Vertrag handelt, müssen Sie sich auch mit den Börsen in Verbindung setzen, um den alten Vertrag zu verwerfen und mit dem neuen Vertrag zu ersetzen. +Der letzte Schritt bei der Vertragsmigration besteht darin, die Benutzer davon zu überzeugen, auf den neuen Vertrag umzusteigen. Die neue Vertragsversion behält die Benutzerguthaben und -adressen bei, was die Unveränderlichkeit bewahrt. Wenn es sich um einen Token-basierten Vertrag handelt, müssen Sie auch Börsen kontaktieren, damit diese den alten Vertrag verwerfen und den neuen Vertrag verwenden. -Die Migration von Verträgen ist eine relativ einfache und sichere Maßnahme, um Smart Contracts zu aktualisieren, ohne die Interaktionen der Nutzer zu unterbrechen. Die manuelle Migration von Speicher und Guthaben der Benutzer auf den neuen Vertrag ist jedoch zeitaufwändig und kann hohe Gaskosten verursachen. +Die Vertragsmigration ist eine relativ unkomplizierte und sichere Maßnahme zur Aktualisierung von Smart Contracts, ohne Benutzerinteraktionen zu unterbrechen. Die manuelle Migration von Benutzerspeicher und Guthaben auf den neuen Vertrag ist jedoch zeitintensiv und kann hohe Gaskosten verursachen. -[Mehr über Vertragsmigration.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) +[Mehr zur Vertragsmigration.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) ### Upgrade-Mechanismus #2: Datentrennung {#data-separation} -Eine weitere Methode zur Aktualisierung von Smart Contracts ist die Aufteilung der Geschäftslogik und des Datenspeichers auf separate Verträge. Das bedeutet, dass die Benutzer mit den Logikverträgen interagieren, die Daten aber im Speichervertrag gesichert werden. +Eine weitere Methode zur Aktualisierung von Smart Contracts besteht darin, Geschäftslogik und Datenspeicherung in separate Verträge zu trennen. Das bedeutet, dass Benutzer mit dem Logikvertrag interagieren, während die Daten im Speichervertrag gespeichert werden. -Der Logikvertrag enthält den Code, der ausgeführt wird, wenn Benutzer mit der Anwendung interagieren. Er enthält auch die Adresse des Speichervertrags und interagiert mit diesem, um Daten zu erhalten und einzustellen. +Der Logikvertrag enthält den Code, der ausgeführt wird, wenn Benutzer mit der Anwendung interagieren. Er speichert auch die Adresse des Speichervertrags und interagiert mit ihm, um Daten abzurufen und festzulegen. -In der Zwischenzeit sichert der Speichervertrag den mit dem Smart Contract verbundenen Status, wie z. B. Benutzerguthaben und Adressen. Beachten Sie dabei, dass der Speichervertrag Eigentum des Logikvertrags ist und bei der Veröffentlichung mit der Adresse des Logikvertrags konfiguriert wird. Dadurch wird verhindert, dass nicht autorisierte Verträge den Speichervertrag aufrufen oder seine Daten aktualisieren. +Währenddessen hält der Speichervertrag den mit dem Smart Contract verbundenen Zustand, wie Benutzerguthaben und -adressen. Beachten Sie, dass der Speichervertrag im Besitz des Logikvertrags ist und bei der Bereitstellung mit dessen Adresse konfiguriert wird. Dies verhindert, dass unbefugte Verträge den Speichervertrag aufrufen oder dessen Daten aktualisieren. -Standardmäßig ist der Speichervertrag unveränderlich, aber Sie können den Logikvertrag, auf den er verweist, durch eine neue Implementierung ersetzen. Dadurch wird der Code, der in der EVM läuft, verändert, wobei sowohl der Speicher als auch die Guthaben intakt bleiben. +Standardmäßig ist der Speichervertrag unveränderlich – aber Sie können den Logikvertrag, auf den er verweist, durch eine neue Implementierung ersetzen. Dies ändert den Code, der in der EVM ausgeführt wird, während Speicher und Guthaben intakt bleiben. -Bei dieser Upgrade-Methode muss die Adresse des Logikvertrags im Speichervertrag aktualisiert werden. Außerdem müssen Sie den neuen Logikvertrag aus den bereits erläuterten Gründen mit der Adresse des Speichervertrags konfigurieren. +Die Verwendung dieser Upgrade-Methode erfordert die Aktualisierung der Adresse des Logikvertrags im Speichervertrag. Sie müssen auch den neuen Logikvertrag aus den zuvor erläuterten Gründen mit der Adresse des Speichervertrags konfigurieren. -Das Muster der Datentrennung ist im Vergleich zur Vertragsmigration einfacher zu implementieren. Allerdings müssen Sie mehrere Verträge verwalten und komplexe Autorisierungssysteme implementieren, um Smart Contracts vor böswilligen Upgrades zu schützen. +Das Datentrennungsmuster ist im Vergleich zur Vertragsmigration wohl einfacher zu implementieren. Sie müssen jedoch mehrere Verträge verwalten und komplexe Autorisierungsschemata implementieren, um Smart Contracts vor böswilligen Upgrades zu schützen. ### Upgrade-Mechanismus #3: Proxy-Muster {#proxy-patterns} -Für Proxy-Muster kommt ebenfalls eine Datentrennung zur Anwendung, um die Geschäftslogik und die Daten in getrennten Verträgen zu halten. Bei einem Proxy-Muster hingegen ruft der Speichervertrag (Proxy genannt) den Geschäftsvertrag während der Codeausführung auf. Dies ist eine Umkehrung der Datentrennungsmethode, bei der der Geschäftsvertrag den Speichervertrag aufruft. +Das Proxy-Muster verwendet ebenfalls die Datentrennung, um Geschäftslogik und Daten in separaten Verträgen zu halten. In einem Proxy-Muster ruft jedoch der Speichervertrag (Proxy genannt) den Logikvertrag während der Codeausführung auf. Dies ist eine Umkehrung der Datentrennungsmethode, bei der der Logikvertrag den Speichervertrag aufruft. -Das Folgende geschieht bei einem Proxy-Muster: +Folgendes passiert in einem Proxy-Muster: -1. Die Benutzer interagieren mit dem Proxy-Vertrag, der Daten speichert, aber nicht die Geschäftslogik enthält. +1. Benutzer interagieren mit dem Proxy-Vertrag, der Daten speichert, aber nicht die Geschäftslogik enthält. -2. Der Proxy-Vertrag speichert die Adresse des Logik-Vertrags und delegiert alle Funktionsaufrufe an den Logik-Vertrag (der die Geschäftslogik enthält), indem er die `delegatecall`-Funktion verwendet. +2. Der Proxy-Vertrag speichert die Adresse des Logikvertrags und delegiert alle Funktionsaufrufe an den Logikvertrag (der die Geschäftslogik enthält) unter Verwendung der Funktion `delegatecall`. -3. Nachdem der Aufruf an den Logikvertrag weitergeleitet wurde, werden die vom Logikvertrag weitergegebenen Daten abgerufen und an den Benutzer zurückgegeben. +3. Nachdem der Aufruf an den Logikvertrag weitergeleitet wurde, werden die vom Logikvertrag zurückgegebenen Daten abgerufen und an den Benutzer zurückgegeben. -Die Verwendung der Proxy-Muster erfordert ein Verständnis der **delegatecall**-Funktion. Im Grunde ist `delegatecall` ein Opcode, der es einem Vertrag ermöglicht, einen anderen Vertrag aufzurufen, während die eigentliche Codeausführung im Kontext des aufrufenden Vertrags stattfindet. Eine Folge der Verwendung von `delegatecall` in Proxy-Mustern ist, dass der Proxy-Vertrag seinen Speicher liest und beschreibt und die im Logik-Vertrag gespeicherte Logik so ausführt, als würde er eine interne Funktion aufrufen. +Die Verwendung der Proxy-Muster erfordert ein Verständnis der Funktion **delegatecall**. Grundsätzlich ist `delegatecall` ein Opcode, der es einem Vertrag ermöglicht, einen anderen Vertrag aufzurufen, während die eigentliche Codeausführung im Kontext des aufrufenden Vertrags stattfindet. Eine Implikation der Verwendung von `delegatecall` in Proxy-Mustern ist, dass der Proxy-Vertrag in seinen Speicher liest und schreibt und die im Logikvertrag gespeicherte Logik ausführt, als würde er eine interne Funktion aufrufen. Aus der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries): -> _Es gibt eine spezielle Variante eines Nachrichtenaufrufs namens **delegatecall**, die mit einem Nachrichtenaufruf identisch ist, abgesehen davon, dass der Code an der Zieladresse im Kontext (d.h. an der Adresse) des aufrufenden Vertrags ausgeführt wird und `msg.sender` und `msg.value` ihre Werte nicht ändern._ _Dies bedeutet, dass ein Vertrag zur Laufzeit dynamisch Code von einer anderen Adresse laden kann._ Speicher, aktuelle Adresse und Guthaben beziehen sich weiterhin auf den aufrufenden Vertrag, nur der Code wird von der aufgerufenen Adresse übernommen._ +> _Es gibt eine spezielle Variante eines Nachrichtenaufrufs namens **delegatecall**, die mit einem Nachrichtenaufruf identisch ist, abgesehen von der Tatsache, dass der Code an der Zieladresse im Kontext (d. h. an der Adresse) des aufrufenden Vertrags ausgeführt wird und `msg.sender` sowie `msg.value` ihre Werte nicht ändern._ _Das bedeutet, dass ein Vertrag zur Laufzeit dynamisch Code von einer anderen Adresse laden kann. Speicher, aktuelle Adresse und Guthaben beziehen sich weiterhin auf den aufrufenden Vertrag, nur der Code wird von der aufgerufenen Adresse übernommen._ -Der Proxy-Vertrag weiß, dass er `delegatecall` aufrufen muss, wenn ein Benutzer eine Funktion aufruft, da er über eine eingebaute `fallback`-Funktion verfügt. In der Solidity-Programmierung wird die [Fallback-Funktion](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) ausgeführt, wenn ein Funktionsaufruf nicht mit den in einem Vertrag angegebenen Funktionen übereinstimmt. +Der Proxy-Vertrag weiß, dass er `delegatecall` aufrufen muss, wann immer ein Benutzer eine Funktion aufruft, da er eine eingebaute `fallback`-Funktion hat. In der Solidity-Programmierung wird die [Fallback-Funktion](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) ausgeführt, wenn ein Funktionsaufruf nicht mit den in einem Vertrag angegebenen Funktionen übereinstimmt. -Damit das Proxy-Muster funktioniert, muss eine benutzerdefinierte Fallback-Funktion verfasst werden, in der beschrieben wird, wie der Proxy-Vertrag mit Funktionsaufrufen umgehen soll, die er nicht unterstützt. In diesem Fall ist die Fallback-Funktion des Proxys so programmiert, dass sie einen Delegatecall initiiert und die Anfrage des Benutzers an die aktuelle Implementierung des Logikvertrags weiterleitet. +Damit das Proxy-Muster funktioniert, muss eine benutzerdefinierte Fallback-Funktion geschrieben werden, die angibt, wie der Proxy-Vertrag Funktionsaufrufe behandeln soll, die er nicht unterstützt. In diesem Fall ist die Fallback-Funktion des Proxys so programmiert, dass sie einen Delegatecall initiiert und die Anfrage des Benutzers an die aktuelle Implementierung des Logikvertrags umleitet. -Der Proxy-Vertrag ist standardmäßig unveränderlich, aber Logikverträge mit aktualisierter Geschäftslogik können neu erstellt werden. Für das Upgrade muss dann lediglich die Adresse des im Proxy-Vertrag referenzierten Logikvertrags geändert werden. +Der Proxy-Vertrag ist standardmäßig unveränderlich, aber es können neue Logikverträge mit aktualisierter Geschäftslogik erstellt werden. Die Durchführung des Upgrades besteht dann darin, die Adresse des im Proxy-Vertrag referenzierten Logikvertrags zu ändern. -Nachdem der Proxy-Vertrag auf einen neuen Logikvertrag verwiesen wurde, ändert sich der Code, der ausgeführt wird, wenn Benutzer die Funktion des Proxy-Vertrags aufrufen. Auf diese Weise können wir die Logik eines Vertrags aktualisieren, ohne die Benutzer aufzufordern, mit einem neuen Vertrag zu interagieren. +Indem der Proxy-Vertrag auf einen neuen Logikvertrag verweist, ändert sich der Code, der ausgeführt wird, wenn Benutzer die Funktion des Proxy-Vertrags aufrufen. Dies ermöglicht es uns, die Logik eines Vertrags zu aktualisieren, ohne die Benutzer aufzufordern, mit einem neuen Vertrag zu interagieren. -Proxy-Muster sind eine beliebte Methode für das Aktualisieren von Smart Contracts, da sie die mit der Vertragsmigration verbundenen Schwierigkeiten beseitigen. Proxy-Muster sind jedoch komplizierter in der Anwendung und können bei unsachgemäßer Verwendung kritische Fehler wie [Konflikte bei Funktionsselektoren](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357) verursachen. +Proxy-Muster sind eine beliebte Methode zur Aktualisierung von Smart Contracts, da sie die mit der Vertragsmigration verbundenen Schwierigkeiten beseitigen. Proxy-Muster sind jedoch komplizierter zu verwenden und können bei unsachgemäßer Verwendung kritische Fehler einführen, wie z. B. [Kollisionen von Funktionsselektoren](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357). -[Mehr über Proxy-Muster](https://blog.openzeppelin.com/proxy-patterns/). +[Mehr zu Proxy-Mustern](https://blog.openzeppelin.com/proxy-patterns/). ### Upgrade-Mechanismus #4: Strategiemuster {#strategy-pattern} -Diese Technik ist vom [Strategiemuster](https://en.wikipedia.org/wiki/Strategy_pattern) beeinflusst. Es fördert die Erstellung von Softwareprogrammen, die sich mit anderen Programmen verbinden, um bestimmte Funktionen zu implementieren. Die Anwendung von Strategiemustern auf die Ethereum-Entwicklung würde bedeuten, dass ein Smart Contract erstellt wird, der Funktionen aus anderen Verträgen abruft. +Diese Technik ist vom [Strategiemuster](https://en.wikipedia.org/wiki/Strategy_pattern) beeinflusst, das die Erstellung von Softwareprogrammen fördert, die mit anderen Programmen interagieren, um bestimmte Funktionen zu implementieren. Die Anwendung des Strategiemusters auf die Ethereum-Entwicklung würde bedeuten, einen Smart Contract zu erstellen, der Funktionen aus anderen Verträgen aufruft. -Der Hauptvertrag enthält in diesem Fall die zentrale Geschäftslogik, verfügt aber über Schnittstellen zu anderen Smart Contracts („Satellitenverträgen“), um bestimmte Funktionen auszuführen. Dieser Hauptvertrag speichert ebenfalls die Adresse für jeden Satellitenvertrag und kann zwischen verschiedenen Implementierungen des Satellitenvertrags wechseln. +Der Hauptvertrag enthält in diesem Fall die Kerngeschäftslogik, interagiert jedoch mit anderen Smart Contracts („Satellitenverträgen“), um bestimmte Funktionen auszuführen. Dieser Hauptvertrag speichert auch die Adresse für jeden Satellitenvertrag und kann zwischen verschiedenen Implementierungen des Satellitenvertrags wechseln. -Sie können einen neuen Satellitenvertrag erstellen und den Hauptvertrag mit der neuen Adresse konfigurieren. Dies ermöglicht es Ihnen, _Strategien_ (d. h. eine neue Logik implementieren) für einen Smart Contract zu ändern. +Sie können einen neuen Satellitenvertrag erstellen und den Hauptvertrag mit der neuen Adresse konfigurieren. Dies ermöglicht es Ihnen, _Strategien_ (d. h. neue Logik zu implementieren) für einen Smart Contract zu ändern. -Obwohl das Strategiemuster dem zuvor besprochenen Proxy-Muster ähnelt, unterscheidet es sich von diesem, weil der Hauptvertrag, mit dem die Benutzer interagieren, die Geschäftslogik enthält. Die Verwendung dieses Musters bietet Ihnen die Möglichkeit, begrenzte Änderungen an einem Smart Contract vorzunehmen, ohne die Kerninfrastruktur zu beeinträchtigen. +Obwohl es dem zuvor besprochenen Proxy-Muster ähnlich ist, unterscheidet sich das Strategiemuster, da der Hauptvertrag, mit dem die Benutzer interagieren, die Geschäftslogik enthält. Die Verwendung dieses Musters bietet Ihnen die Möglichkeit, begrenzte Änderungen an einem Smart Contract vorzunehmen, ohne die Kerninfrastruktur zu beeinträchtigen. -Der größte Nachteil ist, dass sich dieses Muster hauptsächlich für die Einführung kleinerer Upgrades eignet. Auch können Sie diese Upgrade-Methode bei einem (z. B. durch einen Hack) kompromittierten Hauptvertrag nicht verwenden. +Der Hauptnachteil besteht darin, dass dieses Muster hauptsächlich für die Einführung kleinerer Upgrades nützlich ist. Wenn der Hauptvertrag kompromittiert wird (z. B. durch einen Hack), können Sie diese Upgrade-Methode außerdem nicht verwenden. ### Upgrade-Mechanismus #5: Diamond-Muster {#diamond-pattern} -Das Diamond-Muster kann als eine Verbesserung des Proxy-Musters angesehen werden. Diamond-Muster unterscheiden sich von Proxy-Mustern, da der Diamond-Proxy-Vertrag Funktionsaufrufe an mehr als einen Logikvertrag delegieren kann. +Das Diamond-Muster kann als Verbesserung des Proxy-Musters angesehen werden. Diamond-Muster unterscheiden sich von Proxy-Mustern, da der Diamond-Proxy-Vertrag Funktionsaufrufe an mehr als einen Logikvertrag delegieren kann. -Die Logik-Verträge im Diamond-Muster werden als _Facets_ bezeichnet. Damit das Diamond-Muster funktioniert, müssen Sie im Proxy-Vertrag ein Mapping erstellen, das [Funktionsselektoren](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) verschiedenen Facet-Adressen zuordnet. +Die Logikverträge im Diamond-Muster werden als _Facetten_ bezeichnet. Damit das Diamond-Muster funktioniert, müssen Sie im Proxy-Vertrag eine Zuordnung erstellen, die [Funktionsselektoren](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) verschiedenen Facettenadressen zuordnet. -Wenn ein Benutzer eine Funktion aufruft, prüft der Proxy-Vertrag die Zuordnung, um die Facet zu finden, die für die Ausführung dieser Funktion zuständig ist. Dann ruft es `delegatecall` (mithilfe der Fallback-Funktion) auf und leitet den Aufruf an den entsprechenden Logik-Vertrag weiter. +Wenn ein Benutzer einen Funktionsaufruf tätigt, überprüft der Proxy-Vertrag die Zuordnung, um die Facette zu finden, die für die Ausführung dieser Funktion verantwortlich ist. Dann ruft er `delegatecall` auf (unter Verwendung der Fallback-Funktion) und leitet den Aufruf an den entsprechenden Logikvertrag weiter. -Das Diamond-Upgrade-Muster hat einige Vorteile gegenüber konventionellen Proxy-Upgrade-Mustern: +Das Diamond-Upgrade-Muster hat einige Vorteile gegenüber herkömmlichen Proxy-Upgrade-Mustern: -1. Damit können Sie einen kleinen Teil des Vertrags aktualisieren, ohne den gesamten Code zu ändern. Die Verwendung des Proxy-Musters für Upgrades setzt die Erstellung eines völlig neuen Logikvertrags voraus, selbst für kleinere Upgrades. +1. Es ermöglicht Ihnen, einen kleinen Teil des Vertrags zu aktualisieren, ohne den gesamten Code zu ändern. Die Verwendung des Proxy-Musters für Upgrades erfordert die Erstellung eines völlig neuen Logikvertrags, selbst für kleinere Upgrades. -2. Alle Smart Contracts (einschließlich Logikverträge, die im Proxy-Muster verwendet werden) unterliegen einer Größenbeschränkung von 24 KB, was vor allem bei komplexen Verträgen, für die mehr Funktionen erforderlich sind, eine Einschränkung darstellen kann. Mit dem Diamond-Muster lässt sich dieses Problem leicht lösen, indem Funktionen auf mehrere Logikverträge aufgeteilt werden. +2. Alle Smart Contracts (einschließlich der in Proxy-Mustern verwendeten Logikverträge) haben ein Größenlimit von 24 KB, was eine Einschränkung darstellen kann – insbesondere für komplexe Verträge, die mehr Funktionen erfordern. Das Diamond-Muster macht es einfach, dieses Problem zu lösen, indem Funktionen auf mehrere Logikverträge aufgeteilt werden. -3. Proxy-Muster verfolgen bei der Zugangskontrolle einen allumfassenden Ansatz. Eine Entität mit Zugriff auf Upgrade-Funktionen kann den _gesamten_ Vertrag ändern. Das Diamond-Muster ermöglicht jedoch einen modularen Berechtigungsansatz, bei dem Sie Entitäten darauf beschränken können, bestimmte Funktionen innerhalb eines Smart Contracts zu aktualisieren. +3. Proxy-Muster verfolgen einen pauschalen Ansatz für Zugriffskontrollen. Eine Entität mit Zugriff auf Upgrade-Funktionen kann den _gesamten_ Vertrag ändern. Das Diamond-Muster ermöglicht jedoch einen modularen Berechtigungsansatz, bei dem Sie Entitäten darauf beschränken können, nur bestimmte Funktionen innerhalb eines Smart Contracts zu aktualisieren. -[Mehr über das Diamond-Muster](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). +[Mehr zum Diamond-Muster](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). ## Vor- und Nachteile der Aktualisierung von Smart Contracts {#pros-and-cons-of-upgrading-smart-contracts} -| Pro | Nachteile | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Ein Smart-Contract-Upgrade kann die Behebung von Schwachstellen erleichtern, die in der Phase nach der Veröffentlichung entdeckt werden. | Das Aktualisieren von Smart Contracts negiert die Idee der Unveränderlichkeit des Codes, was Auswirkungen auf die Dezentralisierung und Sicherheit hat. | -| Entwickler können mit Logik-Upgrades neue Funktionen zu dezentralen Anwendungen hinzufügen. | Die Benutzer müssen darauf vertrauen, dass die Entwickler Smart Contracts nicht willkürlich verändern. | -| Upgrades für Smart Contracts können die Sicherheit für die Endbenutzer erhöhen, da sich Bugs damit schnell beheben lassen. | Die Programmierung von Upgrade-Funktionalitäten in Smart Contracts fügt eine weitere Komplexitätsebene hinzu und erhöht die Möglichkeit kritischer Fehler. | -| Vertrags-Upgrades geben Entwicklern mehr Raum, um mit verschiedenen Funktionen zu experimentieren und DApps im Laufe der Zeit zu verbessern. | Die Möglichkeit, Smart Contracts zu aktualisieren, könnte Entwickler dazu verleiten, Projekte schneller zu starten, ohne in der Entwicklungsphase eine Due-Diligence-Prüfung durchzuführen. | -| | Eine unsichere Zugriffskontrolle oder Zentralisierung in Smart Contracts kann es böswilligen Akteuren erleichtern, nicht autorisierte Upgrades durchzuführen. | +| Vorteile | Nachteile | +| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Ein Smart-Contract-Upgrade kann es einfacher machen, Schwachstellen zu beheben, die in der Phase nach der Bereitstellung entdeckt wurden. | Die Aktualisierung von Smart Contracts negiert die Idee der Code-Unveränderlichkeit, was Auswirkungen auf Dezentralisierung und Sicherheit hat. | +| Entwickler können Logik-Upgrades verwenden, um dezentralisierten Anwendungen neue Funktionen hinzuzufügen. | Benutzer müssen darauf vertrauen, dass Entwickler Smart Contracts nicht willkürlich ändern. | +| Smart-Contract-Upgrades können die Sicherheit für Endbenutzer verbessern, da Fehler schnell behoben werden können. | Die Programmierung von Upgrade-Funktionen in Smart Contracts fügt eine weitere Komplexitätsebene hinzu und erhöht die Möglichkeit kritischer Fehler. | +| Vertrags-Upgrades geben Entwicklern mehr Spielraum, um mit verschiedenen Funktionen zu experimentieren und Dapps im Laufe der Zeit zu verbessern. | Die Möglichkeit, Smart Contracts zu aktualisieren, kann Entwickler dazu ermutigen, Projekte schneller zu starten, ohne während der Entwicklungsphase die gebotene Sorgfalt walten zu lassen. | +| | Unsichere Zugriffskontrolle oder Zentralisierung in Smart Contracts können es böswilligen Akteuren erleichtern, unbefugte Upgrades durchzuführen. | ## Überlegungen zur Aktualisierung von Smart Contracts {#considerations-for-upgrading-smart-contracts} -1. Benutzen Sie sichere Zugriffskontroll-/Autorisierungsmechanismen, um unbefugte Smart-Contract-Upgrades zu verhindern, insbesondere bei Verwendung von Proxy-Mustern, Strategiemustern oder Datentrennung. Ein Beispiel ist die Einschränkung des Zugriffs auf die Upgrade-Funktion, sodass nur der Eigentümer des Vertrags sie aufrufen kann. +1. Verwenden Sie sichere Zugriffskontroll-/Autorisierungsmechanismen, um unbefugte Smart-Contract-Upgrades zu verhindern, insbesondere bei der Verwendung von Proxy-Mustern, Strategiemustern oder Datentrennung. Ein Beispiel ist die Beschränkung des Zugriffs auf die Upgrade-Funktion, sodass nur der Eigentümer des Vertrags sie aufrufen kann. -2. Die Aktualisierung von Smart Contracts ist ein komplexer Vorgang und erfordert ein hohes Maß an Sorgfalt, um die Einführung von Schwachstellen zu verhindern. +2. Die Aktualisierung von Smart Contracts ist eine komplexe Aktivität und erfordert ein hohes Maß an Sorgfalt, um die Einführung von Schwachstellen zu verhindern. -3. Verringern Sie Vertrauensannahmen, indem Sie den Prozess der Implementierung von Upgrades dezentralisieren. Mögliche Strategien sind die Verwendung eines [Multi-Sig-Wallet-Vertrags](/developers/docs/smart-contracts/#multisig) zur Steuerung von Upgrades oder die Aufforderung an [Mitglieder einer DAO](/dao/), über die Genehmigung des Upgrades abzustimmen. +3. Reduzieren Sie Vertrauensannahmen, indem Sie den Prozess der Implementierung von Upgrades dezentralisieren. Mögliche Strategien umfassen die Verwendung eines [Mehrfachsignatur-Wallet-Vertrags](/developers/docs/smart-contracts/#multisig) zur Steuerung von Upgrades oder die Anforderung, dass [Mitglieder einer DAO](/dao/) über die Genehmigung des Upgrades abstimmen. -4. Seien Sie sich der Kosten bewusst, die mit der Aktualisierung von Verträgen verbunden sind. So kann beispielsweise das Kopieren von Zuständen (z. B. Benutzerguthaben) von einem alten auf einen neuen Vertrag während der Vertragsmigration mehr als eine Transaktion erfordern, was zu höheren Gasgebühren führt. +4. Seien Sie sich der Kosten bewusst, die mit der Aktualisierung von Verträgen verbunden sind. Beispielsweise kann das Kopieren des Zustands (z. B. Benutzerguthaben) von einem alten Vertrag in einen neuen Vertrag während der Vertragsmigration mehr als eine Transaktion erfordern, was mehr Gasgebühren bedeutet. -5. Erwägen Sie die Implementierung von **Timelocks**, um Benutzer zu schützen. Ein Timelock bezieht sich auf eine Verzögerung, die bei Änderungen an einem System erzwungen wird. Timelocks können mit einem Multi-Sig-Verwaltungssystem kombiniert werden, um die Upgrades zu kontrollieren: Erreicht eine vorgeschlagene Aktion den erforderlichen Schwellenwert für die Genehmigung, wird sie erst nach Ablauf der vordefinierten Verzögerungszeit ausgeführt. +5. Erwägen Sie die Implementierung von **Timelocks**, um Benutzer zu schützen. Ein Timelock bezieht sich auf eine erzwungene Verzögerung bei Änderungen an einem System. Timelocks können mit einem Mehrfachsignatur-Governance-System kombiniert werden, um Upgrades zu steuern: Wenn eine vorgeschlagene Aktion den erforderlichen Genehmigungsschwellenwert erreicht, wird sie erst ausgeführt, wenn die vordefinierte Verzögerungszeit abgelaufen ist. -Timelocks geben den Benutzern eine gewisse Zeitspanne, um das System zu verlassen, wenn sie mit einer vorgeschlagenen Änderung nicht einverstanden sind (z. B. mit einem Logik-Upgrade oder neuen Gebührenregelungen). Ohne Timelocks müssen die Benutzer darauf vertrauen, dass die Entwickler keine willkürlichen Änderungen an einem Smart Contract ohne vorherige Ankündigung vornehmen. Der Nachteil dabei ist, dass die Möglichkeit, Schwachstellen schnell zu beheben, durch die Timelocks eingeschränkt wird. +Timelocks geben Benutzern etwas Zeit, das System zu verlassen, wenn sie mit einer vorgeschlagenen Änderung (z. B. Logik-Upgrade oder neue Gebührenmodelle) nicht einverstanden sind. Ohne Timelocks müssen Benutzer darauf vertrauen, dass Entwickler keine willkürlichen Änderungen an einem Smart Contract ohne vorherige Ankündigung vornehmen. Der Nachteil hierbei ist, dass Timelocks die Fähigkeit einschränken, Schwachstellen schnell zu beheben. ## Ressourcen {#resources} -**OpenZeppelin Upgrades Plugins - _Eine Suite von Tools für die Bereitstellung und Absicherung von aktualisierbaren Smart Contracts._** +**OpenZeppelin Upgrades Plugins – _Eine Suite von Tools zur Bereitstellung und Sicherung aktualisierbarer Smart Contracts._** - [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades) - [Dokumentation](https://docs.openzeppelin.com/upgrades) ## Tutorials {#tutorials} -- [Upgrading your Smart Contracts | YouTube-Tutorial](https://www.youtube.com/watch?v=bdXJmWajZRY) von Patrick Collins +- [Upgrading your Smart Contracts | YouTube Tutorial](https://www.youtube.com/watch?v=bdXJmWajZRY) von Patrick Collins - [Ethereum Smart Contract Migration Tutorial](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) von Austin Griffith - [Using the UUPS proxy pattern to upgrade smart contracts](https://blog.logrocket.com/author/praneshas/) von Pranesh A.S - [Web3 Tutorial: Write upgradeable smart contract (proxy) using OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) von fangjun.eth -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [The State of Smart Contract Upgrades](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) von Santiago Palladino - [Multiple ways to upgrade a Solidity smart contract](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) – Crypto Market Pool Blog - [Learn: Upgrading Smart Contracts](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) – OpenZeppelin Docs - [Proxy Patterns For Upgradeability Of Solidity Contracts: Transparent vs UUPS Proxies](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) von Naveen Sahu -- [How Diamond Upgrades Work](https://dev.to/mudgen/how-diamond-upgrades-work-417j) von Nick Mudge +- [How Diamond Upgrades Work](https://dev.to/mudgen/how-diamond-upgrades-work-417j) von Nick Mudge \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md index 5850e50bc97..4ade35bbc6c 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md @@ -1,113 +1,113 @@ --- -title: "Überprüfen von Smart Contracts" -description: "Eine Übersicht über die Quellcodeverifizierung für Ethereum-Smart-Contracts" +title: Verifizierung von Smart Contracts +description: "Ein Überblick über die Quellcode-Verifizierung für Ethereum-Smart-Contracts" lang: de --- -[Smart Contracts](/developers/docs/smart-contracts/) sind so konzipiert, dass sie „vertrauenslos“ sind. Das bedeutet, Benutzer müssen Dritten (z. B. Entwicklern und Unternehmen) nicht vertrauen, bevor sie mit einem Vertrag interagieren. Die Voraussetzung für Vertrauenslosigkeit ist, dass die Benutzer und andere Entwickler in der Lage sein müssen, den Quellcode eines Smart Contracts zu verifizieren. Nach der Quellcodeverifizierung können Benutzer und Entwicklern sicher sein, dass der veröffentlichte Vertragscode derselbe Code ist, der unter dieser Vertragsaddresse auf der Ethereum-Blockchain läuft. +[Smart Contracts](/developers/docs/smart-contracts/) sind so konzipiert, dass sie „vertrauenslos“ (trustless) sind, was bedeutet, dass Benutzer keinen Dritten (z. B. Entwicklern und Unternehmen) vertrauen müssen, bevor sie mit einem Vertrag interagieren. Als Voraussetzung für diese Vertrauenslosigkeit müssen Benutzer und andere Entwickler in der Lage sein, den Quellcode eines Smart Contracts zu verifizieren. Die Quellcode-Verifizierung versichert Benutzern und Entwicklern, dass der veröffentlichte Vertragscode derselbe Code ist, der an der Vertragsadresse auf der Ethereum-Blockchain ausgeführt wird. -Es ist wichtig, zwischen „Quellcode-Verifizierung“ und „[formaler Verifizierung](/developers/docs/smart-contracts/formal-verification/)“ zu unterscheiden. Quellcode-Verifizierung, die im Folgenden näher erläutert wird, bedeutet die Überprüfung, ob der angegebene Quellcode eines Smart Contracts in einer Hochsprache (z. B. Solidity) zu demselben Bytecode kompiliert wird, der an der Vertragsadresse ausgeführt werden soll. Die formale Verifizierung bezieht sich hingegen darauf, die Korrektheit eines Smart Contracts zu verifizieren und sagen zu können, dass der Contract sich wie erwartet verhält. Obwohl die Vertragsverifizierung kontextbezogen ist, bezieht sie sich meistens auf die Quellcodeverifizierung. +Es ist wichtig, zwischen „Quellcode-Verifizierung“ und „[formaler Verifizierung](/developers/docs/smart-contracts/formal-verification/)“ zu unterscheiden. Die Quellcode-Verifizierung, die im Folgenden detailliert erklärt wird, bezieht sich auf die Überprüfung, ob der gegebene Quellcode eines Smart Contracts in einer Hochsprache (z. B. Solidity) zu demselben Bytecode kompiliert wird, der an der Vertragsadresse ausgeführt werden soll. Die formale Verifizierung beschreibt jedoch die Überprüfung der Korrektheit eines Smart Contracts, was bedeutet, dass sich der Vertrag wie erwartet verhält. Obwohl kontextabhängig, bezieht sich die Vertragsverifizierung in der Regel auf die Quellcode-Verifizierung. -## Was ist Quellcodeverifizierung? {#what-is-source-code-verification} +## Was ist Quellcode-Verifizierung? {#what-is-source-code-verification} -Bevor ein Smart Contract in der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) bereitgestellt wird, [kompilieren](/developers/docs/smart-contracts/compiling/) Entwickler den Quellcode des Vertrags – Anweisungen, die [in Solidity geschrieben](/developers/docs/smart-contracts/languages/) oder in einer anderen High-Level-Programmiersprache verfasst sind – zu Bytecode. Die Kompilierung von Quellcode in Bytecode (z. B. Low-Level, Maschinenanweisungen) ist notwendig, um die Vertragslogik in der EVM auszuführen, da die EVM keine High-Level-Anweisungen interpretieren kann. +Vor der Bereitstellung eines Smart Contracts in der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) [kompilieren](/developers/docs/smart-contracts/compiling/) Entwickler den Quellcode des Vertrags – Anweisungen, die [in Solidity](/developers/docs/smart-contracts/languages/) oder einer anderen höheren Programmiersprache geschrieben sind – in Bytecode. Da die EVM keine High-Level-Anweisungen interpretieren kann, ist das Kompilieren von Quellcode in Bytecode (d. h. Low-Level-Maschinenanweisungen) für die Ausführung der Vertragslogik in der EVM erforderlich. -Die Quellcodeverifizierung besteht nun darin, den Quellcode eines Smart Contracts mit dem während der Vertragserstellung genutzten, kompilierten Bytecode zu vergleichen, um Unterschiede festzustellen. Die Verifizierung von Smart Contracts ist wichtig, da sich der angegebene Vertragscode von dem Code, der auf der Blockchain läuft, unterscheiden könnte. +Bei der Quellcode-Verifizierung werden der Quellcode eines Smart Contracts und der kompilierte Bytecode, der während der Vertragserstellung verwendet wurde, verglichen, um eventuelle Unterschiede zu erkennen. Die Verifizierung von Smart Contracts ist wichtig, da der beworbene Vertragscode von dem abweichen kann, was auf der Blockchain ausgeführt wird. -Die Verifizierung von Smart Contracts macht es möglich, mithilfe der High-Level-Sprache, in der ein Vertrag verfasst wurde, zu untersuchen, was dieser wirklich tut, ohne den dazugehörigen Maschinencode lesen zu müssen. Funktionen, Werte und in der Regel die Variablennamen und Kommentare bleiben beim kompilierten und veröffentlichten originalen Quellcode identisch. Dies erleichtert es deutlich, den Code zu lesen. Die Quellcodeverifizierung leitet außerdem die Codedokumentation in die Wege, mit der die Endbenutzer prüfen können, was der Zweck eines bestimmten Smart Contracts ist. +Die Verifizierung von Smart Contracts ermöglicht es, durch die höhere Sprache, in der er geschrieben ist, zu untersuchen, was ein Vertrag tut, ohne Maschinencode lesen zu müssen. Funktionen, Werte und in der Regel die Variablennamen und Kommentare bleiben mit dem ursprünglichen Quellcode, der kompiliert und bereitgestellt wird, identisch. Dies macht das Lesen von Code viel einfacher. Die Quellcode-Verifizierung sorgt auch für die Codedokumentation, sodass Endbenutzer wissen, wofür ein Smart Contract entwickelt wurde. -### Was ist eine vollständige Verifizierung? Vollständige Verifizierung {#full-verification} +### Was ist eine vollständige Verifizierung? {#full-verification} -Einige Teil des Quellcodes, wie Kommentare oder Variablennamen, haben keinen Einfluss auf den kompilierten Bytecode. Daraus folgt, dass zwei Quellcodes mit unterschiedlichen Variablennamen und unterschiedlichen Kommentaren dennoch in der Lage wären, denselben Vertrag zu verifizieren. Auf diese Weise könnten Personen mit bösartigen Absichten täuschende Kommentare schreiben oder irreführende Variablennamen im Quellcode angeben und dafür sorgen, dass der Vertrag mit einem anderen Quellcode als im Originalvertrag verifiziert wird. +Es gibt einige Teile des Quellcodes, die den kompilierten Bytecode nicht beeinflussen, wie z. B. Kommentare oder Variablennamen. Das bedeutet, dass zwei Quellcodes mit unterschiedlichen Variablennamen und unterschiedlichen Kommentaren beide in der Lage wären, denselben Vertrag zu verifizieren. Damit kann ein böswilliger Akteur täuschende Kommentare hinzufügen oder irreführende Variablennamen im Quellcode vergeben und den Vertrag mit einem anderen Quellcode als dem ursprünglichen Quellcode verifizieren lassen. -Dies lässt sich vermeiden, indem man zusätzliche Daten an den Bytecode anhängt, die als _kryptografische Garantie_ für die Genauigkeit des Quellcodes und als _Fingerabdruck_ der Kompilierungsinformationen dienen. Die notwendigen Informationen finden sich in den [Vertragsmetadaten von Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), und der Hash dieser Datei wird an den Bytecode eines Vertrags angehängt. Sie können es in der [Metadaten-Playground](https://playground.sourcify.dev) in Aktion sehen. +Es ist möglich, dies zu vermeiden, indem dem Bytecode zusätzliche Daten angehängt werden, die als _kryptografische Garantie_ für die Genauigkeit des Quellcodes und als _Fingerabdruck_ der Kompilierungsinformationen dienen. Die notwendigen Informationen finden sich in den [Vertragsmetadaten von Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), und der Hash dieser Datei wird an den Bytecode eines Vertrags angehängt. Sie können dies im [Metadaten-Playground](https://playground.sourcify.dev) in Aktion sehen. -Die Metadatendatei enthält Informationen über die Kompilierung des Vertrags, einschließlich der Quelldateien und ihrer Hashes. Das bedeutet, dass sich die Metadatendatei ändert, wenn sich eine der Kompilierungseinstellungen oder auch nur ein einzelnes Byte in einer der Quelldateien ändert. Folglich ändert sich auch der Hash der Metadatendatei, der an den Bytecode angehängt ist. Das bedeutet: Wenn der Bytecode eines Vertrags plus der angehängte Metadaten-Hash mit dem angegebenen Quellcode und den Kompilierungseinstellungen übereinstimmt, können wir sicher sein, dass es sich um genau denselben Quellcode handelt, der schon bei der ursprünglichen Kompilierung verwendet wurde – kein einziges Byte unterscheidet sich. +Die Metadatendatei enthält Informationen über die Kompilierung des Vertrags, einschließlich der Quelldateien und ihrer Hashes. Das heißt, wenn sich eine der Kompilierungseinstellungen oder auch nur ein Byte in einer der Quelldateien ändert, ändert sich die Metadatendatei. Folglich ändert sich auch der Hash der Metadatendatei, der an den Bytecode angehängt ist. Das bedeutet, wenn der Bytecode eines Vertrags + der angehängte Metadaten-Hash mit dem gegebenen Quellcode und den Kompilierungseinstellungen übereinstimmen, können wir sicher sein, dass dies genau derselbe Quellcode ist, der in der ursprünglichen Kompilierung verwendet wurde, nicht einmal ein einziges Byte ist anders. -Diese Art der Verifizierung, die den Metadaten-Hash nutzt, wird als **„[vollständige Verifizierung](https://docs.sourcify.dev/docs/full-vs-partial-match/)“** (auch „perfekte Verifizierung“) bezeichnet. Wenn die Metadaten-Hashes nicht übereinstimmen oder bei der Verifizierung nicht berücksichtigt werden, würde es sich um eine „partielle Übereinstimmung“ handeln, was die derzeit gebräuchlichere Methode zur Verifizierung von Verträgen ist. Es ist möglich, [bösartigen Code einzuschleusen](https://samczsun.com/hiding-in-plain-sight/), der ohne eine vollständige Verifizierung nicht im verifizierten Quellcode widergespiegelt würde. Die meisten Entwickler sind sich nicht bewusst, dass die vollständige Verifizierung existiert und bewahren die Metadatendatei ihrer Kompilierung nicht auf. Aus diesem Grund ist bisher die partielle Verifizierung die gängige Methode zur Vertragsverifizierung. +Diese Art der Verifizierung, die den Metadaten-Hash nutzt, wird als **„[vollständige Verifizierung](https://docs.sourcify.dev/docs/full-vs-partial-match/)“** (auch „perfekte Verifizierung“) bezeichnet. Wenn die Metadaten-Hashes nicht übereinstimmen oder bei der Verifizierung nicht berücksichtigt werden, handelt es sich um eine „teilweise Übereinstimmung“ (partial match), was derzeit die gängigere Methode zur Verifizierung von Verträgen ist. Es ist möglich, [bösartigen Code einzufügen](https://samczsun.com/hiding-in-plain-sight/), der sich ohne vollständige Verifizierung nicht im verifizierten Quellcode widerspiegeln würde. Die meisten Entwickler sind sich der vollständigen Verifizierung nicht bewusst und behalten die Metadatendatei ihrer Kompilierung nicht, weshalb die teilweise Verifizierung bisher die De-facto-Methode zur Verifizierung von Verträgen war. -## Warum ist die Quellcodeverifizierung wichtig? Wichtigkeit der Quellcode-Verifizierung {#importance-of-source-code-verification} +## Warum ist die Quellcode-Verifizierung wichtig? {#importance-of-source-code-verification} ### Vertrauenslosigkeit {#trustlessness} -Vertrauenslosigkeit ist wohl die wichtigste Voraussetzung für Smart Contracts und [dezentralisierte Anwendungen (Dapps)](/developers/docs/dapps/). Smart Contracts sind „unveränderlich“ und können nicht modifiziert werden; ein Vertrag führt nur die Geschäftslogik aus, die zum Zeitpunkt der Veröffentlichung im Code festgelegt wurde. Das bedeutet, dass Entwickler und Unternehmen den Code eines Vertrags nach dessen Veröffentlichung auf Ethereum nicht manipulieren können. +Vertrauenslosigkeit ist wohl die größte Prämisse für Smart Contracts und [dezentralisierte Anwendungen (Dapps)](/developers/docs/dapps/). Smart Contracts sind „unveränderlich“ und können nicht geändert werden; ein Vertrag führt nur die Geschäftslogik aus, die zum Zeitpunkt der Bereitstellung im Code definiert ist. Dies bedeutet, dass Entwickler und Unternehmen den Code eines Vertrags nach der Bereitstellung auf Ethereum nicht manipulieren können. -Damit ein Smart Contract vertrauenslos ist, sollte der Vertragscode für eine unabhängige Verifizierung verfügbar sein. Der kompilierte Bytecode ist zwar für jeden Smart Contract öffentlich auf der Blockchain verfügbar, die Low-Level-Sprache ist allerdings schwer verständlich – sowohl für Entwickler als auch für Benutzer. +Damit ein Smart Contract vertrauenslos ist, sollte der Vertragscode für eine unabhängige Verifizierung verfügbar sein. Während der kompilierte Bytecode für jeden Smart Contract öffentlich auf der Blockchain verfügbar ist, ist die Low-Level-Sprache schwer zu verstehen – sowohl für Entwickler als auch für Benutzer. -In Projekten werden Vertrauensannahmen durch die Veröffentlichung des Quellcodes der Verträge reduziert. Aber dies führt zu einem weiteren Problem: Die Verifizierung, dass der veröffentlichte Quellcode mit dem Bytecode des Vertrags übereinstimmt, ist schwierig. In diesem Szenario geht der Wert der Vertrauenslosigkeit verloren, da die Benutzer den Entwicklern vertrauen müssen, dass diese die Geschäftslogik eines Vertrags (z. B. durch Ändern des Bytecodes) vor der Veröffentlichung auf der Blockchain nicht ändern. +Projekte reduzieren Vertrauensannahmen, indem sie den Quellcode ihrer Verträge veröffentlichen. Dies führt jedoch zu einem weiteren Problem: Es ist schwierig zu überprüfen, ob der veröffentlichte Quellcode mit dem Vertrags-Bytecode übereinstimmt. In diesem Szenario geht der Wert der Vertrauenslosigkeit verloren, da Benutzer darauf vertrauen müssen, dass Entwickler die Geschäftslogik eines Vertrags nicht ändern (d. h. durch Ändern des Bytecodes), bevor sie ihn auf der Blockchain bereitstellen. -Quellcode-Verifizierungswerkzeuge bieten Garantien dafür, dass die Quellcodedateien eines Smart Contracts mit dem Assembly-Code übereinstimmen. Das Ergebnis ist ein vertrauensloses Ökosystem, in dem Benutzer nicht blind Dritten vertrauen, sondern den Code verifizieren, bevor sie Geldmittel in einen Vertrag einzahlen. +Tools zur Quellcode-Verifizierung bieten Garantien, dass die Quellcodedateien eines Smart Contracts mit dem Assembly-Code übereinstimmen. Das Ergebnis ist ein vertrauensloses Ökosystem, in dem Benutzer Dritten nicht blind vertrauen und stattdessen den Code verifizieren, bevor sie Gelder in einen Vertrag einzahlen. ### Benutzersicherheit {#user-safety} -Bei Smart Contracts steht oft eine Menge Geld auf dem Spiel. Das macht höhere Sicherheitsgarantien und eine Verifizierung der Logik eines Smart Contracts, bevor er verwendet wird, erforderlich. Das Problem ist, dass skrupellose Entwickler Benutzer täuschen können, indem sie bösartigen Code in einen Smart Contract einfügen. Ohne Verifizierung können bösartige Smart Contracts [Hintertüren](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), umstrittene Zugriffskontrollmechanismen, ausnutzbare Schwachstellen und andere Dinge enthalten, die die Benutzersicherheit gefährden und unentdeckt bleiben würden. +Bei Smart Contracts steht in der Regel viel Geld auf dem Spiel. Dies erfordert höhere Sicherheitsgarantien und die Überprüfung der Logik eines Smart Contracts vor dessen Verwendung. Das Problem ist, dass skrupellose Entwickler Benutzer täuschen können, indem sie bösartigen Code in einen Smart Contract einfügen. Ohne Verifizierung können bösartige Smart Contracts [Hintertüren](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), umstrittene Zugriffskontrollmechanismen, ausnutzbare Schwachstellen und andere Dinge aufweisen, die die Benutzersicherheit gefährden und unentdeckt bleiben würden. -Die Veröffentlichung der Quellcodedateien eines Smart Contracts erleichtert es Interessierten, wie zum Beispiel Auditoren, den Vertrag hinsichtlich potenzieller Angriffsvektoren zu bewerten. Wenn mehrere Parteien unabhängig voneinander einen Smart Contract verifizieren, bietet dies Benutzern stärkere Sicherheitsgarantien. +Die Veröffentlichung der Quellcodedateien eines Smart Contracts erleichtert es Interessierten, wie z. B. Prüfern (Auditors), den Vertrag auf potenzielle Angriffsvektoren zu bewerten. Wenn mehrere Parteien einen Smart Contract unabhängig voneinander verifizieren, haben Benutzer stärkere Garantien für seine Sicherheit. ## Wie man den Quellcode für Ethereum-Smart-Contracts verifiziert {#source-code-verification-for-ethereum-smart-contracts} -Das [Bereitstellen eines Smart Contracts auf Ethereum](/developers/docs/smart-contracts/deploying/) erfordert das Senden einer Transaktion mit einer Datennutzlast (kompilierter Bytecode) an eine spezielle Adresse. Die Datennutzlast wird durch das Kompilieren des Quellcodes generiert, zuzüglich der [Konstruktor-Argumente](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) der Vertragsinstanz, die an die Datennutzlast in der Transaktion angehängt werden. Die Kompilierung ist deterministisch, d. h. sie erzeugt immer die gleiche Ausgabe (d. h. den Bytecode des Vertrags), wenn die gleichen Quelldateien und Kompilierungseinstellungen (z. B. Compiler-Version, Optimizer) verwendet werden. +[Die Bereitstellung eines Smart Contracts auf Ethereum](/developers/docs/smart-contracts/deploying/) erfordert das Senden einer Transaktion mit einer Daten-Payload (kompilierter Bytecode) an eine spezielle Adresse. Die Daten-Payload wird durch Kompilieren des Quellcodes generiert, zuzüglich der [Konstruktorargumente](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) der Vertragsinstanz, die an die Daten-Payload in der Transaktion angehängt werden. Die Kompilierung ist deterministisch, was bedeutet, dass sie immer dieselbe Ausgabe (d. h. Vertrags-Bytecode) erzeugt, wenn dieselben Quelldateien und Kompilierungseinstellungen (z. B. Compiler-Version, Optimierer) verwendet werden. ![Ein Diagramm, das die Quellcode-Verifizierung von Smart Contracts zeigt](./source-code-verification.png) Die Verifizierung eines Smart Contracts umfasst im Wesentlichen die folgenden Schritte: -1. Die Quelldateien und Kompilierungseinstellungen in einen Compiler eingeben. +1. Eingabe der Quelldateien und Kompilierungseinstellungen in einen Compiler. 2. Der Compiler gibt den Bytecode des Vertrags aus. -3. Den Bytecode des veröffentlichten Vertrags an einer gegebenen Adresse abrufen. +3. Abrufen des Bytecodes des bereitgestellten Vertrags an einer bestimmten Adresse. -4. Den veröffentlichten Bytecode mit dem erneut kompilierten Bytecode vergleichen. Wenn die Codes übereinstimmen, wird der Vertrag mit dem Quellcode und den Kompilierungseinstellungen verifiziert, die angegeben wurden. +4. Vergleichen des bereitgestellten Bytecodes mit dem neu kompilierten Bytecode. Wenn die Codes übereinstimmen, wird der Vertrag mit dem gegebenen Quellcode und den Kompilierungseinstellungen verifiziert. -5. Wenn außerdem die Metadaten-Hashes am Ende des Bytecodes übereinstimmen, liegt eine vollständige Übereinstimmung vor. +5. Wenn zusätzlich die Metadaten-Hashes am Ende des Bytecodes übereinstimmen, handelt es sich um eine vollständige Übereinstimmung (Full Match). -Beachten Sie, dass dies eine vereinfachte Beschreibung der Verifizierung ist und es viele Ausnahmen gibt, die damit nicht funktionieren würden, wie z. B. [unveränderliche Variablen](https://docs.sourcify.dev/docs/immutables/). +Beachten Sie, dass dies eine vereinfachte Beschreibung der Verifizierung ist und es viele Ausnahmen gibt, die damit nicht funktionieren würden, wie z. B. das Vorhandensein von [unveränderlichen Variablen](https://docs.sourcify.dev/docs/immutables/). ## Tools zur Quellcode-Verifizierung {#source-code-verification-tools} -Der traditionelle Prozess zur Verifizierung von Verträgen kann komplex sein. Deshalb gibt es Werkzeuge zur Verifizierung des Quellcodes für auf Ethereum veröffentlichte Smart Contracts. Diese Werkzeuge automatisieren große Teile der Quellcodeverifizierung und kuratieren außerdem verifizierte Verträge zum Nutzen der Benutzer. +Der traditionelle Prozess der Verifizierung von Verträgen kann komplex sein. Aus diesem Grund gibt es Tools zur Verifizierung des Quellcodes für auf Ethereum bereitgestellte Smart Contracts. Diese Tools automatisieren große Teile der Quellcode-Verifizierung und kuratieren auch verifizierte Verträge zum Nutzen der Benutzer. ### Etherscan {#etherscan} -Obwohl Etherscan hauptsächlich als [Ethereum-Blockchain-Explorer](/developers/docs/data-and-analytics/block-explorers/) bekannt ist, bietet es auch einen [Dienst zur Quellcode-Verifizierung](https://etherscan.io/verifyContract) für Entwickler und Benutzer von Smart Contracts an. +Obwohl Etherscan hauptsächlich als [Ethereum-Blocksuchmaschine](/developers/docs/data-and-analytics/block-explorers/) bekannt ist, bietet es auch einen [Dienst zur Quellcode-Verifizierung](https://etherscan.io/verifyContract) für Entwickler und Benutzer von Smart Contracts an. -Etherscan macht es möglich, den Vertrags-Bytecode aus dem ursprünglichen Daten-Payload (Quellcode, Bibliotheksadresse, Kompilierungseinstellungen, Vertragsadresse usw.) neu zu kompilieren Wenn der neu kompilierte Bytecode mit dem Bytecode (und den Konstruktor-Parametern) des On-Chain-Vertrags verknüpft ist, dann ist [der Vertrag verifiziert](https://info.etherscan.com/types-of-contract-verification/). +Etherscan ermöglicht es Ihnen, den Vertrags-Bytecode aus der ursprünglichen Daten-Payload (Quellcode, Bibliotheksadresse, Compiler-Einstellungen, Vertragsadresse usw.) neu zu kompilieren. Wenn der neu kompilierte Bytecode mit dem Bytecode (und den Konstruktorparametern) des Vertrags auf der Blockchain verknüpft ist, dann [ist der Vertrag verifiziert](https://info.etherscan.com/types-of-contract-verification/). -Sobald der Vertrag verifiziert ist, erhält der Quellcode des Vertrags ein „Verified“-Label und wird auf Etherscan veröffentlicht, damit andere ihn prüfen können. Es wird auch dem Abschnitt [Verifizierte Verträge](https://etherscan.io/contractsVerified/) hinzugefügt – einem Repository von Smart Contracts mit verifizierten Quellcodes. +Sobald der Quellcode Ihres Vertrags verifiziert ist, erhält er das Label „Verified“ und wird auf Etherscan veröffentlicht, damit andere ihn prüfen können. Er wird auch dem Bereich [Verified Contracts](https://etherscan.io/contractsVerified/) hinzugefügt – einem Repository von Smart Contracts mit verifizierten Quellcodes. -Etherscan ist das am häufigsten verwendete Werkzeug zur Verifizierung von Verträgen. Die Vertragsverifizierung von Etherscan hat jedoch einen Nachteil: Der **Metadaten-Hash** des On-Chain-Bytecodes wird nicht mit dem des neu kompilierten Bytecodes verglichen. Daher sind die Übereinstimmungen bei Etherscan nur teilweise Übereinstimmungen. +Etherscan ist das am häufigsten verwendete Tool zur Verifizierung von Verträgen. Die Vertragsverifizierung von Etherscan hat jedoch einen Nachteil: Sie vergleicht den **Metadaten-Hash** des Bytecodes auf der Blockchain und des neu kompilierten Bytecodes nicht. Daher sind die Übereinstimmungen in Etherscan teilweise Übereinstimmungen (Partial Matches). [Mehr über die Verifizierung von Verträgen auf Etherscan](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327). ### Blockscout {#blockscout} -[Blockscout](https://blockscout.com/) ist ein Open-Source-Blockchain-Explorer, der auch einen [Dienst zur Vertragsverifizierung](https://eth.blockscout.com/contract-verification) für Entwickler und Benutzer von Smart Contracts anbietet. Als Open-Source-Alternative bietet Blockscout Transparenz bei der Durchführung der Verifizierung und ermöglicht Community-Beiträge zur Verbesserung des Verifizierungsprozesses. +[Blockscout](https://blockscout.com/) ist eine Open-Source-Blocksuchmaschine, die auch einen [Vertragsverifizierungsdienst](https://eth.blockscout.com/contract-verification) für Entwickler und Benutzer von Smart Contracts anbietet. Als Open-Source-Alternative bietet Blockscout Transparenz darüber, wie die Verifizierung durchgeführt wird, und ermöglicht Community-Beiträge zur Verbesserung des Verifizierungsprozesses. -Ähnlich wie andere Verifizierungsdienste ermöglicht Blockscout die Verifizierung des Quellcodes Ihres Vertrags, indem der Bytecode neu kompiliert und mit dem bereitgestellten Vertrag verglichen wird. Sobald Ihr Vertrag verifiziert ist, erhält er einen Verifizierungsstatus und der Quellcode wird für Audits und Interaktionen öffentlich zugänglich. Verifizierte Verträge werden auch im [Repository für verifizierte Verträge](https://eth.blockscout.com/verified-contracts) von Blockscout aufgelistet, um das Durchsuchen und Auffinden zu erleichtern. +Ähnlich wie bei anderen Verifizierungsdiensten können Sie mit Blockscout den Quellcode Ihres Vertrags verifizieren, indem Sie den Bytecode neu kompilieren und mit dem bereitgestellten Vertrag vergleichen. Sobald Ihr Vertrag verifiziert ist, erhält er den Verifizierungsstatus und der Quellcode wird öffentlich für Audits und Interaktionen zugänglich. Verifizierte Verträge werden auch im [Repository für verifizierte Verträge](https://eth.blockscout.com/verified-contracts) von Blockscout aufgelistet, um das Durchsuchen und Entdecken zu erleichtern. ### Sourcify {#sourcify} -[Sourcify](https://sourcify.dev/#/verifier) ist ein weiteres Tool zur Verifizierung von Verträgen, das Open-Source und dezentralisiert ist. Es ist kein Block-Explorer und verifiziert Verträge nur in [verschiedenen EVM-basierten Netzwerken](https://docs.sourcify.dev/docs/chains). Es fungiert als öffentliche Infrastruktur, auf der andere Tools aufbauen können, und zielt darauf ab, benutzerfreundlichere Vertragsinteraktionen unter Verwendung der [ABI](/developers/docs/smart-contracts/compiling/#web-applications)- und [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html)-Kommentare in der Metadatendatei zu ermöglichen. +[Sourcify](https://sourcify.dev/#/verifier) ist ein weiteres Tool zur Verifizierung von Verträgen, das Open Source und dezentralisiert ist. Es ist keine Blocksuchmaschine und verifiziert Verträge nur in [verschiedenen EVM-basierten Netzwerken](https://docs.sourcify.dev/docs/chains). Es fungiert als öffentliche Infrastruktur, auf der andere Tools aufbauen können, und zielt darauf ab, menschenfreundlichere Vertragsinteraktionen mithilfe der [ABI](/developers/docs/smart-contracts/compiling/#web-applications) und der [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html)-Kommentare zu ermöglichen, die in der Metadatendatei zu finden sind. -Im Gegensatz zu Etherscan unterstützt Sourcify vollständige Übereinstimmungen mit dem Metadaten-Hash. Die verifizierten Verträge werden in seinem [öffentlichen Repository](https://docs.sourcify.dev/docs/repository/) über HTTP und [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs), einem dezentralen, [inhaltsadressierten](https://docs.storacha.network/concepts/content-addressing/) Speicher, bereitgestellt. Dies ermöglicht das Abrufen der Metadatendatei eines Vertrags über IPFS, da der angehängte Metadaten-Hash ein IPFS-Hash ist. +Im Gegensatz zu Etherscan unterstützt Sourcify vollständige Übereinstimmungen (Full Matches) mit dem Metadaten-Hash. Die verifizierten Verträge werden in seinem [öffentlichen Repository](https://docs.sourcify.dev/docs/repository/) über HTTP und [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs) bereitgestellt, was ein dezentralisierter, [inhaltsadressierter](https://docs.storacha.network/concepts/content-addressing/) Speicher ist. Dies ermöglicht das Abrufen der Metadatendatei eines Vertrags über IPFS, da der angehängte Metadaten-Hash ein IPFS-Hash ist. -Darüber hinaus kann auch auf die Quellcodedateien über IPFS zugegriffen werden, da IPFS-Hashes dieser Dateien ebenfalls in den Metadaten enthalten sind. Ein Vertrag kann durch die Bereitstellung der Metadatendatei und der Quelldateien über seine API, die [UI](https://sourcify.dev/#/verifier) oder durch die Verwendung der Plugins verifiziert werden. Das Sourcify-Überwachungstool achtet auch auf Vertragserstellungen in neuen Blöcken und versucht, die Verträge zu verifizieren, wenn deren Metadaten und Quelldateien auf IPFS veröffentlicht wurden. +Zusätzlich kann man auch die Quellcodedateien über IPFS abrufen, da IPFS-Hashes dieser Dateien ebenfalls in den Metadaten zu finden sind. Ein Vertrag kann verifiziert werden, indem die Metadatendatei und die Quelldateien über seine API oder die [Benutzeroberfläche (UI)](https://sourcify.dev/#/verifier) bereitgestellt werden, oder durch die Verwendung der Plugins. Das Sourcify-Überwachungstool lauscht auch auf Vertragserstellungen in neuen Blöcken und versucht, die Verträge zu verifizieren, wenn ihre Metadaten und Quelldateien auf IPFS veröffentlicht sind. [Mehr über die Verifizierung von Verträgen auf Sourcify](https://soliditylang.org/blog/2020/06/25/sourcify-faq/). ### Tenderly {#tenderly} -Die [Tenderly-Plattform](https://tenderly.co/) ermöglicht es Web3-Entwicklern, Smart Contracts zu erstellen, zu testen, zu überwachen und zu betreiben. Tenderly kombiniert Debugging-Werkzeuge mit Beobachtungs- und Infrastrukturbausteinen und hilft Entwicklern so dabei, die Entwicklung von Smart Contracts zu beschleunigen. Um die Tenderly-Funktionen vollständig zu aktivieren, müssen Entwickler eine [Quellcode-Verifizierung](https://docs.tenderly.co/monitoring/contract-verification) mit verschiedenen Methoden durchführen. +Die [Tenderly-Plattform](https://tenderly.co/) ermöglicht es Web3-Entwicklern, Smart Contracts zu erstellen, zu testen, zu überwachen und zu betreiben. Durch die Kombination von Debugging-Tools mit Beobachtbarkeit und Infrastrukturbausteinen hilft Tenderly Entwicklern, die Entwicklung von Smart Contracts zu beschleunigen. Um die Funktionen von Tenderly vollständig nutzen zu können, müssen Entwickler [eine Quellcode-Verifizierung durchführen](https://docs.tenderly.co/monitoring/contract-verification), wofür verschiedene Methoden zur Verfügung stehen. -Es ist möglich, einen Vertrag privat oder öffentlich zu verifizieren. Wenn der Vertrag privat verifiziert wird, ist er nur für Sie (und andere Mitglieder Ihres Projekts) sichtbar. Eine öffentliche Verifizierung hat zur Folge, dass der Vertrag für alle Benutzer der Tenderly-Plattform sichtbar ist. +Es ist möglich, einen Vertrag privat oder öffentlich zu verifizieren. Wenn er privat verifiziert wird, ist der Smart Contract nur für Sie (und andere Mitglieder in Ihrem Projekt) sichtbar. Die öffentliche Verifizierung eines Vertrags macht ihn für jeden sichtbar, der die Tenderly-Plattform nutzt. Sie können Ihre Verträge über das [Dashboard](https://docs.tenderly.co/contract-verification), das [Tenderly Hardhat-Plugin](https://docs.tenderly.co/contract-verification/hardhat) oder die [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli) verifizieren. -Bei der Verifizierung von Verträgen über das Dashboard müssen Sie die Quelldatei oder die vom Solidity-Compiler erzeugte Metadatendatei, die Adresse/das Netzwerk und die Compiler-Einstellungen importieren. +Wenn Sie Verträge über das Dashboard verifizieren, müssen Sie die Quelldatei oder die vom Solidity-Compiler generierte Metadatendatei, die Adresse/das Netzwerk und die Compiler-Einstellungen importieren. -Die Verwendung des Tenderly-Hardhat-Plug-ins ermöglicht eine bessere Kontrolle über den Verifizierungsprozess bei gleichzeitig weniger Aufwand. Sie können mit dem Plug-in zwischen automatischer (kein Code erforderlich) und manueller (Code-basierter) Verifizierung wählen. +Die Verwendung des Tenderly Hardhat-Plugins ermöglicht mehr Kontrolle über den Verifizierungsprozess mit weniger Aufwand, sodass Sie zwischen automatischer (No-Code) und manueller (Code-basierter) Verifizierung wählen können. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Verifizierung des Quellcodes von Verträgen](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) +- [Verifizierung des Vertragsquellcodes](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/index.md b/public/content/translations/de/developers/docs/standards/index.md index 9df51239f9b..8504f276547 100644 --- a/public/content/translations/de/developers/docs/standards/index.md +++ b/public/content/translations/de/developers/docs/standards/index.md @@ -1,24 +1,24 @@ --- title: Ethereum-Entwicklungsstandards -description: "Informieren Sie sich über Ethereum Standards, einschließlich EIPs, Token Standards wie ERC-20 und ERC-721 sowie Entwicklungskonventionen." +description: "Erfahren Sie mehr über Ethereum-Standards, einschließlich EIPs, Token-Standards wie ERC-20 und ERC-721 sowie Entwicklungskonventionen." lang: de incomplete: true --- -## Standardübersicht {#standards-overview} +## Übersicht der Standards {#standards-overview} -Die Ethereum-Community hat viele Standards angenommen, die dazu beitragen, Projekte (wie [Ethereum-Clients](/developers/docs/nodes-and-clients/) und Wallets) über Implementierungen hinweg interoperabel zu halten und sicherzustellen, dass Smart Contracts und Dapps kombinierbar bleiben. +Die Ethereum-Community hat viele Standards verabschiedet, die dazu beitragen, dass Projekte (wie [Ethereum-Clients](/developers/docs/nodes-and-clients/) und Wallets) über verschiedene Implementierungen hinweg interoperabel bleiben und sicherstellen, dass Smart Contracts und Dapps kombinierbar bleiben. -Normalerweise werden Standards als [Ethereum-Verbesserungsvorschläge](/eips/) (EIPs) eingeführt, die von Community-Mitgliedern in einem [Standardverfahren](https://eips.ethereum.org/EIPS/eip-1) diskutiert werden. +Typischerweise werden Standards als [Ethereum-Verbesserungsvorschläge](/eips/) (EIPs) eingeführt, die von Community-Mitgliedern in einem [Standardprozess](https://eips.ethereum.org/EIPS/eip-1) diskutiert werden. - [Einführung in EIPs](/eips/) - [Liste der EIPs](https://eips.ethereum.org/) -- [EIP-GitHub-Repo](https://github.com/ethereum/EIPs) +- [EIP-GitHub-Repository](https://github.com/ethereum/EIPs) - [EIP-Diskussionsforum](https://ethereum-magicians.org/c/eips) - [Einführung in die Ethereum-Governance](/governance/) -- [Überblick über die Ethereum-Governance](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _31. März 2019 – Boris Mann_ +- [Übersicht der Ethereum-Governance](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _31. März 2019 – Boris Mann_ - [Governance der Ethereum-Protokollentwicklung und Koordination von Netzwerk-Upgrades](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _23. März 2020 – Hudson Jameson_ -- [Playlist aller Ethereum-Core-Dev-Meetings](https://www.youtube.com/@EthereumProtocol) _(YouTube-Playlist)_ +- [Playlist aller Ethereum Core Dev Meetings](https://www.youtube.com/@EthereumProtocol) _(YouTube-Playlist)_ ## Arten von Standards {#types-of-standards} @@ -26,34 +26,34 @@ Es gibt 3 Arten von EIPs: - Standards Track: beschreibt jede Änderung, die die meisten oder alle Ethereum-Implementierungen betrifft - [Meta Track](https://eips.ethereum.org/meta): beschreibt einen Prozess rund um Ethereum oder schlägt eine Änderung an einem Prozess vor -- [Informational Track](https://eips.ethereum.org/informational): beschreibt ein Ethereum-Designproblem oder stellt der Ethereum-Community allgemeine Richtlinien oder Informationen zur Verfügung +- [Informational Track](https://eips.ethereum.org/informational): beschreibt ein Ethereum-Designproblem oder bietet der Ethereum-Community allgemeine Richtlinien oder Informationen Darüber hinaus ist der Standard Track in 4 Kategorien unterteilt: - [Core](https://eips.ethereum.org/core): Verbesserungen, die einen Konsens-Fork erfordern -- [Networking](https://eips.ethereum.org/networking): Verbesserungen rund um devp2p und das Light Ethereum Subprotocol sowie vorgeschlagene Verbesserungen der Netzwerkprotokollspezifikationen von Whisper und Swarm. -- [Interface](https://eips.ethereum.org/interface): Verbesserungen rund um Client-API/RPC-Spezifikationen und -Standards sowie bestimmte sprachliche Standards wie Methodennamen und Vertrags-ABIs. +- [Networking](https://eips.ethereum.org/networking): Verbesserungen rund um devp2p und das Light Ethereum Subprotocol sowie vorgeschlagene Verbesserungen an den Netzwerkprotokollspezifikationen von Whisper und Swarm. +- [Interface](https://eips.ethereum.org/interface): Verbesserungen rund um Client-API/RPC-Spezifikationen und -Standards sowie bestimmte Standards auf Sprachebene wie Methodennamen und Contract-ABIs. - [ERC](https://eips.ethereum.org/erc): Standards und Konventionen auf Anwendungsebene -Ausführlichere Informationen zu diesen verschiedenen Typen und Kategorien finden Sie in [EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types) +Detailliertere Informationen zu diesen verschiedenen Arten und Kategorien finden Sie in [EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types) ### Token-Standards {#token-standards} -- [ERC-20](/developers/docs/standards/tokens/erc-20/) – Eine Standardschnittstelle für fungible (austauschbare) Tokens, wie Abstimmungstokens, Staking-Tokens oder virtuelle Währungen. - - [ERC-223](/developers/docs/standards/tokens/erc-223/) – Ein Standard für fungible Tokens, durch den sich Tokens identisch zu Ether verhalten und der die Handhabung von Token-Übertragungen auf der Empfängerseite unterstützt. - - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) – Eine Erweiterungsschnittstelle für ERC-20-Tokens, die die Ausführung von Callbacks auf Empfängerverträgen in einer einzigen Transaktion unterstützt. -- [ERC-721](/developers/docs/standards/tokens/erc-721/) – Eine Standardschnittstelle für nicht-fungible Tokens, wie eine Urkunde für ein Kunstwerk oder ein Lied. - - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) – Ein standardisiertes Ereignis, das beim Erstellen/Übertragen eines oder mehrerer nicht-fungibler Tokens unter Verwendung aufeinanderfolgender Token-Kennungen ausgelöst wird. +- [ERC-20](/developers/docs/standards/tokens/erc-20/) – Eine Standardschnittstelle für fungible (austauschbare) Token, wie Voting-Token, Staking-Token oder virtuelle Währungen. + - [ERC-223](/developers/docs/standards/tokens/erc-223/) – Ein Standard für fungible Token, der dafür sorgt, dass sich Token identisch zu Ether verhalten, und die Handhabung von Token-Transfers auf Empfängerseite unterstützt. + - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) – Eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung von Callbacks bei Empfängerverträgen in einer einzigen Transaktion unterstützt. +- [ERC-721](/developers/docs/standards/tokens/erc-721/) – Eine Standardschnittstelle für nicht-fungible Token, wie eine Urkunde für ein Kunstwerk oder ein Lied. + - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) – Ein standardisiertes Ereignis, das beim Erstellen/Übertragen eines oder mehrerer nicht-fungibler Token unter Verwendung aufeinanderfolgender Token-Identifikatoren ausgegeben wird. - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) – Schnittstellenerweiterung für die EIP-721-Verbraucherrolle. - - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) – Hinzufügen einer zeitlich begrenzten Rolle mit eingeschränkten Berechtigungen zu ERC-721-Tokens. -- [ERC-777](/developers/docs/standards/tokens/erc-777/) – **(NICHT EMPFOHLEN)** Ein Token-Standard, der eine Verbesserung gegenüber ERC-20 darstellt. + - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) – Fügt ERC-721-Token eine zeitlich begrenzte Rolle mit eingeschränkten Berechtigungen hinzu. +- [ERC-777](/developers/docs/standards/tokens/erc-777/) – **(NICHT EMPFOHLEN)** Ein Token-Standard, der ERC-20 verbessert. - [ERC-1155](/developers/docs/standards/tokens/erc-1155/) – Ein Token-Standard, der sowohl fungible als auch nicht-fungible Vermögenswerte enthalten kann. -- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) – Ein tokenisierter Vault-Standard, der entwickelt wurde, um die technischen Parameter von renditetragenden Vaults zu optimieren und zu vereinheitlichen. +- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) – Ein Standard für tokenisierte Tresore (Vaults), der entwickelt wurde, um die technischen Parameter von renditebringenden Tresoren zu optimieren und zu vereinheitlichen. Erfahren Sie mehr über [Token-Standards](/developers/docs/standards/tokens/). -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [Ethereum-Verbesserungsvorschläge (EIPs)](/eips/) -_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md index a387ee9d57f..d458e6755a4 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md @@ -1,35 +1,35 @@ --- -title: ERC-1155 Token-Standard +title: ERC-1155 Multi-Token-Standard description: "Erfahren Sie mehr über ERC-1155, einen Multi-Token-Standard, der fungible und nicht-fungible Token in einem einzigen Vertrag kombiniert." lang: de --- ## Einführung {#introduction} -Eine Standardschnittstelle für Verträge, die mehrere Token-Typen verwalten. Ein einzelner bereitgestellter Vertrag kann eine beliebige Kombination von fungiblen Token, nicht-fungiblen Token oder anderen Konfigurationen (z. B. semi-fungible Token) enthalten. +Eine Standardschnittstelle für Verträge, die mehrere Token-Typen verwalten. Ein einzelner bereitgestellter Vertrag kann eine beliebige Kombination aus fungiblen Token, nicht-fungiblen Token oder anderen Konfigurationen (z. B. semi-fungiblen Token) enthalten. -**Was versteht man unter Multi-Token-Standard?** +**Was ist mit Multi-Token-Standard gemeint?** -Die Idee ist einfach und zielt darauf ab, eine Smart-Contract-Schnittstelle zu schaffen, die eine beliebige Anzahl von fungiblen und nicht-fungiblen Token-Typen darstellen und kontrollieren kann. Auf diese Weise kann der ERC-1155-Token dieselben Funktionen wie ein [ERC-20](/developers/docs/standards/tokens/erc-20/)- und [ERC-721](/developers/docs/standards/tokens/erc-721/)-Token ausführen, und sogar beide gleichzeitig. Er verbessert die Funktionalität sowohl des ERC-20- als auch des ERC-721-Standards, macht sie effizienter und korrigiert offensichtliche Implementierungsfehler. +Die Idee ist einfach und zielt darauf ab, eine Smart Contract-Schnittstelle zu schaffen, die eine beliebige Anzahl von fungiblen und nicht-fungiblen Token-Typen darstellen und steuern kann. Auf diese Weise kann der ERC-1155-Token die gleichen Funktionen wie ein [ERC-20](/developers/docs/standards/tokens/erc-20/)- und [ERC-721](/developers/docs/standards/tokens/erc-721/)-Token ausführen, und sogar beide gleichzeitig. Er verbessert die Funktionalität sowohl des ERC-20- als auch des ERC-721-Standards, macht sie effizienter und korrigiert offensichtliche Implementierungsfehler. Der ERC-1155-Token wird vollständig in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155) beschrieben. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Token-Standards](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) und [ERC-721](/developers/docs/standards/tokens/erc-721/) zu informieren. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst über [Token-Standards](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) und [ERC-721](/developers/docs/standards/tokens/erc-721/) zu lesen. ## ERC-1155 Funktionen und Merkmale: {#body} -- [Batch-Übertragung](#batch_transfers): Übertragen Sie mehrere Assets in einem einzigen Aufruf. -- [Batch-Guthaben](#batch_balance): Rufen Sie die Guthaben mehrerer Assets in einem einzigen Aufruf ab. -- [Batch-Genehmigung](#batch_approval): Genehmigen Sie alle Token für eine Adresse. -- [Hooks](#receive_hook): Hook zum Empfangen von Token. -- [NFT-Unterstützung](#nft_support): Wenn die Menge nur 1 beträgt, wird es als NFT behandelt. -- [Sichere Übertragungsregeln](#safe_transfer_rule): Regelwerk für die sichere Übertragung. +- [Stapelübertragung (Batch Transfer)](#batch_transfers): Übertragen Sie mehrere Vermögenswerte in einem einzigen Aufruf. +- [Stapelsaldo (Batch Balance)](#batch_balance): Rufen Sie die Salden mehrerer Vermögenswerte in einem einzigen Aufruf ab. +- [Stapelgenehmigung (Batch Approval)](#batch_approval): Genehmigen Sie alle Token für eine Adresse. +- [Hooks](#receive_hook): Hook für den Empfang von Token. +- [NFT-Unterstützung](#nft_support): Wenn das Angebot nur 1 beträgt, wird es als NFT behandelt. +- [Sichere Übertragungsregeln (Safe Transfer Rules)](#safe_transfer_rule): Regelwerk für eine sichere Übertragung. -### Batch-Übertragungen {#batch-transfers} +### Stapelübertragungen (Batch Transfers) {#batch-transfers} -Die Batch-Übertragung funktioniert sehr ähnlich wie die regulären ERC-20-Übertragungen. Schauen wir uns die reguläre ERC-20-Funktion `transferFrom` an: +Die Stapelübertragung funktioniert sehr ähnlich wie reguläre ERC-20-Übertragungen. Schauen wir uns die reguläre ERC-20-Funktion `transferFrom` an: ```solidity // ERC-20 @@ -45,17 +45,17 @@ function safeBatchTransferFrom( ) external; ``` -Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und auch ein Array von IDs übergeben. Wenn beispielsweise `ids=[3, 6, 13]` und `values=[100, 200, 5]` gegeben sind, lauten die resultierenden Übertragungen: +Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und zusätzlich ein Array von IDs übergeben. Wenn beispielsweise `ids=[3, 6, 13]` und `values=[100, 200, 5]` gegeben sind, sehen die resultierenden Übertragungen wie folgt aus: -1. Übertragung von 100 Token mit der ID 3 von `_from` an `_to`. -2. Übertragung von 200 Token mit der ID 6 von `_from` an `_to`. -3. Übertragung von 5 Token mit der ID 13 von `_from` an `_to`. +1. Übertrage 100 Token mit der ID 3 von `_from` nach `_to`. +2. Übertrage 200 Token mit der ID 6 von `_from` nach `_to`. +3. Übertrage 5 Token mit der ID 13 von `_from` nach `_to`. -In ERC-1155 gibt es nur `transferFrom`, kein `transfer`. Um es wie ein reguläres `transfer` zu verwenden, setzen Sie einfach die Absenderadresse auf die Adresse, die die Funktion aufruft. +In ERC-1155 haben wir nur `transferFrom`, kein `transfer`. Um es wie ein reguläres `transfer` zu verwenden, setzen Sie einfach die Absenderadresse (from) auf die Adresse, die die Funktion aufruft. -### Batch-Guthaben {#batch-balance} +### Stapelsaldo (Batch Balance) {#batch-balance} -Der entsprechende ERC-20-Aufruf `balanceOf` hat ebenfalls eine Partnerfunktion mit Batch-Unterstützung. Zur Erinnerung: Dies ist die ERC-20-Version: +Der entsprechende ERC-20-Aufruf `balanceOf` hat ebenfalls seine Partnerfunktion mit Stapelunterstützung. Zur Erinnerung, dies ist die ERC-20-Version: ```solidity // ERC-20 @@ -68,7 +68,7 @@ function balanceOfBatch( ) external view returns (uint256[] memory); ``` -Bei der Abfrage des Saldos ist es sogar noch einfacher, denn wir können mehrere Salden in einem einzigen Schritt abrufen. Wir übergeben das Array der Besitzer, gefolgt von dem Array der Token-Ids. +Noch einfacher ist es beim Saldo-Aufruf, bei dem wir mehrere Salden in einem einzigen Aufruf abrufen können. Wir übergeben das Array der Eigentümer, gefolgt vom Array der Token-IDs. Wenn beispielsweise `_ids=[3, 6, 13]` und `_owners=[0xbeef..., 0x1337..., 0x1111...]` gegeben sind, lautet der Rückgabewert: @@ -80,7 +80,7 @@ Wenn beispielsweise `_ids=[3, 6, 13]` und `_owners=[0xbeef..., 0x1337..., 0x1111 ] ``` -### Batch-Genehmigung {#batch-approval} +### Stapelgenehmigung (Batch Approval) {#batch-approval} ```solidity // ERC-1155 @@ -95,13 +95,13 @@ function isApprovedForAll( ) external view returns (bool); ``` -Die Genehmigungen unterscheiden sich geringfügig von denen des ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzen Sie einen Operator über `setApprovalForAll` auf „genehmigt“ oder „nicht genehmigt“. +Die Genehmigungen unterscheiden sich geringfügig von ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzen Sie einen Operator über `setApprovalForAll` auf genehmigt oder nicht genehmigt. -Der aktuelle Status kann über `isApprovedForAll` ausgelesen werden. Wie Sie sehen können, ist es eine Alles-oder-Nichts-Operation. Sie können nicht festlegen, wie viele Token genehmigt werden und auch nicht, welche Token-Klasse. +Das Lesen des aktuellen Status kann über `isApprovedForAll` erfolgen. Wie Sie sehen können, handelt es sich um eine Alles-oder-Nichts-Operation. Sie können nicht definieren, wie viele Token genehmigt werden sollen oder gar welche Token-Klasse. -Dies wurde absichtlich so einfach wie möglich gestaltet. Sie können alles nur für eine Adresse genehmigen. +Dies ist absichtlich im Hinblick auf Einfachheit konzipiert. Sie können nur alles für eine Adresse genehmigen. -### Empfangs-Hook {#receive-hook} +### Empfangs-Hook (Receive Hook) {#receive-hook} ```solidity function onERC1155BatchReceived( @@ -113,7 +113,7 @@ function onERC1155BatchReceived( ) external returns(bytes4); ``` -Dank der [EIP-165](https://eips.ethereum.org/EIPS/eip-165)-Unterstützung unterstützt ERC-1155 Empfangs-Hooks nur für Smart Contracts. Die Haken-Funktion muss einen magischen vordefinierten Bytes4-Wert zurückgeben, der wie folgt angegeben wird: +Aufgrund der Unterstützung von [EIP-165](https://eips.ethereum.org/EIPS/eip-165) unterstützt ERC-1155 Empfangs-Hooks nur für Smart Contracts. Die Hook-Funktion muss einen magischen, vordefinierten bytes4-Wert zurückgeben, der wie folgt angegeben ist: ```solidity bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) @@ -123,24 +123,24 @@ Wenn der empfangende Vertrag diesen Wert zurückgibt, wird davon ausgegangen, da ### NFT-Unterstützung {#nft-support} -Wenn es nur eine Angebotsmenge gibt, ist der Token im Wesentlichen ein nicht-fungibler Token (NFT). Und wie bei ERC-721 üblich, können Sie eine Metadaten-URL definieren. Die URL kann von Clients gelesen und geändert werden, siehe [hier](https://eips.ethereum.org/EIPS/eip-1155#metadata). +Wenn das Angebot nur eins beträgt, ist der Token im Wesentlichen ein nicht-fungibler Token (NFT). Und wie bei ERC-721 üblich, können Sie eine Metadaten-URL definieren. Die URL kann von Anwendungen gelesen und geändert werden, siehe [hier](https://eips.ethereum.org/EIPS/eip-1155#metadata). -### Regel für sichere Übertragungen {#safe-transfer-rule} +### Sichere Übertragungsregel (Safe Transfer Rule) {#safe-transfer-rule} -In den vorangegangenen Erläuterungen haben wir bereits einige Regeln für die sichere Übertragung angesprochen. Aber schauen wir uns die wichtigsten Regeln an: +Wir haben in den vorherigen Erklärungen bereits einige sichere Übertragungsregeln angesprochen. Aber schauen wir uns die wichtigsten dieser Regeln an: -1. Der Aufrufer muss berechtigt sein, die Token für die `_from`-Adresse auszugeben, oder der Aufrufer muss `_from` sein. -2. Der Übertragungsruf muss zurückgehen, wenn - 1. Die `_to`-Adresse ist 0. - 2. Die Länge von `_ids` entspricht nicht der Länge von `_values`. - 3. Das Guthaben eines Inhabers für einen Token in `_ids` ist geringer als der entsprechende Betrag in `_values`, der an den Empfänger gesendet wird. - 4. Ein anderer Fehler tritt auf. +1. Der Aufrufer muss berechtigt sein, die Token für die Adresse `_from` auszugeben, oder der Aufrufer muss gleich `_from` sein. +2. Der Übertragungsaufruf muss rückgängig gemacht (revert) werden, wenn + 1. die Adresse `_to` 0 ist. + 2. die Länge von `_ids` nicht mit der Länge von `_values` übereinstimmt. + 3. einer der Salden der Inhaber für Token in `_ids` niedriger ist als die entsprechenden Beträge in `_values`, die an den Empfänger gesendet werden. + 4. ein anderer Fehler auftritt. -_Hinweis_: Alle Batch-Funktionen, einschließlich des Hooks, existieren auch als Versionen ohne Batch. Dies geschieht aus Gründen der Gaseffizienz, da die Übertragung nur eines Vermögenswerts wahrscheinlich immer noch der am häufigsten genutzte Weg sein wird. Wir haben sie der Einfachheit halber in den Erläuterungen weggelassen, einschließlich der Regeln für die sichere Übertragung. Die Namen sind identisch, Sie müssen nur das „Batch" entfernen. +_Hinweis_: Alle Stapelfunktionen einschließlich des Hooks existieren auch als Versionen ohne Stapel (Batch). Dies geschieht aus Gründen der Gas-Effizienz, da die Übertragung von nur einem Vermögenswert wahrscheinlich immer noch die am häufigsten verwendete Methode sein wird. Wir haben sie der Einfachheit halber in den Erklärungen weggelassen, einschließlich der sicheren Übertragungsregeln. Die Namen sind identisch, entfernen Sie einfach das 'Batch'. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [EIP-1155: Multi-Token-Standard](https://eips.ethereum.org/EIPS/eip-1155) -- [ERC-1155: Openzeppelin Docs](https://docs.openzeppelin.com/contracts/5.x/erc1155) -- [ERC-1155: GitHub-Repo](https://github.com/enjin/erc-1155) -- [Alchemy NFT-API](https://www.alchemy.com/docs/reference/nft-api-quickstart) +- [ERC-1155: OpenZeppelin-Dokumentation](https://docs.openzeppelin.com/contracts/5.x/erc1155) +- [ERC-1155: GitHub-Repository](https://github.com/enjin/erc-1155) +- [Alchemy NFT-API](https://www.alchemy.com/docs/reference/nft-api-quickstart) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md index 2250eb47bcf..f736295b720 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md @@ -1,6 +1,6 @@ --- -title: ERC-1363 Zahlbarer Token-Standard -description: "ERC-1363 ist eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung einer benutzerdefinierten Logik auf einem Empfängervertrag nach Übertragungen oder auf einem Spendervertrag nach Genehmigungen innerhalb einer einzigen Transaktion unterstützt." +title: ERC-1363 Payable Token Standard +description: "ERC-1363 ist eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung benutzerdefinierter Logik auf einem Empfängervertrag nach Übertragungen oder auf einem Ausgabevertrag nach Genehmigungen unterstützt, alles innerhalb einer einzigen Transaktion." lang: de --- @@ -8,20 +8,20 @@ lang: de ### Was ist ERC-1363? {#what-is-erc1363} -ERC-1363 ist eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung einer benutzerdefinierten Logik auf einem Empfängervertrag nach Übertragungen oder auf einem Spendervertrag nach Genehmigungen innerhalb einer einzigen Transaktion unterstützt. +ERC-1363 ist eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung benutzerdefinierter Logik auf einem Empfängervertrag nach Übertragungen oder auf einem Ausgabevertrag nach Genehmigungen unterstützt, alles innerhalb einer einzigen Transaktion. ### Unterschiede zu ERC-20 {#erc20-differences} -Standard-ERC-20-Operationen wie `transfer`, `transferFrom` und `approve` erlauben keine Codeausführung auf dem Empfänger- oder Spendervertrag ohne eine separate Transaktion. -Dies führt zu Komplexität in der UI-Entwicklung und zu Reibungsverlusten bei der Einführung, da Benutzer auf die Ausführung der ersten Transaktion warten und dann die zweite einreichen müssen. -Sie müssen auch zweimal GAS bezahlen. +Standardmäßige ERC-20-Operationen wie `transfer`, `transferFrom` und `approve` erlauben keine Codeausführung auf dem Empfänger- oder Ausgabevertrag ohne eine separate Transaktion. +Dies führt zu Komplexität bei der UI-Entwicklung und Reibungsverlusten bei der Akzeptanz, da Benutzer warten müssen, bis die erste Transaktion ausgeführt wurde, und dann die zweite einreichen müssen. +Sie müssen außerdem zweimal Gas bezahlen. -ERC-1363 ermöglicht es fungiblen Token, Aktionen einfacher durchzuführen und ohne die Verwendung eines Off-Chain-Listeners zu funktionieren. -Es ermöglicht, nach einer Übertragung oder einer Genehmigung in einer einzigen Transaktion einen Callback auf einem Empfänger- oder Spendervertrag durchzuführen. +ERC-1363 ermöglicht es fungiblen Token, Aktionen einfacher auszuführen und ohne die Verwendung eines Off-Chain-Listeners zu funktionieren. +Es erlaubt einen Callback auf einem Empfänger- oder Ausgabevertrag nach einer Übertragung oder einer Genehmigung in einer einzigen Transaktion. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zunächst Folgendes zu lesen: +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über Folgendes zu informieren: - [Token-Standards](/developers/docs/standards/tokens/) - [ERC-20](/developers/docs/standards/tokens/erc-20/) @@ -30,106 +30,166 @@ Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zunächst Folgendes zu ERC-1363 führt eine Standard-API für ERC-20-Token ein, um nach `transfer`, `transferFrom` oder `approve` mit Smart Contracts zu interagieren. -Dieser Standard bietet grundlegende Funktionen zum Übertragen von Token und ermöglicht die Genehmigung von Token, damit sie von einem anderen On-Chain-Drittanbieter ausgegeben werden können, um dann einen Callback auf dem Empfänger- oder Spendervertrag durchzuführen. +Dieser Standard bietet grundlegende Funktionen zur Übertragung von Token sowie die Möglichkeit, Token zu genehmigen, damit sie von einem anderen Dritten auf der Blockchain ausgegeben werden können, und anschließend einen Callback auf dem Empfänger- oder Ausgabevertrag durchzuführen. -Es gibt viele vorgeschlagene Anwendungsfälle für Smart Contracts, die ERC-20-Callbacks akzeptieren können. +Es gibt viele vorgeschlagene Verwendungszwecke für Smart Contracts, die ERC-20-Callbacks akzeptieren können. Beispiele könnten sein: -- **Crowdsales**: Gesendete Token lösen eine sofortige Zuteilung der Belohnung aus. -- **Dienstleistungen**: Die Zahlung aktiviert den Dienstzugang in einem Schritt. +- **Crowdsales**: Gesendete Token lösen eine sofortige Zuweisung von Belohnungen aus. +- **Dienstleistungen**: Die Zahlung aktiviert den Zugang zum Dienst in einem Schritt. - **Rechnungen**: Token begleichen Rechnungen automatisch. -- **Abonnements**: Die Genehmigung des jährlichen Tarifs aktiviert das Abonnement mit der Zahlung des ersten Monats. +- **Abonnements**: Die Genehmigung des Jahresbeitrags aktiviert das Abonnement mit der Zahlung des ersten Monats. -Aus diesen Gründen wurde es ursprünglich **„Payable Token“** genannt. +Aus diesen Gründen wurde er ursprünglich **„Payable Token“** genannt. -Das Callback-Verhalten erweitert den Nutzen zusätzlich und ermöglicht nahtlose Interaktionen wie: +Das Callback-Verhalten erweitert seinen Nutzen weiter und ermöglicht nahtlose Interaktionen wie: - **Staking**: Übertragene Token lösen eine automatische Sperrung in einem Staking-Vertrag aus. -- **Abstimmung**: Erhaltene Token registrieren Stimmen in einem Governance-System. -- **Swapping**: Token-Genehmigungen aktivieren die Swap-Logik in einem einzigen Schritt. +- **Abstimmungen**: Empfangene Token registrieren Stimmen in einem Governance-System. +- **Tauschen**: Token-Genehmigungen aktivieren die Tausch-Logik in einem einzigen Schritt. -ERC-1363-Token können für bestimmte Zwecke in allen Fällen verwendet werden, in denen nach einer erhaltenen Übertragung oder Genehmigung ein Callback ausgeführt werden muss. -ERC-1363 ist auch nützlich, um den Verlust oder die Sperrung von Token in Smart Contracts zu vermeiden, indem die Fähigkeit des Empfängers, die Token zu handhaben, überprüft wird. +ERC-1363-Token können für spezifische Dienstprogramme in allen Fällen verwendet werden, die die Ausführung eines Callbacks nach einer Übertragung oder einer erhaltenen Genehmigung erfordern. +ERC-1363 ist auch nützlich, um Token-Verlust oder das Sperren von Token in Smart Contracts zu vermeiden, indem die Fähigkeit des Empfängers zum Umgang mit Token überprüft wird. -Im Gegensatz zu anderen ERC-20-Erweiterungsvorschlägen überschreibt ERC-1363 nicht die `transfer`- und `transferFrom`-Methoden von ERC-20 und definiert die zu implementierenden Schnittstellen-IDs, wodurch die Abwärtskompatibilität mit ERC-20 erhalten bleibt. +Im Gegensatz zu anderen Vorschlägen für ERC-20-Erweiterungen überschreibt ERC-1363 die Methoden `transfer` und `transferFrom` von ERC-20 nicht und definiert die zu implementierenden Schnittstellen-IDs unter Beibehaltung der Abwärtskompatibilität mit ERC-20. Aus [EIP-1363](https://eips.ethereum.org/EIPS/eip-1363): ### Methoden {#methods} -Smart Contracts, die den ERC-1363-Standard implementieren, **MÜSSEN** alle Funktionen der `ERC1363`-Schnittstelle sowie die `ERC20`- und `ERC165`-Schnittstellen implementieren. +Smart Contracts, die den ERC-1363-Standard implementieren, **MÜSSEN** alle Funktionen in der `ERC1363`-Schnittstelle sowie die `ERC20`- und `ERC165`-Schnittstellen implementieren. ```solidity pragma solidity ^0.8.0; -/** +/* * * @title ERC1363 - * @dev Eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung von Code in einem Empfängervertrag nach `transfer` oder `transferFrom` oder Code in einem Spendervertrag nach `approve` in einer einzigen Transaktion unterstützt. - */ + * @dev Eine Erweiterungsschnittstelle für ERC-20-Token, die das Ausführen von Code auf einem Empfängervertrag + * nach `transfer` oder `transferFrom` oder von Code auf einem ausgebenden Vertrag nach `approve` in einer einzigen Transaktion unterstützt. */ + + + + + interface ERC1363 is ERC20, ERC165 { - /* - * HINWEIS: Die ERC-165-Kennung für diese Schnittstelle lautet 0xb0202a11. + /* * NOTE: Der ERC-165-Identifikator für diese Schnittstelle ist 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ - * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) - */ + * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ + + + + + + + - /** - * @dev Verschiebt einen Token-Betrag von `value` vom Konto des Aufrufers nach `to` und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + + + + /* * + * @dev Verschiebt eine Menge `value` an Token vom Konto des Aufrufers nach `to` + * und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. * @param to Die Adresse, an die die Token übertragen werden. - * @param value Der Betrag der zu übertragenden Token. - * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. - */ + * @param value Die Menge der zu übertragenden Token. + * @return Ein boolescher Wert, der anzeigt, dass die Operation erfolgreich war, sofern kein Fehler ausgelöst wird. */ + + + + + + + function transferAndCall(address to, uint256 value) external returns (bool); - /** - * @dev Verschiebt einen Token-Betrag von `value` vom Konto des Aufrufers nach `to` und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + /* * + * @dev Verschiebt eine Menge `value` an Token vom Konto des Aufrufers nach `to` + * und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. * @param to Die Adresse, an die die Token übertragen werden. - * @param value Der Betrag der zu übertragenden Token. - * @param data Zusätzliche Daten ohne bestimmtes Format, die beim Aufruf an `to` gesendet werden. - * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. - */ + * @param value Die Menge der zu übertragenden Token. + * @param data Zusätzliche Daten ohne spezifiziertes Format, die im Aufruf an `to` gesendet werden. + * @return Ein boolescher Wert, der anzeigt, dass die Operation erfolgreich war, sofern kein Fehler ausgelöst wird. */ + + + + + + + + function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); - /** - * @dev Verschiebt einen Token-Betrag von `value` von `from` nach `to` unter Verwendung des Genehmigungsmechanismus und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. - * @param from Die Adresse, von der die Token gesendet werden. + /* * + * @dev Verschiebt eine Menge `value` an Token von `from` nach `to` unter Verwendung des Allowance-Mechanismus + * und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + * @param from Die Adresse, von der Token gesendet werden sollen. * @param to Die Adresse, an die die Token übertragen werden. - * @param value Der Betrag der zu übertragenden Token. - * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. - */ + * @param value Die Menge der zu übertragenden Token. + * @return Ein boolescher Wert, der anzeigt, dass die Operation erfolgreich war, sofern kein Fehler ausgelöst wird. */ + + + + + + + + function transferFromAndCall(address from, address to, uint256 value) external returns (bool); - /** - * @dev Verschiebt einen Token-Betrag von `value` von `from` nach `to` unter Verwendung des Genehmigungsmechanismus und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. - * @param from Die Adresse, von der die Token gesendet werden. + /* * + * @dev Verschiebt eine Menge `value` an Token von `from` nach `to` unter Verwendung des Allowance-Mechanismus + * und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + * @param from Die Adresse, von der Token gesendet werden sollen. * @param to Die Adresse, an die die Token übertragen werden. - * @param value Der Betrag der zu übertragenden Token. - * @param data Zusätzliche Daten ohne bestimmtes Format, die beim Aufruf an `to` gesendet werden. - * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. - */ + * @param value Die Menge der zu übertragenden Token. + * @param data Zusätzliche Daten ohne spezifiziertes Format, die im Aufruf an `to` gesendet werden. + * @return Ein boolescher Wert, der anzeigt, dass die Operation erfolgreich war, sofern kein Fehler ausgelöst wird. */ + + + + + + + + + function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); - /** - * @dev Legt einen Token-Betrag von `value` als Genehmigung für `spender` über die Token des Aufrufers fest und ruft dann `ERC1363Spender::onApprovalReceived` auf `spender` auf. - * @param spender Die Adresse, die das Guthaben ausgeben wird. - * @param value Der Betrag der auszugebenden Token. - * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. - */ + /* * + * @dev Legt eine Menge `value` an Token als Allowance für `spender` über die Token des Aufrufers fest + * und ruft dann `ERC1363Spender::onApprovalReceived` auf `spender` auf. + * @param spender Die Adresse, die die Mittel ausgeben wird. + * @param value Die Menge der auszugebenden Token. + * @return Ein boolescher Wert, der anzeigt, dass die Operation erfolgreich war, sofern kein Fehler ausgelöst wird. */ + + + + + + + function approveAndCall(address spender, uint256 value) external returns (bool); - /** - * @dev Legt einen Token-Betrag von `value` als Genehmigung für `spender` über die Token des Aufrufers fest und ruft dann `ERC1363Spender::onApprovalReceived` auf `spender` auf. - * @param spender Die Adresse, die das Guthaben ausgeben wird. - * @param value Der Betrag der auszugebenden Token. - * @param data Zusätzliche Daten ohne bestimmtes Format, die beim Aufruf an `spender` gesendet werden. - * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. - */ + /* * + * @dev Legt eine Menge `value` an Token als Allowance für `spender` über die Token des Aufrufers fest + * und ruft dann `ERC1363Spender::onApprovalReceived` auf `spender` auf. + * @param spender Die Adresse, die die Mittel ausgeben wird. + * @param value Die Menge der auszugebenden Token. + * @param data Zusätzliche Daten ohne spezifiziertes Format, die im Aufruf an `spender` gesendet werden. + * @return Ein boolescher Wert, der anzeigt, dass die Operation erfolgreich war, sofern kein Fehler ausgelöst wird. */ + + + + + + + + function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } @@ -149,55 +209,89 @@ interface ERC165 { } ``` -Ein Smart Contract, der ERC-1363-Token über `transferAndCall` oder `transferFromAndCall` annehmen möchte, **MUSS** die `ERC1363Receiver`-Schnittstelle implementieren: +Ein Smart Contract, der ERC-1363-Token über `transferAndCall` oder `transferFromAndCall` akzeptieren möchte, **MUSS** die `ERC1363Receiver`-Schnittstelle implementieren: ```solidity -/** +/* * * @title ERC1363Receiver - * @dev Schnittstelle für jeden Vertrag, der `transferAndCall` oder `transferFromAndCall` von ERC-1363-Token-Verträgen unterstützen möchte. - */ + * @dev Schnittstelle für jeden Vertrag, der `transferAndCall` oder `transferFromAndCall` von ERC-1363-Token-Verträgen unterstützen möchte. */ + + + + interface ERC1363Receiver { - /** - * @dev Immer wenn ERC-1363-Token über `ERC1363::transferAndCall` oder `ERC1363::transferFromAndCall` von `operator` von `from` an diesen Vertrag übertragen werden, wird diese Funktion aufgerufen. + /* * + * @dev Wann immer ERC-1363-Token über `ERC1363::transferAndCall` oder `ERC1363::transferFromAndCall` + * durch `operator` von `from` an diesen Vertrag übertragen werden, wird diese Funktion aufgerufen. * - * HINWEIS: Um die Übertragung zu akzeptieren, muss diese Funktion `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` zurückgeben - * (d. h. 0x88a7ca5c oder ihren eigenen Funktionsselektor). + * NOTE: Um die Übertragung zu akzeptieren, muss dies + * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` + * (d. h. 0x88a7ca5c oder seinen eigenen Funktionsselektor) zurückgeben. * * @param operator Die Adresse, die die Funktion `transferAndCall` oder `transferFromAndCall` aufgerufen hat. * @param from Die Adresse, von der die Token übertragen werden. - * @param value Der Betrag der übertragenen Token. - * @param data Zusätzliche Daten ohne bestimmtes Format. - * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` wenn die Übertragung zulässig ist, es sei denn, es wird ein Fehler ausgelöst. - */ + * @param value Die Menge der übertragenen Token. + * @param data Zusätzliche Daten ohne spezifiziertes Format. + * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`, wenn die Übertragung erlaubt ist, sofern kein Fehler ausgelöst wird. */ + + + + + + + + + + + + + + function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4); } ``` -Ein Smart Contract, der ERC-1363-Token über `approveAndCall` annehmen möchte, **MUSS** die `ERC1363Spender`-Schnittstelle implementieren: +Ein Smart Contract, der ERC-1363-Token über `approveAndCall` akzeptieren möchte, **MUSS** die `ERC1363Spender`-Schnittstelle implementieren: ```solidity -/** +/* * * @title ERC1363Spender - * @dev Schnittstelle für jeden Vertrag, der `approveAndCall` von ERC-1363-Token-Verträgen unterstützen möchte. - */ + * @dev Schnittstelle für jeden Vertrag, der `approveAndCall` von ERC-1363-Token-Verträgen unterstützen möchte. */ + + + + interface ERC1363Spender { - /** - * @dev Immer wenn ein ERC-1363-Token-`owner` diesen Vertrag über `ERC1363::approveAndCall` zur Ausgabe seiner Token autorisiert, - * wird diese Funktion aufgerufen. + /* * + * @dev Wann immer ein `owner` von ERC-1363-Token diesen Vertrag über `ERC1363::approveAndCall` autorisiert, + * seine Token auszugeben, wird diese Funktion aufgerufen. * - * HINWEIS: Um die Genehmigung zu akzeptieren, muss diese Funktion `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` zurückgeben - * (d. h. 0x7b04a2d0 oder ihren eigenen Funktionsselektor). + * NOTE: Um die Genehmigung zu akzeptieren, muss dies + * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` + * (d. h. 0x7b04a2d0 oder seinen eigenen Funktionsselektor) zurückgeben. * * @param owner Die Adresse, die die Funktion `approveAndCall` aufgerufen hat und zuvor die Token besaß. - * @param value Der Betrag der auszugebenden Token. - * @param data Zusätzliche Daten ohne bestimmtes Format. - * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` wenn die Genehmigung zulässig ist, es sei denn, es wird ein Fehler ausgelöst. - */ + * @param value Die Menge der auszugebenden Token. + * @param data Zusätzliche Daten ohne spezifiziertes Format. + * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`, wenn die Genehmigung erlaubt ist, sofern kein Fehler ausgelöst wird. */ + + + + + + + + + + + + + function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4); } ``` -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [ERC-1363: Zahlbarer Token-Standard](https://eips.ethereum.org/EIPS/eip-1363) -- [ERC-1363: GitHub-Repo](https://github.com/vittominacori/erc1363-payable-token) +- [ERC-1363: Payable Token Standard](https://eips.ethereum.org/EIPS/eip-1363) +- [ERC-1363: GitHub-Repo](https://github.com/vittominacori/erc1363-payable-token) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md index 41f6fd1c4b2..028dc3fad9e 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md @@ -1,6 +1,6 @@ --- -title: ERC-20 Token-Standard -description: "Erfahren Sie mehr über ERC-20, den Standard für fungible Token auf Ethereum, der interoperable Token Anwendungen ermöglicht." +title: ERC-20-Token-Standard +description: "Erfahren Sie mehr über ERC-20, den Standard für fungible Token auf Ethereum, der interoperable Token-Anwendungen ermöglicht." lang: de --- @@ -8,21 +8,20 @@ lang: de **Was ist ein Token?** -Token können praktisch alles in Ethereum darstellen: +Token können in [Ethereum](/) praktisch alles repräsentieren: -- Reputationspunkte auf einer Online-Platform +- Reputationspunkte auf einer Online-Plattform - Fähigkeiten eines Charakters in einem Spiel -- Vermögenswerte wie Anteile an einer Firma -- Eine Fiat-Währung wie der US-Dollar -- Eine Goldunze -- und mehr... +- Finanzanlagen wie eine Unternehmensaktie +- eine Fiatwährung wie USD +- eine Unze Gold +- und vieles mehr... -Diese mächtigen Eigenschaften von Ethereum sollten in einem stabilen Standard bereitgestellt werden, oder? Und genau das ist der Punkt, an dem ERC-20 ins Spiel kommt! Dieser Standard ermöglicht es Entwicklern, Token zu erstellen, die mit anderen Produkten und Services interagieren können. Der ERC-20-Standard wird auch verwendet, um [Ether](/glossary/#ether) zusätzliche Funktionalität bereitzustellen. +Eine so mächtige Funktion von Ethereum muss durch einen robusten Standard gehandhabt werden, richtig? Genau hier kommt ERC-20 ins Spiel! Dieser Standard ermöglicht es Entwicklern, Token-Anwendungen zu erstellen, die mit anderen Produkten und Dienstleistungen interoperabel sind. Der ERC-20-Standard wird auch verwendet, um [Ether](/glossary/#ether) zusätzliche Funktionen bereitzustellen. **Was ist ERC-20?** -Der ERC-20 führt einen Standard für fungible Token ein, das heißt, sie haben eine Eigenschaft, die jeden Token genau gleich (in Art und Wert) wie einen anderen Token macht. Zum Beispiel verhält sich ein ERC-20-Token genau wie der ETH. Das bedeutet, dass ein Token -immer dem Wert aller anderen Token entspricht. +ERC-20 führt einen Standard für fungible Token ein. Mit anderen Worten: Sie haben eine Eigenschaft, die jeden Token (in Art und Wert) exakt gleich wie einen anderen Token macht. Ein ERC-20-Token verhält sich beispielsweise genau wie ETH, was bedeutet, dass 1 Token immer gleich allen anderen Token ist und sein wird. ## Voraussetzungen {#prerequisites} @@ -32,17 +31,16 @@ immer dem Wert aller anderen Token entspricht. ## Hauptteil {#body} -Der im November 2015 von Fabian Vogelsteller eingereichte ERC-20-Antrag (Ethereum Request for Comments 20) ist ein Token-Standard, der -eine API für Tokens innerhalb von Smart Contracts implementiert. +Der ERC-20 (Ethereum Request for Comments 20), der im November 2015 von Fabian Vogelsteller vorgeschlagen wurde, ist ein Token-Standard, der eine API für Token innerhalb von Smart Contracts implementiert. -Beispielfunktionalitäten, die ERC-20 bietet: +Beispielfunktionen, die ERC-20 bietet: - Token von einem Konto auf ein anderes übertragen -- den aktuellen Token-Saldo eines Kontos abfragen -- den im Netz verfügbaren Gesamtvorrat an Token ermitteln -- genehmigen, ob ein Token-Betrag von einem Konto durch ein Drittkonto ausgegeben werden kann +- den aktuellen Token-Kontostand eines Kontos abrufen +- das Gesamtangebot des im Netzwerk verfügbaren Tokens abrufen +- genehmigen, ob eine bestimmte Menge an Token von einem Konto durch ein Drittanbieter-Konto ausgegeben werden darf -Wenn ein Smart Contract die folgenden Methoden und Ereignisse implementiert, kann er als ERC-20-Token-Vertrag bezeichnet werden und ist nach der Bereitstellung dafür verantwortlich, die erstellten Token auf Ethereum zu verfolgen. +Wenn ein Smart Contract die folgenden Methoden und Ereignisse implementiert, kann er als ERC-20-Token-Vertrag bezeichnet werden. Sobald er bereitgestellt ist, ist er dafür verantwortlich, die erstellten Token auf Ethereum zu verfolgen. Aus [EIP-20](https://eips.ethereum.org/EIPS/eip-20): @@ -69,9 +67,7 @@ event Approval(address indexed _owner, address indexed _spender, uint256 _value) ### Beispiele {#web3py-example} -Sehen wir uns an, wie wichtig ein Standard ist, um uns die Überprüfung jedes ERC-20-Token-Vertrags auf Ethereum zu erleichtern. -Wir benötigen lediglich das Contract Application Binary Interface (ABI), um eine Schnittstelle zu einem beliebigen ERC-20-Token zu erstellen. Wie Sie -unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem Beispiel mit geringer Reibung zu machen. +Lassen Sie uns sehen, warum ein Standard so wichtig ist, um es uns einfach zu machen, jeden ERC-20-Token-Vertrag auf Ethereum zu überprüfen. Wir benötigen lediglich das Contract Application Binary Interface (ABI), um eine Schnittstelle zu einem beliebigen ERC-20-Token zu erstellen. Wie Sie unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem reibungslosen Beispiel zu machen. #### Web3.py-Beispiel {#web3py-example} @@ -87,13 +83,13 @@ from web3 import Web3 w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) -dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI -weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Gedeckter Ether (WETH) +dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI +weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped Ether (WETH) -acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2 +acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2 -# Dies ist eine vereinfachte Contract Application Binary Interface (ABI) eines ERC-20-Token-Vertrags. -# Es werden nur die Methoden verfügbar gemacht: balanceOf(address), decimals(), symbol() und totalSupply() +# Dies ist eine vereinfachte Contract Application Binary Interface (ABI) eines ERC-20-Token-Contracts. +# Es stellt nur die Methoden: balanceOf(address), decimals(), symbol() und totalSupply() bereit. simplified_abi = [ { 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}], @@ -127,7 +123,7 @@ decimals = dai_contract.functions.decimals().call() totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals -# DAI +# DAI print("===== %s =====" % symbol) print("Total Supply:", totalSupply) print("Addr Balance:", addr_balance) @@ -138,7 +134,7 @@ decimals = weth_contract.functions.decimals().call() totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals -# WETH +# WETH print("===== %s =====" % symbol) print("Total Supply:", totalSupply) print("Addr Balance:", addr_balance) @@ -148,42 +144,47 @@ print("Addr Balance:", addr_balance) ### Problem beim Empfang von ERC-20-Token {#reception-issue} -**Bis zum 20.06.2024 gingen aufgrund dieses Problems ERC-20-Token im Wert von mindestens 83.656.418 US-Dollar verloren. Beachten Sie, dass eine reine ERC-20-Implementierung anfällig für dieses Problem ist, es sei denn, Sie implementieren zusätzlich zu dem Standard eine Reihe weiterer Einschränkungen, wie unten aufgeführt.** +**Bis zum 20.06.2024 gingen aufgrund dieses Problems ERC-20-Token im Wert von mindestens 83.656.418 $ verloren. Beachten Sie, dass eine reine ERC-20-Implementierung für dieses Problem anfällig ist, es sei denn, Sie implementieren zusätzlich zum Standard eine Reihe von Einschränkungen, wie unten aufgeführt.** -Wenn ERC-20-Token an einen Smart Contract gesendet werden, der nicht für den Umgang mit ERC-20-Token ausgelegt ist, können diese Token dauerhaft verloren gehen. Das passiert, weil der empfangende Vertrag nicht die Funktionalität hat, die eingehenden Token zu erkennen oder darauf zu reagieren, und es gibt keinen Mechanismus im ERC-20-Standard, um den empfangenden Vertrag über die eingehenden Token zu benachrichtigen. Die Hauptursachen dieses Problems sind: +Wenn ERC-20-Token an einen Smart Contract gesendet werden, der nicht für die Verarbeitung von ERC-20-Token ausgelegt ist, können diese Token dauerhaft verloren gehen. Dies geschieht, weil der empfangende Vertrag nicht über die Funktionalität verfügt, die eingehenden Token zu erkennen oder darauf zu reagieren, und es im ERC-20-Standard keinen Mechanismus gibt, um den empfangenden Vertrag über die eingehenden Token zu benachrichtigen. Dieses Problem tritt hauptsächlich auf folgende Weise auf: -1. Token-Übertragungsmechanismus - -- ERC-20-Token werden mit den Funktionen transfer oder transferFrom übertragen - - Wenn ein Benutzer Token an eine Vertragsadresse mit diesen Funktionen sendet, werden die Token unabhängig davon übertragen, ob der empfangende Vertrag dafür ausgelegt ist oder nicht - -2. Fehlende Benachrichtigung - - Der empfangende Vertrag erhält keine Benachrichtigung oder Rückmeldung, dass Token an ihn gesendet wurden - - Wenn der empfangende Vertrag keinen Mechanismus hat, um Token zu verarbeiten (z.B. eine Fallback-Funktion oder eine spezielle Funktion zur Verwaltung des Tokenempfangs), bleiben die Token effektiv in der Adresse des Vertrags hängen -3. Keine eingebaute Verarbeitung - - Der ERC-20-Standard enthält keine obligatorische Funktion, die empfangende Verträge implementieren müssen, was dazu führt, dass viele Verträge nicht in der Lage sind, eingehende Token richtig zu verwalten +1. Token-Übertragungsmechanismus + - ERC-20-Token werden mit den Funktionen transfer oder transferFrom übertragen + - Wenn ein Benutzer Token mit diesen Funktionen an eine Vertragsadresse sendet, werden die Token übertragen, unabhängig davon, ob der empfangende Vertrag für deren Verarbeitung ausgelegt ist +2. Fehlende Benachrichtigung + - Der empfangende Vertrag erhält keine Benachrichtigung oder keinen Rückruf, dass Token an ihn gesendet wurden + - Wenn dem empfangenden Vertrag ein Mechanismus zur Verarbeitung von Token fehlt (z. B. eine Fallback-Funktion oder eine dedizierte Funktion zur Verwaltung des Token-Empfangs), stecken die Token effektiv in der Adresse des Vertrags fest +3. Keine integrierte Verarbeitung + - Der ERC-20-Standard enthält keine obligatorische Funktion, die empfangende Verträge implementieren müssen, was zu einer Situation führt, in der viele Verträge eingehende Token nicht ordnungsgemäß verwalten können **Mögliche Lösungen** -Es ist zwar nicht möglich, dieses Problem mit ERC-20 vollständig zu verhindern, aber es gibt Methoden, mit denen die Wahrscheinlichkeit eines Sickerverlusts für den Endnutzer erheblich verringert werden kann: +Obwohl es nicht möglich ist, dieses Problem bei ERC-20 vollständig zu verhindern, gibt es Methoden, mit denen die Wahrscheinlichkeit eines Token-Verlusts für den Endbenutzer erheblich verringert werden kann: -- Das häufigste Problem tritt auf, wenn ein Benutzer Token an die Adresse des Token-Vertrags selbst sendet (z. B. USDT, die an die Adresse des USDT-Token-Vertrags eingezahlt werden). Es wird empfohlen, die transfer(..)-Funktion einzuschränken, um solche Übertragungsversuche rückgängig zu machen. Erwägen Sie, die Prüfung require(_to != address(this)); in die Implementierung der Funktion transfer(..) aufzunehmen. -- Die transfer(..)-Funktion ist im Allgemeinen nicht dafür ausgelegt, Token in Verträge einzuzahlen. `Genehmigung(..) & transferFrom(..)`-Muster wird stattdessen verwendet, um ERC-20-Token in Verträge einzuzahlen. Es ist möglich, die Transferfunktion so einzuschränken, dass keine Token in Verträge mit dieser Funktion eingezahlt werden können. Dies kann jedoch die Kompatibilität mit Verträgen beeinträchtigen, die davon ausgehen, dass Token mit der Funktion trasnfer(..) in Verträge eingezahlt werden können (z. B. Uniswap-Liquiditätspools). -- Gehen Sie immer davon aus, dass ERC-20-Token in Ihrem Vertrag landen können, auch wenn Ihr Vertrag eigentlich keine erhalten soll. Es gibt keine Möglichkeit, versehentliche Einzahlungen aufseiten des Empfängers zu verhindern oder abzulehnen. Es wird empfohlen, eine Funktion zu implementieren, mit der versehentlich hinterlegte ERC-20-Token extrahiert werden können. +- Das häufigste Problem tritt auf, wenn ein Benutzer Token an die Adresse des Token-Vertrags selbst sendet (z. B. USDT, die an die Adresse des USDT-Token-Vertrags eingezahlt werden). Es wird empfohlen, die Funktion `transfer(..)` einzuschränken, um solche Übertragungsversuche rückgängig zu machen. Erwägen Sie das Hinzufügen der Überprüfung `require(_to != address(this));` innerhalb der Implementierung der Funktion `transfer(..)`. +- Die Funktion `transfer(..)` ist im Allgemeinen nicht für die Einzahlung von Token in Verträge vorgesehen. Stattdessen wird das Muster `approve(..) & transferFrom(..)` verwendet, um ERC-20-Token in Verträge einzuzahlen. Es ist möglich, die Übertragungsfunktion so einzuschränken, dass die Einzahlung von Token in beliebige Verträge damit nicht zulässig ist. Dies kann jedoch die Kompatibilität mit Verträgen beeinträchtigen, die davon ausgehen, dass Token mit der Funktion `transfer(..)` in Verträge eingezahlt werden können (z. B. Uniswap-Liquiditätspools). +- Gehen Sie immer davon aus, dass ERC-20-Token in Ihrem Vertrag landen können, selbst wenn Ihr Vertrag niemals welche erhalten soll. Es gibt keine Möglichkeit, versehentliche Einzahlungen auf Empfängerseite zu verhindern oder abzulehnen. Es wird empfohlen, eine Funktion zu implementieren, mit der versehentlich eingezahlte ERC-20-Token extrahiert werden können. - Erwägen Sie die Verwendung alternativer Token-Standards. -Aus diesem Problem sind einige alternative Standards hervorgegangen, wie zum Beispiel [ERC-223](/developers/docs/standards/tokens/erc-223) oder [ERC-1363](/developers/docs/standards/tokens/erc-1363). +Aus diesem Problem sind einige alternative Standards hervorgegangen, wie z. B. [ERC-223](/developers/docs/standards/tokens/erc-223) oder [ERC-1363](/developers/docs/standards/tokens/erc-1363). -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} - [EIP-20: ERC-20-Token-Standard](https://eips.ethereum.org/EIPS/eip-20) -- [OpenZeppelin – Tokens](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) -- [OpenZeppelin – ERC-20-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) -- [Alchemy – Leitfaden für Solidity-ERC20-Token](https://www.alchemy.com/overviews/erc20-solidity) +- [OpenZeppelin - Token](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) +- [OpenZeppelin - ERC-20-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) +- [Alchemy - Leitfaden zu Solidity-ERC20-Token](https://www.alchemy.com/overviews/erc20-solidity) -## Andere fungible Token-Standards {#fungible-token-standards} +## Andere Standards für fungible Token {#fungible-token-standards} - [ERC-223](/developers/docs/standards/tokens/erc-223) - [ERC-1363](/developers/docs/standards/tokens/erc-1363) - [ERC-777](/developers/docs/standards/tokens/erc-777) -- [ERC-4626 – Tokenisierte Vaults](/developers/docs/standards/tokens/erc-4626) +- [ERC-4626 - Tokenisierte Tresore](/developers/docs/standards/tokens/erc-4626) + +## Tutorials: Mit ERC-20 auf Ethereum bauen {#tutorials} + +- [ERC-20-Vertrag-Walkthrough](/developers/tutorials/erc20-annotated-code/) _– Ein zeilenweise kommentierter Walkthrough der OpenZeppelin-ERC-20-Vertragsimplementierung._ +- [ERC-20 mit Sicherheitsvorkehrungen](/developers/tutorials/erc20-with-safety-rails/) _– Wie man ERC-20-Token mit Schutzmaßnahmen versieht, um Benutzern zu helfen, häufige Fehler zu vermeiden._ +- [Senden von Token mit ethers.js](/developers/tutorials/send-token-ethersjs/) _– Ein anfängerfreundlicher Leitfaden zur Übertragung von ERC-20-Token mit ethers.js._ +- [Einige Tricks von Betrugs-Token und wie man sie erkennt](/developers/tutorials/scam-token-tricks/) _– Ein tiefer Einblick in Muster von betrügerischen ERC-20-Token und wie man sie identifiziert._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md index 3d3df0d7aae..518510d4e78 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md @@ -1,6 +1,6 @@ --- -title: ERC-223 Token-Standard -description: "Eine Übersicht über den ERC-223-Fungible-Token-Standard, wie er funktioniert und ein Vergleich mit ERC-20." +title: ERC-223-Token-Standard +description: "Ein Überblick über den fungiblen Token-Standard ERC-223, wie er funktioniert und ein Vergleich mit ERC-20." lang: de --- @@ -8,14 +8,14 @@ lang: de ### Was ist ERC-223? {#what-is-erc223} -ERC-223 ist ein Standard für Fungible Tokens, ähnlich dem ERC-20-Standard. Der Hauptunterschied besteht darin, dass ERC-223 nicht nur die Token-API definiert, sondern auch die Logik für die Übertragung von Token vom Absender zum Empfänger. Es führt ein Kommunikationsmodell ein, das ermöglicht, dass Token-Übertragungen auf der Empfängerseite verarbeitet werden können. +ERC-223 ist ein Standard für fungible Token, ähnlich dem ERC-20-Standard. Der Hauptunterschied besteht darin, dass ERC-223 nicht nur die Token-API definiert, sondern auch die Logik für die Übertragung von Token vom Sender zum Empfänger. Er führt ein Kommunikationsmodell ein, das es ermöglicht, Token-Übertragungen auf der Seite des Empfängers zu verarbeiten. ### Unterschiede zu ERC-20 {#erc20-differences} -ERC-223 behebt einige Einschränkungen von ERC-20 und führt eine neue Methode der Interaktion zwischen dem Token-Contract und einem Contract, der Token empfangen kann, ein. Es gibt einige Dinge, die mit ERC-223 möglich sind, nicht jedoch mit ERC-20: +ERC-223 behebt einige Einschränkungen von ERC-20 und führt eine neue Methode der Interaktion zwischen dem Token-Vertrag und einem Vertrag ein, der die Token empfangen kann. Es gibt einige Dinge, die mit ERC-223 möglich sind, aber nicht mit ERC-20: -- Verarbeitung von Token-Übertragungen auf der Empfängerseite: Empfänger können erkennen, dass ein ERC-223-Token eingezahlt wird. -- Ablehnung falsch gesendeter Token: Wenn ein Nutzer ERC-223-Token an einen Contract sendet, der keine Token empfangen soll, kann der Contract die Transaktion ablehnen und so Token-Verluste verhindern. +- Verarbeitung von Token-Übertragungen auf Empfängerseite: Empfänger können erkennen, dass ein ERC-223-Token eingezahlt wird. +- Ablehnung von unsachgemäß gesendeten Token: Wenn ein Benutzer ERC-223-Token an einen Vertrag sendet, der keine Token empfangen soll, kann der Vertrag die Transaktion ablehnen und so einen Token-Verlust verhindern. - Metadaten in Übertragungen: ERC-223-Token können Metadaten enthalten, wodurch beliebige Informationen an Token-Transaktionen angehängt werden können. ## Voraussetzungen {#prerequisites} @@ -27,17 +27,17 @@ ERC-223 behebt einige Einschränkungen von ERC-20 und führt eine neue Methode d ## Hauptteil {#body} -ERC-223 ist ein Token-Standard, der eine Programmierschnittstelle (API) für Token innerhalb von Smart Contracts implementiert. Zudem legt er eine API für Contracts fest, die ERC-223-Tokens empfangen sollen. Contracts, die die ERC-223-Empfänger-API nicht unterstützen, können keine ERC-223-Token empfangen, wodurch Nutzerfehler vermieden werden. +ERC-223 ist ein Token-Standard, der eine API für Token innerhalb von Smart Contracts implementiert. Er deklariert auch eine API für Verträge, die ERC-223-Token empfangen sollen. Verträge, die die ERC-223-Empfänger-API nicht unterstützen, können keine ERC-223-Token empfangen, was Benutzerfehler verhindert. -Ein Smart Contract kann als ERC-223-kompatibler Token-Contract bezeichnet werden, wenn er die folgenden Methoden und Ereignisse implementiert. Nach der Bereitstellung ist er dafür verantwortlich, die erstellten Token auf Ethereum zu verwalten. +Wenn ein Smart Contract die folgenden Methoden und Ereignisse implementiert, kann er als ERC-223-kompatibler Token-Vertrag bezeichnet werden. Sobald er bereitgestellt ist, ist er dafür verantwortlich, die erstellten Token auf Ethereum zu verfolgen. -Der Contract ist nicht verpflichtet, ausschließlich diese Funktionen zu enthalten; Entwickler:innen können beliebige weitere Funktionen aus anderen Token-Standards hinzufügen. Beispielsweise gehören die Funktionen `approve` und `transferFrom` nicht zum ERC-223-Standard, können jedoch bei Bedarf implementiert werden. +Der Vertrag ist nicht verpflichtet, nur diese Funktionen zu haben, und ein Entwickler kann diesem Vertrag jede andere Funktion aus verschiedenen Token-Standards hinzufügen. Zum Beispiel sind die Funktionen `approve` und `transferFrom` nicht Teil des ERC-223-Standards, aber diese Funktionen könnten implementiert werden, falls dies erforderlich sein sollte. -Von [EIP-223](https://eips.ethereum.org/EIPS/eip-223): +Aus [EIP-223](https://eips.ethereum.org/EIPS/eip-223): ### Methoden {#methods} -ERC-223-Token müssen die folgenden Methoden implementieren: +Ein ERC-223-Token muss die folgenden Methoden implementieren: ```solidity function name() public view returns (string) @@ -49,13 +49,13 @@ function transfer(address _to, uint256 _value) public returns (bool success) function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success) ``` -Ein Contract, der ERC-223-Token empfangen soll, muss die folgende Methode implementieren: +Ein Vertrag, der ERC-223-Token empfangen soll, muss die folgende Methode implementieren: ```solidity function tokenReceived(address _from, uint _value, bytes calldata _data) ``` -Wenn ERC-223-Token an einen Contract gesendet werden, der die Funktion `tokenReceived(..)` nicht implementiert, muss die Übertragung fehlschlagen und die Token dürfen nicht vom Guthaben des Absenders abgebucht werden. +Wenn ERC-223-Token an einen Vertrag gesendet werden, der die Funktion `tokenReceived(..)` nicht implementiert, muss die Übertragung fehlschlagen und die Token dürfen nicht vom Guthaben des Senders abgebucht werden. ### Ereignisse {#events} @@ -65,11 +65,11 @@ event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes ### Beispiele {#examples} -Die API des ERC-223-Tokens ist ähnlich der von ERC-20, sodass es aus Sicht der UI-Entwicklung keinen Unterschied gibt. Die einzige Ausnahme ist hier, dass ERC-223-Token möglicherweise keine `approve` + `transferFrom`-Funktionen haben, da diese für diesen Standard optional sind. +Die API des ERC-223-Tokens ähnelt der von ERC-20, sodass es aus Sicht der UI-Entwicklung keinen Unterschied gibt. Die einzige Ausnahme hierbei ist, dass ERC-223-Token möglicherweise keine `approve` + `transferFrom`-Funktionen haben, da diese für diesen Standard optional sind. #### Solidity-Beispiele {#solidity-example} -Das folgende Beispiel veranschaulicht, wie ein einfacher ERC-223-Token-Contract funktioniert: +Das folgende Beispiel veranschaulicht, wie ein grundlegender ERC-223-Token-Vertrag funktioniert: ```solidity pragma solidity ^0.8.19; @@ -115,7 +115,7 @@ contract VeryBasicERC223Token { } ``` -Nun soll ein anderer Contract Einzahlungen von `tokenA` annehmen, vorausgesetzt, tokenA ist ein ERC-223-Token. Der Contract darf nur tokenA annehmen und alle anderen Token ablehnen. Wenn der Contract tokenA empfängt, muss er ein `Deposit()`-Ereignis auslösen und den Wert der internen Variable `deposits` erhöhen. +Nun möchten wir, dass ein anderer Vertrag Einzahlungen von `tokenA` akzeptiert, unter der Annahme, dass tokenA ein ERC-223-Token ist. Der Vertrag darf nur tokenA akzeptieren und muss alle anderen Token ablehnen. Wenn der Vertrag tokenA empfängt, muss er ein `Deposit()`-Ereignis auslösen und den Wert der internen Variablen `deposits` erhöhen. Hier ist der Code: @@ -127,10 +127,10 @@ contract RecipientContract is IERC223Recipient { function tokenReceived(address _from, uint _value, bytes memory _data) public override { // Es ist wichtig zu verstehen, dass innerhalb dieser Funktion - // msg.sender die Adresse des Tokens ist, der empfangen wird, - // msg.value immer 0 ist, da der Token-Contract in den meisten Fällen keinen Ether besitzt oder sendet, - // _from der Absender der Token-Übertragung ist, - // _value die Menge der eingezahlten Token ist. + // msg.sender die Adresse eines Tokens ist, der empfangen wird, + // msg.value immer 0 ist, da der Token-Vertrag in den meisten Fällen kein Ether besitzt oder sendet, + // _from der Absender des Token-Transfers ist, + // _value die Anzahl der Token ist, die eingezahlt wurde. require(msg.sender == tokenA); deposits += _value; emit Deposit(_from); @@ -140,21 +140,21 @@ contract RecipientContract is IERC223Recipient { ## Häufig gestellte Fragen {#faq} -### Was passiert, wenn wir tokenB an den Contract senden? {#sending-tokens} +### Was passiert, wenn wir etwas tokenB an den Vertrag senden? {#sending-tokens} -Die Transaktion wird fehlschlagen, und die Übertragung der Token wird nicht stattfinden. Die Token werden an die Adresse des Absenders zurückgegeben. +Die Transaktion wird fehlschlagen und die Übertragung der Token wird nicht stattfinden. Die Token werden an die Adresse des Senders zurückgegeben. -### Wie können wir eine Einzahlung an diesen Contract tätigen? {#contract-deposits} +### Wie können wir eine Einzahlung in diesen Vertrag vornehmen? {#contract-deposits} -Rufen Sie die Funktion `transfer(address,uint256)` oder `transfer(address,uint256,bytes)` des ERC-223-Tokens auf und geben Sie dabei die Adresse des `RecipientContract` an. +Rufen Sie die Funktion `transfer(address,uint256)` oder `transfer(address,uint256,bytes)` des ERC-223-Tokens auf und geben Sie die Adresse des `RecipientContract` an. -### Was geschieht, wenn wir einen ERC-20-Token an diesen Contract überweisen? {#erc-20-transfers} +### Was passiert, wenn wir einen ERC-20-Token an diesen Vertrag übertragen? {#erc-20-transfers} -Wenn ein ERC-20-Token an den `RecipientContract` gesendet wird, werden die Token zwar übertragen, die Übertragung wird jedoch nicht erkannt (es wird kein `Deposit()`-Event ausgelöst und der Einzahlungswert ändert sich nicht). Unerwünschte ERC-20-Einzahlungen können nicht gefiltert oder verhindert werden. +Wenn ein ERC-20-Token an den `RecipientContract` gesendet wird, werden die Token übertragen, aber die Übertragung wird nicht erkannt (es wird kein `Deposit()`-Ereignis ausgelöst und der Wert der Einzahlungen ändert sich nicht). Unerwünschte ERC-20-Einzahlungen können nicht gefiltert oder verhindert werden. -### Was, wenn wir nach Abschluss der Token-Einzahlung eine bestimmte Funktion ausführen möchten? {#function-execution} +### Was ist, wenn wir nach Abschluss der Token-Einzahlung eine Funktion ausführen möchten? {#function-execution} -Dafür gibt es mehrere Möglichkeiten. In diesem Beispiel folgen wir der Methode, die ERC-223-Übertragungen mit Ether-Übertragungen identisch macht: +Es gibt mehrere Möglichkeiten, dies zu tun. In diesem Beispiel folgen wir der Methode, die ERC-223-Übertragungen identisch mit Ether-Übertragungen macht: ```solidity contract RecipientContract is IERC223Recipient { @@ -164,7 +164,7 @@ contract RecipientContract is IERC223Recipient { function tokenReceived(address _from, uint _value, bytes memory _data) public override { require(msg.sender == tokenA); - address(this).call(_data); // Eingehende Transaktion verarbeiten und einen nachfolgenden Funktionsaufruf durchführen. + address(this).call(_data); // Eingehende Transaktion verarbeiten und einen anschließenden Funktionsaufruf durchführen. } function foo() public { @@ -177,21 +177,21 @@ contract RecipientContract is IERC223Recipient { } ``` -Wenn der `RecipientContract` einen ERC-223-Token empfängt, führt der Contract eine Funktion aus, die als `_data`-Parameter der Token-Transaktion kodiert ist, genauso wie Ether-Transaktionen Funktionsaufrufe als Transaktions-`data` kodieren. Lesen Sie [das Datenfeld](/developers/docs/transactions/#the-data-field) für weitere Informationen. +Wenn der `RecipientContract` einen ERC-223-Token empfängt, führt der Vertrag eine Funktion aus, die als `_data`-Parameter der Token-Transaktion codiert ist, identisch damit, wie Ether-Transaktionen Funktionsaufrufe als Transaktions-`data` codieren. Lesen Sie [das Datenfeld](/developers/docs/transactions/#the-data-field) für weitere Informationen. -Im obigen Beispiel muss ein ERC-223-Token mit der Funktion `transfer(address,uin256,bytes calldata _data)` an die Adresse des `RecipientContract` gesendet werden. Wenn der data-Parameter den Wert `0xc2985578` (die Signatur der Funktion `foo()`) enthält, wird die Funktion `foo()` nach dem Empfang der Token-Einzahlung aufgerufen und das Ereignis `Foo()` ausgelöst. +Im obigen Beispiel muss ein ERC-223-Token mit der Funktion `transfer(address,uin256,bytes calldata _data)` an die Adresse des `RecipientContract` übertragen werden. Wenn der Datenparameter `0xc2985578` (die Signatur einer `foo()`-Funktion) ist, wird die Funktion foo() aufgerufen, nachdem die Token-Einzahlung empfangen wurde, und das Ereignis Foo() wird ausgelöst. -Parameter können ebenfalls im `data`-Feld der Token-Überweisung kodiert werden. Beispielsweise lässt sich die Funktion `bar()` mit dem Wert 12345 für den Parameter `_someNumber` aufrufen. In diesem Fall muss `data` den Wert `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2` haben, wobei `0x0423a132` die Signatur der `bar(uint256)`-Funktion ist und `00000000000000000000000000000000000000000000000000000000000004d2` 12345 als uint256 darstellt. +Parameter können auch in den `data` der Token-Übertragung codiert werden, zum Beispiel können wir die Funktion bar() mit dem Wert 12345 für `_someNumber` aufrufen. In diesem Fall müssen die `data` `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2` sein, wobei `0x0423a132` die Signatur der Funktion `bar(uint256)` ist und `00000000000000000000000000000000000000000000000000000000000004d2` 12345 als uint256 ist. ## Einschränkungen {#limitations} -Obwohl ERC-223 mehrere Probleme des ERC-20-Standards behebt, hat er auch seine eigenen Einschränkungen: +Obwohl ERC-223 mehrere Probleme des ERC-20-Standards behebt, ist er nicht ohne eigene Einschränkungen: -- Verbreitung und Kompatibilität: ERC-223 ist noch nicht weit verbreitet, was seine Kompatibilität mit bestehenden Tools und Plattformen einschränken kann. -- Abwärtskompatibilität: ERC-223 ist nicht abwärtskompatibel zu ERC-20, was bedeutet, dass bestehende ERC-20-Contracts und -Tools ohne Änderungen nicht mit ERC-223-Token funktionieren. +- Akzeptanz und Kompatibilität: ERC-223 ist noch nicht weit verbreitet, was seine Kompatibilität mit bestehenden Tools und Plattformen einschränken kann. +- Abwärtskompatibilität: ERC-223 ist nicht abwärtskompatibel mit ERC-20, was bedeutet, dass bestehende ERC-20-Verträge und -Tools ohne Modifikationen nicht mit ERC-223-Token funktionieren. - Gaskosten: Die zusätzlichen Überprüfungen und Funktionalitäten bei ERC-223-Übertragungen können im Vergleich zu ERC-20-Transaktionen zu höheren Gaskosten führen. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [EIP-223: ERC-223 Token-Standard](https://eips.ethereum.org/EIPS/eip-223) -- [Ursprünglicher ERC-223-Vorschlag](https://github.com/ethereum/eips/issues/223) +- [EIP-223: ERC-223-Token-Standard](https://eips.ethereum.org/EIPS/eip-223) +- [Ursprünglicher ERC-223-Vorschlag](https://github.com/ethereum/eips/issues/223) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md index 64ce934e4bc..b912f398fe2 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md @@ -1,34 +1,34 @@ --- -title: "ERC-4626 Tokenisierter Tresor Standard " -description: "Standard für Ertragstragende Gewölbe." +title: ERC-4626 Tokenized Vault Standard +description: "Ein Standard für renditebringende Vaults." lang: de --- ## Einführung {#introduction} -ERC-4626 ist ein Standard zur Optimierung und Vereinheitlichung der technischen Parameter von Ertragstragende bringenden Tresoren. Es bietet eine Standard-API für tokenisierte, Ertragstragende Tresore, die Anteile eines einzelnen zugrunde liegenden ERC-20-Tokens darstellen. ERC-4626 beschreibt außerdem eine optionale Erweiterung für tokenisierte Tresore unter Verwendung von ERC-20, die grundlegende Funktionen zum Einzahlen, Abheben von Token und Lesen von Guthaben bietet. +ERC-4626 ist ein Standard zur Optimierung und Vereinheitlichung der technischen Parameter von renditebringenden Vaults. Er bietet eine Standard-API für tokenisierte renditebringende Vaults, die Anteile an einem einzigen zugrunde liegenden ERC-20-Token repräsentieren. ERC-4626 skizziert außerdem eine optionale Erweiterung für tokenisierte Vaults, die ERC-20 nutzen, und bietet grundlegende Funktionen für das Einzahlen und Abheben von Token sowie das Auslesen von Kontoständen. -**Die Rolle von ERC-4626 in Ertragstragende Tresoren** +**Die Rolle von ERC-4626 in renditebringenden Vaults** -Kreditmärkte, Aggregatoren und Token mit intrinsischem Zinssatz helfen Benutzern, durch die Umsetzung verschiedener Strategien die beste Rendite für ihre Krypto-Token zu erzielen. Diese Strategien werden mit geringfügigen Abweichungen umgesetzt, was fehleranfällig sein oder eine Verschwendung von Entwicklungsressourcen bedeuten kann. +Kreditmärkte, Aggregatoren und intrinsisch verzinsliche Token helfen Benutzern, die beste Rendite für ihre Krypto-Token zu finden, indem sie verschiedene Strategien ausführen. Diese Strategien werden mit leichten Variationen durchgeführt, was fehleranfällig sein kann oder Entwicklungsressourcen verschwendet. -ERC-4626 in Ertragstragende Tresoren wird den Integrationsaufwand verringern und den Zugriff auf Erträge in verschiedenen Anwendungen mit geringem Spezialaufwand der Entwickler freigeben, indem konsistent und robustere Implementierungsmuster erstellt werden. +ERC-4626 in renditebringenden Vaults wird den Integrationsaufwand verringern und den Zugang zu Renditen in verschiedenen Anwendungen mit geringem speziellem Aufwand für Entwickler freischalten, indem konsistentere und robustere Implementierungsmuster geschaffen werden. Der ERC-4626-Token wird vollständig in [EIP-4626](https://eips.ethereum.org/EIPS/eip-4626) beschrieben. -**Asynchrone Gewölbe Verlängerung (ERC-7540)** +**Asynchrone Vault-Erweiterung (ERC-7540)** -ERC-4626 ist für atomare Einzahlungen und Rücknahmen bis zu einem bestimmten Limit optimiert. Wenn das Limit erreicht ist, können keine neuen Einzahlungen oder Rücknahmen mehr vorgenommen werden. Diese Einschränkung funktioniert nicht gut für Smart-Contract-Systeme mit asynchronen Aktionen oder Verzögerungen als Voraussetzung für die Interaktion mit dem Vault (z. B. Protokolle für Real-World-Assets, Protokolle für unterbesicherte Kredite, kettenübergreifende Kreditprotokolle, liquide Staking-Token oder Versicherungssicherheitsmodule). +ERC-4626 ist für atomare Einzahlungen und Rücknahmen bis zu einem bestimmten Limit optimiert. Wenn das Limit erreicht ist, können keine neuen Einzahlungen oder Rücknahmen eingereicht werden. Diese Einschränkung funktioniert nicht gut für ein Smart Contract-System mit asynchronen Aktionen oder Verzögerungen als Voraussetzung für die Interaktion mit dem Vault (z. B. Protokolle für reale Vermögenswerte, unterbesicherte Kreditprotokolle, Cross-Chain-Kreditprotokolle, Liquid Staking-Token oder Versicherungs-Sicherheitsmodule). -ERC-7540 erweitert den Nutzen von ERC-4626 Gewölbe für asynchrone Anwendungsfälle. Die bestehende Vault-Schnittstelle (`deposit`/`withdraw`/`mint`/`redeem`) wird vollständig genutzt, um asynchrone Anfragen zu beanspruchen. +ERC-7540 erweitert den Nutzen von ERC-4626-Vaults für asynchrone Anwendungsfälle. Die bestehende Vault-Schnittstelle (`deposit`/`withdraw`/`mint`/`redeem`) wird vollständig genutzt, um asynchrone Anfragen (Requests) geltend zu machen. Die ERC-7540-Erweiterung wird vollständig in [ERC-7540](https://eips.ethereum.org/EIPS/eip-7540) beschrieben. -**Multi Asset Gewölbe Erweiterung (ERC-7575)** +**Multi-Asset-Vault-Erweiterung (ERC-7575)** -Ein fehlender Anwendungsfall, der von ERC-4626 nicht unterstützt wird, sind Tresore mit mehreren Vermögenswerten oder Einstiegspunkten wie Liquiditätsanbieter-Token (LP). Diese sind im Allgemeinen unhandlich oder nicht konform, da ERC-4626 selbst ein ERC-20 sein muss. +Ein fehlender Anwendungsfall, der von ERC-4626 nicht unterstützt wird, sind Vaults, die über mehrere Vermögenswerte oder Einstiegspunkte verfügen, wie z. B. Liquidity-Provider-Token (LP-Token). Diese sind im Allgemeinen unhandlich oder nicht konform, da ERC-4626 vorschreibt, selbst ein ERC-20 zu sein. -ERC-7575 fügt Unterstützung für Gewölbe mit mehreren Assets hinzu, indem die ERC-20-Token-Implementierung aus der ERC-4626-Implementierung ausgelagert wird. +ERC-7575 fügt Unterstützung für Vaults mit mehreren Vermögenswerten hinzu, indem die ERC-20-Token-Implementierung aus der ERC-4626-Implementierung ausgelagert wird. Die ERC-7575-Erweiterung wird vollständig in [ERC-7575](https://eips.ethereum.org/EIPS/eip-7575) beschrieben. @@ -46,7 +46,7 @@ Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [T function asset() public view returns (address assetTokenAddress) ``` -Diese Funktion gibt die Adresse des zugrunde liegenden Tokens zurück, der für den Tresor zum Buchen, Einzahlen und Abheben verwendet wird. +Diese Funktion gibt die Adresse des zugrunde liegenden Tokens zurück, das für den Vault zur Buchführung, Einzahlung und Abhebung verwendet wird. #### totalAssets {#totalassets} @@ -54,7 +54,7 @@ Diese Funktion gibt die Adresse des zugrunde liegenden Tokens zurück, der für function totalAssets() public view returns (uint256) ``` -Diese Funktion gibt den Gesamtbetrag der vom Tresor gehaltenen Basiswerte zurück. +Diese Funktion gibt den Gesamtbetrag der zugrunde liegenden Vermögenswerte zurück, die vom Vault gehalten werden. #### convertToShares {#convertoshares} @@ -62,7 +62,7 @@ Diese Funktion gibt den Gesamtbetrag der vom Tresor gehaltenen Basiswerte zurüc function convertToShares(uint256 assets) public view returns (uint256 shares) ``` -Diese Funktion gibt die Anzahl der `shares` zurück, die vom Vault für die bereitgestellte Menge an `assets` ausgetauscht würden. +Diese Funktion gibt die Menge an `shares` (Anteilen) zurück, die vom Vault gegen die bereitgestellte Menge an `assets` (Vermögenswerten) eingetauscht werden würde. #### convertToAssets {#convertoassets} @@ -70,7 +70,7 @@ Diese Funktion gibt die Anzahl der `shares` zurück, die vom Vault für die bere function convertToAssets(uint256 shares) public view returns (uint256 assets) ``` -Diese Funktion gibt die Menge der `assets` zurück, die vom Vault für die bereitgestellte Anzahl an `shares` ausgetauscht würden. +Diese Funktion gibt die Menge an `assets` zurück, die vom Vault gegen die bereitgestellte Menge an `shares` eingetauscht werden würde. #### maxDeposit {#maxdeposit} @@ -78,7 +78,7 @@ Diese Funktion gibt die Menge der `assets` zurück, die vom Vault für die berei function maxDeposit(address receiver) public view returns (uint256 maxAssets) ``` -Diese Funktion gibt die maximale Menge an zugrunde liegenden Assets zurück, die in einem einzigen [`deposit`](#deposit)-Aufruf eingezahlt werden kann, wobei die Anteile für den `receiver` geprägt werden. +Diese Funktion gibt den maximalen Betrag an zugrunde liegenden Vermögenswerten zurück, der in einem einzigen [`deposit`](#deposit)-Aufruf eingezahlt werden kann, wobei die Anteile für den `receiver` (Empfänger) geprägt werden. #### previewDeposit {#previewdeposit} @@ -86,7 +86,7 @@ Diese Funktion gibt die maximale Menge an zugrunde liegenden Assets zurück, die function previewDeposit(uint256 assets) public view returns (uint256 shares) ``` -Mit dieser Funktion können Benutzer die Auswirkungen ihrer Einzahlung auf den aktuellen Block simulieren. +Diese Funktion ermöglicht es Benutzern, die Auswirkungen ihrer Einzahlung im aktuellen Block zu simulieren. #### deposit {#deposit} @@ -94,7 +94,7 @@ Mit dieser Funktion können Benutzer die Auswirkungen ihrer Einzahlung auf den a function deposit(uint256 assets, address receiver) public returns (uint256 shares) ``` -Diese Funktion hinterlegt `assets` von zugrunde liegenden Token im Vault und überträgt das Eigentum an `shares` an den `receiver`. +Diese Funktion zahlt `assets` der zugrunde liegenden Token in den Vault ein und gewährt dem `receiver` das Eigentum an den `shares`. #### maxMint {#maxmint} @@ -102,7 +102,7 @@ Diese Funktion hinterlegt `assets` von zugrunde liegenden Token im Vault und üb function maxMint(address receiver) public view returns (uint256 maxShares) ``` -Diese Funktion gibt die maximale Anzahl an `shares` zurück, die in einem einzigen [`mint`](#mint)-Aufruf geprägt werden können, wobei die Anteile für den `receiver` geprägt werden. +Diese Funktion gibt die maximale Anzahl an Anteilen zurück, die in einem einzigen [`mint`](#mint)-Aufruf geprägt werden können, wobei die Anteile für den `receiver` geprägt werden. #### previewMint {#previewmint} @@ -110,7 +110,7 @@ Diese Funktion gibt die maximale Anzahl an `shares` zurück, die in einem einzig function previewMint(uint256 shares) public view returns (uint256 assets) ``` -Mit dieser Funktion können Benutzer die Auswirkungen ihrer Münze auf den aktuellen Block simulieren. +Diese Funktion ermöglicht es Benutzern, die Auswirkungen ihrer Prägung im aktuellen Block zu simulieren. #### mint {#mint} @@ -118,7 +118,7 @@ Mit dieser Funktion können Benutzer die Auswirkungen ihrer Münze auf den aktue function mint(uint256 shares, address receiver) public returns (uint256 assets) ``` -Diese Funktion prägt genau `shares` Vault-Anteile für den `receiver`, indem `assets` von zugrunde liegenden Token hinterlegt werden. +Diese Funktion prägt genau `shares` Vault-Anteile für den `receiver`, indem `assets` der zugrunde liegenden Token eingezahlt werden. #### maxWithdraw {#maxwithdraw} @@ -126,7 +126,7 @@ Diese Funktion prägt genau `shares` Vault-Anteile für den `receiver`, indem `a function maxWithdraw(address owner) public view returns (uint256 maxAssets) ``` -Diese Funktion gibt die maximale Menge an zugrunde liegenden Assets zurück, die mit einem einzigen [`withdraw`](#withdraw)-Aufruf vom Guthaben des `owner` abgehoben werden kann. +Diese Funktion gibt den maximalen Betrag an zugrunde liegenden Vermögenswerten zurück, der mit einem einzigen [`withdraw`](#withdraw)-Aufruf vom Guthaben des `owner` (Eigentümers) abgehoben werden kann. #### previewWithdraw {#previewwithdraw} @@ -134,7 +134,7 @@ Diese Funktion gibt die maximale Menge an zugrunde liegenden Assets zurück, die function previewWithdraw(uint256 assets) public view returns (uint256 shares) ``` -Mit dieser Funktion können Benutzer die Auswirkungen ihrer Abhebung im aktuellen Block simulieren. +Diese Funktion ermöglicht es Benutzern, die Auswirkungen ihrer Abhebung im aktuellen Block zu simulieren. #### withdraw {#withdraw} @@ -142,7 +142,7 @@ Mit dieser Funktion können Benutzer die Auswirkungen ihrer Abhebung im aktuelle function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares) ``` -Diese Funktion verbrennt `shares` vom `owner` und sendet genau `assets` Token vom Vault an den `receiver`. +Diese Funktion verbrennt `shares` vom `owner` und sendet genau `assets` Token aus dem Vault an den `receiver`. #### maxRedeem {#maxredeem} @@ -150,7 +150,7 @@ Diese Funktion verbrennt `shares` vom `owner` und sendet genau `assets` Token vo function maxRedeem(address owner) public view returns (uint256 maxShares) ``` -Diese Funktion gibt die maximale Anzahl an `shares` zurück, die durch einen [`redeem`](#redeem)-Aufruf vom Guthaben des `owner` eingelöst werden können. +Diese Funktion gibt die maximale Anzahl an Anteilen zurück, die durch einen [`redeem`](#redeem)-Aufruf vom Guthaben des `owner` eingelöst werden können. #### previewRedeem {#previewredeem} @@ -158,7 +158,7 @@ Diese Funktion gibt die maximale Anzahl an `shares` zurück, die durch einen [`r function previewRedeem(uint256 shares) public view returns (uint256 assets) ``` -Mit dieser Funktion können Benutzer die Auswirkungen ihrer Einlösung im aktuellen Block simulieren. +Diese Funktion ermöglicht es Benutzern, die Auswirkungen ihrer Einlösung im aktuellen Block zu simulieren. #### redeem {#redeem} @@ -166,7 +166,7 @@ Mit dieser Funktion können Benutzer die Auswirkungen ihrer Einlösung im aktuel function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets) ``` -Diese Funktion löst eine bestimmte Anzahl von `shares` vom `owner` ein und sendet `assets` des zugrunde liegenden Tokens vom Vault an den `receiver`. +Diese Funktion löst eine bestimmte Anzahl von `shares` vom `owner` ein und sendet `assets` des zugrunde liegenden Tokens aus dem Vault an den `receiver`. #### totalSupply {#totalsupply} @@ -174,7 +174,7 @@ Diese Funktion löst eine bestimmte Anzahl von `shares` vom `owner` ein und send function totalSupply() public view returns (uint256) ``` -Gibt die Gesamtzahl der im Umlauf befindlichen, nicht eingelösten Aktie zurück. +Gibt die Gesamtzahl der nicht eingelösten Vault-Anteile im Umlauf zurück. #### balanceOf {#balanceof} @@ -182,7 +182,7 @@ Gibt die Gesamtzahl der im Umlauf befindlichen, nicht eingelösten Aktie zurück function balanceOf(address owner) public view returns (uint256) ``` -Gibt die Gesamtmenge der Vault-Anteile zurück, die der `owner` aktuell besitzt. +Gibt die Gesamtmenge an Vault-Anteilen zurück, die der `owner` derzeit besitzt. ### Übersicht der Schnittstelle {#mapOfTheInterface} @@ -190,9 +190,9 @@ Gibt die Gesamtmenge der Vault-Anteile zurück, die der `owner` aktuell besitzt. ### Ereignisse {#events} -#### Einzahlungsereignis +#### Deposit-Ereignis -**MUSS** ausgegeben werden, wenn Token über die Methoden [`mint`](#mint) und [`deposit`](#deposit) in den Vault eingezahlt werden. +**MUSS** ausgelöst werden, wenn Token über die Methoden [`mint`](#mint) und [`deposit`](#deposit) in den Vault eingezahlt werden. ```solidity event Deposit( @@ -203,11 +203,11 @@ event Deposit( ) ``` -Wobei `sender` der Benutzer ist, der `assets` gegen `shares` getauscht und diese `shares` an den `owner` übertragen hat. +Wobei `sender` der Benutzer ist, der `assets` gegen `shares` eingetauscht und diese `shares` an den `owner` übertragen hat. -#### Ereignis zurückziehen +#### Withdraw-Ereignis -**MUSS** ausgegeben werden, wenn Anteile von einem Einzahler über die Methoden [`redeem`](#redeem) oder [`withdraw`](#withdraw) aus dem Vault abgehoben werden. +**MUSS** ausgelöst werden, wenn Anteile von einem Einzahler über die Methoden [`redeem`](#redeem) oder [`withdraw`](#withdraw) aus dem Vault abgehoben werden. ```solidity event Withdraw( @@ -219,9 +219,9 @@ event Withdraw( ) ``` -Wobei `sender` der Benutzer ist, der die Abhebung ausgelöst und die dem `owner` gehörenden `shares` gegen `assets` getauscht hat. `receiver` ist der Benutzer, der die abgehobenen `assets` erhalten hat. +Wobei `sender` der Benutzer ist, der die Abhebung ausgelöst und `shares`, die dem `owner` gehören, gegen `assets` eingetauscht hat. `receiver` ist der Benutzer, der die abgehobenen `assets` erhalten hat. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -- [EIP-4626: Standard für tokenisierte Vaults](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub-Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) +- [EIP-4626: Tokenized Vault Standard](https://eips.ethereum.org/EIPS/eip-4626) +- [ERC-4626: GitHub-Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md index a0d5f1d898b..9ccb023d14e 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md @@ -1,6 +1,6 @@ --- -title: ERC-721 Nicht-fungibler Token-Standard -description: "Erfahren Sie mehr über ERC-721, den Standard für nicht fungible Token (NFTs), die einzigartige digitale Assets auf Ethereum darstellen." +title: "ERC-721 Standard für nicht-fungible Token" +description: "Erfahren Sie mehr über ERC-721, den Standard für nicht-fungible Token (NFTs), die einzigartige digitale Vermögenswerte auf Ethereum repräsentieren." lang: de --- @@ -8,20 +8,13 @@ lang: de **Was ist ein nicht-fungibler Token?** -Ein nicht-fungibler Token (NFT) wird verwendet, um etwas oder jemanden auf eine einzigartige Weise zu identifizieren. Diese Art von Token ist perfekt, um -auf Plattformen verwendet zu werden, die Sammelartikel anbieten, Zugang zu Schlüsseln, Lotteriekarten, nummerierten Plätzen für Konzerte und -Sportspiele, etc. Diese spezielle Art von Token hat erstaunliche Möglichkeiten, so dass er einen angemessenen Standard verdient. Der ERC-721 -hat dies gelöst! +Ein nicht-fungibler Token (NFT) wird verwendet, um etwas oder jemanden auf einzigartige Weise zu identifizieren. Diese Art von Token eignet sich perfekt für Plattformen, die Sammlerstücke, Zugangsschlüssel, Lotterielose, nummerierte Sitzplätze für Konzerte und Sportveranstaltungen usw. anbieten. Diese spezielle Art von Token bietet erstaunliche Möglichkeiten und verdient daher einen eigenen Standard. Der ERC-721 wurde entwickelt, um genau das zu lösen! **Was ist ERC-721?** -Der ERC-721 führt eine Norm für NFT ein, mit anderen Worten, diese Art von Token ist einzigartig und kann einen anderen Wert haben -als ein anderer Token des gleichen Smart Contract, vielleicht wegen seines Alters, seiner Seltenheit oder auch so etwas wie sein visuelles Bild. -Moment mal, visuell? +Der ERC-721 führt einen Standard für NFTs ein. Mit anderen Worten: Diese Art von Token ist einzigartig und kann einen anderen Wert haben als ein anderer Token aus demselben Smart Contract, vielleicht aufgrund seines Alters, seiner Seltenheit oder sogar aufgrund von etwas anderem wie seinem Aussehen. Moment, Aussehen? -Ja! Alle NFTs haben eine `uint256`-Variable namens `tokenId`. Daher muss für jeden ERC-721-Vertrag das Paar -`Vertragsadresse, uint256 tokenId` global einzigartig sein. Eine Dapp kann jedoch einen "Konverter" haben, der -die `tokenId` als Eingabe verwendet und ein Bild von etwas Coolem ausgibt, wie Zombies, Waffen, Fähigkeiten oder fantastischen Kätzchen! +Ja! Alle NFTs haben eine `uint256`-Variable namens `tokenId`. Für jeden ERC-721-Vertrag muss das Paar `contract address, uint256 tokenId` (Vertragsadresse, uint256 tokenId) also global einzigartig sein. Das bedeutet, dass eine Dapp einen „Konverter“ haben kann, der die `tokenId` als Eingabe verwendet und ein Bild von etwas Coolem ausgibt, wie Zombies, Waffen, Fähigkeiten oder fantastische Kätzchen! ## Voraussetzungen {#prerequisites} @@ -31,15 +24,11 @@ die `tokenId` als Eingabe verwendet und ein Bild von etwas Coolem ausgibt, wie Z ## Hauptteil {#body} -Der ERC-721 (Ethereum Request for Comments 721), im Januar 2018 von William Entriken, Dieter Shirley, Jacob Evans und -Nastassia Sachs vorgeschlagen, ist ein nicht-fungibler Token-Standard, der eine API für Tokens innerhalb von Smart Contracts implementiert. +Der ERC-721 ([Ethereum](/) Request for Comments 721), der im Januar 2018 von William Entriken, Dieter Shirley, Jacob Evans und Nastassia Sachs vorgeschlagen wurde, ist ein Standard für nicht-fungible Token, der eine API für Token innerhalb von Smart Contracts implementiert. -Er bietet Funktionen wie die Übertragung von Token von einem Konto auf ein anderes, um den aktuellen Token-Saldo eines Kontos, den Eigentümer eines spezifischen Tokens sowie den Gesamtbestand der im Netzwerk verfügbaren Token abzurufen. -Daneben gibt es auch einige andere Funktionalitäten wie zum Beispiel zu genehmigen, dass eine gewisse Menge an Token von einem Konto -von einem Drittkonto verschoben werden kann. +Er bietet Funktionen wie die Übertragung von Token von einem Konto auf ein anderes, die Abfrage des aktuellen Token-Guthabens eines Kontos, die Ermittlung des Eigentümers eines bestimmten Tokens sowie des Gesamtangebots des im Netzwerk verfügbaren Tokens. Darüber hinaus verfügt er über einige weitere Funktionen, wie z. B. die Genehmigung, dass eine bestimmte Menge an Token von einem Konto durch ein Drittkonto verschoben werden kann. -Wenn ein Smart Contract folgende Methoden und Ereignisse implementiert, kann er als ERC-721 nicht-fungibler Token-Vertrag -bezeichnet werden. Einmal implementiert, werden mit ihm die erstellten Token auf Ethereum verfolgt. +Wenn ein Smart Contract die folgenden Methoden und Ereignisse implementiert, kann er als ERC-721-Vertrag für nicht-fungible Token bezeichnet werden und ist nach seiner Bereitstellung dafür verantwortlich, die auf Ethereum erstellten Token zu verfolgen. Aus [EIP-721](https://eips.ethereum.org/EIPS/eip-721): @@ -67,9 +56,7 @@ Aus [EIP-721](https://eips.ethereum.org/EIPS/eip-721): ### Beispiele {#web3py-example} -Lassen Sie uns sehen, wie wichtig ein Standard ist, um es uns einfach zu machen, jeden ERC-721 Token-Vertrag auf Ethereum zu inspizieren. -Wir benötigen nur das Application Binary Interface (ABI) des Vertrags, um eine Schnittstelle zu jedem ERC-721 Token zu erstellen. Wie Sie -unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem Beispiel mit geringer Reibung zu machen. +Schauen wir uns an, warum ein Standard so wichtig ist, um es uns einfach zu machen, jeden ERC-721-Token-Vertrag auf Ethereum zu überprüfen. Wir benötigen lediglich das Contract Application Binary Interface (ABI), um eine Schnittstelle zu einem beliebigen ERC-721-Token zu erstellen. Wie Sie unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem reibungslosen Beispiel zu machen. #### Web3.py-Beispiel {#web3py-example} @@ -86,12 +73,12 @@ from web3._utils.events import get_event_data w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) -ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties-Vertrag +ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties-Contract -acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties-Verkaufsauktion +acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties-Verkaufsauktion -# Dies ist eine vereinfachte Contract Application Binary Interface (ABI) eines ERC-721-NFT-Vertrags. -# Es werden nur die folgenden Methoden offengelegt: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() +# Dies ist ein vereinfachtes Contract Application Binary Interface (ABI) eines ERC-721 NFT-Contracts. +# Es stellt nur die folgenden Methoden bereit: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() simplified_abi = [ { 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}], @@ -149,7 +136,7 @@ print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}") pregnant_kitties = ck_contract.functions.pregnantKitties().call() print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}") -# Die Transfer-Event-ABI verwenden, um Informationen über übertragene Kitties zu erhalten. +# Verwendung der Transfer-Event-ABI, um Informationen über übertragene Kitties zu erhalten. tx_event_abi = { 'anonymous': False, 'inputs': [ @@ -160,7 +147,7 @@ tx_event_abi = { 'type': 'event' } -# Wir benötigen die Signatur des Ereignisses, um die Protokolle zu filtern +# Wir benötigen die Signatur des Events, um die Logs zu filtern event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex() logs = w3.eth.get_logs({ @@ -170,24 +157,24 @@ logs = w3.eth.get_logs({ }) # Hinweise: -# - Erhöhen Sie die Anzahl der Blöcke von 120, wenn kein Transfer-Ereignis zurückgegeben wird. -# - Wenn Sie kein Transfer-Ereignis gefunden haben, können Sie auch versuchen, eine tokenId unter folgendem Link zu erhalten: -# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events -# Klicken Sie, um die Protokolle des Ereignisses zu erweitern, und kopieren Sie das Argument „tokenId“ +# - Erhöhen Sie die Anzahl der Blöcke über 120 hinaus, wenn kein Transfer-Event zurückgegeben wird. +# - Wenn Sie kein Transfer-Event gefunden haben, können Sie auch versuchen, eine tokenId hier zu erhalten: +# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events +# Klicken Sie, um die Logs des Events zu erweitern, und kopieren Sie das Argument "tokenId" recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs] if recent_tx: - kitty_id = recent_tx[0]['tokenId'] # Fügen Sie die „tokenId“ von dem obigen Link hier ein + kitty_id = recent_tx[0]['tokenId'] # Fügen Sie die "tokenId" aus dem obigen Link hier ein is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}") ``` -Der Krypto-Kitties-Vertrag hat neben den Standard-Events noch einige weitere interessante Events. +Der CryptoKitties-Vertrag hat neben den Standardereignissen noch einige andere interessante Ereignisse. -Sehen wir uns zwei von ihnen an, `Pregnant` und `Birth`. +Schauen wir uns zwei davon an: `Pregnant` und `Birth`. ```python -# Verwendung der ABIs der Ereignisse „Pregnant“ und „Birth“, um Informationen über neue Kitties zu erhalten. +# Verwendung der Pregnant- und Birth-Event-ABI, um Informationen über neue Kitties zu erhalten. ck_extra_events_abi = [ { 'anonymous': False, @@ -211,13 +198,13 @@ ck_extra_events_abi = [ 'type': 'event' }] -# Wir benötigen die Signatur des Ereignisses, um die Protokolle zu filtern +# Wir benötigen die Signatur des Events, um die Logs zu filtern ck_event_signatures = [ w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(), w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), ] -# Hier ist ein „Pregnant“-Ereignis: +# Hier ist ein Pregnant-Event: # - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog pregnant_logs = w3.eth.get_logs({ "fromBlock": w3.eth.block_number - 120, @@ -227,7 +214,7 @@ pregnant_logs = w3.eth.get_logs({ recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs] -# Hier ist ein „Birth“-Ereignis: +# Hier ist ein Birth-Event: # - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a birth_logs = w3.eth.get_logs({ "fromBlock": w3.eth.block_number - 120, @@ -240,24 +227,26 @@ recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] f ## Beliebte NFTs {#popular-nfts} -- Der [Etherscan NFT Tracker](https://etherscan.io/nft-top-contracts) listet die Top-NFTs auf Ethereum nach Übertragungsvolumen auf. -- [CryptoKitties](https://www.cryptokitties.co/) ist ein Spiel, das sich um züchtbare, sammelbare und überaus entzückende - Kreaturen dreht, die wir CryptoKitties nennen. -- [Sorare](https://sorare.com/) ist ein globales Fantasy-Football-Spiel, bei dem Sie Sammlerstücke in limitierter Auflage sammeln, - Ihre Teams verwalten und um Preise wetteifern können. -- [Der Ethereum Name Service (ENS)](https://ens.domains/) bietet eine sichere und dezentralisierte Möglichkeit, Ressourcen sowohl - on-chain als auch off-chain mithilfe einfacher, für Menschen lesbarer Namen zu adressieren. -- [POAP](https://poap.xyz) verteilt kostenlose NFTs an Personen, die an Veranstaltungen teilnehmen oder bestimmte Aktionen durchführen. POAPs können kostenlos erstellt und verteilt werden. -- [Unstoppable Domains](https://unstoppabledomains.com/) ist ein in San Francisco ansässiges Unternehmen, das Domains auf - Blockchains erstellt. Blockchain-Domains ersetzen Kryptowährungsadressen durch für Menschen lesbare Namen und können verwendet werden, um - zensurresistente Websites zu ermöglichen. -- [Gods Unchained Cards](https://godsunchained.com/) ist ein TCG auf der Ethereum-Blockchain, das NFTs verwendet, um echtes Eigentum - an In-Game-Assets zu ermöglichen. -- [Bored Ape Yacht Club](https://boredapeyachtclub.com) ist eine Sammlung von 10.000 einzigartigen NFTs. Diese sind nicht nur nachweislich seltene Kunstwerke, sondern fungieren auch als Mitgliedschafts-Token für den Club, der seinen Mitgliedern Vergünstigungen und Vorteile bietet, die im Laufe der Zeit durch die Bemühungen der Community zunehmen. - -## Weiterführende Lektüre {#further-reading} - -- [EIP-721: ERC-721-Standard für nicht-fungible Token](https://eips.ethereum.org/EIPS/eip-721) -- [OpenZeppelin – ERC-721-Dokumentation](https://docs.openzeppelin.com/contracts/3.x/erc721) -- [OpenZeppelin – ERC-721-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) +- [Etherscan NFT Tracker](https://etherscan.io/nft-top-contracts) listet die Top-NFTs auf Ethereum nach Transfervolumen auf. +- [CryptoKitties](https://www.cryptokitties.co/) ist ein Spiel, das sich um züchtbare, sammelbare und ach so entzückende Kreaturen dreht, die wir CryptoKitties nennen. +- [Sorare](https://sorare.com/) ist ein globales Fantasy-Fußballspiel, bei dem Sie Sammlerstücke in limitierter Auflage sammeln, Ihre Teams verwalten und antreten können, um Preise zu gewinnen. +- [Der Ethereum Name Service (ENS)](https://ens.domains/) bietet eine sichere und dezentralisierte Möglichkeit, Ressourcen sowohl auf der Blockchain als auch Off-Chain mit einfachen, für Menschen lesbaren Namen zu adressieren. +- [POAP](https://poap.xyz) liefert kostenlose NFTs an Personen, die an Veranstaltungen teilnehmen oder bestimmte Aktionen abschließen. POAPs können kostenlos erstellt und verteilt werden. +- [Unstoppable Domains](https://unstoppabledomains.com/) ist ein in San Francisco ansässiges Unternehmen, das Domains auf Blockchains aufbaut. Blockchain-Domains ersetzen Kryptowährungsadressen durch für Menschen lesbare Namen und können verwendet werden, um zensurresistente Websites zu ermöglichen. +- [Gods Unchained Cards](https://godsunchained.com/) ist ein TCG auf der Ethereum-Blockchain, das NFTs verwendet, um echtes Eigentum an In-Game-Assets zu ermöglichen. +- [Bored Ape Yacht Club](https://boredapeyachtclub.com) ist eine Sammlung von 10.000 einzigartigen NFTs, die nicht nur ein nachweislich seltenes Kunstwerk sind, sondern auch als Mitgliedschafts-Token für den Club fungieren und Mitgliedervorteile und Vergünstigungen bieten, die im Laufe der Zeit durch die Bemühungen der Community zunehmen. + +## Weiterführende Literatur {#further-reading} + +- [EIP-721: ERC-721 Standard für nicht-fungible Token](https://eips.ethereum.org/EIPS/eip-721) +- [OpenZeppelin - ERC-721-Dokumentation](https://docs.openzeppelin.com/contracts/3.x/erc721) +- [OpenZeppelin - ERC-721-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) - [Alchemy NFT-API](https://www.alchemy.com/docs/reference/nft-api-quickstart) + +## Tutorials: Bauen mit nicht-fungiblen Token (ERC-721) auf Ethereum {#tutorials} + +- [Vyper ERC-721 Contract Walkthrough](/developers/tutorials/erc-721-vyper-annotated-code/) _– Ein kommentierter Durchgang durch einen vollständigen ERC-721-NFT-Vertrag, der in Vyper geschrieben wurde._ +- [Wie man einen NFT schreibt und bereitstellt (Teil 1/3)](/developers/tutorials/how-to-write-and-deploy-an-nft/) _– Schritt-für-Schritt-Anleitung zum Schreiben und Bereitstellen Ihres ersten ERC-721 Smart Contracts._ +- [Wie man einen NFT prägt (Teil 2/3)](/developers/tutorials/how-to-mint-an-nft/) _– Wie man einen ERC-721-NFT mit Ihrem bereitgestellten Smart Contract und Web3 prägt._ +- [Wie Sie Ihren NFT in Ihrer Wallet anzeigen (Teil 3/3)](/developers/tutorials/how-to-view-nft-in-metamask/) _– Wie Sie Ihren geprägten NFT nach der Bereitstellung in MetaMask anzeigen._ +- [NFT-Minter-Tutorial](/developers/tutorials/nft-minter/) _– Erstellen Sie eine Full-Stack-Dapp zum Prägen von NFTs mit einem React-Frontend, MetaMask und Alchemy._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md index 8516017d6ea..a1c6f13629f 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md @@ -1,45 +1,45 @@ --- -title: ERC-777 Token-Standard -description: "Erfahren Sie mehr über ERC-777, einen verbesserten fungiblen Token-Standard mit Hooks, obwohl aus Sicherheitsgründen ERC-20 empfohlen wird." +title: ERC-777-Token-Standard +description: "Erfahren Sie mehr über ERC-777, einen verbesserten Standard für fungible Token mit Hooks, obwohl aus Sicherheitsgründen ERC-20 empfohlen wird." lang: de --- ## Warnung {#warning} -**ERC-777 ist aufgrund seiner [Anfälligkeit für verschiedene Angriffsformen](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620) nur schwer korrekt zu implementieren. Es wird empfohlen, stattdessen [ERC-20](/developers/docs/standards/tokens/erc-20/) zu verwenden.** Diese Seite bleibt als historisches Archiv erhalten. +**ERC-777 ist aufgrund seiner [Anfälligkeit für verschiedene Angriffsformen](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620) schwer korrekt zu implementieren. Es wird empfohlen, stattdessen [ERC-20](/developers/docs/standards/tokens/erc-20/) zu verwenden.** Diese Seite bleibt als historisches Archiv erhalten. -## Einführung? Einführung {#introduction} +## Einführung? {#introduction} -ERC-777 ist ein fungibler Token-Standard, der den bestehenden [ERC-20](/developers/docs/standards/tokens/erc-20/)-Standard verbessert. +ERC-777 ist ein Standard für fungible Token, der den bestehenden [ERC-20](/developers/docs/standards/tokens/erc-20/)-Standard verbessert. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [ERC-20](/developers/docs/standards/tokens/erc-20/) zu informieren. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst über [ERC-20](/developers/docs/standards/tokens/erc-20/) zu lesen. -## Welche Verbesserungen hat ERC-777 gegenüber ERC-20? {#-erc-777-vs-erc-20} +## Welche Verbesserungen bietet ERC-777 gegenüber ERC-20? {#-erc-777-vs-erc-20} ERC-777 bietet die folgenden Verbesserungen gegenüber ERC-20. ### Hooks {#hooks} -Haken sind eine Funktion, die im Code eines Smart Contract beschrieben wird. Haken werden aufgerufen, wenn Token über den Vertrag gesendet oder empfangen werden. Dies ermöglicht einem Smart Contract, auf eingehende oder ausgehende Token zu reagieren. +Hooks sind eine Funktion, die im Code eines Smart Contracts beschrieben wird. Hooks werden aufgerufen, wenn Token über den Vertrag gesendet oder empfangen werden. Dies ermöglicht es einem Smart Contract, auf eingehende oder ausgehende Token zu reagieren. -Die Hooks werden über den [ERC-1820](https://eips.ethereum.org/EIPS/eip-1820)-Standard registriert und erkannt. +Die Hooks werden mithilfe des [ERC-1820](https://eips.ethereum.org/EIPS/eip-1820)-Standards registriert und entdeckt. -#### Warum sind Haken so großartig? {#why-are-hooks-great} +#### Warum sind Hooks großartig? {#why-are-hooks-great} -1. Hooks ermöglichen es, Token an einen Vertrag zu senden und den Vertrag in einer einzigen Transaktion zu benachrichtigen, im Gegensatz zu [ERC-20](https://eips.ethereum.org/EIPS/eip-20), bei dem dafür ein doppelter Aufruf (`approve`/`transferFrom`) erforderlich ist. -2. Verträge, die keine Haken registriert haben, sind mit ERC-777 nicht kompatibel. Der sendende Vertrag bricht die Transaktion ab, wenn der empfangende Vertrag keinen Haken registriert hat. Dies verhindert versehentliche Übertragungen auf nicht-ERC-777 Smart Contracts. -3. Haken können Transaktionen ablehnen. +1. Hooks ermöglichen es, Token an einen Vertrag zu senden und den Vertrag in einer einzigen Transaktion zu benachrichtigen, im Gegensatz zu [ERC-20](https://eips.ethereum.org/EIPS/eip-20), das dafür einen doppelten Aufruf (`approve`/`transferFrom`) erfordert. +2. Verträge, die keine Hooks registriert haben, sind mit ERC-777 inkompatibel. Der sendende Vertrag bricht die Transaktion ab, wenn der empfangende Vertrag keinen Hook registriert hat. Dies verhindert versehentliche Übertragungen an Nicht-ERC-777-Smart-Contracts. +3. Hooks können Transaktionen ablehnen. ### Dezimalstellen {#decimals} -Der Standard löst auch die Verwirrung um `decimals`, die durch ERC-20 verursacht wurde. Diese Klarheit verbessert die Erfahrung der Entwickler. +Der Standard löst auch die Verwirrung um `decimals`, die in ERC-20 verursacht wurde. Diese Klarheit verbessert die Entwicklererfahrung. ### Abwärtskompatibilität mit ERC-20 {#backwards-compatibility-with-erc-20} -ERC-777 Verträge können wie ERC-20 Verträge gehandhabt werden. +Mit ERC-777-Verträgen kann so interagiert werden, als wären sie ERC-20-Verträge. -## Weiterführende Lektüre {#further-reading} +## Weiterführende Literatur {#further-reading} -[EIP-777: Token-Standard](https://eips.ethereum.org/EIPS/eip-777) +[EIP-777: Token-Standard](https://eips.ethereum.org/EIPS/eip-777) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/standards/tokens/index.md b/public/content/translations/de/developers/docs/standards/tokens/index.md index 86471f4aeb1..3cfb79397dd 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/index.md @@ -1,13 +1,15 @@ --- title: Token-Standards -description: +description: "Entdecken Sie Ethereum-Token-Standards, einschließlich ERC-20, ERC-721 und ERC-1155 für fungible und nicht-fungible Token." lang: de incomplete: true --- ## Einführung {#introduction} -Einer der vielen Entwicklungsstandards von Ethereum konzentriert sich auf Token-Schnittstellen. Diese Standards tragen dazu bei, dass Smart Contracts kombinierbar bleiben, so zum Beispiel sicherzustellen, wenn ein neues Projekt einen Token ausgibt, dass er mit den bestehenden dezentralen Börsen kompatibel bleibt. +Viele [Ethereum](/)-Entwicklungsstandards konzentrieren sich auf Token-Schnittstellen. Diese Standards tragen dazu bei, dass Smart Contracts kombinierbar bleiben. Wenn also ein neues Projekt einen Token herausgibt, bleibt dieser mit bestehenden dezentralisierten Börsen und Anwendungen kompatibel. + +Token-Standards definieren, wie sich Token im gesamten Ethereum-Ökosystem verhalten und interagieren. Sie erleichtern es Entwicklern, Anwendungen zu erstellen, ohne das Rad neu erfinden zu müssen, und stellen sicher, dass Token nahtlos mit Wallets, Börsen und DeFi-Plattformen zusammenarbeiten. Ob im Gaming, bei der Governance oder in anderen Anwendungsfällen – diese Standards sorgen für Konsistenz und machen Ethereum stärker vernetzt. ## Voraussetzungen {#prerequisites} @@ -18,18 +20,22 @@ Einer der vielen Entwicklungsstandards von Ethereum konzentriert sich auf Token- Hier sind einige der beliebtesten Token-Standards auf Ethereum: -- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Eine Standardschnittstelle für fungible (austauschbare) Token, wie z. B. Voting-Token, Staking-Token oder virtuelle Währungen. -- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Eine Standardschnittstelle für nicht-fungible Token, wie eine Urkunde für ein Kunstwerk oder ein Song. -- [ERC-777](/developers/docs/standards/tokens/erc-777/) - ERC-777 ermöglicht es, zusätzliche Funktionen auf Token aufzusetzen, wie z. B. einen Mixer-Vertrag zur Verbesserung des Transaktionsschutzes oder eine Notfall-Wiederherstellungsfunktion für den Fall, dass Sie Ihre privaten Schlüssel verlieren. -- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - ERC-1155 ermöglicht einen effizienteren Handel und die Bündelung von Transaktionen und spart damit Kosten. Dieser Token-Standard ermöglicht die Erstellung sowohl von Utility-Token (wie $BNB oder $BAT) als auch von nicht-fungiblen Token wie CryptoPunks. +- [ERC-20](/developers/docs/standards/tokens/erc-20/) – Eine Standardschnittstelle für fungible (austauschbare) Token, wie Abstimmungs-Token, Staking-Token oder virtuelle Währungen. + +### NFT-Standards {#nft-standards} + +- [ERC-721](/developers/docs/standards/tokens/erc-721/) – Eine Standardschnittstelle für nicht-fungible Token, wie eine Urkunde für ein Kunstwerk oder ein Lied. +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) – ERC-1155 ermöglicht effizientere Trades und die Bündelung von Transaktionen – und spart somit Kosten. Dieser Token-Standard ermöglicht die Erstellung sowohl von Utility-Token (wie $BNB oder $BAT) als auch von nicht-fungiblen Token wie CryptoPunks. + +Die vollständige Liste der [ERC](https://eips.ethereum.org/erc)-Vorschläge. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -_Kennen Sie einen Community-Beitrag, der Ihnen geholfen hat? Editieren Sie diese Seite und füge Sie ihn hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Token-Integration-Checkliste](/developers/tutorials/token-integration-checklist/) _– Eine Checkliste der Dinge, die bei der Interaktion mit Token berücksichtigt werden sollen._ -- [Deployment Ihres ersten Smart Contracts](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts in einem Ethereum-Testnetzwerk._ -- [Übertragung und Freigabe von ERC20-Token aus einem Solidity-Smart-Contract](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _- Wie man einen Smart Contract verwendet, um mit einem Token unter Verwendung der Solidity-Sprache zu interagieren._ -- [Implementierung eines ERC721 Marktes [eine Anleitung]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Wie man Token-Artikel dezentralisiert verkauft._ +- [Checkliste für die Token-Integration](/developers/tutorials/token-integration-checklist/) _– Eine Checkliste mit Dingen, die bei der Interaktion mit Token zu beachten sind._ +- [Den ERC20-Token Smart Contract verstehen](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts in einem Ethereum-Testnet._ +- [Übertragungen und Genehmigung von ERC20-Token aus einem Solidity Smart Contract](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Wie man einen Smart Contract verwendet, um mit einem Token unter Verwendung der Sprache Solidity zu interagieren._ +- [Implementierung eines ERC721-Marktes [eine Anleitung]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Wie man tokenisierte Artikel auf einem dezentralisierten Anzeigenportal zum Verkauf anbietet._ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/storage/index.md b/public/content/translations/de/developers/docs/storage/index.md index 9dc977599d4..e3674ac7be1 100644 --- a/public/content/translations/de/developers/docs/storage/index.md +++ b/public/content/translations/de/developers/docs/storage/index.md @@ -1,33 +1,33 @@ --- -title: Dezentrale Speicher -description: Übersicht über dezentrale Speicher und verfügbare Tools für die Integration der Speicher in eine dApp +title: Dezentralisierte Speicherung +description: "Übersicht darüber, was dezentralisierte Speicherung ist und welche Tools zur Integration in eine Dapp verfügbar sind." lang: de --- -Im Gegensatz zu einem zentralisierten Server, der von einem einzelnen Unternehmen oder einer Organisation betrieben wird, bestehen dezantrale Speichersysteme aus einem Peer-to-Peer-Netzwerk, aufgebaut aus Nutzern, die einen Teil der gesamten Daten aufbewahren. Das macht das Speichersystem sehr robust. Diese können in Blockchain-basierten Anwendungen oder jedem anderen Peer-to-Peer Netzwerk sein. +Im Gegensatz zu einem zentralisierten Server, der von einem einzigen Unternehmen oder einer einzigen Organisation betrieben wird, bestehen dezentralisierte Speichersysteme aus einem Peer-to-Peer-Netzwerk von Benutzer-Betreibern, die einen Teil der Gesamtdaten halten und so ein widerstandsfähiges System zur gemeinsamen Dateispeicherung schaffen. Diese können sich in einer Blockchain-basierten Anwendung oder einem beliebigen Peer-to-Peer-basierten Netzwerk befinden. -Ethereum selbst kann als dezentrales Speichersystem genutzt werden und das wird es zum Speichern von Code als Smart Contracts auch. Doch Ethereum wurde nicht für größere Datenmengen konzipiert. Die Chain wächst ständig – aktuell umfasst die Ethereum-Chain ca. 500 GB bis 1TB ([je nach Client](https://etherscan.io/chartsync/chaindefault)) und jeder Node im Netzwerk muss in der Lage sein, all diese Daten zu speichern. Würde die Chain immer weiter expandieren (sagen wir mal 5 TB), dann wäre es nicht mehr möglich, dass alle Nodes weiter laufen. Außerdem würden die Kosten, eine solche Datenmenge für das Mainnet bereitzustellen, wegen der [Ressourcengebühren](/developers/docs/gas) unerschwinglich hoch sein. +Ethereum selbst kann als dezentralisiertes Speichersystem verwendet werden, und das ist es auch, wenn es um die Speicherung von Code in all den Smart Contracts geht. Wenn es jedoch um große Datenmengen geht, ist Ethereum dafür nicht konzipiert worden. Die Chain wächst stetig, aber zum Zeitpunkt des Schreibens ist die Ethereum-Chain etwa 500 GB - 1 TB groß ([abhängig von der Anwendung](https://etherscan.io/chartsync/chaindefault)), und jeder Blockchain-Knoten im Netzwerk muss in der Lage sein, alle Daten zu speichern. Wenn die Chain auf große Datenmengen (sagen wir 5 TB) anwachsen würde, wäre es für alle Blockchain-Knoten nicht mehr machbar, weiterzulaufen. Außerdem wären die Kosten für die Bereitstellung einer so großen Datenmenge im Mainnet aufgrund der [Gas](/developers/docs/gas)-Gebühren unerschwinglich hoch. -Aufgrund dieser Einschränkungen ist eine andere Chain oder Methode erforderlich, um große Datenmengen dezentral abzuspeichern. +Aufgrund dieser Einschränkungen benötigen wir eine andere Chain oder Methodik, um große Datenmengen auf dezentralisierte Weise zu speichern. -Bei dezentralen Speichersystemen (dStorage) gibt es ein paar Aspekte, die Sie beachten sollten. +Bei der Betrachtung von Optionen für dezentralisierte Speicherung (dStorage) gibt es einige Dinge, die ein Benutzer beachten muss. -- Persistenzmechanismus/Anreizstruktur -- Durchsetzung der Datenspeicherung +- Persistenzmechanismus / Anreizstruktur +- Durchsetzung der Datenaufbewahrung - Dezentralität -- Konsensmechanismus +- Konsens -## Persistenzmechanismus/Anreizstruktur {#persistence-mechanism} +## Persistenzmechanismus / Anreizstruktur {#persistence-mechanism} ### Blockchain-basiert {#blockchain-based} -Damit Daten für immer persistent sind, müssen wir uns einen Persistenzmechanismus zunutze machen. Auf Ethereum besteht der Mechanismus zur Persistenz darin, dass die gesamte Chain beim Betrieb eines Nodes berücksichtigt beziehungsweise heruntergeladen werden muss. Neue Daten werden am Ende der Kette angehängt und die Kette wächst weiter – jeder Node muss alle eingebetteten Daten replizieren. +Damit ein Datenelement für immer bestehen bleibt, müssen wir einen Persistenzmechanismus verwenden. Bei Ethereum besteht der Persistenzmechanismus beispielsweise darin, dass die gesamte Chain berücksichtigt werden muss, wenn ein Blockchain-Knoten betrieben wird. Neue Datenelemente werden an das Ende der Chain angehängt, und sie wächst weiter – was erfordert, dass jeder Blockchain-Knoten alle eingebetteten Daten repliziert. -Das wird als **Blockchain-basierte** Persistenz bezeichnet. +Dies ist als **Blockchain-basierte** Persistenz bekannt. -Das Problem bei der Blockchain-basierten Persistenz ist, dass die Kette viel zu groß werden könnte, um alle Daten aufrechtzuerhalten und zu speichern (z. B. schätzen [viele Quellen](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/), dass das Internet über 40 Zetabyte Speicherkapazität benötigt). +Das Problem bei der Blockchain-basierten Persistenz ist, dass die Chain viel zu groß werden könnte, um alle Daten praktikabel zu pflegen und zu speichern (z. B. schätzen [viele Quellen](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/), dass das Internet über 40 Zettabyte Speicherkapazität benötigt). -Die Blockchain benötigt außerdem auch eine Art Anreizstruktur. Bei der Blockchain-basierten Persistenz wird eine Zahlung an den Validator durchgeführt. Wenn Daten zur Blockchain hinzugefügt werden, werden die Validatoren für das Hinzufügen der Daten bezahlt. +Die Blockchain muss auch eine Art Anreizstruktur haben. Bei der Blockchain-basierten Persistenz erfolgt eine Zahlung an den Validator. Wenn die Daten zur Chain hinzugefügt werden, werden die Validatoren dafür bezahlt, die Daten hinzuzufügen. Plattformen mit Blockchain-basierter Persistenz: @@ -36,182 +36,181 @@ Plattformen mit Blockchain-basierter Persistenz: ### Vertragsbasiert {#contract-based} -**Vertragsbasierte** Persistenz ist dazu gedacht, dass Daten nicht von jedem Node repliziert und für immer gespeichert werden können, sondern durch vertragliche Vereinbarungen aufrechterhalten werden müssen. Das sind Vereinbarungen zwischen mehreren Nodes, die einander versprechen, bestimmte Daten für einen festgelegten Zeitraum verfügbar zu halten. Wenn die Vereinbarungen auslaufen, müssen sie beendet oder erneuert werden, um die Datenpersistenz zu garantieren. +**Vertragsbasierte** Persistenz beruht auf der Intuition, dass Daten nicht von jedem Blockchain-Knoten repliziert und für immer gespeichert werden können, sondern stattdessen durch Vertragsvereinbarungen aufrechterhalten werden müssen. Dies sind Vereinbarungen, die mit mehreren Blockchain-Knoten getroffen werden, die versprochen haben, ein Datenelement für einen bestimmten Zeitraum zu halten. Sie müssen erstattet oder erneuert werden, wenn sie ablaufen, um die Daten dauerhaft zu speichern. -In den meisten Fällen werden nicht alle Daten in der Chain gespeichert, sondern nur der Hashwert der Position, an der sich die Daten in einer Chain befinden. So muss nicht die gesamte Chain skalieren, um alle Daten zu speichern. +In den meisten Fällen wird anstelle der Speicherung aller Daten auf der Blockchain der Hash des Speicherorts der Daten auf einer Chain gespeichert. Auf diese Weise muss nicht die gesamte Chain skalieren, um alle Daten zu behalten. -Plattformen mit vertragsbsierter Persistenz: +Plattformen mit vertragsbasierter Persistenz: -- [Filecoin](https://docs.filecoin.io/about-filecoin/what-is-filecoin/) -- [Skynet](https://siasky.net/) +- [Filecoin](https://docs.filecoin.io/basics/what-is-filecoin) +- [Skynet](https://sia.tech/) - [Storj](https://storj.io/) - [Züs](https://zus.network/) -- [Crust-Netzwerk](https://crust.network) +- [Crust Network](https://crust.network) - [Swarm](https://www.ethswarm.org/) - [4EVERLAND](https://www.4everland.org/) -### Weitere Überlegungen {#additional-consideration} +### Zusätzliche Überlegungen {#additional-consideration} -IPFS ist ein verteiltes System für die Speicherung und den Zugriff auf Dateien, Websites, Anwendungen und Daten. Es hat kein eingebautes Anreizsystem, sondern kann stattdessen mit einer der oben genannten vertragsbasierten Anreizlösungen für eine längerfristige Persistenz verwendet werden. Eine andere Möglichkeit, Daten auf IPFS zu halten, ist die Zusammenarbeit mit einem Pinning-Dienst, der Ihre Daten für Sie "anpinnt". Sie können sogar Ihren eigenen IPFS-Node betreiben und zum Netzwerk beitragen, um Ihre und/oder die Daten anderer kostenlos aufzubewahren. +IPFS ist ein verteiltes System zum Speichern und Zugreifen auf Dateien, Websites, Anwendungen und Daten. Es verfügt über kein integriertes Anreizsystem, kann aber stattdessen mit einer der oben genannten vertragsbasierten Anreizlösungen für eine längerfristige Persistenz verwendet werden. Eine weitere Möglichkeit, Daten auf IPFS dauerhaft zu speichern, ist die Zusammenarbeit mit einem Pinning-Dienst, der Ihre Daten für Sie „anheftet“ (pinnt). Sie können sogar Ihren eigenen IPFS-Blockchain-Knoten betreiben und zum Netzwerk beitragen, um Ihre eigenen Daten und/oder die anderer kostenlos dauerhaft zu speichern! - [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/) -- [Pinata](https://www.pinata.cloud/) _(IPFS Pinning Service)_ -- [web3.storage](https://web3.storage/) _(IPFS/Filecoin Pinning Service)_ -- [Infura](https://infura.io/product/ipfs) _(IPFS Pinning Service)_ -- [IPFS Scan](https://ipfs-scan.io) _(IPFS Pinning Explorer)_ -- [4EVERLAND](https://www.4everland.org/)_(IPFS Pinning Service)_ -- [Filebase](https://filebase.com) _(IPFS Pinning Service)_ -- [Spheron Network](https://spheron.network/) _(IPFS-/Filecoin-Pinning-Dienst)_ +- [Pinata](https://www.pinata.cloud/) _(IPFS-Pinning-Dienst)_ +- [web3.storage](https://web3.storage/) _(IPFS/Filecoin-Pinning-Dienst)_ +- [Infura](https://infura.io/product/ipfs) _(IPFS-Pinning-Dienst)_ +- [IPFS Scan](https://ipfs-scan.io) _(IPFS-Pinning-Explorer)_ +- [4EVERLAND](https://www.4everland.org/) _(IPFS-Pinning-Dienst)_ +- [Filebase](https://filebase.com) _(IPFS-Pinning-Dienst)_ +- [Spheron Network](https://spheron.network/) _(IPFS/Filecoin-Pinning-Dienst)_ -SWARM ist eine dezentrale Datenspeicherungs- und Datenverteilungstechnologie mit einem Speicher-Incentive-System und einem Speicher-Mietpreis-Orakel. +SWARM ist eine dezentralisierte Datenspeicherungs- und Verteilungstechnologie mit einem Speicheranreizsystem und einem Orakel für Speichermietpreise. -## Datenaufbewahrung/Verfügbarkeit {#data-retention} +## Datenaufbewahrung {#data-retention} -Systeme müssen für die Datenverfügbarkeit über einen Mechanismus verfügen, der genau dies sicherstellt. +Um Daten aufzubewahren, müssen Systeme über eine Art Mechanismus verfügen, der sicherstellt, dass Daten aufbewahrt werden. -### Herausforderungsmechanismus {#challenge-mechanism} +### Challenge-Mechanismus {#challenge-mechanism} -Einer der beliebtesten Wege zur Gewährleistung der Datenverfügbarkeit ist es, irgendeine Art von kryptographischer Herausforderung an die Knoten zu senden, die sie nur lösen können, wenn die Daten noch vorhanden sind. Ein einfaches Beispiel ist der Proof-of-Access von Arweave. Sie senden eine Herausforderung an Knoten, um zu sehen, ob sie über diese die Daten im aktuellsten Block sowie einem zufälligen Block in der Vergangenheit verfügen. Hat ein Knoten nicht die richtige Antwort, wird er bestraft. +Eine der beliebtesten Methoden, um sicherzustellen, dass Daten aufbewahrt werden, ist die Verwendung einer Art kryptografischer Challenge (Herausforderung), die an die Blockchain-Knoten ausgegeben wird, um sicherzustellen, dass sie die Daten noch haben. Ein einfaches Beispiel ist der Proof-of-Access von Arweave. Sie geben eine Challenge an die Blockchain-Knoten aus, um zu sehen, ob sie die Daten sowohl im aktuellsten Block als auch in einem zufälligen Block in der Vergangenheit haben. Wenn der Blockchain-Knoten die Antwort nicht liefern kann, wird er bestraft. -Anbieter von dStorage mit einem Herausforderungsmechanismus: +Arten von dStorage mit einem Challenge-Mechanismus: - Züs - Skynet - Arweave - Filecoin -- Crust Netzwerk +- Crust Network - 4EVERLAND ### Dezentralität {#decentrality} -Es gibt keine hervorragenden Tools, um den Grad der Dezentralität von Plattformen festzustellen. Doch im Allgemeinen sollte man die Tools verwenden, die keine Form von KYC für die Benutzung benötigen. +Es gibt keine großartigen Tools, um den Grad der Dezentralisierung von Plattformen zu messen, aber im Allgemeinen sollten Sie Tools verwenden, die keine Form von KYC haben, um den Beweis zu erbringen, dass sie nicht zentralisiert sind. -Dezentrale Tools ohne KYC: +Dezentralisierte Tools ohne KYC: -- Züs (gerade erfolgt die Implementierung einer Version ohne KYC) - Skynet - Arweave - Filecoin - IPFS - Ethereum -- Crust Netzwerk +- Crust Network - 4EVERLAND ### Konsens {#consensus} -Die meisten diesere Tools haben ihre eigene Version eines [Konsensmechanismus](/developers/docs/consensus-mechanisms/), basieren aber typischerweise auf [**Proof-of-Work (PoW)**](/developers/docs/consensus-mechanisms/pow/) oder [**Proof-of-Stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). +Die meisten dieser Tools haben ihre eigene Version eines [Konsensmechanismus](/developers/docs/consensus-mechanisms/), aber im Allgemeinen basieren sie entweder auf [**Proof-of-Work (PoW)**](/developers/docs/consensus-mechanisms/pow/) oder [**Proof-of-Stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). -Basierend auf Proof-of-Work: +Proof-of-Work-basiert: - Skynet - Arweave -Basierend auf Proof-of-Stake: +Proof-of-Stake-basiert: - Ethereum - Filecoin - Züs -- Crust Netzwerk +- Crust Network -## Verwandte Werkzeuge {#related-tools} +## Verwandte Tools {#related-tools} -**IPFS – _InterPlanetary File System ist dezentrales Speicher- und Datei-Referenzierungssystem für Ethereum_** +**IPFS – _Das InterPlanetary File System ist ein dezentralisiertes Speicher- und Dateireferenzierungssystem für Ethereum._** - [Ipfs.io](https://ipfs.io/) - [Dokumentation](https://docs.ipfs.io/) - [GitHub](https://github.com/ipfs/ipfs) -**Storj DCS – _Sicherer, privater und S3-kompatibler dezentraler Cloudobjektspeicher für Entwickler_** +**Storj DCS – _Sicherer, privater und S3-kompatibler dezentralisierter Cloud-Objektspeicher für Entwickler._** - [Storj.io](https://storj.io/) - [Dokumentation](https://docs.storj.io/) - [GitHub](https://github.com/storj/storj) -**Skynet – _Skynet ist eine dezentrale PoW-Chain speziell für ein dezentrales Web_** +**Sia – _Nutzt Kryptografie, um einen vertrauensfreien Cloud-Speicher-Marktplatz zu schaffen, der es Käufern und Verkäufern ermöglicht, direkt miteinander zu handeln._** -- [Skynet.net](https://siasky.net/) -- [Dokumentation](https://siasky.net/docs/) -- [GitHub](https://github.com/SkynetLabs/) +- [Skynet.net](https://sia.tech/) +- [Dokumentation](https://docs.sia.tech/) +- [GitHub](https://github.com/SiaFoundation/) -**Filecoin – _Erstellt vom dem Team, das hinter IPFS steht. Es handelt sich um eine Anreizebene, aufbauend auf den IPFS-Idealen._** +**Filecoin – _Filecoin wurde von demselben Team entwickelt, das auch hinter IPFS steht. Es ist eine Anreizschicht, die auf den Idealen von IPFS aufbaut._** - [Filecoin.io](https://filecoin.io/) - [Dokumentation](https://docs.filecoin.io/) - [GitHub](https://github.com/filecoin-project/) -**Arweave – _Arweave ist eine dStorage-Plattform für die Datenspeicherung_** +**Arweave – _Arweave ist eine dStorage-Plattform zur Speicherung von Daten._** - [Arweave.org](https://www.arweave.org/) - [Dokumentation](https://docs.arweave.org/info/) - [Arweave](https://github.com/ArweaveTeam/arweave/) -**Züs – _Züs ist eine Proof-of-Stake-dStorage-Plattform mit Sharding und Blobbers._** +**Züs – _Züs ist eine Proof-of-Stake-dStorage-Plattform mit Sharding und Blobbern._** - [zus.network](https://zus.network/) -- [Documentation](https://0chaindocs.gitbook.io/zus-docs) +- [Dokumentation](https://docs.zus.network/zus-docs/) - [GitHub](https://github.com/0chain/) -**Crust Netzwerk – _Crust ist eine dStorage Plattform auf dem IPFS._** +**Crust Network – _Crust ist eine dStorage-Plattform, die auf IPFS aufbaut._** - [Crust.network](https://crust.network) - [Dokumentation](https://wiki.crust.network) - [GitHub](https://github.com/crustio) -**Swarm – _Ein verteiltes Speichersystem und Content-Verteilungs-Service für den Ethereum-Web3-Stack._** +**Swarm – _Eine verteilte Speicherplattform und ein Content-Distribution-Service für den Ethereum-Web3-Stack._** - [EthSwarm.org](https://www.ethswarm.org/) -- [Dokumentation](https://docs.ethswarm.org/docs/) +- [Dokumentation](https://docs.ethswarm.org/) - [GitHub](https://github.com/ethersphere/) -**OrbitDB – _Eine dezentrale Peer-to-Peer-Datenbank, die auf IPFS basiert._** +**OrbitDB – _Eine dezentralisierte Peer-to-Peer-Datenbank, die auf IPFS aufbaut._** - [OrbitDB.org](https://orbitdb.org/) - [Dokumentation](https://github.com/orbitdb/field-manual/) - [GitHub](https://github.com/orbitdb/orbit-db/) -**Aleph.im – _Dezentrales Cloudprojekt (Datenbanken, Dateispeicherung, Computing und DID). Eine einzigartige Mischung aus Peer-to-Peer-Technologie – Off-Chain und On-Chain. IPFS und Multi-Chain-Kompatibilität._** +**Aleph.im – _Dezentralisiertes Cloud-Projekt (Datenbank, Dateispeicher, Computing und DID). Eine einzigartige Mischung aus Peer-to-Peer-Technologie Off-Chain und auf der Blockchain. IPFS- und Multi-Chain-Kompatibilität._** -- [Aleph.im](https://aleph.im/) -- [Dokumentation](https://aleph.im/#/developers/) +- [Aleph.im](https://aleph.cloud/) +- [Dokumentation](https://docs.aleph.cloud/) - [GitHub](https://github.com/aleph-im/) -**Ceramic – _Nutzergesteuerte IPFS-Datenbankspeicher für datenintensive und anspruchsvolle Anwendungen._** +**Ceramic – _Benutzergesteuerter IPFS-Datenbankspeicher für datenreiche und ansprechende Anwendungen._** - [Ceramic.network](https://ceramic.network/) -- [Dokumentation](https://developers.ceramic.network/learn/welcome/) +- [Dokumentation](https://developers.ceramic.network/) - [GitHub](https://github.com/ceramicnetwork/js-ceramic/) -**Filebase – _Ein S3-kompatibler dezentraler Speicher und geo-redundanter IPFS-Pinning-Service. Alle über Filebase auf IPFS hochgeladenen Dateien werden automatisch an die Filebase-Infrastruktur mit dreifacher Replikation auf der ganzen Welt gepinnt._** +**Filebase – _S3-kompatibler dezentralisierter Speicher und georedundanter IPFS-Pinning-Dienst. Alle Dateien, die über Filebase in IPFS hochgeladen werden, werden automatisch mit dreifacher weltweiter Replikation an die Filebase-Infrastruktur angeheftet._** - [Filebase.com](https://filebase.com/) - [Dokumentation](https://docs.filebase.com/) - [GitHub](https://github.com/filebase) -**4EVERLAND - _Eine Web 3.0-Cloud-Computing-Plattform, die Speicher-, Rechen- und Netzwerk-Kernfunktionen integriert, S3-kompatibel ist und synchrone Datenspeicherung auf dezentralen Speichernetzwerken wie IPFS und Arweave bietet._** +**4EVERLAND – _Eine Web 3.0-Cloud-Computing-Plattform, die Kernfunktionen für Speicherung, Berechnung und Netzwerke integriert, S3-kompatibel ist und synchrone Datenspeicherung in dezentralisierten Speichernetzwerken wie IPFS und Arweave bietet._** - [4everland.org](https://www.4everland.org/) - [Dokumentation](https://docs.4everland.org/) - [GitHub](https://github.com/4everland) -**Kaleido – _Eine Blockchain-as-a-Service-Plattform mit IPFS-Knoten auf einen Klick_** +**Kaleido – _Eine Blockchain-as-a-Service-Plattform mit IPFS-Blockchain-Knoten auf Knopfdruck_** - [Kaleido](https://kaleido.io/) - [Dokumentation](https://docs.kaleido.io/kaleido-services/ipfs/) - [GitHub](https://github.com/kaleido-io) -**Spheron Network – _Spheron ist eine Platform-as-a-Service (PaaS), die für dApps entwickelt wurde, die ihre Anwendungen auf dezentraler Infrastruktur mit bester Leistung starten möchten. Sie bietet standardmäßig Rechenleistung, dezentrale Speicherung, CDN und Webhosting._** +**Spheron Network – _Spheron ist eine Platform-as-a-Service (PaaS), die für Dapps entwickelt wurde, die ihre Anwendungen auf einer dezentralisierten Infrastruktur mit bester Leistung starten möchten. Sie bietet standardmäßig Rechenleistung, dezentralisierte Speicherung, CDN und Webhosting._** - [spheron.network](https://spheron.network/) - [Dokumentation](https://docs.spheron.network/) - [GitHub](https://github.com/spheronFdn) -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Was sind dezentrale Speichersysteme?](https://coinmarketcap.com/alexandria/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) – _CoinMarketCap_ -- [Fünf gängige Mythen über dezentrale Speichersysteme entlarvt](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) – _Storj_ +- [Was ist dezentralisierte Speicherung?](https://coinmarketcap.com/academy/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) – _CoinMarketCap_ +- [Fünf gängige Mythen über dezentralisierte Speicherung aufklären](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) – _Storj_ -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} -- [Entwicklungs-Frameworks](/developers/docs/frameworks/) +- [Entwicklungs-Frameworks](/developers/docs/frameworks/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/transactions/index.md b/public/content/translations/de/developers/docs/transactions/index.md index ef90d19d88f..adf82888312 100644 --- a/public/content/translations/de/developers/docs/transactions/index.md +++ b/public/content/translations/de/developers/docs/transactions/index.md @@ -1,40 +1,41 @@ --- title: Transaktionen -description: Eine Übersicht über die Transaktionen von Ethereum – wie sie arbeiten, ihre Datenstruktur und wie sie über eine App gesendet werden. +description: "Ein Überblick über Ethereum-Transaktionen – wie sie funktionieren, ihre Datenstruktur und wie man sie über eine Anwendung sendet." lang: de --- -Transaktionen sind kryptographisch signierte Anweisungen von Konten. Ein Konto wird eine Transaktion starten, um den Zustand des Ethereum-Netzwerks zu aktualisieren. Die einfachste Transaktion ist die Übertragung von ETH von einem Konto auf ein anderes. +Transaktionen sind kryptografisch signierte Anweisungen von Konten. Ein Konto initiiert eine Transaktion, um den Zustand des [Ethereum](/)-Netzwerks zu aktualisieren. Die einfachste Transaktion ist die Überweisung von ETH von einem Konto auf ein anderes. ## Voraussetzungen {#prerequisites} -Um dir zu helfen, diese Seite besser zu verstehen, empfehlen wir dir, zuerst [ Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst [Konten](/developers/docs/accounts/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Was ist eine Transaktion? {#whats-a-transaction} -Eine Transaktion von Ethereum bezieht sich auf eine Aktion, die von einem externen Konto initiiert wird; mit anderen Worten auf ein Konto, das von einem Menschen verwaltet wird und nicht von einem Vertrag. Wenn zum Beispiel Bob Alice 1 ETH sendet, muss Bobs Konto belastet werden und das von Alice muss eine Gutschrift erhalten. Diese zustandsverändernde Aktion findet innerhalb einer Transaktion statt. +Eine Ethereum-Transaktion bezieht sich auf eine Aktion, die von einem extern verwalteten Konto initiiert wird, mit anderen Worten, einem Konto, das von einem Menschen und nicht von einem Vertrag verwaltet wird. Wenn Bob beispielsweise 1 ETH an Alice sendet, muss Bobs Konto belastet und Alices Konto gutgeschrieben werden. Diese zustandsändernde Aktion findet innerhalb einer Transaktion statt. -![Diagramm mit einer Zustandsänderung aus einer Transaktion](./tx.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramm, das zeigt, wie eine Transaktion eine Zustandsänderung verursacht](./tx.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Transaktionen, die den Zustand der EVM verändern, müssen auf das gesamte Netzwerk übertragen werden. Jeder Knoten kann eine Anfrage zur Ausführung einer Transaktion an die EVM senden, woraufhin ein Validator die Transaktion ausführt und die daraus resultierende Statusänderung an den Rest des Netzwerks weitergibt. +Transaktionen, die den Zustand der EVM ändern, müssen an das gesamte Netzwerk übertragen werden. Jeder Blockchain-Knoten kann eine Anfrage zur Ausführung einer Transaktion auf der EVM übertragen; danach wird ein Validator die Transaktion ausführen und die resultierende Zustandsänderung an den Rest des Netzwerks weitergeben. -Transaktionen sind gebührenpflichtig und müssen in einem validierten Block enthalten sein. Um diesen Überblick zu vereinfachen, werden wir die Gas-Kosten und Validierungsgebühren an anderer Stelle behandeln. +Transaktionen erfordern eine Gebühr und müssen in einen validierten Block aufgenommen werden. Um diesen Überblick zu vereinfachen, werden wir Gasgebühren und Validierung an anderer Stelle behandeln. -Eine abgeschlossene Transaktion enthält folgende Informationen: +Eine eingereichte Transaktion enthält die folgenden Informationen: -- `von` – der Adresse des Senders, der die Transaktion unterzeichnet. Es handelt sich dabei um ein externes Konto, da Vertragskonten keine Transaktionen senden können. -- `to` – die Empfängeradresse (wenn es sich um ein Konto in externem Besitz handelt, wird durch die Transaktion ein Wert übertragen. Bei einem Smart-Contract-Konto führt die Transaktion den Vertragscode aus.) -- `signature` – die Kennung des Absenders. Das wird generiert, wenn der private Schlüssel des Absenders die Transaktion signiert und bestätigt, dass der Absender diese Transaktion autorisiert hat. -- `nonce` – ein fortlaufend inkrementierender Zähler, der die Transaktionsnummer eines Kontos angibt -- `Wert` – gewünschte Menge an Ether (ETH), die vom Absender an den Empfänger zu überweisen sind (in WEI, ein Ether gleicht 1e + 18wei) -- `input data` – optionales Feld für die Eingabe beliebiger Daten -- `gasLimit` – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden können. Die [EVM](/developers/docs/evm/opcodes) gibt die Gas-Einheiten an, die für jeden Berechnungsschritt benötigt werden -- `maxPriorityFeePerGas` – der Höchstpreis des verbrauchten Gas, der als Trinkgeld an den Validierer weitergegeben wird -- `maxFeePerGas` – die maximale Gebühr pro Gas-Einheit, die für die Transaktion gezahlt werden soll (einschließlich `baseFeePerGas` und `maxPriorityFeePerGas`) +- `from` – die Adresse des Absenders, der die Transaktion signieren wird. Dies ist ein extern verwaltetes Konto, da Vertragskonten keine Transaktionen senden können. +- `to` – die Empfängeradresse (wenn es sich um ein extern verwaltetes Konto handelt, überträgt die Transaktion einen Wert. Wenn es sich um ein Vertragskonto handelt, führt die Transaktion den Vertragscode aus). +- `signature` – die Kennung des Absenders. Diese wird generiert, wenn der Private-Key des Absenders die Transaktion signiert und bestätigt, dass der Absender diese Transaktion autorisiert hat. +- `nonce` – ein sequenziell inkrementierender Zähler, der die Transaktionsnummer des Kontos angibt. +- `value` – die Menge an ETH, die vom Absender an den Empfänger übertragen werden soll (angegeben in WEI, wobei 1 ETH gleich 1e+18 WEI ist). +- `input data` – optionales Feld zum Einfügen beliebiger Daten. +- `gasLimit` – die maximale Menge an Gas-Einheiten, die von der Transaktion verbraucht werden kann. Die [EVM](/developers/docs/evm/opcodes) gibt die für jeden Berechnungsschritt erforderlichen Gas-Einheiten an. +- `maxPriorityFeePerGas` – der maximale Preis des verbrauchten Gases, der als Trinkgeld für den Validator enthalten sein soll. +- `maxFeePerGas` – die maximale Gebühr pro Gas-Einheit, die für die Transaktion gezahlt werden soll (einschließlich `baseFeePerGas` und `maxPriorityFeePerGas`). -Gas ist ein Hinweis auf die Berechnung, die für die Bearbeitung der Transaktion durch einen Validierer erforderlich ist. Benutzer müssen für diese Berechnung eine Gebühr bezahlen. Das `gasLimit` und `maxPriorityFeePerGas` bestimmen die maximale Transaktionsgebühr, die an den Validator gezahlt wird. [Mehr zu Gas](/developers/docs/gas/). +Gas ist ein Maß für die Rechenleistung, die erforderlich ist, damit ein Validator die Transaktion verarbeiten kann. Benutzer müssen für diese Berechnung eine Gebühr zahlen. Das `gasLimit` und die `maxPriorityFeePerGas` bestimmen die maximale Transaktionsgebühr, die an den Validator gezahlt wird. [Mehr über Gas](/developers/docs/gas/). -Das Transaktionsobjekt wird in etwa wie folgt aussehen: +Das Transaktionsobjekt sieht in etwa so aus: ```js { @@ -48,11 +49,11 @@ Das Transaktionsobjekt wird in etwa wie folgt aussehen: } ``` -Aber ein Transaktionsobjekt muss mit dem privaten Schlüssel des Absenders signiert werden. Dies beweist, dass die Transaktion nur vom Absender hätte kommen können und nicht betrügerisch verschickt wurde. +Ein Transaktionsobjekt muss jedoch mit dem Private-Key des Absenders signiert werden. Dies beweist, dass die Transaktion nur vom Absender stammen konnte und nicht in betrügerischer Absicht gesendet wurde. -Ein Ethereum-Client wie Geth wird diesen Signaturprozess bearbeiten. +Eine Ethereum-Anwendung wie Geth übernimmt diesen Signaturprozess. -Beispiel-[JSON-RPC](/developers/docs/apis/json-rpc)-Aufruf: +Beispielhafter [JSON-RPC](/developers/docs/apis/json-rpc)-Aufruf: ```json { @@ -74,7 +75,7 @@ Beispiel-[JSON-RPC](/developers/docs/apis/json-rpc)-Aufruf: } ``` -Beispielantwort: +Beispielhafte Antwort: ```json { @@ -99,123 +100,135 @@ Beispielantwort: } ``` -- `raw` ist die signierte Transaktion in [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp) in kodierter Form. -- Das `tx` ist die signierte Transaktion im JSON-Format. +- `raw` ist die signierte Transaktion in [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp)-kodierter Form. +- `tx` ist die signierte Transaktion in JSON-Form. -Mit dem Signatur-Hash kann für die Transaktion kryptographisch nachgewiesen werden, dass sie vom Absender stammt und dem Netzwerk übermittelt wurde. +Mit dem Signatur-Hash kann kryptografisch nachgewiesen werden, dass die Transaktion vom Absender stammt und an das Netzwerk übermittelt wurde. ### Das Datenfeld {#the-data-field} -Die überwiegende Mehrheit der Transaktionen greift auf einen Vertrag über ein externes Konto zu. Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld entsprechedn dem [Application Binary Interface (ABI)](/glossary/#abi). +Die überwiegende Mehrheit der Transaktionen greift von einem extern verwalteten Konto auf einen Vertrag zu. +Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld in Übereinstimmung mit dem [Application Binary Interface (ABI)](/glossary/#abi). -Die ersten vier Bytes geben an, welche Funktion aufgerufen werden soll, wobei der Hash des Funktionsnamens und der Argumente verwendet wird. Manchmal kannst du die Funktion anhand des Selektors aus [dieser Datenbank](https://www.4byte.directory/signatures/) identifizieren. +Die ersten vier Bytes geben an, welche Funktion aufgerufen werden soll, wobei der Hash des Funktionsnamens und der Argumente verwendet wird. +Manchmal können Sie die Funktion anhand des Selektors mithilfe [dieser Datenbank](https://www.4byte.directory/signatures/) identifizieren. -Der Rest der Aufrufdaten sind die Argumente, [codiert wie in den ABI-Spezifikationen angegeben](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). +Der Rest der Aufrufdaten (Calldata) sind die Argumente, [kodiert wie in den ABI-Spezifikationen angegeben](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). -Betrachten wir zum Beispiel [diese Transaktion](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1). Verwende **Für mehr hier klicken**, um die Aufrufdaten zu sehen. +Schauen wir uns zum Beispiel [diese Transaktion](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1) an. +Verwenden Sie **Click to see More**, um die Aufrufdaten zu sehen. -Der Funktions-Selektor ist `0xa9059cbb`. Es gibt mehrere [bekannte Funktionen mit dieser Signatur](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). In diesem Fall wurde [der Contract-Quellcode](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) auf Etherscan hochgeladen, so dass wir wissen, dass die Funktion `transfer(address,uint256)` ist. +Der Funktionsselektor ist `0xa9059cbb`. Es gibt mehrere [bekannte Funktionen mit dieser Signatur](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). +In diesem Fall wurde [der Quellcode des Vertrags](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) auf Etherscan hochgeladen, sodass wir wissen, dass die Funktion `transfer(address,uint256)` ist. -Der Rest der Daten lautet: +Der Rest der Daten ist: ``` 0000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279 000000000000000000000000000000000000000000000000000000003b0559f4 ``` -Entsprechend den ABI-Spezifikationen erscheinen Ganzzahlwerte (wie Adressen, die 20-Byte-Ganzzahlen sind) in ABI als 32-Byte-Wörter, die vorne mit Nullen aufgefüllt werden. Also wissen wir, dass die Adresse von `to` [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279) ist. Der Wert ist `value` 0x3b0559f4 = 990206452. +Gemäß den ABI-Spezifikationen erscheinen ganzzahlige Werte (wie Adressen, die 20-Byte-Ganzzahlen sind) in der ABI als 32-Byte-Wörter, die vorne mit Nullen aufgefüllt sind. +Wir wissen also, dass die `to`-Adresse [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279) ist. +Der `value` ist 0x3b0559f4 = 990206452. ## Arten von Transaktionen {#types-of-transactions} -Bei Ethereum gibt es unterschiedliche Arten von Transaktionen: +Auf Ethereum gibt es einige verschiedene Arten von Transaktionen: -- Reguläre Transaktionen: eine Transaktion von einem Konto auf ein anderes. -- Vertragseinsatz-Transaktionen: eine Transaktion ohne "An"-Adresse, bei der das Datenfeld für den Vertragscode verwendet wird. -- Ausführung eines Vertrags: eine Transaktion, die mit einem bereitgestellten Smart Contract interagiert. In diesem Fall ist die Adresse von "to" die des Smart Contracts. +- Reguläre Transaktionen: eine Transaktion von einem Konto zu einem anderen. +- Vertragsbereitstellungstransaktionen: eine Transaktion ohne eine `to`-Adresse, bei der das Datenfeld für den Vertragscode verwendet wird. +- Ausführung eines Vertrags: eine Transaktion, die mit einem bereitgestellten Smart Contract interagiert. In diesem Fall ist die `to`-Adresse die Adresse des Smart Contracts. ### Über Gas {#on-gas} -Wie bereits erwähnt, kosten das Ausführen von Transaktionen [gas](/developers/docs/gas/). Einfache Überweisungstransaktionen erfordern 21000 Gas. +Wie bereits erwähnt, kostet die Ausführung von Transaktionen [Gas](/developers/docs/gas/). Einfache Überweisungstransaktionen erfordern 21.000 Einheiten Gas. -Damit Bob also Alice 1 ETH zu einer `BasisgebührPerGas` von 190 gwei und einer `maximalenPrioritätsgebührPerGas` von 10 gwei schicken kann, muss er folgende Gebühr bezahlen: +Damit Bob also 1 ETH an Alice bei einer `baseFeePerGas` von 190 Gwei und einer `maxPriorityFeePerGas` von 10 Gwei senden kann, muss Bob die folgende Gebühr zahlen: ``` -(190 + 10) * 21000 = 4.200.000 gwei ---oder-- -0,0042 ETH +(190 + 10) * 21000 = 4,200,000 gwei +--or-- +0.0042 ETH ``` -Bobs Konto wird mit **-1,0042 ETH** belastet (1 ETH für Alice + 0,0042 ETH an Gas-Gebühren) +Bobs Konto wird mit **-1,0042 ETH** belastet (1 ETH für Alice + 0,0042 ETH an Gasgebühren). -Alices Konto wird **+1,0 ETH** gutgeschrieben +Alices Konto werden **+1,0 ETH** gutgeschrieben. -Die Grundgebühr wird **-0,00399 ETH** verbrannt +Die Grundgebühr wird verbrannt: **-0,00399 ETH**. -Validatoren behalten das "Trinkgeld" **+0,000210 ETH** +Der Validator behält das Trinkgeld: **+0,000210 ETH**. -![Diagramm zeigt, wie ungenutztes Gas zurückerstattet wird](./gas-tx.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramm, das zeigt, wie ungenutztes Gas zurückerstattet wird](./gas-tx.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Jedes Gas, das nicht in einer Transaktion verwendet wird, wird auf das Benutzerkonto zurückerstattet. +Jegliches Gas, das in einer Transaktion nicht verbraucht wird, wird dem Benutzerkonto zurückerstattet. -### Smart Contract-Interaktionen {#smart-contract-interactions} +### Interaktionen mit Smart Contracts {#smart-contract-interactions} -Gas wird für jede Transaktion benötigt, die Smart Contracts betrifft. +Gas wird für jede Transaktion benötigt, die einen Smart Contract involviert. -Smart Contracts können auch Funktionen enthalten, die als [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions) oder [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions) bezeichnet werden; sie verändern nicht den Zustand des Vertrags. Daher ist es nicht erforderlich, Gas zu zahlen, wenn diese Funktionen von einem externen Konto (EOA) aufgerufen werden. Der zugrunde liegende RPC-Aufruf in diesem Szenario ist [`eth_call`](/developers/docs/apis/json-rpc#eth_call) +Smart Contracts können auch Funktionen enthalten, die als [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions)- oder [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions)-Funktionen bekannt sind und den Zustand des Vertrags nicht verändern. Daher erfordert der Aufruf dieser Funktionen von einem extern verwalteten Konto (EOA) kein Gas. Der zugrunde liegende RPC-Aufruf für dieses Szenario ist [`eth_call`](/developers/docs/apis/json-rpc#eth_call). -Im Gegensatz zum Zugriff über `eth_call` werden diese `view`- oder `pure`-Funktionen auch häufig intern aufgerufen (also vom Vertrag selbst oder von einem anderen Vertrag), was jedoch Gas kostet. +Im Gegensatz zum Zugriff über `eth_call` werden diese `view`- oder `pure`-Funktionen auch häufig intern aufgerufen (d. h. vom Vertrag selbst oder von einem anderen Vertrag), was Gas kostet. -## Transaktions-Lebenszyklus {#transaction-lifecycle} +## Lebenszyklus einer Transaktion {#transaction-lifecycle} -Sobald die Transaktion abgeschickt wurde, passiert Folgendes: +Sobald die Transaktion eingereicht wurde, passiert Folgendes: -1. Ein Transaktions-Hash wird kryptografisch erzeugt: `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` -2. Die Transaktion wird dann an das Netzwerk weitergeleitet und zu einem Transaktionspool hinzugefügt, der aus allen anderen ausstehenden Netztransaktionen besteht. -3. Ein Validator muss Ihre Transaktion auswählen und in einem Block hinzufügen, um die Transaktion zu verifizieren und sie als "erfolgreich" zu bezeichnen. -4. Mit der Zeit wird der Block, der Ihre Transaktion enthält, auf "justified" und dann auf " finalized" hochgestuft. Mit diesen Hochstufungen steigt auch die Sicherheit, dass Ihre Transaktion erfolgreich war und nicht mehr verändert werden kann. Sobald ein Block abgeschlossen, also "finalized", ist, könnte er nur noch durch einen Angriff auf Netzwerkebene verändert werden, der viele Milliarden Dollar kosten würde. +1. Ein Transaktions-Hash wird kryptografisch generiert: + `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` +2. Die Transaktion wird dann an das Netzwerk übertragen und einem Transaktionspool hinzugefügt, der aus allen anderen ausstehenden Netzwerktransaktionen besteht. +3. Ein Validator muss Ihre Transaktion auswählen und in einen Block aufnehmen, um die Transaktion zu verifizieren und als „erfolgreich“ zu betrachten. +4. Im Laufe der Zeit wird der Block, der Ihre Transaktion enthält, auf „gerechtfertigt“ (justified) und dann auf „finalisiert“ (finalized) hochgestuft. Diese Hochstufungen machen es viel + sicherer, dass Ihre Transaktion erfolgreich war und niemals geändert wird. Sobald ein Block „finalisiert“ ist, könnte er nur noch + durch einen Angriff auf Netzwerkebene geändert werden, der viele Milliarden Dollar kosten würde. ## Eine visuelle Demo {#a-visual-demo} -Schaue Austin bei einer Führung durch Transaktionen, Gas und Mining zu. +Sehen Sie sich an, wie Austin Sie durch Transaktionen, Gas und Mining führt. -## Typisierter Transaktionsumschlag {#typed-transaction-envelope} +## Typisierter Transaktionsumschlag (Typed Transaction Envelope) {#typed-transaction-envelope} -Ursprünglich hatte Ethereum ein einziges Format für Transaktionen. Jede Transaktion enthielt eine Nonce, einen Gaspreis, ein Gaslimit, eine Zieladresse, einen Wert, Daten, v, r und s. Diese Felder sind [RLP-kodiert](/developers/docs/data-structures-and-encoding/rlp/) und sehen etwa folgendermaßen aus: +Ethereum hatte ursprünglich ein Format für Transaktionen. Jede Transaktion enthielt eine Nonce, einen Gaspreis, ein Gaslimit, eine Empfängeradresse (`to`), einen Wert (`value`), Daten (`data`), v, r und s. Diese Felder sind [RLP-kodiert](/developers/docs/data-structures-and-encoding/rlp/), um in etwa so auszusehen: `RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` -Ethereum hat sich so entwickelt, dass es mehrere Transaktionsarten unterstützt, damit neue Funktionen wie Zugriffslisten und [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) implementiert werden können, ohne die alten Transaktionsformate zu beeinflussen. +Ethereum hat sich weiterentwickelt, um mehrere Arten von Transaktionen zu unterstützen, damit neue Funktionen wie Zugriffslisten und [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) implementiert werden können, ohne ältere Transaktionsformate zu beeinträchtigen. -[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) ermöglicht dieses Verhalten. Transaktionen werden wie folgt interpretiert: +[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) ermöglicht dieses Verhalten. Transaktionen werden interpretiert als: `TransactionType || TransactionPayload` -Die Felder sind wie folgt definiert: +Wobei die Felder wie folgt definiert sind: -- `TransactionType` – eine Zahl zwischen 0 und 0x7f, für insgesamt 128 mögliche Transaktionsarten. +- `TransactionType` – eine Zahl zwischen 0 und 0x7f, für insgesamt 128 mögliche Transaktionstypen. - `TransactionPayload` – ein beliebiges Byte-Array, das durch den Transaktionstyp definiert wird. -Basierend auf dem `TransactionType`-Wert kann eine Transaktion wie folgt klassifiziert werden: +Basierend auf dem Wert von `TransactionType` kann eine Transaktion wie folgt klassifiziert werden: -1. **Typ-0-Transaktionen (veraltet):** Das ursprüngliche Transaktionsformat, das seit dem Start von Ethereum verwendet wird. Diese Transaktionen enthalten keine Funktionen aus [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) wie dynamische Gasgebührenkalkulationen oder Zugriffslisten für Smart Contracts. Veraltete Transaktionen haben in ihrer serialisierten Form keinen spezifischen Präfix, der ihren Typ angibt; sie beginnen mit dem Byte `0xf8`, wenn die [Recursive Length Prefix(RLP)](/developers/docs/data-structures-and-encoding/rlp)-Kodierung verwendet wird. Der TransactionType-Wert für diese Transaktionen ist `0x0`. +1. **Typ-0-Transaktionen (Legacy):** Das ursprüngliche Transaktionsformat, das seit dem Start von Ethereum verwendet wird. Sie enthalten keine Funktionen aus [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) wie dynamische Gasgebührenberechnungen oder Zugriffslisten für Smart Contracts. Legacy-Transaktionen fehlt ein spezifisches Präfix, das ihren Typ in ihrer serialisierten Form angibt; sie beginnen mit dem Byte `0xf8`, wenn die [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp)-Kodierung verwendet wird. Der TransactionType-Wert für diese Transaktionen ist `0x0`. -2. **Typ-1-Transaktionen:** Diese Transaktionen wurden in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) als Teil des [Berlin-Upgrades](/ethereum-forks/#berlin) von Ethereum eingeführt und enthalten einen `accessList`-Parameter. Diese Liste gibt Adressen und Speicherschlüssel an, auf die bei der Transaktion zugegriffen werden soll, was potenziell die [Gas](/developers/docs/gas/)-Kosten für komplexe Transaktionen mit Smart Contracts reduzieren kann. Änderungen des EIP-1559-Gebührenmarkts sind in Typ-1-Transaktionen nicht enthalten. Typ-1-Transaktionen enthalten auch einen `yParity`-Parameter, der entweder `0x0` oder `0x1` sein kann und die Parität des y-Werts der secp256k1-Signatur angibt. Sie werden durch das Anfangs-Byte `0x01` identifiziert und ihr TransactionType-Wert ist `0x1`. +2. **Typ-1-Transaktionen:** Eingeführt in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) als Teil von Ethereums [Berlin-Upgrade](/ethereum-forks/#berlin), enthalten diese Transaktionen einen `accessList`-Parameter. Diese Liste gibt Adressen und Speicherschlüssel an, auf die die Transaktion voraussichtlich zugreifen wird, was dazu beiträgt, die [Gas](/developers/docs/gas/)-Kosten für komplexe Transaktionen mit Smart Contracts potenziell zu senken. Änderungen des Gebührenmarktes durch EIP-1559 sind in Typ-1-Transaktionen nicht enthalten. Typ-1-Transaktionen enthalten auch einen `yParity`-Parameter, der entweder `0x0` oder `0x1` sein kann und die Parität des y-Wertes der secp256k1-Signatur angibt. Sie werden dadurch identifiziert, dass sie mit dem Byte `0x01` beginnen, und ihr TransactionType-Wert ist `0x1`. -3. **Typ-2-Transaktionen**, allgemein als EIP-1559-Transaktionen bezeichnet, sind Transaktionen, die in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), dem [London-Upgrade](/ethereum-forks/#london) von Ethereum, eingeführt wurden. Diese haben sich zur Standardform für Transaktionen auf dem Ethereum-Netzwerk entwickelt. Diese Transaktionen führen einen neuen Gebührenmarktmechanismus ein, der durch die Trennung der Transaktionsgebühr in eine Basisgebühr und eine Prioritätsgebühr die Vorhersehbarkeit verbessert. Sie beginnen mit dem Byte `0x02` und enthalten Felder wie `maxPriorityFeePerGas` und `maxFeePerGas`. Typ-2-Transaktionen sind aufgrund ihrer Flexibilität und Effizienz nun der Standard und werden besonders in Zeiten hoher Netzwerkbelastung bevorzugt – aufgrund ihrer Fähigkeit, den Benutzern eine besser vorhersehbare Verwaltung der Transaktionsgebühren zu ermöglichen. Der TransactionType-Wert für diese Transaktionen ist `0x2`. +3. **Typ-2-Transaktionen**, allgemein als EIP-1559-Transaktionen bezeichnet, sind Transaktionen, die in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) im Rahmen von Ethereums [London-Upgrade](/ethereum-forks/#london) eingeführt wurden. Sie sind zum Standard-Transaktionstyp im Ethereum-Netzwerk geworden. Diese Transaktionen führen einen neuen Gebührenmarktmechanismus ein, der die Vorhersehbarkeit verbessert, indem die Transaktionsgebühr in eine Grundgebühr und eine Prioritätsgebühr aufgeteilt wird. Sie beginnen mit dem Byte `0x02` und enthalten Felder wie `maxPriorityFeePerGas` und `maxFeePerGas`. Typ-2-Transaktionen sind aufgrund ihrer Flexibilität und Effizienz mittlerweile der Standard und werden besonders in Zeiten hoher Netzwerküberlastung bevorzugt, da sie Benutzern helfen, Transaktionsgebühren vorhersehbarer zu verwalten. Der TransactionType-Wert für diese Transaktionen ist `0x2`. +4. **Typ-3-Transaktionen (Blob)** wurden in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) als Teil von Ethereums [Dencun-Upgrade](/ethereum-forks/#dencun) eingeführt. Diese Transaktionen sind darauf ausgelegt, „Blob“-Daten (Binary Large Objects) effizienter zu verarbeiten, was insbesondere Rollups der Ebene 2 zugutekommt, indem sie eine Möglichkeit bieten, Daten zu geringeren Kosten im Ethereum-Netzwerk zu veröffentlichen. Blob-Transaktionen enthalten zusätzliche Felder wie `blobVersionedHashes`, `maxFeePerBlobGas` und `blobGasPrice`. Sie beginnen mit dem Byte `0x03` und ihr TransactionType-Wert ist `0x3`. Blob-Transaktionen stellen eine signifikante Verbesserung der Datenverfügbarkeit und Skalierung von Ethereum dar. +5. **Typ-4-Transaktionen** wurden in [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) als Teil von Ethereums [Pectra-Upgrade](/roadmap/pectra/) eingeführt. Diese Transaktionen sind so konzipiert, dass sie vorwärtskompatibel mit der Kontoabstraktion sind. Sie ermöglichen es extern verwalteten Konten (EOAs), sich vorübergehend wie Smart-Contract-Konten zu verhalten, ohne ihre ursprüngliche Funktionalität zu beeinträchtigen. Sie enthalten einen `authorization_list`-Parameter, der den Smart Contract angibt, an den das EOA seine Autorität delegiert. Nach der Transaktion enthält das Codefeld des EOAs die Adresse des delegierten Smart Contracts. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [EIP-2718: Typisierter Transaktionsumschlag](https://eips.ethereum.org/EIPS/eip-2718) +- [EIP-2718: Typed Transaction Envelope](https://eips.ethereum.org/EIPS/eip-2718) -_Du kennst Community-Ressourcen die dir geholfen haben? Bearbeite diese Seite und füge sie hinzu!_ +_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Konten](/developers/docs/accounts/) - [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) -- [Gas](/developers/docs/gas/) +- [Gas](/developers/docs/gas/) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/web2-vs-web3/index.md b/public/content/translations/de/developers/docs/web2-vs-web3/index.md index 92fd6f7abc0..d136858f15e 100644 --- a/public/content/translations/de/developers/docs/web2-vs-web3/index.md +++ b/public/content/translations/de/developers/docs/web2-vs-web3/index.md @@ -1,62 +1,62 @@ --- title: Web2 vs Web3 -description: +description: Vergleiche zentralisierte Web2-Dienste mit dezentralisierten Web3-Anwendungen, die auf der Ethereum-Blockchain-Technologie basieren. lang: de --- -Web2 bezieht sich auf die Version des Internets, die die meisten von uns heute kennen. Ein Internet dominiert von Unternehmen, die im Austausch für deine persönlichen Daten Dienstleistungen erbringen. Web3 bezieht sich im Kontext von Ethereum auf dezentrale Apps, die auf der Blockchain laufen. Dies sind Apps, mit denen jeder teilnehmen kann, ohne seine persönlichen Daten zu monetarisieren. +Web2 bezieht sich auf die Version des Internets, die die meisten von uns heute kennen. Ein Internet, das von Unternehmen dominiert wird, die Dienstleistungen im Austausch für Ihre persönlichen Daten anbieten. Web3 bezieht sich im Kontext von [Ethereum](/) auf dezentralisierte Anwendungen, die auf der Blockchain laufen. Dies sind Anwendungen, die es jedem ermöglichen, teilzunehmen, ohne seine persönlichen Daten zu monetarisieren. -Suchen Sie nach einer Einführung für Einsteiger? Schauen Sie sich unsere [Einführung in web3](/web3/) an. +Suchen Sie nach einer anfängerfreundlicheren Ressource? Sehen Sie sich unsere [Einführung in Web3](/web3/) an. -## Web3 – Vorteile {#web3-benefits} +## Vorteile von Web3 {#web3-benefits} -Viele Web3-Entwickler haben aufgrund der inhärenten Dezentralisierung von Ethereum beschlossen, dApps zu erstellen: +Viele Web3-Entwickler haben sich dafür entschieden, Dapps zu entwickeln, da Ethereum von Natur aus dezentralisiert ist: -- Jeder, der im Netzwerk ist, hat die Erlaubnis, den Dienst zu nutzen – oder anders ausgedrückt, es ist keine Erlaubnis erforderlich. -- Niemand kann dich blockieren oder dir den Zugang zum Dienst verweigern. -- Zahlungen sind über den nativen Token, Ether (ETH), eingebaut. -- Ethereum ist Turing-vollständig. Das bedeutet, dass Sie fast alles programmieren können. +- Jeder im Netzwerk hat die Erlaubnis, den Dienst zu nutzen – oder mit anderen Worten: Es ist keine Erlaubnis erforderlich. +- Niemand kann Sie blockieren oder Ihnen den Zugang zum Dienst verweigern. +- Zahlungen sind über den nativen Token, Ether (ETH), integriert. +- Ethereum ist Turing-vollständig, was bedeutet, dass Sie so ziemlich alles programmieren können. ## Praktische Vergleiche {#practical-comparisons} -| Web2 | Web3 | -| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | -| Twitter kann jeden Account oder Tweet zensieren | Web3-Tweets wären unzensierbar, da die Kontrolle dezentral ist | -| Ein Zahlungsservice kann beschließen, keine Zahlungen für bestimmte Arbeitsarten zuzulassen | Web3-Zahlungs-Apps erfordern keine persönlichen Daten und können Zahlungen nicht verhindern | -| Server für Gig-Economy-Apps könnten ausfallen und die Einkommen der Arbeitnehmer beeinträchtigen | Web3-Server können nicht ausfallen – sie verwenden Ethereum, ein dezentralisiertes Netzwerk von tausenden Computern als Backend | +| Web2 | Web3 | +| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Twitter kann jedes Konto oder jeden Tweet zensieren | Web3-Tweets wären unzensierbar, da die Kontrolle dezentralisiert ist | +| Ein Zahlungsdienstleister kann entscheiden, Zahlungen für bestimmte Arten von Arbeit nicht zuzulassen | Web3-Zahlungs-Apps erfordern keine persönlichen Daten und können Zahlungen nicht verhindern | +| Server für Gig-Economy-Apps könnten ausfallen und das Einkommen der Arbeiter beeinträchtigen | Web3-Server können nicht ausfallen – sie nutzen Ethereum, ein dezentralisiertes Netzwerk aus Tausenden von Computern, als Backend | -Das bedeutet nicht, dass alle Dienste in eine dApp umgewandelt werden müssen. Diese Beispiele zeigen die wichtigsten Unterschiede zwischen Web2- und Web3-Diensten. +Das bedeutet nicht, dass alle Dienste in eine Dapp umgewandelt werden müssen. Diese Beispiele veranschaulichen die Hauptunterschiede zwischen Web2- und Web3-Diensten. -## Web3 – Einschränkungen {#web3-limitations} +## Einschränkungen von Web3 {#web3-limitations} -Web3 hat momentan einige Einschränkungen: +Web3 hat derzeit einige Einschränkungen: -- Skalierbarkeit – Transaktionen sind auf Web3 langsamer, da sie dezentral sind. Änderung am Zustand, wie eine Bezahlung, müssen von einem Knoten verarbeitet und durch das Netzwerk propagiert werden. -- UX – Eine Interaktion mit Web3-Anwendungen kann zusätzliche Schritte, Software und Ausbildung erfordern. Dies kann eine Hürde für die Adoption sein. -- Barrierefreiheit – Die fehlende Integration in moderne Webbrowser macht Web3 für die meisten Benutzer weniger zugänglich. -- Kosten – Die erfolgreichsten dApps legen sehr kleine Teile ihres Codes auf die Blockchain, da dies teuer ist. +- Skalierbarkeit – Transaktionen sind im Web3 langsamer, weil sie dezentralisiert sind. Zustandsänderungen, wie eine Zahlung, müssen von einem Blockchain-Knoten verarbeitet und im gesamten Netzwerk verbreitet werden. +- UX (Benutzererfahrung) – Die Interaktion mit Web3-Anwendungen kann zusätzliche Schritte, Software und Aufklärung erfordern. Dies kann eine Hürde für die Akzeptanz sein. +- Zugänglichkeit – Die mangelnde Integration in moderne Webbrowser macht Web3 für die meisten Benutzer weniger zugänglich. +- Kosten – Die meisten erfolgreichen Dapps legen nur sehr kleine Teile ihres Codes auf der Blockchain ab, da dies teuer ist. ## Zentralisierung vs. Dezentralisierung {#centralization-vs-decentralization} -In der unten stehenden Tabelle finden Sie einige Vor- und Nachteile zentralisierter und dezentralisierter digitaler Netzwerke. +In der folgenden Tabelle listen wir einige der allgemeinen Vor- und Nachteile von zentralisierten und dezentralisierten digitalen Netzwerken auf. -| Zentralisierte Systeme | Dezentralisierte Systeme | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Niedriger Netzwerkdurchmesser (alle Teilnehmer sind mit einer zentralen Behörde verbunden); Informationen werden schnell verbreitet, da die Verbreitung durch eine zentrale Autorität mit vielen rechnerischen Ressourcen gehandhabt wird. | Die am weitesten entfernten Teilnehmer im Netzwerk können möglicherweise viele Abstände voneinander entfernt sein. Von einer Seite des Netzwerks ausgestrahlte Informationen können lange brauchen, bis sie die andere Seite erreichen. | -| In der Regel leistungsfähiger (höherer Durchsatz, weniger gesamte Rechenressourcen nötig) und leichter implementierbar. | In der Regel niedrigere Leistung (niedrigerer Durchsatz, mehr gesamte Rechenressourcen nötig) und komplexer zu implementieren. | -| Im Falle widersprüchlicher Daten ist die Auflösung klar und einfach: Die ultimative Quelle der Wahrheit ist die zentrale Autorität. | Ein Protokoll (oft komplex) wird für die Streitbeilegung benötigt , wenn Peers widersprüchliche Ansprüche auf den Zustand der Daten erheben, auf die die Teilnehmer synchronisiert werden sollen. | -| Single Point of Failure: Böswillige Akteure können das Netzwerk möglicherweise durch gezielte Angriffe auf die zentrale Autorität ausschalten. | No Single Point of Failure: Das Netzwerk kann immer noch funktionieren, auch wenn ein großer Teil der Teilnehmer angegriffen bzw. ausgeschaltet wird. | -| Die Koordination zwischen den Netzwerkteilnehmern ist viel einfacher und wird von einer zentralen Autorität verwaltet. Die zentrale Autorität kann Netzwerkteilnehmer dazu zwingen, Upgrades, Protokoll-Updates etc. mit sehr wenig Widerstand zu übernehmen. | Die Koordinierung ist oft schwierig, da kein einziger Agent das letzte Wort bei Entscheidungen auf Netzwerkebene, Protokoll-Upgrades usw. hat. Im schlimmsten Fall neigt das Netzwerk zur Zersplitterung, wenn es Meinungsverschiedenheiten über Änderungen des Protokolls gibt. | -| Die zentrale Autorität kann Daten zensieren, wodurch Teile des Netzwerks von der Interaktion mit dem Rest des Netzes abgeschnitten werden könnten. | Zensur ist viel schwieriger, da Informationen viele Möglichkeiten haben, sich über das Netzwerk zu verbreiten. | -| Die Teilnahme am Netzwerk wird von der zentralen Autorität kontrolliert. | Jeder kann am Netzwerk teilnehmen; es gibt keine „Gatekeeper“. Idealerweise sind die Teilnahmekosten sehr niedrig. | +| Zentralisierte Systeme | Dezentralisierte Systeme | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Geringer Netzwerkdurchmesser (alle Teilnehmer sind mit einer zentralen Autorität verbunden); Informationen verbreiten sich schnell, da die Verbreitung von einer zentralen Autorität mit vielen Rechenressourcen gehandhabt wird. | Die am weitesten entfernten Teilnehmer im Netzwerk können potenziell viele Knotenpunkte voneinander entfernt sein. Die Übertragung von Informationen von einer Seite des Netzwerks zur anderen kann lange dauern. | +| In der Regel höhere Leistung (höherer Durchsatz, weniger insgesamt aufgewendete Rechenressourcen) und einfacher zu implementieren. | In der Regel geringere Leistung (geringerer Durchsatz, mehr insgesamt aufgewendete Rechenressourcen) und komplexer zu implementieren. | +| Bei widersprüchlichen Daten ist die Lösung klar und einfach: Die ultimative Quelle der Wahrheit ist die zentrale Autorität. | Ein (oft komplexes) Protokoll wird zur Streitbeilegung benötigt, wenn Peers widersprüchliche Behauptungen über den Zustand von Daten aufstellen, auf die die Teilnehmer synchronisiert werden sollen. | +| Single Point of Failure (einzelner Ausfallpunkt): Böswillige Akteure könnten in der Lage sein, das Netzwerk lahmzulegen, indem sie die zentrale Autorität angreifen. | Kein Single Point of Failure: Das Netzwerk kann weiterhin funktionieren, selbst wenn ein großer Teil der Teilnehmer angegriffen/ausgeschaltet wird. | +| Die Koordination zwischen den Netzwerkteilnehmern ist viel einfacher und wird von einer zentralen Autorität gehandhabt. Die zentrale Autorität kann die Netzwerkteilnehmer mit sehr wenig Reibung dazu zwingen, Upgrades, Protokollaktualisierungen usw. zu übernehmen. | Die Koordination ist oft schwierig, da kein einzelner Akteur das letzte Wort bei Entscheidungen auf Netzwerkebene, Protokoll-Upgrades usw. hat. Im schlimmsten Fall ist das Netzwerk anfällig für eine Spaltung, wenn es Meinungsverschiedenheiten über Protokolländerungen gibt. | +| Die zentrale Autorität kann Daten zensieren und potenziell Teile des Netzwerks von der Interaktion mit dem Rest des Netzwerks abschneiden. | Zensur ist viel schwieriger, da Informationen viele Möglichkeiten haben, sich über das Netzwerk zu verbreiten. | +| Die Teilnahme am Netzwerk wird von der zentralen Autorität kontrolliert. | Jeder kann am Netzwerk teilnehmen; es gibt keine „Gatekeeper“. Im Idealfall sind die Kosten für die Teilnahme sehr gering. | -Beachten Sie, dass das allgemeine Muster sind, die nicht auf jedes Netzwerk zutreffen. In der Realität liegt der Grad der Zentralisierung bzw. Dezentralisierung eines Netzwerks in einem Spektrum. Kein Netzwerk ist vollständig zentralisiert oder vollständig dezentralisiert. +Beachten Sie, dass dies allgemeine Muster sind, die möglicherweise nicht in jedem Netzwerk zutreffen. Darüber hinaus liegt der Grad der Zentralisierung/Dezentralisierung eines Netzwerks in der Realität auf einem Spektrum; kein Netzwerk ist vollständig zentralisiert oder vollständig dezentralisiert. -## Weiterführende Informationen {#further-reading} +## Weiterführende Literatur {#further-reading} -- [Was ist Web3?](/web3/) – _ethereum.org_ -- [Die Architektur einer Web 3.0 Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ -- [Die Bedeutung der Dezentralisierung](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _Feb 6, 2017 – Vitalik Buterin_ -- [Why Decentralization Matters](https://medium.com/s/story/why-decentralization-matters-5e3f79f7638e) _Feb 18, 2018 – Chris Dixon_ -- [Was ist Web 3.0 & Warum es wichtig ist](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _Dez 31, 2019 – Max Mersch und Richard Muirhead_ -- [Warum wir Web 3.0 brauchen](https://medium.com/@gavofyork/why-we-need-web-3-0-5da4f2bf95ab)_Sep 12,2018 - Gavin Wood_ +- [Was ist Web3?](/web3/) - _ethereum.org_ +- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ +- [Die Bedeutung von Dezentralisierung](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _6. Feb. 2017 - Vitalik Buterin_ +- [Warum Dezentralisierung wichtig ist](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _18. Feb. 2018 - Chris Dixon_ +- [Was ist Web 3.0 & warum es wichtig ist](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _31. Dez. 2019 - Max Mersch und Richard Muirhead_ +- [Warum wir Web 3.0 brauchen](https://gavofyork.medium.com/why-we-need-web-3-0-5da4f2bf95ab) _12. Sep. 2018 - Gavin Wood_ \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/wrapped-eth/index.md b/public/content/translations/de/developers/docs/wrapped-eth/index.md index 2b6099003a0..7fd0e4af929 100644 --- a/public/content/translations/de/developers/docs/wrapped-eth/index.md +++ b/public/content/translations/de/developers/docs/wrapped-eth/index.md @@ -1,6 +1,6 @@ --- -title: Was ist „Wrapped Ether“ (WETH) -description: Eine Einführung in Wrapped Ether (WETH) – ein ERC20-kompatibler Wrapper für Ether (ETH). +title: "Was ist „Wrapped Ether“ (WETH)" +description: "Eine Einführung in Wrapped Ether (WETH) – ein ERC20-kompatibler Wrapper für Ether (ETH)." lang: de --- diff --git a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index ed974473b6f..cc7fa0028e4 100644 --- a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -1,124 +1,123 @@ --- -title: Ethereum-Einführung für Pythonentwickler, Teil 1 -description: Eine Einführung in die Entwicklung von Ethereum, zugeschnitten auf Entwickler mit einem Hintergrund in Python +title: "Eine Einführung in Ethereum für Python-Entwickler, Teil 1" +description: "Eine Einführung in die Ethereum-Entwicklung, besonders nützlich für Personen mit Kenntnissen in der Programmiersprache Python" author: Marc Garreau lang: de -tags: - - "Erste Schritte" - - "Python" - - "web3.py" +tags: ["Python", "web3.py"] skill: beginner -breadcrumb: "Ethereum mit Python" +breadcrumb: Ethereum mit Python published: 2020-09-08 source: Snake charmers sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/ --- -Sie haben bereits von Ethereum gehört und möchten tiefer in die Materie eintauchen? In diesem Beitrag werden einige Blockchain-Grundlagen kurz erläutert und dann werden Sie mit einem simulierten Ethereum-Node interagieren – Blockdaten lesen, Kontostände prüfen und Transaktionen senden. Dabei werden wir die Unterschiede zwischen den traditionellen Methoden der App-Entwicklung und diesem neuen dezentralen Modell herausstellen. +Sie haben also von dieser Ethereum-Sache gehört und sind bereit, in den Kaninchenbau hinabzusteigen? Dieser Beitrag wird kurz einige Blockchain-Grundlagen behandeln und Sie dann dazu bringen, mit einem simulierten Ethereum-Blockchain-Knoten zu interagieren – Blockdaten lesen, Kontostände überprüfen und Transaktionen senden. Auf dem Weg dorthin werden wir die Unterschiede zwischen traditionellen Methoden zur Erstellung von Apps und diesem neuen dezentralisierten Paradigma hervorheben. -## (Benötigtes) Vorwissen {#soft-prerequisites} +## (Weiche) Voraussetzungen {#soft-prerequisites} -Dieser Beitrag ist für Entwickler mit den unterschiedlichsten Kenntnissen gedacht. Zum Einsatz kommen [Python-Tools](/developers/docs/programming-languages/python/). Diese dienen allerdings nur als Mittel zum Zweck, wenn Sie also keine Vorerfahrung mit Python mitbringen, ist das kein Problem. Allerdings treffe ich ein paar Annahmen über Ihr Vorwissen, damit wir schnell zu den Ethereum-spezifischen Inhalten übergehen können. +Dieser Beitrag hat den Anspruch, für eine breite Palette von Entwicklern zugänglich zu sein. [Python-Tools](/developers/docs/programming-languages/python/) werden involviert sein, aber sie sind nur ein Vehikel für die Ideen – kein Problem, wenn Sie kein Python-Entwickler sind. Ich werde jedoch nur ein paar Annahmen darüber treffen, was Sie bereits wissen, damit wir schnell zu den Ethereum-spezifischen Teilen übergehen können. -Vorbedinungen: +Annahmen: -- Sie können sich in einem Terminal bewegen -- Sie haben bereits ein paar Zeilen Python-Code geschrieben -- Python Version 3.6 oder höher ist auf Ihrem Rechner installiert (die Verwendung einer [virtuellen Umgebung](https://realpython.com/effective-python-environment/#virtual-environments) wird dringend empfohlen) -- Sie haben `pip`, das Python-Installationspaket, installiert (Nochmals: Sollten Sie einige dieser Anforderungen nicht erfüllen oder nicht nebenher mit programmieren wollen, sollte es dennoch möglich sein, den Beispielen inhaltlich zu folgen). +- Sie können sich in einem Terminal zurechtfinden, +- Sie haben ein paar Zeilen Python-Code geschrieben, +- Python Version 3.6 oder höher ist auf Ihrem Rechner installiert (die Verwendung einer [virtuellen Umgebung](https://realpython.com/effective-python-environment/#virtual-environments) wird dringend empfohlen), und +- Sie haben `pip`, den Paket-Installer von Python, verwendet. + Nochmals, falls etwas davon nicht zutrifft oder Sie nicht vorhaben, den Code in diesem Artikel zu reproduzieren, können Sie wahrscheinlich trotzdem problemlos folgen. ## Blockchains, kurz gefasst {#blockchains-briefly} -Es gibt viele Möglichkeiten, Ethereum zu beschreiben, doch im Kern ist es eine Blockchain. Blockchains bestehen aus einer Reihe von Blöcken, also lassen Sie uns damit beginnen. Einfach ausgedrückt: Jeder Block der Ethereum-Blockchain besteht nur aus einigen Metadaten und einer Liste von Transaktionen. Im JSON-Format sieht das folgendermaßen aus: +Es gibt viele Möglichkeiten, Ethereum zu beschreiben, aber im Kern ist es eine Blockchain. Blockchains bestehen aus einer Reihe von Blöcken, also fangen wir dort an. Einfach ausgedrückt ist jeder Block auf der Ethereum-Blockchain nur eine Ansammlung von Metadaten und einer Liste von Transaktionen. Im JSON-Format sieht das in etwa so aus: ```json { "number": 1234567, "hash": "0xabc123...", "parentHash": "0xdef456...", - "miner": "0xa1b2c3...", ..., "transactions": [...] } ``` -Jeder [Block](/developers/docs/blocks/) hat eine Referenz auf den vor ihm liegenden Block. Der `parentHash` ist einfach der Hash des vorherigen Blocks. +Jeder [Block](/developers/docs/blocks/) hat einen Verweis auf den Block, der davor kam; der `parentHash` ist einfach der Hash des vorherigen Blocks. -Hinweis: Ethereum nutzt regelmäßig Hashfunktionen, um Werte mit fester Länge (Hashes) zu erzeugen. Hashes spielen eine wichtige Rolle in Ethereum, für den Einstieg können Sie sie einfach als eindeutige ID vorstellen. +Hinweis: Ethereum verwendet regelmäßig Hash-Funktionen, um Werte fester Größe („Hashes“) zu erzeugen. Hashes spielen in Ethereum eine wichtige Rolle, aber Sie können sie sich vorerst getrost als eindeutige IDs vorstellen. ![Ein Diagramm, das eine Blockchain einschließlich der Daten in jedem Block darstellt](./blockchain-diagram.png) -_Eine Blockchain ist im Grunde eine verknüpfte Liste. Jeder Block verweist auf den vorangehenden Block._ +_Eine Blockchain ist im Wesentlichen eine verkettete Liste; jeder Block hat einen Verweis auf den vorherigen Block._ -Diese Datenstruktur ist nicht neu. Aber die Regeln (z. B. Peer-to-Peer-Protokolle), die im Netzwerk gelten, sind neu. Es gibt keine zentrale Autorität. Die Netzwerkteilnehmer (Peers) müssen zusammenarbeiten und konkurrieren, um das Netzwerk aufrechtzuerhalten und zu entscheiden, welche Transaktionen in den nächsten Block aufgenommen werden. Wenn Sie also einem Freund Geld schicken möchten, müssen Sie diese Transaktion an das Netzwerk senden und dann darauf warten, dass sie in einen kommenden Block aufgenommen wird. +Diese Datenstruktur ist nichts Neues, aber die Regeln (d. h. Peer-to-Peer-Protokolle), die das Netzwerk steuern, sind es. Es gibt keine zentrale Autorität; das Netzwerk von Peers muss zusammenarbeiten, um das Netzwerk aufrechtzuerhalten, und konkurrieren, um zu entscheiden, welche Transaktionen in den nächsten Block aufgenommen werden. Wenn Sie also einem Freund etwas Geld senden möchten, müssen Sie diese Transaktion an das Netzwerk übertragen und dann darauf warten, dass sie in einen kommenden Block aufgenommen wird. -Die einzige Möglichkeit für die Blockchain, zu verifizieren, dass Geld wirklich von einem Nutzer zu einem anderen gesendet wurde, ist die Nutzung einer für diese Blockchain nativen Währung (d. h. die von ihr geschaffen und verwaltet wird). Bei Ethereum heißt diese Währung Ether. Die Ethereum-Blockchain enthält die einzigen offiziellen Aufzeichnungen über die Kontostände. +Die einzige Möglichkeit für die Blockchain zu überprüfen, ob Geld wirklich von einem Benutzer an einen anderen gesendet wurde, besteht darin, eine Währung zu verwenden, die in dieser Blockchain nativ ist (d. h. von ihr erstellt und verwaltet wird). In Ethereum wird diese Währung Ether genannt, und die Ethereum-Blockchain enthält die einzige offizielle Aufzeichnung der Kontostände. -## Ein neues Modell {#a-new-paradigm} +## Ein neues Paradigma {#a-new-paradigm} -Dieser neue dezentralisierte Technologie-Stack hat neue Entwicklertools hervorgebracht. Solche Tools gibt es in vielen Programmiersprachen, aber in diesem Beitrag schauen wir durch die Python-Brille. Um es noch einmal zu betonen: Selbst wenn Python nicht Ihre bevorzugte Sprache ist, sollten Sie den Anweisungen trotzdem leicht folgen können. +Dieser neue dezentralisierte Tech-Stack hat neue Entwickler-Tools hervorgebracht. Solche Tools gibt es in vielen Programmiersprachen, aber wir werden sie durch die Python-Brille betrachten. Um es zu wiederholen: Auch wenn Python nicht Ihre bevorzugte Sprache ist, sollte es nicht viel Mühe bereiten, dem Ganzen zu folgen. -Python-Entwickler, die mit Ethereum interagieren möchten, nutzen wahrscheinlich [Web3.py](https://web3py.readthedocs.io/). Web3.py ist eine Bibliothek, die es sehr einfach macht, sich mit einem Ethereum-Node zu verbinden und dann Daten zu senden und zu empfangen. +Python-Entwickler, die mit Ethereum interagieren möchten, greifen wahrscheinlich zu [Web3.py](https://web3py.readthedocs.io/). Web3.py ist eine Bibliothek, die die Art und Weise, wie Sie sich mit einem Ethereum-Blockchain-Knoten verbinden und dann Daten von ihm senden und empfangen, erheblich vereinfacht. -Hinweis: "Ethereum-Node" und "Ethereum-Client" werden synonym verwendet. In beiden Fällen ist Software gemeint, die ein Teilnehmer am Ethereum-Netzwerk ausführt. Diese Software kann Blockdaten lesen, Updates empfangen, wenn neue Blöcke zur Kette hinzugefügt ("geminted") werden, neue Transaktionen übertragen und vieles mehr. +Hinweis: „Ethereum-Blockchain-Knoten“ und „Ethereum-Anwendung“ werden synonym verwendet. In beiden Fällen bezieht es sich auf die Software, die ein Teilnehmer im Ethereum-Netzwerk ausführt. Diese Software kann Blockdaten lesen, Updates empfangen, wenn neue Blöcke zur Chain hinzugefügt werden, neue Transaktionen übertragen und vieles mehr. Technisch gesehen ist die Anwendung die Software, der Blockchain-Knoten ist der Computer, auf dem die Software läuft. -[Ethereum-Clients](/developers/docs/nodes-and-clients/) können so konfiguriert werden, dass sie über [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP oder Websockets erreichbar sind. Daher muss Web3.py diese Konfiguration spiegeln. Web3.py bezeichnet diese Verbindungsoptionen als **Anbieter**. Sie müssen einen der drei Anbieter wählen, um eine Web3.py-Instanz mit Ihrem Node zu verbinden. +[Ethereum-Anwendungen](/developers/docs/nodes-and-clients/) können so konfiguriert werden, dass sie über [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP oder Websockets erreichbar sind, daher muss Web3.py diese Konfiguration widerspiegeln. Web3.py bezeichnet diese Verbindungsoptionen als **Provider**. Sie sollten einen der drei Provider auswählen, um die Web3.py-Instanz mit Ihrem Blockchain-Knoten zu verknüpfen. -![Ein Diagramm, das zeigt, wie web3.py IPC verwendet, um Ihre Anwendung mit einem Ethereum-Node zu verbinden](./web3py-and-nodes.png) +![Ein Diagramm, das zeigt, wie web3.py IPC verwendet, um Ihre Anwendung mit einem Ethereum-Blockchain-Knoten zu verbinden](./web3py-and-nodes.png) -_Konfigurieren Sie den Ethereum-Node und Web3.py so, dass sie über das gleiche Protokoll kommunizieren. Im folgenden Diagramm ist das beispielsweise IPC._ +_Konfigurieren Sie den Ethereum-Blockchain-Knoten und Web3.py so, dass sie über dasselbe Protokoll kommunizieren, z. B. IPC in diesem Diagramm._ -Sobald Web3.py richtig konfiguriert ist, können Sie mit der Blockchain interagieren. Hier sind eine paar Anwendungsbeispiele für Web3.py als Vorschau auf das was noch folgt: +Sobald Web3.py richtig konfiguriert ist, können Sie beginnen, mit der Blockchain zu interagieren. Hier sind ein paar Anwendungsbeispiele für Web3.py als Vorschau auf das, was noch kommt: ```python -# read block data: +# Blockdaten lesen: w3.eth.get_block('latest') -# send a transaction: +# Eine Transaktion senden: w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) ``` ## Installation {#installation} -In dieser Einführung arbeiten wir nur mit dem Python-Interpreter. Wir erzeugen keine Verzeichnisse, Dateien, Klassen oder Funktionen. +In dieser exemplarischen Vorgehensweise werden wir nur innerhalb eines Python-Interpreters arbeiten. Wir werden keine Verzeichnisse, Dateien, Klassen oder Funktionen erstellen. -Hinweis: In den folgenden Beispielen kennzeichnet '$' Befehle, die im Terminal ausgeführt werden. (Geben Sie dabei das '$' nicht mit ein. Es ist nur ein Hinweis auf den Beginn einer Zeile.) +Hinweis: In den folgenden Beispielen sollen Befehle, die mit `$` beginnen, im Terminal ausgeführt werden. (Tippen Sie das `$` nicht ein, es kennzeichnet nur den Anfang der Zeile.) -Installieren Sie zuerst [IPython](https://ipython.org/), um eine benutzerfreundliche Umgebung zu erstellen. IPython bietet neben anderen Funktionen eine Tab-Vervollständigung an. Damit lässt sich einfacher heruasfinden, was innerhalb von Web3.py möglich ist. +Installieren Sie zunächst [IPython](https://ipython.org/) für eine benutzerfreundliche Umgebung zum Erkunden. IPython bietet unter anderem Tab-Vervollständigung, was es viel einfacher macht zu sehen, was innerhalb von Web3.py möglich ist. ```bash -$ pip install ipython +pip install ipython ``` -Web3.py wird unter dem Namen `web3` publiziert. Nehmen Sie die Installation wie folgt vor: +Web3.py wird unter dem Namen `web3` veröffentlicht. Installieren Sie es wie folgt: ```bash -$ pip install web3 +pip install web3 ``` -Als Nächstes werden wir eine Blockchain-Simulation durchführen, die noch einige weitere Abhängigkeiten erfordert. Nehmen Sie die Installation wie folgt vor: +Noch etwas – wir werden später eine Blockchain simulieren, was ein paar weitere Abhängigkeiten erfordert. Sie können diese installieren über: ```bash -$ pip install 'web3[tester]' +pip install 'web3[tester]' ``` -Nun kann es losgehen. +Sie sind startklar! -## Eine Sandbox einrichten {#spin-up-a-sandbox} +Hinweis: Das Paket `web3[tester]` funktioniert bis Python 3.10.xx -Öffnen Sie eine neue Python-Umgebung, indem Sie `ipython` in Ihrem Terminal ausführen. Diese Ausführung ist vergleichbar mit `python`, bietet aber deutlich mehr Funktionen. +## Eine Sandbox starten {#spin-up-a-sandbox} + +Öffnen Sie eine neue Python-Umgebung, indem Sie `ipython` in Ihrem Terminal ausführen. Dies ist vergleichbar mit der Ausführung von `python`, bietet aber mehr Extras. ```bash -$ ipython +ipython ``` -Es werden einige Informationen über Ihre aktuelle Version von Python und IPython angezeigt. Anschließend sollten Sie eine Aufforderung zur Eingabe erhalten: +Dadurch werden einige Informationen über die Versionen von Python und IPython ausgegeben, die Sie ausführen. Danach sollten Sie eine Eingabeaufforderung sehen, die auf Eingaben wartet: ```python In [1]: ``` -Sie befinden sich jetzt in einer interaktiven Python-Shell-Umgebung. Hier können Sie sich nun austoben. Nun ist es an der Zeit, Web3.py zu importieren: +Sie sehen nun eine interaktive Python-Shell. Im Wesentlichen ist es eine Sandbox zum Spielen. Wenn Sie es bis hierher geschafft haben, ist es an der Zeit, Web3.py zu importieren: ```python In [1]: from web3 import Web3 @@ -126,74 +125,75 @@ In [1]: from web3 import Web3 ## Einführung in das Web3-Modul {#introducing-the-web3-module} -Das [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api)-Modul ist nicht nur ein Gateway zu Ethereum, sondern bietet auch einige komfortable Funktionen an. Sehen wir uns ein paar davon genauer an. +Neben der Funktion als Gateway zu Ethereum bietet das [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api)-Modul einige praktische Funktionen. Lassen Sie uns ein paar davon erkunden. -In einer Ethereum-Anwendung müssen Sie üblicherweise Währungsbezeichnungen umrechnen. Das Web3-Modul stellt Ihnen dazu hilfreiche Methoden zur Verfügung: [fromWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.fromWei) und [toWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toWei). +In einer Ethereum-Anwendung müssen Sie häufig Währungsstückelungen umrechnen. Das Web3-Modul bietet genau dafür ein paar Hilfsmethoden: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) und [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei). -Hinweis: Computer sind bekanntermaßen schlecht bei der Verarbeitung von Dezimalmathematik. Um das zu umgehen, geben Entwickler Dollarbeträge oft in Cent an. Beispiel: Ein Artikel mit einem Preis von 5,99 USD wird in der Datenbank als 599 angelegt. +Hinweis: Computer sind bekanntermaßen schlecht im Umgang mit Dezimalmathematik. Um dies zu umgehen, speichern Entwickler Dollarbeträge oft in Cent. Zum Beispiel kann ein Artikel mit einem Preis von 5,99 $ in der Datenbank als 599 gespeichert werden. -Transaktionen in Ether werden in ähnlicher Weise verwaltet. Aber statt zwei Dezimalstellen hat Ether 18 Stück. Die kleinste Einheit von Ether wird Wei genannt. Das ist auch der Wert, der beim Senden von Transaktionen angegeben wird. +Ein ähnliches Muster wird bei der Handhabung von Transaktionen in Ether verwendet. Anstelle von zwei Dezimalstellen hat Ether jedoch 18! Die kleinste Stückelung von Ether wird Wei genannt, das ist also der Wert, der beim Senden von Transaktionen angegeben wird. 1 Ether = 1000000000000000000 Wei -1 Wei = 0.000000000000000001 Ether +1 Wei = 0,000000000000000001 Ether -Versuchen Sie, einige Werte nach und von Wei zu konvertieren. [Beachten Sie](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations), dass es zwischen Ether und Wei noch andere Einheiten gibt. Eine der bekanntesten ist **Gwei**, da Transaktionsgebühren in dieser Einheit angegeben werden. +Versuchen Sie, einige Werte in und aus Wei umzurechnen. Beachten Sie, dass [es Namen für viele der Stückelungen gibt](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations), die zwischen Ether und Wei liegen. Eine der bekannteren darunter ist **Gwei**, da Transaktionsgebühren oft so dargestellt werden. ```python -In [2]: Web3.toWei(1, 'ether') +In [2]: Web3.to_wei(1, 'ether') Out[2]: 1000000000000000000 -In [3]: Web3.fromWei(500000000, 'gwei') +In [3]: Web3.from_wei(500000000, 'gwei') Out[3]: Decimal('0.5') ``` -Das Web3-Modul enthält außerdem einen Datenformatkonvertierer (z. B. [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), Adresse (z. B., [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)), und Hashfunktionen (z. B., [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Viele davon werden hier genauer erklärt. Um alle verfügbaren Funktionen und Eigenschaften anzuzeigen, können Sie die Autovervollständigung in IPython nutzen. Geben Sie dafür den folgenden Code ein: `Web3`. Anschließend drücken Sie bitte zweimal die Tab-Taste. +Weitere Hilfsmethoden im Web3-Modul umfassen Datenformatkonverter (z. B. [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), Adresshelfer (z. B. [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) und Hash-Funktionen (z. B. [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Viele davon werden später in der Serie behandelt. Um alle verfügbaren Methoden und Eigenschaften anzuzeigen, nutzen Sie die automatische Vervollständigung von IPython, indem Sie `Web3.` eingeben und nach dem Punkt zweimal die Tabulatortaste drücken. -## Kommunikation mit der Blockchain {#talk-to-the-chain} +## Mit der Chain kommunizieren {#talk-to-the-chain} -Die bisher vorgestellten Funktionen sind toll. Aber sehen wir uns nun einmal die Blockchain genauer an. Im nächsten Schritt konfiguireren wir Web3.py für die Kommunikation mit einem Ethereum-Node. Dabei können wir IPC, HTTP oder Websocket-Anbieter verwenden. +Die praktischen Methoden sind wunderbar, aber lassen Sie uns zur Blockchain übergehen. Der nächste Schritt besteht darin, Web3.py so zu konfigurieren, dass es mit einem Ethereum-Blockchain-Knoten kommuniziert. Hier haben wir die Möglichkeit, die IPC-, HTTP- oder Websocket-Provider zu verwenden. -Wir werden hier nicht weiter darauf eingehen, aber ein Beispiel für einen kompletten Workflow mit dem HTTP-Provider könnte wie folgt aussehen: +Wir werden diesen Weg nicht gehen, aber ein Beispiel für einen vollständigen Workflow mit dem HTTP-Provider könnte in etwa so aussehen: -- Laden Sie einen Ethereum-Node herunter, z. B. [Geth](https://geth.ethereum.org/). -- Starten Sie Geth in einem Terminalfenster und warten Sie bis die Netzwerksynchronisierung abgeschlossen ist. Der Standard-HTTP-Port ist `8545`, kann jedoch umkonfiguriert werden. -- Stellen Sie eine Verbindung von Web3.py zu dem Ethereum-Node über HTTP, `localhost:8545`, her. `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` -- Agieren Sie über die `w3`-Instanz mit dem Node. +- Laden Sie einen Ethereum-Blockchain-Knoten herunter, z. B. [Geth](https://geth.ethereum.org/). +- Starten Sie Geth in einem Terminalfenster und warten Sie, bis es das Netzwerk synchronisiert hat. Der Standard-HTTP-Port ist `8545`, ist aber konfigurierbar. +- Weisen Sie Web3.py an, sich über HTTP auf `localhost:8545` mit dem Blockchain-Knoten zu verbinden. + `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` +- Verwenden Sie die `w3`-Instanz, um mit dem Blockchain-Knoten zu interagieren. -Wenn Sie nur an einer Entwicklungsumgebung interessiert sind, ist dieser Weg unnötig, da der Synchronisierungsprozess mehrere Stunden dauert. Web3.py stellt für diesen Zweck einen vierten Provider zur Verfügung, den **EthereumTesterProvider**. Dieser Test-Provider ist mit einem simulierten Ethereum-Node mit Fake-Währungen und einfachen Berechtigungen verknüpft. +Obwohl dies ein „echter“ Weg ist, dauert der Synchronisierungsprozess Stunden und ist unnötig, wenn Sie nur eine Entwicklungsumgebung möchten. Web3.py stellt für diesen Zweck einen vierten Provider zur Verfügung, den **EthereumTesterProvider**. Dieser Tester-Provider stellt eine Verbindung zu einem simulierten Ethereum-Blockchain-Knoten mit gelockerten Berechtigungen und falscher Währung zum Spielen her. -![Ein Diagramm, das den EthereumTesterProvider zeigt, der Ihre web3.py-Anwendung mit einem simulierten Ethereum-Node verbindet](./ethereumtesterprovider.png) +![Ein Diagramm, das zeigt, wie der EthereumTesterProvider Ihre web3.py-Anwendung mit einem simulierten Ethereum-Blockchain-Knoten verbindet](./ethereumtesterprovider.png) -_Der EthereumTesterProvider verbindet sich mit einem simulierten Node und ist praktisch für schnelle Entwicklungsumgebungen._ +_Der EthereumTesterProvider verbindet sich mit einem simulierten Blockchain-Knoten und ist praktisch für schnelle Entwicklungsumgebungen._ -Dieser simulierter Node heißt [eth-tester](https://github.com/ethereum/eth-tester) und wurde mit dem Befehl `pip install web3[tester]` installiert. Um das Web3.py mit dem Testanbieter zu verbinden, geben Sie Folgendes ein: +Dieser simulierte Blockchain-Knoten heißt [eth-tester](https://github.com/ethereum/eth-tester) und wir haben ihn als Teil des Befehls `pip install web3[tester]` installiert. Die Konfiguration von Web3.py zur Verwendung dieses Tester-Providers ist so einfach wie: ```python In [4]: w3 = Web3(Web3.EthereumTesterProvider()) ``` -Jetzt können Sie mit der Blockchain kommunizieren. Wie das genau funktioniert? Ich habe da etwas für Sie zusammengestellt. Machen wir eine schnelle Tour. +Jetzt sind Sie bereit, auf der Chain zu surfen! Das sagt man eigentlich nicht. Das habe ich mir gerade ausgedacht. Lassen Sie uns einen kurzen Rundgang machen. -## Los geht's {#the-quick-tour} +## Der kurze Rundgang {#the-quick-tour} -Zuallererst eine Zuverlässigkeitsüberprüfung: +Das Wichtigste zuerst, ein Plausibilitätscheck: ```python -In [5]: w3.isConnected() +In [5]: w3.is_connected() Out[5]: True ``` -Da wir einen Testanbieter verwenden, ist der Test nicht sehr aussagekräftig, doch falls er fehlschlägt, ist die Wahrscheinlichkeit hoch, dass Sie eine falsche Variable in `w3` eingegeben haben. Überprüfen Sie, ob Sie die inneren Klammern eingefügt haben, also `Web3.EthereumTesterProvider()`. +Da wir den Tester-Provider verwenden, ist dies kein sehr wertvoller Test, aber falls er fehlschlägt, haben Sie wahrscheinlich bei der Instanziierung der Variablen `w3` etwas falsch eingegeben. Überprüfen Sie noch einmal, ob Sie die inneren Klammern eingefügt haben, d. h. `Web3.EthereumTesterProvider()`. -## 1. Stop auf der Tour: [Konten](/developers/docs/accounts/) {#tour-stop-1-accounts} +## Tourstopp Nr. 1: [Konten](/developers/docs/accounts/) {#tour-stop-1-accounts} -Der Einfachheit halber hat der Testanbieter bereits einige Konten eingerichtet und sie mit Test-Ether gefüllt. +Der Einfachheit halber hat der Tester-Provider einige Konten erstellt und sie mit Test-Ether aufgeladen. -Zunächst sehen wir uns die folgende Kontenliste an: +Lassen Sie uns zunächst eine Liste dieser Konten ansehen: ```python In [6]: w3.eth.accounts @@ -202,27 +202,27 @@ Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] ``` -Wenn Sie diesen Befehl ausführen, sollten Sie eine Liste von zehn Zeichenketten sehen, die mit `0x` beginnen. Jede davon ist eine **öffentliche Adresse** und gewissermaßen analog zur Kontonummer auf einem Prüfkonto. Diese Adresse würden Sie angeben, wenn Ihnen jemand Ether senden will. +Wenn Sie diesen Befehl ausführen, sollten Sie eine Liste von zehn Zeichenfolgen sehen, die mit `0x` beginnen. Jede ist eine **öffentliche Adresse** und in gewisser Weise analog zur Kontonummer eines Girokontos. Sie würden diese Adresse jemandem geben, der Ihnen Ether senden möchte. -Wie bereits erwähnt, hat der Testanbieter jedes dieser Konten mit Test-Ether gefüllt. Lassen Sie uns herausfinden, wie viel sich auf dem ersten Konto befindet: +Wie bereits erwähnt, hat der Tester-Provider jedes dieser Konten mit etwas Test-Ether aufgeladen. Lassen Sie uns herausfinden, wie viel auf dem ersten Konto ist: ```python In [7]: w3.eth.get_balance(w3.eth.accounts[0]) Out[7]: 1000000000000000000000000 ``` -Das sind viele Nullen. Bevor Sie vor Freude in die Luft springen, erinnern Sie sich bitte an unsere vorherige Lektion über die Schreibweise von Währungen. Ether wird in der kleinsten Einheit Wei angegeben. Rechnen Sie dies in Ether um: +Das sind viele Nullen! Bevor Sie lachend zur falschen Bank rennen, erinnern Sie sich an die Lektion über Währungsstückelungen von vorhin. Ether-Werte werden in der kleinsten Stückelung, Wei, dargestellt. Rechnen Sie das in Ether um: ```python -In [8]: w3.fromWei(1000000000000000000000000, 'ether') +In [8]: w3.from_wei(1000000000000000000000000, 'ether') Out[8]: Decimal('1000000') ``` -Eine Millionen Test-Ether – sind immer noch gut. +Eine Million Test-Ether – immer noch nicht allzu schäbig. -## 2. Stop auf der Tour: Blockdaten {#tour-stop-2-block-data} +## Tourstopp Nr. 2: Blockdaten {#tour-stop-2-block-data} -Werfen wir einen Blick auf den Status dieser simulierten Blockchain: +Werfen wir einen Blick auf den Zustand dieser simulierten Blockchain: ```python In [9]: w3.eth.get_block('latest') @@ -235,32 +235,35 @@ Out[9]: AttributeDict({ }) ``` -Über einen Block werden viele Informationen zurückgegeben, doch auf ein paar davon sollten Sie achten: +Es werden viele Informationen über einen Block zurückgegeben, aber hier sind nur ein paar Dinge hervorzuheben: -- Die Blocknummer ist Null – unabhängig davon, wie lange es her ist, dass Sie den Testanbieter konfiguriert haben. Im Gegensatz zum echten Ethereum-Netzwerk, das ungefähr alle 15 Sekunden einen neuen Block erstellt, wartet diese Simulation, bis sie von Ihnen etwas zu tun bekommt. -- Die `transactions` sind ebenfalls leer, da wir bisher noch nichts gemacht haben. Dieser erste Block ist ein **leerer Block**, nur um die Kette in Gang zu setzen. -- Beachten Sie, dass der `parentHash` nur ein Bund aus leeren Bytes ist. Das bedeutet, dass es sich um den ersten Block in der Kette handelt, auch bekannt als **Genesis Block**. +- Die Blocknummer ist null – egal, wie lange es her ist, dass Sie den Tester-Provider konfiguriert haben. Im Gegensatz zum echten Ethereum-Netzwerk, das alle 12 Sekunden einen neuen Block hinzufügt, wartet diese Simulation, bis Sie ihr etwas Arbeit geben. +- `transactions` ist aus demselben Grund eine leere Liste: Wir haben noch nichts getan. Dieser erste Block ist ein **leerer Block**, nur um die Chain zu starten. +- Beachten Sie, dass der `parentHash` nur ein Haufen leerer Bytes ist. Dies bedeutet, dass es der erste Block in der Chain ist, auch bekannt als der **Genesis-Block**. -## 3. Stop auf der Tour: [Transaktionen](/developers/docs/transactions/) {#tour-stop-3-transactions} +## Tourstopp Nr. 3: [Transaktionen](/developers/docs/transactions/) {#tour-stop-3-transactions} -Wir verharren bei Block Null bis es eine Transaktion zum Minen gibt, also geben wir ihm eine. Senden Sie ein paar Test-Ether von einem Konto zum anderem: +Wir stecken bei Block null fest, bis es eine ausstehende Transaktion gibt, also geben wir ihm eine. Senden Sie ein paar Test-Ether von einem Konto auf ein anderes: ```python In [10]: tx_hash = w3.eth.send_transaction({ 'from': w3.eth.accounts[0], 'to': w3.eth.accounts[1], - 'value': w3.toWei(3, 'ether'), + 'value': w3.to_wei(3, 'ether'), 'gas': 21000 }) ``` -Das ist typischerweise der Punkt, an dem Sie mehrere Sekunden warten würden, bis Ihre Transaktion in einem neuen Block erstellt wurde. Der gesamte Prozess läuft wie folgt ab: +Dies ist normalerweise der Punkt, an dem Sie mehrere Sekunden warten würden, bis Ihre Transaktion in einen neuen Block aufgenommen wird. Der vollständige Prozess läuft in etwa so ab: -1. Übermitteln Sie eine Transaktion und halten Sie den Transaktions-Hash bereit. Die Transaktion ist ausstehend bis sie geminted wurde. `tx_hash = w3.eth.send_transaction({ … })` -2. Warten Sie, bis die Transaktion geminted wurde: `w3.eth.wait_for_transaction_receipt(tx_hash)` -3. Setzen Sie die Anwendungslogik fort. Um die erfolgreiche Transaktion anzuzeigen: `w3.eth.get_transaction(tx_hash)` +1. Reichen Sie eine Transaktion ein und behalten Sie den Transaktions-Hash. Bis der Block, der die Transaktion enthält, erstellt und übertragen wird, ist die Transaktion „ausstehend“. + `tx_hash = w3.eth.send_transaction({ … })` +2. Warten Sie, bis die Transaktion in einen Block aufgenommen wird: + `w3.eth.wait_for_transaction_receipt(tx_hash)` +3. Fahren Sie mit der Anwendungslogik fort. Um die erfolgreiche Transaktion anzuzeigen: + `w3.eth.get_transaction(tx_hash)` -Unsere simulierte Umgebung wird die Transaktion sofort in einem neuen Block hinzufügen, so dass wir die Transaktion direkt sehen können: +Unsere simulierte Umgebung wird die Transaktion sofort in einem neuen Block hinzufügen, sodass wir die Transaktion sofort anzeigen können: ```python In [11]: w3.eth.get_transaction(tx_hash) @@ -275,22 +278,24 @@ Out[11]: AttributeDict({ }) ``` -Hier werden sie einige bekannte Details sehen: Die Felder `from`, `to` und `value` sollten mit den Einträgen unseres `send_transaction`-Aufrufs übereinstimmen. Das andere beruhigende Aspekt ist, dass diese Transaktion als erste Transaktion (`'transactionIndex': 0`) in Block Nr. 1 enthalten war. +Sie werden hier einige vertraute Details sehen: Die Felder `from`, `to` und `value` sollten mit den Eingaben unseres `send_transaction`-Aufrufs übereinstimmen. Der andere beruhigende Teil ist, dass diese Transaktion als erste Transaktion (`'transactionIndex': 0`) innerhalb von Block Nummer 1 aufgenommen wurde. -Wir können den Erfolg dieser Transaktion auch leicht überprüfen, indem wir die Salden der beiden beteiligten Konten kontrollieren. Drei Ether sollten sich von einem auf das andere Konto bewegt haben. +Wir können den Erfolg dieser Transaktion auch leicht überprüfen, indem wir die Kontostände der beiden beteiligten Konten überprüfen. Drei Ether sollten von einem zum anderen gewandert sein. ```python In [12]: w3.eth.get_balance(w3.eth.accounts[0]) -Out[12]: 999996999999999999969000 +Out[12]: 999996999979000000000000 In [13]: w3.eth.get_balance(w3.eth.accounts[1]) Out[13]: 1000003000000000000000000 ``` -Letzteres sieht gut aus. Der Saldo hat sich von 1.000.000 auf 1.000.003 Ether erhöht. Aber was ist mit dem ersten Konto passiert? Es scheint etwas mehr, als drei Ether verloren zu haben. Leider ist nichts im Leben kostenlos. Die Nutzung des öffentlichen Netzes von Ethereum erfordert, dass das Netzwerk für seine Unterstützung eine Aufwandsentschädigung erhält. Eine kleine Transaktionsgebühr wurde vom Konto abgezogen, in Größenordnung von 31000 Wei. +Letzteres sieht gut aus! Der Kontostand stieg von 1.000.000 auf 1.000.003 Ether. Aber was ist mit dem ersten Konto passiert? Es scheint etwas mehr als drei Ether verloren zu haben. Leider ist nichts im Leben umsonst, und die Nutzung des öffentlichen Ethereum-Netzwerks erfordert, dass Sie Ihre Peers für ihre unterstützende Rolle entschädigen. Eine kleine Transaktionsgebühr wurde von dem Konto abgezogen, das die Transaktion eingereicht hat – diese Gebühr ist die Menge an verbranntem Gas (21000 Einheiten Gas für eine ETH-Überweisung) multipliziert mit einer Grundgebühr, die je nach Netzwerkaktivität variiert, plus einem Trinkgeld, das an den Validator geht, der die Transaktion in einen Block aufnimmt. + +Mehr zu [Gas](/developers/docs/gas/#post-london) -Hinweis: Im öffentlichen Netzwerk basieren Transaktionsgebühren auf variablen Netzanforderungen und wie schnell Sie eine Transaktion verarbeiten möchten. Wenn Sie an einer Aufschlüsselung der Berechnung der Gebühren interessiert sind, sehen Sie sich meinen früheren Beitrag auf "Wie Transaktionen in einem Block enthalten sind" an. +Hinweis: Im öffentlichen Netzwerk sind Transaktionsgebühren variabel, basierend auf der Netzwerknachfrage und darauf, wie schnell eine Transaktion verarbeitet werden soll. Wenn Sie an einer Aufschlüsselung der Gebührenberechnung interessiert sind, lesen Sie meinen früheren Beitrag darüber, wie Transaktionen in einen Block aufgenommen werden. -## Und atmen {#and-breathe} +## Und durchatmen {#and-breathe} -Wir sind schon eine ganze Weile dabei, daher ist jetzt ein guter Zeitpunkt für eine Pause. Im zweiten Teil unserer Serie befassen wir uns weiter mit der Materie. Einige der weiteren Konzepte: Verbindung zu einem echten Node, Smart Contracts und Token. Haben Sie weitere Fragen? Lassen Sie es mich wissen. Ihr Feedback hat Einfluss darauf, wohin die Reise geht. Anfragen können Sie gerne über [Twitter](https://twitter.com/wolovim) stellen. +Wir sind schon eine Weile dabei, also scheint dies ein so guter Ort wie jeder andere zu sein, um eine Pause einzulegen. Der Kaninchenbau geht weiter, und wir werden im zweiten Teil dieser Serie weiter erkunden. Einige kommende Konzepte: Verbindung zu einem echten Blockchain-Knoten, Smart Contracts und Token. Haben Sie Anschlussfragen? Lassen Sie es mich wissen! Ihr Feedback wird beeinflussen, wohin wir von hier aus gehen. Anfragen sind über [Twitter](https://twitter.com/wolovim) willkommen. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/ai-trading-agent/index.md b/public/content/translations/de/developers/tutorials/ai-trading-agent/index.md index 69180e6e974..e65e508b587 100644 --- a/public/content/translations/de/developers/tutorials/ai-trading-agent/index.md +++ b/public/content/translations/de/developers/tutorials/ai-trading-agent/index.md @@ -1,84 +1,85 @@ --- -title: Make your own AI trading agent on Ethereum -description: In this tutorial you learn how to make a simple AI trading agent. This agent reads information from the blockchain, asks an LLM for a recommendation based on that information, performs the trade the LLM recommends, and then waits and repeats. +title: Erstellen Sie Ihren eigenen KI-Trading-Agenten auf Ethereum +description: "In diesem Tutorial lernen Sie, wie Sie einen einfachen KI-Trading-Agenten erstellen. Dieser Agent liest Informationen aus der Blockchain, bittet ein LLM um eine Empfehlung basierend auf diesen Informationen, führt den vom LLM empfohlenen Handel aus, wartet dann und wiederholt den Vorgang." author: Ori Pomerantz -tags: [ "AI", "trading", "Agent", "Python" ] +tags: ["KI", "Trading", "Agent", "Python"] skill: intermediate +breadcrumb: KI-Trading-Agent published: 2026-02-13 lang: de sidebarDepth: 3 --- -In this tutorial you learn how to build a simple AI trading agent. This agent works using these steps: +In diesem Tutorial lernen Sie, wie Sie einen einfachen KI-Trading-Agenten erstellen. Dieser Agent arbeitet nach folgenden Schritten: -1. Read the current and past prices of a token, as well as other potentially relevant information -2. Build a query with this information, along with background information to explain how it might be relevant -3. Submit the query and receive back a projected price -4. Trade based on the recommendation -5. Wait and repeat +1. Lesen der aktuellen und vergangenen Preise eines Tokens sowie anderer potenziell relevanter Informationen +2. Erstellen einer Abfrage mit diesen Informationen, zusammen mit Hintergrundinformationen, um zu erklären, wie sie relevant sein könnten +3. Einreichen der Abfrage und Erhalt eines prognostizierten Preises +4. Handeln basierend auf der Empfehlung +5. Warten und wiederholen -This agent demonstrates how to read information, translate it into a query that yields a usable answer, and use that answer. All of these are steps required for an AI agent. This agent is implemented in Python because it is the most common language used in AI. +Dieser Agent demonstriert, wie man Informationen liest, sie in eine Abfrage übersetzt, die eine brauchbare Antwort liefert, und diese Antwort verwendet. All dies sind Schritte, die für einen KI-Agenten erforderlich sind. Dieser Agent ist in Python implementiert, da dies die am häufigsten verwendete Sprache in der KI ist. -## Why do this? {#why-do-this} +## Warum das tun? {#why-do-this} -Automated trading agents allow developers to select and execute a trading strategy. [AI agents](/ai-agents) allow for more complex and dynamic trading strategies, potentially using information and algorithms the developer has not even considered using. +Automatisierte Trading-Agenten ermöglichen es Entwicklern, eine Handelsstrategie auszuwählen und auszuführen. [KI-Agenten](/ai-agents) ermöglichen komplexere und dynamischere Handelsstrategien, die potenziell Informationen und Algorithmen nutzen, an deren Verwendung der Entwickler noch nicht einmal gedacht hat. -## The tools {#tools} +## Die Werkzeuge {#tools} -This tutorial uses [Python](https://www.python.org/), the [Web3 library](https://web3py.readthedocs.io/en/stable/), and [Uniswap v3](https://github.com/Uniswap/v3-periphery) for quotes and trading. +Dieses Tutorial verwendet [Python](https://www.python.org/), die [Web3-Bibliothek](https://web3py.readthedocs.io/en/stable/) und [Uniswap v3](https://github.com/Uniswap/v3-periphery) für Preisangebote und den Handel. -### Why Python? {#python} +### Warum Python? {#python} -The most widely used language for AI is [Python](https://www.python.org/), so we use it here. Don't worry if you don't know Python. The language is very clear, and I will explain exactly what it does. +Die am weitesten verbreitete Sprache für KI ist [Python](https://www.python.org/), daher verwenden wir sie hier. Machen Sie sich keine Sorgen, wenn Sie Python nicht kennen. Die Sprache ist sehr klar, und ich werde genau erklären, was sie tut. -The [Web3 library](https://web3py.readthedocs.io/en/stable/) is the most common Python Ethereum API. It is pretty easy to use. +Die [Web3-Bibliothek](https://web3py.readthedocs.io/en/stable/) ist die gängigste Python-Ethereum-API. Sie ist ziemlich einfach zu bedienen. -### Trading on the blockchain {#trading-on-blockchain} +### Handeln auf der Blockchain {#trading-on-blockchain} -There are [many distributed exchanges (DEX)](/apps/categories/defi/) that let you trade tokens on Ethereum. However, they tend to have similar exchange rates due to [arbitrage](/developers/docs/smart-contracts/composability/#better-user-experience). +Es gibt [viele verteilte Börsen (DEX)](/apps/categories/defi/), die es Ihnen ermöglichen, Token auf Ethereum zu handeln. Sie neigen jedoch dazu, aufgrund von [Arbitrage](/developers/docs/smart-contracts/composability/#better-user-experience) ähnliche Wechselkurse zu haben. -[Uniswap](https://app.uniswap.org/) is a widely used DEX that we can use for both quotes (to see token relative values) and trades. +[Uniswap](https://app.uniswap.org/) ist eine weit verbreitete DEX, die wir sowohl für Preisangebote (um die relativen Werte der Token zu sehen) als auch für den Handel nutzen können. ### OpenAI {#openai} -For a large language model, I chose to get started with [OpenAI](https://openai.com/). To run the application in this tutorial you'll need to pay for API access. The minimum payment of $5 is more than sufficient. +Für ein großes Sprachmodell habe ich mich für den Einstieg für [OpenAI](https://openai.com/) entschieden. Um die Anwendung in diesem Tutorial auszuführen, müssen Sie für den API-Zugang bezahlen. Die Mindestzahlung von 5 $ ist mehr als ausreichend. -## Development, step by step {#step-by-step} +## Entwicklung, Schritt für Schritt {#step-by-step} -To simplify development, we proceed in stages. Each step is a branch in GitHub. +Um die Entwicklung zu vereinfachen, gehen wir in Phasen vor. Jeder Schritt ist ein Branch auf GitHub. ### Erste Schritte {#getting-started} -There are steps to get started under UNIX or Linux (including [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)) +Es gibt Schritte für den Einstieg unter UNIX oder Linux (einschließlich [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)) -1. If you don't already have it, download and install [Python](https://www.python.org/downloads/). +1. Falls Sie es noch nicht haben, laden Sie [Python](https://www.python.org/downloads/) herunter und installieren Sie es. 2. Klonen Sie das GitHub-Repository. ```sh git clone https://github.com/qbzzt/260215-ai-agent.git -b 01-getting-started cd 260215-ai-agent - ``` +``` -3. Install [`uv`](https://docs.astral.sh/uv/getting-started/installation/). The command on your system might be different. +3. Installieren Sie [`uv`](https://docs.astral.sh/uv/getting-started/installation/). Der Befehl auf Ihrem System könnte anders lauten. ```sh pipx install uv - ``` +``` -4. Download the libraries. +4. Laden Sie die Bibliotheken herunter. ```sh uv sync - ``` +``` -5. Activate the virtual environment. +5. Aktivieren Sie die virtuelle Umgebung. ```sh source .venv/bin/activate - ``` +``` -6. To verify Python and Web3 are working correctly, run `python3` and provide it with this program. You can enter it at the `>>>` prompt; there is no need to create a file. +6. Um zu überprüfen, ob Python und Web3 korrekt funktionieren, führen Sie `python3` aus und übergeben Sie ihm dieses Programm. Sie können es an der Eingabeaufforderung `>>>` eingeben; es ist nicht nötig, eine Datei zu erstellen. ```python from web3 import Web3 @@ -86,20 +87,20 @@ There are steps to get started under UNIX or Linux (including [WSL](https://lear w3 = Web3(Web3.HTTPProvider(MAINNET_URL)) w3.eth.block_number quit() - ``` +``` -### Reading from the blockchain {#read-blockchain} +### Lesen aus der Blockchain {#read-blockchain} -The next step is to read from the blockchain. To do that, you need to change to the `02-read-quote` branch and then use `uv` to run the program. +Der nächste Schritt ist das Lesen aus der Blockchain. Dazu müssen Sie in den Branch `02-read-quote` wechseln und dann `uv` verwenden, um das Programm auszuführen. ```sh git checkout 02-read-quote uv run agent.py ``` -You should receive a list of `Quote` objects, each with a timestamp, a price, and the asset (currently always `WETH/USDC`). +Sie sollten eine Liste von `Quote`-Objekten erhalten, jedes mit einem Zeitstempel, einem Preis und dem Asset (derzeit immer `WETH/USDC`). -Here is a line-by-line explanation. +Hier ist eine zeilenweise Erklärung. ```python from web3 import Web3 @@ -113,19 +114,19 @@ import functools import sys ``` -Importieren Sie die Bibliotheken, die wir benötigen. They are explained below when used. +Importieren Sie die benötigten Bibliotheken. Sie werden unten erklärt, wenn sie verwendet werden. ```python print = functools.partial(print, flush=True) ``` -Replaces Python’s `print` with a version that always flushes output immediately. This is useful in a long-running script because we don't want to wait for status updates or debugging output. +Ersetzt Pythons `print` durch eine Version, die die Ausgabe immer sofort leert. Dies ist in einem lang laufenden Skript nützlich, da wir nicht auf Statusaktualisierungen oder Debugging-Ausgaben warten möchten. ```python MAINNET_URL = "https://eth.drpc.org" ``` -A URL to get to mainnet. You can get one from [Node as a service](/developers/docs/nodes-and-clients/nodes-as-a-service/) or use one of those advertised in [Chainlist](https://chainlist.org/chain/1). +Eine URL, um zum Mainnet zu gelangen. Sie können eine von [Blockchain-Knoten als Dienstleistung](/developers/docs/nodes-and-clients/nodes-as-a-service/) erhalten oder eine der auf [Chainlist](https://chainlist.org/chain/1) beworbenen verwenden. ```python BLOCK_TIME_SECONDS = 12 @@ -134,20 +135,20 @@ HOUR_BLOCKS = MINUTE_BLOCKS * 60 DAY_BLOCKS = HOUR_BLOCKS * 24 ``` -An Ethereum mainnet block typically happens every twelve seconds, so these are the number of blocks we'd expect to happen in a time period. Note that this is not an exact figure. When the [block proposer](/developers/docs/consensus-mechanisms/pos/block-proposal/) is down, that block is skipped, and the time for the next block is 24 seconds. If we wanted to get the exact block for a timestamp, we'd use [binary search](https://en.wikipedia.org/wiki/Binary_search). However, this is close enough for our purposes. Predicting the future is not an exact science. +Ein Ethereum-Mainnet-Block entsteht typischerweise alle zwölf Sekunden, daher ist dies die Anzahl der Blöcke, die wir in einem bestimmten Zeitraum erwarten würden. Beachten Sie, dass dies keine exakte Zahl ist. Wenn der [Block-Vorschlagende](/developers/docs/consensus-mechanisms/pos/block-proposal/) ausfällt, wird dieser Block übersprungen, und die Zeit für den nächsten Block beträgt 24 Sekunden. Wenn wir den exakten Block für einen Zeitstempel erhalten wollten, würden wir die [binäre Suche](https://en.wikipedia.org/wiki/Binary_search) verwenden. Für unsere Zwecke ist dies jedoch nah genug. Die Zukunft vorherzusagen ist keine exakte Wissenschaft. ```python CYCLE_BLOCKS = DAY_BLOCKS ``` -The size of the cycle. We review quotes once per cycle and try to estimate the value at the end of the next cycle. +Die Größe des Zyklus. Wir überprüfen die Preisangebote einmal pro Zyklus und versuchen, den Wert am Ende des nächsten Zyklus zu schätzen. ```python -# The address of the pool we're reading +# Die Adresse des Pools, den wir auslesen WETHUSDC_ADDRESS = Web3.to_checksum_address("0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640") ``` -The quote values are taken from the Uniswap 3 USDC/WETH pool at address [`0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640`](https://eth.blockscout.com/address/0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640?tab=read_write_contract). This address is already in checksum form, but it's better to use [`Web3.to_checksum_address`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_checksum_address) to make the code reusable. +Die Werte der Preisangebote stammen aus dem Uniswap 3 USDC/WETH-Pool an der Adresse [`0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640`](https://eth.blockscout.com/address/0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640?tab=read_write_contract). Diese Adresse liegt bereits in Prüfsummenform vor, aber es ist besser, [`Web3.to_checksum_address`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_checksum_address) zu verwenden, um den Code wiederverwendbar zu machen. ```python POOL_ABI = [ @@ -162,13 +163,13 @@ ERC20_ABI = [ ] ``` -These are the [ABIs](https://docs.soliditylang.org/en/latest/abi-spec.html) for the two contracts we need to contact. To keep the code concise, we include only the functions we need to call. +Dies sind die [ABIs](https://docs.soliditylang.org/en/latest/abi-spec.html) für die beiden Verträge, die wir kontaktieren müssen. Um den Code prägnant zu halten, fügen wir nur die Funktionen ein, die wir aufrufen müssen. ```python w3 = Web3(Web3.HTTPProvider(MAINNET_URL)) ``` -Initiate the [`Web3`](https://web3py.readthedocs.io/en/stable/quickstart.html#remote-providers) library and connect to an Ethereum node. +Initialisieren Sie die [`Web3`](https://web3py.readthedocs.io/en/stable/quickstart.html#remote-providers)-Bibliothek und stellen Sie eine Verbindung zu einem Ethereum-Blockchain-Knoten her. ```python @dataclass(frozen=True) @@ -179,9 +180,9 @@ class ERC20Token: contract: Contract ``` -This is one way to create a data class in Python. The [`Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) data type is used to connect to the contract. Note the `(frozen=True)`. In Python [booleans](https://en.wikipedia.org/wiki/Boolean_data_type) are defined as `True` or `False`, capitalized. This data class is `frozen`, meaning the fields cannot be modified. +Dies ist eine Möglichkeit, eine Datenklasse in Python zu erstellen. Der Datentyp [`Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) wird verwendet, um eine Verbindung zum Vertrag herzustellen. Beachten Sie das `(frozen=True)`. In Python werden [Booleans](https://en.wikipedia.org/wiki/Boolean_data_type) als `True` oder `False` definiert, großgeschrieben. Diese Datenklasse ist `frozen` (eingefroren), was bedeutet, dass die Felder nicht geändert werden können. -Note the indentation. In contrast to [C-derived languages](https://en.wikipedia.org/wiki/List_of_C-family_programming_languages), Python uses indentation to denote blocks. The Python interpreter knows that the following definition is not part of this data class because it doesn't start at the same indentation as the data class fields. +Beachten Sie die Einrückung. Im Gegensatz zu [C-abgeleiteten Sprachen](https://en.wikipedia.org/wiki/List_of_C-family_programming_languages) verwendet Python Einrückungen, um Blöcke zu kennzeichnen. Der Python-Interpreter weiß, dass die folgende Definition nicht Teil dieser Datenklasse ist, da sie nicht mit derselben Einrückung wie die Felder der Datenklasse beginnt. ```python @dataclass(frozen=True) @@ -194,44 +195,44 @@ class PoolInfo: decimal_factor: Decimal = 1 ``` -The [`Decimal`](https://docs.python.org/3/library/decimal.html) type is used for accurately handling decimal fractions. +Der Typ [`Decimal`](https://docs.python.org/3/library/decimal.html) wird für die genaue Handhabung von Dezimalbrüchen verwendet. ```python def get_price(self, block: int) -> Decimal: ``` -This is the way to define a function in Python. The definition is indented to show it is still part of `PoolInfo`. +Dies ist die Art und Weise, eine Funktion in Python zu definieren. Die Definition ist eingerückt, um zu zeigen, dass sie immer noch Teil von `PoolInfo` ist. -In a function that is part of a data class the first parameter is always `self`, the data class instance that called here. Here there is another parameter, the block number. +In einer Funktion, die Teil einer Datenklasse ist, ist der erste Parameter immer `self`, die Instanz der Datenklasse, die hier aufgerufen hat. Hier gibt es einen weiteren Parameter, die Blocknummer. ```python assert block <= w3.eth.block_number, "Block is in the future" ``` -If we could read the future, we wouldn't need AI for trading. +Wenn wir die Zukunft lesen könnten, bräuchten wir keine KI für das Trading. ```python sqrt_price_x96 = Decimal(self.contract.functions.slot0().call(block_identifier=block)[0]) ``` -The syntax for calling a function on the EVM from Web3 is this: `.functions.().call()`. The parameters can be the EVM function's parameters (if any; here there aren't) or [named parameters](https://en.wikipedia.org/wiki/Named_parameter) for modifying blockchain behavior. Here we use one, `block_identifier`, to specify [the block number](/developers/docs/apis/json-rpc/#default-block) we wish to run in. +Die Syntax zum Aufrufen einer Funktion auf der EVM von Web3 aus lautet: `.functions.().call()`. Die Parameter können die Parameter der EVM-Funktion sein (falls vorhanden; hier gibt es keine) oder [benannte Parameter](https://en.wikipedia.org/wiki/Named_parameter) zur Änderung des Blockchain-Verhaltens. Hier verwenden wir einen, `block_identifier`, um [die Blocknummer](/developers/docs/apis/json-rpc/#default-block) anzugeben, in der wir ausführen möchten. -The result is [this struct, in array form](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol#L56-L72). The first value is a function of the exchange rate between the two tokens. +Das Ergebnis ist [dieses Struct, in Array-Form](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol#L56-L72). Der erste Wert ist eine Funktion des Wechselkurses zwischen den beiden Token. ```python raw_price = (sqrt_price_x96 / Decimal(2**96)) ** 2 ``` -To reduce onchain calculations, Uniswap v3 does not store the actual exchange factor but rather its square root. Because the EVM does not support floating point math or fractions, instead of the actual value, the response is price296 +Um Berechnungen auf der Blockchain zu reduzieren, speichert Uniswap v3 nicht den tatsächlichen Umrechnungsfaktor, sondern dessen Quadratwurzel. Da die EVM keine Fließkomma-Mathematik oder Brüche unterstützt, ist die Antwort anstelle des tatsächlichen Wertes price296 ```python - # (token1 per token0) + # (token1 pro token0) return 1/(raw_price * self.decimal_factor) ``` -The raw price we get is the number of `token0` we get for each `token1`. In our pool `token0` is USDC (stablecoin with the same value as a US dollar) and `token1` is [WETH](https://opensea.io/learn/blockchain/what-is-weth). The value we really want is the number of dollars per WETH, not the inverse. +Der Rohpreis, den wir erhalten, ist die Anzahl von `token0`, die wir für jedes `token1` bekommen. In unserem Pool ist `token0` USDC (Stablecoin mit dem gleichen Wert wie ein US-Dollar) und `token1` ist [WETH](https://opensea.io/learn/blockchain/what-is-weth). Der Wert, den wir wirklich wollen, ist die Anzahl der Dollar pro WETH, nicht umgekehrt. -The decimal factor is the ratio between the [decimal factors](https://docs.openzeppelin.com/contracts/4.x/erc20#a-note-on-decimals) for the two tokens. +Der Dezimalfaktor ist das Verhältnis zwischen den [Dezimalfaktoren](https://docs.openzeppelin.com/contracts/4.x/erc20#a-note-on-decimals) für die beiden Token. ```python @dataclass(frozen=True) @@ -241,7 +242,7 @@ class Quote: asset: str ``` -This data class represents a quote: the price of a specific asset at a given point in time. At this point, the `asset` field is irrelevant because we use a single pool and therefore have a single asset. However, we will add more assets later. +Diese Datenklasse repräsentiert ein Preisangebot (Quote): den Preis eines bestimmten Assets zu einem bestimmten Zeitpunkt. An diesem Punkt ist das Feld `asset` irrelevant, da wir einen einzigen Pool verwenden und daher ein einziges Asset haben. Wir werden jedoch später weitere Assets hinzufügen. ```python def read_token(address: str) -> ERC20Token: @@ -257,7 +258,7 @@ def read_token(address: str) -> ERC20Token: ) ``` -This function takes an address and returns information about the token contract at that address. To create a new [Web3 `Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html), we provide the address and ABI to `w3.eth.contract`. +Diese Funktion nimmt eine Adresse und gibt Informationen über den Token-Vertrag an dieser Adresse zurück. Um einen neuen [Web3 `Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) zu erstellen, übergeben wir die Adresse und die ABI an `w3.eth.contract`. ```python def read_pool(address: str) -> PoolInfo: @@ -277,22 +278,22 @@ def read_pool(address: str) -> PoolInfo: ) ``` -This function returns everything we need about [a specific pool](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol). The syntax `f""` is a [formatted string](https://docs.python.org/3/reference/lexical_analysis.html#f-strings). +Diese Funktion gibt alles zurück, was wir über [einen bestimmten Pool](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol) benötigen. Die Syntax `f""` ist ein [formatierter String](https://docs.python.org/3/reference/lexical_analysis.html#f-strings). ```python def get_quote(pool: PoolInfo, block_number: int = None) -> Quote: ``` -Get a `Quote` object. The default value for `block_number` is `None` (no value). +Holen Sie sich ein `Quote`-Objekt. Der Standardwert für `block_number` ist `None` (kein Wert). ```python if block_number is None: block_number = w3.eth.block_number ``` -If a block number was not specified, use `w3.eth.block_number`, which is the latest block number. This is the syntax for [an `if` statement](https://docs.python.org/3/reference/compound_stmts.html#the-if-statement). +Wenn keine Blocknummer angegeben wurde, verwenden Sie `w3.eth.block_number`, was die neueste Blocknummer ist. Dies ist die Syntax für [eine `if`-Anweisung](https://docs.python.org/3/reference/compound_stmts.html#the-if-statement). -It might look as if it would have been better to just set the default to `w3.eth.block_number`, but that doesn't work well because it would be the block number at the time the function is defined. In a long-running agent, this would be a problem. +Es mag so aussehen, als wäre es besser gewesen, den Standardwert einfach auf `w3.eth.block_number` zu setzen, aber das funktioniert nicht gut, da es die Blocknummer zum Zeitpunkt der Definition der Funktion wäre. In einem lang laufenden Agenten wäre dies ein Problem. ```python block = w3.eth.get_block(block_number) @@ -304,20 +305,20 @@ It might look as if it would have been better to just set the default to `w3.eth ) ``` -Use [the `datetime` library](https://docs.python.org/3/library/datetime.html) to format it to a format readable for humans and large language models (LLMs). Use [`Decimal.quantize`](https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize) to round the value to two decimal places. +Verwenden Sie [die `datetime`-Bibliothek](https://docs.python.org/3/library/datetime.html), um es in ein Format zu formatieren, das für Menschen und große Sprachmodelle (LLMs) lesbar ist. Verwenden Sie [`Decimal.quantize`](https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize), um den Wert auf zwei Dezimalstellen zu runden. ```python def get_quotes(pool: PoolInfo, start_block: int, end_block: int, step: int) -> list[Quote]: ``` -In Python you define a [list](https://docs.python.org/3/library/stdtypes.html#typesseq-list) that can only contain a specific type using `list[]`. +In Python definieren Sie eine [Liste](https://docs.python.org/3/library/stdtypes.html#typesseq-list), die nur einen bestimmten Typ enthalten kann, mit `list[]`. ```python quotes = [] for block in range(start_block, end_block + 1, step): ``` -In Python a [`for` loop](https://docs.python.org/3/tutorial/controlflow.html#for-statements) typically iterates over a list. The list of block numbers to find quotes in comes from [`range`](https://docs.python.org/3/library/stdtypes.html#range). +In Python iteriert eine [`for`-Schleife](https://docs.python.org/3/tutorial/controlflow.html#for-statements) typischerweise über eine Liste. Die Liste der Blocknummern, in denen nach Preisangeboten gesucht werden soll, stammt von [`range`](https://docs.python.org/3/library/stdtypes.html#range). ```python quote = get_quote(pool, block) @@ -325,7 +326,7 @@ In Python a [`for` loop](https://docs.python.org/3/tutorial/controlflow.html#for return quotes ``` -For each block number, get a `Quote` object and append it to the `quotes` list. Then return that list. +Holen Sie für jede Blocknummer ein `Quote`-Objekt und hängen Sie es an die Liste `quotes` an. Geben Sie dann diese Liste zurück. ```python pool = read_pool(WETHUSDC_ADDRESS) @@ -339,18 +340,18 @@ quotes = get_quotes( pprint(quotes) ``` -This is the main code of the script. Read the pool information, get twelve quotes, and [`pprint`](https://docs.python.org/3/library/pprint.html#pprint.pprint) them. +Dies ist der Hauptcode des Skripts. Lesen Sie die Pool-Informationen, holen Sie zwölf Preisangebote und geben Sie sie mit [`pprint`](https://docs.python.org/3/library/pprint.html#pprint.pprint) aus. -### Creating a prompt {#prompt} +### Erstellen eines Prompts {#prompt} -Next, we need to convert this list of quotes into a prompt for an LLM and obtain an expected future value. +Als Nächstes müssen wir diese Liste von Preisangeboten in einen Prompt für ein LLM umwandeln und einen erwarteten zukünftigen Wert erhalten. ```sh git checkout 03-create-prompt uv run agent.py ``` -The output is now going to be a prompt to an LLM, similar to: +Die Ausgabe wird nun ein Prompt an ein LLM sein, ähnlich wie: ``` Given these quotes: @@ -375,35 +376,35 @@ Provide your answer as a single number rounded to two decimal places, without any other text. ``` -Notice that there are quotes for two assets here, `WETH/USDC` and `WBTC/WETH`. Adding quotes from another asset might improve the prediction accuracy. +Beachten Sie, dass es hier Preisangebote für zwei Assets gibt, `WETH/USDC` und `WBTC/WETH`. Das Hinzufügen von Preisangeboten eines anderen Assets könnte die Vorhersagegenauigkeit verbessern. -#### What a prompt looks like {#prompt-explanation} +#### Wie ein Prompt aussieht {#prompt-explanation} -This prompt contains three sections, which are pretty common in LLM prompts. +Dieser Prompt enthält drei Abschnitte, die in LLM-Prompts ziemlich üblich sind. -1. Information. LLMs have a lot of information from their training, but they usually don't have the latest. This is the reason we need to retrieve the latest quotes here. Adding information to a prompt is called [retrieval augmented generation (RAG)](https://en.wikipedia.org/wiki/Retrieval-augmented_generation). +1. Informationen. LLMs haben viele Informationen aus ihrem Training, aber sie verfügen normalerweise nicht über die neuesten. Aus diesem Grund müssen wir hier die neuesten Preisangebote abrufen. Das Hinzufügen von Informationen zu einem Prompt wird als [Retrieval Augmented Generation (RAG)](https://en.wikipedia.org/wiki/Retrieval-augmented_generation) bezeichnet. -2. The actual question. This is what we want to know. +2. Die eigentliche Frage. Das ist es, was wir wissen wollen. -3. Output formatting instructions. Normally, an LLM will give us an estimate with an explanation of how it arrived at it. This is better for humans, but a computer program just needs the bottom line. +3. Anweisungen zur Ausgabeformatierung. Normalerweise gibt uns ein LLM eine Schätzung mit einer Erklärung, wie es dazu gekommen ist. Das ist besser für Menschen, aber ein Computerprogramm benötigt nur das Endergebnis. -#### Code explanation {#prompt-code} +#### Code-Erklärung {#prompt-code} -Here is the new code. +Hier ist der neue Code. ```python from datetime import datetime, timezone, timedelta ``` -We need to provide the LLM with the time for which we want an estimate. To get a time "n minutes/hours/days" in the future, we use [the `timedelta` class](https://docs.python.org/3/library/datetime.html#datetime.timedelta). +Wir müssen dem LLM die Zeit mitteilen, für die wir eine Schätzung wünschen. Um eine Zeit "n Minuten/Stunden/Tage" in der Zukunft zu erhalten, verwenden wir [die Klasse `timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta). ```python -# The addresses of the pools we're reading +# Die Adressen der Pools, die wir auslesen WETHUSDC_ADDRESS = Web3.to_checksum_address("0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640") WETHWBTC_ADDRESS = Web3.to_checksum_address("0xCBCdF9626bC03E24f779434178A73a0B4bad62eD") ``` -We have two pools we need to read. +Wir haben zwei Pools, die wir lesen müssen. ```python @dataclass(frozen=True) @@ -416,14 +417,14 @@ class PoolInfo: def get_price(self, block: int) -> Decimal: assert block <= w3.eth.block_number, "Block is in the future" sqrt_price_x96 = Decimal(self.contract.functions.slot0().call(block_identifier=block)[0]) - raw_price = (sqrt_price_x96 / Decimal(2**96)) ** 2 # (token1 per token0) + raw_price = (sqrt_price_x96 / Decimal(2**96)) ** 2 # (token1 pro token0) if self.reverse: return 1/(raw_price * self.decimal_factor) else: return raw_price * self.decimal_factor ``` -In the WETH/USDC pool, we want to know how many of `token0` (USDC) we need to buy one of `token1` (WETH). In the WETH/WBTC pool, we want to know how many `token1` (WETH) we need to buy one `token0` (WBTC, which is wrapped Bitcoin). We need to track whether the pool’s ratio needs to be reversed. +Im WETH/USDC-Pool möchten wir wissen, wie viele von `token0` (USDC) wir benötigen, um eines von `token1` (WETH) zu kaufen. Im WETH/WBTC-Pool möchten wir wissen, wie viele `token1` (WETH) wir benötigen, um ein `token0` (WBTC, was Wrapped Bitcoin ist) zu kaufen. Wir müssen nachverfolgen, ob das Verhältnis des Pools umgekehrt werden muss. ```python def read_pool(address: str, reverse: bool = False) -> PoolInfo: @@ -441,9 +442,9 @@ def read_pool(address: str, reverse: bool = False) -> PoolInfo: ) ``` -To know if a pool needs to be reversed, we get to get that as input to `read_pool`. Also, the asset symbol needs to be set up correctly. +Um zu wissen, ob ein Pool umgekehrt werden muss, müssen wir dies als Eingabe für `read_pool` erhalten. Außerdem muss das Asset-Symbol korrekt eingerichtet sein. -The syntax ` if else ` is the Python equivalent of the [ternary conditional operator](https://en.wikipedia.org/wiki/Ternary_conditional_operator), which in a C-derived language would be ` ? : `. +Die Syntax ` if else ` ist das Python-Äquivalent des [ternären bedingten Operators](https://en.wikipedia.org/wiki/Ternary_conditional_operator), der in einer C-abgeleiteten Sprache ` ? : ` wäre. ```python def format_quotes(quotes: list[Quote]) -> str: @@ -453,14 +454,14 @@ def format_quotes(quotes: list[Quote]) -> str: return result ``` -This function builds a string that formats a list of `Quote` objects, assuming they all apply to the same asset. +Diese Funktion erstellt einen String, der eine Liste von `Quote`-Objekten formatiert, unter der Annahme, dass sie alle für dasselbe Asset gelten. ```python def make_prompt(quotes: list[list[Quote]], expected_time: str, asset: str) -> str: return f""" ``` -In Python [multi-line string literals](https://www.w3schools.com/python/gloss_python_multi_line_strings.asp) are written as `"""` .... `"""`. +In Python werden [mehrzeilige String-Literale](https://www.w3schools.com/python/gloss_python_multi_line_strings.asp) als `"""` .... `"""` geschrieben. ```python Given these quotes: @@ -470,7 +471,7 @@ Given these quotes: } ``` -Here, we use the [MapReduce](https://en.wikipedia.org/wiki/MapReduce) pattern to generate a string for each quote list with `format_quotes`, then reduce them into a single string for use in the prompt. +Hier verwenden wir das [MapReduce](https://en.wikipedia.org/wiki/MapReduce)-Muster, um mit `format_quotes` einen String für jede Preisangebotsliste zu generieren, und reduzieren sie dann zu einem einzigen String zur Verwendung im Prompt. ```python What would you expect the value for {asset} to be at time {expected_time}? @@ -480,7 +481,7 @@ without any other text. """ ``` -The rest of the prompt is as expected. +Der Rest des Prompts ist wie erwartet. ```python wethusdc_pool = read_pool(WETHUSDC_ADDRESS, True) @@ -500,7 +501,7 @@ wethwbtc_quotes = get_quotes( ) ``` -Review the two pools and obtain quotes from both. +Überprüfen Sie die beiden Pools und holen Sie Preisangebote von beiden ein. ```python future_time = (datetime.now(timezone.utc) + timedelta(days=1)).isoformat()[0:16] @@ -508,40 +509,37 @@ future_time = (datetime.now(timezone.utc) + timedelta(days=1)).isoformat()[0:16] print(make_prompt(wethusdc_quotes + wethwbtc_quotes, future_time, wethusdc_pool.asset)) ``` -Determine the future time point for which we want the estimate, and create the prompt. - -### Interfacing with an LLM {#interface-llm} - -Next, we prompt an actual LLM and receive an expected future value. I wrote this program using OpenAI, so if you want to use a different provider, you'll need to adjust it. - -1. Get an [OpenAI account](https://auth.openai.com/create-account) +Bestimmen Sie den zukünftigen Zeitpunkt, für den wir die Schätzung wünschen, und erstellen Sie den Prompt. -2. [Fund the account](https://platform.openai.com/settings/organization/billing/overview)—the minimum amount at the time of writing is $5 +### Schnittstelle zu einem LLM {#interface-llm} -3. [Create an API key](https://platform.openai.com/settings/organization/api-keys) +Als Nächstes fordern wir ein tatsächliches LLM auf und erhalten einen erwarteten zukünftigen Wert. Ich habe dieses Programm mit OpenAI geschrieben. Wenn Sie also einen anderen Anbieter verwenden möchten, müssen Sie es anpassen. -4. In the command line, export the API key so your program can use it +1. Holen Sie sich ein [OpenAI-Konto](https://auth.openai.com/create-account) +2. [Laden Sie das Konto auf](https://platform.openai.com/settings/organization/billing/overview) – der Mindestbetrag zum Zeitpunkt des Schreibens beträgt 5 $ +3. [Erstellen Sie einen API-Schlüssel](https://platform.openai.com/settings/organization/api-keys) +4. Exportieren Sie in der Befehlszeile den API-Schlüssel, damit Ihr Programm ihn verwenden kann ```sh export OPENAI_API_KEY=sk- - ``` +``` -5. Checkout and run the agent +5. Checken Sie den Agenten aus und führen Sie ihn aus ```sh git checkout 04-interface-llm uv run agent.py - ``` +``` -Here is the new code. +Hier ist der neue Code. ```python from openai import OpenAI -open_ai = OpenAI() # The client reads the OPENAI_API_KEY environment variable +open_ai = OpenAI() # Der Client liest die Umgebungsvariable OPENAI_API_KEY ``` -Import and instantiate the OpenAI API. +Importieren und instanziieren Sie die OpenAI-API. ```python response = open_ai.chat.completions.create( @@ -554,7 +552,7 @@ response = open_ai.chat.completions.create( ) ``` -Call the OpenAI API (`open_ai.chat.completions.create`) to create the response. +Rufen Sie die OpenAI-API auf (`open_ai.chat.completions.create`), um die Antwort zu erstellen. ```python expected_price = Decimal(response.choices[0].message.content.strip()) @@ -569,17 +567,17 @@ else: print(f"Sell, I expect the price to go down by {current_price - expected_price} USD") ``` -Output the price and provide a buy or sell recommendation. +Geben Sie den Preis aus und geben Sie eine Kauf- oder Verkaufsempfehlung ab. -#### Testing the predictions {#testing-the-predictions} +#### Testen der Vorhersagen {#testing-the-predictions} -Now that we can generate predictions, we can also use historical data to assess whether we produce useful predictions. +Da wir nun Vorhersagen generieren können, können wir auch historische Daten verwenden, um zu beurteilen, ob wir nützliche Vorhersagen produzieren. ```sh uv run test-predictor.py ``` -The expected result is similar to: +Das erwartete Ergebnis ist ähnlich wie: ``` Prediction for 2026-01-05T19:50: predicted 3138.93 USD, real 3218.92 USD, error 79.99 USD @@ -599,12 +597,12 @@ Profitable days: 51.72% Losing days: 48.28% ``` -Most of the tester is identical to the agent, but here are the parts that are new or modified. +Der Großteil des Testers ist identisch mit dem Agenten, aber hier sind die Teile, die neu oder modifiziert sind. ```python -CYCLES_FOR_TEST = 40 # For the backtest, how many cycles we test over +CYCLES_FOR_TEST = 40 # Für den Backtest, über wie viele Zyklen wir testen -# Get lots of quotes +# Viele Kurse abrufen wethusdc_pool = read_pool(WETHUSDC_ADDRESS, True) wethusdc_quotes = get_quotes( wethusdc_pool, @@ -622,31 +620,31 @@ wethwbtc_quotes = get_quotes( ) ``` -We look at `CYCLES_FOR_TEST` (specified as 40 here) days back. +Wir schauen `CYCLES_FOR_TEST` (hier als 40 angegeben) Tage zurück. ```python -# Create predictions and check them against real history +# Vorhersagen erstellen und mit der echten Historie abgleichen total_error = Decimal(0) changes = [] ``` -There are two types of errors we are interested in. The first, `total_error`, is simply the sum of errors the predictor made. +Es gibt zwei Arten von Fehlern, an denen wir interessiert sind. Der erste, `total_error`, ist einfach die Summe der Fehler, die der Prädiktor gemacht hat. -To understand the second, `changes`, we need to remember the agent's purpose. It's not to predict the WETH/USDC ratio (ETH price). It's to issue sell and buy recommendations. If the price is currently $2000 and it predicts $2010 tomorrow, we don't mind if the actual result is $2020 and we earn extra money. But we _do_ mind if it predicted $2010, and bought ETH based on that recommendation, and the price drops to $1990. +Um den zweiten, `changes`, zu verstehen, müssen wir uns an den Zweck des Agenten erinnern. Es geht nicht darum, das WETH/USDC-Verhältnis (ETH-Preis) vorherzusagen. Es geht darum, Verkaufs- und Kaufempfehlungen abzugeben. Wenn der Preis derzeit 2000 $ beträgt und er für morgen 2010 $ vorhersagt, macht es uns nichts aus, wenn das tatsächliche Ergebnis 2020 $ ist und wir zusätzliches Geld verdienen. Aber es stört uns _sehr wohl_, wenn er 2010 $ vorhergesagt hat und basierend auf dieser Empfehlung ETH gekauft hat, und der Preis auf 1990 $ fällt. ```python for index in range(0,len(wethusdc_quotes)-CYCLES_BACK): ``` -We can only look at cases where the complete history (the values used for the prediction and the real-world value to compare it to) is available. This means the newest case must be the one that started `CYCLES_BACK` ago. +Wir können uns nur Fälle ansehen, in denen die vollständige Historie (die für die Vorhersage verwendeten Werte und der reale Wert zum Vergleich) verfügbar ist. Das bedeutet, dass der neueste Fall derjenige sein muss, der vor `CYCLES_BACK` begonnen hat. ```python wethusdc_slice = wethusdc_quotes[index:index+CYCLES_BACK] wethwbtc_slice = wethwbtc_quotes[index:index+CYCLES_BACK] ``` -Use [slices](https://www.w3schools.com/python/ref_func_slice.asp) to get the same number of samples as the number the agent uses. The code between here and the next segment is the same get-a-prediction code we have in the agent. +Verwenden Sie [Slices](https://www.w3schools.com/python/ref_func_slice.asp), um die gleiche Anzahl von Stichproben zu erhalten wie die Anzahl, die der Agent verwendet. Der Code zwischen hier und dem nächsten Segment ist derselbe Code zum Abrufen einer Vorhersage, den wir im Agenten haben. ```python predicted_price = Decimal(response.choices[0].message.content.strip()) @@ -654,7 +652,7 @@ Use [slices](https://www.w3schools.com/python/ref_func_slice.asp) to get the sam prediction_time_price = wethusdc_quotes[index+CYCLES_BACK-1].price ``` -Get the predicted price, the real price, and the price at the time of the prediction. We need the price at the time of the prediction to determine whether the recommendation was to buy or sell. +Holen Sie sich den vorhergesagten Preis, den realen Preis und den Preis zum Zeitpunkt der Vorhersage. Wir benötigen den Preis zum Zeitpunkt der Vorhersage, um zu bestimmen, ob die Empfehlung Kaufen oder Verkaufen lautete. ```python error = abs(predicted_price - real_price) @@ -662,7 +660,7 @@ Get the predicted price, the real price, and the price at the time of the predic print (f"Prediction for {prediction_time}: predicted {predicted_price} USD, real {real_price} USD, error {error} USD") ``` -Figure the error, and add it to the total. +Berechnen Sie den Fehler und fügen Sie ihn der Gesamtsumme hinzu. ```python recomended_action = 'buy' if predicted_price > prediction_time_price else 'sell' @@ -670,7 +668,7 @@ Figure the error, and add it to the total. changes.append(price_increase if recomended_action == 'buy' else -price_increase) ``` -For `changes`, we want the monetary impact of buying or selling one ETH. So first, we need to determine the recommendation, then assess how the actual price changed, and whether the recommendation made money (positive change) or cost money (negative change). +Für `changes` wollen wir die monetären Auswirkungen des Kaufs oder Verkaufs von einem ETH. Zuerst müssen wir also die Empfehlung bestimmen, dann beurteilen, wie sich der tatsächliche Preis verändert hat, und ob die Empfehlung Geld eingebracht (positive Veränderung) oder Geld gekostet hat (negative Veränderung). ```python print (f"Mean prediction error over {len(wethusdc_quotes)-CYCLES_BACK} predictions: {total_error / Decimal(len(wethusdc_quotes)-CYCLES_BACK)} USD") @@ -682,41 +680,41 @@ var = sum((x - mean_change) ** 2 for x in changes) / length_changes print (f"Standard variance of changes: {var.sqrt().quantize(Decimal("0.01"))} USD") ``` -Report the results. +Berichten Sie die Ergebnisse. ```python print (f"Profitable days: {len(list(filter(lambda x: x > 0, changes)))/length_changes:.2%}") print (f"Losing days: {len(list(filter(lambda x: x < 0, changes)))/length_changes:.2%}") ``` -Use [`filter`](https://www.w3schools.com/python/ref_func_filter.asp) to count the number of profitable days and the number of costly days. The result is a filter object, which we need to convert to a list to get the length. +Verwenden Sie [`filter`](https://www.w3schools.com/python/ref_func_filter.asp), um die Anzahl der profitablen Tage und die Anzahl der verlustreichen Tage zu zählen. Das Ergebnis ist ein Filterobjekt, das wir in eine Liste umwandeln müssen, um die Länge zu erhalten. -### Submitting transactions {#submit-txn} +### Einreichen von Transaktionen {#submit-txn} -Now we need to actually submit transactions. However, I don't want to spend real money at this point, before the system is proven. Instead, we will create a local fork of mainnet, and "trade" on that network. +Jetzt müssen wir tatsächlich Transaktionen einreichen. Ich möchte jedoch zu diesem Zeitpunkt kein echtes Geld ausgeben, bevor das System nicht erprobt ist. Stattdessen werden wir einen lokalen Fork des Mainnets erstellen und in diesem Netzwerk "handeln". -Here are the steps to create a local fork and enable trading. +Hier sind die Schritte, um einen lokalen Fork zu erstellen und den Handel zu ermöglichen. -1. Install [Foundry](https://getfoundry.sh/introduction/installation) +1. Installieren Sie [Foundry](https://getfoundry.sh/introduction/installation) -2. Start [`anvil`](https://getfoundry.sh/anvil/overview) +2. Starten Sie [`anvil`](https://getfoundry.sh/anvil/overview) ```sh anvil --fork-url https://eth.drpc.org --block-time 12 - ``` +``` - `anvil` is listening on the default URL for Foundry, http://localhost:8545, so we don't need to specify the URL for [the `cast` command](https://getfoundry.sh/cast/overview) we use to manipulate the blockchain. + `anvil` lauscht auf der Standard-URL für Foundry, http://localhost:8545, sodass wir die URL für [den `cast`-Befehl](https://getfoundry.sh/cast/overview), den wir zur Manipulation der Blockchain verwenden, nicht angeben müssen. -3. When running in `anvil`, there are ten test accounts that have ETH—set the environment variables for the first one +3. Wenn Sie in `anvil` ausführen, gibt es zehn Testkonten, die über ETH verfügen – legen Sie die Umgebungsvariablen für das erste fest. ```sh PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 ADDRESS=`cast wallet address $PRIVATE_KEY` - ``` +``` -4. These are the contracts we need to use. [`SwapRouter`](https://github.com/Uniswap/v3-periphery/blob/main/contracts/SwapRouter.sol) is the Uniswap v3 contract we use to actually trade. We could trade directly through the pool, but this is much easier. +4. Dies sind die Verträge, die wir verwenden müssen. [`SwapRouter`](https://github.com/Uniswap/v3-periphery/blob/main/contracts/SwapRouter.sol) ist der Uniswap v3-Vertrag, den wir für den eigentlichen Handel verwenden. Wir könnten direkt über den Pool handeln, aber dies ist viel einfacher. - The two bottom variables are the Uniswap v3 paths required to swap between WETH and USDC. + Die beiden unteren Variablen sind die Uniswap v3-Pfade, die erforderlich sind, um zwischen WETH und USDC zu tauschen. ```sh WETH_ADDRESS=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 @@ -725,15 +723,15 @@ Here are the steps to create a local fork and enable trading. SWAP_ROUTER=0xE592427A0AEce92De3Edee1F18E0157C05861564 WETH_TO_USDC=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc20001F4A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 USDC_TO_WETH=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480001F4C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 - ``` +``` -5. Each of the test accounts has 10,000 ETH. Use the WETH contract to wrap 1000 ETH to obtain 1000 WETH for trading. +5. Jedes der Testkonten verfügt über 10.000 ETH. Verwenden Sie den WETH-Vertrag, um 1000 ETH zu wrappen, um 1000 WETH für den Handel zu erhalten. ```sh cast send $WETH_ADDRESS "deposit()" --value 1000ether --private-key $PRIVATE_KEY - ``` +``` -6. Use `SwapRouter` to trade 500 WETH for USDC. +6. Verwenden Sie `SwapRouter`, um 500 WETH gegen USDC zu handeln. ```sh cast send $WETH_ADDRESS "approve(address,uint256)" $SWAP_ROUTER 500ether --private-key $PRIVATE_KEY @@ -742,25 +740,25 @@ Here are the steps to create a local fork and enable trading. "exactInput((bytes,address,uint256,uint256,uint256))" \ "($WETH_TO_USDC,$ADDRESS,$MAXINT,500ether,1000000)" \ --private-key $PRIVATE_KEY - ``` +``` - The `approve` call creates an allowance that allows `SwapRouter` to spend some of our tokens. Contracts cannot monitor events, so if we transfer tokens directly to the `SwapRouter` contract, it wouldn't know it was paid. Instead, we permit the `SwapRouter` contract to spend a certain amount, and then `SwapRouter` does it. This is done through a function called by `SwapRouter`, so it knows if it was successful. + Der `approve`-Aufruf erstellt eine Freigabe (Allowance), die es `SwapRouter` ermöglicht, einige unserer Token auszugeben. Verträge können keine Ereignisse überwachen. Wenn wir also Token direkt an den `SwapRouter`-Vertrag übertragen, wüsste dieser nicht, dass er bezahlt wurde. Stattdessen erlauben wir dem `SwapRouter`-Vertrag, einen bestimmten Betrag auszugeben, und dann tut `SwapRouter` dies. Dies geschieht über eine von `SwapRouter` aufgerufene Funktion, sodass er weiß, ob er erfolgreich war. -7. Verify you have enough of both tokens. +7. Überprüfen Sie, ob Sie genug von beiden Token haben. ```sh cast call $WETH_ADDRESS "balanceOf(address)" $ADDRESS | cast from-wei echo `cast call $USDC_ADDRESS "balanceOf(address)" $ADDRESS | cast to-dec`/10^6 | bc - ``` +``` -Now that we have WETH and USDC, we can actually run the agent. +Da wir nun WETH und USDC haben, können wir den Agenten tatsächlich ausführen. ```sh git checkout 05-trade uv run agent.py ``` -The output will look similar to: +Die Ausgabe wird ähnlich aussehen wie: ``` (ai-trading-agent) qbzzt@Ori-Cloudnomics:~/260215-ai-agent$ uv run agent.py @@ -779,15 +777,15 @@ USDC Balance: 929143.797116 WETH Balance: 499 ``` -To actually use it, you need a few minor changes. +Um ihn tatsächlich zu nutzen, benötigen Sie ein paar kleine Änderungen. -- In line 14, change `MAINNET_URL` to a real access point, such as `https://eth.drpc.org` -- In line 28, change `PRIVATE_KEY` to your own private key -- Unless you are very wealthy and can buy or sell 1 ETH each day for an unproven agent, you might want to change 29 to decrease `WETH_TRADE_AMOUNT` +- Ändern Sie in Zeile 14 `MAINNET_URL` in einen echten Zugangspunkt, wie z. B. `https://eth.drpc.org` +- Ändern Sie in Zeile 28 `PRIVATE_KEY` in Ihren eigenen Private-Key +- Es sei denn, Sie sind sehr wohlhabend und können jeden Tag 1 ETH für einen unbewiesenen Agenten kaufen oder verkaufen, möchten Sie vielleicht Zeile 29 ändern, um `WETH_TRADE_AMOUNT` zu verringern -#### Code explanation {#trading-code} +#### Code-Erklärung {#trading-code} -Here is the new code. +Hier ist der neue Code. ```python SWAP_ROUTER_ADDRESS=Web3.to_checksum_address("0xE592427A0AEce92De3Edee1F18E0157C05861564") @@ -796,13 +794,13 @@ USDC_TO_WETH=bytes.fromhex("A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480001F4C02aaA PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ``` -The same variables we used in step 4. +Die gleichen Variablen, die wir in Schritt 4 verwendet haben. ```python WETH_TRADE_AMOUNT=1 ``` -The amount to trade. +Der zu handelnde Betrag. ```python ERC20_ABI = [ @@ -813,7 +811,7 @@ ERC20_ABI = [ ] ``` -To actually trade, we need the `approve` function. We also want to show balances before and after, so we also need `balanceOf`. +Um tatsächlich zu handeln, benötigen wir die Funktion `approve`. Wir möchten auch die Salden davor und danach anzeigen, also benötigen wir auch `balanceOf`. ```python SWAP_ROUTER_ABI = [ @@ -821,7 +819,7 @@ SWAP_ROUTER_ABI = [ ] ``` -In the `SwapRouter` ABI we just need `exactInput`. There is a related function, `exactOutput`, we could use to buy exactly one WETH, but for simplicity we just use `exactInput` in both cases. +In der `SwapRouter`-ABI benötigen wir nur `exactInput`. Es gibt eine verwandte Funktion, `exactOutput`, die wir verwenden könnten, um genau ein WETH zu kaufen, aber der Einfachheit halber verwenden wir in beiden Fällen nur `exactInput`. ```python account = w3.eth.account.from_key(PRIVATE_KEY) @@ -831,7 +829,7 @@ swap_router = w3.eth.contract( ) ``` -The Web3 definitions for the [`account`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html) and the `SwapRouter` contract. +Die Web3-Definitionen für das [`account`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html) (Konto) und den `SwapRouter`-Vertrag. ```python def txn_params() -> dict: @@ -843,13 +841,13 @@ def txn_params() -> dict: } ``` -The transaction parameters. We need a function here because [the nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce) must change each time. +Die Transaktionsparameter. Wir benötigen hier eine Funktion, da sich [die Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce) jedes Mal ändern muss. ```python def approve_token(contract: Contract, amount: int): ``` -Approve a token allowance for `SwapRouter`. +Genehmigen Sie eine Token-Freigabe für `SwapRouter`. ```python txn = contract.functions.approve(SWAP_ROUTER_ADDRESS, amount).build_transaction(txn_params()) @@ -857,7 +855,7 @@ Approve a token allowance for `SwapRouter`. tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction) ``` -This is how we send a transaction in Web3. First we use [the `Contract` object](https://web3py.readthedocs.io/en/stable/web3.contract.html) to build the transaction. Then we use [`web3.eth.account.sign_transaction`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-contract-transaction) to sign the transaction, using `PRIVATE_KEY`. Finally, we use [`w3.eth.send_raw_transaction`](https://web3py.readthedocs.io/en/stable/transactions.html#chapter-2-w3-eth-send-raw-transaction) to send the transaction. +So senden wir eine Transaktion in Web3. Zuerst verwenden wir [das `Contract`-Objekt](https://web3py.readthedocs.io/en/stable/web3.contract.html), um die Transaktion aufzubauen. Dann verwenden wir [`web3.eth.account.sign_transaction`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-contract-transaction), um die Transaktion mit `PRIVATE_KEY` zu signieren. Schließlich verwenden wir [`w3.eth.send_raw_transaction`](https://web3py.readthedocs.io/en/stable/transactions.html#chapter-2-w3-eth-send-raw-transaction), um die Transaktion zu senden. ```python print(f"Approve transaction sent: {tx_hash.hex()}") @@ -865,7 +863,7 @@ This is how we send a transaction in Web3. First we use [the `Contract` object]( print("Approve transaction mined.") ``` -[`w3.eth.wait_for_transaction_receipt`](https://web3py.readthedocs.io/en/stable/web3.eth.html#web3.eth.Eth.wait_for_transaction_receipt) waits until the transaction is mined. It returns the receipt if needed. +[`w3.eth.wait_for_transaction_receipt`](https://web3py.readthedocs.io/en/stable/web3.eth.html#web3.eth.Eth.wait_for_transaction_receipt) wartet, bis die Transaktion gemint wurde. Es gibt bei Bedarf den Beleg zurück. ```python SELL_PARAMS = { @@ -877,7 +875,7 @@ SELL_PARAMS = { } ``` -These are the parameters when selling WETH. +Dies sind die Parameter beim Verkauf von WETH. ```python def make_buy_params(quote: Quote) -> dict: @@ -890,7 +888,7 @@ def make_buy_params(quote: Quote) -> dict: } ``` -In contrast to `SELL_PARAMS`, the buy parameters can change. The input amount is the cost of 1 WETH, as available in `quote`. +Im Gegensatz zu `SELL_PARAMS` können sich die Kaufparameter ändern. Der Eingabebetrag sind die Kosten für 1 WETH, wie in `quote` verfügbar. ```python def buy(quote: Quote): @@ -915,7 +913,7 @@ def sell(): print("Sell transaction mined.") ``` -The `buy()` and `sell()` functions are nearly identical. First we approve a sufficient allowance for `SwapRouter`, and then we call it with the correct path and amount. +Die Funktionen `buy()` und `sell()` sind nahezu identisch. Zuerst genehmigen wir eine ausreichende Freigabe für `SwapRouter`, und dann rufen wir ihn mit dem korrekten Pfad und Betrag auf. ```python def balances(): @@ -926,7 +924,7 @@ def balances(): print(f"{wethusdc_pool.token1.symbol} Balance: {Decimal(token1_balance) / Decimal(10 ** wethusdc_pool.token1.decimals)}") ``` -Report user balances in both currencies. +Berichten Sie die Benutzersalden in beiden Währungen. ```python print("Account balances before trade:") @@ -943,38 +941,38 @@ print("Account balances after trade:") balances() ``` -This agent currently only works once. However, you can change it to work continuously either by running it from [`crontab`](https://man7.org/linux/man-pages/man1/crontab.1.html) or by wrapping lines 368-400 in a loop and using [`time.sleep`](https://docs.python.org/3/library/time.html#time.sleep) to wait until it is time for the next cycle. +Dieser Agent funktioniert derzeit nur einmal. Sie können ihn jedoch so ändern, dass er kontinuierlich arbeitet, indem Sie ihn entweder über [`crontab`](https://man7.org/linux/man-pages/man1/crontab.1.html) ausführen oder indem Sie die Zeilen 368-400 in eine Schleife packen und [`time.sleep`](https://docs.python.org/3/library/time.html#time.sleep) verwenden, um zu warten, bis es Zeit für den nächsten Zyklus ist. -## Possible improvements {#improvements} +## Mögliche Verbesserungen {#improvements} -This is not a full production version; it is merely an example to teach the basics. Here are some ideas for improvements. +Dies ist keine vollständige Produktionsversion; es ist lediglich ein Beispiel, um die Grundlagen zu vermitteln. Hier sind einige Ideen für Verbesserungen. -### Smarter trading {#smart-trading} +### Intelligenteres Trading {#smart-trading} -There are two important facts the agent ignores when deciding what to do. +Es gibt zwei wichtige Fakten, die der Agent bei der Entscheidung, was zu tun ist, ignoriert. -- _The magnitude of anticipated change_. The agent sells a fixed amount of `WETH` if the price is expected to decline, regardless of the magnitude of the decline. - Arguably, it would be better to ignore minor changes and sell based on how much we expect the price to decline. -- _The current portfolio_. If 10% of your portfolio is in WETH and you think the price will go up, it probably makes sense to buy more. But if 90% of your portfolio is in WETH, you may be sufficiently exposed, and there is no need to buy more. The reverse is true if you expect the price to go down. +- _Das Ausmaß der erwarteten Veränderung_. Der Agent verkauft einen festen Betrag an `WETH`, wenn ein Preisrückgang erwartet wird, unabhängig vom Ausmaß des Rückgangs. + Es wäre wohl besser, geringfügige Änderungen zu ignorieren und basierend darauf zu verkaufen, wie stark der Preis voraussichtlich fallen wird. +- _Das aktuelle Portfolio_. Wenn 10 % Ihres Portfolios in WETH sind und Sie glauben, dass der Preis steigen wird, ist es wahrscheinlich sinnvoll, mehr zu kaufen. Wenn jedoch 90 % Ihres Portfolios in WETH sind, sind Sie möglicherweise ausreichend exponiert, und es besteht keine Notwendigkeit, mehr zu kaufen. Das Gegenteil gilt, wenn Sie erwarten, dass der Preis sinkt. -### What if you want to keep your trading strategy a secret? {#secret} +### Was ist, wenn Sie Ihre Handelsstrategie geheim halten möchten? {#secret} -AI vendors can see the queries you send to their LLMs, which could expose the genius trading system you developed with your agent. A trading system that too many people use is worthless because too many people try to buy when you want to buy (and the price goes up) and try to sell when you want to sell (and the price goes down). +KI-Anbieter können die Abfragen sehen, die Sie an ihre LLMs senden, was das geniale Handelssystem offenlegen könnte, das Sie mit Ihrem Agenten entwickelt haben. Ein Handelssystem, das zu viele Menschen nutzen, ist wertlos, da zu viele Menschen versuchen zu kaufen, wenn Sie kaufen möchten (und der Preis steigt), und versuchen zu verkaufen, wenn Sie verkaufen möchten (und der Preis sinkt). -You can run an LLM locally, for example, using [LM-Studio](https://lmstudio.ai/), to avoid this problem. +Sie können ein LLM lokal ausführen, zum Beispiel mit [LM-Studio](https://lmstudio.ai/), um dieses Problem zu vermeiden. -### From AI bot to AI agent {#bot-to-agent} +### Vom KI-Bot zum KI-Agenten {#bot-to-agent} -You can make a good case that this is [an AI bot, not an AI agent](/ai-agents/#ai-agents-vs-ai-bots). It implements a relatively simple strategy that relies on predefined information. We can enable self-improvement, for example, by providing a list of Uniswap v3 pools and their latest values and asking which combination has the best predictive value. +Man kann gut argumentieren, dass dies [ein KI-Bot und kein KI-Agent](/ai-agents/#ai-agents-vs-ai-bots) ist. Er implementiert eine relativ einfache Strategie, die auf vordefinierten Informationen beruht. Wir können eine Selbstverbesserung ermöglichen, indem wir beispielsweise eine Liste von Uniswap v3-Pools und deren neuesten Werten bereitstellen und fragen, welche Kombination den besten Vorhersagewert hat. -### Slippage protection {#slippage-protection} +### Slippage-Schutz {#slippage-protection} -Currently there is no [slippage protection](https://uniswapv3book.com/milestone_3/slippage-protection.html). If the current quote is $2000, and the expected price is $2100, the agent will buy. However, if before the agent buys the cost rises to $2200, it makes no sense to buy anymore. +Derzeit gibt es keinen [Slippage-Schutz](https://uniswapv3book.com/milestone_3/slippage-protection.html). Wenn das aktuelle Preisangebot 2000 $ beträgt und der erwartete Preis 2100 $ ist, wird der Agent kaufen. Wenn die Kosten jedoch vor dem Kauf durch den Agenten auf 2200 $ steigen, macht es keinen Sinn mehr zu kaufen. -To implement slippage protection, specify an `amountOutMinimum` value in lines 325 and 334 of [`agent.py`](https://github.com/qbzzt/260215-ai-agent/blob/05-trade/agent.py#L325). +Um einen Slippage-Schutz zu implementieren, geben Sie einen `amountOutMinimum`-Wert in den Zeilen 325 und 334 von [`agent.py`](https://github.com/qbzzt/260215-ai-agent/blob/05-trade/agent.py#L325) an. ## Fazit {#conclusion} -Hopefully, now you know enough to get started with AI agents. This is not a comprehensive overview of the subject; there are whole books dedicated to that, but this is enough to get you started. Viel Erfolg! +Hoffentlich wissen Sie jetzt genug, um mit KI-Agenten loszulegen. Dies ist kein umfassender Überblick über das Thema; es gibt ganze Bücher, die sich dem widmen, aber dies reicht aus, um Ihnen den Einstieg zu erleichtern. Viel Glück! -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md new file mode 100644 index 00000000000..43e2b6bdd88 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md @@ -0,0 +1,855 @@ +--- +title: "All you can cache" +description: "Erfahren Sie, wie Sie einen Caching-Vertrag für günstigere Rollups-Transaktionen erstellen und verwenden" +author: Ori Pomerantz +tags: ["Ebene 2", "Caching", "Speicher", "Skalierung"] +skill: intermediate +breadcrumb: "Caching für Rollups" +published: 2022-09-15 +lang: de +--- + +Wenn man Rollups verwendet, sind die Kosten für ein Byte in der Transaktion viel teurer als die Kosten für einen Speicherplatz. Daher ist es sinnvoll, so viele Informationen wie möglich auf der Blockchain zu cachen. + +In diesem Artikel lernen Sie, wie Sie einen Caching-Vertrag so erstellen und verwenden, dass jeder Parameterwert, der wahrscheinlich mehrfach verwendet wird, gecacht wird und (nach dem ersten Mal) mit einer viel geringeren Anzahl von Bytes zur Verfügung steht, und wie Sie Off-Chain-Code schreiben, der diesen Cache nutzt. + +Wenn Sie den Artikel überspringen und nur den Quellcode sehen möchten, [finden Sie ihn hier](https://github.com/qbzzt/20220915-all-you-can-cache). Der Entwicklungs-Stack ist [Foundry](https://getfoundry.sh/introduction/installation/). + +## Gesamtdesign {#overall-design} + +Der Einfachheit halber gehen wir davon aus, dass alle Transaktionsparameter `uint256` und 32 Bytes lang sind. Wenn wir eine Transaktion erhalten, parsen wir jeden Parameter wie folgt: + +1. Wenn das erste Byte `0xFF` ist, nehmen Sie die nächsten 32 Bytes als Parameterwert und schreiben Sie ihn in den Cache. + +2. Wenn das erste Byte `0xFE` ist, nehmen Sie die nächsten 32 Bytes als Parameterwert, aber schreiben Sie ihn _nicht_ in den Cache. + +3. Für jeden anderen Wert nehmen Sie die oberen vier Bits als Anzahl der zusätzlichen Bytes und die unteren vier Bits als die höchstwertigen Bits des Cache-Schlüssels. Hier sind einige Beispiele: + + | Bytes in Calldata | Cache-Schlüssel | + | :---------------- | --------: | + | 0x0F | 0x0F | + | 0x10,0x10 | 0x10 | + | 0x12,0xAC | 0x02AC | + | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | + +## Cache-Manipulation {#cache-manipulation} + +Der Cache ist in [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol) implementiert. Gehen wir ihn Zeile für Zeile durch. + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + + +contract Cache { + + bytes1 public constant INTO_CACHE = 0xFF; + bytes1 public constant DONT_CACHE = 0xFE; +``` + +Diese Konstanten werden verwendet, um die Sonderfälle zu interpretieren, in denen wir alle Informationen bereitstellen und sie entweder in den Cache schreiben wollen oder nicht. Das Schreiben in den Cache erfordert zwei [`SSTORE`](https://www.evm.codes/#55)-Operationen in zuvor ungenutzte Speicherplätze zu Kosten von jeweils 22100 Gas, daher machen wir es optional. + +```solidity + + mapping(uint => uint) public val2key; +``` + +Ein [Mapping](https://www.geeksforgeeks.org/solidity/solidity-mappings/) zwischen den Werten und ihren Schlüsseln. Diese Information ist notwendig, um Werte zu kodieren, bevor Sie die Transaktion absenden. + +```solidity + // Position n hat den Wert für Schlüssel n+1, weil wir + // Null als "nicht im Cache" beibehalten müssen. + uint[] public key2val; +``` + +Wir können ein Array für das Mapping von Schlüsseln zu Werten verwenden, da wir die Schlüssel zuweisen und dies der Einfachheit halber sequenziell tun. + +```solidity + function cacheRead(uint _key) public view returns (uint) { + require(_key <= key2val.length, "Reading uninitialize cache entry"); + return key2val[_key-1]; + } // cacheRead +``` + +Einen Wert aus dem Cache lesen. + +```solidity + // Einen Wert in den Cache schreiben, falls er noch nicht vorhanden ist + // Nur public, damit der Test funktioniert + function cacheWrite(uint _value) public returns (uint) { + // Wenn der Wert bereits im Cache ist, den aktuellen Schlüssel zurückgeben + if (val2key[_value] != 0) { + return val2key[_value]; + } +``` + +Es hat keinen Sinn, denselben Wert mehr als einmal in den Cache zu legen. Wenn der Wert bereits vorhanden ist, geben Sie einfach den vorhandenen Schlüssel zurück. + +```solidity + // Da 0xFE ein Sonderfall ist, ist der größte Schlüssel, den der Cache + // halten kann, 0x0D gefolgt von 15 0xFFs. Wenn die Cache-Länge bereits so + // groß ist, fehlschlagen. + // 1 2 3 4 5 6 7 8 9 A B C D E F + require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + "cache overflow"); +``` + +Ich glaube nicht, dass wir jemals einen so großen Cache bekommen werden (etwa 1,8\*1037 Einträge, was etwa 1027 TB Speicherplatz erfordern würde). Ich bin jedoch alt genug, um mich an ["640kB würden immer ausreichen"](https://quoteinvestigator.com/2011/09/08/640k-enough/) zu erinnern. Dieser Test ist sehr günstig. + +```solidity + // Den Wert mit dem nächsten Schlüssel schreiben + val2key[_value] = key2val.length+1; +``` + +Fügen Sie das Reverse-Lookup (vom Wert zum Schlüssel) hinzu. + +```solidity + key2val.push(_value); +``` + +Fügen Sie das Forward-Lookup (vom Schlüssel zum Wert) hinzu. Da wir Werte sequenziell zuweisen, können wir ihn einfach nach dem letzten Array-Wert hinzufügen. + +```solidity + return key2val.length; + } // cacheWrite +``` + +Geben Sie die neue Länge von `key2val` zurück, was der Zelle entspricht, in der der neue Wert gespeichert ist. + +```solidity + function _calldataVal(uint startByte, uint length) + private pure returns (uint) +``` + +Diese Funktion liest einen Wert beliebiger Länge (bis zu 32 Bytes, die Wortgröße) aus den Calldata. + +```solidity + { + uint _retVal; + + require(length < 0x21, + "_calldataVal length limit is 32 bytes"); + require(length + startByte <= msg.data.length, + "_calldataVal trying to read beyond calldatasize"); +``` + +Diese Funktion ist intern. Wenn der Rest des Codes also korrekt geschrieben ist, sind diese Tests nicht erforderlich. Sie kosten jedoch nicht viel, also können wir sie genauso gut einbauen. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Dieser Code ist in [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html) geschrieben. Er liest einen 32-Byte-Wert aus den Calldata. Dies funktioniert auch dann, wenn die Calldata vor `startByte+32` enden, da nicht initialisierter Speicherplatz in der EVM als Null betrachtet wird. + +```solidity + _retVal = _retVal >> (256-length*8); +``` + +Wir wollen nicht unbedingt einen 32-Byte-Wert. Dies entfernt die überschüssigen Bytes. + +```solidity + return _retVal; + } // _calldataVal + + + // Einen einzelnen Parameter aus den Calldata lesen, beginnend bei _fromByte + function _readParam(uint _fromByte) internal + returns (uint _nextByte, uint _parameterValue) + { +``` + +Lesen Sie einen einzelnen Parameter aus den Calldata. Beachten Sie, dass wir nicht nur den gelesenen Wert zurückgeben müssen, sondern auch die Position des nächsten Bytes, da Parameter zwischen 1 Byte und 33 Bytes lang sein können. + +```solidity + // Das erste Byte sagt uns, wie der Rest zu interpretieren ist + uint8 _firstByte; + + _firstByte = uint8(_calldataVal(_fromByte, 1)); +``` + +Solidity versucht, die Anzahl der Fehler zu reduzieren, indem es potenziell gefährliche [implizite Typkonvertierungen](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) verbietet. Ein Downgrade, zum Beispiel von 256 Bits auf 8 Bits, muss explizit erfolgen. + +```solidity + + // Den Wert lesen, aber nicht in den Cache schreiben + if (_firstByte == uint8(DONT_CACHE)) + return(_fromByte+33, _calldataVal(_fromByte+1, 32)); + + // Den Wert lesen und in den Cache schreiben + if (_firstByte == uint8(INTO_CACHE)) { + uint _param = _calldataVal(_fromByte+1, 32); + cacheWrite(_param); + return(_fromByte+33, _param); + } + + // Wenn wir hier angelangt sind, bedeutet das, dass wir aus dem Cache lesen müssen + + // Anzahl der zusätzlich zu lesenden Bytes + uint8 _extraBytes = _firstByte / 16; +``` + +Nehmen Sie das untere [Nibble](https://en.wikipedia.org/wiki/Nibble) (Halbbyte) und kombinieren Sie es mit den anderen Bytes, um den Wert aus dem Cache zu lesen. + +```solidity + uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) + + _calldataVal(_fromByte+1, _extraBytes); + + return (_fromByte+_extraBytes+1, cacheRead(_key)); + + } // _readParam + + + // n Parameter lesen (Funktionen wissen, wie viele Parameter sie erwarten) + function _readParams(uint _paramNum) internal returns (uint[] memory) { +``` + +Wir könnten die Anzahl der Parameter, die wir haben, aus den Calldata selbst beziehen, aber die Funktionen, die uns aufrufen, wissen, wie viele Parameter sie erwarten. Es ist einfacher, sie uns das mitteilen zu lassen. + +```solidity + // Die Parameter, die wir lesen + uint[] memory params = new uint[](_paramNum); + + // Parameter beginnen bei Byte 4, davor steht die Funktionssignatur + uint _atByte = 4; + + for(uint i=0; i<_paramNum; i++) { + (_atByte, params[i]) = _readParam(_atByte); + } +``` + +Lesen Sie die Parameter, bis Sie die benötigte Anzahl haben. Wenn wir über das Ende der Calldata hinausgehen, wird `_readParams` den Aufruf rückgängig machen (revert). + +```solidity + + return(params); + } // readParams + + // Zum Testen von _readParams, das Lesen von vier Parametern testen + function fourParam() public + returns (uint256,uint256,uint256,uint256) + { + uint[] memory params; + params = _readParams(4); + return (params[0], params[1], params[2], params[3]); + } // fourParam +``` + +Ein großer Vorteil von Foundry ist, dass es erlaubt, Tests in Solidity zu schreiben ([siehe Testen des Caches unten](#testing-the-cache)). Das macht Unit-Tests viel einfacher. Dies ist eine Funktion, die vier Parameter liest und sie zurückgibt, damit der Test überprüfen kann, ob sie korrekt waren. + +```solidity + // Einen Wert abrufen, Bytes zurückgeben, die ihn kodieren (wenn möglich unter Verwendung des Caches) + function encodeVal(uint _val) public view returns(bytes memory) { +``` + +`encodeVal` ist eine Funktion, die von Off-Chain-Code aufgerufen wird, um bei der Erstellung von Calldata zu helfen, die den Cache nutzen. Sie empfängt einen einzelnen Wert und gibt die Bytes zurück, die ihn kodieren. Diese Funktion ist eine `view`-Funktion, erfordert also keine Transaktion und kostet bei externem Aufruf kein Gas. + +```solidity + uint _key = val2key[_val]; + + // Der Wert ist noch nicht im Cache, ihn hinzufügen + if (_key == 0) + return bytes.concat(INTO_CACHE, bytes32(_val)); +``` + +In der [EVM](/developers/docs/evm/) wird angenommen, dass der gesamte nicht initialisierte Speicher aus Nullen besteht. Wenn wir also nach dem Schlüssel für einen Wert suchen, der nicht vorhanden ist, erhalten wir eine Null. In diesem Fall sind die Bytes, die ihn kodieren, `INTO_CACHE` (damit er beim nächsten Mal gecacht wird), gefolgt vom eigentlichen Wert. + +```solidity + // Wenn der Schlüssel <0x10 ist, ihn als einzelnes Byte zurückgeben + if (_key < 0x10) + return bytes.concat(bytes1(uint8(_key))); +``` + +Einzelne Bytes sind am einfachsten. Wir verwenden einfach [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat), um einen `bytes`-Typ in ein Byte-Array umzuwandeln, das eine beliebige Länge haben kann. Trotz des Namens funktioniert es einwandfrei, wenn es mit nur einem Argument versehen wird. + +```solidity + // Zwei-Byte-Wert, kodiert als 0x1vvv + if (_key < 0x1000) + return bytes.concat(bytes2(uint16(_key) | 0x1000)); +``` + +Wenn wir einen Schlüssel haben, der kleiner als 163 ist, können wir ihn in zwei Bytes ausdrücken. Wir konvertieren zunächst `_key`, was ein 256-Bit-Wert ist, in einen 16-Bit-Wert und verwenden ein logisches ODER, um die Anzahl der zusätzlichen Bytes zum ersten Byte hinzuzufügen. Dann wandeln wir ihn einfach in einen `bytes2`-Wert um, der in `bytes` konvertiert werden kann. + +```solidity + // Es gibt wahrscheinlich einen cleveren Weg, die folgenden Zeilen als Schleife auszuführen, + // aber es ist eine View-Funktion, daher optimiere ich auf Programmierzeit und + // Einfachheit. + + if (_key < 16*256**2) + return bytes.concat(bytes3(uint24(_key) | (0x2 * 16 * 256**2))); + if (_key < 16*256**3) + return bytes.concat(bytes4(uint32(_key) | (0x3 * 16 * 256**3))); + . + . + . + if (_key < 16*256**14) + return bytes.concat(bytes15(uint120(_key) | (0xE * 16 * 256**14))); + if (_key < 16*256**15) + return bytes.concat(bytes16(uint128(_key) | (0xF * 16 * 256**15))); +``` + +Die anderen Werte (3 Bytes, 4 Bytes usw.) werden auf die gleiche Weise behandelt, nur mit unterschiedlichen Feldgrößen. + +```solidity + // Wenn wir hier ankommen, stimmt etwas nicht. + revert("Error in encodeVal, should not happen"); +``` + +Wenn wir hier ankommen, bedeutet das, dass wir einen Schlüssel erhalten haben, der nicht kleiner als 16\*25615 ist. Aber `cacheWrite` begrenzt die Schlüssel, sodass wir nicht einmal bis zu 14\*25616 kommen können (was ein erstes Byte von 0xFE hätte, also wie `DONT_CACHE` aussehen würde). Aber es kostet uns nicht viel, einen Test hinzuzufügen, für den Fall, dass ein zukünftiger Programmierer einen Fehler einbaut. + +```solidity + } // encodeVal + +} // Cache +``` + +### Testen des Caches {#testing-the-cache} + +Einer der Vorteile von Foundry ist, dass [es Ihnen ermöglicht, Tests in Solidity zu schreiben](https://getfoundry.sh/forge/tests/overview/), was das Schreiben von Unit-Tests erleichtert. Die Tests für die `Cache`-Klasse finden Sie [hier](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Da sich der Testcode wiederholt, wie es bei Tests üblich ist, erklärt dieser Artikel nur die interessanten Teile. + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; + + +// Muss `forge test -vv` für die Konsole ausführen. +import "forge-std/console.sol"; +``` + +Dies ist nur Boilerplate-Code, der notwendig ist, um das Testpaket und `console.log` zu verwenden. + +```solidity +import "src/Cache.sol"; +``` + +Wir müssen den Vertrag kennen, den wir testen. + +```solidity +contract CacheTest is Test { + Cache cache; + + function setUp() public { + cache = new Cache(); + } +``` + +Die `setUp`-Funktion wird vor jedem Test aufgerufen. In diesem Fall erstellen wir einfach einen neuen Cache, damit sich unsere Tests nicht gegenseitig beeinflussen. + +```solidity + function testCaching() public { +``` + +Tests sind Funktionen, deren Namen mit `test` beginnen. Diese Funktion überprüft die grundlegende Cache-Funktionalität, das Schreiben von Werten und das erneute Lesen. + +```solidity + for(uint i=1; i<5000; i++) { + cache.cacheWrite(i*i); + } + + for(uint i=1; i<5000; i++) { + assertEq(cache.cacheRead(i), i*i); +``` + +So führen Sie das eigentliche Testen durch, indem Sie [`assert...`-Funktionen](https://getfoundry.sh/reference/forge-std/std-assertions/) verwenden. In diesem Fall überprüfen wir, ob der Wert, den wir geschrieben haben, derjenige ist, den wir lesen. Wir können das Ergebnis von `cache.cacheWrite` verwerfen, da wir wissen, dass Cache-Schlüssel linear zugewiesen werden. + +```solidity + } + } // testCaching + + + // Denselben Wert mehrmals zwischenspeichern, sicherstellen, dass der Schlüssel + // gleich bleibt + function testRepeatCaching() public { + for(uint i=1; i<100; i++) { + uint _key1 = cache.cacheWrite(i); + uint _key2 = cache.cacheWrite(i); + assertEq(_key1, _key2); + } +``` + +Zuerst schreiben wir jeden Wert zweimal in den Cache und stellen sicher, dass die Schlüssel gleich sind (was bedeutet, dass das zweite Schreiben nicht wirklich stattgefunden hat). + +```solidity + for(uint i=1; i<100; i+=3) { + uint _key = cache.cacheWrite(i); + assertEq(_key, i); + } + } // testRepeatCaching +``` + +Theoretisch könnte es einen Fehler geben, der aufeinanderfolgende Cache-Schreibvorgänge nicht betrifft. Hier führen wir also einige Schreibvorgänge durch, die nicht aufeinanderfolgend sind, und sehen, dass die Werte immer noch nicht neu geschrieben werden. + +```solidity + // Einen uint aus einem Speicherpuffer lesen (um sicherzustellen, dass wir die Parameter zurückbekommen, + // die wir gesendet haben) + function toUint256(bytes memory _bytes, uint256 _start) internal pure + returns (uint256) +``` + +Lesen Sie ein 256-Bit-Wort aus einem `bytes memory`-Puffer. Diese Hilfsfunktion ermöglicht es uns zu überprüfen, ob wir die richtigen Ergebnisse erhalten, wenn wir einen Funktionsaufruf ausführen, der den Cache verwendet. + +```solidity + { + require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + uint256 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } +``` + +Yul unterstützt keine Datenstrukturen jenseits von `uint256`. Wenn Sie sich also auf eine komplexere Datenstruktur wie den Speicherpuffer `_bytes` beziehen, erhalten Sie die Adresse dieser Struktur. Solidity speichert `bytes memory`-Werte als ein 32-Byte-Wort, das die Länge enthält, gefolgt von den eigentlichen Bytes. Um also Byte Nummer `_start` zu erhalten, müssen wir `_bytes+32+_start` berechnen. + +```solidity + + return tempUint; + } // toUint256 + + // Funktionssignatur für fourParams(), mit freundlicher Genehmigung von + // https://www.4byte.directory/signatures/?bytes4_signature=0x3edc1e6d + bytes4 constant FOUR_PARAMS = 0x3edc1e6d; + + // Nur einige konstante Werte, um zu sehen, ob wir die richtigen Werte zurückbekommen + uint256 constant VAL_A = 0xDEAD60A7; + uint256 constant VAL_B = 0xBEEF; + uint256 constant VAL_C = 0x600D; + uint256 constant VAL_D = 0x600D60A7; +``` + +Einige Konstanten, die wir zum Testen benötigen. + +```solidity + function testReadParam() public { +``` + +Rufen Sie `fourParams()` auf, eine Funktion, die `readParams` verwendet, um zu testen, ob wir Parameter korrekt lesen können. + +```solidity + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; +``` + +Wir können nicht den normalen ABI-Mechanismus verwenden, um eine Funktion aufzurufen, die den Cache nutzt, daher müssen wir den Low-Level-Mechanismus [`
.call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses) verwenden. Dieser Mechanismus nimmt ein `bytes memory` als Eingabe und gibt dieses (sowie einen booleschen Wert) als Ausgabe zurück. + +```solidity + // Erster Aufruf, der Cache ist leer + _callInput = bytes.concat( + FOUR_PARAMS, +``` + +Es ist nützlich, wenn derselbe Vertrag sowohl gecachte Funktionen (für Aufrufe direkt aus Transaktionen) als auch nicht gecachte Funktionen (für Aufrufe von anderen Smart Contracts) unterstützt. Um dies zu tun, müssen wir uns weiterhin auf den Solidity-Mechanismus verlassen, um die richtige Funktion aufzurufen, anstatt alles in [eine `fallback`-Funktion](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function) zu packen. Dies macht die Komponierbarkeit viel einfacher. Ein einzelnes Byte würde in den meisten Fällen ausreichen, um die Funktion zu identifizieren, also verschwenden wir drei Bytes (16\*3=48 Gas). Während ich dies schreibe, kosten diese 48 Gas jedoch 0,07 Cent, was ein angemessener Preis für einfacheren, weniger fehleranfälligen Code ist. + +```solidity + // Erster Wert, zum Cache hinzufügen + cache.INTO_CACHE(), + bytes32(VAL_A), +``` + +Der erste Wert: Ein Flag, das besagt, dass es sich um einen vollständigen Wert handelt, der in den Cache geschrieben werden muss, gefolgt von den 32 Bytes des Wertes. Die anderen drei Werte sind ähnlich, außer dass `VAL_B` nicht in den Cache geschrieben wird und `VAL_C` sowohl der dritte als auch der vierte Parameter ist. + +```solidity + . + . + . + ); + (_success, _callOutput) = _cacheAddr.call(_callInput); +``` + +Hier rufen wir tatsächlich den `Cache`-Vertrag auf. + +```solidity + assertEq(_success, true); +``` + +Wir erwarten, dass der Aufruf erfolgreich ist. + +```solidity + assertEq(cache.cacheRead(1), VAL_A); + assertEq(cache.cacheRead(2), VAL_C); +``` + +Wir beginnen mit einem leeren Cache und fügen dann `VAL_A` gefolgt von `VAL_C` hinzu. Wir würden erwarten, dass der erste den Schlüssel 1 und der zweite den Schlüssel 2 hat. + +``` + assertEq(toUint256(_callOutput,0), VAL_A); + assertEq(toUint256(_callOutput,32), VAL_B); + assertEq(toUint256(_callOutput,64), VAL_C); + assertEq(toUint256(_callOutput,96), VAL_C); +``` + +Die Ausgabe sind die vier Parameter. Hier überprüfen wir, ob sie korrekt ist. + +```solidity + // Zweiter Aufruf, wir können den Cache verwenden + _callInput = bytes.concat( + FOUR_PARAMS, + + // Erster Wert im Cache + bytes1(0x01), +``` + +Cache-Schlüssel unter 16 sind nur ein Byte groß. + +```solidity + // Zweiter Wert, nicht zum Cache hinzufügen + cache.DONT_CACHE(), + bytes32(VAL_B), + + // Dritter und vierter Wert, gleicher Wert + bytes1(0x02), + bytes1(0x02) + ); + . + . + . + } // testReadParam +``` + +Die Tests nach dem Aufruf sind identisch mit denen nach dem ersten Aufruf. + +```solidity + function testEncodeVal() public { +``` + +Diese Funktion ähnelt `testReadParam`, außer dass wir anstelle des expliziten Schreibens der Parameter `encodeVal()` verwenden. + +```solidity + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(VAL_A), + cache.encodeVal(VAL_B), + cache.encodeVal(VAL_C), + cache.encodeVal(VAL_D) + ); + . + . + . + assertEq(_callInput.length, 4+1*4); + } // testEncodeVal +``` + +Der einzige zusätzliche Test in `testEncodeVal()` besteht darin, zu überprüfen, ob die Länge von `_callInput` korrekt ist. Für den ersten Aufruf ist sie 4+33\*4. Für den zweiten, bei dem jeder Wert bereits im Cache ist, ist sie 4+1\*4. + +```solidity + // encodeVal testen, wenn der Schlüssel mehr als ein einzelnes Byte ist + // Maximal drei Bytes, da das Füllen des Caches auf vier Bytes zu lange + // dauert. + function testEncodeValBig() public { + // Eine Reihe von Werten in den Cache legen. + // Um es einfach zu halten, Schlüssel n für Wert n verwenden. + for(uint i=1; i<0x1FFF; i++) { + cache.cacheWrite(i); + } +``` + +Die obige Funktion `testEncodeVal` schreibt nur vier Werte in den Cache, sodass [der Teil der Funktion, der sich mit Multi-Byte-Werten befasst](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) nicht überprüft wird. Aber dieser Code ist kompliziert und fehleranfällig. + +Der erste Teil dieser Funktion ist eine Schleife, die alle Werte von 1 bis 0x1FFF der Reihe nach in den Cache schreibt, sodass wir diese Werte kodieren können und wissen, wohin sie gehen. + +```solidity + . + . + . + + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(0x000F), // Ein Byte 0x0F + cache.encodeVal(0x0010), // Zwei Bytes 0x1010 + cache.encodeVal(0x0100), // Zwei Bytes 0x1100 + cache.encodeVal(0x1000) // Drei Bytes 0x201000 + ); +``` + +Testen Sie Ein-Byte-, Zwei-Byte- und Drei-Byte-Werte. Wir testen nicht darüber hinaus, da es zu lange dauern würde, genügend Stack-Einträge zu schreiben (mindestens 0x10000000, etwa eine Viertelmilliarde). + +```solidity + . + . + . + . + } // testEncodeValBig + + + // Testen, dass wir bei einem übermäßig kleinen Puffer einen Revert erhalten + function testShortCalldata() public { +``` + +Testen Sie, was im abnormalen Fall passiert, wenn nicht genügend Parameter vorhanden sind. + +```solidity + . + . + . + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, false); + } // testShortCalldata +``` + +Da es rückgängig gemacht wird (revert), sollte das Ergebnis, das wir erhalten, `false` sein. + +``` + // Call with cache keys that aren't there + function testNoCacheKey() public { + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), + + // Second value + bytes1(0x0F), + bytes2(0x1234), + bytes11(0xA10102030405060708090A) + ); +``` + +Diese Funktion erhält vier völlig legitime Parameter, außer dass der Cache leer ist, sodass dort keine Werte zum Lesen vorhanden sind. + +```solidity + . + . + . + // Testen, dass bei einem übermäßig langen Puffer alles einwandfrei funktioniert + function testLongCalldata() public { + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; + + // Erster Aufruf, der Cache ist leer + _callInput = bytes.concat( + FOUR_PARAMS, + + // Erster Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_A), + + // Zweiter Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_B), + + // Dritter Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_C), + + // Vierter Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_D), + + // Und noch ein Wert für "viel Glück" + bytes4(0x31112233) + ); +``` + +Diese Funktion sendet fünf Werte. Wir wissen, dass der fünfte Wert ignoriert wird, da es sich nicht um einen gültigen Cache-Eintrag handelt, was zu einem Revert geführt hätte, wenn er nicht enthalten gewesen wäre. + +## Eine Beispielanwendung {#a-sample-app} + +Tests in Solidity zu schreiben ist schön und gut, aber am Ende des Tages muss eine Dapp in der Lage sein, Anfragen von außerhalb der Blockchain zu verarbeiten, um nützlich zu sein. Dieser Artikel demonstriert, wie man Caching in einer Dapp mit `WORM` verwendet, was für „Write Once, Read Many“ steht. Wenn ein Schlüssel noch nicht geschrieben wurde, können Sie einen Wert hineinschreiben. Wenn der Schlüssel bereits geschrieben wurde, erhalten Sie einen Revert. + +### Der Vertrag {#the-contract} + +[Dies ist der Vertrag](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). Er wiederholt größtenteils das, was wir bereits mit `Cache` und `CacheTest` gemacht haben, daher behandeln wir nur die interessanten Teile. + +```solidity +import "./Cache.sol"; + +contract WORM is Cache { +``` + +Der einfachste Weg, `Cache` zu verwenden, besteht darin, ihn in unserem eigenen Vertrag zu erben. + +```solidity + function writeEntryCached() external { + uint[] memory params = _readParams(2); + writeEntry(params[0], params[1]); + } // writeEntryCached +``` + +Diese Funktion ähnelt `fourParam` in `CacheTest` oben. Da wir den ABI-Spezifikationen nicht folgen, ist es am besten, keine Parameter in der Funktion zu deklarieren. + +```solidity + // Es einfacher machen, uns aufzurufen + // Funktionssignatur für writeEntryCached(), mit freundlicher Genehmigung von + // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3 + bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3; +``` + +Der externe Code, der `writeEntryCached` aufruft, muss die Calldata manuell erstellen, anstatt `worm.writeEntryCached` zu verwenden, da wir den ABI-Spezifikationen nicht folgen. Diesen konstanten Wert zu haben, macht es einfach leichter, ihn zu schreiben. + +Beachten Sie, dass wir `WRITE_ENTRY_CACHED` zwar als Zustandsvariable definieren, es aber zum externen Lesen notwendig ist, die Getter-Funktion dafür zu verwenden: `worm.WRITE_ENTRY_CACHED()`. + +```solidity + function readEntry(uint key) public view + returns (uint _value, address _writtenBy, uint _writtenAtBlock) +``` + +Die Lesefunktion ist eine `view`-Funktion, erfordert also keine Transaktion und kostet kein Gas. Infolgedessen gibt es keinen Vorteil, den Cache für den Parameter zu verwenden. Bei View-Funktionen ist es am besten, den Standardmechanismus zu verwenden, der einfacher ist. + +### Der Testcode {#the-testing-code} + +[Dies ist der Testcode für den Vertrag](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Lassen Sie uns auch hier nur das betrachten, was interessant ist. + +```solidity + function testWReadWrite() public { + worm.writeEntry(0xDEAD, 0x60A7); + + vm.expectRevert(bytes("entry already written")); + worm.writeEntry(0xDEAD, 0xBEEF); +``` + +[So (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) geben wir in einem Foundry-Test an, dass der nächste Aufruf fehlschlagen soll, sowie den gemeldeten Grund für einen Fehler. Dies gilt, wenn wir die Syntax `.()` verwenden, anstatt die Calldata zu erstellen und den Vertrag über die Low-Level-Schnittstelle (`.call()` usw.) aufzurufen. + +```solidity + function testReadWriteCached() public { + uint cacheGoat = worm.cacheWrite(0x60A7); +``` + +Hier nutzen wir die Tatsache, dass `cacheWrite` den Cache-Schlüssel zurückgibt. Dies ist nichts, was wir in der Produktion erwarten würden, da `cacheWrite` den Zustand ändert und daher nur während einer Transaktion aufgerufen werden kann. Transaktionen haben keine Rückgabewerte; wenn sie Ergebnisse haben, sollen diese Ergebnisse als Ereignisse ausgegeben werden. Der Rückgabewert von `cacheWrite` ist also nur von On-Chain-Code aus zugänglich, und On-Chain-Code benötigt kein Parameter-Caching. + +```solidity + (_success,) = address(worm).call(_callInput); +``` + +So teilen wir Solidity mit, dass `.call()` zwar zwei Rückgabewerte hat, wir uns aber nur für den ersten interessieren. + +```solidity + (_success,) = address(worm).call(_callInput); + assertEq(_success, false); +``` + +Da wir die Low-Level-Funktion `
.call()` verwenden, können wir `vm.expectRevert()` nicht verwenden und müssen uns den booleschen Erfolgswert ansehen, den wir vom Aufruf erhalten. + +```solidity + event EntryWritten(uint indexed key, uint indexed value); + + . + . + . + + _callInput = bytes.concat( + worm.WRITE_ENTRY_CACHED(), worm.encodeVal(a), worm.encodeVal(b)); + vm.expectEmit(true, true, false, false); + emit EntryWritten(a, b); + (_success,) = address(worm).call(_callInput); +``` + +Auf diese Weise überprüfen wir in Foundry, ob Code [ein Ereignis korrekt ausgibt](https://getfoundry.sh/reference/cheatcodes/expect-emit/). + +### Die Anwendung {#the-client} + +Eine Sache, die Sie bei Solidity-Tests nicht bekommen, ist JavaScript-Code, den Sie ausschneiden und in Ihre eigene Anwendung einfügen können. Um diesen Code zu schreiben, habe ich WORM auf [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), dem neuen Testnet von [Optimism](https://www.optimism.io/), bereitgestellt. Es befindet sich unter der Adresse [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a). + +[Sie können den JavaScript-Code für die Anwendung hier sehen](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). Um ihn zu verwenden: + +1. Klonen Sie das Git-Repository: + + ```sh + git clone https://github.com/qbzzt/20220915-all-you-can-cache.git +``` + +2. Installieren Sie die erforderlichen Pakete: + + ```sh + cd javascript + yarn +``` + +3. Kopieren Sie die Konfigurationsdatei: + + ```sh + cp .env.example .env +``` + +4. Bearbeiten Sie `.env` für Ihre Konfiguration: + + | Parameter | Wert | + | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | MNEMONIC | Die Mnemonic für ein Konto, das über genügend ETH verfügt, um eine Transaktion zu bezahlen. [Hier erhalten Sie kostenlose ETH für das Optimism Goerli-Netzwerk](https://optimismfaucet.xyz/). | + | OPTIMISM_GOERLI_URL | URL zu Optimism Goerli. Der öffentliche Endpunkt, `https://goerli.optimism.io`, ist ratenbegrenzt, aber ausreichend für das, was wir hier benötigen. | + +5. Führen Sie `index.js` aus. + + ```sh + node index.js +``` + + Diese Beispielanwendung schreibt zunächst einen Eintrag in WORM und zeigt die Calldata sowie einen Link zur Transaktion auf Etherscan an. Dann liest sie diesen Eintrag zurück und zeigt den verwendeten Schlüssel sowie die Werte im Eintrag an (Wert, Blocknummer und Autor). + +Der Großteil der Anwendung ist normales Dapp-JavaScript. Wir werden also wieder nur die interessanten Teile durchgehen. + +```javascript +. +. +. +const main = async () => { + const func = await worm.WRITE_ENTRY_CACHED() + + // Benötigt jedes Mal einen neuen Schlüssel + const key = await worm.encodeVal(Number(new Date())) +``` + +In einen bestimmten Slot kann nur einmal geschrieben werden, daher verwenden wir den Zeitstempel, um sicherzustellen, dass wir Slots nicht wiederverwenden. + +```javascript +const val = await worm.encodeVal("0x600D") + +// Einen Eintrag schreiben +const calldata = func + key.slice(2) + val.slice(2) +``` + +Ethers erwartet, dass die Call-Daten ein Hex-String sind, `0x` gefolgt von einer geraden Anzahl hexadezimaler Ziffern. Da `key` und `val` beide mit `0x` beginnen, müssen wir diese Header entfernen. + +```javascript +const tx = await worm.populateTransaction.writeEntryCached() +tx.data = calldata + +sentTx = await wallet.sendTransaction(tx) +``` + +Wie beim Solidity-Testcode können wir eine gecachte Funktion nicht normal aufrufen. Stattdessen müssen wir einen Low-Level-Mechanismus verwenden. + +```javascript + . + . + . + // Den gerade geschriebenen Eintrag lesen + const realKey = '0x' + key.slice(4) // das FF-Flag entfernen + const entryRead = await worm.readEntry(realKey) + . + . + . +``` + +Zum Lesen von Einträgen können wir den normalen Mechanismus verwenden. Es besteht keine Notwendigkeit, Parameter-Caching bei `view`-Funktionen zu verwenden. + +## Fazit {#conclusion} + +Der Code in diesem Artikel ist ein Proof of Concept; der Zweck ist es, die Idee leicht verständlich zu machen. Für ein produktionsreifes System möchten Sie vielleicht einige zusätzliche Funktionen implementieren: + +- Behandeln Sie Werte, die nicht `uint256` sind. Zum Beispiel Strings. +- Anstelle eines globalen Caches könnte es ein Mapping zwischen Benutzern und Caches geben. Verschiedene Benutzer verwenden unterschiedliche Werte. +- Werte, die für Adressen verwendet werden, unterscheiden sich von denen, die für andere Zwecke verwendet werden. Es könnte sinnvoll sein, einen separaten Cache nur für Adressen zu haben. +- Derzeit basieren die Cache-Schlüssel auf einem „Wer zuerst kommt, erhält den kleinsten Schlüssel“-Algorithmus. Die ersten sechzehn Werte können als einzelnes Byte gesendet werden. Die nächsten 4080 Werte können als zwei Bytes gesendet werden. Die nächsten etwa eine Million Werte sind drei Bytes usw. Ein Produktionssystem sollte Nutzungszähler für Cache-Einträge führen und diese so reorganisieren, dass die sechzehn _häufigsten_ Werte ein Byte sind, die nächsten 4080 häufigsten Werte zwei Bytes usw. + + Dies ist jedoch eine potenziell gefährliche Operation. Stellen Sie sich die folgende Abfolge von Ereignissen vor: + + 1. Noam Naive ruft `encodeVal` auf, um die Adresse zu kodieren, an die er Token senden möchte. Diese Adresse ist eine der ersten, die in der Anwendung verwendet wird, daher ist der kodierte Wert 0x06. Dies ist eine `view`-Funktion, keine Transaktion, also findet sie zwischen Noam und dem von ihm genutzten Blockchain-Knoten statt, und niemand sonst weiß davon. + + 2. Owen Owner führt die Cache-Neuordnungsoperation aus. Sehr wenige Leute verwenden diese Adresse tatsächlich, daher wird sie jetzt als 0x201122 kodiert. Einem anderen Wert, 1018, wird 0x06 zugewiesen. + + 3. Noam Naive sendet seine Token an 0x06. Sie gehen an die Adresse `0x0000000000000000000000000de0b6b3a7640000`, und da niemand den Private-Key für diese Adresse kennt, stecken sie dort einfach fest. Noam ist _nicht glücklich_. + + Es gibt Möglichkeiten, dieses Problem und das damit verbundene Problem von Transaktionen, die sich während der Cache-Neuordnung im Mempool befinden, zu lösen, aber Sie müssen sich dessen bewusst sein. + +Ich habe Caching hier mit Optimism demonstriert, weil ich ein Mitarbeiter von Optimism bin und dies das Rollups ist, das ich am besten kenne. Aber es sollte mit jedem Rollups funktionieren, das minimale Kosten für die interne Verarbeitung berechnet, sodass im Vergleich dazu das Schreiben der Transaktionsdaten auf L1 der größte Kostenfaktor ist. + +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/app-plasma/index.md b/public/content/translations/de/developers/tutorials/app-plasma/index.md new file mode 100644 index 00000000000..6c84408e947 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/app-plasma/index.md @@ -0,0 +1,1256 @@ +--- +title: "Schreiben Sie ein anwendungsspezifisches Plasma, das die Privatsphäre wahrt" +description: "In diesem Tutorial bauen wir eine halbgeheime Bank für Einlagen. Die Bank ist eine zentralisierte Komponente; sie kennt den Kontostand jedes Benutzers. Diese Informationen werden jedoch nicht auf der Blockchain gespeichert. Stattdessen veröffentlicht die Bank einen Hash des Zustands. Jedes Mal, wenn eine Transaktion stattfindet, veröffentlicht die Bank den neuen Hash zusammen mit einem Zero-Knowledge-Beweis, dass sie eine signierte Transaktion hat, die den Hash-Zustand in den neuen ändert. Nach dem Lesen dieses Tutorials werden Sie nicht nur verstehen, wie man Zero-Knowledge-Beweise verwendet, sondern auch, warum man sie verwendet und wie man dies sicher tut." +author: Ori Pomerantz +tags: ["Zero-Knowledge", "Server", "Off-Chain", "Privatsphäre"] +skill: advanced +breadcrumb: Anwendungsspezifisches Plasma +lang: de +published: 2025-10-15 +--- + +## Einführung {#introduction} + +Im Gegensatz zu [Rollups](/developers/docs/scaling/zk-rollups/) nutzen [Plasmas](/developers/docs/scaling/plasma) das Ethereum-Mainnet für die Integrität, aber nicht für die Verfügbarkeit. In diesem Artikel schreiben wir eine Anwendung, die sich wie ein Plasma verhält, wobei Ethereum die Integrität garantiert (keine unbefugten Änderungen), aber nicht die Verfügbarkeit (eine zentralisierte Komponente kann ausfallen und das gesamte System lahmlegen). + +Die Anwendung, die wir hier schreiben, ist eine Bank, die die Privatsphäre wahrt. Verschiedene Adressen haben Konten mit Guthaben, und sie können Geld (ETH) an andere Konten senden. Die Bank veröffentlicht Hashes des Zustands (Konten und deren Guthaben) und Transaktionen, hält aber die tatsächlichen Guthaben Off-Chain, wo sie privat bleiben können. + +## Design {#design} + +Dies ist kein produktionsreifes System, sondern ein Lehrmittel. Als solches wurde es mit einigen vereinfachenden Annahmen geschrieben. + +- Fester Kontenpool. Es gibt eine bestimmte Anzahl von Konten, und jedes Konto gehört zu einer vorgegebenen Adresse. Dies macht das System viel einfacher, da es schwierig ist, Datenstrukturen variabler Größe in Zero-Knowledge-Beweisen zu handhaben. Für ein produktionsreifes System können wir die [Merkle-Wurzel](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) als Zustands-Hash verwenden und Merkle-Beweise für die erforderlichen Guthaben bereitstellen. + +- Speicherung im Arbeitsspeicher. In einem Produktionssystem müssen wir alle Kontostände auf die Festplatte schreiben, um sie im Falle eines Neustarts zu erhalten. Hier ist es in Ordnung, wenn die Informationen einfach verloren gehen. + +- Nur Überweisungen. Ein Produktionssystem würde eine Möglichkeit erfordern, Vermögenswerte bei der Bank einzuzahlen und abzuheben. Aber der Zweck hier ist nur, das Konzept zu veranschaulichen, daher ist diese Bank auf Überweisungen beschränkt. + +### Zero-Knowledge-Beweise {#zero-knowledge-proofs} + +Auf einer grundlegenden Ebene zeigt ein Zero-Knowledge-Beweis, dass der Beweiser bestimmte Daten kennt, _Dataprivate_, sodass eine Beziehung _Relationship_ zwischen einigen öffentlichen Daten, _Datapublic_, und _Dataprivate_ besteht. Der Verifizierer kennt _Relationship_ und _Datapublic_. + +Um die Privatsphäre zu wahren, müssen die Zustände und die Transaktionen privat sein. Um jedoch die Integrität zu gewährleisten, muss der [kryptografische Hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) der Zustände öffentlich sein. Um den Personen, die Transaktionen einreichen, zu beweisen, dass diese Transaktionen wirklich stattgefunden haben, müssen wir auch Transaktions-Hashes veröffentlichen. + +In den meisten Fällen ist _Dataprivate_ die Eingabe für das Zero-Knowledge-Beweisprogramm und _Datapublic_ die Ausgabe. + +Diese Felder in _Dataprivate_: + +- _Staten_, der alte Zustand +- _Staten+1_, der neue Zustand +- _Transaction_, eine Transaktion, die vom alten Zustand in den neuen wechselt. Diese Transaktion muss folgende Felder enthalten: + - _Zieladresse_, die die Überweisung empfängt + - _Betrag_, der überwiesen wird + - _Nonce_, um sicherzustellen, dass jede Transaktion nur einmal verarbeitet werden kann. + Die Quelladresse muss nicht in der Transaktion enthalten sein, da sie aus der Signatur wiederhergestellt werden kann. +- _Signatur_, eine Signatur, die autorisiert ist, die Transaktion durchzuführen. In unserem Fall ist die einzige Adresse, die zur Durchführung einer Transaktion autorisiert ist, die Quelladresse. Da unser Zero-Knowledge-System so funktioniert, wie es funktioniert, benötigen wir zusätzlich zur Ethereum-Signatur auch den Public-Key des Kontos. + +Dies sind die Felder in _Datapublic_: + +- _Hash(Staten)_ der Hash des alten Zustands +- _Hash(Staten+1)_ der Hash des neuen Zustands +- _Hash(Transaction)_ der Hash der Transaktion, die den Zustand von _Staten_ zu _Staten+1_ ändert. + +Die Beziehung prüft mehrere Bedingungen: + +- Die öffentlichen Hashes sind tatsächlich die korrekten Hashes für die privaten Felder. +- Die Transaktion führt, wenn sie auf den alten Zustand angewendet wird, zum neuen Zustand. +- Die Signatur stammt von der Quelladresse der Transaktion. + +Aufgrund der Eigenschaften kryptografischer Hash-Funktionen reicht der Beweis dieser Bedingungen aus, um die Integrität zu gewährleisten. + +### Datenstrukturen {#data-structures} + +Die primäre Datenstruktur ist der vom Server gehaltene Zustand. Für jedes Konto verfolgt der Server den Kontostand und eine [Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce), die verwendet wird, um [Replay-Angriffe](https://en.wikipedia.org/wiki/Replay_attack) zu verhindern. + +### Komponenten {#components} + +Dieses System erfordert zwei Komponenten: + +- Der _Server_, der Transaktionen empfängt, sie verarbeitet und Hashes zusammen mit den Zero-Knowledge-Beweisen auf der Blockchain veröffentlicht. +- Ein _Smart Contract_, der die Hashes speichert und die Zero-Knowledge-Beweise verifiziert, um sicherzustellen, dass Zustandsübergänge legitim sind. + +### Daten- und Kontrollfluss {#flows} + +Dies sind die Wege, auf denen die verschiedenen Komponenten kommunizieren, um von einem Konto auf ein anderes zu überweisen. + +1. Ein Webbrowser reicht eine signierte Transaktion ein, die um eine Überweisung vom Konto des Unterzeichners auf ein anderes Konto bittet. + +2. Der Server verifiziert, dass die Transaktion gültig ist: + + - Der Unterzeichner hat ein Konto bei der Bank mit ausreichendem Guthaben. + - Der Empfänger hat ein Konto bei der Bank. + +3. Der Server berechnet den neuen Zustand, indem er den überwiesenen Betrag vom Guthaben des Unterzeichners abzieht und ihn dem Guthaben des Empfängers hinzufügt. + +4. Der Server berechnet einen Zero-Knowledge-Beweis, dass die Zustandsänderung gültig ist. + +5. Der Server reicht bei Ethereum eine Transaktion ein, die Folgendes enthält: + + - Den neuen Zustands-Hash + - Den Transaktions-Hash (damit der Sender der Transaktion weiß, dass sie verarbeitet wurde) + - Den Zero-Knowledge-Beweis, der belegt, dass der Übergang in den neuen Zustand gültig ist + +6. Der Smart Contract verifiziert den Zero-Knowledge-Beweis. + +7. Wenn der Zero-Knowledge-Beweis erfolgreich ist, führt der Smart Contract diese Aktionen aus: + - Aktualisierung des aktuellen Zustands-Hashes auf den neuen Zustands-Hash + - Ausgabe eines Protokolleintrags mit dem neuen Zustands-Hash und dem Transaktions-Hash + +### Werkzeuge {#tools} + +Für den clientseitigen Code werden wir [Vite](https://vite.dev/), [React](https://react.dev/), [Viem](https://viem.sh/) und [Wagmi](https://wagmi.sh/) verwenden. Dies sind branchenübliche Werkzeuge; wenn Sie nicht mit ihnen vertraut sind, können Sie [dieses Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) verwenden. + +Der Großteil des Servers ist in JavaScript unter Verwendung von [Node](https://nodejs.org/en) geschrieben. Der Zero-Knowledge-Teil ist in [Noir](https://noir-lang.org/) geschrieben. Wir benötigen Version `1.0.0-beta.10`, also führen Sie nach der [Installation von Noir gemäß Anleitung](https://noir-lang.org/docs/getting_started/quick_start) Folgendes aus: + +``` +noirup -v 1.0.0-beta.10 +``` + +Die Blockchain, die wir verwenden, ist `anvil`, eine lokale Test-Blockchain, die Teil von [Foundry](https://getfoundry.sh/introduction/installation) ist. + +## Implementierung {#implementation} + +Da dies ein komplexes System ist, werden wir es in Phasen implementieren. + +### Phase 1 - Manuelles Zero-Knowledge {#stage-1} + +Für die erste Phase werden wir eine Transaktion im Browser signieren und dann die Informationen manuell dem Zero-Knowledge-Beweis zur Verfügung stellen. Der Zero-Knowledge-Code erwartet, diese Informationen in `server/noir/Prover.toml` zu erhalten (dokumentiert [hier](https://noir-lang.org/docs/getting_started/project_breakdown#provertoml-1)). + +Um es in Aktion zu sehen: + +1. Stellen Sie sicher, dass Sie [Node](https://nodejs.org/en/download) und [Noir](https://noir-lang.org/install) installiert haben. Installieren Sie sie vorzugsweise auf einem UNIX-System wie macOS, Linux oder [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). + +2. Laden Sie den Code für Phase 1 herunter und starten Sie den Webserver, um den Client-Code bereitzustellen. + + ```sh + git clone https://github.com/qbzzt/250911-zk-bank.git -b 01-manual-zk + cd 250911-zk-bank + cd client + npm install + npm run dev +``` + + Der Grund, warum Sie hier einen Webserver benötigen, ist, dass viele Wallets (wie MetaMask) zur Verhinderung bestimmter Arten von Betrug keine Dateien akzeptieren, die direkt von der Festplatte bereitgestellt werden. + +3. Öffnen Sie einen Browser mit einem Wallet. + +4. Geben Sie im Wallet eine neue Passphrase ein. Beachten Sie, dass dadurch Ihre bestehende Passphrase gelöscht wird, _stellen Sie also sicher, dass Sie ein Backup haben_. + + Die Passphrase lautet `test test test test test test test test test test test junk`, die Standard-Test-Passphrase für anvil. + +5. Navigieren Sie zum [clientseitigen Code](http://localhost:5173/). + +6. Verbinden Sie sich mit dem Wallet und wählen Sie Ihr Zielkonto und den Betrag aus. + +7. Klicken Sie auf **Sign** und signieren Sie die Transaktion. + +8. Unter der Überschrift **Prover.toml** finden Sie Text. Ersetzen Sie `server/noir/Prover.toml` durch diesen Text. + +9. Führen Sie den Zero-Knowledge-Beweis aus. + + ```sh + cd ../server/noir + nargo execute +``` + + Die Ausgabe sollte ähnlich sein wie + + ``` + ori@CryptoDocGuy:~/noir/250911-zk-bank/server/noir$ nargo execute + + [zkBank] Circuit witness successfully solved + [zkBank] Witness saved to target/zkBank.gz + [zkBank] Circuit output: (0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b, 0x0cfc0a67cb7308e4e9b254026b54204e34f6c8b041be207e64c5db77d95dd82d, 0x450cf9da6e180d6159290554ae3d8787, 0x6d8bc5a15b9037e52fb59b6b98722a85) +``` + +10. Vergleichen Sie die letzten beiden Werte mit dem Hash, den Sie im Webbrowser sehen, um zu überprüfen, ob die Nachricht korrekt gehasht wurde. + +#### `server/noir/Prover.toml` {#server-noir-prover-toml} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) zeigt das von Noir erwartete Informationsformat. + +```toml +message="send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 500 finney (milliEth) 0 " +``` + +Die Nachricht liegt im Textformat vor, was es dem Benutzer leicht macht, sie zu verstehen (was beim Signieren notwendig ist), und dem Noir-Code, sie zu parsen. Der Betrag ist in Finneys angegeben, um einerseits Teilüberweisungen zu ermöglichen und andererseits leicht lesbar zu sein. Die letzte Zahl ist die [Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). + +Die Zeichenfolge ist 100 Zeichen lang. Zero-Knowledge-Beweise können mit Daten variabler Größe nicht gut umgehen, daher ist es oft notwendig, Daten aufzufüllen (Padding). + +```toml +pubKeyX=["0x83",...,"0x75"] +pubKeyY=["0x35",...,"0xa5"] +signature=["0xb1",...,"0x0d"] +``` + +Diese drei Parameter sind Byte-Arrays fester Größe. + +```toml +[[accounts]] +address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +balance=100_000 +nonce=0 + +[[accounts]] +address="0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +balance=100_000 +nonce=0 +``` + +Dies ist die Art und Weise, ein Array von Strukturen anzugeben. Für jeden Eintrag geben wir die Adresse, das Guthaben (in milliETH, auch bekannt als [Finney](https://cryptovalleyjournal.com/glossary/finney/)) und den nächsten Nonce-Wert an. + +#### `client/src/Transfer.tsx` {#client-src-transfer-tsx} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/client/src/Transfer.tsx) implementiert die clientseitige Verarbeitung und generiert die Datei `server/noir/Prover.toml` (diejenige, die die Zero-Knowledge-Parameter enthält). + +Hier ist die Erklärung der interessanteren Teile. + +```tsx +export default attrs => { +``` + +Diese Funktion erstellt die React-Komponente `Transfer`, die von anderen Dateien importiert werden kann. + +```tsx + const accounts = [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + ] +``` + +Dies sind die Kontoadressen, die Adressen, die durch die Passphrase `test ... test junk` erstellt wurden. Wenn Sie Ihre eigenen Adressen verwenden möchten, ändern Sie einfach diese Definition. + +```tsx + const account = useAccount() + const wallet = createWalletClient({ + transport: custom(window.ethereum!) + }) +``` + +Diese [Wagmi-Hooks](https://wagmi.sh/react/api/hooks) ermöglichen uns den Zugriff auf die [viem](https://viem.sh/)-Bibliothek und das Wallet. + +```tsx + const message = `send ${toAccount} ${ethAmount*1000} finney (milliEth) ${nonce}`.padEnd(100, " ") +``` + +Dies ist die Nachricht, aufgefüllt mit Leerzeichen. Jedes Mal, wenn sich eine der [`useState`](https://react.dev/reference/react/useState)-Variablen ändert, wird die Komponente neu gezeichnet und `message` aktualisiert. + +```tsx + const sign = async () => { +``` + +Diese Funktion wird aufgerufen, wenn der Benutzer auf die Schaltfläche **Sign** klickt. Die Nachricht wird automatisch aktualisiert, aber die Signatur erfordert die Zustimmung des Benutzers im Wallet, und wir möchten nicht danach fragen, es sei denn, es ist erforderlich. + +```tsx + const signature = await wallet.signMessage({ + account: fromAccount, + message, + }) +``` + +Bitten Sie das Wallet, [die Nachricht zu signieren](https://viem.sh/docs/accounts/local/signMessage). + +```tsx + const hash = hashMessage(message) +``` + +Rufen Sie den Nachrichten-Hash ab. Es ist hilfreich, ihn dem Benutzer zum Debuggen (des Noir-Codes) zur Verfügung zu stellen. + +```tsx + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +[Rufen Sie den Public-Key ab](https://viem.sh/docs/utilities/recoverPublicKey). Dies ist für die [Noir-Funktion `ecrecover`](https://github.com/colinnielsen/ecrecover-noir) erforderlich. + +```tsx + setSignature(signature) + setHash(hash) + setPubKey(pubKey) +``` + +Legen Sie die Zustandsvariablen fest. Dadurch wird die Komponente neu gezeichnet (nachdem die Funktion `sign` beendet ist) und dem Benutzer werden die aktualisierten Werte angezeigt. + +```tsx + let proverToml = ` +``` + +Der Text für `Prover.toml`. + +```tsx +message="${message}" + +pubKeyX=${hexToArray(pubKey.slice(4,4+2*32))} +pubKeyY=${hexToArray(pubKey.slice(4+2*32))} +``` + +Viem stellt uns den Public-Key als 65-Byte-Hexadezimalzeichenfolge zur Verfügung. Das erste Byte ist `0x04`, eine Versionsmarkierung. Darauf folgen 32 Bytes für das `x` des Public-Keys und dann 32 Bytes für das `y` des Public-Keys. + +Noir erwartet diese Informationen jedoch als zwei Byte-Arrays, eines für `x` und eines für `y`. Es ist einfacher, sie hier auf dem Client zu parsen, als als Teil des Zero-Knowledge-Beweises. + +Beachten Sie, dass dies im Allgemeinen eine gute Praxis bei Zero-Knowledge ist. Code innerhalb eines Zero-Knowledge-Beweises ist teuer, daher _sollte_ jede Verarbeitung, die außerhalb des Zero-Knowledge-Beweises durchgeführt werden kann, auch außerhalb des Zero-Knowledge-Beweises durchgeführt werden. + +```tsx +signature=${hexToArray(signature.slice(2,-2))} +``` + +Die Signatur wird ebenfalls als 65-Byte-Hexadezimalzeichenfolge bereitgestellt. Das letzte Byte ist jedoch nur erforderlich, um den Public-Key wiederherzustellen. Da der Public-Key dem Noir-Code bereits zur Verfügung gestellt wird, benötigen wir ihn nicht zur Verifizierung der Signatur, und der Noir-Code erfordert ihn nicht. + +```tsx +${accounts.map(accountInProverToml).reduce((a,b) => a+b, "")} +` +``` + +Stellen Sie die Konten bereit. + +```tsx + setProverToml(proverToml) + } + + return ( + \<> +

Transfer

+``` + +Dies ist das HTML-Format (genauer gesagt [JSX](https://react.dev/learn/writing-markup-with-jsx)) der Komponente. + +#### `server/noir/src/main.nr` {#server-noir-src-main-nr} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/src/main.nr) ist der eigentliche Zero-Knowledge-Code. + +``` +use std::hash::pedersen_hash; +``` + +Der [Pedersen-Hash](https://rya-sge.github.io/access-denied/2024/05/07/pedersen-hash-function/) wird mit der [Noir-Standardbibliothek](https://noir-lang.org/docs/noir/standard_library/cryptographic_primitives/hashes#pedersen_hash) bereitgestellt. Zero-Knowledge-Beweise verwenden diese Hash-Funktion häufig. Sie ist innerhalb von [arithmetischen Schaltkreisen](https://rareskills.io/post/arithmetic-circuit) im Vergleich zu den Standard-Hash-Funktionen viel einfacher zu berechnen. + +``` +use keccak256::keccak256; +use dep::ecrecover; +``` + +Diese beiden Funktionen sind externe Bibliotheken, die in [`Nargo.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Nargo.toml) definiert sind. Sie sind genau das, wonach sie benannt sind: eine Funktion, die den [keccak256-Hash](https://emn178.github.io/online-tools/keccak_256.html) berechnet, und eine Funktion, die Ethereum-Signaturen verifiziert und die Ethereum-Adresse des Unterzeichners wiederherstellt. + +``` +global ACCOUNT_NUMBER : u32 = 5; +``` + +Noir ist von [Rust](https://www.rust-lang.org/) inspiriert. Variablen sind standardmäßig Konstanten. So definieren wir globale Konfigurationskonstanten. Insbesondere ist `ACCOUNT_NUMBER` die Anzahl der Konten, die wir speichern. + +Datentypen mit dem Namen `u` haben diese Anzahl von Bits, vorzeichenlos. Die einzigen unterstützten Typen sind `u8`, `u16`, `u32`, `u64` und `u128`. + +``` +global FLAT_ACCOUNT_FIELDS : u32 = 2; +``` + +Diese Variable wird für den Pedersen-Hash der Konten verwendet, wie unten erklärt. + +``` +global MESSAGE_LENGTH : u32 = 100; +``` + +Wie oben erklärt, ist die Nachrichtenlänge fest. Sie wird hier angegeben. + +``` +global ASCII_MESSAGE_LENGTH : [u8; 3] = [0x31, 0x30, 0x30]; +global HASH_BUFFER_SIZE : u32 = 26+3+MESSAGE_LENGTH; +``` + +[EIP-191-Signaturen](https://eips.ethereum.org/EIPS/eip-191) erfordern einen Puffer mit einem 26-Byte-Präfix, gefolgt von der Nachrichtenlänge in ASCII und schließlich der Nachricht selbst. + +``` +struct Account { + balance: u128, + address: Field, + nonce: u32, +} +``` + +Die Informationen, die wir über ein Konto speichern. [`Field`](https://noir-lang.org/docs/noir/concepts/data_types/fields) ist eine Zahl, typischerweise bis zu 253 Bits, die direkt in dem [arithmetischen Schaltkreis](https://rareskills.io/post/arithmetic-circuit) verwendet werden kann, der den Zero-Knowledge-Beweis implementiert. Hier verwenden wir das `Field`, um eine 160-Bit-Ethereum-Adresse zu speichern. + +``` +struct TransferTxn { + from: Field, + to: Field, + amount: u128, + nonce: u32 +} +``` + +Die Informationen, die wir für eine Überweisungstransaktion speichern. + +``` +fn flatten_account(account: Account) -> [Field; FLAT_ACCOUNT_FIELDS] { +``` + +Eine Funktionsdefinition. Der Parameter sind `Account`-Informationen. Das Ergebnis ist ein Array von `Field`-Variablen, dessen Länge `FLAT_ACCOUNT_FIELDS` ist. + +``` + let flat = [ + account.address, + ((account.balance << 32) + account.nonce.into()).into(), + ]; +``` + +Der erste Wert im Array ist die Kontoadresse. Der zweite enthält sowohl das Guthaben als auch die Nonce. Die `.into()`-Aufrufe ändern eine Zahl in den Datentyp, den sie haben muss. `account.nonce` ist ein `u32`-Wert, aber um ihn zu `account.balance << 32`, einem `u128`-Wert, hinzuzufügen, muss er ein `u128` sein. Das ist das erste `.into()`. Das zweite konvertiert das `u128`-Ergebnis in ein `Field`, damit es in das Array passt. + +``` + flat +} +``` + +In Noir können Funktionen nur am Ende einen Wert zurückgeben (es gibt kein vorzeitiges Zurückgeben). Um den Rückgabewert anzugeben, werten Sie ihn direkt vor der schließenden Klammer der Funktion aus. + +``` +fn flatten_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] { +``` + +Diese Funktion wandelt das Konten-Array in ein `Field`-Array um, das als Eingabe für einen Petersen-Hash verwendet werden kann. + +``` + let mut flat: [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] = [0; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER]; +``` + +So geben Sie eine veränderbare Variable an, also _keine_ Konstante. Variablen in Noir müssen immer einen Wert haben, daher initialisieren wir diese Variable mit lauter Nullen. + +``` + for i in 0..ACCOUNT_NUMBER { +``` + +Dies ist eine `for`-Schleife. Beachten Sie, dass die Grenzen Konstanten sind. Bei Noir-Schleifen müssen die Grenzen zur Kompilierzeit bekannt sein. Der Grund dafür ist, dass arithmetische Schaltkreise keine Flusskontrolle unterstützen. Bei der Verarbeitung einer `for`-Schleife fügt der Compiler den Code darin einfach mehrmals ein, einmal für jede Iteration. + +``` + let fields = flatten_account(accounts[i]); + for j in 0..FLAT_ACCOUNT_FIELDS { + flat[i*FLAT_ACCOUNT_FIELDS + j] = fields[j]; + } + } + + flat +} + +fn hash_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> Field { + pedersen_hash(flatten_accounts(accounts)) +} +``` + +Schließlich sind wir bei der Funktion angelangt, die das Konten-Array hasht. + +``` +fn find_account(accounts: [Account; ACCOUNT_NUMBER], address: Field) -> u32 { + let mut account : u32 = ACCOUNT_NUMBER; + + for i in 0..ACCOUNT_NUMBER { + if accounts[i].address == address { + account = i; + } + } +``` + +Diese Funktion findet das Konto mit einer bestimmten Adresse. Diese Funktion wäre in Standardcode furchtbar ineffizient, da sie über alle Konten iteriert, selbst nachdem sie die Adresse gefunden hat. + +In Zero-Knowledge-Beweisen gibt es jedoch keine Flusskontrolle. Wenn wir jemals eine Bedingung überprüfen müssen, müssen wir sie jedes Mal überprüfen. + +Ähnliches passiert bei `if`-Anweisungen. Die `if`-Anweisung in der obigen Schleife wird in diese mathematischen Anweisungen übersetzt. + +_conditionresult = accounts[i].address == address_ // eins, wenn sie gleich sind, andernfalls null + +_accountnew = conditionresult\*i + (1-conditionresult)\*accountold_ + +```rust + assert (account < ACCOUNT_NUMBER, f"{address} does not have an account"); + + account +} +``` + +Die Funktion [`assert`](https://noir-lang.org/docs/dev/noir/concepts/assert) führt dazu, dass der Zero-Knowledge-Beweis abstürzt, wenn die Behauptung falsch ist. In diesem Fall, wenn wir kein Konto mit der entsprechenden Adresse finden können. Um die Adresse zu melden, verwenden wir einen [Format-String](https://noir-lang.org/docs/noir/concepts/data_types/strings#format-strings). + +```rust +fn apply_transfer_txn(accounts: [Account; ACCOUNT_NUMBER], txn: TransferTxn) -> [Account; ACCOUNT_NUMBER] { +``` + +Diese Funktion wendet eine Überweisungstransaktion an und gibt das neue Konten-Array zurück. + +```rust + let from = find_account(accounts, txn.from); + let to = find_account(accounts, txn.to); + + let (txnFrom, txnAmount, txnNonce, accountNonce) = + (txn.from, txn.amount, txn.nonce, accounts[from].nonce); +``` + +Wir können in Noir nicht auf Strukturelemente innerhalb eines Format-Strings zugreifen, daher erstellen wir eine nutzbare Kopie. + +```rust + assert (accounts[from].balance >= txn.amount, + f"{txnFrom} does not have {txnAmount} finney"); + + assert (accounts[from].nonce == txn.nonce, + f"Transaction has nonce {txnNonce}, but the account is expected to use {accountNonce}"); +``` + +Dies sind zwei Bedingungen, die eine Transaktion ungültig machen könnten. + +```rust + let mut newAccounts = accounts; + + newAccounts[from].balance -= txn.amount; + newAccounts[from].nonce += 1; + newAccounts[to].balance += txn.amount; + + newAccounts +} +``` + +Erstellen Sie das neue Konten-Array und geben Sie es dann zurück. + +```rust +fn readAddress(messageBytes: [u8; MESSAGE_LENGTH]) -> Field +``` + +Diese Funktion liest die Adresse aus der Nachricht. + +```rust +{ + let mut result : Field = 0; + + for i in 7..47 { +``` + +Die Adresse ist immer 20 Bytes (also 40 hexadezimale Ziffern) lang und beginnt bei Zeichen Nr. 7. + +```rust + result *= 0x10; + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + result += (messageBytes[i]-48).into(); + } + if messageBytes[i] >= 65 & messageBytes[i] <= 70 { // A-F + result += (messageBytes[i]-65+10).into() + } + if messageBytes[i] >= 97 & messageBytes[i] <= 102 { // a-f + result += (messageBytes[i]-97+10).into() + } + } + + result +} + +fn readAmountAndNonce(messageBytes: [u8; MESSAGE_LENGTH]) -> (u128, u32) +``` + +Lesen Sie den Betrag und die Nonce aus der Nachricht. + +```rust +{ + let mut amount : u128 = 0; + let mut nonce: u32 = 0; + let mut stillReadingAmount: bool = true; + let mut lookingForNonce: bool = false; + let mut stillReadingNonce: bool = false; +``` + +In der Nachricht ist die erste Zahl nach der Adresse der Betrag in Finney (also Tausendstel eines ETH), der überwiesen werden soll. Die zweite Zahl ist die Nonce. Jeglicher Text dazwischen wird ignoriert. + +```rust + for i in 48..MESSAGE_LENGTH { + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + let digit = (messageBytes[i]-48); + + if stillReadingAmount { + amount = amount*10 + digit.into(); + } + + if lookingForNonce { // Wir haben es gerade gefunden + stillReadingNonce = true; + lookingForNonce = false; + } + + if stillReadingNonce { + nonce = nonce*10 + digit.into(); + } + } else { + if stillReadingAmount { + stillReadingAmount = false; + lookingForNonce = true; + } + if stillReadingNonce { + stillReadingNonce = false; + } + } + } + + (amount, nonce) +} +``` + +Die Rückgabe eines [Tupels](https://noir-lang.org/docs/noir/concepts/data_types/tuples) ist die Noir-Methode, um mehrere Werte aus einer Funktion zurückzugeben. + +```rust +fn readTransferTxn(message: str) -> TransferTxn +{ + let mut txn: TransferTxn = TransferTxn { from: 0, to: 0, amount:0, nonce:0 }; + let messageBytes = message.as_bytes(); + + txn.to = readAddress(messageBytes); + let (amount, nonce) = readAmountAndNonce(messageBytes); + txn.amount = amount; + txn.nonce = nonce; + + txn +} +``` + +Diese Funktion konvertiert die Nachricht in Bytes und konvertiert dann die Beträge in eine `TransferTxn`. + +```rust +// Das Äquivalent zu Viems hashMessage +// https://viem.sh/docs/utilities/hashMessage#hashmessage +fn hashMessage(message: str) -> [u8;32] { +``` + +Wir konnten den Pedersen-Hash für die Konten verwenden, da sie nur innerhalb des Zero-Knowledge-Beweises gehasht werden. In diesem Code müssen wir jedoch die Signatur der Nachricht überprüfen, die vom Browser generiert wird. Dafür müssen wir dem Ethereum-Signaturformat in [EIP 191](https://eips.ethereum.org/EIPS/eip-191) folgen. Das bedeutet, wir müssen einen kombinierten Puffer mit einem Standardpräfix, der Nachrichtenlänge in ASCII und der Nachricht selbst erstellen und den Ethereum-Standard keccak256 verwenden, um ihn zu hashen. + +```rust + // ASCII-Präfix + let prefix_bytes = [ + 0x19, // \x19 + 0x45, // 'E' + 0x74, // 't' + 0x68, // 'h' + 0x65, // 'e' + 0x72, // 'r' + 0x65, // 'e' + 0x75, // 'u' + 0x6D, // 'm' + 0x20, // ' ' + 0x53, // 'S' + 0x69, // 'i' + 0x67, // 'g' + 0x6E, // 'n' + 0x65, // 'e' + 0x64, // 'd' + 0x20, // ' ' + 0x4D, // 'M' + 0x65, // 'e' + 0x73, // 's' + 0x73, // 's' + 0x61, // 'a' + 0x67, // 'g' + 0x65, // 'e' + 0x3A, // ':' + 0x0A // '\n' + ]; +``` + +Um Fälle zu vermeiden, in denen eine Anwendung den Benutzer auffordert, eine Nachricht zu signieren, die als Transaktion oder für einen anderen Zweck verwendet werden kann, legt EIP 191 fest, dass alle signierten Nachrichten mit dem Zeichen 0x19 (kein gültiges ASCII-Zeichen) beginnen, gefolgt von `Ethereum Signed Message:` und einem Zeilenumbruch. + +```rust + let mut buffer: [u8; HASH_BUFFER_SIZE] = [0u8; HASH_BUFFER_SIZE]; + for i in 0..26 { + buffer[i] = prefix_bytes[i]; + } + + let messageBytes : [u8; MESSAGE_LENGTH] = message.as_bytes(); + + if MESSAGE_LENGTH <= 9 { + for i in 0..1 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+1] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 10 & MESSAGE_LENGTH <= 99 { + for i in 0..2 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+2] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 100 { + for i in 0..3 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+3] = messageBytes[i]; + } + } + + assert(MESSAGE_LENGTH < 1000, "Messages whose length is over three digits are not supported"); +``` + +Behandeln Sie Nachrichtenlängen bis zu 999 und schlagen Sie fehl, wenn sie größer sind. Ich habe diesen Code hinzugefügt, obwohl die Nachrichtenlänge eine Konstante ist, weil es so einfacher ist, sie zu ändern. In einem Produktionssystem würden Sie wahrscheinlich aus Gründen der besseren Leistung einfach davon ausgehen, dass sich `MESSAGE_LENGTH` nicht ändert. + +```rust + keccak256::keccak256(buffer, HASH_BUFFER_SIZE) +} +``` + +Verwenden Sie die Ethereum-Standardfunktion `keccak256`. + +```rust +fn signatureToAddressAndHash( + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64] + ) -> (Field, Field, Field) // Adresse, erste 16 Bytes des Hashs, letzte 16 Bytes des Hashs +{ +``` + +Diese Funktion verifiziert die Signatur, was den Nachrichten-Hash erfordert. Sie liefert uns dann die Adresse, die sie signiert hat, und den Nachrichten-Hash. Der Nachrichten-Hash wird in zwei `Field`-Werten geliefert, da diese im Rest des Programms einfacher zu verwenden sind als ein Byte-Array. + +Wir müssen zwei `Field`-Werte verwenden, da Feldberechnungen [modulo](https://en.wikipedia.org/wiki/Modulo) einer großen Zahl durchgeführt werden, diese Zahl jedoch typischerweise kleiner als 256 Bits (andernfalls wäre es schwierig, diese Berechnungen in der EVM durchzuführen). + +```rust + let hash = hashMessage(message); + + let mut (hash1, hash2) = (0,0); + + for i in 0..16 { + hash1 = hash1*256 + hash[31-i].into(); + hash2 = hash2*256 + hash[15-i].into(); + } +``` + +Geben Sie `hash1` und `hash2` als veränderbare Variablen an und schreiben Sie den Hash Byte für Byte in sie hinein. + +```rust + ( + ecrecover::ecrecover(pubKeyX, pubKeyY, signature, hash), +``` + +Dies ähnelt [Soliditys `ecrecover`](https://docs.soliditylang.org/en/v0.8.30/cheatsheet.html#mathematical-and-cryptographic-functions), mit zwei wichtigen Unterschieden: + +- Wenn die Signatur nicht gültig ist, schlägt der Aufruf bei einem `assert` fehl und das Programm wird abgebrochen. +- Während der Public-Key aus der Signatur und dem Hash wiederhergestellt werden kann, ist dies eine Verarbeitung, die extern durchgeführt werden kann und sich daher nicht lohnt, innerhalb des Zero-Knowledge-Beweises durchgeführt zu werden. Wenn jemand versucht, uns hier zu betrügen, wird die Signaturverifizierung fehlschlagen. + +```rust + hash1, + hash2 + ) +} + +fn main( + accounts: [Account; ACCOUNT_NUMBER], + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64], + ) -> pub ( + Field, // Hash des alten Konten-Arrays + Field, // Hash des neuen Konten-Arrays + Field, // Erste 16 Bytes des Nachrichten-Hashs + Field, // Letzte 16 Bytes des Nachrichten-Hashs + ) +``` + +Schließlich erreichen wir die Funktion `main`. Wir müssen beweisen, dass wir eine Transaktion haben, die den Hash der Konten gültig vom alten Wert auf den neuen ändert. Wir müssen auch beweisen, dass sie diesen spezifischen Transaktions-Hash hat, damit die Person, die sie gesendet hat, weiß, dass ihre Transaktion verarbeitet wurde. + +```rust +{ + let mut txn = readTransferTxn(message); +``` + +Wir benötigen `txn` als veränderbar, da wir die Absenderadresse nicht aus der Nachricht lesen, sondern aus der Signatur. + +```rust + let (fromAddress, txnHash1, txnHash2) = signatureToAddressAndHash( + message, + pubKeyX, + pubKeyY, + signature); + + txn.from = fromAddress; + + let newAccounts = apply_transfer_txn(accounts, txn); + + ( + hash_accounts(accounts), + hash_accounts(newAccounts), + txnHash1, + txnHash2 + ) +} +``` + +### Phase 2 - Hinzufügen eines Servers {#stage-2} + +In der zweiten Phase fügen wir einen Server hinzu, der Überweisungstransaktionen vom Browser empfängt und implementiert. + +Um es in Aktion zu sehen: + +1. Stoppen Sie Vite, falls es läuft. + +2. Laden Sie den Branch herunter, der den Server enthält, und stellen Sie sicher, dass Sie alle erforderlichen Module haben. + + ```sh + git checkout 02-add-server + cd client + npm install + cd ../server + npm install +``` + + Es ist nicht nötig, den Noir-Code zu kompilieren, es ist derselbe Code, den Sie für Phase 1 verwendet haben. + +3. Starten Sie den Server. + + ```sh + npm run start +``` + +4. Führen Sie in einem separaten Befehlszeilenfenster Vite aus, um den Browser-Code bereitzustellen. + + ```sh + cd client + npm run dev +``` + +5. Navigieren Sie zum Client-Code unter [http://localhost:5173](http://localhost:5173) + +6. Bevor Sie eine Transaktion ausgeben können, müssen Sie die Nonce sowie den Betrag kennen, den Sie senden können. Um diese Informationen zu erhalten, klicken Sie auf **Update account data** und signieren Sie die Nachricht. + + Wir haben hier ein Dilemma. Einerseits möchten wir keine Nachricht signieren, die wiederverwendet werden kann (ein [Replay-Angriff](https://en.wikipedia.org/wiki/Replay_attack)), weshalb wir überhaupt erst eine Nonce wollen. Wir haben jedoch noch keine Nonce. Die Lösung besteht darin, eine Nonce zu wählen, die nur einmal verwendet werden kann und die wir bereits auf beiden Seiten haben, wie z. B. die aktuelle Uhrzeit. + + Das Problem bei dieser Lösung ist, dass die Zeit möglicherweise nicht perfekt synchronisiert ist. Stattdessen signieren wir also einen Wert, der sich jede Minute ändert. Das bedeutet, dass unser Zeitfenster für die Anfälligkeit gegenüber Replay-Angriffen höchstens eine Minute beträgt. In Anbetracht der Tatsache, dass die signierte Anfrage in der Produktion durch TLS geschützt ist und dass die andere Seite des Tunnels – der Server – das Guthaben und die Nonce bereits offenlegen kann (er muss sie kennen, um zu funktionieren), ist dies ein akzeptables Risiko. + +7. Sobald der Browser das Guthaben und die Nonce zurückerhält, zeigt er das Überweisungsformular an. Wählen Sie die Zieladresse und den Betrag aus und klicken Sie auf **Transfer**. Signieren Sie diese Anfrage. + +8. Um die Überweisung zu sehen, klicken Sie entweder auf **Update account data** oder schauen Sie in das Fenster, in dem Sie den Server ausführen. Der Server protokolliert den Zustand jedes Mal, wenn er sich ändert. + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 36000 finney (milliEth) 0 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 64000 (1) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 100000 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 7200 finney (milliEth) 1 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 56800 (2) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 3000 finney (milliEth) 2 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 53800 (3) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 139000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) +``` + +#### `server/index.mjs` {#server-index-mjs-1} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/index.mjs) enthält den Serverprozess und interagiert mit dem Noir-Code in [`main.nr`](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/noir/src/main.nr). Hier ist eine Erklärung der interessanten Teile. + +```js +import { Noir } from '@noir-lang/noir_js' +``` + +Die Bibliothek [noir.js](https://www.npmjs.com/package/@noir-lang/noir_js) bildet die Schnittstelle zwischen JavaScript-Code und Noir-Code. + +```js +const circuit = JSON.parse(await fs.readFile("./noir/target/zkBank.json")) +const noir = new Noir(circuit) +``` + +Laden Sie den arithmetischen Schaltkreis – das kompilierte Noir-Programm, das wir in der vorherigen Phase erstellt haben – und bereiten Sie dessen Ausführung vor. + +```js +// Wir stellen Kontoinformationen nur als Antwort auf eine signierte Anfrage zur Verfügung +const accountInformation = async signature => { + const fromAddress = await recoverAddress({ + hash: hashMessage("Get account data " + Math.floor((new Date().getTime())/60000)), + signature + }) +``` + +Um Kontoinformationen bereitzustellen, benötigen wir nur die Signatur. Der Grund dafür ist, dass wir bereits wissen, wie die Nachricht lauten wird, und somit auch den Nachrichten-Hash kennen. + +```js +const processMessage = async (message, signature) => { +``` + +Verarbeiten Sie eine Nachricht und führen Sie die darin codierte Transaktion aus. + +```js + // Öffentlichen Schlüssel abrufen + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +Da wir nun JavaScript auf dem Server ausführen, können wir den Public-Key dort abrufen, anstatt auf dem Client. + +```js + let noirResult + try { + noirResult = await noir.execute({ + message, + signature: signature.slice(2,-2).match(/.{2}/g).map(x => `0x${x}`), + pubKeyX, + pubKeyY, + accounts: Accounts + }) +``` + +`noir.execute` führt das Noir-Programm aus. Die Parameter entsprechen denen, die in [`Prover.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) angegeben sind. Beachten Sie, dass lange Werte als Array von Hexadezimalzeichenfolgen (`["0x60", "0xA7"]`) bereitgestellt werden, nicht als einzelner Hexadezimalwert (`0x60A7`), wie es Viem tut. + +```js + } catch (err) { + console.log(`Noir error: ${err}`) + throw Error("Invalid transaction, not processed") + } +``` + +Wenn ein Fehler auftritt, fangen Sie ihn ab und leiten Sie dann eine vereinfachte Version an den Client weiter. + +```js + Accounts[fromAccountNumber].nonce++ + Accounts[fromAccountNumber].balance -= amount + Accounts[toAccountNumber].balance += amount +``` + +Wenden Sie die Transaktion an. Wir haben dies bereits im Noir-Code getan, aber es ist einfacher, es hier noch einmal zu tun, als das Ergebnis von dort zu extrahieren. + +```js +let Accounts = [ + { + address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + balance: 5000, + nonce: 0, + }, +``` + +Die anfängliche `Accounts`-Struktur. + +### Phase 3 - Ethereum Smart Contracts {#stage-3} + +1. Stoppen Sie die Server- und Client-Prozesse. + +2. Laden Sie den Branch mit den Smart Contracts herunter und stellen Sie sicher, dass Sie alle erforderlichen Module haben. + + ```sh + git checkout 03-smart-contracts + cd client + npm install + cd ../server + npm install +``` + +3. Führen Sie `anvil` in einem separaten Befehlszeilenfenster aus. + +4. Generieren Sie den Verifizierungsschlüssel und den Solidity-Verifizierer und kopieren Sie dann den Verifizierer-Code in das Solidity-Projekt. + + ```sh + cd noir + bb write_vk -b ./target/zkBank.json -o ./target --oracle_hash keccak + bb write_solidity_verifier -k ./target/vk -o ./target/Verifier.sol + cp target/Verifier.sol ../../smart-contracts/src +``` + +5. Gehen Sie zu den Smart Contracts und legen Sie die Umgebungsvariablen fest, um die `anvil`-Blockchain zu verwenden. + + ```sh + cd ../../smart-contracts + export ETH_RPC_URL=http://localhost:8545 + ETH_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 +``` + +6. Stellen Sie `Verifier.sol` bereit und speichern Sie die Adresse in einer Umgebungsvariablen. + + ```sh + VERIFIER_ADDRESS=`forge create src/Verifier.sol:HonkVerifier --private-key $ETH_PRIVATE_KEY --optimize --broadcast | awk '/Deployed to:/ {print $3}'` + echo $VERIFIER_ADDRESS +``` + +7. Stellen Sie den `ZkBank`-Vertrag bereit. + + ```sh + ZKBANK_ADDRESS=`forge create ZkBank --private-key $ETH_PRIVATE_KEY --broadcast --constructor-args $VERIFIER_ADDRESS 0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b | awk '/Deployed to:/ {print $3}'` + echo $ZKBANK_ADDRESS +``` + + Der Wert `0x199..67b` ist der Pederson-Hash des Anfangszustands von `Accounts`. Wenn Sie diesen Anfangszustand in `server/index.mjs` ändern, können Sie eine Transaktion ausführen, um den anfänglichen Hash zu sehen, der vom Zero-Knowledge-Beweis gemeldet wird. + +8. Starten Sie den Server. + + ```sh + cd ../server + npm run start +``` + +9. Führen Sie den Client in einem anderen Befehlszeilenfenster aus. + + ```sh + cd client + npm run dev +``` + +10. Führen Sie einige Transaktionen aus. + +11. Um zu überprüfen, ob sich der Zustand auf der Blockchain geändert hat, starten Sie den Serverprozess neu. Sie werden sehen, dass `ZkBank` keine Transaktionen mehr akzeptiert, da der ursprüngliche Hash-Wert in den Transaktionen von dem auf der Blockchain gespeicherten Hash-Wert abweicht. + + Dies ist die Art von Fehler, die erwartet wird. + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Verification error: ContractFunctionExecutionError: The contract function "processTransaction" reverted with the following reason: + Wrong old state hash + + Contract Call: + address: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 + function: processTransaction(bytes _proof, bytes32[] _publicInputs) + args: (0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf00000000000000000000000000000000000000000000000b75c020998797da7800000000000000000000000000000000000000000000000 +``` + +#### `server/index.mjs` {#server-index-mjs-2} + +Die Änderungen in dieser Datei beziehen sich hauptsächlich auf die Erstellung des eigentlichen Beweises und dessen Einreichung auf der Blockchain. + +```js +import { exec } from 'child_process' +import util from 'util' + +const execPromise = util.promisify(exec) +``` + +Wir müssen [das Barretenberg-Paket](https://github.com/AztecProtocol/aztec-packages/tree/next/barretenberg) verwenden, um den eigentlichen Beweis zu erstellen, der auf der Blockchain gesendet werden soll. Wir können dieses Paket entweder durch Ausführen der Befehlszeilenschnittstelle (`bb`) oder durch Verwendung der [JavaScript-Bibliothek `bb.js`](https://www.npmjs.com/package/@aztec/bb.js) verwenden. Die JavaScript-Bibliothek ist viel langsamer als die native Ausführung von Code, daher verwenden wir hier [`exec`](https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback), um die Befehlszeile zu nutzen. + +Beachten Sie, dass Sie, wenn Sie sich für die Verwendung von `bb.js` entscheiden, eine Version verwenden müssen, die mit der von Ihnen verwendeten Noir-Version kompatibel ist. Zum Zeitpunkt des Schreibens verwendet die aktuelle Noir-Version (1.0.0-beta.11) die `bb.js`-Version 0.87. + +```js +const zkBankAddress = process.env.ZKBANK_ADDRESS || "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" +``` + +Die Adresse hier ist diejenige, die Sie erhalten, wenn Sie mit einem sauberen `anvil` beginnen und den obigen Anweisungen folgen. + +```js +const walletClient = createWalletClient({ + chain: anvil, + transport: http(), + account: privateKeyToAccount("0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") +}) +``` + +Dieser Private-Key gehört zu einem der standardmäßig vorfinanzierten Konten in `anvil`. + +```js +const generateProof = async (witness, fileID) => { +``` + +Generieren Sie einen Beweis mit der ausführbaren Datei `bb`. + +```js + const fname = `witness-${fileID}.gz` + await fs.writeFile(fname, witness) +``` + +Schreiben Sie den Witness in eine Datei. + +```js + await execPromise(`bb prove -b ./noir/target/zkBank.json -w ${fname} -o ${fileID} --oracle_hash keccak --output_format fields`) +``` + +Erstellen Sie den eigentlichen Beweis. Dieser Schritt erstellt auch eine Datei mit den öffentlichen Variablen, aber die benötigen wir nicht. Wir haben diese Variablen bereits von `noir.execute` erhalten. + +```js + const proof = "0x" + JSON.parse(await fs.readFile(`./${fileID}/proof_fields.json`)).reduce((a,b) => a+b, "").replace(/0x/g, "") +``` + +Der Beweis ist ein JSON-Array von `Field`-Werten, die jeweils als Hexadezimalwert dargestellt werden. Wir müssen ihn jedoch in der Transaktion als einzelnen `bytes`-Wert senden, den Viem durch eine große Hexadezimalzeichenfolge darstellt. Hier ändern wir das Format, indem wir alle Werte verketten, alle `0x` entfernen und dann am Ende eines hinzufügen. + +```js + await execPromise(`rm -r ${fname} ${fileID}`) + + return proof +} +``` + +Bereinigen und den Beweis zurückgeben. + +```js +const processMessage = async (message, signature) => { + . + . + . + + const publicFields = noirResult.returnValue.map(x=>'0x' + x.slice(2).padStart(64, "0")) +``` + +Die öffentlichen Felder müssen ein Array von 32-Byte-Werten sein. Da wir jedoch den Transaktions-Hash auf zwei `Field`-Werte aufteilen mussten, erscheint er als 16-Byte-Wert. Hier fügen wir Nullen hinzu, damit Viem versteht, dass es sich tatsächlich um 32 Bytes handelt. + +```js + const proof = await generateProof(noirResult.witness, `${fromAddress}-${nonce}`) +``` + +Jede Adresse verwendet jede Nonce nur einmal, sodass wir eine Kombination aus `fromAddress` und `nonce` als eindeutige Kennung für die Witness-Datei und das Ausgabeverzeichnis verwenden können. + +```js + try { + await zkBank.write.processTransaction([ + proof, publicFields]) + } catch (err) { + console.log(`Verification error: ${err}`) + throw Error("Can't verify the transaction onchain") + } + . + . + . +} +``` + +Senden Sie die Transaktion an die Blockchain. + +#### `smart-contracts/src/ZkBank.sol` {#smart-contracts-src-zkbank-sol} + +Dies ist der Onchain-Code, der die Transaktion empfängt. + +```solidity +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.21; + +import {HonkVerifier} from "./Verifier.sol"; + +contract ZkBank { + HonkVerifier immutable myVerifier; + bytes32 currentStateHash; + + constructor(address _verifierAddress, bytes32 _initialStateHash) { + currentStateHash = _initialStateHash; + myVerifier = HonkVerifier(_verifierAddress); + } +``` + +Der Onchain-Code muss zwei Variablen verfolgen: den Verifizierer (ein separater Vertrag, der von `nargo` erstellt wird) und den aktuellen Zustands-Hash. + +```solidity + event TransactionProcessed( + bytes32 indexed transactionHash, + bytes32 oldStateHash, + bytes32 newStateHash + ); +``` + +Jedes Mal, wenn sich der Zustand ändert, geben wir ein `TransactionProcessed`-Ereignis aus. + +```solidity + function processTransaction( + bytes calldata _proof, + bytes32[] calldata _publicFields + ) public { +``` + +Diese Funktion verarbeitet Transaktionen. Sie erhält den Beweis (als `bytes`) und die öffentlichen Eingaben (als `bytes32`-Array) in dem Format, das der Verifizierer benötigt (um die Onchain-Verarbeitung und damit die Gaskosten zu minimieren). + +```solidity + require(_publicInputs[0] == currentStateHash, + "Wrong old state hash"); +``` + +Der Zero-Knowledge-Beweis muss belegen, dass die Transaktion von unserem aktuellen Hash zu einem neuen wechselt. + +```solidity + myVerifier.verify(_proof, _publicFields); +``` + +Rufen Sie den Verifizierer-Vertrag auf, um den Zero-Knowledge-Beweis zu verifizieren. Dieser Schritt macht die Transaktion rückgängig, wenn der Zero-Knowledge-Beweis falsch ist. + +```solidity + currentStateHash = _publicFields[1]; + + emit TransactionProcessed( + _publicFields[2]<<128 | _publicFields[3], + _publicFields[0], + _publicFields[1] + ); + } +} +``` + +Wenn alles in Ordnung ist, aktualisieren Sie den Zustands-Hash auf den neuen Wert und geben Sie ein `TransactionProcessed`-Ereignis aus. + +## Missbrauch durch die zentralisierte Komponente {#abuses} + +Informationssicherheit besteht aus drei Attributen: + +- _Vertraulichkeit_, Benutzer können keine Informationen lesen, für die sie nicht autorisiert sind. +- _Integrität_, Informationen können nur von autorisierten Benutzern auf autorisierte Weise geändert werden. +- _Verfügbarkeit_, autorisierte Benutzer können das System nutzen. + +In diesem System wird die Integrität durch Zero-Knowledge-Beweise gewährleistet. Die Verfügbarkeit ist viel schwerer zu garantieren, und Vertraulichkeit ist unmöglich, da die Bank den Kontostand jedes Kontos und alle Transaktionen kennen muss. Es gibt keine Möglichkeit, eine Entität, die über Informationen verfügt, daran zu hindern, diese Informationen weiterzugeben. + +Es könnte möglich sein, eine wirklich vertrauliche Bank unter Verwendung von [Stealth-Adressen](https://vitalik.eth.limo/general/2023/01/20/stealth.html) zu erstellen, aber das sprengt den Rahmen dieses Artikels. + +### Falsche Informationen {#false-info} + +Eine Möglichkeit, wie der Server die Integrität verletzen kann, besteht darin, falsche Informationen bereitzustellen, wenn [Daten angefordert werden](https://github.com/qbzzt/250911-zk-bank/blob/03-smart-contracts/server/index.mjs#L278-L291). + +Um dies zu lösen, können wir ein zweites Noir-Programm schreiben, das die Konten als private Eingabe und die Adresse, für die Informationen angefordert werden, als öffentliche Eingabe erhält. Die Ausgabe ist das Guthaben und die Nonce dieser Adresse sowie der Hash der Konten. + +Natürlich kann dieser Beweis nicht auf der Blockchain verifiziert werden, da wir Nonces und Guthaben nicht auf der Blockchain veröffentlichen möchten. Er kann jedoch durch den im Browser ausgeführten Client-Code verifiziert werden. + +### Erzwungene Transaktionen {#forced-txns} + +Der übliche Mechanismus zur Gewährleistung der Verfügbarkeit und zur Verhinderung von Zensur auf L2s sind [erzwungene Transaktionen](https://docs.optimism.io/stack/transactions/forced-transaction). Aber erzwungene Transaktionen lassen sich nicht mit Zero-Knowledge-Beweisen kombinieren. Der Server ist die einzige Entität, die Transaktionen verifizieren kann. + +Wir können `smart-contracts/src/ZkBank.sol` so ändern, dass erzwungene Transaktionen akzeptiert werden und der Server daran gehindert wird, den Zustand zu ändern, bis sie verarbeitet sind. Dies öffnet uns jedoch für einen einfachen Denial-of-Service-Angriff. Was ist, wenn eine erzwungene Transaktion ungültig und daher unmöglich zu verarbeiten ist? + +Die Lösung besteht darin, einen Zero-Knowledge-Beweis dafür zu haben, dass eine erzwungene Transaktion ungültig ist. Dies gibt dem Server drei Optionen: + +- Die erzwungene Transaktion verarbeiten und einen Zero-Knowledge-Beweis dafür liefern, dass sie verarbeitet wurde, sowie den neuen Zustands-Hash. +- Die erzwungene Transaktion ablehnen und dem Vertrag einen Zero-Knowledge-Beweis dafür liefern, dass die Transaktion ungültig ist (unbekannte Adresse, falsche Nonce oder unzureichendes Guthaben). +- Die erzwungene Transaktion ignorieren. Es gibt keine Möglichkeit, den Server zu zwingen, die Transaktion tatsächlich zu verarbeiten, aber das bedeutet, dass das gesamte System nicht verfügbar ist. + +#### Verfügbarkeitskautionen {#avail-bonds} + +In einer realen Implementierung gäbe es wahrscheinlich eine Art Profitmotiv, um den Server am Laufen zu halten. Wir können diesen Anreiz verstärken, indem wir den Server eine Verfügbarkeitskaution hinterlegen lassen, die jeder verbrennen kann, wenn eine erzwungene Transaktion nicht innerhalb eines bestimmten Zeitraums verarbeitet wird. + +### Schlechter Noir-Code {#bad-noir-code} + +Normalerweise laden wir den Quellcode in eine [Blocksuchmaschine](https://eth.blockscout.com/address/0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48b?tab=contract) hoch, um das Vertrauen der Leute in einen Smart Contract zu gewinnen. Im Falle von Zero-Knowledge-Beweisen ist das jedoch unzureichend. + +`Verifier.sol` enthält den Verifizierungsschlüssel, der eine Funktion des Noir-Programms ist. Dieser Schlüssel sagt uns jedoch nicht, was das Noir-Programm war. Um tatsächlich eine vertrauenswürdige Lösung zu haben, müssen Sie das Noir-Programm (und die Version, die es erstellt hat) hochladen. Andernfalls könnten die Zero-Knowledge-Beweise ein anderes Programm widerspiegeln, eines mit einer Hintertür. + +Bis Blocksuchmaschinen es uns ermöglichen, Noir-Programme hochzuladen und zu verifizieren, sollten Sie dies selbst tun (vorzugsweise auf [IPFS](/developers/tutorials/ipfs-decentralized-ui/)). Dann können erfahrene Benutzer den Quellcode herunterladen, ihn selbst kompilieren, `Verifier.sol` erstellen und überprüfen, ob er mit dem auf der Blockchain identisch ist. + +## Fazit {#conclusion} + +Plasma-artige Anwendungen erfordern eine zentralisierte Komponente als Informationsspeicher. Dies eröffnet potenzielle Schwachstellen, ermöglicht es uns aber im Gegenzug, die Privatsphäre auf eine Weise zu wahren, die auf der Blockchain selbst nicht verfügbar ist. Mit Zero-Knowledge-Beweisen können wir die Integrität sicherstellen und es möglicherweise für denjenigen, der die zentralisierte Komponente betreibt, wirtschaftlich vorteilhaft machen, die Verfügbarkeit aufrechtzuerhalten. + +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). + +## Danksagungen {#acknowledgements} + +- Josh Crites hat einen Entwurf dieses Artikels gelesen und mir bei einem kniffligen Noir-Problem geholfen. + +Alle verbleibenden Fehler liegen in meiner Verantwortung. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md b/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md index 9a0043d48cb..63eeba9179d 100644 --- a/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md +++ b/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md @@ -1,14 +1,10 @@ --- -title: Smart Contract aus JavaScript aufrufen -description: So rufen Sie am Beispiel eines Dai-Tokens eine Smart-Contract-Funktion von JavaScript aus auf +title: Einen Smart Contract aus JavaScript aufrufen +description: Wie man eine Smart-Contract-Funktion aus JavaScript am Beispiel eines Dai-Tokens aufruft author: jdourlens -tags: - - "Transaktionen" - - "Frontend" - - "JavaScript" - - "web3.js" +tags: ["Transaktionen", "Frontend", "JavaScript", "web3.js"] skill: beginner -breadcrumb: "Vertragsaufruf aus JS" +breadcrumb: Smart Contracts aus JS aufrufen lang: de published: 2020-04-19 source: EthereumDev @@ -16,15 +12,15 @@ sourceUrl: https://ethereumdev.io/calling-a-smart-contract-from-javascript/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -In diesem Tutorial zeigen wir, wie Sie eine [Smart-Contract](/developers/docs/smart-contracts/)-Funktion von JavaScript aus aufrufen können. Zuerst wird der Zustand eines Smart Contracts ausgelesen (z. B. der Kontostand eines ERC20-Inhabers), dann ändern wir den Zustand der Blockchain, indem wir einen Tokentransfer durchführen. Sie sollten bereits mit dem [Einrichten einer JS-Umgebung zur Interaktion mit der Blockchain](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) vertraut sein. +In diesem Tutorial werden wir sehen, wie man eine [Smart Contract](/developers/docs/smart-contracts/)-Funktion aus JavaScript aufruft. Zuerst lesen wir den Zustand eines Smart Contracts (z. B. das Guthaben eines ERC20-Inhabers), dann ändern wir den Zustand der Blockchain, indem wir eine Token-Überweisung durchführen. Sie sollten bereits damit vertraut sein, [eine JS-Umgebung für die Interaktion mit der Blockchain einzurichten](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/). -Für dieses Beispiel wird ein DAI-Token verwendet. Zu Testzwecken werden wir die Blockchain mit ganache-cli forken und eine Adresse freischalten, die bereits viele DAI hat: +Für dieses Beispiel werden wir mit dem DAI-Token spielen. Zu Testzwecken werden wir die Blockchain mit ganache-cli forken und eine Adresse entsperren, die bereits über viele DAI verfügt: ```bash ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81 ``` -Für die Interaktoin mit einem Smart Contract benötigen wir seine Adresse und ABI: +Um mit einem Smart Contract zu interagieren, benötigen wir dessen Adresse und ABI: ```js const ERC20TransferABI = [ @@ -75,9 +71,9 @@ const ERC20TransferABI = [ const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f" ``` -Für dieses Projekt haben wir die komplette ERC20 ABI gestrippt, um nur die `balanceOf`- und `transfer`-Funktion zu behalten. Sie können [die komplette ERC20 ABI allerdings hier finden](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/). +Für dieses Projekt haben wir die komplette ERC20-ABI auf die Funktionen `balanceOf` und `transfer` reduziert, aber Sie können [die vollständige ERC20-ABI hier finden](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/). -Anschließend müssen wir unseren Smart Contract starten: +Anschließend müssen wir unseren Smart Contract instanziieren: ```js const web3 = new Web3("http://localhost:8545") @@ -85,23 +81,23 @@ const web3 = new Web3("http://localhost:8545") const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS) ``` -Außerdem richten wir zwei Adressen ein: +Wir werden auch zwei Adressen einrichten: -- diejenige, die die Übertragung erhält und -- diejeige, die wir bereits eingerichtet haben, und die die Übertragung senden wird: +- diejenige, die die Überweisung empfängt, und +- diejenige, die wir bereits entsperrt haben und die sie senden wird: ```js const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81" const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" ``` -Im nächsten Teil rufen wir die Funktion `balanceOf` auf, um die aktuelle Menge an Token abzurufen, die beide Adressen enthalten. +Im nächsten Teil rufen wir die Funktion `balanceOf` auf, um die aktuelle Menge an Token abzurufen, die beide Adressen halten. -## Aufruf: Wert aus einem Smart Contract lesen {#call-reading-value-from-a-smart-contract} +## Call: Einen Wert aus einem Smart Contract lesen {#call-reading-value-from-a-smart-contract} -Das erste Beispiel ruft eine "konstante" Methode auf und führt deren Smart-Contract-Methode im EVM aus, ohne eine Transaktion zu senden. Hierfür lesen wir den ERC20-Saldo einer Adresse aus. [Lesen Sie unseren Artikel über ERC20-Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/). +Das erste Beispiel ruft eine „konstante“ Methode auf und führt deren Smart-Contract-Methode in der EVM aus, ohne eine Transaktion zu senden. Dafür lesen wir das ERC20-Guthaben einer Adresse aus. [Lesen Sie unseren Artikel über ERC20-Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/). -Sie können auf die Methoden eines instanziierten Smart Contracts, für den Sie die ABI bereitgestellt haben, wie folgt zugreifen: `yourContract.methods.methodname`. Durch Verwendung der `Aufruf`-Funktion erhalten Sie das Ergebnis der Ausführung der Funktion. +Sie können auf die Methoden eines instanziierten Smart Contracts, für den Sie die ABI bereitgestellt haben, wie folgt zugreifen: `yourContract.methods.methodname`. Durch die Verwendung der Funktion `call` erhalten Sie das Ergebnis der Ausführung der Funktion. ```js daiToken.methods.balanceOf(senderAddress).call(function (err, res) { @@ -113,11 +109,11 @@ daiToken.methods.balanceOf(senderAddress).call(function (err, res) { }) ``` -Denken Sie daran, dass DAI ERC20 18 Dezimalstellen hat. Das bedeutet, dass Sie 18 Nullen entfernen müssen, um den richtigen Betrag zu erhalten. uint256 werden als Strings zurückgegeben, da JavaScript keine großen numerischen Werte verarbeiten kann. Wenn Sie nicht sicher sind, [wie Sie mit großen Zahlen in JS umgehen sollen, lesen Sie unser Tutorial über bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/). +Denken Sie daran, dass DAI ERC20 18 Dezimalstellen hat, was bedeutet, dass Sie 18 Nullen entfernen müssen, um den korrekten Betrag zu erhalten. uint256 werden als Strings zurückgegeben, da JavaScript keine großen numerischen Werte verarbeitet. Wenn Sie sich nicht sicher sind, [wie Sie mit großen Zahlen in JS umgehen sollen, lesen Sie unser Tutorial über bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/). -## Senden: Senden einer Transaktion an eine Smart-Contract-Funktion {#send-sending-a-transaction-to-a-smart-contract-function} +## Send: Eine Transaktion an eine Smart-Contract-Funktion senden {#send-sending-a-transaction-to-a-smart-contract-function} -Für das zweite Beispiel rufen wir die Transferfunktion des DAI-Smart Contracts auf, um 10 DAI an unsere zweite Adresse zu senden. Die Übertragungsfunktion akzeptiert zwei Parameter: die Empfängeradresse und den Betrag des zu übertragenden Tokens: +Für das zweite Beispiel rufen wir die Transfer-Funktion des DAI-Smart-Contracts auf, um 10 DAI an unsere zweite Adresse zu senden. Die Transfer-Funktion akzeptiert zwei Parameter: die Empfängeradresse und die Menge der zu überweisenden Token: ```js daiToken.methods @@ -131,6 +127,6 @@ daiToken.methods }) ``` -Die Aufruffunktion gibt den Hash der Transaktion zurück, der in die Blockchain gemined wird. Bei Ethereum sind Transaktions-Hashes vorhersehbar – so können wir den Hash der Transaktion erhalten, bevor sie ausgeführt wird ([lernen Sie hier, wie Hashes berechnet werden](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)). +Die Call-Funktion gibt den Hash der Transaktion zurück, die in die Blockchain gemint wird. Auf Ethereum sind Transaktions-Hashes vorhersehbar – so können wir den Hash der Transaktion erhalten, bevor sie ausgeführt wird ([erfahren Sie hier, wie Hashes berechnet werden](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)). -Da die Funktion die Transaktion nur an die Blockchain sendet, können wir das Ergebnis erst sehen, wenn es gemined und in die Blockchain aufgenommen wurde. Im nächsten Tutorial werden wir lernen, [wie man auf die Ausführung einer Transaktion auf der Blockchain wartet, indem man ihren Hash kennt](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/). +Da die Funktion die Transaktion nur an die Blockchain übermittelt, können wir das Ergebnis erst sehen, wenn wir wissen, wann sie gemint und in die Blockchain aufgenommen wurde. Im nächsten Tutorial werden wir lernen, [wie man auf die Ausführung einer Transaktion auf der Blockchain wartet, indem man ihren Hash kennt](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md new file mode 100644 index 00000000000..ffe39c852b2 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md @@ -0,0 +1,774 @@ +--- +title: "Erstellen einer Benutzeroberfläche für Ihren Smart Contract" +description: "Unter Verwendung moderner Komponenten wie TypeScript, React, Vite und Wagmi werden wir eine moderne, aber minimalistische Benutzeroberfläche durchgehen und lernen, wie man ein Wallet mit der Benutzeroberfläche verbindet, einen Smart Contract aufruft, um Informationen zu lesen, eine Transaktion an einen Smart Contract sendet und Ereignisse von einem Smart Contract überwacht, um Änderungen zu identifizieren." +author: Ori Pomerantz +tags: ["TypeScript", "React", "Vite", "Wagmi", "frontend"] +skill: beginner +breadcrumb: UI mit WAGMI +published: 2023-11-01 +lang: de +sidebarDepth: 3 +--- + +Sie haben eine Funktion gefunden, die wir im Ethereum-Ökosystem benötigen. Sie haben die Smart Contracts geschrieben, um sie zu implementieren, und vielleicht sogar einigen zugehörigen Code, der Off-Chain ausgeführt wird. Das ist großartig! Leider werden Sie ohne eine Benutzeroberfläche keine Benutzer haben, und das letzte Mal, als Sie eine Website geschrieben haben, benutzten die Leute Einwahlmodems und JavaScript war neu. + +Dieser Artikel ist für Sie. Ich gehe davon aus, dass Sie programmieren können und vielleicht ein bisschen JavaScript und HTML kennen, aber dass Ihre Fähigkeiten im Bereich Benutzeroberflächen eingerostet und veraltet sind. Gemeinsam werden wir eine einfache moderne Anwendung durchgehen, damit Sie sehen, wie das heutzutage gemacht wird. + +## Warum dies wichtig ist {#why-important} + +Theoretisch könnten Sie die Leute einfach [Etherscan](https://sepolia.etherscan.io/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA#readContract) oder [Blockscout](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=read_write_contract) verwenden lassen, um mit Ihren Verträgen zu interagieren. Das ist großartig für erfahrene Ethereans. Aber wir versuchen, [einer weiteren Milliarde Menschen](https://blog.ethereum.org/2021/05/07/ethereum-for-the-next-billion) zu dienen. Dies wird ohne eine großartige Benutzererfahrung nicht passieren, und eine freundliche Benutzeroberfläche ist ein großer Teil davon. + +## Greeter-Anwendung {#greeter-app} + +Es gibt viel Theorie darüber, wie moderne UIs funktionieren, und [viele gute Websites](https://react.dev/learn/thinking-in-react), [die das erklären](https://wagmi.sh/core/getting-started). Anstatt die hervorragende Arbeit dieser Websites zu wiederholen, gehe ich davon aus, dass Sie lieber durch Ausprobieren lernen und mit einer Anwendung beginnen, mit der Sie spielen können. Sie brauchen die Theorie trotzdem, um Dinge zu erledigen, und wir werden dazu kommen – wir gehen einfach Quelldatei für Quelldatei durch und besprechen die Dinge, wenn wir auf sie stoßen. + +### Installation {#installation} + +1. Die Anwendung verwendet das [Sepolia](https://sepolia.dev/)-Testnet. Falls erforderlich, [holen Sie sich Sepolia-Test-ETH](/developers/docs/networks/#sepolia) und [fügen Sie Sepolia zu Ihrem Wallet hinzu](https://chainlist.org/chain/11155111). + +2. Klonen Sie das GitHub-Repository und installieren Sie die erforderlichen Pakete. + + ```sh + git clone https://github.com/qbzzt/260301-modern-ui-web3.git + cd 260301-modern-ui-web3 + npm install +``` + +3. Die Anwendung verwendet kostenlose Zugangspunkte, die Leistungseinschränkungen aufweisen. Wenn Sie einen Anbieter für [Blockchain-Knoten als Dienstleistung (Node as a service)](/developers/docs/nodes-and-clients/nodes-as-a-service/) verwenden möchten, ersetzen Sie die URLs in [`src/wagmi.ts`](#wagmi-ts). + +4. Starten Sie die Anwendung. + + ```sh + npm run dev +``` + +5. Navigieren Sie zu der von der Anwendung angezeigten URL. In den meisten Fällen ist das [http://localhost:5173/](http://localhost:5173/). + +6. Sie können den Quellcode des Vertrags, eine modifizierte Version von Hardhats Greeter, [in einer Blocksuchmaschine sehen](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=contract_code). + +### Dateidurchlauf {#file-walk-through} + +#### `index.html` {#index-html} + +Diese Datei ist ein Standard-HTML-Boilerplate, mit Ausnahme dieser Zeile, die die Skriptdatei importiert. + +```html + +``` + +#### `src/main.tsx` {#main-tsx} + +Die Dateierweiterung zeigt an, dass es sich um eine [React-Komponente](https://www.w3schools.com/react/react_components.asp) handelt, die in [TypeScript](https://www.typescriptlang.org/) geschrieben wurde, einer Erweiterung von JavaScript, die [Typprüfung](https://en.wikipedia.org/wiki/Type_system#Type_checking) unterstützt. TypeScript wird zu JavaScript kompiliert, sodass wir es auf der Client-Seite verwenden können. + +Diese Datei wird hauptsächlich für den Fall erklärt, dass Sie interessiert sind. Normalerweise ändern Sie diese Datei nicht, sondern [`src/App.tsx`](#app-tsx) und die Dateien, die sie importiert. + +```tsx +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import React from 'react' +import ReactDOM from 'react-dom/client' +import { WagmiProvider } from 'wagmi' +``` + +Importieren Sie den benötigten Bibliothekscode. + +```tsx +import App from './App.tsx' +``` + +Importieren Sie die React-Komponente, die die Anwendung implementiert (siehe unten). + +```tsx +import { config } from './wagmi.ts' +``` + +Importieren Sie die [wagmi](https://wagmi.sh/)-Konfiguration, die die Blockchain-Konfiguration enthält. + +```tsx +const queryClient = new QueryClient() +``` + +Erstellt eine neue Instanz des Cache-Managers von [React Query](https://tanstack.com/query/latest/docs/framework/react/overview). Dieses Objekt speichert: + +- Zwischengespeicherte RPC-Aufrufe +- Vertragslesevorgänge +- Status des erneuten Abrufens im Hintergrund + +Wir benötigen den Cache-Manager, da wagmi v3 intern React Query verwendet. + +```tsx +ReactDOM.createRoot(document.getElementById('root')!).render( +``` + +Erstellen Sie die React-Stammkomponente. Der Parameter für `render` ist [JSX](https://www.w3schools.com/react/react_jsx.asp), eine Erweiterungssprache, die sowohl HTML als auch JavaScript/TypeScript verwendet. Das Ausrufezeichen hier sagt der TypeScript-Komponente: „Du weißt nicht, dass `document.getElementById('root')` ein gültiger Parameter für `ReactDOM.createRoot` sein wird, aber keine Sorge – ich bin der Entwickler und ich sage dir, dass es so sein wird“. + +```tsx + +``` + +Die Anwendung wird in [eine `React.StrictMode`-Komponente](https://react.dev/reference/react/StrictMode) eingefügt. Diese Komponente weist die React-Bibliothek an, zusätzliche Debugging-Prüfungen einzufügen, was während der Entwicklung nützlich ist. + +```tsx + +``` + +Die Anwendung befindet sich auch in [einer `WagmiProvider`-Komponente](https://wagmi.sh/react/api/WagmiProvider). [Die wagmi-Bibliothek (we are going to make it)](https://wagmi.sh/) verbindet die React-UI-Definitionen mit [der viem-Bibliothek](https://viem.sh/) zum Schreiben einer dezentralisierten Anwendung für Ethereum. + +```tsx + +``` + +Fügen Sie schließlich einen React Query-Anbieter hinzu, damit jede Anwendungskomponente zwischengespeicherte Abfragen verwenden kann. + +```tsx + +``` + +Jetzt können wir die Komponente für die Anwendung haben, die tatsächlich die Benutzeroberfläche implementiert. Das `/>` am Ende der Komponente teilt React mit, dass diese Komponente gemäß dem XML-Standard keine Definitionen in sich hat. + +```tsx + + + , +) +``` + +Natürlich müssen wir die anderen Komponenten schließen. + +#### `src/App.tsx` {#app-tsx} + +```tsx +import { + useConnect, + useConnection, + useDisconnect, + useSwitchChain +} from 'wagmi' + +import { useEffect } from 'react' +import { Greeter } from './Greeter' +``` + +Importieren Sie die benötigten Bibliotheken sowie [die `Greeter`-Komponente](#greeter-tsx). + +```tsx +const SEPOLIA_CHAIN_ID = 11155111 +``` + +Die Sepolia-Chain-ID. + +``` +function App() { +``` + +Dies ist der Standardweg, um eine React-Komponente zu erstellen: Definieren Sie eine Funktion, die aufgerufen wird, wann immer sie gerendert werden muss. Diese Funktion enthält typischerweise TypeScript- oder JavaScript-Code, gefolgt von einer `return`-Anweisung, die den JSX-Code zurückgibt. + +```tsx + const connection = useConnection() +``` + +Verwenden Sie [`useConnection`](https://wagmi.sh/react/api/hooks/useConnection), um Informationen zur aktuellen Verbindung zu erhalten, wie z. B. die Adresse und die `chainId`. + +Konventionsgemäß werden in React Funktionen, die `use...` heißen, als [Hooks](https://www.w3schools.com/react/react_hooks.asp) bezeichnet. Diese Funktionen geben nicht nur Daten an die Komponente zurück; sie stellen auch sicher, dass sie neu gerendert wird (die Komponentenfunktion wird erneut ausgeführt und ihre Ausgabe ersetzt die vorherige im HTML), wenn sich diese Daten ändern. + +```tsx + const { connectors, connect, status, error } = useConnect() +``` + +Verwenden Sie [`useConnect`](https://wagmi.sh/react/api/hooks/useConnect), um Informationen über die Wallet-Verbindung zu erhalten. + +```tsx + const { disconnect } = useDisconnect() +``` + +[Dieser Hook](https://wagmi.sh/react/api/hooks/useDisconnect) gibt uns die Funktion, die Verbindung zum Wallet zu trennen. + +```tsx + const { switchChain } = useSwitchChain() +``` + +[Dieser Hook](https://wagmi.sh/react/api/hooks/useSwitchChain) lässt uns Chains wechseln. + +```tsx + useEffect(() => { +``` + +Der React-Hook [`useEffect`](https://react.dev/reference/react/useEffect) ermöglicht es Ihnen, eine Funktion auszuführen, wann immer sich der Wert einer Variablen ändert, um ein externes System zu synchronisieren. + +```tsx + if (connection.status === 'connected' && + connection.chainId !== SEPOLIA_CHAIN_ID + ) { + switchChain({ chainId: SEPOLIA_CHAIN_ID }) + } +``` + +Wenn wir verbunden sind, aber nicht mit der Sepolia-Blockchain, wechseln Sie zu Sepolia. + +```tsx + }, [connection.status, connection.chainId]) +``` + +Führen Sie die Funktion jedes Mal erneut aus, wenn sich entweder der Verbindungsstatus oder die `chainId` der Verbindung ändert. + +```tsx + return ( + <> +``` + +Das JSX einer React-Komponente _muss_ eine einzelne HTML-Komponente zurückgeben. Wenn wir mehrere Komponenten haben und keinen Container benötigen, um sie alle zu umschließen, verwenden wir eine leere Komponente (`<> ... `), um sie zu einer einzigen Komponente zu kombinieren. + +```tsx +

Connection

+
+ status: {connection.status} +
+ addresses: {JSON.stringify(connection.addresses)} +
+ chainId: {connection.chainId} + +
+``` + +Stellen Sie Informationen über die aktuelle Verbindung bereit. Innerhalb von JSX bedeutet `{}`, dass der Ausdruck als JavaScript ausgewertet wird. + +```tsx + {connection.status === 'connected' && ( +``` + +Die Syntax `{ && }` bedeutet: „Wenn die Bedingung `true` ist, werte zum Wert aus; wenn nicht, werte zu `false` aus“. + +Dies ist der Standardweg, um if-Anweisungen in JSX einzufügen. + +```tsx +
+ +
+``` + +JSX folgt dem XML-Standard, der strenger ist als HTML. Wenn ein Tag kein entsprechendes End-Tag hat, _muss_ es am Ende einen Schrägstrich (`/`) haben, um es zu beenden. + +Hier haben wir zwei solcher Tags, `` (das tatsächlich den HTML-Code enthält, der mit dem Vertrag kommuniziert) und [`
` für eine horizontale Linie](https://www.w3schools.com/tags/tag_hr.asp). + +```tsx + + +
+ )} +``` + +Wenn der Benutzer auf diese Schaltfläche klickt, rufen Sie die Funktion `disconnect` auf. + +```tsx + {connection.status !== 'connected' && ( +``` + +Wenn wir _nicht_ verbunden sind, zeigen Sie die erforderlichen Optionen an, um eine Verbindung zum Wallet herzustellen. + +```tsx +
+

Connect

+ {connectors.map((connector) => ( +``` + +In `connectors` haben wir eine Liste von Konnektoren. Wir verwenden [`map`](https://www.w3schools.com/jsref/jsref_map.asp), um sie in eine Liste von JSX-Schaltflächen zur Anzeige umzuwandeln. + +```tsx + + ))} +``` + +Die Konnektor-Schaltflächen. + +```tsx +
{status}
+
{error?.message}
+ +
+ )} +``` + +Stellen Sie zusätzliche Informationen bereit. Die Ausdruckssyntax `?.` teilt JavaScript mit, dass, wenn die Variable definiert ist, sie zu diesem Feld ausgewertet werden soll. Wenn die Variable nicht definiert ist, wird dieser Ausdruck zu `undefined` ausgewertet. + +Der Ausdruck `error.message` würde, wenn kein Fehler vorliegt, eine Ausnahme auslösen. Die Verwendung von `error?.message` lässt uns dieses Problem vermeiden. + +#### `src/Greeter.tsx` {#greeter-tsx} + +Diese Datei enthält den Großteil der UI-Funktionalität. Sie enthält Definitionen, die sich normalerweise in mehreren Dateien befinden würden, aber da dies ein Tutorial ist, ist das Programm darauf optimiert, beim ersten Mal leicht verständlich zu sein, anstatt auf Leistung oder Wartungsfreundlichkeit. + +```tsx +import { + useState, + useEffect, + } from 'react' +import { useChainId, + useAccount, + useReadContract, + useWriteContract, + useWatchContractEvent, + useSimulateContract + } from 'wagmi' +``` + +Wir verwenden diese Bibliotheksfunktionen. Auch diese werden unten erklärt, wo sie verwendet werden. + +```tsx +import { AddressType } from 'abitype' +``` + +[Die `abitype`-Bibliothek](https://abitype.dev/) stellt uns TypeScript-Definitionen für verschiedene Ethereum-Datentypen zur Verfügung, wie z. B. [`AddressType`](https://abitype.dev/config#addresstype). + +```tsx +let greeterABI = [ + { "type": "function", "name": "greet", ... }, + { "type": "function", "name": "setGreeting", ... }, + { "type": "event", "name": "SetGreeting", ... }, +] as const // greeterABI +``` + +Die ABI für den `Greeter`-Vertrag. +Wenn Sie die Verträge und die Benutzeroberfläche gleichzeitig entwickeln, würden Sie sie normalerweise im selben Repository ablegen und die vom Solidity-Compiler generierte ABI als Datei in Ihrer Anwendung verwenden. Dies ist hier jedoch nicht erforderlich, da der Vertrag bereits entwickelt ist und sich nicht ändern wird. + +Wir verwenden [`as const`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions), um TypeScript mitzuteilen, dass dies eine _echte_ Konstante ist. Normalerweise können Sie in JavaScript bei der Angabe von `const x = {"a": 1}` den Wert in `x` ändern, Sie können ihm nur nichts Neues zuweisen. + +```tsx +type AddressPerBlockchainType = { + [key: number]: AddressType +} +``` + +TypeScript ist streng typisiert. Wir verwenden diese Definition, um die Adresse anzugeben, an der der `Greeter`-Vertrag über verschiedene Chains hinweg bereitgestellt wird. Der Schlüssel ist eine Zahl (die `chainId`), und der Wert ist ein `AddressType` (eine Adresse). + +```tsx +const contractAddrs : AddressPerBlockchainType = { + // Sepolia + 11155111: '0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA' +} +``` + +Die Adresse des Vertrags auf [Sepolia](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=contract). + +##### `Timer`-Komponente {#timer-component} + +Die `Timer`-Komponente zeigt die Anzahl der Sekunden seit einer bestimmten Zeit an. Dies ist für die Benutzerfreundlichkeit wichtig. Wenn Benutzer etwas tun, erwarten sie eine sofortige Reaktion. Bei Blockchains ist dies oft unmöglich, da nichts passiert, bis eine Transaktion in einem Block platziert wird. Eine Lösung besteht darin, anzuzeigen, wie lange es her ist, seit der Benutzer die Aktion ausgeführt hat, damit der Benutzer entscheiden kann, ob die benötigte Zeit angemessen ist. + +```tsx +type TimerProps = { + lastUpdate: Date +} +``` + +Die `Timer`-Komponente nimmt einen Parameter entgegen, `lastUpdate`, der die Zeit der letzten Aktion darstellt. + +```tsx +const Timer = ({ lastUpdate }: TimerProps) => { + const [_, setNow] = useState(new Date()) +``` + +Wir müssen einen Zustand (eine an die Komponente gebundene Variable) haben und ihn aktualisieren, damit die Komponente korrekt funktioniert. Aber wir müssen ihn nie lesen, also machen wir uns nicht die Mühe, eine Variable zu erstellen. + +```tsx + useEffect(() => { + const id = setInterval(() => setNow(new Date()), 1000) + return () => clearInterval(id) + }, []) +``` + +Die Funktion [`setInterval`](https://www.w3schools.com/jsref/met_win_setinterval.asp) ermöglicht es uns, eine Funktion so zu planen, dass sie regelmäßig ausgeführt wird. In diesem Fall jede Sekunde. Die Funktion ruft `setNow` auf, um den Zustand zu aktualisieren, sodass die `Timer`-Komponente neu gerendert wird. Wir verpacken dies in [`useEffect`](https://react.dev/reference/react/useEffect) mit einer leeren Abhängigkeitsliste, damit es nur einmal passiert und nicht jedes Mal, wenn die Komponente gerendert wird. + +```tsx + const secondsSinceUpdate = Math.floor( + (Date.now() - lastUpdate.getTime()) / 1000 + ) + + return ( + {secondsSinceUpdate} seconds ago + ) +} +``` + +Berechnen Sie die Anzahl der Sekunden seit der letzten Aktualisierung und geben Sie sie zurück. + +##### `Greeter`-Komponente {#greeter-component} + +```tsx +const Greeter = () => { +``` + +Schließlich können wir die Komponente definieren. + +```tsx + const chainId = useChainId() + const account = useAccount() +``` + +Informationen über die Chain und das Konto, das wir verwenden, mit freundlicher Unterstützung von [wagmi](https://wagmi.sh/). Da dies ein Hook (`use...`) ist, wird die Komponente neu gerendert, wann immer sich diese Informationen ändern. + +```tsx + const greeterAddr = chainId && contractAddrs[chainId] +``` + +Die Adresse des Greeter-Vertrags, die `undefined` ist, wenn wir keine Chain-Informationen haben oder uns auf einer Chain ohne diesen Vertrag befinden. + +```tsx + const readResults = useReadContract({ + address: greeterAddr, + abi: greeterABI, + functionName: "greet", // Keine Argumente + }) +``` + +[Der `useReadContract`-Hook](https://wagmi.sh/react/api/hooks/useReadContract) ruft die `greet`-Funktion [des Vertrags](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=contract) auf. + +```tsx + const [ currentGreeting, setCurrentGreeting ] = + useState("Please wait while we fetch the greeting from the blockchain...") + const [ newGreeting, setNewGreeting ] = useState("") +``` + +Der [`useState`-Hook](https://www.w3schools.com/react/react_usestate.asp) von React ermöglicht es uns, eine Zustandsvariable anzugeben, deren Wert von einem Rendering der Komponente zum nächsten erhalten bleibt. Der Anfangswert ist der Parameter, in diesem Fall die leere Zeichenfolge. + +Der `useState`-Hook gibt eine Liste mit zwei Werten zurück: + +1. Den aktuellen Wert der Zustandsvariablen. +2. Eine Funktion, um die Zustandsvariable bei Bedarf zu ändern. Da dies ein Hook ist, wird die Komponente bei jedem Aufruf erneut gerendert. + +In diesem Fall verwenden wir eine Zustandsvariable für die neue Begrüßung, die der Benutzer festlegen möchte. + +```tsx + const [ lastSetterAddress, setLastSetterAddress ] = useState("") +``` + +Wenn mehrere Benutzer denselben Vertrag gleichzeitig verwenden, könnten sie die Begrüßungen der anderen überschreiben. Dies würde für die Benutzer so aussehen, als ob die Anwendung nicht richtig funktioniert. Wenn die Anwendung anzeigt, wer die Begrüßung zuletzt festgelegt hat, weiß der Benutzer, dass es jemand anderes war und dass die Anwendung ordnungsgemäß funktioniert. + +```tsx + const [ status, setStatus ] = useState("") + const [ statusTime, setStatusTime ] = useState(new Date()) +``` + +Benutzer sehen gerne, dass ihre Aktionen eine sofortige Wirkung haben. Auf einer Blockchain ist dies jedoch nicht der Fall. Diese Zustandsvariablen ermöglichen es uns, den Benutzern zumindest etwas anzuzeigen, damit sie wissen, dass ihre Aktion im Gange ist. + +```tsx + useEffect(() => { + if (readResults.data) { + setCurrentGreeting(readResults.data) + setStatus("Greeting fetched from blockchain") + } + }, [readResults.data]) +``` + +Wenn `readResults` oben die Daten ändert und sie nicht auf einen falschen Wert (z. B. `undefined`) gesetzt sind, aktualisieren Sie die aktuelle Begrüßung auf die von der Blockchain gelesene. Aktualisieren Sie außerdem den Status. + +```tsx + useWatchContractEvent({ + address: greeterAddr, + abi: greeterABI, + eventName: 'SetGreeting', + chainId, +``` + +Hören Sie auf `SetGreeting`-Ereignisse. + +```tsx + enabled: !!greeterAddr, +``` + +`!!` bedeutet, dass, wenn der Wert `false` ist oder ein Wert, der als falsch ausgewertet wird, wie `undefined`, `0` oder eine leere Zeichenfolge, der Ausdruck insgesamt `false` ist. Für jeden anderen Wert ist er `true`. Es ist eine Möglichkeit, Werte in Boolesche Werte umzuwandeln, denn wenn es keine `greeterAddr` gibt, möchten wir nicht auf Ereignisse hören. + +```tsx + onLogs: logs => { + const greetingFromContract = logs[0].args.greeting + setCurrentGreeting(greetingFromContract) + setLastSetterAddress(logs[0].args.sender) + updateStatus("Greeting updated by event") + }, + }) +``` + +Wenn wir Protokolle sehen (was passiert, wenn wir ein neues Ereignis sehen), bedeutet dies, dass die Begrüßung geändert wurde. In diesem Fall können wir `currentGreeting` und `lastSetterAddress` auf die neuen Werte aktualisieren. Außerdem möchten wir die Statusanzeige aktualisieren. + +```tsx + const updateStatus = (newStatus: string) => { + setStatus(newStatus) + setStatusTime(new Date()) + } +``` + +Wenn wir den Status aktualisieren, möchten wir zwei Dinge tun: + +1. Die Statuszeichenfolge aktualisieren (`status`) +2. Die Zeit der letzten Statusaktualisierung (`statusTime`) auf jetzt aktualisieren. + +```tsx + const greetingChange = (evt) => + setNewGreeting(evt.target.value) +``` + +Dies ist der Event-Handler für Änderungen am Eingabefeld für die neue Begrüßung. Wir könnten den Typ des Parameters `evt` angeben, aber TypeScript ist eine Sprache mit optionaler Typisierung. Da diese Funktion nur einmal in einem HTML-Event-Handler aufgerufen wird, halte ich dies nicht für erforderlich. + +```tsx + const { writeContractAsync } = useWriteContract() +``` + +Die Funktion zum Schreiben in einen Vertrag. Sie ähnelt [`writeContracts`](https://wagmi.sh/core/api/actions/writeContracts#writecontracts), ermöglicht aber bessere Statusaktualisierungen. + +```tsx + const simulation = useSimulateContract({ + address: greeterAddr, + abi: greeterABI, + functionName: 'setGreeting', + args: [newGreeting], + account: account.address + }) +``` + +Dies ist der Prozess zum Einreichen einer Blockchain-Transaktion aus der Perspektive der Anwendung: + +1. Senden Sie die Transaktion an einen Blockchain-Knoten in der Blockchain unter Verwendung von [`eth_estimateGas`](https://docs.alchemy.com/reference/eth-estimategas). +2. Warten Sie auf eine Antwort vom Blockchain-Knoten. +3. Wenn die Antwort empfangen wird, bitten Sie den Benutzer, die Transaktion über das Wallet zu signieren. Dieser Schritt _muss_ erfolgen, nachdem die Antwort des Blockchain-Knotens empfangen wurde, da dem Benutzer vor dem Signieren die Gaskosten der Transaktion angezeigt werden. +4. Warten Sie auf die Genehmigung des Benutzers. +5. Senden Sie die Transaktion erneut, diesmal unter Verwendung von [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction). + +Schritt 2 wird wahrscheinlich eine spürbare Zeit in Anspruch nehmen, in der sich Benutzer möglicherweise fragen, ob ihr Befehl von der Benutzeroberfläche empfangen wurde und warum sie noch nicht aufgefordert werden, die Transaktion zu signieren. Das führt zu einer schlechten Benutzererfahrung (UX). + +Eine Lösung besteht darin, `eth_estimateGas` jedes Mal zu senden, wenn sich ein Parameter ändert. Wenn der Benutzer dann tatsächlich die Transaktion senden möchte (in diesem Fall durch Drücken von **Update greeting**), sind die Gaskosten bekannt und der Benutzer kann die Wallet-Seite sofort sehen. + +```tsx + return ( +``` + +Jetzt können wir endlich das eigentliche HTML erstellen, das zurückgegeben werden soll. + +```tsx + <> +

Greeter

+ {currentGreeting} +``` + +Zeigen Sie die aktuelle Begrüßung an. + +```tsx + {lastSetterAddress && ( +

Last updated by { + lastSetterAddress === account.address ? "you" : lastSetterAddress + }

+ )} +``` + +Wenn wir wissen, wer die Begrüßung zuletzt festgelegt hat, zeigen Sie diese Informationen an. `Greeter` verfolgt diese Informationen nicht, und wir möchten nicht nach `SetGreeting`-Ereignissen in der Vergangenheit suchen, daher erhalten wir sie nur, wenn die Begrüßung geändert wird, während wir ausgeführt werden. + +```tsx +
+ +
+``` + +Dies ist das Eingabetextfeld, in dem der Benutzer eine neue Begrüßung festlegen kann. Jedes Mal, wenn der Benutzer eine Taste drückt, rufen wir `greetingChange` auf, was `setNewGreeting` aufruft. Da `setNewGreeting` von `useState` stammt, wird die `Greeter`-Komponente neu gerendert. Das bedeutet, dass: + +- Wir `value` angeben müssen, um den Wert der neuen Begrüßung beizubehalten, da er sonst auf den Standardwert, die leere Zeichenfolge, zurückgesetzt würde. +- `simulation` ebenfalls jedes Mal aktualisiert wird, wenn sich `newGreeting` ändert, was bedeutet, dass wir eine Simulation mit der korrekten Begrüßung erhalten. Dies könnte relevant sein, da die Gaskosten von der Größe der Aufrufdaten abhängen, die wiederum von der Länge der Zeichenfolge abhängen. + +```tsx + + +``` + +`writeContractAsync` kehrt erst zurück, nachdem die Transaktion tatsächlich gesendet wurde. Dadurch können wir dem Benutzer anzeigen, wie lange die Transaktion darauf gewartet hat, in die Blockchain aufgenommen zu werden. + +```tsx +

Status: {status}

+

Updated

+ + ) +} +``` + +Zeigen Sie den Status an und wie lange es her ist, seit er aktualisiert wurde. + +``` +export {Greeter} +``` + +Exportieren Sie die Komponente. + +#### `src/wagmi.ts` {#wagmi-ts} + +Schließlich befinden sich verschiedene Definitionen im Zusammenhang mit wagmi in `src/wagmi.ts`. Ich werde hier nicht alles erklären, da das meiste davon Boilerplate ist, das Sie wahrscheinlich nicht ändern müssen. + +```ts +import { http, webSocket, createConfig, fallback } from 'wagmi' +import { sepolia } from 'wagmi/chains' +import { injected } from 'wagmi/connectors' + +export const config = createConfig({ + chains: [sepolia], +``` + +Die wagmi-Konfiguration enthält die von dieser Anwendung unterstützten Chains. Sie können die [Liste der verfügbaren Chains](https://wagmi.sh/core/api/chains) einsehen. + +```ts + connectors: [ + injected(), + ], +``` + +[Dieser Konnektor](https://wagmi.sh/core/api/connectors/injected) ermöglicht es uns, mit einem im Browser installierten Wallet zu kommunizieren. + +```ts + transports: { + [sepolia.id]: http() +``` + +Der Standard-HTTP-Endpunkt, der mit Viem geliefert wird, ist gut genug. Wenn wir eine andere URL möchten, können wir `http("https:// hostname ")` oder `webSocket("wss:// hostname ")` verwenden. + +```ts + }, + multiInjectedProviderDiscovery: false, +}) +``` + +## Hinzufügen einer weiteren Blockchain {#add-blockchain} + +Heutzutage gibt es viele [L2-Skalierungslösungen](https://ethereum.org/layer-2/), und Sie möchten vielleicht einige unterstützen, die viem noch nicht unterstützt. Dazu ändern Sie `src/wagmi.ts`. Diese Anweisungen erklären, wie Sie [Optimism Sepolia](https://chainlist.org/chain/11155420) hinzufügen. + +1. Bearbeiten Sie `src/wagmi.ts` + + A. Importieren Sie den Typ `defineChain` aus viem. + + ```ts + import { defineChain } from 'viem' +``` + + B. Fügen Sie die Netzwerkdefinition hinzu. Sie müssen dies für Optimism Sepolia nicht wirklich tun, [es ist bereits in `viem` enthalten](https://github.com/wevm/viem/blob/main/src/chains/definitions/optimismSepolia.ts), aber auf diese Weise lernen Sie, wie Sie eine Blockchain hinzufügen, die nicht in `viem` enthalten ist. + + ```ts + const optimismSepolia = defineChain({ + id: 11_155_420, + name: 'OP Sepolia', + nativeCurrency: { name: 'Sepolia Ether', symbol: 'ETH', decimals: 18 }, + rpcUrls: { + default: { + http: ['https://sepolia.optimism.io'], + webSocket: ['wss://optimism-sepolia.drpc.org'], + }, + }, + blockExplorers: { + default: { + name: 'Blockscout', + url: 'https://optimism-sepolia.blockscout.com', + apiUrl: 'https://optimism-sepolia.blockscout.com/api', + } + }, + }) +``` + + C. Fügen Sie die neue Chain zum Aufruf von `createConfig` hinzu. + + ```ts + export const config = createConfig({ + chains: [sepolia, optimismSepolia], + connectors: [ + injected(), + ], + transports: { + [optimismSepolia.id]: http(), + [sepolia.id]: http() + }, + multiInjectedProviderDiscovery: false, + }) +``` + +2. Bearbeiten Sie `src/App.tsx`, um den automatischen Wechsel zu Sepolia auszukommentieren. Auf einem Produktionssystem würden Sie wahrscheinlich Schaltflächen mit Links zu jeder der von Ihnen unterstützten Blockchains anzeigen. + + ```ts + /* useEffect(() => { + if (connection.status === 'connected' && + connection.chainId !== SEPOLIA_CHAIN_ID + ) { + switchChain({ chainId: SEPOLIA_CHAIN_ID }) + } + }, [connection.status, connection.chainId]) */ + + + + + + + + + +``` + +3. Bearbeiten Sie `src/Greeter.tsx`, um sicherzustellen, dass die Anwendung die Adresse für Ihre Verträge im neuen Netzwerk kennt. + + ```ts + const contractAddrs: AddressPerBlockchainType = { + // Optimism Sepolia + 11155420: "0x4dd85791923E9294E934271522f63875EAe5806f", + + // Sepolia + 11155111: "0x7143d5c190F048C8d19fe325b748b081903E3BF0", + } +``` + +4. In Ihrem Browser. + + A. Navigieren Sie zu [ChainList](https://chainlist.org/chain/11155420?testnets=true) und klicken Sie auf eine der Schaltflächen auf der rechten Seite der Tabelle, um die Chain zu Ihrem Wallet hinzuzufügen. + + B. Klicken Sie in der Anwendung auf **Disconnect** (Trennen) und stellen Sie dann die Verbindung wieder her, um die Blockchain zu wechseln. Es gibt elegantere Möglichkeiten, dies zu handhaben, aber sie würden Änderungen an der Anwendung erfordern. + +## Fazit {#conclusion} + +Natürlich ist es Ihnen nicht wirklich wichtig, eine Benutzeroberfläche für `Greeter` bereitzustellen. Sie möchten eine Benutzeroberfläche für Ihre eigenen Verträge erstellen. Um Ihre eigene Anwendung zu erstellen, führen Sie diese Schritte aus: + +1. Geben Sie an, dass eine wagmi-Anwendung erstellt werden soll. + + ```sh copy + npm create wagmi +``` + +2. Geben Sie `y` ein, um fortzufahren. + +3. Benennen Sie die Anwendung. + +4. Wählen Sie das **React**-Framework aus. + +5. Wählen Sie die **Vite**-Variante aus. + +Gehen Sie nun hin und machen Sie Ihre Verträge für die weite Welt nutzbar. + +[Sehen Sie hier für weitere meiner Arbeiten](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md new file mode 100644 index 00000000000..59f014b2730 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -0,0 +1,96 @@ +--- +title: Bereitstellung deines ersten Smart Contracts +description: "Eine Einführung in die Bereitstellung deines ersten Smart Contracts in einem Ethereum-Testnetzwerk" +author: "jdourlens" +tags: ["Smart Contracts", "Remix", "Solidity", "Bereitstellung"] +skill: beginner +breadcrumb: Ersten Vertrag bereitstellen +lang: de +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Ich nehme an, du bist genauso aufgeregt wie wir, deinen ersten [Smart Contract](/developers/docs/smart-contracts/) auf der Ethereum-Blockchain [bereitzustellen](/developers/docs/smart-contracts/deploying/) und mit ihm zu interagieren. + +Keine Sorge, da es unser erster Smart Contract ist, werden wir ihn in einem [lokalen Testnetzwerk](/developers/docs/networks/) bereitstellen, sodass die Bereitstellung für dich kostenlos ist und du so viel damit herumspielen kannst, wie du möchtest. + +## Unseren Vertrag schreiben {#writing-our-contract} + +Der erste Schritt besteht darin, [Remix zu besuchen](https://remix.ethereum.org/) und eine neue Datei zu erstellen. Füge im oberen linken Teil der Remix-Benutzeroberfläche eine neue Datei hinzu und gib den gewünschten Dateinamen ein. + +![Hinzufügen einer neuen Datei in der Remix-Benutzeroberfläche](./remix.png) + +In die neue Datei fügen wir den folgenden Code ein. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.5.17; + +contract Counter { + + // Öffentliche Variable vom Typ unsigned int, um die Anzahl der Zählungen zu speichern + uint256 public count = 0; + + // Funktion, die unseren Zähler inkrementiert + function increment() public { + count += 1; + } + + // Nicht notwendiger Getter, um den Zählerwert abzurufen + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Wenn du an das Programmieren gewöhnt bist, kannst du leicht erraten, was dieses Programm macht. Hier ist eine zeilenweise Erklärung: + +- Zeile 4: Wir definieren einen Vertrag mit dem Namen `Counter`. +- Zeile 7: Unser Vertrag speichert eine vorzeichenlose Ganzzahl (unsigned integer) namens `count`, die bei 0 beginnt. +- Zeile 10: Die erste Funktion ändert den Zustand des Vertrags und erhöht (`increment()`) unsere Variable `count`. +- Zeile 15: Die zweite Funktion ist nur ein Getter, um den Wert der Variablen `count` außerhalb des Smart Contracts lesen zu können. Beachte, dass dies nicht zwingend erforderlich ist, da wir unsere Variable `count` als öffentlich (public) definiert haben, aber es wird hier als Beispiel gezeigt. + +Das ist alles für unseren ersten einfachen Smart Contract. Wie du vielleicht weißt, sieht er aus wie eine Klasse aus OOP-Sprachen (objektorientierte Programmierung) wie Java oder C++. Es ist nun an der Zeit, mit unserem Vertrag zu spielen. + +## Unseren Vertrag bereitstellen {#deploying-our-contract} + +Da wir unseren allerersten Smart Contract geschrieben haben, werden wir ihn nun auf der Blockchain bereitstellen, um damit spielen zu können. + +[Die Bereitstellung des Smart Contracts auf der Blockchain](/developers/docs/smart-contracts/deploying/) ist eigentlich nur das Senden einer Transaktion, die den Code des kompilierten Smart Contracts enthält, ohne einen Empfänger anzugeben. + +Wir werden zuerst [den Vertrag kompilieren](/developers/docs/smart-contracts/compiling/), indem wir auf das Kompilieren-Symbol auf der linken Seite klicken: + +![Das Kompilieren-Symbol in der Remix-Symbolleiste](./remix-compile-button.png) + +Klicke dann auf die Schaltfläche „Kompilieren“ (Compile): + +![Die Schaltfläche „Kompilieren“ im Remix-Solidity-Compiler](./remix-compile.png) + +Du kannst die Option „Auto compile“ auswählen, damit der Vertrag immer kompiliert wird, wenn du den Inhalt im Texteditor speicherst. + +Navigiere dann zum Bildschirm „Deploy and run transactions“ (Transaktionen bereitstellen und ausführen): + +![Das Bereitstellen-Symbol in der Remix-Symbolleiste](./remix-deploy.png) + +Sobald du dich auf dem Bildschirm „Deploy and run transactions“ befindest, überprüfe noch einmal, ob der Name deines Vertrags angezeigt wird, und klicke auf „Deploy“ (Bereitstellen). Wie du oben auf der Seite sehen kannst, ist die aktuelle Umgebung „JavaScript VM“. Das bedeutet, dass wir unseren Smart Contract auf einer lokalen Test-Blockchain bereitstellen und mit ihm interagieren werden, um schneller und ohne Gebühren testen zu können. + +![Die Schaltfläche „Bereitstellen“ im Remix-Solidity-Compiler](./remix-deploy-button.png) + +Sobald du auf die Schaltfläche „Deploy“ geklickt hast, wird dein Vertrag unten angezeigt. Klicke auf den Pfeil auf der linken Seite, um ihn zu erweitern, damit wir den Inhalt unseres Vertrags sehen können. Dies sind unsere Variable `counter`, unsere Funktion `increment()` und der Getter `getCounter()`. + +Wenn du auf die Schaltfläche `count` oder `getCount` klickst, wird der Inhalt der Variablen `count` des Vertrags abgerufen und angezeigt. Da wir die Funktion `increment` noch nicht aufgerufen haben, sollte 0 angezeigt werden. + +![Die Funktionsschaltfläche im Remix-Solidity-Compiler](./remix-function-button.png) + +Lass uns nun die Funktion `increment` aufrufen, indem wir auf die Schaltfläche klicken. Du wirst sehen, dass unten im Fenster Protokolle (Logs) der durchgeführten Transaktionen erscheinen. Du wirst feststellen, dass die Protokolle anders aussehen, wenn du die Schaltfläche zum Abrufen der Daten drückst, anstatt der Schaltfläche `increment`. Das liegt daran, dass das Lesen von Daten auf der Blockchain keine Transaktionen (Schreiben) oder Gebühren erfordert. Denn nur das Ändern des Zustands der Blockchain erfordert die Durchführung einer Transaktion: + +![Ein Protokoll von Transaktionen](./transaction-log.png) + +Nach dem Drücken der Schaltfläche „increment“, die eine Transaktion zum Aufruf unserer Funktion `increment()` generiert, können wir, wenn wir wieder auf die Schaltflächen „count“ oder „getCount“ klicken, den neu aktualisierten Zustand unseres Smart Contracts lesen, wobei die Variable „count“ größer als 0 ist. + +![Neu aktualisierter Zustand des Smart Contracts](./updated-state.png) + +Im nächsten Tutorial werden wir behandeln, [wie du Ereignisse zu deinen Smart Contracts hinzufügen kannst](/developers/tutorials/logging-events-smart-contracts/). Das Protokollieren von Ereignissen (Logging Events) ist eine bequeme Möglichkeit, deinen Smart Contract zu debuggen und zu verstehen, was beim Aufruf einer Funktion passiert. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md new file mode 100644 index 00000000000..5e1f78435a3 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -0,0 +1,347 @@ +--- +title: Wie man eine Dapp auf einem lokalen Multi-Client-Testnet entwickelt und testet +description: "Dieser Leitfaden führt Sie zunächst durch die Instanziierung und Konfiguration eines lokalen Multi-Client-Ethereum-Testnets, bevor Sie das Testnet verwenden, um eine Dapp bereitzustellen und zu testen." +author: "Tedi Mitiku" +tags: + [ + "Clients", + "Blockchain-Knoten", + "Smart Contracts", + "Zusammensetzbarkeit", + "Konsensebene", + "Ausführungsebene", + "Testen", + ] +skill: intermediate +breadcrumb: Multi-Client-Testnet +lang: de +published: 2023-04-11 +--- + +## Einführung {#introduction} + +Dieser Leitfaden führt Sie durch den Prozess der Instanziierung eines konfigurierbaren lokalen Ethereum-Testnets, der Bereitstellung eines Smart Contracts darauf und der Verwendung des Testnets zur Ausführung von Tests für Ihre Dapp. Dieser Leitfaden richtet sich an Dapp-Entwickler, die ihre Dapps lokal mit verschiedenen Netzwerkkonfigurationen entwickeln und testen möchten, bevor sie sie in einem Live-Testnet oder dem Mainnet bereitstellen. + +In diesem Leitfaden werden Sie: + +- Ein lokales Ethereum-Testnet mit dem [`eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) unter Verwendung von [Kurtosis](https://www.kurtosis.com/) instanziieren, +- Ihre Hardhat-Dapp-Entwicklungsumgebung mit dem lokalen Testnet verbinden, um eine Dapp zu kompilieren, bereitzustellen und zu testen, und +- Das lokale Testnet konfigurieren, einschließlich Parametern wie der Anzahl der Blockchain-Knoten und spezifischen EL/CL-Client-Paarungen, um Entwicklungs- und Test-Workflows für verschiedene Netzwerkkonfigurationen zu ermöglichen. + +### Was ist Kurtosis? {#what-is-kurtosis} + +[Kurtosis](https://www.kurtosis.com/) ist ein zusammensetzbares Build-System, das für die Konfiguration von Multi-Container-Testumgebungen entwickelt wurde. Es ermöglicht Entwicklern insbesondere die Erstellung reproduzierbarer Umgebungen, die eine dynamische Setup-Logik erfordern, wie z. B. Blockchain-Testnets. + +In diesem Leitfaden startet das Kurtosis `eth-network-package` ein lokales Ethereum-Testnet mit Unterstützung für den Ausführungs-Client (EL) [`geth`](https://geth.ethereum.org/) sowie die Konsens-Clients (CL) [`teku`](https://consensys.io/teku), [`lighthouse`](https://lighthouse.sigmaprime.io/) und [`lodestar`](https://lodestar.chainsafe.io/). Dieses Paket dient als konfigurierbare und zusammensetzbare Alternative zu Netzwerken in Frameworks wie Hardhat Network, Ganache und Anvil. Kurtosis bietet Entwicklern mehr Kontrolle und Flexibilität über die von ihnen verwendeten Testnets, was ein Hauptgrund dafür ist, dass die [Ethereum Foundation Kurtosis zum Testen des Merge verwendet hat](https://www.kurtosis.com/blog/testing-the-ethereum-merge) und es weiterhin zum Testen von Netzwerk-Upgrades verwendet. + +## Kurtosis einrichten {#setting-up-kurtosis} + +Bevor Sie fortfahren, stellen Sie sicher, dass Sie Folgendes haben: + +- Die [Docker-Engine installiert und gestartet](https://docs.kurtosis.com/install/#i-install--start-docker) auf Ihrem lokalen Rechner +- Die [Kurtosis-CLI installiert](https://docs.kurtosis.com/install#ii-install-the-cli) (oder auf die neueste Version aktualisiert, falls Sie die CLI bereits installiert haben) +- [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable) und [npx](https://www.npmjs.com/package/npx) installiert (für Ihre Dapp-Umgebung) + +## Ein lokales Ethereum-Testnet instanziieren {#instantiate-testnet} + +Um ein lokales Ethereum-Testnet zu starten, führen Sie Folgendes aus: + +```bash +kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package +``` + +Hinweis: Dieser Befehl benennt Ihr Netzwerk mit dem Flag `--enclave` als „local-eth-testnet“. + +Kurtosis gibt die Schritte aus, die es im Hintergrund ausführt, während es die Anweisungen interpretiert, validiert und dann ausführt. Am Ende sollten Sie eine Ausgabe sehen, die der folgenden ähnelt: + +```bash +INFO[2023-03-16T14:22:54-04:00] ========================================================= +INFO[2023-03-16T14:22:54-04:00] || Created enclave: local-eth-testnet || +INFO[2023-03-16T14:22:54-04:00] ========================================================= +Name: local-eth-testnet +UUID: 221111111111 +Status: RUNNING +Creation Time: Thu, 16 Mar 2023 14:21:41 EDT + +========================================= Files Artifacts ========================================= +UUID Name +111111111111 111111111111-111111111111-111111111111-genesis-data +222222222222 222222222222-222222222222-222222222222-prysm-password +333333333333 333333333333-333333333333-333333333333-geth-prefunded-keys + +========================================== User Services ========================================== +UUID Name Ports Status +444444444444 cl-1-lighthouse-geth http: 4000/tcp -> http://127.0.0.1:64250 RUNNING + metrics: 5054/tcp -> http://127.0.0.1:64251 + tcp-discovery: 9000/tcp -> 127.0.0.1:64252 + udp-discovery: 9000/udp -> 127.0.0.1:64253 +555555555555 el-1-geth-lighthouse engine-rpc: 8551/tcp -> 127.0.0.1:64247 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64248 + tcp-discovery: 30303/tcp -> 127.0.0.1:64249 + udp-discovery: 30303/udp -> 127.0.0.1:64254 + ws: 8546/tcp -> 127.0.0.1:64255 +666666666666 prelaunch-data-generator RUNNING +777777777777 validator-key-generation-cl-1 RUNNING +``` + +Herzlichen Glückwunsch! Sie haben Kurtosis verwendet, um ein lokales Ethereum-Testnet mit einem CL- (`lighthouse`) und EL-Client (`geth`) über Docker zu instanziieren. + +### Überprüfung {#review-instantiate-testnet} + +In diesem Abschnitt haben Sie einen Befehl ausgeführt, der Kurtosis anwies, das [remote auf GitHub gehostete `eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) zu verwenden, um ein lokales Ethereum-Testnet innerhalb einer Kurtosis-[Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/) zu starten. Innerhalb Ihrer Enclave finden Sie sowohl „Dateiartefakte“ (file artifacts) als auch „Benutzerdienste“ (user services). + +Die [Dateiartefakte](https://docs.kurtosis.com/advanced-concepts/files-artifacts/) in Ihrer Enclave umfassen alle Daten, die generiert und verwendet wurden, um die EL- und CL-Clients zu bootstrappen. Die Daten wurden mit dem Dienst `prelaunch-data-generator` erstellt, der aus diesem [Docker-Image](https://github.com/ethpandaops/ethereum-genesis-generator) erstellt wurde. + +Benutzerdienste zeigen alle containerisierten Dienste an, die in Ihrer Enclave ausgeführt werden. Sie werden feststellen, dass ein einzelner Blockchain-Knoten erstellt wurde, der sowohl über einen EL-Client als auch über einen CL-Client verfügt. + +## Verbinden Sie Ihre Dapp-Entwicklungsumgebung mit dem lokalen Ethereum-Testnet {#connect-your-dapp} + +### Einrichten der Dapp-Entwicklungsumgebung {#set-up-dapp-env} + +Da Sie nun über ein laufendes lokales Testnet verfügen, können Sie Ihre Dapp-Entwicklungsumgebung so verbinden, dass sie Ihr lokales Testnet verwendet. In diesem Leitfaden wird das Hardhat-Framework verwendet, um eine Blackjack-Dapp in Ihrem lokalen Testnet bereitzustellen. + +Um Ihre Dapp-Entwicklungsumgebung einzurichten, klonen Sie das Repository, das unsere Beispiel-Dapp enthält, und installieren Sie deren Abhängigkeiten, indem Sie Folgendes ausführen: + +```bash +git clone https://github.com/kurtosis-tech/awesome-kurtosis.git +cd awesome-kurtosis/smart-contract-example +npm install +``` + +Der hier verwendete Ordner [smart-contract-example](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example) enthält das typische Setup für einen Dapp-Entwickler, der das [Hardhat](https://hardhat.org/)-Framework verwendet: + +- [`contracts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/contracts) enthält einige einfache Smart Contracts für eine Blackjack-Dapp +- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts) enthält ein Skript zur Bereitstellung eines Token-Vertrags in Ihrem lokalen Ethereum-Netzwerk +- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test) enthält einen einfachen .js-Test für Ihren Token-Vertrag, um zu bestätigen, dass für jeden Spieler in unserer Blackjack-Dapp 1000 geprägt wurden +- [`hardhat.config.ts`](https://github.com/kurtosis-tech/awesome-kurtosis/blob/main/smart-contract-example/hardhat.config.ts) konfiguriert Ihr Hardhat-Setup + +### Hardhat für die Verwendung des lokalen Testnets konfigurieren {#configure-hardhat} + +Nachdem Ihre Dapp-Entwicklungsumgebung eingerichtet ist, verbinden Sie nun Hardhat, um das mit Kurtosis generierte lokale Ethereum-Testnet zu verwenden. Ersetzen Sie dazu `<$YOUR_PORT>` in der `localnet`-Struktur in Ihrer Konfigurationsdatei `hardhat.config.ts` durch den Port der RPC-URI-Ausgabe eines beliebigen `el-client-`-Dienstes. In diesem Beispielfall wäre der Port `64248`. Ihr Port wird ein anderer sein. + +Beispiel in `hardhat.config.ts`: + +```ts +import { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; + +const config: HardhatUserConfig = { + solidity: "0.8.18", + networks: { + localnet: { + url: "http://127.0.0.1:<$YOUR_PORT>", + }, + }, +}; + +export default config; +``` + +Sobald Sie Ihre Datei speichern, ist Ihre Hardhat-Dapp-Entwicklungsumgebung nun mit Ihrem lokalen Ethereum-Testnet verbunden! Sie können überprüfen, ob Ihr Testnet funktioniert, indem Sie Folgendes ausführen: + +```bash +npx hardhat balances --network localnet +``` + +Die Ausgabe sollte in etwa so aussehen: + +```bash +0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab has balance 10000000000000000000000 +0x123463a4b065722e99115d6c222f267d9cabb524 has balance 10000000000000000000000 +0x2e0d69cdbc64d09d52ac77708f55cd0274065642 has balance 10000000000000000000000 +``` + +Dies bestätigt, dass Hardhat Ihr lokales Testnet verwendet und die vom `eth-network-package` erstellten, im Voraus finanzierten Konten erkennt. + +### Stellen Sie Ihre Dapp lokal bereit und testen Sie sie {#deploy-and-test-dapp} + +Da die Dapp-Entwicklungsumgebung nun vollständig mit dem lokalen Ethereum-Testnet verbunden ist, können Sie Entwicklungs- und Test-Workflows für Ihre Dapp über das lokale Testnet ausführen. + +Um den Smart Contract `ChipToken.sol` für lokales Prototyping und Entwicklung zu kompilieren und bereitzustellen, führen Sie Folgendes aus: + +```bash +npx hardhat run scripts/deploy.ts --network localnet +``` + +Die Ausgabe sollte in etwa so aussehen: + +```bash +Compiled 2 Solidity files successfully +ChipToken deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3 +``` + +Versuchen Sie nun, den Test `simple.js` für Ihre lokale Dapp auszuführen, um zu bestätigen, dass für jeden Spieler in unserer Blackjack-Dapp 1000 geprägt wurden: + +Die Ausgabe sollte in etwa so aussehen: + +```bash +npx hardhat test --network localnet +``` + +Die Ausgabe sollte in etwa so aussehen: + +```bash + ChipToken + ✔ Should mint 1000 tokens for each player (101ms) + + + 1 passing (103ms) +``` + +### Überprüfung {#review-dapp-workflows} + +Zu diesem Zeitpunkt haben Sie nun eine Dapp-Entwicklungsumgebung eingerichtet, sie mit einem von Kurtosis erstellten lokalen Ethereum-Netzwerk verbunden und einen einfachen Test für Ihre Dapp kompiliert, bereitgestellt und ausgeführt. + +Lassen Sie uns nun untersuchen, wie Sie das zugrunde liegende Netzwerk konfigurieren können, um unsere Dapps unter verschiedenen Netzwerkkonfigurationen zu testen. + +## Konfigurieren des lokalen Ethereum-Testnets {#configure-testnet} + +### Ändern der Client-Konfigurationen und der Anzahl der Blockchain-Knoten {#configure-client-config-and-num-nodes} + +Ihr lokales Ethereum-Testnet kann so konfiguriert werden, dass es verschiedene EL- und CL-Client-Paare sowie eine unterschiedliche Anzahl von Blockchain-Knoten verwendet, abhängig vom Szenario und der spezifischen Netzwerkkonfiguration, die Sie entwickeln oder testen möchten. Das bedeutet, dass Sie nach der Einrichtung ein angepasstes lokales Testnet starten und es verwenden können, um dieselben Workflows (Bereitstellung, Tests usw.) unter verschiedenen Netzwerkkonfigurationen auszuführen, um sicherzustellen, dass alles wie erwartet funktioniert. Um mehr über die anderen Parameter zu erfahren, die Sie ändern können, besuchen Sie diesen Link. + +Probieren Sie es aus! Sie können dem `eth-network-package` über eine JSON-Datei verschiedene Konfigurationsoptionen übergeben. Diese JSON-Datei mit Netzwerkparametern enthält die spezifischen Konfigurationen, die Kurtosis zum Einrichten des lokalen Ethereum-Netzwerks verwendet. + +Nehmen Sie die Standardkonfigurationsdatei und bearbeiten Sie sie, um zwei Blockchain-Knoten mit unterschiedlichen EL/CL-Paaren zu starten: + +- Knoten 1 mit `geth`/`lighthouse` +- Knoten 2 mit `geth`/`lodestar` +- Knoten 3 mit `geth`/`teku` + +Diese Konfiguration erstellt ein heterogenes Netzwerk von Ethereum-Knotenimplementierungen zum Testen Ihrer Dapp. Ihre Konfigurationsdatei sollte nun wie folgt aussehen: + +```json +{ + "participants": [ + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lighthouse", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lodestar", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "teku", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null + } + ], + "network_params": { + "preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano waffle brown round aries mita", + "num_validator_keys_per_node": 64, + "network_id": "3151908", + "deposit_contract_address": "0x4242424242424242424242424242424242424242", + "seconds_per_slot": 12, + "slots_per_epoch": 32, + "genesis_delay": 20 + } +} +``` + +Jede `participants`-Struktur ist einem Blockchain-Knoten im Netzwerk zugeordnet, sodass 3 `participants`-Strukturen Kurtosis anweisen, 3 Blockchain-Knoten in Ihrem Netzwerk zu starten. Jede `participants`-Struktur ermöglicht es Ihnen, das EL- und CL-Paar anzugeben, das für diesen spezifischen Knoten verwendet wird. + +Die Struktur `network_params` konfiguriert die Netzwerkeinstellungen, die zum Erstellen der Genesis-Dateien für jeden Knoten verwendet werden, sowie andere Einstellungen wie die Sekunden pro Slot des Netzwerks. + +Speichern Sie Ihre bearbeitete Parameterdatei in einem beliebigen Verzeichnis (im folgenden Beispiel wird sie auf dem Desktop gespeichert) und verwenden Sie sie dann, um Ihr Kurtosis-Paket auszuführen, indem Sie Folgendes eingeben: + +```bash +kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/Desktop/network_params.json)" +``` + +Hinweis: Der Befehl `kurtosis clean -a` wird hier verwendet, um Kurtosis anzuweisen, das alte Testnet und dessen Inhalte zu zerstören, bevor ein neues gestartet wird. + +Auch hier wird Kurtosis eine Weile arbeiten und die einzelnen Schritte ausgeben, die stattfinden. Schließlich sollte die Ausgabe in etwa so aussehen: + +```bash +INFO[2023-03-16T14:44:22-04:00] ========================================================= +INFO[2023-03-16T14:44:22-04:00] || Created enclave: local-eth-testnet || +INFO[2023-03-16T14:44:22-04:00] ========================================================= +Name: local-eth-testnet +UUID: 888888888888 +Status: RUNNING +Creation Time: Thu, 16 Mar 2023 14:42:41 EDT + +========================================= Files Artifacts ========================================= +UUID Name +111111111111 111111111111-111111111111-111111111111-genesis-data +222222222222 222222222222-222222222222-222222222222-prysm-password +333333333333 333333333333-333333333333-333333333333-geth-prefunded-keys + +========================================== User Services ========================================== +UUID Name Ports Status +444444444444 cl-1-lighthouse-geth http: 4000/tcp -> http://127.0.0.1:64306 RUNNING + metrics: 5054/tcp -> http://127.0.0.1:64307 + tcp-discovery: 9000/tcp -> 127.0.0.1:64308 + udp-discovery: 9000/udp -> 127.0.0.1:64309 +555555555555 cl-2-lodestar-geth http: 4000/tcp -> http://127.0.0.1:64316 RUNNING + metrics: 8008/tcp -> http://127.0.0.1:64317 + tcp-discovery: 9000/tcp -> 127.0.0.1:64318 + udp-discovery: 9000/udp -> 127.0.0.1:64319 +666666666666 cl-3-teku-geth http: 4000/tcp -> http://127.0.0.1:64326 RUNNING + metrics: 8008/tcp -> http://127.0.0.1:64327 + tcp-discovery: 9000/tcp -> 127.0.0.1:64328 + udp-discovery: 9000/udp -> 127.0.0.1:64329 +777777777777 el-1-geth-lighthouse engine-rpc: 8551/tcp -> 127.0.0.1:64301 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64302 + tcp-discovery: 30303/tcp -> 127.0.0.1:64303 + udp-discovery: 30303/udp -> 127.0.0.1:64310 + ws: 8546/tcp -> 127.0.0.1:64311 +888888888888 el-2-geth-lodestar engine-rpc: 8551/tcp -> 127.0.0.1:64312 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64313 + tcp-discovery: 30303/tcp -> 127.0.0.1:64314 + udp-discovery: 30303/udp -> 127.0.0.1:64320 + ws: 8546/tcp -> 127.0.0.1:64321 +999999999999 el-3-geth-teku engine-rpc: 8551/tcp -> 127.0.0.1:64322 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64323 + tcp-discovery: 30303/tcp -> 127.0.0.1:64324 + udp-discovery: 30303/udp -> 127.0.0.1:64330 + ws: 8546/tcp -> 127.0.0.1:64331 +000000000000 prelaunch-data-generator RUNNING +121212121212 validator-key-generation-cl-1 RUNNING +232323232323 validator-key-generation-cl-2 RUNNING +343434343434 validator-key-generation-cl-3 RUNNING +``` + +Herzlichen Glückwunsch! Sie haben Ihr lokales Testnet erfolgreich so konfiguriert, dass es 3 Blockchain-Knoten anstelle von 1 hat. Um dieselben Workflows wie zuvor für Ihre Dapp auszuführen (Bereitstellen und Testen), führen Sie dieselben Vorgänge wie zuvor aus, indem Sie `<$YOUR_PORT>` in der `localnet`-Struktur in Ihrer Konfigurationsdatei `hardhat.config.ts` durch den Port der RPC-URI-Ausgabe eines beliebigen `el-client-`-Dienstes in Ihrem neuen lokalen Testnet mit 3 Knoten ersetzen. + +## Fazit {#conclusion} + +Und das war's! Um diesen kurzen Leitfaden zusammenzufassen, haben Sie: + +- Ein lokales Ethereum-Testnet über Docker mit Kurtosis erstellt +- Ihre lokale Dapp-Entwicklungsumgebung mit dem lokalen Ethereum-Netzwerk verbunden +- Eine Dapp bereitgestellt und einen einfachen Test dafür im lokalen Ethereum-Netzwerk ausgeführt +- Das zugrunde liegende Ethereum-Netzwerk so konfiguriert, dass es 3 Blockchain-Knoten hat + +Wir würden uns freuen, von Ihnen zu hören, was für Sie gut gelaufen ist, was verbessert werden könnte, oder Ihre Fragen zu beantworten. Zögern Sie nicht, uns über [GitHub](https://github.com/kurtosis-tech/kurtosis/issues/new/choose) zu kontaktieren oder [uns eine E-Mail zu senden](mailto:feedback@kurtosistech.com)! + +### Weitere Beispiele und Leitfäden {#other-examples-guides} + +Wir empfehlen Ihnen, sich unseren [Schnellstart](https://docs.kurtosis.com/quickstart) (wo Sie eine Postgres-Datenbank und eine API darauf aufbauen) und unsere anderen Beispiele in unserem [awesome-kurtosis-Repository](https://github.com/kurtosis-tech/awesome-kurtosis) anzusehen, wo Sie einige großartige Beispiele finden, einschließlich Paketen für: + +- [Das Starten desselben lokalen Ethereum-Testnets](https://github.com/kurtosis-tech/eth2-package), jedoch mit zusätzlichen verbundenen Diensten wie einem Transaktions-Spammer (zur Simulation von Transaktionen), einem Fork-Monitor und einer verbundenen Grafana- und Prometheus-Instanz +- Die Durchführung eines [Subnetzwerk-Tests](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/ethereum-network-partition-test) für dasselbe lokale Ethereum-Netzwerk \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md new file mode 100644 index 00000000000..0c62771b66a --- /dev/null +++ b/public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -0,0 +1,145 @@ +--- +title: "Smart Contracts verkleinern, um das Größenlimit einzuhalten" +description: "Was können Sie tun, um zu verhindern, dass Ihre Smart Contracts zu groß werden?" +author: Markus Waas +lang: de +tags: ["Solidity", "Smart Contracts", "Speicher"] +skill: intermediate +breadcrumb: Smart Contracts verkleinern +published: 2020-06-26 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/max-contract-size +--- + +## Warum gibt es ein Limit? {#why-is-there-a-limit} + +Am [22. November 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon) führte der Spurious Dragon Hard-Fork [EIP-170](https://eips.ethereum.org/EIPS/eip-170) ein, was ein Größenlimit für Smart Contracts von 24,576 kb hinzufügte. Für Sie als Solidity-Entwickler bedeutet dies, dass Sie, wenn Sie Ihrem Vertrag immer mehr Funktionen hinzufügen, irgendwann das Limit erreichen und bei der Bereitstellung folgenden Fehler sehen werden: + +`Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on Mainnet. Consider enabling the optimizer (with a low "runs" value!), turning off revert strings, or using libraries.` + +Dieses Limit wurde eingeführt, um Denial-of-Service-Angriffe (DOS) zu verhindern. Jeder Aufruf eines Vertrags ist in Bezug auf Gas relativ günstig. Die Auswirkungen eines Vertragsaufrufs für Ethereum-Blockchain-Knoten steigen jedoch überproportional in Abhängigkeit von der Größe des aufgerufenen Vertragscodes (Lesen des Codes von der Festplatte, Vorverarbeitung des Codes, Hinzufügen von Daten zum Merkle-Proof). Wann immer Sie eine solche Situation haben, in der der Angreifer nur wenige Ressourcen benötigt, um anderen viel Arbeit zu bereiten, entsteht das Potenzial für DOS-Angriffe. + +Ursprünglich war dies weniger ein Problem, da ein natürliches Größenlimit für Verträge das Block-Gaslimit ist. Offensichtlich muss ein Vertrag innerhalb einer Transaktion bereitgestellt werden, die den gesamten Bytecode des Vertrags enthält. Wenn Sie nur diese eine Transaktion in einen Block aufnehmen, können Sie das gesamte Gas aufbrauchen, aber es ist nicht unendlich. Seit dem [London-Upgrade](/ethereum-forks/#london) kann das Block-Gaslimit je nach Netzwerknachfrage zwischen 15 und 30 Millionen Einheiten variieren. + +Im Folgenden werden wir uns einige Methoden ansehen, geordnet nach ihren potenziellen Auswirkungen. Stellen Sie sich das wie beim Abnehmen vor. Die beste Strategie für jemanden, um sein Zielgewicht (in unserem Fall 24 kb) zu erreichen, besteht darin, sich zuerst auf die Methoden mit den größten Auswirkungen zu konzentrieren. In den meisten Fällen reicht es aus, die Ernährung umzustellen, aber manchmal braucht man ein bisschen mehr. Dann könnten Sie etwas Sport (mittlere Auswirkung) oder sogar Nahrungsergänzungsmittel (geringe Auswirkung) hinzufügen. + +## Große Auswirkungen {#big-impact} + +### Trennen Sie Ihre Verträge {#separate-your-contracts} + +Dies sollte immer Ihr erster Ansatz sein. Wie können Sie den Vertrag in mehrere kleinere aufteilen? Es zwingt Sie im Allgemeinen dazu, sich eine gute Architektur für Ihre Verträge auszudenken. Kleinere Verträge werden aus Sicht der Lesbarkeit des Codes immer bevorzugt. Fragen Sie sich beim Aufteilen von Verträgen: + +- Welche Funktionen gehören zusammen? Jede Gruppe von Funktionen ist möglicherweise am besten in einem eigenen Vertrag aufgehoben. +- Welche Funktionen erfordern kein Lesen des Vertragszustands oder nur einer bestimmten Teilmenge des Zustands? +- Können Sie Speicher und Funktionalität trennen? + +### Bibliotheken {#libraries} + +Eine einfache Möglichkeit, Funktionscode vom Speicher zu trennen, ist die Verwendung einer [Bibliothek](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). Deklarieren Sie die Bibliotheksfunktionen nicht als intern, da diese während der Kompilierung direkt [zum Vertrag hinzugefügt](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) werden. Wenn Sie jedoch öffentliche Funktionen verwenden, befinden sich diese tatsächlich in einem separaten Bibliotheksvertrag. Erwägen Sie die Verwendung von [using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for), um die Nutzung von Bibliotheken komfortabler zu gestalten. + +### Proxys {#proxies} + +Eine fortgeschrittenere Strategie wäre ein Proxy-System. Bibliotheken verwenden im Hintergrund `DELEGATECALL`, was einfach die Funktion eines anderen Vertrags mit dem Zustand des aufrufenden Vertrags ausführt. Lesen Sie [diesen Blogbeitrag](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2), um mehr über Proxy-Systeme zu erfahren. Sie bieten Ihnen mehr Funktionalität, z. B. ermöglichen sie die Aktualisierbarkeit, fügen aber auch viel Komplexität hinzu. Ich würde sie nicht nur zur Reduzierung der Vertragsgröße hinzufügen, es sei denn, es ist aus irgendeinem Grund Ihre einzige Option. + +## Mittlere Auswirkungen {#medium-impact} + +### Funktionen entfernen {#remove-functions} + +Dies sollte offensichtlich sein. Funktionen vergrößern einen Vertrag erheblich. + +- **Extern**: Oft fügen wir aus Bequemlichkeitsgründen viele View-Funktionen hinzu. Das ist völlig in Ordnung, bis Sie das Größenlimit erreichen. Dann sollten Sie wirklich darüber nachdenken, alle bis auf die absolut wesentlichen zu entfernen. +- **Intern**: Sie können auch interne/private Funktionen entfernen und den Code einfach inline einfügen, solange die Funktion nur einmal aufgerufen wird. + +### Zusätzliche Variablen vermeiden {#avoid-additional-variables} + +```solidity +function get(uint id) returns (address,address) { + MyStruct memory myStruct = myStructs[id]; + return (myStruct.addr1, myStruct.addr2); +} +``` + +```solidity +function get(uint id) returns (address,address) { + return (myStructs[id].addr1, myStructs[id].addr2); +} +``` + +Eine einfache Änderung wie diese macht einen Unterschied von **0,28 kb**. Die Chancen stehen gut, dass Sie viele ähnliche Situationen in Ihren Verträgen finden, und diese können sich wirklich zu erheblichen Mengen summieren. + +### Fehlermeldungen kürzen {#shorten-error-message} + +Lange Revert-Nachrichten und insbesondere viele verschiedene Revert-Nachrichten können den Vertrag aufblähen. Verwenden Sie stattdessen kurze Fehlercodes und decodieren Sie diese in Ihrem Vertrag. Eine lange Nachricht könnte viel kürzer werden: + +```solidity +require(msg.sender == owner, "Only the owner of this contract can call this function"); +``` + +```solidity +require(msg.sender == owner, "OW1"); +``` + +### Benutzerdefinierte Fehler anstelle von Fehlermeldungen verwenden + +Benutzerdefinierte Fehler wurden in [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/) eingeführt. Sie sind eine großartige Möglichkeit, die Größe Ihrer Verträge zu reduzieren, da sie als Selektoren ABI-codiert sind (genau wie Funktionen). + +```solidity +error Unauthorized(); + +if (msg.sender != owner) { + revert Unauthorized(); +} +``` + +### Erwägen Sie einen niedrigen Run-Wert im Optimierer {#consider-a-low-run-value-in-the-optimizer} + +Sie können auch die Optimierer-Einstellungen ändern. Der Standardwert von 200 bedeutet, dass versucht wird, den Bytecode so zu optimieren, als ob eine Funktion 200 Mal aufgerufen wird. Wenn Sie ihn auf 1 ändern, weisen Sie den Optimierer im Grunde an, für den Fall zu optimieren, dass jede Funktion nur einmal ausgeführt wird. Eine für die einmalige Ausführung optimierte Funktion bedeutet, dass sie für die Bereitstellung selbst optimiert ist. Beachten Sie, dass **dies die [Gaskosten](/developers/docs/gas/) für die Ausführung der Funktionen erhöht**, sodass Sie dies möglicherweise nicht tun möchten. + +## Geringe Auswirkungen {#small-impact} + +### Vermeiden Sie die Übergabe von Structs an Funktionen {#avoid-passing-structs-to-functions} + +Wenn Sie den [ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2) verwenden, kann es helfen, keine Structs an eine Funktion zu übergeben. Anstatt den Parameter als Struct zu übergeben, übergeben Sie die erforderlichen Parameter direkt. In diesem Beispiel haben wir weitere **0,1 kb** gespart. + +```solidity +function get(uint id) returns (address,address) { + return _get(myStruct); +} + +function _get(MyStruct memory myStruct) private view returns(address,address) { + return (myStruct.addr1, myStruct.addr2); +} +``` + +```solidity +function get(uint id) returns(address,address) { + return _get(myStructs[id].addr1, myStructs[id].addr2); +} + +function _get(address addr1, address addr2) private view returns(address,address) { + return (addr1, addr2); +} +``` + +### Deklarieren Sie die korrekte Sichtbarkeit für Funktionen und Variablen {#declare-correct-visibility-for-functions-and-variables} + +- Funktionen oder Variablen, die nur von außen aufgerufen werden? Deklarieren Sie sie als `external` anstatt als `public`. +- Funktionen oder Variablen, die nur innerhalb des Vertrags aufgerufen werden? Deklarieren Sie sie als `private` oder `internal` anstatt als `public`. + +### Modifikatoren entfernen {#remove-modifiers} + +Modifikatoren können, insbesondere wenn sie intensiv genutzt werden, erhebliche Auswirkungen auf die Vertragsgröße haben. Erwägen Sie, sie zu entfernen und stattdessen Funktionen zu verwenden. + +```solidity +modifier checkStuff() {} + +function doSomething() checkStuff {} +``` + +```solidity +function checkStuff() private {} + +function doSomething() { checkStuff(); } +``` + +Diese Tipps sollten Ihnen helfen, die Vertragsgröße erheblich zu reduzieren. Noch einmal, ich kann es nicht oft genug betonen: Konzentrieren Sie sich immer darauf, Verträge nach Möglichkeit aufzuteilen, um die größten Auswirkungen zu erzielen. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md new file mode 100644 index 00000000000..5b9f084b47b --- /dev/null +++ b/public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md @@ -0,0 +1,132 @@ +--- +title: "EIP-1271: Signieren und Verifizieren von Smart-Contract-Signaturen" +description: "Ein Überblick über die Erstellung und Verifizierung von Smart-Contract-Signaturen mit EIP-1271. Wir gehen auch die EIP-1271-Implementierung durch, die in Safe (ehemals Gnosis Safe) verwendet wird, um ein konkretes Beispiel für Smart-Contract-Entwickler zu bieten, auf dem sie aufbauen können." +author: Nathan H. Leung +lang: de +tags: ["eip-1271", "Smart Contracts", "Verifizieren", "Signieren"] +skill: intermediate +breadcrumb: EIP-1271-Signaturen +published: 2023-01-12 +--- + +Der [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271)-Standard ermöglicht es Smart Contracts, Signaturen zu verifizieren. + +In diesem Tutorial geben wir einen Überblick über Digitale Signaturen, den Hintergrund von EIP-1271 und die spezifische Implementierung von EIP-1271, die von [Safe](https://safe.global/) (ehemals Gnosis Safe) verwendet wird. Alles in allem kann dies als Ausgangspunkt für die Implementierung von EIP-1271 in Ihren eigenen Verträgen dienen. + +## Was ist eine Signatur? + +In diesem Zusammenhang ist eine Signatur (genauer gesagt eine „Digitale Signatur“) eine Nachricht plus eine Art Beweis, dass die Nachricht von einer bestimmten Person/einem bestimmten Absender/einer bestimmten Adresse stammt. + +Eine Digitale Signatur könnte zum Beispiel so aussehen: + +1. Nachricht: „Ich möchte mich auf dieser Website mit meinem Ethereum-Wallet anmelden.“ +2. Unterzeichner: Meine Adresse lautet `0x000…` +3. Beweis: Hier ist ein Beweis, dass ich, `0x000…`, diese gesamte Nachricht tatsächlich erstellt habe (dies ist normalerweise etwas Kryptografisches). + +Es ist wichtig zu beachten, dass eine Digitale Signatur sowohl eine „Nachricht“ als auch eine „Signatur“ enthält. + +Warum? Wenn Sie mir zum Beispiel einen Vertrag zur Unterschrift geben würden und ich dann die Unterschriftenseite abschneiden und Ihnen nur meine Unterschriften ohne den Rest des Vertrags zurückgeben würde, wäre der Vertrag nicht gültig. + +Genauso bedeutet eine Digitale Signatur ohne eine zugehörige Nachricht nichts! + +## Warum gibt es EIP-1271? + +Um eine Digitale Signatur für die Verwendung auf Ethereum-basierten Blockchains zu erstellen, benötigen Sie im Allgemeinen einen geheimen Private-Key, den niemand sonst kennt. Das macht Ihre Signatur zu Ihrer eigenen (niemand sonst kann ohne Kenntnis des geheimen Schlüssels dieselbe Signatur erstellen). + +Mit Ihrem Ethereum-Konto (d. h. Ihrem extern verwalteten Konto/EOA) ist ein Private-Key verknüpft, und dies ist der Private-Key, der typischerweise verwendet wird, wenn eine Website oder Dapp Sie um eine Signatur bittet (z. B. für „Mit Ethereum anmelden“). + +Eine App kann [eine Signatur verifizieren](https://www.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum), die Sie mit einer Drittanbieter-Bibliothek wie ethers.js erstellen, [ohne Ihren Private-Key zu kennen](https://en.wikipedia.org/wiki/Public-key_cryptography), und sicher sein, dass _Sie_ derjenige waren, der die Signatur erstellt hat. + +> Da EOA-Digitale-Signaturen Public-Key-Kryptografie verwenden, können sie tatsächlich **Off-Chain** generiert und verifiziert werden! So funktioniert die gaslose DAO-Abstimmung – anstatt Stimmen auf der Blockchain einzureichen, können Digitale Signaturen mithilfe kryptografischer Bibliotheken Off-Chain erstellt und verifiziert werden. + +Während EOA-Konten einen Private-Key haben, verfügen Smart-Contract-Konten über keinerlei privaten oder geheimen Schlüssel (daher kann „Mit Ethereum anmelden“ usw. nicht nativ mit Smart-Contract-Konten funktionieren). + +Das Problem, das EIP-1271 lösen möchte: Wie können wir feststellen, ob eine Smart-Contract-Signatur gültig ist, wenn der Smart Contract kein „Geheimnis“ hat, das er in die Signatur integrieren kann? + +## Wie funktioniert EIP-1271? + +Smart Contracts haben keine Private-Keys, die zum Signieren von Nachrichten verwendet werden können. Wie können wir also feststellen, ob eine Signatur authentisch ist? + +Nun, eine Idee ist, dass wir den Smart Contract einfach _fragen_ können, ob eine Signatur authentisch ist! + +Was EIP-1271 tut, ist, diese Idee des „Fragens“ eines Smart Contracts, ob eine bestimmte Signatur gültig ist, zu standardisieren. + +Ein Vertrag, der EIP-1271 implementiert, muss eine Funktion namens `isValidSignature` haben, die eine Nachricht und eine Signatur entgegennimmt. Der Vertrag kann dann eine Validierungslogik ausführen (die Spezifikation schreibt hier nichts Spezifisches vor) und dann einen Wert zurückgeben, der angibt, ob die Signatur gültig ist oder nicht. + +Wenn `isValidSignature` ein gültiges Ergebnis zurückgibt, bedeutet das im Grunde, dass der Vertrag sagt: „Ja, ich genehmige diese Signatur + Nachricht!“ + +### Schnittstelle + +Hier ist die genaue Schnittstelle in der EIP-1271-Spezifikation (wir werden unten über den Parameter `_hash` sprechen, aber betrachten Sie ihn vorerst als die Nachricht, die verifiziert wird): + +```jsx +pragma solidity ^0.5.0; + +contract ERC1271 { + + // bytes4(keccak256("isValidSignature(bytes32,bytes)") + bytes4 constant internal MAGICVALUE = 0x1626ba7e; + + /* * + * @dev Sollte zurückgeben, ob die bereitgestellte Signatur für den bereitgestellten Hash gültig ist + * @param _hash Hash der zu signierenden Daten + * @param _signature Signatur-Byte-Array, das mit _hash verknüpft ist + * + * MUSS den magischen bytes4-Wert 0x1626ba7e zurückgeben, wenn die Funktion erfolgreich ist. + * DARF den Zustand NICHT ändern (Verwendung von STATICCALL für solc < 0.5, view-Modifikator für solc > 0.5) + * MUSS externe Aufrufe zulassen */ + + + + + + + + + + function isValidSignature( + bytes32 _hash, + bytes memory _signature) + public + view + returns (bytes4 magicValue); +} +``` + +## Beispiel für eine EIP-1271-Implementierung: Safe + +Verträge können `isValidSignature` auf viele Arten implementieren – die Spezifikation sagt nur nicht viel über die genaue Implementierung aus. + +Ein bemerkenswerter Vertrag, der EIP-1271 implementiert, ist Safe (ehemals Gnosis Safe). + +Im Code von Safe [ist `isValidSignature` so implementiert](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol), dass Signaturen auf [zwei Arten](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support) erstellt und verifiziert werden können: + +1. Nachrichten auf der Blockchain + 1. Erstellung: Ein Safe-Eigentümer erstellt eine neue Safe-Transaktion, um eine Nachricht zu „signieren“, wobei die Nachricht als Daten in die Transaktion übergeben wird. Sobald genügend Eigentümer die Transaktion signieren, um den Mehrfachsignatur-Schwellenwert zu erreichen, wird die Transaktion übertragen und ausgeführt. In der Transaktion gibt es eine Safe-Funktion namens (`signMessage(bytes calldata _data)`), die die Nachricht zu einer Liste „genehmigter“ Nachrichten hinzufügt. + 2. Verifizierung: Rufen Sie `isValidSignature` im Safe-Vertrag auf und übergeben Sie die zu verifizierende Nachricht als Nachrichtenparameter und [einen leeren Wert für den Signaturparameter](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (d. h. `0x`). Der Safe wird erkennen, dass der Signaturparameter leer ist, und anstatt die Signatur kryptografisch zu verifizieren, wird er wissen, dass er einfach prüfen muss, ob die Nachricht auf der Liste der „genehmigten“ Nachrichten steht. +2. Off-Chain-Nachrichten: + 1. Erstellung: Ein Safe-Eigentümer erstellt eine Nachricht Off-Chain und lässt dann andere Safe-Eigentümer die Nachricht jeweils einzeln signieren, bis genügend Signaturen vorhanden sind, um den Mehrfachsignatur-Genehmigungsschwellenwert zu überschreiten. + 2. Verifizierung: Rufen Sie `isValidSignature` auf. Übergeben Sie im Nachrichtenparameter die zu verifizierende Nachricht. Übergeben Sie im Signaturparameter die einzelnen Signaturen jedes Safe-Eigentümers, alle aneinandergereiht. Der Safe prüft, ob genügend Signaturen vorhanden sind, um den Schwellenwert zu erreichen, **und** ob jede Signatur gültig ist. Wenn dies der Fall ist, wird ein Wert zurückgegeben, der eine erfolgreiche Signaturverifizierung anzeigt. + +## Was genau ist der Parameter `_hash`? Warum nicht die ganze Nachricht übergeben? + +Sie haben vielleicht bemerkt, dass die Funktion `isValidSignature` in der [EIP-1271-Schnittstelle](https://eips.ethereum.org/EIPS/eip-1271) nicht die Nachricht selbst, sondern einen Parameter `_hash` entgegennimmt. Das bedeutet, dass wir anstelle der vollständigen Nachricht beliebiger Länge einen 32-Byte-Hash der Nachricht (im Allgemeinen keccak256) an `isValidSignature` übergeben. + +Jedes Byte an Calldata – d. h. Funktionsparameterdaten, die an eine Smart-Contract-Funktion übergeben werden – [kostet 16 Gas (4 Gas bei einem Null-Byte)](https://eips.ethereum.org/EIPS/eip-2028), sodass dies bei einer langen Nachricht viel Gas sparen kann. + +### Frühere EIP-1271-Spezifikationen + +Es gibt EIP-1271-Spezifikationen in freier Wildbahn, die eine Funktion `isValidSignature` mit einem ersten Parameter vom Typ `bytes` (beliebige Länge anstelle einer festen Länge `bytes32`) und dem Parameternamen `message` haben. Dies ist eine [ältere Version](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) des EIP-1271-Standards. + +## Wie sollte EIP-1271 in meinen eigenen Verträgen implementiert werden? + +Die Spezifikation ist hier sehr offen. Die Safe-Implementierung hat einige gute Ideen: + +- Sie können EOA-Signaturen vom „Eigentümer“ des Vertrags als gültig betrachten. +- Sie könnten eine Liste genehmigter Nachrichten speichern und nur diese als gültig betrachten. + +Letztendlich liegt es an Ihnen als Vertragsentwickler! + +## Fazit + +[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) ist ein vielseitiger Standard, der es Smart Contracts ermöglicht, Signaturen zu verifizieren. Er öffnet die Tür dafür, dass sich Smart Contracts mehr wie EOAs verhalten – zum Beispiel, indem er eine Möglichkeit bietet, dass „Mit Ethereum anmelden“ mit Smart Contracts funktioniert – und er kann auf viele Arten implementiert werden (wobei Safe eine nicht triviale, interessante Implementierung aufweist, die man in Betracht ziehen sollte). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md new file mode 100644 index 00000000000..9d209224abb --- /dev/null +++ b/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -0,0 +1,716 @@ +--- +title: "Vyper ERC-721 Contract Walkthrough" +description: Ryuya Nakamuras ERC-721-Vertrag und wie er funktioniert +author: Ori Pomerantz +lang: de +tags: ["Vyper", "erc-721", "Python"] +skill: beginner +breadcrumb: Vyper ERC-721 +published: 2021-04-01 +--- + +## Einführung {#introduction} + +Der [ERC-721](/developers/docs/standards/tokens/erc-721/)-Standard wird verwendet, um das Eigentum an nicht-fungiblen Token (NFT) zu halten. +[ERC-20](/developers/docs/standards/tokens/erc-20/)-Token verhalten sich wie ein Rohstoff, da es keinen Unterschied zwischen den einzelnen Token gibt. +Im Gegensatz dazu sind ERC-721-Token für Vermögenswerte konzipiert, die ähnlich, aber nicht identisch sind, wie zum Beispiel verschiedene [Katzen-Cartoons](https://www.cryptokitties.co/) oder Eigentumsurkunden für verschiedene Immobilien. + +In diesem Artikel werden wir [Ryuya Nakamuras ERC-721-Vertrag](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) analysieren. +Dieser Smart Contract ist in [Vyper](https://vyper.readthedocs.io/en/latest/index.html) geschrieben, einer Python-ähnlichen Vertragssprache, die so konzipiert ist, dass es schwieriger ist, unsicheren Code zu schreiben, als in Solidity. + +## Der Smart Contract {#contract} + +```python +# @dev Implementierung des ERC-721 Non-Fungible Token Standards. +# @author Ryuya Nakamura (@nrryuya) +# Modifiziert von: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy +``` + +Kommentare in Vyper beginnen, wie in Python, mit einem Raute-Zeichen (`#`) und reichen bis zum Ende der Zeile. Kommentare, die `@` enthalten, werden von [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) verwendet, um menschenlesbare Dokumentation zu erstellen. + +```python +from vyper.interfaces import ERC721 + +implements: ERC721 +``` + +Die ERC-721-Schnittstelle ist in die Sprache Vyper integriert. +[Sie können die Code-Definition hier sehen](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py). +Die Schnittstellendefinition ist in Python und nicht in Vyper geschrieben, da Schnittstellen nicht nur innerhalb der Blockchain verwendet werden, sondern auch, wenn eine Transaktion von einer externen Anwendung an die Blockchain gesendet wird, die möglicherweise in Python geschrieben ist. + +Die erste Zeile importiert die Schnittstelle, und die zweite gibt an, dass wir sie hier implementieren. + +### Die ERC721Receiver-Schnittstelle {#receiver-interface} + +```python +# Schnittstelle für den Vertrag, der von safeTransferFrom() aufgerufen wird +interface ERC721Receiver: + def onERC721Received( +``` + +ERC-721 unterstützt zwei Arten von Übertragungen: + +- `transferFrom`, was es dem Sender ermöglicht, eine beliebige Zieladresse anzugeben, und die Verantwortung für die Übertragung dem Sender auferlegt. Das bedeutet, dass Sie an eine ungültige Adresse übertragen können, in welchem Fall der NFT für immer verloren ist. +- `safeTransferFrom`, was überprüft, ob die Zieladresse ein Smart Contract ist. Wenn ja, fragt der ERC-721-Vertrag den empfangenden Smart Contract, ob er den NFT empfangen möchte. + +Um `safeTransferFrom`-Anfragen zu beantworten, muss ein empfangender Smart Contract `ERC721Receiver` implementieren. + +```python + _operator: address, + _from: address, +``` + +Die `_from`-Adresse ist der aktuelle Eigentümer des Tokens. Die `_operator`-Adresse ist diejenige, die die Übertragung angefordert hat (diese beiden müssen aufgrund von Berechtigungen nicht identisch sein). + +```python + _tokenId: uint256, +``` + +ERC-721-Token-IDs sind 256 Bit groß. Typischerweise werden sie durch das Hashen einer Beschreibung dessen erstellt, was der Token repräsentiert. + +```python + _data: Bytes[1024] +``` + +Die Anfrage kann bis zu 1024 Bytes an Benutzerdaten enthalten. + +```python + ) -> bytes32: view +``` + +Um Fälle zu verhindern, in denen ein Smart Contract versehentlich eine Übertragung akzeptiert, ist der Rückgabewert kein Boolean, sondern 256 Bit mit einem bestimmten Wert. + +Diese Funktion ist eine `view`, was bedeutet, dass sie den Zustand der Blockchain lesen, aber nicht ändern kann. + +### Ereignisse {#events} + +[Ereignisse](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) werden ausgegeben, um Benutzer und Server außerhalb der Blockchain über Vorkommnisse zu informieren. Beachten Sie, dass der Inhalt von Ereignissen für Smart Contracts auf der Blockchain nicht verfügbar ist. + +```python +# @dev Wird ausgelöst, wenn sich der Besitz eines NFT durch einen beliebigen Mechanismus ändert. Dieses Ereignis wird ausgelöst, wenn NFTs +# erstellt (`from` == 0) und zerstört (`to` == 0) werden. Ausnahme: Während der Vertragserstellung kann eine beliebige +# Anzahl von NFTs erstellt und zugewiesen werden, ohne Transfer auszulösen. Zum Zeitpunkt eines jeden +# Transfers wird die genehmigte Adresse für dieses NFT (falls vorhanden) auf keine zurückgesetzt. +# @param _from Sender des NFT (wenn die Adresse die Null-Adresse ist, zeigt dies die Token-Erstellung an). +# @param _to Empfänger des NFT (wenn die Adresse die Null-Adresse ist, zeigt dies die Token-Zerstörung an). +# @param _tokenId Das NFT, das übertragen wurde. +event Transfer: + sender: indexed(address) + receiver: indexed(address) + tokenId: indexed(uint256) +``` + +Dies ist ähnlich dem ERC-20-Transfer-Ereignis, außer dass wir eine `tokenId` anstelle eines Betrags melden. Niemand besitzt die Adresse Null, daher verwenden wir sie konventionsgemäß, um die Erstellung und Zerstörung von Token zu melden. + +```python +# @dev Dies wird ausgelöst, wenn die genehmigte Adresse für ein NFT geändert oder bestätigt wird. Die Null- +# Adresse zeigt an, dass es keine genehmigte Adresse gibt. Wenn ein Transfer-Ereignis ausgelöst wird, zeigt dies auch +# an, dass die genehmigte Adresse für dieses NFT (falls vorhanden) auf keine zurückgesetzt wird. +# @param _owner Besitzer des NFT. +# @param _approved Adresse, die wir genehmigen. +# @param _tokenId NFT, das wir genehmigen. +event Approval: + owner: indexed(address) + approved: indexed(address) + tokenId: indexed(uint256) +``` + +Eine ERC-721-Genehmigung (Approval) ist ähnlich einer ERC-20-Berechtigung (Allowance). Einer bestimmten Adresse wird erlaubt, einen bestimmten Token zu übertragen. Dies bietet einen Mechanismus für Smart Contracts, um zu reagieren, wenn sie einen Token akzeptieren. Smart Contracts können nicht auf Ereignisse lauschen, wenn Sie ihnen also einfach den Token übertragen, „wissen“ sie nichts davon. Auf diese Weise reicht der Eigentümer zuerst eine Genehmigung ein und sendet dann eine Anfrage an den Smart Contract: „Ich habe Ihnen die Übertragung von Token X genehmigt, bitte tun Sie ...“. + +Dies ist eine Designentscheidung, um den ERC-721-Standard dem ERC-20-Standard ähnlich zu machen. Da ERC-721-Token nicht fungibel sind, kann ein Smart Contract auch erkennen, dass er einen bestimmten Token erhalten hat, indem er sich das Eigentum des Tokens ansieht. + +```python +# @dev Dies wird ausgelöst, wenn ein Operator für einen Besitzer aktiviert oder deaktiviert wird. Der Operator kann +# alle NFTs des Besitzers verwalten. +# @param _owner Besitzer des NFT. +# @param _operator Adresse, für die wir Operator-Rechte festlegen. +# @param _approved Status der Operator-Rechte (true, wenn Operator-Rechte vergeben werden, und false, wenn +# widerrufen). +event ApprovalForAll: + owner: indexed(address) + operator: indexed(address) + approved: bool +``` + +Es ist manchmal nützlich, einen _Operator_ zu haben, der alle Token eines Kontos eines bestimmten Typs (die von einem bestimmten Smart Contract verwaltet werden) verwalten kann, ähnlich einer Vollmacht. Zum Beispiel möchte ich vielleicht einem Smart Contract eine solche Vollmacht geben, der überprüft, ob ich ihn seit sechs Monaten nicht kontaktiert habe, und wenn ja, mein Vermögen an meine Erben verteilt (wenn einer von ihnen danach fragt, können Smart Contracts nichts tun, ohne durch eine Transaktion aufgerufen zu werden). Bei ERC-20 können wir einem Vererbungsvertrag einfach eine hohe Berechtigung geben, aber das funktioniert bei ERC-721 nicht, da die Token nicht fungibel sind. Dies ist das Äquivalent. + +Der Wert `approved` sagt uns, ob das Ereignis für eine Genehmigung oder den Widerruf einer Genehmigung steht. + +### Zustandsvariablen {#state-vars} + +Diese Variablen enthalten den aktuellen Zustand der Token: welche verfügbar sind und wem sie gehören. Die meisten davon sind `HashMap`-Objekte, [unidirektionale Zuordnungen, die zwischen zwei Typen existieren](https://vyper.readthedocs.io/en/latest/types.html#mappings). + +```python +# @dev Mapping von der NFT-ID zur Adresse, die sie besitzt. +idToOwner: HashMap[uint256, address] + +# @dev Mapping von der NFT-ID zur genehmigten Adresse. +idToApprovals: HashMap[uint256, address] +``` + +Benutzer- und Smart Contract-Identitäten in Ethereum werden durch 160-Bit-Adressen dargestellt. Diese beiden Variablen ordnen Token-IDs ihren Eigentümern und denjenigen zu, die zu deren Übertragung berechtigt sind (maximal einer für jeden). In Ethereum sind nicht initialisierte Daten immer null, wenn es also keinen Eigentümer oder genehmigten Überträger gibt, ist der Wert für diesen Token null. + +```python +# @dev Mapping von der Besitzer-Adresse zur Anzahl seiner Token. +ownerToNFTokenCount: HashMap[address, uint256] +``` + +Diese Variable enthält die Anzahl der Token für jeden Eigentümer. Es gibt keine Zuordnung von Eigentümern zu Token, daher ist die einzige Möglichkeit, die Token zu identifizieren, die ein bestimmter Eigentümer besitzt, in der Ereignishistorie der Blockchain zurückzublicken und die entsprechenden `Transfer`-Ereignisse zu sehen. Wir können diese Variable verwenden, um zu wissen, wann wir alle NFTs haben und nicht noch weiter in der Zeit zurückblicken müssen. + +Beachten Sie, dass dieser Algorithmus nur für Benutzeroberflächen und externe Server funktioniert. Code, der auf der Blockchain selbst ausgeführt wird, kann keine vergangenen Ereignisse lesen. + +```python +# @dev Mapping von der Besitzer-Adresse zum Mapping der Operator-Adressen. +ownerToOperators: HashMap[address, HashMap[address, bool]] +``` + +Ein Konto kann mehr als einen einzigen Operator haben. Eine einfache `HashMap` reicht nicht aus, um sie zu verfolgen, da jeder Schlüssel zu einem einzigen Wert führt. Stattdessen können Sie `HashMap[address, bool]` als Wert verwenden. Standardmäßig ist der Wert für jede Adresse `False`, was bedeutet, dass sie kein Operator ist. Sie können Werte nach Bedarf auf `True` setzen. + +```python +# @dev Adresse des Prägers, der einen Token prägen kann +minter: address +``` + +Neue Token müssen irgendwie erstellt werden. In diesem Smart Contract gibt es eine einzige Entität, die dies tun darf, den `minter`. Dies dürfte beispielsweise für ein Spiel ausreichend sein. Für andere Zwecke könnte es notwendig sein, eine kompliziertere Geschäftslogik zu erstellen. + +```python +# @dev Mapping der Schnittstellen-ID zu bool, ob sie unterstützt wird oder nicht +supportedInterfaces: HashMap[bytes32, bool] + +# @dev ERC165 Schnittstellen-ID von ERC165 +ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7 + +# @dev ERC165 Schnittstellen-ID von ERC721 +ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd +``` + +[ERC-165](https://eips.ethereum.org/EIPS/eip-165) spezifiziert einen Mechanismus für einen Smart Contract, um offenzulegen, wie Anwendungen mit ihm kommunizieren können und welchen ERCs er entspricht. In diesem Fall entspricht der Smart Contract ERC-165 und ERC-721. + +### Funktionen {#functions} + +Dies sind die Funktionen, die ERC-721 tatsächlich implementieren. + +#### Konstruktor {#constructor} + +```python +@external +def __init__(): +``` + +In Vyper, wie in Python, wird die Konstruktorfunktion `__init__` genannt. + +```python + # @dev Vertrags-Konstruktor. + + + +``` + +In Python und in Vyper können Sie auch einen Kommentar erstellen, indem Sie eine mehrzeilige Zeichenfolge angeben (die mit `"""` beginnt und endet) und diese in keiner Weise verwenden. Diese Kommentare können auch [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) enthalten. + +```python + self.supportedInterfaces[ERC165_INTERFACE_ID] = True + self.supportedInterfaces[ERC721_INTERFACE_ID] = True + self.minter = msg.sender +``` + +Um auf Zustandsvariablen zuzugreifen, verwenden Sie `self.` (wiederum wie in Python). + +#### View-Funktionen {#views} + +Dies sind Funktionen, die den Zustand der Blockchain nicht verändern und daher kostenlos ausgeführt werden können, wenn sie extern aufgerufen werden. Wenn die View-Funktionen von einem Smart Contract aufgerufen werden, müssen sie dennoch auf jedem Blockchain-Knoten ausgeführt werden und kosten daher Gas. + +```python +@view +@external +``` + +Diese Schlüsselwörter vor einer Funktionsdefinition, die mit einem At-Zeichen (`@`) beginnen, werden _Dekorationen_ genannt. Sie geben die Umstände an, unter denen eine Funktion aufgerufen werden kann. + +- `@view` gibt an, dass diese Funktion eine View ist. +- `@external` gibt an, dass diese bestimmte Funktion durch Transaktionen und durch andere Smart Contracts aufgerufen werden kann. + +```python +def supportsInterface(_interfaceID: bytes32) -> bool: +``` + +Im Gegensatz zu Python ist Vyper eine [statisch typisierte Sprache](https://wikipedia.org/wiki/Type_system#Static_type_checking). Sie können keine Variable oder einen Funktionsparameter deklarieren, ohne den [Datentyp](https://vyper.readthedocs.io/en/latest/types.html) zu identifizieren. In diesem Fall ist der Eingabeparameter `bytes32`, ein 256-Bit-Wert (256 Bit ist die native Wortgröße der [Ethereum Virtual Machine](/developers/docs/evm/)). Die Ausgabe ist ein boolescher Wert. Konventionsgemäß beginnen die Namen von Funktionsparametern mit einem Unterstrich (`_`). + +```python + # @dev Die Schnittstellenidentifikation ist in ERC-165 spezifiziert. + @param _interfaceID ID der Schnittstelle + + + + + return self.supportedInterfaces[_interfaceID] +``` + +Gibt den Wert aus der `self.supportedInterfaces`-HashMap zurück, die im Konstruktor (`__init__`) gesetzt wird. + +```python +# ## VIEW-FUNKTIONEN ### +``` + +Dies sind die View-Funktionen, die Informationen über die Token für Benutzer und andere Smart Contracts verfügbar machen. + +```python +@view +@external +def balanceOf(_owner: address) -> uint256: + # @dev Gibt die Anzahl der NFTs zurück, die `_owner` besitzt. + Wirft einen Fehler, wenn `_owner` die Null-Adresse ist. NFTs, die der Null-Adresse zugewiesen sind, gelten als ungültig. + @param _owner Adresse, für die der Kontostand abgefragt werden soll. + + + + + + assert _owner != ZERO_ADDRESS +``` + +Diese Zeile [stellt sicher](https://vyper.readthedocs.io/en/latest/statements.html#assert), dass `_owner` nicht null ist. Wenn doch, liegt ein Fehler vor und die Operation wird rückgängig gemacht. + +```python + return self.ownerToNFTokenCount[_owner] + +@view +@external +def ownerOf(_tokenId: uint256) -> address: + # @dev Gibt die Adresse des Besitzers des NFT zurück. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. + @param _tokenId Der Identifikator für ein NFT. + + + + + + owner: address = self.idToOwner[_tokenId] + # Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist + assert owner != ZERO_ADDRESS + return owner +``` + +In der Ethereum Virtual Machine (EVM) ist jeder Speicher, in dem kein Wert gespeichert ist, null. Wenn es keinen Token bei `_tokenId` gibt, dann ist der Wert von `self.idToOwner[_tokenId]` null. In diesem Fall wird die Funktion rückgängig gemacht. + +```python +@view +@external +def getApproved(_tokenId: uint256) -> address: + # @dev Ruft die genehmigte Adresse für ein einzelnes NFT ab. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. + @param _tokenId ID des NFT, dessen Genehmigung abgefragt werden soll. + + + + + + # Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist + assert self.idToOwner[_tokenId] != ZERO_ADDRESS + return self.idToApprovals[_tokenId] +``` + +Beachten Sie, dass `getApproved` null zurückgeben _kann_. Wenn der Token gültig ist, gibt es `self.idToApprovals[_tokenId]` zurück. Wenn es keinen Genehmigenden gibt, ist dieser Wert null. + +```python +@view +@external +def isApprovedForAll(_owner: address, _operator: address) -> bool: + # @dev Überprüft, ob `_operator` ein genehmigter Operator für `_owner` ist. + @param _owner Die Adresse, die die NFTs besitzt. + @param _operator Die Adresse, die im Namen des Besitzers handelt. + + + + + + return (self.ownerToOperators[_owner])[_operator] +``` + +Diese Funktion überprüft, ob `_operator` berechtigt ist, alle Token von `_owner` in diesem Smart Contract zu verwalten. Da es mehrere Operatoren geben kann, ist dies eine zweistufige HashMap. + +#### Transfer-Hilfsfunktionen {#transfer-helpers} + +Diese Funktionen implementieren Operationen, die Teil der Übertragung oder Verwaltung von Token sind. + +```python + +# ## TRANSFER-FUNKTION-HILFSFUNKTIONEN ### + +@view +@internal +``` + +Diese Dekoration, `@internal`, bedeutet, dass die Funktion nur von anderen Funktionen innerhalb desselben Smart Contracts zugänglich ist. Konventionsgemäß beginnen auch diese Funktionsnamen mit einem Unterstrich (`_`). + +```python +def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: + # @dev Gibt zurück, ob der angegebene Spender eine bestimmte Token-ID übertragen kann + @param spender Adresse des Spenders, der abgefragt werden soll + @param tokenId uint256 ID des zu übertragenden Tokens + @return bool ob der msg.sender für die angegebene Token-ID genehmigt ist, + ein Operator des Besitzers ist oder der Besitzer des Tokens ist + + + + + + + + owner: address = self.idToOwner[_tokenId] + spenderIsOwner: bool = owner == _spender + spenderIsApproved: bool = _spender == self.idToApprovals[_tokenId] + spenderIsApprovedForAll: bool = (self.ownerToOperators[owner])[_spender] + return (spenderIsOwner or spenderIsApproved) or spenderIsApprovedForAll +``` + +Es gibt drei Möglichkeiten, wie einer Adresse erlaubt werden kann, einen Token zu übertragen: + +1. Die Adresse ist der Eigentümer des Tokens +2. Die Adresse ist berechtigt, diesen Token auszugeben +3. Die Adresse ist ein Operator für den Eigentümer des Tokens + +Die obige Funktion kann eine View sein, da sie den Zustand nicht ändert. Um die Betriebskosten zu senken, _sollte_ jede Funktion, die eine View sein _kann_, eine View sein. + +```python +@internal +def _addTokenTo(_to: address, _tokenId: uint256): + # @dev Fügt ein NFT zu einer bestimmten Adresse hinzu + Wirft einen Fehler, wenn `_tokenId` jemandem gehört. + + + + + # Wirft einen Fehler, wenn `_tokenId` jemandem gehört + assert self.idToOwner[_tokenId] == ZERO_ADDRESS + # Besitzer ändern + self.idToOwner[_tokenId] = _to + # Zählungsverfolgung ändern + self.ownerToNFTokenCount[_to] += 1 + + +@internal +def _removeTokenFrom(_from: address, _tokenId: uint256): + # @dev Entfernt ein NFT von einer bestimmten Adresse + Wirft einen Fehler, wenn `_from` nicht der aktuelle Besitzer ist. + + + + + # Wirft einen Fehler, wenn `_from` nicht der aktuelle Besitzer ist + assert self.idToOwner[_tokenId] == _from + # Besitzer ändern + self.idToOwner[_tokenId] = ZERO_ADDRESS + # Zählungsverfolgung ändern + self.ownerToNFTokenCount[_from] -= 1 +``` + +Wenn es ein Problem mit einer Übertragung gibt, machen wir den Aufruf rückgängig. + +```python +@internal +def _clearApproval(_owner: address, _tokenId: uint256): + # @dev Löscht eine Genehmigung einer bestimmten Adresse + Wirft einen Fehler, wenn `_owner` nicht der aktuelle Besitzer ist. + + + + + # Wirft einen Fehler, wenn `_owner` nicht der aktuelle Besitzer ist + assert self.idToOwner[_tokenId] == _owner + if self.idToApprovals[_tokenId] != ZERO_ADDRESS: + # Genehmigungen zurücksetzen + self.idToApprovals[_tokenId] = ZERO_ADDRESS +``` + +Ändern Sie den Wert nur, wenn es nötig ist. Zustandsvariablen leben im Speicher. Das Schreiben in den Speicher ist eine der teuersten Operationen, die die EVM (Ethereum Virtual Machine) durchführt (in Bezug auf [Gas](/developers/docs/gas/)). Daher ist es eine gute Idee, dies zu minimieren; selbst das Schreiben des vorhandenen Wertes ist mit hohen Kosten verbunden. + +```python +@internal +def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address): + # @dev Führt den Transfer eines NFT aus. + Wirft einen Fehler, es sei denn, `msg.sender` ist der aktuelle Besitzer, ein autorisierter Operator oder die genehmigte + Adresse für dieses NFT. (HINWEIS: `msg.sender` ist in privaten Funktionen nicht erlaubt, übergeben Sie also `_sender`.) + Wirft einen Fehler, wenn `_to` die Null-Adresse ist. + Wirft einen Fehler, wenn `_from` nicht der aktuelle Besitzer ist. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. + + + + + + + + +``` + +Wir haben diese interne Funktion, weil es zwei Möglichkeiten gibt, Token zu übertragen (regulär und sicher), aber wir wollen nur eine einzige Stelle im Code, an der wir dies tun, um die Überprüfung (Auditing) zu erleichtern. + +```python + # Anforderungen prüfen + assert self._isApprovedOrOwner(_sender, _tokenId) + # Wirft einen Fehler, wenn `_to` die Null-Adresse ist + assert _to != ZERO_ADDRESS + # Genehmigung löschen. Wirft einen Fehler, wenn `_from` nicht der aktuelle Besitzer ist + self._clearApproval(_from, _tokenId) + # NFT entfernen. Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist + self._removeTokenFrom(_from, _tokenId) + # NFT hinzufügen + self._addTokenTo(_to, _tokenId) + # Transfer protokollieren + log Transfer(_from, _to, _tokenId) +``` + +Um ein Ereignis in Vyper auszugeben, verwenden Sie eine `log`-Anweisung ([siehe hier für weitere Details](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)). + +#### Transfer-Funktionen {#transfer-funs} + +```python + +# ## TRANSFER-FUNKTIONEN ### + +@external +def transferFrom(_from: address, _to: address, _tokenId: uint256): + # @dev Wirft einen Fehler, es sei denn, `msg.sender` ist der aktuelle Besitzer, ein autorisierter Operator oder die genehmigte + Adresse für dieses NFT. + Wirft einen Fehler, wenn `_from` nicht der aktuelle Besitzer ist. + Wirft einen Fehler, wenn `_to` die Null-Adresse ist. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. + @notice Der Aufrufer ist dafür verantwortlich zu bestätigen, dass `_to` in der Lage ist, NFTs zu empfangen, da sie sonst + dauerhaft verloren gehen könnten. + @param _from Der aktuelle Besitzer des NFT. + @param _to Der neue Besitzer. + @param _tokenId Das zu übertragende NFT. + + + + + + + + + + + + + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Diese Funktion ermöglicht es Ihnen, an eine beliebige Adresse zu übertragen. Es sei denn, die Adresse ist ein Benutzer oder ein Smart Contract, der weiß, wie man Token überträgt, wird jeder Token, den Sie übertragen, in dieser Adresse stecken bleiben und nutzlos sein. + +```python +@external +def safeTransferFrom( + _from: address, + _to: address, + _tokenId: uint256, + _data: Bytes[1024]=b"" + ): + # @dev Überträgt den Besitz eines NFT von einer Adresse zu einer anderen Adresse. + Wirft einen Fehler, es sei denn, `msg.sender` ist der aktuelle Besitzer, ein autorisierter Operator oder die + genehmigte Adresse für dieses NFT. + Wirft einen Fehler, wenn `_from` nicht der aktuelle Besitzer ist. + Wirft einen Fehler, wenn `_to` die Null-Adresse ist. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. + Wenn `_to` ein Smart Contract ist, ruft es `onERC721Received` auf `_to` auf und wirft einen Fehler, wenn + der Rückgabewert nicht `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` ist. + HINWEIS: bytes4 wird durch bytes32 mit Padding dargestellt + @param _from Der aktuelle Besitzer des NFT. + @param _to Der neue Besitzer. + @param _tokenId Das zu übertragende NFT. + @param _data Zusätzliche Daten ohne spezifiziertes Format, die im Aufruf an `_to` gesendet werden. + + + + + + + + + + + + + + + + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Es ist in Ordnung, die Übertragung zuerst durchzuführen, denn wenn es ein Problem gibt, werden wir ohnehin rückgängig machen, sodass alles, was im Aufruf getan wurde, abgebrochen wird. + +```python + if _to.is_contract: # prüfen, ob `_to` eine Vertragsadresse ist +``` + +Überprüfen Sie zuerst, ob die Adresse ein Smart Contract ist (ob sie Code hat). Wenn nicht, gehen Sie davon aus, dass es sich um eine Benutzeradresse handelt und der Benutzer den Token verwenden oder übertragen kann. Aber lassen Sie sich dadurch nicht in falscher Sicherheit wiegen. Sie können Token verlieren, selbst mit `safeTransferFrom`, wenn Sie sie an eine Adresse übertragen, für die niemand den Private-Key kennt. + +```python + returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) +``` + +Rufen Sie den Ziel-Smart Contract auf, um zu sehen, ob er ERC-721-Token empfangen kann. + +```python + # Wirft einen Fehler, wenn das Transferziel ein Vertrag ist, der 'onERC721Received' nicht implementiert + assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32) +``` + +Wenn das Ziel ein Smart Contract ist, aber einer, der keine ERC-721-Token akzeptiert (oder der beschlossen hat, diese bestimmte Übertragung nicht zu akzeptieren), machen Sie es rückgängig. + +```python +@external +def approve(_approved: address, _tokenId: uint256): + # @dev Legt die genehmigte Adresse für ein NFT fest oder bestätigt sie. Die Null-Adresse zeigt an, dass es keine genehmigte Adresse gibt. + Wirft einen Fehler, es sei denn, `msg.sender` ist der aktuelle NFT-Besitzer oder ein autorisierter Operator des aktuellen Besitzers. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. (HINWEIS: Dies steht nicht im EIP) + Wirft einen Fehler, wenn `_approved` der aktuelle Besitzer ist. (HINWEIS: Dies steht nicht im EIP) + @param _approved Adresse, die für die angegebene NFT-ID genehmigt werden soll. + @param _tokenId ID des Tokens, das genehmigt werden soll. + + + + + + + + + owner: address = self.idToOwner[_tokenId] + # Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist + assert owner != ZERO_ADDRESS + # Wirft einen Fehler, wenn `_approved` der aktuelle Besitzer ist + assert _approved != owner +``` + +Konventionsgemäß ernennen Sie die Null-Adresse und nicht sich selbst, wenn Sie keinen Genehmigenden haben möchten. + +```python + # Anforderungen prüfen + senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender + senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender] + assert (senderIsOwner or senderIsApprovedForAll) +``` + +Um eine Genehmigung festzulegen, können Sie entweder der Eigentümer oder ein vom Eigentümer autorisierter Operator sein. + +```python + # Genehmigung festlegen + self.idToApprovals[_tokenId] = _approved + log Approval(owner, _approved, _tokenId) + + +@external +def setApprovalForAll(_operator: address, _approved: bool): + # @dev Aktiviert oder deaktiviert die Genehmigung für einen Dritten ("Operator"), alle + Vermögenswerte von `msg.sender` zu verwalten. Es löst auch das ApprovalForAll-Ereignis aus. + Wirft einen Fehler, wenn `_operator` der `msg.sender` ist. (HINWEIS: Dies steht nicht im EIP) + @notice Dies funktioniert auch dann, wenn der Sender zu diesem Zeitpunkt keine Token besitzt. + @param _operator Adresse, die zur Menge der autorisierten Operatoren hinzugefügt werden soll. + @param _approved True, wenn der Operator genehmigt ist, false, um die Genehmigung zu widerrufen. + + + + + + + + + # Wirft einen Fehler, wenn `_operator` der `msg.sender` ist + assert _operator != msg.sender + self.ownerToOperators[msg.sender][_operator] = _approved + log ApprovalForAll(msg.sender, _operator, _approved) +``` + +#### Neue Token prägen und bestehende zerstören {#mint-burn} + +Das Konto, das den Smart Contract erstellt hat, ist der `minter`, der Superuser, der berechtigt ist, neue NFTs zu prägen. Es ist ihm jedoch nicht erlaubt, bestehende Token zu verbrennen. Nur der Eigentümer oder eine vom Eigentümer autorisierte Entität kann das tun. + +```python +# ## PRÄGEN & VERBRENNEN FUNKTIONEN ### + +@external +def mint(_to: address, _tokenId: uint256) -> bool: +``` + +Diese Funktion gibt immer `True` zurück, denn wenn die Operation fehlschlägt, wird sie rückgängig gemacht. + +```python + # @dev Funktion zum Prägen von Token + Wirft einen Fehler, wenn `msg.sender` nicht der Präger ist. + Wirft einen Fehler, wenn `_to` die Null-Adresse ist. + Wirft einen Fehler, wenn `_tokenId` jemandem gehört. + @param _to Die Adresse, die die geprägten Token empfangen wird. + @param _tokenId Die Token-ID, die geprägt werden soll. + @return Ein Boolean, der anzeigt, ob die Operation erfolgreich war. + + + + + + + + + + # Wirft einen Fehler, wenn `msg.sender` nicht der Präger ist + assert msg.sender == self.minter +``` + +Nur der Minter (das Konto, das den ERC-721-Vertrag erstellt hat) kann neue Token prägen. Dies kann in Zukunft ein Problem sein, wenn wir die Identität des Minters ändern wollen. In einem Produktions-Smart Contract würden Sie wahrscheinlich eine Funktion wünschen, die es dem Minter ermöglicht, die Minter-Privilegien auf jemand anderen zu übertragen. + +```python + # Wirft einen Fehler, wenn `_to` die Null-Adresse ist + assert _to != ZERO_ADDRESS + # NFT hinzufügen. Wirft einen Fehler, wenn `_tokenId` jemandem gehört + self._addTokenTo(_to, _tokenId) + log Transfer(ZERO_ADDRESS, _to, _tokenId) + return True +``` + +Konventionsgemäß zählt das Prägen neuer Token als Übertragung von der Adresse Null. + +```python + +@external +def burn(_tokenId: uint256): + # @dev Verbrennt ein bestimmtes ERC721-Token. + Wirft einen Fehler, es sei denn, `msg.sender` ist der aktuelle Besitzer, ein autorisierter Operator oder die genehmigte + Adresse für dieses NFT. + Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist. + @param _tokenId uint256 ID des ERC721-Tokens, das verbrannt werden soll. + + + + + + + + # Anforderungen prüfen + assert self._isApprovedOrOwner(msg.sender, _tokenId) + owner: address = self.idToOwner[_tokenId] + # Wirft einen Fehler, wenn `_tokenId` kein gültiges NFT ist + assert owner != ZERO_ADDRESS + self._clearApproval(owner, _tokenId) + self._removeTokenFrom(owner, _tokenId) + log Transfer(owner, ZERO_ADDRESS, _tokenId) +``` + +Jeder, der berechtigt ist, einen Token zu übertragen, darf ihn auch verbrennen. Während ein Verbrennen (Burn) äquivalent zu einer Übertragung an die Adresse Null erscheint, empfängt die Adresse Null den Token nicht tatsächlich. Dies ermöglicht es uns, den gesamten Speicher freizugeben, der für den Token verwendet wurde, was die Gaskosten der Transaktion reduzieren kann. + +## Verwendung dieses Smart Contracts {#using-contract} + +Im Gegensatz zu Solidity verfügt Vyper nicht über Vererbung. Dies ist eine bewusste Designentscheidung, um den Code klarer und damit leichter abzusichern zu machen. Um also Ihren eigenen Vyper ERC-721-Vertrag zu erstellen, nehmen Sie [diesen Smart Contract](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) und modifizieren ihn, um die gewünschte Geschäftslogik zu implementieren. + +## Fazit {#conclusion} + +Zur Wiederholung sind hier einige der wichtigsten Ideen in diesem Smart Contract: + +- Um ERC-721-Token mit einer sicheren Übertragung zu empfangen, müssen Smart Contracts die `ERC721Receiver`-Schnittstelle implementieren. +- Selbst wenn Sie eine sichere Übertragung verwenden, können Token immer noch stecken bleiben, wenn Sie sie an eine Adresse senden, deren Private-Key unbekannt ist. +- Wenn es ein Problem mit einer Operation gibt, ist es eine gute Idee, den Aufruf mit `revert` rückgängig zu machen, anstatt nur einen Fehlerwert zurückzugeben. +- ERC-721-Token existieren, wenn sie einen Eigentümer haben. +- Es gibt drei Möglichkeiten, autorisiert zu sein, einen NFT zu übertragen. Sie können der Eigentümer sein, für einen bestimmten Token genehmigt sein oder ein Operator für alle Token des Eigentümers sein. +- Vergangene Ereignisse sind nur außerhalb der Blockchain sichtbar. Code, der innerhalb der Blockchain ausgeführt wird, kann sie nicht einsehen. + +Gehen Sie nun hin und implementieren Sie sichere Vyper-Smart Contracts. + +[Sehen Sie hier mehr von meiner Arbeit](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md new file mode 100644 index 00000000000..be48124f0f1 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md @@ -0,0 +1,1009 @@ +--- +title: "ERC-20-Vertrag – Schritt-für-Schritt-Anleitung" +description: Was steht im OpenZeppelin ERC-20-Vertrag und warum? +author: Ori Pomerantz +lang: de +tags: ["Solidity", "erc-20"] +skill: beginner +breadcrumb: ERC-20-Walkthrough +published: 2021-03-09 +--- + +## Einführung {#introduction} + +Eine der häufigsten Anwendungen für Ethereum ist die Erstellung eines handelbaren Tokens durch eine Gruppe, gewissermaßen ihre eigene Währung. Diese Token folgen typischerweise einem Standard, dem +[ERC-20](/developers/docs/standards/tokens/erc-20/). Dieser Standard macht es möglich, Werkzeuge wie Liquiditätspools und Wallets zu schreiben, die mit allen ERC-20-Token funktionieren. In diesem Artikel werden wir die +[OpenZeppelin Solidity ERC20-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) sowie die +[Schnittstellendefinition](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) analysieren. + +Dies ist ein kommentierter Quellcode. Wenn Sie ERC-20 implementieren möchten, +[lesen Sie dieses Tutorial](https://docs.openzeppelin.com/contracts/2.x/erc20-supply). + +## Die Schnittstelle {#the-interface} + +Der Zweck eines Standards wie ERC-20 ist es, viele Token-Implementierungen zu ermöglichen, die über Anwendungen hinweg interoperabel sind, wie Wallets und dezentralisierte Börsen. Um das zu erreichen, erstellen wir eine +[Schnittstelle](https://www.geeksforgeeks.org/solidity/solidity-basics-of-interface/). Jeder Code, der den Token-Vertrag nutzen muss, kann dieselben Definitionen in der Schnittstelle verwenden und mit allen Token-Verträgen kompatibel sein, die diese nutzen, sei es ein Wallet wie MetaMask, eine Dapp wie etherscan.io oder ein anderer Vertrag wie ein Liquiditätspool. + +![Illustration der ERC-20-Schnittstelle](erc20_interface.png) + +Wenn Sie ein erfahrener Programmierer sind, erinnern Sie sich wahrscheinlich daran, ähnliche Konstrukte in [Java](https://www.w3schools.com/java/java_interface.asp) +oder sogar in [C-Header-Dateien](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html) gesehen zu haben. + +Dies ist eine Definition der [ERC-20-Schnittstelle](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) +von OpenZeppelin. Es ist eine Übersetzung des [menschenlesbaren Standards](https://eips.ethereum.org/EIPS/eip-20) in Solidity-Code. Natürlich definiert die Schnittstelle selbst nicht, _wie_ etwas zu tun ist. Das wird im Vertragsquellcode weiter unten erklärt. + +  + +```solidity +// SPDX-License-Identifier: MIT +``` + +Solidity-Dateien sollten eine Lizenzkennung enthalten. [Sie können die Liste der Lizenzen hier einsehen](https://spdx.org/licenses/). Wenn Sie eine andere Lizenz benötigen, erklären Sie dies einfach in den Kommentaren. + +  + +```solidity +pragma solidity >=0.6.0 <0.8.0; +``` + +Die Sprache Solidity entwickelt sich immer noch schnell weiter, und neue Versionen sind möglicherweise nicht mit altem Code kompatibel +([siehe hier](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). Daher ist es eine gute Idee, nicht nur eine Mindestversion der Sprache anzugeben, sondern auch eine Höchstversion, die neueste, mit der Sie den Code getestet haben. + +  + +```solidity +/* * + * @dev Schnittstelle des ERC20-Standards, wie im EIP definiert. */ + + + +``` + +Das `@dev` im Kommentar ist Teil des [NatSpec-Formats](https://docs.soliditylang.org/en/develop/natspec-format.html), das verwendet wird, um Dokumentation aus dem Quellcode zu erstellen. + +  + +```solidity +interface IERC20 { +``` + +Konventionsgemäß beginnen Schnittstellennamen mit `I`. + +  + +```solidity + /* * + * @dev Gibt die Menge der existierenden Token zurück. */ + + + + function totalSupply() external view returns (uint256); +``` + +Diese Funktion ist `external`, was bedeutet, dass [sie nur von außerhalb des Vertrags aufgerufen werden kann](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2). +Sie gibt das Gesamtangebot an Token im Vertrag zurück. Dieser Wert wird unter Verwendung des häufigsten Typs in Ethereum zurückgegeben, vorzeichenlose 256 Bits (256 Bits ist die native Wortgröße der Ethereum Virtual Machine). Diese Funktion ist auch eine `view`, was bedeutet, dass sie den Zustand nicht ändert, sodass sie auf einem einzelnen Blockchain-Knoten ausgeführt werden kann, anstatt dass jeder Blockchain-Knoten in der Blockchain sie ausführt. Diese Art von Funktion generiert keine Transaktion und kostet kein [Gas](/developers/docs/gas/). + +**Hinweis:** Theoretisch könnte es so aussehen, als könnte der Ersteller eines Vertrags betrügen, indem er ein kleineres Gesamtangebot als den tatsächlichen Wert zurückgibt, wodurch jeder Token wertvoller erscheint, als er tatsächlich ist. Diese Befürchtung ignoriert jedoch die wahre Natur der Blockchain. Alles, was auf der Blockchain passiert, kann von jedem Blockchain-Knoten verifiziert werden. Um dies zu erreichen, sind der Maschinensprache-Code und der Speicher jedes Vertrags auf jedem Blockchain-Knoten verfügbar. Obwohl Sie nicht verpflichtet sind, den Solidity-Code für Ihren Vertrag zu veröffentlichen, würde Sie niemand ernst nehmen, es sei denn, Sie veröffentlichen den Quellcode und die Version von Solidity, mit der er kompiliert wurde, damit er gegen den von Ihnen bereitgestellten Maschinensprache-Code verifiziert werden kann. +Siehe zum Beispiel [diesen Vertrag](https://eth.blockscout.com/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD?tab=contract). + +  + +```solidity + /* * + * @dev Gibt die Menge der Token zurück, die `account` gehören. */ + + + + function balanceOf(address account) external view returns (uint256); +``` + +Wie der Name schon sagt, gibt `balanceOf` den Kontostand eines Kontos zurück. Ethereum-Konten werden in Solidity mit dem Typ `address` identifiziert, der 160 Bits umfasst. +Sie ist ebenfalls `external` und `view`. + +  + +```solidity + /* * + * @dev Verschiebt `amount` Token vom Konto des Aufrufers zu `recipient`. + * + * Gibt einen booleschen Wert zurück, der angibt, ob die Operation erfolgreich war. + * + * Löst ein {Transfer}-Ereignis aus. */ + + + + + + + + function transfer(address recipient, uint256 amount) external returns (bool); +``` + +Die Funktion `transfer` überträgt Token vom Aufrufer an eine andere Adresse. Dies beinhaltet eine Zustandsänderung, ist also keine `view`. +Wenn ein Benutzer diese Funktion aufruft, erstellt sie eine Transaktion und kostet Gas. Sie gibt auch ein Ereignis, `Transfer`, aus, um jeden auf der Blockchain über das Ereignis zu informieren. + +Die Funktion hat zwei Arten von Ausgaben für zwei verschiedene Arten von Aufrufern: + +- Benutzer, die die Funktion direkt über eine Benutzeroberfläche aufrufen. Typischerweise reicht der Benutzer eine Transaktion ein und wartet nicht auf eine Antwort, was eine unbestimmte Zeit in Anspruch nehmen könnte. Der Benutzer kann sehen, was passiert ist, indem er nach der Transaktionsquittung sucht (die durch den Transaktions-Hash identifiziert wird) oder nach dem Ereignis `Transfer` sucht. +- Andere Verträge, die die Funktion als Teil einer Gesamttransaktion aufrufen. Diese Verträge erhalten das Ergebnis sofort, da sie in derselben Transaktion ausgeführt werden, sodass sie den Rückgabewert der Funktion verwenden können. + +Die gleiche Art von Ausgabe wird von den anderen Funktionen erstellt, die den Zustand des Vertrags ändern. + +  + +Freigaben (Allowances) erlauben es einem Konto, einige Token auszugeben, die einem anderen Eigentümer gehören. +Dies ist zum Beispiel nützlich für Verträge, die als Verkäufer agieren. Verträge können nicht auf Ereignisse überwachen. Wenn also ein Käufer Token direkt an den Verkäufervertrag übertragen würde, wüsste dieser Vertrag nicht, dass er bezahlt wurde. Stattdessen erlaubt der Käufer dem Verkäufervertrag, einen bestimmten Betrag auszugeben, und der Verkäufer überträgt diesen Betrag. +Dies geschieht über eine Funktion, die der Verkäufervertrag aufruft, sodass der Verkäufervertrag wissen kann, ob er erfolgreich war. + +```solidity + /* * + * @dev Gibt die verbleibende Anzahl von Token zurück, die `spender` im Namen von `owner` über {transferFrom} ausgeben darf. Dies ist standardmäßig null. + * + * Dieser Wert ändert sich, wenn {approve} oder {transferFrom} aufgerufen werden. */ + + + + + + + + function allowance(address owner, address spender) external view returns (uint256); +``` + +Die Funktion `allowance` lässt jeden abfragen, wie hoch die Freigabe ist, die eine Adresse (`owner`) einer anderen Adresse (`spender`) zum Ausgeben gewährt. + +  + +```solidity + /* * + * @dev Setzt `amount` als Freibetrag von `spender` über die Token des Aufrufers. + * + * Gibt einen booleschen Wert zurück, der angibt, ob die Operation erfolgreich war. + * + * WICHTIG: Beachten Sie, dass das Ändern eines Freibetrags mit dieser Methode das Risiko birgt, dass jemand durch unglückliche Transaktionsreihenfolge sowohl den alten als auch den neuen Freibetrag nutzen könnte. Eine mögliche Lösung zur Minderung dieser Race Condition besteht darin, den Freibetrag des Ausgebers zuerst auf 0 zu reduzieren und danach den gewünschten Wert festzulegen: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Löst ein {Approval}-Ereignis aus. */ + + + + + + + + + + + + + + + function approve(address spender, uint256 amount) external returns (bool); +``` + +Die Funktion `approve` erstellt eine Freigabe. Stellen Sie sicher, dass Sie die Nachricht darüber lesen, wie sie missbraucht werden kann. In Ethereum kontrollieren Sie die Reihenfolge Ihrer eigenen Transaktionen, aber Sie können nicht die Reihenfolge kontrollieren, in der die Transaktionen anderer Personen ausgeführt werden, es sei denn, Sie reichen Ihre eigene Transaktion erst ein, wenn Sie sehen, dass die Transaktion der anderen Seite stattgefunden hat. + +  + +```solidity + /* * + * @dev Verschiebt `amount` Token von `sender` zu `recipient` unter Verwendung des Freibetragsmechanismus. `amount` wird dann vom Freibetrag des Aufrufers abgezogen. + * + * Gibt einen booleschen Wert zurück, der angibt, ob die Operation erfolgreich war. + * + * Löst ein {Transfer}-Ereignis aus. */ + + + + + + + + + + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); +``` + +Schließlich wird `transferFrom` vom Ausgebenden verwendet, um die Freigabe tatsächlich auszugeben. + +  + +```solidity + + /* * + * @dev Wird ausgelöst, wenn `value` Token von einem Konto (`from`) auf ein anderes (`to`) verschoben werden. + * + * Beachten Sie, dass `value` null sein kann. */ + + + + + + + event Transfer(address indexed from, address indexed to, uint256 value); + + /* * + * @dev Wird ausgelöst, wenn der Freibetrag eines `spender` für einen `owner` durch einen Aufruf von {approve} festgelegt wird. `value` ist der neue Freibetrag. */ + + + + + event Approval(address indexed owner, address indexed spender, uint256 value); +} +``` + +Diese Ereignisse werden ausgegeben, wenn sich der Zustand des ERC-20-Vertrags ändert. + +## Der eigentliche Vertrag {#the-actual-contract} + +Dies ist der eigentliche Vertrag, der den ERC-20-Standard implementiert, +[von hier entnommen](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). +Er ist nicht dazu gedacht, so wie er ist verwendet zu werden, aber Sie können davon +[erben](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm), um ihn zu etwas Brauchbarem zu erweitern. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.8.0; +``` + +  + +### Import-Anweisungen {#import-statements} + +Zusätzlich zu den obigen Schnittstellendefinitionen importiert die Vertragsdefinition zwei weitere Dateien: + +```solidity + +import "../../GSN/Context.sol"; +import "./IERC20.sol"; +import "../../math/SafeMath.sol"; +``` + +- `GSN/Context.sol` sind die Definitionen, die erforderlich sind, um [OpenGSN](https://www.opengsn.org/) zu verwenden, ein System, das es Benutzern ohne Ether ermöglicht, die Blockchain zu nutzen. Beachten Sie, dass dies eine alte Version ist. Wenn Sie OpenGSN integrieren möchten, + [verwenden Sie dieses Tutorial](https://docs.opengsn.org/javascript-client/tutorial.html). +- [Die SafeMath-Bibliothek](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), die arithmetische Überläufe/Unterläufe für Solidity-Versionen **<0.8.0** verhindert. In Solidity ≥0.8.0 werden arithmetische Operationen bei Überlauf/Unterlauf automatisch rückgängig gemacht, was SafeMath überflüssig macht. Dieser Vertrag verwendet SafeMath zur Abwärtskompatibilität mit älteren Compiler-Versionen. + +  + +Dieser Kommentar erklärt den Zweck des Vertrags. + +```solidity +/* * + * @dev Implementierung der {IERC20}-Schnittstelle. + * + * Diese Implementierung ist unabhängig davon, wie Token erstellt werden. Das bedeutet, dass ein Angebotsmechanismus in einem abgeleiteten Vertrag unter Verwendung von {_mint} hinzugefügt werden muss. Für einen generischen Mechanismus siehe {ERC20PresetMinterPauser}. + * + * TIPP: Für eine detaillierte Beschreibung siehe unseren Leitfaden + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * Wir haben die allgemeinen OpenZeppelin-Richtlinien befolgt: Funktionen werden bei einem Fehler rückgängig gemacht (revert), anstatt `false` zurückzugeben. Dieses Verhalten ist dennoch konventionell und steht nicht im Widerspruch zu den Erwartungen von ERC20-Anwendungen. + * + * Zusätzlich wird bei Aufrufen von {transferFrom} ein {Approval}-Ereignis ausgelöst. Dies ermöglicht es Anwendungen, den Freibetrag für alle Konten zu rekonstruieren, indem sie einfach auf diese Ereignisse hören. Andere Implementierungen des EIP lösen diese Ereignisse möglicherweise nicht aus, da dies von der Spezifikation nicht verlangt wird. + * + * Schließlich wurden die nicht standardmäßigen Funktionen {decreaseAllowance} und {increaseAllowance} hinzugefügt, um die bekannten Probleme beim Festlegen von Freibeträgen zu mindern. Siehe {IERC20-approve}. */ + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### Vertragsdefinition {#contract-definition} + +```solidity +contract ERC20 is Context, IERC20 { +``` + +Diese Zeile gibt die Vererbung an, in diesem Fall von `IERC20` von oben und `Context`, für OpenGSN. + +  + +```solidity + + using SafeMath for uint256; + +``` + +Diese Zeile hängt die `SafeMath`-Bibliothek an den Typ `uint256` an. Sie können diese Bibliothek +[hier](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol) finden. + +### Variablendefinitionen {#variable-definitions} + +Diese Definitionen spezifizieren die Zustandsvariablen des Vertrags. Diese Variablen sind als `private` deklariert, aber das bedeutet nur, dass andere Verträge auf der Blockchain sie nicht lesen können. _Es gibt keine Geheimnisse auf der Blockchain_, die Software auf jedem Blockchain-Knoten hat den Zustand jedes Vertrags bei jedem Block. Konventionsgemäß werden Zustandsvariablen `_` genannt. + +Die ersten beiden Variablen sind [Mappings](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), +was bedeutet, dass sie sich ungefähr so verhalten wie [assoziative Arrays](https://wikipedia.org/wiki/Associative_array), +außer dass die Schlüssel numerische Werte sind. Speicher wird nur für Einträge zugewiesen, die Werte haben, die vom Standard (Null) abweichen. + +```solidity + mapping (address => uint256) private _balances; +``` + +Das erste Mapping, `_balances`, sind Adressen und ihre jeweiligen Kontostände dieses Tokens. Um auf den Kontostand zuzugreifen, verwenden Sie diese Syntax: `_balances[]`. + +  + +```solidity + mapping (address => mapping (address => uint256)) private _allowances; +``` + +Diese Variable, `_allowances`, speichert die zuvor erklärten Freigaben. Der erste Index ist der Eigentümer der Token, und der zweite ist der Vertrag mit der Freigabe. Um auf den Betrag zuzugreifen, den Adresse A vom Konto der Adresse B ausgeben kann, verwenden Sie `_allowances[B][A]`. + +  + +```solidity + uint256 private _totalSupply; +``` + +Wie der Name schon sagt, verfolgt diese Variable das Gesamtangebot an Token. + +  + +```solidity + string private _name; + string private _symbol; + uint8 private _decimals; +``` + +Diese drei Variablen werden verwendet, um die Lesbarkeit zu verbessern. Die ersten beiden sind selbsterklärend, aber `_decimals` ist es nicht. + +Einerseits hat Ethereum keine Fließkomma- oder Bruchvariablen. Andererseits mögen es Menschen, Token teilen zu können. Ein Grund, warum sich die Menschen auf Gold als Währung geeinigt haben, war, dass es schwer war, Wechselgeld zu geben, wenn jemand den Gegenwert einer Ente in Kuh kaufen wollte. + +Die Lösung besteht darin, Ganzzahlen zu verfolgen, aber anstelle des echten Tokens einen Bruchteil-Token zu zählen, der fast wertlos ist. Im Fall von Ether wird der Bruchteil-Token Wei genannt, und 10^18 Wei entsprechen einem ETH. Zum Zeitpunkt des Schreibens sind 10.000.000.000.000 Wei ungefähr ein US- oder Euro-Cent. + +Anwendungen müssen wissen, wie der Token-Kontostand angezeigt werden soll. Wenn ein Benutzer 3.141.000.000.000.000.000 Wei hat, sind das 3,14 ETH? 31,41 ETH? 3.141 ETH? Im Fall von Ether ist definiert, dass 10^18 Wei einem ETH entsprechen, aber für Ihren Token können Sie einen anderen Wert wählen. Wenn das Teilen des Tokens keinen Sinn ergibt, können Sie einen `_decimals`-Wert von null verwenden. Wenn Sie denselben Standard wie ETH verwenden möchten, verwenden Sie den Wert **18**. + +### Der Konstruktor {#the-constructor} + +```solidity + /* * + * @dev Setzt die Werte für {name} und {symbol}, initialisiert {decimals} mit einem Standardwert von 18. + * + * Um einen anderen Wert für {decimals} auszuwählen, verwenden Sie {_setupDecimals}. + * + * Alle drei dieser Werte sind unveränderlich: Sie können nur einmal während der Konstruktion festgelegt werden. */ + + + + + + + + + + constructor (string memory name_, string memory symbol_) public { + // In Solidity ≥0.7.0 ist 'public' implizit und kann weggelassen werden. + + _name = name_; + _symbol = symbol_; + _decimals = 18; + } +``` + +Der Konstruktor wird aufgerufen, wenn der Vertrag zum ersten Mal erstellt wird. Konventionsgemäß werden Funktionsparameter `_` genannt. + +### Benutzeroberflächenfunktionen {#user-interface-functions} + +```solidity + /* * + * @dev Gibt den Namen des Tokens zurück. */ + + + + function name() public view returns (string memory) { + return _name; + } + + /* * + * @dev Gibt das Symbol des Tokens zurück, normalerweise eine kürzere Version des Namens. */ + + + + + function symbol() public view returns (string memory) { + return _symbol; + } + + /* * + * @dev Gibt die Anzahl der Dezimalstellen zurück, die für die Benutzerdarstellung verwendet werden. + * Wenn `decimals` beispielsweise `2` ist, sollte ein Guthaben von `505` Token einem Benutzer als `5,05` (`505 / 10 ** 2`) angezeigt werden. + * + * Token entscheiden sich normalerweise für einen Wert von 18, was die Beziehung zwischen Ether und Wei imitiert. Dies ist der Wert, den {ERC20} verwendet, es sei denn, {_setupDecimals} wird aufgerufen. + * + * HINWEIS: Diese Informationen werden nur für _Anzeige_-Zwecke verwendet: Sie beeinflussen in keiner Weise die Arithmetik des Vertrags, einschließlich {IERC20-balanceOf} und {IERC20-transfer}. */ + + + + + + + + + + + + + + function decimals() public view returns (uint8) { + return _decimals; + } +``` + +Diese Funktionen, `name`, `symbol` und `decimals`, helfen Benutzeroberflächen, über Ihren Vertrag Bescheid zu wissen, damit sie ihn richtig anzeigen können. + +Der Rückgabetyp ist `string memory`, was bedeutet, dass ein String zurückgegeben wird, der im Speicher (Memory) abgelegt ist. Variablen, wie z. B. Strings, können an drei Orten gespeichert werden: + +| | Lebensdauer | Vertragszugriff | Gaskosten | +| -------- | ------------- | --------------- | -------------------------------------------------------------- | +| Memory | Funktionsaufruf | Lesen/Schreiben | Zehner oder Hunderter (höher für höhere Speicherorte) | +| Calldata | Funktionsaufruf | Nur Lesen | Kann nicht als Rückgabetyp verwendet werden, nur als Parameter | +| Storage | Bis zur Änderung| Lesen/Schreiben | Hoch (800 für Lesen, 20k für Schreiben) | + +In diesem Fall ist `memory` die beste Wahl. + +### Token-Informationen lesen {#read-token-information} + +Dies sind Funktionen, die Informationen über den Token liefern, entweder das Gesamtangebot oder den Kontostand eines Kontos. + +```solidity + /* * + * @dev Siehe {IERC20-totalSupply}. */ + + + + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } +``` + +Die Funktion `totalSupply` gibt das Gesamtangebot an Token zurück. + +  + +```solidity + /* * + * @dev Siehe {IERC20-balanceOf}. */ + + + + function balanceOf(address account) public view override returns (uint256) { + return _balances[account]; + } +``` + +Lesen Sie den Kontostand eines Kontos. Beachten Sie, dass es jedem erlaubt ist, den Kontostand eines anderen abzurufen. Es hat keinen Sinn zu versuchen, diese Informationen zu verbergen, da sie ohnehin auf jedem Blockchain-Knoten verfügbar sind. _Es gibt keine Geheimnisse auf der Blockchain._ + +### Token übertragen {#transfer-tokens} + +```solidity + /* * + * @dev Siehe {IERC20-transfer}. + * + * Anforderungen: + * + * - `recipient` darf nicht die Nulladresse sein. + * - der Aufrufer muss ein Guthaben von mindestens `amount` haben. */ + + + + + + + + + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { +``` + +Die Funktion `transfer` wird aufgerufen, um Token vom Konto des Senders auf ein anderes zu übertragen. Beachten Sie, dass, obwohl sie einen booleschen Wert zurückgibt, dieser Wert immer **true** ist. Wenn die Übertragung fehlschlägt, macht der Vertrag den Aufruf rückgängig (revert). + +  + +```solidity + _transfer(_msgSender(), recipient, amount); + return true; + } +``` + +Die Funktion `_transfer` erledigt die eigentliche Arbeit. Es ist eine private Funktion, die nur von anderen Vertragsfunktionen aufgerufen werden kann. Konventionsgemäß werden private Funktionen `_` genannt, genau wie Zustandsvariablen. + +Normalerweise verwenden wir in Solidity `msg.sender` für den Absender der Nachricht. Das bricht jedoch +[OpenGSN](http://opengsn.org/). Wenn wir etherlose Transaktionen mit unserem Token zulassen wollen, müssen wir `_msgSender()` verwenden. Es gibt `msg.sender` für normale Transaktionen zurück, aber für etherlose gibt es den ursprünglichen Unterzeichner zurück und nicht den Vertrag, der die Nachricht weitergeleitet hat. + +### Freigabefunktionen {#allowance-functions} + +Dies sind die Funktionen, die die Freigabefunktionalität implementieren: `allowance`, `approve`, `transferFrom` und `_approve`. Darüber hinaus geht die OpenZeppelin-Implementierung über den grundlegenden Standard hinaus und enthält einige Funktionen, die die Sicherheit verbessern: `increaseAllowance` und `decreaseAllowance`. + +#### Die allowance-Funktion {#allowance} + +```solidity + /* * + * @dev Siehe {IERC20-allowance}. */ + + + + function allowance(address owner, address spender) public view virtual override returns (uint256) { + return _allowances[owner][spender]; + } +``` + +Die Funktion `allowance` ermöglicht es jedem, jede Freigabe zu überprüfen. + +#### Die approve-Funktion {#approve} + +```solidity + /* * + * @dev Siehe {IERC20-approve}. + * + * Anforderungen: + * + * - `spender` darf nicht die Nulladresse sein. */ + + + + + + + + function approve(address spender, uint256 amount) public virtual override returns (bool) { +``` + +Diese Funktion wird aufgerufen, um eine Freigabe zu erstellen. Sie ist ähnlich wie die obige `transfer`-Funktion: + +- Die Funktion ruft lediglich eine interne Funktion auf (in diesem Fall `_approve`), die die eigentliche Arbeit erledigt. +- Die Funktion gibt entweder `true` zurück (wenn erfolgreich) oder macht den Aufruf rückgängig (wenn nicht). + +  + +```solidity + _approve(_msgSender(), spender, amount); + return true; + } +``` + +Wir verwenden interne Funktionen, um die Anzahl der Stellen zu minimieren, an denen Zustandsänderungen auftreten. _Jede_ Funktion, die den Zustand ändert, ist ein potenzielles Sicherheitsrisiko, das auf Sicherheit geprüft werden muss. Auf diese Weise haben wir weniger Chancen, Fehler zu machen. + +#### Die transferFrom-Funktion {#transferFrom} + +Dies ist die Funktion, die ein Ausgebender aufruft, um eine Freigabe auszugeben. Dies erfordert zwei Operationen: den ausgegebenen Betrag übertragen und die Freigabe um diesen Betrag reduzieren. + +```solidity + /* * + * @dev Siehe {IERC20-transferFrom}. + * + * Löst ein {Approval}-Ereignis aus, das den aktualisierten Freibetrag anzeigt. Dies wird vom EIP nicht verlangt. Siehe den Hinweis am Anfang von {ERC20}. + * + * Anforderungen: + * + * - `sender` und `recipient` dürfen nicht die Nulladresse sein. + * - `sender` muss ein Guthaben von mindestens `amount` haben. + * - der Aufrufer muss einen Freibetrag für die Token von ``sender`` von mindestens `amount` haben. */ + + + + + + + + + + + + + + function transferFrom(address sender, address recipient, uint256 amount) public virtual + override returns (bool) { + _transfer(sender, recipient, amount); +``` + +  + +Der Funktionsaufruf `a.sub(b, "message")` tut zwei Dinge. Erstens berechnet er `a-b`, was die neue Freigabe ist. Zweitens überprüft er, ob dieses Ergebnis nicht negativ ist. Wenn es negativ ist, wird der Aufruf mit der bereitgestellten Nachricht rückgängig gemacht. Beachten Sie, dass bei einem Revert eines Aufrufs alle zuvor während dieses Aufrufs durchgeführten Verarbeitungen ignoriert werden, sodass wir den `_transfer` nicht rückgängig machen müssen. + +```solidity + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, + "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +#### OpenZeppelin-Sicherheitserweiterungen {#openzeppelin-safety-additions} + +Es ist gefährlich, eine Freigabe ungleich Null auf einen anderen Wert ungleich Null zu setzen, da Sie nur die Reihenfolge Ihrer eigenen Transaktionen kontrollieren, nicht die von jemand anderem. Stellen Sie sich vor, Sie haben zwei Benutzer, Alice, die naiv ist, und Bill, der unehrlich ist. Alice möchte eine Dienstleistung von Bill, von der sie glaubt, dass sie fünf Token kostet – also gibt sie Bill eine Freigabe von fünf Token. + +Dann ändert sich etwas und Bills Preis steigt auf zehn Token. Alice, die die Dienstleistung immer noch möchte, sendet eine Transaktion, die Bills Freigabe auf zehn setzt. In dem Moment, in dem Bill diese neue Transaktion im Transaktionspool sieht, sendet er eine Transaktion, die Alices fünf Token ausgibt und einen viel höheren Gaspreis hat, damit sie schneller gemint wird. Auf diese Weise kann Bill zuerst fünf Token ausgeben und dann, sobald Alices neue Freigabe gemint ist, zehn weitere für einen Gesamtpreis von fünfzehn Token ausgeben, mehr als Alice autorisieren wollte. Diese Technik wird +[Front-Running](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running) genannt. + +| Alice-Transaktion | Alice-Nonce | Bill-Transaktion | Bill-Nonce | Bills Freigabe | Bills Gesamteinkommen von Alice | +| ----------------- | ----------- | ----------------------------- | ---------- | ---------------- | ---------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| approve(Bill, 10) | 11 | | | 10 | 5 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 | + +Um dieses Problem zu vermeiden, ermöglichen Ihnen diese beiden Funktionen (`increaseAllowance` und `decreaseAllowance`), die Freigabe um einen bestimmten Betrag zu ändern. Wenn Bill also bereits fünf Token ausgegeben hätte, könnte er nur noch fünf weitere ausgeben. Abhängig vom Timing gibt es zwei Möglichkeiten, wie dies funktionieren kann, die beide damit enden, dass Bill nur zehn Token erhält: + +A: + +| Alice-Transaktion | Alice-Nonce | Bill-Transaktion | Bill-Nonce | Bills Freigabe | Bills Gesamteinkommen von Alice | +| -------------------------- | ----------: | ---------------------------- | ---------: | ---------------: | ---------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 | +| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 | + +B: + +| Alice-Transaktion | Alice-Nonce | Bill-Transaktion | Bill-Nonce | Bills Freigabe | Bills Gesamteinkommen von Alice | +| -------------------------- | ----------: | ----------------------------- | ---------: | ---------------: | ---------------------------: | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 | + +```solidity + /* * + * @dev Erhöht atomar den Freibetrag, der `spender` vom Aufrufer gewährt wird. + * + * Dies ist eine Alternative zu {approve}, die als Minderung für die in {IERC20-approve} beschriebenen Probleme verwendet werden kann. + * + * Löst ein {Approval}-Ereignis aus, das den aktualisierten Freibetrag anzeigt. + * + * Anforderungen: + * + * - `spender` darf nicht die Nulladresse sein. */ + + + + + + + + + + + + + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } +``` + +Die Funktion `a.add(b)` ist eine sichere Addition. In dem unwahrscheinlichen Fall, dass `a`+`b`>=`2^256`, kommt es nicht zu einem Überlauf (Wrap-around), wie es bei einer normalen Addition der Fall ist. + +```solidity + + /* * + * @dev Verringert atomar den Freibetrag, der `spender` vom Aufrufer gewährt wird. + * + * Dies ist eine Alternative zu {approve}, die als Minderung für die in {IERC20-approve} beschriebenen Probleme verwendet werden kann. + * + * Löst ein {Approval}-Ereignis aus, das den aktualisierten Freibetrag anzeigt. + * + * Anforderungen: + * + * - `spender` darf nicht die Nulladresse sein. + * - `spender` muss einen Freibetrag für den Aufrufer von mindestens `subtractedValue` haben. */ + + + + + + + + + + + + + + + function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, + "ERC20: decreased allowance below zero")); + return true; + } +``` + +### Funktionen, die Token-Informationen ändern {#functions-that-modify-token-information} + +Dies sind die vier Funktionen, die die eigentliche Arbeit erledigen: `_transfer`, `_mint`, `_burn` und `_approve`. + +#### Die _transfer-Funktion {#_transfer} + +```solidity + /* * + * @dev Verschiebt `amount` Token von `sender` zu `recipient`. + * + * Diese interne Funktion ist äquivalent zu {transfer} und kann verwendet werden, um z. B. automatische Token-Gebühren, Slashing-Mechanismen usw. zu implementieren. + * + * Löst ein {Transfer}-Ereignis aus. + * + * Anforderungen: + * + * - `sender` darf nicht die Nulladresse sein. + * - `recipient` darf nicht die Nulladresse sein. + * - `sender` muss ein Guthaben von mindestens `amount` haben. */ + + + + + + + + + + + + + + + function _transfer(address sender, address recipient, uint256 amount) internal virtual { +``` + +Diese Funktion, `_transfer`, überträgt Token von einem Konto auf ein anderes. Sie wird sowohl von +`transfer` (für Übertragungen vom eigenen Konto des Senders) als auch von `transferFrom` (für die Verwendung von Freigaben zur Übertragung vom Konto eines anderen) aufgerufen. + +  + +```solidity + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); +``` + +Niemand besitzt tatsächlich die Adresse Null in Ethereum (das heißt, niemand kennt einen Private-Key, dessen passender Public-Key in die Null-Adresse umgewandelt wird). Wenn Leute diese Adresse verwenden, handelt es sich normalerweise um einen Softwarefehler – daher schlagen wir fehl, wenn die Null-Adresse als Sender oder Empfänger verwendet wird. + +  + +```solidity + _beforeTokenTransfer(sender, recipient, amount); + +``` + +Es gibt zwei Möglichkeiten, diesen Vertrag zu nutzen: + +1. Verwenden Sie ihn als Vorlage für Ihren eigenen Code +1. [Erben Sie davon](https://www.bitdegree.org/learn/solidity-inheritance) und überschreiben Sie nur die Funktionen, die Sie ändern müssen + +Die zweite Methode ist viel besser, da der OpenZeppelin ERC-20-Code bereits geprüft wurde und sich als sicher erwiesen hat. Wenn Sie Vererbung verwenden, ist klar, welche Funktionen Sie ändern, und um Ihrem Vertrag zu vertrauen, müssen die Leute nur diese spezifischen Funktionen prüfen. + +Es ist oft nützlich, eine Funktion jedes Mal auszuführen, wenn Token den Besitzer wechseln. `_transfer` ist jedoch eine sehr wichtige Funktion und es ist möglich, sie unsicher zu schreiben (siehe unten), daher ist es am besten, sie nicht zu überschreiben. Die Lösung ist `_beforeTokenTransfer`, eine +[Hook-Funktion](https://wikipedia.org/wiki/Hooking). Sie können diese Funktion überschreiben, und sie wird bei jeder Übertragung aufgerufen. + +  + +```solidity + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); +``` + +Dies sind die Zeilen, die die Übertragung tatsächlich durchführen. Beachten Sie, dass sich **nichts** dazwischen befindet und dass wir den übertragenen Betrag vom Sender abziehen, bevor wir ihn dem Empfänger hinzufügen. Dies ist wichtig, denn wenn es in der Mitte einen Aufruf an einen anderen Vertrag gäbe, hätte dieser verwendet werden können, um diesen Vertrag zu betrügen. Auf diese Weise ist die Übertragung atomar, in der Mitte kann nichts passieren. + +  + +```solidity + emit Transfer(sender, recipient, amount); + } +``` + +Geben Sie schließlich ein `Transfer`-Ereignis aus. Ereignisse sind für Smart Contracts nicht zugänglich, aber Code, der außerhalb der Blockchain ausgeführt wird, kann auf Ereignisse lauschen und darauf reagieren. Zum Beispiel kann ein Wallet verfolgen, wann der Eigentümer mehr Token erhält. + +#### Die _mint- und _burn-Funktionen {#_mint-and-_burn} + +Diese beiden Funktionen (`_mint` und `_burn`) ändern das Gesamtangebot an Token. +Sie sind intern und es gibt keine Funktion, die sie in diesem Vertrag aufruft, +daher sind sie nur nützlich, wenn Sie vom Vertrag erben und Ihre eigene +Logik hinzufügen, um zu entscheiden, unter welchen Bedingungen neue Token geprägt (mint) oder bestehende +verbrannt (burn) werden sollen. + +**HINWEIS:** Jeder ERC-20-Token hat seine eigene Geschäftslogik, die die Token-Verwaltung vorschreibt. +Zum Beispiel könnte ein Vertrag mit festem Angebot nur `_mint` +im Konstruktor aufrufen und niemals `_burn` aufrufen. Ein Vertrag, der Token verkauft, +wird `_mint` aufrufen, wenn er bezahlt wird, und vermutlich irgendwann `_burn` aufrufen, +um eine unkontrollierte Inflation zu vermeiden. + +```solidity + /* * @dev Erstellt `amount` Token und weist sie `account` zu, wodurch das Gesamtangebot erhöht wird. + * + * Löst ein {Transfer}-Ereignis aus, bei dem `from` auf die Nulladresse gesetzt ist. + * + * Anforderungen: + * + * - `to` darf nicht die Nulladresse sein. */ + + + + + + + + + + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: mint to the zero address"); + _beforeTokenTransfer(address(0), account, amount); + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } +``` + +Stellen Sie sicher, dass Sie `_totalSupply` aktualisieren, wenn sich die Gesamtzahl der Token ändert. + +  + +```solidity + /* * + * @dev Zerstört `amount` Token von `account`, wodurch das Gesamtangebot verringert wird. + * + * Löst ein {Transfer}-Ereignis aus, bei dem `to` auf die Nulladresse gesetzt ist. + * + * Anforderungen: + * + * - `account` darf nicht die Nulladresse sein. + * - `account` muss mindestens `amount` Token haben. */ + + + + + + + + + + + + function _burn(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: burn from the zero address"); + + _beforeTokenTransfer(account, address(0), amount); + + _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } +``` + +Die Funktion `_burn` ist fast identisch mit `_mint`, außer dass sie in die andere Richtung geht. + +#### Die _approve-Funktion {#_approve} + +Dies ist die Funktion, die tatsächlich Freigaben spezifiziert. Beachten Sie, dass sie es einem Eigentümer ermöglicht, eine Freigabe anzugeben, die höher ist als der aktuelle Kontostand des Eigentümers. Dies ist in Ordnung, da der Kontostand zum Zeitpunkt der Übertragung überprüft wird, wenn er sich von dem Kontostand bei der Erstellung der Freigabe unterscheiden könnte. + +```solidity + /* * + * @dev Setzt `amount` als Freibetrag von `spender` über die Token des `owner`. + * + * Diese interne Funktion ist äquivalent zu `approve` und kann verwendet werden, um z. B. automatische Freibeträge für bestimmte Subsysteme usw. festzulegen. + * + * Löst ein {Approval}-Ereignis aus. + * + * Anforderungen: + * + * - `owner` darf nicht die Nulladresse sein. + * - `spender` darf nicht die Nulladresse sein. */ + + + + + + + + + + + + + + function _approve(address owner, address spender, uint256 amount) internal virtual { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; +``` + +  + +Geben Sie ein `Approval`-Ereignis aus. Je nachdem, wie die Anwendung geschrieben ist, kann der Ausgeber-Vertrag entweder vom Eigentümer oder von einem Server, der auf diese Ereignisse lauscht, über die Genehmigung informiert werden. + +```solidity + emit Approval(owner, spender, amount); + } + +``` + +### Die Decimals-Variable ändern {#modify-the-decimals-variable} + +```solidity + + + /* * + * @dev Setzt {decimals} auf einen anderen Wert als den Standardwert von 18. + * + * WARNUNG: Diese Funktion sollte nur vom Konstruktor aufgerufen werden. Die meisten Anwendungen, die mit Token-Verträgen interagieren, erwarten nicht, dass sich {decimals} jemals ändert, und funktionieren möglicherweise fehlerhaft, wenn dies der Fall ist. */ + + + + + + + + function _setupDecimals(uint8 decimals_) internal { + _decimals = decimals_; + } +``` + +Diese Funktion ändert die Variable `_decimals`, die verwendet wird, um Benutzeroberflächen mitzuteilen, wie der Betrag zu interpretieren ist. Sie sollten sie aus dem Konstruktor aufrufen. Es wäre unehrlich, sie zu einem späteren Zeitpunkt aufzurufen, und Anwendungen sind nicht darauf ausgelegt, damit umzugehen. + +### Hooks {#hooks} + +```solidity + + /* * + * @dev Hook, der vor jeder Übertragung von Token aufgerufen wird. Dies schließt das Prägen und Verbrennen ein. + * + * Aufrufbedingungen: + * + * - wenn `from` und `to` beide ungleich null sind, werden `amount` Token von ``from`` an `to` übertragen. + * - wenn `from` null ist, werden `amount` Token für `to` geprägt. + * - wenn `to` null ist, werden `amount` Token von ``from`` verbrannt. + * - `from` und `to` sind niemals beide null. + * + * Um mehr über Hooks zu erfahren, gehen Sie zu xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ + + + + + + + + + + + + + + + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } +} +``` + +Dies ist die Hook-Funktion, die während Übertragungen aufgerufen werden soll. Sie ist hier leer, aber wenn Sie möchten, dass sie etwas tut, überschreiben Sie sie einfach. + +## Fazit {#conclusion} + +Zur Wiederholung sind hier einige der wichtigsten Ideen in diesem Vertrag (meiner Meinung nach, Ihre wird wahrscheinlich abweichen): + +- _Es gibt keine Geheimnisse auf der Blockchain_. Jede Information, auf die ein Smart Contract zugreifen kann, ist für die ganze Welt verfügbar. +- Sie können die Reihenfolge Ihrer eigenen Transaktionen kontrollieren, aber nicht, wann die Transaktionen anderer Personen stattfinden. Dies ist der Grund, warum das Ändern einer Freigabe gefährlich sein kann, da es dem Ausgebenden ermöglicht, die Summe beider Freigaben auszugeben. +- Werte vom Typ `uint256` laufen über (Wrap-around). Mit anderen Worten, _0-1=2^256-1_. Wenn das kein gewünschtes Verhalten ist, müssen Sie dies überprüfen (oder die SafeMath-Bibliothek verwenden, die das für Sie erledigt). Beachten Sie, dass sich dies in + [Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html) geändert hat. +- Führen Sie alle Zustandsänderungen eines bestimmten Typs an einem bestimmten Ort durch, da dies die Prüfung (Auditing) erleichtert. + Dies ist der Grund, warum wir zum Beispiel `_approve` haben, das von `approve`, `transferFrom`, + `increaseAllowance` und `decreaseAllowance` aufgerufen wird. +- Zustandsänderungen sollten atomar sein, ohne eine andere Aktion in ihrer Mitte (wie Sie + in `_transfer` sehen können). Dies liegt daran, dass Sie während der Zustandsänderung einen inkonsistenten Zustand haben. Zum Beispiel existieren zwischen dem Zeitpunkt, an dem Sie vom Kontostand des Senders abziehen, und dem Zeitpunkt, an dem Sie dem Kontostand des Empfängers hinzufügen, weniger Token, als es geben sollte. Dies könnte potenziell missbraucht werden, wenn es dazwischen Operationen gibt, insbesondere Aufrufe an einen anderen Vertrag. + +Jetzt, da Sie gesehen haben, wie der OpenZeppelin ERC-20-Vertrag geschrieben ist und insbesondere, wie er sicherer gemacht wird, gehen Sie und schreiben Sie Ihre eigenen sicheren Verträge und Anwendungen. + +[Sehen Sie hier für mehr von meiner Arbeit](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md new file mode 100644 index 00000000000..b928e56aada --- /dev/null +++ b/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md @@ -0,0 +1,215 @@ +--- +title: ERC-20 mit Sicherheitsvorkehrungen +description: Wie man Menschen hilft, dumme Fehler zu vermeiden +author: Ori Pomerantz +lang: de +tags: ["erc-20"] +skill: beginner +breadcrumb: ERC-20-Sicherheit +published: 2022-08-15 +--- + +## Einführung {#introduction} + +Eines der großartigen Dinge an Ethereum ist, dass es keine zentrale Autorität gibt, die Ihre Transaktionen ändern oder rückgängig machen kann. Eines der großen Probleme bei Ethereum ist, dass es keine zentrale Autorität gibt, die die Macht hat, Benutzerfehler oder illegale Transaktionen rückgängig zu machen. In diesem Artikel lernen Sie einige der häufigsten Fehler kennen, die Benutzer mit [ERC-20](/developers/docs/standards/tokens/erc-20/)-Token machen, sowie wie man ERC-20-Smart-Contracts erstellt, die Benutzern helfen, diese Fehler zu vermeiden, oder die einer zentralen Autorität eine gewisse Macht verleihen (zum Beispiel, um Konten einzufrieren). + +Beachten Sie, dass wir zwar den [OpenZeppelin ERC-20-Token-Smart-Contract](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20) verwenden werden, dieser Artikel ihn jedoch nicht im Detail erklärt. Sie finden diese Informationen [hier](/developers/tutorials/erc20-annotated-code). + +Wenn Sie den vollständigen Quellcode sehen möchten: + +1. Öffnen Sie die [Remix IDE](https://remix.ethereum.org/). +2. Klicken Sie auf das GitHub-Klonen-Symbol (![clone github icon](icon-clone.png)). +3. Klonen Sie das GitHub-Repository `https://github.com/qbzzt/20220815-erc20-safety-rails`. +4. Öffnen Sie **contracts > erc20-safety-rails.sol**. + +## Erstellen eines ERC-20-Smart-Contracts {#creating-an-erc-20-contract} + +Bevor wir die Sicherheitsvorkehrungsfunktionen hinzufügen können, benötigen wir einen ERC-20-Smart-Contract. In diesem Artikel verwenden wir [den OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard). Öffnen Sie ihn in einem anderen Browser und befolgen Sie diese Anweisungen: + +1. Wählen Sie **ERC20** aus. +2. Geben Sie diese Einstellungen ein: + + | Parameter | Wert | + | -------------- | ---------------- | + | Name | SafetyRailsToken | + | Symbol | SAFE | + | Premint | 1000 | + | Features | None | + | Access Control | Ownable | + | Upgradability | None | + +3. Scrollen Sie nach oben und klicken Sie auf **Open in Remix** (für Remix) oder **Download**, um eine andere Umgebung zu verwenden. Ich gehe davon aus, dass Sie Remix verwenden; falls Sie etwas anderes nutzen, nehmen Sie einfach die entsprechenden Änderungen vor. +4. Wir haben nun einen voll funktionsfähigen ERC-20-Smart-Contract. Sie können `.deps` > `npm` erweitern, um den importierten Code zu sehen. +5. Kompilieren, deployen und spielen Sie mit dem Smart Contract, um zu sehen, dass er als ERC-20-Smart-Contract funktioniert. Wenn Sie lernen müssen, wie man Remix benutzt, [verwenden Sie dieses Tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). + +## Häufige Fehler {#common-mistakes} + +### Die Fehler {#the-mistakes} + +Benutzer senden manchmal Token an die falsche Adresse. Obwohl wir keine Gedanken lesen können, um zu wissen, was sie eigentlich tun wollten, gibt es zwei Arten von Fehlern, die häufig vorkommen und leicht zu erkennen sind: + +1. Das Senden der Token an die eigene Adresse des Smart Contracts. Zum Beispiel hat der [OP-Token von Optimism](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) in weniger als zwei Monaten [über 120.000](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000042) OP-Token angesammelt. Dies stellt eine beträchtliche Menge an Vermögen dar, das die Leute vermutlich einfach verloren haben. + +2. Das Senden der Token an eine leere Adresse, die weder einem [Extern verwaltetes Konto](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) noch einem [Smart Contract](/developers/docs/smart-contracts) entspricht. Obwohl ich keine Statistiken darüber habe, wie oft dies passiert, [hätte ein Vorfall 20.000.000 Token kosten können](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). + +### Verhindern von Übertragungen {#preventing-transfers} + +Der OpenZeppelin ERC-20-Smart-Contract enthält [einen Hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), der aufgerufen wird, bevor ein Token übertragen wird. Standardmäßig tut dieser Hook nichts, aber wir können unsere eigene Funktionalität daran anhängen, wie zum Beispiel Überprüfungen, die die Transaktion rückgängig machen (revert), wenn es ein Problem gibt. + +Um den Hook zu verwenden, fügen Sie diese Funktion nach dem Konstruktor hinzu: + +```solidity + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal virtual + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + } +``` + +Einige Teile dieser Funktion könnten neu für Sie sein, wenn Sie nicht sehr vertraut mit Solidity sind: + +```solidity + internal virtual +``` + +Das Schlüsselwort `virtual` bedeutet, dass, genau wie wir Funktionalität von `ERC20` geerbt und diese Funktion überschrieben haben, andere Smart Contracts von uns erben und diese Funktion überschreiben können. + +```solidity + override(ERC20) +``` + +Wir müssen explizit angeben, dass wir die ERC20-Token-Definition von `_beforeTokenTransfer` [überschreiben](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding). Im Allgemeinen sind explizite Definitionen aus Sicherheitssicht viel besser als implizite – man kann nicht vergessen, dass man etwas getan hat, wenn es direkt vor einem steht. Das ist auch der Grund, warum wir angeben müssen, von welcher Superklasse wir `_beforeTokenTransfer` überschreiben. + +```solidity + super._beforeTokenTransfer(from, to, amount); +``` + +Diese Zeile ruft die Funktion `_beforeTokenTransfer` des Smart Contracts oder der Smart Contracts auf, von denen wir geerbt haben und die diese Funktion besitzen. In diesem Fall ist das nur `ERC20`, `Ownable` hat diesen Hook nicht. Auch wenn `ERC20._beforeTokenTransfer` derzeit nichts tut, rufen wir sie für den Fall auf, dass in Zukunft Funktionalität hinzugefügt wird (und wir uns dann entscheiden, den Smart Contract neu zu deployen, da sich Smart Contracts nach dem Deployment nicht mehr ändern). + +### Programmieren der Anforderungen {#coding-the-requirements} + +Wir möchten der Funktion diese Anforderungen hinzufügen: + +- Die `to`-Adresse darf nicht gleich `address(this)` sein, der Adresse des ERC-20-Smart-Contracts selbst. +- Die `to`-Adresse darf nicht leer sein, sie muss eines der folgenden sein: + - Ein Extern verwaltetes Konto (EOA). Wir können nicht direkt überprüfen, ob eine Adresse ein EOA ist, aber wir können das ETH-Guthaben einer Adresse überprüfen. EOAs haben fast immer ein Guthaben, selbst wenn sie nicht mehr verwendet werden – es ist schwierig, sie bis auf das letzte Wei zu leeren. + - Ein Smart Contract. Zu testen, ob eine Adresse ein Smart Contract ist, ist etwas schwieriger. Es gibt einen Opcode, der die externe Codelänge überprüft, genannt [`EXTCODESIZE`](https://www.evm.codes/#3b), aber er ist in Solidity nicht direkt verfügbar. Wir müssen dafür [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html) verwenden, was EVM-Assembly ist. Es gibt andere Werte, die wir aus Solidity verwenden könnten ([`
.code` und `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), aber sie kosten mehr Gas. + +Lassen Sie uns den neuen Code Zeile für Zeile durchgehen: + +```solidity + require(to != address(this), "Can't send tokens to the contract address"); +``` + +Dies ist die erste Anforderung: Überprüfen, dass `to` und `this(address)` nicht dasselbe sind. + +```solidity + bool isToContract; + assembly { + isToContract := gt(extcodesize(to), 0) + } +``` + +So überprüfen wir, ob eine Adresse ein Smart Contract ist. Wir können keine direkte Ausgabe von Yul erhalten, also definieren wir stattdessen eine Variable, um das Ergebnis zu speichern (in diesem Fall `isToContract`). Yul funktioniert so, dass jeder Opcode als Funktion betrachtet wird. Zuerst rufen wir also [`EXTCODESIZE`](https://www.evm.codes/#3b) auf, um die Größe des Smart Contracts zu erhalten, und verwenden dann [`GT`](https://www.evm.codes/#11), um zu überprüfen, ob sie nicht null ist (wir haben es mit vorzeichenlosen Ganzzahlen zu tun, also kann sie natürlich nicht negativ sein). Wir schreiben das Ergebnis dann in `isToContract`. + +```solidity + require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); +``` + +Und schließlich haben wir die eigentliche Überprüfung auf leere Adressen. + +## Administrativer Zugriff {#admin-access} + +Manchmal ist es nützlich, einen Administrator zu haben, der Fehler rückgängig machen kann. Um das Missbrauchspotenzial zu verringern, kann dieser Administrator eine [Mehrfachsignatur](https://blog.logrocket.com/security-choices-multi-signature-wallets/) (Multisig) sein, sodass mehrere Personen einer Aktion zustimmen müssen. In diesem Artikel werden wir zwei administrative Funktionen haben: + +1. Einfrieren und Entsperren von Konten. Dies kann zum Beispiel nützlich sein, wenn ein Konto möglicherweise kompromittiert wurde. +2. Bereinigung von Vermögenswerten (Asset Cleanup). + + Manchmal senden Betrüger betrügerische Token an den Smart Contract des echten Tokens, um Legitimität zu erlangen. Ein Beispiel [finden Sie hier](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe?tab=holders). Der legitime ERC-20-Smart-Contract ist [0x4200....0042](https://optimism.blockscout.com/token/0x4200000000000000000000000000000000000042). Der Betrug, der vorgibt, dieser zu sein, ist [0x234....bbe](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe). + + Es ist auch möglich, dass Leute versehentlich legitime ERC-20-Token an unseren Smart Contract senden, was ein weiterer Grund ist, eine Möglichkeit haben zu wollen, sie herauszuholen. + +OpenZeppelin bietet zwei Mechanismen, um administrativen Zugriff zu ermöglichen: + +- [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable)-Smart-Contracts haben einen einzigen Eigentümer. Funktionen, die den `onlyOwner`-[Modifikator](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) haben, können nur von diesem Eigentümer aufgerufen werden. Eigentümer können das Eigentum an jemand anderen übertragen oder vollständig darauf verzichten. Die Rechte aller anderen Konten sind typischerweise identisch. +- [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control)-Smart-Contracts verfügen über eine [rollenbasierte Zugriffskontrolle (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). + +Der Einfachheit halber verwenden wir in diesem Artikel `Ownable`. + +### Einfrieren und Entsperren von Smart Contracts {#freezing-and-thawing-contracts} + +Das Einfrieren und Entsperren von Smart Contracts erfordert mehrere Änderungen: + +- Ein [Mapping](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) von Adressen zu [Booleans](https://en.wikipedia.org/wiki/Boolean_data_type), um zu verfolgen, welche Adressen eingefroren sind. Alle Werte sind anfangs null, was bei booleschen Werten als falsch (false) interpretiert wird. Das ist es, was wir wollen, da Konten standardmäßig nicht eingefroren sind. + + ```solidity + mapping(address => bool) public frozenAccounts; +``` + +- [Events](https://www.tutorialspoint.com/solidity/solidity_events.htm) (Ereignisse), um jeden Interessierten zu informieren, wenn ein Konto eingefroren oder entsperrt wird. Technisch gesehen sind Events für diese Aktionen nicht erforderlich, aber sie helfen Off-Chain-Code dabei, auf diese Events zu hören und zu wissen, was passiert. Es gilt als guter Ton für einen Smart Contract, sie auszugeben (emit), wenn etwas passiert, das für jemand anderen relevant sein könnte. + + Die Events sind indiziert, sodass es möglich sein wird, nach allen Malen zu suchen, in denen ein Konto eingefroren oder entsperrt wurde. + + ```solidity + // Wenn Konten eingefroren oder entsperrt werden + event AccountFrozen(address indexed _addr); + event AccountThawed(address indexed _addr); +``` + +- Funktionen zum Einfrieren und Entsperren von Konten. Diese beiden Funktionen sind nahezu identisch, daher werden wir nur die Einfrier-Funktion durchgehen. + + ```solidity + function freezeAccount(address addr) + public + onlyOwner +``` + + Funktionen, die als [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) markiert sind, können von anderen Smart Contracts oder direkt durch eine Transaktion aufgerufen werden. + + ```solidity + { + require(!frozenAccounts[addr], "Account already frozen"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); + } // freezeAccount +``` + + Wenn das Konto bereits eingefroren ist, wird die Transaktion rückgängig gemacht (revert). Andernfalls frieren Sie es ein und geben ein Event aus (`emit`). + +- Ändern Sie `_beforeTokenTransfer`, um zu verhindern, dass Geld von einem eingefrorenen Konto verschoben wird. Beachten Sie, dass weiterhin Geld auf das eingefrorene Konto überwiesen werden kann. + + ```solidity + require(!frozenAccounts[from], "The account is frozen"); +``` + +### Bereinigung von Vermögenswerten {#asset-cleanup} + +Um ERC-20-Token freizugeben, die von diesem Smart Contract gehalten werden, müssen wir eine Funktion im Token-Smart-Contract aufrufen, zu dem sie gehören, entweder [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) oder [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). Es hat keinen Sinn, in diesem Fall Gas für Freigaben (Allowances) zu verschwenden, wir können genauso gut direkt übertragen. + +```solidity + function cleanupERC20( + address erc20, + address dest + ) + public + onlyOwner + { + IERC20 token = IERC20(erc20); +``` + +Dies ist die Syntax, um ein Objekt für einen Smart Contract zu erstellen, wenn wir die Adresse erhalten. Wir können dies tun, weil wir die Definition für ERC-20-Token als Teil des Quellcodes haben (siehe Zeile 4), und diese Datei enthält [die Definition für IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), die Schnittstelle für einen OpenZeppelin ERC-20-Smart-Contract. + +```solidity + uint balance = token.balanceOf(address(this)); + token.transfer(dest, balance); + } +``` + +Dies ist eine Bereinigungsfunktion, also wollen wir vermutlich keine Token zurücklassen. Anstatt das Guthaben manuell vom Benutzer abzurufen, können wir den Prozess genauso gut automatisieren. + +## Fazit {#conclusion} + +Dies ist keine perfekte Lösung – es gibt keine perfekte Lösung für das Problem „Benutzer hat einen Fehler gemacht“. Die Verwendung solcher Überprüfungen kann jedoch zumindest einige Fehler verhindern. Die Möglichkeit, Konten einzufrieren, ist zwar gefährlich, kann aber genutzt werden, um den Schaden bestimmter Hacks zu begrenzen, indem dem Hacker die gestohlenen Gelder verweigert werden. + +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md new file mode 100644 index 00000000000..230c147ed45 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md @@ -0,0 +1,975 @@ +--- +title: "Ethereum für die Web2-Authentifizierung nutzen" +description: "Nach dem Lesen dieses Tutorials wird ein Entwickler in der Lage sein, den Ethereum-Login (Web3) in den SAML-Login zu integrieren, einen Standard, der im Web2 verwendet wird, um Single Sign-On und andere verwandte Dienste bereitzustellen. Dies ermöglicht die Authentifizierung des Zugriffs auf Web2-Ressourcen durch Ethereum-Signaturen, wobei die Benutzerattribute aus Bestätigungen stammen." +author: Ori Pomerantz +tags: ["web2", "Authentifizierung", "eas"] +skill: beginner +breadcrumb: "Ethereum für Web2-Auth" +lang: de +published: 2025-04-30 +--- + +## Einführung + +[SAML](https://www.onelogin.com/learn/saml) ist ein Standard, der im Web2 verwendet wird, um einem [Identitätsanbieter (IdP)](https://en.wikipedia.org/wiki/Identity_provider#SAML_identity_provider) zu ermöglichen, Benutzerinformationen für [Dienstanbieter (SP)](https://en.wikipedia.org/wiki/Service_provider_(SAML)) bereitzustellen. + +In diesem Tutorial lernen Sie, wie Sie Ethereum-Signaturen in SAML integrieren, damit Benutzer ihre Ethereum-Wallets verwenden können, um sich bei Web2-Diensten zu authentifizieren, die Ethereum noch nicht nativ unterstützen. + +Beachten Sie, dass dieses Tutorial für zwei verschiedene Zielgruppen geschrieben wurde: + +- Ethereum-Nutzer, die Ethereum verstehen und SAML lernen müssen +- Web2-Nutzer, die SAML und Web2-Authentifizierung verstehen und Ethereum lernen müssen + +Daher wird es viel Einführungsmaterial enthalten, das Sie vielleicht schon kennen. Sie können dieses gerne überspringen. + +### SAML für Ethereum-Nutzer + +SAML ist ein zentralisiertes Protokoll. Ein Dienstanbieter (SP) akzeptiert Zusicherungen (wie „Dies ist mein Benutzer John, er sollte die Berechtigungen haben, A, B und C zu tun“) von einem Identitätsanbieter (IdP) nur, wenn bereits eine Vertrauensbeziehung zu ihm oder zu der [Zertifizierungsstelle](https://www.ssl.com/article/what-is-a-certificate-authority-ca/) besteht, die das Zertifikat dieses IdP signiert hat. + +Zum Beispiel kann der SP ein Reisebüro sein, das Reisedienstleistungen für Unternehmen anbietet, und der IdP kann die interne Website eines Unternehmens sein. Wenn Mitarbeiter Geschäftsreisen buchen müssen, leitet das Reisebüro sie zur Authentifizierung durch das Unternehmen weiter, bevor sie die Reise tatsächlich buchen können. + +![Schritt-für-Schritt-SAML-Prozess](./fig-01-saml.png) + +Auf diese Weise verhandeln die drei Entitäten – der Browser, der SP und der IdP – über den Zugriff. Der SP muss im Voraus nichts über den Benutzer wissen, der den Browser verwendet, sondern nur dem IdP vertrauen. + +### Ethereum für SAML-Nutzer + +Ethereum ist ein dezentralisiertes System. + +![Ethereum-Anmeldung](./fig-02-eth-logon.png) + +Benutzer haben einen Private-Key (der typischerweise in einer Browser-Erweiterung gespeichert ist). Aus dem Private-Key kann man einen Public-Key ableiten und daraus eine 20-Byte-Adresse. Wenn sich Benutzer an einem System anmelden müssen, werden sie aufgefordert, eine Nachricht mit einer Nonce (einem Einmalwert) zu signieren. Der Server kann verifizieren, dass die Signatur von dieser Adresse erstellt wurde. + +![Zusätzliche Daten aus Bestätigungen erhalten](./fig-03-eas-data.png) + +Die Signatur verifiziert nur die Ethereum-Adresse. Um andere Benutzerattribute zu erhalten, verwendet man typischerweise [Bestätigungen](https://attest.org/). Eine Bestätigung hat typischerweise diese Felder: + +- **Attestor (Bestätigender)**, die Adresse, die die Bestätigung vorgenommen hat +- **Empfänger**, die Adresse, auf die sich die Bestätigung bezieht +- **Daten**, die bestätigten Daten, wie Name, Berechtigungen usw. +- **Schema**, die ID des Schemas, das zur Interpretation der Daten verwendet wird. + +Aufgrund der dezentralisierten Natur von Ethereum kann jeder Benutzer Bestätigungen vornehmen. Die Identität des Bestätigenden ist wichtig, um zu identifizieren, welche Bestätigungen wir als zuverlässig erachten. + +## Einrichtung + +Der erste Schritt besteht darin, dass ein SAML-SP und ein SAML-IdP miteinander kommunizieren. + +1. Laden Sie die Software herunter. Die Beispielsoftware für diesen Artikel befindet sich [auf GitHub](https://github.com/qbzzt/250420-saml-ethereum). Verschiedene Phasen sind in verschiedenen Branches gespeichert; für diese Phase benötigen Sie `saml-only`. + + ```sh + git clone https://github.com/qbzzt/250420-saml-ethereum.git + cd 250420-saml-ethereum + git checkout saml-only + yarn + ``` + +2. Erstellen Sie Schlüssel mit selbstsignierten Zertifikaten. Das bedeutet, dass der Schlüssel seine eigene Zertifizierungsstelle ist und manuell in den Dienstanbieter importiert werden muss. Weitere Informationen finden Sie in den [OpenSSL-Dokumentationen](https://docs.openssl.org/master/man1/openssl-req/). + + ```sh + mkdir keys + openssl req -x509 -newkey rsa:4096 -keyout keys/sp-key.pem -out keys/sp-cert.pem -sha256 -days 3650 -nodes -subj "/C=US/ST=Texas/L=Austin/O=Service Provider/OU=IT/CN=localhost" + openssl req -x509 -newkey rsa:4096 -keyout keys/idp-key.pem -out keys/idp-cert.pem -sha256 -days 3650 -nodes -subj "/C=US/ST=Texas/L=Austin/O=Identity Provider/OU=IT/CN=localhost" + ``` + +3. Starten Sie die Server (sowohl SP als auch IdP). + + ```sh + yarn start + ``` + +4. Rufen Sie den SP unter der URL [http://localhost:3000/](http://localhost:3000/) auf und klicken Sie auf die Schaltfläche, um zum IdP (Port 3001) weitergeleitet zu werden. + +5. Geben Sie dem IdP Ihre E-Mail-Adresse an und klicken Sie auf **Login to the service provider**. Sie werden sehen, dass Sie zurück zum Dienstanbieter (Port 3000) weitergeleitet werden und dieser Sie anhand Ihrer E-Mail-Adresse erkennt. + +### Detaillierte Erklärung + +Das passiert Schritt für Schritt: + +![Normale SAML-Anmeldung ohne Ethereum](./fig-04-saml-no-eth.png) + +#### src/config.mts + +Diese Datei enthält die Konfiguration sowohl für den Identitätsanbieter als auch für den Dienstanbieter. Normalerweise wären diese beiden unterschiedliche Entitäten, aber hier können wir den Code der Einfachheit halber teilen. + +```typescript +import fs from "fs" + +``` + +Da wir vorerst nur testen, ist es in Ordnung, HTTP zu verwenden. + +```typescript +const protocol = "http" +const domain = "localhost" + +``` + +Lesen Sie die Public-Keys, die normalerweise beiden Komponenten zur Verfügung stehen (und denen entweder direkt vertraut wird oder die von einer vertrauenswürdigen Zertifizierungsstelle signiert wurden). + +```typescript +const spPubKey = fs.readFileSync("./keys/sp-cert.pem") +const idpPubKey = fs.readFileSync("./keys/idp-cert.pem") + +``` + +Die URLs für beide Komponenten. + +```typescript +export const spPort = 3000 +export const spUrl = `${protocol}://${domain}:${spPort}` + +export const idpPort = 3001 +export const idpUrl = `${protocol}://${domain}:${idpPort}` + +``` + +Die öffentlichen Daten für den Dienstanbieter. + +```typescript +export const spPublicData = { +``` + +Konventionsgemäß ist in SAML die `entityID` die URL, unter der die Metadaten der Entität verfügbar sind. Diese Metadaten entsprechen den hier aufgeführten öffentlichen Daten, außer dass sie im XML-Format vorliegen. + +```typescript + entityID: `${spUrl}/sp/metadata`, +``` + +Die wichtigste Definition für unsere Zwecke ist der `assertionConsumerServer`. Das bedeutet, dass wir, um dem Dienstanbieter etwas zuzusichern (zum Beispiel „der Benutzer, der Ihnen diese Informationen sendet, ist somebody@example.com“), [HTTP POST](https://www.w3schools.com/tags/ref_httpmethods.asp) an die URL `http://localhost:3000/sp/assertion` verwenden müssen. + +```typescript + assertionConsumerService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${spUrl}/sp/assertion`, + }], + encPrivateKey: spPubKey, +} + +``` + +Die öffentlichen Daten für den Identitätsanbieter sind ähnlich. Sie geben an, dass Sie zum Anmelden eines Benutzers einen POST an `http://localhost:3001/idp/login` und zum Abmelden eines Benutzers einen POST an `http://localhost:3001/idp/logout` senden. + +```typescript +export const idpPublicData = { + entityID: `${idpUrl}/idp/metadata`, + singleSignOnService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/idp/login`, + }], + singleLogoutService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/idp/logout`, + }], + signingCert: idpPubKey, +} +``` + +#### src/sp.mts + +Dies ist der Code, der einen Dienstanbieter implementiert. + +```typescript +import fs from "fs" +import express from "express" +``` + +Wir verwenden die Bibliothek [`samlify`](https://www.npmjs.com/package/samlify), um SAML zu implementieren. + +```typescript +import * as samlify from "samlify" +``` + +Die Bibliothek `samlify` erwartet ein Paket, das validiert, ob das XML korrekt ist, mit dem erwarteten Public-Key signiert wurde usw. Wir verwenden dafür [`@authenio/samlify-node-xmllint`](https://www.npmjs.com/package/@authenio/samlify-node-xmllint). + +```typescript +import * as validator from "@authenio/samlify-node-xmllint" + +import { spPort, spUrl, spPublicData, idpPublicData } from "./config.mjs" + +samlify.setSchemaValidator(validator) + +``` + +Ein [`express`](https://expressjs.com/) [`Router`](https://expressjs.com/en/5x/api.html#router) ist eine „Mini-Website“, die in eine Website eingebunden werden kann. In diesem Fall verwenden wir ihn, um alle Definitionen des Dienstanbieters zu gruppieren. + +```typescript +const spRouter = express.Router() + +``` + +Die eigene Repräsentation des Dienstanbieters besteht aus all seinen öffentlichen Daten und dem Private-Key, den er zum Signieren von Informationen verwendet. + +```typescript +const sp = samlify.ServiceProvider({ + ...spPublicData, + privateKey: fs.readFileSync("./keys/sp-key.pem"), +}) + +``` + +Die öffentlichen Daten enthalten alles, was der Dienstanbieter über den Identitätsanbieter wissen muss. + +```typescript +const idp = samlify.IdentityProvider(idpPublicData) + +``` + +Um die Interoperabilität mit anderen SAML-Komponenten zu ermöglichen, sollten Dienst- und Identitätsanbieter ihre öffentlichen Daten (die sogenannten Metadaten) im XML-Format unter `/metadata` zur Verfügung stellen. + +```typescript +spRouter.get("/metadata", (req, res) => { + res.header("Content-Type", "text/xml").send(sp.getMetadata()) +}) + +``` + +Dies ist die Seite, auf die der Browser zugreift, um sich zu identifizieren. Die Zusicherung enthält die Benutzerkennung (hier verwenden wir die E-Mail-Adresse) und kann zusätzliche Attribute enthalten. Dies ist der Handler für Schritt 7 im obigen Sequenzdiagramm. + +```typescript +spRouter.post("/assertion", async (req, res) => { + try { +``` + +Sie können den auskommentierten Befehl verwenden, um die in der Zusicherung bereitgestellten XML-Daten anzuzeigen. Sie sind [Base64-kodiert](https://en.wikipedia.org/wiki/Base64). + +```typescript + // console.log(Buffer.from(req.body.SAMLResponse, 'base64').toString('utf8')) +``` + +Parsen Sie die Anmeldeanforderung vom Identitätsserver. + +```typescript + const { extract } = await sp.parseLoginResponse(idp, "post", req) +``` + +Senden Sie eine HTML-Antwort, nur um dem Benutzer zu zeigen, dass wir die Anmeldung erhalten haben. + +```typescript + res.send(` + + +

Login Successful

+

Welcome, ${extract.nameID}

+ + + `) + } catch (e) { +``` + +Informieren Sie den Benutzer im Fehlerfall. + +```typescript + console.error("[FATAL] when parsing login response sent from idp", e) + res.status(500).send(` + + +

Login Failed

+

Check the console for more information

+ + + `) + } +}) + +``` + +Erstellen Sie eine Anmeldeanforderung, wenn der Browser versucht, diese Seite abzurufen. Dies ist der Handler für Schritt 1 im obigen Sequenzdiagramm. + +```typescript +spRouter.get("/login", async (req, res) => { +``` + +Holen Sie sich die Informationen, um eine Anmeldeanforderung zu posten. + +```typescript + const loginRequest = sp.createLoginRequest(idp, "redirect") + +``` + +Diese Seite sendet das Formular (siehe unten) automatisch ab. Auf diese Weise muss der Benutzer nichts tun, um weitergeleitet zu werden. Dies ist Schritt 2 im obigen Sequenzdiagramm. + +```typescript + const html = ` + + +``` + +Posten Sie an `loginRequest.entityEndpoint` (die URL des Endpunkts des Identitätsanbieters). + +```typescript +
+``` + +Der Eingabename ist `loginRequest.type` (`SAMLRequest`). Der Inhalt für dieses Feld ist `loginRequest.context`, was wiederum Base64-kodiertes XML ist. + +```typescript + + +
+ + + ` + res.send(html) +}) + +const app = express() + +``` + +[Diese Middleware](https://expressjs.com/en/5x/api.html#express.urlencoded) liest den Body der [HTTP-Anfrage](https://www.tutorialspoint.com/http/http_requests.htm). Standardmäßig ignoriert Express ihn, da die meisten Anfragen ihn nicht benötigen. Wir brauchen ihn, weil POST den Body verwendet. + +```typescript +app.use(express.urlencoded({ extended: true })) + +``` + +Binden Sie den Router im Verzeichnis des Dienstanbieters (`/sp`) ein. + +```typescript +app.use("/sp", spRouter) + +``` + +Wenn ein Browser versucht, das Stammverzeichnis abzurufen, stellen Sie ihm einen Link zur Anmeldeseite zur Verfügung. + +```typescript +app.get("/", (req, res) => { + res.send(` + + +

Service Provider

+
Login + + + `) +}) + +``` + +Hören Sie mit dieser Express-Anwendung auf den `spPort`. + +```typescript +app.listen(spPort, () => { + console.log(`Service Provider listening at ${spUrl}`) +}) +``` + +#### src/idp.mts + +Dies ist der Identitätsanbieter. Er ist dem Dienstanbieter sehr ähnlich; die folgenden Erklärungen beziehen sich auf die Teile, die unterschiedlich sind. + +```typescript +import fs from "fs" +import express from "express" +import * as samlify from "samlify" +import * as validator from "@authenio/samlify-node-xmllint" +``` + +Wir müssen die XML-Anfrage, die wir vom Dienstanbieter erhalten, lesen und verstehen. + +```typescript +import { XMLParser } from "fast-xml-parser" + +import { idpPort, idpUrl, spPublicData, idpPublicData } from "./config.mjs" + +samlify.setSchemaValidator(validator) + +const idpRouter = express.Router() + +const idp = samlify.IdentityProvider({ + ...idpPublicData, + privateKey: fs.readFileSync("./keys/idp-key.pem"), +}) + +const sp = samlify.ServiceProvider(spPublicData) + +idpRouter.get("/metadata", (req, res) => { + res.header("Content-Type", "text/xml").send(idp.getMetadata()) +}) + +``` + +Diese Funktion erstellt die Seite mit dem automatisch abgesendeten Formular, das in Schritt 4 des obigen Sequenzdiagramms zurückgegeben wird. + +```typescript +const getLoginPage = (reqId: string) => ` + + +

Identity Provider

+
+``` + +Es gibt zwei Felder, die wir an den Dienstanbieter senden: + +1. Die `requestId`, auf die wir antworten. +2. Die Benutzerkennung (wir verwenden vorerst die vom Benutzer angegebene E-Mail-Adresse). + +```typescript + + + + +
+ + +` + +``` + +Dies ist der Handler für Schritt 5 des obigen Sequenzdiagramms. [`idp.createLoginResponse`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L73-L125) erstellt die Anmeldeantwort. + +```typescript +idpRouter.post("/loginSubmitted", async (req, res) => { + const { context } = await idp.createLoginResponse( +``` + +Die Zielgruppe (Audience) ist der Dienstanbieter. + +```typescript + sp, +``` + +Aus der Anfrage extrahierte Informationen. Der einzige Parameter, der uns in der Anfrage interessiert, ist die `requestId`, die es dem Dienstanbieter ermöglicht, Anfragen und deren Antworten zuzuordnen. + +```typescript + { + extract: { + request: { + id: req.body.reqId, + }, + }, + }, + "post", +``` + +Wir benötigen den `signingKey`, um die Daten zum Signieren der Antwort zu haben. Der Dienstanbieter vertraut keinen unsignierten Anfragen. + +```typescript + { + signingKey: fs.readFileSync("./keys/idp-key.pem"), + }, +``` + +Dies ist das Feld mit den Benutzerinformationen, die wir an den Dienstanbieter zurücksenden. + +```typescript + (template: string) => { + return template.replace("{nameID}", req.body.email) + } + ) + +``` + +Verwenden Sie erneut ein automatisch abgesendetes Formular. Dies ist Schritt 6 des obigen Sequenzdiagramms. + +```typescript + const html = ` + + +
+ + +
+ + + ` + res.send(html) +}) + +``` + +Dies ist der Endpunkt, der eine Anmeldeanforderung vom Dienstanbieter empfängt. Dies ist der Handler für Schritt 3 des obigen Sequenzdiagramms. + +```typescript +idpRouter.post("/login", async (req, res) => { +``` + +Wir sollten in der Lage sein, [`idp.parseLoginRequest`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L127-L144) zu verwenden, um die ID der Authentifizierungsanfrage zu lesen. Ich konnte es jedoch nicht zum Laufen bringen und es war nicht wert, viel Zeit darauf zu verwenden, also verwende ich einfach einen [allgemeinen XML-Parser](https://www.npmjs.com/package/fast-xml-parser). Die Information, die wir benötigen, ist das `ID`-Attribut innerhalb des ``-Tags, das sich auf der obersten Ebene des XML befindet. + +```typescript + const xmlStr = Buffer.from(req.body.SAMLRequest, "base64").toString("utf8") + const parser = new XMLParser({ ignoreAttributes: false }) + const xmlObj = parser.parse(xmlStr) + const reqId = xmlObj["samlp:AuthnRequest"]["@_ID"] + + res.send(getLoginPage(reqId)) +}) + +const app = express() + +app.use(express.urlencoded({ extended: true })) + +app.use("/idp", idpRouter) + +app.listen(idpPort, () => { + console.log(`Identity Provider listening at ${idpUrl}`) +}) +``` + +## Verwendung von Ethereum-Signaturen + +Da wir nun eine Benutzeridentität an den Dienstanbieter senden können, besteht der nächste Schritt darin, die Benutzeridentität auf vertrauenswürdige Weise zu erhalten. Viem ermöglicht es uns, einfach das Wallet nach der Benutzeradresse zu fragen, aber das bedeutet, den Browser nach den Informationen zu fragen. Wir kontrollieren den Browser nicht, also können wir der Antwort, die wir von ihm erhalten, nicht automatisch vertrauen. + +Stattdessen wird der IdP dem Browser eine Zeichenfolge zum Signieren senden. Wenn das Wallet im Browser diese Zeichenfolge signiert, bedeutet das, dass es sich wirklich um diese Adresse handelt (das heißt, es kennt den Private-Key, der der Adresse entspricht). + +Um dies in Aktion zu sehen, stoppen Sie den bestehenden IdP und SP und führen Sie diese Befehle aus: + +```sh +git checkout saml-and-eth +yarn +yarn start +``` + +Rufen Sie dann [den SP](http://localhost:3000) auf und folgen Sie den Anweisungen. + +Beachten Sie, dass wir zu diesem Zeitpunkt nicht wissen, wie wir die E-Mail-Adresse aus der Ethereum-Adresse erhalten, also melden wir stattdessen `@bad.email.address` an den SP. + +### Detaillierte Erklärung + +Die Änderungen befinden sich in den Schritten 4-5 im vorherigen Diagramm. + +![SAML mit einer Ethereum-Signatur](./fig-05-saml-w-signature.png) + +Die einzige Datei, die wir geändert haben, ist `idp.mts`. Hier sind die geänderten Teile. + +```typescript +import { XMLParser } from "fast-xml-parser" +``` + +Wir benötigen diese beiden zusätzlichen Bibliotheken. Wir verwenden [`uuid`](https://www.npmjs.com/package/uuid), um den [Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce)-Wert zu erstellen. Der Wert selbst spielt keine Rolle, nur die Tatsache, dass er nur einmal verwendet wird. + +Die Bibliothek [`viem`](https://viem.sh/) ermöglicht es uns, Ethereum-Definitionen zu verwenden. Hier benötigen wir sie, um zu verifizieren, dass die Signatur tatsächlich gültig ist. + +```typescript +import { v4 as uuidv4 } from "uuid" +import { verifyMessage } from "viem" + +import { idpPort, idpUrl, spPublicData, idpPublicData } from "./config.mjs" +``` + +Das Wallet bittet den Benutzer um Erlaubnis, die Nachricht zu signieren. Eine Nachricht, die nur eine Nonce ist, könnte Benutzer verwirren, daher fügen wir diese Aufforderung hinzu. + +```typescript +const prompt = "Please sign this message to log in. Nonce: " + +``` + +Wir benötigen die Anfrageinformationen, um darauf antworten zu können. Wir könnten sie mit der Anfrage senden (Schritt 4) und sie zurückerhalten (Schritt 5). Wir können jedoch den Informationen, die wir vom Browser erhalten, nicht vertrauen, da dieser unter der Kontrolle eines potenziell feindlichen Benutzers steht. Es ist also besser, sie hier mit der Nonce als Schlüssel zu speichern. + +Beachten Sie, dass wir dies hier der Einfachheit halber als Variable tun. Dies hat jedoch mehrere Nachteile: + +- Wir sind anfällig für einen Denial-of-Service-Angriff. Ein böswilliger Benutzer könnte versuchen, sich mehrmals anzumelden und so unseren Speicher zu füllen. +- Wenn der IdP-Prozess neu gestartet werden muss, verlieren wir die vorhandenen Werte. +- Wir können keinen Lastausgleich über mehrere Prozesse hinweg durchführen, da jeder seine eigene Variable hätte. + +Auf einem Produktionssystem würden wir eine Datenbank verwenden und eine Art Ablaufmechanismus implementieren. + +```typescript +const nonces: Record = {} + +``` + +Erstellen Sie eine Nonce und speichern Sie die `requestId` für die zukünftige Verwendung. + +```typescript +const getSignaturePage = (reqId: string) => { + const nonce = uuidv4() + nonces[nonce] = reqId + + return ` + + +``` + +Dieses JavaScript wird automatisch ausgeführt, wenn die Seite geladen wird. + +```typescript + + +``` + +Die Signatur wird vom Browser zurückgesendet, der potenziell böswillig ist (es hindert Sie nichts daran, einfach `http://localhost:3001/idp/signature/bad-nonce/bad-address/bad-signature` im Browser zu öffnen). Daher ist es wichtig zu verifizieren, dass der IdP-Prozess fehlerhafte Signaturen korrekt verarbeitet. + +```typescript + +``` + +Der Rest ist nur Standard-HTML. + +```typescript +

Identity Provider

+

Please sign the message in your wallet to log in.

+ + +` +} + +``` + +Dies ist der Handler für Schritt 5 im Sequenzdiagramm. + +```typescript +idpRouter.get("/signature/:nonce/:address/:signature", async (req, res) => { + const { nonce, address, signature } = req.params + +``` + +Holen Sie sich die Anfrage-ID und löschen Sie die Nonce aus `nonces`, um sicherzustellen, dass sie nicht wiederverwendet werden kann. + +```typescript + const reqId = nonces[nonce] + delete nonces[nonce] + + if (!reqId) { + res.status(400).send("Invalid nonce") + return + } + +``` + +Da es so viele Möglichkeiten gibt, wie die Signatur ungültig sein kann, verpacken wir dies in einen `try ... catch`-Block, um alle ausgelösten Fehler abzufangen. + +```typescript + try { +``` + +Verwenden Sie [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage), um Schritt 5.5 im Sequenzdiagramm zu implementieren. + +```typescript + const valid = await verifyMessage({ + address: address as `0x${string}`, + message: `${prompt}${nonce}`, + signature: signature as `0x${string}`, + }) + + if (!valid) { + res.status(400).send("Invalid signature") + return + } + } catch (e) { + res.status(400).send("Invalid signature") + return + } + +``` + +Der Rest des Handlers entspricht dem, was wir zuvor im `/loginSubmitted`-Handler getan haben, bis auf eine kleine Änderung. + +```typescript + const { context } = await idp.createLoginResponse( + sp, + { + extract: { + request: { + id: reqId, + }, + }, + }, + "post", + { + signingKey: fs.readFileSync("./keys/idp-key.pem"), + }, + (template: string) => { +``` + +Wir haben nicht die tatsächliche E-Mail-Adresse (wir werden sie im nächsten Abschnitt erhalten), also geben wir vorerst die Ethereum-Adresse zurück und markieren sie deutlich als keine E-Mail-Adresse. + +```typescript + return template.replace("{nameID}", `${address}@bad.email.address`) + } + ) + + const html = ` + + +
+ + +
+ + + ` + res.send(html) +}) + +idpRouter.post("/login", async (req, res) => { + const xmlStr = Buffer.from(req.body.SAMLRequest, "base64").toString("utf8") + const parser = new XMLParser({ ignoreAttributes: false }) + const xmlObj = parser.parse(xmlStr) + const reqId = xmlObj["samlp:AuthnRequest"]["@_ID"] + +``` + +Verwenden Sie nun anstelle von `getLoginPage` `getSignaturePage` im Handler für Schritt 3. + +```typescript + res.send(getSignaturePage(reqId)) +}) +``` + +## Abrufen der E-Mail-Adresse + +Der nächste Schritt besteht darin, die E-Mail-Adresse zu erhalten, die vom Dienstanbieter angeforderte Kennung. Dazu verwenden wir den [Ethereum Attestation Service (EAS)](https://attest.org/). + +Der einfachste Weg, Bestätigungen zu erhalten, ist die Verwendung der [GraphQL-API](https://docs.attest.org/docs/developer-tools/api). Wir verwenden diese Abfrage: + +```graphql +query Attestations($schemaId: StringFilter!, $recipient: StringFilter!) { + attestations(where: {schemaId: $schemaId, recipient: $recipient}) { + attester + id + data + } +} +``` + +Diese [`schemaId`](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977) enthält nur eine E-Mail-Adresse. Diese Abfrage fragt nach Bestätigungen dieses Schemas. Das Subjekt der Bestätigung wird als `recipient` (Empfänger) bezeichnet. Es ist immer eine Ethereum-Adresse. + +Warnung: Die Art und Weise, wie wir hier Bestätigungen erhalten, hat zwei Sicherheitsprobleme. + +- Wir greifen auf den API-Endpunkt `https://optimism.easscan.org/graphql` zu, der eine zentralisierte Komponente ist. Wir können das `id`-Attribut abrufen und dann eine Suche auf der Blockchain durchführen, um zu verifizieren, dass eine Bestätigung echt ist, aber der API-Endpunkt kann Bestätigungen immer noch zensieren, indem er uns nichts davon erzählt. + + Dieses Problem ist nicht unlösbar; wir könnten unseren eigenen GraphQL-Endpunkt betreiben und die Bestätigungen aus den Chain-Logs abrufen, aber das ist für unsere Zwecke übertrieben. + +- Wir betrachten nicht die Identität des Bestätigenden. Jeder kann uns falsche Informationen liefern. In einer realen Implementierung hätten wir eine Reihe von vertrauenswürdigen Bestätigenden und würden nur deren Bestätigungen berücksichtigen. + +Um dies in Aktion zu sehen, stoppen Sie den bestehenden IdP und SP und führen Sie diese Befehle aus: + +```sh +git checkout saml-eth-eas +yarn +yarn start +``` + +Geben Sie dann Ihre E-Mail-Adresse an. Sie haben zwei Möglichkeiten, dies zu tun: + +- Importieren Sie ein Wallet mit einem Private-Key und verwenden Sie den Test-Private-Key `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80`. + +- Fügen Sie eine Bestätigung für Ihre eigene E-Mail-Adresse hinzu: + + 1. Rufen Sie [das Schema im Attestation Explorer](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977) auf. + + 2. Klicken Sie auf **Attest with Schema**. + + 3. Geben Sie Ihre Ethereum-Adresse als Empfänger und Ihre E-Mail-Adresse als E-Mail-Adresse ein und wählen Sie **Onchain**. Klicken Sie dann auf **Make Attestation**. + + 4. Genehmigen Sie die Transaktion in Ihrem Wallet. Sie benötigen etwas ETH auf [der Optimism-Blockchain](https://app.optimism.io/bridge/deposit), um für Gas zu bezahlen. + +So oder so, rufen Sie danach [http://localhost:3000](http://localhost:3000) auf und folgen Sie den Anweisungen. Wenn Sie den Test-Private-Key importiert haben, lautet die E-Mail, die Sie erhalten, `test_addr_0@example.com`. Wenn Sie Ihre eigene Adresse verwendet haben, sollte es das sein, was Sie bestätigt haben. + +### Detaillierte Erklärung + +![Von der Ethereum-Adresse zur E-Mail gelangen](./fig-06-saml-sig-n-email.png) + +Die neuen Schritte sind die GraphQL-Kommunikation, Schritte 5.6 und 5.7. + +Hier sind wiederum die geänderten Teile von `idp.mts`. + +```typescript +import { v4 as uuidv4 } from "uuid" +import { verifyMessage, getAddress } from "viem" +``` + +Importieren Sie die Bibliotheken, die wir benötigen. + +```typescript +import { GraphQLClient, gql } from "graphql-request" +import { SchemaEncoder } from "@ethereum-attestation-service/eas-sdk" + +import { idpPort, idpUrl, spPublicData, idpPublicData } from "./config.mjs" + +``` + +Es gibt [einen separaten Endpunkt für jede Blockchain](https://docs.attest.org/docs/developer-tools/api). + +```typescript +const easEndpoint = "https://optimism.easscan.org/graphql" + +``` + +Erstellen Sie einen neuen `GraphQLClient`-Client, den wir zum Abfragen des Endpunkts verwenden können. + +```typescript +const easClient = new GraphQLClient(easEndpoint) + +``` + +GraphQL gibt uns nur ein undurchsichtiges Datenobjekt mit Bytes. Um es zu verstehen, benötigen wir das Schema. + +```typescript +const schemaEncoder = new SchemaEncoder("string email") + +``` + +Eine Funktion, um von einer Ethereum-Adresse zu einer E-Mail-Adresse zu gelangen. + +```typescript +const getEmail = async (ethAddr: string) => { +``` + +Dies ist eine GraphQL-Abfrage. + +```typescript + const query = gql` +``` + +Wir suchen nach Bestätigungen. + +```typescript + query Attestations($schemaId: StringFilter!, $recipient: StringFilter!) { + attestations( + where: { schemaId: $schemaId, recipient: $recipient } +``` + +Die Bestätigungen, die wir wollen, sind diejenigen in unserem Schema, bei denen der Empfänger `getAddress(ethAddr)` ist. Die Funktion [`getAddress`](https://viem.sh/docs/utilities/getAddress#getaddress) stellt sicher, dass unsere Adresse die korrekte [Prüfsumme](https://github.com/ethereum/ercs/blob/master/ERCS/erc-55.md) hat. Dies ist notwendig, da GraphQL zwischen Groß- und Kleinschreibung unterscheidet. „0xBAD060A7“, „0xBad060A7“ und „0xbad060a7“ sind unterschiedliche Werte. + +```typescript + take: 1 +``` + +Unabhängig davon, wie viele Bestätigungen wir finden, wollen wir nur die erste. + +```typescript + ) { +``` + +Die Felder, die wir empfangen möchten. + +- `attester`: Die Adresse, die die Bestätigung eingereicht hat. Normalerweise wird dies verwendet, um zu entscheiden, ob der Bestätigung vertraut werden soll oder nicht. +- `id`: Die Bestätigungs-ID. Sie können diesen Wert verwenden, um [die Bestätigung auf der Blockchain zu lesen](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000021?tab=read_proxy&source_address=0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088#0xa3112a64), um zu verifizieren, dass die Informationen aus der GraphQL-Abfrage korrekt sind. +- `data`: Die Schemadaten (in diesem Fall die E-Mail-Adresse). + +```typescript + attester + id + data + } + } + ` + + const variables = { + schemaId: { + equals: + "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977", + }, + recipient: { + equals: getAddress(ethAddr), + }, + } + + const response: any = await easClient.request(query, variables) + +``` + +Wenn es keine Bestätigung gibt, geben Sie einen Wert zurück, der offensichtlich falsch ist, aber dem Dienstanbieter als gültig erscheinen würde. + +```typescript + if (response.attestations.length === 0) { + return `${ethAddr}@no.attestation.found` + } + +``` + +Wenn ein Wert vorhanden ist, verwenden Sie `decodeData`, um die Daten zu dekodieren. Wir benötigen nicht die bereitgestellten Metadaten, sondern nur den Wert selbst. + +```typescript + const data = schemaEncoder.decodeData(response.attestations[0].data) + return data[0].value.value +} + +samlify.setSchemaValidator(validator) +``` + +Verwenden Sie die neue Funktion, um die E-Mail-Adresse zu erhalten. + +```typescript + const email = await getEmail(address) + + const { context } = await idp.createLoginResponse( + sp, + { + extract: { + request: { + id: reqId, + }, + }, + }, + "post", + { + signingKey: fs.readFileSync("./keys/idp-key.pem"), + }, + (template: string) => { + return template.replace("{nameID}", email) + } + ) +``` + +## Was ist mit Dezentralisierung? + +In dieser Konfiguration können Benutzer nicht vorgeben, jemand zu sein, der sie nicht sind, solange wir uns auf vertrauenswürdige Bestätigende für die Zuordnung von Ethereum- zu E-Mail-Adressen verlassen. Unser Identitätsanbieter ist jedoch immer noch eine zentralisierte Komponente. Wer auch immer den Private-Key des Identitätsanbieters besitzt, kann falsche Informationen an den Dienstanbieter senden. + +Es könnte eine Lösung geben, die [Multi-Party Computation (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) verwendet. Ich hoffe, in einem zukünftigen Tutorial darüber zu schreiben. + +## Fazit + +Die Einführung eines Anmeldestandards, wie z. B. Ethereum-Signaturen, steht vor einem Henne-Ei-Problem. Dienstanbieter möchten einen möglichst breiten Markt ansprechen. Benutzer möchten auf Dienste zugreifen können, ohne sich Gedanken über die Unterstützung ihres Anmeldestandards machen zu müssen. +Die Erstellung von Adaptern, wie z. B. einem Ethereum-IdP, kann uns helfen, diese Hürde zu überwinden. + +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/gasless/index.md b/public/content/translations/de/developers/tutorials/gasless/index.md new file mode 100644 index 00000000000..57ef841b386 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/gasless/index.md @@ -0,0 +1,363 @@ +--- +title: "Sponsoring von Gasgebühren: Wie Sie Transaktionskosten für Ihre Nutzer übernehmen" +description: "Es ist einfach, einen Private-Key und eine Adresse zu erstellen; es ist nur eine Frage der Ausführung der richtigen Software. Aber es gibt viele Orte auf der Welt, an denen es viel schwieriger ist, ETH zu bekommen, um Transaktionen zu senden. In diesem Tutorial lernen Sie, wie Sie die Gasgebühren auf der Blockchain für die Ausführung von nutzersignierten, strukturierten Off-Chain-Daten in Ihrem Smart Contract übernehmen. Sie lassen den Nutzer eine Struktur signieren, die die Transaktionsinformationen enthält, welche Ihr Off-Chain-Code dann als Transaktion an die Blockchain übermittelt." +author: Ori Pomerantz +tags: ["gaslos", "Solidity", "EIP-712", "Meta-Transaktionen"] +skill: intermediate +breadcrumb: Gas-Sponsoring +lang: de +published: 2026-02-27 +--- + +## Einführung {#introduction} + +Wenn wir wollen, dass Ethereum [einer Milliarde weiterer Menschen](https://blog.ethereum.org/category/next-billion) dient, müssen wir Reibungspunkte beseitigen und die Nutzung so einfach wie möglich machen. Eine Quelle dieser Reibung ist die Notwendigkeit von ETH, um Gasgebühren zu bezahlen. + +Wenn Sie eine Dapp haben, die mit Nutzern Geld verdient, könnte es sinnvoll sein, Nutzer Transaktionen über Ihren Server einreichen zu lassen und die Transaktionsgebühren selbst zu bezahlen. Da die Nutzer weiterhin eine [EIP-712-Autorisierungsnachricht](https://eips.ethereum.org/EIPS/eip-712) in ihren Wallets signieren, behalten sie die Integritätsgarantien von Ethereum. Die Verfügbarkeit hängt von dem Server ab, der die Transaktionen weiterleitet, und ist daher eingeschränkter. Sie können es jedoch so einrichten, dass Nutzer auch direkt auf den Smart Contract zugreifen können (wenn sie ETH erhalten), und andere ihre eigenen Server einrichten lassen, wenn sie Transaktionen sponsern möchten. + +Die Technik in diesem Tutorial funktioniert nur, wenn Sie den Smart Contract kontrollieren. Es gibt andere Techniken, einschließlich der [Kontoabstraktion](https://eips.ethereum.org/EIPS/eip-4337), mit denen Sie Transaktionen an andere Smart Contracts sponsern können, was ich hoffentlich in einem zukünftigen Tutorial behandeln werde. + +Hinweis: Dies ist _kein_ produktionsreifer Code. Er ist anfällig für erhebliche Angriffe und es fehlen wichtige Funktionen. Erfahren Sie mehr im [Abschnitt über Schwachstellen in diesem Leitfaden](#vulnerabilities). + +### Voraussetzungen {#prerequisites} + +Um dieses Tutorial zu verstehen, sollten Sie bereits vertraut sein mit: + +- Solidity +- JavaScript +- React und WAGMI. Wenn Sie mit diesen Benutzeroberflächen-Tools nicht vertraut sind, [haben wir ein Tutorial dafür](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). + +## Die Beispielanwendung {#sample-app} + +Die hier gezeigte Beispielanwendung ist eine Variante des `Greeter`-Vertrags von Hardhat. Sie können sie [auf GitHub](https://github.com/qbzzt/260301-gasless) ansehen. Der Smart Contract ist bereits auf [Sepolia](https://sepolia.dev/) unter der Adresse [`0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA`](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA) bereitgestellt. + +Um sie in Aktion zu sehen, befolgen Sie diese Schritte. + +1. Klonen Sie das Repository und installieren Sie die erforderliche Software. + + ```sh + git clone https://github.com/qbzzt/260301-gasless.git + cd 260301-gasless/server + npm install +``` + +2. Bearbeiten Sie `.env`, um `PRIVATE_KEY` auf ein Wallet zu setzen, das ETH auf Sepolia hat. Wenn Sie Sepolia-ETH benötigen, [verwenden Sie ein Faucet](/developers/docs/networks/#sepolia). Idealerweise sollte sich dieser Private-Key von dem in Ihrem Browser-Wallet unterscheiden. + +3. Starten Sie den Server. + + ```sh + npm run dev +``` + +4. Rufen Sie die Anwendung unter der URL [`http://localhost:5173`](http://localhost:5173) auf. + +5. Klicken Sie auf **Connect with Injected**, um sich mit einem Wallet zu verbinden. Bestätigen Sie dies im Wallet und genehmigen Sie bei Bedarf den Wechsel zu Sepolia. + +6. Schreiben Sie eine neue Begrüßung und klicken Sie auf **Update greeting via sponsor**. + +7. Signieren Sie die Nachricht. + +8. Warten Sie etwa 12 Sekunden (die Blockzeit auf Sepolia). Während Sie warten, können Sie sich die URL in der Serverkonsole ansehen, um die Transaktion zu sehen. + +9. Sehen Sie, dass sich die Begrüßung geändert hat und dass der Wert der Adresse, die zuletzt aktualisiert hat, nun die Adresse Ihres Browser-Wallets ist. + +Um zu verstehen, wie das funktioniert, müssen wir uns ansehen, wie die Nachricht in der Benutzeroberfläche erstellt wird, wie sie vom Server weitergeleitet wird und wie der Smart Contract sie verarbeitet. + +### Die Benutzeroberfläche {#ui-changes} + +Die Benutzeroberfläche basiert auf [WAGMI](https://wagmi.sh/); Sie können [in diesem Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) darüber lesen. + +So signieren wir die Nachricht: + +```js +const signGreeting = useCallback( +``` + +Der React-Hook [`useCallback`](https://react.dev/reference/react/useCallback) ermöglicht es uns, die Leistung zu verbessern, indem wir dieselbe Funktion wiederverwenden, wenn die Komponente neu gezeichnet wird. + +```js + async (greeting) => { + if (!account) throw new Error("Wallet not connected") +``` + +Wenn es kein Konto gibt, wird ein Fehler ausgelöst. Dies sollte niemals passieren, da die UI-Schaltfläche, die den Prozess startet, der `signGreeting` aufruft, in diesem Fall deaktiviert ist. Zukünftige Programmierer könnten diese Schutzmaßnahme jedoch entfernen, daher ist es eine gute Idee, diese Bedingung auch hier zu überprüfen. + +```js + const domain = { + name: "Greeter", + version: "1", + chainId, + verifyingContract: contractAddr, + } +``` + +Parameter für den [Domain-Separator](https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator). Dieser Wert ist konstant, daher könnten wir ihn in einer besser optimierten Implementierung einmal berechnen, anstatt ihn bei jedem Aufruf der Funktion neu zu berechnen. + +- `name` ist ein für den Nutzer lesbarer Name, wie z. B. der Name der Dapp, für die wir Signaturen erstellen. +- `version` ist die Version. Verschiedene Versionen sind nicht kompatibel. +- `chainId` ist die Chain, die wir verwenden, wie sie [von WAGMI](https://wagmi.sh/react/api/hooks/useChainId) bereitgestellt wird. +- `verifyingContract` ist die Vertragsadresse, die diese Signatur verifizieren wird. Wir möchten nicht, dass dieselbe Signatur für mehrere Verträge gilt, falls es mehrere `Greeter`-Verträge gibt und wir möchten, dass sie unterschiedliche Begrüßungen haben. + +```js + + const types = { + GreetingRequest: [ + { name: "greeting", type: "string" }, + ], + } +``` + +Der Datentyp, den wir signieren. Hier haben wir einen einzigen Parameter, `greeting`, aber reale Systeme haben typischerweise mehr. + +```js + const message = { greeting } +``` + +Die eigentliche Nachricht, die wir signieren und senden möchten. `greeting` ist sowohl der Feldname als auch der Name der Variablen, die ihn füllt. + +```js + const signature = await signTypedDataAsync({ + domain, + types, + primaryType: "GreetingRequest", + message, + }) +``` + +Die Signatur tatsächlich abrufen. Diese Funktion ist asynchron, da Nutzer (aus Sicht eines Computers) lange brauchen, um Daten zu signieren. + +```js + const r = `0x${signature.slice(2, 66)}` + const s = `0x${signature.slice(66, 130)}` + const v = parseInt(signature.slice(130, 132), 16) + + return { + req: { greeting }, + v, + r, + s, + } + }, +``` + +Die Funktion gibt einen einzelnen hexadezimalen Wert zurück. Hier teilen wir ihn in Felder auf. + +```js + [account, chainId, contractAddr, signTypedDataAsync], +) +``` + +Wenn sich eine dieser Variablen ändert, erstellen Sie eine neue Instanz der Funktion. Die Parameter `account` und `chainId` können vom Nutzer im Wallet geändert werden. `contractAddr` ist eine Funktion der Chain-ID. `signTypedDataAsync` sollte sich nicht ändern, aber wir importieren es aus [einem Hook](https://wagmi.sh/react/api/hooks/useSignTypedData), daher können wir nicht sicher sein, und es ist am besten, es hier hinzuzufügen. + +Nachdem die neue Begrüßung nun signiert ist, müssen wir sie an den Server senden. + +```js + const sponsoredGreeting = async () => { + try { +``` + +Diese Funktion nimmt eine Signatur und sendet sie an den Server. + +```js + const signedMessage = await signGreeting(newGreeting) + const response = await fetch("/server/sponsor", { +``` + +Senden Sie an den Pfad `/server/sponsor` auf dem Server, von dem wir gekommen sind. + +```js + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(signedMessage), + }) +``` + +Verwenden Sie `POST`, um die Informationen JSON-codiert zu senden. + +```js + const data = await response.json() + console.log("Server response:", data) + } catch (err) { + console.error("Error:", err) + } + } +``` + +Geben Sie die Antwort aus. Auf einem Produktionssystem würden wir die Antwort auch dem Nutzer anzeigen. + +### Der Server {#server} + +Ich verwende gerne [Vite](https://vite.dev/) als mein Front-End. Es stellt automatisch die React-Bibliotheken bereit und aktualisiert den Browser, wenn sich der Front-End-Code ändert. Vite enthält jedoch keine Backend-Tools. + +Die Lösung befindet sich in [`index.js`](https://github.com/qbzzt/260301-gasless/blob/main/server/index.js). + +```js + app.post("/server/sponsor", async (req, res) => { + ... + }) + + // Lass Vite alles andere erledigen + const vite = await createViteServer({ + server: { middlewareMode: true } + }) + + app.use(vite.middlewares) +``` + +Zuerst registrieren wir einen Handler für die Anfragen, die wir selbst bearbeiten (`POST` an `/server/sponsor`). Dann erstellen und verwenden wir einen Vite-Server, um alle anderen URLs zu verarbeiten. + +```js + app.post("/server/sponsor", async (req, res) => { + try { + const signed = req.body + + const txHash = await sepoliaClient.writeContract({ + address: greeterAddr, + abi: greeterABI, + functionName: 'sponsoredSetGreeting', + args: [signed.req, signed.v, signed.r, signed.s], + }) + } ... + }) +``` + +Dies ist nur ein standardmäßiger [viem](https://viem.sh/)-Blockchain-Aufruf. + +### Der Smart Contract {#smart-contract} + +Schließlich muss [`Greeter.sol`](https://github.com/qbzzt/260301-gasless/blob/main/contracts/src/Greeter.sol) die Signatur verifizieren. + +```solidity + constructor(string memory _greeting) { + greeting = _greeting; + + DOMAIN_SEPARATOR = keccak256( + abi.encode( + keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ), + keccak256(bytes("Greeter")), + keccak256(bytes("1")), + block.chainid, + address(this) + ) + ); + } +``` + +Der Konstruktor erstellt den [Domain-Separator](https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator), ähnlich wie der obige Benutzeroberflächen-Code. Die Ausführung auf der Blockchain ist viel teurer, daher berechnen wir ihn nur einmal. + +```solidity + struct GreetingRequest { + string greeting; + } +``` + +Dies ist die Struktur, die signiert wird. Hier haben wir nur ein Feld. + +```solidity + bytes32 private constant GREETING_TYPEHASH = + keccak256("GreetingRequest(string greeting)"); +``` + +Dies ist der [Struktur-Identifikator](https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct). Er wird jedes Mal in der Benutzeroberfläche berechnet. + +```solidity + function sponsoredSetGreeting( + GreetingRequest calldata req, + uint8 v, + bytes32 r, + bytes32 s + ) external { +``` + +Diese Funktion empfängt eine signierte Anfrage und aktualisiert die Begrüßung. + +```solidity + // EIP-712-Digest berechnen + bytes32 digest = keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR, + keccak256( + abi.encode( + GREETING_TYPEHASH, + keccak256(bytes(req.greeting)) + ) + ) + ) + ); +``` + +Erstellen Sie den Digest in Übereinstimmung mit [EIP 712](https://eips.ethereum.org/EIPS/eip-712). + +```solidity + // Signer wiederherstellen + address signer = ecrecover(digest, v, r, s); + require(signer != address(0), "Invalid signature"); +``` + +Verwenden Sie [`ecrecover`](https://www.evm.codes/precompiled?fork=osaka#0x01), um die Adresse des Unterzeichners zu erhalten. Beachten Sie, dass eine fehlerhafte Signatur dennoch zu einer gültigen Adresse führen kann, nur eben zu einer zufälligen. + +```solidity + // Begrüßung anwenden, als hätte der Signer sie aufgerufen + greeting = req.greeting; + emit SetGreeting(signer, req.greeting); + } +``` + +Aktualisieren Sie die Begrüßung. + +## Schwachstellen {#vulnerabilities} + +Dies ist _kein_ produktionsreifer Code. Er ist anfällig für erhebliche Angriffe und es fehlen wichtige Funktionen. Hier sind einige davon, zusammen mit Lösungsansätzen. + +Um einige dieser Angriffe zu sehen, klicken Sie auf die Schaltflächen unter der Überschrift _Attacks_ und sehen Sie, was passiert. Für die Schaltfläche **Invalid signature** überprüfen Sie die Serverkonsole, um die Transaktionsantwort zu sehen. + +### Denial-of-Service auf dem Server {#dos-on-server} + +Der einfachste Angriff ist ein [Denial-of-Service](https://en.wikipedia.org/wiki/Denial-of-service_attack)-Angriff auf den Server. Der Server empfängt Anfragen von überall im Internet und sendet basierend auf diesen Anfragen Transaktionen. Es gibt absolut nichts, was einen Angreifer daran hindert, eine Reihe von Signaturen auszustellen, ob gültig oder ungültig. Jede wird eine Transaktion verursachen. Letztendlich wird dem Server das ETH ausgehen, um für Gas zu bezahlen. + +Eine Lösung für dieses Problem besteht darin, die Rate auf eine Transaktion pro Block zu begrenzen. Wenn der Zweck darin besteht, Begrüßungen für [Extern verwaltete Konten](/developers/docs/accounts/#key-differences) anzuzeigen, spielt es ohnehin keine Rolle, wie die Begrüßung in der Mitte des Blocks lautet. + +Eine weitere Lösung besteht darin, Adressen nachzuverfolgen und nur Signaturen von gültigen Kunden zuzulassen. + +### Falsche Begrüßungssignaturen {#wrong-greeting-sigs} + +Wenn Sie auf **Signature for wrong greeting** klicken, übermitteln Sie eine gültige Signatur für eine bestimmte Adresse (`0xaA92c5d426430D4769c9E878C1333BDe3d689b3e`) und Begrüßung (`Hello`). Aber sie wird mit einer anderen Begrüßung übermittelt. Dies verwirrt `ecrecover`, was die Begrüßung ändert, aber die falsche Adresse hat. + +Um dieses Problem zu lösen, fügen Sie die Adresse zur [signierten Struktur](https://github.com/qbzzt/260301-gasless/blob/main/server/src/Greeter.jsx#L122-L124) hinzu. Auf diese Weise stimmt die zufällige Adresse von `ecrecover` nicht mit der Adresse in der Signatur überein, und der Smart Contract wird die Nachricht ablehnen. + +### Replay-Angriffe {#replay-attack} + +Wenn Sie auf **Replay attack** klicken, übermitteln Sie dieselbe Signatur „Ich bin 0xaA92c5d426430D4769c9E878C1333BDe3d689b3e und ich möchte, dass die Begrüßung `Hello` lautet“, aber mit der korrekten Begrüßung. Infolgedessen glaubt der Smart Contract, dass die Adresse (die nicht Ihre ist) die Begrüßung wieder in `Hello` geändert hat. Die Informationen dazu sind öffentlich in den [Transaktionsinformationen](https://eth-sepolia.blockscout.com/tx/0xa66afe4bbf886f59533e677a798c802ceab1ac0f9db6e83a4d4b59a45cf7c1b1) verfügbar. + +Wenn dies ein Problem darstellt, besteht eine Lösung darin, eine [Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce) hinzuzufügen. Erstellen Sie ein [Mapping](https://docs.soliditylang.org/en/latest/types.html#mapping-types) zwischen Adressen und Zahlen und fügen Sie der Signatur ein Nonce-Feld hinzu. Wenn das Nonce-Feld mit dem Mapping für die Adresse übereinstimmt, akzeptieren Sie die Signatur und erhöhen Sie das Mapping für das nächste Mal. Wenn nicht, lehnen Sie die Transaktion ab. + +Eine weitere Lösung besteht darin, den signierten Daten einen Zeitstempel hinzuzufügen und die Signatur nur für wenige Sekunden nach diesem Zeitstempel als gültig zu akzeptieren. Dies ist einfacher und billiger, aber wir riskieren Replay-Angriffe innerhalb des Zeitfensters und das Fehlschlagen legitimer Transaktionen, wenn das Zeitfenster überschritten wird. + +## Weitere fehlende Funktionen {#other-missing-features} + +Es gibt zusätzliche Funktionen, die wir in einer Produktionsumgebung hinzufügen würden. + +### Zugriff von anderen Servern {#other-servers} + +Derzeit erlauben wir jeder Adresse, ein `sponsorSetGreeting` zu übermitteln. Dies könnte im Interesse der Dezentralisierung genau das sein, was wir wollen. Oder vielleicht möchten wir sicherstellen, dass gesponserte Transaktionen über _unseren_ Server laufen, in welchem Fall wir `msg.sender` im Smart Contract überprüfen würden. + +So oder so sollte dies eine bewusste Designentscheidung sein und nicht nur das Ergebnis davon, dass man nicht über das Problem nachgedacht hat. + +### Fehlerbehandlung {#error-handling} + +Ein Nutzer übermittelt eine Begrüßung. Vielleicht wird sie beim nächsten Block aktualisiert. Vielleicht auch nicht. Fehler sind unsichtbar. Auf einem Produktionssystem sollte der Nutzer zwischen diesen Fällen unterscheiden können: + +- Die neue Begrüßung wurde noch nicht übermittelt +- Die neue Begrüßung wurde übermittelt und wird verarbeitet +- Die neue Begrüßung wurde abgelehnt + +## Fazit {#conclusion} + +An diesem Punkt sollten Sie in der Lage sein, ein gasloses Erlebnis für die Nutzer Ihrer Dapp zu schaffen, auf Kosten einer gewissen Zentralisierung. + +Dies funktioniert jedoch nur mit Smart Contracts, die ERC-712 unterstützen. Um beispielsweise einen ERC-20-Token zu übertragen, ist es erforderlich, dass die Transaktion vom Eigentümer signiert wird und nicht nur eine Nachricht. Die Lösung ist die [Kontoabstraktion (ERC-4337)](https://docs.erc4337.io/index.html). Ich hoffe, in Zukunft ein Tutorial darüber zu schreiben. + +[Sehen Sie hier für weitere meiner Arbeiten](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md new file mode 100644 index 00000000000..3c777994c5d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -0,0 +1,150 @@ +--- +title: Erste Schritte mit der Ethereum-Entwicklung +description: "Dies ist ein Anfängerleitfaden für die ersten Schritte in der Ethereum-Entwicklung. Wir begleiten dich von der Einrichtung eines API-Endpunkts über eine Befehlszeilenanfrage bis hin zum Schreiben deines ersten Web3-Skripts! Keine Erfahrung in der Blockchain-Entwicklung erforderlich!" +author: "Elan Halpern" +tags: ["JavaScript", "ethers.js", "Blockchain-Knoten", "Abfragen", "Alchemy"] +skill: beginner +breadcrumb: Erste Schritte +lang: de +published: 2020-10-30 +source: Medium +sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f +--- + +![Ethereum- und Alchemy-Logos](./ethereum-alchemy.png) + +Dies ist ein Anfängerleitfaden für die ersten Schritte in der Ethereum-Entwicklung. Für dieses Tutorial verwenden wir [Alchemy](https://alchemyapi.io/), die führende Blockchain-Entwicklerplattform, die Millionen von Nutzern von 70 % der Top-Blockchain-Apps unterstützt, darunter Maker, 0x, MyEtherWallet, Dharma und Kyber. Alchemy gibt uns Zugriff auf einen API-Endpunkt auf der Ethereum-Chain, damit wir Transaktionen lesen und schreiben können. + +Wir begleiten dich von der Anmeldung bei Alchemy bis zum Schreiben deines ersten Web3-Skripts! Keine Erfahrung in der Blockchain-Entwicklung erforderlich! + +## 1. Melde dich für ein kostenloses Alchemy-Konto an {#sign-up-for-a-free-alchemy-account} + +Das Erstellen eines Kontos bei Alchemy ist einfach, [melde dich hier kostenlos an](https://auth.alchemy.com/). + +## 2. Erstelle eine Alchemy-App {#create-an-alchemy-app} + +Um mit der Ethereum-Chain zu kommunizieren und die Produkte von Alchemy zu nutzen, benötigst du einen API-Schlüssel, um deine Anfragen zu authentifizieren. + +Du kannst [API-Schlüssel über das Dashboard erstellen](https://dashboard.alchemy.com/). Um einen neuen Schlüssel zu erstellen, navigiere zu „Create App“, wie unten gezeigt: + +Ein besonderer Dank geht an [_ShapeShift_](https://shapeshift.com/), _dass wir ihr Dashboard zeigen dürfen!_ + +![Alchemy-Dashboard](./alchemy-dashboard.png) + +Fülle die Details unter „Create App“ aus, um deinen neuen Schlüssel zu erhalten. Hier siehst du auch Apps, die du zuvor erstellt hast, sowie solche, die von deinem Team erstellt wurden. Rufe vorhandene Schlüssel ab, indem du bei einer beliebigen App auf „View Key“ klickst. + +![Screenshot: App mit Alchemy erstellen](./create-app.png) + +Du kannst auch vorhandene API-Schlüssel abrufen, indem du mit der Maus über „Apps“ fährst und eine auswählst. Hier kannst du auf „View Key“ klicken sowie auf „Edit App“, um bestimmte Domains auf die Whitelist zu setzen, verschiedene Entwicklertools zu sehen und Analysen anzuzeigen. + +![Gif, das einem Benutzer zeigt, wie man API-Schlüssel abruft](./pull-api-keys.gif) + +## 3. Stelle eine Anfrage über die Befehlszeile {#make-a-request-from-the-command-line} + +Interagiere mit der Ethereum-Blockchain über Alchemy mithilfe von JSON-RPC und curl. + +Für manuelle Anfragen empfehlen wir die Interaktion mit dem `JSON-RPC` über `POST`-Anfragen. Übergib einfach den Header `Content-Type: application/json` und deine Abfrage als `POST`-Body mit den folgenden Feldern: + +- `jsonrpc`: Die JSON-RPC-Version – derzeit wird nur `2.0` unterstützt. +- `method`: Die ETH-API-Methode. [Siehe API-Referenz.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) +- `params`: Eine Liste von Parametern, die an die Methode übergeben werden sollen. +- `id`: Die ID deiner Anfrage. Wird in der Antwort zurückgegeben, damit du nachverfolgen kannst, zu welcher Anfrage eine Antwort gehört. + +Hier ist ein Beispiel, das du über die Befehlszeile ausführen kannst, um den aktuellen Gaspreis abzurufen: + +```bash +curl https://eth-mainnet.alchemyapi.io/v2/demo \ +-X POST \ +-H "Content-Type: application/json" \ +-d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' +``` + +_**HINWEIS:** Ersetze [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) durch deinen eigenen API-Schlüssel `https://eth-mainnet.alchemyapi.io/v2/**dein-api-schluessel`._ + +**Ergebnisse:** + +```json +{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 } +``` + +## 4. Richte deinen Web3-Client ein {#set-up-your-web3-client} + +**Wenn du bereits einen Client hast,** ändere deine aktuelle Blockchain-Knoten-Anbieter-URL in eine Alchemy-URL mit deinem API-Schlüssel: `„https://eth-mainnet.alchemyapi.io/v2/dein-api-schluessel“` + +**_HINWEIS:_** Die folgenden Skripte müssen in einem **Node-Kontext** ausgeführt oder **in einer Datei gespeichert** werden und dürfen nicht über die Befehlszeile ausgeführt werden. Wenn du Node oder npm noch nicht installiert hast, sieh dir diese kurze [Einrichtungsanleitung für Macs](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs) an. + +Es gibt unzählige [Web3-Bibliotheken](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries), die du in Alchemy integrieren kannst. Wir empfehlen jedoch die Verwendung von [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), einem direkten Ersatz für web3.js, der so entwickelt und konfiguriert wurde, dass er nahtlos mit Alchemy zusammenarbeitet. Dies bietet mehrere Vorteile wie automatische Wiederholungsversuche und robuste WebSocket-Unterstützung. + +Um AlchemyWeb3.js zu installieren, **navigiere zu deinem Projektverzeichnis** und führe Folgendes aus: + +**Mit Yarn:** + +``` +yarn add @alch/alchemy-web3 +``` + +**Mit NPM:** + +``` +npm install @alch/alchemy-web3 +``` + +Um mit der Blockchain-Knoten-Infrastruktur von Alchemy zu interagieren, führe dies in NodeJS aus oder füge es einer JavaScript-Datei hinzu: + +```js +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3( + "https://eth-mainnet.alchemyapi.io/v2/your-api-key" +) +``` + +## 5. Schreibe dein erstes Web3-Skript! {#write-your-first-web3-script} + +Um nun etwas praktische Erfahrung mit der Web3-Programmierung zu sammeln, schreiben wir ein einfaches Skript, das die neueste Blocknummer aus dem Ethereum-Mainnet ausgibt. + +**1. Falls noch nicht geschehen, erstelle in deinem Terminal ein neues Projektverzeichnis und wechsle mit cd dorthin:** + +``` +mkdir web3-example +cd web3-example +``` + +**2. Installiere die Alchemy-Web3-Abhängigkeit (oder eine beliebige Web3-Abhängigkeit) in deinem Projekt, falls du dies noch nicht getan hast:** + +``` +npm install @alch/alchemy-web3 +``` + +**3. Erstelle eine Datei namens `index.js` und füge den folgenden Inhalt hinzu:** + +> Du solltest letztendlich `demo` durch deinen Alchemy-HTTP-API-Schlüssel ersetzen. + +```js +async function main() { + const { createAlchemyWeb3 } = require("@alch/alchemy-web3") + const web3 = createAlchemyWeb3("https://eth-mainnet.alchemyapi.io/v2/demo") + const blockNumber = await web3.eth.getBlockNumber() + console.log("The latest block number is " + blockNumber) +} +main() +``` + +Nicht vertraut mit asynchronen Konzepten? Sieh dir diesen [Medium-Beitrag](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c) an. + +**4. Führe es in deinem Terminal mit Node aus** + +``` +node index.js +``` + +**5. Du solltest nun die Ausgabe der neuesten Blocknummer in deiner Konsole sehen!** + +``` +The latest block number is 11043912 +``` + +**Juhu! Glückwunsch! Du hast gerade dein erstes Web3-Skript mit Alchemy geschrieben 🎉** + +Nicht sicher, was du als Nächstes tun sollst? Versuche, deinen ersten Smart Contract bereitzustellen, und sammle praktische Erfahrungen mit der Solidity-Programmierung in unserem [Hello World Smart Contract-Leitfaden](https://www.alchemy.com/docs/hello-world-smart-contract), oder teste dein Dashboard-Wissen mit der [Dashboard-Demo-App](https://docs.alchemyapi.io/tutorials/demo-app)! + +_[Melde dich kostenlos bei Alchemy an](https://auth.alchemy.com/), sieh dir unsere [Dokumentation](https://www.alchemy.com/docs/) an und folge uns für die neuesten Nachrichten auf [Twitter](https://twitter.com/AlchemyPlatform)_. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md new file mode 100644 index 00000000000..fd56544ac1d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -0,0 +1,103 @@ +--- +title: "Ein Leitfaden für Smart-Contract-Sicherheitstools" +description: "Ein Überblick über drei verschiedene Test- und Programmanalysetechniken" +author: "Trailofbits" +lang: de +tags: ["Solidity", "Smart Contracts", "Sicherheit"] +skill: intermediate +breadcrumb: Sicherheitstools +published: 2020-09-07 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis +--- + +Wir werden drei verschiedene Test- und Programmanalysetechniken verwenden: + +- **Statische Analyse mit [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Alle Pfade des Programms werden angenähert und gleichzeitig durch verschiedene Programmdarstellungen (z. B. Kontrollflussgraph) analysiert. +- **Fuzzing mit [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** Der Code wird mit einer pseudozufälligen Generierung von Transaktionen ausgeführt. Der Fuzzer wird versuchen, eine Sequenz von Transaktionen zu finden, die eine bestimmte Eigenschaft verletzt. +- **Symbolische Ausführung mit [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Eine formale Verifizierungstechnik, die jeden Ausführungspfad in eine mathematische Formel übersetzt, auf deren Grundlage Einschränkungen überprüft werden können. + +Jede Technik hat Vorteile und Tücken und ist in [bestimmten Fällen](#determining-security-properties) nützlich: + +| Technik | Tool | Nutzung | Geschwindigkeit | Übersehene Fehler | Falscher Alarm | +| ------------------ | --------- | ----------------------------- | ------- | ----------- | ------------ | +| Statische Analyse | Slither | CLI & Skripte | Sekunden | moderat | niedrig | +| Fuzzing | Echidna | Solidity-Eigenschaften | Minuten | niedrig | keine | +| Symbolische Ausführung | Manticore | Solidity-Eigenschaften & Skripte | Stunden | keine\* | keine | + +\* wenn alle Pfade ohne Zeitüberschreitung erkundet werden + +**Slither** analysiert Verträge innerhalb von Sekunden, jedoch kann die statische Analyse zu falschem Alarm führen und ist für komplexe Überprüfungen (z. B. arithmetische Prüfungen) weniger geeignet. Führen Sie Slither über die API aus, um per Knopfdruck auf integrierte Detektoren zuzugreifen, oder über die API für benutzerdefinierte Überprüfungen. + +**Echidna** muss mehrere Minuten lang ausgeführt werden und erzeugt nur echte Treffer. Echidna überprüft vom Benutzer bereitgestellte Sicherheitseigenschaften, die in Solidity geschrieben sind. Es könnte Fehler übersehen, da es auf zufälliger Erkundung basiert. + +**Manticore** führt die „schwerwiegendste“ Analyse durch. Wie Echidna verifiziert Manticore vom Benutzer bereitgestellte Eigenschaften. Es benötigt mehr Zeit für die Ausführung, kann aber die Gültigkeit einer Eigenschaft beweisen und meldet keinen falschen Alarm. + +## Empfohlener Workflow {#suggested-workflow} + +Beginnen Sie mit den integrierten Detektoren von Slither, um sicherzustellen, dass keine einfachen Fehler vorhanden sind oder später eingeführt werden. Verwenden Sie Slither, um Eigenschaften im Zusammenhang mit Vererbung, Variablenabhängigkeiten und strukturellen Problemen zu überprüfen. Wenn die Codebasis wächst, verwenden Sie Echidna, um komplexere Eigenschaften des Zustandsautomaten zu testen. Kehren Sie zu Slither zurück, um benutzerdefinierte Überprüfungen für Schutzmaßnahmen zu entwickeln, die in Solidity nicht verfügbar sind, wie z. B. den Schutz vor dem Überschreiben einer Funktion. Verwenden Sie schließlich Manticore, um eine gezielte Verifizierung kritischer Sicherheitseigenschaften durchzuführen, z. B. arithmetische Operationen. + +- Verwenden Sie die CLI von Slither, um häufige Probleme zu erfassen +- Verwenden Sie Echidna, um übergeordnete Sicherheitseigenschaften Ihres Vertrags zu testen +- Verwenden Sie Slither, um benutzerdefinierte statische Überprüfungen zu schreiben +- Verwenden Sie Manticore, sobald Sie eine tiefgehende Absicherung kritischer Sicherheitseigenschaften wünschen + +**Ein Hinweis zu Unit-Tests**. Unit-Tests sind notwendig, um qualitativ hochwertige Software zu erstellen. Diese Techniken sind jedoch nicht am besten geeignet, um Sicherheitslücken zu finden. Sie werden typischerweise verwendet, um positive Verhaltensweisen von Code zu testen (d. h. der Code funktioniert im normalen Kontext wie erwartet), während Sicherheitslücken tendenziell in Randfällen liegen, die die Entwickler nicht berücksichtigt haben. In unserer Studie von Dutzenden von Smart-Contract-Sicherheitsüberprüfungen [hatte die Abdeckung durch Unit-Tests keine Auswirkungen auf die Anzahl oder den Schweregrad von Sicherheitslücken](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/), die wir im Code unserer Kunden gefunden haben. + +## Bestimmung von Sicherheitseigenschaften {#determining-security-properties} + +Um Ihren Code effektiv zu testen und zu verifizieren, müssen Sie die Bereiche identifizieren, die Aufmerksamkeit erfordern. Da Ihre für Sicherheit aufgewendeten Ressourcen begrenzt sind, ist es wichtig, die schwachen oder hochwertigen Teile Ihrer Codebasis einzugrenzen, um Ihren Aufwand zu optimieren. Bedrohungsmodellierung kann dabei helfen. Ziehen Sie in Betracht, Folgendes zu überprüfen: + +- [Rapid Risk Assessments](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (unser bevorzugter Ansatz, wenn die Zeit knapp ist) +- [Guide to Data-Centric System Threat Modeling](https://csrc.nist.gov/pubs/sp/800/154/ipd) (auch bekannt als NIST 800-154) +- [Shostack threat modeling](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998) +- [STRIDE]() / [DREAD]() +- [PASTA](https://wikipedia.org/wiki/Threat_model#P.A.S.T.A.) +- [Use of Assertions](https://blog.regehr.org/archives/1091) + +### Komponenten {#components} + +Zu wissen, was Sie überprüfen möchten, hilft Ihnen auch bei der Auswahl des richtigen Tools. + +Zu den weitreichenden Bereichen, die für Smart Contracts häufig relevant sind, gehören: + +- **Zustandsautomat.** Die meisten Verträge können als Zustandsautomat dargestellt werden. Überprüfen Sie, ob (1) kein ungültiger Zustand erreicht werden kann, (2) ein gültiger Zustand auch erreicht werden kann und (3) kein Zustand den Vertrag blockiert. + + - Echidna und Manticore sind die bevorzugten Tools zum Testen von Zustandsautomaten-Spezifikationen. + +- **Zugriffskontrollen.** Wenn Ihr System über privilegierte Benutzer verfügt (z. B. einen Eigentümer, Controller ...), müssen Sie sicherstellen, dass (1) jeder Benutzer nur die autorisierten Aktionen ausführen kann und (2) kein Benutzer Aktionen eines privilegierteren Benutzers blockieren kann. + + - Slither, Echidna und Manticore können auf korrekte Zugriffskontrollen prüfen. Beispielsweise kann Slither überprüfen, ob nur bei auf der Whitelist stehenden Funktionen der `onlyOwner`-Modifikator fehlt. Echidna und Manticore sind nützlich für komplexere Zugriffskontrollen, wie z. B. eine Berechtigung, die nur erteilt wird, wenn der Vertrag einen bestimmten Zustand erreicht. + +- **Arithmetische Operationen.** Die Überprüfung der Fehlerfreiheit der arithmetischen Operationen ist von entscheidender Bedeutung. Die durchgängige Verwendung von `SafeMath` ist ein guter Schritt, um Überlauf/Unterlauf zu verhindern. Sie müssen jedoch weiterhin andere arithmetische Fehler berücksichtigen, einschließlich Rundungsproblemen und Fehlern, die den Vertrag blockieren. + + - Manticore ist hier die beste Wahl. Echidna kann verwendet werden, wenn die Arithmetik außerhalb des Bereichs des SMT-Solvers liegt. + +- **Korrektheit der Vererbung.** Solidity-Verträge stützen sich stark auf Mehrfachvererbung. Fehler wie eine Shadowing-Funktion, der ein `super`-Aufruf fehlt, und eine falsch interpretierte C3-Linearisierungsreihenfolge können leicht eingeführt werden. + + - Slither ist das Tool, um die Erkennung dieser Probleme sicherzustellen. + +- **Externe Interaktionen.** Verträge interagieren miteinander, und einigen externen Verträgen sollte nicht vertraut werden. Wenn sich Ihr Vertrag beispielsweise auf externe Orakel verlässt, bleibt er dann sicher, wenn die Hälfte der verfügbaren Orakel kompromittiert ist? + + - Manticore und Echidna sind die beste Wahl zum Testen externer Interaktionen mit Ihren Verträgen. Manticore verfügt über einen integrierten Mechanismus zum Stubbing externer Verträge. + +- **Standardkonformität.** Ethereum-Standards (z. B. ERC20) haben eine Geschichte von Fehlern in ihrem Design. Seien Sie sich der Einschränkungen des Standards bewusst, auf dem Sie aufbauen. + - Slither, Echidna und Manticore helfen Ihnen, Abweichungen von einem bestimmten Standard zu erkennen. + +### Spickzettel zur Tool-Auswahl {#tool-selection-cheatsheet} + +| Komponente | Tools | Beispiele | +| ----------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Zustandsautomat | Echidna, Manticore | +| Zugriffskontrolle | Slither, Echidna, Manticore | [Slither-Übung 2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md), [Echidna-Übung 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) | +| Arithmetische Operationen | Manticore, Echidna | [Echidna-Übung 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md), [Manticore-Übungen 1 - 3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | +| Korrektheit der Vererbung | Slither | [Slither-Übung 1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) | +| Externe Interaktionen | Manticore, Echidna | +| Standardkonformität | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | + +Andere Bereiche müssen je nach Ihren Zielen überprüft werden, aber diese groben Schwerpunktbereiche sind ein guter Start für jedes Smart-Contract-System. + +Unsere öffentlichen Audits enthalten Beispiele für verifizierte oder getestete Eigenschaften. Ziehen Sie in Betracht, die Abschnitte `Automated Testing and Verification` der folgenden Berichte zu lesen, um reale Sicherheitseigenschaften zu überprüfen: + +- [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) +- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md new file mode 100644 index 00000000000..0ac471b00ac --- /dev/null +++ b/public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -0,0 +1,1549 @@ +--- +title: "Hello World Smart Contract für Anfänger - Fullstack" +description: "Einführungstutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum." +author: "nstrike2" +breadcrumb: Hello World Fullstack +tags: + [ + "Solidity", + "Hardhat", + "Alchemy", + "Smart Contracts", + "Bereitstellung", + "Blocksuchmaschine", + "Frontend", + "Transaktionen", + "Framework", + ] +skill: beginner +lang: de +published: 2021-10-25 +--- + +Dieser Leitfaden ist für Sie, wenn Sie neu in der Blockchain-Entwicklung sind und nicht wissen, wo Sie anfangen sollen oder wie Sie Smart Contracts bereitstellen und mit ihnen interagieren können. Wir werden die Erstellung und Bereitstellung eines einfachen Smart Contracts im Goerli-Testnet unter Verwendung von [MetaMask](https://metamask.io), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org) und [Alchemy](https://alchemy.com/eth) durchgehen. + +Sie benötigen ein Alchemy-Konto, um dieses Tutorial abzuschließen. [Melden Sie sich für ein kostenloses Konto an](https://www.alchemy.com/). + +Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, können Sie sich gerne im [Alchemy Discord](https://discord.gg/gWuC7zB) melden! + +## Teil 1 – Erstellen und Bereitstellen Ihres Smart Contracts mit Hardhat {#part-1} + +### Mit dem Ethereum-Netzwerk verbinden {#connect-to-the-ethereum-network} + +Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Chain zu stellen. Der Einfachheit halber verwenden wir ein kostenloses Konto bei Alchemy, einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne selbst einen Blockchain-Knoten betreiben zu müssen. Alchemy verfügt auch über Entwicklertools für Überwachung und Analysen; wir werden diese in diesem Tutorial nutzen, um zu verstehen, was bei der Bereitstellung unseres Smart Contracts unter der Haube passiert. + +### Erstellen Sie Ihre App und Ihren API-Schlüssel {#create-your-app-and-api-key} + +Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren, indem Sie eine App erstellen. Dies ermöglicht es Ihnen, Anfragen an das Goerli-Testnet zu stellen. Wenn Sie nicht mit Testnets vertraut sind, können Sie [Alchemys Leitfaden zur Auswahl eines Netzwerks lesen](https://www.alchemy.com/docs/choosing-a-web3-network). + +Suchen Sie im Alchemy-Dashboard das Dropdown-Menü **Apps** in der Navigationsleiste und klicken Sie auf **Create App**. + +![Hello world create app](./hello-world-create-app.png) + +Geben Sie Ihrer App den Namen „_Hello World_“ und schreiben Sie eine kurze Beschreibung. Wählen Sie **Staging** als Ihre Umgebung und **Goerli** als Ihr Netzwerk. + +![create app view hello world](./create-app-view-hello-world.png) + +_Hinweis: Stellen Sie sicher, dass Sie **Goerli** auswählen, da dieses Tutorial sonst nicht funktioniert._ + +Klicken Sie auf **Create app**. Ihre App wird in der Tabelle unten angezeigt. + +### Ein Ethereum-Konto erstellen {#create-an-ethereum-account} + +Sie benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. Wir werden MetaMask verwenden, ein virtuelles Wallet im Browser, mit dem Benutzer ihre Ethereum-Konto-Adresse verwalten können. + +Sie können [hier](https://metamask.io/download) kostenlos ein MetaMask-Konto herunterladen und 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 hantieren). + +### Schritt 4: Ether von einem Faucet hinzufügen {#step-4-add-ether-from-a-faucet} + +Um Ihren Smart Contract im Testnetzwerk bereitzustellen, benötigen Sie etwas falsches ETH. Um ETH im Goerli-Netzwerk zu erhalten, gehen Sie zu einem Goerli-Faucet und geben Sie Ihre Goerli-Konto-Adresse ein. Beachten Sie, dass Goerli-Faucets in letzter Zeit etwas unzuverlässig sein können – auf der [Testnetzwerk-Seite](/developers/docs/networks/#goerli) finden Sie eine Liste mit Optionen, die Sie ausprobieren können: + +_Hinweis: Aufgrund von Netzwerküberlastung kann dies eine Weile dauern._ +`` + +### Schritt 5: Überprüfen Sie Ihr Guthaben {#step-5-check-your-balance} + +Um sicherzustellen, dass sich das ETH in Ihrem Wallet befindet, stellen 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 die Menge an ETH in unserem Wallet zurück. Um mehr zu erfahren, sehen Sie sich [Alchemys kurzes Tutorial zur Verwendung des Composer-Tools](https://youtu.be/r6sjRxBZJuU) an. + +Geben Sie Ihre MetaMask-Konto-Adresse ein und klicken Sie auf **Send Request**. Sie werden eine Antwort sehen, die wie der folgende Codeausschnitt aussieht. + +```json +{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } +``` + +> _Hinweis: Dieses Ergebnis ist in Wei, nicht in ETH. Wei wird als die kleinste Stückelung von Ether verwendet._ + +Puh! Unser falsches Geld ist komplett da. + +### Schritt 6: Unser Projekt initialisieren {#step-6-initialize-our-project} + +Zuerst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zu Ihrer Kommandozeile und geben Sie Folgendes ein. + +``` +mkdir hello-world +cd hello-world +``` + +Jetzt, da wir uns in unserem Projektordner befinden, verwenden wir `npm init`, um das Projekt zu initialisieren. + +> Wenn Sie npm noch nicht installiert haben, folgen Sie [diesen Anweisungen, um Node.js und npm zu installieren](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm). + +Für die Zwecke dieses Tutorials spielt es keine Rolle, wie Sie die Initialisierungsfragen beantworten. Hier ist als Referenz, 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) + +About to write to /Users/.../.../.../hello-world/package.json: + +{ + "name": "hello-world", + "version": "1.0.0", + "description": "hello world smart contract", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +Bestätigen Sie die package.json und wir können loslegen! + +### Schritt 7: Hardhat herunterladen {#step-7-download-hardhat} + +Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern beim lokalen Erstellen von Smart Contracts und Dapps, bevor sie auf der Live-Chain bereitgestellt werden. + +Führen Sie in unserem `hello-world`-Projekt Folgendes aus: + +``` +npm install --save-dev hardhat +``` + +Auf dieser Seite finden Sie weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview). + +### Schritt 8: Hardhat-Projekt erstellen {#step-8-create-hardhat-project} + +Führen Sie in unserem `hello-world`-Projektordner Folgendes aus: + +``` +npx hardhat +``` + +Sie sollten dann eine Willkommensnachricht und die Option sehen, auszuwählen, was Sie tun möchten. Wählen Sie „create an empty hardhat.config.js“: + +``` +888 888 888 888 888 +888 888 888 888 888 +888 888 888 888 888 +8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 +888 888 "88b 888P" d88" 888 888 "88b "88b 888 +888 888 .d888888 888 888 888 888 888 .d888888 888 +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 👷‍ + +What do you want to do? … +Create a sample project +❯ Create an empty hardhat.config.js +Quit +``` + +Dadurch wird eine `hardhat.config.js`-Datei im Projekt generiert. Wir werden diese später im Tutorial verwenden, um das Setup für unser Projekt festzulegen. + +### Schritt 9: Projektordner hinzufügen {#step-9-add-project-folders} + +Um das Projekt übersichtlich zu halten, lassen Sie uns zwei neue Ordner erstellen. Navigieren Sie in der Kommandozeile zum Stammverzeichnis Ihres `hello-world`-Projekts und geben Sie ein: + +``` +mkdir contracts +mkdir scripts +``` + +- `contracts/` ist der Ort, an dem wir unsere Hello-World-Smart-Contract-Codedatei aufbewahren werden +- `scripts/` ist der Ort, an dem wir Skripte zur Bereitstellung und Interaktion mit unserem Vertrag aufbewahren werden + +### Schritt 10: Unseren Vertrag schreiben {#step-10-write-our-contract} + +Sie fragen sich vielleicht, wann wir endlich Code schreiben werden? Es ist soweit! + +Öffnen Sie das hello-world-Projekt in Ihrem bevorzugten Editor. Smart Contracts werden am häufigsten in Solidity geschrieben, was wir auch verwenden werden, um unseren Smart Contract zu schreiben.‌ + +1. Navigieren Sie zum Ordner `contracts` und erstellen Sie eine neue Datei namens `HelloWorld.sol` +2. Unten finden Sie einen beispielhaften Hello-World-Smart-Contract, den wir für dieses Tutorial verwenden werden. Kopieren Sie den folgenden Inhalt in die Datei `HelloWorld.sol`. + +_Hinweis: Lesen Sie unbedingt die Kommentare, um zu verstehen, was dieser Vertrag tut._ + +``` +// Specifies the version of Solidity, using semantic versioning. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity >=0.7.3; + +// Defines a contract named `HelloWorld`. +// A contract is a collection of functions and data (its state). Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Emitted when update function is called + //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. + event UpdatedMessages(string oldStr, string newStr); + + // Declares a state variable `message` of type `string`. + // State variables are variables whose values are permanently stored in contract storage. 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. + string public message; + + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Constructors are used to initialize the contract's data. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + message = initMessage; + } + + // A public function that accepts a string argument and updates the `message` storage variable. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Dies ist ein grundlegender Smart Contract, der bei der Erstellung eine Nachricht speichert. Sie kann durch Aufrufen der Funktion `update` aktualisiert werden. + +### Schritt 11: MetaMask & Alchemy mit Ihrem Projekt verbinden {#step-11-connect-metamask-alchemy-to-your-project} + +Wir haben ein MetaMask-Wallet und ein Alchemy-Konto erstellt sowie unseren Smart Contract geschrieben. Nun ist es an der Zeit, die drei miteinander zu verbinden. + +Jede von Ihrem Wallet gesendete Transaktion erfordert eine Signatur mit Ihrem einzigartigen Private-Key. Um unserem Programm diese Berechtigung zu erteilen, können wir unseren Private-Key sicher in einer Umgebungsdatei speichern. Wir werden hier auch einen API-Schlüssel für Alchemy speichern. + +> Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich [dieses Tutorial](https://www.alchemy.com/docs/hello-world-smart-contract#step-11-connect-metamask--alchemy-to-your-project) zum Senden von Transaktionen mit web3 an. + +Installieren Sie zunächst das dotenv-Paket in Ihrem Projektverzeichnis: + +``` +npm install dotenv --save +``` + +Erstellen Sie dann eine `.env`-Datei im Stammverzeichnis des Projekts. Fügen Sie Ihren MetaMask-Private-Key und die HTTP-Alchemy-API-URL hinzu. + +Ihre Umgebungsdatei muss `.env` heißen, sonst wird sie nicht als Umgebungsdatei erkannt. + +Nennen Sie sie nicht `process.env` oder `.env-custom` oder ähnlich. + +- Befolgen Sie [diese Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren Private-Key zu exportieren +- Siehe unten, um die HTTP-Alchemy-API-URL zu erhalten + +![Animated walkthrough of getting an Alchemy API key](./get-alchemy-api-key.gif) + +Ihre `.env` sollte so aussehen: + +``` +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PRIVATE_KEY = "your-metamask-private-key" +``` + +Um diese tatsächlich mit unserem Code zu verbinden, werden wir in Schritt 13 in unserer `hardhat.config.js`-Datei auf diese Variablen verweisen. + +### Schritt 12: Ethers.js installieren {#step-12-install-ethersjs} + +Ethers.js ist eine Bibliothek, die die Interaktion und das Stellen von Anfragen an Ethereum erleichtert, indem sie [Standard-JSON-RPC-Methoden](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc) in benutzerfreundlichere Methoden verpackt. + +Hardhat ermöglicht es uns, [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 Bereitstellung von Verträgen nutzen. + +Geben Sie in Ihrem Projektverzeichnis Folgendes ein: + +```bash +npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" +``` + +### Schritt 13: hardhat.config.js aktualisieren {#step-13-update-hardhat-configjs} + +Wir haben bisher mehrere Abhängigkeiten und Plugins hinzugefügt, jetzt müssen wir `hardhat.config.js` aktualisieren, damit unser Projekt von allen weiß. + +Aktualisieren Sie Ihre `hardhat.config.js`, sodass sie wie folgt aussieht: + +```javascript +/* * + * @type import('hardhat/config').HardhatUserConfig */ + + + + +require("dotenv").config() +require("@nomiclabs/hardhat-ethers") + +const { API_URL, PRIVATE_KEY } = process.env + +module.exports = { + solidity: "0.7.3", + defaultNetwork: "goerli", + networks: { + hardhat: {}, + goerli: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`], + }, + }, +} +``` + +### Schritt 14: Unseren Vertrag kompilieren {#step-14-compile-our-contract} + +Um sicherzustellen, dass bisher alles funktioniert, lassen Sie uns unseren Vertrag kompilieren. Die Aufgabe `compile` ist eine der integrierten Hardhat-Aufgaben. + +Führen Sie in der Kommandozeile Folgendes aus: + +```bash +npx hardhat compile +``` + +Möglicherweise erhalten Sie eine Warnung über `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 im [Alchemy-Discord](https://discord.gg/u72VCg3) nachfragen. + +### Schritt 15: Unser Bereitstellungsskript schreiben {#step-15-write-our-deploy-script} + +Jetzt, da unser Vertrag geschrieben ist und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, unser Skript zur Bereitstellung des Vertrags zu schreiben. + +Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`. Fügen Sie ihr den folgenden Inhalt hinzu: + +```javascript +async function main() { + const HelloWorld = await ethers.getContractFactory("HelloWorld") + + // Startet die Bereitstellung und gibt ein Promise zurück, das zu einem Vertragsobjekt aufgelöst wird + const hello_world = await HelloWorld.deploy("Hello World!") + console.log("Contract deployed to address:", hello_world.address) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) +``` + +Hardhat leistet hervorragende Arbeit bei der Erklärung, was jede dieser Codezeilen in ihrem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) tut. Wir haben ihre Erklärungen hier übernommen. + +```javascript +const HelloWorld = await ethers.getContractFactory("HelloWorld") +``` + +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 `ContractFactory`- und `Contract`-Instanzen standardmäßig mit dem ersten Unterzeichner (Eigentümer) verbunden. + +```javascript +const hello_world = await HelloWorld.deploy() +``` + +Der Aufruf von `deploy()` auf einer `ContractFactory` startet die Bereitstellung und gibt ein `Promise` zurück, das in ein `Contract`-Objekt aufgelöst wird. Dies ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen hat. + +### Schritt 16: Unseren Vertrag bereitstellen {#step-16-deploy-our-contract} + +Wir sind endlich bereit, unseren Smart Contract bereitzustellen! Navigieren Sie zur Kommandozeile und führen Sie Folgendes aus: + +```bash +npx hardhat run scripts/deploy.js --network goerli +``` + +Sie sollten dann in etwa Folgendes sehen: + +```bash +Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 +``` + +**Bitte speichern Sie diese Adresse**. Wir werden sie später im Tutorial verwenden. + +Wenn wir zum [Goerli Etherscan](https://goerli.etherscan.io) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Die Transaktion wird in etwa so aussehen: + +![](./etherscan-contract.png) + +Die `From`-Adresse sollte mit Ihrer MetaMask-Konto-Adresse übereinstimmen und die `To`-Adresse wird **Contract Creation** anzeigen. Wenn wir in die Transaktion klicken, sehen wir unsere Vertragsadresse im `To`-Feld. + +![](./etherscan-transaction.png) + +Glückwunsch! Sie haben gerade einen Smart Contract in einem Ethereum-Testnet bereitgestellt. + +Um zu verstehen, was unter der Haube passiert, navigieren wir zum Explorer-Tab in unserem [Alchemy-Dashboard](https://dashboard.alchemy.com/explorer). Wenn Sie mehrere Alchemy-Apps haben, stellen Sie sicher, dass Sie nach App filtern und **Hello World** auswählen. + +![](./hello-world-explorer.png) + +Hier sehen Sie eine Handvoll JSON-RPC-Methoden, die Hardhat/Ethers unter der Haube für uns ausgeführt haben, als wir die Funktion `.deploy()` aufgerufen haben. Zwei wichtige Methoden hierbei sind [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), was die Anfrage ist, unseren Vertrag auf die Goerli-Chain zu schreiben, und [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), was eine Anfrage ist, um Informationen über unsere Transaktion anhand des Hashs zu lesen. Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich [unser Tutorial zum Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) an. + +## Teil 2: Interagieren Sie mit Ihrem Smart Contract {#part-2-interact-with-your-smart-contract} + +Nachdem wir nun erfolgreich einen Smart Contract im Goerli-Netzwerk bereitgestellt haben, wollen wir lernen, wie man mit ihm interagiert. + +### Erstellen Sie eine interact.js-Datei {#create-a-interactjs-file} + +Dies ist die Datei, in der wir unser Interaktionsskript schreiben werden. Wir werden die Ethers.js-Bibliothek verwenden, die Sie zuvor in Teil 1 installiert haben. + +Erstellen Sie im Ordner `scripts/` eine neue Datei namens `interact.js` und fügen Sie den folgenden Code hinzu: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS +``` + +### Aktualisieren Sie Ihre .env-Datei {#update-your-env-file} + +Wir werden neue Umgebungsvariablen verwenden, daher müssen wir sie in der `.env`-Datei definieren, die [wir zuvor erstellt haben](#step-11-connect-metamask-&-alchemy-to-your-project). + +Wir müssen eine Definition für unseren Alchemy-`API_KEY` und die `CONTRACT_ADDRESS` hinzufügen, unter der Ihr Smart Contract bereitgestellt wurde. + +Ihre `.env`-Datei sollte in etwa so aussehen: + +```bash +# .env + +API_URL = "https://eth-goerli.alchemyapi.io/v2/" +API_KEY = "" +PRIVATE_KEY = "" +CONTRACT_ADDRESS = "0x" +``` + +### Holen Sie sich Ihre Vertrags-ABI {#grab-your-contract-ABI} + +Unsere Vertrags-[ABI (Application Binary Interface)](/glossary/#abi) ist die Schnittstelle zur Interaktion mit unserem Smart Contract. Hardhat generiert automatisch eine ABI und speichert sie in `HelloWorld.json`. Um die ABI zu verwenden, müssen wir den Inhalt parsen, indem wir die folgenden Codezeilen zu unserer Datei `interact.js` hinzufügen: + +```javascript +// interact.js +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") +``` + +Wenn Sie die ABI sehen möchten, können Sie sie in Ihrer Konsole ausgeben: + +```javascript +console.log(JSON.stringify(contract.abi)) +``` + +Um Ihre ABI in der Konsole ausgeben zu lassen, navigieren Sie zu Ihrem Terminal und führen Sie Folgendes aus: + +```bash +npx hardhat run scripts/interact.js +``` + +### Erstellen Sie eine Instanz Ihres Vertrags {#create-an-instance-of-your-contract} + +Um mit unserem Vertrag zu interagieren, müssen wir eine Vertragsinstanz in unserem Code erstellen. Um dies mit Ethers.js zu tun, müssen wir mit drei Konzepten arbeiten: + +1. Provider – ein Blockchain-Knoten-Anbieter, der Ihnen Lese- und Schreibzugriff auf die Blockchain gibt +2. Signer – repräsentiert ein Ethereum-Konto, das Transaktionen signieren kann +3. Contract – ein Ethers.js-Objekt, das einen bestimmten Vertrag repräsentiert, der auf der Blockchain bereitgestellt wurde + +Wir verwenden die Vertrags-ABI aus dem vorherigen Schritt, um unsere Instanz des Vertrags zu erstellen: + +```javascript +// interact.js + +// Provider +const alchemyProvider = new ethers.providers.AlchemyProvider( + (network = "goerli"), + API_KEY +) + +// Signer +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// Contract +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) +``` + +Erfahren Sie mehr über Provider, Signer und Contracts in der [ethers.js-Dokumentation](https://docs.ethers.io/v5/). + +### Lesen Sie die Init-Nachricht {#read-the-init-message} + +Erinnern Sie sich, als wir unseren Vertrag mit der `initMessage = "Hello world!"` bereitgestellt haben? Wir werden nun diese in unserem Smart Contract gespeicherte Nachricht lesen und in der Konsole ausgeben. + +In JavaScript werden asynchrone Funktionen verwendet, wenn mit Netzwerken interagiert wird. Um mehr über asynchrone Funktionen zu erfahren, [lesen Sie diesen Medium-Artikel](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff). + +Verwenden Sie den folgenden Code, um die Funktion `message` in unserem Smart Contract aufzurufen und die Init-Nachricht zu lesen: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) +} +main() +``` + +Nachdem wir die Datei mit `npx hardhat run scripts/interact.js` im Terminal ausgeführt haben, sollten wir diese Antwort sehen: + +``` +The message is: Hello world! +``` + +Herzlichen Glückwunsch! Sie haben gerade erfolgreich Smart Contract-Daten aus der Ethereum-Blockchain gelesen, weiter so! + +### Aktualisieren Sie die Nachricht {#update-the-message} + +Anstatt die Nachricht nur zu lesen, können wir die in unserem Smart Contract gespeicherte Nachricht auch mit der Funktion `update` aktualisieren! Ziemlich cool, oder? + +Um die Nachricht zu aktualisieren, können wir die Funktion `update` direkt auf unserem instanziierten Contract-Objekt aufrufen: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("This is the new message.") + await tx.wait() +} +main() +``` + +Beachten Sie, dass wir in Zeile 11 einen Aufruf von `.wait()` auf dem zurückgegebenen Transaktionsobjekt durchführen. Dies stellt sicher, dass unser Skript darauf wartet, dass die Transaktion auf der Blockchain gemint wird, bevor die Funktion beendet wird. Wenn der Aufruf von `.wait()` nicht enthalten ist, sieht das Skript möglicherweise nicht den aktualisierten `message`-Wert im Vertrag. + +### Lesen Sie die neue Nachricht {#read-the-new-message} + +Sie sollten in der Lage sein, den [vorherigen Schritt](#read-the-init-message) zu wiederholen, um den aktualisierten `message`-Wert zu lesen. Nehmen Sie sich einen Moment Zeit und prüfen Sie, ob Sie die notwendigen Änderungen vornehmen können, um diesen neuen Wert auszugeben! + +Wenn Sie einen Hinweis benötigen, sehen Sie hier, wie Ihre Datei `interact.js` zu diesem Zeitpunkt aussehen sollte: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS + +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") + +// Provider - Alchemy +const alchemyProvider = new ethers.providers.AlchemyProvider( + (network = "goerli"), + API_KEY +) + +// Signer - du +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// Vertragsinstanz +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("this is the new message") + await tx.wait() + + const newMessage = await helloWorldContract.message() + console.log("The new message is: " + newMessage) +} + +main() +``` + +Führen Sie nun einfach das Skript aus und Sie sollten die alte Nachricht, den Aktualisierungsstatus und die neue Nachricht in Ihrem Terminal sehen können! + +`npx hardhat run scripts/interact.js --network goerli` + +``` +The message is: Hello World! +Updating the message... +The new message is: This is the new message. +``` + +Während Sie dieses Skript ausführen, werden Sie vielleicht bemerken, dass der Schritt `Updating the message...` eine Weile dauert, bevor die neue Nachricht geladen wird. Das liegt am Mining-Prozess; wenn Sie neugierig sind und Transaktionen verfolgen möchten, während sie gemint werden, besuchen Sie den [Alchemy-Mempool](https://dashboard.alchemyapi.io/mempool), um den Status einer Transaktion zu sehen. Wenn die Transaktion verworfen wird, ist es auch hilfreich, [Goerli Etherscan](https://goerli.etherscan.io) zu überprüfen und nach Ihrem Transaktions-Hash zu suchen. + +## Teil 3: Veröffentlichen Sie Ihren Smart Contract auf Etherscan {#part-3-publish-your-smart-contract-to-etherscan} + +Sie haben die ganze harte Arbeit geleistet, um Ihren Smart Contract zum Leben zu erwecken; jetzt ist es an der Zeit, ihn mit der Welt zu teilen! + +Indem Sie Ihren Smart Contract auf Etherscan verifizieren, kann jeder Ihren Quellcode einsehen und mit Ihrem Smart Contract interagieren. Fangen wir an! + +### Schritt 1: Generieren Sie einen API-Schlüssel in Ihrem Etherscan-Konto {#step-1-generate-an-api-key-on-your-etherscan-account} + +Ein Etherscan-API-Schlüssel ist erforderlich, um zu verifizieren, dass Sie der Eigentümer des Smart Contracts sind, den Sie veröffentlichen möchten. + +Wenn Sie noch kein Etherscan-Konto haben, [registrieren Sie sich für ein Konto](https://etherscan.io/register). + +Sobald Sie eingeloggt sind, suchen Sie Ihren Benutzernamen in der Navigationsleiste, fahren Sie mit der Maus darüber und wählen Sie die Schaltfläche **My profile**. + +Auf Ihrer Profilseite sollten Sie eine seitliche Navigationsleiste sehen. Wählen Sie in der seitlichen Navigationsleiste **API Keys**. Klicken Sie anschließend auf die Schaltfläche „Add“, um einen neuen API-Schlüssel zu erstellen, nennen Sie Ihre App **hello-world** und klicken Sie auf die Schaltfläche **Create New API Key**. + +Ihr neuer API-Schlüssel sollte in der API-Schlüssel-Tabelle erscheinen. Kopieren Sie den API-Schlüssel in Ihre Zwischenablage. + +Als Nächstes müssen wir den Etherscan-API-Schlüssel zu unserer `.env`-Datei hinzufügen. + +Nach dem Hinzufügen sollte Ihre `.env`-Datei wie folgt aussehen: + +```javascript +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PUBLIC_KEY = "your-public-account-address" +PRIVATE_KEY = "your-private-account-address" +CONTRACT_ADDRESS = "your-contract-address" +ETHERSCAN_API_KEY = "your-etherscan-key" +``` + +### Mit Hardhat bereitgestellte Smart Contracts {#hardhat-deployed-smart-contracts} + +#### Installieren von hardhat-etherscan {#install-hardhat-etherscan} + +Die Veröffentlichung Ihres Vertrags auf Etherscan mit Hardhat ist unkompliziert. Sie müssen zunächst das Plugin `hardhat-etherscan` installieren, um loszulegen. `hardhat-etherscan` wird den Quellcode und die ABI des Smart Contracts automatisch auf Etherscan verifizieren. Um dies hinzuzufügen, führen Sie im Verzeichnis `hello-world` Folgendes aus: + +```text +npm install --save-dev @nomiclabs/hardhat-etherscan +``` + +Sobald es installiert ist, fügen Sie die folgende Anweisung oben in Ihrer `hardhat.config.js` ein und fügen Sie die Etherscan-Konfigurationsoptionen hinzu: + +```javascript +// hardhat.config.js + +require("dotenv").config() +require("@nomiclabs/hardhat-ethers") +require("@nomiclabs/hardhat-etherscan") + +const { API_URL, PRIVATE_KEY, ETHERSCAN_API_KEY } = process.env + +module.exports = { + solidity: "0.7.3", + defaultNetwork: "goerli", + networks: { + hardhat: {}, + goerli: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`], + }, + }, + etherscan: { + // Dein API-Schlüssel für Etherscan + // Erhalte einen unter https://etherscan.io/ + apiKey: ETHERSCAN_API_KEY, + }, +} +``` + +#### Verifizieren Sie Ihren Smart Contract auf Etherscan {#verify-your-smart-contract-on-etherscan} + +Stellen Sie sicher, dass alle Dateien gespeichert und alle `.env`-Variablen korrekt konfiguriert sind. + +Führen Sie die Aufgabe `verify` aus und übergeben Sie die Vertragsadresse sowie das Netzwerk, in dem er bereitgestellt wurde: + +```text +npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!' +``` + +Stellen Sie sicher, dass `DEPLOYED_CONTRACT_ADDRESS` die Adresse Ihres bereitgestellten Smart Contracts im Goerli-Testnet ist. Außerdem muss das letzte Argument (`'Hello World!'`) derselbe Zeichenfolgenwert sein, der [während des Bereitstellungsschritts in Teil 1](#write-our-deploy-script) verwendet wurde. + +Wenn alles gut geht, sehen Sie die folgende Nachricht in Ihrem Terminal: + +```text +Successfully submitted source code for contract +contracts/HelloWorld.sol:HelloWorld at 0xdeployed-contract-address +for verification on Etherscan. Waiting for verification result... + + +Successfully verified contract HelloWorld on Etherscan. +https: // goerli.etherscan.io/address/#contracts +``` + +Herzlichen Glückwunsch! Ihr Smart Contract-Code ist auf Etherscan! + +### Sehen Sie sich Ihren Smart Contract auf Etherscan an! {#check-out-your-smart-contract-on-etherscan} + +Wenn Sie zu dem in Ihrem Terminal angegebenen Link navigieren, sollten Sie Ihren Smart Contract-Code und die auf Etherscan veröffentlichte ABI sehen können! + +**Wahooo – Sie haben es geschafft, Champion! Jetzt kann jeder Ihren Smart Contract aufrufen oder in ihn schreiben! Wir können es kaum erwarten zu sehen, was Sie als Nächstes bauen!** + +## Teil 4 – Integration Ihres Smart Contracts in das Frontend {#part-4-integrating-your-smart-contract-with-the-frontend} + +Am Ende dieses Tutorials werden Sie wissen, wie man: + +- Ein MetaMask-Wallet mit Ihrer Dapp verbindet +- Daten aus Ihrem Smart Contract mithilfe der [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3)-API liest +- Ethereum-Transaktionen mit MetaMask signiert + +Für diese Dapp werden wir [React](https://react.dev/) als unser Frontend-Framework verwenden. Es ist jedoch wichtig zu beachten, dass wir nicht viel Zeit darauf verwenden werden, die Grundlagen zu erklären, da wir uns hauptsächlich darauf konzentrieren, Web3-Funktionalität in unser Projekt zu integrieren. + +Als Voraussetzung sollten Sie über grundlegende React-Kenntnisse verfügen. Falls nicht, empfehlen wir, das offizielle [Intro to React-Tutorial](https://react.dev/learn) zu absolvieren. + +### Klonen der Startdateien {#clone-the-starter-files} + +Gehen Sie zunächst zum [hello-world-part-four GitHub-Repository](https://github.com/alchemyplatform/hello-world-part-four-tutorial), um die Startdateien für dieses Projekt zu erhalten, und klonen Sie dieses Repository auf Ihren lokalen Computer. + +Öffnen Sie das geklonte Repository lokal. Beachten Sie, dass es zwei Ordner enthält: `starter-files` und `completed`. + +- `starter-files` – **wir werden in diesem Verzeichnis arbeiten**, wir werden die Benutzeroberfläche mit Ihrem Ethereum-Wallet und dem Smart Contract verbinden, den wir in [Teil 3](#part-3) auf Etherscan veröffentlicht haben. +- `completed` enthält das gesamte abgeschlossene Tutorial und sollte nur als Referenz verwendet werden, falls Sie nicht weiterkommen. + +Öffnen Sie als Nächstes Ihre Kopie von `starter-files` in Ihrem bevorzugten Code-Editor und navigieren Sie dann in den Ordner `src`. + +Der gesamte Code, den wir schreiben werden, befindet sich im Ordner `src`. Wir werden die Komponente `HelloWorld.js` und die JavaScript-Dateien `util/interact.js` bearbeiten, um unserem Projekt Web3-Funktionalität zu verleihen. + +### Überprüfen der Startdateien {#check-out-the-starter-files} + +Bevor wir mit dem Programmieren beginnen, wollen wir uns ansehen, was uns in den Startdateien zur Verfügung gestellt wird. + +#### Starten Sie Ihr React-Projekt {#get-your-react-project-running} + +Beginnen wir damit, das React-Projekt in unserem Browser auszuführen. Das Schöne an React ist, dass alle Änderungen, die wir speichern, live in unserem Browser aktualisiert werden, sobald unser Projekt im Browser läuft. + +Um das Projekt zum Laufen zu bringen, navigieren Sie zum Stammverzeichnis des Ordners `starter-files` und führen Sie `npm install` in Ihrem Terminal aus, um die Abhängigkeiten des Projekts zu installieren: + +```bash +cd starter-files +npm install +``` + +Sobald die Installation abgeschlossen ist, führen Sie `npm start` in Ihrem Terminal aus: + +```bash +npm start +``` + +Dadurch sollte sich [http://localhost:3000/](http://localhost:3000/) in Ihrem Browser öffnen, wo Sie das Frontend für unser Projekt sehen. Es sollte aus einem Feld (einem Ort zum Aktualisieren der in Ihrem Smart Contract gespeicherten Nachricht), einer Schaltfläche „Connect Wallet“ und einer Schaltfläche „Update“ bestehen. + +Wenn Sie versuchen, auf eine der Schaltflächen zu klicken, werden Sie feststellen, dass sie nicht funktionieren – das liegt daran, dass wir ihre Funktionalität erst noch programmieren müssen. + +#### Die Komponente `HelloWorld.js` {#the-helloworld-js-component} + +Gehen wir in unserem Editor zurück in den Ordner `src` und öffnen die Datei `HelloWorld.js`. Es ist extrem wichtig, dass wir alles in dieser Datei verstehen, da es sich um die primäre React-Komponente handelt, an der wir arbeiten werden. + +Oben in dieser Datei werden Sie feststellen, dass wir mehrere Importanweisungen haben, die erforderlich sind, um unser Projekt zum Laufen zu bringen, einschließlich der React-Bibliothek, der Hooks useEffect und useState, einiger Elemente aus `./util/interact.js` (wir werden sie bald genauer beschreiben!) und des Alchemy-Logos. + +```javascript +// HelloWorld.js + +import React from "react" +import { useEffect, useState } from "react" +import { + helloWorldContract, + connectWallet, + updateMessage, + loadCurrentMessage, + getCurrentWalletConnected, +} from "./util/interact.js" + +import alchemylogo from "./alchemylogo.svg" +``` + +Als Nächstes haben wir unsere Zustandsvariablen, die wir nach bestimmten Ereignissen aktualisieren werden. + +```javascript +// HelloWorld.js + +// Zustandsvariablen +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [message, setMessage] = useState("No connection to the network.") +const [newMessage, setNewMessage] = useState("") +``` + +Hier ist, was jede der Variablen darstellt: + +- `walletAddress` – ein String, der die Wallet-Adresse des Benutzers speichert +- `status` – ein String, der eine hilfreiche Nachricht speichert, die den Benutzer bei der Interaktion mit der Dapp anleitet +- `message` – ein String, der die aktuelle Nachricht im Smart Contract speichert +- `newMessage` – ein String, der die neue Nachricht speichert, die in den Smart Contract geschrieben wird + +Nach den Zustandsvariablen sehen Sie fünf nicht implementierte Funktionen: `useEffect`, `addSmartContractListener`, `addWalletListener`, `connectWalletPressed` und `onUpdatePressed`. Wir erklären unten, was sie tun: + +```javascript +// HelloWorld.js + +// wird nur einmal aufgerufen +useEffect(async () => { + // TODO: implementieren +}, []) + +function addSmartContractListener() { + // TODO: implementieren +} + +function addWalletListener() { + // TODO: implementieren +} + +const connectWalletPressed = async () => { + // TODO: implementieren +} + +const onUpdatePressed = async () => { + // TODO: implementieren +} +``` + +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) – dies ist ein React-Hook, der aufgerufen wird, nachdem Ihre Komponente gerendert wurde. Da ihm ein leeres Array `[]` als Prop übergeben wird (siehe Zeile 4), wird er nur beim _ersten_ Rendern der Komponente aufgerufen. Hier laden wir die aktuelle in unserem Smart Contract gespeicherte Nachricht, rufen unsere Smart Contract- und Wallet-Listener auf und aktualisieren unsere Benutzeroberfläche, um widerzuspiegeln, ob bereits ein Wallet verbunden ist. +- `addSmartContractListener` – diese Funktion richtet einen Listener ein, der auf das Ereignis `UpdatedMessages` unseres HelloWorld-Vertrags achtet und unsere Benutzeroberfläche aktualisiert, wenn die Nachricht in unserem Smart Contract geändert wird. +- `addWalletListener` – diese Funktion richtet einen Listener ein, der Änderungen im Status des MetaMask-Wallets des Benutzers erkennt, z. B. wenn der Benutzer sein Wallet trennt oder die Adresse wechselt. +- `connectWalletPressed` – diese Funktion wird aufgerufen, um das MetaMask-Wallet des Benutzers mit unserer Dapp zu verbinden. +- `onUpdatePressed` – diese Funktion wird aufgerufen, wenn der Benutzer die im Smart Contract gespeicherte Nachricht aktualisieren möchte. + +Gegen Ende dieser Datei haben wir die Benutzeroberfläche unserer Komponente. + +```javascript +// HelloWorld.js + +// die UI unserer Komponente +return ( +
+ + + +

Current Message:

+

{message}

+ +

New Message:

+ +
+ setNewMessage(e.target.value)} + value={newMessage} + /> +

{status}

+ + + +
+ +
+) +``` + +Wenn Sie diesen Code sorgfältig prüfen, werden Sie feststellen, wo wir unsere verschiedenen Zustandsvariablen in unserer Benutzeroberfläche verwenden: + +- In den Zeilen 6-12 zeigen wir, wenn das Wallet des Benutzers verbunden ist (d. h. `walletAddress.length > 0`), eine gekürzte Version der `walletAddress` des Benutzers in der Schaltfläche mit der ID „walletButton“ an; andernfalls steht dort einfach „Connect Wallet“. +- In Zeile 17 zeigen wir die aktuelle im Smart Contract gespeicherte Nachricht an, die im String `message` erfasst ist. +- In den Zeilen 23-26 verwenden wir eine [gesteuerte Komponente](https://legacy.reactjs.org/docs/forms.html#controlled-components), um unsere Zustandsvariable `newMessage` zu aktualisieren, wenn sich die Eingabe im Textfeld ändert. + +Zusätzlich zu unseren Zustandsvariablen werden Sie auch sehen, dass die Funktionen `connectWalletPressed` und `onUpdatePressed` aufgerufen werden, wenn auf die Schaltflächen mit den IDs `publishButton` bzw. `walletButton` geklickt wird. + +Lassen Sie uns abschließend klären, wo diese Komponente `HelloWorld.js` hinzugefügt wird. + +Wenn Sie zur Datei `App.js` gehen, der Hauptkomponente in React, die als Container für alle anderen Komponenten fungiert, werden Sie sehen, dass unsere Komponente `HelloWorld.js` in Zeile 7 eingefügt wird. + +Zu guter Letzt schauen wir uns noch eine weitere Datei an, die Ihnen zur Verfügung gestellt wird: die Datei `interact.js`. + +#### Die Datei `interact.js` {#the-interact-js-file} + +Da wir uns an das [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)-Paradigma halten wollen, benötigen wir eine separate Datei, die alle unsere Funktionen zur Verwaltung der Logik, Daten und Regeln unserer Dapp enthält, um diese Funktionen dann in unser Frontend (unsere Komponente `HelloWorld.js`) exportieren zu können. + +👆🏽Genau das ist der Zweck unserer Datei `interact.js`! + +Navigieren Sie zum Ordner `util` in Ihrem Verzeichnis `src`, und Sie werden feststellen, dass wir eine Datei namens `interact.js` eingefügt haben, die alle unsere Smart Contract-Interaktions- und Wallet-Funktionen sowie Variablen enthalten wird. + +```javascript +// interact.js + +// export const helloWorldContract; + +export const loadCurrentMessage = async () => {} + +export const connectWallet = async () => {} + +const getCurrentWalletConnected = async () => {} + +export const updateMessage = async (message) => {} +``` + +Sie werden oben in der Datei feststellen, dass wir das Objekt `helloWorldContract` auskommentiert haben. Später in diesem Tutorial werden wir dieses Objekt einkommentieren und unseren Smart Contract in dieser Variablen instanziieren, die wir dann in unsere Komponente `HelloWorld.js` exportieren werden. + +Die vier nicht implementierten Funktionen nach unserem Objekt `helloWorldContract` tun Folgendes: + +- `loadCurrentMessage` – diese Funktion übernimmt die Logik zum Laden der aktuellen im Smart Contract gespeicherten Nachricht. Sie führt einen _Lese_-Aufruf an den Hello World Smart Contract mithilfe der [Alchemy Web3-API](https://github.com/alchemyplatform/alchemy-web3) durch. +- `connectWallet` – diese Funktion verbindet das MetaMask des Benutzers mit unserer Dapp. +- `getCurrentWalletConnected` – diese Funktion prüft beim Laden der Seite, ob bereits ein Ethereum-Konto mit unserer Dapp verbunden ist, und aktualisiert unsere Benutzeroberfläche entsprechend. +- `updateMessage` – diese Funktion aktualisiert die im Smart Contract gespeicherte Nachricht. Sie führt einen _Schreib_-Aufruf an den Hello World Smart Contract durch, sodass das MetaMask-Wallet des Benutzers eine Ethereum-Transaktion signieren muss, um die Nachricht zu aktualisieren. + +Da wir nun verstehen, womit wir arbeiten, wollen wir herausfinden, wie wir aus unserem Smart Contract lesen können! + +### Schritt 3: Lesen aus Ihrem Smart Contract {#step-3-read-from-your-smart-contract} + +Um aus Ihrem Smart Contract zu lesen, müssen Sie Folgendes erfolgreich einrichten: + +- Eine API-Verbindung zur Ethereum-Chain +- Eine geladene Instanz Ihres Smart Contracts +- Eine Funktion zum Aufrufen Ihrer Smart Contract-Funktion +- Einen Listener, der auf Aktualisierungen achtet, wenn sich die Daten ändern, die Sie aus dem Smart Contract lesen + +Das mag nach vielen Schritten klingen, aber keine Sorge! Wir werden Sie Schritt für Schritt durch jeden einzelnen führen! :) + +#### Herstellen einer API-Verbindung zur Ethereum-Chain {#establish-an-api-connection-to-the-ethereum-chain} + +Erinnern Sie sich daran, wie wir in Teil 2 dieses Tutorials unseren [Alchemy Web3-Schlüssel verwendet haben, um aus unserem Smart Contract zu lesen](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)? Sie benötigen auch in Ihrer Dapp einen Alchemy Web3-Schlüssel, um von der Chain zu lesen. + +Falls Sie es noch nicht haben, installieren Sie zunächst [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3), indem Sie zum Stammverzeichnis Ihrer `starter-files` navigieren und Folgendes in Ihrem Terminal ausführen: + +```text +npm install @alch/alchemy-web3 +``` + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ist ein Wrapper um [Web3.js](https://docs.web3js.org/), der erweiterte API-Methoden und andere entscheidende Vorteile bietet, um Ihnen das Leben als Web3-Entwickler zu erleichtern. Es ist so konzipiert, dass es nur minimale Konfiguration erfordert, sodass Sie es sofort in Ihrer App verwenden können! + +Installieren Sie dann das Paket [dotenv](https://www.npmjs.com/package/dotenv) in Ihrem Projektverzeichnis, damit wir einen sicheren Ort haben, um unseren API-Schlüssel zu speichern, nachdem wir ihn abgerufen haben. + +```text +npm install dotenv --save +``` + +Für unsere Dapp **werden wir unseren Websockets-API-Schlüssel verwenden** anstelle unseres HTTP-API-Schlüssels, da er es uns ermöglicht, einen Listener einzurichten, der erkennt, wenn sich die im Smart Contract gespeicherte Nachricht ändert. + +Sobald Sie Ihren API-Schlüssel haben, erstellen Sie eine `.env`-Datei in Ihrem Stammverzeichnis und fügen Sie Ihre Alchemy Websockets-URL hinzu. Danach sollte Ihre `.env`-Datei wie folgt aussehen: + +```javascript +REACT_APP_ALCHEMY_KEY = wss: // eth-goerli.ws.alchemyapi.io/v2/ +``` + +Jetzt sind wir bereit, unseren Alchemy Web3-Endpunkt in unserer Dapp einzurichten! Gehen wir zurück zu unserer `interact.js`, die sich in unserem Ordner `util` befindet, und fügen den folgenden Code oben in 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. + +Da dieser Endpunkt nun bereit ist, ist es an der Zeit, unseren Smart Contract zu laden! + +#### Laden Ihres Hello World Smart Contracts {#loading-your-hello-world-smart-contract} + +Um Ihren Hello World Smart Contract zu laden, benötigen Sie dessen Vertragsadresse und ABI, die beide auf Etherscan zu finden sind, wenn Sie [Teil 3 dieses Tutorials](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan) abgeschlossen haben. + +#### So erhalten Sie Ihre Vertrags-ABI von Etherscan {#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 erforderlich, um anzugeben, welche Funktion ein Vertrag aufrufen wird, und um sicherzustellen, dass die Funktion Daten in dem von Ihnen erwarteten Format zurückgibt. Sobald wir unsere Vertrags-ABI kopiert haben, speichern wir sie als JSON-Datei namens `contract-abi.json` in Ihrem Verzeichnis `src`. + +Ihre contract-abi.json sollte in Ihrem src-Ordner gespeichert werden. + +Ausgestattet 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 Datei `interact.js` 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 Variable `helloWorldContract` einkommentieren und den Smart Contract über unseren AlchemyWeb3-Endpunkt laden: + +```javascript +// interact.js +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +Zusammenfassend sollten die ersten 12 Zeilen Ihrer `interact.js` nun 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 +) +``` + +Da wir unseren Vertrag nun geladen haben, können wir unsere Funktion `loadCurrentMessage` implementieren! + +#### Implementierung von `loadCurrentMessage` in Ihrer Datei `interact.js` {#implementing-loadCurrentMessage-in-your-interact-js-file} + +Diese Funktion ist super einfach. Wir werden einen einfachen asynchronen Web3-Aufruf durchführen, um aus unserem Vertrag zu lesen. Unsere Funktion wird die im Smart Contract gespeicherte Nachricht zurückgeben: + +Aktualisieren Sie die `loadCurrentMessage` in Ihrer Datei `interact.js` wie folgt: + +```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 Funktion `useEffect` in unserer Komponente `HelloWorld.js` wie folgt: + +```javascript +// HelloWorld.js + +// wird nur einmal aufgerufen +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) +}, []) +``` + +Beachten Sie, dass unsere `loadCurrentMessage` nur einmal während des ersten Renderns der Komponente aufgerufen werden soll. 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 in unseren Listener stürzen, schauen wir uns an, was wir bisher haben! Speichern Sie Ihre Dateien `HelloWorld.js` und `interact.js` und gehen Sie dann zu [http://localhost:3000/](http://localhost:3000/) + +Sie werden feststellen, dass die aktuelle Nachricht nicht mehr „No connection to the network.“ lautet. Stattdessen spiegelt sie die im Smart Contract gespeicherte Nachricht wider. Genial! + +#### Ihre Benutzeroberfläche sollte nun die im Smart Contract gespeicherte Nachricht widerspiegeln {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract} + +Apropos Listener... + +#### Implementierung von `addSmartContractListener` {#implement-addsmartcontractlistener} + +Wenn Sie an die Datei `HelloWorld.sol` 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 erinnern, dass es ein Smart Contract-Ereignis namens `UpdatedMessages` gibt, das ausgegeben wird, nachdem die Funktion `update` unseres Smart Contracts aufgerufen wurde (siehe Zeilen 9 und 27): + +```javascript +// HelloWorld.sol + +// Gibt die Version von Solidity unter Verwendung der semantischen Versionierung an. +// Erfahre mehr: 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). Sobald er bereitgestellt ist, befindet sich ein Vertrag an einer bestimmten Adresse auf der Ethereum-Blockchain. Erfahre mehr: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + // Wird emittiert, wenn die update-Funktion aufgerufen wird + // Smart-Contract-Events sind eine Möglichkeit für deinen Vertrag, dem Frontend deiner App mitzuteilen, dass etwas auf der Blockchain passiert ist. Das Frontend kann auf bestimmte Events 'hören' und Maßnahmen ergreifen, wenn sie eintreten. + 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 Vertragserstellung ausgeführt wird. + // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. Erfahre mehr: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 etwas auf der Blockchain passiert ist (d. h. es gab ein _Ereignis_). Die Anwendung kann auf bestimmte Ereignisse „hören“ und Maßnahmen ergreifen, wenn sie eintreten. + +Die Funktion `addSmartContractListener` wird speziell auf das Ereignis `UpdatedMessages` unseres Hello World Smart Contracts hören und unsere Benutzeroberfläche aktualisieren, um die neue Nachricht anzuzeigen. + +Ändern Sie `addSmartContractListener` wie folgt: + +```javascript +// HelloWorld.js + +function addSmartContractListener() { + helloWorldContract.events.UpdatedMessages({}, (error, data) => { + if (error) { + setStatus("😥 " + error.message) + } else { + setMessage(data.returnValues[1]) + setNewMessage("") + setStatus("🎉 Your message has been updated!") + } + }) +} +``` + +Lassen Sie uns aufschlüsseln, was passiert, wenn der Listener ein Ereignis erkennt: + +- Wenn bei der Ausgabe des Ereignisses ein Fehler auftritt, wird dies in der Benutzeroberfläche über unsere Zustandsvariable `status` widergespiegelt. +- Andernfalls verwenden wir das zurückgegebene `data`-Objekt. `data.returnValues` ist ein bei null indiziertes Array, bei dem das erste Element im Array die vorherige Nachricht und das zweite Element die aktualisierte Nachricht speichert. Insgesamt setzen wir bei einem erfolgreichen Ereignis unseren String `message` auf die aktualisierte Nachricht, leeren den String `newMessage` und aktualisieren unsere Zustandsvariable `status`, um widerzuspiegeln, dass eine neue Nachricht in unserem Smart Contract veröffentlicht wurde. + +Lassen Sie uns abschließend unseren Listener in unserer Funktion `useEffect` aufrufen, damit er beim ersten Rendern der Komponente `HelloWorld.js` initialisiert wird. Insgesamt sollte Ihre Funktion `useEffect` so aussehen: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() +}, []) +``` + +Da wir nun aus unserem Smart Contract lesen können, wäre es großartig herauszufinden, wie wir auch in ihn schreiben können! Um jedoch in unsere Dapp zu schreiben, muss zunächst ein Ethereum-Wallet damit verbunden sein. + +Als Nächstes werden wir also die Einrichtung unseres Ethereum-Wallets (MetaMask) in Angriff nehmen und es dann mit unserer Dapp verbinden! + +### Schritt 4: Einrichten Ihres Ethereum-Wallets {#step-4-set-up-your-ethereum-wallet} + +Um etwas in die Ethereum-Chain zu schreiben, müssen Benutzer Transaktionen mit den Private-Keys ihres virtuellen Wallets signieren. Für dieses Tutorial verwenden wir [MetaMask](https://metamask.io/), ein virtuelles Wallet im Browser, das zur Verwaltung Ihrer Ethereum-Kontoadresse verwendet wird, da es das Signieren von Transaktionen für den Endbenutzer extrem 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 [hier](https://metamask.io/download) kostenlos ein MetaMask-Konto herunterladen und 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 hantieren). + +#### Ether von einem Faucet hinzufügen {#add-ether-from-a-faucet} + +Um eine Transaktion auf der Ethereum-Blockchain zu signieren, benötigen wir etwas Fake-ETH. Um ETH zu erhalten, können Sie zu [FaucETH](https://fauceth.komputing.org) gehen und Ihre Goerli-Kontoadresse eingeben, auf „Request funds“ klicken, dann im Dropdown-Menü „Ethereum Testnet Goerli“ auswählen und schließlich erneut auf die Schaltfläche „Request funds“ klicken. Sie sollten kurz darauf ETH in Ihrem MetaMask-Konto sehen! + +#### Überprüfen Sie Ihr Guthaben {#check-your-balance} + +Um sicherzustellen, dass unser Guthaben vorhanden ist, führen 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) durch. Dies gibt die Menge an ETH in unserem Wallet zurück. Nachdem Sie Ihre MetaMask-Kontoadresse eingegeben und auf „Send Request“ geklickt haben, sollten Sie eine Antwort wie diese sehen: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**HINWEIS:** Dieses Ergebnis ist in Wei, nicht in ETH. Wei wird als kleinste Stückelung von Ether verwendet. Die Umrechnung von Wei in ETH lautet: 1 ETH = 10¹⁸ Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl umwandeln, erhalten wir 1\*10¹⁸, was 1 ETH entspricht. + +Puh! Unser Fake-Geld ist komplett da! 🤑 + +### Schritt 5: Verbinden Sie MetaMask mit Ihrer Benutzeroberfläche {#step-5-connect-metamask-to-your-UI} + +Da unser MetaMask-Wallet nun eingerichtet ist, verbinden wir unsere Dapp damit! + +#### Die Funktion `connectWallet` {#the-connectWallet-function} + +Lassen Sie uns in unserer Datei `interact.js` die Funktion `connectWallet` implementieren, die wir dann in unserer Komponente `HelloWorld.js` aufrufen können. + +Ändern wir `connectWallet` wie folgt: + +```javascript +// interact.js + +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Write a message in the text-field above.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + You must install MetaMask, a virtual Ethereum wallet, in your + browser. + +

+
+ ), + } + } +} +``` + +Was genau macht dieser riesige Codeblock also? + +Nun, zuerst wird geprüft, ob `window.ethereum` in Ihrem Browser aktiviert ist. + +`window.ethereum` ist eine globale API, die von MetaMask und anderen Wallet-Anbietern injiziert wird und es Websites ermöglicht, die Ethereum-Konten der Benutzer anzufordern. Wenn dies genehmigt wird, kann sie Daten aus den Blockchains lesen, mit denen der Benutzer verbunden ist, und vorschlagen, dass der Benutzer Nachrichten und Transaktionen signiert. Weitere Informationen finden Sie 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` ein leerer String ist und das JSX-Objekt `status` meldet, dass der Benutzer MetaMask installieren muss. + +Wenn `window.ethereum` _vorhanden_ ist, 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, wobei der Benutzer aufgefordert wird, sein Wallet mit Ihrer Dapp zu verbinden. + +- Wenn der Benutzer sich für eine Verbindung entscheidet, gibt `method: "eth_requestAccounts"` ein Array zurück, das alle Kontoadressen des Benutzers enthält, die mit der Dapp verbunden sind. Insgesamt gibt unsere Funktion `connectWallet` 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 in den Smart Contract zu schreiben. +- Wenn der Benutzer die Verbindung ablehnt, enthält das JSON-Objekt einen leeren String für die zurückgegebene `address` und eine `status`-Nachricht, die widerspiegelt, dass der Benutzer die Verbindung abgelehnt hat. + +Nachdem wir nun diese Funktion `connectWallet` geschrieben haben, besteht der nächste Schritt darin, sie in unserer Komponente `HelloWorld.js` aufzurufen. + +#### Fügen Sie die Funktion `connectWallet` zu Ihrer UI-Komponente `HelloWorld.js` hinzu {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component} + +Navigieren Sie zur Funktion `connectWalletPressed` 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) +} +``` + +Fällt Ihnen auf, wie der Großteil unserer Funktionalität aus der Datei `interact.js` von unserer Komponente `HelloWorld.js` abstrahiert wird? Dies geschieht, damit wir das M-V-C-Paradigma einhalten! + +In `connectWalletPressed` führen wir einfach einen await-Aufruf an unsere importierte Funktion `connectWallet` durch und aktualisieren anhand ihrer Antwort unsere Variablen `status` und `walletAddress` über ihre State-Hooks. + +Speichern wir nun beide Dateien (`HelloWorld.js` und `interact.js`) und testen unsere bisherige Benutzeroberfläche. + +Öffnen Sie Ihren Browser auf der Seite [http://localhost:3000/](http://localhost:3000/) und klicken Sie oben rechts auf der Seite auf die Schaltfläche „Connect Wallet“. + +Wenn Sie MetaMask installiert haben, sollten Sie aufgefordert werden, Ihr Wallet mit Ihrer Dapp zu verbinden. Akzeptieren Sie die Einladung zur Verbindung. + +Sie sollten sehen, dass die Wallet-Schaltfläche nun anzeigt, dass Ihre Adresse verbunden ist! Jaaaaaa 🔥 + +Versuchen Sie als Nächstes, die Seite zu aktualisieren... 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 beheben, indem wir `getCurrentWalletConnected` implementieren, was prüft, ob bereits eine Adresse mit unserer Dapp verbunden ist, und unsere Benutzeroberfläche entsprechend aktualisiert! + +#### Die Funktion `getCurrentWalletConnected` {#the-getcurrentwalletconnected-function} + +Aktualisieren Sie Ihre Funktion `getCurrentWalletConnected` in der Datei `interact.js` 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: "👆🏽 Write a message in the text-field above.", + } + } else { + return { + address: "", + status: "🦊 Connect to MetaMask using the top right button.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + You must install MetaMask, a virtual Ethereum wallet, in your + browser. + +

+
+ ), + } + } +} +``` + +Dieser Code ist der Funktion `connectWallet`, die wir gerade im vorherigen Schritt geschrieben haben, _sehr_ ähnlich. + +Der Hauptunterschied besteht darin, dass wir hier nicht die Methode `eth_requestAccounts` aufrufen, die MetaMask öffnet, damit der Benutzer sein Wallet verbinden kann, sondern die Methode `eth_accounts`, die einfach ein Array mit den MetaMask-Adressen zurückgibt, die derzeit mit unserer Dapp verbunden sind. + +Um diese Funktion in Aktion zu sehen, rufen wir sie in unserer Funktion `useEffect` unserer Komponente `HelloWorld.js` auf: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +Beachten Sie, dass wir die Antwort unseres Aufrufs an `getCurrentWalletConnected` verwenden, um unsere Zustandsvariablen `walletAddress` und `status` zu aktualisieren. + +Nachdem Sie diesen Code hinzugefügt haben, versuchen wir, unser Browserfenster zu aktualisieren. + +Schöööön! Die Schaltfläche sollte anzeigen, dass Sie verbunden sind, und eine Vorschau der Adresse Ihres verbundenen Wallets anzeigen – selbst nach dem Aktualisieren! + +#### Implementierung von `addWalletListener` {#implement-addwalletlistener} + +Der letzte Schritt bei der Einrichtung unseres Dapp-Wallets ist die Implementierung des Wallet-Listeners, damit unsere Benutzeroberfläche aktualisiert wird, wenn sich der Status unseres Wallets ändert, z. B. wenn der Benutzer die Verbindung trennt oder das Konto wechselt. + +Ändern Sie in Ihrer Datei `HelloWorld.js` Ihre Funktion `addWalletListener` wie folgt: + +```javascript +// HelloWorld.js + +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Write a message in the text-field above.") + } else { + setWallet("") + setStatus("🦊 Connect to MetaMask using the top right button.") + } + }) + } else { + setStatus( +

+ {" "} + 🦊 + You must install MetaMask, a virtual Ethereum wallet, in your browser. + +

+ ) + } +} +``` + +Ich wette, Sie brauchen an diesem Punkt nicht einmal unsere Hilfe, um zu verstehen, was hier vor sich geht, aber der Vollständigkeit halber wollen wir es kurz aufschlüsseln: + +- Zuerst prüft unsere Funktion, ob `window.ethereum` aktiviert ist (d. h. MetaMask ist installiert). + - Wenn nicht, setzen wir unsere Zustandsvariable `status` einfach auf einen JSX-String, der den Benutzer auffordert, MetaMask zu installieren. + - Wenn es aktiviert ist, richten wir in Zeile 3 den Listener `window.ethereum.on("accountsChanged")` ein, der auf Statusänderungen im MetaMask-Wallet achtet, z. B. 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 erstes Konto im vom Listener zurückgegebenen Array `accounts` aktualisiert. Andernfalls wird `walletAddress` als leerer String festgelegt. + +Zu guter Letzt müssen wir sie in unserer Funktion `useEffect` 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 die Programmierung unserer gesamten Wallet-Funktionalität erfolgreich abgeschlossen! Nun zu unserer letzten Aufgabe: Aktualisierung der in unserem Smart Contract gespeicherten Nachricht! + +### Schritt 6: Implementierung der Funktion `updateMessage` {#step-6-implement-the-updateMessage-function} + +Alles klar Leute, wir sind auf der Zielgeraden angekommen! In der `updateMessage` Ihrer Datei `interact.js` werden wir Folgendes tun: + +1. Sicherstellen, dass die Nachricht, die wir in unserem Smart Contract veröffentlichen möchten, gültig ist +2. Unsere Transaktion mit MetaMask signieren +3. Diese Funktion von unserer Frontend-Komponente `HelloWorld.js` aufrufen + +Das wird nicht lange dauern; lassen Sie uns diese Dapp fertigstellen! + +#### Eingabefehlerbehandlung {#input-error-handling} + +Natürlich ist es sinnvoll, zu Beginn der Funktion eine Art Eingabefehlerbehandlung zu haben. + +Wir möchten, dass unsere Funktion vorzeitig zurückkehrt, wenn keine MetaMask-Erweiterung installiert ist, kein Wallet verbunden ist (d. h. die übergebene `address` ist ein leerer String) oder die `message` ein leerer String ist. Fügen wir `updateMessage` die folgende Fehlerbehandlung hinzu: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } +} +``` + +Da nun eine ordnungsgemäße Eingabefehlerbehandlung vorhanden ist, ist es an der Zeit, die Transaktion über MetaMask zu signieren! + +#### Signieren unserer Transaktion {#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 unter Ihrem Code zur Eingabefehlerbehandlung Folgendes zu `updateMessage` hinzu: + +```javascript +// interact.js + +// Transaktionsparameter einrichten +const transactionParameters = { + to: contractAddress, // Erforderlich, außer bei Vertragsveröffentlichungen. + 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: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
+ ℹ️ Once the transaction is verified by the network, the message will be + updated automatically. +
+ ), + } +} catch (error) { + return { + status: "😥 " + error.message, + } +} +``` + +Lassen Sie uns aufschlüsseln, was passiert. Zuerst richten wir unsere Transaktionsparameter ein, wobei: + +- `to` die Empfängeradresse (unseren Smart Contract) angibt +- `from` den Unterzeichner der Transaktion angibt, die Variable `address`, die wir an unsere Funktion übergeben haben +- `data` den Aufruf der Methode `update` unseres Hello World Smart Contracts enthält und unsere String-Variable `message` als Eingabe erhält + +Dann führen wir einen await-Aufruf durch, `window.ethereum.request`, bei dem wir MetaMask bitten, die Transaktion zu signieren. Beachten Sie, dass wir in den Zeilen 11 und 12 unsere eth-Methode `eth_sendTransaction` angeben und unsere `transactionParameters` übergeben. + +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 JSX-String `status` 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 String `status` die Fehlermeldung weiterleitet. + +Insgesamt sollte unsere Funktion `updateMessage` so aussehen: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + // Eingabefehlerbehandlung + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } + + // Transaktionsparameter einrichten + const transactionParameters = { + to: contractAddress, // Erforderlich, außer bei Vertragsveröffentlichungen. + 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: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
+ ℹ️ Once the transaction is verified by the network, the message will + be updated automatically. +
+ ), + } + } catch (error) { + return { + status: "😥 " + error.message, + } + } +} +``` + +Zu guter Letzt müssen wir unsere Funktion `updateMessage` mit unserer Komponente `HelloWorld.js` verbinden. + +#### Verbinden Sie `updateMessage` mit dem Frontend `HelloWorld.js` {#connect-updatemessage-to-the-helloworld-js-frontend} + +Unsere Funktion `onUpdatePressed` sollte einen await-Aufruf an die importierte Funktion `updateMessage` durchführen und die Zustandsvariable `status` ändern, um widerzuspiegeln, 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 Schaltfläche **Update** aus! + +### Erstellen Sie Ihre eigene benutzerdefinierte Dapp {#make-your-own-custom-dapp} + +Wuhuuu, Sie haben es bis zum Ende des Tutorials geschafft! Zusammenfassend haben Sie gelernt, wie man: + +- Ein MetaMask-Wallet mit Ihrem Dapp-Projekt verbindet +- Daten aus Ihrem Smart Contract mithilfe der [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3)-API liest +- Ethereum-Transaktionen mit MetaMask signiert + +Jetzt sind Sie bestens gerüstet, um die Fähigkeiten aus diesem Tutorial anzuwenden und Ihr eigenes benutzerdefiniertes Dapp-Projekt zu erstellen! Wie immer gilt: 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) markieren! \ No newline at end of file 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 956e0aa6687..1912f037e7e 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,84 +1,80 @@ --- -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 Anfänger" +description: "Einführendes Tutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum." author: "elanh" -tags: - - "Solidity" - - "Hardhat" - - "Alchemy" - - "Smart Contracts" - - "Erste Schritte" - - "Bereitstellung" +tags: ["Solidity", "Hardhat", "Alchemy", "Smart Contracts", "Bereitstellung"] skill: beginner -breadcrumb: "Hello World-Vertrag" +breadcrumb: Hello World Contract 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 möchten, wie man Smart Contracts bereitstellt 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-Testnet mithilfe eines virtuellen Wallets [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) und [Alchemy](https://www.alchemy.com/eth) durchgehen (keine Sorge, wenn 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 werden wir durchgehen, wie wir mit unserem Smart Contract interagieren können, sobald er hier bereitgestellt wurde, und in [Teil 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) werden wir behandeln, 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 an irgendeinem Punkt 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, einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne unsere eigenen Blockchain-Knoten betreiben zu müssen. Die Plattform verfügt auch über Entwicklertools für Überwachung und Analysen, die wir in diesem Tutorial nutzen werden, um zu verstehen, was bei der Bereitstellung unseres Smart Contracts unter der Haube vor sich geht. Wenn Sie noch kein Alchemy-Konto haben, [können Sie sich hier kostenlos anmelden](https://dashboard.alchemy.com/signup). -## Schritt 2: Anwendung (und den API-Schlüssel) erstellen {#step-2} +## Schritt 2: Erstellen Sie Ihre App (und Ihren API-Schlüssel) {#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, indem Sie eine App erstellen. Dies ermöglicht es uns, Anfragen an das Sepolia-Testnet zu stellen. Wenn Sie nicht mit Testnets vertraut sind, schauen 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 zur Seite „Create new app“ (Neue App erstellen) in Ihrem Alchemy-Dashboard, indem Sie in der Navigationsleiste „Select an app“ (Eine App auswählen) wählen und auf „Create new app“ klicken. -![Hello World-App erstellen](./hello-world-create-app.png) +![Hello world create app](./hello-world-create-app.png) -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. Nennen Sie Ihre App „Hello World“, geben Sie eine kurze Beschreibung an und wählen Sie einen Anwendungsfall, z. B. „Infra & Tooling“. Suchen Sie als Nächstes nach „Ethereum“ und wählen Sie das Netzwerk aus. -![Hello World-App-Ansicht erstellen](./create-app-view-hello-world.png) +![create app view hello world](./create-app-view-hello-world.png) -3. Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen. +3. Klicken Sie auf „Next“ (Weiter), um fortzufahren, dann auf „Create app“ (App erstellen) und das war's! Ihre App sollte im Dropdown-Menü der Navigationsleiste erscheinen, mit einem API-Schlüssel, den Sie kopieren können. -## Schritt 3: Ethereum-Konto (Adresse) erstellen {#step-3} +## Schritt 3: Erstellen Sie ein Ethereum-Konto (Adresse) {#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/). +Wir benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. Für dieses Tutorial verwenden wir MetaMask, ein virtuelles Wallet im Browser, das zur Verwaltung Ihrer Ethereum-Kontoadresse verwendet wird. 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, stellen Sie sicher, dass Sie über das Netzwerk-Dropdown-Menü zum „Sepolia“-Testnet wechseln (damit wir nicht mit echtem Geld hantieren). -![Beispiel MetaMask Ropsten](./metamask-ropsten-example.png) +Wenn Sepolia nicht aufgeführt ist, gehen Sie ins Menü, dann auf „Advanced“ (Erweitert) und scrollen Sie nach unten, um „Show test networks“ (Testnetzwerke anzeigen) einzuschalten. Wählen Sie im Netzwerkauswahlmenü die Registerkarte „Custom“ (Benutzerdefiniert), um eine Liste von Testnets zu finden, und wählen Sie „Sepolia“. -## Schritt 4: Ether von einem Faucet hinzufügen {#step-4} +![metamask sepolia example](./metamask-sepolia-example.png) -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. +## Schritt 4: Fügen Sie Ether aus einem Faucet hinzu {#step-4} -## Schritt 5: Guthaben prüfen {#step-5} +Um unseren Smart Contract im Testnet bereitzustellen, benötigen wir etwas falsches ETH. Um Sepolia-ETH zu erhalten, können Sie zu den [Sepolia-Netzwerkdetails](/developers/docs/networks/#sepolia) gehen, um eine Liste verschiedener Faucets anzuzeigen. Wenn eines nicht funktioniert, versuchen Sie ein anderes, da sie manchmal leerlaufen können. Es kann aufgrund des Netzwerkverkehrs einige Zeit dauern, bis Sie Ihr falsches ETH erhalten. Sie sollten kurz darauf ETH in Ihrem MetaMask-Konto sehen! -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: +## Schritt 5: Überprüfen Sie Ihr Guthaben {#step-5} + +Um sicherzustellen, dass 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). Dies gibt die Menge an ETH in unserem Wallet zurück. Nachdem Sie Ihre MetaMask-Kontoadresse eingegeben und auf „Send Request“ (Anfrage senden) geklickt haben, sollten Sie eine Antwort wie diese sehen: ```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, nicht in ETH. Wei wird als die kleinste Stückelung von Ether verwendet. 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 falsches Geld ist komplett da . -## Schritt 6: Projekt initialisieren {#step-6} +## Schritt 6: Initialisieren Sie unser Projekt {#step-6} -Zunächst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zur Befehlszeile und geben Sie Folgendes ein: +Zuerst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zu Ihrer Befehlszeile und geben Sie ein: ``` 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 [diesen Anweisungen](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir benötigen auch Node.js, laden Sie das also ebenfalls 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, hier ist als Referenz, wie wir es gemacht haben: ``` package name: (hello-world) @@ -105,29 +101,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 wir können loslegen! -## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview){#step-7} installieren +## Schritt 7: Laden Sie [Hardhat](https://hardhat.org/getting-started/#overview) herunter {#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 beim lokalen Erstellen von Smart Contracts und Dapps, bevor sie 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). +Auf dieser Seite finden Sie weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview). -## Schritt 8: Hardhat-Projekt erstellen {#step-8} +## Schritt 8: Erstellen Sie ein Hardhat-Projekt {#step-8} -Führen Sie in unserem Projektordner folgenden Befehl aus: +Führen Sie in unserem Projektordner Folgendes 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 und die Option sehen, auszuwählen, was Sie tun möchten. Wählen Sie „create an empty hardhat.config.js“: ``` 888 888 888 888 888 @@ -141,74 +137,72 @@ Sie sollten eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwä 👷 Welcome to Hardhat v2.0.11 👷‍? -Was möchten Sie tun? … +What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit ``` -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 die gesamte Einrichtung für unser Projekt festlegen (in Schritt 13). -## Schritt 9: Projektordner hinzufügen {#step-9} +## Schritt 9: Fügen Sie Projektordner hinzu {#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 übersichtlich zu halten, erstellen wir zwei neue Ordner. Navigieren Sie in Ihrer Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie 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: Schreiben Sie unseren Vertrag {#step-10} -Sie fragen sich vielleicht, wann fangen wir endlich an, den Code zu schreiben? Jetzt! In Schritt 10. +Sie fragen sich vielleicht, wann zum Teufel wir Code schreiben werden?? Nun, hier sind wir, bei 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 HelloWorld.sol Smart Contract 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 namens HelloWorld.sol +2. Unten finden Sie einen beispielhaften Hello World Smart Contract von der Ethereum Foundation, den wir für dieses Tutorial verwenden werden. Kopieren Sie den unten stehenden Inhalt und fügen Sie ihn in Ihre HelloWorld.sol-Datei ein. Lesen Sie unbedingt die Kommentare, um zu verstehen, was dieser Vertrag tut: ```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 unter Verwendung der semantischen Versionierung an. +// Weitere Informationen: 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 Contract namens `HelloWorld`. +// Ein Contract ist eine Sammlung von Funktionen und Daten (seinem Zustand). Sobald er bereitgestellt wurde, befindet sich ein Contract an einer bestimmten Adresse auf der Ethereum-Blockchain. Weitere Informationen: 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 Contract-Speicher gespeichert werden. Das Schlüsselwort `public` macht Variablen von außerhalb eines Contracts zugänglich und erstellt eine Funktion, die andere Contracts 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 in vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor eine spezielle Funktion, die nur bei der Erstellung des Contracts ausgeführt wird. + // Konstruktoren werden verwendet, um die Daten des Contracts zu initialisieren. Weitere Informationen: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 Contracts ein). 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 super einfacher Smart Contract, der bei der Erstellung eine Nachricht speichert und durch Aufrufen der `update`-Funktion aktualisiert werden kann. -## Schritt 11: MetaMask und Alchemy mit Ihrem Projekt verbinden {#step-11} +## Schritt 11: Verbinden Sie MetaMask & Alchemy mit Ihrem Projekt {#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. +Wir haben ein 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 Ihrem virtuellen Wallet gesendet wird, erfordert eine Signatur mit Ihrem einzigartigen Private-Key. Um unserem Programm diese Berechtigung zu erteilen, können wir unseren Private-Key (und den Alchemy-API-Schlüssel) sicher in einer Umgebungsdatei speichern. -> 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, schauen Sie sich [dieses Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) zum Senden von Transaktionen mit web3 an. Installieren Sie zunächst das dotenv-Paket in Ihrem Projektverzeichnis: @@ -216,51 +210,51 @@ Installieren Sie zunächst 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 MetaMask Private-Key und die 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 Private-Key zu exportieren +- Siehe unten, um die HTTP-Alchemy-API-URL zu erhalten -![Alchemy-API-Schlüssel erhalten](./get-alchemy-api-key.gif) +![get alchemy api key](./get-alchemy-api-key.png) -Alchemy-API-URL kopieren +Kopieren Sie die Alchemy-API-URL -Unser `.env` sollte dann so aussehen: +Ihre `.env` sollte so 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, werden wir diese Variablen in unserer `hardhat.config.js`-Datei in Schritt 13 referenzieren. -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. +Committen Sie .env nicht! Bitte stellen Sie sicher, dass Sie Ihre .env-Datei niemals mit jemandem teilen oder offenlegen, da Sie dadurch Ihre Geheimnisse kompromittieren. Wenn Sie eine Versionskontrolle verwenden, fügen Sie Ihre .env zu einer gitignore-Datei hinzu. -## Schritt 12: Ethers.js installieren {#step-12-install-ethersjs} +## Schritt 12: Installieren Sie Ethers.js {#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 es einfacher macht, mit Ethereum zu interagieren und Anfragen zu stellen, indem sie [Standard-JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) mit benutzerfreundlicheren Methoden umhüllt. -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 super 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 Bereitstellung von Verträgen nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) verfügt über einige sehr saubere Methoden zur Bereitstellung von Verträgen). -Geben Sie Folgendes in Ihrem Projektverzeichnis ein: +Geben Sie in Ihrem Projektverzeichnis Folgendes 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`. +Wir werden im nächsten Schritt auch Ethers in unserer `hardhat.config.js` benötigen. -## Schritt 13: hardhat.config.js aktualisieren {#step-13-update-hardhatconfigjs} +## Schritt 13: Aktualisieren Sie hardhat.config.js {#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 von allen weiß. -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(); @@ -273,10 +267,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}`] } @@ -284,23 +278,23 @@ module.exports = { } ``` -## Schritt 14: Vertragszusammenstellung {#step-14-compile-our-contracts} +## Schritt 14: Kompilieren Sie unseren Vertrag {#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 sicherzustellen, dass bisher alles funktioniert, lassen Sie uns unseren Vertrag kompilieren. Die Aufgabe `compile` ist eine der integrierten Hardhat-Aufgaben. -Führen Sie folgenden Befehl in der Befehlszeile aus: +Führen Sie über die Befehlszeile Folgendes 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 über `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 im [Alchemy Discord](https://discord.gg/u72VCg3) eine Nachricht schreiben. -## Schritt 15: Bereitstellungsskript schreiben {#step-15-write-our-deploy-scripts} +## Schritt 15: Schreiben Sie unser Bereitstellungsskript {#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. +Da unser Vertrag nun geschrieben ist und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, unser 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`, der Sie den folgenden Inhalt hinzufügen: ``` async function main() { @@ -318,48 +312,49 @@ 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 leistet hervorragende Arbeit bei der Erklärung, was jede dieser Codezeilen in ihrem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) tut. Wir haben ihre 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 Fabrik für Instanzen unseres Hello World-Vertrags. Bei Verwendung des `hardhat-ethers`-Plugins sind `ContractFactory`- und `Contract`-Instanzen 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 in einen `Contract` aufgelöst wird. Dies ist das Objekt, das eine Methode für jede unserer Smart Contract-Funktionen hat. -## Schritt 16: Vertragsbereitstellung {#step-16-deploy-our-contract} +## Schritt 16: Stellen Sie unseren Vertrag bereit {#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: +Wir sind 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: +Sie sollten dann so etwas sehen: ``` 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 zum [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 in etwa so aussehen: -![Etherscan-Vertrag](./etherscan-contract.png) +![etherscan contract](./etherscan-contract.png) -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 wird „Contract Creation“ (Vertragserstellung) lauten, aber wenn wir in die Transaktion klicken, sehen wir unsere Vertragsadresse im `To`-Feld: -![Etherscan-Transaktion](./etherscan-transaction.png) +![etherscan transaction](./etherscan-transaction.png) -Herzlichen Glückwunsch! Sie haben gerade einen Smart Contract in der Ethereum.Chain hinzugefügt 🎉. +Herzlichen Glückwunsch! Sie haben gerade einen Smart Contract auf 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. ![Hello World-Explorer](./hello-world-explorer.png) +Um zu verstehen, was unter der Haube vor sich geht, navigieren wir zur Registerkarte Explorer 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. +![hello world explorer](./hello-world-explorer.png) -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 unter der Haube für uns gemacht haben, als wir die Funktion `.deploy()` aufgerufen haben. Zwei wichtige, die hier hervorgehoben werden sollten, sind [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), was die Anfrage ist, unseren Vertrag tatsächlich auf die Sepolia-Chain zu schreiben, und [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash), was eine Anfrage ist, um Informationen über unsere Transaktion anhand des Hashs zu lesen (ein typisches Muster bei Transaktionen). Um mehr über das Senden von Transaktionen zu erfahren, schauen 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 war's 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 anfä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 wieder ein Update verpassen? Abonnieren Sie unseren Newsletter [hier](https://www.alchemy.com/newsletter)! Treten Sie auch unbedingt unserem [Discord](https://discord.gg/u72VCg3) bei.**. \ No newline at end of file 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..10eaf22b736 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -0,0 +1,146 @@ +--- +title: Wie man einen ERC-721-Markt implementiert +description: Wie man tokenisierte Artikel auf einem dezentralisierten Kleinanzeigenportal zum Verkauf anbietet +author: "Alberto Cuesta Cañada" +tags: ["Smart Contracts", "erc-721", "Solidity", "Tokens"] +skill: intermediate +breadcrumb: ERC-721-Markt +lang: de +published: 2020-03-19 +source: Hackernoon +sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9 +--- + +In diesem Artikel werde ich Ihnen zeigen, wie man Craigslist für die Ethereum-Blockchain programmiert. + +Vor Gumtree, Ebay und Craigslist bestanden Kleinanzeigenbretter meist aus Kork oder Papier. Es gab Kleinanzeigenbretter in Schulfluren, Zeitungen, an Straßenlaternen und in Schaufenstern. + +All das änderte sich mit dem Internet. Die Anzahl der Menschen, die ein bestimmtes Kleinanzeigenbrett sehen konnten, vervielfachte sich um viele Größenordnungen. Damit wurden die Märkte, die sie repräsentieren, viel effizienter und skalierten auf globale Größe. Ebay ist ein riesiges Unternehmen, das seine Ursprünge auf diese physischen Kleinanzeigenbretter zurückführt. + +Mit der Blockchain werden sich diese Märkte noch einmal verändern. Lassen Sie mich Ihnen zeigen, wie. + +## Monetarisierung {#monetization} + +Das Geschäftsmodell eines öffentlichen Blockchain-Kleinanzeigenportals muss sich von dem von Ebay und Co. unterscheiden. + +Zunächst gibt es [den Aspekt der Dezentralisierung](/developers/docs/web2-vs-web3/). Bestehende Plattformen müssen ihre eigenen Server warten. Eine dezentralisierte Plattform wird von ihren Nutzern gepflegt, sodass die Kosten für den Betrieb der Kernplattform für den Plattformbesitzer auf null sinken. + +Dann gibt es das Front-End, die Website oder Schnittstelle, die Zugang zur Plattform bietet. Hier gibt es viele Optionen. Die Plattformbesitzer können den Zugang beschränken und jeden zwingen, ihre Schnittstelle zu nutzen, wofür sie eine Gebühr erheben. Die Plattformbesitzer können sich auch entscheiden, den Zugang zu öffnen (Macht dem Volk!) und jedem erlauben, Schnittstellen zur Plattform zu bauen. Oder die Besitzer könnten sich für einen Ansatz in der Mitte dieser Extreme entscheiden. + +_Führungskräfte mit mehr Vision als ich werden wissen, wie man das monetarisiert. Alles, was ich sehe, ist, dass dies anders ist als der Status quo und wahrscheinlich profitabel._ + +Darüber hinaus gibt es den Aspekt der Automatisierung und der Zahlungen. Einige Dinge können sehr [effektiv tokenisiert](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) und auf einem Kleinanzeigenportal gehandelt werden. Tokenisierte Vermögenswerte lassen sich leicht auf einer Blockchain übertragen. Hochkomplexe Zahlungsmethoden können problemlos auf einer Blockchain implementiert werden. + +Ich wittere hier einfach eine Geschäftsmöglichkeit. Ein Kleinanzeigenportal ohne laufende Kosten kann leicht implementiert werden, wobei komplexe Zahlungswege in jede Transaktion integriert sind. Ich bin sicher, jemand wird eine Idee haben, wofür man das nutzen kann. + +Ich bin einfach froh, es zu bauen. 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 Beispielimplementierungen für Geschäftsfälle und anderen Leckerbissen gestartet, schauen Sie doch mal rein. + +Der Code für dieses [Ethereum-Kleinanzeigenportal](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) ist dort zu finden, bitte nutzen und missbrauchen Sie ihn. Seien Sie sich nur bewusst, dass der Code nicht geprüft wurde und Sie Ihre eigene Sorgfaltsprüfung durchführen müssen, bevor Sie Geld hineinfließen lassen. + +Die Grundlagen des Portals sind nicht komplex. Alle Anzeigen auf dem Portal werden nur ein Struct mit ein paar Feldern sein: + +```solidity +struct Trade { + address poster; + uint256 item; + uint256 price; + bytes32 status; // Offen, Ausgeführt, Abgebrochen +} +``` + +Es gibt also jemanden, der die Anzeige aufgibt. Einen Artikel zum Verkauf. Einen Preis für den Artikel. Den Status des Handels, der offen, ausgeführt oder storniert sein kann. + +All diese Handel werden in einem Mapping gespeichert. Weil in Solidity scheinbar alles ein Mapping ist. Und auch, weil es praktisch ist. + +```solidity +mapping(uint256 => Trade) public trades; +``` + +Die Verwendung eines Mappings bedeutet lediglich, dass wir uns für jede Anzeige eine ID ausdenken müssen, bevor wir sie aufgeben, und wir müssen die ID einer Anzeige kennen, bevor wir damit arbeiten können. Es gibt mehrere Möglichkeiten, damit umzugehen, entweder im Smart Contract oder im Front-End. Bitte fragen Sie, wenn Sie ein paar Hinweise benötigen. + +Als Nächstes stellt sich die Frage, was das für Artikel sind, mit denen wir handeln, und was diese Währung ist, die zur Bezahlung der Transaktion verwendet wird. + +Für die Artikel verlangen 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 Möglichkeit ist, reale Gegenstände auf einer Blockchain darzustellen, obwohl es [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 Konstruktor spezifizieren, was bedeutet, dass alle Vermögenswerte auf unserem Kleinanzeigenportal im Vorfeld tokenisiert worden sein müssen. + +Für die Zahlungen werden wir etwas Ähnliches tun. 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 etablierte wie DAI zu verwenden. Bei diesem Kleinanzeigenportal müssen Sie sich bei der Erstellung nur entscheiden, was Ihre Währung sein soll. Ganz einfach. + +```solidity +constructor ( + address _currencyTokenAddress, address _itemTokenAddress +) public { + currencyToken = IERC20(_currencyTokenAddress); + itemToken = IERC721(_itemTokenAddress); + tradeCounter = 0; +} +``` + +Wir kommen der Sache näher. Wir haben Anzeigen, Handelsartikel und eine Währung für Zahlungen. Eine Anzeige aufzugeben bedeutet, einen Artikel in ein Treuhandkonto zu geben, um zu zeigen, dass man ihn besitzt und dass man ihn nicht zweimal, möglicherweise auf einem anderen Portal, aufgegeben hat. + +Der folgende Code macht genau das. Er legt den Artikel in das Treuhandkonto, erstellt die Anzeige und erledigt einige Verwaltungsaufgaben. + +```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, eine Anzeige (Handel) auszuwählen, den Preis zu zahlen und den Artikel zu erhalten. Der folgende Code ruft einen Handel ab. Überprüft, ob er verfügbar ist. Bezahlt den Artikel. Ruft den Artikel ab. 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 eine Option für Verkäufer, von einem Handel zurückzutreten, bevor ein Käufer ihn akzeptiert. In einigen Modellen wären Anzeigen stattdessen für einen bestimmten Zeitraum live, bevor sie ablaufen. Das ist Ihre Entscheidung, abhängig vom Design Ihres Marktes. + +Der Code ist dem sehr ähnlich, der zur Ausführung eines Handels verwendet wird, nur dass keine Währung den Besitzer wechselt und der Artikel an den Ersteller der Anzeige zurückgeht. + +```solidity +function cancelTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require( + msg.sender == trade.poster, + "Trade can be cancelled only by poster." + ); + require(trade.status == "Open", "Trade is not Open."); + itemToken.transferFrom(address(this), trade.poster, trade.item); + trades[_trade].status = "Cancelled"; + emit TradeStatusChange(_trade, "Cancelled"); +} +``` + +Das war's. Sie haben es bis zum Ende der Implementierung geschafft. Es ist ziemlich überraschend, wie kompakt einige Geschäftskonzepte sind, wenn sie in Code ausgedrückt werden, und dies ist einer dieser Fälle. Sehen Sie sich den vollständigen Vertrag [in unserem Repo](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol) an. + +## Fazit {#conclusion} + +Kleinanzeigenportale sind eine gängige Marktkonfiguration, die mit dem Internet massiv skaliert ist und zu einem enorm beliebten Geschäftsmodell mit einigen wenigen monopolistischen Gewinnern wurde. + +Kleinanzeigenportale sind zufällig auch ein einfaches Werkzeug, das sich in einer Blockchain-Umgebung replizieren lässt, mit sehr spezifischen Funktionen, die eine Herausforderung für die bestehenden Giganten möglich machen. + +In diesem Artikel habe ich den Versuch unternommen, eine Brücke zwischen der geschäftlichen Realität eines Kleinanzeigenportals und der technologischen Implementierung zu schlagen. Dieses Wissen sollte Ihnen helfen, eine Vision und eine Roadmap für die Implementierung zu erstellen, wenn Sie über die entsprechenden Fähigkeiten verfügen. + +Wie immer, wenn Sie etwas Unterhaltsames bauen möchten und sich über einen Rat freuen würden, [schreiben Sie mir bitte](https://albertocuesta.es/)! Ich helfe immer gerne. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md index 884a7a45450..0104b012cf1 100644 --- a/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md @@ -1,29 +1,29 @@ --- title: "Wie man einen NFT prägt (Teil 2/3 der NFT-Tutorial-Reihe)" -description: "In diesem Tutorial wird beschrieben, wie Sie einen NFT auf der Ethereum-Blockchain mit unserem Smart Contract und Web3 prägen können." +description: "Dieses Tutorial beschreibt, wie man einen NFT auf der Ethereum-Blockchain mithilfe unseres Smart Contracts und Web3 prägt." author: "Sumi Mudgil" -tags: ["ERC-721", "alchemy", "solidity", "smart contracts"] +tags: ["ERC-721", "Alchemy", "Solidity", "Smart Contracts"] skill: beginner -breadcrumb: "NFT minten" +breadcrumb: "Einen NFT prägen" lang: de published: 2021-04-22 --- -[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 Millionen Dollar -[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 Millionen Dollar -[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 Millionen Dollar +[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 Millionen $ +[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 Millionen $ +[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 Millionen $ -Sie alle haben ihre NFTs mit der leistungsstarken API von Alchemy geprägt. In diesem Tutorial zeigen wir Ihnen, wie das in \<10 Minuten geht. +Sie alle haben ihre NFTs mithilfe der leistungsstarken API von Alchemy geprägt. In diesem Tutorial zeigen wir Ihnen, wie Sie in \<10 Minuten dasselbe tun können. -Das „Prägen eines NFT“ ist der Akt der Veröffentlichung einer einzigartigen Instanz Ihres ERC-721-Tokens auf der Blockchain. Nutzen wir unseren Smart Contract aus [Teil 1 dieser NFT-Tutorial-Reihe](/developers/tutorials/how-to-write-and-deploy-an-nft/), um unsere Web3-Fähigkeiten unter Beweis zu stellen und einen NFT zu prägen. Am Ende dieses Tutorials werden Sie in der Lage sein, so viele NFTs zu prägen, wie Ihr Herz (und Ihr Wallet) begehrt! +„Einen NFT prägen“ ist der Vorgang, eine einzigartige Instanz Ihres ERC-721-Tokens auf der Blockchain zu veröffentlichen. Lassen Sie uns mit unserem Smart Contract aus [Teil 1 dieser NFT-Tutorial-Reihe](/developers/tutorials/how-to-write-and-deploy-an-nft/) unsere Web3-Fähigkeiten unter Beweis stellen und einen NFT prägen. Am Ende dieses Tutorials werden Sie in der Lage sein, so viele NFTs zu prägen, wie Ihr Herz (und Ihre Wallet) begehrt! -Legen wir los! +Lassen Sie uns anfangen! ## Schritt 1: Web3 installieren {#install-web3} -Wenn Sie dem ersten Tutorial zur Erstellung Ihres NFT-Smart-Contracts gefolgt sind, haben Sie bereits Erfahrung mit der Verwendung von Ethers.js. Web3 ist ähnlich wie Ethers eine Bibliothek, die das Erstellen von Anfragen an die Ethereum-Blockchain erleichtert. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), eine erweiterte Web3-Bibliothek, die automatische Wiederholungsversuche und robuste WebSocket-Unterstützung bietet. +Wenn Sie das erste Tutorial zur Erstellung Ihres NFT-Smart-Contracts befolgt haben, haben Sie bereits Erfahrung mit Ethers.js. Web3 ist ähnlich wie Ethers, da es sich um eine Bibliothek handelt, die das Erstellen von Anfragen an die [Ethereum](/)-Blockchain erleichtert. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), eine erweiterte Web3-Bibliothek, die automatische Wiederholungsversuche und robuste WebSocket-Unterstützung bietet. -Führen Sie im Stammverzeichnis Ihres Projekts Folgendes aus: +Führen Sie in Ihrem Projekt-Stammverzeichnis Folgendes aus: ``` npm install @alch/alchemy-web3 @@ -31,7 +31,7 @@ npm install @alch/alchemy-web3 ## Schritt 2: Eine `mint-nft.js`-Datei erstellen {#create-mintnftjs} -Erstellen Sie in Ihrem Skriptverzeichnis eine `mint-nft.js`-Datei und fügen Sie die folgenden Codezeilen hinzu: +Erstellen Sie in Ihrem Skriptverzeichnis eine Datei namens `mint-nft.js` und fügen Sie die folgenden Codezeilen hinzu: ```js require("dotenv").config() @@ -40,83 +40,83 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) ``` -## Schritt 3: Die Vertrags-ABI abrufen {#contract-abi} +## Schritt 3: Holen Sie sich Ihre Vertrags-ABI {#contract-abi} -Die ABI unseres Vertrags (Application Binary Interface) ist die Schnittstelle für die Interaktion mit unserem Smart-Contract. Mehr über Vertrags-ABIs erfahren Sie [hier](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is). Hardhat generiert automatisch eine ABI für uns und speichert sie in der Datei `MyNFT.json`. Um dies zu verwenden, müssen wir den Inhalt parsen, indem wir die folgenden Codezeilen zu unserer `mint-nft.js`-Datei hinzufügen: +Unsere Vertrags-ABI (Application Binary Interface) ist die Schnittstelle zur Interaktion mit unserem Smart Contract. Mehr über Vertrags-ABIs erfahren Sie [hier](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is). Hardhat generiert automatisch eine ABI für uns und speichert sie in der Datei `MyNFT.json`. Um diese zu verwenden, müssen wir den Inhalt parsen, indem wir die folgenden Codezeilen zu unserer Datei `mint-nft.js` hinzufügen: ```js const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") ``` -Wenn Sie die ABI sehen möchten, können Sie sie auf Ihrer Konsole ausgeben: +Wenn Sie die ABI sehen möchten, können Sie sie in Ihrer Konsole ausgeben: ```js console.log(JSON.stringify(contract.abi)) ``` -Um `mint-nft.js` auszuführen und Ihre ABI auf der Konsole ausgeben zu sehen, navigieren Sie zu Ihrem Terminal und führen Sie Folgendes aus: +Um `mint-nft.js` auszuführen und Ihre ABI in der Konsole ausgeben zu lassen, navigieren Sie zu Ihrem Terminal und führen Sie Folgendes aus: ```js node scripts/mint-nft.js ``` -## Schritt 4: Metadaten für Ihren NFT mit IPFS konfigurieren {#config-meta} +## Schritt 4: Konfigurieren Sie die Metadaten für Ihren NFT mit IPFS {#config-meta} -Wenn Sie sich an unser Tutorial in Teil 1 erinnern, nimmt unsere `mintNFT`-Smart-Contract-Funktion einen tokenURI-Parameter entgegen, der zu einem JSON-Dokument aufgelöst werden sollte, das die Metadaten des NFT beschreibt – was den NFT erst richtig zum Leben erweckt und ihm konfigurierbare Eigenschaften wie Name, Beschreibung, Bild und andere Attribute verleiht. +Wenn Sie sich an unser Tutorial in Teil 1 erinnern, nimmt unsere Smart-Contract-Funktion `mintNFT` einen tokenURI-Parameter entgegen, der auf ein JSON-Dokument verweisen sollte, das die Metadaten des NFTs beschreibt – was den NFT erst wirklich zum Leben erweckt und ihm konfigurierbare Eigenschaften wie Name, Beschreibung, Bild und andere Attribute verleiht. -> _Interplanetary File System (IPFS) ist ein dezentrales Protokoll und ein Peer-to-Peer-Netzwerk zum Speichern und Teilen von Daten in einem verteilten Dateisystem._ +> _Das Interplanetary File System (IPFS) ist ein dezentralisiertes Protokoll und Peer-to-Peer-Netzwerk zum Speichern und Teilen von Daten in einem verteilten Dateisystem._ -Wir werden Pinata, eine praktische IPFS-API und ein Toolkit, verwenden, um unser NFT-Asset und unsere Metadaten zu speichern und sicherzustellen, dass unser NFT wirklich dezentral ist. Wenn Sie kein Pinata-Konto haben, registrieren Sie sich [hier](https://app.pinata.cloud) für ein kostenloses Konto und führen Sie die Schritte zur Verifizierung Ihrer E-Mail-Adresse aus. +Wir werden Pinata verwenden, eine praktische IPFS-API und ein Toolkit, um unser NFT-Asset und die Metadaten zu speichern und sicherzustellen, dass unser NFT wirklich dezentralisiert ist. Wenn Sie noch kein Pinata-Konto haben, melden Sie sich [hier](https://app.pinata.cloud) für ein kostenloses Konto an und führen Sie die Schritte zur Verifizierung Ihrer E-Mail-Adresse durch. Sobald Sie ein Konto erstellt haben: -- Navigieren Sie zur Seite „Dateien“ und klicken Sie oben links auf die blaue Schaltfläche „Hochladen“. +- Navigieren Sie zur Seite „Files“ (Dateien) und klicken Sie oben links auf die blaue Schaltfläche „Upload“ (Hochladen). -- Laden Sie ein Bild auf Pinata hoch – dies wird das Bild-Asset für Ihren NFT sein. Sie können das Asset benennen, wie Sie möchten. +- Laden Sie ein Bild auf Pinata hoch – dies wird das Bild-Asset für Ihren NFT sein. Sie können das Asset nach Belieben benennen. -- Nach dem Hochladen sehen Sie die Datei-Informationen in der Tabelle auf der Seite „Dateien“. Sie werden auch eine CID-Spalte sehen. Sie können die CID kopieren, indem Sie auf die Schaltfläche zum Kopieren daneben klicken. Sie können Ihren Upload unter `https://gateway.pinata.cloud/ipfs/` ansehen. Das von uns verwendete Bild finden Sie zum Beispiel auf IPFS [hier](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5). +- Nach dem Hochladen sehen Sie die Dateiinformationen in der Tabelle auf der Seite „Files“. Sie sehen auch eine CID-Spalte. Sie können die CID kopieren, indem Sie auf die Kopieren-Schaltfläche daneben klicken. Sie können Ihren Upload unter `https://gateway.pinata.cloud/ipfs/` ansehen. Das von uns verwendete Bild finden Sie beispielsweise [hier](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5) auf IPFS. -Für die eher visuell Lernenden sind die obigen Schritte hier zusammengefasst: +Für die eher visuellen Lerner sind die obigen Schritte hier zusammengefasst: -![So laden Sie Ihr Bild auf Pinata hoch](./instructionsPinata.gif) +![Wie man sein Bild auf Pinata hochlädt](./instructionsPinata.gif) -Jetzt wollen wir noch ein weiteres Dokument auf Pinata hochladen. Aber bevor wir das tun, müssen wir es erstellen! +Nun möchten wir noch ein weiteres Dokument auf Pinata hochladen. Aber bevor wir das tun, müssen wir es erstellen! -Erstellen Sie in Ihrem Stammverzeichnis eine neue Datei mit dem Namen `nft-metadata.json` und fügen Sie den folgenden JSON-Code hinzu: +Erstellen Sie in Ihrem Stammverzeichnis eine neue Datei namens `nft-metadata.json` und fügen Sie den folgenden JSON-Code hinzu: ```json { "attributes": [ { - "trait_type": "Rasse", + "trait_type": "Breed", "value": "Maltipoo" }, { - "trait_type": "Augenfarbe", - "value": "Mokka" + "trait_type": "Eye color", + "value": "Mocha" } ], - "description": "Der bezauberndste und sensibelste Welpe der Welt.", + "description": "The world's most adorable and sensitive pup.", "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb", "name": "Ramses" } ``` -Sie können die Daten in der JSON-Datei beliebig ändern. Sie können den Abschnitt mit den Attributen entfernen oder erweitern. Am wichtigsten ist, dass das Bildfeld auf den Speicherort Ihres IPFS-Bildes verweist – andernfalls enthält Ihr NFT ein Foto von einem (sehr süßen!) Hund. +Sie können die Daten im JSON gerne ändern. Sie können den Abschnitt „attributes“ (Attribute) erweitern oder Einträge daraus entfernen. Am wichtigsten ist, dass das Feld „image“ (Bild) auf den Speicherort Ihres IPFS-Bildes verweist – andernfalls wird Ihr NFT ein Foto eines (sehr süßen!) Hundes enthalten. -Wenn Sie mit der Bearbeitung der JSON-Datei fertig sind, speichern Sie sie und laden Sie sie auf Pinata hoch. Befolgen Sie dabei die gleichen Schritte wie beim Hochladen des Bildes. +Sobald Sie mit der Bearbeitung der JSON-Datei fertig sind, speichern Sie sie und laden Sie sie auf Pinata hoch, indem Sie dieselben Schritte wie beim Hochladen des Bildes befolgen. -![So laden Sie Ihre nft-metadata.json auf Pinata hoch](./uploadPinata.gif) +![Wie man seine nft-metadata.json auf Pinata hochlädt](./uploadPinata.gif) -## Schritt 5: Eine Instanz Ihres Vertrags erstellen {#instance-contract} +## Schritt 5: Erstellen Sie eine Instanz Ihres Vertrags {#instance-contract} -Um mit unserem Vertrag zu interagieren, müssen wir nun eine Instanz davon in unserem Code erstellen. Dazu benötigen wir unsere Vertragsadresse, die wir bei der Bereitstellung oder von [Blockscout](https://eth-sepolia.blockscout.com/) erhalten können, indem wir die Adresse nachschlagen, die Sie zur Bereitstellung des Vertrags verwendet haben. +Um nun mit unserem Vertrag zu interagieren, müssen wir eine Instanz davon in unserem Code erstellen. Dazu benötigen wir unsere Vertragsadresse, die wir aus der Bereitstellung oder von [Blockscout](https://eth-sepolia.blockscout.com/) erhalten können, indem wir nach der Adresse suchen, die Sie zur Bereitstellung des Vertrags verwendet haben. -![Ihre Vertragsadresse auf Etherscan anzeigen](./view-contract-etherscan.png) +![Ihre Vertragsadresse auf Etherscan ansehen](./view-contract-etherscan.png) Im obigen Beispiel lautet unsere Vertragsadresse 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778. -Als Nächstes verwenden wir die Web3-[Vertragsmethode](https://docs.web3js.org/api/web3-eth-contract/class/Contract), um unseren Vertrag mithilfe der ABI und der Adresse zu erstellen. Fügen Sie in Ihrer `mint-nft.js`-Datei Folgendes hinzu: +Als Nächstes verwenden wir die Web3-[contract-Methode](https://docs.web3js.org/api/web3-eth-contract/class/Contract), um unseren Vertrag mithilfe der ABI und der Adresse zu erstellen. Fügen Sie in Ihrer Datei `mint-nft.js` Folgendes hinzu: ```js const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" @@ -124,11 +124,11 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) ``` -## Schritt 6: Die `.env`-Datei aktualisieren {#update-env} +## Schritt 6: Aktualisieren Sie die Datei `.env` {#update-env} -Um Transaktionen zu erstellen und an die Ethereum-Kette zu senden, verwenden wir nun Ihre öffentliche Ethereum-Kontoadresse, um die Konto-Nonce zu erhalten (Erklärung folgt unten). +Um nun Transaktionen zu erstellen und an die Ethereum-Chain zu senden, verwenden wir Ihre öffentliche Ethereum-Kontoadresse, um die Konto-Nonce zu erhalten (wird unten erklärt). -Fügen Sie Ihren öffentlichen Schlüssel zu Ihrer `.env`-Datei hinzu – wenn Sie Teil 1 des Tutorials abgeschlossen haben, sollte unsere `.env`-Datei jetzt so aussehen: +Fügen Sie Ihren Public-Key zu Ihrer Datei `.env` hinzu – wenn Sie Teil 1 des Tutorials abgeschlossen haben, sollte unsere Datei `.env` nun so aussehen: ```js API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key" @@ -136,27 +136,27 @@ PRIVATE_KEY = "your-private-account-address" PUBLIC_KEY = "your-public-account-address" ``` -## Schritt 7: Ihre Transaktion erstellen {#create-txn} +## Schritt 7: Erstellen Sie Ihre Transaktion {#create-txn} -Definieren wir zunächst eine Funktion namens `mintNFT(tokenData)` und erstellen wir unsere Transaktion, indem wir Folgendes tun: +Lassen Sie uns zunächst eine Funktion namens `mintNFT(tokenData)` definieren und unsere Transaktion erstellen, indem wir Folgendes tun: -1. Holen Sie sich Ihren _PRIVATE_KEY_ und _PUBLIC_KEY_ aus der `.env`-Datei. +1. Holen Sie sich Ihren _PRIVATE_KEY_ und _PUBLIC_KEY_ aus der Datei `.env`. -2. Als Nächstes müssen wir die Konto-Nonce ermitteln. Die Nonce-Spezifikation wird verwendet, um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu verfolgen – was wir aus Sicherheitsgründen und zur Verhinderung von [Replay-Angriffen](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) benötigen. Um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu erhalten, verwenden wir [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +1. Als Nächstes müssen wir die Konto-Nonce herausfinden. Die Nonce-Spezifikation wird verwendet, um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu verfolgen – was wir aus Sicherheitsgründen und zur Verhinderung von [Replay-Angriffen](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) benötigen. Um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu erhalten, verwenden wir [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). -3. Schließlich richten wir unsere Transaktion mit den folgenden Informationen ein: +1. Schließlich richten wir unsere Transaktion mit den folgenden Informationen ein: - `'from': PUBLIC_KEY` — Der Ursprung unserer Transaktion ist unsere öffentliche Adresse -- `'to': contractAddress` — Der Vertrag, mit dem wir interagieren und an den wir die Transaktion senden wollen +- `'to': contractAddress` — Der Vertrag, mit dem wir interagieren und an den wir die Transaktion senden möchten - `'nonce': nonce` — Die Konto-Nonce mit der Anzahl der von unserer Adresse gesendeten Transaktionen -- `'gas': estimatedGas` — Das geschätzte Gas, das für den Abschluss der Transaktion benötigt wird +- `'gas': estimatedGas` — Das geschätzte Gas, das zum Abschluss der Transaktion benötigt wird -- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — Die Berechnung, die wir in dieser Transaktion durchführen wollen — in diesem Fall das Prägen eines NFT +- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — Die Berechnung, die wir in dieser Transaktion durchführen möchten – was in diesem Fall das Prägen eines NFTs ist -Ihre `mint-nft.js`-Datei sollte jetzt so aussehen: +Ihre Datei `mint-nft.js` sollte nun so aussehen: ```js require('dotenv').config(); @@ -172,9 +172,9 @@ Ihre `mint-nft.js`-Datei sollte jetzt so aussehen: const nftContract = new web3.eth.Contract(contract.abi, contractAddress); async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //letzte Nonce holen + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); // neueste Nonce abrufen - //die Transaktion + // die Transaktion const tx = { 'from': PUBLIC_KEY, 'to': contractAddress, @@ -185,11 +185,11 @@ Ihre `mint-nft.js`-Datei sollte jetzt so aussehen: }​ ``` -## Schritt 8: Die Transaktion signieren {#sign-txn} +## Schritt 8: Signieren Sie die Transaktion {#sign-txn} -Nachdem wir unsere Transaktion erstellt haben, müssen wir sie signieren, um sie zu versenden. Hier werden wir unseren privaten Schlüssel verwenden. +Nachdem wir nun unsere Transaktion erstellt haben, müssen wir sie signieren, um sie abzusenden. Hier verwenden wir unseren Private-Key. -`web3.eth.sendSignedTransaction` gibt uns den Transaktions-Hash, mit dem wir sicherstellen können, dass unsere Transaktion gemined und nicht vom Netzwerk verworfen wurde. Sie werden feststellen, dass wir im Abschnitt zur Signierung der Transaktion eine Fehlerprüfung hinzugefügt haben, damit wir wissen, ob unsere Transaktion erfolgreich war. +`web3.eth.sendSignedTransaction` gibt uns den Transaktions-Hash, mit dem wir sicherstellen können, dass unsere Transaktion gemint und nicht vom Netzwerk verworfen wurde. Sie werden feststellen, dass wir im Abschnitt zur Transaktionssignierung eine Fehlerüberprüfung hinzugefügt haben, damit wir wissen, ob unsere Transaktion erfolgreich durchgeführt wurde. ```js require("dotenv").config() @@ -205,9 +205,9 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //letzte Nonce holen + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") // neueste Nonce abrufen - //die Transaktion + // die Transaktion const tx = { from: PUBLIC_KEY, to: contractAddress, @@ -224,13 +224,13 @@ async function mintNFT(tokenURI) { function (err, hash) { if (!err) { console.log( - "Der Hash Ihrer Transaktion ist: ", + "The hash of your transaction is: ", hash, - "\nÜberprüfen Sie den Mempool von Alchemy, um den Status Ihrer Transaktion anzuzeigen!" + "\nCheck Alchemy's Mempool to view the status of your transaction!" ) } else { console.log( - "Beim Senden Ihrer Transaktion ist ein Fehler aufgetreten:", + "Something went wrong when submitting your transaction:", err ) } @@ -238,24 +238,24 @@ async function mintNFT(tokenURI) { ) }) .catch((err) => { - console.log(" Promise fehlgeschlagen:", err) + console.log(" Promise failed:", err) }) } ``` -## Schritt 9: `mintNFT` aufrufen und `node mint-nft.js` ausführen {#call-mintnft-fn} +## Schritt 9: Rufen Sie `mintNFT` auf und führen Sie node `mint-nft.js` aus {#call-mintnft-fn} -Erinnern Sie sich an die `metadata.json`, die Sie auf Pinata hochgeladen haben? Holen Sie sich den Hashcode von Pinata und übergeben Sie Folgendes als Parameter an die Funktion `mintNFT`: `https://gateway.pinata.cloud/ipfs/` +Erinnern Sie sich an die `metadata.json`, die Sie auf Pinata hochgeladen haben? Holen Sie sich deren Hashcode von Pinata und übergeben Sie Folgendes als Parameter an die Funktion `mintNFT`: `https://gateway.pinata.cloud/ipfs/` So erhalten Sie den Hashcode: -![So erhalten Sie den Hashcode Ihrer NFT-Metadaten auf Pinata](./metadataPinata.gif)_So erhalten Sie den Hashcode Ihrer NFT-Metadaten auf Pinata_ +![Wie man seinen NFT-Metadaten-Hashcode auf Pinata erhält](./metadataPinata.gif)_Wie man seinen NFT-Metadaten-Hashcode auf Pinata erhält_ -> Überprüfen Sie, ob der von Ihnen kopierte Hashcode auf Ihre **metadata.json** verweist, indem Sie `https://gateway.pinata.cloud/ipfs/` in einem separaten Fenster laden. Die Seite sollte ähnlich wie im folgenden Screenshot aussehen: +> Überprüfen Sie noch einmal, ob der kopierte Hashcode auf Ihre **metadata.json** verweist, indem Sie `https://gateway.pinata.cloud/ipfs/` in einem separaten Fenster laden. Die Seite sollte ähnlich aussehen wie auf dem Screenshot unten: ![Ihre Seite sollte die JSON-Metadaten anzeigen](./metadataJSON.png)_Ihre Seite sollte die JSON-Metadaten anzeigen_ -Insgesamt sollte Ihr Code etwa so aussehen: +Insgesamt sollte Ihr Code in etwa so aussehen: ```js require("dotenv").config() @@ -271,9 +271,9 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //letzte Nonce holen + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") // neueste Nonce abrufen - //die Transaktion + // die Transaktion const tx = { from: PUBLIC_KEY, to: contractAddress, @@ -290,13 +290,13 @@ async function mintNFT(tokenURI) { function (err, hash) { if (!err) { console.log( - "Der Hash Ihrer Transaktion ist: ", + "The hash of your transaction is: ", hash, - "\nÜberprüfen Sie den Mempool von Alchemy, um den Status Ihrer Transaktion anzuzeigen!" + "\nCheck Alchemy's Mempool to view the status of your transaction!" ) } else { console.log( - "Beim Senden Ihrer Transaktion ist ein Fehler aufgetreten:", + "Something went wrong when submitting your transaction:", err ) } @@ -304,27 +304,25 @@ async function mintNFT(tokenURI) { ) }) .catch((err) => { - console.log("Promise fehlgeschlagen:", err) + console.log("Promise failed:", err) }) } mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP") ``` -Führen Sie nun `node scripts/mint-nft.js` aus, um Ihren NFT zu prägen. Nach einigen Sekunden sollten Sie eine Antwort wie diese in Ihrem Terminal sehen: +Führen Sie nun `node scripts/mint-nft.js` aus, um Ihren NFT bereitzustellen. Nach ein paar Sekunden sollten Sie eine Antwort wie diese in Ihrem Terminal sehen: - ``` - Der Hash Ihrer Transaktion lautet: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 - - Überprüfen Sie den Mempool von Alchemy, um den Status Ihrer Transaktion anzuzeigen! - ``` + The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 -Besuchen Sie als Nächstes Ihren [Alchemy-Mempool](https://dashboard.alchemyapi.io/mempool), um den Status Ihrer Transaktion zu sehen (ob sie ausstehend ist, gemined wurde oder vom Netzwerk verworfen wurde). Wenn Ihre Transaktion verworfen wurde, ist es auch hilfreich, [Blockscout](https://eth-sepolia.blockscout.com/) zu überprüfen und nach Ihrem Transaktions-Hash zu suchen. + Check Alchemy's Mempool to view the status of your transaction! -![Ihren NFT-Transaktions-Hash auf Etherscan anzeigen](./view-nft-etherscan.png)_Ihren NFT-Transaktions-Hash auf Etherscan anzeigen_ +Besuchen Sie als Nächstes Ihren [Alchemy-Mempool](https://dashboard.alchemyapi.io/mempool), um den Status Ihrer Transaktion zu sehen (ob sie ausstehend ist, gemint wurde oder vom Netzwerk verworfen wurde). Wenn Ihre Transaktion verworfen wurde, ist es auch hilfreich, [Blockscout](https://eth-sepolia.blockscout.com/) zu überprüfen und nach Ihrem Transaktions-Hash zu suchen. + +![Ihren NFT-Transaktions-Hash auf Etherscan ansehen](./view-nft-etherscan.png)_Ihren NFT-Transaktions-Hash auf Etherscan ansehen_ Und das war's! Sie haben nun einen NFT auf der Ethereum-Blockchain bereitgestellt UND geprägt -Mit `mint-nft.js` können Sie so viele NFTs prägen, wie Ihr Herz (und Ihr Wallet) begehrt! Stellen Sie nur sicher, dass Sie eine neue tokenURI übergeben, die die Metadaten des NFT beschreibt (andernfalls erstellen Sie nur einen Haufen identischer NFTs mit unterschiedlichen IDs). +Mit der `mint-nft.js` können Sie so viele NFTs prägen, wie Ihr Herz (und Ihre Wallet) begehrt! Stellen Sie nur sicher, dass Sie eine neue tokenURI übergeben, die die Metadaten des NFTs beschreibt (andernfalls erstellen Sie nur einen Haufen identischer NFTs mit unterschiedlichen IDs). -Vermutlich möchten Sie Ihren NFT in Ihrem Wallet präsentieren können – schauen Sie sich also unbedingt [Teil 3: Wie Sie Ihren NFT in Ihrem Wallet anzeigen](/developers/tutorials/how-to-view-nft-in-metamask/) an! +Vermutlich möchten Sie Ihren NFT in Ihrer Wallet präsentieren können – schauen Sie sich also unbedingt [Teil 3: Wie Sie Ihren NFT in Ihrer Wallet ansehen](/developers/tutorials/how-to-view-nft-in-metamask/) an! \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md index 0b5b0ab484a..ff5e0f25a4c 100644 --- a/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -1,27 +1,27 @@ --- -title: "So simulieren Sie Solidity Smart Contracts für Testzwecke" -description: "Warum Sie sich beim Testen über Ihre Verträge lustig machen sollten" +title: "Wie man Solidity-Smart-Contracts für Tests mockt" +description: "Warum Sie sich beim Testen über Ihre Contracts lustig machen sollten" author: Markus Waas lang: de -tags: ["solidity", "smart contracts", "testing", "mocking"] +tags: ["Solidity", "Smart Contracts", "Testen", "Mocking"] skill: intermediate -breadcrumb: "Vertrags-Mocking" +breadcrumb: Contracts mocken published: 2020-05-02 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/mocking-contracts --- -[Mockobjekte](https://wikipedia.org/wiki/Mock_object) sind ein übliches Entwurfsmuster in der objektorientierten Programmierung. Das Wort stammt von dem französischen Wort "mocquer" ab, das so viel bedeutet wie "sich über etwas lustig machen". Es bedeutet aber auch "etwas nachbilden" was genau das ist, was in der Programmierung gemacht wird. Machen Sie sich bitte nur über Ihre Smart Contracts lustig, wenn Sie wollen, aber simulieren Sie sie, wann immer Sie können. Das macht Ihr Leben einfacher. +[Mock-Objekte](https://wikipedia.org/wiki/Mock_object) sind ein gängiges Entwurfsmuster in der objektorientierten Programmierung. Abgeleitet vom altfranzösischen Wort „mocquer“ mit der Bedeutung „sich über etwas lustig machen“, entwickelte es sich zu „etwas Reales imitieren“, was genau das ist, was wir in der Programmierung tun. Bitte machen Sie sich nur über Ihre Smart Contracts lustig, wenn Sie das möchten, aber mocken Sie sie, wann immer Sie können. Es macht Ihr Leben einfacher. -## Unittests von Verträgen mit Mocks {#unit-testing-contracts-with-mocks} +## Unit-Tests von Contracts mit Mocks {#unit-testing-contracts-with-mocks} -Das Mocking eines Vertrags bedeutet im Wesentlichen, eine zweite Version dieses Vertrags zu erstellen, die sich sehr ähnlich wie das Original verhält, jedoch auf eine Weise, die vom Entwickler leicht kontrolliert werden kann. Oft hat man es mit komplexen Verträgen zu tun, bei denen man nur [kleine Teile des Vertrags per Unittest testen](/developers/docs/smart-contracts/testing/) möchte. Das Problem dabei ist: Was ist, wenn das Testen dieses kleinen Teils einen ganz bestimmten Vertragszustand erfordert, der nur schwer zu erreichen ist? +Einen Contract zu mocken bedeutet im Wesentlichen, eine zweite Version dieses Contracts zu erstellen, die sich sehr ähnlich wie das Original verhält, aber auf eine Weise, die vom Entwickler leicht kontrolliert werden kann. Oft hat man es mit komplexen Contracts zu tun, bei denen man nur [kleine Teile des Contracts mit Unit-Tests prüfen](/developers/docs/smart-contracts/testing/) möchte. Das Problem ist: Was ist, wenn das Testen dieses kleinen Teils einen sehr spezifischen Contract-Zustand erfordert, der schwer zu erreichen ist? -Sie könnten jedes Mal eine komplexe Test-Setup-Logik schreiben, die den Vertrag in den erforderlichen Zustand bringt, oder Sie schreiben einen Mock. Das Mocking eines Vertrags ist mit Vererbung einfach. Erstellen Sie einfach einen zweiten Mock-Vertrag, der vom ursprünglichen erbt. Jetzt können Sie Funktionen in Ihrem Mock überschreiben. Sehen wir uns ein Beispiel an. +Sie könnten jedes Mal eine komplexe Test-Setup-Logik schreiben, die den Contract in den erforderlichen Zustand versetzt, oder Sie schreiben einen Mock. Das Mocken eines Contracts ist durch Vererbung einfach. Erstellen Sie einfach einen zweiten Mock-Contract, der vom ursprünglichen erbt. Nun können Sie Funktionen für Ihren Mock überschreiben. Sehen wir uns das an einem Beispiel an. -## Beispiel: Privates ERC20 {#example-private-erc20} +## Beispiel: Privater ERC-20 {#example-private-erc20} -Wir verwenden einen beispielhaften ERC-20-Vertrag, der anfänglich eine private Phase hat. Der Eigentümer kann private Benutzer verwalten und nur diesen ist es zu Beginn gestattet, Tokens zu erhalten. Sobald eine bestimmte Zeit vergangen ist, darf jeder die Tokens verwenden. Falls Sie neugierig sind: Wir verwenden den [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks)-Hook aus den neuen OpenZeppelin Contracts v3. +Wir verwenden einen beispielhaften ERC-20-Contract, der eine anfängliche private Zeitspanne hat. Der Eigentümer kann private Benutzer verwalten und nur diese dürfen zu Beginn Token erhalten. Sobald eine bestimmte Zeit verstrichen ist, darf jeder die Token verwenden. Falls Sie neugierig sind: Wir verwenden den Hook [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks) aus den neuen OpenZeppelin-Contracts v3. ```solidity pragma solidity ^0.6.0; @@ -48,7 +48,7 @@ contract PrivateERC20 is ERC20, Ownable { function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); - require(_validRecipient(to), "PrivateERC20: ungültiger Empfänger"); + require(_validRecipient(to), "PrivateERC20: invalid recipient"); } function _validRecipient(address to) private view returns (bool) { @@ -61,7 +61,7 @@ contract PrivateERC20 is ERC20, Ownable { } ``` -Und nun werden wir ihn mocken. +Und nun lassen Sie uns diesen mocken. ```solidity pragma solidity ^0.6.0; @@ -87,17 +87,17 @@ Sie erhalten eine der folgenden Fehlermeldungen: - `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.` - `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.` -Da wir die neue Solidity-Version 0.6 verwenden, müssen wir das Schlüsselwort `virtual` für Funktionen, die überschrieben werden können, und `override` für die überschreibende Funktion hinzufügen. Fügen wir diese also beiden `isPublic`-Funktionen hinzu. +Da wir die neue Solidity-Version 0.6 verwenden, müssen wir das Schlüsselwort `virtual` für Funktionen hinzufügen, die überschrieben werden können, und `override` für die überschreibende Funktion. Fügen wir diese also zu beiden `isPublic`-Funktionen hinzu. -In Ihren Unittests können Sie jetzt stattdessen `PrivateERC20Mock` verwenden. Wenn Sie das Verhalten während der privaten Nutzungszeit testen möchten, verwenden Sie `setIsPublic(false)` und entsprechend `setIsPublic(true)` zum Testen der öffentlichen Nutzungszeit. Natürlich könnten wir in unserem Beispiel auch einfach [Zeithelfer](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) verwenden, um die Zeiten entsprechend zu ändern. Aber die Idee des Mockings sollte jetzt klar sein und Sie können sich Szenarien vorstellen, in denen es nicht so einfach ist, wie nur die Zeit vorzustellen. +In Ihren Unit-Tests können Sie nun stattdessen `PrivateERC20Mock` verwenden. Wenn Sie das Verhalten während der privaten Nutzungszeit testen möchten, verwenden Sie `setIsPublic(false)` und analog `setIsPublic(true)` zum Testen der öffentlichen Nutzungszeit. Natürlich könnten wir in unserem Beispiel auch einfach [Zeit-Hilfsfunktionen (Time Helpers)](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) verwenden, um die Zeiten entsprechend zu ändern. Aber die Idee des Mockings sollte nun klar sein und Sie können sich Szenarien vorstellen, in denen es nicht so einfach ist, wie nur die Zeit vorzudrehen. -## Mocking vieler Verträge {#mocking-many-contracts} +## Viele Contracts mocken {#mocking-many-contracts} -Es kann unübersichtlich werden, wenn Sie für jeden einzelnen Mock einen weiteren Vertrag erstellen müssen. Wenn Sie das stört, können Sie sich die [MockContract](https://github.com/gnosis/mock-contract)-Bibliothek ansehen. Sie ermöglicht es Ihnen, das Verhalten von Verträgen zur Laufzeit zu überschreiben und zu ändern. Sie funktioniert jedoch nur für das Mocking von Aufrufen an einen anderen Vertrag, weshalb sie für unser Beispiel nicht funktionieren würde. +Es kann unübersichtlich werden, wenn Sie für jeden einzelnen Mock einen weiteren Contract erstellen müssen. Wenn Sie das stört, können Sie sich die Bibliothek [MockContract](https://github.com/gnosis/mock-contract) ansehen. Sie ermöglicht es Ihnen, das Verhalten von Contracts im laufenden Betrieb (on-the-fly) zu überschreiben und zu ändern. Sie funktioniert jedoch nur für das Mocken von Aufrufen an einen anderen Contract, würde also für unser Beispiel nicht funktionieren. -## Mocking kann noch leistungsfähiger sein {#mocking-can-be-even-more-powerful} +## Mocking kann noch mächtiger sein {#mocking-can-be-even-more-powerful} Die Möglichkeiten des Mockings enden hier nicht. -- Hinzufügen von Funktionen: Nicht nur das Überschreiben einer bestimmten Funktion ist nützlich, sondern auch das einfache Hinzufügen zusätzlicher Funktionen. Ein gutes Beispiel für Tokens ist es, einfach eine zusätzliche `mint`-Funktion zu haben, die es jedem Benutzer erlaubt, kostenlos neue Tokens zu erhalten. -- Verwendung in Testnets: Wenn Sie Ihre Verträge zusammen mit Ihrer Dapp auf Testnets bereitstellen und testen, sollten Sie die Verwendung einer gemockten Version in Betracht ziehen. Vermeiden Sie das Überschreiben von Funktionen, es sei denn, es ist absolut notwendig. Schließlich wollen Sie ja die eigentliche Logik testen. Aber das Hinzufügen zum Beispiel einer Reset-Funktion, die den Vertragszustand einfach auf den Anfang zurücksetzt, kann nützlich sein, ohne dass eine neue Bereitstellung erforderlich ist. Offensichtlich würden Sie das nicht in einem Mainnet-Vertrag haben wollen. +- Funktionen hinzufügen: Nicht nur das Überschreiben einer bestimmten Funktion ist nützlich, sondern auch das einfache Hinzufügen zusätzlicher Funktionen. Ein gutes Beispiel für Token ist eine zusätzliche `mint`-Funktion, die es jedem Benutzer ermöglicht, kostenlos neue Token zu erhalten. +- Verwendung in Testnets: Wenn Sie Ihre Contracts zusammen mit Ihrer Dapp in Testnets bereitstellen und testen, sollten Sie die Verwendung einer gemockten Version in Betracht ziehen. Vermeiden Sie es, Funktionen zu überschreiben, es sei denn, Sie müssen es wirklich tun. Schließlich wollen Sie die echte Logik testen. Aber das Hinzufügen einer Reset-Funktion kann beispielsweise nützlich sein, um den Contract-Zustand einfach auf den Anfang zurückzusetzen, ohne dass eine neue Bereitstellung erforderlich ist. Offensichtlich würden Sie so etwas nicht in einem Mainnet-Contract haben wollen. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md index 098a611d06c..b44aef0e65e 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -1,11 +1,11 @@ --- -title: So verwenden Sie Echidna zum Testen von Smart Contracts -description: So verwenden Sie Echidna zum automatischen Testen von Smart Contracts +title: Wie man Echidna verwendet, um Smart Contracts zu testen +description: Wie man Echidna verwendet, um Smart Contracts automatisch zu testen author: "Trailofbits" lang: de -tags: ["solidity", "smart contracts", "security", "testing", "fuzzing"] +tags: ["Solidity", "Smart Contracts", "Sicherheit", "Testen", "Fuzzing"] skill: advanced -breadcrumb: "Echidna" +breadcrumb: Echidna published: 2020-04-10 source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna @@ -13,51 +13,49 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/progr ## Installation {#installation} -Echidna kann über Docker oder durch Verwendung des vorkompilierten Binärprogramms installiert werden. +Echidna kann über Docker oder mithilfe der vorkompilierten Binärdatei installiert werden. ### Echidna über Docker {#echidna-through-docker} ```bash -docker pull trailofbits/eth-security-toolbox -docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +docker run -it --rm -v $PWD:/src trailofbits/eth-security-toolbox ``` -_Der letzte Befehl führt die eth-security-toolbox in einem Docker aus, der Zugriff auf dein aktuelles Verzeichnis hat. Du kannst die Dateien von deinem Host aus ändern und die Tools für die Dateien aus dem Docker ausführen_ +_Der letzte Befehl führt die eth-security-toolbox in einem Docker-Container aus, der Zugriff auf Ihr aktuelles Verzeichnis hat. Sie können die Dateien von Ihrem Host aus ändern und die Tools für die Dateien aus dem Docker-Container heraus ausführen._ -Führen Sie in Docker Folgendes aus: +Führen Sie im Docker-Container Folgendes aus: ```bash -solc-select 0.5.11 -cd /home/training +echidna-test /src/contract.sol ``` -### Binär {#binary} +### Binärdatei {#binary} [https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0) -## Einführung in das eigenschaftsbasierte Fuzzing {#introduction-to-property-based-fuzzing} +## Einführung in eigenschaftsbasiertes Fuzzing {#introduction-to-property-based-fuzzing} Echidna ist ein eigenschaftsbasierter Fuzzer, den wir in unseren vorherigen Blogbeiträgen beschrieben haben ([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/), [2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/), [3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/)). ### Fuzzing {#fuzzing} -[Fuzzing](https://wikipedia.org/wiki/Fuzzing) ist eine bekannte Technik in der Sicherheits-Community. Sie besteht darin, mehr oder weniger zufällige Eingaben zu generieren, um Fehler im Programm zu finden. Fuzzer für traditionelle Software (wie [AFL](http://lcamtuf.coredump.cx/afl/) oder [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) sind als effiziente Werkzeuge zur Fehlersuche bekannt. +[Fuzzing](https://wikipedia.org/wiki/Fuzzing) ist eine bekannte Technik in der Sicherheits-Community. Sie besteht darin, mehr oder weniger zufällige Eingaben zu generieren, um Fehler im Programm zu finden. Fuzzer für herkömmliche Software (wie [AFL](http://lcamtuf.coredump.cx/afl/) oder [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) sind als effiziente Tools zur Fehlersuche bekannt. Über die rein zufällige Generierung von Eingaben hinaus gibt es viele Techniken und Strategien, um gute Eingaben zu generieren, darunter: -- Feedback aus jeder Ausführung einholen und die Generierung damit steuern. Wenn zum Beispiel eine neu generierte Eingabe zur Entdeckung eines neuen Pfades führt, kann es sinnvoll sein, neue Eingaben in dessen Nähe zu generieren. -- Generierung der Eingabe unter Einhaltung einer strukturellen Beschränkung. Wenn Ihre Eingabe zum Beispiel einen Header mit einer Prüfsumme enthält, ist es sinnvoll, den Fuzzer Eingaben generieren zu lassen, die die Prüfsumme validieren. -- Verwendung bekannter Eingaben zur Generierung neuer Eingaben: Wenn Sie Zugriff auf einen großen Datensatz gültiger Eingaben haben, kann Ihr Fuzzer daraus neue Eingaben generieren, anstatt die Generierung von Grund auf neu zu starten. Diese werden in der Regel _Seeds_ genannt. +- Feedback aus jeder Ausführung einholen und die Generierung damit steuern. Wenn beispielsweise eine neu generierte Eingabe zur Entdeckung eines neuen Pfads führt, kann es sinnvoll sein, neue Eingaben in dessen Nähe zu generieren. +- Generierung der Eingabe unter Einhaltung einer strukturellen Einschränkung. Wenn Ihre Eingabe beispielsweise einen Header mit einer Prüfsumme enthält, ist es sinnvoll, den Fuzzer Eingaben generieren zu lassen, die die Prüfsumme validieren. +- Verwendung bekannter Eingaben zur Generierung neuer Eingaben: Wenn Sie Zugriff auf einen großen Datensatz gültiger Eingaben haben, kann Ihr Fuzzer daraus neue Eingaben generieren, anstatt bei der Generierung ganz von vorn zu beginnen. Diese werden normalerweise als _Seeds_ bezeichnet. ### Eigenschaftsbasiertes Fuzzing {#property-based-fuzzing} -Echidna gehört zu einer bestimmten Familie von Fuzzern: dem eigenschaftsbasierten Fuzzing, das stark von [QuickCheck](https://wikipedia.org/wiki/QuickCheck) inspiriert ist. Im Gegensatz zu klassischen Fuzzern, die versuchen, Abstürze zu finden, wird Echidna versuchen, benutzerdefinierte Invarianten zu brechen. +Echidna gehört zu einer bestimmten Familie von Fuzzern: dem eigenschaftsbasierten Fuzzing, das stark von [QuickCheck](https://wikipedia.org/wiki/QuickCheck) inspiriert ist. Im Gegensatz zu klassischen Fuzzern, die versuchen, Abstürze zu finden, versucht Echidna, benutzerdefinierte Invarianten zu brechen. -In Smart Contracts sind Invarianten Solidity-Funktionen, die jeden inkorrekten oder ungültigen Zustand, den der Vertrag erreichen kann, darstellen können, einschließlich: +In Smart Contracts sind Invarianten Solidity-Funktionen, die jeden falschen oder ungültigen Zustand darstellen können, den der Vertrag erreichen kann, einschließlich: - Falsche Zugriffskontrolle: Der Angreifer wurde zum Eigentümer des Vertrags. -- Falsche Statusmaschine: Die Token können übertragen werden, während der Vertrag pausiert ist. -- Falsche Arithmetik: der Benutzer kann sein Guthaben unterlaufen lassen und unbegrenzt kostenlose Token erhalten. +- Falsche Zustandsmaschine: Die Token können übertragen werden, während der Vertrag pausiert ist. +- Falsche Arithmetik: Der Benutzer kann sein Guthaben unterschreiten (Underflow) und unbegrenzt kostenlose Token erhalten. ### Testen einer Eigenschaft mit Echidna {#testing-a-property-with-echidna} @@ -81,24 +79,24 @@ contract Token{ Wir gehen davon aus, dass dieser Token die folgenden Eigenschaften haben muss: -- Jeder kann maximal 1000 Token haben -- Der Token kann nicht übertragen werden (es ist kein ERC20-Token) +- Jeder kann maximal 1000 Token besitzen +- Der Token kann nicht übertragen werden (es ist kein ERC-20-Token) ### Eine Eigenschaft schreiben {#write-a-property} Echidna-Eigenschaften sind Solidity-Funktionen. Eine Eigenschaft muss: -- Kein Argument haben -- `true` zurückgeben, wenn es erfolgreich ist -- Der Name muss mit `echidna` beginnen +- Keine Argumente haben +- `true` zurückgeben, wenn sie erfolgreich ist +- Einen Namen haben, der mit `echidna` beginnt Echidna wird: - Automatisch beliebige Transaktionen generieren, um die Eigenschaft zu testen. - Alle Transaktionen melden, die dazu führen, dass eine Eigenschaft `false` zurückgibt oder einen Fehler auslöst. -- Nebeneffekte beim Aufrufen einer Eigenschaft verwerfen (d. h., wenn die Eigenschaft eine Zustandsvariable ändert, wird sie nach dem Test verworfen) +- Nebeneffekte beim Aufruf einer Eigenschaft verwerfen (d. h. wenn die Eigenschaft eine Zustandsvariable ändert, wird diese nach dem Test verworfen) -Die folgende Eigenschaft prüft, dass der Aufrufer nicht mehr als 1000 Token hat: +Die folgende Eigenschaft überprüft, ob der Aufrufer nicht mehr als 1000 Token hat: ```solidity function echidna_balance_under_1000() public view returns(bool){ @@ -120,12 +118,12 @@ contract TestToken is Token{ ### Einen Vertrag initiieren {#initiate-a-contract} -Echidna benötigt einen [Konstruktor](/developers/docs/smart-contracts/anatomy/#constructor-functions) ohne Argument. Wenn Ihr Vertrag eine spezifische Initialisierung benötigt, müssen Sie dies im Konstruktor tun. +Echidna benötigt einen [Konstruktor](/developers/docs/smart-contracts/anatomy/#constructor-functions) ohne Argumente. Wenn Ihr Vertrag eine spezifische Initialisierung benötigt, müssen Sie diese im Konstruktor vornehmen. Es gibt einige spezifische Adressen in Echidna: -- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72`, die den Konstruktor aufruft. -- `0x10000`, `0x20000`, und `0x00a329C0648769a73afAC7F9381e08fb43DBEA70`, die zufällig die anderen Funktionen aufrufen. +- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72`, welche den Konstruktor aufruft. +- `0x10000`, `0x20000` und `0x00a329C0648769a73afAC7F9381e08fb43DBEA70`, welche zufällig die anderen Funktionen aufrufen. In unserem aktuellen Beispiel benötigen wir keine besondere Initialisierung, daher ist unser Konstruktor leer. @@ -145,23 +143,16 @@ echidna-test contract.sol --contract MyContract ### Zusammenfassung: Testen einer Eigenschaft {#summary-testing-a-property} -Das Folgende fasst die Ausführung von Echidna an unserem Beispiel zusammen: +Das Folgende fasst den Lauf von Echidna in unserem Beispiel zusammen: -```solidity -contract TestToken is Token{ - constructor() public {} - function echidna_balance_under_1000() public view returns(bool){ - return balances[msg.sender] <= 1000; - } - } +```bash +echidna-test token.sol ``` -```bash -echidna-test testtoken.sol --contract TestToken +```text ... - echidna_balance_under_1000: failed!💥 - Call sequence, shrinking (1205/5000): + Call sequence, shrinking (2596/5000): airdrop() backdoor() @@ -199,7 +190,7 @@ contract C { state3 = true; } - function i() public { + function i() public { require(state3); state4 = true; } @@ -225,30 +216,30 @@ contract C { ``` Dieses kleine Beispiel zwingt Echidna, eine bestimmte Sequenz von Transaktionen zu finden, um eine Zustandsvariable zu ändern. -Das ist schwierig für einen Fuzzer (es wird empfohlen, ein symbolisches Ausführungswerkzeug wie [Manticore](https://github.com/trailofbits/manticore) zu verwenden). +Dies ist für einen Fuzzer schwierig (es wird empfohlen, ein Tool zur symbolischen Ausführung wie [Manticore](https://github.com/trailofbits/manticore) zu verwenden). Wir können Echidna ausführen, um dies zu überprüfen: ```bash echidna-test multi.sol ... echidna_state4: passed! 🎉 -Seed: -3684648582249875403 +... ``` -### Filterfunktionen {#filtering-functions} +### Funktionen filtern {#filtering-functions} Echidna hat Schwierigkeiten, die richtige Sequenz zum Testen dieses Vertrags zu finden, da die beiden Reset-Funktionen (`reset1` und `reset2`) alle Zustandsvariablen auf `false` setzen. -Wir können jedoch eine spezielle Echidna-Funktion verwenden, um entweder die Reset-Funktion auf eine schwarze Liste zu setzen oder nur die Funktionen `f`, `g`, -`h` und `i` auf eine weiße Liste zu setzen. +Wir können jedoch eine spezielle Echidna-Funktion verwenden, um entweder die Reset-Funktion auf die Blacklist zu setzen oder nur die Funktionen `f`, `g`, +`h` und `i` auf die Whitelist zu setzen. -Um Funktionen auf die schwarze Liste zu setzen, können wir diese Konfigurationsdatei verwenden: +Um Funktionen auf die Blacklist zu setzen, können wir diese Konfigurationsdatei verwenden: ```yaml filterBlacklist: true filterFunctions: ["reset1", "reset2"] ``` -Ein anderer Ansatz zum Filtern von Funktionen besteht darin, die auf der weißen Liste stehenden Funktionen aufzulisten. Dazu können wir diese Konfigurationsdatei verwenden: +Ein anderer Ansatz zum Filtern von Funktionen besteht darin, die auf der Whitelist stehenden Funktionen aufzulisten. Dazu können wir diese Konfigurationsdatei verwenden: ```yaml filterBlacklist: false @@ -256,7 +247,7 @@ filterFunctions: ["f", "g", "h", "i"] ``` - `filterBlacklist` ist standardmäßig `true`. -- Die Filterung erfolgt nur nach Namen (ohne Parameter). Wenn Sie `f()` und `f(uint256)` haben, wird der Filter `"f"` auf beide Funktionen passen. +- Die Filterung erfolgt nur nach Namen (ohne Parameter). Wenn Sie `f()` und `f(uint256)` haben, stimmt der Filter `"f"` mit beiden Funktionen überein. ### Echidna ausführen {#run-echidna-1} @@ -273,27 +264,27 @@ echidna_state4: failed!💥 i() ``` -Echidna wird die Sequenz der Transaktionen, um die Eigenschaft zu widerlegen, fast sofort finden. +Echidna wird die Sequenz von Transaktionen zur Falsifizierung der Eigenschaft fast sofort finden. -### Zusammenfassung: Filterfunktionen {#summary-filtering-functions} +### Zusammenfassung: Funktionen filtern {#summary-filtering-functions} -Echidna kann während einer Fuzzing-Kampagne entweder Funktionen auf eine schwarze oder eine weiße Liste setzen, indem es Folgendes verwendet: +Echidna kann Funktionen, die während einer Fuzzing-Kampagne aufgerufen werden sollen, entweder auf die Blacklist oder die Whitelist setzen, indem Folgendes verwendet wird: ```yaml filterBlacklist: true filterFunctions: ["f1", "f2", "f3"] ``` -```bash -echidna-test contract.sol --config config.yaml -... +```yaml +filterBlacklist: false +filterFunctions: ["f1", "f2", "f3"] ``` -Echidna startet eine Fuzzing-Kampagne, bei der `f1`, `f2` und `f3` entweder auf der schwarzen Liste stehen oder nur diese aufgerufen werden, je nach dem Wert des `filterBlacklist`-Booleans. +Echidna startet eine Fuzzing-Kampagne, bei der entweder `f1`, `f2` und `f3` auf die Blacklist gesetzt werden oder nur diese aufgerufen werden, abhängig vom Wert des booleschen Werts `filterBlacklist`. -## Wie man Soliditys `assert` mit Echidna testet {#how-to-test-soliditys-assert-with-echidna} +## Wie man Soliditys assert mit Echidna testet {#how-to-test-soliditys-assert-with-echidna} -In diesem kurzen Tutorial zeigen wir, wie man Echidna zum Testen der Assertionsprüfung in Verträgen verwendet. Nehmen wir an, wir haben einen Vertrag wie diesen: +In diesem kurzen Tutorial werden wir zeigen, wie man Echidna verwendet, um die Überprüfung von Zusicherungen (Assertions) in Verträgen zu testen. Nehmen wir an, wir haben einen Vertrag wie diesen: ```solidity contract Incrementor { @@ -308,10 +299,9 @@ contract Incrementor { } ``` -### Eine Assertion schreiben {#write-an-assertion} +### Eine Zusicherung (Assertion) schreiben {#write-an-assertion} -Wir wollen sicherstellen, dass `tmp` kleiner oder gleich `counter` ist, nachdem die Differenz zurückgegeben wurde. Wir könnten eine -Echidna-Eigenschaft schreiben, aber wir müssten den `tmp`-Wert irgendwo speichern. Stattdessen könnten wir eine Assertion wie diese verwenden: +Wir möchten sicherstellen, dass `tmp` kleiner oder gleich `counter` ist, nachdem die Differenz zurückgegeben wurde. Wir könnten eine Echidna-Eigenschaft schreiben, aber wir müssten den Wert von `tmp` irgendwo speichern. Stattdessen könnten wir eine Zusicherung wie diese verwenden: ```solidity contract Incrementor { @@ -328,7 +318,7 @@ contract Incrementor { ### Echidna ausführen {#run-echidna-2} -Um das Testen von Assertionsfehlern zu aktivieren, erstellen Sie eine [Echidna-Konfigurationsdatei](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: +Um das Testen von fehlgeschlagenen Zusicherungen zu aktivieren, erstellen Sie eine [Echidna-Konfigurationsdatei](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: ```yaml checkAsserts: true @@ -336,23 +326,21 @@ checkAsserts: true Wenn wir diesen Vertrag in Echidna ausführen, erhalten wir die erwarteten Ergebnisse: -```bash +```text echidna-test assert.sol --config config.yaml -Analyzing contract: assert.sol:Incrementor +Analyzing contract: /tmp/assert.sol:Incrementor assertion in inc: failed!💥 Call sequence, shrinking (2596/5000): - inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) + inc(2161168256842006112444943630224269744548897151224254110005047115547016653207) inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) - -Seed: 1806480648350826486 ``` -Wie Sie sehen können, meldet Echidna einen Assertionsfehler in der `inc`-Funktion. Das Hinzufügen von mehr als einer Assertion pro Funktion ist möglich, aber Echidna kann nicht sagen, welche Assertion fehlgeschlagen ist. +Wie Sie sehen können, meldet Echidna einige fehlgeschlagene Zusicherungen in der Funktion `inc`. Es ist möglich, mehr als eine Zusicherung pro Funktion hinzuzufügen, aber Echidna kann nicht sagen, welche Zusicherung fehlgeschlagen ist. -### Wann und wie man Assertions verwendet {#when-and-how-use-assertions} +### Wann und wie man Zusicherungen verwendet {#when-and-how-use-assertions} -Assertions können als Alternative zu expliziten Eigenschaften verwendet werden, insbesondere wenn die zu prüfenden Bedingungen direkt mit der korrekten Verwendung einer Operation `f` zusammenhängen. Das Hinzufügen von Assertions nach einem Code erzwingt, dass die Prüfung unmittelbar nach dessen Ausführung stattfindet: +Zusicherungen können als Alternativen zu expliziten Eigenschaften verwendet werden, insbesondere wenn die zu überprüfenden Bedingungen direkt mit der korrekten Verwendung einer Operation `f` zusammenhängen. Das Hinzufügen von Zusicherungen nach einem Code erzwingt, dass die Überprüfung unmittelbar nach dessen Ausführung stattfindet: ```solidity function f(..) public { @@ -361,10 +349,9 @@ function f(..) public { assert (condition); ... } - ``` -Im Gegenteil, die Verwendung einer expliziten Echidna-Eigenschaft führt zu einer zufälligen Ausführung von Transaktionen, und es gibt keine einfache Möglichkeit, genau zu erzwingen, wann sie überprüft wird. Es ist immer noch möglich, diesen Workaround zu verwenden: +Im Gegensatz dazu führt die Verwendung einer expliziten Echidna-Eigenschaft Transaktionen zufällig aus, und es gibt keine einfache Möglichkeit, genau zu erzwingen, wann sie überprüft wird. Es ist jedoch möglich, diesen Workaround anzuwenden: ```solidity function echidna_assert_after_f() public returns (bool) { @@ -377,18 +364,18 @@ Es gibt jedoch einige Probleme: - Es schlägt fehl, wenn `f` als `internal` oder `external` deklariert ist. - Es ist unklar, welche Argumente zum Aufrufen von `f` verwendet werden sollen. -- Wenn `f` fehlschlägt, wird die Eigenschaft ebenfalls fehlschlagen. +- Wenn `f` rückgängig gemacht wird (reverts), schlägt die Eigenschaft fehl. -Im Allgemeinen empfehlen wir, [John Regehrs Empfehlung](https://blog.regehr.org/archives/1091) zur Verwendung von Assertions zu folgen: +Im Allgemeinen empfehlen wir, [John Regehrs Empfehlung](https://blog.regehr.org/archives/1091) zur Verwendung von Zusicherungen zu folgen: -- Erzwingen Sie keine Nebeneffekte während der Assertionsprüfung. Zum Beispiel: `assert(ChangeStateAndReturn() == 1)` -- Behaupten Sie keine offensichtlichen Aussagen. Zum Beispiel `assert(var >= 0)`, wobei `var` als `uint` deklariert ist. +- Erzwingen Sie keine Nebeneffekte während der Überprüfung der Zusicherung. Zum Beispiel: `assert(ChangeStateAndReturn() == 1)` +- Sichern Sie keine offensichtlichen Aussagen zu. Zum Beispiel `assert(var >= 0)`, wobei `var` als `uint` deklariert ist. -Schließlich, bitte **verwenden Sie nicht** `require` anstelle von `assert`, da Echidna es nicht erkennen kann (aber der Vertrag wird trotzdem fehlschlagen). +Schließlich verwenden Sie bitte **nicht** `require` anstelle von `assert`, da Echidna dies nicht erkennen kann (der Vertrag wird jedoch trotzdem rückgängig gemacht). -### Zusammenfassung: Assertionsprüfung {#summary-assertion-checking} +### Zusammenfassung: Überprüfung von Zusicherungen {#summary-assertion-checking} -Das Folgende fasst die Ausführung von Echidna an unserem Beispiel zusammen: +Das Folgende fasst den Lauf von Echidna in unserem Beispiel zusammen: ```solidity contract Incrementor { @@ -405,21 +392,13 @@ contract Incrementor { ```bash echidna-test assert.sol --config config.yaml -Analyzing contract: assert.sol:Incrementor -assertion in inc: failed!💥 - Call sequence, shrinking (2596/5000): - inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) - inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) - inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) - -Seed: 1806480648350826486 ``` -Echidna hat herausgefunden, dass die Assertion in `inc` fehlschlagen kann, wenn diese Funktion mehrmals mit großen Argumenten aufgerufen wird. +Echidna hat herausgefunden, dass die Zusicherung in `inc` fehlschlagen kann, wenn diese Funktion mehrmals mit großen Argumenten aufgerufen wird. ## Sammeln und Modifizieren eines Echidna-Korpus {#collecting-and-modifying-an-echidna-corpus} -Wir werden sehen, wie man mit Echidna einen Korpus von Transaktionen sammelt und verwendet. Das Ziel ist der folgende Smart Contract [`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol): +Wir werden sehen, wie man einen Korpus von Transaktionen mit Echidna sammelt und verwendet. Das Ziel ist der folgende Smart Contract [`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol): ```solidity contract C { @@ -427,7 +406,8 @@ contract C { function magic(uint magic_1, uint magic_2, uint magic_3, uint magic_4) public { require(magic_1 == 42); require(magic_2 == 129); - require(magic_3 == magic_4+333); + require(magic_3 == 333); + require(magic_4 == 0); value_found = true; return; } @@ -439,24 +419,22 @@ contract C { } ``` -Dieses kleine Beispiel zwingt Echidna, bestimmte Werte zu finden, um eine Zustandsvariable zu ändern. Das ist schwierig für einen Fuzzer -(es wird empfohlen, ein symbolisches Ausführungswerkzeug wie [Manticore](https://github.com/trailofbits/manticore) zu verwenden). +Dieses kleine Beispiel zwingt Echidna, bestimmte Werte zu finden, um eine Zustandsvariable zu ändern. Dies ist für einen Fuzzer schwierig +(es wird empfohlen, ein Tool zur symbolischen Ausführung wie [Manticore](https://github.com/trailofbits/manticore) zu verwenden). Wir können Echidna ausführen, um dies zu überprüfen: ```bash echidna-test magic.sol ... - echidna_magic_values: passed! 🎉 - -Seed: 2221503356319272685 +... ``` -Wir können Echidna jedoch immer noch verwenden, um während dieser Fuzzing-Kampagne einen Korpus zu sammeln. +Wir können Echidna jedoch weiterhin verwenden, um während dieser Fuzzing-Kampagne einen Korpus zu sammeln. ### Einen Korpus sammeln {#collecting-a-corpus} -Um die Korpus-Sammlung zu aktivieren, erstellen Sie ein Korpus-Verzeichnis: +Um die Korpussammlung zu aktivieren, erstellen Sie ein Korpusverzeichnis: ```bash mkdir corpus-magic @@ -469,14 +447,14 @@ coverage: true corpusDir: "corpus-magic" ``` -Jetzt können wir unser Werkzeug ausführen und den gesammelten Korpus überprüfen: +Jetzt können wir unser Tool ausführen und den gesammelten Korpus überprüfen: ```bash echidna-test magic.sol --config config.yaml ``` -Echidna kann immer noch nicht die richtigen magischen Werte finden, aber wir können uns den Korpus ansehen, den es gesammelt hat. -Eine dieser Dateien war zum Beispiel: +Echidna kann die richtigen magischen Werte immer noch nicht finden, aber wir können uns den gesammelten Korpus ansehen. +Eine dieser Dateien war beispielsweise: ```json [ @@ -494,24 +472,30 @@ Eine dieser Dateien war zum Beispiel: { "contents": [ 256, - "93723985220345906694500679277863898678726808528711107336895287282192244575836" + "9372398522078111428822382693894038718080310667565819743730492509016942339959" ], "tag": "AbiUInt" }, { - "contents": [256, "334"], + "contents": [ + 256, + "11237882436254505637692894012452665611739945802153465936579363300050342613311" + ], "tag": "AbiUInt" }, { "contents": [ 256, - "68093943901352437066264791224433559271778087297543421781073458233697135179558" + "61286718360753647151574642685169272761912591497013628221301130206320371476503" ], "tag": "AbiUInt" }, { - "tag": "AbiUInt", - "contents": [256, "332"] + "contents": [ + 256, + "10604007310812769281948987101818773906025658755185924380939314050119356472974" + ], + "tag": "AbiUInt" } ] ] @@ -523,16 +507,15 @@ Eine dieser Dateien war zum Beispiel: Offensichtlich wird diese Eingabe den Fehler in unserer Eigenschaft nicht auslösen. Im nächsten Schritt werden wir jedoch sehen, wie wir sie dafür modifizieren können. -### Einen Korpus mit Startwerten versehen {#seeding-a-corpus} +### Einen Korpus mit Seeds versehen {#seeding-a-corpus} -Echidna benötigt etwas Hilfe, um mit der `magic`-Funktion umzugehen. Wir werden die Eingabe kopieren und modifizieren, um geeignete -Parameter dafür zu verwenden: +Echidna braucht etwas Hilfe, um mit der Funktion `magic` umzugehen. Wir werden die Eingabe kopieren und modifizieren, um geeignete Parameter dafür zu verwenden: ```bash -cp corpus/2712688662897926208.txt corpus/new.txt +cp corpus-magic/coverage/2712688662897926208.txt corpus-magic/coverage/new.txt ``` -Wir werden `new.txt` modifizieren, um `magic(42,129,333,0)` aufzurufen. Jetzt können wir Echidna erneut ausführen: +Wir werden `new.txt` so modifizieren, dass `magic(42,129,333,0)` aufgerufen wird. Jetzt können wir Echidna erneut ausführen: ```bash echidna-test magic.sol --config config.yaml @@ -540,17 +523,11 @@ echidna-test magic.sol --config config.yaml echidna_magic_values: failed!💥 Call sequence: magic(42,129,333,0) - - -Unique instructions: 142 -Unique codehashes: 1 -Seed: -7293830866560616537 - ``` -Dieses Mal wurde sofort festgestellt, dass die Eigenschaft verletzt wird. +Dieses Mal wurde sofort festgestellt, dass die Eigenschaft verletzt ist. -## Transaktionen mit hohem Gasverbrauch finden {#finding-transactions-with-high-gas-consumption} +## Finden von Transaktionen mit hohem Gasverbrauch {#finding-transactions-with-high-gas-consumption} Wir werden sehen, wie man mit Echidna die Transaktionen mit hohem Gasverbrauch findet. Das Ziel ist der folgende Smart Contract: @@ -558,18 +535,11 @@ Wir werden sehen, wie man mit Echidna die Transaktionen mit hohem Gasverbrauch f contract C { uint state; - function expensive(uint8 times) internal { + function expensive(uint8 times) public { for(uint8 i=0; i < times; i++) state = state + i; } - function f(uint x, uint y, uint8 times) public { - if (x == 42 && y == 123) - expensive(times); - else - state = 0; - } - function echidna_test() public returns (bool) { return true; } @@ -577,20 +547,19 @@ contract C { } ``` -Hier kann `expensive` einen hohen Gasverbrauch haben. +Hier kann `expensive` einen großen Gasverbrauch haben. -Derzeit benötigt Echidna immer eine Eigenschaft zum Testen: hier gibt `echidna_test` immer `true` zurück. +Derzeit benötigt Echidna immer eine Eigenschaft zum Testen: Hier gibt `echidna_test` immer `true` zurück. Wir können Echidna ausführen, um dies zu überprüfen: -``` +```bash echidna-test gas.sol ... echidna_test: passed! 🎉 - -Seed: 2320549945714142710 +... ``` -### Gasverbrauch messen {#measuring-gas-consumption} +### Messung des Gasverbrauchs {#measuring-gas-consumption} Um den Gasverbrauch mit Echidna zu aktivieren, erstellen Sie eine Konfigurationsdatei `config.yaml`: @@ -607,50 +576,51 @@ estimateGas: true ### Echidna ausführen {#run-echidna-3} -Sobald wir die Konfigurationsdatei erstellt haben, können wir Echidna so ausführen: +Sobald wir die Konfigurationsdatei erstellt haben, können wir Echidna wie folgt ausführen: ```bash echidna-test gas.sol --config config.yaml ... echidna_test: passed! 🎉 -f used a maximum of 1333608 gas - Call sequence: - f(42,123,249) Gas price: 0x10d5733f0a Time delay: 0x495e5 Block delay: 0x88b2 - -Unique instructions: 157 -Unique codehashes: 1 -Seed: -325611019680165325 +fuzzing time: 2.73s +C.expensive(uint8) with gas 5463708: + expensive(255) + expensive(255) ``` - Das angezeigte Gas ist eine Schätzung, die von [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-) bereitgestellt wird. -### Gasreduzierende Aufrufe herausfiltern {#filtering-out-gas-reducing-calls} +### Herausfiltern von gasreduzierenden Aufrufen {#filtering-out-gas-reducing-calls} -Das Tutorial zum **Filtern von Funktionen, die während einer Fuzzing-Kampagne aufgerufen werden** oben zeigt, wie man -einige Funktionen aus dem Test entfernt. +Das obige Tutorial zum **Filtern von Funktionen, die während einer Fuzzing-Kampagne aufgerufen werden sollen**, zeigt, wie Sie einige Funktionen aus Ihren Tests entfernen können. Dies kann entscheidend sein, um eine genaue Gasschätzung zu erhalten. -Betrachte das folgende Beispiel: +Betrachten Sie das folgende Beispiel: ```solidity contract C { - address [] addrs; + address[] addrs; + function push(address a) public { addrs.push(a); } + function pop() public { addrs.pop(); } + function clear() public{ addrs.length = 0; } + function check() public{ for(uint256 i = 0; i < addrs.length; i++) for(uint256 j = i+1; j < addrs.length; j++) if (addrs[i] == addrs[j]) addrs[j] = address(0x0); } + function echidna_test() public returns (bool) { return true; } @@ -659,37 +629,38 @@ contract C { Wenn Echidna alle Funktionen aufrufen kann, wird es nicht leicht Transaktionen mit hohen Gaskosten finden: -``` -echidna-test pushpop.sol --config config.yaml -... -pop used a maximum of 10746 gas -... -check used a maximum of 23730 gas -... -clear used a maximum of 35916 gas -... -push used a maximum of 40839 gas +```text +C.check() with gas 8001: + push(0x0) + check() ``` Das liegt daran, dass die Kosten von der Größe von `addrs` abhängen und zufällige Aufrufe dazu neigen, das Array fast leer zu lassen. -Das Setzen von `pop` und `clear` auf die schwarze Liste liefert uns jedoch viel bessere Ergebnisse: +Das Setzen von `pop` und `clear` auf die Blacklist liefert uns jedoch viel bessere Ergebnisse: ```yaml filterBlacklist: true filterFunctions: ["pop", "clear"] ``` -``` -echidna-test pushpop.sol --config config.yaml -... -push used a maximum of 40839 gas -... -check used a maximum of 1484472 gas +```text +C.check() with gas 1490968: + push(0x0) + push(0x0) + push(0x0) + push(0x0) + push(0x0) + push(0x0) + push(0x0) + push(0x0) + push(0x0) + push(0x0) + check() ``` ### Zusammenfassung: Finden von Transaktionen mit hohem Gasverbrauch {#summary-finding-transactions-with-high-gas-consumption} -Echidna kann Transaktionen mit hohem Gasverbrauch finden, indem es die Konfigurationsoption `estimateGas` verwendet: +Echidna kann Transaktionen mit hohem Gasverbrauch mithilfe der Konfigurationsoption `estimateGas` finden: ```yaml estimateGas: true @@ -697,7 +668,6 @@ estimateGas: true ```bash echidna-test contract.sol --config config.yaml -... ``` -Echidna wird nach Abschluss der Fuzzing-Kampagne für jede Funktion eine Sequenz mit dem maximalen Gasverbrauch melden. +Echidna meldet nach Abschluss der Fuzzing-Kampagne für jede Funktion eine Sequenz mit dem maximalen Gasverbrauch. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md index 0bcf0827144..4ba1d6d1619 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -1,22 +1,22 @@ --- -title: So nutzt du Manticore, um Fehler in Smart Contracts zu finden -description: So nutzt du Manticore, um automatisiert Fehler in Smart Contracts zu finden +title: Wie man Manticore verwendet, um Fehler in Smart Contracts zu finden +description: Wie man Manticore verwendet, um automatisch Fehler in Smart Contracts zu finden author: Trailofbits lang: de tags: - ["solidity", "smart contracts", "security", "testing", "formal verification"] + ["Solidity", "Smart Contracts", "Sicherheit", "Testen", "formale Verifizierung"] skill: advanced -breadcrumb: "Manticore" +breadcrumb: Manticore published: 2020-01-13 source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore --- -Das Ziel dieses Tutorials ist es zu zeigen, wie du Manticore nutzt, um automatisch Fehler in Smart Contracts zu finden. +Ziel dieses Tutorials ist es zu zeigen, wie man Manticore verwendet, um automatisch Fehler in Smart Contracts zu finden. ## Installation {#installation} -Manticore erfordert Python >= 3.6. Die Installation kann über pip oder Docker erfolgen. +Manticore erfordert >= Python 3.6. Es kann über pip oder mit Docker installiert werden. ### Manticore über Docker {#manticore-through-docker} @@ -25,9 +25,9 @@ docker pull trailofbits/eth-security-toolbox docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox ``` -_Der letzte Befehl führt die eth-security-toolbox in einem Docker aus, der Zugriff auf dein aktuelles Verzeichnis hat. Du kannst die Dateien von deinem Host aus ändern und die Tools für die Dateien aus dem Docker ausführen_ +_Der letzte Befehl führt die eth-security-toolbox in einem Docker-Container aus, der Zugriff auf Ihr aktuelles Verzeichnis hat. Sie können die Dateien von Ihrem Host aus ändern und die Tools auf die Dateien aus dem Docker-Container anwenden._ -Führe im Docker aus: +Führen Sie innerhalb von Docker Folgendes aus: ```bash solc-select 0.5.11 @@ -44,7 +44,7 @@ solc 0.5.11 wird empfohlen. ### Ausführen eines Skripts {#running-a-script} -So führst du ein Python-Skript mit Python 3 aus: +Um ein Python-Skript mit Python 3 auszuführen: ```bash python3 script.py @@ -52,24 +52,24 @@ python3 script.py ## Einführung in die dynamische symbolische Ausführung {#introduction-to-dynamic-symbolic-execution} -### Dynamische symbolische Ausführung – kurz erklärt {#dynamic-symbolic-execution-in-a-nutshell} +### Dynamische symbolische Ausführung auf den Punkt gebracht {#dynamic-symbolic-execution-in-a-nutshell} -Die dynamische symbolische Ausführung (DSE) ist eine Programmanalysetechnik, die einen Zustandsraum mit einem hohen Grad an semantischem Bewusstsein untersucht. Diese Technik basiert auf der Entdeckung von „Programmpfaden“, die als mathematische Formeln, sogenannte `path predicates`, dargestellt werden. Konzeptionell arbeitet diese Technik in zwei Schritten mit Pfadprädikaten: +Die dynamische symbolische Ausführung (Dynamic Symbolic Execution, DSE) ist eine Programmanalysetechnik, die einen Zustandsraum mit einem hohen Maß an semantischem Bewusstsein untersucht. Diese Technik basiert auf der Entdeckung von „Programmpfaden“, die als mathematische Formeln dargestellt werden, sogenannte `path predicates` (Pfadprädikate). Konzeptionell arbeitet diese Technik in zwei Schritten mit Pfadprädikaten: -1. Sie werden unter Verwendung von Einschränkungen für die Programmeingabe konstruiert. +1. Sie werden unter Verwendung von Einschränkungen (Constraints) für die Programmeingabe konstruiert. 2. Sie werden verwendet, um Programmeingaben zu generieren, die die Ausführung der zugehörigen Pfade bewirken. -Dieser Ansatz erzeugt keine Falsch-Positiv-Meldungen, da alle identifizierten Programmzustände während einer konkreten Ausführung ausgelöst werden können. Findet die Analyse beispielsweise einen Integer-Überlauf, ist dieser garantiert reproduzierbar. +Dieser Ansatz erzeugt keine falsch-positiven Ergebnisse in dem Sinne, dass alle identifizierten Programmzustände während der konkreten Ausführung ausgelöst werden können. Wenn die Analyse beispielsweise einen Integer-Overflow (Ganzzahlüberlauf) findet, ist dieser garantiert reproduzierbar. ### Beispiel für ein Pfadprädikat {#path-predicate-example} -Um einen Einblick in die Funktionsweise von DSE zu erhalten, sieh dir das folgende Beispiel an: +Um einen Einblick in die Funktionsweise von DSE zu erhalten, betrachten Sie das folgende Beispiel: ```solidity function f(uint a){ if (a == 65) { - // Ein Fehler ist vorhanden + // Ein Bug ist vorhanden } } @@ -80,13 +80,13 @@ Da `f()` zwei Pfade enthält, konstruiert eine DSE zwei verschiedene Pfadprädik - Pfad 1: `a == 65` - Pfad 2: `Not (a == 65)` -Jedes Pfadprädikat ist eine mathematische Formel, die an einen sogenannten [SMT-Solver](https://wikipedia.org/wiki/Satisfiability_modulo_theories) übergeben werden kann, der versucht, die Gleichung zu lösen. Für `Pfad 1` wird der Solver ausgeben, dass der Pfad mit `a = 65` untersucht werden kann. Für `Pfad 2` kann der Solver für `a` einen beliebigen anderen Wert als 65 angeben, zum Beispiel `a = 0`. +Jedes Pfadprädikat ist eine mathematische Formel, die an einen sogenannten [SMT-Solver](https://wikipedia.org/wiki/Satisfiability_modulo_theories) übergeben werden kann, der versuchen wird, die Gleichung zu lösen. Für `Pfad 1` wird der Solver angeben, dass der Pfad mit `a = 65` erkundet werden kann. Für `Pfad 2` kann der Solver `a` jeden anderen Wert als 65 zuweisen, zum Beispiel `a = 0`. -### Überprüfen von Eigenschaften {#verifying-properties} +### Eigenschaften verifizieren {#verifying-properties} -Manticore ermöglicht die vollständige Kontrolle über die gesamte Ausführung jedes Pfades. Dadurch kannst du beliebige Einschränkungen für fast alles hinzufügen. Diese Kontrolle ermöglicht das Erstellen von Eigenschaften für den Vertrag. +Manticore ermöglicht die vollständige Kontrolle über die gesamte Ausführung jedes Pfades. Infolgedessen können Sie fast allem beliebige Einschränkungen hinzufügen. Diese Kontrolle ermöglicht die Erstellung von Eigenschaften für den Smart Contract. -Betrachte das folgende Beispiel: +Betrachten Sie das folgende Beispiel: ```solidity function unsafe_add(uint a, uint b) returns(uint c){ @@ -95,17 +95,17 @@ function unsafe_add(uint a, uint b) returns(uint c){ } ``` -Hier gibt es in der Funktion nur einen Pfad zu untersuchen: +Hier gibt es nur einen Pfad in der Funktion zu erkunden: - Pfad 1: `c = a + b` -Mit Manticore kannst du auf einen Überlauf prüfen und dem Pfadprädikat Einschränkungen hinzufügen: +Mit Manticore können Sie auf Überläufe prüfen und dem Pfadprädikat Einschränkungen hinzufügen: - `c = a + b AND (c < a OR c < b)` -Wenn es möglich ist, eine Bewertung für `a` und `b` zu finden, für die das obige Pfadprädikat erfüllbar ist, bedeutet das, dass du einen Überlauf gefunden hast. Der Solver kann beispielsweise die Eingabe `a = 10 , b = MAXUINT256` generieren. +Wenn es möglich ist, eine Bewertung von `a` und `b` zu finden, für die das obige Pfadprädikat machbar ist, bedeutet dies, dass Sie einen Überlauf gefunden haben. Zum Beispiel kann der Solver die Eingabe `a = 10 , b = MAXUINT256` generieren. -Wenn du eine korrigierte Version betrachtest: +Wenn Sie eine korrigierte Version betrachten: ```solidity function safe_add(uint a, uint b) returns(uint c){ @@ -120,11 +120,11 @@ Die zugehörige Formel mit Überlaufprüfung wäre: - `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)` -Diese Formel kann nicht gelöst werden; mit anderen Worten, das ist ein **Beweis** dafür, dass in `safe_add` der Wert `c` immer größer wird. +Diese Formel kann nicht gelöst werden; mit anderen Worten, dies ist ein **Beweis**, dass in `safe_add` `c` immer größer wird. -DSE ist somit ein leistungsfähiges Tool, das beliebige Einschränkungen in deinem Code überprüfen kann. +DSE ist somit ein leistungsstarkes Werkzeug, das beliebige Einschränkungen in Ihrem Code verifizieren kann. -## Ausführung mit Manticore {#running-under-manticore} +## Ausführen unter Manticore {#running-under-manticore} Wir werden sehen, wie man einen Smart Contract mit der Manticore-API untersucht. Das Ziel ist der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): @@ -142,13 +142,13 @@ contract Simple { ### Eine eigenständige Untersuchung ausführen {#run-a-standalone-exploration} -Du kannst Manticore mit dem folgenden Befehl direkt auf dem Smart Contract ausführen (`project` kann eine Solidity-Datei oder ein Projektverzeichnis sein): +Sie können Manticore direkt auf dem Smart Contract mit dem folgenden Befehl ausführen (`project` kann eine Solidity-Datei oder ein Projektverzeichnis sein): ```bash $ manticore project ``` -Du erhältst die Ausgabe von Testfällen wie diesem (die Reihenfolge kann sich ändern): +Sie erhalten die Ausgabe von Testfällen wie diesem (die Reihenfolge kann sich ändern): ``` ... @@ -163,9 +163,9 @@ Du erhältst die Ausgabe von Testfällen wie diesem (die Reihenfolge kann sich ... ``` -Ohne zusätzliche Informationen untersucht Manticore den Vertrag mit neuen symbolischen Transaktionen, bis es keine neuen Pfade mehr auf dem Vertrag untersucht. Manticore führt nach einer fehlgeschlagenen Transaktion (z. B. nach einem Revert) keine neuen Transaktionen aus. +Ohne zusätzliche Informationen wird Manticore den Smart Contract mit neuen symbolischen Transaktionen untersuchen, bis keine neuen Pfade im Smart Contract mehr gefunden werden. Manticore führt nach einer fehlgeschlagenen Transaktion (z. B. nach einem Revert) keine neuen Transaktionen aus. -Manticore gibt die Informationen in einem `mcore_*`-Verzeichnis aus. Unter anderem findest du in diesem Verzeichnis: +Manticore gibt die Informationen in einem `mcore_*`-Verzeichnis aus. Unter anderem finden Sie in diesem Verzeichnis: - `global.summary`: Abdeckung und Compiler-Warnungen - `test_XXXXX.summary`: Abdeckung, letzte Anweisung, Kontostände pro Testfall @@ -173,29 +173,29 @@ Manticore gibt die Informationen in einem `mcore_*`-Verzeichnis aus. Unter ander Hier findet Manticore 7 Testfälle, die Folgendem entsprechen (die Reihenfolge der Dateinamen kann sich ändern): -| | Transaktion 0 | Transaktion 1 | Transaktion 2 | Ergebnis | -| :-------------------------------------------------------: | :----------------: | :------------------------: | -------------------------- | :------: | -| **test_00000000.tx** | Vertragserstellung | f(!=65) | f(!=65) | STOP | -| **test_00000001.tx** | Vertragserstellung | Fallback-Funktion | | REVERT | -| **test_00000002.tx** | Vertragserstellung | | | RETURN | -| **test_00000003.tx** | Vertragserstellung | f(65) | | REVERT | -| **test_00000004.tx** | Vertragserstellung | f(!=65) | | STOP | -| **test_00000005.tx** | Vertragserstellung | f(!=65) | f(65) | REVERT | -| **test_00000006.tx** | Vertragserstellung | f(!=65) | Fallback-Funktion | REVERT | +| | Transaktion 0 | Transaktion 1 | Transaktion 2 | Ergebnis | +| :------------------: | :---------------: | :---------------: | ----------------- | :----: | +| **test_00000000.tx** | Vertragserstellung | f(!=65) | f(!=65) | STOP | +| **test_00000001.tx** | Vertragserstellung | Fallback-Funktion | | REVERT | +| **test_00000002.tx** | Vertragserstellung | | | RETURN | +| **test_00000003.tx** | Vertragserstellung | f(65) | | REVERT | +| **test_00000004.tx** | Vertragserstellung | f(!=65) | | STOP | +| **test_00000005.tx** | Vertragserstellung | f(!=65) | f(65) | REVERT | +| **test_00000006.tx** | Vertragserstellung | f(!=65) | Fallback-Funktion | REVERT | -_Zusammenfassung der Untersuchung: f(!=65) bezeichnet einen Aufruf von f mit einem beliebigen Wert, der nicht 65 ist._ +_Die Untersuchungszusammenfassung f(!=65) bedeutet, dass f mit einem beliebigen Wert ungleich 65 aufgerufen wird._ -Wie du sehen kannst, generiert Manticore für jede erfolgreiche oder rückgängig gemachte (reverted) Transaktion einen eindeutigen Testfall. +Wie Sie feststellen können, generiert Manticore für jede erfolgreiche oder rückgängig gemachte (reverted) Transaktion einen eindeutigen Testfall. -Verwende das `--quick-mode`-Flag, wenn du eine schnelle Code-Untersuchung wünschst (es deaktiviert Fehlerdetektoren, Gas-Berechnung, ...) +Verwenden Sie das Flag `--quick-mode`, wenn Sie eine schnelle Code-Untersuchung wünschen (es deaktiviert Fehlerdetektoren, Gasberechnung, ...). ### Einen Smart Contract über die API manipulieren {#manipulate-a-smart-contract-through-the-api} -Dieser Abschnitt beschreibt im Detail, wie man einen Smart Contract über die Manticore-Python-API manipuliert. Du kannst eine neue Datei mit der Python-Erweiterung `*.py` erstellen und den notwendigen Code schreiben, indem du die API-Befehle (deren Grundlagen unten beschrieben werden) in diese Datei einfügst und sie dann mit dem Befehl `$ python3 *.py` ausführst. Du kannst die folgenden Befehle auch direkt in der Python-Konsole ausführen. Um die Konsole zu starten, verwende den Befehl `$ python3`. +Dieser Abschnitt beschreibt im Detail, wie man einen Smart Contract über die Manticore-Python-API manipuliert. Sie können eine neue Datei mit der Python-Erweiterung `*.py` erstellen und den erforderlichen Code schreiben, indem Sie die API-Befehle (deren Grundlagen unten beschrieben werden) in diese Datei einfügen und sie dann mit dem Befehl `$ python3 *.py` ausführen. Sie können die folgenden Befehle auch direkt in der Python-Konsole ausführen. Um die Konsole zu starten, verwenden Sie den Befehl `$ python3`. -### Erstellen von Konten {#creating-accounts} +### Konten erstellen {#creating-accounts} -Als Erstes solltest du mit den folgenden Befehlen eine neue Blockchain initialisieren: +Das Erste, was Sie tun sollten, ist, eine neue Blockchain mit den folgenden Befehlen zu initiieren: ```python from manticore.ethereum import ManticoreEVM @@ -203,7 +203,7 @@ from manticore.ethereum import ManticoreEVM m = ManticoreEVM() ``` -Ein Nicht-Vertragskonto wird mit [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) erstellt: +Ein Nicht-Vertragskonto (Extern verwaltetes Konto) wird mit [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) erstellt: ```python user_account = m.create_account(balance=1000) @@ -228,18 +228,18 @@ contract_account = m.solidity_create_contract(source_code, owner=user_account) #### Zusammenfassung {#summary} -- Du kannst Benutzer- und Vertragskonten mit [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) und [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) erstellen. +- Sie können Benutzer- und Vertragskonten mit [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) und [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) erstellen. -### Ausführen von Transaktionen {#executing-transactions} +### Transaktionen ausführen {#executing-transactions} Manticore unterstützt zwei Arten von Transaktionen: -- Raw-Transaktion: Alle Funktionen werden untersucht -- Benannte Transaktion: Es wird nur eine Funktion untersucht +- Rohe Transaktion (Raw transaction): Alle Funktionen werden untersucht. +- Benannte Transaktion (Named transaction): Nur eine Funktion wird untersucht. -#### Raw-Transaktion {#raw-transaction} +#### Rohe Transaktion {#raw-transaction} -Eine Raw-Transaktion wird mit [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction) ausgeführt: +Eine rohe Transaktion wird mit [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction) ausgeführt: ```python m.transaction(caller=user_account, @@ -253,7 +253,7 @@ Der Aufrufer, die Adresse, die Daten oder der Wert der Transaktion können entwe - [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) erstellt einen symbolischen Wert. - [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) erstellt ein symbolisches Byte-Array. -Beispiel: +Zum Beispiel: ```python symbolic_value = m.make_symbolic_value() @@ -264,39 +264,39 @@ m.transaction(caller=user_account, value=symbolic_value) ``` -Wenn die Daten symbolisch sind, untersucht Manticore während der Transaktionsausführung alle Funktionen des Vertrags. Es ist hilfreich, die Erklärung der Fallback-Funktion im Artikel [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) zu lesen, um zu verstehen, wie die Funktionsauswahl funktioniert. +Wenn die Daten symbolisch sind, untersucht Manticore während der Transaktionsausführung alle Funktionen des Smart Contracts. Es ist hilfreich, die Erklärung zur Fallback-Funktion im Artikel [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) zu lesen, um zu verstehen, wie die Funktionsauswahl funktioniert. #### Benannte Transaktion {#named-transaction} Funktionen können über ihren Namen ausgeführt werden. -Um `f(uint var)` mit einem symbolischen Wert, von `user_account` und mit 0 Ether auszuführen, verwende: +Um `f(uint var)` mit einem symbolischen Wert, von `user_account` und mit 0 Ether auszuführen, verwenden Sie: ```python symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var, caller=user_account, value=0) ``` -Wenn der `value` der Transaktion nicht angegeben ist, ist er standardmäßig 0. +Wenn der `value` (Wert) der Transaktion nicht angegeben ist, beträgt er standardmäßig 0. #### Zusammenfassung {#summary-1} -- Argumente einer Transaktion können konkret oder symbolisch sein -- Eine Raw-Transaktion untersucht alle Funktionen -- Funktionen können über ihren Namen aufgerufen werden +- Argumente einer Transaktion können konkret oder symbolisch sein. +- Eine rohe Transaktion untersucht alle Funktionen. +- Funktionen können über ihren Namen aufgerufen werden. ### Arbeitsbereich {#workspace} -`m.workspace` ist das Verzeichnis, das als Ausgabeverzeichnis für alle erzeugten Dateien verwendet wird: +`m.workspace` ist das Verzeichnis, das als Ausgabeverzeichnis für alle generierten Dateien verwendet wird: ```python -print("Ergebnisse sind in {}".format(m.workspace)) +print("Results are in {}".format(m.workspace)) ``` ### Die Untersuchung beenden {#terminate-the-exploration} -Um die Untersuchung zu beenden, verwende [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Sobald diese Methode aufgerufen wird, sollten keine weiteren Transaktionen gesendet werden. Manticore generiert dann Testfälle für jeden untersuchten Pfad. +Um die Untersuchung zu stoppen, verwenden Sie [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Sobald diese Methode aufgerufen wird, sollten keine weiteren Transaktionen gesendet werden, und Manticore generiert Testfälle für jeden untersuchten Pfad. -### Zusammenfassung: Ausführung mit Manticore {#summary-running-under-manticore} +### Zusammenfassung: Ausführen unter Manticore {#summary-running-under-manticore} Wenn wir alle vorherigen Schritte zusammenfassen, erhalten wir: @@ -314,15 +314,15 @@ contract_account = m.solidity_create_contract(source_code, owner=user_account) symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var) -print("Ergebnisse sind in {}".format(m.workspace)) -m.finalize() # die Untersuchung anhalten +print("Results are in {}".format(m.workspace)) +m.finalize() # die Erkundung stoppen ``` -Den gesamten obigen Code findest du in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) +Den gesamten obigen Code finden Sie in der Datei [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py). -## Pfade erhalten, die eine Ausnahme auslösen {#getting-throwing-paths} +## Pfade mit Ausnahmen (Throwing Paths) abrufen {#getting-throwing-paths} -Wir generieren nun spezifische Eingaben für die Pfade, die in `f()` eine Ausnahme auslösen. Das Ziel ist nach wie vor der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): +Wir werden nun spezifische Eingaben für die Pfade generieren, die in `f()` eine Ausnahme auslösen. Das Ziel ist weiterhin der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): ```solidity pragma solidity >=0.4.24 <0.6.0; @@ -335,35 +335,35 @@ contract Simple { } ``` -### Verwenden von Zustandsinformationen {#using-state-information} +### Statusinformationen verwenden {#using-state-information} -Jeder ausgeführte Pfad hat seinen eigenen Zustand der Blockchain. Ein Zustand ist entweder bereit (ready) oder beendet (killed), was bedeutet, dass er eine THROW- oder REVERT-Anweisung erreicht: +Jeder ausgeführte Pfad hat seinen eigenen Zustand der Blockchain. Ein Zustand ist entweder bereit (ready) oder er wird beendet (killed), was bedeutet, dass er eine THROW- oder REVERT-Anweisung erreicht: -- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): die Liste der Zustände, die bereit sind (sie haben kein REVERT/INVALID ausgeführt) -- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): die Liste der beendeten Zustände -- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): alle Zustände +- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): die Liste der Zustände, die bereit sind (sie haben kein REVERT/INVALID ausgeführt). +- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): die Liste der Zustände, die beendet wurden. +- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): alle Zustände. ```python for state in m.all_states: - # etwas mit dem Zustand tun + # etwas mit dem Zustand machen ``` -Du kannst auf Zustandsinformationen zugreifen. Beispiel: +Sie können auf Statusinformationen zugreifen. Zum Beispiel: -- `state.platform.get_balance(account.address)`: der Kontostand des Kontos -- `state.platform.transactions`: die Liste der Transaktionen -- `state.platform.transactions[-1].return_data`: die von der letzten Transaktion zurückgegebenen Daten +- `state.platform.get_balance(account.address)`: der Kontostand des Kontos. +- `state.platform.transactions`: die Liste der Transaktionen. +- `state.platform.transactions[-1].return_data`: die von der letzten Transaktion zurückgegebenen Daten. -Die von der letzten Transaktion zurückgegebenen Daten sind ein Array, das beispielsweise mit `ABI.deserialize` in einen Wert umgewandelt werden kann: +Die von der letzten Transaktion zurückgegebenen Daten sind ein Array, das mit ABI.deserialize in einen Wert konvertiert werden kann, zum Beispiel: ```python data = state.platform.transactions[0].return_data data = ABI.deserialize("uint", data) ``` -### So generierst du einen Testfall {#how-to-generate-testcase} +### Wie man einen Testfall generiert {#how-to-generate-testcase} -Verwende [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase), um einen Testfall zu generieren: +Verwenden Sie [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase), um einen Testfall zu generieren: ```python m.generate_testcase(state, 'BugFound') @@ -371,13 +371,13 @@ m.generate_testcase(state, 'BugFound') ### Zusammenfassung {#summary-2} -- Du kannst mit `m.all_states` über die Zustände iterieren -- `state.platform.get_balance(account.address)` gibt den Kontostand des Kontos zurück -- `state.platform.transactions` gibt die Liste der Transaktionen zurück -- `transaction.return_data` sind die zurückgegebenen Daten -- `m.generate_testcase(state, name)` generiert Eingaben für den Zustand +- Sie können mit `m.all_states` über den Zustand iterieren. +- `state.platform.get_balance(account.address)` gibt den Kontostand zurück. +- `state.platform.transactions` gibt die Liste der Transaktionen zurück. +- `transaction.return_data` sind die zurückgegebenen Daten. +- `m.generate_testcase(state, name)` generiert Eingaben für den Zustand. -### Zusammenfassung: Pfad erhalten, der eine Ausnahme auslöst {#summary-getting-throwing-path} +### Zusammenfassung: Pfade mit Ausnahmen abrufen {#summary-getting-throwing-path} ```python from manticore.ethereum import ManticoreEVM @@ -393,22 +393,21 @@ contract_account = m.solidity_create_contract(source_code, owner=user_account) symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var) -## Prüfen, ob eine Ausführung mit REVERT oder INVALID endet - +# # Prüfen, ob eine Ausführung mit einem REVERT oder INVALID endet for state in m.terminated_states: last_tx = state.platform.transactions[-1] if last_tx.result in ['REVERT', 'INVALID']: - print('Ausnahme gefunden {}'.format(m.workspace)) + print('Throw found {}'.format(m.workspace)) m.generate_testcase(state, 'ThrowFound') ``` -Den gesamten obigen Code findest du in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) +Den gesamten obigen Code finden Sie in der Datei [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py). -_Hinweis: Wir hätten ein viel einfacheres Skript generieren können, da alle von `terminated_state` zurückgegebenen Zustände REVERT oder INVALID in ihrem Ergebnis haben: Dieses Beispiel sollte nur demonstrieren, wie man die API manipuliert._ +_Beachten Sie, dass wir ein viel einfacheres Skript hätten generieren können, da alle von `terminated_state` zurückgegebenen Zustände REVERT oder INVALID in ihrem Ergebnis haben: Dieses Beispiel sollte nur demonstrieren, wie man die API manipuliert._ -## Hinzufügen von Einschränkungen {#adding-constraints} +## Einschränkungen hinzufügen {#adding-constraints} -Wir werden sehen, wie man die Untersuchung einschränken kann. Wir gehen von der Annahme aus, dass die Dokumentation von `f()` besagt, dass die Funktion niemals mit `a == 65` aufgerufen wird, sodass jeder Fehler bei `a == 65` kein echter Fehler ist. Das Ziel ist nach wie vor der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): +Wir werden sehen, wie man die Untersuchung einschränkt. Wir gehen davon aus, dass die Dokumentation von `f()` besagt, dass die Funktion niemals mit `a == 65` aufgerufen wird, sodass jeder Fehler mit `a == 65` kein echter Fehler ist. Das Ziel ist weiterhin der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): ```solidity pragma solidity >=0.4.24 <0.6.0; @@ -423,22 +422,22 @@ contract Simple { ### Operatoren {#operators} -Das [Operators](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py)-Modul erleichtert die Bearbeitung von Einschränkungen und bietet unter anderem Folgendes: +Das Modul [Operators](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) erleichtert die Manipulation von Einschränkungen und bietet unter anderem: - Operators.AND, - Operators.OR, -- Operators.UGT (unsigned greater than), -- Operators.UGE (unsigned greater than or equal to), -- Operators.ULT (unsigned lower than), -- Operators.ULE (unsigned lower than or equal to). +- Operators.UGT (unsigned greater than - vorzeichenlos größer als), +- Operators.UGE (unsigned greater than or equal to - vorzeichenlos größer als oder gleich), +- Operators.ULT (unsigned lower than - vorzeichenlos kleiner als), +- Operators.ULE (unsigned lower than or equal to - vorzeichenlos kleiner als oder gleich). -Verwende Folgendes, um das Modul zu importieren: +Um das Modul zu importieren, verwenden Sie Folgendes: ```python from manticore.core.smtlib import Operators ``` -`Operators.CONCAT` wird verwendet, um ein Array mit einem Wert zu verketten. Zum Beispiel muss `return_data` einer Transaktion in einen Wert geändert werden, um ihn mit einem anderen Wert zu vergleichen: +`Operators.CONCAT` wird verwendet, um ein Array mit einem Wert zu verketten. Zum Beispiel müssen die `return_data` einer Transaktion in einen Wert geändert werden, um gegen einen anderen Wert geprüft zu werden: ```python last_return = Operators.CONCAT(256, *last_return) @@ -446,12 +445,12 @@ last_return = Operators.CONCAT(256, *last_return) ### Einschränkungen {#state-constraint} -Du kannst Einschränkungen global oder für einen bestimmten Zustand verwenden. +Sie können Einschränkungen global oder für einen bestimmten Zustand verwenden. #### Globale Einschränkung {#state-constraint} -Verwende `m.constrain(constraint)`, um eine globale Einschränkung hinzuzufügen. -Du kannst zum Beispiel einen Vertrag von einer symbolischen Adresse aus aufrufen und diese Adresse auf bestimmte Werte beschränken: +Verwenden Sie `m.constrain(constraint)`, um eine globale Einschränkung hinzuzufügen. +Zum Beispiel können Sie einen Smart Contract von einer symbolischen Adresse aus aufrufen und diese Adresse auf bestimmte Werte beschränken: ```python symbolic_address = m.make_symbolic_value() @@ -462,23 +461,23 @@ m.transaction(caller=user_account, value=0) ``` -#### Zustandsbeschränkung {#state-constraint} +#### Zustandseinschränkung {#state-constraint} -Verwende [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain), um eine Einschränkung zu einem bestimmten Zustand hinzuzufügen. -Dies kann verwendet werden, um den Zustand nach seiner Untersuchung einzuschränken, um eine Eigenschaft darin zu überprüfen. +Verwenden Sie [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain), um einem bestimmten Zustand eine Einschränkung hinzuzufügen. +Dies kann verwendet werden, um den Zustand nach seiner Untersuchung einzuschränken, um eine Eigenschaft daran zu überprüfen. -### Einschränkung prüfen {#checking-constraint} +### Einschränkung überprüfen {#checking-constraint} -Verwende `solver.check(state.constraints)`, um zu erfahren, ob eine Einschränkung noch erfüllbar ist. -Das folgende Beispiel schränkt beispielsweise `symbolic_value` so ein, dass es sich von 65 unterscheidet, und prüft, ob der Zustand noch erfüllbar ist: +Verwenden Sie `solver.check(state.constraints)`, um zu erfahren, ob eine Einschränkung noch machbar ist. +Das Folgende schränkt beispielsweise `symbolic_value` so ein, dass es sich von 65 unterscheidet, und prüft, ob der Zustand noch machbar ist: ```python state.constrain(symbolic_var != 65) if solver.check(state.constraints): - # Zustand ist erfüllbar + # Zustand ist zulässig ``` -### Zusammenfassung: Hinzufügen von Einschränkungen {#summary-adding-constraints} +### Zusammenfassung: Einschränkungen hinzufügen {#summary-adding-constraints} Wenn wir dem vorherigen Code eine Einschränkung hinzufügen, erhalten wir: @@ -501,19 +500,18 @@ contract_account.f(symbolic_var) no_bug_found = True -## Prüfen, ob eine Ausführung mit REVERT oder INVALID endet - +# # Prüfen, ob eine Ausführung mit einem REVERT oder INVALID endet for state in m.terminated_states: last_tx = state.platform.transactions[-1] if last_tx.result in ['REVERT', 'INVALID']: - # wir betrachten den Pfad nicht, in dem a == 65 ist + # wir berücksichtigen den Pfad nicht, bei dem a == 65 ist condition = symbolic_var != 65 if m.generate_testcase(state, name="BugFound", only_if=condition): - print(f'Fehler gefunden, Ergebnisse sind in {m.workspace}') + print(f'Bug found, results are in {m.workspace}') no_bug_found = False if no_bug_found: - print(f'Kein Fehler gefunden') + print(f'No bug found') ``` -Den gesamten obigen Code findest du in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) +Den gesamten obigen Code finden Sie in der Datei [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md index 30b736fbc83..ee98fbd3e13 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -1,28 +1,28 @@ --- -title: So verwenden Sie Slither, um Bugs in Smart Contracts zu finden -description: So verwenden Sie Slither, um automatisch Fehler in Smart Contracts zu finden +title: Wie man Slither verwendet, um Fehler in Smart Contracts zu finden +description: Wie man Slither verwendet, um automatisch Fehler in Smart Contracts zu finden author: Trailofbits lang: de -tags: ["solidity", "smart contracts", "security", "testing"] +tags: ["Solidity", "Smart Contracts", "Sicherheit", "Testen"] skill: advanced -breadcrumb: "Slither" +breadcrumb: Slither published: 2020-06-09 source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither --- -## So verwenden Sie Slither {#how-to-use-slither} +## Wie man Slither verwendet {#how-to-use-slither} -Das Ziel dieses Tutorials ist es zu zeigen, wie Sie Slither verwenden, um automatisch Fehler in Smart Contracts zu finden. +Das Ziel dieses Tutorials ist es zu zeigen, wie man Slither verwendet, um automatisch Fehler in Smart Contracts zu finden. - [Installation](#installation) - [Verwendung der Befehlszeile](#command-line) - [Einführung in die statische Analyse](#static-analysis): Kurze Einführung in die statische Analyse -- [API](#api-basics): Python-API-Beschreibung +- [API](#api-basics): Beschreibung der Python-API ## Installation {#installation} -Slither erfordert Python >= 3.6. Die Installation kann über pip oder Docker erfolgen. +Slither erfordert Python >= 3.6. Es kann über pip oder mit Docker installiert werden. Slither über pip: @@ -34,21 +34,20 @@ Slither über Docker: ```bash docker pull trailofbits/eth-security-toolbox -docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/share trailofbits/eth-security-toolbox ``` -_Der letzte Befehl führt die eth-security-toolbox in einem Docker aus, der Zugriff auf dein aktuelles Verzeichnis hat. Du kannst die Dateien von deinem Host aus ändern und die Tools für die Dateien aus dem Docker ausführen_ +_Der letzte Befehl führt die eth-security-toolbox in einem Docker-Container aus, der Zugriff auf Ihr aktuelles Verzeichnis hat. Sie können die Dateien von Ihrem Host aus ändern und die Tools für die Dateien aus dem Docker-Container heraus ausführen._ -Führe im Docker aus: +Führen Sie innerhalb von Docker Folgendes aus: ```bash -solc-select 0.5.11 -cd /home/trufflecon/ +cd /share ``` -### Ausführen eines Skripts {#running-a-script} +### Ein Skript ausführen {#running-a-script} -So führst du ein Python-Skript mit Python 3 aus: +Um ein Python-Skript mit Python 3 auszuführen: ```bash python3 script.py @@ -56,7 +55,7 @@ python3 script.py ### Befehlszeile {#command-line} -**Befehlszeile versus benutzerdefinierte Skripte.** Slither wird mit einer Reihe von vordefinierten Detektoren geliefert, die viele häufige Fehler finden. Wenn Sie Slither von der Befehlszeile aus aufrufen, werden alle Detektoren ausgeführt, ohne dass detaillierte Kenntnisse der statischen Analyse erforderlich sind: +**Befehlszeile im Vergleich zu benutzerdefinierten Skripten.** Slither wird mit einer Reihe vordefinierter Detektoren geliefert, die viele häufige Fehler finden. Der Aufruf von Slither über die Befehlszeile führt alle Detektoren aus, es sind keine detaillierten Kenntnisse der statischen Analyse erforderlich: ```bash slither project_paths @@ -64,15 +63,15 @@ slither project_paths Zusätzlich zu den Detektoren verfügt Slither über Code-Review-Funktionen durch seine [Printers](https://github.com/crytic/slither#printers) und [Tools](https://github.com/crytic/slither#tools). -Verwenden Sie [crytic.io](https://github.com/crytic), um Zugang zu privaten Detektoren und zur GitHub-Integration zu erhalten. +Verwenden Sie [crytic.io](https://github.com/crytic), um Zugriff auf private Detektoren und die GitHub-Integration zu erhalten. ## Statische Analyse {#static-analysis} -Die Fähigkeiten und das Design des statischen Analyse-Frameworks von Slither wurden in Blog-Beiträgen ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) und einem [wissenschaftlichen Artikel](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf) beschrieben. +Die Funktionen und das Design des statischen Analyse-Frameworks Slither wurden in Blogbeiträgen ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) und einem [wissenschaftlichen Artikel](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf) beschrieben. -Statische Analyse gibt es in verschiedenen Varianten. Ihnen ist wahrscheinlich bewusst, dass Compiler wie [clang](https://clang-analyzer.llvm.org/) und [gcc](https://lwn.net/Articles/806099/) auf diesen Forschungstechniken basieren, aber sie bilden auch die Grundlage für ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) und auf formalen Methoden basierende Werkzeuge wie [Frama-C](https://frama-c.com/) und [Polyspace](https://www.mathworks.com/products/polyspace.html)). +Statische Analyse gibt es in verschiedenen Ausprägungen. Sie wissen wahrscheinlich, dass Compiler wie [clang](https://clang-analyzer.llvm.org/) und [gcc](https://lwn.net/Articles/806099/) auf diesen Forschungstechniken basieren, aber sie untermauern auch Tools wie [Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) und Werkzeuge, die auf formalen Methoden basieren, wie [Frama-C](https://frama-c.com/) und [Polyspace](https://www.mathworks.com/products/polyspace.html). -Wir werden hier nicht erschöpfend auf statische Analysetechniken und Forscher eingehen. Stattdessen konzentrieren wir uns darauf, was nötig ist, um zu verstehen, wie Slither funktioniert, damit Sie es effektiver nutzen können, um Fehler zu finden und den Code zu verstehen. +Wir werden hier nicht erschöpfend auf statische Analysetechniken und Forscher eingehen. Stattdessen konzentrieren wir uns darauf, was nötig ist, um zu verstehen, wie Slither funktioniert, damit Sie es effektiver nutzen können, um Fehler zu finden und Code zu verstehen. - [Code-Darstellung](#code-representation) - [Code-Analyse](#analysis) @@ -80,13 +79,13 @@ Wir werden hier nicht erschöpfend auf statische Analysetechniken und Forscher e ### Code-Darstellung {#code-representation} -Im Gegensatz zu einer dynamischen Analyse, die einen einzelnen Ausführungspfad betrachtet, betrachtet die statische Analyse alle Pfade auf einmal. Dazu stützt es sich auf eine andere Code-Darstellung. Die beiden häufigsten sind der abstrakte Syntaxbaum (AST) und der Kontrollflussgraph (CFG). +Im Gegensatz zu einer dynamischen Analyse, die einen einzelnen Ausführungspfad betrachtet, berücksichtigt die statische Analyse alle Pfade auf einmal. Dazu stützt sie sich auf eine andere Code-Darstellung. Die beiden häufigsten sind der abstrakte Syntaxbaum (Abstract Syntax Tree, AST) und der Kontrollflussgraph (Control Flow Graph, CFG). ### Abstrakte Syntaxbäume (AST) {#abstract-syntax-trees-ast} -ASTs werden jedes Mal verwendet, wenn der Compiler Code parst. Es ist wahrscheinlich die grundlegendste Struktur, auf der statische Analysen durchgeführt werden können. +ASTs werden jedes Mal verwendet, wenn der Compiler Code parst. Es ist wahrscheinlich die grundlegendste Struktur, auf der eine statische Analyse durchgeführt werden kann. -Kurz gesagt, ein AST ist ein strukturierter Baum, in dem normalerweise jedes Blatt eine Variable oder eine Konstante enthält und interne Knoten Operanden oder Kontrollflussoperationen sind. Betrachten Sie den folgenden Code: +Kurz gesagt ist ein AST ein strukturierter Baum, bei dem normalerweise jedes Blatt eine Variable oder eine Konstante enthält und interne Knoten Operanden oder Kontrollflussoperationen sind. Betrachten Sie den folgenden Code: ```solidity function safeAdd(uint a, uint b) pure internal returns(uint){ @@ -97,13 +96,13 @@ function safeAdd(uint a, uint b) pure internal returns(uint){ } ``` -Der entsprechende AST ist hier dargestellt: +Der entsprechende AST wird hier gezeigt: ![AST](./ast.png) Slither verwendet den von solc exportierten AST. -Obwohl der AST einfach zu erstellen ist, handelt es sich um eine verschachtelte Struktur. Manchmal ist dies nicht am einfachsten zu analysieren. Um beispielsweise die vom Ausdruck `a + b <= a` verwendeten Operationen zu identifizieren, müssen Sie zuerst `<=` und dann `+` analysieren. Ein gängiger Ansatz ist die Verwendung des sogenannten Visitor-Patterns, das rekursiv durch den Baum navigiert. Slither enthält einen generischen Visitor in [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). +Obwohl er einfach zu erstellen ist, ist der AST eine verschachtelte Struktur. Manchmal ist dies nicht am einfachsten zu analysieren. Um beispielsweise die vom Ausdruck `a + b <= a` verwendeten Operationen zu identifizieren, müssen Sie zuerst `<=` und dann `+` analysieren. Ein gängiger Ansatz ist die Verwendung des sogenannten Visitor-Patterns, das rekursiv durch den Baum navigiert. Slither enthält einen generischen Visitor in [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). Der folgende Code verwendet `ExpressionVisitor`, um zu erkennen, ob der Ausdruck eine Addition enthält: @@ -121,36 +120,36 @@ class HasAddition(ExpressionVisitor): self._result = True visitor = HasAddition(expression) # expression ist der zu testende Ausdruck -print(f'Der Ausdruck {expression} enthält eine Addition: {visitor.result()}') +print(f'The expression {expression} has a addition: {visitor.result()}') ``` ### Kontrollflussgraph (CFG) {#control-flow-graph-cfg} -Die zweithäufigste Code-Darstellung ist der Kontrollflussgraph (CFG). Wie der Name schon sagt, handelt es sich um eine graphbasierte Darstellung, die alle Ausführungspfade aufzeigt. Jeder Knoten enthält eine oder mehrere Anweisungen. Kanten im Graphen stellen die Kontrollflussoperationen dar (if/then/else, Schleife usw.). Der CFG unseres vorherigen Beispiels lautet: +Die zweithäufigste Code-Darstellung ist der Kontrollflussgraph (CFG). Wie der Name schon sagt, handelt es sich um eine graphenbasierte Darstellung, die alle Ausführungspfade aufzeigt. Jeder Knoten enthält eine oder mehrere Anweisungen. Kanten im Graphen stellen die Kontrollflussoperationen dar (if/then/else, Schleife usw.). Der CFG unseres vorherigen Beispiels ist: ![CFG](./cfg.png) Der CFG ist die Darstellung, auf der die meisten Analysen aufbauen. -Es gibt viele andere Code-Darstellungen. Jede Darstellung hat Vor- und Nachteile, je nachdem, welche Analyse Sie durchführen möchten. +Es existieren viele weitere Code-Darstellungen. Jede Darstellung hat Vor- und Nachteile, je nachdem, welche Analyse Sie durchführen möchten. ### Analyse {#analysis} Die einfachste Art von Analysen, die Sie mit Slither durchführen können, sind syntaktische Analysen. -### Syntaktische Analyse {#syntax-analysis} +### Syntaxanalyse {#syntax-analysis} -Slither kann durch die verschiedenen Komponenten des Codes und deren Darstellung navigieren, um Inkonsistenzen und Fehler mit einem Ansatz zu finden, der dem Pattern-Matching ähnelt. +Slither kann durch die verschiedenen Komponenten des Codes und deren Darstellung navigieren, um Inkonsistenzen und Fehler mithilfe eines Mustererkennungs-ähnlichen Ansatzes zu finden. -Die folgenden Detektoren suchen beispielsweise nach syntaxbezogenen Problemen: +Zum Beispiel suchen die folgenden Detektoren nach syntaxbezogenen Problemen: -- [Zustandsvariablen-Shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): iteriert über alle Zustandsvariablen und prüft, ob eine davon eine Variable aus einem geerbten Vertrag verschattet ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) +- [Shadowing von Zustandsvariablen](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): Iteriert über alle Zustandsvariablen und prüft, ob eine davon eine Variable aus einem geerbten Vertrag überschattet ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) -- [Inkorrektes ERC20-Interface](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): sucht nach inkorrekten ERC20-Funktionssignaturen ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) +- [Falsche ERC20-Schnittstelle](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): Sucht nach falschen ERC20-Funktionssignaturen ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) ### Semantische Analyse {#semantic-analysis} -Im Gegensatz zur Syntaxanalyse geht eine semantische Analyse tiefer und analysiert die "Bedeutung" des Codes. Diese Familie umfasst einige allgemeine Arten von Analysen. Sie führen zu aussagekräftigeren und nützlicheren Ergebnissen, sind aber auch komplexer zu schreiben. +Im Gegensatz zur Syntaxanalyse geht eine semantische Analyse tiefer und analysiert die „Bedeutung“ des Codes. Diese Familie umfasst einige breit gefächerte Arten von Analysen. Sie führen zu leistungsfähigeren und nützlicheren Ergebnissen, sind aber auch komplexer zu schreiben. Semantische Analysen werden für die fortschrittlichsten Schwachstellenerkennungen verwendet. @@ -158,77 +157,77 @@ Semantische Analysen werden für die fortschrittlichsten Schwachstellenerkennung Eine Variable `variable_a` gilt als datenabhängig von `variable_b`, wenn es einen Pfad gibt, auf dem der Wert von `variable_a` durch `variable_b` beeinflusst wird. -Im folgenden Code ist `variable_a` von `variable_b` abhängig: +Im folgenden Code ist `variable_a` abhängig von `variable_b`: ```solidity // ... variable_a = variable_b + 1; ``` -Slither verfügt über integrierte [Datenabhängigkeits](https://github.com/crytic/slither/wiki/data-dependency)-Fähigkeiten, dank seiner Zwischendarstellung (die in einem späteren Abschnitt besprochen wird). +Slither verfügt dank seiner Zwischendarstellung (die in einem späteren Abschnitt besprochen wird) über integrierte Funktionen zur [Datenabhängigkeit](https://github.com/crytic/slither/wiki/data-dependency). -Ein Beispiel für die Verwendung der Datenabhängigkeit findet sich im [Detektor für gefährliche strikte Gleichheit](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Hier sucht Slither nach einem strikten Gleichheitsvergleich mit einem gefährlichen Wert ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)) und informiert den Benutzer, dass er `>=` oder `<=` anstelle von `==` verwenden sollte, um zu verhindern, dass ein Angreifer den Vertrag in eine Falle lockt. Unter anderem wird der Detektor den Rückgabewert eines Aufrufs von `balanceOf(address)` ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)) als gefährlich einstufen und die Datenabhängigkeits-Engine verwenden, um seine Verwendung zu verfolgen. +Ein Beispiel für die Nutzung von Datenabhängigkeiten findet sich im [Detektor für gefährliche strikte Gleichheit](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Hier sucht Slither nach einem strikten Gleichheitsvergleich mit einem gefährlichen Wert ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)) und informiert den Benutzer, dass er `>=` oder `<=` anstelle von `==` verwenden sollte, um zu verhindern, dass ein Angreifer den Vertrag in eine Falle lockt. Unter anderem betrachtet der Detektor den Rückgabewert eines Aufrufs von `balanceOf(address)` als gefährlich ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)) und verwendet die Datenabhängigkeits-Engine, um dessen Verwendung zu verfolgen. #### Fixpunktberechnung {#fixed-point-computation} -Wenn Ihre Analyse durch den CFG navigiert und den Kanten folgt, werden Sie wahrscheinlich bereits besuchte Knoten sehen. Wenn zum Beispiel eine Schleife wie unten dargestellt ist: +Wenn Ihre Analyse durch den CFG navigiert und den Kanten folgt, werden Sie wahrscheinlich bereits besuchte Knoten sehen. Zum Beispiel, wenn eine Schleife wie unten gezeigt vorliegt: ```solidity -for(uint i; i < range; ++){ +for(uint i; i < range; ++i){ variable_a += 1 } ``` -Ihre Analyse muss wissen, wann sie anhalten muss. Hier gibt es zwei Hauptstrategien: (1) jeden Knoten eine endliche Anzahl von Malen durchlaufen, (2) einen sogenannten _Fixpunkt_ berechnen. Ein Fixpunkt bedeutet im Grunde, dass die Analyse dieses Knotens keine aussagekräftigen Informationen mehr liefert. +Ihre Analyse muss wissen, wann sie anhalten soll. Hier gibt es zwei Hauptstrategien: (1) eine endliche Anzahl von Malen über jeden Knoten iterieren, (2) einen sogenannten _Fixpunkt_ berechnen. Ein Fixpunkt bedeutet im Grunde, dass die Analyse dieses Knotens keine aussagekräftigen Informationen mehr liefert. -Ein Beispiel für die Verwendung eines Fixpunkts findet sich in den Reentrancy-Detektoren: Slither untersucht die Knoten und sucht nach externen Aufrufen sowie Schreib- und Lesezugriffen auf den Speicher. Sobald ein Fixpunkt erreicht ist ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), wird die Untersuchung gestoppt und die Ergebnisse werden anhand verschiedener Reentrancy-Muster ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)) analysiert, um festzustellen, ob eine Reentrancy vorliegt. +Ein Beispiel für die Verwendung eines Fixpunkts findet sich in den Reentrancy-Detektoren: Slither untersucht die Knoten und sucht nach externen Aufrufen sowie Schreib- und Lesezugriffen auf den Speicher. Sobald ein Fixpunkt erreicht ist ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), stoppt es die Untersuchung und analysiert die Ergebnisse, um anhand verschiedener Reentrancy-Muster zu prüfen, ob eine Reentrancy vorliegt ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)). -Das Schreiben von Analysen mit effizienter Fixpunktberechnung erfordert ein gutes Verständnis dafür, wie die Analyse ihre Informationen propagiert. +Das Schreiben von Analysen unter Verwendung einer effizienten Fixpunktberechnung erfordert ein gutes Verständnis dafür, wie die Analyse ihre Informationen weitergibt. ### Zwischendarstellung {#intermediate-representation} -Eine Zwischendarstellung (Intermediate Representation, IR) ist eine Sprache, die sich besser für die statische Analyse eignen soll als die ursprüngliche. Slither übersetzt Solidity in seine eigene IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). +Eine Zwischendarstellung (Intermediate Representation, IR) ist eine Sprache, die für die statische Analyse besser geeignet sein soll als die Originalsprache. Slither übersetzt Solidity in seine eigene IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). -Das Verständnis von SlithIR ist nicht notwendig, wenn Sie nur einfache Prüfungen schreiben wollen. Es wird sich jedoch als nützlich erweisen, wenn Sie vorhaben, fortgeschrittene semantische Analysen zu schreiben. Die [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir)- und [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa)-Printers helfen Ihnen zu verstehen, wie der Code übersetzt wird. +Das Verständnis von SlithIR ist nicht erforderlich, wenn Sie nur grundlegende Prüfungen schreiben möchten. Es ist jedoch nützlich, wenn Sie planen, fortgeschrittene semantische Analysen zu schreiben. Die [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir)- und [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa)-Printers helfen Ihnen zu verstehen, wie der Code übersetzt wird. ## API-Grundlagen {#api-basics} -Slither hat eine API, mit der Sie die grundlegenden Attribute des Vertrags und seiner Funktionen untersuchen können. +Slither verfügt über eine API, mit der Sie grundlegende Attribute des Vertrags und seiner Funktionen untersuchen können. -So laden Sie eine Codebasis: +Um eine Codebasis zu laden: ```python -from slither import Slither +from slither.slither import Slither slither = Slither('/path/to/project') ``` -### Untersuchen von Verträgen und Funktionen {#exploring-contracts-and-functions} +### Verträge und Funktionen untersuchen {#exploring-contracts-and-functions} Ein `Slither`-Objekt hat: - `contracts (list(Contract)`: Liste von Verträgen -- `contracts_derived (list(Contract)`: Liste von Verträgen, die nicht von einem anderen Vertrag geerbt werden (Teilmenge von `contracts`) +- `contracts_derived (list(Contract)`: Liste von Verträgen, die nicht von einem anderen Vertrag geerbt werden (Teilmenge von Verträgen) - `get_contract_from_name (str)`: Gibt einen Vertrag anhand seines Namens zurück Ein `Contract`-Objekt hat: - `name (str)`: Name des Vertrags - `functions (list(Function))`: Liste von Funktionen -- `modifiers (list(Modifier))`: Liste von Modifikatoren -- `all_functions_called (list(Function/Modifier))`: Liste aller internen Funktionen, die vom Vertrag aus erreichbar sind +- `modifiers (list(Modifier))`: Liste von Funktionen +- `all_functions_called (list(Function/Modifier))`: Liste aller internen Funktionen, die durch den Vertrag erreichbar sind - `inheritance (list(Contract))`: Liste der geerbten Verträge - `get_function_from_signature (str)`: Gibt eine Funktion anhand ihrer Signatur zurück - `get_modifier_from_signature (str)`: Gibt einen Modifikator anhand seiner Signatur zurück - `get_state_variable_from_name (str)`: Gibt eine Zustandsvariable anhand ihres Namens zurück -Ein `Function`- oder ein `Modifier`-Objekt hat: +Ein `Function`- oder `Modifier`-Objekt hat: - `name (str)`: Name der Funktion - `contract (contract)`: der Vertrag, in dem die Funktion deklariert ist -- `nodes (list(Node))`: Liste der Nodes, aus denen der CFG der Funktion/des Modifikators besteht +- `nodes (list(Node))`: Liste der Knoten, aus denen sich der CFG der Funktion/des Modifikators zusammensetzt - `entry_point (Node)`: Einstiegspunkt des CFG - `variables_read (list(Variable))`: Liste der gelesenen Variablen - `variables_written (list(Variable))`: Liste der geschriebenen Variablen -- `state_variables_read (list(StateVariable))`: Liste der gelesenen Zustandsvariablen (Teilmenge von `variables_read`) -- `state_variables_written (list(StateVariable))`: Liste der geschriebenen Zustandsvariablen (Teilmenge von `variables_written`) +- `state_variables_read (list(StateVariable))`: Liste der gelesenen Zustandsvariablen (Teilmenge von variables_read) +- `state_variables_written (list(StateVariable))`: Liste der geschriebenen Zustandsvariablen (Teilmenge von variables_written) \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md index 90f666d322f..c0465856c55 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -1,21 +1,21 @@ --- -title: Wie Sie Tellor als Ihr Orakel einrichten -description: "Eine Anleitung für den Einstieg in die Integration des Tellor-Orakels in Ihr Protokoll" +title: Wie man Tellor als sein Orakel einrichtet +description: "Ein Leitfaden für den Einstieg in die Integration des Tellor-Orakels in Ihr Protokoll" author: "Tellor" lang: de -tags: ["solidity", "smart contracts", "oracles"] +tags: ["Solidity", "Smart Contracts", "Orakel"] skill: beginner -breadcrumb: "Tellor-Orakel" +breadcrumb: Tellor-Orakel published: 2021-06-29 source: Tellor Docs sourceUrl: https://docs.tellor.io/tellor/ --- -Quizfrage: Ihr Protokoll ist fast fertig, aber es braucht ein Orakel, um Zugang zu Offchain-Daten zu erhalten... Was tun Sie? +Kurzes Quiz: Ihr Protokoll ist fast fertig, aber es benötigt ein Orakel, um auf Off-Chain-Daten zuzugreifen... Was tun Sie? -## (Optionale) Voraussetzungen {#soft-prerequisites} +## (Weiche) Voraussetzungen {#soft-prerequisites} -Dieser Beitrag soll den Zugriff auf einen Orakel-Feed so einfach und unkompliziert wie möglich gestalten. Davon abgesehen gehen wir von den folgenden Programmierkenntnissen aus, um uns auf den Orakel-Aspekt zu konzentrieren. +Dieser Beitrag zielt darauf ab, den Zugriff auf einen Orakel-Feed so einfach und unkompliziert wie möglich zu gestalten. Dennoch gehen wir von den folgenden Programmierkenntnissen aus, um uns auf den Orakel-Aspekt konzentrieren zu können. Annahmen: @@ -23,33 +23,33 @@ Annahmen: - Sie haben npm installiert - Sie wissen, wie man npm zur Verwaltung von Abhängigkeiten verwendet -Tellor ist ein live und quelloffenes Orakel, das zur Implementierung bereit ist. Diese Anleitung für Anfänger soll zeigen, wie einfach man mit Tellor loslegen kann, um Ihr Projekt mit einem vollständig dezentralen und zensurresistenten Orakel auszustatten. +Tellor ist ein aktives und quelloffenes Orakel, das zur Implementierung bereitsteht. Dieser Anfängerleitfaden soll zeigen, wie einfach es ist, Tellor in Betrieb zu nehmen und Ihr Projekt mit einem vollständig dezentralisierten und zensurresistenten Orakel auszustatten. -## Überblick {#overview} +## Übersicht {#overview} -Tellor ist ein Orakelsystem, bei dem Parteien den Wert eines Offchain-Datenpunkts (z. B. BTC/USD) anfordern können und Reporter darum konkurrieren, diesen Wert einer Onchain-Datenbank hinzuzufügen, auf die alle Smart Contracts von Ethereum zugreifen können. Die Eingaben in diese Datenbank werden durch ein Netzwerk von gestakten Reportern gesichert. Tellor nutzt krypto-ökonomische Anreizmechanismen, die ehrliche Dateneinreichungen von Reportern belohnen und schlechte Akteure durch die Emission des Tellor-Tokens, Tributes (TRB), und einen Streitbeilegungsmechanismus bestrafen. +Tellor ist ein Orakel-System, bei dem Parteien den Wert eines Off-Chain-Datenpunkts (z. B. BTC/USD) anfragen können und Reporter darum konkurrieren, diesen Wert einer Datenbank auf der Blockchain hinzuzufügen, die für alle Ethereum-Smart-Contracts zugänglich ist. Die Eingaben in diese Datenbank werden durch ein Netzwerk von Reportern gesichert, die einen Einsatz hinterlegt haben. Tellor nutzt kryptoökonomische Anreizmechanismen, die ehrliche Datenübermittlungen von Reportern belohnen und böswillige Akteure durch die Emission von Tellors Token, Tributes (TRB), sowie einen Streitbeilegungsmechanismus bestrafen. -In diesem Tutorial werden wir Folgendes behandeln: +In diesem Tutorial behandeln wir Folgendes: -- Einrichten des anfänglichen Toolkits, das Sie für den Start benötigen. +- Einrichtung des anfänglichen Toolkits, das Sie für den Start benötigen. - Durchgehen eines einfachen Beispiels. -- Auflisten der Testnet-Adressen von Netzwerken, auf denen Sie Tellor derzeit testen können. +- Auflistung von Testnet-Adressen von Netzwerken, auf denen Sie Tellor derzeit testen können. ## UsingTellor {#usingtellor} -Als Erstes sollten Sie die grundlegenden Tools installieren, die für die Verwendung von Tellor als Ihr Orakel erforderlich sind. Verwenden Sie [dieses Paket](https://github.com/tellor-io/usingtellor), um die Tellor User Contracts zu installieren: +Als Erstes sollten Sie die grundlegenden Tools installieren, die für die Nutzung von Tellor als Ihr Orakel erforderlich sind. Verwenden Sie [dieses Paket](https://github.com/tellor-io/usingtellor), um die Tellor User Contracts zu installieren: `npm install usingtellor` -Nach der Installation können Ihre Verträge die Funktionen aus dem Vertrag „UsingTellor“ erben. +Sobald dies installiert ist, können Ihre Verträge die Funktionen aus dem Vertrag „UsingTellor“ erben. -Großartig! Jetzt, wo Sie die Tools bereit haben, lassen Sie uns eine einfache Übung durchgehen, bei der wir den Bitcoin-Preis abrufen: +Großartig! Da Sie nun die Tools bereit haben, lassen Sie uns eine einfache Übung durchgehen, bei der wir den Bitcoin-Preis abrufen: ### BTC/USD-Beispiel {#btcusd-example} Erben Sie den UsingTellor-Vertrag und übergeben Sie die Tellor-Adresse als Konstruktorargument: -Hier ein Beispiel: +Hier ist ein Beispiel: ```solidity import "usingtellor/contracts/UsingTellor.sol"; @@ -57,7 +57,7 @@ import "usingtellor/contracts/UsingTellor.sol"; contract PriceContract is UsingTellor { uint256 public btcPrice; - //Dieser Vertrag hat jetzt Zugriff auf alle Funktionen in UsingTellor + // Dieser Contract hat nun Zugriff auf alle Funktionen in UsingTellor constructor(address payable _tellorAddress) UsingTellor(_tellorAddress) public {} @@ -77,6 +77,6 @@ function setBtcPrice() public { Eine vollständige Liste der Vertragsadressen finden Sie [hier](https://docs.tellor.io/tellor/the-basics/contracts-reference). -Zur Vereinfachung der Nutzung wird das UsingTellor-Repo mit einer Version des [Tellor Playground](https://github.com/tellor-io/TellorPlayground)-Vertrags für eine einfachere Integration geliefert. Eine Liste hilfreicher Funktionen finden Sie [hier](https://github.com/tellor-io/sampleUsingTellor#tellor-playground). +Zur einfacheren Nutzung enthält das UsingTellor-Repo eine Version des [Tellor Playground](https://github.com/tellor-io/TellorPlayground)-Vertrags für eine leichtere Integration. Eine Liste hilfreicher Funktionen finden Sie [hier](https://github.com/tellor-io/sampleUsingTellor#tellor-playground). -Für eine robustere Implementierung des Tellor-Orakels sehen Sie sich die vollständige Liste der verfügbaren Funktionen [hier](https://github.com/tellor-io/usingtellor/blob/master/README.md) an. +Für eine robustere Implementierung des Tellor-Orakels sehen Sie sich die vollständige Liste der verfügbaren Funktionen [hier](https://github.com/tellor-io/usingtellor/blob/master/README.md) an. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md index be7efedb5f4..6255300c388 100644 --- a/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md @@ -1,34 +1,34 @@ --- -title: So zeigen Sie Ihr NFT in Ihrem Wallet an (Teil 3/3 der NFT-Tutorialreihe) -description: "Dieses Tutorial beschreibt, wie Sie ein bestehendes NFT auf MetaMask anzeigen können!" +title: So zeigen Sie Ihr NFT in Ihrer Wallet an (Teil 3/3 der NFT-Tutorial-Reihe) +description: "Dieses Tutorial beschreibt, wie Sie ein bestehendes NFT in MetaMask anzeigen können!" author: "Sumi Mudgil" tags: ["ERC-721", "Alchemy", "Solidity"] skill: beginner -breadcrumb: "NFT im Wallet anzeigen" +breadcrumb: NFT in Wallet anzeigen lang: de published: 2021-04-22 --- -Dieses Tutorial ist Teil 3/3 der NFT-Tutorialreihe, in dem wir unser neu geprägtes NFT betrachten. Sie können dieses allgemeine Tutorial jedoch für jeden ERC-721-Token mit MetaMask verwenden, einschließlich auf dem Mainnet oder einem beliebigen Testnet. Wenn Sie lernen möchten, wie Sie Ihr eigenes NFT auf Ethereum prägen können, sollten Sie sich [Teil 1 zum Schreiben und Bereitstellen eines NFT-Smart-Contracts](/developers/tutorials/how-to-write-and-deploy-an-nft) ansehen! +Dieses Tutorial ist Teil 3/3 der NFT-Tutorial-Reihe, in dem wir unser neu geprägtes NFT anzeigen. Sie können dieses allgemeine Tutorial jedoch für jeden ERC-721-Token verwenden, der MetaMask nutzt, einschließlich im Mainnet oder jedem Testnet. Wenn Sie lernen möchten, wie Sie Ihr eigenes NFT auf Ethereum prägen, sollten Sie sich [Teil 1: Wie man einen NFT-Smart-Contract schreibt und bereitstellt](/developers/tutorials/how-to-write-and-deploy-an-nft) ansehen! -Glückwunsch! Sie haben es zum kürzesten und einfachsten Teil unserer NFT-Tutorialreihe geschafft – wie Sie Ihr frisch geprägtes NFT in einer virtuellen Wallet anzeigen können. Für dieses Beispiel verwenden wir MetaMask, da wir es bereits in den beiden vorangegangenen Teilen verwendet haben. +Herzlichen Glückwunsch! Sie haben es zum kürzesten und einfachsten Teil unserer NFT-Tutorial-Reihe geschafft – wie Sie Ihr frisch geprägtes NFT in einer virtuellen Wallet anzeigen. Wir werden für dieses Beispiel MetaMask verwenden, da wir dies auch in den vorherigen zwei Teilen verwendet haben. -Voraussetzung ist, dass Sie MetaMask auf Ihrem Mobilgerät installiert haben und dass die App das Konto enthält, auf das Sie Ihr NFT geprägt haben – Sie können die App kostenlos für [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) oder [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US) herunterladen. +Als Voraussetzung sollten Sie MetaMask bereits auf Ihrem Mobilgerät installiert haben und es sollte das Konto enthalten, auf das Sie Ihr NFT geprägt haben – Sie können die App kostenlos für [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) oder [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US) herunterladen. -## Schritt 1: Netzwerk auf Sepolia einstellen {#set-network-to-sepolia} +## Schritt 1: Stellen Sie Ihr Netzwerk auf Sepolia ein {#set-network-to-sepolia} -Drücken Sie oben in der App auf die Schaltfläche "Wallet", woraufhin Sie aufgefordert werden, ein Netzwerk auszuwählen. Da unser NFT auf dem Sepolia-Netzwerk geprägt wurde, sollten Sie Sepolia als Ihr Netzwerk auswählen. +Drücken Sie oben in der App auf die Schaltfläche „Wallet“, woraufhin Sie aufgefordert werden, ein Netzwerk auszuwählen. Da unser NFT im Sepolia-Netzwerk geprägt wurde, sollten Sie Sepolia als Ihr Netzwerk auswählen. -![So stellen Sie Sepolia als Ihr Netzwerk auf MetaMask Mobile ein](./goerliMetamask.gif) +![Wie man Sepolia als Netzwerk in MetaMask Mobile einstellt](./goerliMetamask.gif) -## Schritt 2: Ihr Sammelobjekt zu MetaMask hinzufügen {#add-nft-to-metamask} +## Schritt 2: Fügen Sie Ihr Sammlerstück zu MetaMask hinzu {#add-nft-to-metamask} -Sobald Sie sich im Sepolia-Netzwerk befinden, wählen Sie rechts die Registerkarte "Collectibles" aus und fügen Sie die NFT-Smart-Contract-Adresse und die ERC-721-Token-ID Ihres NFT hinzu. Diese finden Sie auf Etherscan über den Transaktions-Hash Ihres in Teil II unseres Tutorials bereitgestellten NFT. +Sobald Sie sich im Sepolia-Netzwerk befinden, wählen Sie rechts die Registerkarte „Collectibles“ (Sammlerstücke) aus und fügen Sie die Smart-Contract-Adresse des NFTs sowie die ERC-721-Token-ID Ihres NFTs hinzu – diese sollten Sie auf Etherscan anhand des Transaktions-Hashs Ihres in Teil II unseres Tutorials bereitgestellten NFTs finden können. -![So finden Sie Ihren Transaktions-Hash und Ihre ERC-721-Token-ID](./findNFTEtherscan.png) +![Wie Sie Ihren Transaktions-Hash und Ihre ERC-721-Token-ID finden](./findNFTEtherscan.png) -Sie müssen möglicherweise ein paar Mal aktualisieren, um Ihr NFT zu sehen – aber es wird da sein ! +Möglicherweise müssen Sie ein paar Mal aktualisieren, um Ihr NFT anzuzeigen – aber es wird da sein ! -![So laden Sie Ihr NFT auf MetaMask hoch](./findNFTMetamask.gif) +![Wie Sie Ihr NFT in MetaMask hochladen](./findNFTMetamask.gif) -Glückwunsch! Sie haben erfolgreich ein NFT geprägt und können es jetzt ansehen! Wir können es kaum erwarten zu sehen, wie Sie die NFT-Welt im Sturm erobern werden! +Herzlichen Glückwunsch! Sie haben erfolgreich ein NFT geprägt und können es nun anzeigen! Wir können es kaum erwarten zu sehen, wie Sie die NFT-Welt im Sturm erobern werden! \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index c63685df5b3..c5b265064a1 100644 --- a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -1,89 +1,83 @@ --- -title: "So erstellen und veröffentlichen Sie einen NFT (Teil 1/3 der NFT-Tutorial-Reihe)" -description: "Dieses Tutorial ist Teil 1 einer Serie über NFTs, die Ihnen Schritt für Schritt zeigt, wie Sie einen Non Fungible Token (ERC-721 Token) Smart Contract mit Ethereum und Inter Planetary File System (IPFS) erstellen und veröffentlichen." +title: Wie man einen NFT schreibt und bereitstellt (Teil 1/3 der NFT-Tutorial-Reihe) +description: "Dieses Tutorial ist Teil 1 einer Serie über NFTs, die Sie Schritt für Schritt durch das Schreiben und Bereitstellen eines Smart Contracts für einen nicht-fungiblen Token (ERC-721-Token) unter Verwendung von Ethereum und dem Inter Planetary File System (IPFS) führt." author: "Sumi Mudgil" -tags: ["ERC-721", "Alchemy", "Solidity", "smart contracts"] +tags: ["ERC-721", "Alchemy", "Solidity", "Smart Contracts"] skill: beginner -breadcrumb: "NFT erstellen und deployen" +breadcrumb: NFT schreiben und bereitstellen lang: de published: 2021-04-22 --- -Da NFTs die Blockchain ins Rampenlicht der Öffentlichkeit rücken, ist dies eine hervorragende Gelegenheit, den Hype selbst zu verstehen, indem Sie Ihren eigenen NFT-Vertrag (ERC-721-Token) auf der Ethereum-Blockchain veröffentlichen! +Da NFTs die Blockchain in den Fokus der Öffentlichkeit rücken, ist jetzt eine hervorragende Gelegenheit, den Hype selbst zu verstehen, indem Sie Ihren eigenen NFT-Vertrag (ERC-721-Token) auf der Ethereum-Blockchain veröffentlichen! -Alchemy ist sehr stolz darauf, die größten Namen im NFT-Bereich zu unterstützen, darunter Makersplace (kürzlich wurde ein Rekordverkauf digitaler Kunstwerke bei Christie's für 69 Millionen USD verzeichnet), Dapper Labs (Entwickler von NBA Top Shot & Crypto Kitties), OpenSea (der weltweit größte NFT-Marktplatz), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable und viele mehr. +Alchemy ist extrem stolz darauf, die größten Namen im NFT-Bereich zu unterstützen, darunter Makersplace (stellte kürzlich bei Christie's einen Rekord für den Verkauf digitaler Kunstwerke in Höhe von 69 Millionen US-Dollar auf), Dapper Labs (Schöpfer von NBA Top Shot & Crypto Kitties), OpenSea (der weltweit größte NFT-Marktplatz), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable und mehr. -In diesem Tutorial führen wir Sie durch die Erstellung und Bereitstellung eines ERC-721-Smart-Contracts im Sepolia-Testnet unter Verwendung von [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) und [Alchemy](https://alchemy.com/signup/eth) (keine Sorge, wenn Sie noch nicht verstehen, was das alles bedeutet – wir werden es erklären!). +In diesem Tutorial werden wir die Erstellung und Bereitstellung eines ERC-721 Smart Contracts im Sepolia-Testnet unter Verwendung von [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) und [Alchemy](https://alchemy.com/signup/eth) durchgehen (keine Sorge, wenn Sie noch nicht verstehen, was das alles bedeutet – wir werden es erklären!). -In Teil 2 dieses Tutorials erläutern wir, wie Sie mit diesem Smart Contract einen NFT prägen können, in Teil 3 wird behandelt, wie Sie Ihren NFT auf MetaMask anzeigen können. +In Teil 2 dieses Tutorials werden wir durchgehen, wie wir unseren Smart Contract verwenden können, um einen NFT zu prägen, und in Teil 3 werden wir erklären, wie Sie Ihren NFT in MetaMask anzeigen können. -Wenn Sie an irgendeiner Stelle Fragen haben, können Sie sich natürlich jederzeit im [Alchemy Discord](https://discord.gg/gWuC7zB) melden oder die [NFT-API-Dokumentation von Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) besuchen! +Und natürlich, wenn Sie an irgendeinem Punkt Fragen haben, zögern Sie nicht, sich im [Alchemy Discord](https://discord.gg/gWuC7zB) zu melden oder die [NFT-API-Dokumentation von Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) zu besuchen! ## Schritt 1: Mit dem Ethereum-Netzwerk verbinden {#connect-to-ethereum} -Es gibt eine Reihe von Möglichkeiten, Anfragen an die Ethereum-Blockchain zu stellen, aber der Einfachheit halber verwenden wir ein kostenloses Konto bei [Alchemy](https://alchemy.com/signup/eth), einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne unsere eigenen Nodes betreiben zu müssen. +Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Blockchain zu stellen, aber um es einfach zu machen, verwenden wir ein kostenloses Konto bei [Alchemy](https://alchemy.com/signup/eth), einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne unsere eigenen Blockchain-Knoten betreiben zu müssen. -In diesem Tutorial werden wir auch die Alchemy-Entwicklertools für die Überwachung und Analyse nutzen, um zu verstehen, was sich hinter unserer Smart-Contract-Bereitstellung verbirgt. Wenn Sie noch kein Alchemy-Konto haben, können Sie sich [hier](https://alchemy.com/signup/eth) kostenlos anmelden. +In diesem Tutorial werden wir auch die Entwicklertools von Alchemy für Überwachung und Analysen nutzen, 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](https://alchemy.com/signup/eth) kostenlos anmelden. -## Schritt 2: Ihre App (und Ihren API-Schlüssel) erstellen {#make-api-key} +## Schritt 2: Erstellen Sie Ihre App (und Ihren API-Schlüssel) {#make-api-key} -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. Sehen Sie sich [diesen Leitfaden](https://docs.alchemyapi.io/guides/choosing-a-network) an, wenn Sie mehr über Testnetze erfahren möchten. +Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren, indem Sie eine App erstellen. Dies ermöglicht es uns, Anfragen an das Sepolia-Testnet zu stellen. Schauen Sie sich [diesen Leitfaden](https://docs.alchemyapi.io/guides/choosing-a-network) an, wenn Sie mehr über Testnets erfahren möchten. -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 zur Seite „Create App“ in Ihrem Alchemy-Dashboard, indem Sie mit der Maus über „Apps“ in der Navigationsleiste fahren und auf „Create App“ klicken. ![Erstellen Sie Ihre App](./create-your-app.png) -2. Benennen Sie Ihre App (wir haben „Mein erster NFT!“ gewählt), geben Sie eine kurze Beschreibung an, wählen Sie „Ethereum“ als Chain und „Sepolia“ als Ihr Netzwerk. Seit The Merge sind die anderen Testnetze veraltet. +2. Benennen Sie Ihre App (wir haben „My First NFT!“ gewählt), geben Sie eine kurze Beschreibung ein, wählen Sie „Ethereum“ für die Chain und „Sepolia“ für Ihr Netzwerk. Seit dem Merge sind die anderen Testnets veraltet. -![Ihre App konfigurieren und veröffentlichen](./alchemy-explorer-sepolia.png) +![Konfigurieren und veröffentlichen Sie Ihre App](./alchemy-explorer-sepolia.png) -3. Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen. +3. Klicken Sie auf „Create app“ und das war's! Ihre App sollte in der Tabelle unten erscheinen. -## Schritt 3: Ethereum-Konto (Adresse) erstellen {#create-eth-address} +## Schritt 3: Erstellen Sie ein Ethereum-Konto (Adresse) {#create-eth-address} -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. 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. +Wir benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. Für dieses Tutorial verwenden wir MetaMask, ein virtuelles Wallet im Browser, das zur Verwaltung Ihrer Ethereum-Kontoadresse verwendet wird. Wenn Sie mehr darüber verstehen möchten, wie Transaktionen auf Ethereum funktionieren, schauen Sie sich [diese Seite](/developers/docs/transactions/) der Ethereum Foundation an. -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 „Sepolia Test Network“ wechseln (damit wir nicht mit echtem Geld arbeiten). +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 „Sepolia Test Network“ wechseln (damit wir nicht mit echtem Geld hantieren). -![Sepolia als Ihr Netzwerk festlegen](./metamask-goerli.png) +![Legen Sie Sepolia als Ihr Netzwerk fest](./metamask-goerli.png) -## Schritt 4: Ether von einem Faucet hinzufügen {#step-4-add-ether-from-a-faucet} +## Schritt 4: Fügen Sie Ether aus einem Faucet hinzu {#step-4-add-ether-from-a-faucet} -Um unseren Smart Contract in das Testnetzwerk integrieren zu können, benötigen wir ein paar Fake-ETH. Um ETH zu erhalten, können Sie zum von Alchemy gehosteten [Sepolia Faucet](https://sepoliafaucet.com/) gehen, sich anmelden, Ihre Kontoadresse eingeben und auf „Send Me ETH“ klicken. Sie sollten kurz darauf ETH in Ihrem MetaMask-Konto sehen. +Um unseren Smart Contract im Testnet bereitzustellen, benötigen wir etwas falsches ETH. Um ETH zu erhalten, können Sie zum [Sepolia Faucet](https://sepoliafaucet.com/) gehen, das von Alchemy gehostet wird, sich anmelden, Ihre Kontoadresse eingeben und auf „Send Me ETH“ klicken. Sie sollten kurz darauf ETH in Ihrem MetaMask-Konto sehen! -## Schritt 5: Kontostand überprüfen {#check-balance} +## Schritt 5: Überprüfen Sie Ihr Guthaben {#check-balance} -Um zu überprüfen, ob unser Guthaben vorhanden ist, stellen 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). 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: +Um sicherzustellen, dass unser Guthaben vorhanden ist, stellen 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 die Menge an ETH in unserem Wallet zurück. Nachdem Sie Ihre MetaMask-Kontoadresse eingegeben und auf „Send Request“ geklickt haben, sollten Sie eine Antwort wie diese sehen: - ``` - `{\"jsonrpc\": \"2.0\", \"id\": 0, \"result\": \"0xde0b6b3a7640000\"}` - ``` + `{"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 auf ETH ist: 1 ETH = 1018 Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl konvertieren, erhalten wir 1\*1018 Wei und das entspricht 1 ETH. +> **Hinweis** Dieses Ergebnis ist in Wei, nicht in ETH. Wei wird als die kleinste Stückelung von Ether verwendet. Die Umrechnung von Wei in ETH ist 1 ETH = 1018 Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl umwandeln, erhalten wir 1\*1018 Wei, was 1 ETH entspricht. -Puh! Unser Falschgeld ist da. +Puh! Unser falsches Geld ist komplett da. -## Schritt 6: Unser Projekt initialisieren {#initialize-project} +## Schritt 6: Initialisieren Sie unser Projekt {#initialize-project} -Zunächst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zur Befehlszeile und geben Sie Folgendes ein: +Zuerst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zu Ihrer Kommandozeile und tippen Sie: - ``` mkdir my-nft cd my-nft - ``` -Jetzt, da wir uns in unserem Projektordner befinden, verwenden wir "npm init" um das Projekt zu starten. Wenn Sie npm noch nicht installiert haben, befolgen Sie [diese Anweisungen](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir benötigen auch [Node.js](https://nodejs.org/en/download/), 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 [diesen Anweisungen](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir benötigen auch [Node.js](https://nodejs.org/en/download/), laden Sie das also ebenfalls herunter!). - ``` npm init - ``` -Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten, aber wir haben es folgendermaßen gemacht: +Es spielt keine große Rolle, wie Sie die Installationsfragen beantworten; hier ist, wie wir es als Referenz gemacht haben: ```json package name: (my-nft) version: (1.0.0) - description: Mein erster NFT! + description: My first NFT! entry point: (index.js) test command: git repository: @@ -95,7 +89,7 @@ Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten, aber wir { "name": "my-nft", "version": "1.0.0", - "description": "Mein erster NFT!", + "description": "My first NFT!", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" @@ -105,31 +99,26 @@ Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten, aber wir } ``` -Genehmigen Sie die Datei "package.json" und schon kann es losgehen. +Bestätigen Sie die package.json, und wir können loslegen! -## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview) installieren {#install-hardhat} +## Schritt 7: Installieren Sie [Hardhat](https://hardhat.org/getting-started/#overview) {#install-hardhat} -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. +Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern beim lokalen Erstellen von Smart Contracts und Dapps, bevor sie auf der Live-Chain bereitgestellt werden. -Innerhalb unseres my-nft-Projektlaufs: +Führen Sie in unserem my-nft-Projekt Folgendes aus: - ``` npm install --save-dev hardhat - ``` -Weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview) finden Sie auf dieser Seite. +Schauen Sie sich diese Seite für weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview) an. -## Schritt 8: Hardhat-Projekt erstellen {#create-hardhat-project} +## Schritt 8: Erstellen Sie ein Hardhat-Projekt {#create-hardhat-project} -Führen Sie folgeden Befehl in unserem Projektordner aus: +Führen Sie in unserem Projektordner Folgendes aus: - ``` npx hardhat - ``` -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: +Sie sollten dann eine Willkommensnachricht und die Option sehen, auszuwählen, was Sie tun möchten. Wählen Sie „create an empty hardhat.config.js“: - ``` 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 @@ -139,39 +128,36 @@ Sie sollten dann eine Willkommensnachricht sehen und die Möglichkeit haben, aus 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 👷‍ - ? Was möchten Sie tun? … - Ein Beispielprojekt erstellen - ❯ Eine leere hardhat.config.js erstellen - Beenden - ``` + ? What do you want to do? … + Create a sample project + ❯ Create an empty hardhat.config.js + Quit -Darüber wird eine hardhat.config.js-Datei für uns generiert, in der alle Einstellungen für unser Projekt angeben werden (in Schritt 13). +Dies generiert eine hardhat.config.js-Datei für uns, in der wir die gesamte Einrichtung für unser Projekt festlegen werden (in Schritt 13). -## Schritt 9: Projektordner hinzufügen {#add-project-folders} +## Schritt 9: Fügen Sie Projektordner hinzu {#add-project-folders} -Um unser Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in der Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie Folgendes ein: +Um unser Projekt organisiert zu halten, erstellen wir zwei neue Ordner. Navigieren Sie in Ihrer Kommandozeile zum Stammverzeichnis Ihres Projekts und tippen Sie: - ``` mkdir contracts mkdir scripts - ``` -- contracts/ ist der Ort, an dem wir unseren NFT-Smart-Contract-Code aufbewahren werden. +- contracts/ ist der Ort, an dem wir unseren NFT-Smart-Contract-Code aufbewahren -- scripts/ ist der Ort, an dem wir Skripte veröffentlichen und mit unseren Smart Contract interagieren. +- scripts/ ist der Ort, an dem wir Skripte zur Bereitstellung und Interaktion mit unserem Smart Contract aufbewahren -## Schritt 10: Unseren Vertrag schreiben {#write-contract} +## Schritt 10: Schreiben Sie unseren Vertrag {#write-contract} -Jetzt, da unsere Umgebung eingerichtet ist, geht es an die aufregenderen Dinge: _das Schreiben unseres Smart-Contract-Codes!_ +Da unsere Umgebung nun eingerichtet ist, kommen wir zu aufregenderen Dingen: _dem Schreiben unseres Smart-Contract-Codes!_ -Öffnen Sie das my-nft-Projekt in Ihrem bevorzugten Editor (wir mögen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben. Damit werden wir auch unseren Smart Contract MyNFT.sol schreiben. +Öffnen Sie das my-nft-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 MyNFT.sol Smart Contract zu schreiben.‌ -1. Navigieren Sie zum `contracts`-Ordner und erstellen Sie eine neue Datei namens MyNFT.sol. +1. Navigieren Sie zum Ordner `contracts` und erstellen Sie eine neue Datei namens MyNFT.sol. -2. Nachfolgend finden Sie unseren NFT-Smart-Contract-Code, der auf der ERC-721-Implementierung der [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)-Bibliothek basiert. Kopieren Sie folgenden Inhalt und fügen Sie ihn in die Datei MyNFT.sol ein. +2. Unten finden Sie unseren NFT-Smart-Contract-Code, den wir auf der ERC-721-Implementierung der [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)-Bibliothek basieren. Kopieren Sie den folgenden Inhalt und fügen Sie ihn in Ihre MyNFT.sol-Datei ein. ```solidity - //Vertrag basiert auf [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) + // Contract basierend auf [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; @@ -199,89 +185,85 @@ Jetzt, da unsere Umgebung eingerichtet ist, geht es an die aufregenderen Dinge: return newItemId; } } - ``` +``` -3. Da wir Klassen aus der OpenZeppelin-contracts-Bibliothek erben, führen Sie in Ihrer Kommandozeile `npm install @openzeppelin/contracts^4.0.0` aus, um die Bibliothek in unserem Ordner zu installieren. +3. Da wir Klassen aus der OpenZeppelin-Vertragsbibliothek erben, führen Sie in Ihrer Kommandozeile `npm install @openzeppelin/contracts^4.0.0` aus, um die Bibliothek in unserem Ordner zu installieren. -Was also _tut_ dieser Code genau? Sehen wir uns das gemeinsam Zeil für Zeile an. +Also, was _macht_ dieser Code genau? Lassen Sie uns ihn Zeile für Zeile aufschlüsseln. -Ganz oben in unserem Smart-Contract importieren wir drei [OpenZeppelin](https://openzeppelin.com/)-Smart-Contract-Klassen: +Oben in unserem Smart Contract importieren wir drei [OpenZeppelin](https://openzeppelin.com/)-Smart-Contract-Klassen: -- @openzeppelin/contracts/token/ERC721/ERC721.sol enthält eine Implementierung des ERC-721-Standards, den unser NFT-Smart-Contract erben wird. (Damit der NFT auch Gültikeit erlangt, muss Ihr Smart Contract alle Methoden des ERC-721-Standards implementieren.) Um mehr über die geerbten ERC-721-Funktionen zu erfahren, sehen Sie sich die Schnittstellendefinition [hier](https://eips.ethereum.org/EIPS/eip-721) an. +- @openzeppelin/contracts/token/ERC721/ERC721.sol enthält die Implementierung des ERC-721-Standards, den unser NFT-Smart-Contract erben wird. (Um ein gültiger NFT zu sein, muss Ihr Smart Contract alle Methoden des ERC-721-Standards implementieren.) Um mehr über die geerbten ERC-721-Funktionen zu erfahren, schauen Sie sich die Schnittstellendefinition [hier](https://eips.ethereum.org/EIPS/eip-721) an. -- @openzeppelin/contracts/utils/Counters.sol stellt Zähler zur Verfügung, die jeweils nur um eins erhöht oder verringert werden können. Unser Smart Contract benutzt einen Zähler, um die Gesamtanzahl der geprägten NFTs zu überprüfen und eine eindeutige ID für unseren neuen NFT festzulegen. (Jedem NFT, der durch die Benutzung eines Smart Contracts geprägt wird, muss eine eindeutige ID zugewiesen werden. In diesem Beispiel wird unsere eindeutige ID einfach deterministisch über die Gesamtanzahl der existierenden NFTs bestimmt. Zum Beispiel hat der erste NFT, der mit unserem Smart Contract geprägt wird, die ID "1", unser zweiter NFT hat die ID "2" usw.) +- @openzeppelin/contracts/utils/Counters.sol stellt Zähler bereit, die nur um eins erhöht oder verringert werden können. Unser Smart Contract verwendet einen Zähler, um die Gesamtzahl der geprägten NFTs zu verfolgen und die eindeutige ID für unseren neuen NFT festzulegen. (Jedem NFT, der mit einem Smart Contract geprägt wird, muss eine eindeutige ID zugewiesen werden – hier wird unsere eindeutige ID einfach durch die Gesamtzahl der existierenden NFTs bestimmt. Zum Beispiel hat der erste NFT, den wir mit unserem Smart Contract prägen, die ID „1“, unser zweiter NFT hat die ID „2“ usw.) -- @openzeppelin/contracts/access/Ownable.sol richtet eine [Zugriffskontrolle](https://docs.openzeppelin.com/contracts/3.x/access-control) für unseren Smart-Contract ein, sodass nur der Eigentümer des Smart-Contracts (also Sie) NFTs prägen kann. (Hinweis, die Einbeziehung der Zugriffskontrolle ist optional. Wenn Sie möchten, dass mit Ihrem Smart Contract jeder NFTs prägen kann, entfernen Sie das Wort "Ownable" in Zeile 10 und "onlyOwner" in Zeile 17.) +- @openzeppelin/contracts/access/Ownable.sol richtet eine [Zugriffskontrolle](https://docs.openzeppelin.com/contracts/3.x/access-control) für unseren Smart Contract ein, sodass nur der Eigentümer des Smart Contracts (Sie) NFTs prägen kann. (Hinweis: Die Einbeziehung der Zugriffskontrolle ist reine Präferenz. Wenn Sie möchten, dass jeder einen NFT mit Ihrem Smart Contract prägen kann, entfernen Sie das Wort Ownable in Zeile 10 und onlyOwner in Zeile 17.) -Nach unseren Importanweisungen haben wir unseren benutzerdefinierten Smart Contract, der überraschend kurz ist , denn er enthält nur einen Zähler, einen Konstruktor und eine einzige Funktion. Dies ist den von uns geerbten OpenZeppelin-Contracts zu verdanken, die die meisten der Methoden implementieren, die wir zum Erstellen eines NFT benötigen, wie z. B. `ownerOf`, das den Eigentümer des NFT zurückgibt, und `transferFrom`, das das Eigentum am NFT von einem Konto auf ein anderes überträgt. +Nach unseren Importanweisungen haben wir unseren benutzerdefinierten NFT-Smart-Contract, der überraschend kurz ist – er enthält nur einen Zähler, einen Konstruktor und eine einzige Funktion! Dies ist unseren geerbten OpenZeppelin-Verträgen zu verdanken, die die meisten Methoden implementieren, die wir zur Erstellung eines NFTs benötigen, wie z. B. `ownerOf`, die den Eigentümer des NFTs zurückgibt, und `transferFrom`, die das Eigentum am NFT von einem Konto auf ein anderes überträgt. -Sie werden feststellen, dass wir in unserem ERC-721-Konstruktor zwei Zeichenfolgen übergeben: "MyNFT" und "NFT". Die erste Variable ist der Name des Smart Contracts und die zweite ist sein Symbol. Sie können jede der beiden Variablen benennen wie sie möchten. +In unserem ERC-721-Konstruktor werden Sie feststellen, dass wir 2 Strings übergeben, „MyNFT“ und „NFT“. Die erste Variable ist der Name des Smart Contracts und die zweite ist sein Symbol. Sie können jede dieser Variablen benennen, wie Sie möchten! -Schließlich haben wir unsere Funktion `mintNFT(address recipient, string memory tokenURI)`, die es uns ermöglicht, einen NFT zu prägen! Sie werden bemerken, dass diese Funktion zwei Variablen benötigt: +Schließlich haben wir unsere Funktion `mintNFT(address recipient, string memory tokenURI)`, die es uns ermöglicht, einen NFT zu prägen! Sie werden feststellen, dass diese Funktion zwei Variablen aufnimmt: -- `address recipient` gibt die Adresse an, die Ihren frisch geprägten NFT erhalten wird +- `address recipient` gibt die Adresse an, die Ihren frisch geprägten NFT erhalten wird. -- `string memory tokenURI` ist ein String, der in ein JSON-Dokument aufgelöst werden sollte, das die Metadaten des NFTs beschreibt. Die Metadaten eines NFT, sind das Element, das den NFT wirklich zum Leben erwecken. Sie schaffen die Grundlage, dass ein NFT konfigurierbare Eigenschaften wie einen Namen, eine Beschreibung ein Bild und andere Attribute haben kann. In Teil 2 dieses Tutorials wird die Konfiguration dieser Metadaten beschrieben. +- `string memory tokenURI` ist ein String, der auf ein JSON-Dokument verweisen sollte, das die Metadaten des NFTs beschreibt. Die Metadaten eines NFTs sind das, was ihn wirklich zum Leben erweckt und es ihm ermöglicht, konfigurierbare Eigenschaften wie Name, Beschreibung, Bild und andere Attribute zu haben. In Teil 2 dieses Tutorials werden wir beschreiben, wie diese Metadaten konfiguriert werden. -`mintNFT` ruft einige Methoden aus der geerbten ERC-721-Bibliothek auf und gibt schließlich eine Zahl zurück, die die ID des frisch geprägten NFT darstellt. +`mintNFT` ruft einige Methoden aus der geerbten ERC-721-Bibliothek auf und gibt letztendlich eine Zahl zurück, die die ID des frisch geprägten NFTs darstellt. -## Schritt 11: MetaMask & Alchemy mit Ihrem Projekt verbinden {#connect-metamask-and-alchemy} +## Schritt 11: Verbinden Sie MetaMask & Alchemy mit Ihrem Projekt {#connect-metamask-and-alchemy} -Nachdem wir nun eine MetaMask-Wallet und ein Alchemy-Konto erstellt uns unseren Smart Contract geschrieben haben, ist es an der Zeit, die drei Elemente miteinander zu verbinden. +Nachdem wir nun ein MetaMask-Wallet und ein Alchemy-Konto erstellt sowie unseren Smart Contract geschrieben haben, ist es an der Zeit, die drei zu verbinden. -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. +Jede Transaktion, die von Ihrem virtuellen Wallet gesendet wird, erfordert eine Signatur mit Ihrem eindeutigen Private-Key. Um unserem Programm diese Berechtigung zu erteilen, können wir unseren Private-Key (und den Alchemy-API-Schlüssel) sicher in einer Umgebungsdatei speichern. -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. +Um mehr über das Senden von Transaktionen zu erfahren, schauen Sie sich [dieses Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) zum Senden von Transaktionen mit Web3 an. -Installieren Sie zuerst das dotenv-Paket in Ihrem Projektverzeichnis: +Installieren Sie zunächst das dotenv-Paket in Ihrem Projektverzeichnis: - ``` npm install dotenv --save - ``` -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. +Erstellen Sie dann eine `.env`-Datei im Stammverzeichnis unseres Projekts und fügen Sie Ihren MetaMask Private-Key und die 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 aus MetaMask zu exportieren +- Folgen Sie [diesen Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren Private-Key aus MetaMask zu exportieren. -- Unten wird erläutert, wie Sie die HTTP-URL der Alchemy-API erhalten und in die Zwischenablage kopieren. +- Siehe unten, um die HTTP-Alchemy-API-URL zu erhalten und in Ihre Zwischenablage zu kopieren. ![Kopieren Sie Ihre Alchemy-API-URL](./copy-alchemy-api-url.gif) -Ihre `.env`-Datei sollte jetzt so aussehen: +Ihre `.env` sollte nun so aussehen: - ``` API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY="your-metamask-private-key" - ``` -Um diese tatsächlich mit unserem Code zu verbinden, werden wir in Schritt 13 in unserer Datei hardhat.config.js auf diese Variablen verweisen. +Um diese tatsächlich mit unserem Code zu verbinden, werden wir in Schritt 13 in unserer hardhat.config.js-Datei auf diese Variablen verweisen. -## Schritt 12: Ethers.js installieren {#install-ethers} +## Schritt 12: Installieren Sie Ethers.js {#install-ethers} -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. +Ethers.js ist eine Bibliothek, die es einfacher macht, mit Ethereum zu interagieren und Anfragen zu stellen, indem sie [Standard-JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden verpackt. -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). +Hardhat macht es super 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/) hat einige sehr saubere Methoden zur Vertragsbereitstellung). -Geben Sie Folgendes in Ihrem Projektverzeichnis ein: +Tippen Sie in Ihrem Projektverzeichnis: - ``` 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. +Wir werden im nächsten Schritt auch Ethers in unserer hardhat.config.js benötigen. -## Schritt 13: hardhat.config.js aktualisieren {#update-hardhat-config} +## Schritt 13: Aktualisieren Sie hardhat.config.js {#update-hardhat-config} -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 von allen weiß. Aktualisieren Sie Ihre hardhat.config.js so, dass sie wie folgt aussieht: ```js - /** - * @type import('hardhat/config').HardhatUserConfig - */ + /* * + * @type import('hardhat/config').HardhatUserConfig */ + + + require('dotenv').config(); require("@nomiclabs/hardhat-ethers"); const { API_URL, PRIVATE_KEY } = process.env; @@ -298,29 +280,27 @@ Aktualisieren Sie Ihre hardhat.config.js so, dass sie wie folgt aussieht: } ``` -## Schritt 14: Unseren Vertrag kompilieren {#compile-contract} +## Schritt 14: Kompilieren Sie unseren Vertrag {#compile-contract} -Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Die Aufgabe compile ist eine der integrierten Hardhat-Aufgaben. +Um sicherzustellen, dass bisher alles funktioniert, lassen Sie uns unseren Vertrag kompilieren. Die Kompilierungsaufgabe ist eine der integrierten Hardhat-Aufgaben. -Führen Sie folgenden Befehl in der Befehlszeile aus: +Führen Sie in der Kommandozeile Folgendes aus: - ``` npx hardhat compile - ``` -Möglicherweise erhalten Sie eine Warnung, dass die SPDX-Lizenzkennung nicht in Quelldatei angegeben sei. Doch darüber brauchen Sie sich keine Sorgen zu machen. Alles andere sieht hoffentlich gut aus. Wenn nicht, können Sie jederzeit eine Nachricht im [Alchemy-Discord](https://discord.gg/u72VCg3) schreiben. +Möglicherweise erhalten Sie eine Warnung, dass der SPDX-Lizenzidentifikator in der Quelldatei nicht angegeben ist, aber darüber müssen Sie sich keine Sorgen machen – hoffentlich sieht alles andere gut aus! Wenn nicht, können Sie jederzeit im [Alchemy Discord](https://discord.gg/u72VCg3) eine Nachricht schreiben. -## Schritt 15: Unser Bereitstellungsskript schreiben {#write-deploy} +## Schritt 15: Schreiben Sie unser Bereitstellungsskript {#write-deploy} -Nun, da unser Vertrag geschrieben und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, das Skript zur Bereitstellung des Vertrags zu schreiben. +Da unser Vertrag nun geschrieben ist und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, unser Skript zur Vertragsbereitstellung zu schreiben. -Navigieren Sie zum `scripts/`-Ordner und erstellen Sie eine neue Datei namens `deploy.js`, indem Sie die folgenden Inhalte hinzufügen: +Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`, der Sie den folgenden Inhalt hinzufügen: ```js async function main() { const MyNFT = await ethers.getContractFactory("MyNFT") - // Bereitstellung starten, die ein Promise zurückgibt, das zu einem Vertragsobjekt aufgelöst wird + // Startet die Bereitstellung und gibt ein Promise zurück, das zu einem Contract-Objekt aufgelöst wird. const myNFT = await MyNFT.deploy() await myNFT.deployed() console.log("Contract deployed to address:", myNFT.address) @@ -334,48 +314,40 @@ main() }) ``` -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. +Hardhat leistet hervorragende Arbeit bei der Erklärung, was jede dieser Codezeilen in ihrem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) tut, wir haben ihre Erklärungen hier übernommen. - ``` const MyNFT = await ethers.getContractFactory("MyNFT"); - ``` -Eine ContractFactory in ethers.js ist eine Abstraktion, die dazu dient, neue Smart Contracts einzusetzen. So ist MyNFT eine Factory für Instanzen von unseren NFT-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, also ist MyNFT hier eine Fabrik für Instanzen unseres NFT-Vertrags. Bei Verwendung des hardhat-ethers-Plugins sind ContractFactory- und Contract-Instanzen standardmäßig mit dem ersten Unterzeichner verbunden. - ``` const myNFT = await MyNFT.deploy(); - ``` -Mit dem Aufruf von deploy() über eine ContractFactory wird die Bereitstellung gestartet. Zurückgegeben wird eine Referenz, die auf einen Vertrag zeigt. 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 in einen Contract aufgelöst wird. Dies ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen hat. -## Schritt 16: Unseren Vertrag bereitstellen {#deploy-contract} +## Schritt 16: Stellen Sie unseren Vertrag bereit {#deploy-contract} -Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zurück zu Ihrem Stammverzeichnis und führen Sie Folgendes über die Befehlszeile aus: +Wir sind endlich bereit, unseren Smart Contract bereitzustellen! Navigieren Sie zurück zum Stammverzeichnis Ihres Projekts und führen Sie in der Kommandozeile Folgendes aus: - ``` npx hardhat --network sepolia run scripts/deploy.js - ``` -Sie sollten dann etwas sehen wie: +Sie sollten dann so etwas sehen: - ``` - Vertrag bereitgestellt für Adresse: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 - ``` + Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 -Wenn wir zum [Sepolia Etherscan](https://sepolia.etherscan.io/) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Wenn sie nicht sofort angezeigt wird, haben Sie etwas Geduld, denn dieser Vorgang kann einige Zeit in Anspruch nehmen. Die Transaktion wird ungefähr so aussehen: +Wenn wir zum [Sepolia Etherscan](https://sepolia.etherscan.io/) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Wenn Sie sie nicht sofort sehen können, warten Sie bitte eine Weile, da dies einige Zeit dauern kann. Die Transaktion wird in etwa so aussehen: -![Ihre Transaktionsadresse auf Etherscan ansehen](./etherscan-sepoila-contract-creation.png) +![Sehen Sie sich Ihre Transaktionsadresse auf Etherscan an](./etherscan-sepoila-contract-creation.png) -Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und die `To`-Adresse lautet „Contract Creation“. Wenn wir auf die Transaktion klicken ,sehen wir unsere Vertragsadresse im Empfängerfeld: +Die From-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und die To-Adresse wird „Contract Creation“ anzeigen. Wenn wir in die Transaktion klicken, sehen wir unsere Vertragsadresse im To-Feld: -![Ihre Vertragsadresse auf Etherscan ansehen](./etherscan-sepolia-tx-details.png) +![Sehen Sie sich Ihre Vertragsadresse auf Etherscan an](./etherscan-sepolia-tx-details.png) -Großartig! Sie haben soeben Ihren NFT-Smart-Contract in der Ethereum-Chain (Testnet) bereitgestellt! +Jaaaaa! Sie haben gerade Ihren NFT-Smart-Contract auf der Ethereum-Chain (Testnet) bereitgestellt! -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 besitzen, filtern Sie nach Apps und wählen Sie "MyNFT" aus. +Um zu verstehen, was unter der Haube passiert, 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 „MyNFT“ auswählen. -![Anzeigen von Aufrufen, die „unter der Haube“ mit dem Explorer-Dashboard von Alchemy gemacht wurden](./alchemy-explorer-goerli.png) +![Sehen Sie sich die „unter der Haube“ getätigten Aufrufe mit dem Explorer-Dashboard von Alchemy an](./alchemy-explorer-goerli.png) -Hier sehen Sie eine Handvoll JSON-RPC-Aufrufe, die Hardhat/Ethers implementiert hat, als wir die .deploy()-Funktion aufgerufen haben. Zwei wichtige Aufrufe sind hier [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), das ist die Anfrage, um unseren Smart-Contract tatsächlich in die Sepolia-Chain zu schreiben, und [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), eine Anfrage zum Lesen von Informationen über unsere Transaktion anhand des Hashes (ein typisches Muster beim Senden von Transaktionen). Um mehr über das Senden von Transaktionen zu erfahren, 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 unter der Haube für uns gemacht haben, als wir die Funktion .deploy() aufgerufen haben. Zwei wichtige, die hier hervorgehoben werden sollten, sind [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), was die Anfrage ist, unseren Smart Contract tatsächlich auf die Sepolia-Chain zu schreiben, und [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), was eine Anfrage ist, um Informationen über unsere Transaktion anhand des Hashs zu lesen (ein typisches Muster beim Senden von Transaktionen). Um mehr über das Senden von Transaktionen zu erfahren, schauen Sie sich dieses Tutorial zum [Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) an. -Damit sind wir am Ende vom ersten Teil dieses Tutorials. In [Teil 2 werden wir tatsächlich mit unserem Smart-Contract interagieren, indem wir einen NFT prägen](/developers/tutorials/how-to-mint-an-nft/), und in [Teil 3 zeigen wir Ihnen, wie Sie Ihren NFT in Ihrer Ethereum-Wallet ansehen können](/developers/tutorials/how-to-view-nft-in-metamask/)! +Das war's für Teil 1 dieses Tutorials. In [Teil 2 werden wir tatsächlich mit unserem Smart Contract interagieren, indem wir einen NFT prägen](/developers/tutorials/how-to-mint-an-nft/), und in [Teil 3 zeigen wir Ihnen, wie Sie Ihren NFT in Ihrem Ethereum-Wallet anzeigen können](/developers/tutorials/how-to-view-nft-in-metamask/)! \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md index a6e84fc00bb..631f386f780 100644 --- a/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md +++ b/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -1,10 +1,10 @@ --- -title: Mit anderen Contracts von Solidity aus interagieren -description: Wie man einen Smart Contract von einem bestehenden Contract aus bereitstellt und mit ihm interagiert +title: Mit anderen Smart Contracts aus Solidity interagieren +description: Wie man einen Smart Contract aus einem bestehenden Smart Contract bereitstellt und mit ihm interagiert author: "jdourlens" -tags: ["smart contracts", "solidity", "remix", "deploying", "composability"] +tags: ["Smart Contracts", "Solidity", "Remix", "Bereitstellung", "Zusammensetzbarkeit"] skill: advanced -breadcrumb: "Vertragsinteraktionen" +breadcrumb: Smart-Contract-Interaktionen lang: de published: 2020-04-05 source: EthereumDev @@ -12,9 +12,9 @@ sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -In den vorherigen Tutorials haben wir viel gelernt, [wie man seinen ersten Smart Contract bereitstellt](/developers/tutorials/deploying-your-first-smart-contract/) und ihm einige Funktionen hinzufügt, wie [Zugriffskontrolle mit Modifikatoren](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) oder [Fehlerbehandlung in Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). In diesem Tutorial lernen wir, wie man einen Smart Contract von einem bestehenden Contract aus bereitstellt und mit ihm interagiert. +In den vorherigen Tutorials haben wir viel darüber gelernt, [wie Sie Ihren ersten Smart Contract bereitstellen](/developers/tutorials/deploying-your-first-smart-contract/) und ihm einige Funktionen hinzufügen können, wie z. B. [Zugriffskontrolle mit Modifikatoren](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) oder [Fehlerbehandlung in Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). In diesem Tutorial werden wir lernen, wie man einen Smart Contract aus einem bestehenden Smart Contract heraus bereitstellt und mit ihm interagiert. -Wir erstellen einen Contract, der es jedem ermöglicht, seinen eigenen `Counter`-Smart-Contract zu haben. Dafür erstellen wir eine Factory, die `CounterFactory` heißen wird. Hier ist zunächst der Code unseres ursprünglichen `Counter`-Smart-Contracts: +Wir werden einen Smart Contract erstellen, der es jedem ermöglicht, seinen eigenen `Counter`-Smart-Contract zu haben, indem wir eine Fabrik (Factory) dafür erstellen. Ihr Name wird `CounterFactory` sein. Hier ist zunächst der Code unseres anfänglichen `Counter`-Smart-Contracts: ```solidity pragma solidity 0.5.17; @@ -27,12 +27,12 @@ contract Counter { modifier onlyOwner(address caller) { - require(caller == _owner, "Du bist nicht der Eigentümer des Vertrags"); + require(caller == _owner, "You're not the owner of the contract"); _; } modifier onlyFactory() { - require(msg.sender == _factory, "Du musst die Factory verwenden"); + require(msg.sender == _factory, "You need to use the factory"); _; } @@ -52,19 +52,19 @@ contract Counter { } ``` -Beachte, dass wir den Contract-Code geringfügig geändert haben, um die Adresse der Factory und die Adresse des Contract-Eigentümers zu speichern. Wenn du einen Contract-Code von einem anderen Contract aus aufrufst, verweist `msg.sender` auf die Adresse unserer Contract-Factory. Dies ist **ein sehr wichtiger Punkt, den man verstehen sollte**, da die Verwendung eines Contracts zur Interaktion mit anderen Contracts gängige Praxis ist. Daher solltest du in komplexen Fällen darauf achten, wer der Absender ist. +Beachten Sie, dass wir den Code des Smart Contracts leicht modifiziert haben, um die Adresse der Factory und die Adresse des Smart-Contract-Eigentümers nachzuverfolgen. Wenn Sie einen Smart-Contract-Code von einem anderen Smart Contract aus aufrufen, bezieht sich `msg.sender` auf die Adresse unserer Smart-Contract-Factory. Dies ist **ein wirklich wichtiger Punkt, den man verstehen muss**, da die Verwendung eines Smart Contracts zur Interaktion mit anderen Smart Contracts eine gängige Praxis ist. Sie sollten daher in komplexen Fällen darauf achten, wer der Absender ist. Dafür haben wir auch einen `onlyFactory`-Modifikator hinzugefügt, der sicherstellt, dass die zustandsändernde Funktion nur von der Factory aufgerufen werden kann, die den ursprünglichen Aufrufer als Parameter übergibt. -Innerhalb unserer neuen `CounterFactory`, die alle anderen Counter verwalten wird, fügen wir ein Mapping hinzu, das einem Eigentümer die Adresse seines Counter-Contracts zuordnet: +Innerhalb unserer neuen `CounterFactory`, die alle anderen Counter verwalten wird, fügen wir ein Mapping hinzu, das einen Eigentümer der Adresse seines Counter-Smart-Contracts zuordnet: ```solidity mapping(address => Counter) _counters; ``` -In Ethereum sind Mappings das Äquivalent zu Objekten in Javascript; sie ermöglichen es, einen Schlüssel vom Typ A einem Wert vom Typ B zuzuordnen. In diesem Fall ordnen wir die Adresse eines Eigentümers der Instanz seines Counters zu. +In Ethereum sind Mappings das Äquivalent zu Objekten in JavaScript. Sie ermöglichen es, einen Schlüssel vom Typ A auf einen Wert vom Typ B abzubilden. In diesem Fall bilden wir die Adresse eines Eigentümers auf die Instanz seines Counters ab. -Das Instanziieren eines neuen `Counter` für jemanden sieht wie folgt aus: +Die Instanziierung eines neuen Counters für jemanden sieht wie folgt aus: ```solidity function createCounter() public { @@ -73,9 +73,9 @@ Das Instanziieren eines neuen `Counter` für jemanden sieht wie folgt aus: } ``` -Zuerst prüfen wir, ob die Person bereits einen `Counter` besitzt. Wenn die Person keinen `Counter` besitzt, instanziieren wir einen neuen, indem wir ihre Adresse an den `Counter`-Konstruktor übergeben und die neu erstellte Instanz dem Mapping zuweisen. +Wir prüfen zunächst, ob die Person bereits einen Counter besitzt. Wenn sie keinen Counter besitzt, instanziieren wir einen neuen Counter, indem wir ihre Adresse an den `Counter`-Konstruktor übergeben und die neu erstellte Instanz dem Mapping zuweisen. -Um den Zählerstand eines bestimmten `Counter` abzurufen, sieht es wie folgt aus: +Um den Zählerstand eines bestimmten Counters abzurufen, sieht das so aus: ```solidity function getCount(address account) public view returns (uint256) { @@ -88,9 +88,9 @@ function getMyCount() public view returns (uint256) { } ``` -Die erste Funktion prüft, ob der `Counter`-Contract für eine bestimmte Adresse existiert, und ruft dann die `getCount`-Methode von der Instanz auf. Die zweite Funktion, `getMyCount`, ist nur eine Abkürzung, um `msg.sender` direkt an die `getCount`-Funktion zu übergeben. +Die erste Funktion prüft, ob der Counter-Smart-Contract für eine bestimmte Adresse existiert, und ruft dann die Methode `getCount` der Instanz auf. Die zweite Funktion: `getMyCount` ist nur eine Abkürzung, um den `msg.sender` direkt an die Funktion `getCount` zu übergeben. -Die `increment`-Funktion ist recht ähnlich, übergibt aber den ursprünglichen Transaktionssender an den `Counter`-Contract: +Die Funktion `increment` ist recht ähnlich, übergibt aber den ursprünglichen Absender der Transaktion an den `Counter`-Smart-Contract: ```solidity function increment() public { @@ -99,9 +99,9 @@ function increment() public { } ``` -Beachte, dass unser `Counter` bei zu häufigen Aufrufen Opfer eines Überlaufs werden könnte. Du solltest die [SafeMath-Bibliothek](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) so oft wie möglich verwenden, um dich vor diesem möglichen Fall zu schützen. +Beachten Sie, dass unser Counter bei zu vielen Aufrufen möglicherweise Opfer eines Overflows (Überlaufs) werden könnte. Sie sollten die [SafeMath-Bibliothek](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) so oft wie möglich verwenden, um sich vor diesem möglichen Fall zu schützen. -Um unseren Contract bereitzustellen, musst du sowohl den Code der `CounterFactory` als auch den des `Counter` angeben. Bei der Bereitstellung in Remix musst du zum Beispiel `CounterFactory` auswählen. +Um unseren Smart Contract bereitzustellen, müssen Sie sowohl den Code der `CounterFactory` als auch den des `Counter` bereitstellen. Wenn Sie beispielsweise in Remix bereitstellen, müssen Sie CounterFactory auswählen. Hier ist der vollständige Code: @@ -116,12 +116,12 @@ contract Counter { modifier onlyOwner(address caller) { - require(caller == _owner, "Du bist nicht der Eigentümer des Vertrags"); + require(caller == _owner, "You're not the owner of the contract"); _; } modifier onlyFactory() { - require(msg.sender == _factory, "Du musst die Factory verwenden"); + require(msg.sender == _factory, "You need to use the factory"); _; } @@ -166,8 +166,8 @@ contract CounterFactory { } ``` -Nach dem Kompilieren wählst du im Bereitstellungsbereich von Remix die Factory aus, die bereitgestellt werden soll: +Nach dem Kompilieren wählen Sie im Bereitstellungsbereich von Remix die Factory aus, die bereitgestellt werden soll: ![Auswahl der in Remix bereitzustellenden Factory](./counterfactory-deploy.png) -Danach kannst du mit deiner Contract Factory interagieren und die Wertänderung überprüfen. Wenn du den Smart Contract von einer anderen Adresse aus aufrufen möchtest, musst du die Adresse in der Kontoauswahl von Remix ändern. +Dann können Sie mit Ihrer Smart-Contract-Factory herumspielen und überprüfen, wie sich der Wert ändert. Wenn Sie den Smart Contract von einer anderen Adresse aus aufrufen möchten, müssen Sie die Adresse in der Kontoauswahl von Remix ändern. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md index a477ab36e59..4a3c06a2d30 100644 --- a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md +++ b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md @@ -1,21 +1,21 @@ --- title: "IPFS für dezentralisierte Benutzeroberflächen" -description: "Dieses Tutorial zeigt dem Leser, wie man IPFS nutzt, um die Benutzeroberfläche für eine Dapp zu speichern. Obwohl die Daten und die Geschäftslogik der Anwendung dezentralisiert sind, könnten Benutzer ohne eine zensurresistente Benutzeroberfläche trotzdem den Zugriff darauf verlieren." +description: "Dieses Tutorial zeigt dem Leser, wie man IPFS verwendet, um die Benutzeroberfläche für eine Dapp zu speichern. Obwohl die Daten und die Geschäftslogik der Anwendung dezentralisiert sind, könnten Benutzer ohne eine zensurresistente Benutzeroberfläche dennoch den Zugriff darauf verlieren." author: Ori Pomerantz -tags: [ "ipfs" ] +tags: ["ipfs", "dapps", "frontend"] skill: beginner -breadcrumb: "IPFS-Dapp-UIs" +breadcrumb: "IPFS für Dapp-Benutzeroberflächen" lang: de published: 2024-06-29 --- -Sie haben eine unglaubliche neue Dapp geschrieben. Sie haben sogar eine [Benutzeroberfläche](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) dafür geschrieben. Aber jetzt befürchten Sie, dass jemand versuchen könnte, sie zu zensieren, indem er Ihre Benutzeroberfläche, die sich nur auf einem einzigen Server in der Cloud befindet, lahmlegt. In diesem Tutorial lernen Sie, wie Sie Zensur vermeiden können, indem Sie Ihre Benutzeroberfläche im **[Interplanetary File System (IPFS)](https://ipfs.tech/developers/)** ablegen, sodass jeder Interessierte sie für den zukünftigen Zugriff auf einem Server pinnen kann. +Sie haben eine unglaubliche neue Dapp geschrieben. Sie haben sogar eine [Benutzeroberfläche](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) dafür geschrieben. Aber jetzt befürchten Sie, dass jemand versuchen wird, sie zu zensieren, indem er Ihre Benutzeroberfläche, die nur auf einem Server in der Cloud liegt, vom Netz nimmt. In diesem Tutorial lernen Sie, wie Sie Zensur vermeiden können, indem Sie Ihre Benutzeroberfläche auf dem **[Interplanetary File System (IPFS)](https://ipfs.tech/developers/)** bereitstellen, sodass jeder Interessierte sie für den zukünftigen Zugriff auf einem Server anheften (pinnen) kann. -Sie könnten einen Drittanbieterdienst wie [Fleek](https://resources.fleek.xyz/docs/) nutzen, um die ganze Arbeit zu erledigen. Dieses Tutorial richtet sich an Personen, die genug tun wollen, um zu verstehen, was sie tun, auch wenn es mehr Arbeit bedeutet. +Sie könnten einen Drittanbieter-Dienst wie [Fleek](https://resources.fleek.xyz/docs/) nutzen, um die ganze Arbeit zu erledigen. Dieses Tutorial richtet sich an Personen, die genug tun möchten, um zu verstehen, was sie tun, auch wenn es mehr Arbeit bedeutet. -## Lokale erste Schritte {#getting-started-locally} +## Lokal loslegen {#getting-started-locally} -Es gibt mehrere [Drittanbieter von IPFS](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service), aber für Testzwecke ist es am besten, IPFS zunächst lokal auszuführen. +Es gibt mehrere [IPFS-Drittanbieter](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service), aber am besten beginnen Sie damit, IPFS zu Testzwecken lokal auszuführen. 1. Installieren Sie die [IPFS-Benutzeroberfläche](https://docs.ipfs.tech/install/ipfs-desktop/#install-instructions). @@ -23,52 +23,52 @@ Es gibt mehrere [Drittanbieter von IPFS](https://docs.ipfs.tech/how-to/work-with ```sh pnpm vite build - ``` +``` -3. Klicken Sie in IPFS Desktop auf **Importieren > Ordner** und wählen Sie das Verzeichnis aus, das Sie im vorherigen Schritt erstellt haben. +3. Klicken Sie in IPFS Desktop auf **Import > Folder** (Importieren > Ordner) und wählen Sie das Verzeichnis aus, das Sie im vorherigen Schritt erstellt haben. -4. Wählen Sie den Ordner aus, den Sie gerade hochgeladen haben, und klicken Sie auf **Umbenennen**. Geben Sie ihm einen aussagekräftigeren Namen. +4. Wählen Sie den soeben hochgeladenen Ordner aus und klicken Sie auf **Rename** (Umbenennen). Geben Sie ihm einen aussagekräftigeren Namen. -5. Wählen Sie ihn erneut aus und klicken Sie auf **Link teilen**. Kopieren Sie die URL in die Zwischenablage. Der Link wäre ähnlich wie `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. +5. Wählen Sie ihn erneut aus und klicken Sie auf **Share link** (Link teilen). Kopieren Sie die URL in die Zwischenablage. Der Link sieht in etwa so aus: `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. -6. Klicken Sie auf **Status**. Erweitern Sie den Tab **Erweitert**, um die Gateway-Adresse zu sehen. Auf meinem System lautet die Adresse beispielsweise `http://127.0.0.1:8080`. +6. Klicken Sie auf **Status**. Erweitern Sie den Tab **Advanced** (Erweitert), um die Gateway-Adresse zu sehen. Auf meinem System lautet die Adresse beispielsweise `http://127.0.0.1:8080`. -7. Kombinieren Sie den Pfad aus dem Link-Schritt mit der Gateway-Adresse, um Ihre Adresse zu finden. Für das obige Beispiel lautet die URL `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. Öffnen Sie diese URL in einem Browser, um Ihre Website zu sehen. +7. Kombinieren Sie den Pfad aus dem Link-Schritt mit der Gateway-Adresse, um Ihre Adresse zu finden. Für das obige Beispiel lautet die URL beispielsweise `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. Öffnen Sie diese URL in einem Browser, um Ihre Website zu sehen. ## Hochladen {#uploading} -Jetzt können Sie IPFS also verwenden, um Dateien lokal bereitzustellen, was nicht sehr aufregend ist. Der nächste Schritt besteht darin, sie für die ganze Welt verfügbar zu machen, wenn Sie offline sind. +Jetzt können Sie also IPFS verwenden, um Dateien lokal bereitzustellen, was nicht sehr aufregend ist. Der nächste Schritt besteht darin, sie für die Welt verfügbar zu machen, wenn Sie offline sind. -Es gibt eine Reihe von bekannten [Pinning-Diensten](https://docs.ipfs.tech/concepts/persistence/#pinning-services). Wählen Sie einen davon aus. Egal welchen Dienst Sie nutzen, Sie müssen ein Konto erstellen und ihm den **Content Identifier (CID)** von Ihrem IPFS-Desktop bereitstellen. +Es gibt eine Reihe bekannter [Pinning-Dienste](https://docs.ipfs.tech/concepts/persistence/#pinning-services). Wählen Sie einen davon aus. Welchen Dienst Sie auch nutzen, Sie müssen ein Konto erstellen und ihm den **Content Identifier (CID)** aus Ihrem IPFS Desktop zur Verfügung stellen. -Ich persönlich fand [4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) am einfachsten zu bedienen. Hier ist die Anleitung dafür: +Persönlich fand ich [4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) am einfachsten zu bedienen. Hier sind die Anweisungen dafür: -1. Navigieren Sie zum [Dashboard](https://dashboard.4everland.org/overview) und melden Sie sich mit Ihrer Wallet an. +1. Navigieren Sie zum [Dashboard](https://dashboard.4everland.org/overview) und melden Sie sich mit Ihrem Wallet an. -2. Klicken Sie in der linken Seitenleiste auf **Speicher > 4EVER Pin**. +2. Klicken Sie in der linken Seitenleiste auf **Storage > 4EVER Pin**. -3. Klicken Sie auf **Hochladen > Ausgewählte CID**. Geben Sie Ihrem Inhalt einen Namen und geben Sie die CID aus dem IPFS-Desktop an. Derzeit ist eine CID eine Zeichenkette, die mit `Qm` beginnt, gefolgt von 44 Buchstaben und Ziffern, die einen [Base58-kodierten](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524) Hash darstellen, wie z. B. `QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`, aber [das wird sich wahrscheinlich ändern](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1). +3. Klicken Sie auf **Upload > Selected CID**. Geben Sie Ihrem Inhalt einen Namen und geben Sie die CID aus IPFS Desktop an. Derzeit ist eine CID eine Zeichenfolge, die mit `Qm` beginnt, gefolgt von 44 Buchstaben und Ziffern, die einen [Base-58-kodierten](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524) Hash darstellen, wie z. B. `QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`, aber [das wird sich wahrscheinlich ändern](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1). -4. Der anfängliche Status ist **In Warteschlange**. Laden Sie neu, bis er sich auf **Gepinnt** ändert. +4. Der anfängliche Status ist **Queued** (In der Warteschlange). Laden Sie die Seite neu, bis er sich zu **Pinned** (Angeheftet) ändert. 5. Klicken Sie auf Ihre CID, um den Link zu erhalten. Sie können meine Anwendung [hier](https://bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im.ipfs.dweb.link/) sehen. -6. Möglicherweise müssen Sie Ihr Konto aktivieren, damit es länger als einen Monat gepinnt bleibt. Die Aktivierung des Kontos kostet etwa 1 $. Wenn Sie es geschlossen haben, melden Sie sich ab und wieder an, um erneut zur Aktivierung aufgefordert zu werden. +6. Möglicherweise müssen Sie Ihr Konto aktivieren, um es länger als einen Monat angeheftet zu lassen. Die Kontoaktivierung kostet etwa 1 $. Wenn Sie es geschlossen haben, melden Sie sich ab und wieder an, um erneut zur Aktivierung aufgefordert zu werden. -## Verwendung von IPFS {#using-from-ipfs} +## Nutzung über IPFS {#using-from-ipfs} -An diesem Punkt haben Sie einen Link zu einem zentralisierten Gateway, das Ihre IPFS-Inhalte bereitstellt. Kurz gesagt, Ihre Benutzeroberfläche ist vielleicht etwas sicherer, aber immer noch nicht zensurresistent. Für echte Zensurresistenz müssen Benutzer IPFS [direkt aus einem Browser](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites) verwenden. +Zu diesem Zeitpunkt haben Sie einen Link zu einem zentralisierten Gateway, das Ihre IPFS-Inhalte bereitstellt. Kurz gesagt, Ihre Benutzeroberfläche ist vielleicht etwas sicherer, aber immer noch nicht zensurresistent. Für echte Zensurresistenz müssen Benutzer IPFS [direkt über einen Browser](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites) nutzen. -Sobald Sie das installiert haben (und der Desktop-IPFS funktioniert), können Sie auf jeder Website zu [/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im) gehen und Sie erhalten diesen Inhalt auf dezentralisierte Weise. +Sobald Sie das installiert haben (und das Desktop-IPFS funktioniert), können Sie auf einer beliebigen Website zu [/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im) gehen und erhalten diesen Inhalt auf dezentralisierte Weise bereitgestellt. ## Nachteile {#drawbacks} -Sie können IPFS-Dateien nicht zuverlässig löschen. Solange Sie also Ihre Benutzeroberfläche ändern, ist es wahrscheinlich am besten, sie entweder zentralisiert zu belassen oder das [Interplanetary Name System (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs) zu verwenden, ein System, das Veränderbarkeit auf IPFS bietet. Natürlich kann alles, was veränderbar ist, zensiert werden, im Fall von IPNS, indem man die Person unter Druck setzt, die den zugehörigen privaten Schlüssel besitzt. +Sie können IPFS-Dateien nicht zuverlässig löschen. Solange Sie also Ihre Benutzeroberfläche ändern, ist es wahrscheinlich am besten, sie entweder zentralisiert zu belassen oder das [Interplanetary Name System (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs) zu verwenden, ein System, das Veränderbarkeit auf IPFS aufbaut. Natürlich kann alles, was veränderbar ist, zensiert werden, im Fall von IPNS, indem Druck auf die Person mit dem entsprechenden Private-Key ausgeübt wird. -Außerdem haben einige Pakete ein Problem mit IPFS. Wenn Ihre Website also sehr kompliziert ist, ist das möglicherweise keine gute Lösung. Und natürlich kann alles, was auf Server-Integration angewiesen ist, nicht dezentralisiert werden, nur weil die Client-Seite auf IPFS liegt. +Darüber hinaus haben einige Pakete ein Problem mit IPFS. Wenn Ihre Website also sehr komplex ist, ist dies möglicherweise keine gute Lösung. Und natürlich kann nichts, was auf Serverintegration angewiesen ist, dezentralisiert werden, nur indem die Client-Seite auf IPFS liegt. ## Fazit {#conclusion} -So wie Ethereum es Ihnen ermöglicht, die Datenbank- und Geschäftslogikaspekte Ihrer Dapp zu dezentralisieren, ermöglicht IPFS die Dezentralisierung der Benutzeroberfläche. Damit können Sie einen weiteren Angriffsvektor gegen Ihre Dapp ausschalten. +Genauso wie Ethereum es Ihnen ermöglicht, die Datenbank- und Geschäftslogikaspekte Ihrer Dapp zu dezentralisieren, ermöglicht IPFS Ihnen, die Benutzeroberfläche zu dezentralisieren. Dadurch können Sie einen weiteren Angriffsvektor gegen Ihre Dapp ausschalten. -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index a47bdd9195e..e994ee9fb48 100644 --- a/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -1,22 +1,22 @@ --- -title: Starte deine Dapp-Frontend-Entwicklung mit create-eth-app -description: "Ein Überblick über die Verwendung und Funktionen von create-eth-app" +title: Starten Sie Ihre Dapp-Frontend-Entwicklung mit create-eth-app +description: "Ein Überblick über die Verwendung von create-eth-app und seine Funktionen" author: "Markus Waas" tags: - ["frontend", "javascript", "ethers.js", "the graph", "defi"] + ["frontend", "JavaScript", "ethers.js", "the graph", "defi"] skill: beginner -breadcrumb: "create-eth-app" +breadcrumb: create-eth-app lang: de published: 2020-04-27 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/create-eth-app --- -Zuletzt haben wir uns [das große Ganze von Solidity](https://soliditydeveloper.com/solidity-overview-2020) angesehen und bereits [create-eth-app](https://github.com/PaulRBerg/create-eth-app) erwähnt. Jetzt erfährst du, wie du sie verwenden kannst, welche Funktionen integriert sind und wie du sie weiter ausbauen kannst. Diese App, die von Paul Razvan Berg, dem Gründer von [Sablier](http://sablier.com/), gestartet wurde, wird deine Frontend-Entwicklung in Schwung bringen und bietet mehrere optionale Integrationen zur Auswahl. +Beim letzten Mal haben wir uns [das Gesamtbild von Solidity](https://soliditydeveloper.com/solidity-overview-2020) angesehen und bereits die [create-eth-app](https://github.com/PaulRBerg/create-eth-app) erwähnt. Nun werden Sie herausfinden, wie man sie benutzt, welche Funktionen integriert sind und zusätzliche Ideen erhalten, wie man sie erweitern kann. Gestartet von Paul Razvan Berg, dem Gründer von [Sablier](http://sablier.com/), wird diese App Ihre Frontend-Entwicklung in Schwung bringen und bietet mehrere optionale Integrationen zur Auswahl. ## Installation {#installation} -Die Installation erfordert Yarn 0.25 oder höher (`npm install yarn --global`). Die Ausführung ist denkbar einfach: +Die Installation erfordert Yarn 0.25 oder höher (`npm install yarn --global`). Es ist so einfach wie das Ausführen von: ```bash yarn create eth-app my-eth-app @@ -24,44 +24,44 @@ cd my-eth-app yarn react-app:start ``` -Es verwendet [create-react-app](https://github.com/facebook/create-react-app) unter der Haube. Um deine App zu sehen, öffne `http://localhost:3000/`. Wenn du bereit für den Einsatz in der Produktion bist, erstelle mit yarn build ein minifiziertes Bundle. Eine einfache Möglichkeit, dies zu hosten, wäre [Netlify](https://www.netlify.com/). Du kannst ein GitHub-Repo erstellen, es zu Netlify hinzufügen, den Build-Befehl einrichten und schon bist du fertig! Deine App wird gehostet und ist für alle nutzbar. Und all das kostenlos. +Unter der Haube wird [create-react-app](https://github.com/facebook/create-react-app) verwendet. Um Ihre App zu sehen, öffnen Sie `http://localhost:3000/`. Wenn Sie bereit sind, in die Produktion zu gehen, erstellen Sie ein minimiertes Bundle mit yarn build. Eine einfache Möglichkeit, dies zu hosten, wäre [Netlify](https://www.netlify.com/). Sie können ein GitHub-Repo erstellen, es zu Netlify hinzufügen, den Build-Befehl einrichten und schon sind Sie fertig! Ihre App wird gehostet und ist für jeden nutzbar. Und das alles kostenlos. ## Funktionen {#features} ### React & create-react-app {#react--create-react-app} -Zunächst einmal das Herzstück der App: React und all die zusätzlichen Funktionen, die mit _create-react-app_ kommen. Die alleinige Nutzung ist eine gute Option, wenn du Ethereum nicht integrieren möchtest. [React](https://react.dev/) selbst macht die Erstellung interaktiver UIs wirklich einfach. Es mag nicht so einsteigerfreundlich sein wie [Vue](https://vuejs.org/), aber es wird immer noch am häufigsten verwendet, hat mehr Funktionen und, was am wichtigsten ist, es stehen Tausende von zusätzlichen Bibliotheken zur Auswahl. Die _create-react-app_ macht den Einstieg ebenfalls sehr einfach und umfasst: +Zunächst einmal das Herzstück der App: React und all die zusätzlichen Funktionen, die mit _create-react-app_ einhergehen. Nur dies zu verwenden, ist eine großartige Option, wenn Sie Ethereum nicht integrieren möchten. [React](https://react.dev/) selbst macht das Erstellen interaktiver Benutzeroberflächen (UIs) wirklich einfach. Es ist vielleicht nicht so anfängerfreundlich wie [Vue](https://vuejs.org/), aber es wird immer noch am häufigsten verwendet, hat mehr Funktionen und vor allem Tausende von zusätzlichen Bibliotheken zur Auswahl. Die _create-react-app_ macht den Einstieg ebenfalls sehr einfach und beinhaltet: -- Unterstützung für React-, JSX-, ES6-, TypeScript- und Flow-Syntax. -- Spracherweiterungen über ES6 hinaus, wie der Object-Spread-Operator. -- CSS mit automatischen Präfixen, sodass du keine -webkit- oder andere Präfixe benötigst. -- Ein schneller, interaktiver Unit-Test-Runner mit integrierter Unterstützung für Coverage-Reporting. -- Ein Live-Entwicklungsserver, der vor häufigen Fehlern warnt. +- Unterstützung für React, JSX, ES6, TypeScript und Flow-Syntax. +- Sprach-Extras über ES6 hinaus, wie den Object-Spread-Operator. +- Autoprefixed CSS, sodass Sie keine -webkit- oder andere Präfixe benötigen. +- Einen schnellen, interaktiven Unit-Test-Runner mit integrierter Unterstützung für Coverage-Reporting. +- Einen Live-Entwicklungsserver, der vor häufigen Fehlern warnt. - Ein Build-Skript zum Bündeln von JS, CSS und Bildern für die Produktion, mit Hashes und Sourcemaps. -Die _create-eth-app_ macht insbesondere von den neuen [Hooks-Effekten](https://legacy.reactjs.org/docs/hooks-effect.html) Gebrauch. Eine Methode, um leistungsstarke und dennoch sehr kleine sogenannte funktionale Komponenten zu schreiben. Wie sie in _create-eth-app_ verwendet werden, steht im folgenden Abschnitt über Apollo. +Insbesondere die _create-eth-app_ nutzt die neuen [Hooks-Effekte](https://legacy.reactjs.org/docs/hooks-effect.html). Eine Methode, um leistungsstarke, aber dennoch sehr kleine sogenannte funktionale Komponenten zu schreiben. Im folgenden Abschnitt über Apollo erfahren Sie, wie sie in der _create-eth-app_ verwendet werden. ### Yarn Workspaces {#yarn-workspaces} -[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) ermöglichen es, mehrere Pakete zu haben, diese aber alle vom Stammverzeichnis aus zu verwalten und die Abhängigkeiten für alle auf einmal mit `yarn install` zu installieren. Dies ist vor allem bei kleineren Zusatzpaketen wie dem Management von Smart-Contract-Adressen/ABIs (die Information darüber, wo man welche Smart Contracts eingesetzt hat und wie man mit ihnen kommuniziert) oder der Graph-Integration sinnvoll, die beide Teil von `create-eth-app` sind. +[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) ermöglichen es Ihnen, mehrere Pakete zu haben, diese aber alle aus dem Stammordner zu verwalten und Abhängigkeiten für alle auf einmal mit `yarn install` zu installieren. Dies ist besonders sinnvoll für kleinere Zusatzpakete wie die Verwaltung von Smart Contract-Adressen/ABIs (die Informationen darüber, wo Sie welche Smart Contracts bereitgestellt haben und wie Sie mit ihnen kommunizieren) oder die Graph-Integration, die beide Teil der `create-eth-app` sind. ### ethers.js {#ethersjs} -Obwohl [Web3](https://docs.web3js.org/) immer noch am häufigsten verwendet wird, hat [ethers.js](https://docs.ethers.io/) im letzten Jahr als Alternative viel Anklang gefunden und ist in _create-eth-app_ integriert. Du kannst damit arbeiten, zu Web3 wechseln oder ein Upgrade auf [ethers.js v5](https://docs.ethers.org/v5/) in Erwägung ziehen, das fast die Beta-Phase abgeschlossen hat. +Während [Web3](https://docs.web3js.org/) immer noch am häufigsten verwendet wird, hat [ethers.js](https://docs.ethers.io/) im letzten Jahr als Alternative stark an Zugkraft gewonnen und ist in die _create-eth-app_ integriert. Sie können damit arbeiten, es auf Web3 umstellen oder ein Upgrade auf [ethers.js v5](https://docs.ethers.org/v5/) in Betracht ziehen, das die Beta-Phase fast verlassen hat. ### The Graph {#the-graph} -[GraphQL](https://graphql.org/) ist im Vergleich zu einer [RESTful-API](https://restfulapi.net/) eine alternative Methode für den Umgang mit Daten. Sie haben mehrere Vorteile gegenüber RESTful-APIs, insbesondere für dezentrale Blockchain-Daten. Wenn du an der Begründung dafür interessiert bist, schau dir [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a) an. +[GraphQL](https://graphql.org/) ist ein alternativer Weg zur Datenverarbeitung im Vergleich zu einer [Restful API](https://restfulapi.net/). Es bietet mehrere Vorteile gegenüber Restful APIs, insbesondere für dezentralisierte Blockchain-Daten. Wenn Sie an den Gründen dafür interessiert sind, werfen Sie einen Blick auf [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). -Normalerweise würdest du Daten direkt von deinem Smart Contract abrufen. Willst du die Zeit des letzten Handels auslesen? Rufe einfach `MyContract.methods.latestTradeTime().call()` auf, was die Daten von einem Ethereum-Node in deine Dapp holt. Aber was ist, wenn du Hunderte verschiedener Datenpunkte benötigst? Das würde zu Hunderten von Datenabrufen beim Node führen, die jedes Mal eine [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) erfordern, was deine Dapp langsam und ineffizient machen würde. Eine Problemumgehung könnte eine Abruffunktion in deinem Contract sein, die mehrere Daten auf einmal zurückgibt. Das ist aber nicht immer ideal. +Normalerweise würden Sie Daten direkt von Ihrem Smart Contract abrufen. Möchten Sie die Zeit des letzten Handels auslesen? Rufen Sie einfach `MyContract.methods.latestTradeTime().call()` auf, was die Daten von einem Ethereum-Blockchain-Knoten in Ihre Dapp abruft. Aber was ist, wenn Sie Hunderte von verschiedenen Datenpunkten benötigen? Das würde zu Hunderten von Datenabrufen beim Blockchain-Knoten führen, die jedes Mal eine [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) erfordern und Ihre Dapp langsam und ineffizient machen. Ein Workaround könnte eine Fetcher-Call-Funktion innerhalb Ihres Vertrags sein, die mehrere Daten auf einmal zurückgibt. Dies ist jedoch nicht immer ideal. -Und dann bist du vielleicht auch an historischen Daten interessiert. Du willst nicht nur die Zeit des letzten Handels wissen, sondern die Zeiten aller Handelsgeschäfte, die du jemals selbst getätigt hast. Verwende das Subgraph-Paket von _create-eth-app_, lies die [Dokumentation](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) und passe es an deine eigenen Contracts an. Wenn du nach beliebten Smart Contracts suchst, gibt es möglicherweise sogar bereits einen Subgraph. Sieh dir den [Subgraph-Explorer](https://thegraph.com/explorer/) an. +Und dann könnten Sie auch an historischen Daten interessiert sein. Sie möchten nicht nur die letzte Handelszeit wissen, sondern die Zeiten für alle Trades, die Sie jemals selbst getätigt haben. Verwenden Sie das Subgraph-Paket der _create-eth-app_, lesen Sie die [Dokumentation](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) und passen Sie es an Ihre eigenen Verträge an. Wenn Sie nach beliebten Smart Contracts suchen, gibt es möglicherweise sogar schon einen Subgraph. Schauen Sie sich den [Subgraph Explorer](https://thegraph.com/explorer/) an. -Sobald du einen Subgraph hast, kannst du eine einfache Abfrage in deiner Dapp schreiben, die alle wichtigen Blockchain-Daten, einschließlich historischer Daten, die du benötigst, abruft; dafür ist nur ein Abruf erforderlich. +Sobald Sie einen Subgraph haben, können Sie eine einfache Abfrage in Ihrer Dapp schreiben, die alle wichtigen Blockchain-Daten einschließlich der historischen abruft, die Sie benötigen – es ist nur ein einziger Abruf erforderlich. ### Apollo {#apollo} -Dank der [Apollo Boost](https://www.apollographql.com/docs/react/get-started/)-Integration kannst du den Graphen einfach in deine React-Dapp integrieren. Besonders bei der Verwendung von React Hooks und Apollo ist das Abrufen von Daten so einfach wie das Schreiben einer einzigen GraphQL-Abfrage in deiner Komponente: +Dank der [Apollo Boost](https://www.apollographql.com/docs/react/get-started/)-Integration können Sie The Graph ganz einfach in Ihre React-Dapp integrieren. Besonders bei der Verwendung von [React Hooks und Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks) ist das Abrufen von Daten so einfach wie das Schreiben einer einzigen GraphQL-Abfrage in Ihrer Komponente: ```js const { loading, error, data } = useQuery(myGraphQlQuery) @@ -75,32 +75,32 @@ React.useEffect(() => { ## Vorlagen {#templates} -Darüber hinaus kannst du aus verschiedenen Vorlagen wählen. Bisher kannst du eine Aave-, Compound-, UniSwap- oder Sablier-Integration verwenden. Sie alle fügen wichtige Smart-Contract-Adressen für Dienste zusammen mit vorgefertigten Subgraph-Integrationen hinzu. Füge einfach die Vorlage zum Erstellungsbefehl hinzu, wie `yarn create eth-app my-eth-app --with-template aave`. +Darüber hinaus können Sie aus mehreren verschiedenen Vorlagen wählen. Bisher können Sie eine Integration für Aave, Compound, Uniswap oder Sablier verwenden. Sie alle fügen wichtige Service-Smart Contract-Adressen zusammen mit vorgefertigten Subgraph-Integrationen hinzu. Fügen Sie einfach die Vorlage zum Erstellungsbefehl hinzu, wie z. B. `yarn create eth-app my-eth-app --with-template aave`. ### Aave {#aave} -[Aave](https://aave.com/) ist ein dezentraler Geldleihmarkt. Die Einleger stellen dem Markt Liquidität zur Verfügung, um passives Einkommen zu generieren, während Kreditnehmer sich mithilfe von Sicherheiten Geld leihen können. Eine einzigartige Funktion von Aave sind die [Flash Loans](https://aave.com/docs/developers/flash-loans), die es dir ermöglichen, Geld ohne jegliche Sicherheiten zu leihen, solange du das Darlehen innerhalb einer einzigen Transaktion zurückzahlst. Das kann zum Beispiel nützlich sein, um zusätzliches Geld für das Arbitrage-Trading zu erhalten. +[Aave](https://aave.com/) ist ein dezentralisierter Geldleihmarkt. Einleger stellen dem Markt Liquidität zur Verfügung, um ein passives Einkommen zu erzielen, während Kreditnehmer in der Lage sind, Kredite gegen Sicherheiten aufzunehmen. Ein einzigartiges Merkmal von Aave sind die [Flash Loans](https://aave.com/docs/developers/flash-loans) (Blitzkredite), die es Ihnen ermöglichen, Geld ohne Sicherheiten zu leihen, solange Sie den Kredit innerhalb einer einzigen Transaktion zurückzahlen. Dies kann beispielsweise nützlich sein, um Ihnen zusätzliches Kapital für Arbitrage-Handel zu verschaffen. -Gehandelte Token, die dir Zinsen einbringen, werden _aTokens_ genannt. +Gehandelte Token, die Ihnen Zinsen einbringen, werden _aTokens_ genannt. -Wenn du dich für die Integration von Aave mit _create-eth-app_ entscheidest, erhältst du eine [Subgraph-Integration](https://docs.aave.com/developers/getting-started/using-graphql). Aave verwendet The Graph und stellt dir bereits mehrere einsatzbereite Subgraphs auf [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) und [Mainnet](https://thegraph.com/explorer/subgraph/aave/protocol) in [roher](https://thegraph.com/explorer/subgraph/aave/protocol-raw) oder [formatierter](https://thegraph.com/explorer/subgraph/aave/protocol) Form zur Verfügung. +Wenn Sie sich entscheiden, Aave in die _create-eth-app_ zu integrieren, erhalten Sie eine [Subgraph-Integration](https://docs.aave.com/developers/getting-started/using-graphql). Aave verwendet The Graph und stellt Ihnen bereits mehrere einsatzbereite Subgraphs auf [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) und im [Mainnet](https://thegraph.com/explorer/subgraph/aave/protocol) in [roher](https://thegraph.com/explorer/subgraph/aave/protocol-raw) oder [formatierter](https://thegraph.com/explorer/subgraph/aave/protocol) Form zur Verfügung. -![Aave Flash-Loan-Meme – „Yeahhh, wenn ich meinen Flash Loan länger als eine Transaktion behalten könnte, wäre das großartig“](./flashloan-meme.png) +![Aave Flash Loan Meme – "Yeahhh, if I could keep my flash loan longer than 1 transaction, that would be great"](./flashloan-meme.png) ### Compound {#compound} -[Compound](https://compound.finance/) ist ähnlich wie Aave. Die Integration enthält bereits den neuen [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Die zinsbringenden Token werden hier überraschenderweise _cTokens_ genannt. +[Compound](https://compound.finance/) ist ähnlich wie Aave. Die Integration beinhaltet bereits den neuen [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Die zinsbringenden Token werden hier überraschenderweise _cTokens_ genannt. ### Uniswap {#uniswap} -[Uniswap](https://uniswap.exchange/) ist eine dezentralisierte Börse (DEX). Liquiditätsanbieter können Gebühren verdienen, indem sie die erforderlichen Token oder Ether für beide Seiten eines Handels bereitstellen. Es ist weit verbreitet und hat daher eine der höchsten Liquiditäten für eine sehr breite Palette von Token. Du kannst es einfach in deine Dapp integrieren, um beispielsweise Benutzern zu ermöglichen, ihre ETH gegen DAI zu tauschen. +[Uniswap](https://uniswap.exchange/) ist eine dezentralisierte Börse (DEX). Liquiditätsanbieter können Gebühren verdienen, indem sie die erforderlichen Token oder Ether für beide Seiten eines Handels bereitstellen. Sie ist weit verbreitet und weist daher eine der höchsten Liquiditäten für eine sehr breite Palette von Token auf. Sie können sie einfach in Ihre Dapp integrieren, um Benutzern beispielsweise zu ermöglichen, ihre ETH gegen DAI zu tauschen. -Leider ist die Integration zum Zeitpunkt der Erstellung dieses Artikels nur für Uniswap v1 und nicht für die [gerade veröffentlichte v2](https://uniswap.org/blog/uniswap-v2/) möglich. +Leider ist die Integration zum Zeitpunkt der Erstellung dieses Artikels nur für Uniswap v1 und nicht für das [gerade veröffentlichte v2](https://uniswap.org/blog/uniswap-v2/) verfügbar. ### Sablier {#sablier} -[Sablier](https://sablier.com/) ermöglicht Benutzern das Streamen von Geldzahlungen. Anstelle eines einzelnen Zahltages erhältst du dein Geld nach der anfänglichen Einrichtung kontinuierlich und ohne weitere Verwaltung. Die Integration umfasst einen [eigenen Subgraph](https://thegraph.com/explorer/subgraph/sablierhq/sablier). +[Sablier](https://sablier.com/) ermöglicht Benutzern das Streamen von Geldzahlungen. Anstelle eines einzigen Zahltags erhalten Sie Ihr Geld nach der anfänglichen Einrichtung kontinuierlich und ohne weiteren Verwaltungsaufwand. Die Integration beinhaltet ihren [eigenen Subgraph](https://thegraph.com/explorer/subgraph/sablierhq/sablier). -## Was kommt als Nächstes? {#whats-next} +## Wie geht es weiter? {#whats-next} -Wenn du Fragen zu _create-eth-app_ hast, besuche den [Sablier Community-Server](https://discord.gg/bsS8T47), wo du mit den Autoren von _create-eth-app_ in Kontakt treten kannst. Als erste nächste Schritte könntest du ein UI-Framework wie [Material UI](https://mui.com/material-ui/) integrieren, GraphQL-Abfragen für die Daten schreiben, die du tatsächlich benötigst, und das Deployment einrichten. +Wenn Sie Fragen zur _create-eth-app_ haben, besuchen Sie den [Sablier-Community-Server](https://discord.gg/bsS8T47), wo Sie mit den Autoren der _create-eth-app_ in Kontakt treten können. Als erste nächste Schritte möchten Sie vielleicht ein UI-Framework wie [Material UI](https://mui.com/material-ui/) integrieren, GraphQL-Abfragen für die Daten schreiben, die Sie tatsächlich benötigen, und das Deployment einrichten. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md index 2a5fa04190d..c9805139677 100644 --- a/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md +++ b/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -1,37 +1,37 @@ --- -title: Grundlegende Ethereum-Themen mit SQL lernen -description: "Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem sie On-Chain-Daten mit der Structured Query Language (SQL) abfragen." +title: Lerne grundlegende Ethereum-Themen mit SQL +description: "Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem Daten auf der Blockchain mit der Structured Query Language (SQL) abgefragt werden." author: "Paul Apivat" -tags: ["SQL", "Querying", "Transactions"] +tags: ["SQL", "Abfragen", "Transaktionen", "data-and-analytics"] skill: beginner -breadcrumb: "Ethereum mit SQL" +breadcrumb: Ethereum mit SQL lang: de published: 2021-05-11 source: paulapivat.com sourceUrl: https://paulapivat.com/post/query_ethereum/ --- -Viele Ethereum-Tutorials richten sich an Entwickler, aber es mangelt an Lernressourcen für Datenanalysten oder für Leute, die On-Chain-Daten einsehen möchten, ohne einen Client oder einen Knoten zu betreiben. +Viele Ethereum-Tutorials richten sich an Entwickler, aber es mangelt an Bildungsressourcen für Datenanalysten oder für Personen, die Daten auf der Blockchain sehen möchten, ohne eine Anwendung oder einen Blockchain-Knoten auszuführen. -Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem sie On-Chain-Daten mit der Structured Query Language (SQL) über eine von [Dune Analytics](https://dune.com/) bereitgestellte Schnittstelle abfragen. +Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem Daten auf der Blockchain mit der Structured Query Language (SQL) über eine von [Dune Analytics](https://dune.com/) bereitgestellte Schnittstelle abgefragt werden. -On-Chain-Daten können uns helfen, Ethereum, das Netzwerk und seine Wirtschaftlichkeit in Bezug auf die Rechenleistung zu verstehen. Sie sollten als Grundlage für das Verständnis der Herausforderungen dienen, mit denen Ethereum heute konfrontiert ist (z. B. steigende Gaspreise) und, was noch wichtiger ist, für Diskussionen über Skalierungslösungen. +Daten auf der Blockchain können uns helfen, Ethereum, das Netzwerk und die Ökonomie für Rechenleistung zu verstehen. Sie sollten als Grundlage dienen, um die Herausforderungen zu verstehen, denen Ethereum heute gegenübersteht (z. B. steigende Gaspreise), und, was noch wichtiger ist, die Diskussionen über Skalierungslösungen. ### Transaktionen {#transactions} -Die Reise eines Nutzers auf Ethereum beginnt mit der Initialisierung eines nutzergesteuerten Kontos oder einer Entität mit einem ETH-Guthaben. Es gibt zwei Kontotypen – benutzergesteuert oder ein Smart Contract (siehe [ethereum.org](/developers/docs/accounts/)). +Die Reise eines Benutzers auf Ethereum beginnt mit der Initialisierung eines benutzergesteuerten Kontos oder einer Entität mit einem ETH-Guthaben. Es gibt zwei Arten von Konten – benutzergesteuerte oder ein Smart Contract (siehe [ethereum.org](/developers/docs/accounts/)). -Jedes Konto kann in einem Block-Explorer wie [Etherscan](https://etherscan.io/) oder [Blockscout](https://eth.blockscout.com/) eingesehen werden. Block-Explorer sind ein Portal zu den Daten von Ethereum. Sie zeigen in Echtzeit Daten zu Blöcken, Transaktionen, Minern, Konten und anderen On-Chain-Aktivitäten an (siehe [hier](/developers/docs/data-and-analytics/block-explorers/)). +Jedes Konto kann in einer Blocksuchmaschine wie [Etherscan](https://etherscan.io/) oder [Blockscout](https://eth.blockscout.com/) eingesehen werden. Blocksuchmaschinen sind ein Portal zu den Daten von Ethereum. Sie zeigen in Echtzeit Daten zu Blöcken, Transaktionen, Minern, Konten und anderen Aktivitäten auf der Blockchain an (siehe [hier](/developers/docs/data-and-analytics/block-explorers/)). -Ein Benutzer möchte die Daten jedoch möglicherweise direkt abfragen, um die von externen Block-Explorern bereitgestellten Informationen abzugleichen. [Dune Analytics](https://dune.com/) bietet diese Möglichkeit jedem, der über SQL-Kenntnisse verfügt. +Ein Benutzer möchte jedoch möglicherweise die Daten direkt abfragen, um die von externen Blocksuchmaschinen bereitgestellten Informationen abzugleichen. [Dune Analytics](https://dune.com/) bietet diese Möglichkeit für jeden mit etwas SQL-Wissen. -Als Referenz kann das Smart-Contract-Konto der Ethereum Foundation (EF) auf [Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) eingesehen werden. +Als Referenz kann das Smart Contract-Konto der Ethereum Foundation (EF) auf [Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) eingesehen werden. -Es ist zu beachten, dass alle Konten, einschließlich desjenigen der EF, eine öffentliche Adresse haben, die zum Senden und Empfangen von Transaktionen verwendet werden kann. +Es ist zu beachten, dass alle Konten, einschließlich des der EF, eine öffentliche Adresse haben, die zum Senden und Empfangen von Transaktionen verwendet werden kann. -Der Kontostand auf Etherscan umfasst reguläre Transaktionen und interne Transaktionen. Interne Transaktionen sind, trotz des Namens, keine _tatsächlichen_ Transaktionen, die den Zustand der Chain ändern. Es handelt sich um Wertübertragungen, die durch die Ausführung eines Vertrags initiiert werden ([Quelle](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Da interne Transaktionen keine Signatur haben, sind sie **nicht** in der Blockchain enthalten und können nicht mit Dune Analytics abgefragt werden. +Der Kontostand auf Etherscan umfasst reguläre Transaktionen und interne Transaktionen. Interne Transaktionen sind trotz des Namens keine _tatsächlichen_ Transaktionen, die den Zustand der Chain ändern. Es handelt sich um Wertübertragungen, die durch die Ausführung eines Vertrags initiiert werden ([Quelle](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Da interne Transaktionen keine Signatur haben, sind sie **nicht** in der Blockchain enthalten und können nicht mit Dune Analytics abgefragt werden. -Daher wird sich dieses Tutorial auf reguläre Transaktionen konzentrieren. Dies kann wie folgt abgefragt werden: +Daher wird sich dieses Tutorial auf reguläre Transaktionen konzentrieren. Diese können wie folgt abgefragt werden: ```sql WITH temp_table AS ( @@ -59,11 +59,11 @@ SELECT FROM temp_table ``` -Dies liefert die gleichen Informationen wie auf der Transaktionsseite von Etherscan. Zum Vergleich, hier die beiden Quellen: +Dies liefert dieselben Informationen, die auf der Transaktionsseite von Etherscan bereitgestellt werden. Zum Vergleich sind hier die beiden Quellen: #### Etherscan {#etherscan} -![Screenshot der Etherscan-Transaktions-Explorer-Ansicht](./etherscan_view.png) +![Screenshot der Etherscan-Transaktionsansicht](./etherscan_view.png) [Vertragsseite der EF auf Blockscout.](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) @@ -71,19 +71,19 @@ Dies liefert die gleichen Informationen wie auf der Transaktionsseite von Ethers ![Screenshot eines Dune Analytics-Abfrage-Dashboards](./dune_view.png) -Das Dashboard finden Sie [hier](https://dune.com/paulapivat/Learn-Ethereum). Klicken Sie auf die Tabelle, um die Abfrage zu sehen (siehe auch oben). +Du findest das Dashboard [hier](https://dune.com/paulapivat/Learn-Ethereum). Klicke auf die Tabelle, um die Abfrage zu sehen (siehe auch oben). -### Transaktionen im Detail {#breaking_down_transactions} +### Transaktionen aufschlüsseln {#breaking_down_transactions} Eine übermittelte Transaktion enthält mehrere Informationen, darunter ([Quelle](/developers/docs/transactions/)): -- **Empfänger**: Die Empfangsadresse (abgefragt als „to“) -- **Signatur**: Während die privaten Schlüssel eines Absenders eine Transaktion signieren, können wir mit SQL die öffentliche Adresse eines Absenders abfragen („from“). -- **Wert**: Dies ist der Betrag an transferiertem ETH (siehe Spalte `ether`). -- **Daten**: Das sind beliebige Daten, die gehasht wurden (siehe Spalte `data`) -- **gasLimit** – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden kann. Gaseinheiten stellen Rechenschritte dar. -- **maxPriorityFeePerGas** – die maximale Gasmenge, die als Trinkgeld für den Miner enthalten sein soll -- **maxFeePerGas** – die maximale Menge an Gas, die für die Transaktion gezahlt werden soll (einschließlich baseFeePerGas und maxPriorityFeePerGas) +- **Empfänger**: Die Empfangsadresse (abgefragt als "to") +- **Signatur**: Während der Private-Key eines Senders eine Transaktion signiert, können wir mit SQL die öffentliche Adresse des Senders ("from") abfragen. +- **Wert**: Dies ist die Menge an übertragenen ETH (siehe Spalte `ether`). +- **Daten**: Dies sind beliebige Daten, die gehasht wurden (siehe Spalte `data`). +- **gasLimit** – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden kann. Gaseinheiten repräsentieren Rechenschritte. +- **maxPriorityFeePerGas** - die maximale Menge an Gas, die als Trinkgeld für den Miner enthalten sein soll. +- **maxFeePerGas** - die maximale Menge an Gas, die man bereit ist, für die Transaktion zu zahlen (einschließlich baseFeePerGas und maxPriorityFeePerGas). Wir können diese spezifischen Informationen für Transaktionen an die öffentliche Adresse der Ethereum Foundation abfragen: @@ -104,11 +104,11 @@ ORDER BY block_time DESC ### Blöcke {#blocks} -Jede Transaktion ändert den Zustand der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)) ([Quelle](/developers/docs/transactions/)). Transaktionen werden an das Netzwerk gesendet, um verifiziert und in einen Block aufgenommen zu werden. Jede Transaktion ist mit einer Blocknummer verknüpft. Um die Daten zu sehen, können wir eine bestimmte Blocknummer abfragen: 12396854 (der jüngste Block der Ethereum-Foundation-Transaktionen zum Zeitpunkt des Schreibens dieses Tutorials am 5.11.2021). +Jede Transaktion ändert den Zustand der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)) ([Quelle](/developers/docs/transactions/)). Transaktionen werden an das Netzwerk übertragen, um verifiziert und in einen Block aufgenommen zu werden. Jede Transaktion ist mit einer Blocknummer verknüpft. Um die Daten zu sehen, könnten wir eine bestimmte Blocknummer abfragen: 12396854 (der aktuellste Block unter den Transaktionen der Ethereum Foundation zum Zeitpunkt dieses Schreibens, 11.05.21). -Wenn wir die nächsten beiden Blöcke abfragen, können wir außerdem sehen, dass jeder Block den Hash des vorherigen Blocks (d. h. den übergeordneten Hash) enthält, was zeigt, wie die Blockchain aufgebaut ist. +Wenn wir außerdem die nächsten beiden Blöcke abfragen, können wir sehen, dass jeder Block den Hash des vorherigen Blocks (d. h. den Parent-Hash) enthält, was veranschaulicht, wie die Blockchain gebildet wird. -Jeder Block enthält einen Verweis auf seinen übergeordneten Block. Dies wird unten zwischen den Spalten `hash` und `parent_hash` gezeigt ([Quelle](/developers/docs/blocks/)): +Jeder Block enthält einen Verweis auf seinen übergeordneten Block (Parent-Block). Dies wird unten zwischen den Spalten `hash` und `parent_hash` gezeigt ([Quelle](/developers/docs/blocks/)): ![parent_hash](./parent_hash.png) @@ -126,18 +126,18 @@ WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856 LIMIT 10 ``` -Wir können einen Block untersuchen, indem wir Zeit, Blocknummer, Schwierigkeitsgrad, Hash, übergeordneten Hash und die Nonce abfragen. +Wir können einen Block untersuchen, indem wir Zeit, Blocknummer, Schwierigkeit, Hash, Parent-Hash und Nonce abfragen. -Das Einzige, was diese Abfrage nicht abdeckt, ist die _Liste der Transaktionen_, die eine separate Abfrage unten erfordert, und der _State-Root_. Ein Full- oder Archiv-Node speichert alle Transaktionen und Zustandsübergänge, sodass Clients den Zustand der Chain jederzeit abfragen können. Da dies viel Speicherplatz erfordert, können wir Chain-Daten von Zustandsdaten trennen: +Das Einzige, was diese Abfrage nicht abdeckt, ist die _Liste der Transaktionen_, die eine separate Abfrage unten erfordert, und die _State Root_. Ein vollständiger oder Archiv-Blockchain-Knoten speichert alle Transaktionen und Zustandsübergänge, sodass Anwendungen den Zustand der Chain jederzeit abfragen können. Da dies großen Speicherplatz erfordert, können wir Chain-Daten von Zustandsdaten trennen: - Chain-Daten (Liste von Blöcken, Transaktionen) - Zustandsdaten (Ergebnis des Zustandsübergangs jeder Transaktion) -Der State-Root fällt unter Letzteres und ist _implizite_ Daten (nicht on-chain gespeichert), während Chain-Daten explizit sind und auf der Chain selbst gespeichert werden ([Quelle](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). +Die State Root fällt in Letzteres und sind _implizite_ Daten (nicht auf der Blockchain gespeichert), während Chain-Daten explizit sind und auf der Chain selbst gespeichert werden ([Quelle](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). -In diesem Tutorial konzentrieren wir uns auf On-Chain-Daten, die mit SQL über Dune Analytics abgefragt werden _können_. +Für dieses Tutorial konzentrieren wir uns auf Daten auf der Blockchain, die mit SQL über Dune Analytics abgefragt werden _können_. -Wie oben erwähnt, enthält jeder Block eine Liste von Transaktionen. Wir können diese abfragen, indem wir nach einem bestimmten Block filtern. Wir versuchen es mit dem letzten Block, 12396854: +Wie oben erwähnt, enthält jeder Block eine Liste von Transaktionen. Wir können diese abfragen, indem wir nach einem bestimmten Block filtern. Wir versuchen es mit dem aktuellsten Block, 12396854: ```sql SELECT * FROM ethereum."transactions" @@ -149,9 +149,9 @@ Hier ist die SQL-Ausgabe auf Dune: ![Screenshot einer Liste von Ethereum-Transaktionen](./list_of_txn.png) -Dieser einzelne Block, der der Chain hinzugefügt wird, ändert den Zustand der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)). Dutzende, manchmal Hunderte von Transaktionen werden auf einmal verifiziert. In diesem speziellen Fall waren 222 Transaktionen enthalten. +Das Hinzufügen dieses einzelnen Blocks zur Chain ändert den Zustand der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)). Dutzende, manchmal Hunderte von Transaktionen werden auf einmal verifiziert. In diesem speziellen Fall waren 222 Transaktionen enthalten. -Um zu sehen, wie viele tatsächlich erfolgreich waren, fügen wir einen weiteren Filter hinzu, um erfolgreiche Transaktionen zu zählen: +Um zu sehen, wie viele tatsächlich erfolgreich waren, würden wir einen weiteren Filter hinzufügen, um erfolgreiche Transaktionen zu zählen: ```sql WITH temp_table AS ( @@ -168,22 +168,22 @@ Für Block 12396854 wurden von insgesamt 222 Transaktionen 204 erfolgreich verif ![Screenshot einer erfolgreichen Ethereum-Transaktion](./successful_txn.png) -Transaktionsanfragen kommen Dutzende Male pro Sekunde vor, aber Blöcke werden etwa alle 15 Sekunden committet ([Quelle](/developers/docs/blocks/)). +Transaktionsanfragen treten dutzende Male pro Sekunde auf, aber Blöcke werden ungefähr alle 15 Sekunden festgeschrieben ([Quelle](/developers/docs/blocks/)). -Um zu sehen, dass ungefähr alle 15 Sekunden ein Block produziert wird, können wir die Anzahl der Sekunden pro Tag (86.400) durch 15 teilen, um eine geschätzte durchschnittliche Anzahl von Blöcken pro Tag (~ 5.760) zu erhalten. +Um zu sehen, dass ungefähr alle 15 Sekunden ein Block produziert wird, könnten wir die Anzahl der Sekunden an einem Tag (86400) durch 15 teilen, um eine geschätzte durchschnittliche Anzahl von Blöcken pro Tag (~ 5760) zu erhalten. -Das Diagramm der täglich erzeugten Ethereum-Blöcke (2016 – heute) ist: +Das Diagramm für die pro Tag produzierten Ethereum-Blöcke (2016 - heute) ist: ![Diagramm, das die tägliche Ethereum-Blockproduktion zeigt](./daily_blocks.png) -Die durchschnittliche Anzahl der in diesem Zeitraum täglich produzierten Blöcke beträgt ~5.874: +Die durchschnittliche Anzahl der täglich produzierten Blöcke in diesem Zeitraum beträgt ~5.874: ![Diagramm, das die tägliche Ethereum-Blockproduktion zeigt](./avg_daily_blocks.png) Die Abfragen lauten: ```sql -# Abfrage zur Visualisierung der täglich produzierten Blöcke seit 2016 +# query to visualize number of blocks produced daily since 2016 SELECT DATE_TRUNC('day', time) AS dt, @@ -192,7 +192,7 @@ FROM ethereum."blocks" GROUP BY dt OFFSET 1 -# durchschnittliche Anzahl der pro Tag produzierten Blöcke +# average number of blocks produced per day WITH temp_table AS ( SELECT @@ -207,13 +207,13 @@ SELECT FROM temp_table ``` -Die durchschnittliche Anzahl der seit 2016 pro Tag produzierten Blöcke liegt mit 5.874 leicht über diesem Wert. Alternativ ergeben 86.400 Sekunden geteilt durch 5.874 durchschnittliche Blöcke 14,7 Sekunden oder ungefähr einen Block alle 15 Sekunden. +Die durchschnittliche Anzahl der pro Tag produzierten Blöcke seit 2016 liegt mit 5.874 leicht über dieser Zahl. Alternativ ergibt die Division von 86400 Sekunden durch durchschnittlich 5874 Blöcke 14,7 Sekunden oder ungefähr einen Block alle 15 Sekunden. ### Gas {#gas} -Blöcke sind in ihrer Größe begrenzt. Die maximale Blockgröße ist dynamisch und variiert je nach Netzwerknachfrage zwischen 12.500.000 und 25.000.000 Einheiten. Limits sind erforderlich, um zu verhindern, dass willkürlich große Blöcke die Full Nodes in Bezug auf Speicherplatz- und Geschwindigkeitsanforderungen belasten ([Quelle](/developers/docs/blocks/)). +Blöcke sind in ihrer Größe begrenzt. Die maximale Blockgröße ist dynamisch und variiert je nach Netzwerknachfrage zwischen 12.500.000 und 25.000.000 Einheiten. Limits sind erforderlich, um zu verhindern, dass beliebig große Blockgrößen vollständige Blockchain-Knoten in Bezug auf Speicherplatz und Geschwindigkeitsanforderungen belasten ([Quelle](/developers/docs/blocks/)). -Eine Möglichkeit, sich das Block-Gaslimit vorzustellen, ist, es als das **Angebot** an verfügbarem Blockspace zu betrachten, in dem Transaktionen gebündelt werden. Das Block-Gaslimit kann von 2016 bis heute abgefragt und visualisiert werden: +Eine Möglichkeit, das Block-Gaslimit zu konzeptualisieren, besteht darin, es sich als das **Angebot** an verfügbarem Blockplatz vorzustellen, in dem Transaktionen gebündelt werden können. Das Block-Gaslimit kann von 2016 bis heute abgefragt und visualisiert werden: ![Diagramm, das das durchschnittliche Ethereum-Gaslimit im Zeitverlauf zeigt](./avg_gas_limit.png) @@ -226,9 +226,9 @@ GROUP BY dt OFFSET 1 ``` -Dann gibt es das tatsächlich täglich verwendete Gas, um für Berechnungen auf der Ethereum-Chain zu bezahlen (d. h. das Senden von Transaktionen, das Aufrufen eines Smart Contracts, das Prägen eines NFT). Dies ist die **Nachfrage** nach verfügbarem Ethereum-Blockspace: +Dann gibt es das tatsächliche Gas, das täglich verbraucht wird, um für Berechnungen auf der Ethereum-Chain zu bezahlen (z. B. das Senden einer Transaktion, das Aufrufen eines Smart Contracts, das Prägen eines NFTs). Dies ist die **Nachfrage** nach verfügbarem Ethereum-Blockplatz: -![Diagramm, das den täglichen Ethereum-Gasverbrauch zeigt](./daily_gas_used.png) +![Diagramm, das das täglich verbrauchte Ethereum-Gas zeigt](./daily_gas_used.png) ```sql SELECT @@ -239,17 +239,17 @@ GROUP BY dt OFFSET 1 ``` -Wir können diese beiden Diagramme auch einander gegenüberstellen, um zu sehen, wie sich **Angebot und Nachfrage** beeinflussen: +Wir können diese beiden Diagramme auch nebeneinanderstellen, um zu sehen, wie **Angebot und Nachfrage** übereinstimmen: ![gas_demand_supply](./gas_demand_supply.png) -Daher können wir Gaspreise als eine Funktion der Nachfrage nach Ethereum-Blockspace bei gegebenem Angebot verstehen. +Daher können wir Gaspreise als eine Funktion der Nachfrage nach Ethereum-Blockplatz bei gegebenem Angebot verstehen. -Schließlich möchten wir vielleicht die durchschnittlichen täglichen Gaspreise für die Ethereum-Chain abfragen. Dies würde jedoch zu einer besonders langen Abfragezeit führen, also filtern wir unsere Abfrage auf die durchschnittliche Gasmenge, die von der Ethereum Foundation pro Transaktion bezahlt wird. +Schließlich möchten wir vielleicht die durchschnittlichen täglichen Gaspreise für die Ethereum-Chain abfragen. Dies führt jedoch zu einer besonders langen Abfragezeit, sodass wir unsere Abfrage auf die durchschnittliche Menge an Gas filtern, die pro Transaktion von der Ethereum Foundation bezahlt wird. ![Diagramm, das den täglichen Gasverbrauch der Ethereum Foundation zeigt](./ef_daily_gas.png) -Wir können die Gaspreise sehen, die über die Jahre für alle an die Adresse der Ethereum Foundation getätigten Transaktionen gezahlt wurden. Hier ist die Abfrage: +Wir können die Gaspreise sehen, die im Laufe der Jahre für alle Transaktionen an die Adresse der Ethereum Foundation gezahlt wurden. Hier ist die Abfrage: ```sql SELECT @@ -263,8 +263,8 @@ ORDER BY block_time DESC ### Zusammenfassung {#summary} -Mit diesem Tutorial verstehen wir grundlegende Ethereum-Konzepte und wie die Ethereum-Blockchain funktioniert, indem wir On-Chain-Daten abfragen und ein Gefühl für sie bekommen. +Mit diesem Tutorial verstehen wir grundlegende Ethereum-Konzepte und wie die Ethereum-Blockchain funktioniert, indem wir Daten auf der Blockchain abfragen und ein Gefühl dafür bekommen. -Das Dashboard mit dem gesamten in diesem Tutorial verwendeten Code finden Sie [hier](https://dune.com/paulapivat/Learn-Ethereum). +Das Dashboard, das den gesamten in diesem Tutorial verwendeten Code enthält, ist [hier](https://dune.com/paulapivat/Learn-Ethereum) zu finden. -Für weitere Datennutzung zur Erkundung von Web3 [finden Sie mich auf Twitter](https://twitter.com/paulapivat). +Für weitere Datennutzung zur Erkundung von Web3 [findest du mich auf Twitter](https://twitter.com/paulapivat). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md index 8b3195eedf4..9465653e814 100644 --- a/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md +++ b/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md @@ -1,10 +1,10 @@ --- -title: Protokollierung von Daten aus Smart Contracts mit Ereignissen +title: Datenprotokollierung von Smart Contracts mit Ereignissen description: "Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Datenprotokollierung verwenden können" author: "jdourlens" -tags: ["smart contracts", "remix", "solidity", "events"] +tags: ["Smart Contracts", "Remix", "Solidity", "Ereignisse"] skill: intermediate -breadcrumb: "Event-Protokollierung" +breadcrumb: Ereignisprotokollierung lang: de published: 2020-04-03 source: EthereumDev @@ -12,19 +12,19 @@ sourceUrl: https://ethereumdev.io/logging-data-with-events/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -In Solidity sind [Ereignisse](/developers/docs/smart-contracts/anatomy/#events-and-logs) Signale, die von Smart Contracts ausgegeben werden können. Dapps oder alles, was mit der JSON-RPC-API von Ethereum verbunden ist, können auf diese Ereignisse lauschen und entsprechend reagieren. Ein Ereignis kann auch indiziert werden, sodass der Ereignisverlauf später durchsuchbar ist. +In Solidity sind [Ereignisse](/developers/docs/smart-contracts/anatomy/#events-and-logs) ausgesendete Signale, die Smart Contracts auslösen können. Dapps oder alles, was mit der Ethereum-JSON-RPC-API verbunden ist, können auf diese Ereignisse hören und entsprechend handeln. Ein Ereignis kann auch indiziert werden, sodass der Ereignisverlauf später durchsuchbar ist. ## Ereignisse {#events} -Das häufigste Ereignis auf der Ethereum-Blockchain ist zum Zeitpunkt der Erstellung dieses Artikels das Transfer-Ereignis, das von ERC20-Tokens ausgegeben wird, wenn jemand Token überträgt. +Das häufigste Ereignis auf der Ethereum-Blockchain zum Zeitpunkt des Verfassens dieses Artikels ist das Transfer-Ereignis, das von ERC20-Token ausgegeben wird, wenn jemand Token überträgt. ```solidity event Transfer(address indexed from, address indexed to, uint256 value); ``` -Die Ereignissignatur wird innerhalb des Vertragscodes deklariert und kann mit dem Schlüsselwort emit ausgegeben werden. Zum Beispiel protokolliert das Transfer-Ereignis, wer die Übertragung gesendet hat (_from_), an wen (_to_) und wie viele Token übertragen wurden (_value_). +Die Ereignissignatur wird innerhalb des Vertragscodes deklariert und kann mit dem Schlüsselwort emit ausgelöst werden. Zum Beispiel protokolliert das Transfer-Ereignis, wer die Überweisung gesendet hat (_from_), an wen (_to_) und wie viele Token übertragen wurden (_value_). -Wenn wir zu unserem Counter-Smart-Contract zurückkehren und beschließen, jedes Mal zu protokollieren, wenn der Wert geändert wird. Da dieser Vertrag nicht zur Bereitstellung gedacht ist, sondern als Grundlage für die Erstellung eines anderen Vertrags durch Erweiterung dient, wird er als abstrakter Vertrag bezeichnet. Im Fall unseres Counter-Beispiels würde es so aussehen: +Kehren wir zu unserem Counter-Smart-Contract zurück und beschließen, jede Wertänderung zu protokollieren. Da dieser Vertrag nicht bereitgestellt werden soll, sondern als Basis für den Aufbau eines anderen Vertrags durch Erweiterung dient, wird er als abstrakter Vertrag bezeichnet. Im Fall unseres Zählerbeispiels würde das so aussehen: ```solidity pragma solidity 0.5.17; @@ -33,7 +33,7 @@ contract Counter { event ValueChanged(uint oldValue, uint256 newValue); - // Private Variable vom Typ unsigned int zur Speicherung der Anzahl der Zählungen + // Private Variable vom Typ unsigned int, um die Anzahl der Zählungen zu speichern uint256 private count = 0; // Funktion, die unseren Zähler inkrementiert @@ -42,7 +42,7 @@ contract Counter { emit ValueChanged(count - 1, count); } - // Getter zum Abrufen des Zählwerts + // Getter, um den Zählwert abzurufen function getCount() public view returns (uint256) { return count; } @@ -52,12 +52,12 @@ contract Counter { Beachten Sie Folgendes: -- **Zeile 5**: Wir deklarieren unser Ereignis und was es enthält: den alten Wert und den neuen Wert. +- **Zeile 5**: Wir deklarieren unser Ereignis und was es enthält, den alten Wert und den neuen Wert. -- **Zeile 13**: Wenn wir unsere Zählvariable inkrementieren, geben wir das Ereignis aus. +- **Zeile 13**: Wenn wir unsere Zählervariable inkrementieren, lösen wir das Ereignis aus. -Wenn wir nun den Vertrag bereitstellen und die increment-Funktion aufrufen, sehen wir, dass Remix es automatisch anzeigt, wenn Sie auf die neue Transaktion in einem Array namens logs klicken. +Wenn wir nun den Vertrag bereitstellen und die Inkrementierungsfunktion aufrufen, werden wir sehen, dass Remix dies automatisch anzeigt, wenn Sie auf die neue Transaktion innerhalb eines Arrays namens logs klicken. ![Remix-Screenshot](./remix-screenshot.png) -Logs sind sehr nützlich für das Debugging Ihrer Smart Contracts, aber sie sind auch wichtig, wenn Sie Anwendungen erstellen, die von verschiedenen Personen genutzt werden. Sie erleichtern die Analyse, um zu verfolgen und zu verstehen, wie Ihr Smart Contract genutzt wird. Die durch Transaktionen erzeugten Logs werden in gängigen Block-Explorern angezeigt und Sie können sie beispielsweise auch verwenden, um Off-Chain-Skripte zu erstellen, die auf bestimmte Ereignisse lauschen und bei deren Auftreten Maßnahmen ergreifen. +Protokolle (Logs) sind sehr nützlich für das Debugging Ihrer Smart Contracts, aber sie sind auch wichtig, wenn Sie Anwendungen erstellen, die von verschiedenen Personen verwendet werden. Sie erleichtern die Analyse, um zu verfolgen und zu verstehen, wie Ihr Smart Contract verwendet wird. Die durch Transaktionen generierten Protokolle werden in beliebten Blocksuchmaschinen angezeigt, und Sie können sie beispielsweise auch verwenden, um Off-Chain-Skripte zu erstellen, die auf bestimmte Ereignisse hören und bei deren Eintreten Maßnahmen ergreifen. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md index 739236f348d..29c3c04c76f 100644 --- a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md +++ b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -1,112 +1,109 @@ --- -title: "Merkle-Beweise für Offline Datenintegrität" -description: "Sicherstellung der Datenintegrität onchain für Daten, die größtenteils offchain gespeichert sind" +title: "Merkle-Beweise für Offline-Datenintegrität" +description: "Sicherstellung der Datenintegrität auf der Blockchain für Daten, die größtenteils Off-Chain gespeichert sind" author: Ori Pomerantz -tags: ["storage"] +tags: ["Speicher"] skill: advanced -breadcrumb: "Merkle-Beweise" +breadcrumb: Merkle-Beweise lang: de published: 2021-12-30 --- ## Einführung {#introduction} -Idealerweise möchten wir alles in einem Ethereum Speicher ablegen, der auf Tausenden von Computern gespeichert ist und eine extrem hohe Verfügbarkeit (die Daten können nicht zensiert werden) und Integrität (die Daten können nicht unbefugt verändert werden) aufweist, aber die Speicherung eines 32-Byte-Wortes kostet normalerweise 20.000 Gas. Während ich das schreibe, entsprechen -diese Kosten 6,60 USD. Mit 21 Cent pro Byte ist das für viele Anwendungen zu teuer. +Idealerweise würden wir gerne alles im Ethereum-Speicher ablegen, der über Tausende von Computern verteilt ist und eine extrem hohe Verfügbarkeit (die Daten können nicht zensiert werden) sowie Integrität (die Daten können nicht unbefugt geändert werden) aufweist. Das Speichern eines 32-Byte-Wortes kostet jedoch typischerweise 20.000 Gas. Zum Zeitpunkt des Schreibens entspricht dieser Preis 6,60 $. Mit 21 Cent pro Byte ist dies für viele Anwendungsfälle zu teuer. -Um dieses Problem zu lösen, hat das Ethereum-Ökosystem viele alternative Wege entwickelt, um Daten dezentral -zu speichern. In der Regel muss dabei ein Kompromiss zwischen Verfügbarkeit und Preis eingegangen werden. Die Integrität ist jedoch in der Regel gewährleistet. +Um dieses Problem zu lösen, hat das Ethereum-Ökosystem [viele alternative Wege entwickelt, um Daten dezentralisiert zu speichern](/developers/docs/storage/). Meistens beinhalten diese einen Kompromiss zwischen Verfügbarkeit und Preis. Die Integrität ist jedoch in der Regel gewährleistet. -In diesem Artikel erfahren Sie, **wie** Sie die Datenintegrität gewährleisten, ohne die Daten auf der Blockchain zu speichern, indem Sie -[Merkle-Beweise](https://computersciencewiki.org/index.php/Merkle_proof) verwenden. +In diesem Artikel erfahren Sie, **wie** Sie die Datenintegrität sicherstellen können, ohne die Daten auf der Blockchain zu speichern, indem Sie [Merkle-Beweise](https://computersciencewiki.org/index.php/Merkle_proof) verwenden. ## Wie funktioniert das? {#how-does-it-work} -Theoretisch könnten wir einfach den Hash der Daten onchain speichern und alle Daten in Transaktionen senden, die sie benötigen. Allerdings ist das immer noch zu teuer. Ein Byte Daten zu einer Transaktion kostet etwa 16 Gas, derzeit etwa einen halben Cent, oder etwa 5 USD pro Kilobyte. Mit 5000 USD pro Megabyte ist dies für viele Anwendungen immer noch zu teuer, selbst ohne die zusätzlichen Kosten für das Hashing der Daten. +Theoretisch könnten wir einfach den Hash der Daten auf der Blockchain speichern und alle Daten in Transaktionen senden, die sie benötigen. Dies ist jedoch immer noch zu teuer. Ein Byte an Daten für eine Transaktion kostet etwa 16 Gas, derzeit etwa einen halben Cent oder etwa 5 $ pro Kilobyte. Mit 5.000 $ pro Megabyte ist dies für viele Anwendungen immer noch zu teuer, selbst ohne die zusätzlichen Kosten für das Hashen der Daten. -Die Lösung ist, verschiedene Teilmengen der Daten wiederholt zu hashen, so dass Sie für die Daten, die Sie nicht zu senden brauchen, nur einen Hash senden können. Dazu verwenden Sie einen Merkle Tree, eine Baum Datenstruktur, bei der jeder Knoten ein Hash der darunter liegenden Knoten ist: +Die Lösung besteht darin, verschiedene Teilmengen der Daten wiederholt zu hashen, sodass Sie für die Daten, die Sie nicht senden müssen, einfach einen Hash senden können. Dies geschieht mithilfe eines Merkle-Baums, einer Baum-Datenstruktur, bei der jeder Knoten ein Hash der darunter liegenden Knoten ist: ![Merkle-Baum](tree.png) -Der Root-Hash ist der einzige Teil, der onchain gespeichert werden muss. Um einen bestimmten Wert zu beweisen, geben Sie alle Hashes an, die damit kombiniert werden müssen, um die Wurzel (Hash-Root) zu erhalten. Um zum Beispiel `C` zu beweisen, stellen Sie `D`, `H(A-B)` und `H(E-H)` zur Verfügung. +Der Wurzel-Hash ist der einzige Teil, der auf der Blockchain gespeichert werden muss. Um einen bestimmten Wert zu beweisen, stellen Sie alle Hashes bereit, die damit kombiniert werden müssen, um die Wurzel zu erhalten. Um beispielsweise `C` zu beweisen, stellen Sie `D`, `H(A-B)` und `H(E-H)` bereit. ![Beweis für den Wert von C](proof-c.png) ## Implementierung {#implementation} -[Der Beispielcode wird hier zur Verfügung gestellt](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). +[Der Beispielcode wird hier bereitgestellt](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). -### Offchain-Code {#offchain-code} +### Off-Chain-Code {#offchain-code} -In diesem Artikel verwenden wir JavaScript für die Offchain-Berechnungen. Die meisten dezentralisierten Anwendungen haben ihre Offchain-Komponente in JavaScript. +In diesem Artikel verwenden wir JavaScript für die Off-Chain-Berechnungen. Die meisten dezentralisierten Anwendungen haben ihre Off-Chain-Komponente in JavaScript. -#### Erstellen der Merkle-Root {#creating-the-merkle-root} +#### Erstellen der Merkle-Wurzel {#creating-the-merkle-root} -Als erstes müssen wir die Merkle-Wurzel für die Chain bereitstellen. +Zuerst müssen wir der Chain die Merkle-Wurzel bereitstellen. ```javascript const ethers = require("ethers") ``` -[Wir verwenden die Hash-Funktion aus dem Ethers-Paket](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). +[Wir verwenden die Hash-Funktion aus dem ethers-Paket](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). ```javascript -// Die Rohdaten, deren Integrität wir überprüfen müssen. Die ersten beiden Bytes -// sind eine Benutzerkennung, und die letzten beiden Bytes sind die Menge der Tokens, die -// der Benutzer derzeit besitzt. +// Die Rohdaten, deren Integrität wir überprüfen müssen. Die ersten zwei Bytes s +// ind eine Benutzerkennung, und die letzten zwei Bytes die Menge an Token, die der +// Benutzer derzeit besitzt. const dataArray = [ 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, 0xface0070, 0xbad00080, 0x060d0091, ] ``` -Die Kodierung jedes Eintrags in eine einzelne 256-Bit-Integerzahl führt zu weniger lesbarem Code als z. B. die Verwendung von JSON. Allerdings bedeutet dies einen deutlich geringeren Verarbeitungsaufwand für die Abfrage der Vertragsdaten und damit deutlich niedrigere Gaskosten. [Man kann JSON onchain lesen](https://github.com/chrisdotn/jsmnSol), es ist nur eine schlechte Idee, wenn es vermeidbar ist. +Das Codieren jedes Eintrags in eine einzelne 256-Bit-Ganzzahl führt zu weniger lesbarem Code als beispielsweise die Verwendung von JSON. Dies bedeutet jedoch deutlich weniger Verarbeitungsaufwand beim Abrufen der Daten im Smart Contract und somit viel geringere Gaskosten. [Sie können JSON auf der Blockchain lesen](https://github.com/chrisdotn/jsmnSol), es ist nur eine schlechte Idee, wenn es sich vermeiden lässt. ```javascript -// Das Array der Hash-Werte als BigInts +// Das Array der Hash-Werte, als BigInts const hashArray = dataArray ``` -In diesem Fall handelt es sich bei unseren Daten um 256 Bit-Werte, so dass keine Verarbeitung erforderlich ist. Wenn wir eine kompliziertere Datenstruktur verwenden, wie z. B. Strings, müssen wir sicherstellen, dass wir die Daten zuerst hashen, um ein Array von Hashes zu erhalten. Das liegt auch daran, weil es uns nicht interessiert, ob Benutzer die Informationen anderer Benutzer kennen. Andernfalls hätten wir einen Hash verwenden müssen, damit Benutzer 1 den Wert für Benutzer 0 nicht kennt, Benutzer 2 den Wert für Benutzer 3 nicht kennt usw. +In diesem Fall bestehen unsere Daten von vornherein aus 256-Bit-Werten, sodass keine Verarbeitung erforderlich ist. Wenn wir eine kompliziertere Datenstruktur wie Strings verwenden, müssen wir sicherstellen, dass wir die Daten zuerst hashen, um ein Array von Hashes zu erhalten. Beachten Sie, dass dies auch daran liegt, dass es uns egal ist, ob Benutzer die Informationen anderer Benutzer kennen. Andernfalls hätten wir hashen müssen, damit Benutzer 1 den Wert für Benutzer 0 nicht kennt, Benutzer 2 den Wert für Benutzer 3 nicht kennt usw. ```javascript // Konvertieren zwischen dem String, den die Hash-Funktion erwartet, und dem -// BigInt, das wir überall sonst verwenden. +// BigInt, den wir überall sonst verwenden. const hash = (x) => BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) ``` -Die Ethers-Hash-Funktion erwartet einen JavaScript-String mit einer hexadezimalen Zahl, wie z. B. `0x60A7`, und gibt einen anderen String mit der gleichen Struktur zurück. Für den Rest des Codes ist es jedoch einfacher, `BigInt` zu verwenden, also konvertieren wir es in einen hexadezimalen String und wieder zurück. +Die ethers-Hash-Funktion erwartet einen JavaScript-String mit einer hexadezimalen Zahl, wie z. B. `0x60A7`, und antwortet mit einem weiteren String mit derselben Struktur. Für den Rest des Codes ist es jedoch einfacher, `BigInt` zu verwenden, daher konvertieren wir in einen hexadezimalen String und wieder zurück. ```javascript -// Symmetrischer Hash eines Paares, sodass die umgekehrte Reihenfolge keine Rolle spielt. +// Symmetrischer Hash eines Paares, sodass es uns egal ist, ob die Reihenfolge umgekehrt wird. const pairHash = (a, b) => hash(hash(a) ^ hash(b)) ``` -Diese Funktion ist symmetrisch (Hash von a [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Das bedeutet, dass wir uns bei der Überprüfung des Merkle-Beweises keine Gedanken darüber machen müssen, ob wir den Wert aus dem Beweis vor oder nach dem berechneten Wert setzen sollen. Die Überprüfung von Merkle-Beweisen wird onchain durchgeführt. Je weniger wir dort tun müssen, desto besser. +Diese Funktion ist symmetrisch (Hash von a [XOR](https://en.wikipedia.org/wiki/Exclusive_or) b). Das bedeutet, dass wir uns bei der Überprüfung des Merkle-Beweises keine Gedanken darüber machen müssen, ob wir den Wert aus dem Beweis vor oder nach dem berechneten Wert einfügen. Die Überprüfung des Merkle-Beweises erfolgt auf der Blockchain, je weniger wir dort also tun müssen, desto besser. Warnung: -Kryptographie ist schwieriger als es aussieht. -Die ursprüngliche Version dieses Artikels hatte die Hash-Funktion `hash(a^b)`. -Das war eine **schlechte** Idee, denn es bedeutete, dass man, wenn man die legitimen Werte von `a` und `b` kannte, `b' = a^b^a'` verwenden konnte, um einen beliebigen `a'`-Wert zu beweisen. -Mit dieser Funktion müsste man `b'` so berechnen, dass `hash(a') ^ hash(b')` gleich einem bekannten Wert ist (der nächste Zweig auf dem Weg zur Root), was viel schwieriger ist. +Kryptografie ist schwieriger, als sie aussieht. +Die ursprüngliche Version dieses Artikels enthielt die Hash-Funktion `hash(a^b)`. +Das war eine **schlechte** Idee, denn das bedeutete, dass man, wenn man die legitimen Werte von `a` und `b` kannte, `b' = a^b^a'` verwenden konnte, um jeden gewünschten `a'`-Wert zu beweisen. +Mit dieser Funktion müssten Sie `b'` so berechnen, dass `hash(a') ^ hash(b')` gleich einem bekannten Wert ist (dem nächsten Zweig auf dem Weg zur Wurzel), was viel schwieriger ist. ```javascript -// Der Wert, der anzeigt, dass ein bestimmter Zweig leer ist und keinen -// Wert hat +// Der Wert, der anzeigt, dass ein bestimmter Zweig leer ist, hat keinen +// Wert const empty = 0n ``` -Wenn die Anzahl der Werte keine ganzzahlige Zweierpotenz ist, müssen wir leere Zweige behandeln. Bei diesem Programm wird die Null als Platzhalter eingesetzt. +Wenn die Anzahl der Werte keine ganzzahlige Zweierpotenz ist, müssen wir leere Zweige behandeln. Dieses Programm macht das, indem es Null als Platzhalter einsetzt. ![Merkle-Baum mit fehlenden Zweigen](merkle-empty-hash.png) ```javascript -// Berechnet eine Ebene im Baum eines Hash-Arrays, indem der Hash -// jedes Paares in der Sequenz genommen wird +// Berechne eine Ebene höher im Baum eines Hash-Arrays, indem der Hash von +// jedem Paar nacheinander gebildet wird const oneLevelUp = (inputArray) => { var result = [] - var inp = [...inputArray] // Um das Überschreiben der Eingabe zu vermeiden // Fügt bei Bedarf einen leeren Wert hinzu (wir benötigen alle Blätter // als Paare) + var inp = [...inputArray] // Um ein Überschreiben der Eingabe zu vermeiden // Füge bei Bedarf einen leeren Wert hinzu (wir müssen alle Blätter // paaren) if (inp.length % 2 === 1) inp.push(empty) @@ -117,13 +114,13 @@ const oneLevelUp = (inputArray) => { } // oneLevelUp ``` -Diese Funktion "klettert" eine Ebene im Merkle-Baum hoch, indem sie die Wertepaare auf der aktuellen Ebene hasht. Beachten Sie, dass dies nicht die effizienteste Implementierung ist. Wir hätten das Kopieren der Eingabe vermeiden und einfach `hashEmpty` an der entsprechenden Stelle in der Schleife hinzufügen können, aber dieser Code ist auf Lesbarkeit optimiert. +Diese Funktion „klettert“ eine Ebene im Merkle-Baum nach oben, indem sie die Wertepaare auf der aktuellen Ebene hasht. Beachten Sie, dass dies nicht die effizienteste Implementierung ist. Wir hätten das Kopieren der Eingabe vermeiden und einfach `hashEmpty` an der entsprechenden Stelle in der Schleife hinzufügen können, aber dieser Code ist auf Lesbarkeit optimiert. ```javascript const getMerkleRoot = (inputArray) => { var result - result = [...inputArray] // Klettere den Baum hinauf, bis es nur noch einen Wert gibt, das ist die // Root. // // Wenn eine Ebene eine ungerade Anzahl von Einträgen hat, fügt der // Code in oneLevelUp einen leeren Wert hinzu. Wenn wir also zum Beispiel // 10 Blätter haben, haben wir 5 Zweige in der zweiten Ebene, 3 // Zweige in der dritten, 2 in der vierten und die Root ist die fünfte + result = [...inputArray] // Klettere den Baum hinauf, bis es nur noch einen Wert gibt, das ist die // Wurzel. // // Wenn eine Ebene eine ungerade Anzahl von Einträgen hat, fügt der // Code in oneLevelUp einen leeren Wert hinzu. Wenn wir also zum Beispiel // 10 Blätter haben, haben wir 5 Zweige in der zweiten Ebene, 3 // Zweige in der dritten, 2 in der vierten und die Wurzel ist die fünfte while (result.length > 1) result = oneLevelUp(result) @@ -131,16 +128,16 @@ const getMerkleRoot = (inputArray) => { } ``` -Um die Wurzel zu bekommen, mache so lange, bis nur noch ein Wert übrig ist. +Um die Wurzel zu erhalten, klettern Sie so lange, bis nur noch ein Wert übrig ist. #### Erstellen eines Merkle-Beweises {#creating-a-merkle-proof} -Ein Merkle-Beweis besteht aus den Werten, die zusammen mit dem zu beweisenden Wert gehasht werden müssen, um die Merkle-Wurzel zu erhalten. Der zu beweisende Wert ist oft aus anderen Daten verfügbar, daher ziehe ich es vor, ihn separat und nicht als Teil des Codes bereitzustellen. +Ein Merkle-Beweis besteht aus den Werten, die zusammen mit dem zu beweisenden Wert gehasht werden müssen, um die Merkle-Wurzel zurückzuerhalten. Der zu beweisende Wert ist oft aus anderen Daten verfügbar, daher ziehe ich es vor, ihn separat und nicht als Teil des Codes bereitzustellen. ```javascript -// Ein Merkle-Beweis besteht aus dem Wert der Liste der Einträge, mit denen -// gehasht werden soll. Da wir eine symmetrische Hash-Funktion verwenden, benötigen wir -// den Speicherort des Elements nicht, um den Beweis zu verifizieren, sondern nur, um ihn zu erstellen +// Ein Merkle-Beweis besteht aus dem Wert der Liste von Einträgen, mit denen +// gehasht wird. Da wir eine symmetrische Hash-Funktion verwenden, benötigen wir +// die Position des Elements nicht, um den Beweis zu verifizieren, sondern nur, um ihn zu erstellen const getMerkleProof = (inputArray, n) => {     var result = [], currentLayer = [...inputArray], currentN = n @@ -151,37 +148,37 @@ const getMerkleProof = (inputArray, n) => {             currentLayer.push(empty)         result.push(currentN % 2 -               // Wenn currentN ungerade ist, füge den Wert davor zum Beweis hinzu +               // Wenn currentN ungerade ist, füge es mit dem Wert davor zum Beweis hinzu             ? currentLayer[currentN-1]                // Wenn es gerade ist, füge den Wert danach hinzu             : currentLayer[currentN+1]) ``` -Wir hashen `(v[0],v[1])`, `(v[2],v[3])` usw. Für gerade Werte benötigen wir also den nächsten, für ungerade Werte den vorherigen Wert. +Wir hashen `(v[0],v[1])`, `(v[2],v[3])` usw. Für gerade Werte benötigen wir also den nächsten, für ungerade Werte den vorherigen. ```javascript -        // Auf die nächste Ebene aufsteigen +        // Gehe zur nächsten Ebene nach oben         currentN = Math.floor(currentN/2)         currentLayer = oneLevelUp(currentLayer) -    }   // while currentLayer.length > 1 +    } // while currentLayer.length > 1     return result -}   // getMerkleProof +} // getMerkleProof ``` -### Onchain-Code {#onchain-code} +### On-Chain-Code {#onchain-code} -Schließlich haben wir den Code, der den Beweis überprüft. Der Onchain-Code ist in [Solidity](https://docs.soliditylang.org/en/v0.8.11/) geschrieben. Die Optimierung ist hier sehr viel wichtiger, weil Gas relativ teuer ist. +Schließlich haben wir den Code, der den Beweis überprüft. Der On-Chain-Code ist in [Solidity](https://docs.soliditylang.org/en/v0.8.11/) geschrieben. Optimierung ist hier viel wichtiger, da Gas relativ teuer ist. ```solidity -//SPDX-License-Identifier: Public Domain +// SPDX-License-Identifier: Public Domain pragma solidity ^0.8.0; import "hardhat/console.sol"; ``` -Ich habe dies mit der [Hardhat-Entwicklungsumgebung](https://hardhat.org/) geschrieben, die es uns ermöglicht, während der Entwicklung [Konsolenausgaben von Solidity](https://hardhat.org/docs/cookbook/debug-logs) zu haben. +Ich habe dies mit der [Hardhat-Entwicklungsumgebung](https://hardhat.org/) geschrieben, die es uns ermöglicht, während der Entwicklung [Konsolenausgaben von Solidity](https://hardhat.org/docs/cookbook/debug-logs) zu erhalten. ```solidity @@ -192,15 +189,15 @@ contract MerkleProof {       return merkleRoot;     } -    // Äußerst unsicher, im Produktionscode muss der Zugriff auf -    // diese Funktion STRENG limitiert sein, wahrscheinlich auf einen +    // Extrem unsicher, in Produktionscode muss der Zugriff auf +    // diese Funktion STRENG LIMITIERT SEIN, wahrscheinlich auf einen     // Besitzer     function setRoot(uint _merkleRoot) external {       merkleRoot = _merkleRoot; -    }   // setRoot +    } // setRoot ``` -Set- und Get-Funktionen für die Merkle-Wurzel. Jeden die Merkle-Root aktualisieren zu lassen, ist eine _extrem schlechte Idee_ in einem Produktionssystem. Ich tue es hier der Einfachheit halber für den Beispielcode. **Tun Sie das nicht auf einem System, bei dem die Datenintegrität wirklich wichtig ist**. +Set- und Get-Funktionen für die Merkle-Wurzel. Jeden die Merkle-Wurzel aktualisieren zu lassen, ist in einem Produktionssystem eine _extrem schlechte Idee_. Ich mache es hier der Einfachheit halber für den Beispielcode. **Tun Sie dies nicht auf einem System, bei dem Datenintegrität tatsächlich wichtig ist**. ```solidity     function hash(uint _a) internal pure returns(uint) { @@ -212,12 +209,12 @@ Set- und Get-Funktionen für die Merkle-Wurzel. Jeden die Merkle-Root aktualisie     } ``` -Diese Funktion erzeugt einen Paar-Hash. Es ist nur die Solidity-Übersetzung des JavaScript-Codes für `hash` und `pairHash`. +Diese Funktion generiert einen Paar-Hash. Es ist lediglich die Solidity-Übersetzung des JavaScript-Codes für `hash` und `pairHash`. -**Hinweis:** Dies ist ein weiterer Fall der Optimierung auf Lesbarkeit. Basierend auf [der Funktionsdefinition](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm) wäre es möglich, die Daten als [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays)-Wert zu speichern und die Konvertierungen zu vermeiden. +**Hinweis:** Dies ist ein weiterer Fall von Optimierung für die Lesbarkeit. Basierend auf [der Funktionsdefinition](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm) könnte es möglich sein, die Daten als [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays)-Wert zu speichern und die Konvertierungen zu vermeiden. ```solidity -    // Überprüfen eines Merkle-Beweises +    // Verifiziere einen Merkle-Beweis     function verifyProof(uint _value, uint[] calldata _proof)         public view returns (bool) {       uint temp = _value; @@ -230,21 +227,21 @@ Diese Funktion erzeugt einen Paar-Hash. Es ist nur die Solidity-Übersetzung des       return temp == merkleRoot;     } -}  // MarkleProof +} // MarkleProof ``` -In mathematischer Notation sieht die Verifizierung eines Merkle-Beweises so aus: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` H(proof_1, H(proof_0, value))...)))`. Dieser Code implementiert sie. +In mathematischer Notation sieht die Verifizierung eines Merkle-Beweises so aus: `H(proof_n, H(proof_n-1, H(proof_n-2, ... H(proof_1, H(proof_0, value))...)))`. Dieser Code implementiert dies. -## Merkle-Beweise und Rollups vertragen sich nicht {#merkle-proofs-and-rollups} +## Merkle-Beweise und Rollups passen nicht zusammen {#merkle-proofs-and-rollups} -Merkle-Beweise funktionieren nicht gut mit [Rollups](/developers/docs/scaling/#rollups). Der Grund dafür ist, dass Rollups alle Transaktionsdaten auf L1 schreiben, aber auf L2 verarbeiten. Die Kosten für die Übermittlung eines Merkle-Beweises mit einer Transaktion belaufen sich auf durchschnittlich 638 Gas pro Ebene (derzeit kostet ein Byte in Call Data 16 Gas, wenn es nicht Null ist, und 4, wenn es Null ist). Bei einer Datenmenge von 1024 Wörtern sind für einen Merkle-Beweis zehn Ebenen erforderlich, also insgesamt 6380 Gas. +Merkle-Beweise funktionieren nicht gut mit [Rollups](/developers/docs/scaling/#rollups). Der Grund dafür ist, dass Rollups alle Transaktionsdaten auf L1 schreiben, aber auf L2 verarbeiten. Die Kosten für das Senden eines Merkle-Beweises mit einer Transaktion belaufen sich durchschnittlich auf 638 Gas pro Ebene (derzeit kostet ein Byte in Call-Daten 16 Gas, wenn es nicht null ist, und 4, wenn es null ist). Wenn wir 1024 Datenwörter haben, erfordert ein Merkle-Beweis zehn Ebenen oder insgesamt 6380 Gas. -Wenn man sich zum Beispiel [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m) ansieht, kostet das Schreiben von L1-Gas etwa 100 Gwei und L2-Gas 0,001 Gwei (das ist der normale Preis, er kann bei Überlastung steigen). Für die Kosten von einem L1 Gas können wir also hunderttausend Gas für die L2 Verarbeitung ausgeben. Wenn wir davon ausgehen, dass wir den Speicher nicht überschreiben, bedeutet das, dass wir für den Preis von einem L1 Gas etwa fünf Wörter in den L2 Speicher schreiben können. Für einen einzelnen Merkle-Beweis können wir die gesamten 1024 Wörter in den Speicher schreiben (vorausgesetzt, sie können von Anfang an onchain berechnet werden, anstatt in einer Transaktion bereitgestellt zu werden) und haben immer noch den größten Teil des Gases übrig. +Wenn wir uns zum Beispiel [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m) ansehen, kostet das Schreiben von L1-Gas etwa 100 Gwei und L2-Gas kostet 0,001 Gwei (das ist der normale Preis, er kann bei Überlastung steigen). Für die Kosten von einem L1-Gas können wir also hunderttausend Gas für die L2-Verarbeitung ausgeben. Unter der Annahme, dass wir den Speicher nicht überschreiben, bedeutet dies, dass wir für den Preis von einem L1-Gas etwa fünf Wörter in den Speicher auf L2 schreiben können. Für einen einzigen Merkle-Beweis können wir die gesamten 1024 Wörter in den Speicher schreiben (vorausgesetzt, sie können von vornherein auf der Blockchain berechnet werden, anstatt in einer Transaktion bereitgestellt zu werden) und haben immer noch den Großteil des Gases übrig. ## Fazit {#conclusion} -Im echten Leben werden Sie Merkle-Bäume vielleicht nie selbst implementieren. Es gibt bekannte und geprüfte Bibliotheken, die Sie verwenden können, wobei es im Allgemeinen nicht ratsam ist, kryptographische Primitive selbst zu implementieren. Aber ich hoffe, dass Sie jetzt die Merkle-Beweise besser verstehen und entscheiden können, wann es sich lohnt, sie einzusetzen. +Im wirklichen Leben werden Sie Merkle-Bäume vielleicht nie selbst implementieren. Es gibt bekannte und geprüfte Bibliotheken, die Sie verwenden können, und im Allgemeinen ist es am besten, kryptografische Primitive nicht selbst zu implementieren. Aber ich hoffe, dass Sie Merkle-Beweise jetzt besser verstehen und entscheiden können, wann sich ihr Einsatz lohnt. -Beachten Sie, dass Merkle-Beweise zwar die _Integrität_, nicht aber die _Verfügbarkeit_ erhalten. Zu wissen, dass niemand sonst Ihre Assets nehmen kann, ist ein schwacher Trost, wenn der Datenspeicher beschließt, den Zugriff zu verweigern, und Sie auch keinen Merkle-Baum erstellen können, um darauf zuzugreifen. Merkle-Bäume werden daher am besten mit einer Art dezentralem Speicher wie IPFS verwendet. +Beachten Sie, dass Merkle-Beweise zwar die _Integrität_ wahren, nicht aber die _Verfügbarkeit_. Zu wissen, dass niemand sonst Ihre Vermögenswerte nehmen kann, ist ein schwacher Trost, wenn der Datenspeicher beschließt, den Zugriff zu verweigern, und Sie auch keinen Merkle-Baum konstruieren können, um darauf zuzugreifen. Daher werden Merkle-Bäume am besten mit einer Art dezentralisiertem Speicher wie IPFS verwendet. -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md index 21490902d4d..96ec69cf643 100644 --- a/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md +++ b/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -1,25 +1,25 @@ --- title: "Überwachung von Geth mit InfluxDB und Grafana" -description: "Richten Sie die Überwachung für Ihren Geth-Node mit InfluxDB und Grafana ein, um die Leistung zu verfolgen und Probleme zu identifizieren." +description: "Richten Sie die Überwachung für Ihren Geth-Blockchain-Knoten mit InfluxDB und Grafana ein, um die Leistung zu verfolgen und Probleme zu identifizieren." author: "Mario Havel" -tags: ["clients", "nodes"] +tags: ["Anwendungen", "Blockchain-Knoten"] skill: intermediate -breadcrumb: "Geth-Monitoring" +breadcrumb: "Geth überwachen" lang: de published: 2021-01-13 --- -Dieses Tutorial hilft Ihnen dabei, die Überwachung für Ihren Geth-Node einzurichten, damit Sie dessen Leistung besser verstehen und potenzielle Probleme erkennen können. +Dieses Tutorial hilft Ihnen bei der Einrichtung der Überwachung für Ihren Geth-Blockchain-Knoten, damit Sie dessen Leistung besser verstehen und potenzielle Probleme identifizieren können. ## Voraussetzungen {#prerequisites} - Sie sollten bereits eine Instanz von Geth ausführen. -- Die meisten Schritte und Beispiele sind für eine Linux-Umgebung, grundlegende Terminalkenntnisse sind dabei hilfreich. -- Sehen Sie sich diesen Videoüberblick über die Metrik-Suite von Geth an: [Monitoring an Ethereum infrastructure by Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI). +- Die meisten Schritte und Beispiele beziehen sich auf eine Linux-Umgebung, grundlegende Terminal-Kenntnisse sind hilfreich. +- Sehen Sie sich diesen Video-Überblick über die Metrik-Suite von Geth an: [Monitoring an Ethereum infrastructure by Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI). ## Überwachungs-Stack {#monitoring-stack} -Ein Ethereum-Client sammelt eine Menge Daten, die in Form einer chronologischen Datenbank gelesen werden können. Um die Überwachung zu erleichtern, können Sie diese in eine Datenvisualisierungssoftware einspeisen. Es gibt mehrere verfügbare Optionen: +Eine Ethereum-Anwendung sammelt viele Daten, die in Form einer chronologischen Datenbank gelesen werden können. Um die Überwachung zu erleichtern, können Sie diese in eine Datenvisualisierungssoftware einspeisen. Es stehen mehrere Optionen zur Verfügung: - [Prometheus](https://prometheus.io/) (Pull-Modell) - [InfluxDB](https://www.influxdata.com/get-influxdb/) (Push-Modell) @@ -28,13 +28,13 @@ Ein Ethereum-Client sammelt eine Menge Daten, die in Form einer chronologischen - [Datadog](https://www.datadoghq.com/) - [Chronograf](https://www.influxdata.com/time-series-platform/chronograf/) -Es gibt auch [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), eine mit InfluxDB und Grafana vorkonfigurierte Option. +Es gibt auch den [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), eine Option, die mit InfluxDB und Grafana vorkonfiguriert ist. -In diesem Tutorial richten wir Ihren Geth-Client ein, um Daten an InfluxDB zur Erstellung einer Datenbank zu senden und mit Grafana eine Diagrammvisualisierung der Daten zu erstellen. Die manuelle Durchführung wird Ihnen helfen, den Prozess besser zu verstehen, ihn zu ändern und in verschiedenen Umgebungen bereitzustellen. +In diesem Tutorial richten wir Ihre Geth-Anwendung so ein, dass sie Daten an InfluxDB sendet, um eine Datenbank zu erstellen, und an Grafana, um eine grafische Visualisierung der Daten zu erstellen. Wenn Sie dies manuell tun, können Sie den Prozess besser verstehen, ihn ändern und in verschiedenen Umgebungen bereitstellen. -## Einrichten von InfluxDB {#setting-up-influxdb} +## InfluxDB einrichten {#setting-up-influxdb} -Lassen Sie uns zunächst InfluxDB herunterladen und installieren. Verschiedene Download-Optionen finden Sie auf der [Influxdata-Release-Seite](https://portal.influxdata.com/downloads/). Wählen Sie die für Ihre Umgebung passende aus. +Laden wir zunächst InfluxDB herunter und installieren es. Verschiedene Download-Optionen finden Sie auf der [Influxdata-Release-Seite](https://portal.influxdata.com/downloads/). Wählen Sie diejenige aus, die zu Ihrer Umgebung passt. Sie können es auch aus einem [Repository](https://repos.influxdata.com/) installieren. Zum Beispiel in einer Debian-basierten Distribution: ``` @@ -48,20 +48,20 @@ sudo systemctl start influxdb sudo apt install influxdb-client ``` -Nach der erfolgreichen Installation von InfluxDB, stellen Sie sicher, dass es im Hintergrund läuft. Standardmäßig ist es unter `localhost:8086` erreichbar. -Bevor Sie den `Influx`-Client verwenden, müssen Sie einen neuen Benutzer mit Administratorrechten erstellen. Dieser Benutzer dient der übergeordneten Verwaltung, der Erstellung von Datenbanken und Benutzern. +Stellen Sie nach der erfolgreichen Installation von InfluxDB sicher, dass es im Hintergrund ausgeführt wird. Standardmäßig ist es unter `localhost:8086` erreichbar. +Bevor Sie die `influx`-Anwendung verwenden, müssen Sie einen neuen Benutzer mit Administratorrechten erstellen. Dieser Benutzer dient der übergeordneten Verwaltung, der Erstellung von Datenbanken und Benutzern. ``` curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES" ``` -Jetzt können Sie den Influx-Client verwenden, um mit diesem Benutzer die [InfluxDB-Shell](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) zu betreten. +Jetzt können Sie die Influx-Anwendung verwenden, um mit diesem Benutzer in die [InfluxDB-Shell](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) zu gelangen. ``` influx -username 'username' -password 'password' ``` -Indem Sie direkt mit InfluxDB in seiner Shell kommunizieren, können Sie eine Datenbank und einen Benutzer für Geth-Metriken erstellen. +Durch die direkte Kommunikation mit InfluxDB in seiner Shell können Sie eine Datenbank und einen Benutzer für Geth-Metriken erstellen. ``` create database geth @@ -81,29 +81,29 @@ Verlassen Sie die InfluxDB-Shell. exit ``` -InfluxDB läuft und ist konfiguriert, um Metriken von Geth zu speichern. +InfluxDB läuft und ist so konfiguriert, dass Metriken von Geth gespeichert werden. ## Geth vorbereiten {#preparing-geth} -Nachdem die Datenbank eingerichtet ist, müssen wir die Metrikerfassung in Geth aktivieren. Achten Sie auf `METRICS AND STATS OPTIONS` in `geth --help`. Dort finden Sie mehrere Optionen, in diesem Fall möchten wir, dass Geth Daten in InfluxDB pusht. -Die Grundeinrichtung gibt den Endpunkt an, an dem InfluxDB erreichbar ist, und die Authentifizierung für die Datenbank. +Nach der Einrichtung der Datenbank müssen wir die Metrikerfassung in Geth aktivieren. Achten Sie auf `METRICS AND STATS OPTIONS` in `geth --help`. Dort finden Sie mehrere Optionen. In diesem Fall möchten wir, dass Geth Daten in InfluxDB pusht. +Die grundlegende Einrichtung gibt den Endpunkt an, an dem InfluxDB erreichbar ist, sowie die Authentifizierung für die Datenbank. ``` geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword" ``` -Diese Flags können an einen Befehl zum Starten des Clients angehängt oder in der Konfigurationsdatei gespeichert werden. +Diese Flags können an einen Befehl angehängt werden, der die Anwendung startet, oder in der Konfigurationsdatei gespeichert werden. -Sie können überprüfen, ob Geth erfolgreich Daten pusht, indem Sie zum Beispiel die Metriken in der Datenbank auflisten. In der InfluxDB-Shell: +Sie können überprüfen, ob Geth erfolgreich Daten pusht, indem Sie beispielsweise Metriken in der Datenbank auflisten. In der InfluxDB-Shell: ``` use geth show measurements ``` -## Einrichten von Grafana {#setting-up-grafana} +## Grafana einrichten {#setting-up-grafana} -Der nächste Schritt ist die Installation von Grafana, das die Daten grafisch interpretieren wird. Folgen Sie dem Installationsprozess für Ihre Umgebung in der Grafana-Dokumentation. Stellen Sie sicher, dass Sie die OSS-Version installieren, wenn nicht anders gewünscht. +Der nächste Schritt ist die Installation von Grafana, das die Daten grafisch interpretiert. Befolgen Sie den Installationsprozess für Ihre Umgebung in der Grafana-Dokumentation. Stellen Sie sicher, dass Sie die OSS-Version installieren, sofern Sie nichts anderes wünschen. Beispielhafte Installationsschritte für Debian-Distributionen unter Verwendung des Repositorys: ``` @@ -116,37 +116,37 @@ sudo systemctl start grafana-server ``` Wenn Grafana läuft, sollte es unter `localhost:3000` erreichbar sein. -Verwenden Sie Ihren bevorzugten Browser, um auf diesen Pfad zuzugreifen, und melden Sie sich dann mit den Standard-Anmeldeinformationen an (Benutzer: `admin` und Passwort: `admin`). Wenn Sie dazu aufgefordert werden, ändern Sie das Standardpasswort und speichern Sie es. +Verwenden Sie Ihren bevorzugten Browser, um auf diesen Pfad zuzugreifen, und melden Sie sich dann mit den Standardanmeldeinformationen an (Benutzer: `admin` und Passwort: `admin`). Wenn Sie dazu aufgefordert werden, ändern Sie das Standardpasswort und speichern Sie es. -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 1)](./grafana1.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 1)](./grafana1.png) -Sie werden zur Grafana-Startseite weitergeleitet. Richten Sie zunächst Ihre Quelldaten ein. Klicken Sie auf das Konfigurationssymbol in der linken Leiste und wählen Sie "Datenquellen" aus. +Sie werden zur Grafana-Startseite weitergeleitet. Richten Sie zunächst Ihre Quelldaten ein. Klicken Sie auf das Konfigurationssymbol in der linken Leiste und wählen Sie „Data sources“ (Datenquellen). -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 2)](./grafana2.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 2)](./grafana2.png) -Es sind noch keine Datenquellen erstellt worden. Klicken Sie auf "Datenquelle hinzufügen", um eine zu definieren. +Es wurden noch keine Datenquellen erstellt. Klicken Sie auf „Add data source“ (Datenquelle hinzufügen), um eine zu definieren. -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 3)](./grafana3.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 3)](./grafana3.png) -Wählen Sie für dieses Setup "InfluxDB" aus und fahren Sie fort. +Wählen Sie für diese Einrichtung „InfluxDB“ und fahren Sie fort. -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 4)](./grafana4.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 4)](./grafana4.png) -Die Konfiguration der Datenquelle ist ziemlich einfach, wenn Sie die Tools auf demselben Rechner ausführen. Sie müssen die InfluxDB-Adresse und die Details für den Zugriff auf die Datenbank festlegen. Beachten Sie die Abbildung unten. +Die Konfiguration der Datenquelle ist ziemlich einfach, wenn Sie Tools auf derselben Maschine ausführen. Sie müssen die InfluxDB-Adresse und die Details für den Zugriff auf die Datenbank festlegen. Beziehen Sie sich auf das Bild unten. -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 5)](./grafana5.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 5)](./grafana5.png) -Wenn alles vollständig ist und InfluxDB erreichbar ist, klicken Sie auf "Speichern und testen" und warten Sie, bis die Bestätigung erscheint. +Wenn alles abgeschlossen ist und InfluxDB erreichbar ist, klicken Sie auf „Save and test“ (Speichern und testen) und warten Sie, bis die Bestätigung angezeigt wird. -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 6)](./grafana6.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 6)](./grafana6.png) -Grafana ist jetzt so eingerichtet, dass es Daten aus InfluxDB lesen kann. Jetzt müssen Sie ein Dashboard erstellen, das sie interpretiert und anzeigt. Dashboard-Eigenschaften sind in JSON-Dateien kodiert, die von jedermann erstellt und einfach importiert werden können. Klicken Sie in der linken Leiste auf "Erstellen und Importieren". +Grafana ist nun so eingerichtet, dass es Daten aus InfluxDB liest. Jetzt müssen Sie ein Dashboard erstellen, das diese interpretiert und anzeigt. Dashboard-Eigenschaften sind in JSON-Dateien codiert, die von jedem erstellt und einfach importiert werden können. Klicken Sie in der linken Leiste auf „Create and Import“ (Erstellen und Importieren). -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 7)](./grafana7.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 7)](./grafana7.png) -Für ein Geth-Überwachungs-Dashboard kopieren Sie die ID von [diesem Dashboard](https://grafana.com/grafana/dashboards/13877/) und fügen Sie sie auf der "Importseite" in Grafana ein. Nach dem Speichern des Dashboards sollte es so aussehen: +Für ein Geth-Überwachungs-Dashboard kopieren Sie die ID von [diesem Dashboard](https://grafana.com/grafana/dashboards/13877/) und fügen Sie sie auf der „Import page“ (Importseite) in Grafana ein. Nach dem Speichern des Dashboards sollte es so aussehen: -![Screenshot des Grafana-Dashboards für die Geth-Überwachung (Panel 8)](./grafana8.png) +![Grafana-Dashboard-Screenshot für die Geth-Überwachung (Panel 8)](./grafana8.png) -Sie können Ihre Dashboards ändern. Jedes Panel kann bearbeitet, verschoben, entfernt oder hinzugefügt werden. Sie können Ihre Konfigurationen ändern. Es liegt ganz bei Ihnen! Um mehr darüber zu erfahren, wie Dashboards funktionieren, lesen Sie die [Dokumentation von Grafana](https://grafana.com/docs/grafana/latest/dashboards/). -Sie könnten auch an [Alerting](https://grafana.com/docs/grafana/latest/alerting/) interessiert sein. Damit können Sie Warnmeldungen für den Fall einrichten, dass Metriken bestimmte Werte erreichen. Verschiedene Kommunikationskanäle werden unterstützt. +Sie können Ihre Dashboards ändern. Jedes Panel kann bearbeitet, verschoben, entfernt oder hinzugefügt werden. Sie können Ihre Konfigurationen ändern. Es liegt ganz bei Ihnen! Um mehr darüber zu erfahren, wie Dashboards funktionieren, lesen Sie die [Grafana-Dokumentation](https://grafana.com/docs/grafana/latest/dashboards/). +Vielleicht interessieren Sie sich auch für [Alerting](https://grafana.com/docs/grafana/latest/alerting/) (Benachrichtigungen). Damit können Sie Benachrichtigungen einrichten, wenn Metriken bestimmte Werte erreichen. Es werden verschiedene Kommunikationskanäle unterstützt. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/nft-minter/index.md b/public/content/translations/de/developers/tutorials/nft-minter/index.md index bd8268849e3..774a4dbdf67 100644 --- a/public/content/translations/de/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/de/developers/tutorials/nft-minter/index.md @@ -1,66 +1,66 @@ --- -title: NFT-Minter Tutorial -description: In diesem Tutorial erstellst du einen NFT-Minter und lernst, wie man eine Full-Stack-Dapp erstellt, indem du deinen Smart Contract mit einem React-Frontend unter Verwendung von MetaMask und Web3-Tools verbindest. +title: NFT-Minter-Tutorial +description: "In diesem Tutorial baust du einen NFT-Minter und lernst, wie man eine Full-Stack-Dapp erstellt, indem man einen Smart Contract über MetaMask und Web3-Tools mit einem React-Frontend verbindet." author: "smudgil" -tags: ["solidity", "NFT", "alchemy", "smart contracts", "frontend", "Pinata"] +tags: ["Solidity", "NFT", "Alchemy", "Smart Contracts", "Frontend", "Pinata", "erc-721"] skill: intermediate -breadcrumb: "NFT-Minter-Dapp" +breadcrumb: NFT-Minter-Dapp lang: de published: 2021-10-06 --- -Eine der größten Herausforderungen für Entwickler mit einem Web2-Hintergrund ist herauszufinden, wie sie ihren Smart Contract mit einem Frontend Projekt verbinden und mit ihm interagieren können. +Eine der größten Herausforderungen für Entwickler mit Web2-Hintergrund besteht darin, herauszufinden, wie man seinen Smart Contract mit einem Frontend-Projekt verbindet und mit ihm interagiert. -Durch den Bau eines NFT-Minters - eine einfache Benutzeroberfläche, auf welcher ein Link den Nutzer zu seinen digitalen Vermögenswerten führt, ein Titel und eine Beschreibung - werden Sie Folgendes lernen: +Indem du einen NFT-Minter baust – eine einfache Benutzeroberfläche, in der du einen Link zu deinem digitalen Asset, einen Titel und eine Beschreibung eingeben kannst – lernst du Folgendes: -- Verbinden von MetaMask mit Ihrem Frontend-Projekt -- Rufen von Smart-Contract Methoden von Ihrem Frontend +- Verbindung zu MetaMask über dein Frontend-Projekt herstellen +- Smart-Contract-Methoden von deinem Frontend aus aufrufen - Transaktionen mit MetaMask signieren -In diesem Tutorial werden wir [React](https://react.dev/) als unser Frontend-Framework verwenden. Da sich dieses Tutorial in erster Linie auf die Web3-Entwicklung konzentriert, werden wir nicht viel Zeit darauf verwenden, die React Grundlagen zu behandeln. Stattdessen konzentrieren wir uns darauf, Funktionalität in unser Projekt zu bringen. +In diesem Tutorial verwenden wir [React](https://react.dev/) als unser Frontend-Framework. Da sich dieses Tutorial in erster Linie auf die Web3-Entwicklung konzentriert, werden wir nicht viel Zeit damit verbringen, die Grundlagen von React aufzuschlüsseln. Stattdessen konzentrieren wir uns darauf, Funktionalität in unser Projekt zu bringen. -Als Voraussetzung solltest du ein grundlegendes Verständnis von React haben – du solltest wissen, wie Komponenten, Props, useState/useEffect und grundlegende Funktionsaufrufe funktionieren. Wenn du noch nie von diesen Begriffen gehört hast, solltest du dir dieses [Einführungstutorial zu React](https://react.dev/learn/tutorial-tic-tac-toe) ansehen. Für diejenigen, die eher visuell lernen, empfehlen wir diese ausgezeichnete Videoreihe [Full Modern React Tutorial](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) von Net Ninja. +Als Voraussetzung solltest du ein grundlegendes Verständnis von React haben – wissen, wie Komponenten, Props, useState/useEffect und grundlegende Funktionsaufrufe funktionieren. Wenn du noch nie von einem dieser Begriffe gehört hast, solltest du dir dieses [Einführungstutorial zu React](https://react.dev/learn/tutorial-tic-tac-toe) ansehen. Für visuelle Lerner empfehlen wir diese hervorragende Videoserie [Full Modern React Tutorial](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) von Net Ninja. -Und wenn Sie sich noch nicht angemeldet haben, dann benötigen Sie auf jeden Fall einen Alchemy Account, um dieses Tutorial zu beenden und um etwas auf der Blockchain bauen zu können. Registriere dich [hier](https://alchemy.com/) für ein kostenloses Konto. +Und falls du es noch nicht getan hast, benötigst du definitiv ein Alchemy-Konto, um dieses Tutorial abzuschließen und etwas auf der Blockchain zu bauen. Melde dich [hier](https://alchemy.com/) für ein kostenloses Konto an. -Lass uns ohne weiteres starten! +Ohne weitere Umschweife, fangen wir an! ## NFTs erstellen 101 {#making-nfts-101} -Bevor wir uns überhaupt einen Code anschauen, ist es wichtig zu verstehen, wie das erstellen von NFTs überhaupt funktioniert. Es benötigt dafür zwei Schritte: +Bevor wir uns überhaupt Code ansehen, ist es wichtig zu verstehen, wie das Erstellen eines NFTs funktioniert. Es umfasst zwei Schritte: ### Einen NFT-Smart-Contract auf der Ethereum-Blockchain veröffentlichen {#publish-nft} -Der größte Unterschied zwischen den beiden NFT smart Kontrakt Standards ist, dass der ERC-1155 ein Multi-Token Standard ist und eine Handvoll Funktionalitäten beinhaltet, wobei man mit dem ERC-721, welcher ein Single-Token Standard ist, nur eine Token-Transaktion gleichzeitig ausführen kann. +Der größte Unterschied zwischen den beiden NFT-Smart-Contract-Standards besteht darin, dass ERC-1155 ein Multi-Token-Standard ist und Batch-Funktionalität beinhaltet, während ERC-721 ein Single-Token-Standard ist und daher nur die Übertragung eines Tokens auf einmal unterstützt. -### Die Minting-Funktion aufrufen {#minting-function} +### Die Prägefunktion aufrufen {#minting-function} -Normalerweise verlangt diese Minting-Funktion, dass du zwei Variablen als Parameter übergibst: erstens den `recipient` (Empfänger), der die Adresse angibt, die deinen frisch geminteten NFT erhält, und zweitens die `tokenURI` des NFTs, eine Zeichenfolge, die zu einem JSON-Dokument aufgelöst wird, das die Metadaten des NFTs beschreibt. +Normalerweise erfordert diese Prägefunktion, dass du zwei Variablen als Parameter übergibst: erstens den `recipient` (Empfänger), der die Adresse angibt, die dein frisch geprägtes NFT erhalten wird, und zweitens die `tokenURI` des NFTs, eine Zeichenfolge, die auf ein JSON-Dokument verweist, das die Metadaten des NFTs beschreibt. -Die NFT Metadaten sind das, was Leben hineinbringt, welches Ihnen erlaubt Eigenschaften zu haben, wie zum Beispiel: Namen, eine Beschreibung, ein Bild (oder andere digitale Vermögenswerte), und andere Attribute. [Hier ist ein Beispiel für eine tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), die die Metadaten eines NFT enthält. +Die Metadaten eines NFTs erwecken es erst richtig zum Leben und ermöglichen es ihm, Eigenschaften wie einen Namen, eine Beschreibung, ein Bild (oder ein anderes digitales Asset) und andere Attribute zu haben. Hier ist [ein Beispiel für eine tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), die die Metadaten eines NFTs enthält. -In diesem Tutorial werden wir uns auf den 2 Teil fokussieren, das Aufrufen von einer bereits existierenden NFT smart Kontrakt Prägungs Funktion, indem wir unsere React UI benutzen. +In diesem Tutorial konzentrieren wir uns auf Teil 2: den Aufruf der Prägefunktion eines bestehenden NFT-Smart-Contracts über unsere React-Benutzeroberfläche. -[Hier ist ein Link](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) zu dem ERC-721-NFT-Smart-Contract, den wir in diesem Tutorial aufrufen werden. Wenn du lernen möchtest, wie wir ihn erstellt haben, empfehlen wir dir dringend unser anderes Tutorial [„Wie man einen NFT erstellt“](https://www.alchemy.com/docs/how-to-create-an-nft). +[Hier ist ein Link](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) zu dem ERC-721-NFT-Smart-Contract, den wir in diesem Tutorial aufrufen werden. Wenn du erfahren möchtest, wie wir ihn erstellt haben, empfehlen wir dir dringend, dir unser anderes Tutorial anzusehen: [„Wie man ein NFT erstellt“](https://www.alchemy.com/docs/how-to-create-an-nft). -Cool, nun verstehen wir wie die Erstellung von NFTS funktioniert, lass uns nun unsere Startdateien klonen! +Cool, jetzt, da wir verstehen, wie das Erstellen eines NFTs funktioniert, lass uns unsere Startdateien klonen! -## Die Starter-Dateien klonen {#clone-the-starter-files} +## Die Startdateien klonen {#clone-the-starter-files} -Gehe zuerst zum [nft-minter-tutorial GitHub-Repository](https://github.com/alchemyplatform/nft-minter-tutorial), um die Starter-Dateien für dieses Projekt zu erhalten. Klone dieses Repository in deine lokale Umgebung. +Gehe zunächst zum [nft-minter-tutorial GitHub-Repository](https://github.com/alchemyplatform/nft-minter-tutorial), um die Startdateien für dieses Projekt zu erhalten. Klone dieses Repository in deine lokale Umgebung. Wenn du dieses geklonte `nft-minter-tutorial`-Repository öffnest, wirst du feststellen, dass es zwei Ordner enthält: `minter-starter-files` und `nft-minter`. -- `minter-starter-files` enthält die Starter-Dateien (im Wesentlichen die React-UI) für dieses Projekt. In diesem Tutorial **werden wir in diesem Verzeichnis arbeiten**, während du lernst, wie du diese Benutzeroberfläche zum Leben erweckst, indem du sie mit deiner Ethereum-Wallet und einem NFT-Smart-Contract verbindest. -- `nft-minter` enthält das gesamte, vollständige Tutorial und dient dir als **Referenz**, **falls du nicht weiterkommst.** +- `minter-starter-files` enthält die Startdateien (im Wesentlichen die React-Benutzeroberfläche) für dieses Projekt. In diesem Tutorial **werden wir in diesem Verzeichnis arbeiten**, während du lernst, wie du diese Benutzeroberfläche zum Leben erweckst, indem du sie mit deiner Ethereum-Wallet und einem NFT-Smart-Contract verbindest. +- `nft-minter` enthält das gesamte abgeschlossene Tutorial und dient dir als **Referenz**, **falls du nicht weiterkommst.** Öffne als Nächstes deine Kopie von `minter-starter-files` in deinem Code-Editor und navigiere dann in deinen `src`-Ordner. -Der gesamte Code, den wir schreiben werden, befindet sich im Ordner `src`. Wir werden die `Minter.js`-Komponente bearbeiten und zusätzliche JavaScript-Dateien schreiben, um unserem Projekt Web3-Funktionalität zu verleihen. +Der gesamte Code, den wir schreiben werden, befindet sich im `src`-Ordner. Wir werden die Komponente `Minter.js` bearbeiten und zusätzliche JavaScript-Dateien schreiben, um unserem Projekt Web3-Funktionalität zu verleihen. -## Schritt 2: Unsere Starter-Dateien ansehen {#step-2-check-out-our-starter-files} +## Schritt 2: Unsere Startdateien ansehen {#step-2-check-out-our-starter-files} -Bevor wir mit dem Programmieren beginnen, ist es wichtig, sich anzusehen, was uns in den Starter-Dateien bereits zur Verfügung gestellt wird. +Bevor wir mit dem Programmieren beginnen, ist es wichtig, sich anzusehen, was uns in den Startdateien bereits zur Verfügung gestellt wird. ### Dein React-Projekt zum Laufen bringen {#get-your-react-project-running} @@ -79,20 +79,20 @@ Sobald die Installation abgeschlossen ist, führe `npm start` in deinem Terminal npm start ``` -Dadurch sollte sich http://localhost:3000/ in deinem Browser öffnen, wo du das Frontend für unser Projekt siehst. Es sollte aus 3 Feldern bestehen: einem Feld zur Eingabe eines Links zum Asset deines NFTs, einem Feld zur Eingabe des Namens deines NFTs und einem Feld zur Angabe einer Beschreibung. +Dadurch sollte sich http://localhost:3000/ in deinem Browser öffnen, wo du das Frontend für unser Projekt siehst. Es sollte aus 3 Feldern bestehen: einem Platz zur Eingabe eines Links zum Asset deines NFTs, zur Eingabe des Namens deines NFTs und zur Angabe einer Beschreibung. -Wenn du versuchst, auf die Schaltflächen „Wallet verbinden“ oder „NFT minten“ zu klicken, wirst du feststellen, dass sie nicht funktionieren – das liegt daran, dass wir ihre Funktionalität noch programmieren müssen! :\) +Wenn du versuchst, auf die Schaltflächen „Connect Wallet“ oder „Mint NFT“ zu klicken, wirst du feststellen, dass sie nicht funktionieren – das liegt daran, dass wir ihre Funktionalität erst noch programmieren müssen! :\) -### Die Minter.js-Komponente {#minter-js} +### Die Komponente Minter.js {#minter-js} **HINWEIS:** Stelle sicher, dass du dich im Ordner `minter-starter-files` und nicht im Ordner `nft-minter` befindest! -Gehen wir zurück in den `src`-Ordner in unserem Editor und öffnen die Datei `Minter.js`. Es ist sehr wichtig, dass wir alles in dieser Datei verstehen, da es sich um die primäre React-Komponente handelt, an der wir arbeiten werden. +Gehen wir in unserem Editor zurück in den `src`-Ordner und öffnen die Datei `Minter.js`. Es ist extrem wichtig, dass wir alles in dieser Datei verstehen, da es die primäre React-Komponente ist, an der wir arbeiten werden. -Oben in dieser Datei befinden sich unsere Zustandsvariablen, die wir nach bestimmten Ereignissen aktualisieren werden. +Oben in dieser Datei haben wir unsere Zustandsvariablen, die wir nach bestimmten Ereignissen aktualisieren werden. ```javascript -//Zustandsvariablen +// Zustandsvariablen const [walletAddress, setWallet] = useState("") const [status, setStatus] = useState("") const [name, setName] = useState("") @@ -102,133 +102,134 @@ const [url, setURL] = useState("") Noch nie von React-Zustandsvariablen oder State-Hooks gehört? Sieh dir [diese](https://legacy.reactjs.org/docs/hooks-state.html) Dokumentation an. -Hier ist, was die einzelnen Variablen darstellen: +Hier ist, was jede der Variablen darstellt: - `walletAddress` - eine Zeichenfolge, die die Wallet-Adresse des Benutzers speichert -- `status` - eine Zeichenfolge, die eine Nachricht enthält, die am unteren Rand der Benutzeroberfläche angezeigt wird -- `name` - eine Zeichenfolge, die den Namen des NFT speichert -- `description` - eine Zeichenfolge, die die Beschreibung des NFT speichert -- `url` - eine Zeichenfolge, die ein Link zum digitalen Asset des NFT ist +- `status` - eine Zeichenfolge, die eine Nachricht enthält, die unten in der Benutzeroberfläche angezeigt werden soll +- `name` - eine Zeichenfolge, die den Namen des NFTs speichert +- `description` - eine Zeichenfolge, die die Beschreibung des NFTs speichert +- `url` - eine Zeichenfolge, die ein Link zum digitalen Asset des NFTs ist -Nach den Zustandsvariablen siehst du drei nicht implementierte Funktionen: `useEffect`, `connectWalletPressed` und `onMintPressed`. Du wirst feststellen, dass alle diese Funktionen `async` sind, weil wir in ihnen asynchrone API-Aufrufe tätigen werden! Ihre Namen sind gleichbedeutend mit ihren Funktionalitäten: +Nach den Zustandsvariablen siehst du drei nicht implementierte Funktionen: `useEffect`, `connectWalletPressed` und `onMintPressed`. Du wirst feststellen, dass alle diese Funktionen `async` sind, da wir in ihnen asynchrone API-Aufrufe durchführen werden! Ihre Namen sind namensgebend für ihre Funktionalitäten: ```javascript useEffect(async () => { - //TODO: implementieren + // TODO: implementieren }, []) const connectWalletPressed = async () => { - //TODO: implementieren + // TODO: implementieren } const onMintPressed = async () => { - //TODO: implementieren + // TODO: implementieren } ``` -- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) – dies ist ein React-Hook, der aufgerufen wird, nachdem deine Komponente gerendert wurde. Da ihm ein leeres Array `[]` als Prop übergeben wird (siehe Zeile 3), wird er nur beim _ersten_ Rendern der Komponente aufgerufen. Hier rufen wir unseren Wallet-Listener und eine weitere Wallet-Funktion auf, um unsere Benutzeroberfläche zu aktualisieren und anzuzeigen, ob eine Wallet bereits verbunden ist. -- `connectWalletPressed` – diese Funktion wird aufgerufen, um die MetaMask-Wallet des Benutzers mit unserer Dapp zu verbinden. -- `onMintPressed` – diese Funktion wird aufgerufen, um den NFT des Benutzers zu minten. +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) - dies ist ein React-Hook, der aufgerufen wird, nachdem deine Komponente gerendert wurde. Da ihm ein leeres Array `[]` als Prop übergeben wird (siehe Zeile 3), wird er nur beim _ersten_ Rendern der Komponente aufgerufen. Hier rufen wir unseren Wallet-Listener und eine weitere Wallet-Funktion auf, um unsere Benutzeroberfläche zu aktualisieren und anzuzeigen, ob bereits eine Wallet verbunden ist. +- `connectWalletPressed` - diese Funktion wird aufgerufen, um die MetaMask-Wallet des Benutzers mit unserer Dapp zu verbinden. +- `onMintPressed` - diese Funktion wird aufgerufen, um das NFT des Benutzers zu prägen. -Gegen Ende dieser Datei haben wir die Benutzeroberfläche unserer Komponente. Wenn du diesen Code sorgfältig durchgehst, wirst du feststellen, dass wir unsere `url`-, `name`- und `description`-Zustandsvariablen aktualisieren, wenn sich die Eingabe in den entsprechenden Textfeldern ändert. +Gegen Ende dieser Datei haben wir die Benutzeroberfläche unserer Komponente. Wenn du diesen Code sorgfältig durchliest, wirst du feststellen, dass wir unsere Zustandsvariablen `url`, `name` und `description` aktualisieren, wenn sich die Eingabe in den entsprechenden Textfeldern ändert. Du wirst auch sehen, dass `connectWalletPressed` und `onMintPressed` aufgerufen werden, wenn die Schaltflächen mit den IDs `mintButton` bzw. `walletButton` angeklickt werden. ```javascript -//die Benutzeroberfläche unserer Komponente +// die UI unserer Komponente return (


🧙‍♂️ Alchemy NFT Minter

- Füge einfach den Link, den Namen und die Beschreibung deines Assets hinzu und drücke dann auf „Minten“. + Simply add your asset's link, name, and description, then press "Mint."

-

🖼 Link zum Asset:

+

🖼 Link to asset:

setURL(event.target.value)} />

🤔 Name:

setName(event.target.value)} /> -

✍️ Beschreibung:

+

✍️ Description:

setDescription(event.target.value)} />

{status}

+
) ``` -Schließlich wollen wir uns ansehen, wo diese Minter-Komponente hinzugefügt wird. +Lass uns abschließend klären, wo diese Minter-Komponente hinzugefügt wird. -Wenn du zur Datei `App.js` gehst, der Hauptkomponente in React, die als Container für alle anderen Komponenten fungiert, siehst du, dass unsere Minter-Komponente in Zeile 7 eingefügt wird. +Wenn du zur Datei `App.js` gehst, der Hauptkomponente in React, die als Container für alle anderen Komponenten fungiert, wirst du sehen, dass unsere Minter-Komponente in Zeile 7 eingefügt wird. -**In diesem Tutorial werden wir nur die `Minter.js`-Datei bearbeiten und Dateien in unserem `src`-Ordner hinzufügen.** +**In diesem Tutorial werden wir nur die Datei `Minter.js` bearbeiten und Dateien in unserem `src`-Ordner hinzufügen.** -Nachdem wir nun verstanden haben, womit wir arbeiten, richten wir unsere Ethereum-Wallet ein! +Jetzt, da wir verstehen, womit wir arbeiten, lass uns unsere Ethereum-Wallet einrichten! -## Richte deine Ethereum-Wallet ein {#set-up-your-ethereum-wallet} +## Deine Ethereum-Wallet einrichten {#set-up-your-ethereum-wallet} Damit Benutzer mit deinem Smart Contract interagieren können, müssen sie ihre Ethereum-Wallet mit deiner Dapp verbinden. ### MetaMask herunterladen {#download-metamask} -In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Wenn du mehr darüber erfahren möchtest, wie Transaktionen auf Ethereum funktionieren, sieh dir [diese Seite](/developers/docs/transactions/) an. +Für dieses Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, die zur Verwaltung deiner Ethereum-Kontoadresse verwendet wird. Wenn du mehr darüber erfahren möchtest, wie Transaktionen auf Ethereum funktionieren, sieh dir [diese Seite](/developers/docs/transactions/) an. -Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn du ein Konto erstellst oder bereits eines hast, wechsle unbedingt zum „Ropsten Test Network“ oben rechts (damit wir nicht mit echtem Geld hantieren). +Du kannst MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn du ein Konto erstellst oder bereits eines hast, stelle sicher, dass du oben rechts zum „Ropsten Test Network“ wechselst (damit wir nicht mit echtem Geld hantieren). ### Ether von einem Faucet hinzufügen {#add-ether-from-faucet} -Um unsere NFTs zu minten (oder Transaktionen auf der Ethereum-Blockchain zu signieren), benötigen wir einige gefälschte ETH. Um ETH zu erhalten, kannst du zum [Ropsten-Faucet](https://faucet.ropsten.be/) gehen und deine Ropsten-Kontoadresse eingeben und dann auf „Send Ropsten ETH“ klicken. Kurz darauf solltest du ETH in deinem MetaMask-Konto sehen! +Um unsere NFTs zu prägen (oder Transaktionen auf der Ethereum-Blockchain zu signieren), benötigen wir etwas falsches ETH. Um ETH zu erhalten, kannst du zum [Ropsten-Faucet](https://faucet.ropsten.be/) gehen, deine Ropsten-Kontoadresse eingeben und dann auf „Send Ropsten Eth“ klicken. Kurz darauf solltest du ETH in deinem MetaMask-Konto sehen! ### Deinen Kontostand überprüfen {#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: +Um sicherzugehen, dass unser Guthaben vorhanden ist, stellen 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 die Menge an ETH in unserer Wallet zurück. Nachdem du deine MetaMask-Kontoadresse eingegeben und auf „Send Request“ geklickt hast, solltest du eine Antwort wie diese sehen: ```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. +**HINWEIS:** Dieses Ergebnis ist in Wei, nicht in ETH. Wei wird als kleinste Stückelung von Ether verwendet. Die Umrechnung von Wei in ETH lautet: 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! +Puh! Unser falsches Geld ist komplett da! ## MetaMask mit deiner Benutzeroberfläche verbinden {#connect-metamask-to-your-UI} -Nachdem unsere MetaMask-Wallet nun eingerichtet ist, verbinden wir unsere Dapp damit! +Jetzt, da unsere MetaMask-Wallet eingerichtet ist, lass uns unsere Dapp damit verbinden! -Da wir uns an das [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)-Paradigma halten wollen, werden wir eine separate Datei erstellen, die unsere Funktionen zur Verwaltung der Logik, der Daten und der Regeln unserer Dapp enthält, und diese Funktionen dann an unser Frontend (unsere Minter.js-Komponente) übergeben. +Da wir uns an das [MVC](https://de.wikipedia.org/wiki/Model_View_Controller)-Paradigma halten wollen, werden wir eine separate Datei erstellen, die unsere Funktionen zur Verwaltung der Logik, Daten und Regeln unserer Dapp enthält, und diese Funktionen dann an unser Frontend (unsere Komponente Minter.js) übergeben. -### Die `connectWallet`-Funktion {#connect-wallet-function} +### Die Funktion `connectWallet` {#connect-wallet-function} -Dazu erstellen wir einen neuen Ordner namens `utils` in deinem `src`-Verzeichnis und fügen eine Datei namens `interact.js` hinzu, die alle unsere Interaktionsfunktionen für Wallets und Smart Contracts enthalten wird. +Dazu erstellen wir einen neuen Ordner namens `utils` in deinem `src`-Verzeichnis und fügen darin eine Datei namens `interact.js` hinzu, die alle unsere Interaktionsfunktionen für Wallet und Smart Contract enthalten wird. -In unserer `interact.js`-Datei schreiben wir eine `connectWallet`-Funktion, die wir dann in unsere `Minter.js`-Komponente importieren und aufrufen. +In unserer Datei `interact.js` werden wir eine Funktion `connectWallet` schreiben, die wir dann in unsere Komponente `Minter.js` importieren und aufrufen. -Füge in deine `interact.js`-Datei Folgendes ein +Füge in deiner Datei `interact.js` Folgendes hinzu: ```javascript export const connectWallet = async () => { @@ -238,7 +239,7 @@ export const connectWallet = async () => { method: "eth_requestAccounts", }) const obj = { - status: "👆🏽 Schreibe eine Nachricht in das Textfeld oben.", + status: "👆🏽 Write a message in the text-field above.", address: addressArray[0], } return obj @@ -256,8 +257,8 @@ export const connectWallet = async () => {

{" "} 🦊 - Du musst MetaMask, eine virtuelle Ethereum-Wallet, in deinem - Browser installieren. + You must install MetaMask, a virtual Ethereum wallet, in your + browser.

@@ -267,28 +268,28 @@ export const connectWallet = async () => { } ``` -Schauen wir uns an, was dieser Code bewirkt: +Lass uns aufschlüsseln, was dieser Code macht: Zuerst prüft unsere Funktion, ob `window.ethereum` in deinem 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 dies genehmigt wird, kann sie Daten aus 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)! +`window.ethereum` ist eine globale API, die von MetaMask und anderen Wallet-Anbietern injiziert wird und es Websites ermöglicht, die Ethereum-Konten der Benutzer anzufordern. Wenn dies genehmigt wird, kann sie Daten von den Blockchains lesen, mit denen der Benutzer verbunden ist, und vorschlagen, dass der Benutzer Nachrichten und Transaktionen signiert. 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` _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 JSX-Objekt `status` meldet, dass der Benutzer MetaMask installieren muss. -**Die meisten Funktionen, die wir schreiben, geben JSON-Objekte zurück, mit denen wir unsere Zustandsvariablen und die Benutzeroberfläche aktualisieren können.** +**Die meisten Funktionen, die wir schreiben, geben JSON-Objekte zurück, die wir verwenden können, um unsere Zustandsvariablen und die Benutzeroberfläche zu aktualisieren.** -Wenn `window.ethereum` jedoch vorhanden _ist_, dann wird es interessant. +Wenn `window.ethereum` _vorhanden_ ist, 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. +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, wodurch der Benutzer aufgefordert wird, seine Wallet mit deiner Dapp zu verbinden. -- Wenn der Benutzer die Verbindung herstellt, gibt `method: "eth_requestAccounts"` ein Array zurück, das alle Adressen der Benutzerkonten 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 sich für eine Verbindung entscheidet, gibt `method: "eth_requestAccounts"` ein Array zurück, das alle Kontoadressen des Benutzers enthält, die mit der Dapp verbunden sind. Insgesamt gibt unsere Funktion `connectWallet` 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. -### Hinzufügen der connectWallet-Funktion zur Minter.js-UI-Komponente {#add-connect-wallet} +### Die Funktion connectWallet zu deiner Minter.js-UI-Komponente hinzufügen {#add-connect-wallet} -Nachdem wir diese `connectWallet`-Funktion geschrieben haben, verbinden wir sie mit unserer `Minter.js.`-Komponente. +Nachdem wir nun diese Funktion `connectWallet` geschrieben haben, verbinden wir sie mit unserer Komponente `Minter.js`. -Zuerst müssen wir unsere Funktion in unsere `Minter.js`-Datei importieren, indem wir `import { connectWallet } from "./utils/interact.js";` am Anfang der `Minter.js`-Datei hinzufügen. Deine ersten 11 Zeilen von `Minter.js` sollten nun so aussehen: +Zuerst müssen wir unsere Funktion in unsere Datei `Minter.js` importieren, indem wir `import { connectWallet } from "./utils/interact.js";` oben in der Datei `Minter.js` hinzufügen. Deine ersten 11 Zeilen von `Minter.js` sollten nun so aussehen: ```javascript import { useEffect, useState } from "react"; @@ -296,7 +297,7 @@ import { connectWallet } from "./utils/interact.js"; const Minter = (props) => { - //Zustandsvariablen + // Zustandsvariablen const [walletAddress, setWallet] = useState(""); const [status, setStatus] = useState(""); const [name, setName] = useState(""); @@ -304,7 +305,7 @@ const Minter = (props) => { const [url, setURL] = useState(""); ``` -Dann rufen wir in unserer `connectWalletPressed`-Funktion unsere importierte `connectWallet`-Funktion auf, wie folgt: +Dann rufen wir innerhalb unserer Funktion `connectWalletPressed` unsere importierte Funktion `connectWallet` wie folgt auf: ```javascript const connectWalletPressed = async () => { @@ -314,25 +315,25 @@ const connectWalletPressed = async () => { } ``` -Fällt dir auf, wie der größte Teil unserer Funktionalität von unserer `Minter.js`-Komponente in die `interact.js`-Datei abstrahiert wird? Dies geschieht, damit wir dem M-V-C-Paradigma entsprechen! +Fällt dir auf, wie der Großteil unserer Funktionalität aus unserer Komponente `Minter.js` in die Datei `interact.js` abstrahiert wird? Das tun wir, um dem M-V-C-Paradigma zu 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. +In `connectWalletPressed` machen wir einfach einen await-Aufruf an unsere importierte Funktion `connectWallet` und aktualisieren mit deren Antwort unsere Variablen `status` und `walletAddress` über ihre State-Hooks. -Speichern wir nun beide Dateien, `Minter.js` und `interact.js`, und testen unsere Benutzeroberfläche. +Lass uns nun beide Dateien `Minter.js` und `interact.js` speichern und unsere bisherige Benutzeroberfläche testen. -Öffne deinen Browser unter localhost:3000 und drücke die Schaltfläche „Wallet verbinden“ oben rechts auf der Seite. +Öffne deinen Browser unter localhost:3000 und drücke oben rechts auf der Seite auf die Schaltfläche „Connect Wallet“. -Wenn du MetaMask installiert hast, solltest du aufgefordert werden, deine Wallet mit deiner Dapp zu verbinden. Akzeptiere die Aufforderung, eine Verbindung herzustellen. +Wenn du MetaMask installiert hast, solltest du aufgefordert werden, deine Wallet mit deiner Dapp zu verbinden. Akzeptiere die Einladung zur Verbindung. Du solltest sehen, dass die Wallet-Schaltfläche nun anzeigt, dass deine Adresse verbunden ist. -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 ... +Versuche als Nächstes, die Seite zu aktualisieren ... das ist seltsam. Unsere Wallet-Schaltfläche fordert uns auf, MetaMask zu verbinden, obwohl es bereits verbunden ist ... -Aber keine Sorge! Das können wir leicht beheben, indem wir eine Funktion namens `getCurrentWalletConnected` implementieren, die prüft, ob eine Adresse bereits mit unserer Dapp verbunden ist, und unsere Benutzeroberfläche entsprechend aktualisiert! +Aber keine Sorge! Wir können das leicht beheben, indem wir eine Funktion namens `getCurrentWalletConnected` implementieren, die prüft, ob bereits eine Adresse mit unserer Dapp verbunden ist, und unsere Benutzeroberfläche entsprechend aktualisiert! -### Die getCurrentWalletConnected-Funktion {#get-current-wallet} +### Die Funktion getCurrentWalletConnected {#get-current-wallet} -Füge in deine `interact.js`-Datei die folgende `getCurrentWalletConnected`-Funktion ein: +Füge in deiner Datei `interact.js` die folgende Funktion `getCurrentWalletConnected` hinzu: ```javascript export const getCurrentWalletConnected = async () => { @@ -344,12 +345,12 @@ export const getCurrentWalletConnected = async () => { if (addressArray.length > 0) { return { address: addressArray[0], - status: "👆🏽 Schreibe eine Nachricht in das Textfeld oben.", + status: "👆🏽 Write a message in the text-field above.", } } else { return { address: "", - status: "🦊 Verbinde dich mit MetaMask über die Schaltfläche oben rechts.", + status: "🦊 Connect to MetaMask using the top right button.", } } } catch (err) { @@ -366,8 +367,8 @@ export const getCurrentWalletConnected = async () => {

{" "} 🦊 - Du musst MetaMask, eine virtuelle Ethereum-Wallet, in deinem - Browser installieren. + You must install MetaMask, a virtual Ethereum wallet, in your + browser.

@@ -377,23 +378,23 @@ export const getCurrentWalletConnected = async () => { } ``` -Dieser Code ist der `connectWallet`-Funktion, die wir gerade geschrieben haben, _sehr_ ähnlich. +Dieser Code ist der Funktion `connectWallet`, die wir gerade geschrieben haben, _sehr_ ähnlich. -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. +Der Hauptunterschied besteht darin, dass wir hier nicht die Methode `eth_requestAccounts` aufrufen, die MetaMask öffnet, damit der Benutzer seine Wallet verbinden kann, sondern die Methode `eth_accounts`, 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 der `useEffect`-Funktion unserer `Minter.js`-Komponente auf. +Um diese Funktion in Aktion zu sehen, rufen wir sie in der Funktion `useEffect` unserer Komponente `Minter.js` auf. -Wie bei `connectWallet` müssen wir diese Funktion aus unserer `interact.js`-Datei in unsere `Minter.js`-Datei importieren, und zwar so: +Wie bei `connectWallet` müssen wir diese Funktion aus unserer Datei `interact.js` wie folgt in unsere Datei `Minter.js` importieren: ```javascript import { useEffect, useState } from "react" import { connectWallet, - getCurrentWalletConnected, //hier importieren + getCurrentWalletConnected, // hier importieren } from "./utils/interact.js" ``` -Jetzt rufen wir sie einfach in unserer `useEffect`-Funktion auf: +Nun rufen wir sie einfach in unserer Funktion `useEffect` auf: ```javascript useEffect(async () => { @@ -403,15 +404,15 @@ useEffect(async () => { }, []) ``` -Beachte, dass wir die Antwort unseres Aufrufs an `getCurrentWalletConnected` verwenden, um unsere `walletAddress`- und `status`-Zustandsvariablen zu aktualisieren. +Beachte, dass wir die Antwort unseres Aufrufs von `getCurrentWalletConnected` verwenden, um unsere Zustandsvariablen `walletAddress` und `status` zu aktualisieren. -Nachdem du diesen Code hinzugefügt hast, versuche, unser Browserfenster zu aktualisieren. Die Schaltfläche sollte anzeigen, dass du verbunden bist, und eine Vorschau der Adresse deiner verbundenen Wallet anzeigen – auch nach dem Aktualisieren! +Sobald du diesen Code hinzugefügt hast, versuche, unser Browserfenster zu aktualisieren. Die Schaltfläche sollte anzeigen, dass du verbunden bist, und eine Vorschau der Adresse deiner verbundenen Wallet anzeigen – auch nach dem Aktualisieren! ### addWalletListener implementieren {#implement-add-wallet-listener} -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. +Der letzte Schritt bei 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. -Füge in deine `Minter.js`-Datei eine Funktion `addWalletListener` hinzu, die wie folgt aussieht: +Füge in deiner Datei `Minter.js` eine Funktion `addWalletListener` hinzu, die wie folgt aussieht: ```javascript function addWalletListener() { @@ -419,10 +420,10 @@ function addWalletListener() { window.ethereum.on("accountsChanged", (accounts) => { if (accounts.length > 0) { setWallet(accounts[0]) - setStatus("👆🏽 Schreibe eine Nachricht in das Textfeld oben.") + setStatus("👆🏽 Write a message in the text-field above.") } else { setWallet("") - setStatus("🦊 Verbinde dich mit MetaMask über die Schaltfläche oben rechts.") + setStatus("🦊 Connect to MetaMask using the top right button.") } }) } else { @@ -430,7 +431,7 @@ function addWalletListener() {

{" "} 🦊 - Du musst MetaMask, eine virtuelle Ethereum-Wallet, in deinem Browser installieren. + You must install MetaMask, a virtual Ethereum wallet, in your browser.

) @@ -441,10 +442,10 @@ function addWalletListener() { Lass uns kurz aufschlüsseln, was hier passiert: - 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. + - Wenn nicht, setzen wir unsere Zustandsvariable `status` einfach auf eine JSX-Zeichenfolge, die den Benutzer auffordert, MetaMask zu installieren. + - Wenn es aktiviert ist, richten wir in Zeile 3 den Listener `window.ethereum.on("accountsChanged")` ein, der auf Zustandsänderungen in der MetaMask-Wallet lauscht, z. B. wenn der Benutzer ein zusätzliches Konto mit der Dapp verbindet, Konten wechselt oder die Verbindung zu einem Konto trennt. Wenn mindestens ein Konto verbunden ist, wird die Zustandsvariable `walletAddress` als erstes Konto im vom Listener zurückgegebenen Array `accounts` aktualisiert. Andernfalls wird `walletAddress` als leere Zeichenfolge festgelegt. -Schließlich müssen wir sie in unserer `useEffect`-Funktion aufrufen: +Schließlich müssen wir sie in unserer Funktion `useEffect` aufrufen: ```javascript useEffect(async () => { @@ -456,66 +457,66 @@ useEffect(async () => { }, []) ``` -Und voilà! Wir haben die Programmierung all unserer Wallet-Funktionalitäten abgeschlossen! Nachdem unsere Wallet nun eingerichtet ist, finden wir heraus, wie wir unser NFT minten können! +Und voilà! Wir haben die Programmierung unserer gesamten Wallet-Funktionalität abgeschlossen! Jetzt, da unsere Wallet eingerichtet ist, lass uns herausfinden, wie wir unser NFT prägen können! ## NFT-Metadaten 101 {#nft-metadata-101} -Erinnerst du dich an die NFT-Metadaten, über die wir in Schritt 0 dieses Tutorials gesprochen haben? Sie erwecken einen NFT zum Leben und ermöglichen es ihm, Eigenschaften wie ein digitales Asset, einen Namen, eine Beschreibung und andere Attribute zu haben. +Erinnerst du dich an die NFT-Metadaten, über die wir gerade in Schritt 0 dieses Tutorials gesprochen haben? Sie erwecken ein NFT zum Leben und ermöglichen es ihm, Eigenschaften wie ein digitales Asset, einen Namen, eine Beschreibung und andere Attribute zu haben. -Wir müssen diese Metadaten als JSON-Objekt konfigurieren und speichern, damit wir sie als `tokenURI`-Parameter übergeben können, wenn wir die `mintNFT`-Funktion unseres Smart Contracts aufrufen. +Wir müssen diese Metadaten als JSON-Objekt konfigurieren und speichern, damit wir sie als Parameter `tokenURI` übergeben können, wenn wir die Funktion `mintNFT` unseres Smart Contracts aufrufen. -Der Text in den Feldern „Link zum Asset“, „Name“, „Beschreibung“ wird die verschiedenen Eigenschaften der Metadaten unseres NFTs umfassen. Wir werden diese Metadaten als JSON-Objekt formatieren, aber es gibt ein paar Optionen, wo wir dieses JSON-Objekt speichern können: +Der Text in den Feldern „Link to Asset“, „Name“ und „Description“ umfasst die verschiedenen Eigenschaften der Metadaten unseres NFTs. Wir formatieren diese Metadaten als JSON-Objekt, aber es gibt ein paar Optionen, wo wir dieses JSON-Objekt speichern können: -- Wir könnten sie auf der Ethereum-Blockchain speichern, was jedoch sehr teuer wäre. -- Wir könnten sie auf einem zentralisierten Server wie AWS oder Firebase speichern. Aber das würde unserem Dezentralisierungs-Ethos widersprechen. +- Wir könnten es auf der Ethereum-Blockchain speichern; dies wäre jedoch sehr teuer. +- Wir könnten es auf einem zentralisierten Server wie AWS oder Firebase speichern. Aber das würde unserem Dezentralisierungs-Ethos widersprechen. - Wir könnten IPFS verwenden, ein dezentralisiertes Protokoll und Peer-to-Peer-Netzwerk zum Speichern und Teilen von Daten in einem verteilten Dateisystem. Da dieses Protokoll dezentralisiert und kostenlos ist, ist es unsere beste Option! Um unsere Metadaten auf IPFS zu speichern, verwenden wir [Pinata](https://pinata.cloud/), eine praktische IPFS-API und ein Toolkit. Im nächsten Schritt erklären wir genau, wie das geht! -## Pinata verwenden, um deine Metadaten auf IPFS zu pinnen {#use-pinata-to-pin-your-metadata-to-IPFS} +## Pinata verwenden, um deine Metadaten an IPFS anzuheften {#use-pinata-to-pin-your-metadata-to-IPFS} -Wenn du noch kein [Pinata](https://pinata.cloud/)-Konto hast, registriere dich [hier](https://app.pinata.cloud/auth/signup) für ein kostenloses Konto und führe die Schritte zur Verifizierung deiner E-Mail und deines Kontos durch. +Wenn du kein [Pinata](https://pinata.cloud/)-Konto hast, melde dich [hier](https://app.pinata.cloud/auth/signup) für ein kostenloses Konto an und führe die Schritte zur Verifizierung deiner E-Mail-Adresse und deines Kontos durch. -### Erstelle deinen Pinata-API-Schlüssel {#create-pinata-api-key} +### Deinen Pinata-API-Schlüssel erstellen {#create-pinata-api-key} -Navigiere zur Seite [https://pinata.cloud/keys](https://pinata.cloud/keys), wähle dann oben die Schaltfläche „New Key“ (Neuer Schlüssel), setze das Admin-Widget auf „Enabled“ (Aktiviert) und benenne deinen Schlüssel. +Navigiere zur Seite [https://pinata.cloud/keys](https://pinata.cloud/keys), wähle dann oben die Schaltfläche „New Key“ (Neuer Schlüssel), aktiviere das Admin-Widget und benenne deinen Schlüssel. -Dir wird dann ein Popup mit deinen API-Informationen angezeigt. Bewahre diese an einem sicheren Ort auf. +Dir wird dann ein Popup mit deinen API-Informationen angezeigt. Stelle sicher, dass du diese an einem sicheren Ort aufbewahrst. -Nachdem unser Schlüssel nun eingerichtet ist, fügen wir ihn zu unserem Projekt hinzu, damit wir ihn verwenden können. +Jetzt, da unser Schlüssel eingerichtet ist, fügen wir ihn unserem Projekt hinzu, damit wir ihn verwenden können. ### Eine .env-Datei erstellen {#create-a-env} -Wir können unseren Pinata-Schlüssel und das Geheimnis sicher in einer Umgebungsdatei speichern. Installieren wir das [dotenv-Paket](https://www.npmjs.com/package/dotenv) in deinem Projektverzeichnis. +Wir können unseren Pinata-Schlüssel und unser Secret sicher in einer Umgebungsdatei speichern. Lass uns das [dotenv-Paket](https://www.npmjs.com/package/dotenv) in deinem Projektverzeichnis installieren. -Öffne einen neuen Tab in deinem Terminal (getrennt von dem, auf dem der Localhost läuft) und stelle sicher, dass du dich im Ordner `minter-starter-files` befindest. Führe dann den folgenden Befehl in deinem Terminal aus: +Öffne einen neuen Tab in deinem Terminal (getrennt von dem, auf dem der lokale Host läuft) und stelle sicher, dass du dich im Ordner `minter-starter-files` befindest. Führe dann den folgenden Befehl in deinem Terminal aus: ```text npm install dotenv --save ``` -Als Nächstes erstelle eine `.env`-Datei im Stammverzeichnis deiner `minter-starter-files`, indem du Folgendes in deiner Befehlszeile eingibst: +Erstelle als Nächstes eine `.env`-Datei im Stammverzeichnis deiner `minter-starter-files`, indem du Folgendes in deine Befehlszeile eingibst: ```javascript vim.env ``` -Dadurch wird deine `.env`-Datei in vim (einem Texteditor) geöffnet. Um sie zu speichern, drücke „esc“ + „:“ + „q“ in dieser Reihenfolge auf deiner Tastatur. +Dadurch wird deine `.env`-Datei in vim (einem Texteditor) geöffnet. Um sie zu speichern, drücke in dieser Reihenfolge „Esc“ + „:“ + „q“ auf deiner Tastatur. -Navigiere als Nächstes in VSCode zu deiner `.env`-Datei und füge deinen Pinata-API-Schlüssel und dein API-Geheimnis hinzu, und zwar so: +Navigiere als Nächstes in VSCode zu deiner `.env`-Datei und füge deinen Pinata-API-Schlüssel und dein API-Secret wie folgt hinzu: ```text -REACT_APP_PINATA_KEY = -REACT_APP_PINATA_SECRET = +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = ``` -Speichere die Datei, und dann kannst du damit beginnen, die Funktion zum Hochladen deiner JSON-Metadaten auf IPFS zu schreiben! +Speichere die Datei, und dann bist du bereit, die Funktion zum Hochladen deiner JSON-Metadaten auf IPFS zu schreiben! ### pinJSONToIPFS implementieren {#pin-json-to-ipfs} -Glücklicherweise hat Pinata eine [API speziell für das Hochladen von JSON-Daten auf IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) und ein praktisches JavaScript-Beispiel mit Axios, das wir mit leichten Änderungen verwenden können. +Zum Glück für uns hat Pinata eine [API speziell zum Hochladen von JSON-Daten auf IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) und ein praktisches JavaScript-Beispiel mit axios, das wir mit einigen leichten Modifikationen verwenden können. -Erstellen wir in deinem `utils`-Ordner eine weitere Datei namens `pinata.js` und importieren dann unser Pinata-Geheimnis und den Schlüssel aus der .env-Datei wie folgt: +Lass uns in deinem `utils`-Ordner eine weitere Datei namens `pinata.js` erstellen und dann unser Pinata-Secret und unseren Schlüssel wie folgt aus der .env-Datei importieren: ```javascript require("dotenv").config() @@ -523,7 +524,7 @@ const key = process.env.REACT_APP_PINATA_KEY const secret = process.env.REACT_APP_PINATA_SECRET ``` -Füge als Nächstes den zusätzlichen Code von unten in deine `pinata.js`-Datei ein. Keine Sorge, wir werden aufschlüsseln, was alles bedeutet! +Füge als Nächstes den zusätzlichen Code von unten in deine Datei `pinata.js` ein. Keine Sorge, wir werden aufschlüsseln, was alles bedeutet! ```javascript require("dotenv").config() @@ -534,7 +535,7 @@ const axios = require("axios") export const pinJSONToIPFS = async (JSONBody) => { const url = `https://api.pinata.cloud/pinning/pinJSONToIPFS` - //axios-POST-Anfrage an Pinata stellen ⬇️ + // Axios-POST-Anfrage an Pinata durchführen ⬇️ return axios .post(url, JSONBody, { headers: { @@ -563,59 +564,59 @@ Was genau macht dieser Code also? Zuerst importiert er [axios](https://www.npmjs.com/package/axios), einen Promise-basierten HTTP-Client für den Browser und node.js, den wir verwenden werden, um eine Anfrage an Pinata zu stellen. -Dann haben wir unsere asynchrone Funktion `pinJSONToIPFS`, die einen `JSONBody` als Eingabe und den Pinata-API-Schlüssel und das Geheimnis in ihrem Header entgegennimmt, um eine POST-Anfrage an ihre `pinJSONToIPFS`-API zu stellen. +Dann haben wir unsere asynchrone Funktion `pinJSONToIPFS`, die einen `JSONBody` als Eingabe und den Pinata-API-Schlüssel und das Secret in ihrem Header nimmt, um eine POST-Anfrage an ihre `pinJSONToIPFS`-API zu stellen. -- Wenn diese POST-Anfrage erfolgreich ist, gibt unsere Funktion ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „true“ gesetzt ist und die `pinataUrl` angibt, wo unsere Metadaten angeheftet wurden. Wir werden diese zurückgegebene `pinataUrl` als `tokenURI`-Eingabe für die Mint-Funktion unseres Smart Contracts verwenden. -- Wenn diese Post-Anfrage fehlschlägt, gibt unsere Funktion ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „false“ gesetzt ist und eine `message`-Zeichenfolge unseren Fehler weitergibt. +- Wenn diese POST-Anfrage erfolgreich ist, gibt unsere Funktion ein JSON-Objekt zurück, bei dem der boolesche Wert `success` auf true gesetzt ist und die `pinataUrl` enthält, an der unsere Metadaten angeheftet wurden. Wir werden diese zurückgegebene `pinataUrl` als `tokenURI`-Eingabe für die Prägefunktion unseres Smart Contracts verwenden. +- Wenn diese POST-Anfrage fehlschlägt, gibt unsere Funktion ein JSON-Objekt zurück, bei dem der boolesche Wert `success` auf false gesetzt ist und eine `message`-Zeichenfolge unseren Fehler meldet. -Wie bei unseren `connectWallet`-Funktionsrückgabetypen geben wir JSON-Objekte zurück, damit wir ihre Parameter zur Aktualisierung unserer Zustandsvariablen und der Benutzeroberfläche verwenden können. +Wie bei den Rückgabetypen unserer Funktion `connectWallet` geben wir JSON-Objekte zurück, damit wir ihre Parameter verwenden können, um unsere Zustandsvariablen und die Benutzeroberfläche zu aktualisieren. -## Lade deinen Smart Contract {#load-your-smart-contract} +## Deinen Smart Contract laden {#load-your-smart-contract} -Nachdem wir nun eine Möglichkeit haben, unsere NFT-Metadaten über unsere `pinJSONToIPFS`-Funktion auf IPFS hochzuladen, benötigen wir eine Möglichkeit, eine Instanz unseres Smart Contracts zu laden, damit wir seine `mintNFT`-Funktion aufrufen können. +Jetzt, da wir eine Möglichkeit haben, unsere NFT-Metadaten über unsere Funktion `pinJSONToIPFS` auf IPFS hochzuladen, benötigen wir eine Möglichkeit, eine Instanz unseres Smart Contracts zu laden, damit wir seine Funktion `mintNFT` aufrufen können. -Wie bereits erwähnt, werden wir in diesem Tutorial [diesen bestehenden NFT-Smart-Contract](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) verwenden. Wenn du jedoch lernen möchtest, wie wir ihn erstellt haben oder selbst einen erstellen möchtest, empfehlen wir dir dringend, unser anderes Tutorial [„Wie man einen NFT erstellt“](https://www.alchemy.com/docs/how-to-create-an-nft) anzusehen. +Wie bereits erwähnt, werden wir in diesem Tutorial [diesen bestehenden NFT-Smart-Contract](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) verwenden; wenn du jedoch erfahren möchtest, wie wir ihn erstellt haben, oder selbst einen erstellen möchtest, empfehlen wir dir dringend, dir unser anderes Tutorial anzusehen: [„Wie man ein NFT erstellt“](https://www.alchemy.com/docs/how-to-create-an-nft). -### Das Contract-ABI {#contract-abi} +### Die Contract-ABI {#contract-abi} -Wenn du unsere Dateien genau untersucht hast, wirst du bemerkt haben, dass es in unserem `src`-Verzeichnis eine `contract-abi.json`-Datei gibt. Ein ABI ist notwendig, um anzugeben, welche Funktion ein Vertrag aufrufen wird, und um sicherzustellen, dass die Funktion Daten in dem von dir erwarteten Format zurückgibt. +Wenn du unsere Dateien genau untersucht hast, wirst du festgestellt haben, dass sich in unserem `src`-Verzeichnis eine Datei `contract-abi.json` befindet. Eine ABI ist notwendig, um anzugeben, welche Funktion ein Contract aufrufen wird, und um sicherzustellen, dass die Funktion Daten in dem Format zurückgibt, das du erwartest. -Wir werden auch einen Alchemy-API-Schlüssel und die Alchemy-Web3-API benötigen, um uns mit der Ethereum-Blockchain zu verbinden und unseren Smart Contract zu laden. +Wir benötigen außerdem einen Alchemy-API-Schlüssel und die Alchemy-Web3-API, um uns mit der Ethereum-Blockchain zu verbinden und unseren Smart Contract zu laden. -### Erstelle deinen Alchemy-API-Schlüssel {#create-alchemy-api} +### Deinen Alchemy-API-Schlüssel erstellen {#create-alchemy-api} -Wenn du noch kein Alchemy-Konto hast, [registriere dich hier kostenlos](https://alchemy.com/?a=eth-org-nft-minter). +Wenn du noch kein Alchemy-Konto hast, [melde dich hier kostenlos an.](https://alchemy.com/?a=eth-org-nft-minter) -Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Dadurch können wir Anfragen an das Ropsten-Testnet stellen. +Sobald du ein Alchemy-Konto erstellt hast, kannst du einen API-Schlüssel generieren, indem du eine App erstellst. Dies ermöglicht es uns, Anfragen an das Ropsten-Testnet zu stellen. -Navigiere zur Seite „App erstellen“ in deinem Alchemy-Dashboard, indem du in der Navigationsleiste über „Apps“ fährst und auf „App erstellen“ klickst. +Navigiere zur Seite „Create App“ (App erstellen) in deinem Alchemy-Dashboard, indem du mit der Maus über „Apps“ in der Navigationsleiste fährst und auf „Create App“ klickst. -Benenne deine App – wir haben „Mein erster NFT!“ gewählt –, gib eine kurze Beschreibung, wähle „Staging“ für die Umgebung, die für die Buchführung deiner App verwendet wird, und wähle „Ropsten“ als dein Netzwerk. +Benenne deine App (wir haben „My First NFT!“ gewählt), biete eine kurze Beschreibung an, wähle „Staging“ für die Umgebung, die für die Buchhaltung deiner App verwendet wird, und wähle „Ropsten“ für dein Netzwerk. -Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen. +Klicke auf „Create app“ und das war's! Deine App sollte in der Tabelle unten erscheinen. -Super, jetzt, da wir unsere HTTP-Alchemy-API-URL erstellt haben, kopiere sie in deine Zwischenablage ... +Großartig, jetzt, da wir unsere HTTP-Alchemy-API-URL erstellt haben, kopiere sie in deine Zwischenablage ... -… und fügen wir sie zu unserer `.env`-Datei hinzu. Insgesamt sollte deine .env-Datei so aussehen: +… und fügen wir sie dann unserer `.env`-Datei hinzu. Insgesamt sollte deine .env-Datei so aussehen: ```text REACT_APP_PINATA_KEY = REACT_APP_PINATA_SECRET = -REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ +REACT_APP_ALCHEMY_KEY = https: // eth-ropsten.alchemyapi.io/v2/ ``` -Jetzt, da wir unser Contract-ABI und unseren Alchemy-API-Schlüssel haben, sind wir bereit, unseren Smart Contract mit [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) zu laden. +Jetzt, da wir unsere Contract-ABI und unseren Alchemy-API-Schlüssel haben, sind wir bereit, unseren Smart Contract mit [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) zu laden. -### Richte deinen Alchemy-Web3-Endpunkt und deinen Vertrag ein {#setup-alchemy-endpoint} +### Deinen Alchemy-Web3-Endpunkt und Contract einrichten {#setup-alchemy-endpoint} -Wenn du es noch nicht hast, musst du zuerst [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) installieren, indem du im Terminal zum Stammverzeichnis navigierst: `nft-minter-tutorial`: +Wenn du es noch nicht hast, musst du zuerst [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) installieren, indem du im Terminal zum Home-Verzeichnis `nft-minter-tutorial` navigierst: ```text cd .. npm install @alch/alchemy-web3 ``` -Als Nächstes kehren wir zu unserer `interact.js`-Datei zurück. Füge am Anfang der Datei den folgenden Code hinzu, um deinen Alchemy-Schlüssel aus deiner .env-Datei zu importieren und deinen Alchemy-Web3-Endpunkt einzurichten: +Gehen wir als Nächstes zurück zu unserer Datei `interact.js`. Füge oben in der Datei den folgenden Code hinzu, um deinen Alchemy-Schlüssel aus deiner .env-Datei zu importieren und deinen Alchemy-Web3-Endpunkt einzurichten: ```javascript require("dotenv").config() @@ -624,9 +625,9 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(alchemyKey) ``` -[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ist ein Wrapper um [Web3.js](https://docs.web3js.org/) und bietet erweiterte API-Methoden und andere entscheidende Vorteile, um dir das Leben als Web3-Entwickler zu erleichtern. Es ist so konzipiert, dass es eine minimale Konfiguration erfordert, sodass du es sofort in deiner App verwenden kannst! +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ist ein Wrapper um [Web3.js](https://docs.web3js.org/), der erweiterte API-Methoden und andere entscheidende Vorteile bietet, um dir das Leben als Web3-Entwickler zu erleichtern. Es ist so konzipiert, dass es nur minimale Konfiguration erfordert, sodass du es sofort in deiner App verwenden kannst! -Als Nächstes fügen wir unser Contract-ABI und unsere Contract-Adresse zu unserer Datei hinzu. +Fügen wir als Nächstes unsere Contract-ABI und Contract-Adresse zu unserer Datei hinzu. ```javascript require("dotenv").config() @@ -638,103 +639,103 @@ const contractABI = require("../contract-abi.json") const contractAddress = "0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE" ``` -Sobald wir beides haben, sind wir bereit, unsere Mint-Funktion zu programmieren! +Sobald wir beides haben, sind wir bereit, mit der Programmierung unserer Prägefunktion zu beginnen! -## Die mintNFT-Funktion implementieren {#implement-the-mintnft-function} +## Die Funktion mintNFT implementieren {#implement-the-mintnft-function} -Definieren wir in deiner `interact.js`-Datei unsere Funktion `mintNFT`, die gleichnamig unseren NFT minten wird. +Lass uns in deiner Datei `interact.js` unsere Funktion `mintNFT` definieren, die namensgebend unser NFT prägen wird. -Da wir zahlreiche asynchrone Aufrufe machen werden (an Pinata, um unsere Metadaten auf IPFS zu pinnen, an Alchemy Web3, um unseren Smart Contract zu laden, und an MetaMask, um unsere Transaktionen zu signieren), wird unsere Funktion ebenfalls asynchron sein. +Da wir zahlreiche asynchrone Aufrufe durchführen werden (an Pinata, um unsere Metadaten an IPFS anzuheften, an Alchemy Web3, um unseren Smart Contract zu laden, und an MetaMask, um unsere Transaktionen zu signieren), wird unsere Funktion ebenfalls asynchron sein. -Die drei Eingaben für unsere Funktion sind die `url` unseres digitalen Assets, der `name` und die `description`. Füge die folgende Funktionssignatur unter der `connectWallet`-Funktion hinzu: +Die drei Eingaben für unsere Funktion sind die `url` unseres digitalen Assets, der `name` und die `description`. Füge die folgende Funktionssignatur unter der Funktion `connectWallet` hinzu: ```javascript export const mintNFT = async (url, name, description) => {} ``` -### Fehlerbehandlung bei der Eingabe {#input-error-handling} +### Eingabefehlerbehandlung {#input-error-handling} -Natürlich ist es sinnvoll, am Anfang der Funktion eine Art Fehlerbehandlung für die Eingabe zu haben, damit wir diese Funktion beenden, wenn unsere Eingabeparameter nicht korrekt sind. Fügen wir in unserer Funktion den folgenden Code hinzu: +Natürlich ist es sinnvoll, zu Beginn der Funktion eine Art Eingabefehlerbehandlung zu haben, damit wir diese Funktion verlassen, wenn unsere Eingabeparameter nicht korrekt sind. Fügen wir innerhalb unserer Funktion den folgenden Code hinzu: ```javascript export const mintNFT = async (url, name, description) => { - //Fehlerbehandlung + // Fehlerbehandlung if (url.trim() == "" || name.trim() == "" || description.trim() == "") { return { success: false, - status: "❗Bitte stelle sicher, dass alle Felder vor dem Minten ausgefüllt sind.", + status: "❗Please make sure all fields are completed before minting.", } } } ``` -Im Wesentlichen, wenn einer der Eingabeparameter eine leere Zeichenfolge ist, geben wir ein JSON-Objekt zurück, bei dem der `success`-Boole'sche Wert auf „false“ gesetzt ist und die `status`-Zeichenfolge meldet, dass alle Felder in unserer Benutzeroberfläche vollständig sein müssen. +Im Wesentlichen geben wir, wenn einer der Eingabeparameter eine leere Zeichenfolge ist, ein JSON-Objekt zurück, bei dem der boolesche Wert `success` auf false gesetzt ist und die Zeichenfolge `status` meldet, dass alle Felder in unserer Benutzeroberfläche ausgefüllt sein müssen. -### Hochladen der Metadaten auf IPFS {#upload-metadata-to-ipfs} +### Die Metadaten auf IPFS hochladen {#upload-metadata-to-ipfs} -Sobald wir wissen, dass unsere Metadaten korrekt formatiert sind, besteht der nächste Schritt darin, sie in ein JSON-Objekt zu verpacken und über die von uns geschriebene `pinJSONToIPFS`-Funktion auf IPFS hochzuladen! +Sobald wir wissen, dass unsere Metadaten richtig formatiert sind, besteht der nächste Schritt darin, sie in ein JSON-Objekt zu verpacken und über die von uns geschriebene Funktion `pinJSONToIPFS` auf IPFS hochzuladen! -Dazu müssen wir zuerst die `pinJSONToIPFS`-Funktion in unsere `interact.js`-Datei importieren. Ganz oben in der `interact.js` fügen wir hinzu: +Dazu müssen wir zunächst die Funktion `pinJSONToIPFS` in unsere Datei `interact.js` importieren. Fügen wir ganz oben in der `interact.js` Folgendes hinzu: ```javascript import { pinJSONToIPFS } from "./pinata.js" ``` -Erinnere dich daran, dass `pinJSONToIPFS` einen JSON-Körper entgegennimmt. Bevor wir sie aufrufen, müssen wir also unsere `url`-, `name`- und `description`-Parameter in ein JSON-Objekt formatieren. +Erinnere dich daran, dass `pinJSONToIPFS` einen JSON-Body aufnimmt. Bevor wir sie also aufrufen, müssen wir unsere Parameter `url`, `name` und `description` in ein JSON-Objekt formatieren. -Aktualisieren wir unseren Code, um ein JSON-Objekt namens `metadata` zu erstellen und dann einen Aufruf an `pinJSONToIPFS` mit diesem `metadata`-Parameter zu machen: +Aktualisieren wir unseren Code, um ein JSON-Objekt namens `metadata` zu erstellen, und rufen dann `pinJSONToIPFS` mit diesem Parameter `metadata` auf: ```javascript export const mintNFT = async (url, name, description) => { - //Fehlerbehandlung + // Fehlerbehandlung if (url.trim() == "" || name.trim() == "" || description.trim() == "") { return { success: false, - status: "❗Bitte stelle sicher, dass alle Felder vor dem Minten ausgefüllt sind.", + status: "❗Please make sure all fields are completed before minting.", } } - //Metadaten erstellen + // Metadaten erstellen const metadata = new Object() metadata.name = name metadata.image = url metadata.description = description - //Pinata-Aufruf durchführen + // Pinata-Aufruf durchführen const pinataResponse = await pinJSONToIPFS(metadata) if (!pinataResponse.success) { return { success: false, - status: "😢 Etwas ist beim Hochladen deiner tokenURI schiefgelaufen.", + status: "😢 Something went wrong while uploading your tokenURI.", } } const tokenURI = pinataResponse.pinataUrl } ``` -Beachte, dass wir die Antwort unseres Aufrufs an `pinJSONToIPFS(metadata)` im `pinataResponse`-Objekt speichern. Dann analysieren wir dieses Objekt auf Fehler. +Beachte, dass wir die Antwort unseres Aufrufs von `pinJSONToIPFS(metadata)` im Objekt `pinataResponse` speichern. Dann parsen wir dieses Objekt auf eventuelle Fehler. -Wenn ein Fehler auftritt, geben wir ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „false“ gesetzt ist und unsere `status`-Zeichenfolge meldet, dass unser Aufruf fehlgeschlagen ist. Andernfalls extrahieren wir die `pinataURL` aus der `pinataResponse` und speichern sie als unsere `tokenURI`-Variable. +Wenn ein Fehler vorliegt, geben wir ein JSON-Objekt zurück, bei dem der boolesche Wert `success` auf false gesetzt ist und unsere Zeichenfolge `status` meldet, dass unser Aufruf fehlgeschlagen ist. Andernfalls extrahieren wir die `pinataURL` aus der `pinataResponse` und speichern sie als unsere Variable `tokenURI`. -Jetzt ist es an der Zeit, unseren Smart Contract mit der Alchemy Web3-API zu laden, die wir am Anfang unserer Datei initialisiert haben. Füge die folgende Codezeile am Ende der `mintNFT`-Funktion hinzu, um den Vertrag auf die globale Variable `window.contract` zu setzen: +Jetzt ist es an der Zeit, unseren Smart Contract mit der Alchemy-Web3-API zu laden, die wir oben in unserer Datei initialisiert haben. Füge die folgende Codezeile unten in der Funktion `mintNFT` hinzu, um den Contract in der globalen Variablen `window.contract` festzulegen: ```javascript window.contract = await new web3.eth.Contract(contractABI, contractAddress) ``` -Das Letzte, was wir in unserer `mintNFT`-Funktion hinzufügen müssen, ist unsere Ethereum-Transaktion: +Das Letzte, was wir in unserer Funktion `mintNFT` hinzufügen müssen, ist unsere Ethereum-Transaktion: ```javascript -//Deine Ethereum-Transaktion einrichten +// Ethereum-Transaktion einrichten const transactionParameters = { to: contractAddress, // Erforderlich, außer bei Vertragsveröffentlichungen. from: window.ethereum.selectedAddress, // muss mit der aktiven Adresse des Benutzers übereinstimmen. data: window.contract.methods .mintNFT(window.ethereum.selectedAddress, tokenURI) - .encodeABI(), //Aufruf des NFT-Smart-Contracts durchführen + .encodeABI(), // NFT-Smart-Contract aufrufen } -//die Transaktion über MetaMask signieren +// die Transaktion über MetaMask signieren try { const txHash = await window.ethereum.request({ method: "eth_sendTransaction", @@ -743,68 +744,68 @@ try { return { success: true, status: - "✅ Sieh dir deine Transaktion auf Etherscan an: https://ropsten.etherscan.io/tx/" + + "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + txHash, } } catch (error) { return { success: false, - status: "😥 Etwas ist schiefgelaufen: " + error.message, + status: "😥 Something went wrong: " + error.message, } } ``` -Wenn du bereits mit Ethereum-Transaktionen vertraut bist, wirst du feststellen, dass die Struktur ziemlich ähnlich zu dem ist, was du bereits gesehen hast. +Wenn du bereits mit Ethereum-Transaktionen vertraut bist, wirst du feststellen, dass die Struktur dem, was du gesehen hast, ziemlich ähnlich ist. - Zuerst richten wir unsere Transaktionsparameter ein. - - `to` gibt die Empfängeradresse an (unser Smart Contract) + - `to` gibt die Empfängeradresse an (unseren Smart Contract) - `from` gibt den Unterzeichner der Transaktion an (die mit MetaMask verbundene Adresse des Benutzers: `window.ethereum.selectedAddress`) - - `data` enthält den Aufruf unserer Smart-Contract-`mintNFT`-Methode, die unsere `tokenURI` und die Wallet-Adresse des Benutzers, `window.ethereum.selectedAddress`, als Eingaben erhält -- Dann machen wir einen Await-Aufruf, `window.ethereum.request,`, bei dem wir MetaMask bitten, die Transaktion zu signieren. Beachte, dass wir in dieser Anfrage unsere eth-Methode (eth_SentTransaction) angeben und unsere `transactionParameters` übergeben. 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 Boole’sche Wert `success` auf „true“ gesetzt ist und die `status`-Zeichenfolge 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 `success`-Boole’sche Wert auf „false“ gesetzt ist und die `status`-Zeichenfolge die Fehlermeldung weitergibt. + - `data` enthält den Aufruf der Methode `mintNFT` unseres Smart Contracts, die unsere `tokenURI` und die Wallet-Adresse des Benutzers, `window.ethereum.selectedAddress`, als Eingaben erhält +- Dann machen wir einen await-Aufruf, `window.ethereum.request`, bei dem wir MetaMask bitten, die Transaktion zu signieren. Beachte, dass wir in dieser Anfrage unsere eth-Methode (eth_sendTransaction) angeben und unsere `transactionParameters` übergeben. 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 boolesche Wert `success` auf true gesetzt ist und die Zeichenfolge `status` den Benutzer auffordert, Etherscan für weitere Informationen zu seiner Transaktion zu überprüfen. + - Wenn die Transaktion fehlschlägt, gibt die Funktion ein JSON-Objekt zurück, bei dem der boolesche Wert `success` auf false gesetzt ist und die Zeichenfolge `status` die Fehlermeldung weiterleitet. -Insgesamt sollte unsere `mintNFT`-Funktion so aussehen: +Insgesamt sollte unsere Funktion `mintNFT` so aussehen: ```javascript export const mintNFT = async (url, name, description) => { - //Fehlerbehandlung + // Fehlerbehandlung if (url.trim() == "" || name.trim() == "" || description.trim() == "") { return { success: false, - status: "❗Bitte stelle sicher, dass alle Felder vor dem Minten ausgefüllt sind.", + status: "❗Please make sure all fields are completed before minting.", } } - //Metadaten erstellen + // Metadaten erstellen const metadata = new Object() metadata.name = name metadata.image = url metadata.description = description - //Pinata-Pin-Anfrage + // Pinata-Pin-Anfrage const pinataResponse = await pinJSONToIPFS(metadata) if (!pinataResponse.success) { return { success: false, - status: "😢 Etwas ist beim Hochladen deiner tokenURI schiefgelaufen.", + status: "😢 Something went wrong while uploading your tokenURI.", } } const tokenURI = pinataResponse.pinataUrl - //Smart Contract laden - window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract(); + // Smart Contract laden + window.contract = await new web3.eth.Contract(contractABI, contractAddress) // loadContract(); - //Deine Ethereum-Transaktion einrichten + // Ethereum-Transaktion einrichten const transactionParameters = { to: contractAddress, // Erforderlich, außer bei Vertragsveröffentlichungen. from: window.ethereum.selectedAddress, // muss mit der aktiven Adresse des Benutzers übereinstimmen. data: window.contract.methods .mintNFT(window.ethereum.selectedAddress, tokenURI) - .encodeABI(), //Aufruf des NFT-Smart-Contracts durchführen + .encodeABI(), // NFT-Smart-Contract aufrufen } - //Transaktion über MetaMask signieren + // Transaktion über MetaMask signieren try { const txHash = await window.ethereum.request({ method: "eth_sendTransaction", @@ -813,23 +814,23 @@ export const mintNFT = async (url, name, description) => { return { success: true, status: - "✅ Sieh dir deine Transaktion auf Etherscan an: https://ropsten.etherscan.io/tx/" + + "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + txHash, } } catch (error) { return { success: false, - status: "😥 Etwas ist schiefgelaufen: " + error.message, + status: "😥 Something went wrong: " + error.message, } } } ``` -Das ist eine riesige Funktion! Jetzt müssen wir nur noch unsere `mintNFT`-Funktion mit unserer `Minter.js`-Komponente verbinden ... +Das ist eine riesige Funktion! Jetzt müssen wir nur noch unsere Funktion `mintNFT` mit unserer Komponente `Minter.js` verbinden ... -## Verbinde mintNFT mit unserem Minter.js-Frontend {#connect-our-frontend} +## mintNFT mit unserem Minter.js-Frontend verbinden {#connect-our-frontend} -Öffne deine `Minter.js`-Datei und aktualisiere die Zeile `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` am Anfang zu: +Öffne deine Datei `Minter.js` und aktualisiere die Zeile `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` oben wie folgt: ```javascript import { @@ -839,7 +840,7 @@ import { } from "./utils/interact.js" ``` -Implementiere schließlich die `onMintPressed`-Funktion, um einen Await-Aufruf an deine importierte `mintNFT`-Funktion zu machen und die `status`-Zustandsvariable zu aktualisieren, um widerzuspiegeln, ob unsere Transaktion erfolgreich war oder fehlgeschlagen ist: +Implementiere schließlich die Funktion `onMintPressed`, um einen await-Aufruf an deine importierte Funktion `mintNFT` durchzuführen und die Zustandsvariable `status` zu aktualisieren, um widerzuspiegeln, ob unsere Transaktion erfolgreich war oder fehlgeschlagen ist: ```javascript const onMintPressed = async () => { @@ -848,22 +849,22 @@ const onMintPressed = async () => { } ``` -## Stelle deinen NFT auf einer Live-Website bereit {#deploy-your-NFT} +## Dein NFT auf einer Live-Website bereitstellen {#deploy-your-NFT} -Bereit, dein Projekt live zu schalten, damit Benutzer damit interagieren können? Sieh dir [dieses Tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) an, um deinen Minter auf einer Live-Website bereitzustellen. +Bist du bereit, dein Projekt live zu schalten, damit Benutzer damit interagieren können? Sieh dir [dieses Tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) an, um deinen Minter auf einer Live-Website bereitzustellen. Ein letzter Schritt ... -## Erobere die Blockchain-Welt im Sturm {#take-the-blockchain-world-by-storm} +## Die Blockchain-Welt im Sturm erobern {#take-the-blockchain-world-by-storm} Nur ein Scherz, du hast es bis zum Ende des Tutorials geschafft! -Zusammenfassend lässt sich sagen, dass du durch den Bau eines NFT-Minters erfolgreich gelernt hast, wie man: +Zusammenfassend hast du durch den Bau eines NFT-Minters erfolgreich gelernt, wie man: -- Verbinden von MetaMask mit Ihrem Frontend-Projekt -- Rufen von Smart-Contract Methoden von Ihrem Frontend -- Transaktionen mit MetaMask signieren +- Eine Verbindung zu MetaMask über dein Frontend-Projekt herstellt +- Smart-Contract-Methoden von deinem Frontend aus aufruft +- Transaktionen mit MetaMask signiert -Vermutlich möchtest du die über deine Dapp geminteten NFTs in deiner Wallet präsentieren können – sieh dir also unbedingt unser kurzes Tutorial [So zeigst du dein NFT in deiner Wallet an](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet) an! +Vermutlich möchtest du die über deine Dapp geprägten NFTs in deiner Wallet präsentieren können – sieh dir also unbedingt unser kurzes Tutorial [Wie du dein NFT in deiner Wallet anzeigst](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet) an! -Und wie immer, wenn du Fragen hast, sind wir hier, um im [Alchemy Discord](https://discord.gg/gWuC7zB) zu helfen. Wir können es kaum erwarten zu sehen, wie du die Konzepte aus diesem Tutorial auf deine zukünftigen Projekte anwendest! +Und wie immer, wenn du Fragen hast, sind wir hier, um im [Alchemy Discord](https://discord.gg/gWuC7zB) zu helfen. Wir können es kaum erwarten zu sehen, wie du die Konzepte aus diesem Tutorial auf deine zukünftigen Projekte anwendest! \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md index ee4325935a4..918721cb2ac 100644 --- a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1,104 +1,109 @@ --- -title: "Walkthrough zum Vertrag der Optimism-Standard-Brücke" -description: "Wie funktioniert die Standard-Brücke für Optimism? Warum funktioniert sie auf diese Weise?" +title: "Walkthrough des Optimism-Standardvertrags für kettenübergreifende Brücken" +description: "Wie funktioniert die kettenübergreifende Standardbrücke für Optimism? Warum funktioniert sie auf diese Weise?" author: Ori Pomerantz -tags: ["solidity", "bridge", "layer 2"] +tags: ["Solidity", "kettenübergreifende Brücke", "Ebene 2"] skill: intermediate -breadcrumb: "Optimism-Bridge" +breadcrumb: "Optimism kettenübergreifende Brücke" published: 2022-03-30 lang: de --- [Optimism](https://www.optimism.io/) ist ein [Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/). -Optimistic Rollups können Transaktionen zu einem viel niedrigeren Preis als das Ethereum Mainnet (auch bekannt als Layer 1 oder L1) verarbeiten, da Transaktionen nur von einigen wenigen Knoten anstatt von jedem Knoten im Netzwerk verarbeitet werden. -Gleichzeitig werden alle Daten auf L1 geschrieben, sodass alles mit der Integrität und Verfügbarkeit des Mainnets nachgewiesen und rekonstruiert werden kann. +Optimistic Rollups können Transaktionen zu einem viel niedrigeren Preis als das Ethereum-Mainnet (auch bekannt als Ebene 1 oder L1) verarbeiten, da Transaktionen nur von wenigen Blockchain-Knoten anstatt von jedem Blockchain-Knoten im Netzwerk verarbeitet werden. +Gleichzeitig werden alle Daten auf L1 geschrieben, sodass alles mit allen Integritäts- und Verfügbarkeitsgarantien des Mainnets bewiesen und rekonstruiert werden kann. -Um L1-Assets auf Optimism (oder einem anderen L2) zu verwenden, müssen die Assets [überbrückt](/bridges/#prerequisites) werden. -Eine Möglichkeit, dies zu erreichen, besteht darin, dass Benutzer Assets (ETH und [ERC-20-Tokens](/developers/docs/standards/tokens/erc-20/) sind die häufigsten) auf L1 sperren und gleichwertige Assets zur Verwendung auf L2 erhalten. -Schließlich möchte derjenige, der sie am Ende besitzt, sie vielleicht wieder auf L1 zurückbrücken. -Dabei werden die Assets auf L2 verbrannt und dann auf L1 wieder an den Benutzer freigegeben. +Um L1-Vermögenswerte auf Optimism (oder einer anderen Ebene 2) zu verwenden, müssen die Vermögenswerte über eine [kettenübergreifende Brücke](/bridges/#prerequisites) übertragen werden. +Eine Möglichkeit, dies zu erreichen, besteht darin, dass Benutzer Vermögenswerte (ETH und [ERC-20-Token](/developers/docs/standards/tokens/erc-20/) sind die häufigsten) auf L1 sperren und gleichwertige Vermögenswerte zur Verwendung auf L2 erhalten. +Letztendlich möchte derjenige, der sie am Ende besitzt, sie vielleicht wieder über eine kettenübergreifende Brücke zurück zu L1 übertragen. +Dabei werden die Vermögenswerte auf L2 verbrannt und dann auf L1 wieder an den Benutzer freigegeben. -So funktioniert die [Optimism Standard-Brücke](https://docs.optimism.io/app-developers/bridging/standard-bridge). -In diesem Artikel gehen wir den Quellcode für diese Brücke durch, um zu sehen, wie sie funktioniert, und um sie als Beispiel für gut geschriebenen Solidity-Code zu studieren. +Auf diese Weise funktioniert die [kettenübergreifende Optimism-Standardbrücke](https://docs.optimism.io/app-developers/bridging/standard-bridge). +In diesem Artikel gehen wir den Quellcode für diese kettenübergreifende Brücke durch, um zu sehen, wie sie funktioniert, und studieren ihn als Beispiel für gut geschriebenen Solidity-Code. ## Kontrollflüsse {#control-flows} -Die Brücke hat zwei Hauptabläufe: +Die kettenübergreifende Brücke hat zwei Hauptflüsse: -- Einzahlung (von L1 nach L2) -- Auszahlung (von L2 nach L1) +- Einzahlung (von L1 zu L2) +- Auszahlung (von L2 zu L1) -### Einzahlungsablauf {#deposit-flow} +### Einzahlungsfluss {#deposit-flow} -#### Layer 1 {#deposit-flow-layer-1} +#### Ebene 1 {#deposit-flow-layer-1} -1. Bei der Einzahlung eines ERC-20 erteilt der Einzahler der Brücke eine Freigabe, den eingezahlten Betrag auszugeben. -2. Der Einzahler ruft die L1-Brücke auf (`depositERC20`, `depositERC20To`, `depositETH` oder `depositETHTo`) -3. Die L1-Brücke nimmt das überbrückte Asset in Besitz. - - ETH: Das Asset wird vom Einzahler als Teil des Aufrufs übertragen. - - ERC-20: Das Asset wird von der Brücke unter Verwendung der vom Einzahler erteilten Freigabe an sich selbst übertragen. -4. Die L1-Brücke verwendet den domänenübergreifenden Nachrichtenmechanismus, um `finalizeDeposit` auf der L2-Brücke aufzurufen. +1. Bei der Einzahlung eines ERC-20-Tokens erteilt der Einzahler der kettenübergreifenden Brücke die Erlaubnis (Allowance), den einzuzahlenden Betrag auszugeben. +2. Der Einzahler ruft die kettenübergreifende L1-Brücke auf (`depositERC20`, `depositERC20To`, `depositETH` oder `depositETHTo`). +3. Die kettenübergreifende L1-Brücke übernimmt den Besitz des überbrückten Vermögenswerts. + - ETH: Der Vermögenswert wird vom Einzahler als Teil des Aufrufs übertragen. + - ERC-20: Der Vermögenswert wird von der kettenübergreifenden Brücke unter Verwendung der vom Einzahler bereitgestellten Erlaubnis an sich selbst übertragen. +4. Die kettenübergreifende L1-Brücke verwendet den Cross-Domain-Nachrichtenmechanismus, um `finalizeDeposit` auf der kettenübergreifenden L2-Brücke aufzurufen. -#### Layer 2 {#deposit-flow-layer-2} +#### Ebene 2 {#deposit-flow-layer-2} -5. Die L2-Brücke überprüft, ob der Aufruf von `finalizeDeposit` rechtmäßig ist: - - Kam vom domänenübergreifenden Nachrichtenvertrag - - War ursprünglich von der Brücke auf L1 -6. Die L2-Brücke prüft, ob der ERC-20-Token-Vertrag auf L2 der richtige ist: - - Der L2-Vertrag meldet, dass sein L1-Gegenstück dasselbe ist wie das, von dem die Tokens auf L1 kamen +5. Die kettenübergreifende L2-Brücke überprüft, ob der Aufruf von `finalizeDeposit` legitim ist: + - Kam vom Cross-Domain-Nachrichtenvertrag. + - Stammte ursprünglich von der kettenübergreifenden Brücke auf L1. +6. Die kettenübergreifende L2-Brücke prüft, ob der ERC-20-Token-Vertrag auf L2 der richtige ist: + - Der L2-Vertrag meldet, dass sein L1-Gegenstück dasselbe ist wie das, von dem die Token auf L1 stammten. - Der L2-Vertrag meldet, dass er die richtige Schnittstelle unterstützt ([unter Verwendung von ERC-165](https://eips.ethereum.org/EIPS/eip-165)). -7. Wenn der L2-Vertrag der richtige ist, rufen Sie ihn auf, um die entsprechende Anzahl von Tokens an die entsprechende Adresse zu prägen. Wenn nicht, starten Sie einen Auszahlungsprozess, damit der Benutzer die Tokens auf L1 beanspruchen kann. +7. Wenn der L2-Vertrag der richtige ist, wird er aufgerufen, um die entsprechende Anzahl von Token an die entsprechende Adresse zu prägen. Wenn nicht, wird ein Auszahlungsprozess gestartet, damit der Benutzer die Token auf L1 beanspruchen kann. -### Auszahlungsablauf {#withdrawal-flow} +### Auszahlungsfluss {#withdrawal-flow} -#### Layer 2 {#withdrawal-flow-layer-2} +#### Ebene 2 {#withdrawal-flow-layer-2} -1. Der Auszahlende ruft die L2-Brücke auf (`withdraw` oder `withdrawTo`) -2. Die L2-Brücke verbrennt die entsprechende Anzahl von Tokens, die `msg.sender` gehören. -3. Die L2-Brücke verwendet den domänenübergreifenden Nachrichtenmechanismus, um `finalizeETHWithdrawal` oder `finalizeERC20Withdrawal` auf der L1-Brücke aufzurufen. +1. Der Auszahlende ruft die kettenübergreifende L2-Brücke auf (`withdraw` oder `withdrawTo`). +2. Die kettenübergreifende L2-Brücke verbrennt die entsprechende Anzahl von Token, die `msg.sender` gehören. +3. Die kettenübergreifende L2-Brücke verwendet den Cross-Domain-Nachrichtenmechanismus, um `finalizeETHWithdrawal` oder `finalizeERC20Withdrawal` auf der kettenübergreifenden L1-Brücke aufzurufen. -#### Layer 1 {#withdrawal-flow-layer-1} +#### Ebene 1 {#withdrawal-flow-layer-1} -4. Die L1-Brücke überprüft, ob der Aufruf von `finalizeETHWithdrawal` oder `finalizeERC20Withdrawal` rechtmäßig ist: - - Kam vom domänenübergreifenden Nachrichtenmechanismus - - War ursprünglich von der Brücke auf L2 -5. Die L1-Brücke überträgt das entsprechende Asset (ETH oder ERC-20) an die entsprechende Adresse. +4. Die kettenübergreifende L1-Brücke überprüft, ob der Aufruf von `finalizeETHWithdrawal` oder `finalizeERC20Withdrawal` legitim ist: + - Kam vom Cross-Domain-Nachrichtenmechanismus. + - Stammte ursprünglich von der kettenübergreifenden Brücke auf L2. +5. Die kettenübergreifende L1-Brücke überträgt den entsprechenden Vermögenswert (ETH oder ERC-20) an die entsprechende Adresse. -## Layer-1-Code {#layer-1-code} +## Ebene-1-Code {#layer-1-code} -Dies ist der Code, der auf L1, dem Ethereum Mainnet, läuft. +Dies ist der Code, der auf L1, dem Ethereum-Mainnet, ausgeführt wird. ### IL1ERC20Bridge {#IL1ERC20Bridge} [Diese Schnittstelle ist hier definiert](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol). -Sie enthält Funktionen und Definitionen, die für die Überbrückung von ERC-20-Tokens erforderlich sind. +Sie enthält Funktionen und Definitionen, die für die Überbrückung von ERC-20-Token erforderlich sind. ```solidity // SPDX-License-Identifier: MIT ``` -[Der größte Teil des Codes von Optimism wird unter der MIT-Lizenz veröffentlicht](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). +[Der Großteil des Codes von Optimism ist unter der MIT-Lizenz veröffentlicht](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). ```solidity pragma solidity >0.5.0 <0.9.0; ``` Zum Zeitpunkt des Schreibens ist die neueste Version von Solidity 0.8.12. -Bis zur Veröffentlichung von Version 0.9.0 wissen wir nicht, ob dieser Code damit kompatibel ist oder nicht. +Bis zur Veröffentlichung der Version 0.9.0 wissen wir nicht, ob dieser Code damit kompatibel ist oder nicht. ```solidity -/** - * @title IL1ERC20Bridge - */ +/* * + * @title IL1ERC20Bridge */ + + + interface IL1ERC20Bridge { - /********** + /* ********* * Ereignisse * - **********/ + ********* */ + + + event ERC20DepositInitiated( ``` -In der Terminologie der Optimism-Brücke bedeutet _Einzahlung_ eine Übertragung von L1 nach L2 und _Auszahlung_ eine Übertragung von L2 nach L1. +In der Terminologie der kettenübergreifenden Brücke von Optimism bedeutet _Einzahlung_ (deposit) eine Übertragung von L1 zu L2 und _Auszahlung_ (withdrawal) eine Übertragung von L2 zu L1. ```solidity address indexed _l1Token, @@ -107,8 +112,8 @@ In der Terminologie der Optimism-Brücke bedeutet _Einzahlung_ eine Übertragung In den meisten Fällen ist die Adresse eines ERC-20 auf L1 nicht dieselbe wie die Adresse des entsprechenden ERC-20 auf L2. [Sie können die Liste der Token-Adressen hier einsehen](https://static.optimism.io/optimism.tokenlist.json). -Die Adresse mit `chainId` 1 befindet sich auf L1 (Mainnet) und die Adresse mit `chainId` 10 auf L2 (Optimism). -Die anderen beiden `chainId`-Werte sind für das Kovan-Testnetz (42) und das Optimistic Kovan-Testnetz (69). +Die Adresse mit der `chainId` 1 befindet sich auf L1 (Mainnet) und die Adresse mit der `chainId` 10 befindet sich auf L2 (Optimism). +Die anderen beiden `chainId`-Werte sind für das Kovan-Testnet (42) und das Optimistic Kovan-Testnet (69). ```solidity address indexed _from, @@ -118,7 +123,7 @@ Die anderen beiden `chainId`-Werte sind für das Kovan-Testnetz (42) und das Opt ); ``` -Es ist möglich, Notizen zu Übertragungen hinzuzufügen, in diesem Fall werden sie zu den Ereignissen hinzugefügt, die sie melden. +Es ist möglich, Übertragungen Notizen hinzuzufügen. In diesem Fall werden sie den Ereignissen hinzugefügt, die sie melden. ```solidity event ERC20WithdrawalFinalized( @@ -131,36 +136,51 @@ Es ist möglich, Notizen zu Übertragungen hinzuzufügen, in diesem Fall werden ); ``` -Derselbe Brückenvertrag behandelt Übertragungen in beide Richtungen. -Im Fall der L1-Brücke bedeutet dies die Initiierung von Einzahlungen und die Finalisierung von Auszahlungen. +Derselbe Vertrag für die kettenübergreifende Brücke verarbeitet Übertragungen in beide Richtungen. +Im Falle der kettenübergreifenden L1-Brücke bedeutet dies die Initialisierung von Einzahlungen und die Finalisierung von Auszahlungen. ```solidity - /******************** + /* ******************* * Öffentliche Funktionen * - ********************/ + ******************* */ + + + + + /* * + * @dev Ruft die Adresse des entsprechenden L2-Vertrags für die kettenübergreifende Brücke ab. + * @return Adresse des entsprechenden L2-Vertrags für die kettenübergreifende Brücke. */ + + + - /** - * @dev Ruft die Adresse des entsprechenden L2-Brückenvertrags ab. - * @return Adresse des entsprechenden L2-Brückenvertrags. - */ function l2TokenBridge() external returns (address); ``` -Diese Funktion wird nicht wirklich benötigt, da es sich auf L2 um einen vorab bereitgestellten Vertrag (predeployed contract) handelt, der sich also immer an der Adresse `0x4200000000000000000000000000000000000010` befindet. -Sie ist hier aus Symmetriegründen zur L2-Brücke, da die Adresse der L1-Brücke _nicht_ trivial zu kennen ist. +Diese Funktion wird nicht wirklich benötigt, da es sich auf L2 um einen vorab bereitgestellten Vertrag handelt, sodass er sich immer an der Adresse `0x4200000000000000000000000000000000000010` befindet. +Sie ist hier aus Symmetriegründen mit der kettenübergreifenden L2-Brücke vorhanden, da die Adresse der kettenübergreifenden L1-Brücke _nicht_ trivial zu ermitteln ist. ```solidity - /** + /* * * @dev Zahlt einen Betrag des ERC20 auf das Guthaben des Aufrufers auf L2 ein. - * @param _l1Token Adresse des L1 ERC20, das wir einzahlen. - * @param _l2Token Adresse des entsprechenden L2 ERC20. - * @param _amount Einzuzahlender Betrag des ERC20. - * @param _l2Gas Erforderliches Gaslimit, um die Einzahlung auf L2 abzuschließen. + * @param _l1Token Adresse des L1-ERC20, den wir einzahlen + * @param _l2Token Adresse des entsprechenden L2-ERC20 zum L1 + * @param _amount Betrag des einzuzahlenden ERC20 + * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden - * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen - * Länge geben diese Verträge keine Garantien über ihren Inhalt. - */ + * ausschließlich als Annehmlichkeit für externe Verträge bereitgestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über deren Inhalt. */ + + + + + + + + + + function depositERC20( address _l1Token, address _l2Token, @@ -170,22 +190,32 @@ Sie ist hier aus Symmetriegründen zur L2-Brücke, da die Adresse der L1-Brücke ) external; ``` -Der Parameter `_l2Gas` ist die Menge an L2-Gas, die die Transaktion verbrauchen darf. -[Bis zu einem bestimmten (hohen) Limit ist dies kostenlos](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), daher sollte es kein Problem sein, es sei denn, der ERC-20-Vertrag macht beim Prägen etwas wirklich Seltsames. -Diese Funktion kümmert sich um das übliche Szenario, bei dem ein Benutzer Assets an dieselbe Adresse auf einer anderen Blockchain überbrückt. +Der Parameter `_l2Gas` ist die Menge an L2-Gas, die die Transaktion ausgeben darf. +[Bis zu einem bestimmten (hohen) Limit ist dies kostenlos](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2). Solange der ERC-20-Vertrag beim Prägen also nichts wirklich Seltsames tut, sollte dies kein Problem sein. +Diese Funktion kümmert sich um das häufige Szenario, bei dem ein Benutzer Vermögenswerte über eine kettenübergreifende Brücke an dieselbe Adresse auf einer anderen Blockchain überträgt. ```solidity - /** - * @dev zahlt einen Betrag von ERC20 auf das Guthaben eines Empfängers auf L2 ein. - * @param _l1Token Adresse des L1 ERC20, den wir einzahlen - * @param _l2Token Adresse des entsprechenden L2 ERC20 auf L1 - * @param _to L2-Adresse, auf die die Abhebung gutgeschrieben werden soll. - * @param _amount Einzuzahlender Betrag des ERC20. + /* * + * @dev Zahlt einen Betrag von ERC20 auf das Guthaben eines Empfängers auf L2 ein. + * @param _l1Token Adresse des L1-ERC20, den wir einzahlen + * @param _l2Token Adresse des entsprechenden L2-ERC20 zum L1 + * @param _to L2-Adresse, der die Abhebung gutgeschrieben werden soll. + * @param _amount Betrag des einzuzahlenden ERC20. * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden - * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen - * Länge geben diese Verträge keine Garantien über ihren Inhalt. - */ + * ausschließlich als Annehmlichkeit für externe Verträge bereitgestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über deren Inhalt. */ + + + + + + + + + + + function depositERC20To( address _l1Token, address _l2Token, @@ -196,27 +226,42 @@ Diese Funktion kümmert sich um das übliche Szenario, bei dem ein Benutzer Asse ) external; ``` -Diese Funktion ist fast identisch mit `depositERC20`, aber sie ermöglicht es Ihnen, den ERC-20 an eine andere Adresse zu senden. +Diese Funktion ist fast identisch mit `depositERC20`, ermöglicht es Ihnen jedoch, den ERC-20 an eine andere Adresse zu senden. ```solidity - /************************* - * Cross-Chain-Funktionen * - *************************/ + /* ************************ + * Kettenübergreifende Funktionen * + ************************ */ + + - /** - * @dev Schließt eine Auszahlung von L2 nach L1 ab und schreibt den Betrag dem Guthaben des - * L1-ERC20-Tokens des Empfängers gut. - * Dieser Aufruf schlägt fehl, wenn die initiierte Auszahlung von L2 noch nicht finalisiert wurde. + + /* * + * @dev Schließt eine Abhebung von L2 nach L1 ab und schreibt das Guthaben dem L1-ERC20-Token-Guthaben des Empfängers gut. + * Dieser Aufruf schlägt fehl, wenn die initiierte Abhebung von L2 nicht abgeschlossen wurde. * - * @param _l1Token Adresse des L1-Tokens, für das finalizeWithdrawal ausgeführt wird. - * @param _l2Token Adresse des L2-Tokens, auf dem die Auszahlung eingeleitet wurde. - * @param _from L2-Adresse, die die Übertragung initiiert. - * @param _to L1-Adresse, der die Auszahlung gutgeschrieben werden soll. - * @param _amount Einzuzahlender Betrag des ERC20. - * @param _data Vom Absender auf L2 bereitgestellte Daten. Diese Daten werden - * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen - * Länge geben diese Verträge keine Garantien über ihren Inhalt. - */ + * @param _l1Token Adresse des L1-Tokens, für den finalizeWithdrawal ausgeführt wird. + * @param _l2Token Adresse des L2-Tokens, bei dem die Abhebung initiiert wurde. + * @param _from L2-Adresse, die den Transfer initiiert. + * @param _to L1-Adresse, der die Abhebung gutgeschrieben werden soll. + * @param _amount Betrag des einzuzahlenden ERC20. + * @param _data Daten, die vom Sender auf L2 bereitgestellt werden. Diese Daten werden + * ausschließlich als Annehmlichkeit für externe Verträge bereitgestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über deren Inhalt. */ + + + + + + + + + + + + + + function finalizeERC20Withdrawal( address _l1Token, address _l2Token, @@ -228,20 +273,20 @@ Diese Funktion ist fast identisch mit `depositERC20`, aber sie ermöglicht es Ih } ``` -Auszahlungen (und andere Nachrichten von L2 nach L1) in Optimism sind ein zweistufiger Prozess: +Auszahlungen (und andere Nachrichten von L2 zu L1) in Optimism sind ein zweistufiger Prozess: 1. Eine initiierende Transaktion auf L2. -2. Eine finalisierende oder beanspruchende Transaktion auf L1. - Diese Transaktion muss nach dem Ende des [Fehler-Anfechtungszeitraums](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) für die L2-Transaktion erfolgen. +2. Eine abschließende oder beanspruchende Transaktion auf L1. + Diese Transaktion muss stattfinden, nachdem die [Fehleranfechtungsfrist (Fault Challenge Period)](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) für die L2-Transaktion abgelaufen ist. ### IL1StandardBridge {#il1standardbridge} [Diese Schnittstelle ist hier definiert](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol). Diese Datei enthält Ereignis- und Funktionsdefinitionen für ETH. -Diese Definitionen sind sehr ähnlich zu denen, die oben in `IL1ERC20Bridge` für ERC-20 definiert wurden. +Diese Definitionen sind denen sehr ähnlich, die oben in `IL1ERC20Bridge` für ERC-20 definiert wurden. -Die Brückenschnittstelle ist auf zwei Dateien aufgeteilt, da einige ERC-20-Tokens eine benutzerdefinierte Verarbeitung erfordern und nicht von der Standardbrücke verarbeitet werden können. -Auf diese Weise kann die benutzerdefinierte Brücke, die einen solchen Token verarbeitet, `IL1ERC20Bridge` implementieren und muss nicht auch ETH überbrücken. +Die Schnittstelle der kettenübergreifenden Brücke ist auf zwei Dateien aufgeteilt, da einige ERC-20-Token eine benutzerdefinierte Verarbeitung erfordern und nicht von der kettenübergreifenden Standardbrücke verarbeitet werden können. +Auf diese Weise kann die benutzerdefinierte kettenübergreifende Brücke, die einen solchen Token verarbeitet, `IL1ERC20Bridge` implementieren und muss nicht auch ETH überbrücken. ```solidity // SPDX-License-Identifier: MIT @@ -249,13 +294,18 @@ pragma solidity >0.5.0 <0.9.0; import "./IL1ERC20Bridge.sol"; -/** - * @title IL1StandardBridge - */ +/* * + * @title IL1StandardBridge */ + + + interface IL1StandardBridge is IL1ERC20Bridge { - /********** + /* ********* * Ereignisse * - **********/ + ********* */ + + + event ETHDepositInitiated( address indexed _from, address indexed _to, @@ -264,8 +314,8 @@ interface IL1StandardBridge is IL1ERC20Bridge { ); ``` -Dieses Ereignis ist fast identisch mit der ERC-20-Version (`ERC20DepositInitiated`), jedoch ohne die L1- und L2-Token-Adressen. -Dasselbe gilt für die anderen Ereignisse und die Funktionen. +Dieses Ereignis ist fast identisch mit der ERC-20-Version (`ERC20DepositInitiated`), außer dass die L1- und L2-Token-Adressen fehlen. +Dasselbe gilt für die anderen Ereignisse und Funktionen. ```solidity event ETHWithdrawalFinalized( @@ -274,42 +324,64 @@ Dasselbe gilt für die anderen Ereignisse und die Funktionen. . ); - /******************** + /* ******************* * Öffentliche Funktionen * - ********************/ + ******************* */ + - /** - * @dev Einzahlung eines ETH-Betrags in das Guthaben des Aufrufers auf L2. - . + + + /* * + * @dev Zahlt einen Betrag an ETH auf das Guthaben des Aufrufers auf L2 ein. . . - */ + . */ + + + + + + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable; - /** - * @dev Einzahlung eines ETH-Betrags in das Guthaben eines Empfängers auf L2. + /* * + * @dev Zahlt einen Betrag an ETH auf das Guthaben eines Empfängers auf L2 ein. . . - . - */ + . */ + + + + + + function depositETHTo( address _to, uint32 _l2Gas, bytes calldata _data ) external payable; - /************************* - * Cross-Chain-Funktionen * - *************************/ + /* ************************ + * Kettenübergreifende Funktionen * + ************************ */ + - /** - * @dev Schließen Sie eine Auszahlung von L2 nach L1 ab und schreiben Sie den Betrag dem Guthaben des L1-ETH-Tokens des Empfängers gut. - * Da nur der xDomainMessenger diese Funktion aufrufen kann, wird sie niemals aufgerufen - * bevor die Auszahlung finalisiert ist. - . + + + /* * + * @dev Schließt eine Abhebung von L2 nach L1 ab und schreibt das Guthaben dem L1-ETH-Token-Guthaben des Empfängers gut. Da nur der xDomainMessenger diese Funktion aufrufen kann, wird sie niemals aufgerufen, + * bevor die Abhebung abgeschlossen ist. . . - */ + . */ + + + + + + + + function finalizeETHWithdrawal( address _from, address _to, @@ -321,65 +393,86 @@ Dasselbe gilt für die anderen Ereignisse und die Funktionen. ### CrossDomainEnabled {#crossdomainenabled} -[Dieser Vertrag](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) wird von beiden Brücken ([L1](#the-l1-bridge-contract) und [L2](#the-l2-bridge-contract)) geerbt, um Nachrichten an den anderen Layer zu senden. +[Dieser Vertrag](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) wird von beiden kettenübergreifenden Brücken ([L1](#the-l1-bridge-contract) und [L2](#the-l2-bridge-contract)) geerbt, um Nachrichten an die andere Ebene zu senden. ```solidity // SPDX-License-Identifier: MIT pragma solidity >0.5.0 <0.9.0; /* Schnittstellen-Importe */ +/* Interface Imports */ import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; ``` -[Diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) teilt dem Vertrag mit, wie Nachrichten an den anderen Layer gesendet werden sollen, indem der Cross-Domain-Messenger verwendet wird. -Dieser Cross-Domain-Messenger ist ein ganz anderes System und verdient einen eigenen Artikel, den ich hoffentlich in Zukunft schreiben werde. +[Diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) teilt dem Vertrag mit, wie Nachrichten unter Verwendung des Cross-Domain-Messengers an die andere Ebene gesendet werden. +Dieser Cross-Domain-Messenger ist ein völlig anderes System und verdient einen eigenen Artikel, den ich hoffentlich in Zukunft schreiben werde. ```solidity -/** +/* * * @title CrossDomainEnabled * @dev Hilfsvertrag für Verträge, die domänenübergreifende Kommunikation durchführen * - * Verwendeter Compiler: definiert durch vererbenden Vertrag - */ + * Verwendeter Compiler: definiert durch den erbenden Vertrag */ + + + + + + contract CrossDomainEnabled { - /************* + /* ************ * Variablen * - *************/ + ************ */ + + + // Messenger-Vertrag, der zum Senden und Empfangen von Nachrichten aus der anderen Domäne verwendet wird. address public messenger; - /*************** + /* ************** * Konstruktor * - ***************/ + ************** */ + + + + + /* * + * @param _messenger Adresse des CrossDomainMessenger auf der aktuellen Ebene. */ + + - /** - * @param _messenger Adresse des CrossDomainMessenger auf der aktuellen Ebene. - */ constructor(address _messenger) { messenger = _messenger; } ``` -Der eine Parameter, den der Vertrag kennen muss, ist die Adresse des Cross-Domain-Messengers auf diesem Layer. -Dieser Parameter wird einmal im Konstruktor gesetzt und ändert sich nie. +Der einzige Parameter, den der Vertrag kennen muss, ist die Adresse des Cross-Domain-Messengers auf dieser Ebene. +Dieser Parameter wird einmal im Konstruktor festgelegt und ändert sich nie. ```solidity - /********************** + /* ********************* * Funktionsmodifikatoren * - **********************/ + ********************* */ + + + - /** + /* * * Erzwingt, dass die modifizierte Funktion nur von einem bestimmten domänenübergreifenden Konto aufgerufen werden kann. * @param _sourceDomainAccount Das einzige Konto in der Ursprungsdomäne, das - * zur Ausführung dieser Funktion berechtigt ist. - */ + * authentifiziert ist, diese Funktion aufzurufen. */ + + + + + modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) { ``` -Das domänenübergreifende Messaging ist für jeden Vertrag auf der Blockchain zugänglich, auf der es läuft (entweder Ethereum Mainnet oder Optimism). -Aber wir brauchen die Brücke auf jeder Seite, um _nur_ bestimmten Nachrichten zu vertrauen, wenn sie von der Brücke auf der anderen Seite kommen. +Das Cross-Domain-Messaging ist für jeden Vertrag auf der Blockchain zugänglich, auf der es ausgeführt wird (entweder Ethereum-Mainnet oder Optimism). +Wir benötigen jedoch, dass die kettenübergreifende Brücke auf jeder Seite _nur_ bestimmten Nachrichten vertraut, wenn sie von der kettenübergreifenden Brücke auf der anderen Seite stammen. ```solidity require( @@ -398,49 +491,62 @@ Nur Nachrichten vom entsprechenden Cross-Domain-Messenger (`messenger`, wie Sie ); ``` -Die Art und Weise, wie der Cross-Domain-Messenger die Adresse bereitstellt, die eine Nachricht mit dem anderen Layer gesendet hat, ist [die Funktion `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). -Solange sie in der Transaktion aufgerufen wird, die durch die Nachricht initiiert wurde, kann sie diese Information bereitstellen. +Die Art und Weise, wie der Cross-Domain-Messenger die Adresse bereitstellt, die eine Nachricht an die andere Ebene gesendet hat, ist [die Funktion `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). +Solange sie in der Transaktion aufgerufen wird, die durch die Nachricht initiiert wurde, kann sie diese Informationen bereitstellen. -Wir müssen sicherstellen, dass die Nachricht, die wir erhalten haben, von der anderen Brücke kam. +Wir müssen sicherstellen, dass die empfangene Nachricht von der anderen kettenübergreifenden Brücke stammt. ```solidity _; } - /********************** + /* ********************* * Interne Funktionen * - **********************/ + ********************* */ + - /** - * Ruft den Messenger ab, normalerweise aus dem Speicher. Diese Funktion wird für den Fall verfügbar gemacht, dass ein untergeordneter Vertrag + + + /* * + * Ruft den Messenger ab, normalerweise aus dem Speicher. Diese Funktion wird offengelegt, falls ein untergeordneter Vertrag * sie überschreiben muss. - * @return Die Adresse des Cross-Domain-Messenger-Vertrags, der verwendet werden sollte. - */ + * @return Die Adresse des domänenübergreifenden Messenger-Vertrags, der verwendet werden soll. */ + + + + + function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) { return ICrossDomainMessenger(messenger); } ``` Diese Funktion gibt den Cross-Domain-Messenger zurück. -Wir verwenden eine Funktion anstelle der Variable `messenger`, um Verträgen, die von diesem erben, zu ermöglichen, einen Algorithmus zu verwenden, um anzugeben, welcher Cross-Domain-Messenger verwendet werden soll. +Wir verwenden eine Funktion anstelle der Variablen `messenger`, um Verträgen, die von diesem erben, die Verwendung eines Algorithmus zu ermöglichen, mit dem angegeben wird, welcher Cross-Domain-Messenger verwendet werden soll. ```solidity - /** + /* * * Sendet eine Nachricht an ein Konto in einer anderen Domäne * @param _crossDomainTarget Der beabsichtigte Empfänger in der Zieldomäne - * @param _message Die an das Ziel zu sendenden Daten (normalerweise Calldata an eine Funktion mit + * @param _message Die an das Ziel zu sendenden Daten (normalerweise Calldata für eine Funktion mit * `onlyFromCrossDomainAccount()`) - * @param _gasLimit Das GasLimit für den Empfang der Nachricht in der Zieldomäne. - */ + * @param _gasLimit Das Gaslimit für den Empfang der Nachricht in der Zieldomäne. */ + + + + + + + function sendCrossDomainMessage( address _crossDomainTarget, uint32 _gasLimit, bytes memory _message ``` -Schließlich die Funktion, die eine Nachricht an den anderen Layer sendet. +Schließlich die Funktion, die eine Nachricht an die andere Ebene sendet. ```solidity ) internal { @@ -451,7 +557,7 @@ Schließlich die Funktion, die eine Nachricht an den anderen Layer sendet. In diesem Fall löst die folgende Zeile zwei Schwachstellen aus: 1. [Reentrancy-Ereignisse](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) -2. [Gutartige Wiedereintrittsfähigkeit](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) +2. [Gutartige Reentrancy](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) ```solidity getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit); @@ -459,11 +565,11 @@ In diesem Fall löst die folgende Zeile zwei Schwachstellen aus: } ``` -In diesem Fall machen wir uns keine Sorgen über Wiedereintrittsfähigkeit, da wir wissen, dass `getCrossDomainMessenger()` eine vertrauenswürdige Adresse zurückgibt, auch wenn Slither keine Möglichkeit hat, das zu wissen. +In diesem Fall machen wir uns keine Sorgen über Reentrancy, da wir wissen, dass `getCrossDomainMessenger()` eine vertrauenswürdige Adresse zurückgibt, auch wenn Slither keine Möglichkeit hat, dies zu wissen. ### Der L1-Brückenvertrag {#the-l1-bridge-contract} -[Der Quellcode für diesen Vertrag befindet sich hier](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol). +[Der Quellcode für diesen Vertrag ist hier zu finden](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol). ```solidity // SPDX-License-Identifier: MIT @@ -471,10 +577,11 @@ pragma solidity ^0.8.9; ``` Die Schnittstellen können Teil anderer Verträge sein, daher müssen sie eine breite Palette von Solidity-Versionen unterstützen. -Aber die Brücke selbst ist unser Vertrag, und wir können streng sein, welche Solidity-Version sie verwendet. +Aber die kettenübergreifende Brücke selbst ist unser Vertrag, und wir können streng sein, welche Solidity-Version sie verwendet. ```solidity /* Schnittstellen-Importe */ +/* Interface Imports */ import { IL1StandardBridge } from "./IL1StandardBridge.sol"; import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; ``` @@ -485,7 +592,7 @@ import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol"; ``` -[Diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ermöglicht es uns, Nachrichten zu erstellen, um die Standardbrücke auf L2 zu steuern. +[Diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ermöglicht es uns, Nachrichten zur Steuerung der kettenübergreifenden Standardbrücke auf L2 zu erstellen. ```solidity import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -496,24 +603,25 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; ```solidity /* Bibliotheks-Importe */ +/* Library Imports */ import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; ``` -[Wie oben erklärt](#crossdomainenabled), wird dieser Vertrag für die Interlayer-Nachrichtenübermittlung verwendet. +[Wie oben erklärt](#crossdomainenabled), wird dieser Vertrag für das Messaging zwischen den Ebenen verwendet. ```solidity import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; ``` -`Lib_PredeployAddresses` (https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol) hat die Adressen für die L2-Verträge, die immer dieselbe Adresse haben. Dies schließt die Standard-Brücke auf L2 mit ein. +[`Lib_PredeployAddresses`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol) enthält die Adressen für die L2-Verträge, die immer dieselbe Adresse haben. Dies schließt die kettenübergreifende Standardbrücke auf L2 ein. ```solidity import { Address } from "@openzeppelin/contracts/utils/Address.sol"; ``` -[OpenZeppelins Address-Dienstprogramme](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Es wird verwendet, um zwischen Vertragsadressen und solchen zu unterscheiden, die zu extern besessenen Konten (EOA) gehören. +[OpenZeppelins Address-Dienstprogramme](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Sie werden verwendet, um zwischen Vertragsadressen und solchen zu unterscheiden, die zu extern verwalteten Konten (Externally Owned Accounts, EOA) gehören. -Beachten Sie, dass dies keine perfekte Lösung ist, da es keine Möglichkeit gibt, zwischen direkten Aufrufen und Aufrufen aus dem Konstruktor eines Vertrags zu unterscheiden, aber zumindest können wir so einige häufige Benutzerfehler identifizieren und verhindern. +Beachten Sie, dass dies keine perfekte Lösung ist, da es keine Möglichkeit gibt, zwischen direkten Aufrufen und Aufrufen aus dem Konstruktor eines Vertrags zu unterscheiden. Zumindest können wir so jedoch einige häufige Benutzerfehler identifizieren und verhindern. ```solidity import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; @@ -521,98 +629,116 @@ import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.s [Der ERC-20-Standard](https://eips.ethereum.org/EIPS/eip-20) unterstützt zwei Möglichkeiten für einen Vertrag, einen Fehler zu melden: -1. Zurücksetzen (revert) -2. `false` zurückgeben +1. Revert (Rückgängig machen) +2. Rückgabe von `false` -Die Handhabung beider Fälle würde unseren Code komplizierter machen, daher verwenden wir stattdessen [OpenZeppelins `SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), das sicherstellt, dass [alle Fehler zu einem Revert führen](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). +Die Behandlung beider Fälle würde unseren Code komplizierter machen. Stattdessen verwenden wir [OpenZeppelins `SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), was sicherstellt, dass [alle Fehler zu einem Revert führen](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). ```solidity -/** +/* * * @title L1StandardBridge - * @dev Die L1-ETH- und ERC20-Brücke ist ein Vertrag, der hinterlegte L1-Mittel und Standard-Token - * speichert, die auf L2 verwendet werden. Sie synchronisiert eine entsprechende L2-Brücke, informiert sie über Einzahlungen - * und hört auf sie für neu finalisierte Auszahlungen. - * - */ + * @dev Die L1-ETH- und ERC20-kettenübergreifende Brücke ist ein Vertrag, der eingezahlte L1-Guthaben und Standard-Token speichert, + * die auf L2 verwendet werden. Er synchronisiert eine entsprechende L2-kettenübergreifende Brücke, informiert sie über Einzahlungen + * und lauscht auf neu abgeschlossene Abhebungen. + * */ + + + + + + + contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled { using SafeERC20 for IERC20; ``` -Diese Zeile gibt an, dass der `SafeERC20`-Wrapper jedes Mal verwendet werden soll, wenn wir die `IERC20`-Schnittstelle verwenden. +Mit dieser Zeile geben wir an, dass der `SafeERC20`-Wrapper jedes Mal verwendet werden soll, wenn wir die `IERC20`-Schnittstelle verwenden. ```solidity - /******************************** + /* ******************************* * Externe Vertragsreferenzen * - ********************************/ + ******************************* */ + + + address public l2TokenBridge; ``` -Die Adresse von [L2StandardBridge](#the-l2-bridge-contract). +Die Adresse der [L2StandardBridge](#the-l2-bridge-contract). ```solidity - // Ordnet L1-Token zu L2-Token zu Saldo des hinterlegten L1-Tokens zu + // Ordnet L1-Token dem L2-Token und dem Guthaben des eingezahlten L1-Tokens zu mapping(address => mapping(address => uint256)) public deposits; ``` -Ein doppeltes [Mapping](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) wie dieses ist die Art und Weise, wie Sie ein [zweidimensionales dünn besetztes Array](https://en.wikipedia.org/wiki/Sparse_matrix) definieren. -Werte in dieser Datenstruktur werden als `deposit[L1-Token-Adresse][L2-Token-Adresse]` identifiziert. -Der Standardwert ist Null. +Ein doppeltes [Mapping](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) wie dieses ist die Art und Weise, wie Sie ein [zweidimensionales spärliches Array (Sparse Array)](https://en.wikipedia.org/wiki/Sparse_matrix) definieren. +Werte in dieser Datenstruktur werden als `deposit[L1 token addr][L2 token addr]` identifiziert. +Der Standardwert ist null. Nur Zellen, die auf einen anderen Wert gesetzt sind, werden in den Speicher geschrieben. ```solidity - /*************** + /* ************** * Konstruktor * - ***************/ + ************** */ + + - // Dieser Vertrag lebt hinter einem Proxy, daher werden die Konstruktorparameter ungenutzt bleiben. + + // Dieser Vertrag befindet sich hinter einem Proxy, daher bleiben die Konstruktorparameter ungenutzt. constructor() CrossDomainEnabled(address(0)) {} ``` -Wir wollen diesen Vertrag aktualisieren können, ohne alle Variablen im Speicher kopieren zu müssen. -Dazu verwenden wir einen [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), einen Vertrag, der `delegatecall` verwendet, um Aufrufe an einen separaten Vertrag zu übertragen, dessen Adresse vom Proxy-Vertrag gespeichert wird (wenn Sie ein Upgrade durchführen, weisen Sie den Proxy an, diese Adresse zu ändern). +Wir möchten in der Lage sein, diesen Vertrag zu aktualisieren, ohne alle Variablen im Speicher kopieren zu müssen. +Dazu verwenden wir einen [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), einen Vertrag, der [`delegatecall`](https://solidity-by-example.org/delegatecall/) verwendet, um Aufrufe an einen separaten Vertrag zu übertragen, dessen Adresse vom Proxy-Vertrag gespeichert wird (beim Upgrade weisen Sie den Proxy an, diese Adresse zu ändern). Wenn Sie `delegatecall` verwenden, bleibt der Speicher der Speicher des _aufrufenden_ Vertrags, sodass die Werte aller Vertragszustandsvariablen unberührt bleiben. Ein Effekt dieses Musters ist, dass der Speicher des Vertrags, der der _Aufgerufene_ von `delegatecall` ist, nicht verwendet wird und daher die an ihn übergebenen Konstruktorwerte keine Rolle spielen. -Dies ist der Grund, warum wir dem `CrossDomainEnabled`-Konstruktor einen unsinnigen Wert übergeben können. -Dies ist auch der Grund, warum die folgende Initialisierung vom Konstruktor getrennt ist. +Dies ist der Grund, warum wir dem Konstruktor `CrossDomainEnabled` einen unsinnigen Wert übergeben können. +Es ist auch der Grund, warum die unten stehende Initialisierung vom Konstruktor getrennt ist. ```solidity - /****************** + /* ***************** * Initialisierung * - ******************/ + ***************** */ + + + + + /* * + * @param _l1messenger L1-Messenger-Adresse, die für kettenübergreifende Kommunikation verwendet wird. + * @param _l2TokenBridge Adresse der L2-Standard-kettenübergreifenden Brücke. */ + + + - /** - * @param _l1messenger L1 Messenger-Adresse, die für die Cross-Chain-Kommunikation verwendet wird. - * @param _l2TokenBridge L2-Standard-Brückenadresse. - */ // slither-disable-next-line external-function ``` -Dieser [Slither-Test](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) identifiziert Funktionen, die nicht aus dem Vertragscode aufgerufen werden und daher als `external` anstatt `public` deklariert werden könnten. -Die Gaskosten von `external`-Funktionen können niedriger sein, da sie mit Parametern in den Calldata versorgt werden können. -Als `public` deklarierte Funktionen müssen innerhalb des Vertrags zugänglich sein. -Verträge können ihre eigenen Calldata nicht ändern, daher müssen sich die Parameter im Speicher befinden. -Wenn eine solche Funktion extern aufgerufen wird, ist es notwendig, die Calldata in den Speicher zu kopieren, was Gas kostet. +Dieser [Slither-Test](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) identifiziert Funktionen, die nicht aus dem Vertragscode aufgerufen werden und daher als `external` anstatt als `public` deklariert werden könnten. +Die Gaskosten von `external`-Funktionen können niedriger sein, da sie mit Parametern in den Calldata versehen werden können. +Funktionen, die als `public` deklariert sind, müssen aus dem Vertrag heraus zugänglich sein. +Verträge können ihre eigenen Calldata nicht ändern, daher müssen sich die Parameter im Arbeitsspeicher (Memory) befinden. +Wenn eine solche Funktion extern aufgerufen wird, ist es notwendig, die Calldata in den Arbeitsspeicher zu kopieren, was Gas kostet. In diesem Fall wird die Funktion nur einmal aufgerufen, sodass die Ineffizienz für uns keine Rolle spielt. ```solidity function initialize(address _l1messenger, address _l2TokenBridge) public { - require(messenger == address(0), "Vertrag wurde bereits initialisiert."); + require(messenger == address(0), "Contract has already been initialized."); ``` -Die `initialize`-Funktion sollte nur einmal aufgerufen werden. -Wenn sich die Adresse des L1-Cross-Domain-Messengers oder der L2-Token-Brücke ändert, erstellen wir einen neuen Proxy und eine neue Brücke, die ihn aufruft. -Dies wird wahrscheinlich nur bei einem Upgrade des gesamten Systems geschehen, ein sehr seltenes Ereignis. +Die Funktion `initialize` sollte nur einmal aufgerufen werden. +Wenn sich die Adresse des L1-Cross-Domain-Messengers oder der kettenübergreifenden L2-Token-Brücke ändert, erstellen wir einen neuen Proxy und eine neue kettenübergreifende Brücke, die ihn aufruft. +Dies ist unwahrscheinlich, außer wenn das gesamte System aktualisiert wird, was ein sehr seltenes Ereignis ist. Beachten Sie, dass diese Funktion keinen Mechanismus hat, der einschränkt, _wer_ sie aufrufen kann. -Das bedeutet, dass ein Angreifer theoretisch warten könnte, bis wir den Proxy und die erste Version der Brücke deployen, und dann [Front-Running betreiben](https://solidity-by-example.org/hacks/front-running/) könnte, um zur `initialize`-Funktion zu gelangen, bevor der legitime Benutzer dies tut. Es gibt jedoch zwei Methoden, um dies zu verhindern: +Dies bedeutet, dass ein Angreifer theoretisch warten könnte, bis wir den Proxy und die erste Version der kettenübergreifenden Brücke bereitstellen, und dann [Front-Running](https://solidity-by-example.org/hacks/front-running/) betreiben könnte, um vor dem legitimen Benutzer zur Funktion `initialize` zu gelangen. Es gibt jedoch zwei Methoden, um dies zu verhindern: -1. Wenn die Verträge nicht direkt von einem EOA, sondern [in einer Transaktion bereitgestellt werden, in der ein anderer Vertrag sie erstellt](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595), kann der gesamte Prozess atomar sein und abgeschlossen werden, bevor eine andere Transaktion ausgeführt wird. -2. Wenn der legitime Aufruf von `initialize` fehlschlägt, ist es immer möglich, den neu erstellten Proxy und die Brücke zu ignorieren und neue zu erstellen. +1. Wenn die Verträge nicht direkt von einem EOA (Extern verwaltetes Konto), sondern [in einer Transaktion bereitgestellt werden, bei der ein anderer Vertrag sie erstellt](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595), kann der gesamte Prozess atomar sein und abgeschlossen werden, bevor eine andere Transaktion ausgeführt wird. +2. Wenn der legitime Aufruf von `initialize` fehlschlägt, ist es immer möglich, den neu erstellten Proxy und die kettenübergreifende Brücke zu ignorieren und neue zu erstellen. ```solidity messenger = _l1messenger; @@ -620,20 +746,25 @@ Das bedeutet, dass ein Angreifer theoretisch warten könnte, bis wir den Proxy u } ``` -Dies sind die beiden Parameter, die die Brücke kennen muss. +Dies sind die beiden Parameter, die die kettenübergreifende Brücke kennen muss. ```solidity - /************** - * Einzahlung * - **************/ + /* ************* + * Einzahlen * + ************* */ + + + + + /* * @dev Modifikator, der erfordert, dass der Sender ein EOA ist. Diese Prüfung könnte von einem bösartigen + * Vertrag über Initcode umgangen werden, aber sie kümmert sich um den Benutzerfehler, den wir vermeiden wollen. */ + + - /** @dev Modifikator, der erfordert, dass der Absender ein EOA ist. Diese Prüfung könnte von einem bösartigen - * Vertrag über initcode umgangen werden, aber sie kümmert sich um den Benutzerfehler, den wir vermeiden wollen. - */ modifier onlyEOA() { - // Wird verwendet, um Einzahlungen von Verträgen zu stoppen (verhindert versehentlich verlorene Tokens) - require(!Address.isContract(msg.sender), "Konto nicht EOA"); + // Wird verwendet, um Einzahlungen von Verträgen zu stoppen (vermeidet versehentlich verlorene Token) + require(!Address.isContract(msg.sender), "Account not EOA"); _; } ``` @@ -641,12 +772,17 @@ Dies sind die beiden Parameter, die die Brücke kennen muss. Dies ist der Grund, warum wir die `Address`-Dienstprogramme von OpenZeppelin benötigten. ```solidity - /** - * @dev Diese Funktion kann ohne Daten aufgerufen werden - * um einen Betrag von ETH auf das Guthaben des Aufrufers auf L2 einzuzahlen. - * Da die Empfangsfunktion keine Daten entgegennimmt, wird ein konservativer - * Standardbetrag an L2 weitergeleitet. - */ + /* * + * @dev Diese Funktion kann ohne Daten aufgerufen werden, + * um einen Betrag an ETH auf das Guthaben des Aufrufers auf L2 einzuzahlen. + * Da die Receive-Funktion keine Daten annimmt, wird ein konservativer + * Standardbetrag an L2 weitergeleitet. */ + + + + + + receive() external payable onlyEOA { _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes("")); } @@ -656,16 +792,20 @@ Diese Funktion existiert zu Testzwecken. Beachten Sie, dass sie nicht in den Schnittstellendefinitionen erscheint – sie ist nicht für den normalen Gebrauch bestimmt. ```solidity - /** - * @inheritdoc IL1StandardBridge - */ + /* * + * @inheritdoc IL1StandardBridge */ + + + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA { _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data); } - /** - * @inheritdoc IL1StandardBridge - */ + /* * + * @inheritdoc IL1StandardBridge */ + + + function depositETHTo( address _to, uint32 _l2Gas, @@ -675,32 +815,40 @@ Beachten Sie, dass sie nicht in den Schnittstellendefinitionen erscheint – sie } ``` -Diese beiden Funktionen sind Wrapper um `_initiateETHDeposit`, die Funktion, die die eigentliche ETH-Einzahlung abwickelt. +Diese beiden Funktionen sind Wrapper um `_initiateETHDeposit`, die Funktion, die die eigentliche ETH-Einzahlung verarbeitet. ```solidity - /** - * @dev Führt die Logik für Einzahlungen durch, indem der ETH gespeichert und das L2-ETH-Gateway - * über die Einzahlung informiert wird. - * @param _from Konto, von dem die Einzahlung auf L1 abgezogen wird. + /* * + * @dev Führt die Logik für Einzahlungen aus, indem die ETH gespeichert und das L2-ETH-Gateway über + * die Einzahlung informiert wird. + * @param _from Konto, von dem die Einzahlung auf L1 eingezogen wird. * @param _to Konto, dem die Einzahlung auf L2 gutgeschrieben wird. * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden - * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen - * Länge geben diese Verträge keine Garantien über ihren Inhalt. - */ + * ausschließlich als Annehmlichkeit für externe Verträge bereitgestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über deren Inhalt. */ + + + + + + + + + + function _initiateETHDeposit( address _from, address _to, uint32 _l2Gas, bytes memory _data ) internal { - // Konstruiere Calldata für den finalizeDeposit-Aufruf + // Erstellt Calldata für den finalizeDeposit-Aufruf bytes memory message = abi.encodeWithSelector( ``` -Die Funktionsweise von Cross-Domain-Nachrichten besteht darin, dass der Zielvertrag mit der Nachricht als Calldata aufgerufen wird. -Solidity-Verträge interpretieren ihre Calldata immer gemäß -[den ABI-Spezifikationen](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). +Die Art und Weise, wie Cross-Domain-Nachrichten funktionieren, besteht darin, dass der Zielvertrag mit der Nachricht als seinen Calldata aufgerufen wird. +Solidity-Verträge interpretieren ihre Calldata immer in Übereinstimmung mit [den ABI-Spezifikationen](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). Die Solidity-Funktion [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) erstellt diese Calldata. ```solidity @@ -714,19 +862,19 @@ Die Solidity-Funktion [`abi.encodeWithSelector`](https://docs.soliditylang.org/e ); ``` -Die Nachricht hier ist, [die Funktion `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) mit diesen Parametern aufzurufen: +Die Nachricht hier besteht darin, [die Funktion `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) mit diesen Parametern aufzurufen: -| Parameter | Wert | Bedeutung | -| ------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| \_l1Token | Adresse(0) | Sonderwert für ETH (das kein ERC-20-Token ist) auf L1 | -| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Der L2-Vertrag, der ETH auf Optimism verwaltet, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (dieser Vertrag ist nur für den internen Gebrauch von Optimism bestimmt) | -| \_from | \_from | Die Adresse auf L1, die die ETH sendet | -| \_to | \_to | Die Adresse auf L2, die die ETH empfängt | -| Betrag | msg.value | Gesendeter Betrag in Wei (der bereits an die Brücke gesendet wurde) | -| \_data | \_data | Zusätzliche Daten, die an die Einzahlung angehängt werden | +| Parameter | Value | Meaning | +| --------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | +| \_l1Token | address(0) | Spezieller Wert, der für ETH (das kein ERC-20-Token ist) auf L1 steht | +| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Der L2-Vertrag, der ETH auf Optimism verwaltet, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (dieser Vertrag ist nur für die interne Nutzung durch Optimism bestimmt) | +| \_from | \_from | Die Adresse auf L1, die die ETH sendet | +| \_to | \_to | Die Adresse auf L2, die die ETH empfängt | +| amount | msg.value | Menge der gesendeten Wei (die bereits an die kettenübergreifende Brücke gesendet wurden) | +| \_data | \_data | Zusätzliche Daten, die der Einzahlung beigefügt werden sollen | ```solidity - // Senden Sie Calldata nach L2 + // Sendet Calldata an L2 // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); ``` @@ -739,12 +887,14 @@ Senden Sie die Nachricht über den Cross-Domain-Messenger. } ``` -Ein Ereignis auslösen, um jede dezentralisierte Anwendung, die zuhört, über diese Übertragung zu informieren. +Geben Sie ein Ereignis aus, um jede dezentralisierte Anwendung, die zuhört, über diese Übertragung zu informieren. ```solidity - /** - * @inheritdoc IL1ERC20Bridge - */ + /* * + * @inheritdoc IL1ERC20Bridge */ + + + function depositERC20( . . @@ -753,9 +903,11 @@ Ein Ereignis auslösen, um jede dezentralisierte Anwendung, die zuhört, über d _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data); } - /** - * @inheritdoc IL1ERC20Bridge - */ + /* * + * @inheritdoc IL1ERC20Bridge */ + + + function depositERC20To( . . @@ -765,23 +917,36 @@ Ein Ereignis auslösen, um jede dezentralisierte Anwendung, die zuhört, über d } ``` -Diese beiden Funktionen sind Wrapper um `_initiateERC20Deposit`, die Funktion, die die eigentliche ERC-20-Einzahlung abwickelt. +Diese beiden Funktionen sind Wrapper um `_initiateERC20Deposit`, die Funktion, die die eigentliche ERC-20-Einzahlung verarbeitet. ```solidity - /** - * @dev Führt die Logik für Einzahlungen durch, indem der L2 Deposited Token - * Vertrag über die Einzahlung informiert wird und ein Handler aufgerufen wird, um die L1-Mittel zu sperren. (z. B. transferFrom) + /* * + * @dev Führt die Logik für Einzahlungen aus, indem der L2-Deposited-Token-Vertrag + * über die Einzahlung informiert wird und ein Handler aufgerufen wird, um die L1-Guthaben zu sperren. (z. B. transferFrom) * - * @param _l1Token Adresse des L1 ERC20, den wir einzahlen - * @param _l2Token Adresse des entsprechenden L2 ERC20 auf L1 - * @param _from Konto, von dem die Einzahlung auf L1 abgezogen wird + * @param _l1Token Adresse des L1-ERC20, den wir einzahlen + * @param _l2Token Adresse des entsprechenden L2-ERC20 zum L1 + * @param _from Konto, von dem die Einzahlung auf L1 eingezogen wird * @param _to Konto, dem die Einzahlung auf L2 gutgeschrieben wird - * @param _amount Einzuzahlender Betrag des ERC20. + * @param _amount Betrag des einzuzahlenden ERC20. * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden - * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen - * Länge geben diese Verträge keine Garantien über ihren Inhalt. - */ + * ausschließlich als Annehmlichkeit für externe Verträge bereitgestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über deren Inhalt. */ + + + + + + + + + + + + + + function _initiateERC20Deposit( address _l1Token, address _l2Token, @@ -793,29 +958,29 @@ Diese beiden Funktionen sind Wrapper um `_initiateERC20Deposit`, die Funktion, d ) internal { ``` -Diese Funktion ist ähnlich wie `_initiateETHDeposit` oben, mit einigen wichtigen Unterschieden. +Diese Funktion ähnelt `_initiateETHDeposit` oben, mit einigen wichtigen Unterschieden. Der erste Unterschied besteht darin, dass diese Funktion die Token-Adressen und den zu übertragenden Betrag als Parameter erhält. -Im Fall von ETH enthält der Aufruf der Brücke bereits die Übertragung des Assets auf das Brückenkonto (`msg.value`). +Im Falle von ETH beinhaltet der Aufruf der kettenübergreifenden Brücke bereits die Übertragung des Vermögenswerts auf das Brückenkonto (`msg.value`). ```solidity - // Wenn eine Einzahlung auf L1 initiiert wird, überträgt die L1-Brücke die Mittel an sich selbst für zukünftige - // Auszahlungen. safeTransferFrom prüft auch, ob der Vertrag Code hat, sodass dies fehlschlägt, wenn + // Wenn eine Einzahlung auf L1 initiiert wird, überträgt die L1-kettenübergreifende Brücke die Guthaben an sich selbst für zukünftige + // Abhebungen. safeTransferFrom prüft auch, ob der Vertrag Code hat, daher schlägt dies fehl, wenn // _from ein EOA oder address(0) ist. // slither-disable-next-line reentrancy-events, reentrancy-benign IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount); ``` -Übertragungen von ERC-20-Token folgen einem anderen Prozess als ETH: +ERC-20-Token-Übertragungen folgen einem anderen Prozess als ETH: -1. Der Benutzer (`_from`) erteilt der Brücke eine Freigabe, um die entsprechenden Tokens zu übertragen. -2. Der Benutzer ruft die Brücke mit der Adresse des Token-Vertrags, dem Betrag usw. auf. -3. Die Brücke überträgt die Tokens (an sich selbst) als Teil des Einzahlungsprozesses. +1. Der Benutzer (`_from`) erteilt der kettenübergreifenden Brücke die Erlaubnis (Allowance), die entsprechenden Token zu übertragen. +2. Der Benutzer ruft die kettenübergreifende Brücke mit der Adresse des Token-Vertrags, dem Betrag usw. auf. +3. Die kettenübergreifende Brücke überträgt die Token (an sich selbst) als Teil des Einzahlungsprozesses. Der erste Schritt kann in einer separaten Transaktion von den letzten beiden erfolgen. -Front-Running ist jedoch kein Problem, da die beiden Funktionen, die `_initiateERC20Deposit` aufrufen (`depositERC20` und `depositERC20To`), diese Funktion nur mit `msg.sender` als `_from`-Parameter aufrufen. +Front-Running ist jedoch kein Problem, da die beiden Funktionen, die `_initiateERC20Deposit` aufrufen (`depositERC20` und `depositERC20To`), diese Funktion nur mit `msg.sender` als Parameter `_from` aufrufen. ```solidity - // Konstruiere Calldata für _l2Token.finalizeDeposit(_to, _amount) + // Erstellt Calldata für _l2Token.finalizeDeposit(_to, _amount) bytes memory message = abi.encodeWithSelector( IL2ERC20Bridge.finalizeDeposit.selector, _l1Token, @@ -826,7 +991,7 @@ Front-Running ist jedoch kein Problem, da die beiden Funktionen, die `_initiateE _data ); - // Sende Calldata nach L2 + // Sendet Calldata an L2 // slither-disable-next-line reentrancy-events, reentrancy-benign sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); @@ -834,8 +999,8 @@ Front-Running ist jedoch kein Problem, da die beiden Funktionen, die `_initiateE deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount; ``` -Fügen Sie den eingezahlten Betrag an Tokens zur `deposits`-Datenstruktur hinzu. -Es könnten mehrere Adressen auf L2 vorhanden sein, die demselben L1-ERC-20-Token entsprechen, daher ist es nicht ausreichend, das Guthaben der Brücke am L1-ERC-20-Token zu verwenden, um die Einzahlungen zu verfolgen. +Fügen Sie den eingezahlten Token-Betrag zur Datenstruktur `deposits` hinzu. +Es könnte mehrere Adressen auf L2 geben, die demselben L1-ERC-20-Token entsprechen, daher reicht es nicht aus, den Saldo der kettenübergreifenden Brücke des L1-ERC-20-Tokens zu verwenden, um Einzahlungen zu verfolgen. ```solidity @@ -843,13 +1008,18 @@ Es könnten mehrere Adressen auf L2 vorhanden sein, die demselben L1-ERC-20-Toke emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data); } - /************************* - * Cross-Chain-Funktionen * - *************************/ + /* ************************ + * Kettenübergreifende Funktionen * + ************************ */ + + + + + /* * + * @inheritdoc IL1StandardBridge */ + + - /** - * @inheritdoc IL1StandardBridge - */ function finalizeETHWithdrawal( address _from, address _to, @@ -857,21 +1027,21 @@ Es könnten mehrere Adressen auf L2 vorhanden sein, die demselben L1-ERC-20-Toke bytes calldata _data ``` -Die L2-Brücke sendet eine Nachricht an den L2-Cross-Domain-Messenger, der bewirkt, dass der L1-Cross-Domain-Messenger diese Funktion aufruft (natürlich sobald die [Transaktion, die die Nachricht finalisiert](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions), auf L1 übermittelt wurde). +Die kettenübergreifende L2-Brücke sendet eine Nachricht an den L2-Cross-Domain-Messenger, was dazu führt, dass der L1-Cross-Domain-Messenger diese Funktion aufruft (natürlich erst, sobald die [Transaktion, die die Nachricht abschließt](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions), auf L1 übermittelt wurde). ```solidity ) external onlyFromCrossDomainAccount(l2TokenBridge) { ``` -Stellen Sie sicher, dass dies eine _legitime_ Nachricht ist, die vom Cross-Domain-Messenger kommt und von der L2-Token-Brücke stammt. -Diese Funktion wird verwendet, um ETH von der Brücke abzuheben, daher müssen wir sicherstellen, dass sie nur vom autorisierten Aufrufer aufgerufen wird. +Stellen Sie sicher, dass dies eine _legitime_ Nachricht ist, die vom Cross-Domain-Messenger stammt und von der kettenübergreifenden L2-Token-Brücke ausgeht. +Diese Funktion wird verwendet, um ETH von der kettenübergreifenden Brücke abzuheben, daher müssen wir sicherstellen, dass sie nur vom autorisierten Aufrufer aufgerufen wird. ```solidity // slither-disable-next-line reentrancy-events (bool success, ) = _to.call{ value: _amount }(new bytes(0)); ``` -Die Art und Weise, ETH zu übertragen, besteht darin, den Empfänger mit dem Betrag in Wei im `msg.value` aufzurufen. +Der Weg zur Übertragung von ETH besteht darin, den Empfänger mit der Menge an Wei in `msg.value` aufzurufen. ```solidity require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); @@ -880,14 +1050,16 @@ Die Art und Weise, ETH zu übertragen, besteht darin, den Empfänger mit dem Bet emit ETHWithdrawalFinalized(_from, _to, _amount, _data); ``` -Ein Ereignis über die Auszahlung auslösen. +Geben Sie ein Ereignis über die Auszahlung aus. ```solidity } - /** - * @inheritdoc IL1ERC20Bridge - */ + /* * + * @inheritdoc IL1ERC20Bridge */ + + + function finalizeERC20Withdrawal( address _l1Token, address _l2Token, @@ -898,17 +1070,17 @@ Ein Ereignis über die Auszahlung auslösen. ) external onlyFromCrossDomainAccount(l2TokenBridge) { ``` -Diese Funktion ist ähnlich wie `finalizeETHWithdrawal` oben, mit den notwendigen Änderungen für ERC-20-Tokens. +Diese Funktion ähnelt `finalizeETHWithdrawal` oben, mit den notwendigen Änderungen für ERC-20-Token. ```solidity deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount; ``` -Aktualisieren Sie die `deposits`-Datenstruktur. +Aktualisieren Sie die Datenstruktur `deposits`. ```solidity - // Wenn eine Auszahlung auf L1 finalisiert wird, überträgt die L1-Brücke die Mittel an den Auszahlenden + // Wenn eine Abhebung auf L1 abgeschlossen ist, überträgt die L1-kettenübergreifende Brücke die Guthaben an den Abhebenden // slither-disable-next-line reentrancy-events IERC20(_l1Token).safeTransfer(_to, _amount); @@ -917,36 +1089,44 @@ Aktualisieren Sie die `deposits`-Datenstruktur. } - /***************************** - * Vorübergehend - Migration von ETH * - *****************************/ + /* **************************** + * Temporär - ETH migrieren * + **************************** */ + + + + + /* * + * @dev Fügt dem Konto ETH-Guthaben hinzu. Dies soll ermöglichen, dass ETH + * von einem alten Gateway zu einem neuen Gateway migriert werden. + * HINWEIS: Dies wird nur für ein Upgrade belassen, damit wir die migrierten ETH aus dem + * alten Vertrag empfangen können */ + + + + + - /** - * @dev Fügt ETH-Guthaben zum Konto hinzu. Dies soll ermöglichen, dass ETH - * von einem alten Gateway zu einem neuen Gateway migriert wird. - * HINWEIS: Dies wird nur für ein Upgrade beibehalten, damit wir die migrierte ETH aus dem - * alten Vertrag empfangen können - */ function donateETH() external payable {} } ``` -Es gab eine frühere Implementierung der Brücke. -Als wir von dieser Implementierung zu dieser wechselten, mussten wir alle Assets verschieben. -ERC-20-Tokens können einfach verschoben werden. -Um jedoch ETH an einen Vertrag zu übertragen, benötigen Sie die Zustimmung dieses Vertrags, was uns `donateETH` bietet. +Es gab eine frühere Implementierung der kettenübergreifenden Brücke. +Als wir von dieser Implementierung zu dieser wechselten, mussten wir alle Vermögenswerte verschieben. +ERC-20-Token können einfach verschoben werden. +Um jedoch ETH an einen Vertrag zu übertragen, benötigen Sie die Genehmigung dieses Vertrags, was uns `donateETH` bietet. -## ERC-20-Tokens auf L2 {#erc-20-tokens-on-l2} +## ERC-20-Token auf L2 {#erc-20-tokens-on-l2} -Damit ein ERC-20-Token in die Standardbrücke passt, muss es der Standardbrücke und _nur_ der Standardbrücke erlauben, Token zu prägen. -Dies ist notwendig, weil die Brücken sicherstellen müssen, dass die Anzahl der auf Optimism zirkulierenden Tokens gleich der Anzahl der im L1-Brückenvertrag gesperrten Tokens ist. -Wenn es zu viele Tokens auf L2 gibt, könnten einige Benutzer ihre Assets nicht zurück auf L1 überbrücken. -Anstelle einer vertrauenswürdigen Brücke würden wir im Wesentlichen [Mindestreservebanking](https://www.investopedia.com/terms/f/fractionalreservebanking.asp) nachbilden. -Wenn es zu viele Tokens auf L1 gibt, würden einige dieser Tokens für immer im Brückenvertrag gesperrt bleiben, weil es keine Möglichkeit gibt, sie ohne das Verbrennen von L2-Tokens freizugeben. +Damit ein ERC-20-Token in die kettenübergreifende Standardbrücke passt, muss er es der kettenübergreifenden Standardbrücke und _nur_ der kettenübergreifenden Standardbrücke erlauben, Token zu prägen. +Dies ist notwendig, da die kettenübergreifenden Brücken sicherstellen müssen, dass die Anzahl der auf Optimism zirkulierenden Token der Anzahl der im Vertrag der kettenübergreifenden L1-Brücke gesperrten Token entspricht. +Wenn es zu viele Token auf L2 gibt, könnten einige Benutzer ihre Vermögenswerte nicht über die kettenübergreifende Brücke zurück zu L1 übertragen. +Anstelle einer vertrauenswürdigen kettenübergreifenden Brücke würden wir im Wesentlichen das [Mindestreservesystem (Fractional Reserve Banking)](https://www.investopedia.com/terms/f/fractionalreservebanking.asp) nachbilden. +Wenn es zu viele Token auf L1 gibt, würden einige dieser Token für immer im Brückenvertrag gesperrt bleiben, da es keine Möglichkeit gibt, sie freizugeben, ohne L2-Token zu verbrennen. ### IL2StandardERC20 {#il2standarderc20} -Jeder ERC-20-Token auf L2, der die Standardbrücke verwendet, muss [diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol) bereitstellen, die die Funktionen und Ereignisse enthält, die die Standardbrücke benötigt. +Jeder ERC-20-Token auf L2, der die kettenübergreifende Standardbrücke verwendet, muss [diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol) bereitstellen, die über die Funktionen und Ereignisse verfügt, die die kettenübergreifende Standardbrücke benötigt. ```solidity // SPDX-License-Identifier: MIT @@ -956,7 +1136,7 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; ``` [Die Standard-ERC-20-Schnittstelle](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) enthält nicht die Funktionen `mint` und `burn`. -Diese Methoden sind nicht durch [den ERC-20-Standard](https://eips.ethereum.org/EIPS/eip-20) vorgeschrieben, der die Mechanismen zur Erstellung und Zerstörung von Tokens nicht spezifiziert. +Diese Methoden werden vom [ERC-20-Standard](https://eips.ethereum.org/EIPS/eip-20) nicht verlangt, der die Mechanismen zum Erstellen und Zerstören von Token unspezifiziert lässt. ```solidity import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; @@ -970,9 +1150,9 @@ interface IL2StandardERC20 is IERC20, IERC165 { function l1Token() external returns (address); ``` -Diese Funktion gibt die Adresse des L1-Tokens an, das auf diesen Vertrag überbrückt wird. -Beachten Sie, dass wir keine ähnliche Funktion in die entgegengesetzte Richtung haben. -Wir müssen in der Lage sein, jeden L1-Token zu überbrücken, unabhängig davon, ob bei seiner Implementierung eine L2-Unterstützung geplant war oder nicht. +Diese Funktion liefert die Adresse des L1-Tokens, der über eine kettenübergreifende Brücke mit diesem Vertrag verbunden ist. +Beachten Sie, dass wir keine ähnliche Funktion in der entgegengesetzten Richtung haben. +Wir müssen in der Lage sein, jeden L1-Token über eine kettenübergreifende Brücke zu übertragen, unabhängig davon, ob bei seiner Implementierung L2-Unterstützung geplant war oder nicht. ```solidity @@ -985,12 +1165,12 @@ Wir müssen in der Lage sein, jeden L1-Token zu überbrücken, unabhängig davon } ``` -Funktionen und Ereignisse zum Prägen (Erstellen) und Verbrennen (Zerstören) von Tokens. -Die Brücke sollte die einzige Entität sein, die diese Funktionen ausführen kann, um sicherzustellen, dass die Anzahl der Tokens korrekt ist (gleich der Anzahl der auf L1 gesperrten Tokens). +Funktionen und Ereignisse zum Prägen (Erstellen) und Verbrennen (Zerstören) von Token. +Die kettenübergreifende Brücke sollte die einzige Entität sein, die diese Funktionen ausführen kann, um sicherzustellen, dass die Anzahl der Token korrekt ist (gleich der Anzahl der auf L1 gesperrten Token). ### L2StandardERC20 {#L2StandardERC20} -[Dies ist unsere Implementierung der `IL2StandardERC20`-Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). +[Dies ist unsere Implementierung der Schnittstelle `IL2StandardERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). Sofern Sie keine benutzerdefinierte Logik benötigen, sollten Sie diese verwenden. ```solidity @@ -1000,8 +1180,8 @@ pragma solidity ^0.8.9; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; ``` -[Der OpenZeppelin ERC-20-Vertrag](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). -Optimism glaubt nicht daran, das Rad neu zu erfinden, besonders wenn das Rad gut geprüft ist und vertrauenswürdig genug sein muss, um Vermögenswerte zu halten. +[Der OpenZeppelin-ERC-20-Vertrag](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). +Optimism glaubt nicht daran, das Rad neu zu erfinden, insbesondere wenn das Rad gut geprüft ist und vertrauenswürdig genug sein muss, um Vermögenswerte zu halten. ```solidity import "./IL2StandardERC20.sol"; @@ -1011,16 +1191,21 @@ contract L2StandardERC20 is IL2StandardERC20, ERC20 { address public l2Bridge; ``` -Dies sind die beiden zusätzlichen Konfigurationsparameter, die wir benötigen und die ERC-20 normalerweise nicht hat. +Dies sind die beiden zusätzlichen Konfigurationsparameter, die wir benötigen und die ERC-20 normalerweise nicht benötigt. ```solidity - /** - * @param _l2Bridge Adresse der L2-Standardbrücke. + /* * + * @param _l2Bridge Adresse der L2-Standard-kettenübergreifenden Brücke. * @param _l1Token Adresse des entsprechenden L1-Tokens. * @param _name ERC20-Name. - * @param _symbol ERC20-Symbol. - */ + * @param _symbol ERC20-Symbol. */ + + + + + + constructor( address _l2Bridge, address _l1Token, @@ -1032,12 +1217,12 @@ Dies sind die beiden zusätzlichen Konfigurationsparameter, die wir benötigen u } ``` -Zuerst den Konstruktor für den Vertrag aufrufen, von dem wir erben (`ERC20(_name, _symbol)`) und dann unsere eigenen Variablen setzen. +Rufen Sie zuerst den Konstruktor für den Vertrag auf, von dem wir erben (`ERC20(_name, _symbol)`), und legen Sie dann unsere eigenen Variablen fest. ```solidity modifier onlyL2Bridge() { - require(msg.sender == l2Bridge, "Nur die L2-Brücke kann prägen und verbrennen"); + require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn"); _; } @@ -1053,11 +1238,11 @@ Zuerst den Konstruktor für den Vertrag aufrufen, von dem wir erben (`ERC20(_nam ``` So funktioniert [ERC-165](https://eips.ethereum.org/EIPS/eip-165). -Jede Schnittstelle ist eine Anzahl von unterstützten Funktionen und wird als [Exklusiv-Oder](https://en.wikipedia.org/wiki/Exclusive_or) der [ABI-Funktionsselektoren](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) dieser Funktionen identifiziert. +Jede Schnittstelle ist eine Anzahl unterstützter Funktionen und wird als das [exklusive Oder (XOR)](https://de.wikipedia.org/wiki/Kontravalenz) der [ABI-Funktionsselektoren](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) dieser Funktionen identifiziert. -Die L2-Brücke verwendet ERC-165 als Plausibilitätsprüfung, um sicherzustellen, dass der ERC-20-Vertrag, an den sie Assets sendet, ein `IL2StandardERC20` ist. +Die kettenübergreifende L2-Brücke verwendet ERC-165 als Plausibilitätsprüfung (Sanity Check), um sicherzustellen, dass der ERC-20-Vertrag, an den sie Vermögenswerte sendet, ein `IL2StandardERC20` ist. -**Hinweis:** Es gibt nichts, was betrügerische Verträge daran hindert, falsche Antworten auf `supportsInterface` zu geben, daher ist dies ein Plausibilitätsprüfungsmechanismus, _kein_ Sicherheitsmechanismus. +**Hinweis:** Es gibt nichts, was einen bösartigen Vertrag daran hindert, falsche Antworten auf `supportsInterface` zu geben. Dies ist also ein Plausibilitätsprüfungsmechanismus, _kein_ Sicherheitsmechanismus. ```solidity // slither-disable-next-line external-function @@ -1076,87 +1261,112 @@ Die L2-Brücke verwendet ERC-165 als Plausibilitätsprüfung, um sicherzustellen } ``` -Nur die L2-Brücke darf Assets prägen und verbrennen. +Nur die kettenübergreifende L2-Brücke darf Vermögenswerte prägen und verbrennen. -`_mint` und `_burn` sind tatsächlich im [OpenZeppelin ERC-20-Vertrag](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) definiert. -Dieser Vertrag macht sie nur nicht extern zugänglich, weil die Bedingungen zum Prägen und Verbrennen von Tokens so vielfältig sind wie die Anzahl der Verwendungsmöglichkeiten von ERC-20. +`_mint` und `_burn` sind tatsächlich im [OpenZeppelin-ERC-20-Vertrag](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) definiert. +Dieser Vertrag macht sie nur nicht nach außen hin zugänglich, da die Bedingungen zum Prägen und Verbrennen von Token so vielfältig sind wie die Anzahl der Möglichkeiten, ERC-20 zu verwenden. -## L2-Brücken-Code {#l2-bridge-code} +## Code der kettenübergreifenden L2-Brücke {#l2-bridge-code} -Dies ist der Code, der die Brücke auf Optimism ausführt. -[Die Quelle für diesen Vertrag befindet sich hier](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol). +Dies ist der Code, der die kettenübergreifende Brücke auf Optimism ausführt. +[Die Quelle für diesen Vertrag finden Sie hier](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol). ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /* Schnittstellen-Importe */ +/* Interface Imports */ import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol"; import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol"; import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol"; ``` -Die [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol)-Schnittstelle ist dem [L1-Äquivalent](#IL1ERC20Bridge), das wir oben gesehen haben, sehr ähnlich. +Die Schnittstelle [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ist dem [L1-Äquivalent](#IL1ERC20Bridge), das wir oben gesehen haben, sehr ähnlich. Es gibt zwei wesentliche Unterschiede: -1. Auf L1 initiieren Sie Einzahlungen und finalisieren Auszahlungen. - Hier initiieren Sie Auszahlungen und finalisieren Einzahlungen. -2. Auf L1 ist es notwendig, zwischen ETH- und ERC-20-Tokens zu unterscheiden. - Auf L2 können wir dieselben Funktionen für beide verwenden, da intern ETH-Guthaben auf Optimism als ERC-20-Token mit der Adresse [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000) behandelt werden. +1. Auf L1 initiieren Sie Einzahlungen und schließen Auszahlungen ab. + Hier initiieren Sie Auszahlungen und schließen Einzahlungen ab. +2. Auf L1 ist es notwendig, zwischen ETH und ERC-20-Token zu unterscheiden. + Auf L2 können wir für beides dieselben Funktionen verwenden, da ETH-Guthaben auf Optimism intern als ERC-20-Token mit der Adresse [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000) behandelt werden. ```solidity /* Bibliotheks-Importe */ +/* Library Imports */ import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; /* Vertrags-Importe */ +/* Contract Imports */ import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol"; -/** +/* * * @title L2StandardBridge - * @dev Die L2-Standardbrücke ist ein Vertrag, der zusammen mit der L1-Standardbrücke - * ETH- und ERC20-Übergänge zwischen L1 und L2 ermöglicht. - * Dieser Vertrag fungiert als Minter für neue Tokens, wenn er von Einzahlungen in die L1-Standardbrücke - * erfährt. - * Dieser Vertrag fungiert auch als Burner der für die Auszahlung vorgesehenen Tokens und informiert die L1- - * Brücke, L1-Mittel freizugeben. - */ + * @dev Die L2-Standard-kettenübergreifende Brücke ist ein Vertrag, der mit der L1-Standard-kettenübergreifenden Brücke zusammenarbeitet, um + * ETH- und ERC20-Übergänge zwischen L1 und L2 zu ermöglichen. + * Dieser Vertrag fungiert als Präger für neue Token, wenn er von Einzahlungen in die L1-Standard-kettenübergreifende + * Brücke erfährt. + * Dieser Vertrag fungiert auch als Verbrenner der für die Abhebung vorgesehenen Token und informiert die L1-kettenübergreifende + * Brücke, L1-Guthaben freizugeben. */ + + + + + + + + + contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { - /******************************** + /* ******************************* * Externe Vertragsreferenzen * - ********************************/ + ******************************* */ + + + address public l1TokenBridge; ``` -Die Adresse der L1-Brücke im Auge behalten. -Beachten Sie, dass wir im Gegensatz zum L1-Äquivalent hier diese Variable _brauchen_. -Die Adresse der L1-Brücke ist nicht im Voraus bekannt. +Behalten Sie die Adresse der kettenübergreifenden L1-Brücke im Auge. +Beachten Sie, dass wir im Gegensatz zum L1-Äquivalent diese Variable hier _benötigen_. +Die Adresse der kettenübergreifenden L1-Brücke ist im Voraus nicht bekannt. ```solidity - /*************** + /* ************** * Konstruktor * - ***************/ + ************** */ + + + + + /* * + * @param _l2CrossDomainMessenger Domänenübergreifender Messenger, der von diesem Vertrag verwendet wird. + * @param _l1TokenBridge Adresse der L1-kettenübergreifenden Brücke, die auf der Hauptchain bereitgestellt ist. */ + + + - /** - * @param _l2CrossDomainMessenger Von diesem Vertrag verwendeter domänenübergreifender Messenger. - * @param _l1TokenBridge Adresse der auf der Hauptkette bereitgestellten L1-Brücke. - */ constructor(address _l2CrossDomainMessenger, address _l1TokenBridge) CrossDomainEnabled(_l2CrossDomainMessenger) { l1TokenBridge = _l1TokenBridge; } - /*************** - * Auszahlung * - ***************/ + /* ************** + * Abheben * + ************** */ + + + + + /* * + * @inheritdoc IL2ERC20Bridge */ + + - /** - * @inheritdoc IL2ERC20Bridge - */ function withdraw( address _l2Token, uint256 _amount, @@ -1166,9 +1376,11 @@ Die Adresse der L1-Brücke ist nicht im Voraus bekannt. _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data); } - /** - * @inheritdoc IL2ERC20Bridge - */ + /* * + * @inheritdoc IL2ERC20Bridge */ + + + function withdrawTo( address _l2Token, address _to, @@ -1180,24 +1392,35 @@ Die Adresse der L1-Brücke ist nicht im Voraus bekannt. } ``` -Diese beiden Funktionen leiten Auszahlungen ein. +Diese beiden Funktionen initiieren Auszahlungen. Beachten Sie, dass die L1-Token-Adresse nicht angegeben werden muss. -Es wird erwartet, dass L2-Tokens uns die Adresse des L1-Äquivalents mitteilen. +Es wird erwartet, dass L2-Token uns die Adresse des L1-Äquivalents mitteilen. ```solidity - /** - * @dev Führt die Logik für Auszahlungen durch, indem der Token verbrannt und - * das L1-Token-Gateway über die Auszahlung informiert wird. - * @param _l2Token Adresse des L2-Tokens, bei dem die Auszahlung eingeleitet wird. - * @param _from Konto, von dem die Auszahlung auf L2 abgezogen wird. - * @param _to Konto, dem die Auszahlung auf L1 gutgeschrieben wird. + /* * + * @dev Führt die Logik für Abhebungen aus, indem der Token verbrannt und + * das L1-Token-Gateway über die Abhebung informiert wird. + * @param _l2Token Adresse des L2-Tokens, bei dem die Abhebung initiiert wird. + * @param _from Konto, von dem die Abhebung auf L2 eingezogen wird. + * @param _to Konto, dem die Abhebung auf L1 gutgeschrieben wird. * @param _amount Betrag des abzuhebenden Tokens. - * @param _l1Gas Unbenutzt, aber aus Gründen der potenziellen Vorwärtskompatibilität enthalten. + * @param _l1Gas Unbenutzt, aber für mögliche zukünftige Kompatibilitätsüberlegungen enthalten. * @param _data Optionale Daten zur Weiterleitung an L1. Diese Daten werden - * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen - * Länge geben diese Verträge keine Garantien über ihren Inhalt. - */ + * ausschließlich als Annehmlichkeit für externe Verträge bereitgestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über deren Inhalt. */ + + + + + + + + + + + + function _initiateWithdrawal( address _l2Token, address _from, @@ -1206,17 +1429,17 @@ Es wird erwartet, dass L2-Tokens uns die Adresse des L1-Äquivalents mitteilen. uint32 _l1Gas, bytes calldata _data ) internal { - // Wenn eine Auszahlung eingeleitet wird, verbrennen wir die Mittel des Auszahlenden, um eine nachfolgende L2- + // Wenn eine Abhebung initiiert wird, verbrennen wir die Guthaben des Abhebenden, um eine spätere L2- // Nutzung zu verhindern // slither-disable-next-line reentrancy-events IL2StandardERC20(_l2Token).burn(msg.sender, _amount); ``` -Beachten Sie, dass wir uns _nicht_ auf den `_from`-Parameter verlassen, sondern auf `msg.sender`, was viel schwerer zu fälschen ist (soweit ich weiß, unmöglich). +Beachten Sie, dass wir uns _nicht_ auf den Parameter `_from` verlassen, sondern auf `msg.sender`, was viel schwerer zu fälschen ist (unmöglich, soweit ich weiß). ```solidity - // Konstruiere Calldata für l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) + // Erstellt Calldata für l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) // slither-disable-next-line reentrancy-events address l1Token = IL2StandardERC20(_l2Token).l1Token(); bytes memory message; @@ -1246,7 +1469,7 @@ Auf L1 ist es notwendig, zwischen ETH und ERC-20 zu unterscheiden. ); } - // Nachricht an L1-Brücke senden + // Sendet Nachricht hoch zur L1-kettenübergreifenden Brücke // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l1TokenBridge, _l1Gas, message); @@ -1254,13 +1477,18 @@ Auf L1 ist es notwendig, zwischen ETH und ERC-20 zu unterscheiden. emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data); } - /************************************ - * Cross-Chain-Funktion: Einzahlung * - ************************************/ + /* *********************************** + * Kettenübergreifende Funktion: Einzahlen * + *********************************** */ + + + + + /* * + * @inheritdoc IL2ERC20Bridge */ + + - /** - * @inheritdoc IL2ERC20Bridge - */ function finalizeDeposit( address _l1Token, address _l2Token, @@ -1277,26 +1505,26 @@ Diese Funktion wird von `L1StandardBridge` aufgerufen. ``` Stellen Sie sicher, dass die Quelle der Nachricht legitim ist. -Dies ist wichtig, da diese Funktion `_mint` aufruft und verwendet werden könnte, um Tokens auszugeben, die nicht durch Tokens gedeckt sind, die die Brücke auf L1 besitzt. +Dies ist wichtig, da diese Funktion `_mint` aufruft und verwendet werden könnte, um Token auszugeben, die nicht durch Token gedeckt sind, die die kettenübergreifende Brücke auf L1 besitzt. ```solidity - // Prüfen Sie, ob der Ziel-Token konform ist und - // überprüfen Sie, ob der eingezahlte Token auf L1 mit der L2-Darstellung des eingezahlten Tokens hier übereinstimmt + // Prüft, ob der Ziel-Token konform ist und + // verifiziert, dass der eingezahlte Token auf L1 mit der hier eingezahlten L2-Token-Repräsentation übereinstimmt if ( // slither-disable-next-line reentrancy-events ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) && _l1Token == IL2StandardERC20(_l2Token).l1Token() ``` -Plausibilitätsprüfungen: +Plausibilitätsprüfungen (Sanity Checks): -1. Die richtige Schnittstelle wird unterstützt -2. Die L1-Adresse des L2-ERC-20-Vertrags stimmt mit der L1-Quelle der Tokens überein +1. Die richtige Schnittstelle wird unterstützt. +2. Die L1-Adresse des L2-ERC-20-Vertrags stimmt mit der L1-Quelle der Token überein. ```solidity ) { // Wenn eine Einzahlung abgeschlossen ist, schreiben wir dem Konto auf L2 den gleichen Betrag an - // Tokens gut. + // Token gut. // slither-disable-next-line reentrancy-events IL2StandardERC20(_l2Token).mint(_to, _amount); // slither-disable-next-line reentrancy-events @@ -1305,36 +1533,36 @@ Plausibilitätsprüfungen: Wenn die Plausibilitätsprüfungen erfolgreich sind, schließen Sie die Einzahlung ab: -1. Prägen Sie die Tokens -2. Das entsprechende Ereignis auslösen +1. Prägen Sie die Token. +2. Geben Sie das entsprechende Ereignis aus. ```solidity } else { - // Entweder ist der L2-Token, in den eingezahlt wird, mit der korrekten Adresse - // seines L1-Tokens nicht einverstanden oder er unterstützt nicht die korrekte Schnittstelle. + // Entweder ist der L2-Token, in den eingezahlt wird, nicht mit der korrekten Adresse + // seines L1-Tokens einverstanden, oder er unterstützt nicht die korrekte Schnittstelle. // Dies sollte nur passieren, wenn es einen bösartigen L2-Token gibt oder wenn ein Benutzer irgendwie // die falsche L2-Token-Adresse für die Einzahlung angegeben hat. - // In jedem Fall stoppen wir den Prozess hier und erstellen eine Auszahlungsnachricht - //, damit Benutzer in einigen Fällen ihre Gelder abheben können. + // In beiden Fällen stoppen wir den Prozess hier und erstellen eine Abhebungs- + // Nachricht, damit Benutzer in einigen Fällen ihre Guthaben herausbekommen können. // Es gibt keine Möglichkeit, bösartige Token-Verträge vollständig zu verhindern, aber dies begrenzt - // Benutzerfehler und mildert einige Formen von bösartigem Vertragsverhalten. + // Benutzerfehler und mildert einige Formen von bösartigem Vertragsverhalten ab. ``` -Wenn ein Benutzer einen erkennbaren Fehler gemacht hat, indem er die falsche L2-Token-Adresse verwendet hat, möchten wir die Einzahlung stornieren und die Tokens auf L1 zurückgeben. -Der einzige Weg, wie wir dies von L2 aus tun können, ist das Senden einer Nachricht, die den Fehler-Anfechtungszeitraum abwarten muss, aber das ist für den Benutzer viel besser als der dauerhafte Verlust der Tokens. +Wenn ein Benutzer einen erkennbaren Fehler gemacht hat, indem er die falsche L2-Token-Adresse verwendet hat, möchten wir die Einzahlung stornieren und die Token auf L1 zurückgeben. +Die einzige Möglichkeit, dies von L2 aus zu tun, besteht darin, eine Nachricht zu senden, die die Fehleranfechtungsfrist abwarten muss. Dies ist jedoch für den Benutzer viel besser, als die Token dauerhaft zu verlieren. ```solidity bytes memory message = abi.encodeWithSelector( IL1ERC20Bridge.finalizeERC20Withdrawal.selector, _l1Token, _l2Token, - _to, // hier _to und _from vertauscht, um die Einzahlung an den Absender zurückzuspringen + _to, // hat hier _to und _from vertauscht, um die Einzahlung an den Sender zurückzusenden _from, _amount, _data ); - // Nachricht an die L1-Brücke senden + // Sendet Nachricht hoch zur L1-kettenübergreifenden Brücke // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l1TokenBridge, 0, message); // slither-disable-next-line reentrancy-events @@ -1346,13 +1574,13 @@ Der einzige Weg, wie wir dies von L2 aus tun können, ist das Senden einer Nachr ## Fazit {#conclusion} -Die Standard-Brücke ist der flexibelste Mechanismus für Asset-Übertragungen. -Da er jedoch so generisch ist, ist er nicht immer der einfachste zu verwendende Mechanismus. -Insbesondere für Auszahlungen bevorzugen die meisten Benutzer [Drittanbieter-Brücken](https://optimism.io/apps#bridge), die nicht auf den Anfechtungszeitraum warten und keinen Merkle-Beweis benötigen, um die Auszahlung abzuschließen. +Die kettenübergreifende Standardbrücke ist der flexibelste Mechanismus für Vermögensübertragungen. +Da sie jedoch so generisch ist, ist sie nicht immer der am einfachsten zu verwendende Mechanismus. +Insbesondere für Auszahlungen ziehen es die meisten Benutzer vor, [kettenübergreifende Brücken von Drittanbietern](https://optimism.io/apps#bridge) zu verwenden, die nicht auf die Anfechtungsfrist warten und keinen Merkle-Proof benötigen, um die Auszahlung abzuschließen. -Diese Brücken funktionieren typischerweise, indem sie Assets auf L1 haben, die sie sofort gegen eine geringe Gebühr (oft weniger als die Gaskosten für eine Standard-Brückenauszahlung) zur Verfügung stellen. -Wenn die Brücke (oder die Personen, die sie betreiben) erwartet, dass sie auf L1 knapp bei Kasse ist, überträgt sie ausreichend Vermögenswerte von L2. Da es sich hierbei um sehr große Auszahlungen handelt, werden die Auszahlungskosten auf einen großen Betrag verteilt und machen einen viel kleineren Prozentsatz aus. +Diese kettenübergreifenden Brücken funktionieren in der Regel so, dass sie über Vermögenswerte auf L1 verfügen, die sie gegen eine geringe Gebühr (oft weniger als die Gaskosten für eine Auszahlung über eine kettenübergreifende Standardbrücke) sofort bereitstellen. +Wenn die kettenübergreifende Brücke (oder die Personen, die sie betreiben) voraussieht, dass L1-Vermögenswerte knapp werden, überträgt sie ausreichende Vermögenswerte von L2. Da es sich um sehr große Auszahlungen handelt, werden die Auszahlungskosten über einen großen Betrag amortisiert und machen einen viel geringeren Prozentsatz aus. -Hoffentlich hat Ihnen dieser Artikel geholfen, besser zu verstehen, wie Layer 2 funktioniert und wie man klaren und sicheren Solidity-Code schreibt. +Hoffentlich hat Ihnen dieser Artikel geholfen, mehr darüber zu verstehen, wie Ebene 2 funktioniert und wie man Solidity-Code schreibt, der klar und sicher ist. -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md index 9e50e461fba..eed6f31c39d 100644 --- a/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md @@ -1,69 +1,68 @@ --- -title: "Reverse Engineering eines Contracts" -description: Wie Sie einen Contract verstehen, wenn Sie den Quellcode nicht haben +title: "Reverse Engineering eines Vertrags" +description: Wie man einen Vertrag versteht, wenn man den Quellcode nicht hat author: Ori Pomerantz lang: de tags: ["evm", "opcodes"] skill: advanced -breadcrumb: "Reverse Engineering" +breadcrumb: Reverse Engineering published: 2021-12-30 --- - ## Einführung {#introduction} -_Auf der Blockchain gibt es keine Geheimnisse_, alles, was geschieht, ist konsistent, nachprüfbar und öffentlich zugänglich. Idealerweise sollten [Contracts ihren Quellcode auf Etherscan veröffentlichen und verifizieren lassen](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). [Das ist jedoch nicht immer der Fall](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). In diesem Artikel lernen Sie, wie Sie Contracts per Reverse Engineering analysieren, indem Sie sich einen Contract ohne Quellcode ansehen: [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). +_Es gibt keine Geheimnisse auf der Blockchain_, alles, was passiert, ist konsistent, verifizierbar und öffentlich zugänglich. Im Idealfall [sollte der Quellcode von Verträgen auf Etherscan veröffentlicht und verifiziert sein](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). Allerdings [ist das nicht immer der Fall](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). In diesem Artikel lernen Sie, wie Sie Verträge durch Reverse Engineering analysieren können, indem wir uns einen Vertrag ohne Quellcode ansehen: [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). -Es gibt Reverse-Compiler, aber sie liefern nicht immer [brauchbare Ergebnisse](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). In diesem Artikel lernen Sie, wie Sie einen Contract manuell per Reverse Engineering analysieren und anhand [der Opcodes](https://github.com/wolflo/evm-opcodes) verstehen können, und wie Sie die Ergebnisse eines Decompilers interpretieren. +Es gibt Reverse-Compiler, aber sie liefern nicht immer [brauchbare Ergebnisse](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). In diesem Artikel lernen Sie, wie Sie einen Vertrag anhand [der Opcodes](https://github.com/wolflo/evm-opcodes) manuell rückentwickeln und verstehen können, sowie wie Sie die Ergebnisse eines Dekompilierers interpretieren. -Um diesen Artikel zu verstehen, sollten Sie bereits die Grundlagen der EVM kennen und zumindest einigermaßen mit EVM-Assembler vertraut sein. [Hier können Sie mehr über diese Themen lesen](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). +Um diesen Artikel verstehen zu können, sollten Sie bereits die Grundlagen der EVM kennen und zumindest ein wenig mit EVM-Assembler vertraut sein. [Sie können hier mehr über diese Themen lesen](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). -## Vorbereitung des ausführbaren Codes {#prepare-the-executable-code} +## Den ausführbaren Code vorbereiten {#prepare-the-executable-code} -Sie können die Opcodes abrufen, indem Sie auf Etherscan zum Contract navigieren, auf den Tab **Contract** und dann auf **Switch to Opcodes View** klicken. Sie erhalten eine Ansicht mit einem Opcode pro Zeile. +Sie können die Opcodes abrufen, indem Sie auf Etherscan für den Vertrag gehen, auf den Tab **Contract** klicken und dann **Switch to Opcodes View** auswählen. Sie erhalten eine Ansicht mit einem Opcode pro Zeile. ![Opcode-Ansicht von Etherscan](opcode-view.png) -Um Sprünge (Jumps) zu verstehen, müssen Sie jedoch wissen, wo sich die einzelnen Opcodes im Code befinden. Eine Möglichkeit besteht darin, ein Google Spreadsheet zu öffnen und die Opcodes in Spalte C einzufügen. [Sie können die folgenden Schritte überspringen, indem Sie eine Kopie dieser bereits vorbereiteten Tabelle erstellen](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). +Um jedoch Sprünge (Jumps) zu verstehen, müssen Sie wissen, wo sich jeder Opcode im Code befindet. Eine Möglichkeit dazu besteht darin, ein Google Spreadsheet zu öffnen und die Opcodes in Spalte C einzufügen. [Sie können die folgenden Schritte überspringen, indem Sie eine Kopie dieser bereits vorbereiteten Tabelle erstellen](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). -Der nächste Schritt besteht darin, die korrekten Code-Positionen zu ermitteln, damit wir die Sprünge verstehen können. Wir tragen die Opcode-Größe in Spalte B und die Position (in hexadezimaler Schreibweise) in Spalte A ein. Geben Sie diese Funktion in Zelle `B1` ein und kopieren Sie sie dann für den Rest von Spalte B bis zum Ende des Codes. Danach können Sie Spalte B ausblenden. +Der nächste Schritt besteht darin, die korrekten Code-Positionen zu ermitteln, damit wir Sprünge verstehen können. Wir tragen die Opcode-Größe in Spalte B und die Position (in hexadezimaler Form) in Spalte A ein. Geben Sie diese Funktion in Zelle `B1` ein und kopieren Sie sie dann für den Rest von Spalte B bis zum Ende des Codes. Danach können Sie Spalte B ausblenden. ``` =1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) ``` -Zuerst fügt diese Funktion ein Byte für den Opcode selbst hinzu und sucht dann nach `PUSH`. Push-Opcodes sind besonders, da sie zusätzliche Bytes für den Wert benötigen, der gepusht wird. Wenn der Opcode ein `PUSH` ist, extrahieren wir die Anzahl der Bytes und addieren sie. +Zuerst fügt diese Funktion ein Byte für den Opcode selbst hinzu und sucht dann nach `PUSH`. Push-Opcodes sind besonders, da sie zusätzliche Bytes für den Wert benötigen, der gepusht wird. Wenn der Opcode ein `PUSH` ist, extrahieren wir die Anzahl der Bytes und fügen diese hinzu. -In `A1` setzen Sie den ersten Offset, Null. Geben Sie dann in `A2` diese Funktion ein und kopieren Sie sie wieder für den Rest der Spalte A: +Tragen Sie in `A1` den ersten Offset ein, also null. Fügen Sie dann in `A2` diese Funktion ein und kopieren Sie sie erneut für den Rest von Spalte A: ``` =dec2hex(hex2dec(A1)+B1) ``` -Wir benötigen diese Funktion, um den hexadezimalen Wert zu erhalten, da die Werte, die vor Sprüngen (`JUMP` und `JUMPI`) gepusht werden, in hexadezimaler Form angegeben werden. +Wir benötigen diese Funktion, um uns den hexadezimalen Wert zu liefern, da die Werte, die vor Sprüngen (`JUMP` und `JUMPI`) gepusht werden, uns in hexadezimaler Form vorliegen. ## Der Einstiegspunkt (0x00) {#the-entry-point-0x00} -Contracts werden immer ab dem ersten Byte ausgeführt. Dies ist der erste Teil des Codes: +Smart Contracts werden immer ab dem ersten Byte ausgeführt. Dies ist der anfängliche Teil des Codes: -| Offset | Opcode | Stack (nach dem Opcode) | -| -----: | ------------ | ---------------------------------------------- | -| 0 | PUSH1 0x80 | 0x80 | -| 2 | PUSH1 0x40 | 0x40, 0x80 | -| 4 | MSTORE | Leer | -| 5 | PUSH1 0x04 | 0x04 | -| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | -| 8 | LT | CALLDATASIZE\<4 | -| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 | -| C | JUMPI | Leer | +| Offset | Opcode | Stack (nach dem Opcode) | +| -----: | ------------ | ----------------------- | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | Leer | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE\<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 | +| C | JUMPI | Leer | Dieser Code macht zwei Dinge: -1. Schreibt 0x80 als 32-Byte-Wert in die Speicherstellen 0x40-0x5F (0x80 wird in 0x5F gespeichert, und 0x40-0x5E sind alle Nullen). -2. Liest die Calldata-Größe. Normalerweise folgen die Calldata für einen Ethereum-Contract [dem ABI (Application Binary Interface)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), das mindestens vier Bytes für den Funktions-Selektor erfordert. Wenn die Calldata-Größe kleiner als vier ist, springe zu 0x5E. +1. Schreibt 0x80 als 32-Byte-Wert in die Speicherorte 0x40-0x5F (0x80 wird in 0x5F gespeichert und 0x40-0x5E sind alle Nullen). +2. Liest die Größe der Calldata. Normalerweise folgen die Call-Daten für einen Ethereum-Vertrag [der ABI (Application Binary Interface)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), die mindestens vier Bytes für den Funktionsselektor erfordert. Wenn die Größe der Call-Daten kleiner als vier ist, springe zu 0x5E. -![Flussdiagramm für diesen Abschnitt](flowchart-entry.png) +![Flussdiagramm für diesen Teil](flowchart-entry.png) -### Der Handler bei 0x5E (für Nicht-ABI-Calldata) {#the-handler-at-0x5e-for-non-abi-call-data} +### Der Handler bei 0x5E (für Nicht-ABI-Call-Daten) {#the-handler-at-0x5e-for-non-abi-call-data} | Offset | Opcode | | -----: | ------------ | @@ -72,78 +71,78 @@ Dieser Code macht zwei Dinge: | 60 | PUSH2 0x007c | | 63 | JUMPI | -Dieses Snippet beginnt mit einem `JUMPDEST`. EVM-Programme (Ethereum Virtual Machine) lösen eine Ausnahme aus, wenn Sie zu einem Opcode springen, der nicht `JUMPDEST` ist. Dann prüft er die CALLDATASIZE und springt, wenn sie „wahr“ ist (d. h. nicht null), zu 0x7C. Darauf kommen wir unten zu sprechen. +Dieses Snippet beginnt mit einem `JUMPDEST`. EVM-Programme (Ethereum Virtual Machine) werfen eine Ausnahme, wenn man zu einem Opcode springt, der nicht `JUMPDEST` ist. Dann wird die CALLDATASIZE betrachtet, und wenn sie "wahr" ist (also nicht null), wird zu 0x7C gesprungen. Darauf kommen wir weiter unten zurück. -| Offset | Opcode | Stack (nach Opcode) | -| -----: | ---------- | --------------------------------------------------------------------------------------------------------------------- | -| 64 | CALLVALUE | [Wei](/glossary/#wei), der durch den Aufruf bereitgestellt wird. Wird in Solidity `msg.value` genannt | -| 65 | PUSH1 0x06 | 6 CALLVALUE | -| 67 | PUSH1 0x00 | 0 6 CALLVALUE | -| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | -| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | -| 6B | SLOAD | Speicher[6] CALLVALUE 0 6 CALLVALUE | +| Offset | Opcode | Stack (nach dem Opcode) | +| -----: | ---------- | ------------------------------------------------------------------------------------------ | +| 64 | CALLVALUE | [Wei](/glossary/#wei), die durch den Aufruf bereitgestellt werden. In Solidity `msg.value` genannt | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | -Wenn es also keine Calldata gibt, lesen wir den Wert von Speicher[6]. Wir wissen noch nicht, was dieser Wert ist, aber wir können nach Transaktionen suchen, die der Contract ohne Calldata erhalten hat. Transaktionen, die nur ETH ohne Calldata (und damit ohne Methode) übertragen, haben in Etherscan die Methode `Transfer`. Tatsächlich ist [die allererste Transaktion, die der Contract erhalten hat](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7), ein Transfer. +Wenn es also keine Call-Daten gibt, lesen wir den Wert von Storage[6]. Wir wissen noch nicht, was dieser Wert ist, aber wir können nach Transaktionen suchen, die der Smart Contract ohne Call-Daten empfangen hat. Transaktionen, die einfach nur ETH ohne Call-Daten (und daher ohne Methode) übertragen, haben in Etherscan die Methode `Transfer`. Tatsächlich ist [die allererste Transaktion, die der Vertrag empfangen hat](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7), eine Überweisung. -Wenn wir uns diese Transaktion ansehen und auf **Click to see More** klicken, sehen wir, dass die Calldata, als Input Data bezeichnet, tatsächlich leer sind (`0x`). Beachten Sie auch, dass der Wert 1,559 ETH beträgt, was später relevant sein wird. +Wenn wir uns diese Transaktion ansehen und auf **Click to see More** klicken, sehen wir, dass die Call-Daten, auch Eingabedaten genannt, tatsächlich leer sind (`0x`). Beachten Sie auch, dass der Wert 1,559 ETH beträgt, was später noch relevant sein wird. -![Die Calldata sind leer](calldata-empty.png) +![Die Call-Daten sind leer](calldata-empty.png) -Klicken Sie als Nächstes auf den Tab **State** und erweitern Sie den Contract, den wir per Reverse Engineering analysieren (0x2510...). Sie können sehen, dass sich `Speicher[6]` während der Transaktion geändert hat, und wenn Sie Hex auf **Number** ändern, sehen Sie, dass es 1.559.000.000.000.000.000 wurde, der in Wei übertragene Wert (ich habe die Kommas zur besseren Lesbarkeit hinzugefügt), der dem nächsten Contract-Wert entspricht. +Klicken Sie als Nächstes auf den Tab **State** und erweitern Sie den Smart Contract, den wir per Reverse Engineering untersuchen (0x2510...). Sie können sehen, dass sich `Storage[6]` während der Transaktion geändert hat, und wenn Sie Hex in **Number** ändern, sehen Sie, dass es zu 1.559.000.000.000.000.000 wurde, dem in Wei übertragenen Wert (ich habe die Punkte zur besseren Übersichtlichkeit hinzugefügt), was dem nächsten Vertragswert entspricht. -![Die Änderung in Speicher[6]](storage6.png) +![Die Änderung in Storage[6]](storage6.png) -Wenn wir uns die Zustandsänderungen ansehen, die durch [andere `Transfer`-Transaktionen aus demselben Zeitraum](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) verursacht wurden, sehen wir, dass `Speicher[6]` den Wert des Contracts eine Zeit lang nachverfolgt hat. Vorerst nennen wir es `Wert*`. Das Sternchen (`*`) erinnert uns daran, dass wir noch nicht _wissen_, was diese Variable tut, aber sie kann nicht nur dazu dienen, den Contract-Wert zu verfolgen, da es nicht nötig ist, Speicher zu verwenden, der sehr teuer ist, wenn man den Kontostand seines Accounts mit `ADDRESS BALANCE` abrufen kann. Der erste Opcode pusht die eigene Adresse des Contracts. Der zweite liest die Adresse an der Spitze des Stacks und ersetzt sie durch das Guthaben dieser Adresse. +Wenn wir uns die Statusänderungen ansehen, die durch [andere `Transfer`-Transaktionen aus demselben Zeitraum](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) verursacht wurden, sehen wir, dass `Storage[6]` den Wert des Vertrags eine Zeit lang verfolgt hat. Für den Moment nennen wir es `Value*`. Das Sternchen (`*`) erinnert uns daran, dass wir noch nicht _wissen_, was diese Variable tut, aber sie kann nicht nur dazu dienen, den Vertragswert zu verfolgen, da es nicht nötig ist, den sehr teuren Speicher (Storage) zu verwenden, wenn man das Kontoguthaben mit `ADDRESS BALANCE` abrufen kann. Der erste Opcode pusht die eigene Adresse des Vertrags. Der zweite liest die Adresse oben auf dem Stack und ersetzt sie durch das Guthaben dieser Adresse. -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------ | -| 6C | PUSH2 0x0075 | 0x75 Wert\* CALLVALUE 0 6 CALLVALUE | -| 6F | SWAP2 | CALLVALUE Wert\* 0x75 0 6 CALLVALUE | -| 70 | SWAP1 | Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 71 | PUSH2 0x01a7 | 0x01A7 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 74 | JUMP | | +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------- | +| 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE | +| 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE | +| 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 74 | JUMP | -Wir werden diesen Code am Sprungziel weiterverfolgen. +Wir werden diesen Code am Sprungziel weiter verfolgen. -| Offset | Opcode | Stack | -| -----: | ---------- | ---------------------------------------------------------- | -| 1A7 | JUMPDEST | Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1A8 | PUSH1 0x00 | 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1AA | DUP3 | CALLVALUE 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| Offset | Opcode | Stack | +| -----: | ---------- | ----------------------------------------------------------- | +| 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | -Das `NOT` ist bitweise, also kehrt es den Wert jedes Bits im Aufrufwert um. +Das `NOT` ist bitweise, es kehrt also den Wert jedes Bits im Call-Wert um. -| Offset | Opcode | Stack | -| -----: | ------------ | ---------------------------------------------------------------------------------------------------- | -| 1AC | DUP3 | Wert\* 2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1AD | GT | Wert\*>2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1AE | ISZERO | Wert\*\<=2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1AF | PUSH2 0x01df | 0x01DF Wert\*\<=2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1B2 | JUMPI | | +| Offset | Opcode | Stack | +| -----: | ------------ | --------------------------------------------------------------------------- | +| 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AE | ISZERO | Value\*\<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AF | PUSH2 0x01df | 0x01DF Value\*\<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1B2 | JUMPI | -Wir springen, wenn `Wert*` kleiner oder gleich 2^256-CALLVALUE-1 ist. Das sieht nach einer Logik zur Vermeidung von Überläufen aus. Und tatsächlich sehen wir, dass der Contract nach ein paar unsinnigen Operationen (z. B. das Schreiben in den Speicher, der gleich gelöscht wird) bei Offset 0x01DE zurückgesetzt wird, wenn der Überlauf erkannt wird, was ein normales Verhalten ist. +Wir springen, wenn `Value*` kleiner als 2^256-CALLVALUE-1 oder gleich groß ist. Dies sieht nach einer Logik zur Vermeidung eines Überlaufs aus. Und tatsächlich sehen wir, dass nach ein paar unsinnigen Operationen (das Schreiben in den Arbeitsspeicher wird zum Beispiel gleich gelöscht) bei Offset 0x01DE der Smart Contract rückgängig gemacht wird (reverts), wenn der Überlauf erkannt wird, was ein normales Verhalten ist. -Beachten Sie, dass ein solcher Überlauf extrem unwahrscheinlich ist, da der Aufrufwert plus `Wert*` vergleichbar mit 2^256 Wei sein müsste, was etwa 10^59 ETH entspricht. [Die gesamte ETH-Menge beträgt zum Zeitpunkt der Erstellung dieses Artikels weniger als zweihundert Millionen](https://etherscan.io/stat/supply). +Beachten Sie, dass ein solcher Überlauf extrem unwahrscheinlich ist, da der Call-Wert plus `Value*` vergleichbar mit 2^256 Wei sein müsste, also etwa 10^59 ETH. [Das gesamte ETH-Angebot liegt zum Zeitpunkt des Schreibens bei weniger als zweihundert Millionen](https://etherscan.io/stat/supply). -| Offset | Opcode | Stack | -| -----: | -------- | ---------------------------------------- | -| 1DF | JUMPDEST | 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1E0 | POP | Wert\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1E1 | ADD | Wert\*+CALLVALUE 0x75 0 6 CALLVALUE | -| 1E2 | SWAP1 | 0x75 Wert\*+CALLVALUE 0 6 CALLVALUE | -| 1E3 | JUMP | | +| Offset | Opcode | Stack | +| -----: | -------- | ----------------------------------------- | +| 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE | +| 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE | +| 1E3 | JUMP | -Wenn wir hier angekommen sind, erhalten wir `Wert* + CALLVALUE` und springen zu Offset 0x75. +Wenn wir hier angekommen sind, holen wir uns `Value* + CALLVALUE` und springen zu Offset 0x75. -| Offset | Opcode | Stack | -| -----: | -------- | ------------------------------ | -| 75 | JUMPDEST | Wert\*+CALLVALUE 0 6 CALLVALUE | -| 76 | SWAP1 | 0 Wert\*+CALLVALUE 6 CALLVALUE | -| 77 | SWAP2 | 6 Wert\*+CALLVALUE 0 CALLVALUE | -| 78 | SSTORE | 0 CALLVALUE | +| Offset | Opcode | Stack | +| -----: | -------- | ------------------------------- | +| 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE | +| 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE | +| 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | -Wenn wir hier ankommen (was leere Calldata voraussetzt), addieren wir den Aufrufwert zu `Wert*`. Dies stimmt mit dem überein, was `Transfer`-Transaktionen laut unserer Aussage tun. +Wenn wir hier ankommen (was voraussetzt, dass die Call-Daten leer sind), addieren wir den Call-Wert zu `Value*`. Dies stimmt mit dem überein, was wir über die Funktionsweise von `Transfer`-Transaktionen gesagt haben. | Offset | Opcode | | -----: | ------ | @@ -151,151 +150,151 @@ Wenn wir hier ankommen (was leere Calldata voraussetzt), addieren wir den Aufruf | 7A | POP | | 7B | STOP | -Leeren Sie schließlich den Stack (was nicht notwendig ist) und signalisieren Sie das erfolgreiche Ende der Transaktion. +Schließlich wird der Stack geleert (was nicht notwendig ist) und das erfolgreiche Ende der Transaktion signalisiert. -Zusammenfassend finden Sie hier ein Flussdiagramm für den ursprünglichen Code. +Zusammenfassend ist hier ein Flussdiagramm für den anfänglichen Code. -![Flussdiagramm für den Einstiegspunkt](flowchart-entry.png) +![Flussdiagramm des Einstiegspunkts](flowchart-entry.png) ## Der Handler bei 0x7C {#the-handler-at-0x7c} -Ich habe absichtlich nicht in die Überschrift geschrieben, was dieser Handler tut. Der Punkt ist nicht, Ihnen beizubringen, wie dieser spezielle Contract funktioniert, sondern wie man Contracts per Reverse Engineering analysiert. Sie werden auf die gleiche Weise wie ich lernen, was er tut, indem Sie dem Code folgen. +Ich habe absichtlich nicht in die Überschrift geschrieben, was dieser Handler tut. Es geht nicht darum, Ihnen beizubringen, wie dieser spezifische Smart Contract funktioniert, sondern wie man Smart Contracts per Reverse Engineering analysiert. Sie werden auf dieselbe Weise lernen, was er tut, wie ich es getan habe: indem Sie dem Code folgen. Wir gelangen von mehreren Stellen hierher: -- Wenn Calldata von 1, 2 oder 3 Bytes vorhanden sind (von Offset 0x63) -- Wenn die Methodensignatur unbekannt ist (von Offsets 0x42 und 0x5D) +- Wenn es Aufrufdaten (Call Data) von 1, 2 oder 3 Bytes gibt (von Offset 0x63) +- Wenn die Methodensignatur unbekannt ist (von den Offsets 0x42 und 0x5D) -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------------------------------------- | -| 7C | JUMPDEST | | -| 7D | PUSH1 0x00 | 0x00 | -| 7F | PUSH2 0x009d | 0x9D 0x00 | -| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | -| 84 | SLOAD | Speicher[3] 0x9D 0x00 | +| Offset | Opcode | Stack | +| -----: | ------------ | -------------------- | +| 7C | JUMPDEST | +| 7D | PUSH1 0x00 | 0x00 | +| 7F | PUSH2 0x009d | 0x9D 0x00 | +| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | +| 84 | SLOAD | Storage[3] 0x9D 0x00 | -Dies ist eine weitere Speicherzelle, die ich in keiner Transaktion finden konnte, so dass es schwieriger ist zu wissen, was sie bedeutet. Der folgende Code wird dies verdeutlichen. +Dies ist eine weitere Speicherzelle, die ich in keinen Transaktionen finden konnte, weshalb es schwieriger ist zu wissen, was sie bedeutet. Der untenstehende Code wird dies klarer machen. -| Offset | Opcode | Stack | -| -----: | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Speicher[3] 0x9D 0x00 | -| 9A | AND | Speicher[3]-als-Adresse 0x9D 0x00 | +| Offset | Opcode | Stack | +| -----: | ------------------------------------------------- | ------------------------------- | +| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | +| 9A | AND | Storage[3]-as-address 0x9D 0x00 | -Diese Opcodes kürzen den Wert, den wir aus Speicher[3] lesen, auf 160 Bit, die Länge einer Ethereum-Adresse. +Diese Opcodes kürzen den Wert, den wir aus Storage[3] lesen, auf 160 Bits, die Länge einer Ethereum-Adresse. -| Offset | Opcode | Stack | -| -----: | ------ | ------------------------------------------------------------------------------------- | -| 9B | SWAP1 | 0x9D Speicher[3]-als-Adresse 0x00 | -| 9C | JUMP | Speicher[3]-als-Adresse 0x00 | +| Offset | Opcode | Stack | +| -----: | ------ | ------------------------------- | +| 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | +| 9C | JUMP | Storage[3]-as-address 0x00 | -Dieser Sprung ist überflüssig, da wir zum nächsten Opcode gehen. Dieser Code ist bei weitem nicht so gas-effizient, wie er sein könnte. +Dieser Sprung ist überflüssig, da wir zum nächsten Opcode übergehen. Dieser Code ist bei weitem nicht so gas-effizient, wie er sein könnte. -| Offset | Opcode | Stack | -| -----: | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| 9D | JUMPDEST | Speicher[3]-als-Adresse 0x00 | -| 9E | SWAP1 | 0x00 Speicher[3]-als-Adresse | -| 9F | POP | Speicher[3]-als-Adresse | -| A0 | PUSH1 0x40 | 0x40 Speicher[3]-als-Adresse | -| A2 | MLOAD | Mem[0x40] Speicher[3]-als-Adresse | +| Offset | Opcode | Stack | +| -----: | ---------- | ------------------------------- | +| 9D | JUMPDEST | Storage[3]-as-address 0x00 | +| 9E | SWAP1 | 0x00 Storage[3]-as-address | +| 9F | POP | Storage[3]-as-address | +| A0 | PUSH1 0x40 | 0x40 Storage[3]-as-address | +| A2 | MLOAD | Mem[0x40] Storage[3]-as-address | -Ganz am Anfang des Codes setzen wir Mem[0x40] auf 0x80. Wenn wir später nach 0x40 suchen, sehen wir, dass wir es nicht ändern - wir können also davon ausgehen, dass es 0x80 ist. +Ganz am Anfang des Codes haben wir Mem[0x40] auf 0x80 gesetzt. Wenn wir später nach 0x40 suchen, sehen wir, dass wir es nicht ändern – wir können also davon ausgehen, dass es 0x80 ist. -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------------------------------------------------------------------- | -| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Speicher[3]-als-Adresse | -| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Speicher[3]-als-Adresse | -| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Speicher[3]-als-Adresse | -| A7 | CALLDATACOPY | 0x80 Speicher[3]-als-Adresse | +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------- | +| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Storage[3]-as-address | +| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | +| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | +| A7 | CALLDATACOPY | 0x80 Storage[3]-as-address | -Kopieren Sie alle Calldata in den Speicher, beginnend bei 0x80. +Kopiere alle Aufrufdaten in den Speicher, beginnend bei 0x80. -| Offset | Opcode | Stack | -| -----: | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| A8 | PUSH1 0x00 | 0x00 0x80 Speicher[3]-als-Adresse | -| AA | DUP1 | 0x00 0x00 0x80 Speicher[3]-als-Adresse | -| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | -| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | -| AD | DUP6 | Speicher[3]-als-Adresse 0x80 CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | -| AE | GAS | GAS Speicher[3]-als-Adresse 0x80 CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | -| AF | DELEGATE_CALL | | +| Offset | Opcode | Stack | +| -----: | ------------- | -------------------------------------------------------------------------------- | +| A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address | +| AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address | +| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AD | DUP6 | Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AE | GAS | GAS Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AF | DELEGATE_CALL | -Jetzt sind die Dinge viel klarer. Dieser Contract kann als [Proxy](https://blog.openzeppelin.com/proxy-patterns/) fungieren und die Adresse in Speicher[3] aufrufen, um die eigentliche Arbeit zu erledigen. `DELEGATE_CALL` ruft einen separaten Contract auf, bleibt aber im selben Speicher. Das bedeutet, dass der delegierte Contract, für den wir ein Proxy sind, auf denselben Speicherplatz zugreift. Die Parameter für den Aufruf sind: +Jetzt sind die Dinge viel klarer. Dieser Smart Contract kann als [Proxy](https://blog.openzeppelin.com/proxy-patterns/) fungieren und die Adresse in Storage[3] aufrufen, um die eigentliche Arbeit zu erledigen. `DELEGATE_CALL` ruft einen separaten Smart Contract auf, bleibt aber im selben Speicher (Storage). Das bedeutet, dass der delegierte Smart Contract, für den wir ein Proxy sind, auf denselben Speicherplatz zugreift. Die Parameter für den Aufruf sind: - _Gas_: Das gesamte verbleibende Gas -- _Aufgerufene Adresse_: Speicher[3]-als-Adresse -- _Calldata_: Die CALLDATASIZE-Bytes, die bei 0x80 beginnen, wo wir die ursprünglichen Calldata platziert haben +- _Aufgerufene Adresse_: Storage[3]-as-address +- _Aufrufdaten_: Die CALLDATASIZE-Bytes beginnend bei 0x80, wo wir die ursprünglichen Aufrufdaten abgelegt haben - _Rückgabedaten_: Keine (0x00 - 0x00) Wir erhalten die Rückgabedaten auf andere Weise (siehe unten) -| Offset | Opcode | Stack | -| -----: | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| B0 | RETURNDATASIZE | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B5 | RETURNDATACOPY | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| Offset | Opcode | Stack | +| -----: | -------------- | --------------------------------------------------------------------------------------------- | +| B0 | RETURNDATASIZE | RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B5 | RETURNDATACOPY | RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | Hier kopieren wir alle Rückgabedaten in den Speicherpuffer, beginnend bei 0x80. -| Offset | Opcode | Stack | -| -----: | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| B6 | DUP2 | (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B7 | DUP1 | (((Aufruf erfolgreich/fehlgeschlagen))) (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B8 | ISZERO | (((ist der Aufruf fehlgeschlagen))) (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| B9 | PUSH2 0x00c0 | 0xC0 (((ist der Aufruf fehlgeschlagen))) (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| BC | JUMPI | (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| BD | DUP2 | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| BE | DUP5 | 0x80 RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| BF | RETURN | | +| Offset | Opcode | Stack | +| -----: | ------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| B6 | DUP2 | (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B7 | DUP1 | (((Aufruf Erfolg/Fehlschlag))) (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B8 | ISZERO | (((ist der Aufruf fehlgeschlagen))) (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| B9 | PUSH2 0x00c0 | 0xC0 (((ist der Aufruf fehlgeschlagen))) (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| BC | JUMPI | (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| BD | DUP2 | RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| BE | DUP5 | 0x80 RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| BF | RETURN | | -Nach dem Aufruf kopieren wir also die Rückgabedaten in den Puffer 0x80 - 0x80+RETURNDATASIZE, und wenn der Aufruf erfolgreich ist, führen wir `RETURN` mit genau diesem Puffer aus. +Nach dem Aufruf kopieren wir also die Rückgabedaten in den Puffer 0x80 - 0x80+RETURNDATASIZE, und wenn der Aufruf erfolgreich ist, führen wir ein `RETURN` mit genau diesem Puffer aus. ### DELEGATECALL fehlgeschlagen {#delegatecall-failed} -Wenn wir hier, bei 0xC0, ankommen, bedeutet das, dass der aufgerufene Contract zurückgesetzt wurde. Da wir nur ein Proxy für diesen Contract sind, wollen wir dieselben Daten zurückgeben und ebenfalls zurücksetzen. +Wenn wir hierher gelangen, zu 0xC0, bedeutet das, dass der aufgerufene Smart Contract revertiert (rückgängig gemacht) wurde. Da wir nur ein Proxy für diesen Smart Contract sind, möchten wir dieselben Daten zurückgeben und ebenfalls revertieren. -| Offset | Opcode | Stack | -| -----: | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| C0 | JUMPDEST | (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| C1 | DUP2 | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| C2 | DUP5 | 0x80 RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | -| C3 | REVERT | | +| Offset | Opcode | Stack | +| -----: | -------- | ------------------------------------------------------------------------------------------------------------------- | +| C0 | JUMPDEST | (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| C1 | DUP2 | RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| C2 | DUP5 | 0x80 RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) RETURNDATASIZE (((Aufruf Erfolg/Fehlschlag))) 0x80 Storage[3]-as-address | +| C3 | REVERT | -Wir führen also `REVERT` mit demselben Puffer aus, den wir zuvor für `RETURN` verwendet haben: 0x80 - 0x80+RETURNDATASIZE +Wir führen also ein `REVERT` mit demselben Puffer aus, den wir zuvor für `RETURN` verwendet haben: 0x80 - 0x80+RETURNDATASIZE -![Aufruf an Proxy-Flussdiagramm](flowchart-proxy.png) +![Flussdiagramm für Proxy-Aufruf](flowchart-proxy.png) ## ABI-Aufrufe {#abi-calls} -Wenn die Calldata-Größe vier Bytes oder mehr beträgt, könnte dies ein gültiger ABI-Aufruf sein. +Wenn die Größe der Aufrufdaten (Call Data) vier Bytes oder mehr beträgt, könnte dies ein gültiger ABI-Aufruf sein. -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------------------------------------------------------------------------------------- | -| D | PUSH1 0x00 | 0x00 | -| F | CALLDATALOAD | (((Erstes Wort (256 Bit) der Calldata))) | -| 10 | PUSH1 0xe0 | 0xE0 (((Erstes Wort (256 Bit) der Calldata))) | -| 12 | SHR | (((erste 32 Bits (4 Bytes) der Calldata))) | +| Offset | Opcode | Stack | +| -----: | ------------ | ---------------------------------------------------- | +| D | PUSH1 0x00 | 0x00 | +| F | CALLDATALOAD | (((Erstes Wort (256 Bits) der Aufrufdaten))) | +| 10 | PUSH1 0xe0 | 0xE0 (((Erstes Wort (256 Bits) der Aufrufdaten))) | +| 12 | SHR | (((erste 32 Bits (4 Bytes) der Aufrufdaten))) | -Etherscan teilt uns mit, dass `1C` ein unbekannter Opcode ist, da [er hinzugefügt wurde, nachdem Etherscan diese Funktion geschrieben hat](https://eips.ethereum.org/EIPS/eip-145) und sie sie nicht aktualisiert haben. Eine [aktuelle Opcode-Tabelle](https://github.com/wolflo/evm-opcodes) zeigt uns, dass dies eine Rechtsverschiebung ist +Etherscan teilt uns mit, dass `1C` ein unbekannter Opcode ist, da [er hinzugefügt wurde, nachdem Etherscan diese Funktion geschrieben hat](https://eips.ethereum.org/EIPS/eip-145), und sie ihn noch nicht aktualisiert haben. Eine [aktuelle Opcode-Tabelle](https://github.com/wolflo/evm-opcodes) zeigt uns, dass dies eine Rechtsverschiebung (Shift Right) ist. -| Offset | Opcode | Stack | -| -----: | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 13 | DUP1 | (((erste 32 Bits (4 Bytes) der Calldata))) (((erste 32 Bits (4 Bytes) der Calldata))) | -| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((erste 32 Bits (4 Bytes) der Calldata))) (((erste 32 Bits (4 Bytes) der Calldata))) | -| 19 | GT | 0x3CD8045E>erste-32-Bits-der-Calldata (((erste 32 Bits (4 Bytes) der Calldata))) | -| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>erste-32-Bits-der-Calldata (((erste 32 Bits (4 Bytes) der Calldata))) | -| 1D | JUMPI | (((erste 32 Bits (4 Bytes) der Calldata))) | +| Offset | Opcode | Stack | +| -----: | ---------------- | ----------------------------------------------------------------------------------------------------------- | +| 13 | DUP1 | (((erste 32 Bits (4 Bytes) der Aufrufdaten))) (((erste 32 Bits (4 Bytes) der Aufrufdaten))) | +| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((erste 32 Bits (4 Bytes) der Aufrufdaten))) (((erste 32 Bits (4 Bytes) der Aufrufdaten))) | +| 19 | GT | 0x3CD8045E>erste-32-Bits-der-Aufrufdaten (((erste 32 Bits (4 Bytes) der Aufrufdaten))) | +| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>erste-32-Bits-der-Aufrufdaten (((erste 32 Bits (4 Bytes) der Aufrufdaten))) | +| 1D | JUMPI | (((erste 32 Bits (4 Bytes) der Aufrufdaten))) | -Indem die Tests zum Abgleich der Methodensignatur auf diese Weise in zwei Teile aufgeteilt werden, wird im Durchschnitt die Hälfte der Tests eingespart. Der Code, der unmittelbar darauf folgt, und der Code in 0x43 folgen demselben Muster: `DUP1` die ersten 32 Bits der Calldata, `PUSH4 (((Methodensignatur>`, `EQ` ausführen, um auf Gleichheit zu prüfen, und dann `JUMPI`, wenn die Methodensignatur übereinstimmt. Hier sind die Methodensignaturen, ihre Adressen und, falls bekannt, [die entsprechende Methodendefinition](https://www.4byte.directory/): +Durch die Zweiteilung der Tests zum Abgleich der Methodensignatur auf diese Weise wird im Durchschnitt die Hälfte der Tests eingespart. Der unmittelbar darauf folgende Code und der Code in 0x43 folgen demselben Muster: `DUP1` die ersten 32 Bits der Aufrufdaten, `PUSH4 (((Methodensignatur>`, `EQ` ausführen, um auf Gleichheit zu prüfen, und dann `JUMPI`, wenn die Methodensignatur übereinstimmt. Hier sind die Methodensignaturen, ihre Adressen und, falls bekannt, [die entsprechende Methodendefinition](https://www.4byte.directory/): -| Methode | Methodensignatur | Offset, zu dem gesprungen wird | -| --------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------ | -| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 | -| ??? | 0x81e580d3 | 0x0138 | -| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 | -| ??? | 0x1f135823 | 0x00C4 | -| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED | +| Methode | Methodensignatur | Offset zum Hineinspringen | +| -------------------------------------------------------------------------------------- | ---------------- | ------------------------- | +| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 | +| ??? | 0x81e580d3 | 0x0138 | +| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 | +| ??? | 0x1f135823 | 0x00C4 | +| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED | -Wenn keine Übereinstimmung gefunden wird, springt der Code zum [Proxy-Handler bei 0x7C](#the-handler-at-0x7c) in der Hoffnung, dass der Contract, für den wir ein Proxy sind, eine Übereinstimmung hat. +Wenn keine Übereinstimmung gefunden wird, springt der Code zum [Proxy-Handler bei 0x7C](#the-handler-at-0x7c), in der Hoffnung, dass der Vertrag, für den wir ein Proxy sind, eine Übereinstimmung aufweist. ![Flussdiagramm der ABI-Aufrufe](flowchart-abi.png) @@ -303,7 +302,7 @@ Wenn keine Übereinstimmung gefunden wird, springt der Code zum [Proxy-Handler b | Offset | Opcode | Stack | | -----: | ------------ | ----------------------------- | -| 103 | JUMPDEST | | +| 103 | JUMPDEST | | 104 | CALLVALUE | CALLVALUE | | 105 | DUP1 | CALLVALUE CALLVALUE | | 106 | ISZERO | CALLVALUE==0 CALLVALUE | @@ -311,24 +310,24 @@ Wenn keine Übereinstimmung gefunden wird, springt der Code zum [Proxy-Handler b | 10A | JUMPI | CALLVALUE | | 10B | PUSH1 0x00 | 0x00 CALLVALUE | | 10D | DUP1 | 0x00 0x00 CALLVALUE | -| 10E | REVERT | | - -Als Erstes prüft diese Funktion, ob der Aufruf keine ETH gesendet hat. Diese Funktion ist nicht [`payable`](https://solidity-by-example.org/payable/). Wenn uns jemand ETH geschickt hat, muss das ein Fehler sein und wir wollen `REVERT` ausführen, um zu vermeiden, dass diese ETH dort sind, wo sie sie nicht zurückbekommen können. - -| Offset | Opcode | Stack | -| -----: | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 10F | JUMPDEST | | -| 110 | POP | | -| 111 | PUSH1 0x03 | 0x03 | -| 113 | SLOAD | (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | -| 114 | PUSH1 0x40 | 0x40 (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | -| 116 | MLOAD | 0x80 (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | -| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | -| 12C | SWAP1 | 0x80 0xFF...FF (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | -| 12D | SWAP2 | (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) 0xFF...FF 0x80 | -| 12E | AND | ProxyAddr 0x80 | -| 12F | DUP2 | 0x80 ProxyAddr 0x80 | -| 130 | MSTORE | 0x80 | +| 10E | REVERT | + +Das Erste, was diese Funktion tut, ist zu überprüfen, ob der Aufruf kein ETH gesendet hat. Diese Funktion ist nicht [`payable`](https://solidity-by-example.org/payable/). Wenn uns jemand ETH gesendet hat, muss das ein Fehler sein, und wir wollen ein `REVERT` ausführen, um zu vermeiden, dass dieses ETH dort liegt, wo sie es nicht zurückbekommen können. + +| Offset | Opcode | Stack | +| -----: | ------------------------------------------------- | --------------------------------------------------------------------------- | +| 10F | JUMPDEST | +| 110 | POP | +| 111 | PUSH1 0x03 | 0x03 | +| 113 | SLOAD | (((Storage[3] d. h. der Vertrag, für den wir ein Proxy sind))) | +| 114 | PUSH1 0x40 | 0x40 (((Storage[3] d. h. der Vertrag, für den wir ein Proxy sind))) | +| 116 | MLOAD | 0x80 (((Storage[3] d. h. der Vertrag, für den wir ein Proxy sind))) | +| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3] d. h. der Vertrag, für den wir ein Proxy sind))) | +| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3] d. h. der Vertrag, für den wir ein Proxy sind))) | +| 12D | SWAP2 | (((Storage[3] d. h. der Vertrag, für den wir ein Proxy sind))) 0xFF...FF 0x80 | +| 12E | AND | ProxyAddr 0x80 | +| 12F | DUP2 | 0x80 ProxyAddr 0x80 | +| 130 | MSTORE | 0x80 | Und 0x80 enthält nun die Proxy-Adresse @@ -341,7 +340,7 @@ Und 0x80 enthält nun die Proxy-Adresse ### Der E4-Code {#the-e4-code} -Wir sehen diese Zeilen zum ersten Mal, aber sie werden mit anderen Methoden geteilt (siehe unten). Wir nennen den Wert im Stack also X und merken uns nur, dass in `splitter()` der Wert dieses X 0xA0 ist. +Dies ist das erste Mal, dass wir diese Zeilen sehen, aber sie werden mit anderen Methoden geteilt (siehe unten). Wir nennen den Wert im Stack also X und merken uns einfach, dass der Wert dieses X in `splitter()` 0xA0 ist. | Offset | Opcode | Stack | | -----: | ---------- | ----------- | @@ -352,29 +351,29 @@ Wir sehen diese Zeilen zum ersten Mal, aber sie werden mit anderen Methoden gete | E9 | SWAP2 | X 0x80 0x80 | | EA | SUB | X-0x80 0x80 | | EB | SWAP1 | 0x80 X-0x80 | -| EC | RETURN | | +| EC | RETURN | -Dieser Code empfängt also einen Speicherzeiger im Stack (X) und veranlasst den Contract, mit einem Puffer, der 0x80 - X ist, `RETURN` auszuführen. +Dieser Code empfängt also einen Speicherzeiger im Stack (X) und veranlasst den Vertrag, ein `RETURN` mit einem Puffer von 0x80 - X auszuführen. -Im Fall von `splitter()` wird die Adresse zurückgegeben, für die wir ein Proxy sind. `RETURN` gibt den Puffer in 0x80-0x9F zurück, wo wir diese Daten geschrieben haben (Offset 0x130 oben). +Im Fall von `splitter()` gibt dies die Adresse zurück, für die wir ein Proxy sind. `RETURN` gibt den Puffer in 0x80-0x9F zurück, in den wir diese Daten geschrieben haben (Offset 0x130 oben). ## currentWindow() {#currentwindow} -Der Code in den Offsets 0x158-0x163 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (außer dem `JUMPI`-Ziel), also wissen wir, dass `currentWindow()` auch nicht `payable` ist. +Der Code in den Offsets 0x158-0x163 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (abgesehen vom `JUMPI`-Ziel), also wissen wir, dass `currentWindow()` ebenfalls nicht `payable` ist. -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------------------------------------- | -| 164 | JUMPDEST | | -| 165 | POP | | -| 166 | PUSH2 0x00da | 0xDA | -| 169 | PUSH1 0x01 | 0x01 0xDA | -| 16B | SLOAD | Speicher[1] 0xDA | -| 16C | DUP2 | 0xDA Speicher[1] 0xDA | -| 16D | JUMP | Speicher[1] 0xDA | +| Offset | Opcode | Stack | +| -----: | ------------ | -------------------- | +| 164 | JUMPDEST | +| 165 | POP | +| 166 | PUSH2 0x00da | 0xDA | +| 169 | PUSH1 0x01 | 0x01 0xDA | +| 16B | SLOAD | Storage[1] 0xDA | +| 16C | DUP2 | 0xDA Storage[1] 0xDA | +| 16D | JUMP | Storage[1] 0xDA | ### Der DA-Code {#the-da-code} -Dieser Code wird auch von anderen Methoden verwendet. Wir nennen den Wert im Stack also Y und merken uns nur, dass in `currentWindow()` der Wert dieses Y Speicher[1] ist. +Dieser Code wird auch von anderen Methoden verwendet. Wir nennen den Wert im Stack also Y und merken uns einfach, dass in `currentWindow()` der Wert dieses Y Storage[1] ist. | Offset | Opcode | Stack | | -----: | ---------- | ---------------- | @@ -385,55 +384,55 @@ Dieser Code wird auch von anderen Methoden verwendet. Wir nennen den Wert im Sta | DF | DUP2 | 0x80 Y 0x80 0xDA | | E0 | MSTORE | 0x80 0xDA | -Schreiben Sie Y nach 0x80-0x9F. +Schreibe Y nach 0x80-0x9F. | Offset | Opcode | Stack | | -----: | ---------- | -------------- | | E1 | PUSH1 0x20 | 0x20 0x80 0xDA | | E3 | ADD | 0xA0 0xDA | -Und der Rest wird bereits [oben](#the-e4-code) erklärt. Sprünge zu 0xDA schreiben also den obersten Stack-Wert (Y) in 0x80-0x9F und geben diesen Wert zurück. Im Fall von `currentWindow()` wird Speicher[1] zurückgegeben. +Und der Rest wurde bereits [oben](#the-e4-code) erklärt. Sprünge zu 0xDA schreiben also die Stack-Spitze (Y) nach 0x80-0x9F und geben diesen Wert zurück. Im Fall von `currentWindow()` wird Storage[1] zurückgegeben. ## merkleRoot() {#merkleroot} Der Code in den Offsets 0xED-0xF8 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (abgesehen vom `JUMPI`-Ziel), also wissen wir, dass `merkleRoot()` ebenfalls nicht `payable` ist. -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------------------------------------- | -| F9 | JUMPDEST | | -| FA | POP | | -| FB | PUSH2 0x00da | 0xDA | -| FE | PUSH1 0x00 | 0x00 0xDA | -| 100 | SLOAD | Speicher[0] 0xDA | -| 101 | DUP2 | 0xDA Speicher[0] 0xDA | -| 102 | JUMP | Speicher[0] 0xDA | +| Offset | Opcode | Stack | +| -----: | ------------ | -------------------- | +| F9 | JUMPDEST | +| FA | POP | +| FB | PUSH2 0x00da | 0xDA | +| FE | PUSH1 0x00 | 0x00 0xDA | +| 100 | SLOAD | Storage[0] 0xDA | +| 101 | DUP2 | 0xDA Storage[0] 0xDA | +| 102 | JUMP | Storage[0] 0xDA | -Was nach dem Sprung passiert, [haben wir bereits herausgefunden](#the-da-code). `merkleRoot()` gibt also Speicher[0] zurück. +Was nach dem Sprung passiert, [haben wir bereits herausgefunden](#the-da-code). Also gibt `merkleRoot()` Storage[0] zurück. ## 0x81e580d3 {#0x81e580d3} Der Code in den Offsets 0x138-0x143 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (abgesehen vom `JUMPI`-Ziel), also wissen wir, dass diese Funktion ebenfalls nicht `payable` ist. -| Offset | Opcode | Stack | -| -----: | ------------ | ------------------------------------------------------------------------------- | -| 144 | JUMPDEST | | -| 145 | POP | | -| 146 | PUSH2 0x00da | 0xDA | -| 149 | PUSH2 0x0153 | 0x0153 0xDA | -| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA | -| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA | -| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA | -| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA | -| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA | -| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 196 | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 197 | SLT | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------ | +| 144 | JUMPDEST | +| 145 | POP | +| 146 | PUSH2 0x00da | 0xDA | +| 149 | PUSH2 0x0153 | 0x0153 0xDA | +| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA | +| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA | +| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA | +| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA | +| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 196 | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 197 | SLT | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | Es sieht so aus, als ob diese Funktion mindestens 32 Bytes (ein Wort) an Calldata benötigt. @@ -441,147 +440,147 @@ Es sieht so aus, als ob diese Funktion mindestens 32 Bytes (ein Wort) an Calldat | -----: | ------ | -------------------------------------------- | | 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 19F | REVERT | | +| 19F | REVERT | -Wenn sie die Calldata nicht erhält, wird die Transaktion ohne Rückgabedaten zurückgesetzt. +Wenn sie die Calldata nicht erhält, wird die Transaktion ohne Rückgabedaten rückgängig gemacht. -Sehen wir uns an, was passiert, wenn die Funktion die benötigten Calldata _doch_ erhält. +Schauen wir uns an, was passiert, wenn die Funktion die benötigten Calldata _tatsächlich_ erhält. -| Offset | Opcode | Stack | -| -----: | ------------ | ----------------------------------------------------------- | -| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | +| Offset | Opcode | Stack | +| -----: | ------------ | ---------------------------------------- | +| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | | 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | -`calldataload(4)` ist das erste Wort der Calldata _nach_ der Methodensignatur - -| Offset | Opcode | Stack | -| -----: | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA | -| 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA | -| 1A5 | POP | 0x0153 calldataload(4) 0xDA | -| 1A6 | JUMP | calldataload(4) 0xDA | -| 153 | JUMPDEST | calldataload(4) 0xDA | -| 154 | PUSH2 0x016e | 0x016E calldataload(4) 0xDA | -| 157 | JUMP | calldataload(4) 0xDA | -| 16E | JUMPDEST | calldataload(4) 0xDA | -| 16F | PUSH1 0x04 | 0x04 calldataload(4) 0xDA | -| 171 | DUP2 | calldataload(4) 0x04 calldataload(4) 0xDA | -| 172 | DUP2 | 0x04 calldataload(4) 0x04 calldataload(4) 0xDA | -| 173 | SLOAD | Speicher[4] calldataload(4) 0x04 calldataload(4) 0xDA | -| 174 | DUP2 | calldataload(4) Speicher[4] calldataload(4) 0x04 calldataload(4) 0xDA | -| 175 | LT | calldataload(4)\)`, und eine andere ist `isClaimed()`, also sieht es wie ein Airdrop-Contract aus. Anstatt den Rest Opcode für Opcode durchzugehen, können wir [den Decompiler ausprobieren](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), der für drei Funktionen aus diesem Contract brauchbare Ergebnisse liefert. Das Reverse Engineering der anderen wird dem Leser als Übung überlassen. +Eine der verbleibenden Methoden ist `claim()` und eine andere ist `isClaimed()`, es sieht also nach einem Airdrop-Vertrag aus. Anstatt den Rest Opcode für Opcode durchzugehen, können wir [den Decompiler ausprobieren](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), der für drei Funktionen aus diesem Vertrag brauchbare Ergebnisse liefert. Das Reverse Engineering der anderen bleibt dem Leser als Übung überlassen. ### scaleAmountByPercentage {#scaleamountbypercentage} -Das gibt uns der Decompiler für diese Funktion aus: +Das liefert uns der Decompiler für diese Funktion: ```python def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: @@ -591,15 +590,15 @@ def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: return (_param1 * _param2 / 100 * 10^6) ``` -Das erste `require` testet, ob die Calldata zusätzlich zu den vier Bytes der Funktionssignatur mindestens 64 Bytes haben, genug für die beiden Parameter. Wenn nicht, dann ist offensichtlich etwas falsch. +Das erste `require` prüft, ob die Aufrufdaten zusätzlich zu den vier Bytes der Funktionssignatur mindestens 64 Bytes umfassen, was für die beiden Parameter ausreicht. Wenn nicht, stimmt offensichtlich etwas nicht. -Die `if`-Anweisung scheint zu prüfen, dass `_param1` nicht Null ist und dass `_param1 * _param2` nicht negativ ist. Es dient wahrscheinlich dazu, Fälle von Wrap-Around zu verhindern. +Die `if`-Anweisung scheint zu überprüfen, ob `_param1` nicht null ist und dass `_param1 * _param2` nicht negativ ist. Dies dient wahrscheinlich dazu, Fälle von Wrap-Around (Überlauf) zu verhindern. Schließlich gibt die Funktion einen skalierten Wert zurück. ### claim {#claim} -Der vom Decompiler erstellte Code ist komplex und nicht alles davon ist für uns relevant. Ich werde einen Teil davon überspringen, um mich auf die Zeilen zu konzentrieren, von denen ich glaube, dass sie nützliche Informationen liefern +Der Code, den der Decompiler erstellt, ist komplex und nicht alles davon ist für uns relevant. Ich werde einen Teil davon überspringen, um mich auf die Zeilen zu konzentrieren, von denen ich glaube, dass sie nützliche Informationen liefern. ```python def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable: @@ -612,8 +611,8 @@ def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _pa Wir sehen hier zwei wichtige Dinge: -- `_param2` ist, obwohl als `uint256` deklariert, tatsächlich eine Adresse -- `_param1` ist das Fenster, das beansprucht wird, und muss `currentWindow` oder früher sein. +- `_param2` ist, obwohl es als `uint256` deklariert ist, tatsächlich eine Adresse +- `_param1` ist das beanspruchte Fenster (Window), das `currentWindow` oder früher sein muss. ```python ... @@ -621,7 +620,7 @@ Wir sehen hier zwei wichtige Dinge: revert with 0, 'Account already claimed the given window' ``` -Jetzt wissen wir also, dass Speicher[5] ein Array von Fenstern und Adressen ist und ob die Adresse die Belohnung für dieses Fenster beansprucht hat. +Jetzt wissen wir also, dass Storage[5] ein Array von Fenstern und Adressen ist und speichert, ob die Adresse die Belohnung für dieses Fenster beansprucht hat. ```python ... @@ -641,7 +640,7 @@ Jetzt wissen wir also, dass Speicher[5] ein Array von Fenstern und Adressen ist revert with 0, 'Invalid proof' ``` -Wir wissen, dass `unknown2eb4a7ab` eigentlich die Funktion `merkleRoot()` ist, also sieht dieser Code so aus, als würde er einen [Merkle-Beweis](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5) verifizieren. Das bedeutet, dass `_param4` ein Merkle-Beweis ist. +Wir wissen, dass `unknown2eb4a7ab` eigentlich die Funktion `merkleRoot()` ist, also sieht dieser Code so aus, als würde er einen [Merkle-Proof](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5) verifizieren. Das bedeutet, dass `_param4` ein Merkle-Proof ist. ```python call addr(_param2) with: @@ -649,7 +648,7 @@ Wir wissen, dass `unknown2eb4a7ab` eigentlich die Funktion `merkleRoot()` ist, a gas 30000 wei ``` -So überträgt ein Contract seine eigenen ETH an eine andere Adresse (Contract oder externer Besitz). Er ruft ihn mit einem Wert auf, der dem zu übertragenden Betrag entspricht. Es sieht also so aus, als ob dies ein Airdrop von ETH ist. +Auf diese Weise überträgt ein Vertrag seine eigenen ETH an eine andere Adresse (Vertrag oder Extern verwaltetes Konto). Er ruft sie mit einem Wert auf, der dem zu übertragenden Betrag entspricht. Es sieht also so aus, als wäre dies ein Airdrop von ETH. ```python if not return_data.size: @@ -659,22 +658,22 @@ So überträgt ein Contract seine eigenen ETH an eine andere Adresse (Contract o value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei ``` -Die unteren beiden Zeilen sagen uns, dass Speicher[2] auch ein Contract ist, den wir aufrufen. Wenn wir uns [die Konstruktor-Transaktion ansehen](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), sehen wir, dass dieser Contract [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2) ist, ein Wrapped Ether-Contract, [dessen Quellcode auf Etherscan hochgeladen wurde](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). +Die unteren beiden Zeilen sagen uns, dass Storage[2] ebenfalls ein Vertrag ist, den wir aufrufen. Wenn wir uns [die Konstruktor-Transaktion ansehen](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), sehen wir, dass dieser Vertrag [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2) ist, ein Wrapped Ether-Vertrag, [dessen Quellcode auf Etherscan hochgeladen wurde](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). -Es sieht also so aus, als ob die Contracts versuchen, ETH an `_param2` zu senden. Wenn er es tun kann, großartig. Wenn nicht, versucht er, [WETH](https://weth.tkn.eth.limo/) zu senden. Wenn `_param2` ein Konto in externem Besitz (EOA) ist, kann es immer ETH empfangen, aber Contracts können den Empfang von ETH verweigern. WETH ist jedoch ERC-20 und Contracts können die Annahme nicht verweigern. +Es sieht also so aus, als ob der Vertrag versucht, ETH an `_param2` zu senden. Wenn er das tun kann, großartig. Wenn nicht, versucht er, [WETH](https://weth.tkn.eth.limo/) zu senden. Wenn `_param2` ein Extern verwaltetes Konto (EOA) ist, kann es immer ETH empfangen, aber Verträge können den Empfang von ETH ablehnen. WETH ist jedoch ERC-20 und Verträge können die Annahme nicht verweigern. ```python ... log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) ``` -Am Ende der Funktion sehen wir, dass ein Log-Eintrag generiert wird. [Sehen Sie sich die generierten Log-Einträge an](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) und filtern Sie nach dem Thema, das mit `0xdbd5...` beginnt. Wenn wir [auf eine der Transaktionen klicken, die einen solchen Eintrag generiert haben](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), sehen wir, dass es tatsächlich wie ein Anspruch aussieht - das Konto hat eine Nachricht an den Contract gesendet, den wir per Reverse Engineering analysieren, und im Gegenzug ETH erhalten. +Am Ende der Funktion sehen wir, dass ein Protokolleintrag (Log) generiert wird. [Sehen Sie sich die generierten Protokolleinträge an](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) und filtern Sie nach dem Thema (Topic), das mit `0xdbd5...` beginnt. Wenn wir [auf eine der Transaktionen klicken, die einen solchen Eintrag generiert haben](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), sehen wir, dass es tatsächlich wie ein Claim aussieht – das Konto hat eine Nachricht an den Vertrag gesendet, den wir per Reverse Engineering untersuchen, und im Gegenzug ETH erhalten. -![Eine Anspruchs-Transaktion](claim-tx.png) +![Eine Claim-Transaktion](claim-tx.png) ### 1e7df9d3 {#1e7df9d3} -Diese Funktion ist sehr ähnlich zu [`claim`](#claim) oben. Es prüft auch einen Merkle-Beweis, versucht ETH auf den ersten zu übertragen und erzeugt die gleiche Art von Log-Eintrag. +Diese Funktion ist der obigen Funktion [`claim`](#claim) sehr ähnlich. Sie überprüft ebenfalls einen Merkle-Proof, versucht, ETH an die erste Adresse zu übertragen, und erzeugt dieselbe Art von Protokolleintrag. ```python def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable: @@ -736,10 +735,10 @@ Der Hauptunterschied besteht darin, dass der erste Parameter, das abzuhebende Fe continue ``` -Es sieht also wie eine `claim`-Variante aus, die alle Fenster beansprucht. +Es sieht also nach einer `claim`-Variante aus, die alle Fenster beansprucht. ## Fazit {#conclusion} -Inzwischen sollten Sie wissen, wie Sie Contracts verstehen können, deren Quellcode nicht verfügbar ist, indem Sie entweder die Opcodes oder (wenn es funktioniert) den Decompiler verwenden. Wie aus der Länge dieses Artikels ersichtlich ist, ist das Reverse Engineering eines Contracts nicht trivial, aber in einem System, in dem Sicherheit unerlässlich ist, ist es eine wichtige Fähigkeit, überprüfen zu können, ob Contracts wie versprochen funktionieren. +Inzwischen sollten Sie wissen, wie man Smart Contracts versteht, deren Quellcode nicht verfügbar ist, indem man entweder die Opcodes oder (wenn es funktioniert) den Decompiler verwendet. Wie aus der Länge dieses Artikels ersichtlich ist, ist das Reverse Engineering eines Smart Contracts nicht trivial, aber in einem System, in dem Sicherheit unerlässlich ist, ist es eine wichtige Fähigkeit, überprüfen zu können, ob Smart Contracts wie versprochen funktionieren. -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md index 1dfe51d8e08..f29112a1fa6 100644 --- a/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md @@ -1,84 +1,84 @@ --- -title: Betreibe einen Ethereum-Node auf einem Raspberry Pi 4 -description: "Flashe deinen Raspberry Pi 4, stecke ein Ethernet-Kabel ein, schließe die SSD-Festplatte an und schalte das Gerät ein, um den Raspberry Pi 4 in einen vollwertigen Ethereum-Node + Validator zu verwandeln" +title: "Einen Ethereum-Blockchain-Knoten auf einem Raspberry Pi 4 ausführen" +description: "Flashen Sie Ihren Raspberry Pi 4, schließen Sie ein Ethernet-Kabel an, verbinden Sie die SSD-Festplatte und schalten Sie das Gerät ein, um den Raspberry Pi 4 in einen vollständigen Ethereum-Blockchain-Knoten + Validator zu verwandeln" author: "EthereumOnArm" -tags: ["clients", "execution layer", "consensus layer", "nodes"] +tags: ["Anwendungen", "Ausführungsebene", "Konsensebene", "Blockchain-Knoten"] lang: de skill: intermediate -breadcrumb: "Raspberry Pi-Node" +breadcrumb: Rasp Pi Blockchain-Knoten published: 2022-06-10 source: Ethereum on ARM sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ --- -**Ethereum on Arm ist ein benutzerdefiniertes Linux-Image, das einen Raspberry Pi in einen Ethereum-Node verwandeln kann.** +**Ethereum on Arm ist ein benutzerdefiniertes Linux-Image, das einen Raspberry Pi in einen Ethereum-Blockchain-Knoten verwandeln kann.** -Um Ethereum on Arm zu verwenden, um einen Raspberry Pi in einen Ethereum-Node zu verwandeln, wird die folgende Hardware empfohlen: +Um Ethereum on Arm zu verwenden, um einen Raspberry Pi in einen Ethereum-Blockchain-Knoten zu verwandeln, wird folgende Hardware empfohlen: -- Raspberry 4 (Modell B 8 GB), Odroid M1 oder Rock 5B (8 GB/16 GB RAM) Platine -- MicroSD-Karte (mindestens 16 GB, Klasse 10) -- Mindestens 2 TB große SSD als USB-3.0-Laufwerk oder eine SSD in einem USB-zu-SATA-Gehäuse. -- Stromversorgung +- Raspberry 4 (Modell B 8GB), Odroid M1 oder Rock 5B (8GB/16GB RAM) Board +- MicroSD-Karte (mindestens 16 GB Class 10) +- Mindestens 2 TB SSD USB 3.0-Festplatte oder eine SSD mit einem USB-zu-SATA-Gehäuse. +- Netzteil - Ethernet-Kabel -- Portweiterleitung (siehe Clients für weitere Informationen) +- Portweiterleitung (siehe Anwendungen für weitere Informationen) - Ein Gehäuse mit Kühlkörper und Lüfter -- USB-Tastatur, Monitor und HDMI-Kabel (Micro-HDMI) (optional) +- USB-Tastatur, Monitor und HDMI-Kabel (Micro-HDMI) (Optional) -## Warum Ethereum auf ARM betreiben? {#why-run-ethereum-on-arm} +## Warum Ethereum auf ARM ausführen? {#why-run-ethereum-on-arm} -ARM-Platinen sind sehr preisgünstige, flexible, kleine Computer. Sie sind eine gute Wahl für den Betrieb von Ethereum-Nodes, weil sie günstig zu erwerben sind, so konfiguriert werden können, dass alle ihre Ressourcen nur auf den Node ausgerichtet sind, was sie effizient macht, sie wenig Strom verbrauchen und physisch klein sind, sodass sie unauffällig in jedes Zuhause passen. Es ist auch sehr einfach, Nodes zu starten, da die MicroSD-Karte des Raspberry Pi einfach mit einem vorgefertigten Image geflasht werden kann, ohne dass Software heruntergeladen oder erstellt werden muss. +ARM-Boards sind sehr erschwingliche, flexible, kleine Computer. Sie sind eine gute Wahl für den Betrieb von Ethereum-Blockchain-Knoten, da sie günstig erworben und so konfiguriert werden können, dass sich all ihre Ressourcen nur auf den Blockchain-Knoten konzentrieren. Das macht sie effizient, sie verbrauchen wenig Strom und sind physisch klein, sodass sie unauffällig in jedes Zuhause passen. Es ist auch sehr einfach, Blockchain-Knoten hochzufahren, da die MicroSD des Raspberry Pi einfach mit einem vorgefertigten Image geflasht werden kann, ohne dass Software heruntergeladen oder kompiliert werden muss. ## Wie funktioniert das? {#how-does-it-work} -Die Speicherkarte des Raspberry Pi wird mit einem vorgefertigten Image geflasht. Dieses Image enthält alles, was zum Betreiben eines Ethereum-Nodes benötigt wird. Mit einer geflashten Karte musst du nur noch den Raspberry Pi einschalten. Alle Prozesse, die für den Betrieb des Nodes erforderlich sind, werden automatisch gestartet. Das funktioniert, weil die Speicherkarte ein Linux-basiertes Betriebssystem (OS) enthält, auf dem automatisch Prozesse auf Systemebene ausgeführt werden, die das Gerät in einen Ethereum-Node verwandeln. +Die Speicherkarte des Raspberry Pi wird mit einem vorgefertigten Image geflasht. Dieses Image enthält alles, was benötigt wird, um einen Ethereum-Blockchain-Knoten auszuführen. Mit einer geflashten Karte muss der Benutzer den Raspberry Pi nur noch einschalten. Alle Prozesse, die zum Ausführen des Blockchain-Knotens erforderlich sind, werden automatisch gestartet. Dies funktioniert, weil die Speicherkarte ein Linux-basiertes Betriebssystem (OS) enthält, auf dem automatisch Prozesse auf Systemebene ausgeführt werden, die das Gerät in einen Ethereum-Blockchain-Knoten verwandeln. -Ethereum kann nicht mit dem beliebten Raspberry Pi Linux-Betriebssystem „Raspbian“ betrieben werden, da Raspbian immer noch eine 32-Bit-Architektur verwendet, was dazu führt, dass Ethereum-Benutzer auf Speicherprobleme stoßen und Konsens-Clients keine 32-Bit-Binärdateien unterstützen. Um dies zu überwinden, ist das Ethereum-on-Arm-Team auf ein natives 64-Bit-Betriebssystem namens „Armbian“ umgestiegen. +Ethereum kann nicht mit dem beliebten Raspberry Pi Linux-Betriebssystem „Raspbian“ ausgeführt werden, da Raspbian immer noch eine 32-Bit-Architektur verwendet, was bei Ethereum-Benutzern zu Speicherproblemen führt und Konsens-Clients keine 32-Bit-Binärdateien unterstützen. Um dies zu überwinden, ist das Team von Ethereum on Arm auf ein natives 64-Bit-Betriebssystem namens „Armbian“ umgestiegen. -**Images übernehmen alle notwendigen Schritte, von der Einrichtung der Umgebung und der Formatierung der SSD-Platte über die Installation und Ausführung der Ethereum-Software bis hin zum Start der Blockchain-Synchronisation.** +**Images kümmern sich um alle notwendigen Schritte**, von der Einrichtung der Umgebung und der Formatierung der SSD-Festplatte über die Installation und Ausführung der Ethereum-Software bis hin zum Start der Blockchain-Synchronisation. ## Hinweis zu Ausführungs- und Konsens-Clients {#note-on-execution-and-consensus-clients} -Das Ethereum on Arm-Image enthält vorgefertigte Ausführungs- und Konsens-Clients als Dienste. Ein Ethereum-Node erfordert, dass beide Clients synchronisiert sind und laufen. Du musst nur das Image herunterladen, es flashen und dann die Dienste starten. Das Image ist mit den folgenden Ausführungs-Clients vorinstalliert: +Das Ethereum on Arm-Image enthält vorgefertigte Ausführungs- und Konsens-Clients als Dienste. Ein Ethereum-Blockchain-Knoten erfordert, dass beide Anwendungen synchronisiert sind und ausgeführt werden. Sie müssen lediglich das Image herunterladen und flashen und dann die Dienste starten. Das Image ist mit den folgenden Ausführungs-Clients vorinstalliert: - Geth - Nethermind - Besu -und die folgenden Konsens-Clients: +und den folgenden Konsens-Clients: - Lighthouse - Nimbus - Prysm - Teku -Du solltest einen von jedem zum Ausführen auswählen - alle Ausführungs-Clients sind mit allen Konsens-Clients kompatibel. Wenn du nicht explizit einen Client auswählst, greift der Node auf seine Standardeinstellungen - Geth und Lighthouse - zurück und führt sie automatisch aus, wenn die Platine eingeschaltet wird. Du musst Port 30303 auf deinem Router öffnen, damit Geth Peers finden und sich mit ihnen verbinden kann. +Sie sollten jeweils einen zur Ausführung auswählen – alle Ausführungs-Clients sind mit allen Konsens-Clients kompatibel. Wenn Sie nicht explizit eine Anwendung auswählen, greift der Blockchain-Knoten auf seine Standardeinstellungen – Geth und Lighthouse – zurück und führt diese automatisch aus, wenn das Board eingeschaltet wird. Sie müssen Port 30303 auf Ihrem Router öffnen, damit Geth Peers finden und sich mit ihnen verbinden kann. ## Herunterladen des Images {#downloading-the-image} -Das Raspberry Pi 4 Ethereum-Image ist ein „Plug-and-Play“-Image, das automatisch sowohl die Ausführungs- als auch die Konsens-Clients installiert und einrichtet, sie so konfiguriert, dass sie miteinander kommunizieren und sich mit dem Ethereum-Netzwerk verbinden. Alles, was du tun musst, ist, deine Prozesse mit einem einfachen Befehl zu starten. +Das Raspberry Pi 4 Ethereum-Image ist ein „Plug-and-Play“-Image, das automatisch sowohl den Ausführungs- als auch den Konsens-Client installiert und einrichtet und sie so konfiguriert, dass sie miteinander kommunizieren und sich mit dem Ethereum-Netzwerk verbinden. Der Benutzer muss lediglich deren Prozesse mit einem einfachen Befehl starten. -Lade das Raspberry Pi-Image von [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) herunter und überprüfe den SHA256-Hash: +Laden Sie das Raspberry Pi-Image von [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) herunter und überprüfen Sie den SHA256-Hash: ```sh # Aus dem Verzeichnis, das das heruntergeladene Image enthält shasum -a 256 ethonarm_22.04.00.img.zip -# Der Hash sollte Folgendes ausgeben: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f +# Hash sollte ausgeben: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f ``` -Beachte, dass Images für Rock 5B- und Odroid M1-Platinen auf der Ethereum-on-Arm-[Download-Seite](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) verfügbar sind. +Beachten Sie, dass Images für Rock 5B- und Odroid M1-Boards auf der [Download-Seite](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) von Ethereum-on-Arm verfügbar sind. ## Flashen der MicroSD {#flashing-the-microsd} -Die MicroSD-Karte, die für den Raspberry Pi verwendet werden soll, sollte zuerst in einen Desktop oder Laptop eingelegt werden, damit sie geflasht werden kann. Mit den folgenden Terminalbefehlen wird das heruntergeladene Image auf die SD-Karte geflasht: +Die MicroSD-Karte, die für den Raspberry Pi verwendet wird, sollte zuerst in einen Desktop-PC oder Laptop eingelegt werden, damit sie geflasht werden kann. Anschließend flashen die folgenden Terminalbefehle das heruntergeladene Image auf die SD-Karte: ```shell -# Namen der MicroSD-Karte überprüfen +# den Namen der MicroSD-Karte überprüfen sudo fdisk -l >> sdxxx ``` -Es ist sehr wichtig, den richtigen Namen zu verwenden, da der nächste Befehl `dd` enthält, der den gesamten Inhalt der Karte löscht, bevor das Image darauf geschrieben wird. Um fortzufahren, navigiere zu dem Verzeichnis, das das gezippte Image enthält: +Es ist sehr wichtig, den Namen richtig anzugeben, da der nächste Befehl `dd` enthält, der den vorhandenen Inhalt der Karte vollständig löscht, bevor das Image darauf übertragen wird. Um fortzufahren, navigieren Sie zu dem Verzeichnis, das das gezippte Image enthält: ```shell # Image entpacken und flashen @@ -86,49 +86,49 @@ unzip ethonarm_22.04.00.img.zip sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress ``` -Die Karte ist nun geflasht und kann in den Raspberry Pi eingelegt werden. +Die Karte ist nun geflasht und kann in den Raspberry Pi eingesetzt werden. -## Den Node starten {#start-the-node} +## Starten des Blockchain-Knotens {#start-the-node} -Stecke die SD-Karte in den Raspberry Pi, schließe das Ethernet-Kabel und die SSD an und schalte das Gerät ein. Das Betriebssystem wird hochfahren und automatisch damit beginnen, die vorkonfigurierten Aufgaben auszuführen, die den Raspberry Pi in einen Ethereum-Node verwandeln, einschließlich der Installation und Erstellung der Client-Software. Dies wird wahrscheinlich 10-15 Minuten dauern. +Wenn die SD-Karte in den Raspberry Pi eingesetzt ist, schließen Sie das Ethernet-Kabel und die SSD an und schalten Sie den Strom ein. Das Betriebssystem fährt hoch und beginnt automatisch mit der Ausführung der vorkonfigurierten Aufgaben, die den Raspberry Pi in einen Ethereum-Blockchain-Knoten verwandeln, einschließlich der Installation und Kompilierung der Anwendungssoftware. Dies wird wahrscheinlich 10-15 Minuten dauern. -Sobald alles installiert und konfiguriert ist, melde dich über eine SSH-Verbindung am Gerät an oder verwende das Terminal direkt, wenn ein Monitor und eine Tastatur an die Platine angeschlossen sind. Verwende das `ethereum`-Konto zum Anmelden, da dieses die erforderlichen Berechtigungen zum Starten des Nodes hat. +Sobald alles installiert und konfiguriert ist, melden Sie sich über eine SSH-Verbindung oder direkt über das Terminal am Gerät an, falls ein Monitor und eine Tastatur an das Board angeschlossen sind. Verwenden Sie das Konto `ethereum` zur Anmeldung, da dieses über die erforderlichen Berechtigungen zum Starten des Blockchain-Knotens verfügt. ```shell -Benutzer: ethereum -Passwort: ethereum +User: ethereum +Password: ethereum ``` -Der Standard-Ausführungs-Client, Geth, startet automatisch. Du kannst dies bestätigen, indem du die Protokolle mit dem folgenden Terminal-Befehl überprüfst: +Der Standard-Ausführungs-Client, Geth, wird automatisch gestartet. Sie können dies bestätigen, indem Sie die Protokolle mit dem folgenden Terminalbefehl überprüfen: ```sh sudo journalctl -u geth -f ``` -Der Konsens-Client muss explizit gestartet werden. Öffne dazu zuerst Port 9000 auf deinem Router, damit Lighthouse Peers finden und eine Verbindung zu ihnen herstellen kann. Aktivieren und starten Sie dann den Lighthouse-Dienst: +Der Konsens-Client muss explizit gestartet werden. Öffnen Sie dazu zunächst Port 9000 auf Ihrem Router, damit Lighthouse Peers finden und sich mit ihnen verbinden kann. Aktivieren und starten Sie dann den Lighthouse-Dienst: ```sh sudo systemctl enable lighthouse-beacon sudo systemctl start lighthouse-beacon ``` -Überprüfe den Client anhand der Protokolle: +Überprüfen Sie die Anwendung anhand der Protokolle: ```sh sudo journalctl -u lighthouse-beacon ``` -Beachte, dass der Konsens-Client in wenigen Minuten synchronisiert wird, da er die Checkpoint-Synchronisierung verwendet. Der Ausführungs-Client wird länger brauchen – möglicherweise mehrere Stunden – und er startet erst, wenn der Konsens-Client bereits synchronisiert ist (das liegt daran, dass der Ausführungs-Client ein Ziel für die Synchronisierung benötigt, das der synchronisierte Konsens-Client bereitstellt). +Beachten Sie, dass der Konsens-Client in wenigen Minuten synchronisiert wird, da er Checkpoint-Sync verwendet. Der Ausführungs-Client benötigt länger – möglicherweise mehrere Stunden – und startet erst, wenn der Konsens-Client die Synchronisierung bereits abgeschlossen hat (dies liegt daran, dass der Ausführungs-Client ein Ziel für die Synchronisierung benötigt, das der synchronisierte Konsens-Client bereitstellt). -Wenn die Dienste Geth und Lighthouse laufen und synchronisiert sind, ist dein Raspberry Pi jetzt ein Ethereum-Node! Am häufigsten wird mit dem Ethereum-Netzwerk über die Javascript-Konsole von Geth interagiert, die an den Geth-Client an Port 8545 angehängt werden kann. Es ist auch möglich, Befehle, die als JSON-Objekte formatiert sind, mit einem Anfrage-Tool wie Curl zu übermitteln. Mehr dazu findest du in der [Geth-Dokumentation](https://geth.ethereum.org/). +Wenn die Geth- und Lighthouse-Dienste ausgeführt werden und synchronisiert sind, ist Ihr Raspberry Pi nun ein Ethereum-Blockchain-Knoten! Am häufigsten interagiert man mit dem Ethereum-Netzwerk über die Javascript-Konsole von Geth, die an den Geth-Client auf Port 8545 angehängt werden kann. Es ist auch möglich, Befehle, die als JSON-Objekte formatiert sind, mit einem Anfrage-Tool wie Curl zu übermitteln. Weitere Informationen finden Sie in der [Geth-Dokumentation](https://geth.ethereum.org/). -Geth ist so vorkonfiguriert, dass es Metriken an ein Grafana-Dashboard meldet, das im Browser angezeigt werden kann. Als fortgeschrittener Benutzer möchtest du diese Funktion möglicherweise nutzen, um den Zustand deines Nodes zu überwachen, indem du zu `ipaddress:3000` navigierst und `user: admin` sowie `passwd: ethereum` eingibst. +Geth ist so vorkonfiguriert, dass Metriken an ein Grafana-Dashboard gemeldet werden, das im Browser angezeigt werden kann. Fortgeschrittenere Benutzer möchten diese Funktion möglicherweise nutzen, um den Zustand ihres Blockchain-Knotens zu überwachen, indem sie zu `ipaddress:3000` navigieren und `user: admin` sowie `passwd: ethereum` eingeben. ## Validatoren {#validators} -Optional kann auch ein Validator zum Konsens-Client hinzugefügt werden. Die Validator-Software ermöglicht es deinem Node, aktiv am Konsens teilzunehmen und versorgt das Netzwerk mit kryptoökonomischer Sicherheit. Für diese Arbeit wirst du in ETH belohnt. Um einen Validator zu betreiben, musst du zunächst 32 ETH besitzen, die in den Einzahlungsvertrag eingezahlt werden müssen. Die Einzahlung kann erfolgen, indem du der Schritt-für-Schritt-Anleitung auf dem [Launchpad](https://launchpad.ethereum.org/) folgst. Führe dies auf einem Desktop/Laptop durch, aber generiere keine Schlüssel – dies kann direkt auf dem Raspberry Pi erledigt werden. +Optional kann dem Konsens-Client auch ein Validator hinzugefügt werden. Die Validator-Software ermöglicht es Ihrem Blockchain-Knoten, aktiv am Konsens teilzunehmen, und bietet dem Netzwerk kryptoökonomische Sicherheit. Für diese Arbeit werden Sie in ETH belohnt. Um einen Validator auszuführen, müssen Sie zunächst über 32 ETH verfügen, die in den Einzahlungsvertrag eingezahlt werden müssen. Die Einzahlung kann vorgenommen werden, indem Sie der Schritt-für-Schritt-Anleitung auf dem [Launchpad](https://launchpad.ethereum.org/) folgen. Führen Sie dies auf einem Desktop-PC/Laptop durch, aber generieren Sie keine Schlüssel – dies kann direkt auf dem Raspberry Pi erfolgen. -Öffne ein Terminal auf dem Raspberry Pi und führe den folgenden Befehl aus, um die Einzahlungsschlüssel zu generieren: +Öffnen Sie ein Terminal auf dem Raspberry Pi und führen Sie den folgenden Befehl aus, um die Einzahlungsschlüssel zu generieren: ``` sudo apt-get update @@ -136,35 +136,35 @@ sudo apt-get install staking-deposit-cli cd && deposit new-mnemonic --num_validators 1 ``` -(Oder lade das [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) herunter, um es auf einer Air-Gapped-Maschine auszuführen, und führe den Befehl `deposit new-mnemnonic` aus) +(Oder laden Sie das [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) herunter, um es auf einer Airgap-Maschine auszuführen, und führen Sie den Befehl `deposit new-mnemnonic` aus) -Bewahre die mnemonische Phrase sicher auf! Der obige Befehl hat zwei Dateien im Keystore des Nodes generiert: die Validator-Schlüssel und eine Einzahlungsdatendatei. Die Einzahlungsdaten müssen auf das Launchpad hochgeladen werden, daher müssen sie vom Raspberry Pi auf den Desktop/Laptop kopiert werden. Dies kann über eine SSH-Verbindung oder eine andere Kopieren-und-Einfügen-Methode erfolgen. +Bewahren Sie die mnemonische Phrase sicher auf! Der obige Befehl hat zwei Dateien im Keystore des Blockchain-Knotens generiert: die Validator-Schlüssel und eine Einzahlungsdatendatei. Die Einzahlungsdaten müssen in das Launchpad hochgeladen werden, daher müssen sie vom Raspberry Pi auf den Desktop-PC/Laptop kopiert werden. Dies kann über eine SSH-Verbindung oder eine andere Kopieren/Einfügen-Methode erfolgen. -Sobald die Einzahlungsdatendatei auf dem Computer verfügbar ist, auf dem das Launchpad läuft, kann sie auf das `+` auf dem Launchpad-Bildschirm gezogen und abgelegt werden. Folge den Anweisungen auf dem Bildschirm, um eine Transaktion an den Einzahlungsvertrag zu senden. +Sobald die Einzahlungsdatendatei auf dem Computer verfügbar ist, auf dem das Launchpad ausgeführt wird, kann sie per Drag-and-Drop auf das `+` auf dem Launchpad-Bildschirm gezogen werden. Folgen Sie den Anweisungen auf dem Bildschirm, um eine Transaktion an den Einzahlungsvertrag zu senden. -Zurück auf dem Raspberry Pi kann ein Validator gestartet werden. Dies erfordert den Import der Validator-Schlüssel, das Festlegen der Adresse zum Sammeln von Belohnungen und dann das Starten des vorkonfigurierten Validator-Prozesses. Das folgende Beispiel gilt für Lighthouse – Anleitungen für andere Konsens-Clients sind in den [Ethereum-on-Arm-Dokumenten](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) verfügbar: +Zurück auf dem Raspberry Pi kann ein Validator gestartet werden. Dies erfordert den Import der Validator-Schlüssel, das Festlegen der Adresse zum Sammeln von Belohnungen und das anschließende Starten des vorkonfigurierten Validator-Prozesses. Das folgende Beispiel gilt für Lighthouse – Anweisungen für andere Konsens-Clients finden Sie in den [Ethereum on Arm-Dokumentationen](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/): ```shell -# Validator-Schlüssel importieren +# die Validator-Schlüssel importieren lighthouse account validator import --directory=/home/ethereum/validator_keys -# Belohnungsadresse festlegen +# die Belohnungsadresse festlegen sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf -# Validator starten +# den Validator starten sudo systemctl start lighthouse-validator ``` -Herzlichen Glückwunsch, du hast jetzt einen vollständigen Ethereum-Node und Validator, der auf einem Raspberry Pi läuft! +Herzlichen Glückwunsch, Sie haben nun einen vollständigen Ethereum-Blockchain-Knoten und Validator auf einem Raspberry Pi laufen! ## Weitere Details {#more-details} -Diese Seite gab einen Überblick darüber, wie man einen Geth-Lighthouse-Node und -Validator mit einem Raspberry Pi einrichtet. Detailliertere Anweisungen sind auf der [Ethereum-on-Arm-Webseite](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) verfügbar. +Diese Seite gab einen Überblick darüber, wie man einen Geth-Lighthouse-Blockchain-Knoten und Validator mit einem Raspberry Pi einrichtet. Detailliertere Anweisungen finden Sie auf der [Ethereum-on-Arm-Website](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/). ## Feedback erwünscht {#feedback-appreciated} -Wir wissen, dass der Raspberry Pi eine riesige Nutzerbasis hat, die einen sehr positiven Einfluss auf die Gesundheit des Ethereum-Netzwerks haben könnte. -Bitte vertiefe dich in die Details dieses Tutorials, probiere es auf Testnets aus, sieh dir das Ethereum on Arm GitHub an, gib Feedback, melde Probleme und erstelle Pull-Requests und hilf mit, die Technologie und Dokumentation voranzubringen! +Wir wissen, dass der Raspberry Pi eine riesige Benutzerbasis hat, die sich sehr positiv auf die Gesundheit des Ethereum-Netzwerks auswirken könnte. +Bitte vertiefen Sie sich in die Details dieses Tutorials, versuchen Sie, es in Testnets auszuführen, schauen Sie sich das Ethereum on Arm GitHub an, geben Sie Feedback, erstellen Sie Issues und Pull Requests und helfen Sie dabei, die Technologie und Dokumentation voranzutreiben! ## Referenzen {#references} @@ -182,4 +182,4 @@ Bitte vertiefe dich in die Details dieses Tutorials, probiere es auf Testnets au 12. https://raiden.network 13. https://ipfs.io 14. https://status.im -15. https://vipnode.org +15. https://vipnode.org \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md index 66467e53738..6c6699ae68e 100644 --- a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md +++ b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md @@ -1,45 +1,45 @@ --- -title: "Einige Tricks, die von Betrugs-Tokens verwendet werden, und wie man sie erkennt" -description: "In diesem Tutorial analysieren wir einen Betrugs-Token, um einige der Tricks zu sehen, die Betrüger anwenden, wie sie sie implementieren und wie wir sie erkennen können." +title: "Einige Tricks von Betrugs-Token und wie man sie erkennt" +description: "In diesem Tutorial analysieren wir einen Betrugs-Token, um einige der Tricks von Betrügern zu untersuchen, wie sie diese implementieren und wie wir sie erkennen können." author: Ori Pomerantz -tags: ["scam", "solidity", "erc-20", "javascript", "typescript"] +tags: ["Betrug", "Solidity", "erc-20", "JavaScript", "TypeScript"] skill: intermediate -breadcrumb: "Scam-Token-Tricks" +breadcrumb: Tricks von Betrugs-Token published: 2023-09-15 lang: de --- -In diesem Tutorial analysieren wir [einen Betrugs-Token](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), um einige der Tricks zu sehen, die Betrüger anwenden und wie sie sie implementieren. Am Ende des Tutorials werden Sie einen umfassenderen Überblick über ERC-20-Token-Verträge, ihre Fähigkeiten und warum Skepsis notwendig ist, haben. Dann schauen wir uns die von diesem Betrugs-Token ausgegebenen Ereignisse an und sehen, wie wir automatisch erkennen können, dass er nicht legitim ist. +In diesem Tutorial analysieren wir [einen Betrugs-Token](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), um einige der Tricks von Betrügern zu untersuchen und zu sehen, wie sie diese implementieren. Am Ende des Tutorials werden Sie ein umfassenderes Verständnis von ERC-20-Token-Verträgen und deren Fähigkeiten haben und wissen, warum Skepsis geboten ist. Anschließend betrachten wir die von diesem Betrugs-Token ausgegebenen Ereignisse und zeigen, wie wir automatisch erkennen können, dass er nicht legitim ist. -## Betrugs-Tokens – was sind sie, warum machen Leute sie und wie kann man sie vermeiden {#scam-tokens} +## Betrugs-Token – was sie sind, warum Leute sie erstellen und wie man sie vermeidet {#scam-tokens} -Eine der häufigsten Anwendungen von Ethereum ist die Schaffung eines handelbaren Tokens durch eine Gruppe, der gewissermaßen ihre eigene Währung darstellt. Jedoch gibt es überall, wo es legitime wertschöpfende Anwendungsmöglichkeiten gibt, auch Kriminelle, die diese Werte stehlen möchten. +Eine der häufigsten Anwendungen für Ethereum ist die Erstellung eines handelbaren Tokens durch eine Gruppe, gewissermaßen als eigene Währung. Wo es jedoch legitime Anwendungsfälle gibt, die Wert schaffen, gibt es auch Kriminelle, die versuchen, diesen Wert für sich selbst zu stehlen. -Sie können mehr über dieses Thema [an anderer Stelle auf ethereum.org](/guides/how-to-id-scam-tokens/) aus der Perspektive eines Benutzers lesen. Dieses Tutorial konzentriert sich auf die Analyse eines Betrugs-Tokens, um zu sehen, wie es gemacht wird und wie es erkannt werden kann. +Sie können mehr über dieses Thema aus der Nutzerperspektive [an anderer Stelle auf ethereum.org](/guides/how-to-id-scam-tokens/) lesen. Dieses Tutorial konzentriert sich auf die Analyse eines Betrugs-Tokens, um zu sehen, wie es gemacht wird und wie es erkannt werden kann. ### Woher weiß ich, dass wARB ein Betrug ist? {#warb-scam} Der Token, den wir analysieren, ist [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), der vorgibt, dem legitimen [ARB-Token](https://etherscan.io/token/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1) gleichwertig zu sein. -Der einfachste Weg, um zu wissen, welcher der legitime Token ist, ist ein Blick auf die Herkunftsorganisation, [Arbitrum](https://arbitrum.foundation/). Die legitimen Adressen sind [in ihrer Dokumentation](https://docs.arbitrum.foundation/deployment-addresses#token) angegeben. +Der einfachste Weg, um herauszufinden, welcher der legitime Token ist, besteht darin, sich die Ursprungsorganisation [Arbitrum](https://arbitrum.foundation/) anzusehen. Die legitimen Adressen sind [in ihrer Dokumentation](https://docs.arbitrum.foundation/deployment-addresses#token) angegeben. ### Warum ist der Quellcode verfügbar? {#why-source} -Normalerweise würden wir erwarten, dass Leute, die versuchen, andere zu betrügen, geheimnisvoll sind, und tatsächlich haben viele Betrugs-Tokens ihren Code nicht verfügbar (zum Beispiel [dieser](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code) und [dieser](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code)). +Normalerweise würden wir erwarten, dass Leute, die versuchen, andere zu betrügen, geheimnisvoll tun, und tatsächlich ist der Code vieler Betrugs-Token nicht verfügbar (zum Beispiel [dieser](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code) und [dieser](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code)). -Allerdings veröffentlichen legitime Tokens normalerweise ihren Quellcode, sodass die Autoren von Betrugs-Tokens manchmal dasselbe tun, um legitim zu erscheinen. [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) ist einer dieser Tokens mit verfügbarem Quellcode, was das Verständnis erleichtert. +Da legitime Token jedoch in der Regel ihren Quellcode veröffentlichen, tun die Autoren von Betrugs-Token manchmal dasselbe, um legitim zu erscheinen. [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) ist einer dieser Token mit verfügbarem Quellcode, was es einfacher macht, ihn zu verstehen. -Während Vertrags-Deployer wählen können, ob sie den Quellcode veröffentlichen oder nicht, können sie _nicht_ den falschen Quellcode veröffentlichen. Der Block-Explorer kompiliert den bereitgestellten Quellcode unabhängig, und wenn er nicht genau denselben Bytecode erhält, lehnt er diesen Quellcode ab. [Sie können mehr darüber auf der Etherscan-Seite lesen](https://etherscan.io/verifyContract). +Während die Bereitsteller von Verträgen wählen können, ob sie den Quellcode veröffentlichen oder nicht, können sie _nicht_ den falschen Quellcode veröffentlichen. Die Blocksuchmaschine kompiliert den bereitgestellten Quellcode unabhängig, und wenn sie nicht genau denselben Bytecode erhält, lehnt sie diesen Quellcode ab. [Sie können mehr darüber auf der Etherscan-Website lesen](https://etherscan.io/verifyContract). -## Vergleich mit legitimen ERC-20-Tokens {#compare-legit-erc20} +## Vergleich mit legitimen ERC-20-Token {#compare-legit-erc20} -Wir werden diesen Token mit legitimen ERC-20-Tokens vergleichen. Wenn Sie nicht damit vertraut sind, wie legitime ERC-20-Tokens typischerweise geschrieben werden, [sehen Sie sich dieses Tutorial an](/developers/tutorials/erc20-annotated-code/). +Wir werden diesen Token mit legitimen ERC-20-Token vergleichen. Wenn Sie nicht damit vertraut sind, wie legitime ERC-20-Token typischerweise geschrieben werden, [sehen Sie sich dieses Tutorial an](/developers/tutorials/erc20-annotated-code/). ### Konstanten für privilegierte Adressen {#constants-for-privileged-addresses} -Verträge benötigen manchmal privilegierte Adressen. Verträge, die für den langfristigen Gebrauch konzipiert sind, erlauben es einigen privilegierten Adressen, diese Adressen zu ändern, zum Beispiel um die Verwendung eines neuen Multisig-Vertrags zu ermöglichen. Es gibt mehrere Möglichkeiten, dies zu tun. +Verträge benötigen manchmal privilegierte Adressen. Verträge, die für eine langfristige Nutzung ausgelegt sind, ermöglichen es einer privilegierten Adresse, diese Adressen zu ändern, beispielsweise um die Nutzung eines neuen Mehrfachsignatur-Vertrags zu ermöglichen. Es gibt mehrere Möglichkeiten, dies zu tun. -Der [`HOP`-Token-Vertrag](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code) verwendet das [`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable)-Muster. Die privilegierte Adresse wird im Speicher in einem Feld namens `_owner` gehalten (siehe die dritte Datei, `Ownable.sol`). +Der [`HOP`-Token-Vertrag](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code) verwendet das [`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable)-Muster. Die privilegierte Adresse wird im Speicher in einem Feld namens `_owner` aufbewahrt (siehe die dritte Datei, `Ownable.sol`). ```solidity abstract contract Ownable is Context { @@ -50,12 +50,14 @@ abstract contract Ownable is Context { } ``` -Der [`ARB`-Token-Vertrag](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code) hat nicht direkt eine privilegierte Adresse. Er braucht jedoch auch keine. Er befindet sich hinter einem [`Proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy) an der [Adresse `0xb50721bcf8d664c30412cfbc6cf7a15145234ad1`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code). Dieser Vertrag hat eine privilegierte Adresse (siehe die vierte Datei, `ERC1967Upgrade.sol`), die für Upgrades verwendet werden kann. +Der [`ARB`-Token-Vertrag](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code) hat nicht direkt eine privilegierte Adresse. Er benötigt jedoch auch keine. Er befindet sich hinter einem [`proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy) unter der [Adresse `0xb50721bcf8d664c30412cfbc6cf7a15145234ad1`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code). Dieser Vertrag hat eine privilegierte Adresse (siehe die vierte Datei, `ERC1967Upgrade.sol`), die für Upgrades verwendet werden kann. ```solidity - /** - * @dev Speichert eine neue Adresse im EIP1967-Admin-Slot. - */ + /* * + * @dev Speichert eine neue Adresse im EIP1967-Admin-Slot. */ + + + function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; @@ -77,13 +79,13 @@ contract WrappedArbitrum is Context, IERC20 { } ``` -[Dieser Vertragsinhaber](https://etherscan.io/address/0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33) ist kein Vertrag, der zu verschiedenen Zeiten von verschiedenen Konten kontrolliert werden könnte, sondern ein [externes Konto](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs). Das bedeutet, dass es wahrscheinlich für den kurzfristigen Gebrauch durch eine Einzelperson konzipiert ist, anstatt als langfristige Lösung zur Kontrolle eines ERC-20, das wertvoll bleiben wird. +[Dieser Vertragsbesitzer](https://etherscan.io/address/0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33) ist kein Vertrag, der zu verschiedenen Zeiten von verschiedenen Konten kontrolliert werden könnte, sondern ein [Extern verwaltetes Konto](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs). Dies bedeutet, dass es wahrscheinlich eher für die kurzfristige Nutzung durch eine Einzelperson konzipiert ist, als als langfristige Lösung zur Kontrolle eines ERC-20, der wertvoll bleiben soll. -Und tatsächlich, wenn wir in Etherscan nachsehen, sehen wir, dass der Betrüger diesen Vertrag nur für 12 Stunden (von der [ersten Transaktion](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2) bis zur [letzten Transaktion](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b)) am 19. Mai 2023 verwendet hat. +Und tatsächlich, wenn wir in Etherscan nachsehen, sehen wir, dass der Betrüger diesen Vertrag nur 12 Stunden lang genutzt hat ([erste Transaktion](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2) bis [letzte Transaktion](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b)) am 19. Mai 2023. ### Die gefälschte `_transfer`-Funktion {#the-fake-transfer-function} -Es ist Standard, dass tatsächliche Transfers über eine [interne `_transfer`-Funktion](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer) stattfinden. +Es ist Standard, dass tatsächliche Übertragungen über [eine interne `_transfer`-Funktion](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer) erfolgen. In `wARB` sieht diese Funktion fast legitim aus: @@ -112,9 +114,9 @@ Der verdächtige Teil ist: emit Transfer(sender, recipient, amount); ``` -Wenn der Vertragsinhaber Tokens sendet, warum zeigt das `Transfer`-Ereignis, dass sie von `deployer` kommen? +Wenn der Vertragsbesitzer Token sendet, warum zeigt das `Transfer`-Ereignis dann an, dass sie vom `deployer` kommen? -Es gibt jedoch ein wichtigeres Problem. Wer ruft diese `_transfer`-Funktion auf? Sie kann nicht von außen aufgerufen werden, sie ist als `internal` markiert. Und der Code, den wir haben, enthält keine Aufrufe an `_transfer`. Offensichtlich ist sie hier als Köder. +Es gibt jedoch ein wichtigeres Problem. Wer ruft diese `_transfer`-Funktion auf? Sie kann nicht von außen aufgerufen werden, da sie als `internal` markiert ist. Und der uns vorliegende Code enthält keine Aufrufe von `_transfer`. Offensichtlich ist sie hier als Täuschung gedacht. ```solidity function transfer(address recipient, uint256 amount) public virtual override returns (bool) { @@ -129,7 +131,7 @@ Es gibt jedoch ein wichtigeres Problem. Wer ruft diese `_transfer`-Funktion auf? } ``` -Wenn wir uns die Funktionen ansehen, die zum Übertragen von Tokens aufgerufen werden, `transfer` und `transferFrom`, sehen wir, dass sie eine völlig andere Funktion aufrufen, `_f_`. +Wenn wir uns die Funktionen ansehen, die zur Übertragung von Token aufgerufen werden, `transfer` und `transferFrom`, sehen wir, dass sie eine völlig andere Funktion aufrufen, nämlich `_f_`. ### Die echte `_f_`-Funktion {#the-real-f-function} @@ -152,19 +154,19 @@ Wenn wir uns die Funktionen ansehen, die zum Übertragen von Tokens aufgerufen w Es gibt zwei potenzielle Warnsignale in dieser Funktion. -- Die Verwendung des [Funktionsmodifikators](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`. Wenn wir uns jedoch den Quellcode ansehen, sehen wir, dass `_mod_` tatsächlich harmlos ist. +- Die Verwendung des [Funktionsmodifikators](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`. Wenn wir uns jedoch den Quellcode ansehen, stellen wir fest, dass `_mod_` eigentlich harmlos ist. ```solidity modifier _mod_(address sender, address recipient, uint256 amount){ _; } - ``` +``` -- Das gleiche Problem, das wir bei `_transfer` gesehen haben: Wenn `contract_owner` Tokens sendet, scheinen sie von `deployer` zu kommen. +- Dasselbe Problem, das wir in `_transfer` gesehen haben: Wenn der `contract_owner` Token sendet, scheinen sie vom `deployer` zu kommen. ### Die gefälschte Ereignisfunktion `dropNewTokens` {#the-fake-events-function-dropNewTokens} -Jetzt kommen wir zu etwas, das wie ein tatsächlicher Betrug aussieht. Ich habe die Funktion zur besseren Lesbarkeit etwas bearbeitet, aber sie ist funktional gleichwertig. +Nun kommen wir zu etwas, das wie ein tatsächlicher Betrug aussieht. Ich habe die Funktion zur besseren Lesbarkeit etwas bearbeitet, aber sie ist funktional äquivalent. ```solidity function dropNewTokens(address uPool, @@ -172,7 +174,7 @@ function dropNewTokens(address uPool, uint256[] memory eAmounts) public auth() ``` -Diese Funktion hat den `auth()`-Modifikator, was bedeutet, dass sie nur vom Vertragsinhaber aufgerufen werden kann. +Diese Funktion hat den Modifikator `auth()`, was bedeutet, dass sie nur vom Vertragsbesitzer aufgerufen werden kann. ```solidity modifier auth() { @@ -181,7 +183,7 @@ modifier auth() { } ``` -Diese Einschränkung ist vollkommen sinnvoll, da wir nicht wollen würden, dass zufällige Konten Tokens verteilen. Der Rest der Funktion ist jedoch verdächtig. +Diese Einschränkung ist absolut sinnvoll, da wir nicht wollen, dass beliebige Konten Token verteilen. Der Rest der Funktion ist jedoch verdächtig. ```solidity { @@ -191,15 +193,15 @@ Diese Einschränkung ist vollkommen sinnvoll, da wir nicht wollen würden, dass } ``` -Eine Funktion zum Übertragen von einem Pool-Konto an ein Array von Empfängern mit einem Array von Beträgen ist vollkommen sinnvoll. Es gibt viele Anwendungsfälle, in denen Sie Tokens von einer einzigen Quelle an mehrere Ziele verteilen möchten, wie z. B. Gehaltsabrechnungen, Airdrops usw. Es ist günstiger (in Gas), dies in einer einzigen Transaktion zu tun, anstatt mehrere Transaktionen auszugeben oder sogar den ERC-20-Vertrag mehrmals von einem anderen Vertrag als Teil derselben Transaktion aufzurufen. +Eine Funktion, um von einem Pool-Konto an ein Array von Empfängern ein Array von Beträgen zu übertragen, ist absolut sinnvoll. Es gibt viele Anwendungsfälle, in denen man Token von einer einzigen Quelle an mehrere Ziele verteilen möchte, wie z. B. Gehaltsabrechnungen, Airdrops usw. Es ist (in Bezug auf Gas) günstiger, dies in einer einzigen Transaktion zu tun, anstatt mehrere Transaktionen auszustellen oder sogar den ERC-20 mehrfach von einem anderen Vertrag aus als Teil derselben Transaktion aufzurufen. -`dropNewTokens` tut das jedoch nicht. Es gibt [`Transfer`-Ereignisse](https://eips.ethereum.org/EIPS/eip-20#transfer-1) aus, aber es werden keine Tokens tatsächlich übertragen. Es gibt keinen legitimen Grund, Off-Chain-Anwendungen zu verwirren, indem man ihnen von einer Übertragung berichtet, die nicht wirklich stattgefunden hat. +`dropNewTokens` tut dies jedoch nicht. Es gibt [`Transfer`-Ereignisse](https://eips.ethereum.org/EIPS/eip-20#transfer-1) aus, überträgt aber tatsächlich keine Token. Es gibt keinen legitimen Grund, Off-Chain-Anwendungen zu verwirren, indem man ihnen von einer Übertragung erzählt, die nicht wirklich stattgefunden hat. -### Die „brennende“ `Approve`-Funktion {#the-burning-approve-function} +### Die verbrennende `Approve`-Funktion {#the-burning-approve-function} -ERC-20-Verträge sollen eine [`approve`-Funktion](/developers/tutorials/erc20-annotated-code/#approve) für Freigaben haben, und tatsächlich hat unser Betrugs-Token eine solche Funktion, und sie ist sogar korrekt. Da Solidity jedoch von C abstammt, ist die Groß- und Kleinschreibung von Bedeutung. `Approve` und `approve` sind unterschiedliche Zeichenketten. +ERC-20-Verträge sollen [eine `approve`-Funktion](/developers/tutorials/erc20-annotated-code/#approve) für Freigaben haben, und tatsächlich hat unser Betrugs-Token eine solche Funktion, und sie ist sogar korrekt. Da Solidity jedoch von C abstammt, wird zwischen Groß- und Kleinschreibung unterschieden. "Approve" und "approve" sind unterschiedliche Zeichenfolgen. -Außerdem steht die Funktionalität nicht im Zusammenhang mit `approve`. +Außerdem hat die Funktionalität nichts mit `approve` zu tun. ```solidity function Approve( @@ -212,7 +214,7 @@ Diese Funktion wird mit einem Array von Adressen für Inhaber des Tokens aufgeru public approver() { ``` -Der `approver()`-Modifikator stellt sicher, dass nur `contract_owner` diese Funktion aufrufen darf (siehe unten). +Der Modifikator `approver()` stellt sicher, dass nur der `contract_owner` diese Funktion aufrufen darf (siehe unten). ```solidity for (uint256 i = 0; i < holders.length; i++) { @@ -227,7 +229,7 @@ Der `approver()`-Modifikator stellt sicher, dass nur `contract_owner` diese Funk ``` -Für jede Inhaberadresse verschiebt die Funktion das gesamte Guthaben des Inhabers an die Adresse `0x00...01` und „verbrennt“ es damit effektiv (der eigentliche `burn`-Vorgang im Standard ändert auch die Gesamtversorgung und überträgt die Tokens an `0x00...00`). Das bedeutet, dass `contract_owner` die Vermögenswerte jedes Benutzers entfernen kann. Das scheint keine Funktion zu sein, die man in einem Governance-Token haben möchte. +Für jede Inhaberadresse verschiebt die Funktion das gesamte Guthaben des Inhabers an die Adresse `0x00...01`, wodurch es effektiv verbrannt wird (das eigentliche `burn` im Standard ändert auch das Gesamtangebot und überträgt die Token an `0x00...00`). Dies bedeutet, dass der `contract_owner` die Vermögenswerte jedes Benutzers entfernen kann. Das scheint keine Funktion zu sein, die man in einem Governance-Token haben möchte. ### Probleme mit der Codequalität {#code-quality-issues} @@ -235,9 +237,9 @@ Diese Probleme mit der Codequalität _beweisen_ nicht, dass dieser Code ein Betr #### Die `mount`-Funktion {#the-mount-function} -Obwohl es nicht im [Standard](https://eips.ethereum.org/EIPS/eip-20) spezifiziert ist, wird die Funktion, die neue Tokens erstellt, allgemein [`mint`](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) genannt. +Obwohl es in [dem Standard](https://eips.ethereum.org/EIPS/eip-20) nicht spezifiziert ist, wird die Funktion, die neue Token erstellt, im Allgemeinen [`mint`](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) (Prägen) genannt. -Wenn wir uns den `wARB`-Konstruktor ansehen, sehen wir, dass die Mint-Funktion aus irgendeinem Grund in `mount` umbenannt wurde und fünfmal mit einem Fünftel der anfänglichen Versorgung aufgerufen wird, anstatt einmal für den gesamten Betrag aus Effizienzgründen. +Wenn wir uns den `wARB`-Konstruktor ansehen, sehen wir, dass die Präge-Funktion aus irgendeinem Grund in `mount` umbenannt wurde und fünfmal mit einem Fünftel des anfänglichen Angebots aufgerufen wird, anstatt aus Effizienzgründen einmal für den gesamten Betrag. ```solidity constructor () public { @@ -262,7 +264,7 @@ Die `mount`-Funktion selbst ist ebenfalls verdächtig. require(msg.sender == contract_owner, "ERC20: mint to the zero address"); ``` -Wenn wir uns das `require` ansehen, sehen wir, dass nur der Vertragsinhaber prägen darf. Das ist legitim. Aber die Fehlermeldung sollte _only owner is allowed to mint_ oder so etwas Ähnliches sein. Stattdessen lautet sie irrelevant _ERC20: mint to the zero address_. Der korrekte Test für das Prägen an die Nulladresse ist `require(account != address(0), "")`, was der Vertrag nie überprüft. +Wenn wir uns das `require` ansehen, sehen wir, dass nur der Vertragsbesitzer prägen darf. Das ist legitim. Aber die Fehlermeldung sollte _only owner is allowed to mint_ oder etwas Ähnliches lauten. Stattdessen ist es das irrelevante _ERC20: mint to the zero address_. Der korrekte Test für das Prägen an die Null-Adresse ist `require(account != address(0), "")`, was der Vertrag nie zu überprüfen bemüht ist. ```solidity _totalSupply = _totalSupply.add(amount); @@ -273,9 +275,9 @@ Wenn wir uns das `require` ansehen, sehen wir, dass nur der Vertragsinhaber prä Es gibt zwei weitere verdächtige Fakten, die direkt mit dem Prägen zusammenhängen: -- Es gibt einen `account`-Parameter, der vermutlich das Konto ist, das den geprägten Betrag erhalten sollte. Aber das Guthaben, das sich erhöht, ist tatsächlich das von `contract_owner`. +- Es gibt einen `account`-Parameter, der vermutlich das Konto ist, das den geprägten Betrag erhalten soll. Aber das Guthaben, das sich erhöht, ist tatsächlich das des `contract_owner`. -- Während das erhöhte Guthaben zu `contract_owner` gehört, zeigt das ausgegebene Ereignis eine Übertragung an `account`. +- Während das erhöhte Guthaben dem `contract_owner` gehört, zeigt das ausgegebene Ereignis eine Übertragung an `account`. ### Warum sowohl `auth` als auch `approver`? Warum das `mod`, das nichts tut? {#why-both-autho-and-approver-why-the-mod-that-does-nothing} @@ -287,7 +289,7 @@ Dieser Vertrag enthält drei Modifikatoren: `_mod_`, `auth` und `approver`. } ``` -`_mod_` nimmt drei Parameter und macht nichts damit. Warum gibt es ihn? +`_mod_` nimmt drei Parameter entgegen und macht nichts damit. Warum gibt es ihn? ```solidity modifier auth() { @@ -301,25 +303,25 @@ Dieser Vertrag enthält drei Modifikatoren: `_mod_`, `auth` und `approver`. } ``` -`auth` und `approver` machen mehr Sinn, weil sie prüfen, ob der Vertrag von `contract_owner` aufgerufen wurde. Wir würden erwarten, dass bestimmte privilegierte Aktionen, wie das Prägen, auf dieses Konto beschränkt sind. Was ist jedoch der Sinn, zwei separate Funktionen zu haben, die _genau dasselbe tun_? +`auth` und `approver` machen mehr Sinn, da sie überprüfen, ob der Vertrag vom `contract_owner` aufgerufen wurde. Wir würden erwarten, dass bestimmte privilegierte Aktionen, wie das Prägen, auf dieses Konto beschränkt sind. Was ist jedoch der Sinn von zwei separaten Funktionen, die _genau dasselbe tun_? ## Was können wir automatisch erkennen? {#what-can-we-detect-automatically} -Wir können sehen, dass `wARB` ein Betrugs-Token ist, indem wir uns Etherscan ansehen. Das ist jedoch eine zentralisierte Lösung. Theoretisch könnte Etherscan unterwandert oder gehackt werden. Es ist besser, unabhängig herausfinden zu können, ob ein Token legitim ist oder nicht. +Wir können durch einen Blick auf Etherscan erkennen, dass `wARB` ein Betrugs-Token ist. Dies ist jedoch eine zentralisierte Lösung. Theoretisch könnte Etherscan unterwandert oder gehackt werden. Es ist besser, unabhängig herausfinden zu können, ob ein Token legitim ist oder nicht. -Es gibt einige Tricks, mit denen wir einen verdächtigen ERC-20-Token identifizieren können (entweder ein Betrug oder sehr schlecht geschrieben), indem wir uns die von ihnen ausgegebenen Ereignisse ansehen. +Es gibt einige Tricks, mit denen wir erkennen können, dass ein ERC-20-Token verdächtig ist (entweder ein Betrug oder sehr schlecht geschrieben), indem wir uns die von ihm ausgegebenen Ereignisse ansehen. ## Verdächtige `Approval`-Ereignisse {#suspicious-approval-events} -[`Approval`-Ereignisse](https://eips.ethereum.org/EIPS/eip-20#approval) sollten nur auf eine direkte Anfrage hin geschehen (im Gegensatz zu [`Transfer`-Ereignissen](https://eips.ethereum.org/EIPS/eip-20#transfer-1), die als Ergebnis einer Freigabe stattfinden können). Siehe die Solidity-Dokumentation für eine detaillierte Erklärung dieses Problems und warum die Anfragen direkt sein müssen, anstatt durch einen Vertrag vermittelt zu werden. +[`Approval`-Ereignisse](https://eips.ethereum.org/EIPS/eip-20#approval) sollten nur bei einer direkten Anfrage auftreten (im Gegensatz zu [`Transfer`-Ereignissen](https://eips.ethereum.org/EIPS/eip-20#transfer-1), die als Ergebnis einer Freigabe auftreten können). [Siehe die Solidity-Dokumentation](https://docs.soliditylang.org/en/v0.8.20/security-considerations.html#tx-origin) für eine detaillierte Erklärung dieses Problems und warum die Anfragen direkt sein müssen, anstatt durch einen Vertrag vermittelt zu werden. -Das bedeutet, dass `Approval`-Ereignisse, die Ausgaben von einem [externen Konto](/developers/docs/accounts/#types-of-account) genehmigen, von Transaktionen stammen müssen, die in diesem Konto ihren Ursprung haben und deren Ziel der ERC-20-Vertrag ist. Jede andere Art der Genehmigung von einem externen Konto ist verdächtig. +Dies bedeutet, dass `Approval`-Ereignisse, die Ausgaben von einem [Extern verwalteten Konto](/developers/docs/accounts/#types-of-account) genehmigen, aus Transaktionen stammen müssen, die von diesem Konto ausgehen und deren Ziel der ERC-20-Vertrag ist. Jede andere Art der Genehmigung von einem Extern verwalteten Konto ist verdächtig. -Hier ist [ein Programm, das diese Art von Ereignis identifiziert](https://github.com/qbzzt/20230915-scam-token-detection), das [viem](https://viem.sh/) und [TypeScript](https://www.typescriptlang.org/docs/), eine JavaScript-Variante mit Typsicherheit, verwendet. So führen Sie es aus: +Hier ist [ein Programm, das diese Art von Ereignis identifiziert](https://github.com/qbzzt/20230915-scam-token-detection), unter Verwendung von [viem](https://viem.sh/) und [TypeScript](https://www.typescriptlang.org/docs/), einer JavaScript-Variante mit Typsicherheit. Um es auszuführen: 1. Kopieren Sie `.env.example` nach `.env`. -2. Bearbeiten Sie `.env`, um die URL zu einem Ethereum-Mainnet-Node bereitzustellen. -3. Führen Sie `pnpm install` aus, um die notwendigen Pakete zu installieren. +2. Bearbeiten Sie `.env`, um die URL zu einem Ethereum-Mainnet-Blockchain-Knoten bereitzustellen. +3. Führen Sie `pnpm install` aus, um die erforderlichen Pakete zu installieren. 4. Führen Sie `pnpm susApproval` aus, um nach verdächtigen Genehmigungen zu suchen. Hier ist eine zeilenweise Erklärung: @@ -351,7 +353,7 @@ const client = createPublicClient({ }) ``` -Erstellen Sie einen Viem-Client. Wir müssen nur aus der Blockchain lesen, daher benötigt dieser Client keinen privaten Schlüssel. +Erstellen Sie einen Viem-Client. Wir müssen nur von der Blockchain lesen, daher benötigt dieser Client keinen Private-Key. ```typescript const testedAddress = "0xb047c8032b99841713b8e3872f06cf32beb27b82" @@ -359,7 +361,7 @@ const fromBlock = 16859812n const toBlock = 16873372n ``` -Die Adresse des verdächtigen ERC-20-Vertrags und die Blöcke, in denen wir nach Ereignissen suchen werden. Node-Anbieter beschränken typischerweise unsere Fähigkeit, Ereignisse zu lesen, da die Bandbreite teuer werden kann. Glücklicherweise wurde `wARB` für einen Zeitraum von achtzehn Stunden nicht verwendet, sodass wir nach allen Ereignissen suchen können (es waren insgesamt nur 13). +Die Adresse des verdächtigen ERC-20-Vertrags und die Blöcke, in denen wir nach Ereignissen suchen werden. Anbieter von Blockchain-Knoten schränken typischerweise unsere Fähigkeit ein, Ereignisse zu lesen, da die Bandbreite teuer werden kann. Glücklicherweise war `wARB` für einen Zeitraum von achtzehn Stunden nicht in Gebrauch, sodass wir nach allen Ereignissen suchen können (es gab insgesamt nur 13). ```typescript const approvalEvents = await client.getLogs({ @@ -372,57 +374,57 @@ const approvalEvents = await client.getLogs({ }) ``` -So fragen Sie Viem nach Ereignisinformationen. Wenn wir ihm die genaue Ereignissignatur, einschließlich Feldnamen, zur Verfügung stellen, analysiert es das Ereignis für uns. +Dies ist der Weg, um Viem nach Ereignisinformationen zu fragen. Wenn wir ihm die genaue Ereignissignatur einschließlich der Feldnamen zur Verfügung stellen, parst es das Ereignis für uns. ```typescript const isContract = async (addr: Address): boolean => await client.getBytecode({ address: addr }) ``` -Unser Algorithmus ist nur auf externe Konten anwendbar. Wenn von `client.getBytecode` ein Bytecode zurückgegeben wird, bedeutet dies, dass es sich um einen Vertrag handelt und wir ihn einfach überspringen sollten. +Unser Algorithmus ist nur auf Extern verwaltete Konten anwendbar. Wenn von `client.getBytecode` ein Bytecode zurückgegeben wird, bedeutet dies, dass es sich um einen Vertrag handelt und wir ihn einfach überspringen sollten. -Wenn Sie TypeScript noch nicht verwendet haben, könnte die Funktionsdefinition etwas seltsam aussehen. Wir sagen ihm nicht nur, dass der erste (und einzige) Parameter `addr` heißt, sondern auch, dass er vom Typ `Address` ist. Ähnlich teilt der `: boolean`-Teil TypeScript mit, dass der Rückgabewert der Funktion ein boolescher Wert ist. +Wenn Sie TypeScript noch nicht verwendet haben, sieht die Funktionsdefinition möglicherweise etwas seltsam aus. Wir sagen ihm nicht nur, dass der erste (und einzige) Parameter `addr` heißt, sondern auch, dass er vom Typ `Address` ist. Ebenso teilt der Teil `: boolean` TypeScript mit, dass der Rückgabewert der Funktion ein Boolean ist. ```typescript const getEventTxn = async (ev: Event): TransactionReceipt => await client.getTransactionReceipt({ hash: ev.transactionHash }) ``` -Diese Funktion ruft den Transaktionsbeleg aus einem Ereignis ab. Wir benötigen den Beleg, um sicherzustellen, dass wir das Transaktionsziel kennen. +Diese Funktion ruft den Transaktionsbeleg aus einem Ereignis ab. Wir benötigen den Beleg, um sicherzustellen, dass wir wissen, was das Ziel der Transaktion war. ```typescript const suspiciousApprovalEvent = async (ev : Event) : (Event | null) => { ``` -Dies ist die wichtigste Funktion, die tatsächlich entscheidet, ob ein Ereignis verdächtig ist oder nicht. Der Rückgabetyp `(Event | null)` teilt TypeScript mit, dass diese Funktion entweder ein `Event` oder `null` zurückgeben kann. Wir geben `null` zurück, wenn das Ereignis nicht verdächtig ist. +Dies ist die wichtigste Funktion, diejenige, die tatsächlich entscheidet, ob ein Ereignis verdächtig ist oder nicht. Der Rückgabetyp `(Event | null)` teilt TypeScript mit, dass diese Funktion entweder ein `Event` oder `null` zurückgeben kann. Wir geben `null` zurück, wenn das Ereignis nicht verdächtig ist. ```typescript const owner = ev.args._owner ``` -Viem kennt die Feldnamen, also hat es das Ereignis für uns analysiert. `_owner` ist der Eigentümer der auszugebenden Tokens. +Viem hat die Feldnamen, also hat es das Ereignis für uns geparst. `_owner` ist der Besitzer der auszugebenden Token. ```typescript // Genehmigungen durch Verträge sind nicht verdächtig if (await isContract(owner)) return null ``` -Wenn der Eigentümer ein Vertrag ist, gehen Sie davon aus, dass diese Genehmigung nicht verdächtig ist. Um zu überprüfen, ob die Genehmigung eines Vertrags verdächtig ist oder nicht, müssen wir die vollständige Ausführung der Transaktion verfolgen, um zu sehen, ob sie jemals zum Eigentümervertrag gelangt ist und ob dieser Vertrag den ERC-20-Vertrag direkt aufgerufen hat. Das ist viel ressourcenintensiver, als wir es gerne hätten. +Wenn der Besitzer ein Vertrag ist, gehen Sie davon aus, dass diese Genehmigung nicht verdächtig ist. Um zu überprüfen, ob die Genehmigung eines Vertrags verdächtig ist oder nicht, müssten wir die vollständige Ausführung der Transaktion verfolgen, um zu sehen, ob sie jemals zum Besitzervertrag gelangt ist und ob dieser Vertrag den ERC-20-Vertrag direkt aufgerufen hat. Das ist weitaus ressourcenintensiver, als wir es gerne tun würden. ```typescript const txn = await getEventTxn(ev) ``` -Wenn die Genehmigung von einem externen Konto kommt, holen Sie sich die Transaktion, die sie verursacht hat. +Wenn die Genehmigung von einem Extern verwalteten Konto stammt, rufen Sie die Transaktion ab, die sie verursacht hat. ```typescript // Die Genehmigung ist verdächtig, wenn sie von einem EOA-Besitzer stammt, der nicht das `from` der Transaktion ist if (owner.toLowerCase() != txn.from.toLowerCase()) return ev ``` -Wir können nicht einfach auf Zeichenketten-Gleichheit prüfen, da Adressen hexadezimal sind und daher Buchstaben enthalten. Manchmal, zum Beispiel in `txn.from`, sind diese Buchstaben alle in Kleinbuchstaben. In anderen Fällen, wie bei `ev.args._owner`, ist die Adresse in [gemischter Groß- und Kleinschreibung zur Fehlererkennung](https://eips.ethereum.org/EIPS/eip-55). +Wir können nicht einfach auf Zeichenfolgengleichheit prüfen, da Adressen hexadezimal sind und daher Buchstaben enthalten. Manchmal, zum Beispiel in `txn.from`, sind diese Buchstaben alle kleingeschrieben. In anderen Fällen, wie bei `ev.args._owner`, ist die Adresse in [gemischter Groß-/Kleinschreibung zur Fehlererkennung](https://eips.ethereum.org/EIPS/eip-55). -Aber wenn die Transaktion nicht vom Eigentümer stammt und dieser Eigentümer ein externes Konto ist, dann haben wir eine verdächtige Transaktion. +Aber wenn die Transaktion nicht vom Besitzer stammt und dieser Besitzer extern verwaltet wird, dann haben wir eine verdächtige Transaktion. ```typescript // Es ist auch verdächtig, wenn das Transaktionsziel nicht der ERC-20-Vertrag ist, den wir @@ -430,15 +432,15 @@ Aber wenn die Transaktion nicht vom Eigentümer stammt und dieser Eigentümer ei if (txn.to.toLowerCase() != testedAddress) return ev ``` -Ähnlich verhält es sich, wenn die `to`-Adresse der Transaktion, also der erste aufgerufene Vertrag, nicht der zu untersuchende ERC-20-Vertrag ist, dann ist dies verdächtig. +Ebenso ist es verdächtig, wenn die `to`-Adresse der Transaktion, der erste aufgerufene Vertrag, nicht der untersuchte ERC-20-Vertrag ist. ```typescript - // Wenn es keinen Grund gibt, misstrauisch zu sein, gib null zurück. + // Wenn kein Grund zum Verdacht besteht, gib null zurück. return null } ``` -Wenn keine der beiden Bedingungen zutrifft, ist das `Approval`-Ereignis nicht verdächtig. +Wenn keine der Bedingungen zutrifft, ist das `Approval`-Ereignis nicht verdächtig. ```typescript const testPromises = approvalEvents.map((ev) => suspiciousApprovalEvent(ev)) @@ -447,18 +449,18 @@ const testResults = (await Promise.all(testPromises)).filter((x) => x != null) console.log(testResults) ``` -[Eine `async`-Funktion](https://www.w3schools.com/js/js_async.asp) gibt ein `Promise`-Objekt zurück. Mit der gängigen Syntax `await x()` warten wir darauf, dass dieses `Promise` erfüllt wird, bevor wir mit der Verarbeitung fortfahren. Dies ist einfach zu programmieren und zu verfolgen, aber es ist auch ineffizient. Während wir darauf warten, dass das `Promise` für ein bestimmtes Ereignis erfüllt wird, können wir bereits mit dem nächsten Ereignis beginnen. +[Eine `async`-Funktion](https://www.w3schools.com/js/js_async.asp) gibt ein `Promise`-Objekt zurück. Mit der üblichen Syntax `await x()` warten wir darauf, dass dieses `Promise` erfüllt wird, bevor wir mit der Verarbeitung fortfahren. Dies ist einfach zu programmieren und nachzuvollziehen, aber es ist auch ineffizient. Während wir darauf warten, dass das `Promise` für ein bestimmtes Ereignis erfüllt wird, können wir bereits mit der Arbeit am nächsten Ereignis beginnen. -Hier verwenden wir [`map`](https://www.w3schools.com/jsref/jsref_map.asp), um ein Array von `Promise`-Objekten zu erstellen. Dann verwenden wir [`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/), um darauf zu warten, dass alle diese Promises aufgelöst werden. Wir filtern dann diese Ergebnisse mit [`filter`](https://www.w3schools.com/jsref/jsref_filter.asp), um die nicht verdächtigen Ereignisse zu entfernen. +Hier verwenden wir [`map`](https://www.w3schools.com/jsref/jsref_map.asp), um ein Array von `Promise`-Objekten zu erstellen. Dann verwenden wir [`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/), um darauf zu warten, dass alle diese Promises aufgelöst werden. Anschließend [`filter`](https://www.w3schools.com/jsref/jsref_filter.asp)n wir diese Ergebnisse, um die nicht verdächtigen Ereignisse zu entfernen. ### Verdächtige `Transfer`-Ereignisse {#suspicious-transfer-events} -Eine weitere Möglichkeit, Betrugs-Tokens zu identifizieren, besteht darin, zu prüfen, ob sie verdächtige Übertragungen aufweisen. Zum Beispiel Übertragungen von Konten, die nicht so viele Tokens haben. Sie können sehen, [wie dieser Test implementiert wird](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts), aber `wARB` hat dieses Problem nicht. +Eine weitere mögliche Methode zur Identifizierung von Betrugs-Token besteht darin, zu prüfen, ob sie verdächtige Übertragungen aufweisen. Zum Beispiel Übertragungen von Konten, die nicht so viele Token haben. Sie können sehen, [wie man diesen Test implementiert](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts), aber `wARB` hat dieses Problem nicht. ## Fazit {#conclusion} -Die automatisierte Erkennung von ERC-20-Betrugsfällen leidet unter [falsch-negativen Ergebnissen](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error), da ein Betrug einen vollkommen normalen ERC-20-Token-Vertrag verwenden kann, der einfach nichts Reales darstellt. Sie sollten also immer versuchen, _die Token-Adresse aus einer vertrauenswürdigen Quelle zu beziehen_. +Die automatisierte Erkennung von ERC-20-Betrügereien leidet unter [falsch-negativen Ergebnissen](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error), da ein Betrug einen völlig normalen ERC-20-Token-Vertrag verwenden kann, der einfach nichts Reales darstellt. Daher sollten Sie immer versuchen, _die Token-Adresse aus einer vertrauenswürdigen Quelle zu beziehen_. -Die automatisierte Erkennung kann in bestimmten Fällen helfen, wie z.B. bei DeFi-Komponenten, wo es viele Tokens gibt und diese automatisch gehandhabt werden müssen. Aber wie immer gilt [caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp), führen Sie Ihre eigenen Recherchen durch und ermutigen Sie Ihre Benutzer, es Ihnen gleichzutun. +Die automatisierte Erkennung kann in bestimmten Fällen helfen, wie z. B. bei DeFi-Komponenten, bei denen es viele Token gibt und diese automatisch verarbeitet werden müssen. Aber wie immer gilt [Caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp) (Käufer, sei wachsam): Recherchieren Sie selbst und ermutigen Sie Ihre Benutzer, dasselbe zu tun. -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/secret-state/index.md b/public/content/translations/de/developers/tutorials/secret-state/index.md index 1f916da01ff..78cfa6761ca 100644 --- a/public/content/translations/de/developers/tutorials/secret-state/index.md +++ b/public/content/translations/de/developers/tutorials/secret-state/index.md @@ -1,39 +1,39 @@ --- -title: "Verwendung von Zero-Knowledge für einen geheimen Zustand" -description: "Onchain-Spiele sind begrenzt, da sie keine versteckten Informationen enthalten können. Nach der Lektüre dieses Tutorials ist der Leser in der Lage, Zero-Knowledge-Beweise und Serverkomponenten zu kombinieren, um verifizierbare Spiele mit einer geheimen Offchain-Zustandskomponente zu erstellen. Die Technik dafür wird durch die Erstellung eines Minesweeper-Spiels demonstriert." +title: "Verwendung von Zero-Knowledge für einen geheimen Status" +description: "Spiele auf der Blockchain sind eingeschränkt, da sie keine verborgenen Informationen speichern können. Nach dem Lesen dieses Tutorials wird der Leser in der Lage sein, Zero-Knowledge-Beweise und Serverkomponenten zu kombinieren, um verifizierbare Spiele mit einer geheimen Statuskomponente Off-Chain zu erstellen. Die Technik dazu wird anhand der Erstellung eines Minesweeper-Spiels demonstriert." author: Ori Pomerantz -tags: ["server", "offchain", "centralized", "zero-knowledge", "zokrates", "mud"] +tags: ["Server", "Off-Chain", "zentralisiert", "Zero-Knowledge", "zokrates", "mud", "Datenschutz"] skill: advanced -breadcrumb: "ZK-Geheimzustand" +breadcrumb: ZK geheimer Status lang: de published: 2025-03-15 --- -_Es gibt keine Geheimnisse in der Blockchain_. Alles, was auf der Blockchain gepostet wird, ist für jeden lesbar. Dies ist notwendig, da die Blockchain darauf basiert, dass jeder sie verifizieren kann. Spiele sind jedoch oft auf einen geheimen Zustand angewiesen. Zum Beispiel ergibt das Spiel [Minesweeper](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) absolut keinen Sinn, wenn man einfach in einen Blockchain-Explorer gehen und die Karte sehen kann. +_Es gibt keine Geheimnisse auf der Blockchain_. Alles, was auf der Blockchain veröffentlicht wird, ist für jeden offen lesbar. Dies ist notwendig, da die Blockchain darauf basiert, dass jeder sie verifizieren kann. Spiele sind jedoch oft auf einen geheimen Status angewiesen. Zum Beispiel ergibt das Spiel [Minesweeper]() absolut keinen Sinn, wenn man einfach eine Blocksuchmaschine aufrufen und die Karte sehen kann. -Die einfachste Lösung ist die Verwendung einer [Serverkomponente](/developers/tutorials/server-components/), um den geheimen Zustand zu speichern. Der Grund, warum wir die Blockchain verwenden, ist jedoch, Betrug durch den Spieleentwickler zu verhindern. Wir müssen die Ehrlichkeit der Serverkomponente sicherstellen. Der Server kann einen Hash des Zustands bereitstellen und [Zero-Knowledge-Beweise](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important) verwenden, um zu beweisen, dass der zur Berechnung des Ergebnisses eines Zuges verwendete Zustand der richtige ist. +Die einfachste Lösung ist die Verwendung einer [Serverkomponente](/developers/tutorials/server-components/), um den geheimen Status zu speichern. Der Grund, warum wir die Blockchain nutzen, ist jedoch, Betrug durch den Spieleentwickler zu verhindern. Wir müssen die Ehrlichkeit der Serverkomponente sicherstellen. Der Server kann einen Hash des Status bereitstellen und [Zero-Knowledge-Beweise](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important) verwenden, um zu beweisen, dass der zur Berechnung des Ergebnisses eines Zuges verwendete Status der richtige ist. -Nach der Lektüre dieses Artikels wissen Sie, wie Sie diese Art von Server, der einen geheimen Zustand hält, einen Client zur Anzeige des Zustands und eine Onchain-Komponente für die Kommunikation zwischen den beiden erstellen. Die Hauptwerkzeuge, die wir verwenden werden, sind: +Nach dem Lesen dieses Artikels werden Sie wissen, wie man diese Art von Server, der einen geheimen Status hält, eine Anwendung zur Anzeige des Status und eine Komponente auf der Blockchain für die Kommunikation zwischen beiden erstellt. Die wichtigsten Werkzeuge, die wir verwenden werden, sind: -| Werkzeug | Zweck | Auf Version verifiziert | -| --------------------------------------------- | --------------------------------------------- | --------------------------------------: | -| [Zokrates](https://zokrates.github.io/) | Zero-Knowledge-Beweise und ihre Verifizierung | 1.1.9 | -| [Typescript](https://www.typescriptlang.org/) | Programmiersprache für Server und Client | 5.4.2 | -| [Node](https://nodejs.org/en) | Ausführen des Servers | 20.18.2 | -| [Viem](https://viem.sh/) | Kommunikation mit der Blockchain | 2.9.20 | -| [MUD](https://mud.dev/) | Onchain-Datenverwaltung | 2.0.12 | -| [React](https://react.dev/) | Client-Benutzeroberfläche | 18.2.0 | -| [Vite](https://vitejs.dev/) | Bereitstellen des Client-Codes | 4.2.1 | +| Werkzeug | Zweck | Verifiziert mit Version | +| --------------------------------------------- | ------------------------------------------------------- | ------------------: | +| [Zokrates](https://zokrates.github.io/) | Zero-Knowledge-Beweise und deren Verifizierung | 1.1.9 | +| [Typescript](https://www.typescriptlang.org/) | Programmiersprache für den Server und die Anwendung | 5.4.2 | +| [Node](https://nodejs.org/en) | Ausführen des Servers | 20.18.2 | +| [Viem](https://viem.sh/) | Kommunikation mit der Blockchain | 2.9.20 | +| [MUD](https://mud.dev/) | Datenverwaltung auf der Blockchain | 2.0.12 | +| [React](https://react.dev/) | Benutzeroberfläche der Anwendung | 18.2.0 | +| [Vite](https://vitejs.dev/) | Bereitstellung des Anwendungscodes | 4.2.1 | ## Minesweeper-Beispiel {#minesweeper} -[Minesweeper](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) ist ein Spiel, das eine geheime Karte mit einem Minenfeld enthält. Der Spieler entscheidet sich, an einer bestimmten Stelle zu graben. Wenn sich an dieser Stelle eine Mine befindet, ist das Spiel vorbei. Andernfalls erhält der Spieler die Anzahl der Minen in den acht Feldern, die diesen Ort umgeben. +[Minesweeper]() ist ein Spiel, das eine geheime Karte mit einem Minenfeld enthält. Der Spieler entscheidet sich, an einer bestimmten Stelle zu graben. Wenn sich an dieser Stelle eine Mine befindet, ist das Spiel vorbei. Andernfalls erhält der Spieler die Anzahl der Minen in den acht Feldern, die diese Stelle umgeben. -Diese Anwendung wurde mit [MUD](https://mud.dev/) geschrieben, einem Framework, mit dem wir Daten onchain in einer [Schlüssel-Wert-Datenbank](https://aws.amazon.com/nosql/key-value/) speichern und diese Daten automatisch mit Offchain-Komponenten synchronisieren können. Zusätzlich zur Synchronisation erleichtert MUD die Bereitstellung von Zugriffskontrollen und ermöglicht es anderen Benutzern, unsere Anwendung [zu erweitern](https://mud.dev/guides/extending-a-world), ohne dass eine Berechtigung erforderlich ist. +Diese Anwendung ist mit [MUD](https://mud.dev/) geschrieben, einem Framework, das es uns ermöglicht, Daten auf der Blockchain mithilfe einer [Schlüssel-Wert-Datenbank](https://aws.amazon.com/nosql/key-value/) zu speichern und diese Daten automatisch mit Off-Chain-Komponenten zu synchronisieren. Zusätzlich zur Synchronisierung macht es MUD einfach, Zugriffskontrollen bereitzustellen und es anderen Benutzern zu ermöglichen, unsere Anwendung erlaubnisfrei zu [erweitern](https://mud.dev/guides/extending-a-world). ### Ausführen des Minesweeper-Beispiels {#running-minesweeper-example} -So führen Sie das Minesweeper-Beispiel aus: +Um das Minesweeper-Beispiel auszuführen: 1. Stellen Sie sicher, dass Sie [die Voraussetzungen installiert haben](https://mud.dev/quickstart#prerequisites): [Node](https://mud.dev/quickstart#prerequisites), [Foundry](https://book.getfoundry.sh/getting-started/installation), [`git`](https://git-scm.com/downloads), [`pnpm`](https://git-scm.com/downloads) und [`mprocs`](https://github.com/pvolok/mprocs). @@ -41,7 +41,7 @@ So führen Sie das Minesweeper-Beispiel aus: ```sh copy git clone https://github.com/qbzzt/20240901-secret-state.git - ``` +``` 3. Installieren Sie die Pakete. @@ -49,9 +49,9 @@ So führen Sie das Minesweeper-Beispiel aus: cd 20240901-secret-state/ pnpm install npm install -g mprocs - ``` +``` - Wenn Foundry als Teil von `pnpm install` installiert wurde, müssen Sie die Kommandozeilen-Shell neu starten. + Wenn Foundry als Teil von `pnpm install` installiert wurde, müssen Sie die Kommandozeile neu starten. 4. Kompilieren Sie die Verträge @@ -59,167 +59,167 @@ So führen Sie das Minesweeper-Beispiel aus: cd packages/contracts forge build cd ../.. - ``` +``` -5. Starten Sie das Programm (einschließlich einer [Anvil](https://book.getfoundry.sh/anvil/) Blockchain) und warten Sie. + +5. Starten Sie das Programm (einschließlich einer [Anvil](https://book.getfoundry.sh/anvil/)-Blockchain) und warten Sie. ```sh copy mprocs - ``` +``` - Beachten Sie, dass der Start lange dauert. Um den Fortschritt zu sehen, verwenden Sie zuerst die Pfeiltaste nach unten, um zum Tab _contracts_ zu scrollen, um zu sehen, wie die MUD-Verträge bereitgestellt werden. Wenn Sie die Meldung _Waiting for file changes…_ erhalten, sind die Verträge bereitgestellt und der weitere Fortschritt findet auf der Registerkarte _server_ statt. Dort warten Sie, bis Sie die Nachricht _Verifier address: 0x..._ erhalten. + Beachten Sie, dass der Startvorgang lange dauert. Um den Fortschritt zu sehen, verwenden Sie zunächst die Pfeiltaste nach unten, um zum Tab _contracts_ zu scrollen und zu sehen, wie die MUD-Verträge bereitgestellt werden. Wenn Sie die Nachricht _Waiting for file changes…_ erhalten, sind die Verträge bereitgestellt und der weitere Fortschritt findet im Tab _server_ statt. Dort warten Sie, bis Sie die Nachricht _Verifier address: 0x...._ erhalten. - Wenn dieser Schritt erfolgreich ist, sehen Sie den `mprocs`-Bildschirm mit den verschiedenen Prozessen auf der linken und der Konsolenausgabe für den aktuell ausgewählten Prozess auf der rechten Seite. + Wenn dieser Schritt erfolgreich ist, sehen Sie den `mprocs`-Bildschirm mit den verschiedenen Prozessen auf der linken Seite und der Konsolenausgabe für den aktuell ausgewählten Prozess auf der rechten Seite. - ![Der mprocs-Bildschirm](./mprocs.png) + ![The mprocs screen](./mprocs.png) - Wenn es ein Problem mit `mprocs` gibt, können Sie die vier Prozesse manuell ausführen, jeder in seinem eigenen Kommandozeilenfenster: + Wenn es ein Problem mit `mprocs` gibt, können Sie die vier Prozesse manuell ausführen, jeden in seinem eigenen Kommandozeilenfenster: - **Anvil** ```sh cd packages/contracts anvil --base-fee 0 --block-time 2 - ``` +``` - - **Verträge** + - **Verträge** ```sh cd packages/contracts pnpm mud dev-contracts --rpc http://127.0.0.1:8545 - ``` +``` - **Server** ```sh cd packages/server pnpm start - ``` +``` - - **Client** + - **Anwendung** ```sh cd packages/client pnpm run dev - ``` +``` -6. Jetzt können Sie zum [Client](http://localhost:3000) navigieren, auf **New Game** klicken und mit dem Spielen beginnen. +6. Nun können Sie [die Anwendung](http://localhost:3000) im Browser aufrufen, auf **New Game** klicken und anfangen zu spielen. ### Tabellen {#tables} -Wir benötigen [mehrere Tabellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts) onchain. +Wir benötigen [mehrere Tabellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts) auf der Blockchain. -- `Configuration`: Diese Tabelle ist ein Singleton, sie hat keinen Schlüssel und einen einzigen Datensatz. Sie wird verwendet, um Informationen zur Spielkonfiguration zu speichern: - - `height`: Die Höhe eines Minenfeldes - - `width`: Die Breite eines Minenfeldes +- `Configuration`: Diese Tabelle ist ein Singleton, sie hat keinen Schlüssel und nur einen einzigen Datensatz. Sie wird verwendet, um Informationen zur Spielkonfiguration zu speichern: + - `height`: Die Höhe eines Minenfelds + - `width`: Die Breite eines Minenfelds - `numberOfBombs`: Die Anzahl der Bomben in jedem Minenfeld - -- `VerifierAddress`: Diese Tabelle ist ebenfalls ein Singleton. Es wird verwendet, um einen Teil der Konfiguration zu halten, die Adresse des Verifizierervertrags (`verifier`). Wir hätten diese Information in die `Configuration`-Tabelle aufnehmen können, aber sie wird von einer anderen Komponente, dem Server, gesetzt, daher ist es einfacher, sie in eine separate Tabelle zu packen. +- `VerifierAddress`: Diese Tabelle ist ebenfalls ein Singleton. Sie wird verwendet, um einen Teil der Konfiguration zu speichern, die Adresse des Verifizierer-Vertrags (`verifier`). Wir hätten diese Informationen in die Tabelle `Configuration` aufnehmen können, aber sie wird von einer anderen Komponente, dem Server, festgelegt, sodass es einfacher ist, sie in einer separaten Tabelle abzulegen. - `PlayerGame`: Der Schlüssel ist die Adresse des Spielers. Die Daten sind: - - `gameId`: 32-Byte-Wert, der der Hash der Karte ist, auf der der Spieler spielt (der Spiel-Identifikator). - - `win`: ein boolescher Wert, der angibt, ob der Spieler das Spiel gewonnen hat. - - `lose`: ein boolescher Wert, der angibt, ob der Spieler das Spiel verloren hat. + - `gameId`: Ein 32-Byte-Wert, der der Hash der Karte ist, auf der der Spieler spielt (die Spielkennung). + - `win`: ein Boolescher Wert, der angibt, ob der Spieler das Spiel gewonnen hat. + - `lose`: ein Boolescher Wert, der angibt, ob der Spieler das Spiel verloren hat. - `digNumber`: die Anzahl der erfolgreichen Grabungen im Spiel. -- `GamePlayer`: Diese Tabelle enthält die umgekehrte Zuordnung von `gameId` zur Spieleradresse. +- `GamePlayer`: Diese Tabelle enthält die umgekehrte Zuordnung, von `gameId` zur Adresse des Spielers. - `Map`: Der Schlüssel ist ein Tupel aus drei Werten: - - `gameId`: 32-Byte-Wert, der der Hash der Karte ist, auf der der Spieler spielt (der Spiel-Identifikator). + - `gameId`: Ein 32-Byte-Wert, der der Hash der Karte ist, auf der der Spieler spielt (die Spielkennung). - `x`-Koordinate - `y`-Koordinate - Der Wert ist eine einzelne Zahl. Es ist 255, wenn eine Bombe entdeckt wurde. Andernfalls ist es die Anzahl der Bomben um diesen Ort herum plus eins. Wir können nicht einfach die Anzahl der Bomben verwenden, da standardmäßig der gesamte Speicher in der EVM und alle Zeilenwerte in MUD null sind. Wir müssen zwischen „der Spieler hat hier noch nicht gegraben“ und „der Spieler hat hier gegraben und festgestellt, dass es keine Bomben in der Nähe gibt“ unterscheiden. + Der Wert ist eine einzelne Zahl. Er ist 255, wenn eine Bombe entdeckt wurde. Andernfalls ist es die Anzahl der Bomben um diesen Ort herum plus eins. Wir können nicht einfach die Anzahl der Bomben verwenden, da standardmäßig der gesamte Speicher in der EVM und alle Zeilenwerte in MUD null sind. Wir müssen unterscheiden zwischen „der Spieler hat hier noch nicht gegraben“ und „der Spieler hat hier gegraben und festgestellt, dass es null Bomben in der Umgebung gibt“. -Zusätzlich findet die Kommunikation zwischen Client und Server über die Onchain-Komponente statt. Dies wird ebenfalls mithilfe von Tabellen implementiert. +Darüber hinaus erfolgt die Kommunikation zwischen der Anwendung und dem Server über die Komponente auf der Blockchain. Dies wird ebenfalls mithilfe von Tabellen implementiert. -- `PendingGame`: Nicht bearbeitete Anfragen zum Starten eines neuen Spiels. -- `PendingDig`: Nicht bearbeitete Anfragen, an einem bestimmten Ort in einem bestimmten Spiel zu graben. Dies ist eine [Offchain-Tabelle](https://mud.dev/store/tables#types-of-tables), was bedeutet, dass sie nicht in den EVM-Speicher geschrieben wird, sondern nur offchain über Ereignisse lesbar ist. +- `PendingGame`: Unbearbeitete Anfragen zum Starten eines neuen Spiels. +- `PendingDig`: Unbearbeitete Anfragen, an einem bestimmten Ort in einem bestimmten Spiel zu graben. Dies ist eine [Off-Chain-Tabelle](https://mud.dev/store/tables#types-of-tables), was bedeutet, dass sie nicht in den EVM-Speicher geschrieben wird, sondern nur Off-Chain mithilfe von Ereignissen lesbar ist. ### Ausführungs- und Datenflüsse {#execution-data-flows} -Diese Flüsse koordinieren die Ausführung zwischen dem Client, der Onchain-Komponente und dem Server. +Diese Flüsse koordinieren die Ausführung zwischen der Anwendung, der Komponente auf der Blockchain und dem Server. #### Initialisierung {#initialization-flow} -Wenn Sie `mprocs` ausführen, geschehen diese Schritte: +Wenn Sie `mprocs` ausführen, passieren folgende Schritte: 1. [`mprocs`](https://github.com/pvolok/mprocs) führt vier Komponenten aus: - [Anvil](https://book.getfoundry.sh/anvil/), das eine lokale Blockchain ausführt - - [Contracts](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts), das die Verträge für MUD kompiliert (falls erforderlich) und bereitstellt - - [Client](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client), das [Vite](https://vitejs.dev/) ausführt, um die Benutzeroberfläche und den Client-Code für Webbrowser bereitzustellen. + - [Contracts](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts) (Verträge), das die Verträge für MUD kompiliert (falls erforderlich) und bereitstellt + - [Client](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client) (Anwendung), das [Vite](https://vitejs.dev/) ausführt, um die Benutzeroberfläche und den Anwendungscode für Webbrowser bereitzustellen. - [Server](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/server), der die Serveraktionen ausführt -2. Das `contracts`-Paket stellt die MUD-Verträge bereit und führt dann [das `PostDeploy.s.sol`-Skript](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol) aus. Dieses Skript legt die Konfiguration fest. Der Code von GitHub spezifiziert [ein 10x5 Minenfeld mit acht Minen darin](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23). +2. Das Paket `contracts` stellt die MUD-Verträge bereit und führt dann [das Skript `PostDeploy.s.sol`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol) aus. Dieses Skript legt die Konfiguration fest. Der Code von GitHub spezifiziert [ein 10x5-Minenfeld mit acht Minen darin](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23). -3. [Der Server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts) beginnt mit der [Einrichtung von MUD](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6). Dies aktiviert unter anderem die Datensynchronisation, sodass eine Kopie der relevanten Tabellen im Speicher des Servers vorhanden ist. +3. [Der Server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts) beginnt mit der [Einrichtung von MUD](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6). Dies aktiviert unter anderem die Datensynchronisierung, sodass eine Kopie der relevanten Tabellen im Speicher des Servers vorhanden ist. -4. Der Server abonniert eine Funktion, die ausgeführt wird, [wenn sich die `Configuration`-Tabelle ändert](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23). [Diese Funktion](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168) wird aufgerufen, nachdem `PostDeploy.s.sol` ausgeführt und die Tabelle geändert wurde. +4. Der Server abonniert eine Funktion, die ausgeführt wird, [wenn sich die Tabelle `Configuration` ändert](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23). [Diese Funktion](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168) wird aufgerufen, nachdem `PostDeploy.s.sol` ausgeführt wurde und die Tabelle ändert. -5. Wenn die Server-Initialisierungsfunktion die Konfiguration hat, [ruft sie `zkFunctions` auf](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35), um [den Zero-Knowledge-Teil des Servers zu initialisieren](#using-zokrates-from-typescript). Dies kann erst geschehen, wenn wir die Konfiguration erhalten, da die Zero-Knowledge-Funktionen die Breite und Höhe des Minenfeldes als Konstanten haben müssen. +5. Wenn die Server-Initialisierungsfunktion die Konfiguration hat, [ruft sie `zkFunctions` auf](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35), um [den Zero-Knowledge-Teil des Servers](#using-zokrates-from-typescript) zu initialisieren. Dies kann erst geschehen, wenn wir die Konfiguration erhalten, da die Zero-Knowledge-Funktionen die Breite und Höhe des Minenfelds als Konstanten haben müssen. -6. Nachdem der Zero-Knowledge-Teil des Servers initialisiert ist, ist der nächste Schritt, [den Zero-Knowledge-Verifizierungsvertrag auf der Blockchain bereitzustellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53) und die Verifizierungsadresse in MUD festzulegen. +6. Nachdem der Zero-Knowledge-Teil des Servers initialisiert wurde, besteht der nächste Schritt darin, [den Zero-Knowledge-Verifizierungsvertrag auf der Blockchain bereitzustellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53) und die Verifizierer-Adresse in MUD festzulegen. -7. Schließlich abonnieren wir Aktualisierungen, damit wir sehen, wenn ein Spieler entweder [ein neues Spiel starten](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71) oder [in einem bestehenden Spiel graben](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108) möchte. +7. Schließlich abonnieren wir Aktualisierungen, damit wir sehen, wenn ein Spieler anfordert, entweder [ein neues Spiel zu starten](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71) oder [in einem bestehenden Spiel zu graben](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108). #### Neues Spiel {#new-game-flow} -Dies geschieht, wenn der Spieler ein neues Spiel anfordert. +Folgendes passiert, wenn der Spieler ein neues Spiel anfordert. -1. Wenn für diesen Spieler kein Spiel im Gange ist, oder es eines gibt, aber mit einer gameId von Null, zeigt der Client eine [Schaltfläche für ein neues Spiel](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175) an. Wenn der Benutzer diese Schaltfläche drückt, [führt React die Funktion `newGame` aus](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96). +1. Wenn für diesen Spieler kein Spiel im Gange ist oder es eines gibt, aber mit einer gameId von null, zeigt die Anwendung einen [Button für ein neues Spiel](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175) an. Wenn der Benutzer diesen Button drückt, [führt React die Funktion `newGame` aus](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96). -2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46) ist ein `System`-Aufruf. In MUD werden alle Aufrufe über den `World`-Vertrag geleitet, und in den meisten Fällen rufen Sie `__` auf. In diesem Fall ist der Aufruf an `app__newGame`, den MUD dann an [`newGame` in `GameSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22) weiterleitet. +2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46) ist ein `System`-Aufruf. In MUD werden alle Aufrufe über den Vertrag `World` geleitet, und in den meisten Fällen rufen Sie `__` auf. In diesem Fall erfolgt der Aufruf an `app__newGame`, den MUD dann an [`newGame` in `GameSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22) weiterleitet. -3. Die Onchain-Funktion prüft, ob der Spieler kein Spiel im Gange hat, und wenn nicht, [fügt sie die Anfrage zur `PendingGame`-Tabelle hinzu](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21). +3. Die Funktion auf der Blockchain überprüft, ob der Spieler kein laufendes Spiel hat, und wenn keines vorhanden ist, [fügt sie die Anfrage zur Tabelle `PendingGame` hinzu](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21). -4. Der Server erkennt die Änderung in `PendingGame` und [führt die abonnierte Funktion aus](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71). Diese Funktion ruft [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114) auf, das wiederum [`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144) aufruft. +4. Der Server erkennt die Änderung in `PendingGame` und [führt die abonnierte Funktion aus](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71). Diese Funktion ruft [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114) auf, was wiederum [`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144) aufruft. 5. Das Erste, was `createGame` tut, ist [eine zufällige Karte mit der entsprechenden Anzahl von Minen zu erstellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L120-L135). Dann ruft es [`makeMapBorders`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L147-L166) auf, um eine Karte mit leeren Rändern zu erstellen, was für Zokrates notwendig ist. Schließlich ruft `createGame` [`calculateMapHash`](#calculateMapHash) auf, um den Hash der Karte zu erhalten, der als Spiel-ID verwendet wird. 6. Die Funktion `newGame` fügt das neue Spiel zu `gamesInProgress` hinzu. -7. Das Letzte, was der Server tut, ist [`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43) aufzurufen, was onchain geschieht. Diese Funktion befindet sich in einem anderen `System`, [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol), um die Zugriffskontrolle zu ermöglichen. Die Zugriffskontrolle ist in der [MUD-Konfigurationsdatei](https://mud.dev/config), [`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72) definiert. +7. Das Letzte, was der Server tut, ist der Aufruf von [`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43), was auf der Blockchain geschieht. Diese Funktion befindet sich in einem anderen `System`, [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol), um die Zugriffskontrolle zu ermöglichen. Die Zugriffskontrolle ist in der [MUD-Konfigurationsdatei](https://mud.dev/config), [`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72), definiert. - Die Zugriffsliste erlaubt nur einer einzigen Adresse, das `System` aufzurufen. Dies beschränkt den Zugriff auf die Serverfunktionen auf eine einzige Adresse, sodass niemand den Server imitieren kann. + Die Zugriffsliste erlaubt nur einer einzigen Adresse, das `System` aufzurufen. Dies beschränkt den Zugriff auf die Serverfunktionen auf eine einzige Adresse, sodass sich niemand als Server ausgeben kann. -8. Die Onchain-Komponente aktualisiert die relevanten Tabellen: +8. Die Komponente auf der Blockchain aktualisiert die relevanten Tabellen: - - Erstellen Sie das Spiel in `PlayerGame`. - - Setzen Sie die umgekehrte Zuordnung in `GamePlayer`. - - Entfernen Sie die Anfrage aus `PendingGame`. + - Erstellt das Spiel in `PlayerGame`. + - Legt die umgekehrte Zuordnung in `GamePlayer` fest. + - Entfernt die Anfrage aus `PendingGame`. -9. Der Server identifiziert die Änderung in `PendingGame`, unternimmt aber nichts, da [`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60) falsch ist. +9. Der Server identifiziert die Änderung in `PendingGame`, unternimmt jedoch nichts, da [`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60) falsch ist. -10. Auf dem Client wird [`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148) auf den `PlayerGame`-Eintrag für die Adresse des Spielers gesetzt. Wenn sich `PlayerGame` ändert, ändert sich auch `gameRecord`. +10. In der Anwendung wird [`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148) auf den Eintrag `PlayerGame` für die Adresse des Spielers gesetzt. Wenn sich `PlayerGame` ändert, ändert sich auch `gameRecord`. -11. Wenn ein Wert in `gameRecord` vorhanden ist und das Spiel weder gewonnen noch verloren wurde, [zeigt der Client die Karte an](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190). +11. Wenn ein Wert in `gameRecord` vorhanden ist und das Spiel weder gewonnen noch verloren wurde, [zeigt die Anwendung die Karte an](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190). #### Graben {#dig-flow} -1. Der Spieler [klickt auf die Schaltfläche der Kartenzelle](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188), wodurch [die Funktion `dig` aufgerufen wird](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36). Diese Funktion ruft [`dig` onchain auf](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32). +1. Der Spieler [klickt auf den Button der Kartenzelle](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188), was [die Funktion `dig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36) aufruft. Diese Funktion ruft [`dig` auf der Blockchain](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32) auf. -2. Die Onchain-Komponente [führt eine Reihe von Plausibilitätsprüfungen durch](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30) und fügt bei Erfolg die Grabanforderung zu [`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31) hinzu. +2. Die Komponente auf der Blockchain [führt eine Reihe von Plausibilitätsprüfungen durch](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30) und fügt bei Erfolg die Grabanfrage zu [`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31) hinzu. -3. Der Server [erkennt die Änderung in `PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73). [Wenn sie gültig ist](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84), ruft sie [den Zero-Knowledge-Code](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95) auf (unten erklärt), um sowohl das Ergebnis als auch einen Beweis für dessen Gültigkeit zu generieren. +3. Der Server [erkennt die Änderung in `PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73). [Wenn sie gültig ist](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84), [ruft er den Zero-Knowledge-Code auf](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95) (unten erklärt), um sowohl das Ergebnis als auch einen Beweis für dessen Gültigkeit zu generieren. -4. [Der Server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107) ruft [`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64) onchain auf. +4. [Der Server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107) ruft [`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64) auf der Blockchain auf. -5. `digResponse` tut zwei Dinge. Zuerst prüft es [den Zero-Knowledge-Beweis](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61). Wenn der Beweis dann standhält, ruft es [`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86) auf, um das Ergebnis tatsächlich zu verarbeiten. +5. `digResponse` tut zwei Dinge. Zuerst überprüft es [den Zero-Knowledge-Beweis](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61). Wenn der Beweis dann bestätigt wird, ruft es [`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86) auf, um das Ergebnis tatsächlich zu verarbeiten. -6. `processDigResult` prüft, ob das Spiel [verloren](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78) oder [gewonnen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86) wurde, und [aktualisiert `Map`, die Onchain-Karte](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80). +6. `processDigResult` überprüft, ob das Spiel [verloren](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78) oder [gewonnen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86) wurde, und [aktualisiert `Map`, die Karte auf der Blockchain](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80). -7. Der Client übernimmt die Aktualisierungen automatisch und [aktualisiert die dem Spieler angezeigte Karte](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190) und teilt dem Spieler gegebenenfalls mit, ob es ein Sieg oder eine Niederlage ist. +7. Die Anwendung übernimmt die Aktualisierungen automatisch und [aktualisiert die dem Spieler angezeigte Karte](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190) und teilt dem Spieler gegebenenfalls mit, ob es sich um einen Gewinn oder einen Verlust handelt. ## Verwendung von Zokrates {#using-zokrates} -In den oben erklärten Abläufen haben wir die Zero-Knowledge-Teile übersprungen und sie als Blackbox behandelt. Jetzt wollen wir sie aufbrechen und sehen, wie dieser Code geschrieben ist. +In den oben erklärten Abläufen haben wir die Zero-Knowledge-Teile übersprungen und sie als Blackbox behandelt. Lassen Sie uns diese nun öffnen und sehen, wie dieser Code geschrieben ist. ### Hashing der Karte {#hashing-map} -Wir können [diesen JavaScript-Code](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise) verwenden, um [Poseidon](https://www.poseidon-hash.info), die von uns verwendete Zokrates-Hash-Funktion, zu implementieren. Obwohl dies schneller wäre, wäre es auch komplizierter, als einfach die Zokrates-Hash-Funktion dafür zu verwenden. Dies ist ein Tutorial, daher ist der Code auf Einfachheit und nicht auf Leistung optimiert. Daher benötigen wir zwei verschiedene Zokrates-Programme: eines, das nur den Hash einer Karte (`hash`) berechnet, und eines, das tatsächlich einen Zero-Knowledge-Beweis für das Ergebnis des Grabens an einem Ort auf der Karte (`dig`) erstellt. +Wir können [diesen JavaScript-Code](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise) verwenden, um [Poseidon](https://www.poseidon-hash.info), die von uns verwendete Zokrates-Hash-Funktion, zu implementieren. Obwohl dies schneller wäre, wäre es auch komplizierter, als einfach die Zokrates-Hash-Funktion dafür zu verwenden. Dies ist ein Tutorial, und daher ist der Code auf Einfachheit und nicht auf Leistung optimiert. Daher benötigen wir zwei verschiedene Zokrates-Programme: eines, um nur den Hash einer Karte zu berechnen (`hash`), und eines, um tatsächlich einen Zero-Knowledge-Beweis für das Ergebnis der Grabung an einem Ort auf der Karte zu erstellen (`dig`). ### Die Hash-Funktion {#hash-function} @@ -230,9 +230,9 @@ import "hashes/poseidon/poseidon.zok" as poseidon; import "utils/pack/bool/pack128.zok" as pack128; ``` -Diese beiden Zeilen importieren zwei Funktionen aus der [Zokrates-Standardbibliothek](https://zokrates.github.io/toolbox/stdlib.html). [Die erste Funktion](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok) ist ein [Poseidon-Hash](https://www.poseidon-hash.info/). Es nimmt ein Array von [`field`-Elementen](https://zokrates.github.io/language/types.html#field) und gibt ein `field` zurück. +Diese beiden Zeilen importieren zwei Funktionen aus der [Zokrates-Standardbibliothek](https://zokrates.github.io/toolbox/stdlib.html). [Die erste Funktion](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok) ist ein [Poseidon-Hash](https://www.poseidon-hash.info/). Sie nimmt ein Array von [`field`-Elementen](https://zokrates.github.io/language/types.html#field) und gibt ein `field` zurück. -Das Feldelement in Zokrates ist typischerweise kürzer als 256 Bit, aber nicht viel. Um den Code zu vereinfachen, beschränken wir die Karte auf bis zu 512 Bit und hashen ein Array von vier Feldern, und in jedem Feld verwenden wir nur 128 Bit. [Die Funktion `pack128`](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok) wandelt zu diesem Zweck ein Array von 128 Bits in ein `field` um. +Das Field-Element in Zokrates ist typischerweise weniger als 256 Bit lang, aber nicht viel. Um den Code zu vereinfachen, beschränken wir die Karte auf bis zu 512 Bit und hashen ein Array von vier Fields, und in jedem Field verwenden wir nur 128 Bit. [Die Funktion `pack128`](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok) wandelt zu diesem Zweck ein Array von 128 Bit in ein `field` um. ``` def hashMap(bool[${width+2}][${height+2}] map) -> field { @@ -240,7 +240,7 @@ Das Feldelement in Zokrates ist typischerweise kürzer als 256 Bit, aber nicht v Diese Zeile beginnt eine Funktionsdefinition. `hashMap` erhält einen einzigen Parameter namens `map`, ein zweidimensionales `bool`(esches) Array. Die Größe der Karte ist `width+2` mal `height+2` aus Gründen, die [unten erklärt werden](#why-map-border). -Wir können `${width+2}` und `${height+2}` verwenden, da die Zokrates-Programme in dieser Anwendung als [Template-Strings](https://www.w3schools.com/js/js_string_templates.asp) gespeichert sind. Code zwischen `${` und `}` wird von JavaScript ausgewertet, und auf diese Weise kann das Programm für verschiedene Kartengrößen verwendet werden. Der Kartenparameter hat einen einen Ort breiten Rand ringsum ohne Bomben, weshalb wir zwei zur Breite und Höhe hinzufügen müssen. +Wir können `${width+2}` und `${height+2}` verwenden, da die Zokrates-Programme in dieser Anwendung als [Template-Strings](https://www.w3schools.com/js/js_string_templates.asp) gespeichert sind. Code zwischen `${` und `}` wird von JavaScript ausgewertet, und auf diese Weise kann das Programm für verschiedene Kartengrößen verwendet werden. Der Parameter `map` hat rundherum einen einen Ort breiten Rand ohne Bomben, weshalb wir zwei zur Breite und Höhe addieren müssen. Der Rückgabewert ist ein `field`, das den Hash enthält. @@ -250,19 +250,19 @@ Der Rückgabewert ist ein `field`, das den Hash enthält. Die Karte ist zweidimensional. Die Funktion `pack128` funktioniert jedoch nicht mit zweidimensionalen Arrays. Also flachen wir die Karte zuerst in ein 512-Byte-Array ab, indem wir `map1d` verwenden. Standardmäßig sind Zokrates-Variablen Konstanten, aber wir müssen diesem Array in einer Schleife Werte zuweisen, also definieren wir es als [`mut`](https://zokrates.github.io/language/variables.html#mutability). -Wir müssen das Array initialisieren, da Zokrates kein `undefined` kennt. Der Ausdruck `[false; 512]` bedeutet [ein Array von 512 `false`-Werten](https://zokrates.github.io/language/types.html#declaration-and-initialization). +Wir müssen das Array initialisieren, da Zokrates kein `undefined` hat. Der Ausdruck `[false; 512]` bedeutet [ein Array von 512 `false`-Werten](https://zokrates.github.io/language/types.html#declaration-and-initialization). ``` u32 mut counter = 0; ``` -Wir benötigen auch einen Zähler, um zwischen den Bits, die wir bereits in `map1d` gefüllt haben, und denen, die wir nicht gefüllt haben, zu unterscheiden. +Wir benötigen auch einen Zähler, um zwischen den Bits zu unterscheiden, die wir bereits in `map1d` gefüllt haben, und denen, die wir noch nicht gefüllt haben. ``` for u32 x in 0..${width+2} { ``` -So deklarieren Sie eine [`for`-Schleife](https://zokrates.github.io/language/control_flow.html#for-loops) in Zokrates. Eine Zokrates-`for`-Schleife muss feste Grenzen haben, denn obwohl sie wie eine Schleife aussieht, „entrollt“ der Compiler sie tatsächlich. Der Ausdruck `${width+2}` ist eine Kompilierzeitkonstante, da `width` vom TypeScript-Code gesetzt wird, bevor er den Compiler aufruft. +So deklarieren Sie eine [`for`-Schleife](https://zokrates.github.io/language/control_flow.html#for-loops) in Zokrates. Eine Zokrates-`for`-Schleife muss feste Grenzen haben, denn obwohl sie wie eine Schleife aussieht, „entrollt“ der Compiler sie tatsächlich. Der Ausdruck `${width+2}` ist eine Konstante zur Kompilierzeit, da `width` vom TypeScript-Code festgelegt wird, bevor er den Compiler aufruft. ``` for u32 y in 0..${height+2} { @@ -272,7 +272,7 @@ So deklarieren Sie eine [`for`-Schleife](https://zokrates.github.io/language/con } ``` -Für jeden Ort auf der Karte, fügen Sie diesen Wert in das `map1d`-Array ein und erhöhen Sie den Zähler. +Für jeden Ort auf der Karte wird dieser Wert in das Array `map1d` eingefügt und der Zähler inkrementiert. ``` field[4] hashMe = [ @@ -283,7 +283,7 @@ Für jeden Ort auf der Karte, fügen Sie diesen Wert in das `map1d`-Array ein un ]; ``` -Das `pack128`, um ein Array von vier `field`-Werten aus `map1d` zu erstellen. In Zokrates bedeutet `array[a..b]` den Ausschnitt des Arrays, der bei `a` beginnt und bei `b-1` endet. +Das `pack128`, um ein Array von vier `field`-Werten aus `map1d` zu erstellen. In Zokrates bedeutet `array[a..b]` den Abschnitt des Arrays, der bei `a` beginnt und bei `b-1` endet. ``` return poseidon(hashMe); @@ -294,7 +294,7 @@ Verwenden Sie `poseidon`, um dieses Array in einen Hash umzuwandeln. ### Das Hash-Programm {#hash-program} -Der Server muss `hashMap` direkt aufrufen, um Spiel-Identifikatoren zu erstellen. Zokrates kann jedoch nur die `main`-Funktion eines Programms zum Starten aufrufen, daher erstellen wir ein Programm mit einer `main`-Funktion, die die Hash-Funktion aufruft. +Der Server muss `hashMap` direkt aufrufen, um Spielkennungen zu erstellen. Zokrates kann jedoch nur die `main`-Funktion eines Programms aufrufen, um zu starten, also erstellen wir ein Programm mit einer `main`, die die Hash-Funktion aufruft. ``` ${hashFragment} @@ -304,14 +304,14 @@ def main(bool[${width+2}][${height+2}] map) -> field { } ``` -### Das Grabungsprogramm {#dig-program} +### Das Grab-Programm {#dig-program} -Dies ist das Herzstück des Zero-Knowledge-Teils der Anwendung, wo wir die Beweise produzieren, die zur Verifizierung von Grabungsergebnissen verwendet werden. +Dies ist das Herzstück des Zero-Knowledge-Teils der Anwendung, in dem wir die Beweise erstellen, die zur Verifizierung der Grabergebnisse verwendet werden. ``` ${hashFragment} -// Die Anzahl der Minen am Ort (x,y) +// The number of mines in location (x,y) def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 { return if map[x+1][y+1] { 1 } else { 0 }; } @@ -319,9 +319,9 @@ def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 { #### Warum ein Kartenrand {#why-map-border} -Zero-Knowledge-Beweise verwenden [arithmetische Schaltungen](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785), die keine einfache Entsprechung zu einer `if`-Anweisung haben. Stattdessen verwenden sie das Äquivalent des [bedingten Operators](https://en.wikipedia.org/wiki/Ternary_conditional_operator). Wenn `a` entweder null oder eins sein kann, können Sie `if a { b } else { c }` als `ab+(1-a)c` berechnen. +Zero-Knowledge-Beweise verwenden [arithmetische Schaltkreise](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785), die keine einfache Entsprechung zu einer `if`-Anweisung haben. Stattdessen verwenden sie das Äquivalent des [bedingten Operators](https://en.wikipedia.org/wiki/Ternary_conditional_operator). Wenn `a` entweder null oder eins sein kann, können Sie `if a { b } else { c }` als `ab+(1-a)c` berechnen. -Deshalb wertet eine Zokrates-`if`-Anweisung immer beide Zweige aus. Wenn Sie zum Beispiel diesen Code haben: +Aus diesem Grund wertet eine Zokrates-`if`-Anweisung immer beide Zweige aus. Wenn Sie beispielsweise diesen Code haben: ``` bool[5] arr = [false; 5]; @@ -329,29 +329,29 @@ u32 index=10; return if index>4 { 0 } else { arr[index] } ``` -Es wird einen Fehler geben, weil es `arr[10]` berechnen muss, obwohl dieser Wert später mit Null multipliziert wird. +Es wird ein Fehler ausgegeben, da `arr[10]` berechnet werden muss, auch wenn dieser Wert später mit null multipliziert wird. -Dies ist der Grund, warum wir einen einen Ort breiten Rand rund um die Karte benötigen. Wir müssen die Gesamtzahl der Minen um einen Ort herum berechnen, und das bedeutet, wir müssen den Ort eine Reihe darüber und darunter, links und rechts von dem Ort, an dem wir graben, sehen. Das bedeutet, dass diese Orte in dem Karten-Array existieren müssen, das Zokrates zur Verfügung gestellt wird. +Dies ist der Grund, warum wir rund um die Karte einen einen Ort breiten Rand benötigen. Wir müssen die Gesamtzahl der Minen um einen Ort herum berechnen, und das bedeutet, dass wir den Ort eine Reihe darüber und darunter, links und rechts von dem Ort sehen müssen, an dem wir graben. Das bedeutet, dass diese Orte in dem Karten-Array existieren müssen, das Zokrates zur Verfügung gestellt wird. ``` def main(private bool[${width+2}][${height+2}] map, u32 x, u32 y) -> (field, u8) { ``` -Standardmäßig enthalten Zokrates-Beweise ihre Eingaben. Es nützt nichts zu wissen, dass sich fünf Minen um einen Punkt befinden, es sei denn, man weiß tatsächlich, um welchen Punkt es sich handelt (und man kann ihn nicht einfach mit seiner Anfrage abgleichen, denn dann könnte der Prüfer andere Werte verwenden und es Ihnen nicht mitteilen). Wir müssen die Karte jedoch geheim halten, während wir sie Zokrates zur Verfügung stellen. Die Lösung ist die Verwendung eines `private`-Parameters, der _nicht_ durch den Beweis offengelegt wird. +Standardmäßig enthalten Zokrates-Beweise ihre Eingaben. Es nützt nichts zu wissen, dass es fünf Minen um einen Ort herum gibt, es sei denn, Sie wissen tatsächlich, welcher Ort es ist (und Sie können ihn nicht einfach mit Ihrer Anfrage abgleichen, da der Beweiser dann andere Werte verwenden und Ihnen nichts davon erzählen könnte). Wir müssen die Karte jedoch geheim halten, während wir sie Zokrates zur Verfügung stellen. Die Lösung besteht darin, einen `private`-Parameter zu verwenden, der durch den Beweis _nicht_ offengelegt wird. -Dies eröffnet eine weitere Möglichkeit für Missbrauch. Der Prüfer könnte die richtigen Koordinaten verwenden, aber eine Karte mit einer beliebigen Anzahl von Minen um den Ort herum und möglicherweise am Ort selbst erstellen. Um diesen Missbrauch zu verhindern, lassen wir den Zero-Knowledge-Beweis den Hash der Karte enthalten, der die Spiel-ID ist. +Dies eröffnet eine weitere Möglichkeit für Missbrauch. Der Beweiser könnte die richtigen Koordinaten verwenden, aber eine Karte mit einer beliebigen Anzahl von Minen um den Ort herum und möglicherweise am Ort selbst erstellen. Um diesen Missbrauch zu verhindern, lassen wir den Zero-Knowledge-Beweis den Hash der Karte einschließen, der die Spielkennung ist. ``` return (hashMap(map), ``` -Der Rückgabewert ist hier ein Tupel, das das Karten-Hash-Array sowie das Grabungsergebnis enthält. +Der Rückgabewert hier ist ein Tupel, das sowohl das Karten-Hash-Array als auch das Grabergebnis enthält. ``` if map2mineCount(map, x, y) > 0 { 0xFF } else { ``` -Wir verwenden 255 als Sonderwert für den Fall, dass der Ort selbst eine Bombe enthält. +Wir verwenden 255 als speziellen Wert für den Fall, dass der Ort selbst eine Bombe hat. ``` map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + @@ -362,11 +362,11 @@ Wir verwenden 255 als Sonderwert für den Fall, dass der Ort selbst eine Bombe e } ``` -Wenn der Spieler keine Mine getroffen hat, addieren Sie die Minenzählungen für den Bereich um den Ort herum und geben Sie das zurück. +Wenn der Spieler keine Mine getroffen hat, addieren Sie die Minenanzahl für den Bereich um den Ort und geben Sie diese zurück. ### Verwendung von Zokrates aus TypeScript {#using-zokrates-from-typescript} -Zokrates hat eine Befehlszeilenschnittstelle, aber in diesem Programm verwenden wir sie im [TypeScript-Code](https://zokrates.github.io/toolbox/zokrates_js.html). +Zokrates verfügt über eine Kommandozeilenschnittstelle, aber in diesem Programm verwenden wir es im [TypeScript-Code](https://zokrates.github.io/toolbox/zokrates_js.html). Die Bibliothek, die die Zokrates-Definitionen enthält, heißt [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts). @@ -374,19 +374,19 @@ Die Bibliothek, die die Zokrates-Definitionen enthält, heißt [`zero-knowledge. import { initialize as zokratesInitialize } from "zokrates-js" ``` -Importieren Sie die [Zokrates JavaScript-Bindungen](https://zokrates.github.io/toolbox/zokrates_js.html). Wir benötigen nur die Funktion [`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize), da sie ein Promise zurückgibt, das in alle Zokrates-Definitionen aufgelöst wird. +Importieren Sie die [Zokrates-JavaScript-Bindungen](https://zokrates.github.io/toolbox/zokrates_js.html). Wir benötigen nur die Funktion [`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize), da sie ein Promise zurückgibt, das in alle Zokrates-Definitionen aufgelöst wird. ```typescript export const zkFunctions = async (width: number, height: number) : Promise => { ``` -Ähnlich wie bei Zokrates selbst exportieren wir auch nur eine Funktion, die ebenfalls [asynchron](https://www.w3schools.com/js/js_async.asp) ist. Wenn sie schließlich zurückkehrt, stellt sie mehrere Funktionen zur Verfügung, wie wir unten sehen werden. +Ähnlich wie Zokrates selbst exportieren wir auch nur eine Funktion, die ebenfalls [asynchron](https://www.w3schools.com/js/js_async.asp) ist. Wenn sie schließlich zurückkehrt, stellt sie mehrere Funktionen bereit, wie wir unten sehen werden. ```typescript const zokrates = await zokratesInitialize() ``` -Initialisieren Sie Zokrates, holen Sie sich alles, was wir aus der Bibliothek benötigen. +Initialisieren Sie Zokrates, holen Sie alles, was wir aus der Bibliothek benötigen. ```typescript const hashFragment = ` @@ -423,17 +423,17 @@ const hashCompiled = zokrates.compile(hashProgram) Hier kompilieren wir diese Programme. ```typescript -// Erstellen Sie die Schlüssel für die Zero-Knowledge-Verifizierung. -// Auf einem Produktionssystem würden Sie eine Setup-Zeremonie verwenden wollen. +// Erstelle die Schlüssel für die Zero-Knowledge-Verifizierung. +// Auf einem Produktionssystem würde man eine Setup-Zeremonie verwenden. // (https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony). const keySetupResults = zokrates.setup(digCompiled.program, "") const verifierKey = keySetupResults.vk const proverKey = keySetupResults.pk ``` -Auf einem Produktionssystem könnten wir eine kompliziertere [Setup-Zeremonie](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) verwenden, aber das ist für eine Demonstration ausreichend. Es ist kein Problem, dass die Benutzer den Prover-Schlüssel kennen – sie können ihn trotzdem nicht verwenden, um Dinge zu beweisen, es sei denn, sie sind wahr. Da wir die Entropie (der zweite Parameter, `""`) angeben, werden die Ergebnisse immer die gleichen sein. +Auf einem Produktionssystem würden wir möglicherweise eine kompliziertere [Setup-Zeremonie](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) verwenden, aber für eine Demonstration ist dies gut genug. Es ist kein Problem, dass die Benutzer den Beweiser-Schlüssel kennen können – sie können ihn immer noch nicht verwenden, um Dinge zu beweisen, es sei denn, sie sind wahr. Da wir die Entropie (den zweiten Parameter, `""`) angeben, werden die Ergebnisse immer gleich sein. -**Hinweis:** Die Kompilierung von Zokrates-Programmen und die Schlüsselerstellung sind langsame Prozesse. Es ist nicht nötig, sie jedes Mal zu wiederholen, nur wenn sich die Kartengröße ändert. Auf einem Produktionssystem würde man sie einmal durchführen und dann die Ausgabe speichern. Der einzige Grund, warum ich es hier nicht tue, ist der Einfachheit halber. +**Hinweis:** Die Kompilierung von Zokrates-Programmen und die Schlüsselerstellung sind langsame Prozesse. Es ist nicht nötig, sie jedes Mal zu wiederholen, sondern nur, wenn sich die Kartengröße ändert. Auf einem Produktionssystem würden Sie sie einmal durchführen und dann die Ausgabe speichern. Der einzige Grund, warum ich es hier nicht tue, ist der Einfachheit halber. #### `calculateMapHash` {#calculateMapHash} @@ -448,12 +448,12 @@ const calculateMapHash = function (hashMe: boolean[][]): string { } ``` -Die Funktion [`computeWitness`](https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options) führt das Zokrates-Programm tatsächlich aus. Sie gibt eine Struktur mit zwei Feldern zurück: `output`, die Ausgabe des Programms als JSON-String, und `witness`, die Informationen, die zur Erstellung eines Zero-Knowledge-Beweises des Ergebnisses benötigt werden. Hier benötigen wir nur die Ausgabe. +Die Funktion [`computeWitness`](https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options) führt das Zokrates-Programm tatsächlich aus. Sie gibt eine Struktur mit zwei Feldern zurück: `output`, was die Ausgabe des Programms als JSON-String ist, und `witness`, was die Informationen sind, die benötigt werden, um einen Zero-Knowledge-Beweis für das Ergebnis zu erstellen. Hier benötigen wir nur die Ausgabe. -Die Ausgabe ist ein String der Form `"31337"`, eine in Anführungszeichen eingeschlossene Dezimalzahl. Aber die Ausgabe, die wir für `viem` benötigen, ist eine hexadezimale Zahl der Form `0x60A7`. Also verwenden wir `.slice(1,-1)`, um die Anführungszeichen zu entfernen, und dann `BigInt`, um den verbleibenden String, der eine Dezimalzahl ist, in einen [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) umzuwandeln. `.toString(16)` wandelt diesen `BigInt` in einen hexadezimalen String um, und `"0x"+` fügt die Markierung für hexadezimale Zahlen hinzu. +Die Ausgabe ist ein String der Form `"31337"`, eine in Anführungszeichen eingeschlossene Dezimalzahl. Aber die Ausgabe, die wir für `viem` benötigen, ist eine hexadezimale Zahl der Form `0x60A7`. Also verwenden wir `.slice(1,-1)`, um die Anführungszeichen zu entfernen, und dann `BigInt`, um den verbleibenden String, der eine Dezimalzahl ist, in einen [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) umzuwandeln. `.toString(16)` konvertiert diesen `BigInt` in einen hexadezimalen String, und `"0x"+` fügt die Markierung für hexadezimale Zahlen hinzu. ```typescript -// Graben und einen Zero-Knowledge-Beweis des Ergebnisses zurückgeben +// Grabe und gib einen Zero-Knowledge-Beweis des Ergebnisses zurück // (serverseitiger Code) ``` @@ -462,16 +462,16 @@ Der Zero-Knowledge-Beweis enthält die öffentlichen Eingaben (`x` und `y`) und ```typescript const zkDig = function(map: boolean[][], x: number, y: number) : any { if (x<0 || x>=width || y<0 || y>=height) - throw new Error("Versuch, außerhalb der Karte zu graben") + throw new Error("Trying to dig outside the map") ``` -Es ist ein Problem, in Zokrates zu prüfen, ob ein Index außerhalb der Grenzen liegt, also tun wir es hier. +Es ist ein Problem, in Zokrates zu überprüfen, ob ein Index außerhalb der Grenzen liegt, also tun wir es hier. ```typescript const runResults = zokrates.computeWitness(digCompiled, [map, `${x}`, `${y}`]) ``` -Führen Sie das Grabungsprogramm aus. +Führen Sie das Grab-Programm aus. ```typescript const proof = zokrates.generateProof( @@ -487,12 +487,12 @@ Verwenden Sie [`generateProof`](https://zokrates.github.io/toolbox/zokrates_js.h ```typescript const solidityVerifier = ` - // Kartengröße: ${width} x ${height} + // Map size: ${width} x ${height} \n${zokrates.exportSolidityVerifier(verifierKey)} ` ``` -Ein Solidity-Verifizierer, ein Smart Contract, den wir auf der Blockchain bereitstellen und verwenden können, um Beweise zu verifizieren, die von `digCompiled.program` generiert wurden. +Ein Solidity-Verifizierer, ein Smart Contract, den wir auf der Blockchain bereitstellen und verwenden können, um von `digCompiled.program` generierte Beweise zu verifizieren. ```typescript return { @@ -503,47 +503,47 @@ Ein Solidity-Verifizierer, ein Smart Contract, den wir auf der Blockchain bereit } ``` -Schließlich geben Sie alles zurück, was anderer Code benötigen könnte. +Geben Sie schließlich alles zurück, was anderer Code benötigen könnte. ## Sicherheitstests {#security-tests} -Sicherheitstests sind wichtig, denn ein Funktionsfehler wird sich irgendwann von selbst zeigen. Aber wenn die Anwendung unsicher ist, bleibt das wahrscheinlich lange Zeit verborgen, bevor es von jemandem aufgedeckt wird, der betrügt und mit Ressourcen davonkommt, die anderen gehören. +Sicherheitstests sind wichtig, da sich ein Funktionsfehler irgendwann offenbaren wird. Wenn die Anwendung jedoch unsicher ist, bleibt dies wahrscheinlich lange Zeit verborgen, bevor es dadurch aufgedeckt wird, dass jemand betrügt und mit Ressourcen davonkommt, die anderen gehören. ### Berechtigungen {#permissions} -Es gibt eine privilegierte Entität in diesem Spiel, den Server. Es ist der einzige Benutzer, der berechtigt ist, die Funktionen in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol) aufzurufen. Wir können [`cast`](https://book.getfoundry.sh/cast/) verwenden, um zu überprüfen, dass Aufrufe von berechtigten Funktionen nur mit dem Serverkonto erlaubt sind. +Es gibt eine privilegierte Entität in diesem Spiel, den Server. Er ist der einzige Benutzer, der die Funktionen in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol) aufrufen darf. Wir können [`cast`](https://book.getfoundry.sh/cast/) verwenden, um zu überprüfen, ob Aufrufe von berechtigten Funktionen nur als Serverkonto zulässig sind. -[Der private Schlüssel des Servers befindet sich in `setupNetwork.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52). +[Der Private-Key des Servers befindet sich in `setupNetwork.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52). -1. Setzen Sie auf dem Computer, auf dem `anvil` (die Blockchain) läuft, diese Umgebungsvariablen. +1. Legen Sie auf dem Computer, auf dem `anvil` (die Blockchain) ausgeführt wird, diese Umgebungsvariablen fest. ```sh copy WORLD_ADDRESS=0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b UNAUTHORIZED_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a AUTHORIZED_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d - ``` +``` -2. Verwenden Sie `cast`, um zu versuchen, die Verifiziereradresse als eine nicht autorisierte Adresse festzulegen. +2. Verwenden Sie `cast`, um zu versuchen, die Verifizierer-Adresse als nicht autorisierte Adresse festzulegen. ```sh copy cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $UNAUTHORIZED_KEY - ``` +``` - Nicht nur meldet `cast` einen Fehler, sondern Sie können auch **MUD Dev Tools** im Spiel im Browser öffnen, auf **Tables** klicken und **app\_\_VerifierAddress** auswählen. Sehen Sie, dass die Adresse nicht null ist. + Nicht nur meldet `cast` einen Fehler, sondern Sie können auch die **MUD Dev Tools** im Spiel im Browser öffnen, auf **Tables** klicken und **app\_\_VerifierAddress** auswählen. Sehen Sie, dass die Adresse nicht null ist. -3. Setzen Sie die Verifiziereradresse als Adresse des Servers. +3. Legen Sie die Verifizierer-Adresse als Adresse des Servers fest. ```sh copy cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $AUTHORIZED_KEY - ``` +``` - Die Adresse in **app\_\_VerifiedAddress** sollte jetzt null sein. + Die Adresse in **app\_\_VerifiedAddress** sollte nun null sein. -Alle MUD-Funktionen im selben `System` durchlaufen dieselbe Zugriffskontrolle, daher halte ich diesen Test für ausreichend. Wenn nicht, können Sie die anderen Funktionen in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol) überprüfen. +Alle MUD-Funktionen im selben `System` durchlaufen dieselbe Zugriffskontrolle, daher halte ich diesen Test für ausreichend. Wenn Sie das nicht tun, können Sie die anderen Funktionen in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol) überprüfen. ### Zero-Knowledge-Missbrauch {#zero-knowledge-abuses} -Die Mathematik zur Verifizierung von Zokrates liegt außerhalb des Rahmens dieses Tutorials (und meiner Fähigkeiten). Wir können jedoch verschiedene Prüfungen am Zero-Knowledge-Code durchführen, um zu verifizieren, dass er bei fehlerhafter Ausführung fehlschlägt. All diese Tests erfordern, dass wir [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) ändern und die gesamte Anwendung neu starten. Es reicht nicht aus, den Serverprozess neu zu starten, da dies die Anwendung in einen unmöglichen Zustand versetzt (der Spieler hat ein Spiel im Gange, aber das Spiel ist für den Server nicht mehr verfügbar). +Die Mathematik zur Verifizierung von Zokrates sprengt den Rahmen dieses Tutorials (und meine Fähigkeiten). Wir können jedoch verschiedene Überprüfungen des Zero-Knowledge-Codes durchführen, um zu verifizieren, dass er fehlschlägt, wenn er nicht korrekt ausgeführt wird. Alle diese Tests erfordern, dass wir [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) ändern und die gesamte Anwendung neu starten. Es reicht nicht aus, den Serverprozess neu zu starten, da dies die Anwendung in einen unmöglichen Zustand versetzt (der Spieler hat ein laufendes Spiel, aber das Spiel ist für den Server nicht mehr verfügbar). #### Falsche Antwort {#wrong-answer} @@ -553,7 +553,7 @@ Die einfachste Möglichkeit besteht darin, im Zero-Knowledge-Beweis die falsche proof.inputs[3] = "0x" + "1".padStart(64, "0") ``` -Das bedeutet, wir werden immer behaupten, es gäbe eine Bombe, unabhängig von der richtigen Antwort. Versuchen Sie, mit dieser Version zu spielen, und Sie werden auf der Registerkarte **server** des `pnpm dev`-Bildschirms diesen Fehler sehen: +Das bedeutet, dass wir immer behaupten werden, es gäbe eine Bombe, unabhängig von der richtigen Antwort. Versuchen Sie, mit dieser Version zu spielen, und Sie werden im Tab **server** des Bildschirms `pnpm dev` diesen Fehler sehen: ``` cause: { @@ -569,7 +569,7 @@ Diese Art von Betrug schlägt also fehl. #### Falscher Beweis {#wrong-proof} -Was passiert, wenn wir die richtigen Informationen liefern, aber nur die falschen Beweisdaten haben? Ersetzen Sie nun Zeile 91 durch: +Was passiert, wenn wir die richtigen Informationen bereitstellen, aber einfach die falschen Beweisdaten haben? Ersetzen Sie nun Zeile 91 durch: ```ts proof.proof = { @@ -582,13 +582,13 @@ proof.proof = { } ``` -Es schlägt immer noch fehl, aber jetzt schlägt es ohne Grund fehl, weil es während des Verifizierungsaufrufs passiert. +Es schlägt immer noch fehl, aber jetzt schlägt es ohne Grund fehl, da es während des Verifizierer-Aufrufs passiert. -### Wie kann ein Benutzer den Zero-Trust-Code überprüfen? {#user-verify-zero-trust} +### Wie kann ein Benutzer den Zero-Trust-Code verifizieren? {#user-verify-zero-trust} -Smart Contracts sind relativ einfach zu überprüfen. Typischerweise veröffentlicht der Entwickler den Quellcode in einem Block-Explorer, und der Block-Explorer verifiziert, dass der Quellcode zum Code in der [Vertragsbereitstellungstransaktion](/developers/docs/smart-contracts/deploying/) kompiliert. Im Falle von MUD-`System`en ist dies [etwas komplizierter](https://mud.dev/cli/verify), aber nicht viel. +Smart Contracts sind relativ einfach zu verifizieren. Typischerweise veröffentlicht der Entwickler den Quellcode in einer Blocksuchmaschine, und die Blocksuchmaschine verifiziert, dass der Quellcode zu dem Code in der [Vertragsbereitstellungstransaktion](/developers/docs/smart-contracts/deploying/) kompiliert wird. Im Falle von MUD-`System`en ist dies [etwas komplizierter](https://mud.dev/cli/verify), aber nicht viel. -Mit Zero-Knowledge ist das schwieriger. Der Verifizierer enthält einige Konstanten und führt einige Berechnungen mit ihnen durch. Dies sagt Ihnen nicht, was bewiesen wird. +Dies ist bei Zero-Knowledge schwieriger. Der Verifizierer enthält einige Konstanten und führt einige Berechnungen mit ihnen durch. Dies sagt Ihnen nicht, was bewiesen wird. ```solidity function verifyingKey() pure internal returns (VerifyingKey memory vk) { @@ -596,13 +596,12 @@ Mit Zero-Knowledge ist das schwieriger. Der Verifizierer enthält einige Konstan vk.beta = Pairing.G2Point([uint256(0x2cebd0fbd21aca01910581537b21ae4fed46bc0e524c055059aa164ba0a6b62b), uint256(0x18fd4a7bc386cf03a95af7163d5359165acc4e7961cb46519e6d9ee4a1e2b7e9)], [uint256(0x11449dee0199ef6d8eebfe43b548e875c69e7ce37705ee9a00c81fe52f11a009), uint256(0x066d0c83b32800d3f335bb9e8ed5e2924cf00e77e6ec28178592eac9898e1a00)]); ``` -Die Lösung besteht, zumindest bis Block-Explorer dazu übergehen, Zokrates-Verifizierung zu ihren Benutzeroberflächen hinzuzufügen, darin, dass die Anwendungsentwickler die Zokrates-Programme zur Verfügung stellen und dass zumindest einige Benutzer sie selbst mit dem entsprechenden Verifizierungsschlüssel kompilieren. +Die Lösung, zumindest bis Blocksuchmaschinen dazu kommen, die Zokrates-Verifizierung zu ihren Benutzeroberflächen hinzuzufügen, besteht darin, dass die Anwendungsentwickler die Zokrates-Programme zur Verfügung stellen und dass zumindest einige Benutzer sie selbst mit dem entsprechenden Verifizierungsschlüssel kompilieren. -Dazu gehen Sie wie folgt vor: +Um dies zu tun: 1. [Installieren Sie Zokrates](https://zokrates.github.io/gettingstarted.html). - -2. Erstellen Sie eine Datei `dig.zok` mit dem Zokrates-Programm. Der nachstehende Code geht davon aus, dass Sie die ursprüngliche Kartengröße von 10x5 beibehalten haben. +2. Erstellen Sie eine Datei, `dig.zok`, mit dem Zokrates-Programm. Der folgende Code geht davon aus, dass Sie die ursprüngliche Kartengröße von 10x5 beibehalten haben. ```zokrates import "utils/pack/bool/pack128.zok" as pack128; @@ -630,7 +629,7 @@ Dazu gehen Sie wie folgt vor: } - // Die Anzahl der Minen am Ort (x,y) + // Die Anzahl der Minen an Position (x,y) def map2mineCount(bool[12][7] map, u32 x, u32 y) -> u8 { return if map[x+1][y+1] { 1 } else { 0 }; } @@ -644,91 +643,90 @@ Dazu gehen Sie wie folgt vor: } ); } - ``` +``` -3. Kompilieren Sie den Zokrates-Code und erstellen Sie den Verifizierungsschlüssel. Der Verifizierungsschlüssel muss mit der gleichen Entropie erstellt werden, die im ursprünglichen Server verwendet wurde, [in diesem Fall ein leerer String](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67). +3. Kompilieren Sie den Zokrates-Code und erstellen Sie den Verifizierungsschlüssel. Der Verifizierungsschlüssel muss mit derselben Entropie erstellt werden, die im ursprünglichen Server verwendet wurde, [in diesem Fall ein leerer String](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67). ```sh copy zokrates compile --input dig.zok zokrates setup -e "" - ``` +``` -4. Erstellen Sie den Solidity-Verifizierer selbst und überprüfen Sie, ob er funktionell mit dem auf der Blockchain identisch ist (der Server fügt einen Kommentar hinzu, aber das ist nicht wichtig). +4. Erstellen Sie den Solidity-Verifizierer selbst und verifizieren Sie, dass er funktional identisch mit dem auf der Blockchain ist (der Server fügt einen Kommentar hinzu, aber das ist nicht wichtig). ```sh copy zokrates export-verifier diff verifier.sol ~/20240901-secret-state/packages/contracts/src/verifier.sol - ``` +``` ## Designentscheidungen {#design} -In jeder ausreichend komplexen Anwendung gibt es konkurrierende Designziele, die Kompromisse erfordern. Schauen wir uns einige der Kompromisse an und warum die aktuelle Lösung anderen Optionen vorzuziehen ist. +In jeder ausreichend komplexen Anwendung gibt es konkurrierende Designziele, die Kompromisse erfordern. Lassen Sie uns einige der Kompromisse betrachten und warum die aktuelle Lösung anderen Optionen vorzuziehen ist. ### Warum Zero-Knowledge {#why-zero-knowledge} -Für Minesweeper braucht man nicht wirklich Zero-Knowledge. Der Server kann die Karte immer behalten und sie dann einfach aufdecken, wenn das Spiel vorbei ist. Dann kann der Smart Contract am Ende des Spiels den Karten-Hash berechnen, überprüfen, ob er übereinstimmt, und wenn nicht, den Server bestrafen oder das Spiel vollständig ignorieren. +Für Minesweeper benötigen Sie nicht wirklich Zero-Knowledge. Der Server kann die Karte immer halten und sie dann einfach komplett aufdecken, wenn das Spiel vorbei ist. Dann kann der Smart Contract am Ende des Spiels den Karten-Hash berechnen, verifizieren, dass er übereinstimmt, und wenn nicht, den Server bestrafen oder das Spiel komplett ignorieren. -Ich habe diese einfachere Lösung nicht verwendet, da sie nur für kurze Spiele mit einem genau definierten Endzustand funktioniert. Wenn ein Spiel potenziell unendlich ist (wie im Fall von [autonomen Welten](https://0xparc.org/blog/autonomous-worlds)), benötigen Sie eine Lösung, die den Zustand beweist, _ohne_ ihn preiszugeben. +Ich habe diese einfachere Lösung nicht verwendet, da sie nur für kurze Spiele mit einem gut definierten Endzustand funktioniert. Wenn ein Spiel potenziell unendlich ist (wie im Fall von [autonomen Welten](https://0xparc.org/blog/autonomous-worlds)), benötigen Sie eine Lösung, die den Status beweist, _ohne_ ihn preiszugeben. -Als Tutorial benötigte dieser Artikel ein kurzes, leicht verständliches Spiel, aber diese Technik ist am nützlichsten für längere Spiele. +Als Tutorial benötigte dieser Artikel ein kurzes Spiel, das leicht zu verstehen ist, aber diese Technik ist am nützlichsten für längere Spiele. ### Warum Zokrates? {#why-zokrates} [Zokrates](https://zokrates.github.io/) ist nicht die einzige verfügbare Zero-Knowledge-Bibliothek, aber sie ähnelt einer normalen, [imperativen](https://en.wikipedia.org/wiki/Imperative_programming) Programmiersprache und unterstützt boolesche Variablen. -Für Ihre Anwendung, mit unterschiedlichen Anforderungen, bevorzugen Sie möglicherweise die Verwendung von [Circum](https://docs.circom.io/getting-started/installation/) oder [Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/). +Für Ihre Anwendung mit anderen Anforderungen ziehen Sie es möglicherweise vor, [Circum](https://docs.circom.io/getting-started/installation/) oder [Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/). -### Wann Zokrates kompilieren {#when-compile-zokrates} +### Wann Zokrates kompiliert werden sollte {#when-compile-zokrates} -In diesem Programm kompilieren wir die Zokrates-Programme [jedes Mal, wenn der Server startet](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61). Das ist eindeutig eine Verschwendung von Ressourcen, aber dies ist ein Tutorial, das auf Einfachheit optimiert ist. +In diesem Programm kompilieren wir die Zokrates-Programme [jedes Mal, wenn der Server startet](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61). Dies ist eindeutig eine Verschwendung von Ressourcen, aber dies ist ein Tutorial, das auf Einfachheit optimiert ist. -Wenn ich eine produktionsreife Anwendung schreiben würde, würde ich prüfen, ob ich eine Datei mit den kompilierten Zokrates-Programmen für diese Minenfeldgröße habe, und wenn ja, diese verwenden. Dasselbe gilt für die Bereitstellung eines Verifizierervertrags onchain. +Wenn ich eine Anwendung auf Produktionsniveau schreiben würde, würde ich überprüfen, ob ich eine Datei mit den kompilierten Zokrates-Programmen in dieser Minenfeldgröße habe, und wenn ja, diese verwenden. Dasselbe gilt für die Bereitstellung eines Verifizierer-Vertrags auf der Blockchain. -### Erstellen der Verifizierer- und Prüferschlüssel {#key-creation} +### Erstellen der Verifizierer- und Beweiser-Schlüssel {#key-creation} -Die [Schlüsselerstellung](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69) ist eine weitere reine Berechnung, die für eine gegebene Minenfeldgröße nicht mehr als einmal durchgeführt werden muss. Auch hier wird es aus Gründen der Einfachheit nur einmal gemacht. +Die [Schlüsselerstellung](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69) ist eine weitere reine Berechnung, die für eine bestimmte Minenfeldgröße nicht mehr als einmal durchgeführt werden muss. Auch hier wird sie der Einfachheit halber nur einmal durchgeführt. -Zusätzlich könnten wir eine [Setup-Zeremonie](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) verwenden. Der Vorteil einer Setup-Zeremonie besteht darin, dass man entweder die Entropie oder ein Zwischenergebnis von jedem Teilnehmer benötigt, um beim Zero-Knowledge-Beweis zu betrügen. Wenn mindestens ein Teilnehmer der Zeremonie ehrlich ist und diese Informationen löscht, sind die Zero-Knowledge-Beweise vor bestimmten Angriffen sicher. Es gibt jedoch _keinen Mechanismus_, um zu überprüfen, ob Informationen von überall gelöscht wurden. Wenn Zero-Knowledge-Beweise von entscheidender Bedeutung sind, sollten Sie an der Setup-Zeremonie teilnehmen. +Zusätzlich könnten wir [eine Setup-Zeremonie](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) verwenden. Der Vorteil einer Setup-Zeremonie besteht darin, dass Sie entweder die Entropie oder ein Zwischenergebnis von jedem Teilnehmer benötigen, um beim Zero-Knowledge-Beweis zu betrügen. Wenn mindestens ein Zeremonieteilnehmer ehrlich ist und diese Informationen löscht, sind die Zero-Knowledge-Beweise vor bestimmten Angriffen sicher. Es gibt jedoch _keinen Mechanismus_, um zu verifizieren, dass Informationen überall gelöscht wurden. Wenn Zero-Knowledge-Beweise von entscheidender Bedeutung sind, möchten Sie an der Setup-Zeremonie teilnehmen. -Hier verlassen wir uns auf [perpetual powers of tau](https://github.com/privacy-scaling-explorations/perpetualpowersoftau), an denen Dutzende von Teilnehmern beteiligt waren. Es ist wahrscheinlich sicher genug und viel einfacher. Wir fügen auch keine Entropie während der Schlüsselerstellung hinzu, was es den Benutzern erleichtert, die [Zero-Knowledge-Konfiguration zu überprüfen](#user-verify-zero-trust). +Hier verlassen wir uns auf [Perpetual Powers of Tau](https://github.com/privacy-scaling-explorations/perpetualpowersoftau), an dem Dutzende von Teilnehmern beteiligt waren. Es ist wahrscheinlich sicher genug und viel einfacher. Wir fügen während der Schlüsselerstellung auch keine Entropie hinzu, was es Benutzern erleichtert, [die Zero-Knowledge-Konfiguration zu verifizieren](#user-verify-zero-trust). -### Wo verifizieren {#where-verification} +### Wo verifiziert werden soll {#where-verification} -Wir können die Zero-Knowledge-Beweise entweder onchain (was Gas kostet) oder im Client (mithilfe von [`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof)) verifizieren. Ich habe die erste gewählt, da Sie damit [den Verifizierer einmal überprüfen](#user-verify-zero-trust) und dann darauf vertrauen können, dass er sich nicht ändert, solange die Vertragsadresse dafür gleich bleibt. Wenn die Verifizierung auf dem Client durchgeführt würde, müssten Sie den Code jedes Mal überprüfen, wenn Sie den Client herunterladen. +Wir können die Zero-Knowledge-Beweise entweder auf der Blockchain (was Gas kostet) oder in der Anwendung (mit [`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof)) verifizieren. Ich habe mich für Ersteres entschieden, da Sie so [den Verifizierer verifizieren](#user-verify-zero-trust) können und dann darauf vertrauen können, dass er sich nicht ändert, solange die Vertragsadresse dafür gleich bleibt. Wenn die Verifizierung in der Anwendung durchgeführt würde, müssten Sie den Code, den Sie erhalten, jedes Mal verifizieren, wenn Sie die Anwendung herunterladen. -Auch wenn dieses Spiel Einzelspieler ist, sind viele Blockchain-Spiele Mehrspieler. Onchain-Verifizierung bedeutet, dass Sie den Zero-Knowledge-Beweis nur einmal verifizieren. Wenn man es im Client macht, müsste jeder Client unabhängig verifizieren. +Auch wenn dieses Spiel ein Einzelspielerspiel ist, sind viele Blockchain-Spiele Mehrspielerspiele. Die Verifizierung auf der Blockchain bedeutet, dass Sie den Zero-Knowledge-Beweis nur einmal verifizieren. Wenn Sie dies in der Anwendung tun, müsste jede Anwendung unabhängig verifizieren. ### Die Karte in TypeScript oder Zokrates abflachen? {#where-flatten} -Im Allgemeinen ist es besser, die Verarbeitung in TypeScript durchzuführen, wenn sie entweder in TypeScript oder Zokrates erfolgen kann, da TypeScript viel schneller ist und keine Zero-Knowledge-Beweise erfordert. Dies ist zum Beispiel der Grund, warum wir Zokrates nicht den Hash zur Verfügung stellen und ihn überprüfen lassen, ob er korrekt ist. Das Hashing muss innerhalb von Zokrates erfolgen, aber der Abgleich zwischen dem zurückgegebenen Hash und dem Hash onchain kann außerhalb davon stattfinden. +Im Allgemeinen ist es besser, die Verarbeitung in TypeScript durchzuführen, wenn sie entweder in TypeScript oder in Zokrates erfolgen kann, da dies viel schneller ist und keine Zero-Knowledge-Beweise erfordert. Dies ist beispielsweise der Grund, warum wir Zokrates nicht den Hash zur Verfügung stellen und ihn verifizieren lassen, dass er korrekt ist. Das Hashing muss innerhalb von Zokrates erfolgen, aber der Abgleich zwischen dem zurückgegebenen Hash und dem Hash auf der Blockchain kann außerhalb davon erfolgen. -Allerdings [flachen wir die Karte immer noch in Zokrates ab](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20), obwohl wir es auch in TypeScript hätten tun können. Der Grund ist, dass die anderen Optionen meiner Meinung nach schlechter sind. +Wir [flachen die Karte jedoch immer noch in Zokrates ab](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20), obwohl wir dies in TypeScript hätten tun können. Der Grund ist, dass die anderen Optionen meiner Meinung nach schlechter sind. -- Stellen Sie dem Zokrates-Code ein eindimensionales Array von Booleschen Werten zur Verfügung und verwenden Sie einen Ausdruck wie `x*(height+2) - +y`, um die zweidimensionale Karte zu erhalten. Dies würde [den Code](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47) etwas komplizierter machen, also habe ich entschieden, dass der Leistungsgewinn für ein Tutorial nicht wert ist. +- Stellen Sie dem Zokrates-Code ein eindimensionales Array von Booleschen Werten zur Verfügung und verwenden Sie einen Ausdruck wie `x*(height+2)+y`, um die zweidimensionale Karte zu erhalten. Dies würde [den Code](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47) etwas komplizierter machen, also habe ich entschieden, dass der Leistungsgewinn für ein Tutorial nicht lohnenswert ist. -- Senden Sie Zokrates sowohl das eindimensionale als auch das zweidimensionale Array. Diese Lösung bringt uns jedoch nichts. Der Zokrates-Code müsste überprüfen, ob das bereitgestellte eindimensionale Array wirklich die korrekte Darstellung des zweidimensionalen Arrays ist. Es gäbe also keinen Leistungsgewinn. +- Senden Sie Zokrates sowohl das eindimensionale Array als auch das zweidimensionale Array. Diese Lösung bringt uns jedoch nichts. Der Zokrates-Code müsste verifizieren, dass das bereitgestellte eindimensionale Array wirklich die korrekte Darstellung des zweidimensionalen Arrays ist. Es gäbe also keinen Leistungsgewinn. - Flachen Sie das zweidimensionale Array in Zokrates ab. Dies ist die einfachste Option, also habe ich sie gewählt. -### Wo Karten speichern {#where-store-maps} +### Wo Karten gespeichert werden sollen {#where-store-maps} -In dieser Anwendung ist [`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20) einfach eine Variable im Speicher. Das bedeutet, dass, wenn Ihr Server ausfällt und neu gestartet werden muss, alle gespeicherten Informationen verloren gehen. Spieler können nicht nur ihr Spiel nicht fortsetzen, sie können nicht einmal ein neues Spiel starten, weil die Onchain-Komponente denkt, dass sie noch ein Spiel im Gange haben. +In dieser Anwendung ist [`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20) einfach eine Variable im Speicher. Das bedeutet, dass alle gespeicherten Informationen verloren gehen, wenn Ihr Server abstürzt und neu gestartet werden muss. Die Spieler können nicht nur ihr Spiel nicht fortsetzen, sie können nicht einmal ein neues Spiel starten, da die Komponente auf der Blockchain denkt, dass sie noch ein laufendes Spiel haben. Dies ist eindeutig ein schlechtes Design für ein Produktionssystem, in dem Sie diese Informationen in einer Datenbank speichern würden. Der einzige Grund, warum ich hier eine Variable verwendet habe, ist, dass dies ein Tutorial ist und Einfachheit die Hauptüberlegung ist. ## Fazit: Unter welchen Bedingungen ist dies die geeignete Technik? {#conclusion} -So, jetzt wissen Sie, wie man ein Spiel mit einem Server schreibt, der geheime Zustände speichert, die nicht onchain gehören. Aber in welchen Fällen sollten Sie es tun? Es gibt zwei Hauptüberlegungen. +Jetzt wissen Sie also, wie man ein Spiel mit einem Server schreibt, der einen geheimen Status speichert, der nicht auf die Blockchain gehört. Aber in welchen Fällen sollten Sie das tun? Es gibt zwei Hauptüberlegungen. -- _Langlaufendes Spiel_: [Wie oben erwähnt](#why-zero-knowledge), können Sie in einem kurzen Spiel den Zustand einfach veröffentlichen, sobald das Spiel vorbei ist, und dann alles verifizieren lassen. Aber das ist keine Option, wenn das Spiel eine lange oder unbestimmte Zeit dauert und der Zustand geheim bleiben muss. +- _Lang laufendes Spiel_: [Wie oben erwähnt](#why-zero-knowledge), können Sie in einem kurzen Spiel den Status einfach veröffentlichen, sobald das Spiel vorbei ist, und dann alles verifizieren lassen. Das ist jedoch keine Option, wenn das Spiel lange oder auf unbestimmte Zeit dauert und der Status geheim bleiben muss. -- _Etwas Zentralisierung akzeptabel_: Zero-Knowledge-Beweise können die Integrität überprüfen, dass eine Entität die Ergebnisse nicht fälscht. Was sie nicht tun können, ist sicherzustellen, dass die Entität weiterhin verfügbar ist und auf Nachrichten antwortet. In Situationen, in denen die Verfügbarkeit auch dezentralisiert sein muss, sind Zero-Knowledge-Beweise keine ausreichende Lösung, und Sie benötigen eine [Mehrparteienberechnung](https://en.wikipedia.org/wiki/Secure_multi-party_computation). +- _Eine gewisse Zentralisierung ist akzeptabel_: Zero-Knowledge-Beweise können die Integrität verifizieren, dass eine Entität die Ergebnisse nicht fälscht. Was sie nicht können, ist sicherzustellen, dass die Entität weiterhin verfügbar ist und auf Nachrichten antwortet. In Situationen, in denen auch die Verfügbarkeit dezentralisiert sein muss, sind Zero-Knowledge-Beweise keine ausreichende Lösung, und Sie benötigen [Multi-Party Computation](https://en.wikipedia.org/wiki/Secure_multi-party_computation). -[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). -### Anerkennungen {#acknowledgements} +### Danksagungen {#acknowledgements} -- Alvaro Alonso las einen Entwurf dieses Artikels und klärte einige meiner Missverständnisse über Zokrates auf. +- Alvaro Alonso hat einen Entwurf dieses Artikels gelesen und einige meiner Missverständnisse über Zokrates geklärt. -Alle verbleibenden Fehler liegen in meiner Verantwortung. +Alle verbleibenden Fehler liegen in meiner Verantwortung. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md index 9d432f68818..3fa09ccc82c 100644 --- a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md @@ -1,53 +1,53 @@ --- -title: Smart-Contract-Sicherheitscheckliste +title: "Checkliste für die Sicherheit von Smart Contracts" description: Ein empfohlener Workflow zum Schreiben sicherer Smart Contracts author: "Trailofbits" -tags: ["smart contracts", "security", "solidity"] +tags: ["Smart Contracts", "Sicherheit", "Solidity"] skill: intermediate -breadcrumb: "Sicherheitscheckliste" +breadcrumb: Sicherheits-Checkliste lang: de published: 2020-09-07 source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md --- -## Smart-Contract-Entwicklungscheckliste {#smart-contract-development-checklist} +## Checkliste für die Entwicklung von Smart Contracts {#smart-contract-development-checklist} -Nachfolgend finden Sie einen allgemeinen Prozess, dessen Befolgung wir beim Schreiben Ihrer Smart Contracts empfehlen. +Hier ist ein allgemeiner Prozess, den wir empfehlen, während Sie Ihre Smart Contracts schreiben. -Auf bekannte Sicherheitsprobleme prüfen: +Prüfen Sie auf bekannte Sicherheitsprobleme: -- Überprüfen Sie Ihre Verträge mit [Slither](https://github.com/crytic/slither). Es verfügt über mehr als 40 integrierte Detektoren für häufige Schwachstellen. Führen Sie es bei jedem Check-in mit neuem Code aus und stellen Sie sicher, dass Sie einen fehlerfreien Bericht erhalten (oder verwenden Sie den Triage-Modus, um bestimmte Probleme auszublenden). -- Überprüfen Sie Ihre Verträge mit [Crytic](https://crytic.io/). Es prüft auf 50 Probleme, die von Slither nicht geprüft werden. Crytic kann Ihrem Team auch dabei helfen, den Überblick zu behalten, indem es Sicherheitsprobleme in Pull-Requests auf GitHub leicht aufdeckt. +- Überprüfen Sie Ihre Verträge mit [Slither](https://github.com/crytic/slither). Es verfügt über mehr als 40 integrierte Detektoren für häufige Schwachstellen. Führen Sie es bei jedem Check-in mit neuem Code aus und stellen Sie sicher, dass es einen sauberen Bericht erhält (oder verwenden Sie den Triage-Modus, um bestimmte Probleme stummzuschalten). +- Überprüfen Sie Ihre Verträge mit [Crytic](https://crytic.io/). Es prüft auf 50 Probleme, die Slither nicht erkennt. Crytic kann Ihrem Team auch dabei helfen, den Überblick zu behalten, indem es Sicherheitsprobleme in Pull Requests auf GitHub leicht sichtbar macht. -Berücksichtigen Sie die besonderen Merkmale Ihres Vertrags: +Berücksichtigen Sie besondere Merkmale Ihres Vertrags: -- Sind Ihre Verträge upgradefähig? Überprüfen Sie Ihren Upgradefähigkeits-Code auf Fehler mit [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) oder [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Wir haben 17 Möglichkeiten dokumentiert, wie Upgrades fehlschlagen können. -- Erheben Ihre Verträge den Anspruch, ERC-konform zu sein? Überprüfen Sie sie mit [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Dieses Tool erkennt sofort Abweichungen von sechs gängigen Spezifikationen. -- Integrieren Sie Token von Drittanbietern? Lesen Sie unsere [Checkliste für die Token-Integration](/developers/tutorials/token-integration-checklist/), bevor Sie sich auf externe Verträge verlassen. +- Sind Ihre Verträge aktualisierbar? Überprüfen Sie Ihren Code für die Aktualisierbarkeit auf Fehler mit [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) oder [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Wir haben 17 Wege dokumentiert, wie Upgrades schiefgehen können. +- Geben Ihre Verträge vor, den ERCs zu entsprechen? Überprüfen Sie sie mit [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Dieses Tool erkennt sofort Abweichungen von sechs gängigen Spezifikationen. +- Integrieren Sie Token von Drittanbietern? Lesen Sie unsere [Checkliste zur Token-Integration](/developers/tutorials/token-integration-checklist/), bevor Sie sich auf externe Verträge verlassen. -Überprüfen Sie die kritischen Sicherheitsmerkmale Ihres Codes visuell: +Überprüfen Sie kritische Sicherheitsmerkmale Ihres Codes visuell: -- Überprüfen Sie den [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph)-Printer von Slither. Vermeiden Sie unbeabsichtigtes Shadowing und Probleme mit der C3-Linearisierung. -- Überprüfen Sie den [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary)-Printer von Slither. Er meldet die Sichtbarkeit von Funktionen und die Zugriffskontrollen. -- Überprüfen Sie den [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization)-Printer von Slither. Er meldet die Zugriffskontrollen für Zustandsvariablen. +- Überprüfen Sie den [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph)-Drucker von Slither. Vermeiden Sie unbeabsichtigtes Shadowing und Probleme mit der C3-Linearisierung. +- Überprüfen Sie den [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary)-Drucker von Slither. Er meldet die Sichtbarkeit von Funktionen und Zugriffskontrollen. +- Überprüfen Sie den [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization)-Drucker von Slither. Er meldet Zugriffskontrollen für Zustandsvariablen. -Dokumentieren Sie kritische Sicherheitseigenschaften und verwenden Sie automatisierte Testgeneratoren, um sie zu bewerten: +Dokumentieren Sie kritische Sicherheitseigenschaften und verwenden Sie automatisierte Testgeneratoren, um diese zu bewerten: -- Lernen Sie, [wie Sie Sicherheitseigenschaften für Ihren Code dokumentieren](/developers/tutorials/guide-to-smart-contract-security-tools/). Anfangs ist es schwierig, aber es ist die wichtigste Tätigkeit, um ein gutes Ergebnis zu erzielen. Es ist auch eine Voraussetzung für die Anwendung der fortgeschrittenen Techniken in diesem Tutorial. -- Definieren Sie Sicherheitseigenschaften in Solidity, zur Verwendung mit [Echidna](https://github.com/crytic/echidna) und [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Konzentrieren Sie sich auf Ihre Statusmaschine, Zugriffskontrollen, arithmetische Operationen, externe Interaktionen und die Einhaltung von Standards. +- Lernen Sie, [Sicherheitseigenschaften für Ihren Code zu dokumentieren](/developers/tutorials/guide-to-smart-contract-security-tools/). Es ist anfangs schwierig, aber es ist die wichtigste Aktivität, um ein gutes Ergebnis zu erzielen. Es ist auch eine Voraussetzung für die Verwendung der fortgeschrittenen Techniken in diesem Tutorial. +- Definieren Sie Sicherheitseigenschaften in Solidity zur Verwendung mit [Echidna](https://github.com/crytic/echidna) und [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Konzentrieren Sie sich auf Ihre Zustandsmaschine, Zugriffskontrollen, arithmetische Operationen, externe Interaktionen und die Einhaltung von Standards. - Definieren Sie Sicherheitseigenschaften mit der [Python-API von Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Konzentrieren Sie sich auf Vererbung, Variablenabhängigkeiten, Zugriffskontrollen und andere strukturelle Probleme. -- Führen Sie Ihre Eigenschaftstests bei jedem Commit mit [Crytic](https://crytic.io) aus. Crytic kann Tests von Sicherheitseigenschaften verarbeiten und auswerten, sodass jeder in Ihrem Team auf GitHub leicht sehen kann, dass sie erfolgreich sind. Fehlgeschlagene Tests können Commits blockieren. +- Führen Sie Ihre Eigenschaftstests bei jedem Commit mit [Crytic](https://crytic.io) aus. Crytic kann Sicherheitseigenschaftstests verarbeiten und auswerten, sodass jeder in Ihrem Team auf GitHub leicht sehen kann, dass sie bestanden wurden. Fehlgeschlagene Tests können Commits blockieren. -Achten Sie schließlich auf Probleme, die automatisierte Werkzeuge nicht leicht finden können: +Achten Sie schließlich auf Probleme, die automatisierte Tools nicht leicht finden können: -- Mangelnde Privatsphäre: Alle anderen können Ihre Transaktionen sehen, während sie sich im Pool in der Warteschlange befinden. -- Front-Running von Transaktionen +- Mangelnde Privatsphäre: Alle anderen können Ihre Transaktionen sehen, während sie im Pool in der Warteschlange stehen +- Front-Running-Transaktionen - Kryptografische Operationen - Riskante Interaktionen mit externen DeFi-Komponenten ## Bitten Sie um Hilfe {#ask-for-help} -Die [Ethereum-Sprechstunden](https://calendly.com/dan-trailofbits/office-hours) finden jeden Dienstagnachmittag statt. Diese einstündigen Einzelsitzungen sind eine Gelegenheit, uns alle Ihre Fragen zur Sicherheit zu stellen, Probleme bei der Verwendung unserer Werkzeuge zu beheben und Feedback von Experten zu Ihrem aktuellen Ansatz zu erhalten. Wir helfen Ihnen, diesen Leitfaden durchzuarbeiten. +Die [Ethereum-Sprechstunden](https://calendly.com/dan-trailofbits/office-hours) finden jeden Dienstagnachmittag statt. Diese einstündigen 1-zu-1-Sitzungen bieten die Gelegenheit, uns alle Fragen zum Thema Sicherheit zu stellen, Fehler mit unseren Tools zu beheben und Feedback von Experten zu Ihrem aktuellen Ansatz zu erhalten. Wir helfen Ihnen bei der Durcharbeitung dieses Leitfadens. -Treten Sie unserem Slack bei: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Wir sind immer in den Kanälen #crytic und #ethereum erreichbar, wenn Sie Fragen haben. +Treten Sie unserem Slack bei: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Wir sind bei Fragen jederzeit in den Kanälen #crytic und #ethereum erreichbar. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md index fdd2b48952b..cfe239af083 100644 --- a/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md +++ b/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md @@ -1,26 +1,26 @@ --- title: Senden von Token mit ethers.js -description: Einsteigerfreundliche Anleitung zum Senden von Token mit ethers.js. +description: "Anfängerfreundliche Anleitung zum Senden von Token mit ethers.js." author: Kim YongJun -tags: [ "ETHERS.JS", "ERC-20", "TOKENS" ] +tags: ["ETHERS.JS", "ERC-20", "Token"] skill: beginner -breadcrumb: "Token senden" +breadcrumb: Token senden lang: de published: 2021-04-06 --- -## Token senden mit ethers.js (5.0) {#send-token} +## Token senden mit ethers.js(5.0) {#send-token} -### In diesem Tutorial erfahren Sie, wie Sie {#you-learn-about} +### In diesem Tutorial lernen Sie Folgendes {#you-learn-about} -- Ethers.js importieren -- Token transferieren -- Gas-Preis entsprechend der Netzwerkauslastung festlegen +- ethers.js importieren +- Token übertragen +- Den Gaspreis entsprechend der Auslastung des Netzwerks festlegen ### Erste Schritte {#to-get-started} -Zu Beginn müssen wir zunächst die ethers.js-Bibliothek in unser Javascript importieren -Binden Sie ethers.js (5.0) ein +Um zu beginnen, müssen wir zunächst die Bibliothek ethers.js in unser JavaScript importieren. +ethers.js(5.0) einbinden ### Installation {#install-ethersjs} @@ -33,7 +33,7 @@ ES6 im Browser ```html ``` @@ -51,16 +51,16 @@ ES3(UMD) im Browser 1. **`contract_address`**: Token-Vertragsadresse (die Vertragsadresse wird benötigt, wenn der Token, den Sie übertragen möchten, nicht Ether ist) 2. **`send_token_amount`**: Der Betrag, den Sie an den Empfänger senden möchten 3. **`to_address`**: Die Adresse des Empfängers -4. **`send_account`**: Die Adresse des Absenders -5. **`private_key`**: Privater Schlüssel des Absenders, um die Transaktion zu signieren und die Token tatsächlich zu übertragen +4. **`send_account`**: Die Adresse des Senders +5. **`private_key`**: Private-Key des Senders, um die Transaktion zu signieren und die Token tatsächlich zu übertragen ## Hinweis {#notice} -`signTransaction(tx)` wird entfernt, da `sendTransaction()` dies intern erledigt. +`signTransaction(tx)` wurde entfernt, da `sendTransaction()` dies intern erledigt. -## Sendeablauf {#procedure} +## Sendevorgang {#procedure} -### 1. Mit dem Netzwerk (Testnet) verbinden {#connect-to-network} +### 1. Mit dem Netzwerk verbinden (Testnet) {#connect-to-network} #### Provider festlegen (Infura) {#set-provider} @@ -82,7 +82,7 @@ let wallet = new ethers.Wallet(private_key) let walletSigner = wallet.connect(window.ethersProvider) ``` -### 4. Aktuellen Gas-Preis abrufen {#get-gas} +### 4. Aktuellen Gaspreis abrufen {#get-gas} ```javascript window.ethersProvider.getGasPrice() // gasPrice @@ -90,17 +90,17 @@ window.ethersProvider.getGasPrice() // gasPrice ### 5. Transaktion definieren {#define-transaction} -Die unten definierten Variablen sind von `send_token()` abhängig +Diese unten definierten Variablen sind abhängig von `send_token()` ### Transaktionsparameter {#transaction-params} -1. **`send_account`**: Adresse des Token-Absenders +1. **`send_account`**: Adresse des Token-Senders 2. **`to_address`**: Adresse des Token-Empfängers -3. **`send_token_amount`**: die Anzahl der zu sendenden Token +3. **`send_token_amount`**: Die Menge der zu sendenden Token 4. **`gas_limit`**: Gaslimit -5. **`gas_price`**: Gas-Preis +5. **`gas_price`**: Gaspreis -[Siehe unten zur Verwendung](#how-to-use) +[Siehe unten für die Verwendung](#how-to-use) ```javascript const tx = { @@ -113,12 +113,12 @@ const tx = { } ``` -### 6. Übertragung {#transfer} +### 6. Übertragen {#transfer} ```javascript walletSigner.sendTransaction(tx).then((transaction) => { console.dir(transaction) - alert("Senden abgeschlossen!") + alert("Send finished!") }) ``` @@ -174,14 +174,14 @@ function send_token( walletSigner ) - // Wie viele Token? + // Wie viele Tokens? let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) console.log(`numberOfTokens: ${numberOfTokens}`) - // Token senden + // Tokens senden contract.transfer(to_address, numberOfTokens).then((transferResult) => { console.dir(transferResult) - alert("Token gesendet") + alert("sent token") }) } // Ether senden else { @@ -200,12 +200,12 @@ function send_token( try { walletSigner.sendTransaction(tx).then((transaction) => { console.dir(transaction) - alert("Senden abgeschlossen!") + alert("Send finished!") }) } catch (error) { - alert("Senden fehlgeschlagen!!") + alert("failed to send!!") } } }) } -``` +``` \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md new file mode 100644 index 00000000000..66edb0e3ffe --- /dev/null +++ b/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -0,0 +1,209 @@ +--- +title: Senden von Transaktionen mit Web3 +description: "Dies ist ein anfängerfreundlicher Leitfaden zum Senden von Ethereum-Transaktionen mit Web3. Es gibt drei Hauptschritte, um eine Transaktion an die Ethereum-Blockchain zu senden: Erstellen, Signieren und Übertragen. Wir werden alle drei durchgehen." +author: "Elan Halpern" +tags: ["Transaktionen", "web3.js", "Alchemy"] +skill: beginner +breadcrumb: Transaktionen senden +lang: de +published: 2020-11-04 +source: Alchemy docs +sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum +--- + +Dies ist ein anfängerfreundlicher Leitfaden zum Senden von Ethereum-Transaktionen mit Web3. Es gibt drei Hauptschritte, um eine Transaktion an die Ethereum-Blockchain zu senden: Erstellen, Signieren und Übertragen. Wir werden alle drei durchgehen und hoffentlich alle Ihre Fragen beantworten! In diesem Tutorial verwenden wir [Alchemy](https://www.alchemy.com/), um unsere Transaktionen an die Ethereum-Blockchain zu senden. Sie können [hier ein kostenloses Alchemy-Konto erstellen](https://auth.alchemyapi.io/signup). + +**HINWEIS:** Dieser Leitfaden ist für das Signieren Ihrer Transaktionen im _Backend_ Ihrer App gedacht. Wenn Sie das Signieren Ihrer Transaktionen im Frontend integrieren möchten, lesen Sie mehr über die Integration von [Web3 mit einem Browser-Anbieter](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider). + +## Die Grundlagen {#the-basics} + +Wie die meisten Blockchain-Entwickler zu Beginn haben Sie vielleicht recherchiert, wie man eine Transaktion sendet (etwas, das eigentlich ziemlich einfach sein sollte), und sind auf eine Fülle von Leitfäden gestoßen, die alle etwas anderes sagen und Sie ein wenig überfordert und verwirrt zurücklassen. Wenn es Ihnen so geht, machen Sie sich keine Sorgen; das ging uns allen irgendwann so! Bevor wir also anfangen, lassen Sie uns ein paar Dinge klarstellen: + +### 1\. Alchemy speichert Ihre Private-Keys nicht {#alchemy-does-not-store-your-private-keys} + +- Das bedeutet, dass Alchemy keine Transaktionen in Ihrem Namen signieren und senden kann. Der Grund dafür sind Sicherheitszwecke. Alchemy wird Sie niemals bitten, Ihren Private-Key weiterzugeben, und Sie sollten Ihren Private-Key niemals an einen gehosteten Blockchain-Knoten (oder überhaupt an jemanden) weitergeben. +- Sie können mit der Kern-API von Alchemy von der Blockchain lesen, aber um darauf zu schreiben, müssen Sie etwas anderes verwenden, um Ihre Transaktionen zu signieren, bevor Sie sie über Alchemy senden (dies gilt auch für jeden anderen [Blockchain-Knoten-Dienst](/developers/docs/nodes-and-clients/nodes-as-a-service/)). + +### 2\. Was ist ein „Signer“? {#what-is-a-signer} + +- Signer signieren Transaktionen für Sie mit Ihrem Private-Key. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), um unsere Transaktion zu signieren, aber Sie könnten auch jede andere Web3-Bibliothek verwenden. +- Im Frontend wäre ein gutes Beispiel für einen Signer [MetaMask](https://metamask.io/), das Transaktionen in Ihrem Namen signiert und sendet. + +### 3\. Warum muss ich meine Transaktionen signieren? {#why-do-i-need-to-sign-my-transactions} + +- Jeder Benutzer, der eine Transaktion im Ethereum-Netzwerk senden möchte, muss die Transaktion (mit seinem Private-Key) signieren, um zu validieren, dass der Ursprung der Transaktion derjenige ist, der er vorgibt zu sein. +- Es ist extrem wichtig, diesen Private-Key zu schützen, da der Zugriff darauf die volle Kontrolle über Ihr Ethereum-Konto gewährt und es Ihnen (oder jedem mit Zugriff) ermöglicht, Transaktionen in Ihrem Namen durchzuführen. + +### 4\. Wie schütze ich meinen Private-Key? {#how-do-i-protect-my-private-key} + +- Es gibt viele Möglichkeiten, Ihren Private-Key zu schützen und ihn zum Senden von Transaktionen zu verwenden. In diesem Tutorial verwenden wir eine `.env`-Datei. Sie könnten jedoch auch einen separaten Anbieter verwenden, der Private-Keys speichert, eine Keystore-Datei nutzen oder andere Optionen wählen. + +### 5\. Was ist der Unterschied zwischen `eth_sendTransaction` und `eth_sendRawTransaction`? {#difference-between-send-and-send-raw} + +`eth_sendTransaction` und `eth_sendRawTransaction` sind beides Ethereum-API-Funktionen, die eine Transaktion an das Ethereum-Netzwerk übertragen, damit sie einem zukünftigen Block hinzugefügt wird. Sie unterscheiden sich darin, wie sie das Signieren der Transaktionen handhaben. + +- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) wird zum Senden _unsignierter_ Transaktionen verwendet, was bedeutet, dass der Blockchain-Knoten, an den Sie senden, Ihren Private-Key verwalten muss, damit er die Transaktion signieren kann, bevor er sie an die Blockchain überträgt. Da Alchemy die Private-Keys der Benutzer nicht speichert, wird diese Methode nicht unterstützt. +- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) wird verwendet, um Transaktionen zu übertragen, die bereits signiert wurden. Das bedeutet, dass Sie zuerst [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction) verwenden müssen und dann das Ergebnis an `eth_sendRawTransaction` übergeben. + +Bei der Verwendung von Web3 wird auf `eth_sendRawTransaction` zugegriffen, indem die Funktion [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction) aufgerufen wird. + +Dies ist es, was wir in diesem Tutorial verwenden werden. + +### 6\. Was ist die Web3-Bibliothek? {#what-is-the-web3-library} + +- Web3.js ist eine Wrapper-Bibliothek um die Standard-JSON-RPC-Aufrufe, die in der Ethereum-Entwicklung sehr häufig verwendet wird. +- Es gibt viele Web3-Bibliotheken für verschiedene Sprachen. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), das in JavaScript geschrieben ist. Sie können sich [hier](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) andere Optionen wie [ethers.js](https://docs.ethers.org/v5/) ansehen. + +Okay, da wir nun einige dieser Fragen geklärt haben, machen wir mit dem Tutorial weiter. Sie können jederzeit Fragen im Alchemy-[Discord](https://discord.gg/gWuC7zB) stellen! + +### 7\. Wie sendet man sichere, gasoptimierte und private Transaktionen? {#how-to-send-secure-gas-optimized-and-private-transactions} + +- [Alchemy verfügt über eine Suite von Transact-APIs](https://docs.alchemy.com/reference/transact-api-quickstart). Sie können diese verwenden, um verstärkte Transaktionen zu senden, Transaktionen vorab zu simulieren, private Transaktionen zu senden und gasoptimierte Transaktionen zu senden. +- Sie können auch die [Notify-API](https://docs.alchemy.com/docs/alchemy-notify) verwenden, um benachrichtigt zu werden, wenn Ihre Transaktion aus dem Mempool gezogen und der Blockchain hinzugefügt wird. + +**HINWEIS:** Dieser Leitfaden erfordert ein Alchemy-Konto, eine Ethereum-Adresse oder ein MetaMask-Wallet, Node.js und ein installiertes npm. Wenn nicht, befolgen Sie diese Schritte: + +1. [Erstellen Sie ein kostenloses Alchemy-Konto](https://auth.alchemyapi.io/signup) +2. [Erstellen Sie ein MetaMask-Konto](https://metamask.io/) (oder besorgen Sie sich eine Ethereum-Adresse) +3. [Befolgen Sie diese Schritte, um Node.js und NPM zu installieren](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs) + +## Schritte zum Senden Ihrer Transaktion {#steps-to-sending-your-transaction} + +### 1\. Erstellen Sie eine Alchemy-App im Sepolia-Testnet {#create-an-alchemy-app-on-the-sepolia-testnet} + +Navigieren Sie zu Ihrem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/) und erstellen Sie eine neue App, wobei Sie Sepolia (oder ein anderes Testnet) für Ihr Netzwerk auswählen. + +### 2\. Fordern Sie ETH vom Sepolia-Faucet an {#request-eth-from-sepolia-faucet} + +Befolgen Sie die Anweisungen auf dem [Alchemy Sepolia-Faucet](https://www.sepoliafaucet.com/), um ETH zu erhalten. Stellen Sie sicher, dass Sie Ihre **Sepolia**-Ethereum-Adresse (von MetaMask) und nicht die eines anderen Netzwerks angeben. Nachdem Sie die Anweisungen befolgt haben, überprüfen Sie, ob Sie die ETH in Ihrem Wallet erhalten haben. + +### 3\. Erstellen Sie ein neues Projektverzeichnis und wechseln Sie mit `cd` dorthin {#create-a-new-project-direction} + +Erstellen Sie über die Befehlszeile (Terminal bei Macs) ein neues Projektverzeichnis und navigieren Sie dorthin: + +``` +mkdir sendtx-example +cd sendtx-example +``` + +### 4\. Installieren Sie Alchemy Web3 (oder eine beliebige Web3-Bibliothek) {#install-alchemy-web3} + +Führen Sie den folgenden Befehl in Ihrem Projektverzeichnis aus, um [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) zu installieren: + +Hinweis: Wenn Sie die ethers.js-Bibliothek verwenden möchten, [befolgen Sie die Anweisungen hier](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). + +``` +npm install @alch/alchemy-web3 +``` + +### 5\. Installieren Sie dotenv {#install-dotenv} + +Wir verwenden eine `.env`-Datei, um unseren API-Schlüssel und Private-Key sicher zu speichern. + +``` +npm install dotenv --save +``` + +### 6\. Erstellen Sie die `.env`-Datei {#create-the-dotenv-file} + +Erstellen Sie eine `.env`-Datei in Ihrem Projektverzeichnis und fügen Sie Folgendes hinzu (ersetzen Sie „`your-api-url`“ und „`your-private-key`“): + +- Um Ihre Alchemy-API-URL zu finden, navigieren Sie zur App-Detailseite der App, die Sie gerade in Ihrem Dashboard erstellt haben, klicken Sie oben rechts auf „View Key“ und kopieren Sie die HTTP-URL. +- Um Ihren Private-Key mit MetaMask zu finden, lesen Sie diesen [Leitfaden](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key). + +``` +API_URL = "your-api-url" +PRIVATE_KEY = "your-private-key" +``` + + + + +Committen Sie .env nicht! Bitte stellen Sie sicher, dass Sie Ihre .env-Datei niemals mit jemandem teilen oder offenlegen, da Sie dadurch Ihre Geheimnisse kompromittieren. Wenn Sie eine Versionskontrolle verwenden, fügen Sie Ihre .env zu einer gitignore-Datei hinzu. + + + + +### 7\. Erstellen Sie die Datei `sendTx.js` {#create-sendtx-js} + +Großartig, da wir nun unsere sensiblen Daten in einer `.env`-Datei geschützt haben, fangen wir an zu programmieren. Für unser Beispiel zum Senden einer Transaktion senden wir ETH zurück an das Sepolia-Faucet. + +Erstellen Sie eine Datei `sendTx.js`, in der wir unsere Beispieltransaktion konfigurieren und senden werden, und fügen Sie die folgenden Codezeilen hinzu: + +``` +async function main() { + require('dotenv').config(); + const { API_URL, PRIVATE_KEY } = process.env; + const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); + const web3 = createAlchemyWeb3(API_URL); + const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: replace this address with your own public address + + const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0 + + const transaction = { + 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth + 'value': 1000000000000000000, // 1 ETH + 'gas': 30000, + 'nonce': nonce, + // optional data field to send message or execute smart contract + }; + + const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY); + + web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) { + if (!error) { + console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!"); + } else { + console.log("❗Something went wrong while submitting your transaction:", error) + } + }); +} + +main(); +``` + +Stellen Sie sicher, dass Sie die Adresse in **Zeile 6** durch Ihre eigene öffentliche Adresse ersetzen. + +Bevor wir nun dazu übergehen, diesen Code auszuführen, lassen Sie uns über einige der Komponenten hier sprechen. + +- `nonce`: Die Nonce-Spezifikation wird verwendet, um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu verfolgen. Wir benötigen dies aus Sicherheitsgründen und um [Replay-Angriffe](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) zu verhindern. Um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu erhalten, verwenden wir [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +- `transaction`: Das Transaktionsobjekt hat einige Aspekte, die wir spezifizieren müssen: + - `to`: Dies ist die Adresse, an die wir ETH senden möchten. In diesem Fall senden wir ETH zurück an das [Sepolia-Faucet](https://sepoliafaucet.com/), von dem wir sie ursprünglich angefordert haben. + - `value`: Dies ist der Betrag, den wir senden möchten, angegeben in Wei, wobei 10^18 Wei = 1 ETH. + - `gas`: Es gibt viele Möglichkeiten, die richtige Menge an Gas zu bestimmen, die Ihrer Transaktion beigefügt werden soll. Alchemy hat sogar einen [Gaspreis-Webhook](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1), der Sie benachrichtigt, wenn der Gaspreis unter einen bestimmten Schwellenwert fällt. Für Mainnet-Transaktionen ist es eine gute Praxis, einen Gas-Schätzer wie [ETH Gas Station](https://ethgasstation.info/) zu überprüfen, um die richtige Menge an Gas zu bestimmen. 21000 ist die Mindestmenge an Gas, die eine Operation auf Ethereum verbraucht. Um sicherzustellen, dass unsere Transaktion ausgeführt wird, geben wir hier 30000 an. + - `nonce`: Siehe obige Nonce-Definition. Nonce beginnt bei Null zu zählen. + - [OPTIONAL] data: Wird zum Senden zusätzlicher Informationen mit Ihrer Überweisung oder zum Aufrufen eines Smart Contracts verwendet. Für Guthabenüberweisungen nicht erforderlich, siehe Hinweis unten. +- `signedTx`: Um unser Transaktionsobjekt zu signieren, verwenden wir die Methode `signTransaction` mit unserem `PRIVATE_KEY`. +- `sendSignedTransaction`: Sobald wir eine signierte Transaktion haben, können wir sie mit `sendSignedTransaction` absenden, damit sie in einen nachfolgenden Block aufgenommen wird. + +**Ein Hinweis zu data** +Es gibt zwei Hauptarten von Transaktionen, die in Ethereum gesendet werden können. + +- Guthabenüberweisung: Senden Sie ETH von einer Adresse an eine andere. Es ist kein Datenfeld erforderlich. Wenn Sie jedoch zusätzliche Informationen zusammen mit Ihrer Transaktion senden möchten, können Sie diese Informationen im HEX-Format in dieses Feld aufnehmen. + - Nehmen wir zum Beispiel an, wir wollten den Hash eines IPFS-Dokuments in die Ethereum-Blockchain schreiben, um ihm einen unveränderlichen Zeitstempel zu geben. Unser Datenfeld sollte dann so aussehen: data: `web3.utils.toHex(‘IPFS hash‘)`. Und jetzt kann jeder die Blockchain abfragen und sehen, wann dieses Dokument hinzugefügt wurde. +- Smart-Contract-Transaktion: Führen Sie Smart-Contract-Code auf der Blockchain aus. In diesem Fall sollte das Datenfeld die Smart-Funktion, die Sie ausführen möchten, zusammen mit allen Parametern enthalten. + - Ein praktisches Beispiel finden Sie in Schritt 8 dieses [Hello World-Tutorials](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction). + +### 8\. Führen Sie den Code mit `node sendTx.js` aus {#run-the-code-using-node-sendtx-js} + +Navigieren Sie zurück zu Ihrem Terminal oder Ihrer Befehlszeile und führen Sie Folgendes aus: + +``` +node sendTx.js +``` + +### 9\. Sehen Sie Ihre Transaktion im Mempool {#see-your-transaction-in-the-mempool} + +Öffnen Sie die [Mempool-Seite](https://dashboard.alchemyapi.io/mempool) in Ihrem Alchemy-Dashboard und filtern Sie nach der von Ihnen erstellten App, um Ihre Transaktion zu finden. Hier können wir beobachten, wie unsere Transaktion vom Status „ausstehend“ (pending) in den Status „gemint“ (mined) übergeht (falls erfolgreich) oder in den Status „verworfen“ (dropped), falls sie nicht erfolgreich war. Stellen Sie sicher, dass Sie die Einstellung auf „All“ belassen, damit Sie „geminte“, „ausstehende“ und „verworfene“ Transaktionen erfassen. Sie können auch nach Ihrer Transaktion suchen, indem Sie nach Transaktionen suchen, die an die Adresse `0x31b98d14007bdee637298086988a0bbd31184523` gesendet wurden. + +Um die Details Ihrer Transaktion anzuzeigen, sobald Sie sie gefunden haben, wählen Sie den Transaktions-Hash aus, der Sie zu einer Ansicht führen sollte, die wie folgt aussieht: + +![Mempool-Watcher-Screenshot](./mempool.png) + +Von dort aus können Sie Ihre Transaktion auf Etherscan anzeigen, indem Sie auf das rot eingekreiste Symbol klicken! + +**Juhuuu! Sie haben gerade Ihre erste Ethereum-Transaktion mit Alchemy gesendet 🎉** + +_Für Feedback und Vorschläge zu diesem Leitfaden senden Sie bitte eine Nachricht an Elan im [Discord](https://discord.gg/A39JVCM) von Alchemy!_ + +_Ursprünglich veröffentlicht unter [https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy](https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy)_ \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/server-components/index.md b/public/content/translations/de/developers/tutorials/server-components/index.md new file mode 100644 index 00000000000..715b462a18d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/server-components/index.md @@ -0,0 +1,296 @@ +--- +title: "Serverkomponenten und Agenten für Web3-Apps" +description: "Nach dem Lesen dieses Tutorials wirst du in der Lage sein, TypeScript-Server zu schreiben, die auf Ereignisse auf einer Blockchain lauschen und entsprechend mit eigenen Transaktionen reagieren. Dies ermöglicht es dir, zentralisierte Anwendungen zu schreiben (da der Server ein Single Point of Failure ist), die jedoch mit Web3-Entitäten interagieren können. Dieselben Techniken können auch verwendet werden, um einen Agenten zu schreiben, der ohne menschliches Eingreifen auf On-Chain-Ereignisse reagiert." + +author: Ori Pomerantz +lang: de +tags: ["Agent", "Server", "Off-Chain", "Dapps"] +skill: beginner +breadcrumb: Serverkomponenten +published: 2024-07-15 +--- + +## Einführung {#introduction} + +In den meisten Fällen verwendet eine dezentralisierte Anwendung einen Server, um die Software zu verteilen, aber die gesamte eigentliche Interaktion findet zwischen dem Client (typischerweise dem Webbrowser) und der Blockchain statt. + +![Normale Interaktion zwischen Webserver, Client und Blockchain](./fig-1.svg) + +Es gibt jedoch einige Fälle, in denen eine Anwendung von einer unabhängig laufenden Serverkomponente profitieren würde. Ein solcher Server wäre in der Lage, auf Ereignisse und auf Anfragen aus anderen Quellen, wie z. B. einer API, durch die Ausgabe von Transaktionen zu reagieren. + +![Die Interaktion mit der Hinzufügung eines Servers](./fig-2.svg) + +Es gibt mehrere mögliche Aufgaben, die ein solcher Server erfüllen könnte. + +- Halter eines geheimen Zustands. Beim Gaming ist es oft nützlich, den Spielern nicht alle Informationen zugänglich zu machen, die das Spiel kennt. Jedoch _gibt es keine Geheimnisse auf der Blockchain_; jede Information, die sich auf der Blockchain befindet, ist für jeden leicht herauszufinden. Wenn also ein Teil des Spielzustands geheim gehalten werden soll, muss er woanders gespeichert werden (und die Auswirkungen dieses Zustands möglicherweise mithilfe von [Zero-Knowledge-Beweisen](/zero-knowledge-proofs) verifiziert werden). + +- Zentralisiertes Orakel. Wenn die Einsätze niedrig genug sind, kann ein externer Server, der einige Informationen online liest und sie dann auf der Chain veröffentlicht, gut genug sein, um als [Orakel](/developers/docs/oracles/) verwendet zu werden. + +- Agent. Nichts passiert auf der Blockchain ohne eine Transaktion, die es aktiviert. Ein Server kann im Namen eines Benutzers handeln, um Aktionen wie [Arbitrage](/developers/docs/mev/#mev-examples-dex-arbitrage) durchzuführen, wenn sich die Gelegenheit dazu bietet. + +## Beispielprogramm {#sample-program} + +Du kannst dir einen Beispielserver [auf GitHub](https://github.com/qbzzt/20240715-server-component) ansehen. Dieser Server lauscht auf Ereignisse, die von [diesem Vertrag](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=contract_code) kommen, einer modifizierten Version von Hardhats Greeter. Wenn die Begrüßung geändert wird, ändert er sie wieder zurück. + +Um ihn auszuführen: + +1. Klone das Repository. + + ```sh copy + git clone https://github.com/qbzzt/20240715-server-component.git + cd 20240715-server-component +``` + +2. Installiere die erforderlichen Pakete. Falls du es noch nicht hast, [installiere zuerst Node](https://nodejs.org/en/download/package-manager). + + ```sh copy + npm install +``` + +3. Bearbeite die `.env`-Datei, um den Private-Key eines Kontos anzugeben, das ETH im Holesky-Testnet hat. Wenn du keine ETH auf Holesky hast, kannst du [dieses Faucet verwenden](https://holesky-faucet.pk910.de/). + + ```sh filename=".env" copy + PRIVATE_KEY=0x +``` + +4. Starte den Server. + + ```sh copy + npm start +``` + +5. Gehe zu [einer Blocksuchmaschine](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract) und ändere die Begrüßung unter Verwendung einer anderen Adresse als derjenigen, die den Private-Key besitzt. Du wirst sehen, dass die Begrüßung automatisch wieder zurückgeändert wird. + +### Wie funktioniert das? {#how-it-works} + +Der einfachste Weg zu verstehen, wie man eine Serverkomponente schreibt, ist, das Beispiel Zeile für Zeile durchzugehen. + +#### `src/app.ts` {#src-app-ts} + +Der weitaus größte Teil des Programms ist in [`src/app.ts`](https://github.com/qbzzt/20240715-server-component/blob/main/src/app.ts) enthalten. + +##### Erstellen der vorausgesetzten Objekte + +```typescript +import { + createPublicClient, + createWalletClient, + getContract, + http, + Address, +} from "viem" +``` + +Dies sind die [Viem](https://viem.sh/)-Entitäten, die wir benötigen: Funktionen und [der `Address`-Typ](https://viem.sh/docs/glossary/types#address). Dieser Server ist in [TypeScript](https://www.typescriptlang.org/) geschrieben, einer Erweiterung von JavaScript, die es [streng typisiert](https://en.wikipedia.org/wiki/Strong_and_weak_typing) macht. + +```typescript +import { privateKeyToAccount } from "viem/accounts" +``` + +[Diese Funktion](https://viem.sh/docs/accounts/privateKey) ermöglicht es uns, die Wallet-Informationen, einschließlich der Adresse, passend zu einem Private-Key zu generieren. + +```typescript +import { holesky } from "viem/chains" +``` + +Um eine Blockchain in Viem zu verwenden, musst du deren Definition importieren. In diesem Fall möchten wir uns mit der [Holesky](https://github.com/eth-clients/holesky)-Test-Blockchain verbinden. + +```typescript +// So fügen wir die Definitionen in .env zu process.env hinzu. +import * as dotenv from "dotenv" +dotenv.config() +``` + +So lesen wir `.env` in die Umgebung ein. Wir benötigen dies für den Private-Key (siehe später). + +```typescript +const greeterAddress : Address = "0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6" +const greeterABI = [ + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + . + . + . + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "name": "setGreeting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] as const +``` + +Um einen Vertrag zu nutzen, benötigen wir seine Adresse und die [ABI](/glossary/#abi) dafür. Wir stellen hier beides bereit. + +In JavaScript (und somit auch in TypeScript) kann man einer Konstanten keinen neuen Wert zuweisen, aber man _kann_ das darin gespeicherte Objekt modifizieren. Durch die Verwendung des Suffixes `as const` teilen wir TypeScript mit, dass die Liste selbst konstant ist und nicht geändert werden darf. + +```typescript +const publicClient = createPublicClient({ + chain: holesky, + transport: http(), +}) +``` + +Erstelle einen [Public Client](https://viem.sh/docs/clients/public.html) von Viem. Public Clients haben keinen angehängten Private-Key und können daher keine Transaktionen senden. Sie können [`view`-Funktionen](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) aufrufen, Kontostände lesen usw. + +```typescript +const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) +``` + +Die Umgebungsvariablen sind in [`process.env`](https://www.totaltypescript.com/how-to-strongly-type-process-env) verfügbar. TypeScript ist jedoch streng typisiert. Eine Umgebungsvariable kann ein beliebiger String oder leer sein, daher ist der Typ für eine Umgebungsvariable `string | undefined`. Ein Schlüssel ist in Viem jedoch als `0x${string}` definiert (`0x` gefolgt von einem String). Hier teilen wir TypeScript mit, dass die Umgebungsvariable `PRIVATE_KEY` von diesem Typ sein wird. Wenn dies nicht der Fall ist, erhalten wir einen Laufzeitfehler. + +Die Funktion [`privateKeyToAccount`](https://viem.sh/docs/accounts/privateKey) verwendet dann diesen Private-Key, um ein vollständiges Konto-Objekt zu erstellen. + +```typescript +const walletClient = createWalletClient({ + account, + chain: holesky, + transport: http(), +}) +``` + +Als Nächstes verwenden wir das Konto-Objekt, um einen [Wallet Client](https://viem.sh/docs/clients/wallet) zu erstellen. Dieser Client verfügt über einen Private-Key und eine Adresse, sodass er zum Senden von Transaktionen verwendet werden kann. + +```typescript +const greeter = getContract({ + address: greeterAddress, + abi: greeterABI, + client: { public: publicClient, wallet: walletClient }, +}) +``` + +Da wir nun alle Voraussetzungen haben, können wir endlich eine [Vertragsinstanz](https://viem.sh/docs/contract/getContract) erstellen. Wir werden diese Vertragsinstanz verwenden, um mit dem On-Chain-Vertrag zu kommunizieren. + +##### Lesen von der Blockchain + +```typescript +console.log(`Current greeting:`, await greeter.read.greet()) +``` + +Die Vertragsfunktionen, die nur lesend sind ([`view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) und [`pure`](https://www.tutorialspoint.com/solidity/solidity_pure_functions.htm)), sind unter `read` verfügbar. In diesem Fall verwenden wir es, um auf die Funktion [`greet`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=read_contract#cfae3217) zuzugreifen, welche die Begrüßung zurückgibt. + +JavaScript ist Single-Threaded. Wenn wir also einen lang andauernden Prozess anstoßen, müssen wir [angeben, dass wir dies asynchron tun](https://eloquentjavascript.net/11_async.html#h-XvLsfAhtsE). Der Aufruf der Blockchain, selbst für eine reine Leseoperation, erfordert einen Roundtrip zwischen dem Computer und einem Blockchain-Knoten. Das ist der Grund, warum wir hier angeben, dass der Code auf das Ergebnis warten (`await`) muss. + +Wenn du dich dafür interessierst, wie das funktioniert, kannst du [hier darüber lesen](https://www.w3schools.com/js/js_promise.asp). In der Praxis musst du jedoch nur wissen, dass du auf die Ergebnisse wartest (`await`), wenn du eine Operation startest, die lange dauert, und dass jede Funktion, die dies tut, als `async` deklariert werden muss. + +##### Ausgeben von Transaktionen + +```typescript +const setGreeting = async (greeting: string): Promise => { +``` + +Dies ist die Funktion, die du aufrufst, um eine Transaktion auszugeben, welche die Begrüßung ändert. Da dies eine langwierige Operation ist, wird die Funktion als `async` deklariert. Aufgrund der internen Implementierung muss jede `async`-Funktion ein `Promise`-Objekt zurückgeben. In diesem Fall bedeutet `Promise`, dass wir nicht genau spezifizieren, was im `Promise` zurückgegeben wird. + +```typescript +const txHash = await greeter.write.setGreeting([greeting]) +``` + +Das `write`-Feld der Vertragsinstanz enthält alle Funktionen, die in den Blockchain-Zustand schreiben (solche, die das Senden einer Transaktion erfordern), wie z. B. [`setGreeting`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract#a4136862). Die Parameter, falls vorhanden, werden als Liste bereitgestellt, und die Funktion gibt den Hash der Transaktion zurück. + +```typescript + console.log(`Working on a fix, see https://eth-holesky.blockscout.com/tx/${txHash}`) + + return txHash +} +``` + +Melde den Hash der Transaktion (als Teil einer URL zur Blocksuchmaschine, um ihn anzusehen) und gib ihn zurück. + +##### Reagieren auf Ereignisse + +```typescript +greeter.watchEvent.SetGreeting({ +``` + +[Die Funktion `watchEvent`](https://viem.sh/docs/actions/public/watchEvent) ermöglicht es dir anzugeben, dass eine Funktion ausgeführt werden soll, wenn ein Ereignis ausgelöst wird. Wenn du dich nur für einen bestimmten Ereignistyp interessierst (in diesem Fall `SetGreeting`), kannst du diese Syntax verwenden, um dich auf diesen Ereignistyp zu beschränken. + +```typescript + onLogs: logs => { +``` + +Die Funktion `onLogs` wird aufgerufen, wenn es Protokolleinträge (Logs) gibt. In Ethereum sind „Log“ und „Ereignis“ (Event) in der Regel austauschbar. + +```typescript +console.log( + `Address ${logs[0].args.sender} changed the greeting to ${logs[0].args.greeting}` +) +``` + +Es könnte mehrere Ereignisse geben, aber der Einfachheit halber kümmern wir uns nur um das erste. `logs[0].args` sind die Argumente des Ereignisses, in diesem Fall `sender` und `greeting`. + +```typescript + if (logs[0].args.sender != account.address) + setGreeting(`${account.address} insists on it being Hello!`) + } +}) +``` + +Wenn der Absender _nicht_ dieser Server ist, verwende `setGreeting`, um die Begrüßung zu ändern. + +#### `package.json` {#package-json} + +[Diese Datei](https://github.com/qbzzt/20240715-server-component/blob/main/package.json) steuert die [Node.js](https://nodejs.org/en)-Konfiguration. Dieser Artikel erklärt nur die wichtigen Definitionen. + +```json +{ + "main": "dist/index.js", +``` + +Diese Definition gibt an, welche JavaScript-Datei ausgeführt werden soll. + +```json + "scripts": { + "start": "tsc && node dist/app.js", + }, +``` + +Die Skripte sind verschiedene Anwendungsaktionen. In diesem Fall haben wir nur `start`, was den Server kompiliert und dann ausführt. Der Befehl `tsc` ist Teil des `typescript`-Pakets und kompiliert TypeScript zu JavaScript. Wenn du ihn manuell ausführen möchtest, befindet er sich in `node_modules/.bin`. Der zweite Befehl führt den Server aus. + +```json + "type": "module", +``` + +Es gibt mehrere Arten von JavaScript-Node-Anwendungen. Der Typ `module` ermöglicht es uns, `await` im Code auf oberster Ebene zu verwenden, was wichtig ist, wenn man langsame (und daher asynchrone) Operationen durchführt. + +```json + "devDependencies": { + "@types/node": "^20.14.2", + "typescript": "^5.4.5" + }, +``` + +Dies sind Pakete, die nur für die Entwicklung benötigt werden. Hier brauchen wir `typescript`, und da wir es mit Node.js verwenden, holen wir uns auch die Typen für Node-Variablen und -Objekte, wie z. B. `process`. [Die Notation `^`](https://github.com/npm/node-semver?tab=readme-ov-file#caret-ranges-123-025-004) bedeutet diese Version oder eine höhere Version, die keine Breaking Changes aufweist. Siehe [hier](https://semver.org) für weitere Informationen über die Bedeutung von Versionsnummern. + +```json + "dependencies": { + "dotenv": "^16.4.5", + "viem": "2.14.1" + } +} +``` + +Dies sind Pakete, die zur Laufzeit benötigt werden, wenn `dist/app.js` ausgeführt wird. + +## Fazit {#conclusion} + +Der zentralisierte Server, den wir hier erstellt haben, erfüllt seine Aufgabe, nämlich als Agent für einen Benutzer zu fungieren. Jeder andere, der möchte, dass die Dapp weiterhin funktioniert, und bereit ist, das Gas auszugeben, kann eine neue Instanz des Servers mit seiner eigenen Adresse ausführen. + +Dies funktioniert jedoch nur, wenn die Aktionen des zentralisierten Servers leicht verifiziert werden können. Wenn der zentralisierte Server geheime Zustandsinformationen hat oder schwierige Berechnungen durchführt, ist er eine zentralisierte Entität, der du vertrauen musst, um die Anwendung zu nutzen – was genau das ist, was Blockchains zu vermeiden versuchen. In einem zukünftigen Artikel plane ich zu zeigen, wie man [Zero-Knowledge-Beweise](/zero-knowledge-proofs) verwendet, um dieses Problem zu umgehen. + +[Siehe hier für weitere meiner Arbeiten](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md new file mode 100644 index 00000000000..dfc6d560031 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md @@ -0,0 +1,93 @@ +--- +title: Richten Sie web3.js ein, um die Ethereum-Blockchain in JavaScript zu verwenden +description: Erfahren Sie, wie Sie die web3.js-Bibliothek einrichten und konfigurieren, um aus JavaScript-Anwendungen mit der Ethereum-Blockchain zu interagieren. +author: "jdourlens" +tags: ["web3.js", "JavaScript"] +skill: beginner +breadcrumb: web3.js-Einrichtung +lang: de +published: 2020-04-11 +source: EthereumDev +sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +In diesem Tutorial werden wir sehen, wie man mit [web3.js](https://web3js.readthedocs.io/) beginnt, um mit der Ethereum-Blockchain zu interagieren. Web3.js kann sowohl in Frontends als auch in Backends verwendet werden, um Daten aus der Blockchain zu lesen oder Transaktionen durchzuführen und sogar Smart Contracts bereitzustellen. + +Der erste Schritt besteht darin, web3.js in Ihr Projekt aufzunehmen. Um es auf einer Webseite zu verwenden, können Sie die Bibliothek direkt über ein CDN wie JSDeliver importieren. + +```html + +``` + +Wenn Sie es vorziehen, die Bibliothek für die Verwendung in Ihrem Backend oder einem Frontend-Projekt, das Builds verwendet, zu installieren, können Sie sie über npm installieren: + +```bash +npm install web3 --save +``` + +Um Web3.js dann in ein Node.js-Skript oder ein Browserify-Frontend-Projekt zu importieren, können Sie die folgende JavaScript-Zeile verwenden: + +```js +const Web3 = require("web3") +``` + +Nachdem wir die Bibliothek in das Projekt aufgenommen haben, müssen wir sie initialisieren. Ihr Projekt muss in der Lage sein, mit der Blockchain zu kommunizieren. Die meisten Ethereum-Bibliotheken kommunizieren mit einem [Blockchain-Knoten](/developers/docs/nodes-and-clients/) über RPC-Aufrufe. Um unseren Web3-Anbieter (Provider) zu initiieren, instanziieren wir eine Web3-Instanz und übergeben dem Konstruktor die URL des Anbieters. Wenn Sie einen Blockchain-Knoten oder eine [Ganache-Instanz auf Ihrem Computer ausführen](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/), sieht das so aus: + +```js +const web3 = new Web3("http://localhost:8545") +``` + +Wenn Sie direkt auf einen gehosteten Blockchain-Knoten zugreifen möchten, finden Sie Optionen unter [Blockchain-Knoten als Dienstleistung (Nodes as a Service)](/developers/docs/nodes-and-clients/nodes-as-a-service). + +```js +const web3 = new Web3("https://cloudflare-eth.com") +``` + +Um zu testen, ob wir unsere Web3-Instanz richtig konfiguriert haben, versuchen wir, die neueste Blocknummer mit der Funktion `getBlockNumber` abzurufen. Diese Funktion akzeptiert einen Callback als Parameter und gibt die Blocknummer als Ganzzahl zurück. + +```js +var Web3 = require("web3") +const web3 = new Web3("https://cloudflare-eth.com") + +web3.eth.getBlockNumber(function (error, result) { + console.log(result) +}) +``` + +Wenn Sie dieses Programm ausführen, wird einfach die neueste Blocknummer ausgegeben: die Spitze der Blockchain. Sie können auch `await/async`-Funktionsaufrufe verwenden, um verschachtelte Callbacks in Ihrem Code zu vermeiden: + +```js +async function getBlockNumber() { + const latestBlockNumber = await web3.eth.getBlockNumber() + console.log(latestBlockNumber) + return latestBlockNumber +} + +getBlockNumber() +``` + +Sie können alle auf der Web3-Instanz verfügbaren Funktionen in [der offiziellen web3.js-Dokumentation](https://docs.web3js.org/) einsehen. + +Die meisten Web3-Bibliotheken sind asynchron, da die Bibliothek im Hintergrund JSON-RPC-Aufrufe an den Blockchain-Knoten durchführt, der das Ergebnis zurücksendet. + + + +Wenn Sie im Browser arbeiten, injizieren einige Wallets direkt eine Web3-Instanz, und Sie sollten versuchen, diese wann immer möglich zu verwenden, insbesondere wenn Sie planen, mit der Ethereum-Adresse des Benutzers zu interagieren, um Transaktionen durchzuführen. + +Hier ist das Snippet, um zu erkennen, ob ein MetaMask-Wallet verfügbar ist, und zu versuchen, es zu aktivieren, falls dies der Fall ist. Es wird Ihnen später ermöglichen, das Guthaben des Benutzers zu lesen und es ihm zu ermöglichen, Transaktionen zu validieren, die Sie ihn auf der Ethereum-Blockchain durchführen lassen möchten: + +```js +if (window.ethereum != null) { + state.web3 = new Web3(window.ethereum) + try { + // Kontozugriff anfordern, falls nötig + await window.ethereum.enable() + // Konten sind nun offengelegt + } catch (error) { + // Benutzer hat den Kontozugriff verweigert... + } +} +``` + +Alternativen zu web3.js wie [Ethers.js](https://docs.ethers.io/) existieren und werden ebenfalls häufig verwendet. Im nächsten Tutorial werden wir sehen, [wie man einfach auf neue eingehende Blöcke auf der Blockchain hört und sieht, was sie enthalten](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/short-abi/index.md b/public/content/translations/de/developers/tutorials/short-abi/index.md new file mode 100644 index 00000000000..bc6b4d5bf71 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/short-abi/index.md @@ -0,0 +1,598 @@ +--- +title: "Kurze ABIs zur Calldata-Optimierung" +description: "Optimierung von Smart Contracts für Optimistic Rollups" +author: Ori Pomerantz +lang: de +tags: ["Ebene 2"] +skill: intermediate +breadcrumb: Kurze ABIs +published: 2022-04-01 +--- + +## Einführung {#introduction} + +In diesem Artikel erfahren Sie mehr über [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups), die Kosten von Transaktionen auf diesen und wie diese unterschiedliche Kostenstruktur es erfordert, für andere Dinge zu optimieren als im Ethereum-Mainnet. +Sie lernen auch, wie Sie diese Optimierung implementieren. + +### Vollständige Offenlegung {#full-disclosure} + +Ich bin ein Vollzeitmitarbeiter bei [Optimism](https://www.optimism.io/), daher werden die Beispiele in diesem Artikel auf Optimism ausgeführt. +Die hier erklärte Technik sollte jedoch genauso gut für andere Rollups funktionieren. + +### Terminologie {#terminology} + +Wenn über Rollups diskutiert wird, wird der Begriff 'Layer 1' (L1) für das Mainnet, das produktive Ethereum-Netzwerk, verwendet. +Der Begriff 'Ebene 2' (L2) wird für das Rollup oder jedes andere System verwendet, das sich für die Sicherheit auf L1 verlässt, aber den Großteil seiner Verarbeitung Off-Chain durchführt. + +## Wie können wir die Kosten für L2-Transaktionen weiter senken? {#how-can-we-further-reduce-the-cost-of-L2-transactions} + +[Optimistic Rollups](/developers/docs/scaling/optimistic-rollups) müssen eine Aufzeichnung jeder historischen Transaktion aufbewahren, damit jeder sie durchgehen und überprüfen kann, ob der aktuelle Zustand korrekt ist. +Der günstigste Weg, Daten in das Ethereum-Mainnet zu bekommen, ist, sie als Calldata zu schreiben. +Diese Lösung wurde sowohl von [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) als auch von [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups) gewählt. + +### Kosten von L2-Transaktionen {#cost-of-l2-transactions} + +Die Kosten von L2-Transaktionen setzen sich aus zwei Komponenten zusammen: + +1. L2-Verarbeitung, die in der Regel extrem günstig ist +2. L1-Speicherung, die an die Gaskosten des Mainnets gebunden ist + +Während ich dies schreibe, betragen die Kosten für L2-Gas auf Optimism 0,001 [Gwei](/developers/docs/gas/#pre-london). +Die Kosten für L1-Gas liegen hingegen bei etwa 40 Gwei. +[Sie können die aktuellen Preise hier einsehen](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m). + +Ein Byte Calldata kostet entweder 4 Gas (wenn es null ist) oder 16 Gas (wenn es ein anderer Wert ist). +Eine der teuersten Operationen auf der EVM ist das Schreiben in den Speicher. +Die maximalen Kosten für das Schreiben eines 32-Byte-Wortes in den Speicher auf L2 betragen 22.100 Gas. Derzeit sind das 22,1 Gwei. +Wenn wir also ein einziges Null-Byte an Calldata einsparen können, können wir etwa 200 Bytes in den Speicher schreiben und haben immer noch einen Vorteil. + +### Die ABI {#the-abi} + +Die überwiegende Mehrheit der Transaktionen greift von einem extern verwalteten Konto auf einen Vertrag zu. +Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld gemäß [der Application Binary Interface (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). + +Die ABI wurde jedoch für L1 entwickelt, wo ein Byte Calldata ungefähr so viel kostet wie vier arithmetische Operationen, und nicht für L2, wo ein Byte Calldata mehr als tausend arithmetische Operationen kostet. +Die Calldata ist wie folgt aufgeteilt: + +| Abschnitt | Länge | Bytes | Verschwendete Bytes | Verschwendetes Gas | Notwendige Bytes | Notwendiges Gas | +| ------------------- | -----: | ----: | -----------: | ---------: | --------------: | ------------: | +| Funktionsselektor | 4 | 0-3 | 3 | 48 | 1 | 16 | +| Nullen | 12 | 4-15 | 12 | 48 | 0 | 0 | +| Zieladresse | 20 | 16-35 | 0 | 0 | 20 | 320 | +| Betrag | 32 | 36-67 | 17 | 64 | 15 | 240 | +| Gesamt | 68 | | | 160 | | 576 | + +Erklärung: + +- **Funktionsselektor**: Der Vertrag hat weniger als 256 Funktionen, sodass wir sie mit einem einzigen Byte unterscheiden können. + Diese Bytes sind typischerweise ungleich null und [kosten daher sechzehn Gas](https://eips.ethereum.org/EIPS/eip-2028). +- **Nullen**: Diese Bytes sind immer null, da eine 20-Byte-Adresse kein 32-Byte-Wort benötigt, um sie zu speichern. + Bytes, die null enthalten, kosten vier Gas ([siehe das Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), Anhang G, + S. 27, der Wert für `G``txdatazero`). +- **Betrag**: Wenn wir annehmen, dass in diesem Vertrag `decimals` achtzehn ist (der normale Wert) und der maximale Betrag an Token, den wir übertragen, 1018 beträgt, erhalten wir einen maximalen Betrag von 1036. + 25615 > 1036, also reichen fünfzehn Bytes aus. + +Eine Verschwendung von 160 Gas auf L1 ist normalerweise vernachlässigbar. Eine Transaktion kostet mindestens [21.000 Gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), also spielen zusätzliche 0,8 % keine Rolle. +Auf L2 sieht die Sache jedoch anders aus. Fast die gesamten Kosten der Transaktion entstehen durch das Schreiben auf L1. +Zusätzlich zu den Transaktions-Calldata gibt es 109 Bytes an Transaktions-Header (Zieladresse, Signatur usw.). +Die Gesamtkosten betragen daher `109*16+576+160=2480`, und wir verschwenden etwa 6,5 % davon. + +## Kosten senken, wenn Sie das Ziel nicht kontrollieren {#reducing-costs-when-you-dont-control-the-destination} + +Unter der Annahme, dass Sie keine Kontrolle über den Zielvertrag haben, können Sie dennoch eine Lösung verwenden, die [dieser hier](https://github.com/qbzzt/ethereum.org-20220330-shortABI) ähnlich ist. +Lassen Sie uns die relevanten Dateien durchgehen. + +### Token.sol {#token-sol} + +[Dies ist der Zielvertrag](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). +Es handelt sich um einen Standard-ERC-20-Vertrag mit einer zusätzlichen Funktion. +Diese `faucet`-Funktion ermöglicht es jedem Benutzer, einige Token zur Verwendung zu erhalten. +Sie würde einen produktiven ERC-20-Vertrag nutzlos machen, aber sie erleichtert das Leben, wenn ein ERC-20 nur zu Testzwecken existiert. + +```solidity + /* * + * @dev Gibt dem Aufrufer 1000 Token zum Spielen */ + + + + function faucet() external { + _mint(msg.sender, 1000); + } // function faucet +``` + +### CalldataInterpreter.sol {#calldatainterpreter-sol} + +[Dies ist der Vertrag, den Transaktionen mit kürzeren Calldata aufrufen sollen](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). +Lassen Sie uns ihn Zeile für Zeile durchgehen. + +```solidity +// SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + + +import { OrisUselessToken } from "./Token.sol"; +``` + +Wir benötigen die Token-Funktion, um zu wissen, wie wir sie aufrufen können. + +```solidity +contract CalldataInterpreter { + + OrisUselessToken public immutable token; +``` + +Die Adresse des Tokens, für den wir ein Proxy sind. + +```solidity + + /* * + * @dev Gibt die Token-Adresse an + * @param tokenAddr_ ERC-20-Vertragsadresse */ + + + + + constructor( + address tokenAddr_ + ) { + token = OrisUselessToken(tokenAddr_); + } // constructor +``` + +Die Token-Adresse ist der einzige Parameter, den wir angeben müssen. + +```solidity + function calldataVal(uint startByte, uint length) + private pure returns (uint) { +``` + +Einen Wert aus den Calldata lesen. + +```solidity + uint _retVal; + + require(length < 0x21, + "calldataVal length limit is 32 bytes"); + + require(length + startByte <= msg.data.length, + "calldataVal trying to read beyond calldatasize"); +``` + +Wir werden ein einzelnes 32-Byte-Wort (256-Bit) in den Speicher laden und die Bytes entfernen, die nicht Teil des gewünschten Feldes sind. +Dieser Algorithmus funktioniert nicht für Werte, die länger als 32 Bytes sind, und natürlich können wir nicht über das Ende der Calldata hinaus lesen. +Auf L1 könnte es notwendig sein, diese Tests zu überspringen, um Gas zu sparen, aber auf L2 ist Gas extrem günstig, was alle möglichen Plausibilitätsprüfungen ermöglicht, die wir uns vorstellen können. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Wir hätten die Daten aus dem Aufruf von `fallback()` (siehe unten) kopieren können, aber es ist einfacher, [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), die Assemblersprache der EVM, zu verwenden. + +Hier verwenden wir [den CALLDATALOAD-Opcode](https://www.evm.codes/#35), um die Bytes `startByte` bis `startByte+31` in den Stack zu lesen. +Im Allgemeinen lautet die Syntax eines Opcodes in Yul `(,...)`. + +```solidity + + _retVal = _retVal >> (256-length*8); +``` + +Nur die höchstwertigen `length`-Bytes sind Teil des Feldes, also führen wir eine [Rechtsverschiebung (Right-Shift)](https://en.wikipedia.org/wiki/Logical_shift) durch, um die anderen Werte loszuwerden. +Dies hat den zusätzlichen Vorteil, dass der Wert an den rechten Rand des Feldes verschoben wird, sodass es der Wert selbst ist und nicht der Wert mal 256irgendwas. + +```solidity + + return _retVal; + } + + + fallback() external { +``` + +Wenn ein Aufruf an einen Solidity-Vertrag mit keiner der Funktionssignaturen übereinstimmt, ruft er [die `fallback()`-Funktion](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) auf (vorausgesetzt, es gibt eine). +Im Fall von `CalldataInterpreter` landet _jeder_ Aufruf hier, da es keine anderen `external`- oder `public`-Funktionen gibt. + +```solidity + uint _func; + + _func = calldataVal(0, 1); +``` + +Lesen Sie das erste Byte der Calldata, das uns die Funktion mitteilt. +Es gibt zwei Gründe, warum eine Funktion hier nicht verfügbar sein könnte: + +1. Funktionen, die `pure` oder `view` sind, ändern den Zustand nicht und kosten kein Gas (wenn sie Off-Chain aufgerufen werden). + Es macht keinen Sinn zu versuchen, ihre Gaskosten zu senken. +2. Funktionen, die sich auf [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties) verlassen. + Der Wert von `msg.sender` wird die Adresse von `CalldataInterpreter` sein, nicht die des Aufrufers. + +Leider bleibt [bei Betrachtung der ERC-20-Spezifikationen](https://eips.ethereum.org/EIPS/eip-20) nur eine Funktion übrig: `transfer`. +Damit bleiben uns nur zwei Funktionen: `transfer` (weil wir `transferFrom` aufrufen können) und `faucet` (weil wir die Token an denjenigen zurückübertragen können, der uns aufgerufen hat). + +```solidity + + // Ruft die zustandsändernden Methoden des Tokens auf unter Verwendung von + // Informationen aus den Calldata + + // faucet + if (_func == 1) { +``` + +Ein Aufruf von `faucet()`, der keine Parameter hat. + +```solidity + token.faucet(); + token.transfer(msg.sender, + token.balanceOf(address(this))); + } +``` + +Nachdem wir `token.faucet()` aufgerufen haben, erhalten wir Token. Allerdings **brauchen** wir als Proxy-Vertrag keine Token. +Das EOA (Extern verwaltetes Konto) oder der Vertrag, der uns aufgerufen hat, hingegen schon. +Also übertragen wir alle unsere Token an denjenigen, der uns aufgerufen hat. + +```solidity + // transfer (angenommen, wir haben eine Allowance dafür) + if (_func == 2) { +``` + +Die Übertragung von Token erfordert zwei Parameter: die Zieladresse und den Betrag. + +```solidity + token.transferFrom( + msg.sender, +``` + +Wir erlauben Aufrufern nur, Token zu übertragen, die sie besitzen + +```solidity + address(uint160(calldataVal(1, 20))), +``` + +Die Zieladresse beginnt bei Byte #1 (Byte #0 ist die Funktion). +Als Adresse ist sie 20 Bytes lang. + +```solidity + calldataVal(21, 2) +``` + +Für diesen speziellen Vertrag nehmen wir an, dass die maximale Anzahl an Token, die jemand übertragen möchte, in zwei Bytes passt (weniger als 65536). + +```solidity + ); + } +``` + +Insgesamt benötigt eine Übertragung 35 Bytes an Calldata: + +| Abschnitt | Länge | Bytes | +| ------------------- | -----: | ----: | +| Funktionsselektor | 1 | 0 | +| Zieladresse | 32 | 1-32 | +| Betrag | 2 | 33-34 | + +```solidity + } // fallback + +} // contract CalldataInterpreter +``` + +### test.js {#test-js} + +[Dieser JavaScript-Unit-Test](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) zeigt uns, wie wir diesen Mechanismus verwenden (und wie wir überprüfen, ob er korrekt funktioniert). +Ich gehe davon aus, dass Sie [chai](https://www.chaijs.com/) und [ethers](https://docs.ethers.io/v5/) verstehen, und erkläre nur die Teile, die sich speziell auf den Vertrag beziehen. + +```js +const { expect } = require("chai"); + +describe("CalldataInterpreter", function () { + it("Should let us use tokens", async function () { + const Token = await ethers.getContractFactory("OrisUselessToken") + const token = await Token.deploy() + await token.deployed() + console.log("Token addr:", token.address) + + const Cdi = await ethers.getContractFactory("CalldataInterpreter") + const cdi = await Cdi.deploy(token.address) + await cdi.deployed() + console.log("CalldataInterpreter addr:", cdi.address) + + const signer = await ethers.getSigner() +``` + +Wir beginnen mit der Bereitstellung beider Verträge. + +```javascript + // Token zum Spielen erhalten + const faucetTx = { +``` + +Wir können nicht die High-Level-Funktionen verwenden, die wir normalerweise nutzen würden (wie `token.faucet()`), um Transaktionen zu erstellen, da wir der ABI nicht folgen. +Stattdessen müssen wir die Transaktion selbst erstellen und dann senden. + +```javascript + to: cdi.address, + data: "0x01" +``` + +Es gibt zwei Parameter, die wir für die Transaktion angeben müssen: + +1. `to`, die Zieladresse. + Dies ist der Calldata-Interpreter-Vertrag. +2. `data`, die zu sendenden Calldata. + Im Falle eines Faucet-Aufrufs bestehen die Daten aus einem einzigen Byte, `0x01`. + +```javascript + + } + await (await signer.sendTransaction(faucetTx)).wait() +``` + +Wir rufen [die `sendTransaction`-Methode des Signers](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) auf, da wir das Ziel bereits angegeben haben (`faucetTx.to`) und die Transaktion signiert werden muss. + +```javascript +// Überprüfen, ob das Faucet die Token korrekt bereitstellt +expect(await token.balanceOf(signer.address)).to.equal(1000) +``` + +Hier überprüfen wir das Guthaben. +Es besteht keine Notwendigkeit, bei `view`-Funktionen Gas zu sparen, also führen wir sie einfach normal aus. + +```javascript +// Dem CDI eine Allowance erteilen (Approvals können nicht über einen Proxy weitergeleitet werden) +const approveTX = await token.approve(cdi.address, 10000) +await approveTX.wait() +expect(await token.allowance(signer.address, cdi.address)).to.equal(10000) +``` + +Geben Sie dem Calldata-Interpreter eine Freigabe (Allowance), um Übertragungen durchführen zu können. + +```javascript +// Token übertragen +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +``` + +Erstellen Sie eine Übertragungstransaktion. Das erste Byte ist „0x02“, gefolgt von der Zieladresse und schließlich dem Betrag (0x0100, was dezimal 256 entspricht). + +```javascript + await (await signer.sendTransaction(transferTx)).wait() + + // Überprüfen, ob wir 256 Token weniger haben + expect (await token.balanceOf(signer.address)).to.equal(1000-256) + + // Und dass unser Ziel sie erhalten hat + expect (await token.balanceOf(destAddr)).to.equal(256) + }) // it +}) // describe +``` + +## Kosten senken, wenn Sie den Zielvertrag kontrollieren {#reducing-the-cost-when-you-do-control-the-destination-contract} + +Wenn Sie die Kontrolle über den Zielvertrag haben, können Sie Funktionen erstellen, die die `msg.sender`-Prüfungen umgehen, da sie dem Calldata-Interpreter vertrauen. +[Ein Beispiel dafür, wie das funktioniert, finden Sie hier im `control-contract`-Branch](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract). + +Wenn der Vertrag nur auf externe Transaktionen reagieren würde, kämen wir mit nur einem Vertrag aus. +Das würde jedoch die [Zusammensetzbarkeit (Composability)](/developers/docs/smart-contracts/composability/) beeinträchtigen. +Es ist viel besser, einen Vertrag zu haben, der auf normale ERC-20-Aufrufe reagiert, und einen weiteren Vertrag, der auf Transaktionen mit kurzen Calldata reagiert. + +### Token.sol {#token-sol-2} + +In diesem Beispiel können wir `Token.sol` ändern. +Dadurch können wir eine Reihe von Funktionen haben, die nur der Proxy aufrufen darf. +Hier sind die neuen Teile: + +```solidity + // Die einzige Adresse, die die CalldataInterpreter-Adresse angeben darf + address owner; + + // Die CalldataInterpreter-Adresse + address proxy = address(0); +``` + +Der ERC-20-Vertrag muss die Identität des autorisierten Proxys kennen. +Wir können diese Variable jedoch nicht im Konstruktor festlegen, da wir den Wert noch nicht kennen. +Dieser Vertrag wird zuerst instanziiert, da der Proxy die Adresse des Tokens in seinem Konstruktor erwartet. + +```solidity + /* * + * @dev Ruft den ERC20-Konstruktor auf. */ + + + + constructor( + ) ERC20("Oris useless token-2", "OUT-2") { + owner = msg.sender; + } +``` + +Die Adresse des Erstellers (genannt `owner`) wird hier gespeichert, da dies die einzige Adresse ist, die den Proxy festlegen darf. + +```solidity + /* * + * @dev Setzt die Adresse für den Proxy (den CalldataInterpreter). + * Kann nur einmal vom Eigentümer aufgerufen werden */ + + + + + function setProxy(address _proxy) external { + require(msg.sender == owner, "Can only be called by owner"); + require(proxy == address(0), "Proxy is already set"); + + proxy = _proxy; + } // function setProxy +``` + +Der Proxy hat privilegierten Zugriff, da er Sicherheitsprüfungen umgehen kann. +Um sicherzustellen, dass wir dem Proxy vertrauen können, lassen wir nur den `owner` diese Funktion aufrufen, und das nur einmal. +Sobald `proxy` einen echten Wert hat (nicht null), kann sich dieser Wert nicht mehr ändern. Selbst wenn der Eigentümer beschließt, bösartig zu werden, oder die Mnemonic dafür aufgedeckt wird, sind wir immer noch sicher. + +```solidity + /* * + * @dev Einige Funktionen dürfen nur vom Proxy aufgerufen werden. */ + + + + modifier onlyProxy { +``` + +Dies ist eine [`modifier`-Funktion](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), sie ändert die Art und Weise, wie andere Funktionen arbeiten. + +```solidity + require(msg.sender == proxy); +``` + +Überprüfen Sie zunächst, ob wir vom Proxy und von niemand anderem aufgerufen wurden. +Wenn nicht, führen Sie einen `revert` durch. + +```solidity + _; + } +``` + +Wenn ja, führen Sie die Funktion aus, die wir modifizieren. + +```solidity + /* Funktionen, die es dem Proxy ermöglichen, tatsächlich als Proxy für Konten zu fungieren */ + /* Functions that allow the proxy to actually proxy for accounts */ + + function transferProxy(address from, address to, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _transfer(from, to, amount); + return true; + } + + function approveProxy(address from, address spender, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _approve(from, spender, amount); + return true; + } + + function transferFromProxy( + address spender, + address from, + address to, + uint256 amount + ) public virtual onlyProxy() returns (bool) + { + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + return true; + } +``` + +Dies sind drei Operationen, die normalerweise erfordern, dass die Nachricht direkt von der Entität stammt, die Token überträgt oder eine Freigabe genehmigt. +Hier haben wir eine Proxy-Version dieser Operationen, die: + +1. Durch `onlyProxy()` modifiziert wird, sodass niemand sonst sie kontrollieren darf. +2. Die Adresse, die normalerweise `msg.sender` wäre, als zusätzlichen Parameter erhält. + +### CalldataInterpreter.sol {#calldatainterpreter-sol-2} + +Der Calldata-Interpreter ist fast identisch mit dem obigen, mit der Ausnahme, dass die Proxy-Funktionen einen `msg.sender`-Parameter erhalten und keine Freigabe für `transfer` erforderlich ist. + +```solidity + // transfer (keine Allowance erforderlich) + if (_func == 2) { + token.transferProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // approve + if (_func == 3) { + token.approveProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // transferFrom + if (_func == 4) { + token.transferFromProxy( + msg.sender, + address(uint160(calldataVal( 1, 20))), + address(uint160(calldataVal(21, 20))), + calldataVal(41, 2) + ); + } +``` + +### Test.js {#test-js-2} + +Es gibt ein paar Änderungen zwischen dem vorherigen Testcode und diesem. + +```js +const Cdi = await ethers.getContractFactory("CalldataInterpreter") +const cdi = await Cdi.deploy(token.address) +await cdi.deployed() +await token.setProxy(cdi.address) +``` + +Wir müssen dem ERC-20-Vertrag mitteilen, welchem Proxy er vertrauen soll + +```js +console.log("CalldataInterpreter addr:", cdi.address) + +// Benötigt zwei Unterzeichner, um Allowances zu verifizieren +const signers = await ethers.getSigners() +const signer = signers[0] +const poorSigner = signers[1] +``` + +Um `approve()` und `transferFrom()` zu überprüfen, benötigen wir einen zweiten Signer. +Wir nennen ihn `poorSigner`, weil er keine unserer Token erhält (er muss natürlich ETH haben). + +```js +// Token übertragen +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +await (await signer.sendTransaction(transferTx)).wait() +``` + +Da der ERC-20-Vertrag dem Proxy (`cdi`) vertraut, benötigen wir keine Freigabe, um Übertragungen weiterzuleiten. + +```js +// approval und transferFrom +const approveTx = { + to: cdi.address, + data: "0x03" + poorSigner.address.slice(2, 42) + "00FF", +} +await (await signer.sendTransaction(approveTx)).wait() + +const destAddr2 = "0xE1165C689C0c3e9642cA7606F5287e708d846206" + +const transferFromTx = { + to: cdi.address, + data: "0x04" + signer.address.slice(2, 42) + destAddr2.slice(2, 42) + "00FF", +} +await (await poorSigner.sendTransaction(transferFromTx)).wait() + +// Überprüfen, ob die Kombination aus approve / transferFrom korrekt ausgeführt wurde +expect(await token.balanceOf(destAddr2)).to.equal(255) +``` + +Testen Sie die beiden neuen Funktionen. +Beachten Sie, dass `transferFromTx` zwei Adressparameter erfordert: den Geber der Freigabe und den Empfänger. + +## Fazit {#conclusion} + +Sowohl [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) als auch [Arbitrum](https://developer.offchainlabs.com/docs/special_features) suchen nach Wegen, die Größe der auf L1 geschriebenen Calldata und damit die Kosten von Transaktionen zu reduzieren. +Als Infrastrukturanbieter, die nach generischen Lösungen suchen, sind unsere Möglichkeiten jedoch begrenzt. +Als Dapp-Entwickler verfügen Sie über anwendungsspezifisches Wissen, mit dem Sie Ihre Calldata viel besser optimieren können, als wir es in einer generischen Lösung könnten. +Hoffentlich hilft Ihnen dieser Artikel dabei, die ideale Lösung für Ihre Bedürfnisse zu finden. + +[Weitere meiner Arbeiten finden Sie hier](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md new file mode 100644 index 00000000000..6e155e8e980 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md @@ -0,0 +1,92 @@ +--- +title: "Sicherheitsrichtlinien für Smart Contracts" +description: Eine Checkliste mit Sicherheitsrichtlinien, die Sie bei der Entwicklung Ihrer Dapp beachten sollten +author: "Trailofbits" +tags: ["Solidity", "Smart Contracts", "Sicherheit"] +skill: intermediate +breadcrumb: Sicherheitsrichtlinien +lang: de +published: 2020-09-06 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md +--- + +Befolgen Sie diese allgemeinen Empfehlungen, um sicherere Smart Contracts zu erstellen. + +## Design-Richtlinien {#design-guidelines} + +Das Design des Vertrags sollte im Voraus besprochen werden, bevor auch nur eine einzige Zeile Code geschrieben wird. + +### Dokumentation und Spezifikationen {#documentation-and-specifications} + +Die Dokumentation kann auf verschiedenen Ebenen verfasst werden und sollte während der Implementierung der Verträge aktualisiert werden: + +- **Eine einfache Beschreibung des Systems**, die erklärt, was die Verträge tun, sowie alle Annahmen zur Codebasis. +- **Schema- und Architekturdiagramme**, einschließlich der Vertragsinteraktionen und des Zustandsautomaten des Systems. [Slither-Drucker (Printers)](https://github.com/crytic/slither/wiki/Printer-documentation) können bei der Erstellung dieser Schemata helfen. +- **Gründliche Code-Dokumentation**, für Solidity kann das [Natspec-Format](https://docs.soliditylang.org/en/develop/natspec-format.html) verwendet werden. + +### Berechnung auf der Blockchain vs. Off-Chain-Berechnung {#onchain-vs-offchain-computation} + +- **Halten Sie so viel Code wie möglich Off-Chain.** Halten Sie die Ebene auf der Blockchain klein. Verarbeiten Sie Daten mit Code Off-Chain so vor, dass die Überprüfung auf der Blockchain einfach ist. Benötigen Sie eine geordnete Liste? Sortieren Sie die Liste Off-Chain und überprüfen Sie dann nur ihre Reihenfolge auf der Blockchain. + +### Aktualisierbarkeit (Upgradeability) {#upgradeability} + +Wir haben die verschiedenen Lösungen zur Aktualisierbarkeit in [unserem Blogbeitrag](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) besprochen. Treffen Sie eine bewusste Entscheidung darüber, ob Sie Aktualisierbarkeit unterstützen möchten oder nicht, bevor Sie Code schreiben. Diese Entscheidung wird beeinflussen, wie Sie Ihren Code strukturieren. Im Allgemeinen empfehlen wir: + +- **Bevorzugen Sie [Vertragsmigration](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) gegenüber Aktualisierbarkeit.** Migrationssysteme bieten viele der gleichen Vorteile wie aktualisierbare Systeme, jedoch ohne deren Nachteile. +- **Verwenden Sie das Datentrennungsmuster (Data Separation) anstelle des Delegatecall-Proxy-Musters.** Wenn Ihr Projekt eine klare Abstraktionstrennung aufweist, erfordert die Aktualisierbarkeit mittels Datentrennung nur wenige Anpassungen. Der Delegatecall-Proxy erfordert Fachwissen über die Ethereum Virtual Machine (EVM) und ist sehr fehleranfällig. +- **Dokumentieren Sie das Migrations-/Aktualisierungsverfahren vor der Bereitstellung.** Wenn Sie unter Stress ohne Richtlinien reagieren müssen, werden Sie Fehler machen. Schreiben Sie das zu befolgende Verfahren im Voraus auf. Es sollte Folgendes umfassen: + - Die Aufrufe, die die neuen Verträge initiieren + - Wo die Schlüssel gespeichert sind und wie man auf sie zugreift + - Wie die Bereitstellung überprüft wird! Entwickeln und testen Sie ein Post-Deployment-Skript. + +## Implementierungsrichtlinien {#implementation-guidelines} + +**Streben Sie nach Einfachheit.** Verwenden Sie immer die einfachste Lösung, die Ihren Zweck erfüllt. Jedes Mitglied Ihres Teams sollte in der Lage sein, Ihre Lösung zu verstehen. + +### Funktionskomposition {#function-composition} + +Die Architektur Ihrer Codebasis sollte es einfach machen, Ihren Code zu überprüfen. Vermeiden Sie architektonische Entscheidungen, die es erschweren, über dessen Richtigkeit nachzudenken. + +- **Teilen Sie die Logik Ihres Systems auf**, entweder durch mehrere Verträge oder indem Sie ähnliche Funktionen gruppieren (zum Beispiel Authentifizierung, Arithmetik, ...). +- **Schreiben Sie kleine Funktionen mit einem klaren Zweck.** Dies erleichtert die Überprüfung und ermöglicht das Testen einzelner Komponenten. + +### Vererbung {#inheritance} + +- **Halten Sie die Vererbung überschaubar.** Vererbung sollte verwendet werden, um die Logik aufzuteilen. Ihr Projekt sollte jedoch darauf abzielen, die Tiefe und Breite des Vererbungsbaums zu minimieren. +- **Verwenden Sie den [Vererbungsdrucker (Inheritance Printer)](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) von Slither, um die Hierarchie der Verträge zu überprüfen.** Der Vererbungsdrucker hilft Ihnen dabei, die Größe der Hierarchie zu überprüfen. + +### Ereignisse (Events) {#events} + +- **Protokollieren Sie alle wichtigen Vorgänge.** Ereignisse helfen dabei, den Vertrag während der Entwicklung zu debuggen und ihn nach der Bereitstellung zu überwachen. + +### Vermeiden Sie bekannte Fallstricke {#avoid-known-pitfalls} + +- **Seien Sie sich der häufigsten Sicherheitsprobleme bewusst.** Es gibt viele Online-Ressourcen, um sich über häufige Probleme zu informieren, wie z. B. [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/) oder [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/). +- **Beachten Sie die Warnhinweise in der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/).** Die Warnhinweise informieren Sie über nicht offensichtliches Verhalten der Sprache. + +### Abhängigkeiten {#dependencies} + +- **Verwenden Sie gut getestete Bibliotheken.** Das Importieren von Code aus gut getesteten Bibliotheken verringert die Wahrscheinlichkeit, dass Sie fehlerhaften Code schreiben. Wenn Sie einen ERC-20-Vertrag schreiben möchten, verwenden Sie [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20). +- **Verwenden Sie einen Abhängigkeitsmanager; vermeiden Sie das Kopieren und Einfügen von Code.** Wenn Sie sich auf eine externe Quelle verlassen, müssen Sie diese mit der Originalquelle auf dem neuesten Stand halten. + +### Tests und Verifizierung {#testing-and-verification} + +- **Schreiben Sie gründliche Unit-Tests.** Eine umfangreiche Testsuite ist entscheidend für die Entwicklung hochwertiger Software. +- **Schreiben Sie benutzerdefinierte Prüfungen und Eigenschaften für [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) und [Manticore](https://github.com/trailofbits/manticore).** Automatisierte Tools helfen dabei, die Sicherheit Ihres Vertrags zu gewährleisten. Lesen Sie den Rest dieses Leitfadens, um zu erfahren, wie Sie effiziente Prüfungen und Eigenschaften schreiben. +- **Verwenden Sie [crytic.io](https://crytic.io/).** Crytic lässt sich in GitHub integrieren, bietet Zugriff auf private Slither-Detektoren und führt benutzerdefinierte Eigenschaftsprüfungen von Echidna aus. + +### Solidity {#solidity} + +- **Bevorzugen Sie Solidity 0.5 gegenüber 0.4 und 0.6.** Unserer Meinung nach ist Solidity 0.5 sicherer und verfügt über bessere integrierte Praktiken als 0.4. Solidity 0.6 hat sich als zu instabil für die Produktion erwiesen und benötigt Zeit, um zu reifen. +- **Verwenden Sie eine stabile Version zum Kompilieren; verwenden Sie die neueste Version, um auf Warnungen zu prüfen.** Stellen Sie sicher, dass Ihr Code mit der neuesten Compiler-Version keine gemeldeten Probleme aufweist. Solidity hat jedoch einen schnellen Veröffentlichungszyklus und eine Historie von Compiler-Fehlern, weshalb wir die neueste Version nicht für die Bereitstellung empfehlen (siehe Slithers [solc-Versionsempfehlung](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)). +- **Verwenden Sie kein Inline-Assembly.** Assembly erfordert Fachwissen über die Ethereum Virtual Machine. Schreiben Sie keinen EVM-Code, wenn Sie das Yellow Paper nicht _gemeistert_ haben. + +## Bereitstellungsrichtlinien {#deployment-guidelines} + +Sobald der Vertrag entwickelt und bereitgestellt wurde: + +- **Überwachen Sie Ihre Verträge.** Beobachten Sie die Protokolle und seien Sie bereit zu reagieren, falls der Vertrag oder das Wallet kompromittiert wird. +- **Fügen Sie Ihre Kontaktinformationen zu [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts) hinzu.** Diese Liste hilft Dritten, Sie zu kontaktieren, falls eine Sicherheitslücke entdeckt wird. +- **Sichern Sie die Wallets privilegierter Benutzer.** Befolgen Sie unsere [Best Practices](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/), wenn Sie Schlüssel in Hardware-Wallets speichern. +- **Haben Sie einen Plan zur Reaktion auf Vorfälle (Incident Response Plan).** Bedenken Sie, dass Ihre Smart Contracts kompromittiert werden können. Selbst wenn Ihre Verträge fehlerfrei sind, könnte ein Angreifer die Kontrolle über die Schlüssel des Vertragsinhabers erlangen. \ No newline at end of file diff --git a/public/content/translations/de/developers/tutorials/stealth-addr/index.md b/public/content/translations/de/developers/tutorials/stealth-addr/index.md new file mode 100644 index 00000000000..032e257d59d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/stealth-addr/index.md @@ -0,0 +1,437 @@ +--- +title: "Verwendung von Stealth-Adressen" +description: "Stealth-Adressen ermöglichen es Benutzern, Vermögenswerte anonym zu übertragen. Nach dem Lesen dieses Artikels werden Sie in der Lage sein: Zu erklären, was Stealth-Adressen sind und wie sie funktionieren, zu verstehen, wie man Stealth-Adressen so nutzt, dass die Anonymität gewahrt bleibt, und eine webbasierte Anwendung zu schreiben, die Stealth-Adressen verwendet." +author: Ori Pomerantz +tags: ["Stealth-Adresse", "Datenschutz", "Kryptografie", "Rust", "wasm"] +skill: intermediate +breadcrumb: Stealth-Adressen +published: 2025-11-30 +lang: de +sidebarDepth: 3 +--- + +Sie sind Bill. Aus Gründen, auf die wir hier nicht näher eingehen, möchten Sie für die Kampagne „Alice for Queen of the World“ spenden und Alice wissen lassen, dass Sie gespendet haben, damit sie Sie belohnt, falls sie gewinnt. Leider ist ihr Sieg nicht garantiert. Es gibt eine konkurrierende Kampagne: „Carol for Empress of the Solar System“. Wenn Carol gewinnt und herausfindet, dass Sie an Alice gespendet haben, stecken Sie in Schwierigkeiten. Sie können also nicht einfach 200 ETH von Ihrem Konto auf das von Alice überweisen. + +[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) bietet die Lösung. Dieser ERC erklärt, wie man [Stealth-Adressen](https://nerolation.github.io/stealth-utils) für anonyme Übertragungen verwendet. + +**Warnung**: Die Kryptografie hinter Stealth-Adressen ist, soweit wir wissen, solide. Es gibt jedoch potenzielle Seitenkanalangriffe. [Unten](#go-wrong) werden Sie sehen, was Sie tun können, um dieses Risiko zu verringern. + +## Wie Stealth-Adressen funktionieren {#how} + +Dieser Artikel wird versuchen, Stealth-Adressen auf zwei Arten zu erklären. Die erste ist, [wie man sie verwendet](#how-use). Dieser Teil reicht aus, um den Rest des Artikels zu verstehen. Danach folgt [eine Erklärung der dahinterstehenden Mathematik](#how-math). Wenn Sie sich für Kryptografie interessieren, lesen Sie auch diesen Teil. + +### Die einfache Version (wie man Stealth-Adressen verwendet) {#how-use} + +Alice erstellt zwei Private-Keys und veröffentlicht die entsprechenden Public-Keys (die zu einer einzigen Meta-Adresse doppelter Länge kombiniert werden können). Bill erstellt ebenfalls einen Private-Key und veröffentlicht den entsprechenden Public-Key. + +Unter Verwendung des Public-Keys der einen Partei und des Private-Keys der anderen kann man ein gemeinsames Geheimnis ableiten, das nur Alice und Bill bekannt ist (es kann nicht allein aus den Public-Keys abgeleitet werden). Mit diesem gemeinsamen Geheimnis erhält Bill die Stealth-Adresse und kann Vermögenswerte dorthin senden. + +Alice erhält die Adresse ebenfalls aus dem gemeinsamen Geheimnis, aber da sie die Private-Keys zu den von ihr veröffentlichten Public-Keys kennt, kann sie auch den Private-Key erhalten, der es ihr ermöglicht, von dieser Adresse abzuheben. + +### Die Mathematik (warum Stealth-Adressen so funktionieren) {#how-math} + +Standard-Stealth-Adressen verwenden [Elliptische-Kurven-Kryptografie (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor), um eine bessere Leistung mit weniger Schlüsselbits zu erzielen und gleichzeitig das gleiche Sicherheitsniveau beizubehalten. Aber größtenteils können wir das ignorieren und so tun, als würden wir normale Arithmetik verwenden. + +Es gibt eine Zahl, die jeder kennt, *G*. Man kann mit *G* multiplizieren. Aber aufgrund der Natur von ECC ist es praktisch unmöglich, durch *G* zu dividieren. Die Art und Weise, wie Public-Key-Kryptografie in Ethereum im Allgemeinen funktioniert, besteht darin, dass man einen Private-Key, *Ppriv*, verwenden kann, um Transaktionen zu signieren, die dann durch einen Public-Key, *Ppub = GPpriv*, verifiziert werden. + +Alice erstellt zwei Private-Keys, *Kpriv* und *Vpriv*. *Kpriv* wird verwendet, um Geld von der Stealth-Adresse auszugeben, und *Vpriv*, um die Adressen einzusehen, die Alice gehören. Alice veröffentlicht dann die Public-Keys: *Kpub = GKpriv* und *Vpub = GVpriv* + +Bill erstellt einen dritten Private-Key, *Rpriv*, und veröffentlicht *Rpub = GRpriv* in einer zentralen Registratur (Bill hätte ihn auch an Alice senden können, aber wir gehen davon aus, dass Carol mithört). + +Bill berechnet *RprivVpub = GRprivVpriv*, wovon er ausgeht, dass Alice es ebenfalls kennt (wird unten erklärt). Dieser Wert wird *S* genannt, das gemeinsame Geheimnis. Dies gibt Bill einen Public-Key, *Ppub = Kpub+G\*hash(S)*. Aus diesem Public-Key kann er eine Adresse berechnen und beliebige Ressourcen dorthin senden. Wenn Alice in Zukunft gewinnt, kann Bill ihr *Rpriv* mitteilen, um zu beweisen, dass die Ressourcen von ihm stammen. + +Alice berechnet *RpubVpriv = GRprivVpriv*. Dies gibt ihr dasselbe gemeinsame Geheimnis, *S*. Da sie den Private-Key, *Kpriv*, kennt, kann sie *Ppriv = Kpriv+hash(S)* berechnen. Dieser Schlüssel ermöglicht ihr den Zugriff auf Vermögenswerte in der Adresse, die sich aus *Ppub = GPpriv = GKpriv+G\*hash(S) = Kpub+G\*hash(S)* ergibt. + +Wir haben einen separaten Ansichtsschlüssel (Viewing Key), um es Alice zu ermöglichen, Dave's World Domination Campaign Services als Subunternehmer zu beauftragen. Alice ist bereit, Dave die öffentlichen Adressen wissen zu lassen und sie zu informieren, wenn mehr Geld verfügbar ist, aber sie möchte nicht, dass er ihr Kampagnengeld ausgibt. + +Da für das Einsehen und Ausgeben separate Schlüssel verwendet werden, kann Alice Dave *Vpriv* geben. Dann kann Dave *S = RpubVpriv = GRprivVpriv* berechnen und auf diese Weise die Public-Keys (*Ppub = Kpub+G\*hash(S)*) erhalten. Aber ohne *Kpriv* kann Dave den Private-Key nicht erhalten. + +Zusammenfassend sind dies die Werte, die den verschiedenen Teilnehmern bekannt sind. + +| Alice | Veröffentlicht | Bill | Dave | +| - | - | - | - | +| G | G | G | G | +| *Kpriv* | - | - | - | +| *Vpriv* | - | - | *Vpriv* | +| *Kpub = GKpriv* | *Kpub* | *Kpub* | *Kpub* | +| *Vpub = GVpriv* | *Vpub* | *Vpub* | *Vpub* | +| - | - | *Rpriv* | - | +| *Rpub* | *Rpub* | *Rpub = GRpriv* | *Rpub* | +| *S = RpubVpriv = GRprivVpriv* | - | *S = RprivVpub = GRprivVpriv* | *S = *RpubVpriv* = GRprivVpriv* | +| *Ppub = Kpub+G\*hash(S)* | - | *Ppub = Kpub+G\*hash(S)* | *Ppub = Kpub+G\*hash(S)* | +| *Adresse=f(Ppub)* | - | *Adresse=f(Ppub)* | *Adresse=f(Ppub)* | *Adresse=f(Ppub)* +| *Ppriv = Kpriv+hash(S)* | - | - | - | + +## Wenn Stealth-Adressen schiefgehen {#go-wrong} + +*Es gibt keine Geheimnisse auf der Blockchain*. Während Stealth-Adressen Ihnen Privatsphäre bieten können, ist diese Privatsphäre anfällig für Verkehrsanalysen. Um ein triviales Beispiel zu wählen: Stellen Sie sich vor, Bill finanziert eine Adresse und sendet sofort eine Transaktion, um einen *Rpub*-Wert zu veröffentlichen. Ohne Alices *Vpriv* können wir nicht sicher sein, dass dies eine Stealth-Adresse ist, aber es ist sehr wahrscheinlich. Dann sehen wir eine weitere Transaktion, die alle ETH von dieser Adresse auf die Adresse von Alices Kampagnenfonds überträgt. Wir können es vielleicht nicht beweisen, aber es ist wahrscheinlich, dass Bill gerade für Alices Kampagne gespendet hat. Carol würde das sicherlich denken. + +Es ist für Bill einfach, die Veröffentlichung von *Rpub* von der Finanzierung der Stealth-Adresse zu trennen (dies zu unterschiedlichen Zeiten und von unterschiedlichen Adressen aus zu tun). Das ist jedoch unzureichend. Das Muster, nach dem Carol sucht, ist, dass Bill eine Adresse finanziert und dann Alices Kampagnenfonds davon abhebt. + +Eine Lösung besteht darin, dass Alices Kampagne das Geld nicht direkt abhebt, sondern es verwendet, um einen Dritten zu bezahlen. Wenn Alices Kampagne 10 ETH an Dave's World Domination Campaign Services sendet, weiß Carol nur, dass Bill an einen von Daves Kunden gespendet hat. Wenn Dave genug Kunden hat, könnte Carol nicht wissen, ob Bill an Alice gespendet hat, die mit ihr konkurriert, oder an Adam, Albert oder Abigail, die Carol egal sind. Alice kann der Zahlung einen gehashten Wert beifügen und Dave dann das Urbild (Preimage) zur Verfügung stellen, um zu beweisen, dass es ihre Spende war. Alternativ, wie oben angemerkt, weiß Dave bereits, von wem die Zahlung kam, wenn Alice ihm ihr *Vpriv* gibt. + +Das Hauptproblem bei dieser Lösung ist, dass sie erfordert, dass Alice sich um Geheimhaltung kümmert, wenn diese Geheimhaltung Bill zugutekommt. Alice möchte vielleicht ihren Ruf wahren, damit Bills Freund Bob ebenfalls an sie spendet. Aber es ist auch möglich, dass es ihr nichts ausmachen würde, Bill bloßzustellen, weil er dann Angst davor hat, was passiert, wenn Carol gewinnt. Bill könnte am Ende Alice noch mehr Unterstützung zukommen lassen. + +### Verwendung mehrerer Stealth-Ebenen {#multi-layer} + +Anstatt sich darauf zu verlassen, dass Alice Bills Privatsphäre wahrt, kann Bill dies selbst tun. Er kann mehrere Meta-Adressen für fiktive Personen, Bob und Bella, generieren. Bill sendet dann ETH an Bob, und „Bob“ (der eigentlich Bill ist) sendet sie an Bella. „Bella“ (ebenfalls Bill) sendet sie an Alice. + +Carol kann immer noch eine Verkehrsanalyse durchführen und die Pipeline von Bill zu Bob zu Bella zu Alice sehen. Wenn „Bob“ und „Bella“ jedoch ETH auch für andere Zwecke verwenden, wird es nicht so aussehen, als hätte Bill etwas an Alice übertragen, selbst wenn Alice sofort von der Stealth-Adresse auf ihre bekannte Kampagnenadresse abhebt. + +## Schreiben einer Stealth-Adressen-Anwendung {#write-app} + +Dieser Artikel erklärt eine Stealth-Adressen-Anwendung, die [auf GitHub verfügbar ist](https://github.com/qbzzt/251022-stealth-addresses.git). + +### Werkzeuge {#tools} + +Es gibt [eine Typescript-Stealth-Adressen-Bibliothek](https://github.com/ScopeLift/stealth-address-sdk), die wir verwenden könnten. Kryptografische Operationen können jedoch CPU-intensiv sein. Ich ziehe es vor, sie in einer kompilierten Sprache wie [Rust](https://rust-lang.org/) zu implementieren und [WASM](https://webassembly.org/) zu verwenden, um den Code im Browser auszuführen. + +Wir werden [Vite](https://vite.dev/) und [React](https://react.dev/) verwenden. Dies sind branchenübliche Werkzeuge; wenn Sie nicht mit ihnen vertraut sind, können Sie [dieses Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) verwenden. Um Vite zu verwenden, benötigen wir Node. + +### Stealth-Adressen in Aktion sehen {#in-action} + +1. Installieren Sie die erforderlichen Werkzeuge: [Rust](https://rust-lang.org/tools/install/) und [Node](https://nodejs.org/en/download). + +2. Klonen Sie das GitHub-Repository. + + ```sh + git clone https://github.com/qbzzt/251022-stealth-addresses.git + cd 251022-stealth-addresses +``` + +3. Installieren Sie die Voraussetzungen und kompilieren Sie den Rust-Code. + + ```sh + cd src/rust-wasm + rustup target add wasm32-unknown-unknown + cargo install wasm-pack + wasm-pack build --target web +``` + +4. Starten Sie den Webserver. + + ```sh + cd ../.. + npm install + npm run dev +``` + +5. Navigieren Sie zu [der Anwendung](http://localhost:5173/). Diese Anwendungsseite hat zwei Frames: einen für Alices Benutzeroberfläche und den anderen für Bills. Die beiden Frames kommunizieren nicht miteinander; sie befinden sich nur der Einfachheit halber auf derselben Seite. + +6. Klicken Sie als Alice auf **Generate a Stealth Meta-Address**. Dadurch werden die neue Stealth-Adresse und die entsprechenden Private-Keys angezeigt. Kopieren Sie die Stealth-Meta-Adresse in die Zwischenablage. + +7. Fügen Sie als Bill die neue Stealth-Meta-Adresse ein und klicken Sie auf **Generate an address**. Dies gibt Ihnen die Adresse, die Sie für Alice finanzieren können. + +8. Kopieren Sie die Adresse und Bills Public-Key und fügen Sie sie in den Bereich „Private key for address generated by Bill“ von Alices Benutzeroberfläche ein. Sobald diese Felder ausgefüllt sind, sehen Sie den Private-Key, um auf die Vermögenswerte an dieser Adresse zuzugreifen. + +9. Sie können [einen Online-Rechner](https://iancoleman.net/ethereum-private-key-to-address/) verwenden, um sicherzustellen, dass der Private-Key der Adresse entspricht. + +### Wie das Programm funktioniert {#how-the-program-works} + +#### Die WASM-Komponente {#wasm} + +Der Quellcode, der in WASM kompiliert wird, ist in [Rust](https://rust-lang.org/) geschrieben. Sie können ihn in [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs) sehen. Dieser Code ist in erster Linie eine Schnittstelle zwischen dem JavaScript-Code und [der `eth-stealth-addresses`-Bibliothek](https://github.com/kassandraoftroy/eth-stealth-addresses). + +**`Cargo.toml`** + +[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) in Rust ist analog zu [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) in JavaScript. Es enthält Paketinformationen, Abhängigkeitsdeklarationen usw. + +```toml +[package] +name = "rust-wasm" +version = "0.1.0" +edition = "2024" + +[dependencies] +eth-stealth-addresses = "0.1.0" +hex = "0.4.3" +wasm-bindgen = "0.2.104" +getrandom = { version = "0.2", features = ["js"] } +``` + +Das Paket [`getrandom`](https://docs.rs/getrandom/latest/getrandom/) muss Zufallswerte generieren. Das kann nicht durch rein algorithmische Mittel geschehen; es erfordert den Zugriff auf einen physikalischen Prozess als Entropiequelle. Diese Definition legt fest, dass wir diese Entropie erhalten, indem wir den Browser abfragen, in dem wir ausgeführt werden. + +```toml +console_error_panic_hook = "0.1.7" +``` + +[Diese Bibliothek](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) gibt uns aussagekräftigere Fehlermeldungen, wenn der WASM-Code in Panik gerät (panics) und nicht fortgesetzt werden kann. + +```toml +[lib] +crate-type = ["cdylib", "rlib"] +``` + +Der Ausgabetyp, der erforderlich ist, um WASM-Code zu erzeugen. + +**`lib.rs`** + +Dies ist der eigentliche Rust-Code. + +```rust +use wasm_bindgen::prelude::*; +``` + +Die Definitionen, um ein WASM-Paket aus Rust zu erstellen. Sie sind [hier](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html) dokumentiert. + +```rust +use eth_stealth_addresses::{ + generate_stealth_meta_address, + generate_stealth_address, + compute_stealth_key +}; +``` + +Die Funktionen, die wir aus [der `eth-stealth-addresses`-Bibliothek](https://github.com/kassandraoftroy/eth-stealth-addresses) benötigen. + +```rust +use hex::{decode,encode}; +``` + +Rust verwendet typischerweise Byte-[Arrays](https://doc.rust-lang.org/std/primitive.array.html) (`[u8; ]`) für Werte. Aber in JavaScript verwenden wir typischerweise hexadezimale Zeichenfolgen. [Die `hex`-Bibliothek](https://docs.rs/hex/latest/hex/) übersetzt für uns von einer Darstellung in die andere. + +```rust +#[wasm_bindgen] +``` + +Generieren Sie WASM-Bindungen, um diese Funktion aus JavaScript aufrufen zu können. + +```rust +pub fn wasm_generate_stealth_meta_address() -> String { +``` + +Der einfachste Weg, ein Objekt mit mehreren Feldern zurückzugeben, ist die Rückgabe eines JSON-Strings. + +```rust + let (address, spend_private_key, view_private_key) = + generate_stealth_meta_address(); +``` + +Die Funktion [`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) gibt drei Felder zurück: + +- Die Meta-Adresse (*Kpub* und *Vpub*) +- Den Ansichts-Private-Key (*Vpriv*) +- Den Ausgabe-Private-Key (*Kpriv*) + +Die [Tupel](https://doc.rust-lang.org/std/primitive.tuple.html)-Syntax ermöglicht es uns, diese Werte wieder zu trennen. + +```rust + format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}", + encode(address), + encode(view_private_key), + encode(spend_private_key) + ) +} +``` + +Verwenden Sie das Makro [`format!`](https://doc.rust-lang.org/std/fmt/index.html), um den JSON-codierten String zu generieren. Verwenden Sie [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html), um die Arrays in Hex-Strings umzuwandeln. + +```rust +fn str_to_array(s: &str) -> Option<[u8; N]> { +``` + +Diese Funktion wandelt einen Hex-String (bereitgestellt von JavaScript) in ein Byte-Array um. Wir verwenden sie, um Werte zu parsen, die vom JavaScript-Code bereitgestellt werden. Diese Funktion ist kompliziert, da Rust Arrays und Vektoren auf eine bestimmte Weise handhabt. + +Der Ausdruck `` wird als [Generikum (Generic)](https://doc.rust-lang.org/book/ch10-01-syntax.html) bezeichnet. `N` ist ein Parameter, der die Länge des zurückgegebenen Arrays steuert. Die Funktion heißt eigentlich `str_to_array::`, wobei `n` die Array-Länge ist. + +Der Rückgabewert ist `Option<[u8; N]>`, was bedeutet, dass das zurückgegebene Array [optional](https://doc.rust-lang.org/std/option/) ist. Dies ist ein typisches Muster in Rust für Funktionen, die fehlschlagen können. + +Wenn wir beispielsweise `str_to_array::10("bad060a7")` aufrufen, soll die Funktion ein Array mit zehn Werten zurückgeben, aber die Eingabe ist nur vier Bytes lang. Die Funktion muss fehlschlagen, und das tut sie, indem sie `None` zurückgibt. Der Rückgabewert für `str_to_array::4("bad060a7")` wäre `Some<[0xba, 0xd0, 0x60, 0xa7]>`. + +```rust + // decode gibt Result, _> zurück + let vec = decode(s).ok()?; +``` + +Die Funktion [`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html) gibt ein `Result, FromHexError>` zurück. Der Typ [`Result`](https://doc.rust-lang.org/std/result/) kann entweder ein erfolgreiches Ergebnis (`Ok(value)`) oder einen Fehler (`Err(error)`) enthalten. + +Die Methode `.ok()` wandelt das `Result` in eine `Option` um, deren Wert entweder der `Ok()`-Wert ist, wenn sie erfolgreich war, oder `None`, wenn nicht. Schließlich bricht der [Fragezeichen-Operator](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) die aktuellen Funktionen ab und gibt ein `None` zurück, wenn die `Option` leer ist. Andernfalls entpackt er den Wert und gibt ihn zurück (in diesem Fall, um `vec` einen Wert zuzuweisen). + +Dies sieht nach einer seltsam komplizierten Methode zur Fehlerbehandlung aus, aber `Result` und `Option` stellen sicher, dass alle Fehler auf die eine oder andere Weise behandelt werden. + +```rust + if vec.len() != N { return None; } +``` + +Wenn die Anzahl der Bytes falsch ist, ist das ein Fehler, und wir geben `None` zurück. + +```rust + // try_into verbraucht vec und versucht, [u8; N] zu erstellen + let array: [u8; N] = vec.try_into().ok()?; +``` + +Rust hat zwei Array-Typen. [Arrays](https://doc.rust-lang.org/std/primitive.array.html) haben eine feste Größe. [Vektoren](https://doc.rust-lang.org/std/vec/index.html) können wachsen und schrumpfen. `hex::decode` gibt einen Vektor zurück, aber die `eth_stealth_addresses`-Bibliothek möchte Arrays empfangen. [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) konvertiert einen Wert in einen anderen Typ, zum Beispiel einen Vektor in ein Array. + +```rust + Some(array) +} +``` + +Rust verlangt nicht, dass Sie das Schlüsselwort [`return`](https://doc.rust-lang.org/std/keyword.return.html) verwenden, wenn Sie am Ende einer Funktion einen Wert zurückgeben. + +```rust +#[wasm_bindgen] +pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option { +``` + +Diese Funktion empfängt eine öffentliche Meta-Adresse, die sowohl *Vpub* als auch *Kpub* enthält. Sie gibt die Stealth-Adresse, den zu veröffentlichenden Public-Key (*Rpub*) und einen Ein-Byte-Scanwert zurück, der die Identifizierung beschleunigt, welche veröffentlichten Adressen zu Alice gehören könnten. + +Der Scanwert ist Teil des gemeinsamen Geheimnisses (*S = GRprivVpriv*). Dieser Wert steht Alice zur Verfügung, und seine Überprüfung ist viel schneller als die Überprüfung, ob *f(Kpub+G\*hash(S))* der veröffentlichten Adresse entspricht. + +```rust + let (address, r_pub, scan) = + generate_stealth_address(&str_to_array::<66>(stealth_address)?); +``` + +Wir verwenden die Funktion [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) der Bibliothek. + +```rust + format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}", + encode(address), + encode(r_pub), + encode(&[scan]) + ).into() +} +``` + +Bereiten Sie den JSON-codierten Ausgabe-String vor. + +```rust +#[wasm_bindgen] +pub fn wasm_compute_stealth_key( + address: &str, + bill_pub_key: &str, + view_private_key: &str, + spend_private_key: &str +) -> Option { + . + . + . +} +``` + +Diese Funktion verwendet die Funktion [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html) der Bibliothek, um den Private-Key zum Abheben von der Adresse (*Rpriv*) zu berechnen. Diese Berechnung erfordert diese Werte: + +- Die Adresse (*Adresse=f(Ppub)*) +- Den von Bill generierten Public-Key (*Rpub*) +- Den Ansichts-Private-Key (*Vpriv*) +- Den Ausgabe-Private-Key (*Kpriv*) + +```rust +#[wasm_bindgen(start)] +``` + +[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) gibt an, dass die Funktion ausgeführt wird, wenn der WASM-Code initialisiert wird. + +```rust +pub fn main() { + console_error_panic_hook::set_once(); +} +``` + +Dieser Code legt fest, dass die Panic-Ausgabe an die JavaScript-Konsole gesendet wird. Um dies in Aktion zu sehen, verwenden Sie die Anwendung und geben Sie Bill eine ungültige Meta-Adresse (ändern Sie einfach eine hexadezimale Ziffer). Sie werden diesen Fehler in der JavaScript-Konsole sehen: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9: +assertion `left == right` failed + left: 0 + right: 1 +``` + +Gefolgt von einem Stacktrace. Geben Sie Bill dann die gültige Meta-Adresse und geben Sie Alice entweder eine ungültige Adresse oder einen ungültigen Public-Key. Sie werden diesen Fehler sehen: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9: +keys do not generate stealth address +``` + +Wieder gefolgt von einem Stacktrace. + +#### Die Benutzeroberfläche {#ui} + +Die Benutzeroberfläche ist mit [React](https://react.dev/) geschrieben und wird von [Vite](https://vite.dev/) bereitgestellt. Sie können mehr darüber in [diesem Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) erfahren. Hier besteht kein Bedarf an [WAGMI](https://wagmi.sh/), da wir nicht direkt mit einer Blockchain oder einem Wallet interagieren. + +Der einzige nicht offensichtliche Teil der Benutzeroberfläche ist die WASM-Konnektivität. Hier ist, wie sie funktioniert. + +**`vite.config.js`** + +Diese Datei enthält [die Vite-Konfiguration](https://vite.dev/config/). + +```js +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import wasm from "vite-plugin-wasm"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), wasm()], +}) +``` + +Wir benötigen zwei Vite-Plugins: [react](https://www.npmjs.com/package/@vitejs/plugin-react) und [wasm](https://github.com/Menci/vite-plugin-wasm#readme). + +**`App.jsx`** + +Diese Datei ist die Hauptkomponente der Anwendung. Sie ist ein Container, der zwei Komponenten enthält: `Alice` und `Bill`, die Benutzeroberflächen für diese Benutzer. Der relevante Teil für WASM ist der Initialisierungscode. + +```jsx +import init from './rust-wasm/pkg/rust_wasm.js' +``` + +Wenn wir [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/) verwenden, erstellt es zwei Dateien, die wir hier verwenden: eine wasm-Datei mit dem eigentlichen Code (hier `src/rust-wasm/pkg/rust_wasm_bg.wasm`) und eine JavaScript-Datei mit den Definitionen zu deren Verwendung (hier `src/rust_wasm/pkg/rust_wasm.js`). Der Standardexport dieser JavaScript-Datei ist Code, der ausgeführt werden muss, um WASM zu initiieren. + +```jsx +function App() { + . + . + . + useEffect(() => { + const loadWasm = async () => { + try { + await init(); + setWasmReady(true) + } catch (err) { + console.error('Error loading wasm:', err) + alert("Wasm error: " + err) + } + } + + loadWasm() + }, [] + ) +``` + +Der [`useEffect`-Hook](https://react.dev/reference/react/useEffect) ermöglicht es Ihnen, eine Funktion anzugeben, die ausgeführt wird, wenn sich Zustandsvariablen ändern. Hier ist die Liste der Zustandsvariablen leer (`[]`), sodass diese Funktion nur einmal beim Laden der Seite ausgeführt wird. + +Die Effektfunktion muss sofort zurückkehren. Um asynchronen Code zu verwenden, wie z. B. das WASM-`init` (das die `.wasm`-Datei laden muss und daher Zeit in Anspruch nimmt), definieren wir eine interne [`async`](https://en.wikipedia.org/wiki/Async/await)-Funktion und führen sie ohne ein `await` aus. + +**`Bill.jsx`** + +Dies ist die Benutzeroberfläche für Bill. Sie hat eine einzige Aktion: das Erstellen einer Adresse basierend auf der von Alice bereitgestellten Stealth-Meta-Adresse. + +```jsx +import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js' +``` + +Zusätzlich zum Standardexport exportiert der von `wasm-pack` generierte JavaScript-Code eine Funktion für jede Funktion im WASM-Code. + +```jsx +