diff --git a/.gitignore b/.gitignore index f20f2c95..6eef8659 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .docusaurus build +i18n/de/code.json diff --git a/i18n/de/code.json b/i18n/de/code.json new file mode 100644 index 00000000..8d6cb648 --- /dev/null +++ b/i18n/de/code.json @@ -0,0 +1,391 @@ +{ + "untranslated-page-text": { + "message": "Diese Seite ist nicht übersetzt. Bitte helfen Sie uns, sie zu übersetzen, indem Sie dem Link am unteren Ende der Seite folgen." + }, + "theme.ErrorPageContent.title": { + "message": "Die Seite ist abgestürzt.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Nochmal versuchen", + "description": "The label of the button to try again when the page crashed" + }, + "theme.NotFound.title": { + "message": "Seite nicht gefunden", + "description": "The title of the 404 page" + }, + "theme.NotFound.p1": { + "message": "Wir konnten nicht finden, wonach Sie gesucht haben.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Bitte kontaktieren Sie den Besitzer der Seite, die Sie mit der ursprünglichen URL verlinkt hat, und teilen Sie ihm mit, dass der Link nicht mehr funktioniert.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Zurück nach oben scrollen", + "description": "The ARIA label for the back to top button" + }, + "theme.admonition.note": { + "message": "Hinweis", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "Tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.danger": { + "message": "Warnung", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "Info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.caution": { + "message": "Achtung", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.blog.archive.title": { + "message": "Archiv", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archiv", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Navigation der Blog-Listenseite", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Neuere Einträge", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Ältere Einträge", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.plurals": { + "message": "Ein Post|{count} Posts", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} getaggt mit \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "Alle Tags anzeigen", + "description": "The label of the link targeting the tag list page" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Blog Post Seiten Navigation", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Neuer Post", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Älterer Post", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.colorToggle.ariaLabel": { + "message": "Umschalten zwischen dunkler und heller Ansicht (momentan {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "dunkler Modus", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "heller Modus", + "description": "The name for the light color mode" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} Einträge", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.breadcrumbs.home": { + "message": "Home page", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Breadcrumbs", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Dokumentation Seiten Navigation", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Zurück", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Weiter", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "Ein doc getaggt|{count} docs getaggt", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} mit \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Das ist die unveröffentlichte Dokumentation für {siteTitle} {versionLabel}.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Das ist die Dokumentation für {siteTitle} {versionLabel} und wird nicht weiter gewartet.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Für die aktuellste Dokumentation bitte auf {latestVersionLink} ({versionLabel}) gehen.", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "letzte Version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.common.editThisPage": { + "message": "Diese Seite bearbeiten", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Direkter Link zur Überschrift", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " am {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " von {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Letztes Update{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versionen", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.common.skipToMainContent": { + "message": "Zum Hauptinhalt springen", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsListLabel": { + "message": "Tags:", + "description": "The label alongside a tag list" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Schließen", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Navigation der letzten Beiträge im Blog", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "Kopiert", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "In die Zwischenablage kopieren", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "Kopieren", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Toggle word wrap", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { + "message": "Umschalten der Seitenleiste mit einklappbarer Kategorie '{label}'", + "description": "The ARIA label to toggle the collapsible sidebar category" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Sprachen", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "Auf dieser Seite", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "Mehr lesen", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Mehr lesen über {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "Eine Minute Lesezeit|{readingTime} Minuten Lesezeit", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Seitenleiste einklappen", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Seitenleiste einklappen", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Zurück zum Hauptmenü", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Seitenleiste ausklappen", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Seitenleiste ausklappen", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.SearchBar.seeAll": { + "message": "Alle {count} Ergebnisse anzeigen" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "Ein Dokument gefunden|{count} Dokumente gefunden", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.existingResultsTitle": { + "message": "Suchergebnisse für \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Suche in der Dokumentation", + "description": "The search page title for empty query" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Geben Sie hier Ihre Suche ein", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Suche", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.algoliaLabel": { + "message": "Suche von Algolia", + "description": "The ARIA label for Algolia mention" + }, + "theme.SearchPage.noResultsText": { + "message": "Es wurden keine Ergebnisse gefunden", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Neue Ergebnisse abrufen...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchBar.label": { + "message": "Suche", + "description": "The ARIA label and placeholder for search button" + }, + "theme.SearchModal.searchBox.resetButtonTitle": { + "message": "Clear the query", + "description": "The label and ARIA label for search box reset button" + }, + "theme.SearchModal.searchBox.cancelButtonText": { + "message": "Cancel", + "description": "The label and ARIA label for search box cancel button" + }, + "theme.SearchModal.startScreen.recentSearchesTitle": { + "message": "Recent", + "description": "The title for recent searches" + }, + "theme.SearchModal.startScreen.noRecentSearchesText": { + "message": "No recent searches", + "description": "The text when no recent searches" + }, + "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { + "message": "Save this search", + "description": "The label for save recent search button" + }, + "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { + "message": "Remove this search from history", + "description": "The label for remove recent search button" + }, + "theme.SearchModal.startScreen.favoriteSearchesTitle": { + "message": "Favorite", + "description": "The title for favorite searches" + }, + "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { + "message": "Remove this search from favorites", + "description": "The label for remove favorite search button" + }, + "theme.SearchModal.errorScreen.titleText": { + "message": "Unable to fetch results", + "description": "The title for error screen of search modal" + }, + "theme.SearchModal.errorScreen.helpText": { + "message": "You might want to check your network connection.", + "description": "The help text for error screen of search modal" + }, + "theme.SearchModal.footer.selectText": { + "message": "to select", + "description": "The explanatory text of the action for the enter key" + }, + "theme.SearchModal.footer.selectKeyAriaLabel": { + "message": "Enter key", + "description": "The ARIA label for the Enter key button that makes the selection" + }, + "theme.SearchModal.footer.navigateText": { + "message": "to navigate", + "description": "The explanatory text of the action for the Arrow up and Arrow down key" + }, + "theme.SearchModal.footer.navigateUpKeyAriaLabel": { + "message": "Arrow up", + "description": "The ARIA label for the Arrow up key button that makes the navigation" + }, + "theme.SearchModal.footer.navigateDownKeyAriaLabel": { + "message": "Arrow down", + "description": "The ARIA label for the Arrow down key button that makes the navigation" + }, + "theme.SearchModal.footer.closeText": { + "message": "to close", + "description": "The explanatory text of the action for Escape key" + }, + "theme.SearchModal.footer.closeKeyAriaLabel": { + "message": "Escape key", + "description": "The ARIA label for the Escape key button that close the modal" + }, + "theme.SearchModal.footer.searchByText": { + "message": "Search by", + "description": "The text explain that the search is making by Algolia" + }, + "theme.SearchModal.noResultsScreen.noResultsText": { + "message": "No results for", + "description": "The text explains that there are no results for the following search" + }, + "theme.SearchModal.noResultsScreen.suggestedQueryText": { + "message": "Try searching for", + "description": "The text for the suggested query when no results are found for the following search" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsText": { + "message": "Believe this query should return results?", + "description": "The text for the question where the user thinks there are missing results" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { + "message": "Let us know.", + "description": "The text for the link to report missing results" + }, + "theme.SearchModal.placeholder": { + "message": "Search docs", + "description": "The placeholder of the input of the DocSearch pop-up modal" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + } +} diff --git a/i18n/de/docusaurus-plugin-content-docs/current.json b/i18n/de/docusaurus-plugin-content-docs/current.json new file mode 100644 index 00000000..4897b7d2 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,54 @@ +{ + "version.label": { + "message": "Next", + "description": "The label for version current" + }, + "sidebar.tutorialSidebar.category.Full Node": { + "message": "Full Node", + "description": "The label for category Full Node in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Building dApps": { + "message": "DApps erstellen", + "description": "The label for category Building dApps in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Ralph Language": { + "message": "Ralph Language", + "description": "The label for category Ralph Language in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Wallet": { + "message": "Wallet", + "description": "The label for category Wallet in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Desktop Wallet": { + "message": "Desktop Wallet", + "description": "The label for category Desktop Wallet in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Extension wallet": { + "message": "Extension Wallet", + "description": "The label for category Extension wallet in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Integration": { + "message": "Integration", + "description": "The label for category Integration in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Mining": { + "message": "Mining", + "description": "The label for category Mining in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Network": { + "message": "Netzwerk", + "description": "The label for category Network in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Explorer Backend": { + "message": "Explorer Backend", + "description": "The label for category Explorer Backend in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Tokens": { + "message": "Tokens", + "description": "The label for category Tokens in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Misc": { + "message": "Misc", + "description": "The label for category Misc in sidebar tutorialSidebar" + } +} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/5min-overview.md b/i18n/de/docusaurus-plugin-content-docs/current/5min-overview.md new file mode 100644 index 00000000..6313d818 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/5min-overview.md @@ -0,0 +1,215 @@ +--- +sidebar_position: 0 +sidebar_label: Übersicht +slug: / +title: Alephium Übersicht +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Was ist Alephium? + +**Skalierbar für Entwickler. Sicher für Benutzer. Dezentralisiert für alle.** + +Innovatives Sharding trifft auf expressive sUTXO und effizientes Proof-of-Less-Work, um skalierbare DApps für den realen Einsatz zu sichern. + +--- + +## Warum ist Alephium besonders? + +Neben einem beeindruckenden Team, einer herausragenden Gemeinschaft und viel Energie zeichnen Alephium folgende technische Besonderheiten aus: + +**Skaliert durch Sharding.** Alephium basiert auf einem neuartigen und umfassenden Sharding-Algorithmus namens BlockFlow. Dieser verbessert das UTXO-Modell von BTC, um es skalierbar zu machen, und verwendet die DAG-Datenstruktur, um Konsens zwischen verschiedenen Shards zu erreichen. Dies ermöglicht bis zu 10.000 Transaktionen pro Sekunde (derzeit mehr als 400 TPS im Vergleich zu Bitcoins 7 TPS). + +**Programmierbar und Sicher.** Alephium bietet ein zustandsbehaftetes UTXO-Modell, das Layer-1-Skalierbarkeit und das gleiche Maß an Programmierbarkeit wie das auf ETH implementierte Account-Modell verwendet, während es gleichzeitig sicherer ist. + +**Weniger energieintensiv dank POLW.** Proof of Less Work kombiniert physische Arbeit und Coin-Ökonomie, um die erforderliche Arbeit für das Minen neuer Blöcke dynamisch anzupassen. Unter gleichen Netzwerkbedingungen verwendet Alephium nur ⅛ der Energie im Vergleich zu Bitcoin. + +**Verbessert die On-Chain-Struktur mit seiner eigenen benutzerdefinierten VM (Alphred).** Es löst viele der kritischen Probleme der aktuellen DApps-Plattformen mit erheblichen Verbesserungen bei Sicherheit, Entwicklungserfahrung und der Einführung neuer Paradigmen wie trustless P2P Smart Contracts Transaktionen. + +**Verfügt über eine eigene Programmiersprache für DApps.** Ralph ähnelt der Rust-Syntax, daher sein Name. Es ermöglicht das einfachere Erstellen effizienter und sicherer Smart Contracts im Vergleich zu Solidity. Es ist speziell darauf ausgerichtet, die Erstellung von dezentralen Finanzanwendungen zu erleichtern! + +Durch die Kombination all dieser Innovationen bietet Alephium eine stark nachgefragte Lösung in der Branche: eine skalierbare Blockchain, die auf bewährten Ideen von Bitcoin aufbaut, um zuverlässige, leistungsstarke und sichere DeFi- und DApps-Funktionen zu liefern. Und wir sind live! + +**Schehen Sie sich unsere [Whitepapers][whitepaper] an!** + +--- + +## Unsere Tokenökonomie + +Die Tokenversorgung auf Alephium ist begrenzt und hat ein Hardcap von 1 Milliarde. Zum Zeitpunkt des Mainnet-Launchs (11.8.21) wurden mit dem Genesis-Block eine anfängliche Versorgung von 140 Millionen Tokens (14% des Hardcaps) abgebaut. Die verbleibende Versorgung der ALPH-Token wird über die nächsten ~80 Jahre abgebaut. Von diesen 140 Millionen Tokens: + +80 Millionen Tokens (8%) 🤝 **Vorverkäufe und zukünftige strategische private Verkäufe**. Vesting-Perioden variieren von 2 bis 4 Jahren. + +30 Millionen Tokens (3%) 💡 **Community- und Ökosystementwicklung**. Auf der Chain für 4 Jahre gesperrt und vierteljährlich gevestet. + +30 Millionen Tokens (3%) 🧑‍💻 **Treasury & Team**. Auf der Chain für 3 Jahre gesperrt und vierteljährlich gevestet. + +860 Millionen Tokens (86%) 🌊 **Mining Rewards**. Diese Tokens werden für Mining-Belohnungen über die nächsten ~80 Jahre verwendet. Sie gewährleisten die Verarbeitung von Transaktionen und die Ausführung von Smart Contracts auf der Alephium-Blockchain. + +Zusätzlich werden die Hälfte der Transaktionsgebühren mit jedem Block verbrannt, und Proof of Less Work ermöglicht interne Mining-Kosten durch Verbrennung, wenn die Hashrate und der Energieverbrauch signifikant hoch sind. + + +### Gesamtangebot und Umlaufangebot + +Das Gesamtangebot wird berechnet, indem die Tokens, die beim Genesis-Block abgebaut wurden (siehe Aufschlüsselung oben), und die Blockbelohnungen seit dem Mainnet-Launch addiert werden. + +Alephium verwendet die CMC-Methode, um das Umlaufangebot von ALPH zu berechnen. Dieses besteht aus: der Gesamtanzahl der vorhandenen ALPH, von der der Saldo (gesperrt & nicht gesperrt) der Privatverkaufsinvestoren, den Finanzressourcen, des Ökosystems, der Berater/Auftragnehmer, der projektgesteuerten Vermögenswerte und aller gesperrten ALPH von anderen Adressen abgezogen wird. +Im Allgemeinen finden Sie unser Umlaufangebot auf der Startseite unseres [Explorers](https://explorer.alephium.org/). Wenn Sie eine detailliertere Erklärung der Coinmarketcap-Methodik wünschen, finden Sie diese [hier.](https://support.coinmarketcap.com/hc/en-us/articles/360043396252-Supply-Circulating-Total-Max-) + +Wenn Sie die Endpunkte benötigen, finden Sie diese hier: [Gesamtangebot](https://mainnet-backend.alephium.org/infos/supply/total-alph) = [Umlaufangebot](https://mainnet-backend.alephium.org/infos/supply/circulating-alph) + [Reserviertes Angebot](https://mainnet-backend.alephium.org/infos/supply/reserved-alph) + [Gesperrte ALPH](https://mainnet-backend.alephium.org/infos/supply/locked-alph) + +**Weitere Details finden Sie in unserem [Tokenomics-Artikel auf Medium][tokenomics-medium].** + +--- + +## Wenn Sie Entwickler sind, starten Sie hier + +Sie finden unser neuestes Node-Release auf [GitHub][node-release]. + +Entdecken und tragen Sie zu unseren Hauptprojekten [auf GitHub][github] bei: + +- [Full Node][full-node] +- [Desktop Wallet][desktop-wallet] +- [Mobile Wallet][mobile-wallet] +- [Explorer][explorer] +- [Web3 SDK][web3-sdk] +- [Extension Wallet][extension-wallet-repo] +- [Wallet Connect][walletconnect-repo] +- [Bridge][wormhole-fork-repo] +- [Awesome Alephium][awesome] +- [Docs][docs] + +### Etwas auf Alephium entwickeln? + +Beginne mit dem [Web3 SDK][web3-sdk], und wenn du eine DApp erstellen möchtest, schau [hier](./dapps/Getting-Started) vorbei. +Sobald Ihr Projekt veröffentlicht ist, informieren Sie alle, indem Sie einen Pull Request (PR) senden, um Ihr Projekt zu [Awesome Alephium][awesome]! +Die Alephium [Markenrichtlinie][brand-guide] könnte ebenfalls nützlich sein. + +[Belohnungs- und Förderprogramm][reward-grant] + +## Wenn du Miner bist, starte hier + +Beginnen Sie, indem Sie dem dedizierten [Mining Kanal auf Discord][mining-discord] beitreten. + +Sie finden unser Miner Starter Packet [auf Github][miner-starter-pack]. + +und spezifische Repos: + +- https://github.com/alephium/gpu-miner +- https://github.com/alephium/fpga-miner +- https://github.com/alephium/mining-pool + +Hier ist ein Video über [Wie starte ich mit dem Solo Mining][solo-mining-video]. + +Und wenn Sie lieber einem Pool beitreten möchten, finden Sie eine Liste der verfügbaren Pools im [Pool Mining Guide](./mining/pool-mining-guide). + +--- + +## Meilensteine & Roadmap + +[Abgeschlossene Meilensteine][milestones] + +[Roadmap][roadmap] + +--- + +## [Kaufen/Verkaufen][markets] + +⚠️ Einige Handelspaare verfügen über eine geringere Liquidität. Überprüfen Sie immer die Liquidität, bevor Sie einen Handelsplatz auswählen oder ein Asset überbrücken. + +--- + +## Trete Alephium Community bei! + +### Unterhalten + +- [Discord][discord] +- [Telegram][telegram] +- [Reddit][reddit] + +### Verbinden + +- [Twitter][twitter] +- [LinkedIn][linkedin] +- [Facebook][facebook] + +### Lesen, einrichten, erkunden, beitragen + +- [Webseite][website] +- [Whitepapers][whitepaper] +- [Medium][medium] +- [GitHub][github] + +--- + +## Nicht offizielle Inhalte & Communities + +:::info +Nicht moderiert, unterstützt oder verwaltet durch Alephium. +::: + +Sie finden [hier](./misc/Internationalization-and-Localization) die vollständige Liste der internationalisierten Kanäle. + +### Youtube + +- [Youtube 🌎](https://www.youtube.com/playlist?list=PL8q8n0BHJS1Nd0nxGfsNJzNnAeHoXhezz) +- [Youtube 🇧🇷](https://www.youtube.com/playlist?list=PL8q8n0BHJS1PiisJCIWqeOsd20dsMtJIg) +- [Youtube 🇨🇳](https://www.youtube.com/playlist?list=PL8q8n0BHJS1O931vGMfFb0Qx3gFKhd4bD) +- [Youtube 🇩🇪](https://www.youtube.com/playlist?list=PL8q8n0BHJS1OtYdw8lKeke6nNSSfASzZq) +- [Youtube 🇮🇳](https://www.youtube.com/playlist?list=PL8q8n0BHJS1PBoCF0L2TfeWYC8b7DeTAn) +- [Youtube 🇮🇩](https://www.youtube.com/playlist?list=PL8q8n0BHJS1MEOKbcmicEO0uTuz67D5Fz) +- [Youtube 🇮🇹](https://www.youtube.com/playlist?list=PL8q8n0BHJS1O749KEPqfnwlr-RDlqJ20U) +- [Youtube 🇯🇵](https://www.youtube.com/playlist?list=PL8q8n0BHJS1PS9PGIYJd8pjK6fw8AKZO4) +- [Youtube 🇲🇾](https://www.youtube.com/playlist?list=PL8q8n0BHJS1OkFwspCxIVfFS2sVeGEC4K) +- [Youtube 🇷🇺](https://www.youtube.com/playlist?list=PL8q8n0BHJS1P4-22OaT_w3vwNZVwiQt6s) +- [Youtube 🇹🇭](https://www.youtube.com/playlist?list=PL8q8n0BHJS1MhpbWV3PI4xoXhjB06az_M) +- [Youtube 🇹🇷](https://www.youtube.com/playlist?list=PL8q8n0BHJS1OJIUOh0yANAEKdSUG8DdDG) +- [Youtube 🇻🇳](https://www.youtube.com/playlist?list=PL8q8n0BHJS1PJq68hRBfw3xeXGlfVDWVr) + +--- + +## Unsere Partner + +- [Bitcoin Association Switzerland](https://medium.com/@alephium/alephium-becomes-a-member-of-bitcoin-association-switzerland-2293fec16fc9) +- [Cetacean Capital](https://cetacean.capital/) +- [Crypto Valley Association](https://cryptovalley.swiss/) +- [Dappnode](https://dappnode.io) +- [Ergo](https://ergoplatform.org/) +- [Flux Labs](https://runonflux.io/fluxlabs.html) +- [Hodling SA](https://www.hodling.ch/) +- [UTXO Alliance](https://utxo-alliance.org/) + + +[whitepaper]: https://github.com/alephium/white-paper +[tokenomics-medium]: https://medium.com/@alephium/tokenomics-of-alephium-61d59b51029c +[website]: https://alephium.org/ +[discord]: https://alephium.org/discord +[telegram]: https://t.me/alephiumgroup +[twitter]: https://twitter.com/alephium +[linkedin]: https://www.linkedin.com/company/alephium +[facebook]: https://www.facebook.com/alephium +[medium]: https://medium.com/@alephium +[github]: https://github.com/alephium +[node-release]: https://github.com/alephium/alephium/releases/latest/ +[full-node]: https://github.com/alephium/alephium +[desktop-wallet]: https://github.com/alephium/alephium-frontend/apps/desktop-wallet +[mobile-wallet]: https://github.com/alephium/alephium-frontend/apps/mobile-wallet +[explorer]: https://github.com/alephium/alephium-frontend/apps/explorer +[web3-sdk]: https://github.com/alephium/alephium-web3 +[docs]: https://github.com/alephium/docs +[awesome]: https://github.com/alephium/awesome-alephium +[mining-discord]: https://alephium.org/discord +[miner-starter-pack]: https://github.com/alephium/alephium-miner-getting-started +[solo-mining-video]: https://www.youtube.com/watch?v=hdPH6inWjhc +[reddit]: https://www.reddit.com/r/Alephium/ +[extension-wallet-repo]: https://github.com/alephium/extension-wallet +[walletconnect-repo]: https://github.com/alephium/walletconnect +[wormhole-fork-repo]: https://github.com/alephium/wormhole-fork +[brand-guide]: https://github.com/alephium/alephium-brand-guide +[reward-grant]: https://github.com/alephium/community/tree/master +[markets]: https://www.coingecko.com/en/coins/alephium#markets +[roadmap]: https://alephium.org/#next +[milestones]: https://alephium.org/#milestones diff --git a/i18n/de/docusaurus-plugin-content-docs/current/Content.md b/i18n/de/docusaurus-plugin-content-docs/current/Content.md new file mode 100644 index 00000000..1c66e2b5 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/Content.md @@ -0,0 +1,605 @@ +--- +sidebar_position: 12 +sidebar_label: Das Inhalts-Repo +title: Das Inhalts-Repo +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Inhaltsverzeichnis +- [Inhaltsverzeichnis](#inhaltsverzeichnis) +- [Offizielle Links \& Accounts](#offizielle-links--accounts) +- [Tech Series](#tech-series) + - [Stateful UTXO](#stateful-utxo) + - [Proof-of-Less-Work](#proof-of-less-work) + - [Alphred Virtual Machine](#alphred-virtual-machine) + - [Blockflow](#blockflow) + - [Ralph Programming Language](#ralph-programming-language) + - [Asset Permission System](#asset-permission-system) +- [Explainer Series](#explainer-series) +- [Monatlicher Rückblick](#monatlicher-rückblick) +- [TechTalks \& AMAs](#techtalks--amas) +- [Meilensteine](#meilensteine) +- [Community \& Social](#community--social) +- [Tutorials \& Workshops](#tutorials--workshops) +- [External Podcasts \& Publications](#external-podcasts--publications) +- [Events, presentations \& conferences](#events-presentations--conferences) +- [Partnerships \& PRs](#partnerships--prs) +- [Reading Lists](#reading-lists) +- [People to Follow](#people-to-follow) +- [Libraries \& Developer Resources](#libraries--developer-resources) +- [Apply for Grants](#apply-for-grants) + +## Offizielle Links & Accounts + +Webseite - https://alephium.org/ + +Dokumentation - https://docs.alephium.org/ + +Github - https://github.com/alephium + +Twitter - https://twitter.com/alephium + +Discord - https://alephium.org/discord + +Telegram - https://t.me/alephiumgroup + +Linkedin - https://www.linkedin.com/company/74304166 + +## Tech Series + +### Stateful UTXO + +Einführung in das stateful UTXO-Model - hhttps://medium.com/@eonicP/einführung-in-das-zustandsbehaftete-utxo-modell-7e609c963a23 + +sUTXO #1 - Merkle Trees - https://twitter.com/alephium/status/1599808960038461447 + +sUTXO #2 - Contract Rent - https://twitter.com/alephium/status/1602684789655420928 + +sUTXO #3 - General explanation - https://twitter.com/alephium/status/1615389097744568320 + +UTXO ELI5 Explainer - https://twitter.com/alephium/status/1675111759957327872 + +Geheimnisse des stateful UTXO: Der ultimative Leitfaden zu Alephiums Accounting Modell — Part 1 - https://medium.com/@waldialephium/tech-talk-2-geheimnisse-des-stateful-utxo-der-ultimative-leitfaden-zu-alephiums-accounting-d498e5b6e451 + +Mysteries of stateful UTXO: The Ultimate Guide to Alephium’s accounting model — Part 2 - https://medium.com/@alephium/tech-talk-2-mysteries-of-stateful-utxo-the-ultimate-guide-to-alephiums-accounting-model-and-f6b6868ef873 + +Eine Einführung in das stateful UTXO - https://twitter.com/alephium/status/1690004285818327040 + +Eine Einführung in das stateful UTXO - https://twitter.com/alephium/status/1692177660389314905 + +### Proof-of-Less-Work +Proof-of-Less-Work - https://medium.com/@alephium/tech-talk-1-the-ultimate-guide-to-proof-of-less-work-the-universe-and-everything-ba70644ab301 + +Proof-of-Less-Work - AMA - https://medium.com/@alephium/tech-talk-1-proof-of-less-work-ama-3d5afbf78c71 + +Konsens Algorithmus - https://twitter.com/alephium/status/1562066898904158208 + +### Alphred Virtual Machine +Alphred Virtual Machine - https://medium.com/@alephium/meet-alphred-a-virtual-machine-like-no-others-85ce86540025 + +Alphred VM #1 - https://twitter.com/alephium/status/1648310483148218370 + +Alphred VM #2 - https://twitter.com/alephium/status/1648310486096809984 + +Alphred VM #3 - https://twitter.com/alephium/status/1648310489045405696 + +### Blockflow +Blockflow - https://twitter.com/alephium/status/1541711510178758658 + +Blockflow ELI5 - https://twitter.com/alephium/status/1669007441764270080 + +Sharding - https://medium.com/@alephium/sharding-d50968b8b229 + +Sharding - https://twitter.com/alephium/status/1648310491763331078 + +An Introduction to Blockflow : Alephium’s sharding algorithm - https://medium.com/@alephium/an-introduction-to-blockflow-alephiums-sharding-algorithm-bbbf318c3402 + +### Ralph Programming Language +Ralph ist eine domänenspezifische Sprache (DSL) - https://twitter.com/alephium/status/1675867624184627201 + +Vergleich von Ralph- und Solidity-Code - https://twitter.com/alephium/status/1643961985841905664 + +### Asset Permission System +Asset Permission System - https://medium.com/@alephium/alephiums-aps-eliminating-evm-token-approval-risks-5407e7e70a33 + +Asset Permission System - https://twitter.com/alephium/status/1673354565801091074 + +## Explainer Series + +Network Upgrade 🧵#1 - https://vxtwitter.com/alephium/status/1738220571832594612 + +Bridge Thread #6 - https://vxtwitter.com/alephium/status/1729149731761537296 + +Bridge Thread #5 - https://x.com/alephium/status/1725439073052168293?s=20 + +Bridge Thread #4 - https://x.com/alephium/status/1725164466868801848?s=20 + +Bridge Thread #3 - https://twitter.com/alephium/status/1724107359696662624 + +Bridge Thread #2 - https://twitter.com/alephium/status/1722339218104754555 + +Bridge Thread #1 - https://twitter.com/alephium/status/1721940517657952450 + +🚨 Dev Tool Alert🚨 - https://vxtwitter.com/alephium/status/1733086186707808578 + +Alephium Tokenomics - Aktualisierter Artikel - https://medium.com/@alephium/tokenomics-of-alephium-61d59b51029c + +TxScripts und Smart Contracts - https://twitter.com/alephium/status/1688907382615945218?s=20 + +Wissen Sie, was "Magic Numbers" sind? Und welche hat Alephium? : https://twitter.com/alephium/status/1701604666847666397 + +Erster Entwickler-Workshop – Erstellen Sie einen Token-Faucet (Artikel) - https://medium.com/@alephium/first-developer-workshop-build-a-token-faucet-a6bb2aa7bf68 + +Blockzeit & Blockgröße - https://medium.com/@alephium/block-time-and-block-size-16e37292444f + +Zurück zu den Grundlagen: Was ist Blockzeit? Warum beträgt sie auf Alephium 64 Sekunden? https://twitter.com/alephium/status/1676257717303005185 + +Transaktionen pro Sekunde (TPS) - https://medium.com/@alephium/transactions-per-second-tps-f13217a49e39 + +Zeit bis zur Endgültigkeit - https://medium.com/@alephium/time-to-finality-17d64eeffd25 + +Scala - https://twitter.com/alephium/status/1592536671177699328?s=20&t=RpVl_j3Mi6NmcEGv8zDl8Q + +Bridge #1 - https://twitter.com/alephium/status/1579824159273541632 + +Bridge #2 - https://twitter.com/alephium/status/1582368148631695361 + +Bridge #3 - https://twitter.com/alephium/status/1587440588692934656 + +Neues SDK - https://twitter.com/alephium/status/1574389337612947456 + +Birthday Paradox - https://twitter.com/alephium/status/1559155971284275200 + +BIP39 Passphrase Implementierung - https://medium.com/@alephium/bip39-passphrase-implementation-f87adecd6f59 + +BIP39 Thread - https://twitter.com/alephium/status/1557019434979512327 + +The Road to self Custody - https://medium.com/@alephium/ttxoo-2-the-road-to-self-custody-cfea4ae89444 + +Self-custody - https://twitter.com/alephium/status/1557763279123992577 + +Namensgebung Alephium - https://twitter.com/alephium/status/1554467104858210305 + +Wie viele ALPH werden pro Tag geschürft? - https://twitter.com/alephium/status/1551905461103775745 + +Leman Upgrade schnorr signatures : https://twitter.com/alephium/status/1648310494661595137 + +Full Nodes - https://twitter.com/alephium/status/1592536671177699328 + +NFTs on Alephium #1 - https://twitter.com/alephium/status/1648310497756999680 + +NFTs on Alephium #2 - https://twitter.com/alephium/status/1673657929831190528 + +You can access the whole list of Twitter Threads here: https://twitter.com/alephium/status/1648310455725883393 + +## Monatlicher Rückblick + +Jun/23 "Juni war ein arbeitsreicher Monat! Schauen wir, was auf Alephium passiert ist! - https://twitter.com/alephium/status/1674785579123507202?s=20 + +Jul/23 "Heute ist der Schweizer Bundesfeier-Tag! Sehen Sie, was im Juli passiert ist! - https://twitter.com/alephium/status/1686349117499604992?s=20 + +## TechTalks & AMAs + +Jan/24 - French AMA with MonsieurTK https://twitter.com/i/spaces/1YqKDgrwnjkxV?s=20 + +Jan/24 - Bridge AMA Transcript Part 3 - https://vxtwitter.com/alephium/status/1742137217307578827 + +Dec/23 - Bridge AMA Transcript Part 2 - https://vxtwitter.com/alephium/status/1739586739579363509 + +Dec/23 - AMA with Ivan Shigeo - https://twitter.com/Shigeo808/status/1736821774959227069 + +Dec/23 - Bridge AMA Transcript Part 1 - https://medium.com/@alephium/the-alephium-bridge-ama-part-1-bd6536ea9cdc + +Dec/23 - AMA with @DjMines - https://youtu.be/gD2Lvk9WM4o?si=ZWRSwH6hHexWXWCj + +Dec/23 - Bridge & Beyond AMA - https://twitter.com/i/spaces/1mrGmydQreMGy + +Nov/23 - Alph Community Twitter Space @Hiramabiffkas - https://x.com/hiramabiffkas/status/1726835786270843094?s=20 + +Nov/23 - X Space on Crypto Mining 📢 - https://twitter.com/i/spaces/1ZkKzjBzrOZKv?s=20 + +Oct/23 - AMArmotte - https://x.com/Marmottoshis/status/1710643787305820353?s=20 + +Aug/23 - HouseOfChimera Twitter Space - https://twitter.com/HouseofChimera/status/1714310856324854137 + +Aug/23 - UI/UX to onboard the next billion people - https://www.youtube.com/watch?v=VK4QtY_q1ek + +Jul/23 - Mikaël Vaivre - How to onboard the next billion people to crypto? - https://www.youtube.com/watch?v=QHmb87sT9nI + +Jun/23 - Bitmart X ALPH Twitter Space AMA - https://x.com/alephium/status/1670061238456565761?s=20 + +Jun/23 - NYM - https://www.youtube.com/watch?v=pImANSvO6WQ&t + +Apr/23 - POW Roundtable - https://www.youtube.com/watch?v=17Rx27PwADI + +Apr/23 - Wolfram - https://www.youtube.com/live/v_7aiIAs6pQ?feature=share + +Apr/23 - Proof of less work AMA - https://x.com/alephium/status/1646113444461178882?s=20 + +Mar/23 - AMA Leman Upgrade - https://www.youtube.com/watch?v=n7ycJUIfbVg&t + +Feb/23 - Benoit - https://www.youtube.com/watch?v=At2JIAHaa10 + +Jan/23 - Nervos - https://www.youtube.com/watch?v=FLmxAHolDMc + +Nov/22 - Flux - https://www.youtube.com/watch?v=17Rx27PwADI&t + +Oct/22 - DappNode - https://www.youtube.com/watch?v=wzobAlPR11s&t + +Sep/22 - Ergo - https://www.youtube.com/watch?v=GCDo3V7HTb0 + +Aug/22 - AMA POLW - https://www.youtube.com/watch?v=Oi4AsqVY0YA + +Jul/22 - Polto (the road to self custody) - https://www.youtube.com/watch?v=McHNeE2ciFk + +Jul/22 - Tech Talk #1 The Ultimate guide to Proof of Less Work +https://medium.com/@alephium/tech-talk-1-the-ultimate-guide-to-proof-of-less-work-the-universe-and-everything-ba70644ab301 + +Nov/21 - First Live AMA - https://medium.com/@alephium/alephiums-first-live-ama-761a90d3f672 + +## Meilensteine + +Jan/24 🌊 Announcing the Rhône Network Upgrade ♾ - https://vxtwitter.com/alephium/status/1745820715054698901 + +Jan/24 ⚙️ Tech Writings of 2023 🛠 - https://vxtwitter.com/alephium/status/1744795616818217432 + +Jan/24 Alephium Hackathon Announcement - https://vxtwitter.com/alephium/status/1743950076953690180?s=20 + +Jan/24 The dApps, the whole dApps, nothing but the dApps - https://vxtwitter.com/alephium/status/1743268517309513949 + +Dec/23 2023 Front-end recap - https://vxtwitter.com/alephium/status/1741402507203764614 + +Dec/23 MEXC listing! - https://www.mexc.com/exchange/ALPH_USDT + +Dec/23 50 days of bridging! - https://vxtwitter.com/alephium/status/1740390954752958767 + +Dec/23 Coinmetro Listing - https://vxtwitter.com/alephium/status/1737830035225219555?s=20 + +Dec/23 Ambassador Program Launch - https://vxtwitter.com/alephium/status/1736792955896344966 + +Dec/23 Crowdsourcing Alphad.app new name! - https://vxtwitter.com/alephium/status/1734948427950399948 + +Dec/23 Etherscan Update! - https://vxtwitter.com/alephium/status/1734581269684687010 + +Nov/23 iOS app is live in the App Store! - https://vxtwitter.com/alephium/status/1724452430262534311 + +Nov/23 The Bridge is Live! - https://vxtwitter.com/alephium/status/1722661768131178556 + +Oct/23 Android Mobile App is out of Beta! - https://x.com/alephium/status/1719739251368325612?s=20 + +Oct/23 Get Ready for Bridging! - https://twitter.com/alephium/status/1719398464449335561 + +Oct/23 Meet the Guardians! - https://twitter.com/alephium/status/1716858711493493013 + +Oct/23 Android Mobile wallet app is ready for beta testing! - https://medium.com/@alephium/ios-mobile-wallet-beta-testing-feedback-wanted-cdf162a49a79 + +Oct/23 The mobile wallet for iOS is ready for beta testing - https://medium.com/@alephium/ios-mobile-wallet-beta-testing-feedback-wanted-cdf162a49a79 + +Oct/23 The Blockflow Alliance DAO got its first grant. - https://twitter.com/alephium/status/1711405133165453683?s=20 + +Sep/23 NFT Marketplace v3 is here! - https://twitter.com/alephium/status/1704167584017588419 + +Sep/23 Alephium Bridge Update - https://twitter.com/alephium/status/1700164822619582535 + +Sep/23 Zealy quests are now available! - https://t.co/49nM9If9p1 + +Sep/23 Multisig GUI is officially launched! - https://twitter.com/alephium/status/1697611394471121118 + +Jun/23 Alephium NFT Marketplace Poc On Testnet - https://twitter.com/alephium/status/1674397139835973633 + +May/23 Alephium Bridge on Testnet - https://medium.com/@alephium/the-alephium-bridge-is-live-on-testnet-e13454677fb8 + +Mar/23 Alephium DEX PoC on Testnet - https://medium.com/@alephium/dex-prototype-live-on-testnet-bac5e7d095ce + +Mar/23 Leman Network Upgrade - https://medium.com/@alephium/announcing-the-leman-network-upgrade-c01a81e65f0e + +Nov/22 1 year of Mainnet - https://medium.com/@alephium/one-year-of-mainnet-b7ed5d3024ee + +Oct/22 Security assessment by Inference - https://medium.com/@alephium/security-assessment-by-inference-afa2f62957ad + +Jul/22 Website update - https://twitter.com/alephium/status/1546841030020009984 + +May/22 Q2 2022 Update - https://medium.com/@alephium/alephium-h1-project-update-1f2076978f00 +https://twitter.com/alephium/status/1530174260114776071 + +Jan/22 Q1 2022 Update - https://medium.com/@alephium/alephium-q1-project-update-50f4a7b354b0 + +Dec/21 Q3 2021 Update - https://medium.com/@alephium/time-for-an-alephium-development-recap-cdaa47ee95a + +Nov/21 Mainnet Launch - https://medium.com/@alephium/alephium-mainnet-brings-sharding-smart-contracts-and-energy-efficiency-to-bitcoin-tech-stack-a255183aa50b + +Nov/21 Alephium Block Rewards - https://medium.com/@alephium/alephium-block-rewards-72d9fb9fde33 + +Oct/21 Tokenomics of Alephium - https://medium.com/@alephium/tokenomics-of-alephium-61d59b51029c + +Sep/21 Pre-sale Q3 2021 - https://medium.com/@alephium/alephium-closes-3-6m-pre-sale-from-80-contributors-to-expand-sharded-utxo-blockchain-platform-84f80492e28d + +Aug/21 Introducing ALPH Q3 2021 - https://medium.com/@alephium/introducing-alph-8381dbd9f88d + +May/19 Initial description - First article - https://medium.com/@alephium/alephium-pushes-the-boundaries-of-blockchain-performance-scalability-1ab619038daa + +## Community & Social + +⛏ Miners' Highlight #2 - @Dr. Hiram Abiff .’. | ℵ 🔥 - https://vxtwitter.com/alephium/status/1745484268585820567 + +Miners' Highlight #1 - Cedric Crispin 🔥 - https://vxtwitter.com/alephium/status/1738185723264840078 + +Builders Highlight 5 - Deadrare +https://medium.com/@alephium/builders-highlight-5-deadrare-d5ff90d6161e + +Builders Highlight 4 - No Trust Verify +https://medium.com/@alephium/builders-highlight-4-no-trust-verify-9ea495ca826f + +Builders Highlight 3 - Ayin +https://medium.com/@alephium/builders-highlight-3-ayin-6be4a6bd4ec2 + +Builders Highlight 2 - Alphpaca NFTs +https://medium.com/@alephium/builders-highlight-alphpaca-nfts-99c69775f04c + +Builders Highlight 1 - Sezame Wallet +https://medium.com/@alephium/builders-highlight-sezame-wallet-ddb4aeb61881 + +Builders Highlight 0 - Sahhar +https://medium.com/@alephium/builders-highlight-sahhar-10f4cc8746 + +Community Highlight #14 - AnimalManJan +https://medium.com/@alephium/community-highlight-14-animalmanjan-da8fd051bc38 + +Community Highlight #13 - Ryann +https://medium.com/@alephium/community-highlight-13-ryan-5dbbeaf859e4 + +Community Highlight #12 - energy45 +https://medium.com/@alephium/community-highlight-12-sam-a-k-a-energy45-610005a9219b + +Community Highlight #11 - Dr. Jekyll +https://medium.com/@alephium/community-highlight-11-dr-jekyll-165ab9a51880 + +Community Highlight 10 - Lx, aka Lix +https://medium.com/@alephium/community-highlight-10-lx-aka-lix-fde724cf8d81 + +Community Highlight 9 - dZHEMSH +https://medium.com/@alephium/community-highlight-9-dzhemsh-a0a4a98a8489 + +Community Highlight 8 - Jorge +https://medium.com/@alephium/community-highlight-8-jorge-438510785041 + +Community Highlight 7 - Oheka +https://medium.com/@alephium/community-highlight-7-oheka-13d8b4ae025e + +Community Highlight 6 - Waldi — Zkit/beats +https://medium.com/@alephium/community-highlight-6-waldi-zkit-beats-37af1f6df3b8 + +Community Highlight 5 - TxN +https://medium.com/@alephium/community-highlight-5-txn-71c4fd76ffe8 + +Community Highlight 4 - Montail +https://medium.com/@alephium/community-highlight-4-montail-e24fd88882a0 + +Community Highlight 3 - DigDug +https://medium.com/@alephium/community-highlight-3-digdug-48a7ec868504 + +Community Highlight 2 - cgi-bin - https://medium.com/@alephium/community-highlight-cgi-bin-c102cc106f19 + +Community Highlight 1 - Wilhelm Källström aka “Oracleuggla” - +https://medium.com/@alephium/community-highlight-wilhelm-k%C3%A4llstr%C3%B6m-aka-oracleuggla-81d3938c5692 + +The Hitchiker’s guide to Alephium’s community - https://vxtwitter.com/alephium/status/1740670046371017186?s=20 + +The Zealy Sprint has come to an end - https://vxtwitter.com/alephium/status/1737144172317114621 + +Welcome to DeFi Llama! - https://vxtwitter.com/DefiLlama/status/1726667056781881648?s=20 + +Onboarding Thread on Alephium - https://vxtwitter.com/alephium/status/1726249933374959943?s=20 + +Verification of bridge contracts, tokens & token lists - https://medium.com/@alephium/verification-of-bridge-contracts-tokens-token-lists-76e5c237bf52 + +Core Alephium Contibutors Update - https://medium.com/@alephium/alephium-contributors-f35eeaeaf0a0 + +Core team interview series. Episode 4 - https://medium.com/@alephium/core-team-interview-series-episode-4-3886003b8fef + +Core team interview series. Episode 3 - https://medium.com/@alephium/core-team-interview-series-episode-3-64b6dacc1459 + +Core team interview series. Episode 2 - https://medium.com/@alephium/core-team-interview-series-episode-2-bec6e6908d2f + +Core team interview series. Episode 1 - https://medium.com/@alephium/core-team-interview-series-episode-1-3472f8295af6 + +Welcome to the Blockflow Alliance DAO! - https://medium.com/@alephium/welcome-blockflow-alliance-dao-cd74a949f98b + +Alpehium's community creativity is fantastic! Toolkit Design Contest Winners - https://medium.com/@alephium/toolkit-design-contest-winners-announced-6cc5e304cd8b + +UI & UX wizardry from our latest techtalk! - https://medium.com/@alephium/techtalk-11-how-to-onboard-the-next-billion-people-to-crypto-d1f4904b3eea + +Alephium Toolkit GUI design contest! - https://medium.com/@alephium/design-contest-a-logo-for-the-toolkit-website-f7bf7801b03c + +Alephium Send your best Alephium Memes! - https://twitter.com/alephium/status/1686420533510832128 + +Video Creation contest - https://medium.com/@alephium/contest-for-all-video-creators-e777f2619596 + +Naming Competition - https://medium.com/@alephium/alephium-naming-competition-c1b736797461 + +Introducing Community Rewards - https://medium.com/@alephium/introducing-community-rewards-f4638bbf14bf + +DJ Fetamin Mix at Chainflip Party during Ethcc - https://www.youtube.com/watch?v=0heJBclJwEA&t=113s + +## Tutorials & Workshops + +Alephium Bridge: The Written Tutorial - https://medium.com/@alephium/alephiumalephium-bridge-the-tutorial-28e7b92b339a + +🎦Bridge Tutorial!📺 - https://www.youtube.com/watch?v=xoYVzbwBAjg + +Deep Dive into Ralph with the Dev Workshop! 🛠 - https://www.youtube.com/watch?v=gi2sxvB9Np8 + +Deep Dive into Ralph with the Dev Workshop - Part 2! 🛠 - https://vxtwitter.com/alephium/status/1729530234649866529 + +Video tutorial on how to create a Multisig Wallet using Alephium Toolkit GUI: https://twitter.com/alephium/status/1701211477577785724 + +How to use the Alephium Desktop Wallet privately through the NYM Mixnet - https://www.youtube.com/watch?v=VbhQEhtX-rI + +Second Developer Workshop - Friendtech smart contract - https://medium.com/@alephium/second-online-dev-workshop-6ebc5fb0b0da + +Second Developer Workshop - Re-implementing Friend.Tech’s Smart Contract in Ralph - https://www.youtube.com/watch?v=gi2sxvB9Np8 + +First Developer Workshop — Build a Token Faucet ( Video ) - https://www.youtube.com/watch?v=YblUxEcXQuY + +How to use Alephium's app on Ledger? A Tutorial - https://www.youtube.com/watch?v=YBQy_siZh6w&t + +How to use the Alephium Bridge (testnet) - part 1 - https://www.youtube.com/watch?v=cwv28divQrA&t + +How to use the Alephium Bridge (testnet) - part 2 - https://www.youtube.com/watch?v=TziFpCgM3-0&t + + +## External Podcasts & Publications + +Nym Project's blog post about the Alephium wallet built by @Mika and @nop33! - https://twitter.com/alephium/status/1710291031759982803 + +UTXO Alliance Roundtable - https://www.youtube.com/watch?v=1XcBWJRRp-E&list=PL8q8n0BHJS1MWfqe1OIz4EWz9RKNrCiu6&index=1&pp=iAQB + +Cheng Wang: Founder of Alephium, Distributed Consensus, Proof of Less Work | Wolfram Blockchain Labs - https://youtu.be/8XYa288lIg0 + +Didier Borel - SwissRoadCrypto - https://www.buzzsprout.com/2058047/11607475 + +Cheng Wang AMA @ERGO - https://www.youtube.com/watch?v=GCDo3V7HTb0 + +Uncovering the Secrets of the Next Generation Blockchain Network Alephium - https://youtu.be/UzqZ4npA2w4 + +Sigma Prism - Meet Alephium | A New Scalable UTXO Paradigm | episode #19 - https://youtu.be/vBVbKIuHbLc (Notes) + +Alephium | A New Era of Possibilities - https://youtu.be/0jmo-WYhwWc + +Maud Bannwart: Chief Operating Officer of Alephium | Operations of Blockchain Development - https://youtu.be/3CYsjwIkI_c + +NiceHash - NiceTalk - https://www.youtube.com/watch?v=JFTxolwLduc + +Hackernoon - https://twitter.com/hackernoon/status/1557622890450886659 + +Hackernoon - Web3bites - https://hackernoon.com/what-is-sharding-and-utxo-scaling-for-blockchain + +Heidi News - https://www.heidi.news/explorations/dix-acteurs-majeurs-de-la-crypto-en-suisse-romande/alephium-une-blockchain-3-0-nee-en-suisse + +Heidi News - https://www.heidi.news/cyber/les-entreprises-crypto-en-suisse-romande-resistent-bien-a-la-crise + +Heidi News - https://www.heidi.news/cyber/alephium-une-blockchain-3-0-developpee-a-lausanne + +Token Insights - https://tokeninsight.medium.com/project-research-paper-of-alephium-8001323353e7 + +## Events, presentations & conferences + +What is Alephium? - https://www.youtube.com/watch?v=v2L4jEvoSIU + +Cheng Wang at Crypto Talk Series in Neuchâtel - Stateful UTXO - https://www.youtube.com/watch?v=r_5U7ZgByt4 + +Cheng Wang at EthCC 2022 - Account Model meets UTXO: a new paradigm for secure dApps & DeFi - https://www.youtube.com/watch?v=VVYH9rBJAdA + +Cheng Wang - Blockchain sharding at CDC 36th C3 - https://youtu.be/_SjtXp6F43k + +Ethcc Paris 2022 - https://www.youtube.com/watch?v=VVYH9rBJAdA + +CVC/CVA 2023 - https://www.youtube.com/watch?v=8DiMSar3HOw / https://twitter.com/alephium/status/1673692785457897472 + +CVC/CVA 2022 - https://twitter.com/alephium/status/1537452412801323011 / https://twitter.com/alephium/status/1528649536050278401 + +PBWS Paris - 2022 - https://twitter.com/alephium/status/1530174317576716290 / https://twitter.com/ParisBlockWeek/status/1519685412066836483 + +DevCon Osaka 2019 - https://twitter.com/alephium/status/1181943096600223746 + +Web3 summit 2019 - https://twitter.com/alephium/status/1163721918765129728 + +Bitcoin COnf 2019 - https://twitter.com/alephium/status/1143767445657665537 + +CVC Conf Zug 2019 - https://twitter.com/alephium/status/1143174833347289088 + +Cheng Wang/Alois COchard - Scala Days 2019 - https://twitter.com/alephium/status/1139123284576915456 + +Cheng Wang - WASM blockchain Berlin 2019 - https://twitter.com/wachmc/status/1137715873643413504 + +Aloïs Cochard - Edcon 2019 - https://youtu.be/-tCB9sOT_UI + +Aloïs Cochard - Bitcoin 2019 - https://youtu.be/0WnmzgKTClU + +## Partnerships & PRs + +DappNode - Announcement - https://medium.com/@alephium/pushing-for-decentralization-alephium-and-dappnode-join-forces-c98845d9a9da + +DappNode - Tutorial - https://medium.com/@alephium/alephium-dappnode-collab-tech-talk-and-ama-80b34dfd1e9f + +Ergo - Announcement - https://medium.com/@alephium/ergohack-v-alephium-sponsors-ergos-hackathon-with-flux-djed-alliance-to-foster-innovation-in-eae9c8bd7e97 + +FLUX - Announcement - https://medium.com/@alephium/alephium-continues-its-engagement-for-decentralization-and-partners-with-the-cloud-based-f9c5baebe5b2 + +FLUX - Tutorial - https://medium.com/@alephium/host-your-alephium-node-via-the-flux-marketplace-2f3a5ab85263 + +FLUX - Contest - https://medium.com/@alephium/alephium-flux-tutorial-contest-81054caf926 + +Cetacean Capital - https://medium.com/@alephium/alephium-partners-with-cetacean-capital-83cf2fbea8a1 + +Gate.io - Announcement - https://medium.com/@alephium/gate-io-first-to-list-alephium-alph-a7e5fe56cd45 + +Gate.io - AMA - https://medium.com/@alephium/gate-io-ama-with-alephium-67b50d179d72 + +Bitcoin Association Switzerland - https://medium.com/@alephium/alephium-becomes-a-member-of-bitcoin-association-switzerland-2293fec16fc9 + +UTXO alliance - https://medium.com/@alephium/alephium-joins-the-utxo-alliance-6476b479dd84 + +## Reading Lists + +1. https://twitter.com/alephium/status/1548224145703313408 +2. https://twitter.com/alephium/status/1553395039778119682 +3. https://twitter.com/alephium/status/1555917416667811841 +4. https://twitter.com/alephium/status/1558459721912242176 +5. https://twitter.com/alephium/status/1560964886485643265 +6. https://twitter.com/alephium/status/1563540765728313347 +7. https://twitter.com/alephium/status/1566079135071449088 +8. https://twitter.com/alephium/status/1568915710210101250 +9. ​https://twitter.com/alephium/status/1571927107911188481 +10. https://twitter.com/alephium/status/1574016171698900992 +11. https://twitter.com/alephium/status/1579050425449271296 +12. https://twitter.com/alephium/status/1584133324720594946 +13. https://twitter.com/alephium/status/1586680785355952128 +14. https://twitter.com/alephium/status/1589249714691530753 +15. https://twitter.com/alephium/status/1591769178016428033 +16. https://twitter.com/alephium/status/1594356097455820800 +17. https://twitter.com/alephium/status/1596845995442126848 +20. ​​https://twitter.com/alephium/status/1609891871148630016 +21. https://twitter.com/alephium/status/1612107655610527744 +22. https://twitter.com/alephium/status/1614603383855525889 +23. https://twitter.com/alephium/status/1617170911408361474 +24. https://twitter.com/alephium/status/1619682407338377220 +25. https://twitter.com/alephium/status/1622188051081601026 +26. https://twitter.com/alephium/status/1624740153117003779 +27. https://twitter.com/alephium/status/1627309742220775427 +28. https://twitter.com/alephium/status/1629798455102300163 +29. https://twitter.com/alephium/status/1632350304208588800 +30. https://twitter.com/alephium/status/1634886987151994882 +31. https://twitter.com/alephium/status/1637423729193152514 +32. https://twitter.com/alephium/status/1639915107408044033 +33. https://twitter.com/alephium/status/1642466924876689413 +34. https://twitter.com/alephium/status/1645095313492017155 +35. https://twitter.com/alephium/status/1647540350658150407 +36. https://twitter.com/alephium/status/1650077066644291584 +37. https://twitter.com/alephium/status/1652613787290316803 +38. https://twitter.com/alephium/status/1655150495235997696 +39. https://twitter.com/alephium/status/1658134671648251907 +40. https://twitter.com/alephium/status/1660228530851184642 + +## People to Follow + +Cheng Wang: https://twitter.com/wachmc + +First Tweet - https://twitter.com/alephium/status/1095960264837685249 + +Wow visual - https://twitter.com/gemforgem/status/1441427580578455554 + +Hongchao: https://twitter.com/hongchao + +## Libraries & Developer Resources + +Docs - https://docs.alephium.org/ + +Github - https://github.com/alephium + +## Apply for Grants + +Apply for grants - https://github.com/alephium/community/blob/master/Grant%26RewardProgram.md diff --git a/i18n/de/docusaurus-plugin-content-docs/current/FAQ.md b/i18n/de/docusaurus-plugin-content-docs/current/FAQ.md new file mode 100644 index 00000000..15b20b97 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/FAQ.md @@ -0,0 +1,414 @@ +--- +sidebar_position: 1 +slug: /haeufig-gestellte-fragen +sidebar_label: FAQ +title: Häufig gestellte Fragen +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +:::info +📚 Erfahren Sie alles über Alephium in diesem [5-minütigen Überblick](/). +::: + +Bevor Sie tiefer eintauchen, empfehlen wir Ihnen, die folgenden Ressourcen sorgfältig zu lesen, da sie nützliche Informationen über Alephium bereitstellen: + +- [Offizielle Webseite](https://alephium.org) +- [Offizielles Twitter](https://twitter.com/alephium) +- [Offizielles Discord](https://alephium.org/discord) +- [Offizielles Telegram](https://t.me/alephiumgroup) +- [Offizielles Reddit](https://reddit.com/r/Alephium) +- [Offizielles Medium](https://medium.com/@alephium), insbesondere: + - [Alephium's Tokenomics](https://medium.com/@alephium/tokenomics-of-alephium-61d59b51029c) + - [Alephium's Blockbelohnungen](https://medium.com/@alephium/alephium-block-rewards-72d9fb9fde33) + - [Alephium's Community Belohnungs-Programm](https://medium.com/@alephium/introducing-community-rewards-f4638bbf14bf) + - [Der ultimative Leitfaden zu Proof-of-Less-Work, dem Universum und allem dazwischen...](https://medium.com/@alephium/tech-talk-1-the-ultimate-guide-to-proof-of-less-work-the-universe-and-everything-ba70644ab301) + - [Einführung in sUTXO](https://medium.com/@alephium/an-introduction-to-the-stateful-utxo-model-8de3b0f76749) + - [ALPHred, die virtuelle Maschine](https://medium.com/@alephium/meet-alphred-a-virtual-machine-like-no-others-85ce86540025) + - [Das Leman Network Upgrade ist Live!](https://medium.com/@alephium/the-leman-network-upgrade-is-live-f52c89b7dd6a) + +## Chain Data + +### Wie viele ALPH befinden sich im Umlauf? + +Die Umlaufmenge können Sie mit dem Alephium [Explorer](https://explorer.alephium.org) oder durch Verwendung des [Endpunkts für zirkulierende ALPH](https://backend.mainnet.alephium.org/infos/supply/circulating-alph) herausfinden. + +### Wie wird die Umlaufmenge berechnet? + +Sie wird nach der [Methodik von CoinMarketCap](https://support.coinmarketcap.com/hc/en-us/articles/360043396252-Supply-Circulating-Total-Max-) berechnet. + +Die Umlaufmenge entspricht der Anzahl der existierenden ALPH abzüglich: + +- Des Gesamtsaldos (gesperrt und entsperrt) der Teilnehmer an privaten Verkäufen, den vom Projekt kontrollierten Adressen und den vom Team kontrollierten Adressen. Gemäß CMC: _"Tokens werden im Allgemeinen erst als im Umlauf befindlich betrachtet, nachdem sie die ursprüngliche Reserve-Wallet verlassen haben (d.h., ausgehende Überweisungen sind eher repräsentativ für die Absicht, die Münze in Umlauf zu bringen, als lediglich eine Freigabe)."_. +- Allen gesperrten ALPH von anderen Adressen. + +### Wie kann ich mein Wallet-Guthaben überprüfen, und welche Adressen haben die größten Bestände? + +Um das Guthaben einer bestimmten Wallet zu überprüfen, ist der [Explorer](https://explorer.alephium.org) die erste Anlaufstelle. +Community-Mitglieder haben eine [Alph Richlist](https://alph-richlist.vercel.app/) erstellt, die die Adressen mit den größten Beständen auflistet. + +Zusätzlich können Sie die Inhaber von gewrappten ALPH/ERC20 auf [etherscan.io](https://etherscan.io/token/0x590F820444fA3638e022776752c5eEF34E2F89A6#balances) überprüfen. + +### Was ist die minimalste Transaktionsgebühr? + +Aktuell beträgt die minimalste Transaktionsgebühr `0.002`, ALPH um Netzwerk-DoS-Angriffe zu verhindern. In der Zukunft kann diese Mindestgebühr niedriger sein, wobei die niedrigstmögliche minimale Transaktionsgebühr auf Alephium `0.00000000000001` ALPH beträgt. Die genaue Gebühr hängt von der Anzahl der Inputs (UTXOs) und der Anzahl der beteiligten Unterzeichner einer Transaktion ab. + +### Wie viele Transaktionen pro Sekunde (TPS) sind auf Alephium möglich? + +Das Alephium Mainnet unterstützt derzeit über 400 Transaktionen pro Sekunde (TPS) mit 16 Shards. Es kann auf über 10.000 TPS skalieren, indem die Anzahl der Shards bei Bedarf erhöht wird. Erfahren Sie mehr über [das Konzept von TPS](https://medium.com/@alephium/transactions-per-second-tps-f13217a49e39). + +### Was ist die kleinste Einheit von Alephium? + +Alephium erlaubt bis zu 18 Dezimalstellen, und seine kleinste Einheit wird Phi genannt. Ein Phi entspricht `0.000000000000000001` ALPH, oder `10^-18` ALPH, während 1 ALPH `10^18` Phi entspricht. + +## DApps + +### Gibt es eine DEX auf Alephium? + +Alephium verfügt über einen [DEX-Prototyp](https://alephium.github.io/alephium-dex/#/swap) der im Testnet läuft. Erfahren Sie mehr darüber im [Artikel zum DEX-Prototyp](https://medium.com/@alephium/dex-prototype-live-on-testnet-bac5e7d095ce). + +Die [DEX Contracts](https://github.com/alephium/alephium-dex/tree/master/contracts) wurden gründlich von den Kernentwicklern getestet, was sie zuverlässig und effizient macht. Sie können problemlos verzweigt und für Projekte verwendet werden. + +### Gibt es DApps auf Alephium? + +Die meisten bisher auf Alephium erstellten Projekte sind im [Awesome Alephium Repository](https://github.com/alephium/awesome-alephium) aufgeführt. Um Ihren Beitrag hinzuzufügen, reichen Sie einen Pull Request ein! + +Alephium befindet sich noch in einem sehr frühen Stadium, die Infrastruktur (einschließlich einer [Bridge](https://github.com/alephium/wormhole-fork)) und die Dokumentation zur Erleichterung der Entwicklung von DApps werden kontinuierlich verbessert. +Alephium verfügt über eine Reihe [gut gepflegter Prototypen](dapps/ecosystem#prototypes) die als Grundlage oder Inspiration für Ihr Projekt dienen können. + +Wenn Sie eine DApp erstellen möchten, werfen Sie einen Blick auf unseren [Leitfaden zum Einstieg in DApps](dapps/getting-started). + +### Warum kann sich eine DApp nur mit einer meiner Adressen verbinden? + +Alephium funktioniert als eine Sharded-Blockchain, bei der Adressen und Vertragszustände in mehrere Gruppen organisiert sind. Wenn es um DApps geht, können diese in jeder dieser Gruppen bereitgestellt werden. Es gibt jedoch einen Haken: DApps können nur von Adressen in derselben Gruppe verwendet werden. + +Wenn Sie sich also mit einer DApp verbinden, wird diese speziell nach Adressen fragen, die zur gleichen Gruppe gehören wie die DApp selbst. Dieses Gruppensystem stellt sicher, dass alles reibungslos innerhalb der geschicheten Struktur von Alephium funktioniert. + +Beachten Sie, dass dieses Problem die Verwendung von DApps betrifft. Normale Transaktionen bieten eine ähnliche Benutzererfahrung wie nicht Sharded-Blockchains. Das Kernentwicklerteam ist entschlossen, die Verwaltung von Vermögenswerten über verschiedene Gruppen hinweg zu verbessern, um sie benutzerfreundlicher für DApp-Benutzer zu gestalten. + +## Entwicklung + +### Wo finde ich die Roadmap? + +Die Roadmap finden sie auf unserer [Webseite](https://alephium.org/#next) und in der [Dokumentation](#roadmap). Sie können auch die wöchentlichen Entwicklungsaktualisierungen auf [Discord](https://alephium.org/discord), [Twitter](https://twitter.com/alephium) oder auf [Reddit](https://www.reddit.com/r/Alephium/search?q=flair_name%3A%22Development%22&restrict_sr=1) verfolgen.. + +### Wo kann ich den Status der von Alephium öffentlich betriebenen Dienste überwachen? + +Sie können den öffentlichen Dienst von Alephium überwachen für: + +- Das Mainnet auf https://status.mainnet.alephium.org +- Das Testnet auf https://status.testnet.alephium.org + +### Wo kann ich eine API abfragen? + +Um eine API abzufragen, müssen Sie einen Full Node (vollständigen Knoten) ausführen ([Anleitung](full-node/getting-started)). +Alephium verwendet OpenAPI, um mit Full Nodes zu interagieren. Sie können direkt Ihr lokales Swagger UI über `127.0.0.1:12973/docs` öffnen, sobald Ihre Full Node ausgeführt wird. +Alternativ ist es möglich jeden OpenAPI-Client zu verwenden, um die [openapi.json](https://raw.githubusercontent.com/alephium/alephium/master/api/src/main/resources/openapi.json) aus dem Repository von Alephium zu importieren. + +### Haben Sie ein Förder-, Belohnungs- oder Prämienprogramm? + +Alephium bietet ein [Förder- und Belohnungsprogramm](https://github.com/alephium/community/blob/master/Grant%26RewardProgram.md) an, bei dem Ihr Beitrag, unabhängig von der Größe, möglicherweise für eine Belohnung in Frage kommt. + +### Was wird auf Alephium entwickelt? + +Die meisten bisher auf Alephium erstellten Projekte sind im [Awesome Alephium Repository](https://github.com/alephium/awesome-alephium) aufgeführt. Wenn Sie präsentieren möchten, was Sie erstellt haben, reichen Sie einen Pull Request ein, um es zur Liste hinzuzufügen. + +## Full Node (Vollständiger Knoten) + +### Gibt es eine Belohnung für den Betrieb einer Full Node? + +Alephium verwendet einen Proof-of-(Less)-Work-Konsensmechanismus, was bedeutet, dass es im Gegensatz zu Proof-of-Stake-Netzwerken keine nativen monetären Belohnungen für das Betreiben eines Full Nodes gibt. Das Betreiben Ihres eigenen Node bietet jedoch andere Vorteile wie Dezentralisierung, unabhängige Überprüfung, Datenschutz und wirtschaftliche Selbstbestimmung. Der Ausdruck *"not your node, not your network"* unterstreicht die Bedeutung des Betreibens Ihres eigenen Node, da die Abhängigkeit von einem Node eines Dritten für die Interaktion mit der Blockchain bedeutet, diesem Dritten zu vertrauen. Obwohl die Verbindung zu einem Node eines Dritten im Allgemeinen sicher ist, bevorzugen einige Personen die Aufrechterhaltung ihres eigenen Vertrauens- und Datenschutzniveaus. + +### Was benötige ich, um einen Full Node auszuführen? + +Ein Full Node von Alephium ist leichtgewichtig und kann auf den meisten Geräten laufen, einschließlich eines Raspberry Pi oder sogar auf einem Smartphone. Um Ihren eigenen Node einzurichten und auszuführen, folgen Sie bitte dem [Leitfaden zum Einstieg des Betriebs eines Full Node](full-node/getting-started/). + +### Ist es möglich, auf Alephium zu staken? + +Alephium bietet kein natives Staking auf seiner Blockchain an, da es nicht auf einem PoS-Konsensmechanismus basiert. Allerdings könnten DeFi-Liquiditätspools in Zukunft die Möglichkeit des Staking für Benutzer anbieten. + +## Listungen & Börsen + +### Was ist Ihr Token-Ticker? + +Das Token-Ticker für Alephium lautet [ALPH](https://medium.com/@alephium/introducing-alph-8381dbd9f88d). + +### Wie lange dauert es, bis Einzahlungen auf Börsen angezeigt werden? + +Börsen benötigen in der Regel eine höhere Anzahl von Bestätigungen für PoW-Chains, um ausreichende Sicherheit zu gewährleisten. Derzeit fordern die meisten Börsen zwischen 30 und 60 Bestätigungen für Alephium, was etwa 30 Minuten bis eine Stunde entspricht. + +### Auf welchen Börsen ist Alephium derzeit gelistet? + +Die Liste der verfügbaren Alephium-Märkte finden Sie auf [CoinMarketCap](https://coinmarketcap.com/currencies/alephium/markets/) oder [CoinGecko](https://www.coingecko.com/en/coins/alephium). + +## Mining + +### Wie hoch sind die Mining-Belohnungen? + +Es gibt einen [ausführlichen Artikel, der die Blockbelohnungen von Alephium erklärt](https://medium.com/@alephium/alephium-block-rewards-72d9fb9fde33). + +### Was ist der Grund, die Blockbelohnung für 500 Minuten zu sperren, obwohl die Blockzeit nur 64 Sekunden beträgt? + +Die 500-minütige Sperrfrist ist so konzipiert, um Re-Org-Angriffe zu verhindern, ähnlich wie die 1000-minütige Sperrfrist für geschürfte Belohnungen bei Bitcoin. + +### Warum habe ich 4 Mining-Adressen? + +Alephium ist eine Sharded-Blockchain mit `G` Gruppen und `G*G` Shards. Aufgrund dieses Designs benötigt jede Gruppe ihre eigene Mining-Adresse. + +Derzeit besitzt Alephium 4 Gruppen und 16 Shards in seinem Mainnet. Daher werden 4 Mining-Adressen benötigt, eine für jede Gruppe. + +### Wie viele Münzen werden pro Tag geschürft? + +Um zu erfahren, wie viele Münzen pro Tag geschürft werden, können Sie die folgende Formel verwenden. Da die Blockbelohnung sich dynamisch mit jedem Block ändert, liefert die Formel nur eine Annäherung. + +``` +3600 Sekunden / 64 Sekunden (Alephium Blockzeit) == 56,25 Blöcke pro Stunde, pro Shard. +56,25 x 16 Shard== 900 Blöcke insgesamt pro Stunde. +900 x 24 Stunden == 21600 Blöcke pro Tag. +21600 x Belohnung pro ALPH-Block ~= Anzahl der ALPH, die pro Tag geschürft werden. +``` + +Zum Zeitpunkt der letzten Aktualisierung dieses Eintrags betrug die durchschnittliche Blockbelohnung `2.87` ALPH, was etwa `61'992` ALPH pro Tag entspricht. + +### Ist Alephium ASIC-Resistent? + +Nein, Alephium ist darauf ausgelegt, ASIC-freundlich zu sein, genau wie Bitcoin. Die Aufrechterhaltung von ASIC-Resistenz kann äußerst herausfordernd, wenn nicht sogar unmöglich, wie bei anderen Blockchains, die sich gezwungen sahen, Forks durchzuführen und ihre Mining-Algorithmen zu ändern. Alephium hat sich dafür entschieden, die Priorität auf ein sicheres und stabiles Netzwerk zu legen, anstatt Widerstand gegen spezialisierte Hardware zu bieten. Wenn die Zeit gekommen ist, kann die Verwendung von ASICs auf Alephium die Leistung und die Treue der Miner unterstützen. Die Investition in hardware, die speziell für die Blockchain entwickelt wurde, macht es wahrscheinlicher, dass Miner engagiert bleiben und verringert das Risiko plötzlicher Verschiebungen in der Mining-Leistung. + +### Welche Mining Software kann ich verwenden, um ALPH zu schürfen? + +Unterhalb ist eine Liste bekannter Mining Software für Alephium aufgelistet. Beachten Sie, dass die Liste unvollständig sein kann, da es schwierig ist, neue Miner im Auge zu behalten. Sie können gerne einen Pull Request einreichen, um weitere hinzuzufügen. + +- https://www.bzminer.com/guides/how-to-mine-alephium/ +- https://lolminer.site/ + https://github.com/Lolliedieb/lolMiner-releases +- https://www.srbminer.com/ + https://github.com/doktor83/SRBMiner-Multi/releases +- https://trex-miner.com/ + https://github.com/trexminer/T-Rex + +Sie können auch den [Alephium GPU Miner](https://github.com/alephium/gpu-miner) verwenden, jedoch ist dieser nicht so effizient wie die anderen in dieser Liste. + +## Tech + +### Warum eine weitere L1-Blockchain? Gibt es nicht schon zu viele? + +Die Blockchain hat sich von einer disruptiven Technologie zu einer möglichen Mainstream-Lösung für verschiedene Sektoren entwickelt. Aufgrund dieses Paradigmenwechsels geben die meisten Projekte die Grundwerte von Dezentralisierung, Selbstbestimmung und Sicherheit auf, um die Skalierbarkeit zu verfolgen, die für derartige Anwendungen erforderlich ist. Alephium erzielt dasselbe Ergebnis, ohne dabei die Grundprinzipien zu beeinträchtigen, und ist einzigartig positioniert, um das Interesse der Branche an (s)UTXO und Po(L)W zu wecken und die Bewegung von UTXO-basierten DeFi- und Smart-Vertragsanwendungen anzuführen. + +Darüber hinaus gab es einige wichtige technologische Motivationen für den Aufbau von Alephium: + +1. Horizontale Skalierung durch Sharding +2. Viele der neuen Layer 1 (L1)-Blockchains sind ressourcenintensiv und machen es teuer, einen vollständigen Knoten zu betreiben, was langfristig zu einem Mangel an Dezentralisierung und Desintermediation führen kann. Alephiums Ansatz ähnelt dem von Bitcoin, bei dem jeder einen vollständigen Knoten (Full Node) betreiben und das Netzwerk überprüfen kann. _"Don't trust, verify."_ +3. Viele neue L1-Blockchains verwenden das Account-Modell oder sind EVM-kompatibel und erben dessen Schwächen. Alephium hat eine neue virtuelle Maschine (VM) auf Basis des Unspent Transaction Output (UTXO)-Modells erstellt, um ein neues Programmierparadigma mit höherem Sicherheitsniveau für dezentrale Anwendungen (DApps) zu bieten. +4. Die meisten neuen L1-Blockchains verwenden den Proof-of-Stake (PoS)-Konsensmechanismus. Alephium hat sich dafür entschieden, auf dem Proof-of-Work (PoW) aufzubauen, da es ein einfacherer, konsistenterer und robusterer Konsensmechanismus für die Erreichung der Dezentralisierung ist. + +### Unterstützt Alephium Smart Contracts? + +Ja, Alephium unterstützt Smart Contracts. Es wurde speziell dafür entwickelt, ein skalierbares und sicheres Netzwerk für Smart Contracts und dezentrale Anwendungen zu sein. + +### Warum beträgt die Blockzeit 64 Sekunden? Gibt es dafür einen bestimmten Grund? + +Die Endgültigkeit (Finality) in Proof-of-Work (PoW)-Blockchains basiert auf der Menge an Arbeit, die in neuen Blöcken akkumuliert wird, anstatt auf der Blockzeit. Dies bedeutet, dass, wenn eine Transaktion N Blöcke mit einer Blockzeit T benötigt, um bestätigt zu werden, sie dann 2N Blöcke benötigen wird, um bestätigt zu werden, wenn die Blockzeit auf T/2 halbiert wird. Dies würde zu derselben Zeitspanne für die Bestätigung führen. + +Obwohl kürzere Blockzeiten eine bessere Benutzererfahrung bieten, bringen sie auch einige Nachteile mit sich: + +- Mehr Waisenblöcke werden produziert. Die Rate an Onkelblöcken im PoW-Netzwerk von Ethereum beträgt 10% oder mehr, während die Waisenblockrate bei Bitcoin weniger als 1% beträgt. +- Erhöhter Overhead im P2P-Netzwerk. Dieses Problem ist für PoS-Blockchains besonders schwerwiegend, da Berichte darauf hinweisen, dass bis zu 90% der Transaktionen auf Solana Validator-Nachrichten sind. + +Um langfristig eine leichte und effiziente Blockchain zu gewährleisten, sollten solche Overheads vermieden werden. Daher startete Alephium mit einer Blockzeit von 64 Sekunden, die einen Kompromiss zwischen Bitcoin und neueren Blockchains mit kürzeren Blockzeiten darstellt. + +Für diejenigen, die Blockzeiten und sofortige Endgültigkeit priorisieren, können Layer-2-Lösungen auf Alephium aufgebaut werden, und die Blockzeit kann in Zukunft verringert werden, wenn die Blockchain reift oder die Internetgeschwindigkeit zunimmt. Letztendlich ist eine leichte, skalierbare und effiziente Layer-1-Lösung für den Kryptowährungsraum unerlässlich. + +### Wie lange dauert es, bis eine Transaktion durchgeführt wird? + +1 Sekunde sollte ausreichen, um die eingehende Transaktion im Mempool zu sehen. Die Blockzeit von Alephium beträgt derzeit 64 Sekunden. Die ökonomische Endgültigkeit hängt von der Menge und Ihrem Risikomanagement ab. Für eine kleine Transaktion ist der Mempool wahrscheinlich ausreichend, und 1-4 Blöcke reichen für die meisten Transaktionen aus. Wenn Sie jedoch eine Börse beitreiben und mit großen Beträgen handeln, werden Sie wahrscheinlich auf einige Dutzend bis Hunderte von Blöcken warten. + +Sie können mehr über das Konzept der Blockzeit und der Zeit bis zur Endgültigkeit in diesen Artikeln lesen: + +- [Blockzeit & Blockgröße](https://medium.com/@alephium/block-time-and-block-size-16e37292444f) +- [Zeit bis zur Endgültigkeit](https://medium.com/@alephium/time-to-finality-17d64eeffd25) + +### Warum habt ihr euch für PoLW entschieden und nicht für PoS? + +Die Blockchain-Technologie befindet sich noch in ihren Anfangsphasen, und eine häufige Frage ist, welche Blockchain-Infrastruktur in den nächsten 10 Jahren für die Unterstützung von DApps, einschließlich DeFi, benötigt wird. + +Alephium wurde mit der Überzeugung entwickelt, dass eine skalierbare Blocskchain mit hoher Durchsatzrate und niedrigen Transaktionsgebühren, kombiniert mit einem hohen Maß an Programmierbarkeit wie bei Ethereum sowie der Zuverlässigkeit und Sicherheit von Bitcoin, notwendig ist. Das Ziel war es, einen "skalierbaren Bitcoin mit einer zuverlässigen Smart Contract-Lösung" zu schaffen. + +Nach dem Lindy-Effekt ist trotz der jüngsten Erfolge mit PoS das Bitcoin-Modell und das Sharding mit PoW nach wie vor der robusteste und dezentralste Weg, um eine skalierbare Blockchain aufzubauen. Insbesondere: + +- PoW ist einfach und robust und einfacher zu gestalten mit Sharding-Algorithmen. +- PoS wurde noch nicht über einen längeren Zeitraum getestet, und es bleibt abzuwarten, wie es sich nach dem PoS-Wechsel von Ethereum entwickelt. +- PoS neigt dazu, stärker zentralisiert und anfälliger für Zensur zu sein. +- PoS neigt dazu, die Vertrauenslosigkeit zu verringern, da die Kosten für den Betrieb eines Knotens erheblich höher sein können. +- PoS ist anfälliger für einige DeFi-Angriffe wie MEV. + +### Was sind stateful UTXOs und wie unterscheiden sie sich von anderen UTXO-Modellen? + +Es gibt zwei Arten von Zuständen in der Blockchain-Technologie: veränderlicher Zustand (wie in Ethereum) und unveränderlicher Zustand (wie bei UTXO oder eUTXO). Der veränderliche Zustand ist flexibler und ausdrucksstärker, wie es durch das lebendige Ökosystem von Ethereum belegt. Allerdings bietet das UTXO-Modell inhärente Sicherheitsvorteile. + +[Alephium's stateful UTXO model](https://medium.com/@alephium/an-introduction-to-the-stateful-utxo-model-8de3b0f76749) kombiniert die Vorteile beider. Es unterstützt veränderliche Zustände, wie sie für Smart Contracts in Ethereum zu finden sind, während es die Sicherheitsvorteile des UTXO-Modells für Vermögenswerte nutzt. + +### Ist Alephium anfällig für die gleichen Konfliktprobleme wie das klassische und erweiterte UTXO-Modell, die zu einer niedrigen Transaktionen pro Sekunde (TPS) führen können?? + +Nein, Alephium hat diese Einschränkung nicht. Alephiums stateful UTXO-Modell kombiniert das klassische UTXO-Modell mit dem Account-Modell und unterstützt veränderliche Zustände. Dadurch können DApps parallelen Zugriff auf veränderliche Vertragszustände haben, was jede Möglichkeit von Konfliktproblemen ausschließt. + +### Warum nicht 1 Million Shards haben? + +Die Netzwerkanbindung ist der Hauptengpass für die Erhöhung der Anzahl der Shards. Jeder Knoten muss `2G - 1` andere Shards für die Konsistenz aufrechterhalten. Wenn die durchschnittliche Netzwerkbandbreite ausreicht, kann G so hoch wie 32 festgelegt werden. Obwohl auch einige Rechenüberlastungen vorhanden sind, bleibt die Netzwerkanbindung der hauptsächliche Engpass. + +### Wie verläuft der Prozess, die Anzahl der Shards auf Alephium zu erhöhen? + +Ein Upgrade des Netzwerks ist erforderlich, um die Anzahl der Shards zu erhöhen. Ein solches Upgrade erfolgt, wenn die vorhandene Anzahl von Shards nicht ausreicht, um die Netzwerklast zu bewältigen. + +### Kann ein geschichtetes Netzwerk, insbesondere Alephium, mit weniger als 51 % Hashrate angegriffen werden? Zum Beispiel durch Kompromittieren nur einer Gruppe oder eines Shards? + +Sicherheitsbedenken können bei geschichteten Blockchains auftreten, wenn sie nicht ordnungsgemäß gestaltet sind, wie Vitalik es in seiner Terminologie des "1% - Angriffs" erklärte. Ethereums Sharding-Ansatz hat dieses Problem mit dem Shuffeln der Validatorn gelöst. + +Alephium hat es andererseits mit seinem Blockflow-Algorithmus gelöst. Die Mining-Arbeit über verschiedene Shards hinweg wird aufgrund von Blockabhängigkeiten akkumuliert. Ein Angreifer, der versucht, einen Shard neu zu organisieren, müsste auch alle seine Abhängigkeiten neu organisieren. Eine intuitive und vereinfachte Möglichkeit dies zu betrachten, ist, dass alle Shards miteinander Merge-Mining betreiben. + +### Gibt es in Alephium eine atomare Transaktion zwischen Shards für Tokens und Smart Contracts? + +Auf Alephium sind Tokens zwischen Shards atomar zusammensetzbar, was bedeutet, dass es möglich ist, Tokens in einer Transaktion atomar von einem Shard zu einem anderen Shard zu transferieren. Allerdings haben Smart Contracts im zustandsbasierten UTXO-Modell von Alephium Token- und Zustandskomponenten. Nur Tokens ermöglichen eine atomare Übergreifung zwischen Shards; die Zustände sind geschardet und daher nicht zusammensetzbar. Diese Designentscheidung spiegelt den tokenzentrierten Ansatz von Alephium wider und ermöglicht ein einfacheres Zustandsdesign, das einem partitionierten Datenbankmodell ähnelt. Dieser Kompromiss ist kostengünstiger als die aktuellen Trends auf Layer-2, die an atomarer Komposabilität von Tokens mangelt. Derzeit existiert keine praktische Lösung für eine vollständige Zustandskomposabilität. + +### Sind Flash Loans auf Alephium möglich? + +Nein, Flash Loans sind auf [Alephiums virtueller Maschine, Alphred](https://medium.com/@alephium/meet-alphred-a-virtual-machine-like-no-others-85ce86540025) nicht möglich. + +### Wie werden Alephium-Adressen generiert? Gibt es eine Möglichkeit, eine Bitcoin Legacy-Adresse von einer Alephium-Adresse zu unterscheiden? + +Alephium verwendet dieselbe Kurve wie Bitcoin (secp256k1-Kurve), um Adressen zu generieren, aber einen anderen Hash-Algorithmus (blake2b). Allerdings sind Alephium-Adressen normalerweise länger als Bitcoin-Adressen, da sie einen 32-Byte-Hash anstelle eines 20-Byte-Hash verwenden. + +### Kann ich meine Mainnet-Adresse im Testnet verwenden? + +Alephium-Adressen werden vom Algorithmus selbst generiert und sind netzwerkunabhängig (Testnet, Mainnet, Devnet usw.). Es ist nicht notwendig, mit einem Netzwerkknoten (oder sogar dem Internet) verbunden zu sein, um eine Wallet und Adressen zu erstellen. Jede Alephium-Adresse existiert im Grunde genommen in allen Netzwerken, auch in solchen, die noch nicht generiert/entdeckt wurden. + +In früheren Krypto-Netzwerken enthielten Transaktionen keine Netzwerkinformationen und konnten auf anderen Netzwerken "wiedergegeben" werden. Es wurde daher nicht empfohlen, dieselben Adressen auf verschiedenen Netzwerken zu verwenden. Alephium enthält die Netzwerk-ID in seinen Transaktionen, daher ist es durchaus akzeptabel, dieselbe Adresse auf verschiedenen Netzwerken zu verwenden. + +Wenn Sie Ihr Wallet mit einem Netzwerk verknüpfen, z. B. Testnet, können Sie einen Testnet-Knoten bitten, Ihr Adressguthaben zu überprüfen. Wenn Sie die Netzwerkeinstellungen Ihrer Wallet ändern, um sich mit dem Mainnet zu verbinden, zeigt ein Mainnet-Knoten Ihr Adressguthaben im Mainnetzwerk an. Jede Adresse hat also ein Guthaben in jedem Netzwerk, und Sie können das Guthaben Ihrer Adresse in diesem speziellen Netzwerk anzeigen, indem Sie sich damit verbinden. + +### Warum hat Alephium beschlossen, seine eigene virtuelle Maschine und Programmiersprache für Smart Contracts zu entwicklen? + +Das auf Alephium basierende [stateful UTXO model](https://medium.com/@alephium/an-introduction-to-the-stateful-utxo-model-8de3b0f76749) ist völlig neuartig und nicht mit vorhandenen virtuellen Maschinen wie EVM kompatibel, die für das Account-Modell konzipiert wurden. Dies führte zur Entscheidung, eine neue virtuelle Maschine namens [Alphred](https://medium.com/@alephium/meet-alphred-a-virtual-machine-like-no-others-85ce86540025) zu erstellen, die speziell darauf ausgerichtet ist, die Stärken von sUTXO zu nutzen.. + +Ähnlich der EVM mit Solidity verfügt Alphred über eine domänenspezifische Sprache namens Ralph. Ralph wurde speziell für die Blockchain von Alephium entwickelt, um äußerst ausdrucksstark und benutzerfreundlich zu sein. Es wurde speziell darauf ausgelegt, sicherheitstechnisch durchdacht zu sein, indem die integrierten Funktionen der VM genutzt werden. + +Durch die Erstellung seiner eigenen VM und seiner eigenen Smart-Contract-Sprache konnte Alephium eine bessere Alternative vorschlagen und einige der bekannten Sicherheitsprobleme von Solidity und der EVM mildern. Darüber hinaus wurde bei der Gestaltung von Alphred und Ralph die Entwicklererfahrung priorisiert, um einen einfachen Einstieg für Entwickler zu gewährleisten. + +### Ist Alephium Quanten-Resistent? + +Ähnlich wie bei Bitcoin und Ethereum betrachtet Alephium Quantencomputer nicht als unmittelbare Bedrohung. Die Hashing- und Signaturalgorithmen sowie die Adresskonstruktion können aktualisiert werden. Das Problem der Quantencomputer wird angegangen, wenn es zu einer signifikanteren Bedrohung wird. + +## Tokenomics + +### Was ist die niedrigstmögliche GAS-Gebühr? + +Die aktuell niedrigstmögliche Gas-Gebühr beträgt `10^-7` ALPH oder `0.0000001` ALPH. + +### Wie ist der Emissionszeitplan von Alephium? Gibt es bei Alephium Halbierungen der Block-Rewards? + +Alephium hat keine Halbierungen wie Bitcoin. Sein Emissionszeitplan hängt von der Netzwerk-Hashrate und dem Zeitstempel ab. Die Mining-Rewards werden dynamisch mit jedem Block angepasst. Weitere Informationen dazu finden Sie in diesen Artikeln: + +- [Block Rewards](https://medium.com/@alephium/alephium-block-rewards-72d9fb9fde33) +- [Proof of Less Work](https://medium.com/@alephium/tech-talk-1-the-ultimate-guide-to-proof-of-less-work-the-universe-and-everything-ba70644ab301) + +### Wenn Token verbrannt werden, wird es in der Zukunft einen Zeitpunkt geben, an dem die Menge an existierenden ALPH nahezu null sein wird? + +In der Theorie, ja. Die Vorhersage der Zukunft von Technologien über 10, geschweige denn 80 Jahre hinaus, ist schwierig. Für Blockchains wie Alephium ist es nicht ungewöhnlich, dass Richtlinien, wie beispielsweise der Emissionsplan, sich ändern, wenn sich Technologien weiterentwickeln. Wenn der Konsens einer Änderung des Emissionsplans zustimmt, wird die Änderung erfolgen. + +### Wie wird die Obergrenze für die maximale Versorgung umgesetzt? + +Die Obergrenze für die maximale Versorgung von 1 Milliarde ALPH ist eine Schätzung. Das Protokoll setzt eine Obergrenze für die Emissionen auf Grundlage eines Zeitstempels von etwa 80 Jahren um. Dies liegt daran, dass die Berechnung der Summe der Emissionen für eine gemeinsame Kette innerhalb des Protokolls rechenintensiv ist. Die Emissionsrate wird durch die Zeit bestimmt und variiert je nach Hash-Rate. + +Es ist zu beachten, dass die Schätzung der 1-Milliarden-Obergrenze vor der Implementierung des verbesserten [DAA](https://github.com/alephium/alephium/blob/master/docs/proposals/lemanDAA.md) erfolgte. Mit dem aktuellen Code wird erwartet, dass die tatsächliche Obergrenze für die Emissionen und die maximale Versorgung mit ALPH in 80 Jahren weniger als 1 Milliarde beträgt, selbst ohne Berücksichtigung des Gebühren-Verbrennungsmechanismus POLW. + +## Wallet + +### Welche Art von Wallet bietet Alephium an? + +Alephium bietet derzeit: + +- Eine [Desktop wallet](https://github.com/alephium/desktop-wallet/releases/latest) +- Eine [Webextension Wallet](https://github.com/alephium/extension-wallet) verfügbar für [Chrome](https://chrome.google.com/webstore/detail/alephium-extension-wallet/gdokollfhmnbfckbobkdbakhilldkhcj) und [Firefox](https://addons.mozilla.org/en-US/firefox/addon/alephiumextensionwallet/) +- Eine [Mobile Wallet](https://github.com/alephium/mobile-wallet) wird derzeit entwickelt. + +Zusätzlich zu den offiziellen Wallets gibt es eine Reihe von Wallets von Drittanbietern. + +### Ist geplant, dass Alephium von Hardware-Wallets unterstützt wird? + +Die Unterstützung von Hardware-Wallets anzubieten, hat für Alephium hohe Priorität. Eine Integration von Ledger ist derzeit in Arbeit und wird im Entwicklermodus mit der Webextension-Wallet `v0.7.0` verfügbar sein. +Die offizielle Veröffentlichung auf Ledger ist ein längerer Prozess mit mehreren Phasen, der Zeit in Anspruch nehmen wird. + +### Gibt es eine Möglichkeit beim Importieren meines Seeds in die Desktop Wallet, alle generierten Adressen zu importieren? + +Nachdem Sie Ihre Wallet mithilfe der Wiederherstellungsphrase importiert haben, kann die Wallet nun das verbundene Netzwerk scannen, um alle aktiven Adressen zu finden, die Sie in der Vergangenheit verwendet haben. Eine aktive Adresse ist eine Adresse, die mindestens eine Transaktion aufweist. Für die manuelle Adresssuche gehen Sie zum Abschnitt "Adressen" und klicken Sie auf das Schraubenschlüssel-Symbol neben der Schaltfläche "+ Neue Adresse". Nachdem Sie auf die Schaltfläche "Suchen" in der Option "Aktive Adressen finden" geklickt haben, zeigt die Desktop-Wallet alle aktiven Adressen an, die mit dieser Wiederherstellungsphrase verknüpft sind. + +### Welche Daten werden bei der Analyse der Desktop-Wallet gesammelt? + +Alephium nimmt Bedenken hinsichtlich Datenschutz und Benutzererfahrung ernst. Das Aktivieren von Analysen kann tatsächlich dazu beitragen, die Benutzererfahrung zu verbessern, ohne die Privatsphäre zu beeinträchtigen. Die vom Desktop-Wallet gesammelten Informationen sind vollständig anonym. Bei der ersten Ausführung Ihres Wallets wird eine eindeutige ID generiert (zum Beispiel, `vCJGCsDPrZ8WJaIKZMWjU`) , die die einzige erforderliche Identifikationsinformation ist. IPs oder andere [persönliche Daten](https://posthog.com/blog/what-is-personal-data-pii) werden nicht erfasst. Es werden nur Klicks auf Schaltflächen, Anzahl der Wallets, Adressen, Kontakte und Wallet-Einstellungen erfasst. Diese Informationen helfen dabei, nützliche Funktionen und Verbesserungsbereiche zu identifizieren. +Der Open-Source-Code von Alephium ermöglicht es Benutzern, zu überprüfen, welche Ereignisse erfasst werden, indem sie [nach dem Schlüsselwort `posthog?.capture`](https://github.com/search?q=repo%3Aalephium%2Fdesktop-wallet+posthog?.capture&type=code) suchen. + +### Warum wird meiner Transaktion beim Versuch, Tokens zu senden, zusätzlich 0,001 ALPH pro Token hinzugefügt? + +Die `0.001` ALPH ist die minimalste Anforderung pro UTXO, um UTXO-Spamming zu vermeiden. Dieser Betrag wird vom Netzwerk nicht verbraucht und wird an die Zieladresse gelangen, genauso wie die Tokens. + +### Warum ist es wichtig, Ihre geheimen Wiederherstellungsphrase zu sichern? + +Das Sichern Ihrer geheimen Wiederherstellungsphrase ist entscheidend, da sie als der Hauptschlüssel zu Ihrem Wallet fungiert. Wenn Sie den Zugriff auf Ihr Wallet verlieren (z. B. durch Geräteverlust, Funktionsstörung oder App-Löschung), ist die geheime Wiederherstellungsphrase die einzige Möglichkeit, Ihre Mittel wiederherzustellen und darauf zuzugreifen. Ohne sie könnten alle im Wallet gespeicherten Vermögenswerte dauerhaft verloren gehen. Behandeln Sie sie daher mit äußerster Sorgfalt und bewahren Sie sie sicher und privat auf. + +## Sonstiges + +### Wo kann ich übersetzten Inhalt finden? + +Sie können viele internationale und übersetzte Inhalte auf Medium, Twitter und Youtube finden. + +Auf Twitter übersetzen folgende Community-Accounts Alephium-Tweets: + +- [Deutsch](https://twitter.com/Alephiumde) +- [Französisch](https://twitter.com/Alephiumfr) +- [Bulgarisch](https://twitter.com/alephiumbg) +- [Indonesisch](https://twitter.com/Alephium_id) + +Übersetzer werden ermutigt, die folgende Hashtag-Struktur zu verwenden, wenn sie übersetzten Inhalt veröffentlichen: #Alephium[i18n]. Sie können Übersetzungen auf Medium, Twitter und anderen Kanälen mit den folgenden Hashtags finden: + +- Spanisch: "#AlephiumES" +- Portugisisch: "#AlephiumPT" +- Französisch: "#AlephiumFR" +- Deutsch: "#AlephiumDE" +- Bulgarisch: "#AlephiumBG" + +Auf dem [Discord Server](https://alephium.org/discord) hat Alephium dedizierte internationale Kanäle. +Auf Telegramm stehen die folgenden Community-geführten Gruppen zur Verfügung: + +- [Deutsch](https://t.me/alphgermanofficial) +- [Vietnamesisch](https://t.me/alephiumvn) +- [Russisch](https://t.me/alephiumgroup_ru) +- [Portugiesisch](https://t.me/Alephium_pt) +- [Türkisch](https://t.me/alephiumturkiye) +- [Niederländisch](https://t.me/AlephiumgroupNL) +- [Chinesisch](https://t.me/alephiumCN) + +### Was gibt es Neues? + +Verfolgen Sie die Ankündigungskanäle von Alephium auf [Discord](https://discord.gg/AFXKJNVFKJ) und [Telegram](https://t.me/Alephium_Announcement). +Wir haben auch wöchentliche Entwicklungsaktualisierungen auf [Discord](https://alephium.org/discord), [Reddit](https://www.reddit.com/r/Alephium) & [Twitter](https://twitter.com/alephium). + +### Warum wurde das Projekt mit Alephium benannt? + +Der Name Alephium leitet sich von "Aleph" ab, einem Begriff, der auf Wikipedia wie folgt definiert ist: "Aleph-Zahlen sind eine Sequenz von Zahlen, die zur Darstellung der Kardinalität von unendlichen Mengen verwendet werden können, die gut angeordnet werden können. Sie wurden vom Mathematiker Georg Cantor eingeführt und sind nach dem Symbol benannt, das er zur Kennzeichnung verwendete, dem hebräischen Buchstaben Aleph (ℵ)." + +Tatsächlich ist das Alephium-Logo eine stilisierte Version des Aleph-Buchstabens. + +Als Anspielung auf die technischen Versprechen von Ethereum wurde Alephium nach einer ähnlichen Benennungskonvention benannt. + +### Was ist das Leman Upgrade? + +Am 30. März 2023 aktiviert, ist das [Leman Upgrade](https://medium.com/@alephium/the-leman-network-upgrade-is-live-f52c89b7dd6a) das erste Netzwerk-Upgrade des Alephium-Netzwerks. Es ist das Ergebnis von über einem Jahr harter Arbeit und Hingabe vieler Beitragenden und es stellt einen bedeutenden Meilenstein für das Projekt dar. Es ist der erste Schritt zum Wachstum des Alephium-Ökosystems, mit mehreren neuen Funktionen, die eine verbesserte Entwicklererfahrung für den Aufbau von dezentralen Anwendungen bieten. + +### Wo kann ich alles über Alephium in 5 Minuten lernen? + +Eine gute Übersicht finden Sie in der [Dokumentation](https://docs.alephium.org/) und zusätzliche Ressourcen finden Sie oben in diesem FAQ. + +### WANN MOND? + +1 ALPH ist immer 1 ALPH wert. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/Leman Network Upgrade.md b/i18n/de/docusaurus-plugin-content-docs/current/Leman Network Upgrade.md new file mode 100644 index 00000000..3f21a849 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/Leman Network Upgrade.md @@ -0,0 +1,109 @@ +--- +sidebar_position: 60 +title: Leman Netzwerk-Upgrade +sidebar_label: Leman Netzwerk-Upgrade +--- + +:::info +This page may be subject to future updates +::: + +Auf dieser Seite finden Sie alle Informationen zum Leman Netzwerk-Upgrade. Das Leman Netzwerk-Upgrade ist der nächste Schritt in der Entwicklung von Alephium und wird neue Funktionalitäten und Features auf die Blockchain bringen. + +## Warum das Leman Upgrade? + +Alephium ist seit dem 8. November 2021 im Hauptnetz live. Die Kernentwickler haben sich seitdem darauf konzentriert, die Leistung und Sicherheit des gesamten Stapels zu verbessern sowie eine erstklassige dApp-Entwicklererfahrung zu ermöglichen. + +Nach ausreichenden Tests im Testnetz bringt das Leman Upgrade diese wichtigen Verbesserungen nun auf das Hauptnetz. Da diese Änderungen signifikant sind, wird das Upgrade neue Funktionen und Änderungen einführen, die nicht abwärtskompatibel sind und eine Aktualisierung aller Knoten erfordern. + +Sie finden eine ausführliche Darstellung der Gründe und Auswirkungen des Leman Upgrades (Begründung) [hier](https://medium.com/@alephium/announcing-the-leman-network-upgrade-c01a81e65f0e). + +Sowie ein Update zum Stand der Vorbereitung für das Upgrade selbst [hier](https://medium.com/@alephium/the-leman-upgrade-2-232e3374abc4). + +Und einen technischen Vortrag über die mit dem Leman Netzwerk-Upgrade eingeführten Funktionen [hier](https://www.youtube.com/watch?v=n7ycJUIfbVg) + +## Verbesserte Entwicklererfahrung (devX) für Entwickler + +### SDK + +Ein Set von Werkzeugen zur Interaktion mit und Entwicklung von dApps auf Alephium + +- Github: [https://github.com/alephium/alephium-web3](https://github.com/alephium/alephium-web3) +- Docs: [https://docs.alephium.org/dapps/alephium-web3](https://docs.alephium.org/dapps/alephium-web3) + +### Ralph + +Programmiersprache von Alephium für die Entwicklung von dApps + +- Github: [https://github.com/alephium/ralphc](https://github.com/alephium/ralphc) +- Docs: [https://docs.alephium.org/ralph/getting-started](https://docs.alephium.org/ralph/getting-started) + +### dApps Prototypen + +Jetzt Dinge erstellen! Wie man dApps auf Alephium erstellt: https://docs.alephium.org/dapps/build-dapp-from-scratch + +Beispiele für bereits erstellte dApps: + +- NFT-Marktplatz: Erstellen, kaufen und verkaufen Sie NFTs. + +Github: [alephium/alephium-nft#1](https://github.com/alephium/alephium-nft) + +- DEX (Dezentralisierte Börse): Tauschen Sie Token aus oder werden Sie Liquiditätsanbieter (LP) auf einer dezentralen Börse (DEX). + +Github: https://github.com/Lbqds/alephium-dex/tree/master/contracts + +### Öffentliche Dienstleistungen + +Faucet und APIs + +Öffentliche Dienstleistungen: [https://docs.alephium.org/dapps/public-services](https://docs.alephium.org/dapps/public-services) + +## Erweiterung der Benutzererfahrung + +Das Frontend wird umfassend überarbeitet + neue Werkzeuge! https://medium.com/@alephium/the-front-end-leman-upgrade-948a98a3e2d + +:::info +Coming Soon: Test the next versions of the wallets (Desktop and Mobile) +::: + +Haben Sie Fragen? Treten Sie unserem bei [Discord](https://alephium.org/discord) + +## Grundlagen für die Verbindung zu anderen Chains + +Die Kernentwickler entwickeln eine Bridge zwischen Alephium und Ethereum. + +Der Code dafür kann unter folgendem Link gefunden werden: [https://github.com/alephium/wormhole-fork/tree/add-alephium-to-wormhole/alephium](https://github.com/alephium/wormhole-fork/tree/add-alephium-to-wormhole/alephium) + +Die Alephium-Ethereum-Bridge ist im Testnetz bereitgestellt. + +# Testnet + +Sie können sich mit dem Testnetz verbinden und mit den folgenden Anwendungen und Werkzeugen interagieren: + +### **Extension Wallet** + +- Docs: https://docs.alephium.org/wallet/extension-wallet/overview +⬇️ Erweiterungswallet herunterladen +🔵 [Google Chrome store](https://chrome.google.com/webstore/detail/alephium-extension-wallet/gdokollfhmnbfckbobkdbakhilldkhcj) +🟠 [Firefox Store](https://addons.mozilla.org/en-US/firefox/addon/alephiumextensionwallet/) + +### Testnet Block Explorer + +- Link: https://testnet.alephium.org/ + +### NFT Marketplace + +- Link: https://alephium-nft.softfork.se/my-nfts +- Anleitung, wie Sie mit dem NFT-Marktplatz interagieren: https://medium.com/@alephium/alephium-launches-browser-extension-wallet-706dfeda98f5 + +### DEX on Alephium Testnet + +- Link: https://alephium.github.io/alephium-dex +- Anleitung, wie Sie mit der DEX interagieren: https://medium.com/@alephium/dex-prototype-live-on-testnet-bac5e7d095ce +- Wie Sie einen Token im Alephium-Testnetz erstellen: *Kommt bald* + +### Alephium Ethereum Bridge + +- Link: [https://portal-bridge.wormhole-testnet.softfork.se/](https://portal-bridge.wormhole-testnet.softfork.se/) +- Anleitung, wie Sie mit der Brücke interagieren: *Kommt bald* +- Anleitung, wie Sie sich mit dem Ethereum Goerli Testnetz verbinden: *Kommt bald* diff --git a/i18n/de/docusaurus-plugin-content-docs/current/The Bridge.md b/i18n/de/docusaurus-plugin-content-docs/current/The Bridge.md new file mode 100644 index 00000000..ca57dad3 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/The Bridge.md @@ -0,0 +1,107 @@ +# Die Bridge + +## Anleitungen & Links + +Bridge Webseite : https://bridge.alephium.org/#/ + +Bridge Explorer Webseite : https://explorer.bridge.alephium.org/ + +Anleitung für die Bridge ( Mainnet ) : https://medium.com/@alephium/alephiumalephium-bridge-the-tutorial-28e7b92b339a + +Die Alephium Bridge - Wie sie funktioniert? Wie man sie benutzt? ( Artikel ) : https://medium.com/@alephium/the-alephium-bridge-a787d90b2e4a + +Bridge Video-Anleitung ( Mainnet ) : https://www.youtube.com/watch?v=xoYVzbwBAjg + +## Bridge FAQ + +### 1. Ich habe lange genug gewartet, und es lässt mich nicht einlösen! Was soll ich tun? + +Bitte beachten Sie: + +- Die Überbrückung von ETH zu ALPH dauert durchschnittlich 15-20 Minuten. + +- Die Überbrückung von ALPH zu ETH dauert etwas länger. Die Transaktion muss zwei Bedingungen erfüllen: mindestens 105 Blöcke und mindestens 112 Minuten. Wenn eine der Bedingungen nicht erfüllt ist, ist die Einlösung noch nicht möglich. + +In den meisten Fällen reicht es aus, etwas länger zu warten, um Ihre Token einzulösen. + +Wenn es immer noch nicht funktioniert, versuchen Sie bitte, Ihre Wallets von der Bridge zu trennen und erneut zu verbinden, und versuchen Sie es erneut (siehe + +Wenn das nicht funktioniert, öffnen Sie hier ein Problem. + + +### 2. Die Bridge hat mich darauf hingewiesen, dass ich eine neue Brieftaschenadresse erstellen muss! Was bedeutet das? + +Um mit den meisten dApps auf Alephium zu interagieren, müssen Sie eine Adresse der Gruppe 0 erstellen. So geht's: + +### Desktop: + +Gehe zum Register "Adressen" und klicke auf "+ Neue Adresse". +Aktiviere die erweiterten Optionen und wähle "Gruppe 0". +Klicke auf Generieren, um die Adresse zu erstellen. +Überweise deine Mittel auf diese Adresse für die Überbrückung. + +### Erweiterung: + +Klicke auf deine aktuelle Wallet oben links in der App. +Wähle das Plus-Symbol, um eine neue Adresse hinzuzufügen. +Wähle die gewünschte Gruppe für die neue Adresse. +Überweise deine Mittel auf diese Adresse für die Überbrückung. + + +### Mobile: + +Die mobile App wird die Adresse für dich generieren. +Finanziere die generierte Adresse. +Fahre mit dem Überbrückungsvorgang fort. + + +Denke daran, deine Mittel auf die neu erstellten Adressen für die Überbrückung zu übertragen. + +### 3. Ich erhalte "Failed to Fetch"-Fehler! + +Dieser Fehler hängt damit zusammen, dass sich Ihre Wallet selbst gesperrt hat. Die Schritte, um dies zu umgehen, sind einfach: + + +- Kopiere dein Transaktions-Hash am unteren Rand der Seite, nur für den Fall. +- Aktualisiere die Seite +- Wechsle zum Register "Transaktionen". +- Trenne deine Wallet und verbinde sie erneut. +- Stelle deine Transaktion wieder her. + +### 4. Die Bestätigungen werden nicht aktualisiert. + + +Normalerweise bedeutet das, dass eine Ihrer Wallet sich selbst gesperrt hat. Kopieren Sie Ihren Transaktions-Hash am unteren Rand der Seite, aktualisieren Sie die Seite, verbinden Sie Ihre Wallet erneut und gehen Sie zum Tab "Einlösen", wo Sie die Transaktion mithilfe Ihres Transaktions-Hash wiederherstellen können. + + +### 5. Die Transaktion hat über 105 Bestätigungen und ich kann nicht einlösen! + +Die Überbrückung von ALPH zu ETH dauert etwas länger. Die Transaktion muss zwei Bedingungen erfüllen: mindestens 105 Blöcke und mindestens 112 Minuten. Wenn eine der Bedingungen nicht erfüllt ist, ist die Einlösung noch nicht möglich. Wenn das Problem weiterhin besteht, versuchen Sie die in den folgenden Lösungen vorgeschlagenen Lösungen: + +- "Problem 1. Ich habe lange genug gewartet, und es lässt mich nicht einlösen! Was soll ich tun?" +- "Problem 6. Ich erhalte einen VAA-Fehler! Und ich kann nicht einlösen." + +Wenn das nicht funktioniert, öffnen Sie hier ein Problem. + +### 6. ch erhalte einen VAA-Fehler! Und ich kann nicht einlösen. + + +Wenn Sie einen VAA-Fehler erhalten und das Warten vor dem erneuten Versuch nicht funktioniert hat, versuchen Sie die folgenden Schritte: + +- Schließen Sie die Registerkarte und öffnen Sie sie erneut. +- Verbinden Sie Ihre Wallet. +- Stellen Sie Ihre Operation im Tab "Transaktionen" wieder her +- Versuchen Sie es erneut. + +Wenn das nicht funktioniert, öffnen Sie hier ein Problem. + +### 7. Können wir nur USDT von ETH zu ALPH überbrücken? + +Nein. Sie können auch USDC, ETH, DAI, WBTC & ALPH überbrücken. + +Und wenn Sie direkt mit dem Smart Contract interagieren, können Sie alle ERC-20-Token überbrücken, die Sie möchten. + + +### 8. Ich habe ETH und/oder USDC überbrückt, und es gibt keine Liquidität in den AYIN-Pools, was kann ich tun? + +Bevor Sie ein Token überbrücken, überprüfen Sie bitte, ob ausreichend Liquidität vorhanden ist. Andernfalls müssen Sie diese Token möglicherweise zurück überbrücken. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/Best-Practices.md.drop b/i18n/de/docusaurus-plugin-content-docs/current/dapps/Best-Practices.md.drop new file mode 100644 index 00000000..aa948c51 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/Best-Practices.md.drop @@ -0,0 +1,37 @@ +--- +sidebar_position: 50 +title: Best practices +--- + +:::caution +This page is WIP until our dApps stack is more stable 🚧 +::: + +Every language has its own idioms, and Ralph is no different. It's important to +follow these idioms so that others who can read Ralph are able to understand +your code. Concise, secure and proficient code will generally follow. + +## General advice + +When writing smart contract programs, it's necessary to account for how much +storage will be used and how much computation your contract will do. +As space and computation increases, the cost of the contract rises. It's for +this reason you should aim to make the contract as simple as possible, and keep +as much space and computation off-chain as you can. + +For example, rather than storing a full document, you can store its hash, as +a proof the document exists. + +Another example is instead of storing a full sentence, you can store indices +to an external dictionary, which can then re-construct the full sentence. + +Code that interacts with money must be regarded as high risk. Any high risk +code should use many assert and approve calls within close proximity. This +keeps the high risk code in one concentrated place, making it easier to audit +for errors. + +## Safety techniques + +:::note +TODO +::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/Developing-Your-First-dApp.md.drop b/i18n/de/docusaurus-plugin-content-docs/current/dapps/Developing-Your-First-dApp.md.drop new file mode 100644 index 00000000..499a8e09 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/Developing-Your-First-dApp.md.drop @@ -0,0 +1,86 @@ +--- +sidebar_position: 40 +title: Developing your first dApp +--- + +:::caution +This page is WIP until our dApps stack is more stable 🚧 +::: + +The document segments development of smart contracts into two sections: server +and client. + +You can imagine contract interaction as being similar to the client-server +architecture of web development. The contract on the blockchain is the server, +waiting to be called. The web browser is the client, using code to call the +contract. Contracts can be called from anything, as long as it supports HTTP and +JSON. For an interactive dApp though we'll use web technologies to build an +interface which communicates with its contract(s). + +## Requirements + +There are **only two requirements** to write and deploy a dApp: + +- alephium/desktop-wallet:cheng-walletconnect +- nodejs + +and one temporary requirement until the hardfork happens: + +- alephium/alephium:1.4.x + +### Setup + +- Start the desktop wallet +- Make sure the wallet is using the testnet +- Create a new wallet +- Request testnet ALPH from the Discord or mine it + +## The pieces of a smart contract + +At its heart there is really only one piece to a smart contract, and that's the +**TxContract**. The reality is though one more component is needed to utilise it: +the **TxScript**. A way to see this relationship is the TxContract is a package / library, +and the TxScript is the program that uses it. More interesting, complex contracts +can be made from having TxContracts use other TxContracts even! In the end though +it's the TxScript that kicks off execution when it's sent in a transaction. + +It's a good idea to open the [language reference] alongside this document to +understand the semantics a bit more as we continue. If the semantics were +explained alongside everything, it would add too much new information at once to +learn. + +### TxContract + +:::note +TODO +::: + +### TxScript + +:::note +TODO +::: + +## The web browser, smart contract, and wallet triad + +:::note +TODO +::: + +### @alephium + +:::note +TODO +::: + +### WalletConnect + +:::note +TODO +::: + +### Composing them together (development and interaction) + +:::note +TODO +::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/Technical-Guide-With-A-Fullnode.md.drop b/i18n/de/docusaurus-plugin-content-docs/current/dapps/Technical-Guide-With-A-Fullnode.md.drop new file mode 100644 index 00000000..7d30a169 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/Technical-Guide-With-A-Fullnode.md.drop @@ -0,0 +1,829 @@ +--- +sidebar_position: 20 +title: Technical guide with a fullnode +--- + +:::caution +This page is WIP until our dApps stack is more stable 🚧 +::: + +This document guides you through the creation, deployment and usage of +smart contracts on Alephium mainnet. + +We will first deploy a contract which allows any user to exchange +**ALPH** for tokens. Then we will deploy a script which calls the +contract to buy tokens. + +This document is based on the [Chinese smart contract tutorial and +documentation](https://github.com/Lbqds/alephium-docs/blob/master/contract.md) +by [Lbqds](https://github.com/Lbqds). + +## Requirements + +For this tutorial you will need to have a node running locally and a +wallet. Here are the related tutorials: + +- [How to launch your node](https://github.com/alephium/alephium/wiki/Starter-Guide---How-to-Launch-your-node) +- [How to setup a wallet](https://github.com/alephium/alephium/wiki/Wallet-Guide) + +We will use a wallet named `demo-1` in this tutorial. + +## Create and deploy a token contract + +In this section we will create, build, sign and submit a contract +transaction. + +### Create a token Contract + +First, we create a token contract as shown below: + +```rust +TxContract MyToken(owner: Address, mut remain: U256) { + pub payable fn buy(from: Address, alphAmount: U256) -> () { + let tokenAmount = alphAmount * 1000 + assert!(remain >= tokenAmount) + let tokenId = selfTokenId!() + transferAlph!(from, owner, alphAmount) + transferTokenFromSelf!(from, tokenId, tokenAmount) + remain = remain - tokenAmount + } +} +``` + +This simple token contract allows users to buy tokens by paying +**ALPH** to the contract owner at a rate `1:1000`. It uses the +following built-in functions: + +- `assert!(pred)` Causes the contract execution to fail when `pred` + evaluates to `false` +- `selfTokenId!(a)` Returns the current token id which is also the + current contract id +- `transferAlph!(from, to, alphAmount)` Transfers `alphAmount` + **ALPH** from address `from` to `to`. +- `transferTokenFromSelf!(to, tokenId, tokenAmount)` Transfers + `tokenAmount` tokens of `MyToken` to address `to`. + +**Note**: The `remain` variable is not necessary but helps +understanding state variables of the contract. We will explain how the +contract state is stored later. + +### Compile a Contract + +Next we compile the contract via the full node API. + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/contracts/compile-contract' \ + -H 'Content-Type: application/json' \ + -d '{ + "code": "TxContract MyToken(owner: Address, mut remain: U256) {\n pub payable fn buy(from: Address, alphAmount: U256) -> () {\n let tokenAmount = alphAmount * 1000\n assert!(remain >= tokenAmount)\n let tokenId = selfTokenId!()\n transferAlph!(from, owner, alphAmount)\n transferTokenFromSelf!(from, tokenId, tokenAmount)\n remain = remain - tokenAmount\n }\n}" +}' +``` + +We receive the binary code of the contract as a response: + +```json +{ + "compiled": { + "type": "SimpleContractByteCode", + "bytecode": "0201402c01010204001616011343e82c1702a0011602344db117031600a0001601a7160016031602aba00116022ba101" + }, + "fields": { + "signature": "TxContract MyToken(owner:Address,mut remain:U256)", + "types": ["Address", "U256"] + }, + "functions": [ + { + "name": "buy", + "signature": "pub payable buy(from:Address,alphAmount:U256)->()", + "argTypes": ["Address", "U256"], + "returnTypes": [] + } + ], + "events": [] +} +``` + +### Build an unsigned contract transaction + +Now we need to create the contract transaction. First we obtain the +publicKey of the address currently in use. We use address +`1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG`. + +```bash +curl 'http://127.0.0.1:12973/wallets/demo-1/addresses/1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG' +``` + +We obtain the following response: + +```json +{ + "address": "1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG", + "publicKey": "029347489f53e7050e5c7edb5ef305d33316772836370750ff747eb6dc3f5f47f1", + "group": 3, + "path": "m/44'/1234'/0'/0/0" +} +``` + +Then we build the contract transaction. + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/contracts/unsigned-tx/build-contract' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromPublicKey": "029347489f53e7050e5c7edb5ef305d33316772836370750ff747eb6dc3f5f47f1", + "bytecode": "0201402c01010204001616011343e82c1702a0011602344db117031600a0001601a7160016031602aba00116022ba101", + "initialFields": [{"type": "Address", "value": "1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG"}, {"type": "U256", "value": "10000000000000000000000000000"}], + "issueTokenAmount": "10000000000000000000000000000" +}' +``` + +The parameters are: + +- `fromPublicKey` Public key from the address currently in use +- `bytecode` Contract binary code +- `initialFields` List of initial state variables passed to the + contract constructor +- `issueTokenAmount` The total number of tokens issued by the contract + +We get the following response: + +```json +{ + "group": 3, + "unsignedTx": "000401010101000000081500bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e313c1e8d4a51000a21440300201402c01010204001616011343e82c1702a0011602344db117031600a0001601a7160016031602aba00116022ba101144031020400bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e302c8204fce5e3e2502611000000013c8204fce5e3e25026110000000ae1880013880c1174876e80001adcf9eb78826cef24403641dea9e899dbbcfc7007c21e0ff46a76189d04a830986eb7c9e00029347489f53e7050e5c7edb5ef305d33316772836370750ff747eb6dc3f5f47f100", + "gasAmount": 57222, + "gasPrice": "100000000000", + "txId": "a8fa7a28618fd361fc7d8f2ad51c772ef561406ffe4a8b4fe1a5e68e84e2a4e2", + "contractAddress": "2AKg3eFfeBANTSc1RPH4FUho8KrrzMdKMCiXeBc2X3taP" +} +``` + +### Sign a contract + +Next, we sign the previously obtained transaction hash. + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/wallets/demo-1/sign' \ + -H 'Content-Type: application/json' \ + -d '{ + "data": "a8fa7a28618fd361fc7d8f2ad51c772ef561406ffe4a8b4fe1a5e68e84e2a4e2" +}' +``` + +The response contains the signature. + +```json +{ + "signature": "77373aeac77ca269169faada8a2f3f60301a4a0fe0f0a5d96d0c8c5551a176f140e7526662f7dbbe58b3294fcc63eac269f74e289da62c95ab8149728eb317af" +} +``` + +### Submit a contract + +Finally we submit the contract transaction to the Alephium network. + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/transactions/submit' \ + -H 'Content-Type: application/json' \ + -d '{ + "unsignedTx": "000401010101000000081500bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e313c1e8d4a51000a21440300201402c01010204001616011343e82c1702a0011602344db117031600a0001601a7160016031602aba00116022ba101144031020400bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e302c8204fce5e3e2502611000000013c8204fce5e3e25026110000000ae1880013880c1174876e80001adcf9eb757a0fc312c490625510071acc022635fa53f4649813549f0669095473a7a7d7600029347489f53e7050e5c7edb5ef305d33316772836370750ff747eb6dc3f5f47f100", + "signature": "77373aeac77ca269169faada8a2f3f60301a4a0fe0f0a5d96d0c8c5551a176f140e7526662f7dbbe58b3294fcc63eac269f74e289da62c95ab8149728eb317af" +}' +``` + +If the request is valid, a response similar to the following is +returned. + +```json +{ + "txId": "a8fa7a28618fd361fc7d8f2ad51c772ef561406ffe4a8b4fe1a5e68e84e2a4e2", + "fromGroup": 3, + "toGroup": 3 +} +``` + +In order to understand the contract creation process more clearly, +let's take a look at the specific content of the above tx. Currently +there is no friendly interface to examine the content of a transaction +so we need fetch the block containing the transaction via the node +API. (You can obtain the block hash of a transaction either via the +explorer or the endpoint `GET /transaction/status?txId={txId}`) + +```bash +curl 'http://127.0.0.1:12973/blockflow/blocks/08041abb8bc8d06c6b840ceb345a4f8953a9fbf9c32c08be34a63c93fd8dfcdf \ +``` + +We obtain a list of transactions (here we only show 2 out of 5 +transactions for readability): + +```json +{ + "hash": "08041abb8bc8d06c6b840ceb345a4f8953a9fbf9c32c08be34a63c93fd8dfcdf", + "timestamp": 1652689725997, + "chainFrom": 3, + "chainTo": 3, + "height": 12, + "deps": [ + "40d58f8563a6de46fa0efda4670aeb43a451b349d8af1403b341413d5010c0e0", + "30b0c63cf62aa6cdc1c72e8fc2f31703b8318654b65acaaece48ee503da87845", + "be73f0505c81184bc4691ee1ffeafaf7fbb091f412d500fc882aeecc8929e1fa", + "8f8ddaeddfd21b003ad39dfd1d7c4593d7f63d2951aecd16de8a749edf26c23c", + "6d258ca53dbe960adf19f899248e1d60c83ac65aac323a4ff195541b84ccfb4d", + "4862925410e6951836bd8808b94a8492ca5d718ec642d375f170e5b3b8ca51ce", + "c5a260997400e9512b6e1ca41c18653580e39ecdbd33c26f9ee971b6f2bb96cf" + ], + "transactions": [ + { + "unsigned": { + "txId": "a8fa7a28618fd361fc7d8f2ad51c772ef561406ffe4a8b4fe1a5e68e84e2a4e2", + "version": 0, + "networkId": 4, + "scriptOpt": "010101000000081500bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e313c1e8d4a51000a21440300201402c01010204001616011343e82c1702a0011602344db117031600a0001601a7160016031602aba00116022ba101144031020400bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e302c8204fce5e3e2502611000000013c8204fce5e3e25026110000000ae18", + "gasAmount": 57222, + "gasPrice": "100000000000", + "inputs": [ + { + "outputRef": { + "hint": -1378902345, + "key": "8826cef24403641dea9e899dbbcfc7007c21e0ff46a76189d04a830986eb7c9e" + }, + "unlockScript": "00029347489f53e7050e5c7edb5ef305d33316772836370750ff747eb6dc3f5f47f1" + } + ], + "fixedOutputs": [] + }, + "scriptExecutionOk": true, + "contractInputs": [], + "generatedOutputs": [ + { + "type": "ContractOutput", + "hint": 585739684, + "key": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "alphAmount": "1000000000000", + "address": "2AKg3eFfeBANTSc1RPH4FUho8KrrzMdKMCiXeBc2X3taP", + "tokens": [ + { + "id": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "amount": "10000000000000000000000000000" + } + ] + }, + { + "type": "AssetOutput", + "hint": -1378902345, + "key": "1d4b4f18b41e34e64d9e8fe6ee038ef8acaa8763f7b276b3b157120d393857bd", + "alphAmount": "6499975998000000000000", + "address": "1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG", + "tokens": [], + "lockTime": 0, + "additionalData": "" + } + ], + "inputSignatures": [ + "1def939243491d681b68790a2c0d906c50a3f3bef453cc47ca6822b669d6437c565af0ba9d7cd191cd99144f8fa07fe07effe6c3b21d4a9e9898d1a4eea3ae82" + ], + "scriptSignatures": [] + }, + { + "unsigned": { + "txId": "ee023aea5778fd390cc16dc2a706647c3490cf888ed90cfe4505257863e7fb31", + "version": 0, + "networkId": 4, + "gasAmount": 20000, + "gasPrice": "1000000000", + "inputs": [], + "fixedOutputs": [ + { + "hint": -11128529, + "key": "e895ec4b15e4b50e3c21e04f23dfa5e3ea424e8db92bb10d52c10b3761905665", + "alphAmount": "1879000000000000000", + "address": "17UjAgeAVixkYksn5snhQ4k1CpGAoBJmdsBNGdyHWqm4M", + "tokens": [], + "lockTime": 1652690325997, + "additionalData": "030300000180cbfbea2d" + } + ] + }, + "scriptExecutionOk": true, + "contractInputs": [], + "generatedOutputs": [], + "inputSignatures": [], + "scriptSignatures": [] + } + ], + "nonce": "c55b55079d5eb165ee7cc093ffde19f6867090621d16ef61", + "version": 0, + "depStateHash": "e500d692f7fe6daa400b81d4f78b300f78fbf926a20c03b51ada40b37f441ded", + "txsHash": "72913f92b28be354026409f9b7c0d11e2b763c99de5bb0eeb1bd9a6b92aabee8", + "target": "20ffffff" +} +``` + +We only focus on the transaction with id +`a8fa7a28618fd361fc7d8f2ad51c772ef561406ffe4a8b4fe1a5e68e84e2a4e2`. + +```json +{ + "unsigned": { + "txId": "a8fa7a28618fd361fc7d8f2ad51c772ef561406ffe4a8b4fe1a5e68e84e2a4e2", + "version": 0, + "networkId": 4, + "scriptOpt": "010101000000081500bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e313c1e8d4a51000a21440300201402c01010204001616011343e82c1702a0011602344db117031600a0001601a7160016031602aba00116022ba101144031020400bae81fae7fc67d18210b938e31e12d43c48cd9f89668957c7a5fd3e0e57f36e302c8204fce5e3e2502611000000013c8204fce5e3e25026110000000ae18", + "gasAmount": 57222, + "gasPrice": "100000000000", + "inputs": [ + { + "outputRef": { + "hint": -1378902345, + "key": "8826cef24403641dea9e899dbbcfc7007c21e0ff46a76189d04a830986eb7c9e" + }, + "unlockScript": "00029347489f53e7050e5c7edb5ef305d33316772836370750ff747eb6dc3f5f47f1" + } + ], + "fixedOutputs": [] + }, + "scriptExecutionOk": true, + "contractInputs": [], + "generatedOutputs": [ + { + "type": "ContractOutput", + "hint": 585739684, + "key": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "alphAmount": "1000000000000", + "address": "2AKg3eFfeBANTSc1RPH4FUho8KrrzMdKMCiXeBc2X3taP", + "tokens": [ + { + "id": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "amount": "10000000000000000000000000000" + } + ] + }, + { + "type": "AssetOutput", + "hint": -1378902345, + "key": "1d4b4f18b41e34e64d9e8fe6ee038ef8acaa8763f7b276b3b157120d393857bd", + "alphAmount": "6499975998000000000000", + "address": "1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG", + "tokens": [], + "lockTime": 0, + "additionalData": "" + } + ], + "inputSignatures": [ + "1def939243491d681b68790a2c0d906c50a3f3bef453cc47ca6822b669d6437c565af0ba9d7cd191cd99144f8fa07fe07effe6c3b21d4a9e9898d1a4eea3ae82" + ], + "scriptSignatures": [] +} +``` + +This transaction has one input and two outputs. Below is the +description of the some fields: + +- `outputRef` pointer to UTXO +- `key` UTXO hash +- `type` the type of the tx output, `ContractOutput` or `AssetOutput` +- `address` base58 encoding of the `contract` or `asset` address +- `alphAmount` the amount of ALPH owned by the address +- `tokens` list of tokens owned by the address +- `tokens.id` contract id +- `tokens.amount` the amount of tokens owned + +The first output is the contract we just created. We see that the +contract address owns `10000000000000000000000000000` tokens which is +exactly the `issueTokenAmount` we previously defined. + +The second output is the UTXO output of the transaction submitted by +our address `1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG`. This +address doesn't own any tokens. + +## Create and deploy a script + +Now that the contract has been successfully created, we will deploy a +`TxScript` which calls the `Mytoken.buy` method to obtain tokens by +paying **ALPH** to the contract. For this example, we will pay using +address `1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h` which is +different than the one used to create the contract. + +If you also want to pay with an address different than the one used to +submit the contract, please make sure that your address belongs to the +same group as the contract. You can obtain the contract group by +checking the `chainFrom` field of its transaction block. In our +example, the contract is in group 3, but it might be in a different +group for you. You can verify the group of an address at endpoint `GET addresses/{address}/group`. If it is not the case, you can use +`POST/wallets/{wallet_name}/derive-next-address` until you obtain an +address in the correct group. As new addresses are initialized with +balance `0`, you should transfer some **ALPH** to this new +address. Finally, change your active address at endpoint `POST wallets/{wallet_name}/change-active-address`. + +### Create a TxScript + +We first create the `TxScript` to buy some tokens. + +```rust +TxScript Main { + pub payable fn main() -> () { + approveAlph!(@1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h, 1000000000000000000) + let contract = MyToken(#e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c) + contract.buy(@1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h, 1000000000000000000) + } +} +``` + +Here is a brief explanation of this code: + +- `approveAlph!(address, amount)` authorizes the specified amount of `ALPH` from the address to be used in the script. +- The contract is loaded by its `id` +- Call `MyToken.buy` to buy 1000 tokens for 1 **ALPH** + +The next steps are very similar to the previous sections. We will +compile, build, sign and submit the script. + +### Compile a Script + +We query the node API to compile the script to binary code. **Make +sure you append the source code of the `MyToken` contract after your +`TxScript` code.** + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/contracts/compile-script' \ + -H 'Content-Type: application/json' \ + -d '{ + "code": "TxScript Main {\n pub payable fn main() -> () {\n approveAlph!(@1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h, 1000000000000000000)\n let contract = MyToken(#e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c)\n contract.buy(@1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h, 1000000000000000000)\n }\n}\nTxContract MyToken(owner: Address, mut remain: U256) {\n pub payable fn buy(from: Address, alphAmount: U256) -> () {\n let tokenAmount = alphAmount * 1000\n assert!(remain >= tokenAmount)\n let tokenId = selfTokenId!()\n transferAlph!(from, owner, alphAmount)\n transferTokenFromSelf!(from, tokenId, tokenAmount)\n remain = remain - tokenAmount\n }\n}" +}' +``` + +A response similar to the following will be returned: + +```json +{ + "compiled": { + "type": "SimpleScriptByteCode", + "bytecode": "010101000100091500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a7640000a2144020e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c17001500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a764000016000100" + }, + "functions": [ + { + "name": "main", + "signature": "pub payable main()->()", + "argTypes": [], + "returnTypes": [] + } + ], + "events": [] +} +``` + +### Build an unsigned script transaction + +We first obtain the publicKey of the active address: + +```bash +curl 'http://127.0.0.1:12973/wallets/demo-1/addresses/1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h' +``` + +We get a response similar to: + +```json +{ + "address": "1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h", + "publicKey": "0203ff28b14840ee75f8e624ae4f35ae26c67e4e835975bbaac9a2046e622358d5", + "group": 3, + "path": "m/44'/1234'/0'/0/18" +} +``` + +Then we build the unsigned transaction: + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/contracts/unsigned-tx/build-script' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromPublicKey": "0203ff28b14840ee75f8e624ae4f35ae26c67e4e835975bbaac9a2046e622358d5", + "bytecode": "010101000100091500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a7640000a2144020e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c17001500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a764000016000100" +}' +``` + +We obtain the following response: + +```json +{ + "unsignedTx": "000401010101000100091500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a7640000a2144020e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c17001500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a76400001600010080013880c1174876e80001174aa36169adea3987f239001301642efa3e74c5ec1f1f185d1ab24ca2032f8bbfd267c7000203ff28b14840ee75f8e624ae4f35ae26c67e4e835975bbaac9a2046e622358d500", + "gasAmount": 42082, + "gasPrice": "100000000000", + "txId": "2fe9100b8ede85114a707314f9416ada97735b68a9db9693c7d7bbbf9326daf2", + "group": 3 +} +``` + +### Sign a script + +Next, we sign the transaction hash: + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/wallets/demo-1/sign' \ + -H 'Content-Type: application/json' \ + -d '{ + "data": "2fe9100b8ede85114a707314f9416ada97735b68a9db9693c7d7bbbf9326daf2" +}' +``` + +And we receive the signature: + +```json +{ + "signature": "df4b2e61c81304b3f3d34dd1f193010ff0d82abe53edd403c636823b1f71247a4908e963cf7c89284a30315d89ec72b3637cf50f023a6f905cd0c4e3d3c9941c" +} +``` + +### Submit a script + +Finally we can submit the transaction. + +```bash +curl -X 'POST' \ + 'http://127.0.0.1:12973/transactions/submit' \ + -H 'Content-Type: application/json' \ + -d '{ + "unsignedTx": "000401010101000100091500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a7640000a2144020e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c17001500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a76400001600010080013880c1174876e80001174aa36169adea3987f239001301642efa3e74c5ec1f1f185d1ab24ca2032f8bbfd267c7000203ff28b14840ee75f8e624ae4f35ae26c67e4e835975bbaac9a2046e622358d500", + "signature": "df4b2e61c81304b3f3d34dd1f193010ff0d82abe53edd403c636823b1f71247a4908e963cf7c89284a30315d89ec72b3637cf50f023a6f905cd0c4e3d3c9941c" +}' +``` + +And we receive the `txId` and groups information: + +```json +{ + "txId": "2fe9100b8ede85114a707314f9416ada97735b68a9db9693c7d7bbbf9326daf2", + "fromGroup": 3, + "toGroup": 3 +} +``` + +Again, we can find the transaction on the mainnet by query the block +containing the transaction. We observe the following transaction +content: + +```json +{ + "hash": "0f13b84553050263b173f3aa00386d3cc22863080d4b8642b4dcdfea15af0e6f", + "timestamp": 1652700335564, + "chainFrom": 3, + "chainTo": 3, + "height": 13, + "deps": [ + "40d58f8563a6de46fa0efda4670aeb43a451b349d8af1403b341413d5010c0e0", + "30b0c63cf62aa6cdc1c72e8fc2f31703b8318654b65acaaece48ee503da87845", + "be73f0505c81184bc4691ee1ffeafaf7fbb091f412d500fc882aeecc8929e1fa", + "8f8ddaeddfd21b003ad39dfd1d7c4593d7f63d2951aecd16de8a749edf26c23c", + "6d258ca53dbe960adf19f899248e1d60c83ac65aac323a4ff195541b84ccfb4d", + "4862925410e6951836bd8808b94a8492ca5d718ec642d375f170e5b3b8ca51ce", + "08041abb8bc8d06c6b840ceb345a4f8953a9fbf9c32c08be34a63c93fd8dfcdf" + ], + "transactions": [ + { + "unsigned": { + "txId": "2fe9100b8ede85114a707314f9416ada97735b68a9db9693c7d7bbbf9326daf2", + "version": 0, + "networkId": 4, + "scriptOpt": "010101000100091500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a7640000a2144020e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c17001500a095abc2f02eaf33573e17d9c5f6946da5903459f4e752146b847b3831a339c613c40de0b6b3a764000016000100", + "gasAmount": 42082, + "gasPrice": "100000000000", + "inputs": [ + { + "outputRef": { + "hint": 390767457, + "key": "69adea3987f239001301642efa3e74c5ec1f1f185d1ab24ca2032f8bbfd267c7" + }, + "unlockScript": "000203ff28b14840ee75f8e624ae4f35ae26c67e4e835975bbaac9a2046e622358d5" + } + ], + "fixedOutputs": [] + }, + "scriptExecutionOk": true, + "contractInputs": [ + { + "hint": 585739684, + "key": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c" + } + ], + "generatedOutputs": [ + { + "type": "AssetOutput", + "hint": -1378902345, + "key": "68e0b6a089ce4f6abd47d818e9accf5a88ac7714fef4eaa5b9a9d2099e5ad726", + "alphAmount": "1000000000000000000", + "address": "1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG", + "tokens": [], + "lockTime": 0, + "additionalData": "" + }, + { + "type": "AssetOutput", + "hint": 390767457, + "key": "a11564f890f1cd3108834e0664dc1f97424cb7e1be4b68982a921a8fa2099846", + "alphAmount": "498992000000000000000", + "address": "1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h", + "tokens": [ + { + "id": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "amount": "1000000000000000000000" + } + ], + "lockTime": 0, + "additionalData": "" + }, + { + "type": "ContractOutput", + "hint": 585739684, + "key": "9f8296350b307d98914e54d748d1cef42293c277f57d3ad98b309c28edc5cdf8", + "alphAmount": "1000000000000", + "address": "2AKg3eFfeBANTSc1RPH4FUho8KrrzMdKMCiXeBc2X3taP", + "tokens": [ + { + "id": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "amount": "9999999000000000000000000000" + } + ] + } + ], + "inputSignatures": [ + "df4b2e61c81304b3f3d34dd1f193010ff0d82abe53edd403c636823b1f71247a4908e963cf7c89284a30315d89ec72b3637cf50f023a6f905cd0c4e3d3c9941c" + ], + "scriptSignatures": [] + }, + { + "unsigned": { + "txId": "d9468e7b33300cb2824147166c5ee441e3865f4bc23563e54aff117810a290fa", + "version": 0, + "networkId": 4, + "gasAmount": 20000, + "gasPrice": "1000000000", + "inputs": [], + "fixedOutputs": [ + { + "hint": 17786109, + "key": "e19b512d57dab97c48d2352485abe76c6707c32dc7f308e4ca0051f40f2d2228", + "alphAmount": "1879000000000000000", + "address": "19Sxx6RVyenkDovv6LiMW2ymxP2UfxmvGZGhmNcxq5jqX", + "tokens": [], + "lockTime": 1652700935564, + "additionalData": "030300000180cc9dcdcc" + } + ] + }, + "scriptExecutionOk": true, + "contractInputs": [], + "generatedOutputs": [], + "inputSignatures": [], + "scriptSignatures": [] + } + ], + "nonce": "5c694b2fc6f235ff20bc02661ab3724b06e2d3ae92c97d47", + "version": 0, + "depStateHash": "74e3cb156bebf185dee4c3160841d1cfc812bf17be1a81744fbca18a0fefff79", + "txsHash": "73a5c883b253ef17faa935fe8edacf1ba9690f2d543dd206042b69e06170e631", + "target": "20ffffff" +} +``` + +We can see that there is a contract input, with the `outputRef.key` +pointing to the contract we created earlier. + +```json +"contractInputs": [ + { + "hint": 585739684, + "key": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c" + } +] +``` + +This time we have three outputs: two assets and a contract. The first +output is the new UTXO for the 1 **ALPH** payed to the contract owner. + +```json +{ + "type": "AssetOutput", + "hint": -1378902345, + "key": "68e0b6a089ce4f6abd47d818e9accf5a88ac7714fef4eaa5b9a9d2099e5ad726", + "alphAmount": "1000000000000000000", + "address": "1Dac89UqoyQ7NPvuoX5cnYDp44UQDDEo4iMrYQwToqiRG", + "tokens": [], + "lockTime": 0, + "additionalData": "" +} +``` + +The second output is a new UTXO equivalent to the change of the +consumed UTXOs for the payment to the contract owner. Additionnally, +The first item in the `tokens` list corresponds to the tokens we just +bought! The id corresponds to the one of our contract. + +```json +{ + "type": "AssetOutput", + "hint": 390767457, + "key": "a11564f890f1cd3108834e0664dc1f97424cb7e1be4b68982a921a8fa2099846", + "alphAmount": "498992000000000000000", + "address": "1Borbt3zgchtQyrTrLxhUeAknP4cxYqYkNQUrth5V7U6h", + "tokens": [ + { + "id": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "amount": "1000000000000000000000" + } + ], + "lockTime": 0, + "additionalData": "" +} +``` + +The third output is the contract after the exchange. We observe that +the amount of tokens changed from `10000000000000000000000000000` to +`9999999000000000000000000000`. The difference is equivalent to the +amount of tokens we bought. + +```json +{ + "type": "ContractOutput", + "hint": 585739684, + "key": "9f8296350b307d98914e54d748d1cef42293c277f57d3ad98b309c28edc5cdf8", + "alphAmount": "1000000000000", + "address": "2AKg3eFfeBANTSc1RPH4FUho8KrrzMdKMCiXeBc2X3taP", + "tokens": [ + { + "id": "e847a0a9212bcdc07ddc1b74526c0523f11042e13330c9d889e4bc16f74e084c", + "amount": "9999999000000000000000000000" + } + ] +} +``` + +Congratulations! You have deployed and used your first smart contract +on Alephium! 🚀 + +## Contract State + +From the previous sections, we can see that: + +- When a contract is created, a contract output will be generated + regardless of whether a token is issued or not. If a token is + issued, there will be an initial number of tokens in the output + tokens list. +- Calling the contract will consume the contract output and generate a + new contract output. In the above example, we can see that the + contract output generated when the contract is created is consumed, + and then a new contract output is generated. +- Calling the contract may also modify the state of the contract. In + the above example, it will be modified after calling `MyToken.buy`. + +Let's take a look at what the contract state specifically includes: + +```scala +final case class ContractState private ( + codeHash: Hash, + initialStateHash: Hash, + fields: AVector[Val], + contractOutputRef: ContractOutputRef +) +``` + +where the fields are: + +- `codeHash`: The hash of the contract code. +- `initialStateHash`: The hash of the initial contract state +- `fields`: Vector of state values. `AVector(owner, remain)` in the + `MyToken` example. +- `contractOutputRef`: Pointer to contract output + +The process of calling and changing the state of the contract is +roughly as follows: + +1. Load the contract state from the WorldState, which is a storage for + UTXOs, smart contracts state and code. +2. Load contract output pointed by `contractOutputRef` according to + the contract state (executed when method is payable) +3. When the contract execution involves modifications of the contract + state, the contract state in WorldState will be updated +4. If the contract generates a new contract output, the contract state + will be updated and the old contract output will be deleted + +In addition, we will briefly mention the errors and solutions that may +be encountered when creating and calling contracts: + +- NotEnoughBalance: This can only be solved by obtaining mining + rewards or transfers by others. +- OutOfGas: The default gas is relatively small and it is usually not + enough when creating and calling contracts, so it is generally + necessary to manually specify the gas consumed. +- AmountIsDustOrZero: In order to avoid being attacked, the system + will reject outputs with too small amount. If you want to know more, + please refer to [here](misc/On-dust-outputs-and-state-explosion.md). + +Interested people can try to create various contracts on the mainnet +and migrate ETH applications to Alephium. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/additional-resources.md.drop b/i18n/de/docusaurus-plugin-content-docs/current/dapps/additional-resources.md.drop new file mode 100644 index 00000000..d04d6d85 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/additional-resources.md.drop @@ -0,0 +1,9 @@ +--- +sidebar_position: 70 +title: Additional Resources +sidebar_label: Additional resources +--- + +:::caution +Some of the following links refer to specific lines of code, which might not correspond to the correct ones, as the source code changes. We do our best to keep our wiki up to date with the latest changes of our projects. Thank you for understanding! +::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/alephium-web3.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/alephium-web3.md new file mode 100644 index 00000000..77d16619 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/alephium-web3.md @@ -0,0 +1,584 @@ +--- +sidebar_position: 25 +title: Web3 SDK +sidebar_label: Web3 SDK +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Installation + +``` +npm install --save @alephium/web3 +``` + +## Mit Alephium verbinden + +Der `NodeProvider` ist eine Abstraktion einer Verbindung zum Alephium-Netzwerk. Sie können einen `NodeProvider` erstellen, indem Sie: + +```typescript +const nodeProvider = new NodeProvider('http://localhost:22973') +``` + +Oder geben Sie einen `API_KEY` an, wenn Sie `alephium.api.api-key` in Ihrer Konfigurationsdatei für den Full Node haben: + +```typescript +const API_KEY = // alephium.api.api-key aus Ihrer Konfiguration des Full Nodes +const nodeProvider = new NodeProvider('http://localhost:22973', API_KEY) +``` + +Manchmal ist es praktisch, einen globalen `NodeProvider` für Ihr Projekt einzurichten: + +```typescript +web3.setCurrentNodeProvider() +``` + +## Abfragen der Blockchain + +Sobald Sie einen `NodeProvider` haben, besteht eine Verbindung zur Blockchain, die Sie verwenden können, um den aktuellen Vertragszustand abzufragen, historische Vertragsereignisse abzurufen, bereitgestellte Verträge nachzuschlagen und so weiter. + +```typescript +// Erhalten Sie die Blockchain-Höhe aus dem angegebenen Kettenindex +await nodeProvider.blockflow.getBlockflowChainInfo({ + fromGroup: 0, + toGroup: 0 +}) +// { currentHeight: 315 } + +// Erhalten Sie den Block aus dem angegebenen Blockhash +await nodeProvider.blockflow.getBlockflowBlocksBlockHash('1ccfe845988ebf878384dd2dc9e55920261566c2ad9143963180222059ffd3b0') +// { +// hash: '1ccfe845988ebf878384dd2dc9e55920261566c2ad9143963180222059ffd3b0', +// timestamp: 1665207807876, +// chainFrom: 0, +// chainTo: 0, +// height: 315, +// deps: [ +// '5e9209fbf2b4c656b136933684b8606382575f16795ddc7a6317c5d4b7e378c5', +// 'b5d69f03d4d0eea5a4c7e0bc0e2e8c5a8f99306050d641b599991b441ea0f9ea', +// 'f344b3dd45f39d62cfd200cfa3312c080018102908787c5565b8c8af3647368f', +// 'fa359ce0b5accb1584cd280ae3c32f210424a9fd32cb736b6cdfe64882651010', +// '8bc7d94ddfc66129049862e501ff5d5042e1e978b1a51d28e238321444a91071', +// '5896ee3cbc8c4f4432a0b221039113061b6cf7eeb794b25758d247120d0df712', +// 'fc312b0c04a0eeb0767ec98137b740047d7c5e8f64463531828b7015cbeaeaa3' +// ], +// transactions: [ +// { +// unsigned: [Object], +// scriptExecutionOk: true, +// contractInputs: [], +// generatedOutputs: [], +// inputSignatures: [], +// scriptSignatures: [] +// } +// ], +// nonce: '5da513de7183d7eb1a90b46c4ffe6f7ae4fdf012f0018f41', +// version: 0, +// depStateHash: '2edccc3e717d38a6564fb970f6714f0c00c074226b2cb1ee6272781d3c9bc870', +// txsHash: '738e879791e0c164a5a12b658e2b37e65ed9c415c2e152656c8469273f775f5a', +// target: '20ffffff' +// } + +// Erhalten Sie den Transaktionsstatus +await nodeProvider.transactions.getTransactionsStatus({ + txId: 'f33da0d8f4c00d68e2d5818cb9617219a1108b801f387fc8d1595287e4dbf2aa' +}) +// { +// type: 'Confirmed', +// blockHash: '47c95e02a7d7ca442ee1849d76a5987c7b72ddcad0b05e9f01df4bc4878f5980', +// txIndex: 0, +// chainConfirmations: 295, +// fromGroupConfirmations: 295, +// toGroupConfirmations: 295 +// } + +// Erhalten Sie das Guthaben +await nodeProvider.addresses.getAddressesAddressBalance('1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH') +// { +// balance: '999972904436900000000000', +// balanceHint: '999972.9044369 ALPH', +// lockedBalance: '0', +// lockedBalanceHint: '0 ALPH', +// tokenBalances: [ +// { +// id: 'ee682f8182f56b55a36a7f916a901685752e00d0e4b90de073e6658156ae82a9', +// amount: '10000000000000000000' +// } +// ], +// utxoNum: 1 +// } +``` + +## In die Blockchain schreiben + +Transaktionen werden verwendet, um den Zustand der Blockchain zu ändern. Jede Transaktion muss mit einem privaten Schlüssel signiert werden, was über den `SignerProvider` erfolgen kann. Und es gibt zwei `SignerProvider` in `alephium/web3-wallet`. + +### Web3 Wallet installieren + +``` +npm install --save @alephium/web3-wallet +``` + +:::note +Beide Wallets werden für die Entwicklung und Bereitstellung von Verträgen verwendet. Bitte verwenden Sie diese nicht, um eine große Menge an Token zu speichern. +::: + +### Node Wallet + +Bitte folge dieser [Anleitung](/wallet/node-wallet-guide) um eine Full Node Wallet zu erstellen. + +```typescript +// Erstellen Sie eine Node-Wallet mit dem Wallet-Namen. +const nodeWallet = new NodeWallet('alephium-web3-test-only-wallet', nodeProvider) + +// Entsperren Sie die Wallet mit dem Passwort +await nodeWallet.unlock('alph') + +// Erhalten Sie Konten +await nodeWallet.getAccounts() +// [ +// { +// publicKey: '0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0', +// address: '1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH', +// group: 0 +// } +// ] + +// Übertragen Sie 1 ALPH an 15Z54erRksUHb7qxegcKN5DePMv96tXdc1jW26fW3REwT +await nodeWallet.signAndSubmitTransferTx({ + signerAddress: '1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH', + destinations: [{ + address: '15Z54erRksUHb7qxegcKN5DePMv96tXdc1jW26fW3REwT', + attoAlphAmount: 10n ** 18n, + }] +}) +// { +// txId: '7d11b0e88f0158cdd94fcf4e7af04a76be1101293a50050523f72422a9269f36', +// fromGroup: 0, +// toGroup: 0 +// } + +// Sperren Sie die Wallet +await nodeWallet.lock() +``` + +### PrivateKeyWallet + +```typescript +// +Erstellen Sie eine PrivateKeyWallet aus dem privaten Schlüssel +const wallet = new PrivateKeyWallet('a642942e67258589cd2b1822c631506632db5a12aabcf413604e785300d762a5', undefined, nodeProvider) + +// Erstellen Sie eine PrivateKeyWallet aus Mnemonic und Gruppe; hier wird ein Konto in Gruppe 0 erstellt +const wallet = PrivateKeyWallet.FromMnemonicWithGroup( + 'vault alarm sad mass witness property virus style good flower rice alpha viable evidence run glare pretty scout evil judge enroll refuse another lava', + 0, + undefined, + undefined, + undefined, + nodeProvider +) +console.log(wallet.account) +// { +// address: '1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH', +// publicKey: '0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0', +// group: 0 +// } + +// Übertragen Sie 1 ALPH an 15Z54erRksUHb7qxegcKN5DePMv96tXdc1jW26fW3REwT +await wallet.signAndSubmitTransferTx({ + signerAddress: wallet.account.address, + destinations: [{ + address: '15Z54erRksUHb7qxegcKN5DePMv96tXdc1jW26fW3REwT', + attoAlphAmount: 10n ** 18n + }] +}) +// { +// txId: '9a23eab3796a56f538a4574d617b667fb9187721c8df9f39ac89d878cb9755a0', +// fromGroup: 0, +// toGroup: 0 +// } +``` + +## Contracts + +Ähnlich wie bei Ethereum ist ein Contract eine Abstraktion von Programmcode, der auf der Alephium-Blockchain existiert. Verwenden wir das folgende Beispiel, um zu veranschaulichen, wie man einen Contract testet, bereitstellt und aufruft. Bitte folgen Sie dieser [Anleitung](/dapps/getting-started), um ein Projekt zu erstellen. + +### Teste den Contract +#### Unit Tests + +Das SDK bietet Funktionen für Unittests, die den Contract wie eine normale Transaktion aufrufen. Anstatt jedoch den Blockchain-Zustand zu ändern, gibt es den neuen Zustand des Vertrags, Transaktionsausgaben und Ereignisse zurück. + +```typescript +web3.setCurrentNodeProvider('http://localhost:22973') +const wallet = new PrivateKeyWallet('a642942e67258589cd2b1822c631506632db5a12aabcf413604e785300d762a5') +// Bauen Sie zuerst das Projekt +await Project.build() + +// Testen Sie die withdraw-Methode des TokenFaucet-Vertrags; sie wird den Blockchain-Zustand NICHT ändern +const testContractAddress = randomContractAddress() +// Der TokenFaucet wurde im Einführungshandbuch generiert +const result = await TokenFaucet.tests.withdraw({ + address: testContractAddress, + // Anfangszustand des Testvertrags + initialFields: { + symbol: Buffer.from('TF', 'utf8').toString('hex'), + name: Buffer.from('TokenFaucet', 'utf8').toString('hex'), + decimals: 18n, + supply: 10n ** 18n, + balance: 10n + }, + // Vermögenswerte, die dem Testvertrag vor einem Test gehören + initialAsset: { + alphAmount: 10n ** 18n, + tokens: [{ + id: binToHex(contractIdFromAddress(testContractAddress)), + amount: 10n + }] + }, + // Argumente, um die Ziel-Funktion des Testvertrags zu testen + testArgs: { amount: 1n }, + // Vermögenswerte, die dem Aufrufer der Funktion gehören + inputAssets: [{ + address: wallet.account.address, + asset: { alphAmount: 10n ** 18n } + }] +}) + +const contractState = result.contracts[0] as TokenFaucetTypes.State +expect(contractState.address).toEqual(testContractAddress) +``` + +Ein vollständiges Beispiel finden Sie in unserem [`Alephium-NextJS-Template`](https://github.com/alephium/nextjs-template/blob/main/test/unit/token.test.ts) + +#### Integrations-Tests + +Neben den Unittests können auch Integrationstests durchgeführt werden. Seien Sie vorsichtig, da diese den Blockchain-Zustand ändern können. + +```typescript +web3.setCurrentNodeProvider('http://127.0.0.1:22973', undefined, fetch) +await Project.build() + +const accounts = signer.getAccounts() +const account = accounts[0] +const testAddress = account.address +await signer.setSelectedAccount(testAddress) +const testGroup = account.group + +const deployed = deployments.getDeployedContractResult(testGroup, 'TokenFaucet') +const tokenId = deployed.contractInstance.contractId +const tokenAddress = deployed.contractInstance.address + +const faucet = TokenFaucet.at(tokenAddress) +const initialState = await faucet.fetchState() +const initialBalance = initialState.fields.balance + +// Rufen Sie die withdraw-Funktion 10-mal auf +for (let i = 0; i < 10; i++) { + await Withdraw.execute(signer, { + initialFields: { token: tokenId, amount: 1n }, + attoAlphAmount: DUST_AMOUNT * 2n + }) + + //!!! Der Blockchain-Zustand wurde verändert !!! + const newState = await faucet.fetchState() + const newBalance = newState.fields.balance + expect(newBalance).toEqual(initialBalance - BigInt(i) - 1n) +} +``` + +Weitere Details finden Sie in unserem [Ordner für Integrationstests](https://github.com/alephium/nextjs-template/blob/integration-test/test/integration). + +### Den Vertrag bereitstellen + +```typescript +web3.setCurrentNodeProvider('http://localhost:22973') +const wallet = new PrivateKeyWallet('a642942e67258589cd2b1822c631506632db5a12aabcf413604e785300d762a5') +await Project.build() + +// Erstellen Sie eine Transaktion, um den Vertrag zu bereitstellen, und übermitteln Sie die Transaktion an das Alephium-Netzwerk: +// `initialFields ist erforderlich, wenn der Vertrag Felder hat +// `initialAttoAlphAmount muss größer oder gleich 1 ALPH sein; Vermögenswerte werden vom Konto des Transaktionssenders an den Vertrag gesendet +// `issueTokenAmount gibt die Menge der auszugebenden Token an +const issueTokenAmount = 10n +const deployResult = await TokenFaucet.deploy(wallet, { + initialFields: { + symbol: Buffer.from('TF', 'utf8').toString('hex'), + name: Buffer.from('TokenFaucet', 'utf8').toString('hex'), + decimals: 18n, + supply: issueTokenAmount, + balance: issueTokenAmount + }, + initialAttoAlphAmount: 10n ** 18n, + issueTokenAmount: issueTokenAmount +}) +console.log(JSON.stringify(deployResult, null, 2)) +// { +// "signature": "ea95754bae7935311acf15d3323293f03bce89bb6c82939427da5e3074f0ada93b0cda24138dcec1de4e21a1a66dc1f0c8e99297e6ff8fe10587d1821cbae23f", +// "fromGroup": 0, +// "toGroup": 0, +// "unsignedTx": "000401010103000000091500bee85f379545a2ed9f6cceb331288842f378cf0f04012ad4ac8824aae7d6f80a13c40de0b6b3a7640000a2144055050609121b4024402d404a010000000102ce0002010000000102ce0102010000000102ce0202010000000102ce0302010000000102a0000201020101001116000e320c7bb4b11600aba00016002ba10005b416005f14160403025446030b546f6b656e4661756365740212020a140301020a130aae188000dfdfc1174876e8000137a444479fa782e8b88d4f95e28b3b2417e5bc30d33a5ae8486d4a8885b82b224259c1e6000381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b000", +// "gasAmount": 57311, +// "gasPrice": "100000000000", +// "txId": "c9adbbc02f34d2b3f2db8790354bca9f3d6f7a1fde9b9269a393d6693663c084", +// "contractAddress": "v8uU9yLfzUwqpJeS9Kd76DB75WJBcEuMdYgEQ2Gn8pLF", +// "groupIndex": 0, +// "contractId": "1581cc793fc7bafce6ef89eaf66404c9eec17561ef0e169ef2a4329c9f190c00", +// "instance": { +// "address": "v8uU9yLfzUwqpJeS9Kd76DB75WJBcEuMdYgEQ2Gn8pLF", +// "contractId": "1581cc793fc7bafce6ef89eaf66404c9eec17561ef0e169ef2a4329c9f190c00", +// "groupIndex": 0 +// } +// } + +// Erhalten Sie den Zustand des Vertrags +const tokenFaucet = deployResult.instance +const contractState = await tokenFaucet.fetchState() +console.log(JSON.stringify(contractState, null, 2)) +// { +// "address": "v8uU9yLfzUwqpJeS9Kd76DB75WJBcEuMdYgEQ2Gn8pLF", +// "contractId": "1581cc793fc7bafce6ef89eaf66404c9eec17561ef0e169ef2a4329c9f190c00", +// "bytecode": "050609121b4024402d404a010000000102ce0002010000000102ce0102010000000102ce0202010000000102ce0302010000000102a0000201020101001116000e320c7bb4b11600aba00016002ba10005b416005f", +// "initialStateHash": "236a82352f5e34f813ecf274385912ed0ba67f1c305c24f7a6934c18d32213b1", +// "codeHash": "641343b4f1c08b03969b127b452acc7535cad20231bc32af6c0b5f218dd8ff0c", +// "fields": { +// "symbol": "5446", +// "name": "546f6b656e466175636574", +// "decimals": "18", +// "supply": "10", +// "balance": "10" +// }, +// "fieldsSig": { +// "names": [ +// "symbol", +// "name", +// "decimals", +// "supply", +// "balance" +// ], +// "types": [ +// "ByteVec", +// "ByteVec", +// "U256", +// "U256", +// "U256" +// ], +// "isMutable": [ +// false, +// false, +// false, +// false, +// true +// ] +// }, +// "asset": { +// "alphAmount": "1000000000000000000", +// "tokens": [ +// { +// "id": "1581cc793fc7bafce6ef89eaf66404c9eec17561ef0e169ef2a4329c9f190c00", +// "amount": "10" +// } +// ] +// } +// } +``` + +Durch die Ausgabe können wir sehen, dass der Vertrag erfolgreich bereitgestellt wurde und es 10 Token im Vertragsvermögen gibt. + +### Rufen Sie den Vertrag auf + +Sie können Skripte verwenden, um Verträge in der Alephium-Blockchain aufzurufen. Der Skriptcode wird ausgeführt, wenn die Transaktion an das Alephium-Netzwerk gesendet wird, aber der Skriptcode wird nicht im Zustand der Blockchain gespeichert. + +```typescript +web3.setCurrentNodeProvider('http://localhost:22973') +const wallet = new PrivateKeyWallet('a642942e67258589cd2b1822c631506632db5a12aabcf413604e785300d762a5') +await Project.build() + +// Vertragsadresse aus dem Bereitstellungsergebnis +const contractAddress = deployResult.instance.address + +// Vertrags-ID aus dem Bereitstellungsergebnis +const contractId = deployResult.instance.contractId + +// Erstellen Sie eine Aufruf-Vertragstransaktion; initialFields ist erforderlich, wenn das Skript Felder hat +// Die Withdraw wurde im Einführungshandbuch generiert +const executeResult = await Withdraw.execute(wallet, { + initialFields: { + token: contractId, + amount: 1n + } +}) +console.log(JSON.stringify(executeResult, null, 2)) +// { +// "signature": "16ec5eed788bfe7a803ec89f47d8ef7c1ac5f626ad88e4b46ecdde8be9fdef5719db49b09ef4e11a94901082e34c52629aafad4b9753483bf853ff695b19b9a4", +// "fromGroup": 0, +// "toGroup": 0, +// "unsignedTx": "0004010101030000000513010d0c1440201581cc793fc7bafce6ef89eaf66404c9eec17561ef0e169ef2a4329c9f190c0001058000a447c1174876e8000137a44447f11525fe8e58af5a02b2f81bbbf35ea3c1bdf319ffe76794709c9e9d4e80c599000381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b000", +// "gasAmount": 42055, +// "gasPrice": "100000000000", +// "txId": "c29e9cb10b3e0b34979b9daac73151d98ee4de8f913e66aa0f0c8dc0cb99a617", +// "groupIndex": 0 +// } + +// Erhalten Sie das Kontoguthaben +const balance = await wallet.nodeProvider.addresses.getAddressesAddressBalance(wallet.account.address) +console.log(JSON.stringify(balance, null, 2)) +// { +// "balance": "999998990063400000000000", +// "balanceHint": "999998.9900634 ALPH", +// "lockedBalance": "0", +// "lockedBalanceHint": "0 ALPH", +// "tokenBalances": [ +// { +// "id": "1581cc793fc7bafce6ef89eaf66404c9eec17561ef0e169ef2a4329c9f190c00", +// "amount": "1" +// } +// ], +// "utxoNum": 2 +// } +``` + +### Historische Vertragsereignisse abfragen + +Vertragsereignisse werden durch Vertragsadresse mit Offsets indiziert, und Sie können historische Ereignisse einer Vertragsadresse abfragen, indem Sie den Offset und das Limit (optional) angeben. + +```typescript +const nodeProvider = new NodeProvider('http://localhost:22973') +// Vertragsadresse aus dem Bereitstellungsergebnis des Vertrags +const contractAddress = deployResult.instance.address + +// Abfrage von Vertragsereignissen ab Index 0, und die limit darf nicht größer als 100 sein +const result = await nodeProvider.events.getEventsContractContractaddress( + contractAddress, {start: 0, limit: 100} +) + +// In der nächsten Abfrage können Sie mit `result.nextStart` beginnen +console.log(JSON.stringify(result, null, 2)) +// { +// "events": [ +// { +// "blockHash": "0c07e672c40629a5c943cc7e4ec677140cbd50fdc9dcacb6a1d30bc38c0e7b50", +// "txId": "c29e9cb10b3e0b34979b9daac73151d98ee4de8f913e66aa0f0c8dc0cb99a617", +// "eventIndex": 0, +// "fields": [ +// { +// "type": "Address", +// "value": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH" +// }, +// { +// "type": "U256", +// "value": "1" +// } +// ] +// } +// ], +// "nextStart": 1 +// } + +// Manchmal können Ereignisse aus nicht-kanonischen Blöcken aufgrund von Block-Reorganisationen ausgesendet werden; Sie können überprüfen, ob der Block in der Hauptkette ist +await nodeProvider.blockflow.getBlockflowIsBlockInMainChain({blockHash: events[0].blockHash}) +// true + +// Erhalten Sie den aktuellen Zähler für Vertragsereignisse +await nodeProvider.events.getEventsContractContractaddressCurrentCount(contractAddress) +// 1 + +// Sie können Ereignisse auch nach Transaktions-ID abrufen, wenn `alephium.node.event-log.index-by-tx-id` in Ihrer Konfigurationsdatei für den Vollknoten aktiviert ist +await nodeProvider.events.getEventsTxIdTxid('c29e9cb10b3e0b34979b9daac73151d98ee4de8f913e66aa0f0c8dc0cb99a617') +// { +// "events": [ +// { +// "blockHash": "0c07e672c40629a5c943cc7e4ec677140cbd50fdc9dcacb6a1d30bc38c0e7b50", +// "contractAddress": "v8uU9yLfzUwqpJeS9Kd76DB75WJBcEuMdYgEQ2Gn8pLF", +// "eventIndex": 0, +// "fields": [ +// { +// "type": "Address", +// "value": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH" +// }, +// { +// "type": "U256", +// "value": "1" +// } +// ] +// } +// ] +// } +``` + +### Ereignisse abhören + +Zusätzlich zur Abfrage von Ereignissen einzeln können Sie Ereignisse auch durch ein Abonnement abrufen. Es wird periodisch abgefragt und neue Ereignisse werden abgerufen. + +```typescript +web3.setCurrentNodeProvider('http://localhost:22973') +// Die TokenFaucet-Vertragsinstanz aus dem Bereitstellungsergebnis +const tokenFaucet = deployResult.instance +// Die `TokenFaucetTypes.WithdrawEvent` wurde im Einführungshandbuch generiert +const events: TokenFaucetTypes.WithdrawEvent[] = [] +const subscribeOptions = { + // Es wird alle `pollingInterval` nach neuen Ereignissen vom Vollknoten überprüfen + pollingInterval: 500, + // Die Callback-Funktion wird für jedes Ereignis aufgerufen + messageCallback: (event: TokenFaucetTypes.WithdrawEvent): Promise => { + events.push(event) + return Promise.resolve() + }, + // Diese Callback-Funktion wird aufgerufen, wenn ein Fehler auftritt + errorCallback: (error: any, subscription): Promise => { + console.log(error) + subscription.unsubscribe() + return Promise.resolve() + } +} + +// Abonnieren Sie die Vertragsereignisse ab Index 0 +const subscription = tokenFaucet.subscribeWithdrawEvent(subscribeOptions, 0) +await new Promise((resolve) => setTimeout(resolve, 1000)) +console.log(JSON.stringify(events, null, 2)) +// [ +// { +// "contractAddress": "v8uU9yLfzUwqpJeS9Kd76DB75WJBcEuMdYgEQ2Gn8pLF", +// "blockHash": "0c07e672c40629a5c943cc7e4ec677140cbd50fdc9dcacb6a1d30bc38c0e7b50", +// "txId": "c29e9cb10b3e0b34979b9daac73151d98ee4de8f913e66aa0f0c8dc0cb99a617", +// "eventIndex": 0, +// "name": "Withdraw", +// "fields": { +// "to": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH", +// "amount": "1" +// } +// } +// ] + +// Abbestellen +subscription.unsubscribe() +``` + +## Hilfsfunktionen + +### Gruppe einer Adresse abrufen + +```typescript +const contractId = 'bfc891f2f7fbb466bd7808f71cc022debb71fd3c1ceb752b623eb9c48ec4d165' +const contractAddress = addressFromContractId(contractId) +console.log(binToHex(contractIdFromAddress(contractAddress)) === contractId) +// true +``` + +### Gruppe einer Adresse abrufen + +```typescript +const group = groupOfAddress('1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH') +console.log(group) +// 0 +``` + +### Die Sub-Contract-ID abrufen + +```typescript +const contractId = 'bfc891f2f7fbb466bd7808f71cc022debb71fd3c1ceb752b623eb9c48ec4d165' +console.log(subContractId(contractId, '00')) +// 303483cfe0eaead281879233f884e8b64c2ecf26e368ccd4b05b2b5bda87ec3d +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/api-aliases.json b/i18n/de/docusaurus-plugin-content-docs/current/dapps/api-aliases.json new file mode 100644 index 00000000..52e26c01 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/api-aliases.json @@ -0,0 +1,62 @@ +{ + "current": [ + { + "from": "https://wallet.mainnet.alephium.org", + "to": "https://wallet-v20.mainnet.alephium.org" + }, + { + "from": "https://wallet.testnet.alephium.org", + "to": "https://wallet-v20.testnet.alephium.org" + }, + { + "from": "https://mainnet-wallet.alephium.org", + "to": "https://wallet-v20.mainnet.alephium.org" + }, + { + "from": "https://testnet-wallet.alephium.org", + "to": "https://wallet-v20.testnet.alephium.org" + }, + { + "from": "https://backend.mainnet.alephium.org", + "to": "https://backend-v113.mainnet.alephium.org" + }, + { + "from": "https://backend.testnet.alephium.org", + "to": "https://backend-v113.testnet.alephium.org" + }, + { + "from": "https://mainnet-backend.alephium.org", + "to": "https://backend-v113.mainnet.alephium.org" + }, + { + "from": "https://testnet-backend.alephium.org", + "to": "https://backend-v113.testnet.alephium.org" + }, + { + "from": "https://explorer.mainnet.alephium.org", + "to": "https://explorer-v113.mainnet.alephium.org" + }, + { + "from": "https://explorer.testnet.alephium.org", + "to": "https://explorer-v113.testnet.alephium.org" + }, + { + "from": "https://explorer.alephium.org", + "to": "https://explorer-v113.mainnet.alephium.org" + }, + { + "from": "https://testnet.alephium.org", + "to": "https://explorer-v113.testnet.alephium.org" + } + ], + "deprecated": [ + { + "from": "https://wallet-v17.mainnet.alephium.org", + "to": "https://wallet-v20.mainnet.alephium.org" + }, + { + "from": "https://wallet-v17.testnet.alephium.org", + "to": "https://wallet-v20.testnet.alephium.org" + } + ] +} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/build-dapp-from-scratch.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/build-dapp-from-scratch.md new file mode 100644 index 00000000..beb1c36d --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/build-dapp-from-scratch.md @@ -0,0 +1,545 @@ +--- +sidebar_position: 15 +title: DApp von Grund auf erstellen +sidebar_label: DApp von Grund auf erstellen +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +In diesem Leitfaden werden wir die Grundlagen für die Erstellung eines Alephium DApp-Projekts erkunden. + +Voraussetzungen: + +- Code schreiben in [Typescript](https://www.typescriptlang.org/) +- Arbeiten in einem [Terminal](https://en.wikipedia.org/wiki/Terminal_emulator) +- [NodeJS](https://nodejs.org/en/) Version >= 16 installiert +- `npm` Version >= 8 installiert + +## Erstellen Sie ein neues DApp-Projekt: Token Faucet + +In diesem Tutorial werden wir unsere erste DApp schreiben: einen Token-Faucet (Token-Wasserhahn). + +Der Code hier stammt von unserer [Einführungsseite](/dapps/getting-started), aber wir werden Schritt für Schritt durchgehen, wie wir diesen anhand des Leitfadens erstellen. + +Erstellen Sie einen neuen Projektordner und wechseln Sie in diesen: + +```sh +mkdir alephium-faucet-tuto +cd alephium-faucet-tuto +``` + +Erstellen Sie nun einen Ordner `contracts`, in dem wir alle unsere Verträge speichern werden: + +```sh +mkdir contracts +``` + +Unser erster Smart Contract wird `token.ral` sein, den Sie [hier](https://github.com/alephium/nextjs-template/blob/main/contracts/token.ral) finden können. Sie können die gesamte Datei in Ihren `contracts`-Ordner kopieren. + +Lassen Sie uns das ganze Stück für Stück untersuchen: + +```rust +import "std/fungible_token_interface" + +Contract TokenFaucet( + symbol: ByteVec, + name: ByteVec, + decimals: U256, + supply: U256, + mut balance: U256 +) implements IFungibleToken { +``` + +Die ersten vier Felder werden unveränderliche Werte sein, welche die für unser [IFungibleToken Interface](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/fungible_token_interface.ral) erforderlichen Daten speichern. +`mut balance` ist ein veränderlicher Wert, der verfolgt, wie viele Token sich noch in diesem Faucet befinden. + +Sie können sehen, dass unser Smart Contract ein `Event` emittiert und einen `Error`-Code definiert. Lesen Sie folgendes für weitere Informationen zu [Ereignissen](https://wiki.alephium.org/ralph/getting-started#events) und [Fehlerbehandlung](https://wiki.alephium.org/ralph/getting-started#error-handling). + +Dies wird von fünf Zugriffsmethoden für die verschiedenen Argumente des Smart Contracts begleitet. + +Die letzte Methode ist der Ort, wo die Magie geschieht: + +```rust +@using(assetsInContract = true, updateFields = true, checkExternalCaller = false) +pub fn withdraw(amount: U256) -> () { + // Debug-Ereignisse können bei der Fehleranalyse hilfreich sein. + emit Debug(`The current balance is ${balance}`) + + // Stellen Sie sicher, dass der Betrag gültig ist. + assert!(amount <= 2, ErrorCodes.InvalidWithdrawAmount) + // Funktionen, die mit ! enden, sind integrierte Funktionen. + transferTokenFromSelf!(callerAddress!(), selfTokenId!(), amount) + // Ralph erlaubt keine Unterdeckung (underflow). + balance = balance - amount + + // Emitiere das zuvor definierte Ereignis. + emit Withdraw(callerAddress!(), amount) +} +``` + +Mit `assert!` stellen wir sicher, dass niemand mehr als zwei Token gleichzeitig entnehmen kann. +`transferTokenFromSelf` wird den tatsächlichen Transfer der Token durchführen. +Wir aktualisieren das `mut balance`-Feld mit dem neue erstellten Guthaben. Im Falle eines Unterlaufs wird ein Fehler ausgelöst, und die Transaktion wird nicht durchgeführt. +`callerAddress!()` und `selfTokenId!()` sind integrierte Funktionen (build-in Functions). Mehr dazu finden Sie auf unserer Seite zu [Build-In Functions](/ralph/built-in-functions). + +## Kompilieren Sie Ihren Smart Contract + +Der Compiler muss den Full Node kontaktieren, um den Smart Contract zu kompilieren. Sie müssen die richtigen Informationen verwenden, die beim [erstellen Ihres Devnets ](/full-node/devnet)definiert wurden. Wenn Sie es noch nicht gestartet haben, dann ist jetzt der richtige Zeitpunkt dafür. Wir definieren die Node-URL mit der folgenden Konfigurationsdatei: `alephium.config.ts`. Erstellen Sie diese Datei im Stammverzeichnis Ihres Projekts und fügen Sie folgenden Code ein: + +```typescript +import { Configuration } from '@alephium/cli' + +export type Settings = {} + +const configuration: Configuration = { + networks: { + devnet: { + // Stellen Sie sicher, dass die beiden Werte mit dem in Ihrer DevNet-Konfiguration übereinstimmen. + nodeUrl: 'http://localhost:22973', + networkId: 2 + } + } +} + +export default configuration +``` + +Nun, lassen Sie uns kompilieren: + +```sh +npx @alephium/cli@latest compile +``` + +Sie werden gebeten das neueste Paket `@alephium/cli` zu installieren. Bestätigen Sie dies mit Ja, um fortzufahren. + +Sobald der oben genannte Befehl erfolgreich ausgeführt wurde, werden Sie feststellen, dass ein neuer Ordner mit der Bezeichnung `artifacts` erstellt wurde. Dieser enthält mehrere Dateien, die sich auf Ihren Smart Contract beziehen. Beispielsweise generiert `artifacts/ts/TokenFaucet.ts` einige Hilfsfunktionen wie `at`, `fetchState`, `call*`, usw., sowie auch zusätzliche Testfunktionen. + +## Testen Sie Ihren Smart Contract +Das SDK bietet Funktionen für Unittests, die den Smart Contract aufrufen, indem Sie eine Transaktion senden. Anstatt den Blockchain-Zustand zu ändern, gibt es den neuen Vertragszustand, Transaktionsausgaben und Ereignisse zurück. + +Installieren Sie das Testframework: + +```sh +npm install ts-jest @types/jest +``` + +Sie benötigen auch unser `@alephium/web3` Paket: + +```sh +npm install @alephium/web3 @alephium/web3-test +``` + +Erstellen Sie einen `Test`-Ordner: + +```sh +mkdir test +``` + +und erstellen Sie eine minimale Testdatei `test/token.test.ts` mit folgendem Inhalt: + +```typescript +import { web3, Project, addressFromContractId } from '@alephium/web3' +import { randomContractId, testAddress } from '@alephium/web3-test' +import { TokenFaucet } from '../artifacts/ts' + +describe('unit tests', () => { + it('Withdraws 1 token from TokenFaucet', async () => { + + // Verwenden Sie den richtigen Host und Port. + web3.setCurrentNodeProvider('http://127.0.0.1:22973') + await Project.build() + + const testContractId = randomContractId() + const testParams = { + // Eine zufällige Adresse, an der der Testvertrag in den Tests vorhanden ist. + address: addressFromContractId(testContractId), + // Vermögenswerte, die dem Testvertrag vor einem Test gehören. + initialAsset: { alphAmount: 10n ** 18n, tokens: [{ id: testContractId, amount: 10n }] }, + // Anfangszustand des Testvertrags. + initialFields: { + symbol: Buffer.from('TF', 'utf8').toString('hex'), + name: Buffer.from('TokenFaucet', 'utf8').toString('hex'), + decimals: 18n, + supply: 10n ** 18n, + balance: 10n + }, + // Argumente, um die Ziel-Funktion des Testvertrags zu testen. + testArgs: { amount: 1n }, + // Vermögenswerte, die dem Aufrufer der Funktion gehören. + inputAssets: [{ address: testAddress, asset: { alphAmount: 10n ** 18n } }] + } + + const testResult = await TokenFaucet.tests.withdraw(testParams) + console.log(testResult) + }) +}) +``` + +Ein komplexerer Test ist in unserem [Template](https://github.com/alephium/nextjs-template/blob/main/test/unit/token.test.ts) zu finden. + +Ohne zu sehr ins Detail zu gehen, benötigt TypeScript einige Konfigurationen, um den Test auszuführen. Erstellen Sie daher einfach eine Datei namens `tsconfig.json` im Stammverzeichnis Ihres Projekts und fügen Sie den folgenden Code ein: + +```json +{ + "compilerOptions": { + "outDir": "dist", + "target": "es2020", + "esModuleInterop": true, + "module": "commonjs", + "resolveJsonModule": true + }, + "exclude": ["node_modules"], + "include": ["src/**/*.ts", "test/**/*.ts", "scripts/**/*.ts", "alephium.config.ts", "artifacts/**/*.ts"] +} +``` + +Sie können den Test nun ausführen: + +```sh +npx @alephium/cli@latest test +``` + +Sie sollten in Ihrem Terminal die Ausgabe des Aufrufs der Abhebungsmethode sehen. + +🎉 Herzlichen Glückwunsch! Sie haben Ihren ersten Smart Contract erstellt und einen Test geschrieben, um ihn lokal aufzurufen und zu überprüfen! Jetzt ist es an der Zeit, Ihren Smart Contract bereitzustellen. +## Bereitstellen des Smart Contracts + +Jetzt wird es ernst, denn wir werden unseren Smart Contract in unserem `devnet` bereitstellen. :rocket: + +Der `deploy`-Befehl führt alle Bereitstellungsskripte aus, die er im Ordner `scripts` findet. Erstellen Sie den Ordner `scripts` im Stammverzeichnis des Projekts: + +```sh +mkdir scripts +``` + +Lassen Sie uns eine Bereitstellungsskriptdatei namens `0_deploy_faucet.ts` im Ordner `scripts` erstellen und fügen folgenden Code hinzu. +Beachten Sie, dass Bereitstellungsskripte immer mit Zahlen (beginnend ab `0`) vorangestellt sein sollten. + +```typescript +import { Deployer, DeployFunction, Network } from '@alephium/cli' +import { Settings } from '../alephium.config' +import { TokenFaucet } from '../artifacts/ts' + +// Diese Bereitstellungsfunktion wird automatisch vom CLI-Bereitstellungstool aufgerufen. +// Beachten Sie, dass Bereitstellungsskripte mit Zahlen (beginnend bei 0) vorangestellt sein sollten. +const deployFaucet: DeployFunction = async ( + deployer: Deployer +): Promise => { + const issueTokenAmount = 100n + const result = await deployer.deployContract(TokenFaucet, { + // Die Menge der auszugebenden Token. + issueTokenAmount: issueTokenAmount, + // Die Anfangszustände des Faucet-Vertrags. + initialFields: { + symbol: Buffer.from('TF', 'utf8').toString('hex'), + name: Buffer.from('TokenFaucet', 'utf8').toString('hex'), + decimals: 18n, + supply: issueTokenAmount, + balance: issueTokenAmount + } + }) + console.log('Token faucet contract id: ' + result.contractInstance.contractId) + console.log('Token faucet contract address: ' + result.contractInstance.address) +} + +export default deployFaucet +``` + +Das [deployContract](https://github.com/alephium/alephium-web3/blob/d2b5b63cae015e843aa77b4cf484bc62a070f1d5/packages/cli/src/types.ts#L133-L137) des `Deployer` nimmt unseren Smart Contract und bereitet ihn mit den richtigen Argumenten vor. Sie können auch ein `taskTag`-Argument hinzufügen, um Ihre Bereitstellung mit einem bestimmten Namen zu kennzeichnen. Standardmäßig wird der Vertragsname verwendet, aber wenn Sie denselben Smart Contract mehrmals mit unterschiedlichen Anfangswerten bereitstellen, wird Ihre `.deployment`-Datei diesen überschrieben. Die Verwendung eines spezifischen `taskTag` löst dieses Problem. + +Aus der [DeployContractParams](https://github.com/alephium/alephium-web3/blob/d2b5b63cae015e843aa77b4cf484bc62a070f1d5/packages/web3/src/contract/contract.ts#L1286-L1293)-Schnittstelle können wir sehen, dass `initialFields` obligatorisch ist, da es die Argumente für unseren Smart Contract `TokenFaucet` enthält. + +Mit `issueTokenAmount` können Sie definieren, wie viele Token Sie ausgeben möchten. Dies ist erforderlich, wenn Sie ein Token erstellen möchten, sonst wird keine Token-ID erstellt. + +Lassen Sie uns den Smart Contract nun bereitstellen! + +```sh +npx @alephium/cli@latest deploy +``` + +...OOPS... Hat es nicht funktioniert??? + +Wenn Sie den Fehler `The node chain id x is different from configured chain id y` erhalten haben, überprüfen Sie Ihre `networkId` in der Devnet-Konfiguration und der Datei `alephium.config.ts`. + +`No UTXO found` ??? + +Klar, wir haben die `how-to-use-my-utxos` nicht bereitgestellt. Sie müssen ihre [privateKeys](https://github.com/alephium/alephium-web3/blob/d2b5b63cae015e843aa77b4cf484bc62a070f1d5/packages/cli/src/types.ts#L39-L46) definieren. + +Sie müssen die privaten Schlüssel aus ihrer Extension Wallet exportieren (möglicherweise später auch aus ihren anderen Wallets). Stellen Sie sicher, dass Sie eine Wallet mit Guthaben verwenden, wie diejenige aus der Genesis-Zuteilung Ihres Devnet. +Wenn Sie die Docker-Methode zum Starten Ihres Devnets verwendet haben, hat es möglicherweise funktioniert, da wir [einen Standard-Private Key in unserem CLI-Paket definieren](https://github.com/alephium/alephium-web3/blob/d2b5b63cae015e843aa77b4cf484bc62a070f1d5/packages/cli/src/types.ts#L75) basierend auf der Genesis-Zuteilung. + +Aktualisieren wir nun unsere `alephium.config.ts` + +```typescript +const configuration: Configuration = { + networks: { + devnet: { + nodeUrl: 'http://localhost:22973', + networkId: 2, + // Der private Schlüssel meiner Genesis-Adresse lautet: 132mqFF2BuxGigdaMTGSruuW29kmEs2eEGcpquG4YZRNh + privateKeys: ['672c8292041176c9056bb0dd1d91d34711ceed2493b5afc83f2012b27df2c559'] + } + } +} +``` + +:::caution +Echte Anwendungen sollten Umgebungsvariablen oder ähnliche Techniken für sensible Einstellungen wie `privateKeys` verwenden. Geben Sie Ihre privaten Schlüssel nicht in die Quellcodeverwaltung ein. +::: + +und versuchen Sie die Bereitstellung erneut: + +```sh +npx @alephium/cli@latest deploy +``` + +```sh +Contracts are compiled already. Loading them from folder "artifacts" +Deploying contract TokenFaucet +Deployer - group 1 - 132mqFF2BuxGigdaMTGSruuW29kmEs2eEGcpquG4YZRNh +Token faucet contract id: d00e9c788ddd572b0c186f0599a264f4c79f009c632c8040b7c5f71bfc0ec301 +Token faucet contract address: 28h7qSmkAAeNyoBuQKGyp1WG8VfdKPePCCFGKwp2Y8yyA +✅ Deployment scripts executed! +``` + +Herzlichen Glückwunsch! Ihr Smart Contract ist bereitgestellt. Wir können nun das Guthaben des Smart Contract überprüfen. Verwenden Sie `curl` und ändern Sie die Vertragsadresse basierend auf dem Ergebnis ihrer Bereitstellung: + +```sh +curl 'http://localhost:22973/addresses/28h7qSmkAAeNyoBuQKGyp1WG8VfdKPePCCFGKwp2Y8yyA/balance' +``` + +Die Antwort sollte so aussehen: + +```json +{ + "balance": "1000000000000000000", + "balanceHint": "1 ALPH", + "lockedBalance": "0", + "lockedBalanceHint": "0 ALPH", + "tokenBalances": [ + { + "id": "d00e9c788ddd572b0c186f0599a264f4c79f009c632c8040b7c5f71bfc0ec301", + "amount": "100" + } + ], + "utxoNum": 1 +} +``` + +Wir können unsere Token-ID mit den 100 Tokens sehen die wir ausgeben wollten. + +Lassen Sie uns den Vertragszustand überprüfen, indem Sie zuerst die Gruppe unserer Adresse abrufen: + +```sh +curl 'http://localhost:22973/addresses/28h7qSmkAAeNyoBuQKGyp1WG8VfdKPePCCFGKwp2Y8yyA/group' +curl 'http://localhost:22973/contracts/28h7qSmkAAeNyoBuQKGyp1WG8VfdKPePCCFGKwp2Y8yyA/state?group=1' +``` + + +Rückmeldung des Vertragszustands: +```json +{ + "address": "28h7qSmkAAeNyoBuQKGyp1WG8VfdKPePCCFGKwp2Y8yyA", + "bytecode": "050609121b4024402d404a010000000102ce0002010000000102ce0102010000000102ce0202010000000102ce0302010000000102a0000201020101001116000e320c7bb4b11600aba00016002ba10005b416005f", + "codeHash": "641343b4f1c08b03969b127b452acc7535cad20231bc32af6c0b5f218dd8ff0c", + "initialStateHash": "06595afa695949e915dfc1220dfb47125b01751d9e193f4c5fa1c7fc3566673d", + "immFields": [ + { + "type": "ByteVec", + "value": "5446" + }, + { + "type": "ByteVec", + "value": "546f6b656e466175636574" + }, + { + "type": "U256", + "value": "18" + }, + { + "type": "U256", + "value": "100" + } + ], + "mutFields": [ + { + "type": "U256", + "value": "100" + } + ], + "asset": { + "attoAlphAmount": "1000000000000000000", + "tokens": [ + { + "id": "d00e9c788ddd572b0c186f0599a264f4c79f009c632c8040b7c5f71bfc0ec301", + "amount": "100" + } + ] + } +} +``` + +In den `immFields` sehen wir unsere anfänglichen `TokenFaucet`-Argumente (`symbol`, `name`, `decimals`, `supply`). Wir sehen auch, dass `mutFields` das aktuelle Token-Guthaben enthält. Wir werden dieses Feld später überprüfen, nachdem wir den Faucet aufgerufen haben. + +Der `deploy`-Befehl hat auch die Datei `.deployments.devnet.json` mit dem Bereitstellungsergebnis erstellt. Es ist wichtig, diese Datei aufzubewahren, um einfacher mit dem Smart Contract zu interagieren, obwohl alle Informationen auch auf der Blockchain gefunden werden können. + +# Interagieren Sie mit dem bereitgestellten Smart Contract + +Einen Token-Wasserhahn zu haben, ist schön, von ihm Token zu erhalten, ist noch besser. + +Jetzt können wir etwas Code schreiben, um mit dem Faucet-Contract zu interagieren. + +Wir müssen unser `cli`-Paket und die `typescript`-Abhängigkeiten installieren, falls dies noch nicht der Fall war: + +``` +npm install @alephium/cli typescript +``` + +Wir werden nun eine andere Option sehen, um mit der Blockchain zu interagieren. Zuvor haben wir die `DeployFunction` mit unseren `scripts/_*`-Dateien verwendet, die automatisch mit dem CLI-Tool bereitgestellt wurden. + +Eine andere Möglichkeit besteht darin, ein Grundgerüst einer Webanwendung mit TypeScript zu erstellen. Erstellen Sie einen Ordner mit der Bezeichnung `src` im Stammverzeichnis des Projekts und darin eine Datei namens `tokens.ts` mit folgendem Inhalt: + +```typescript +import { Deployments } from '@alephium/cli' +import { DUST_AMOUNT, web3, Project, NodeProvider } from '@alephium/web3' +import { PrivateKeyWallet} from '@alephium/web3-wallet' +import configuration from '../alephium.config' +import { TokenFaucet, Withdraw } from '../artifacts/ts' + +async function withdraw() { + + // Wählen Sie unser im alephium.config.ts definiertes Netzwerk aus. + const network = configuration.networks.devnet + + // Der NodeProvider ist eine Abstraktion einer Verbindung zum Alephium-Netzwerk. + const nodeProvider = new NodeProvider(network.nodeUrl) + + // Manchmal ist es bequem, einen globalen NodeProvider für Ihr Projekt einzurichten: + web3.setCurrentNodeProvider(nodeProvider) + + // Verbinden Sie unsere Brieftasche, in einer echten Anwendung würden Sie in der Regel Ihre Web-Erweiterung oder Desktop-Wallet verbinden. + const wallet = new PrivateKeyWallet({privateKey: '672c8292041176c9056bb0dd1d91d34711ceed2493b5afc83f2012b27df2c559' }) + + // Kompilieren Sie die Verträge des Projekts, wenn sie nicht kompiliert sind. + Project.build() + + // Bereitstellungen enthalten Informationen zu unserer TokenFaucet-Bereitstellung, da wir die Contract-ID und Adresse benötigen. + // Dies wurde automatisch mit dem cli deploy unseres scripts/0_deploy_faucet.ts generiert. + const deployments = await Deployments.from('.deployments.devnet.json') + + // Stellen Sie sicher, dass es mit Ihrer Adressgruppe übereinstimmt. + const accountGroup = 1 + + const deployed = deployments.getDeployedContractResult(accountGroup, 'TokenFaucet') + + if(deployed !== undefined) { + const tokenId = deployed.contractInstance.contractId + const tokenAddress = deployed.contractInstance.address + + // Senden Sie eine Transaktion ab, um das Transaktionsskript zu verwenden. + // Es verwendet unsere Brieftasche, um die Transaktion zu signieren. + await Withdraw.execute(wallet, { + initialFields: { token: tokenId, amount: 1n }, + attoAlphAmount: DUST_AMOUNT + }) + + // Holen Sie sich den neuesten Stand des Token-Vertrags, mut balance sollte sich geändert haben. + const faucet = TokenFaucet.at(tokenAddress) + const state = await faucet.fetchState() + console.log(state.fields) + + // Holen Sie sich das Brieftaschenguthaben, um zu sehen, ob das Token vorhanden ist. + const balance = await wallet.nodeProvider.addresses.getAddressesAddressBalance(wallet.account.address) + console.log(balance) + } else { + console.log('`deployed` is undefined') + } +} + +// Führen wir eine Abhebung durch. +withdraw() +``` + +Für aufmerksame Beobachter gibt es Neuerungen in unseren Artefakten: `artifacts`: [`Withdraw`](https://github.com/alephium/nextjs-template/blob/main/contracts/withdraw.ral) ist ein [`TxScript`](https://wiki.alephium.org/ralph/getting-started#txscript), das notwendig ist, um mit dem `TokenFaucet`-Smart Contract zu interagieren. Der zugehörige Code ist recht simpel. Legen Sie eine Datei mit dem Namen `withdraw.ral` im Ordner `contracts` an und fügen Sie den folgenden Code ein: + +```rust +TxScript Withdraw(token: TokenFaucet, amount: U256) { + token.withdraw(amount) +} +``` + +Wir müssen jetzt unsere Verträge neu kompilieren, um das Artefakt für `Withdraw` zu erhalten: + +```sh +npx @alephium/cli@latest compile +``` + +Sie können den TypeScript-Code jetzt mit folgendem Befehl in JavaScript kompilieren: + +```sh +npx tsc --build . +``` + +OOPS, sie werden einen Fehler aus der `alephium.config.ts`, erhalten. Bisher wurde die Konfiguration einfach als JSON verwendet, aber jetzt verlangt `TypeScript` dass es sein [Interface](https://github.com/alephium/alephium-web3/blob/d2b5b63cae015e843aa77b4cf484bc62a070f1d5/packages/cli/src/types.ts#L48-L62) respektiert. Insbesondere ist `networks` ein Record, der die drei `Netzwerk-Typen` enthalten muss. Sie können versuchen, dies selbst zu beheben, oder Sie können Ihre `alephium.config.ts`-Datei mit folgendem Inhalt aktualisieren: + +```typescript +import { Configuration } from '@alephium/cli' + +export type Settings = {} + +const configuration: Configuration = { + defaultNetwork: 'devnet', + networks: { + devnet: { + nodeUrl: 'http://localhost:22973', + networkId: 2, // Verwenden Sie dasselbe wie in Ihrer DevNet-Konfiguration. + privateKeys: ['672c8292041176c9056bb0dd1d91d34711ceed2493b5afc83f2012b27df2c559'], + settings: {} + }, + testnet: { + nodeUrl: '', + privateKeys: [], + settings: {} + }, + mainnet: { + nodeUrl: '', + privateKeys: [], + settings: {} + } + } +} + +export default configuration +``` + +Kompilieren Sie nun erneut: + +``` +npx tsc --build . +``` + +Ein `dist`-Ordner sollte erstellt worden sein, gehen Sie weiter und interagieren Sie mit dem bereitgestellten Token-Faucet: + +``` +node dist/src/token.js +``` + +Sie sollten jetzt stolzer Besitzer des von Ihnen erstellten Tokens sein. + + +## Was kommt als nächstes? + +Ein komplexeres Beispiel für das Token-Faucet-Tutorial finden Sie im [Alephium/Nextjs-Template](https://github.com/alephium/nextjs-template)-Projekt. + +## Mit den Wallets verbinden + +DApps erfordern eine Wallet-Integration für Benutzer der DApp, um sich zu authentifizieren und mit der Alephium-Blockchain zu interagieren, wie zum Beispiel das Signieren von Transaktionen. Derzeit können DApps sowohl mit der [Extension Wallet](../wallet/extension-wallet/dapp) als auch mit [WalletConnect](../wallet/walletconnect) integriert werden. Bitte lesen Sie die entsprechenden Seiten für weitere Details. + +## Weitere Informationen + +- Um mehr über das Ökosystem zu erfahren, besuchen Sie bitte die [Übersicht des Ökosystems](/dapps/ecosystem). +- Um mehr über das Web3 SDK zu erfahren, besuchen Sie bitte die [Anleitung zum Web3 SDK](/dapps/alephium-web3). +- Um mehr über die Ralph-Sprache zu erfahren, besuchen Sie bitte die [Anleitung zu Ralph](/ralph/getting-started). +- Um zu erfahren, wie man eine Nextjs DApp erstellt, besuchen Sie [Entwicklen Sie eine DApp mit Nextjs](/dapps/build-dapp-with-nextjs.md) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/build-dapp-with-nextjs.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/build-dapp-with-nextjs.md new file mode 100644 index 00000000..50bdde8a --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/build-dapp-with-nextjs.md @@ -0,0 +1,132 @@ +--- +sidebar_position: 10 +title: DApp mit Next.js erstellen +sidebar_label: DApp mit Next.js erstellen +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Dies ist eine Fortsetzung des [Einstiegs](/dapps/getting-started.md)-Leitfadens. Am Ende dieses Leitfadens sollten Sie in der Lage sein, eine einfache +[Nextjs](https://nextjs.org/)-DApp zu erstellen, die mit den im [Einstiegs](/dapps/getting-started.md)-Leitfaden behandelten Smart Contracts des Token-Faucet interagiert. + +Voraussetzungen: + +- Grundlegendes Verständnis von [Typescript](https://www.typescriptlang.org/) + und [Nextjs](https://nextjs.org/) +- [npm](https://www.npmjs.com/) und + [npx](https://www.npmjs.com/package/npx) auf Ihrem Rechner installiert +- Vertrautheit mit dem Tutorial-Projekt des Token Faucet im [Einstiegs](/dapps/getting-started.md)-Leitfaden. +- Installation der [Extension Wallet](/wallet/extension-wallet/overview) +- Installation von Docker und Docker-Compose + +## Erstellen Sie ein DApp-Projekt mit dem Nextjs-Template + +```sh +npx @alephium/cli@latest init alephium-nextjs-tutorial --template nextjs +``` + +Dies erstellt ein neues Verzeichnis `alephium-nextjs-tutorial` und +initialisiert ein Beispielprojekt mit NextJS in diesem Verzeichnis. + + +## Starten Sie ein lokales Entwicklungssnetzwerk + +Wechseln Sie in das Verzeichnis `alephium-nextjs-tutorial/docker` und führen Sie folgendes aus: + +```sh +cd alephium-nextjs-tutorial/docker +docker-compose up -d +``` + +Dies startet sowohl den Alephium Full Node als auch das [Explorer-Backend ](https://github.com/alephium/explorer-backend) im +`devnet`. Das Explorer-Backend wird für die Funktion der Extension Wallet benötigt. + +Jetzt können Sie Ihre Token-Faucet-Contracts [kompilieren](/dapps/getting-started.md/#kompilieren-sie-ihren-contract), +[testen](/dapps/getting-started/#testen-sie-ihren-contract) und +[bereitstellen](/dapps/getting-started/#ihren-contract-bereitstellen) + genau wie im [Einstiegs](/dapps/getting-started.md)-Leitfaden beschrieben. + +Stellen Sie sicher, dass der Smart Contract bereitgestellt ist, bevor Sie mit dem nächsten Schritt fortfahren. + +```sh +npx @alephium/cli@latest deploy +``` + +## Interagieren Sie mit dem Token-Faucet über die Nextjs-DApp + +Gehen Sie zum Stammverzeichnis des Projekts und führen Sie folgendes aus: + +```sh +npm install +npm run dev +``` + +Öffnen Sie nun [http://localhost:3000](http://localhost:3000) mit Ihrem Browser, um die Token-Faucet-Anwendung zu sehen. + + + +Wie oben dargestellt, zeigt die Token-Faucet-DApp einen `Connect Alephium` +Button, bevor Sie mit einer Wallet verbunden ist. Klicken Sie auf die Schaltfläche und wählen Sie die Option `Extension Wallet`, um die Extension Wallet zu öffnen. `WalletConnect` wird bald unterstützt. + +Landing page +     +Create wallet + +Überprüfen Sie den Bestätigungsbildschirm der Extension Wallet und klicken Sie auf +`Connect`. Die Token-Faucet-DApp wird mit der Extension Wallet verbunden. + +Landing page + +Geben Sie die Anzahl der abzuhebenden Token ein (maximal 2) und klicken Sie auf die Schaltfläche `Send Me Token`. Überprüfen Sie die Transaktionsdetails und klicken Sie auf `Confirm`. + +Landing page + +Herzlichen Glückwunsch, Sie haben gerade einige Token von dem Token-Faucet auf Ihr Konto übertragen! + +## Implementierung + +Das Ziel des [Nextjs-Vorlagen](https://github.com/alephium/nextjs-template) - Projekts besteht darin zu zeigen, wie mit der Alephium-Blockchain von einer NextJS-Anwendung aus interagiert werden kann. + +Die Authentifizierung kann in wenigen Zeilen mithilfe der +[@alephium/web3-react](https://github.com/alephium/alephium-web3/tree/master/packages/web3-react) Komponenten erfolgen: + +```tsx + + + // Your logic + +``` + +`` erstellt ein React +[Kontext](https://reactjs.org/docs/context.html)-Objekt und gibt es durch den Komponentenbaum der Anwendung weiter. Der Kontext enthält den +[SignerProvider](https://github.com/alephium/alephium-web3/blob/8cf20fee4c16091cf581518e9f411e31ec37955e/packages/web3-react/src/contexts/alephiumConnect.tsx#L56), der eine essentielle Informationsquelle ist, um mit der Alephium-Blockchain zu interagieren, wie z.B. das Signieren von Transaktionen, usw. + +Nachdem der Benutzer mit der Wallet verbunden ist, können wir mit der Alephium-Blockchain interagieren, indem wir eine Reihe von React-Hooks verwenden, die von [@alephium/web3-react](https://github.com/alephium/alephium-web3/tree/master/packages/web3-react) bereitgestellt werden. Zum Beispiel können wir Informationen wie die [aktuell verbundene Wallet](https://github.com/alephium/alephium-web3/blob/master/packages/web3-react/src/hooks/useWallet.tsx), das [Guthaben](https://github.com/alephium/alephium-web3/blob/master/packages/web3-react/src/hooks/useBalance.tsx) +und den [Transaktionsstatus](https://github.com/alephium/alephium-web3/blob/master/packages/web3-react/src/hooks/useTxStatus.tsx) abrufen. + +Wenn ein Benutzer eine Transaktion durchführt, können Sie das Guthaben des Benutzers mit `updateBalanceForTx` aktualisieren. +Hier ist ein einfaches Beispiel: + +```typescript +// Das `useBalance-Hook` gibt zwei Werte zurück: +// 1. balance: der aktuelle Kontostand +// 2. updateBalanceForTx: wird verwendet, um den Kontostand zu aktualisieren, wenn der Benutzer eine Transaktion durchführt. +const { balance, updateBalanceForTx } = useBalance() + +const withdrawCallback = useCallback(async () => { + const result = await withdraw(...) + updateBalanceForTx(result.txId) +}, [updateBalanceForTx]) +``` + +Für weitere Implementierungsdetails werfen Sie bitte einen Blick auf den [Code](https://github.com/alephium/nextjs-template). + +## Erfahren Sie mehr + +- Das NextJS-Template ist auf dem Testnet bereitgestellt und unter [https://alephium.github.io/nextjs-template](https://alephium.github.io/nextjs-template/) verfügbar. +- Um mehr über das Ökosystem zu erfahren, besuchen Sie bitte die [Übersicht des Ökosystems](/dapps/ecosystem). +- Um mehr über das Web3 SDK zu erfahren, besuchen Sie bitte die [Anleitung des Web3 SDK](/dapps/alephium-web3). +- Um mehr über die Ralph-Sprache zu erfahren, besuchen Sie bitte die [Anleitung von Ralph](/ralph/getting-started). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/dapp-recipes.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/dapp-recipes.md new file mode 100644 index 00000000..927da4ee --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/dapp-recipes.md @@ -0,0 +1,229 @@ +--- +sidebar_position: 30 +title: DApp-Rezepte +sidebar_label: DApp-Rezepte +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Smart Contract + +### Zustand des Smart Contracts abrufen + +Wenn Sie den Befehl `npx @alephium/cli compile` verwenden, um einen Smart Contract zu kompilieren, wird TypeScript-Code basierend auf dem Smart Contract generiert. Nehmen wir den [Token Faucet](https://github.com/alephium/nextjs-template/blob/main/contracts/token.ral)-Smart Contract als Beispiel, +[hier](https://github.com/alephium/nextjs-template/blob/main/artifacts/ts/TokenFaucet.ts) ist der generierte TypeScript-Code. Wir können den generierten TypeScript-Code verwenden, um den Zustand des Smart Contracts abzurufen: + +```typescript +import { TokenFaucet } from 'artifacts/ts' // Beachten Sie, dass Sie möglicherweise den Importpfad gemäß der Verzeichnisstruktur Ihres Projekts ändern müssen. +import { web3, NodeProvider } from '@alephium/web3' + +const nodeUrl = 'http://127.0.0.1:12973' +const nodeProvider = new NodeProvider(nodeUrl) +web3.setCurrentNodeProvider(nodeProvider) + +const tokenFaucetAddress = 'y1btMZHTvMvHEqLTdx1JHvEXq3tmVfqsY2rwM669upiT' +const tokenFaucet = TokenFaucet.at(tokenFaucetAddress) +const contractState = await tokenFaucet.fetchState() + +// Die Namen in contractState.fields sind die gleichen wie die Feldnamen im TokenFaucet-Vertrag. +const { symbol, name, decimals, supply, balance } = contractState.fields + +// Sie können auch die Vermögenswerte abrufen, die dem Vertrag gehören. +const { alphAmount, tokens } = contractState.asset +``` + +### Methode des Smart Contracts aufrufen + +Sie können den generierten TypeScript-Code verwenden, um die Methoden des Smart Contracts aufzurufen. Dies ähnelt dem `eth_call` in Ethereum: + +```typescript +import { TokenFaucet } from 'artifacts/ts' +import { web3, NodeProvider } from '@alephium/web3' + +const nodeUrl = 'http://127.0.0.1:12973' +const nodeProvider = new NodeProvider(nodeUrl) +web3.setCurrentNodeProvider(nodeProvider) + +const tokenFaucetAddress = 'y1btMZHTvMvHEqLTdx1JHvEXq3tmVfqsY2rwM669upiT' +const tokenFaucet = TokenFaucet.at(tokenFaucetAddress) +const totalSupply = await tokenFaucet.methods.getTotalSupply() +``` + +### Ereignisse des Smart Contract abonnieren + +Im [Token Faucet](https://github.com/alephium/nextjs-template/blob/main/contracts/token.ral)-Smart Contract haben wir ein [Withdraw](https://github.com/alephium/nextjs-template/blob/c846a675235198045cdf91ba0304aa287f2fc68d/contracts/token.ral#L18)-Ereignis definiert. +Jedes Mal, wenn die `Withdraw`-Funktion aufgerufen wird, gibt der Smart Contract ein `Withdraw`-Ereignis aus. +Wir können die Abhebungsereignisse mit dem folgenden Ansatz abonnieren: + +```typescript +import { TokenFaucet, TokenFaucetTypes } from 'artifacts/ts' +import { EventSubscribeOptions } from '@alephium/web3' + +// `TokenFaucetTypes.WithdrawEvent ist ein generierter TypeScript-Typ. +const options: EventSubscribeOptions = { + // Wir geben das pollingInterval als 4 Sekunden an, was bedeutet, dass der Vertrag alle 4 Sekunden nach neuen Ereignissen abgefragt wird. + pollingInterval: 4000, + // Die `messageCallback` wird jedes Mal aufgerufen, wenn wir ein neues Ereignis erhalten. + messageCallback: (event: TokenFaucetTypes.WithdrawEvent): Promise => { + console.log(`Withdraw(${event.fields.to}, ${event.fields.amount})`) + return Promise.resolve() + }, + // Die `errorCallback` wird aufgerufen, wenn ein Fehler auftritt. Hierbei melden wir uns vom Abonnement ab und protokollieren den Fehler. + errorCallback: (error, subscription): Promise => { + console.error(error) + subscription.unsubscribe() + return Promise.resolve() + }, + // Der `onEventCountChanged-Callback` ist ein optionales Argument, das aufgerufen wird, wenn sich die Anzahl der Vertragsereignisse ändert. + onEventCountChanged: (eventCount): Promise => { + }, +} + +/ Wir abonnieren Vertragsereignisse ab dem Ereignis-Zählerstand 0. +// Wir können auch den aktuellen Ereignis-Zählerstand innerhalb des onEventCountChanged-Rückrufs persistieren, +// was es uns ermöglicht, ab dem letzten Ereignis-Zählerstand für das nächste Abonnement zu abonnieren. +const fromEventCount = 0 +const subscription = tokenFaucet.subscribeWithdrawEvent(options, fromEventCount) + +// Das Abonnement wird gekündigt. +subscription.unsubscribe() +``` + +## Transaktion + +### Transaktionsstatus abfragen + +Sie können den Transaktionsstatus wie folgt abfragen: + +```typescript +import { NodeProvider } from '@alephium/web3' + +const nodeUrl = 'http://127.0.0.1:12973' +const nodeProvider = new NodeProvider(nodeUrl) + +const txId = '919d4e4b1080d74beb56a1f78ea7c0569a358e3ea3988058987cc1addf4b93cc' +const txStatus = await nodeProvider.transactions.getTransactionsStatus({ txId }) +``` + +Sie können den Transaktionsstatus anhand von `txStatus.type` unterscheiden: + +1. `MemPooled`: Dies bedeutet, dass die Transaktion im Mempool ist +2. `Confirmed`: Die Transaktion wurde bestätigt, und Sie können die Bestätigungen mit `txStatus.chainConfirmations` abrufen +3. `TxNotFound`: Die Transaktion existiert nicht + +## Hooks + +Das Paket `@alephium/web3-react` stellt mehrere Hooks zur Verfügung, um die Entwicklung von Frontend-Benutzeroberflächen zu erleichtern. + +### useWalletConfig + +```typescript +import { useWalletConfig } from '@alephium/web3-react' + +export function Component() { + const { network, setNetwork, addressGroup, setAddressGroup } = useWalletConfig() + + return
+ + +
+} +``` + +Das `useWalletConfig`-Hook gibt die Konfigurationen des Verbindungsbuttons und Hilfsfunktionen zurück, um diese Konfigurationen zu aktualisieren. + +### useWallet + +```typescript +import { useWallet, Wallet } from '@alephium/web3-react' + +function Component() { + const { account, connectionStatus } = useWallet() + + if (connectionStatus === 'connecting') return
Connecting
+ if (connectionStatus === 'disconnected') return
Disconnected
+ + // `Verbunden` + return
{account}
+} +``` + +Wenn der Rückgabewert `undefined` ist, deutet dies darauf hin, dass die Wallet nicht verbunden ist. Die zurückgegebene Wallet hat die folgenden Felder: + +* `wallet.signer`: Sie können den Signer verwenden, um Transaktionen zu signieren. +* `wallet.account`: Dies ist das aktuell verbundene Konto. +* `wallet.nodeProvider`: Sie können den Node-Provider verwenden, um mit dem Full Node zu kommunizieren. Beachten Sie, dass dieser Wert `undefined` sein kann. + +### useBalance + +```typescript +import { useBalance } from '@alephium/web3-react' + +const { balance, updateBalanceForTx } = useBalance() +``` + +Das `useBalance`-Hook gibt zwei Werte zurück: + +1. `balance`: Das aktuelle Guthaben des verbundenen Kontos. +2. `updateBalanceForTx`: Dies wird verwendet, um das Guthaben zu aktualisieren, wenn der Benutzer eine Transaktion durchführt. Es nimmt eine Transaktions-ID als Parameter entgegen und aktualisiert das Guthaben, sobald diese Transaktion bestätigt wurde. + +### useTxStatus + +```typescript +import { useState } from 'react' +import { useTxStatus } from '@alephium/web3-react' + +const { txStatus } = useTxStatus(txId) +const confirmed = useMemo(() => { + return txStatus?.type === 'Confirmed' +}, [txStatus]) +``` + +Das `useTxStatus`-Hook akzeptiert auch einen optionalen Rückrufparameter vom Typ `(txStatus: node.TxStatus) => Promise`. Dieser wird nach jeder Abfrage des Transaktionsstatus aufgerufen. + +## Hilfsfunktionen + +### Rate limit + +Der `NodeProvider` wird verwendet, um beim Entwickeln einer DApp mit dem Full Node zu kommunizieren, und Sie können die von Alephium öffentlich bereitgestellten [API services](./public-services.md) verwenden. Aber alle APIs unterliegen einer Ratenbegrenzung, um Spam zu verhindern. Wenn der Client also in einer bestimmten Zeitspanne zu viele Anfragen sendet, erhält er den HTTP-429-Fehler. + +Sie können [fetch-retry](https://github.com/jonbern/fetch-retry) verwenden, um dieses Problem zu lösen: + +```typescript +import * as fetchRetry from 'fetch-retry' + +// Wir geben bis zu 10 Wiederholungsversuche an, mit einer Wiederholungsverzögerung von 1 Sekunde. +const retryFetch = fetchRetry.default(fetch, { + retries: 10, + retryDelay: 1000 +}) +const nodeProvider = new NodeProvider('node-url', undefined, retryFetch) +``` + +### Benutzerdefinierter Wallet-Verbindungsbutton + +`@alephium/web3-react` bietet die `AlephiumConnectButton`-Komponente zur Erleichterung der Entwicklung von Benutzeroberflächen an. Sie können auch `AlephiumConnectButton.Custom` verwenden, um den Stil des Verbindungsbuttons anzupassen: + +```typescript +import { AlephiumConnectButton } from '@alephium/web3' + +function CustomWalletConnectButton = () => { + return ( + + {({ isConnected, disconnect, show, account }) => { + return isConnected ? ( + + ) : ( + + ) + }} + + ) +} +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/dust-amounts.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/dust-amounts.md new file mode 100644 index 00000000..741e7cd5 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/dust-amounts.md @@ -0,0 +1,106 @@ +--- +sidebar_position: 30 +title: Dust Betrag +sidebar_label: Dust Betrag +--- + +Alephium's einzigartiges +[sUTXO](https://medium.com/@alephium/an-introduction-to-the-stateful-utxo-model-8de3b0f76749) +kombiniert die Sicherheit des UTXO-Modells mit der Ausdrucksstärke +des Account-Modells. Alle Vermögenswerte in Alephium, einschließlich +des nativen ALPH und anderer [Tokens](/tokens/overview), werden durch +UTXOs verwaltet. Obwohl das UTXO-Modell viele Sicherheitsvorteile mit +sich bringt (siehe [Asset Permission System](http://localhost:3000/ralph/asset-permission-system)), +geht es auch mit einem Kompromiss einher, der UX-Auswirkungen hat, +insbesondere bei dem Konzept des **Dust-Betrags**. Das Ziel dieses Artikels +ist es, etwas Klarheit zu diesem Thema zu schaffen. + +Jeder UTXO trägt zur Größe des sogenannten [UTXO-Set](https://en.wikipedia.org/wiki/Unspent_transaction_output#UTXO_set) bei. +Ohne einen effektiven Mechanismus zur Kontrolle seiner Größe könnte +das UTXO-Set erhebliche Leistungseinschränkungen für die Blockchain +verursachen, insbesondere hinsichtlich der Ein-/Ausgabe. Die +Aufrechterhaltung eines relativ kleinen UTXO-Sets ist wichtig für +Alephium, um die beste Version von sich selbst zu bewahren: effizient, +leistungsfähig und skalierbar. + +UTXOs mit sehr geringem Wert können auch unwirtschaftlich werden, wenn die +Transaktionsgebühr für die Ausgabe eines UTXOs höher ist als der Wert des +UTXOs selbst.Da es möglich ist, die Vertragskaution zurückzuerhalten, nachdem +der Vertrag zerstört wurde, schafft dies hoffentlich die richtigen Anreize für +Entwickler, die Größe des Vertragszustands auf einem gesunden Niveau zu halten. + +Dies ist ein Problem, dem alle UTXO-basierten Blockchains gegenüberstehen. +Um die Größe des UTXO-Sets zu kontrollieren, führte Bitcoin Core das Konzept +des [Dust](https://bitcoin.stackexchange.com/questions/10986/what-is-meant-by-bitcoin-dust/41082#41082) ein. +Wenn ein Benutzer versucht, einen UTXO mit einem Wert unterhalb des Dust-Limits +zu erstellen, wird Bitcoin Core ihn nicht an das Netzwerk weiterleiten, um eine +Vergrößerung des Blockchain-Zustands zu vermeiden. Das Konzept des Dust-Betrags +in Alephium ähnelt dem Dust-Limit in Bitcoin, ist jedoch noch einfacher zu +verstehen, da es nicht von der Art der Transaktion abhängt. Wenn eine +Transaktionsausgabe nicht mindestens den **Dust-Betrag** von ALPH hat, betrachtet die +Alephium-Blockchain die Transaktion als ungültig. + +Für reguläre UTXOs beträgt der **Dust-Betrag** `0.001` ALPH. Das bedeutet, +dass die folgenden Transaktionen ungültig sind: + +``` +1) ---------------- + | | 0.0005 ALPH (ALPH zu klein) + 1 ALPH | | =============================> +================> | | + | | (0.9995 - Gas Gebühr) ALPH + | | =============================> + ---------------- + +1) ---------------- + | | + | | + | | 1 Token A + 1 Token A | | 0.0005 ALPH (ALPH zu klein) +================> | | =============================> + | | + 1 ALPH | | (0.9995 - Gas Gebühr) ALPH +================> | | =============================> + | | + | | + ---------------- + +1) ---------------- + | | + | | + 1 Token A | | 1 Token A (keine ALPH) +================> | | =============================> + | | + 1 ALPH | | (1 - Gas Gebühr) ALPH +================> | | =============================> + | | + | | + ---------------- +``` + +Der zweite und dritte Fall veranschaulichen die Situation, in der +selbst wenn die Absicht des Benutzers darin besteht, Token A zu senden, +mindestens ein Dust-Betrag von ALPH ebenfalls gesendet werden muss. +Kurz gesagt, jeder reguläre UTXO erfordert mindestens `0,001` ALPH, sonst +wird die Transaktion fehlschlagen. Dieser einfache Ansatz stellt sicher, +dass es eine Obergrenze für die Größe des UTXO-Sets im Alephium-System gibt. + +Jeder Vertrag hat genau einen UTXO im Alephium-System. Der Dust-Betrag für +Vertrags-UTXOs (auch als **Vertragskaution** bekannt) ist derzeit auf `1` ALPH +festgelegt. Im Vergleich zum Dust-Betrag in regulären UTXOs setzt dies eine +viel aggressivere Obergrenze für die Anzahl der Verträge im System, die nicht +nur die Größe des Vertrags-UTXO-Sets begrenzt, sondern auch die Größe der mit +dem Account-Modell verwalteten Vertragszustände. Da es möglich ist, die +Vertragskaution nach der Zerstörung des Vertrags zurückzugewinnen, schafft dies +hoffentlich die richtigen Anreize für Entwickler, die Größe des Vertragszustands +auf einem gesunden Niveau zu halten. + +Aus UX-Sicht bedeutet dies, dass für die Erstellung eines Vertrags mindestens +`1` ALPH als Vertragskaution erforderlich ist. Konkret könnte der Gesamtpreis, +wenn der Preis eines NFT `100` ALPH beträgt, nach Berücksichtigung der +Vertragskaution `101` ALPH betragen. Es bedeutet auch, dass alle Transaktionen, +die das Guthaben des Vertrags auf unter `1` ALPH reduzieren, fehlschlagen werden. + +Zusammenfassend lässt sich sagen, dass der **Dust-Betrag** für UTXOs (und folglich +die **Vertragskaution**) einige UX-Herausforderungen schafft, aber entscheidend für +die Leistung, Skalierbarkeit und Dezentralisierung der Alephium-Blockchain ist. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/ecosystem.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/ecosystem.md new file mode 100644 index 00000000..696cd044 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/ecosystem.md @@ -0,0 +1,46 @@ +--- +sidebar_position: 30 +title: Ökosystem +sidebar_label: Ökosystem +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Netzwerk + +- [Lokales Devnet](https://github.com/alephium/alephium-stack#devnet) (einschließlich Explorer) +- Die APIs für das Testnetz und das Hauptnetz sind [hier dokumentiert](/dapps/public-services#api-aliases). + +## DApp SDK +- [@alephium/web3](https://www.npmjs.com/package/@alephium/web3) +- [@alephium/web3-wallet](https://www.npmjs.com/package/@alephium/web3-wallet) +- [@alephium/web3-test](https://www.npmjs.com/package/@alephium/web3-test) +- [@alephium/cli](https://www.npmjs.com/package/@alephium/cli) +- [@alephium/web3-react](https://www.npmjs.com/package/@alephium/web3-react) +- [@alephium/get-extension-wallet](https://www.npmjs.com/package/@alephium/get-extension-wallet) +- [@alephium/walletconnect](https://www.npmjs.com/package/@alephium/walletconnect-provider) (wird aktualisiert) +- [@alephium/token-list](https://www.npmjs.com/package/@alephium/token-list) + +## Ralph Tools +- [Vscode Erweiterung](https://marketplace.visualstudio.com/items?itemName=alephium.ralph-vscode-alephium) +- [Vim Plugin ](https://github.com/tdroxler/ralph.vim) + +## DApp Wallets +- [Desktop Wallet](https://github.com/alephium/desktop-wallet/releases/latest) +- Extension Wallet: + - [Google Chrome Store](https://chrome.google.com/webstore/detail/alephium-extension-wallet/gdokollfhmnbfckbobkdbakhilldkhcj) + - [Firefox Store](https://addons.mozilla.org/en-US/firefox/addon/alephiumextensionwallet/) +- Mobile Wallet: + - [Android](https://play.google.com/store/apps/details?id=org.alephium.wallet) + - [Apple](https://apps.apple.com/us/app/alephium-wallet/id6469043072) + +## Beispiele + +Hier sind einige gut gepflegte DApps, die eine ausgezeichnete Inspirationsquelle für den Bau neuer DApps sein können. + +- [Beispiele](https://github.com/alephium/ralph-example) +- [DEX](https://github.com/alephium/alephium-dex/tree/master/contracts) +- [NFT](https://github.com/alephium/alephium-nft) +- [Alephium Bridge](https://github.com/alephium/wormhole-fork/tree/add-alephium-to-wormhole/alephium) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/getting-started.md new file mode 100644 index 00000000..585b548d --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/getting-started.md @@ -0,0 +1,329 @@ +--- +sidebar_position: 5 +title: Erste Schritte +sidebar_label: Erste Schritte +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Übersicht + +Alephium stellt mehrere Tools und Pakete bereit, um Ihnen beim Erstellen Ihrer DApps zu helfen. + +Dieser Leitfaden wird Ihnen helfen, unsere empfohlene Einrichtung zu installieren. + +Voraussetzungen: + +- Schreiben Sie Code in [Typescript](https://www.typescriptlang.org/) +- Arbeiten Sie in einem [Terminal](https://en.wikipedia.org/wiki/Terminal_emulator) +- [NodeJS](https://nodejs.org/en/) Version >= 16 installiert +- `npm` Version >= 8 installiert + +## Ein neues Projekt für eine neue DApp erstellen + +Um das Tutorial-Projekt zu erstellen, öffnen Sie ein neues Terminal und führen Sie den folgenden Befehl aus: + +``` +npx @alephium/cli@latest init alephium-tutorial +``` + +Dies erstellt ein neues Verzeichnis mit dem Namen `alephium-tutorial` und initialisiert darin ein Beispielsprojekt. + +## Starten des lokalen Entwicklungsnetzwerks + +Um Ihre Contracts zu kompilieren und zu testen, ist es erforderlich, ein lokales Entwicklungsnetzwerk zu starten. Sie können [diese Anleitung](/full-node/devnet) verwenden, um ein Devnet zu starten. + +Ihr neues Netzwerk ist jetzt mit [dieser Konfiguration](https://github.com/alephium/alephium-stack/blob/master/devnet/devnet.conf) und den generierten Adressen in 4 Gruppen und ausreichend ALPHs für Testzwecke gestartet. + +Durch REST-Endpunkte kann das TypeScript SDK dann mit dem Netzwerk interagieren. + +## Kompilieren Sie ihren Smart Contract + +Ändern Sie als nächstes den Arbeitsbereich zum Tutorial-Projekt: + +``` +cd alephium-tutorial +``` + +Werfen Sie einen Blick in den Ordner `contracts/` dort finden Sie `token.ral`: + +```rust +import "std/fungible_token_interface" + +// Definiert einen Vertrag namens `TokenFaucet`. +// Ein Vertrag ist eine Sammlung von Feldern (seinem Zustand) und Funktionen. +// Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse in der Alephium-Blockchain. +// Vertragsfelder werden dauerhaft im Vertragsspeicher gespeichert. +// Ein Vertrag kann bei seiner Bereitstellung eine anfängliche Menge an Token ausgeben. +Contract TokenFaucet( + symbol: ByteVec, + name: ByteVec, + decimals: U256, + supply: U256, + mut balance: U256 +) implements IFungibleToken { + + // Ereignisse ermöglichen das Protokollieren von Aktivitäten auf der Blockchain. + // Alephium-Clients können Ereignissen lauschen, um auf Änderungen im Vertragszustand zu reagieren. + event Withdraw(to: Address, amount: U256) + + enum ErrorCodes { + InvalidWithdrawAmount = 0 + } + + // Eine öffentliche Funktion, die die anfängliche Versorgung mit Token des Vertrags zurückgibt. + // Beachten Sie, dass das Feld als die Menge der ausgegebenen Token initialisiert werden muss. + pub fn getTotalSupply() -> U256 { + return supply + } + + // Eine öffentliche Funktion, die das Symbol des Tokens zurückgibt. + pub fn getSymbol() -> ByteVec { + return symbol + } + + // Eine öffentliche Funktion, die den Namen des Tokens zurückgibt. + pub fn getName() -> ByteVec { + return name + } + + // Eine öffentliche Funktion, die die Dezimalstellen des Tokens zurückgibt. + pub fn getDecimals() -> U256 { + return decimals + } + + // Eine öffentliche Funktion, die den aktuellen Kontostand des Vertrags zurückgibt. + pub fn balance() -> U256 { + return balance + } + + // Eine öffentliche Funktion, die Token an jeden überträgt, der sie aufruft. + // Die Funktion ist mit `updateFields = true` annotiert, da sie die Vertragsfelder ändert. + // Die Funktion ist als Verwendung von Vertragsvermögenswerten annotiert. + @using(assetsInContract = true, updateFields = true, checkExternalCaller = false) + pub fn withdraw(amount: U256) -> () { + // Debug-Ereignisse können bei der Fehleranalyse hilfreich sein. + emit Debug(`The current balance is ${balance}`) + + // Stellen Sie sicher, dass der Betrag gültig ist. + assert!(amount <= 2, ErrorCodes.InvalidWithdrawAmount) + // Funktionen, die mit ! enden, sind integrierte Funktionen. + transferTokenFromSelf!(callerAddress!(), selfTokenId!(), amount) + // Ralph erlaubt keine Unterlauf. + balance = balance - amount + + // Lösen Sie das zuvor definierte Ereignis aus. + emit Withdraw(callerAddress!(), amount) + } +} +``` + +und `withdraw.ral` : + +```rust +// Definiert ein Transaktionsskript. +// Ein Transaktionsskript ist ein Code-Stück, um mit Verträgen auf der Blockchain zu interagieren. +// Transaktionsskripte können im Allgemeinen die Eingangsvermögenswerte von Transaktionen verwenden. +// Ein Skript ist verbrauchbar und wird nur einmal zusammen mit der Transaktion des Inhabers ausgeführt. +TxScript Withdraw(token: TokenFaucet, amount: U256) { + // Rufen Sie die Abhebungsfunktion des Token-Vertrags auf. + token.withdraw(amount) +} +``` + + Um Ihre Verträge zu kompilieren, führen Sie den folgenden Befehl aus: + +``` +npx @alephium/cli@latest compile +``` + +Die kompilierten Artefakte befinden sich nun im Verzeichnis `artifacts`. + +Dieser Befehl generiert auch TypeScript-Code basierend auf den kompilierten Artefakten. Der generierte TypeScript-Code befindet sich im Verzeichnis `artifacts/ts`. Sie können mit dem generierten TypeScript-Code einfacher mit der Alephium-Blockchain interagieren. + +## Testen Sie ihren Smart Contract + +Das Beispielprojekt wird mit Tests `test/unit/token.test.ts` für Ihren Smart Contract geliefert: + +```typescript +import { web3, Project, TestContractParams, addressFromContractId, AssetOutput, DUST_AMOUNT } from '@alephium/web3' +import { expectAssertionError, randomContractId, testAddress, testNodeWallet } from '@alephium/web3-test' +import { deployToDevnet } from '@alephium/cli' +import { TokenFaucet, TokenFaucetTypes, Withdraw } from '../artifacts/ts' + +describe('unit tests', () => { + let testContractId: string + let testTokenId: string + let testContractAddress: string + let testParamsFixture: TestContractParams + + // Wir initialisieren die Fixture-Variablen vor allen Tests + beforeAll(async () => { + web3.setCurrentNodeProvider('http://127.0.0.1:22973') + await Project.build() + testContractId = randomContractId() + testTokenId = testContractId + testContractAddress = addressFromContractId(testContractId) + testParamsFixture = { + // Eine zufällige Adresse, an der der Testvertrag in den Tests vorhanden ist. + address: testContractAddress, + // Vermögenswerte, die dem Testvertrag vor einem Test gehören. + initialAsset: { alphAmount: 10n ** 18n, tokens: [{ id: testTokenId, amount: 10n }] }, + // Anfangszustand des Testvertrags. + initialFields: { + symbol: Buffer.from('TF', 'utf8').toString('hex'), + name: Buffer.from('TokenFaucet', 'utf8').toString('hex'), + decimals: 18n, + supply: 10n ** 18n, + balance: 10n + }, + // Argumente zum Testen der Ziel-Funktion des Testvertrags. + testArgs: { amount: 1n }, + // assets owned by the caller of the function + inputAssets: [{ address: testAddress, asset: { alphAmount: 10n ** 18n } }] + } + }) + // Weitere Tests finden Sie in `test/unit/token.test.ts` +}) +``` + +Sie können die Tests ausführen mit: + +``` +npm run test +``` + +oder + +``` +npx @alephium/cli@latest test +``` + +## Ihren Smart Contract bereitstellen + +Als nächstes verwenden wir das Alephium CLI und ein Bereitstellungsskript `scripts/0_deploy_faucet.ts`: + +```typescript +import { Deployer, DeployFunction, Network } from '@alephium/cli' +import { Settings } from '../alephium.config' +import { TokenFaucet } from '../artifacts/ts' + +// Diese Bereitstellungsfunktion wird automatisch vom CLI-Bereitstellungstool aufgerufen. +// Beachten Sie, dass Bereitstellungsskripte mit Zahlen (beginnend ab 0) vorangestellt sein sollten. +const deployFaucet: DeployFunction = async ( + deployer: Deployer, + network: Network +): Promise => { + // Einstellungen abrufen + const issueTokenAmount = network.settings.issueTokenAmount + const result = await deployer.deployContract(TokenFaucet, { + // Die Menge der auszugebenden Token + issueTokenAmount: issueTokenAmount, + // Die Anfangszustände des Faucet-Vertrags + initialFields: { + symbol: Buffer.from('TF', 'utf8').toString('hex'), + name: Buffer.from('TokenFaucet', 'utf8').toString('hex'), + decimals: 18n, + supply: issueTokenAmount, + balance: issueTokenAmount + } + }) + console.log('Token faucet contract id: ' + result.contractInstance.contractId) + console.log('Token faucet contract address: ' + result.contractInstance.address) +} + +export default deployFaucet +``` + +Führen Sie die Bereitstellung aus mit: + +``` +npx @alephium/cli@latest deploy +``` + +Dies wird den Token-Faucet in Gruppe 0 des Devnet bereitstellen. Um den Smart Contract auf dem Testnet (oder einem anderen Netzwerk) bereitzustellen, aktualisieren Sie Ihre `alephium.config.ts` und verwenden Sie anschließend folgende Option `--network`: + +``` +npx @alephium/cli@latest deploy --network testnet +``` + +## Mit dem bereitgestellten Smart Contract interagieren + +Nun können Sie den Quellcode `src/token.ts` mit folgendem Inhalt erstellen: + +```typescript +import { Deployments } from '@alephium/cli' +import { DUST_AMOUNT, web3, Project } from '@alephium/web3' +import { testNodeWallet } from '@alephium/web3-test' +import configuration from '../alephium.config' +import { TokenFaucet, Withdraw } from '../artifacts/ts' + +async function withdraw() { + web3.setCurrentNodeProvider('http://127.0.0.1:22973') + // Kompilieren Sie die Verträge des Projekts, wenn sie nicht kompiliert sind. + Project.build() + + // Achtung: Test-Wallet wird zu Demonstrationszwecken verwendet. + const signer = await testNodeWallet() + + const deployments = await Deployments.load(configuration, 'devnet') + + // Die Test-Wallet hat vier Konten, eines in jeder Adressengruppe. + // Die Wallet ruft die Abhebungsfunktion für alle Adressengruppen auf. + for (const account of await signer.getAccounts()) { + // Setzen Sie ein aktives Konto, um Transaktionen vorzubereiten und zu signieren. + await signer.setSelectedAccount(account.address) + const accountGroup = account.group + + // Laden Sie die Metadaten des bereitgestellten Vertrags in der richtigen Gruppe. + const deployed = deployments.getDeployedContractResult(accountGroup, 'TokenFaucet') + if (deployed === undefined) { + console.log(`The contract is not deployed on group ${account.group}`) + continue + } + const tokenId = deployed.contractInstance.contractId + const tokenAddress = deployed.contractInstance.address + + // Übermitteln Sie eine Transaktion, um das Transaktionsskript zu verwenden. + await Withdraw.execute(signer, { + initialFields: { token: tokenId, amount: 1n }, + attoAlphAmount: DUST_AMOUNT + }) + + const faucet = TokenFaucet.at(tokenAddress) + // Holen Sie sich den neuesten Stand des Token-Vertrags. + const state = await faucet.fetchState() + console.log(JSON.stringify(state.fields, null, ' ')) + } +} + +withdraw() + +``` + +Führen Sie einfach folgendes aus: + + +``` +npm run build +``` + +und interagieren Sie mit dem bereitgestellten Token-Faucet. + +``` +node dist/src/token.js +``` + +## Verbindung zu den Wallets + +DApps erfordern eine Wallet-Integration für Benutzer der DApp, um sich zu authentifizieren und mit der Alephium-Blockchain zu interagieren, z. B. das Signieren von Transaktionen. Derzeit können DApps sowohl mit der [Extension Wallet](../wallet/extension-wallet/dapp) +als auch mit [WalletConnect](../wallet/walletconnect) integriert werden. Bitte beachten Sie die jeweiligen Seiten für weitere Details. + +## Weitere Informationen + +- Um mehr über das Ökosystem zu erfahren, besuchen Sie bitte die [Übersicht des Ökosystems](/dapps/ecosystem). +- Um mehr über das Web3 SDK zu erfahren, besuchen Sie bitte die [Anleitung zum Web3 SDK](/dapps/alephium-web3). +- Um mehr über die Ralph-Sprache zu erfahren, besuchen Sie bitte die [Anleitung zu Ralph](/ralph/getting-started). +- Um zu lernen, wie man eine Nextjs DApp erstellt, besuchen Sie bitte [Erstellen Sie eine DApp mit Nextjs](/dapps/build-dapp-with-nextjs.md) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connect-click-extensonwallet.png b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connect-click-extensonwallet.png new file mode 100644 index 00000000..7fd47317 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connect-click-extensonwallet.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connect.png b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connect.png new file mode 100644 index 00000000..498f3f28 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connect.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connected.png b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connected.png new file mode 100644 index 00000000..7ce18820 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-connected.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-open-connect.png b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-open-connect.png new file mode 100644 index 00000000..b243141d Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-open-connect.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-send-token.png b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-send-token.png new file mode 100644 index 00000000..1c8b4ec3 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/dapps/media/nextjs-template-send-token.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/dapps/public-services.md b/i18n/de/docusaurus-plugin-content-docs/current/dapps/public-services.md new file mode 100644 index 00000000..9fde5e5b --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/dapps/public-services.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 50 +title: Öffentliche Dienste +sidebar_label: Öffentliche Dienste +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Testnet Faucet + +Der Testnet-Faucet ist eine Möglichkeit, Testnet-v1-Token in eine bestimmte Wallet zu erhalten. + +### Via HTTP API + +Eine andere Möglichkeit, Testnet-v16-Token zu erhalten, besteht darin, einen HTTP-Aufruf durchzuführen und Ihre Wallet-Adresse im Anfragekörper anzugeben, einfach wie folgt: + +``` +curl -X POST -d '1H1GPLkoMGVUfxQcJgtjWTrKV1KJCQooEV5WxPMhP4Zjy' https://faucet.testnet.alephium.org/send +``` + +Beachten Sie, dass der Faucet Anfragen für einige Minuten drosselt. + +## Node und Explorer APIs + +Aktuell werden die folgenden API-Services gewartet. Beachten Sie, dass alle APIs ratenbegrenzt sind, um Spam zu verhindern. +* `https://wallet-v20.mainnet.alephium.org` für das Mainnet mit Node v2.X ([Doc](https://wallet-v20.mainnet.alephium.org/docs)) +* `https://wallet-v20.testnet.alephium.org` für Testnet mit Node v2.X ([Doc](https://wallet-v20.testnet.alephium.org/docs)) +* `https://backend-v113.mainnet.alephium.org` für das Mainnet einschließlich Explorer-Backend v1.13.X ([Doc](https://backend-v113.mainnet.alephium.org/docs)) +* `https://backend-v113.testnet.alephium.org` für das Testnet einschließlich Explorer-Backend v1.13.X ([Doc](https://backend-v113.testnet.alephium.org/docs)) + +Da das Projekt sich noch in aktiver Entwicklung befindet, sind alle APIs versioniert. In der Regel werden nur die neuesten Versionen gepflegt, aber alle API-Upgrades werden der Community im Voraus angekündigt. + +## API Aliases + +Wir pflegen die folgenden API-Aliase, um Benutzern Zeit für die Migration von der alten API zu geben. + +import aliases from "./api-aliases.json"; + +export const Aliases = ({aliases, type}) => ( + + {aliases.length > 0 &&

{type} Aliases

} +
    {aliases && aliases.map((alias) => { + const from = alias['from']; + const to = alias['to']; + const additionalPath = from.includes('wallet') ? '/infos/version' : from.includes('backend') ? '/infos' : ''; + return
  • {from} (Test) -> {to}
  • ; + })}
+
+) + + + + +## API-Ratenbegrenzung + +Um die beste Leistung und Sicherheit zu gewährleisten, haben alle unsere öffentlichen APIs eine Ratenbegrenzung implementiert. Dies bedeutet, dass es eine Begrenzung für die Anzahl der Anfragen gibt, die Sie innerhalb eines bestimmten Zeitraums machen können. Da unsere Dienste sich weiterentwickeln und wachsen, kann die Ratenbegrenzung basierend auf der tatsächlichen Nutzung des Dienstes angepasst werden. + +Um eine reibungslose Erfahrung bei der Arbeit innerhalb der Ratenbegrenzung zu gewährleisten, empfehlen wir dringend, Cache- und Wiederholungsmechanismen zu implementieren, wenn Anfragen an unsere API-Dienste gestellt werden. Das Zwischenspeichern von Antworten kann dazu beitragen, die Anzahl der API-Aufrufe zu reduzieren, während das Wiederholen fehlgeschlagener Anfragen vorübergehende Probleme oder Fehler behandeln kann. + +Wenn Ihre Anwendung mit dem React-Framework erstellt wurde, können Sie das ["SWR"](https://www.npmjs.com/package/swr)-Paket nutzen, das auf npm verfügbar ist. SWR bietet bequeme Hooks für Datenabruf und Zwischenspeicherung und erleichtert die Arbeit mit APIs. Insbesondere können Sie das `useSWR`-Hook für die Bearbeitung von veränderlichen Daten und das `useSWRImmutable`-Hook für die Bearbeitung von unveränderlichen Daten wie Token-Metadaten verwenden. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/explorer-backend/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/explorer-backend/getting-started.md new file mode 100644 index 00000000..4563e788 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/explorer-backend/getting-started.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 10 +title: Einstieg +sidebar_label: Einstieg +--- + +## Anforderungen + +- Java (11 oder 17 wird empfohlen) +- [PostgreSQL](https://www.postgresql.org) +- [Ein laufender Full Node](full-node/getting-started.md) + +## Anwendungsdatei herunterladen + +Laden Sie die Datei `explorer-backend-x.x.x.jar` von [Github-Release](https://github.com/alephium/explorer-backend/releases/latest) herunter. + +## Erstellen der Datenbank: + +1. Starten Sie den `postgresql`-Dienst. +2. Melden Sie sich bei der PostgreSQL-Shell mit dem Standardbenutzer `postgres` an: + ```shell + psql postgres # or `psql -U postgres` abhängig von Ihrem Betriebssystem + ``` +3. Stellen Sie sicher, dass die Rolle `postgres` existiert, und erstellen Sie diese bei Bedarf. + Alle Rollen auflisten: + ```shell + postgres=# \du + ``` + Erstellen Sie die Rolle `postgres`: + ```shell + postgres=# CREATE ROLE postgres WITH LOGIN; + ``` +4. Erstellen Sie dann die Datenbank: + ```shell + postgres=# CREATE DATABASE explorer; + ``` + +## Starten Sie Ihr Explorer-Backend + +```shell +java -jar explorer-backend-x.x.x.jar +``` + +Ihr Explorer-Backend wird mit dem Full Node synchronisiert. Es kann beim ersten Mal lange dauern. + +## Starten Sie von einem Snapshot + +Um die Zeit für die erste Synchronisierung zu verkürzen, können Sie eine unserer Snapshots wiederherstellen. + +Snapshots sind verfügbar unter https://archives.alephium.org/#mainnet/explorer-db/ + +Laden Sie den neuesten herunter, extrahieren Sie ihn und führen Sie folgendes aus: + +```shell +psql explorer < explorer-db-xxx.pg_dump +``` + +Bitte beachten Sie, dass die `Explorer`-Datenbank zuvor erstellt und leer sein muss. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/devnet.md b/i18n/de/docusaurus-plugin-content-docs/current/full-node/devnet.md new file mode 100644 index 00000000..3f245471 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/full-node/devnet.md @@ -0,0 +1,115 @@ +--- +sidebar_position: 50 +title: Devnet +sidebar_label: Devnet +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +# Ein lokales Devnet erstellen + +## Docker verwenden + +Wenn Sie ein lokales Entwicklungsnetzwerk mit Unterstützung für den Explorer erstellen möchten, verwenden Sie bitte `docker-compose` und befolgen Sie die Anweisungen in [alphium-stack](https://github.com/alephium/alephium-stack#devnet). + +## Manuelle Verwendung von JAR-Dateien + +### Full node + +Laden Sie die Datei `alephium-x.x.x.jar` vom [Github Release](https://github.com/alephium/alephium/releases/latest) herunter (klicken Sie nicht doppelt darauf, die Datei kann nicht auf diese Weise gestartet werden). + +Schreiben Sie eine Konfigurationsdatei unter `~/.alephium/user.conf`. Die unten stehende stammt aus unserem [Alephium-Stack-Repo](https://github.com/alephium/alephium-stack/blob/master/devnet/devnet.conf) + +```conf +# Importieren Sie diese Mnemonic, um 4.000.000 Token Ihrer Adresse zuzuweisen. +# +# vault alarm sad mass witness property virus style good flower rice alpha viable evidence run glare pretty scout evil judge enroll refuse another lava + +alephium.genesis.allocations = [ + { + address = "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH", + amount = 1000000000000000000000000, + lock-duration = 0 seconds + }, + { + address = "14UAjZ3qcmEVKdTo84Kwf4RprTQi86w2TefnnGFjov9xF", + amount = 1000000000000000000000000, + lock-duration = 0 seconds + }, + { + address = "15jjExDyS8q3Wqk9v29PCQ21jDqubDrD8WQdgn6VW2oi4", + amount = 1000000000000000000000000, + lock-duration = 0 seconds + }, + { + address = "17cBiTcWhung3WDLuc9ja5Y7BMus5Q7CD9wYBxS1r1P2R", + amount = 1000000000000000000000000, + lock-duration = 0 seconds + } +] + +alephium.consensus.num-zeros-at-least-in-hash = 0 +alephium.consensus.uncle-dependency-gap-time = 0 seconds +alephium.network.leman-hard-fork-timestamp = 1643500800000 # GMT: 30 January 2022 00:00:00 + +alephium.network.network-id = 4 +alephium.discovery.bootstrap = [] +alephium.wallet.locking-timeout = 99999 minutes +alephium.mempool.auto-mine-for-dev = true +alephium.node.event-log.enabled=true +alephium.node.event-log.index-by-tx-id = true +alephium.node.event-log.index-by-block-hash = true + +alephium.network.rest-port = 22973 +alephium.network.ws-port = 21973 +alephium.network.miner-api-port = 20973 +alephium.api.network-interface = "0.0.0.0" +alephium.api.api-key-enabled = false +alephium.mining.api-interface = "0.0.0.0" +alephium.network.bind-address = "0.0.0.0:19973" +alephium.network.internal-address = "alephium:19973" +alephium.network.coordinator-address = "alephium:19973" + +# arbitrary mining addresses +alephium.mining.miner-addresses = [ + "1FsroWmeJPBhcPiUr37pWXdojRBe6jdey9uukEXk1TheA", + "1CQvSXsmM5BMFKguKDPpNUfw1idiut8UifLtT8748JdHc", + "193maApeJWrz9GFwWCfa982ccLARVE9Y1WgKSJaUs7UAx", + "16fZKYPCZJv2TP3FArA9FLUQceTS9U8xVnSjxFG9MBKyY" +] +``` + +Hinweis: Das Mnemonic (24 Wörter) und die entsprechenden Adressen wurden zu Entwicklungs­zwecken erstellt. Sie können es verwenden oder Ihr eigenes erstellen, verwenden Sie es jedoch niemals auf dem `mainnet`. +Sie können auch weitere Adressen hinzufügen, wenn Sie möchten. Wenn Sie die Adressen später ändern möchten, müssen Sie Ihr Devnet löschen und neu starten. + + +Sie können Ihr Devnet jetzt starten: `devnet`: + +```sh +java -jar alephium-x.x.x.jar +``` + +Sie können nun auf die API des Full Nodes zugreifen: `http://localhost:22973/docs` + +### Explorer-Backend + +Voraussetzung: https://www.postgresql.org/ + +Laden Sie die Datei `explorer-backend-x.x.x.jar` vom [Github Release](https://github.com/alephium/explorer-backend/releases/latest) herunter. + +Verbinden Sie sich mit PostgreSQL und erstellen Sie eine Datenbank für Ihr Devnet. + +```sql +CREATE DATABASE devnet; +``` + +Sie können die [Konfigurationsdatei](https://github.com/alephium/explorer-backend/blob/feature/contract-subcontract/app/src/main/resources/application.conf) überprüfen, um zu sehen, welche Einstellungen überschrieben werden können. Sie können dann Ihr `Explorer-Backend` konfigurieren und starten mit: + +```sh +export BLOCKFLOW_NETWORK_ID=2 +export BLOCKFLOW_PORT=22973 +export DB_NAME=devnet +java -jar explorer-backend-x.x.x.jar +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/docker-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/full-node/docker-guide.md new file mode 100644 index 00000000..f5736ed5 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/full-node/docker-guide.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 20 +title: Dockerisierter Full Node Leitfaden +sidebar_label: Dockerisierter Full Node Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + + +Anweisungen, wie Sie einen Full Node mit `docker-compose` in 1 Minute ausführen können, finden sie hier: [https://github.com/alephium/alephium-stack](https://github.com/alephium/alephium-stack) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/full-node-more.md b/i18n/de/docusaurus-plugin-content-docs/current/full-node/full-node-more.md new file mode 100644 index 00000000..fb69254b --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/full-node/full-node-more.md @@ -0,0 +1,110 @@ +--- +sidebar_position: 40 +title: Problembehebung und Mehr +sidebar_label: Problembehebung und Mehr +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## API-Schlüssel + +Es ist eine gute Praxis, einen API-Schlüssel zu verwenden, um den Zugriff auf die REST-Endpunkte Ihres Full Node zu beschränken. + +### Einrichtung des API-Schlüssels + +Fügen Sie bitte folgendes zu Ihrer `user.conf` hinzu, indem Sie die Nullen durch Ihren eigenen Schlüssel (>= 32 Zeichen) ersetzen. + +``` +alephium.api.api-key = "--- your own key with >= 32 characters" +``` + +Starten Sie Ihren Full Node neu, damit dies wirksam wird. + +#### Generieren eines API-Schlüssels + +Für GNU/ Linux: `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 48 | head -n 1` + +### API-Schlüssel benutzen + +1. Klicken Sie auf die Schaltfläche `Authorize` oben rechts in Ihrer Swagger-Benutzeroberfläche: + ![full-node-api-key-auth0](media/full-node-api-key-auth0.png) + +2. Füllen Sie das Wertfeld mit Ihrem Schlüssel aus und klicken Sie auf die Schaltfläche "Authorize": + ![full-node-api-key-auth1](media/full-node-api-key-auth1.png) + +Nun können Sie Swagger UI verwenden, als ob kein API-Schlüssel vorhanden wäre. + +## Wie mache ich die API meiner Full Node öffentlich zugänglich? + +1. Richten Sie Ihren API-Schlüssel gemäß der oben stehenden Anleitung ordnungsgemäß ein. + +2. Fügen Sie das Folgende zu Ihrer `user.conf` hinzu und starten Sie Ihren Full Node neu. + +``` +alephium.api.network-interface = "0.0.0.0" +``` + +## Wie greife ich auf die Swagger UI meines Full Node von einem anderen Computer im selben Subnetz aus zu? + +1. Fügen Sie folgendes zu Ihrer `user.conf` hinzu und starten Sie Ihren Full Node neu. + +``` +alephium.api.network-interface = "0.0.0.0" +``` + +2. Ändern Sie den `host` der Swagger UI auf die Subnetz-IP Ihres Full Nodes. + +## Fehler "java.lang.AssertionError: assumption failed" + +Dieser Fehler tritt häufig aufgrund von Verbindungsverlust während der Node Synchronisierung auf und bedeutet, dass einige der Dateien beschädigt sind. +Um das Problem zu beheben: + +1. Löschen Sie den Ordner .alephium mit `rm .alephium` + +2. Starten Sie den Node neu und warten sie auf die Synchronisierung `java -jar alephium-x.x.x.jar` + +## Verschieben des Alephium-Datenordners + +Viele Benutzer bevorzugen es, den Alephium-Datenordner auf einer anderen Festplatte als der primären Startfestplatte zu speichern. Hierzu können Sie die Umgebungsvariable `ALEPHIUM_HOME` im Alephium-Full-Node-Jar nutzen: + +1. Stoppen Sie die Alephium Full Node-Jar +2. Verschieben Sie den Alephium-Datenordner (normalerweise unter `%userprofile%\.alephium` für Windows oder `~/.alephium` für Linux und macOS) an den neuen Speicherort +3. Fügen Sie eine Umgebungsvariable `ALEPHIUM_HOME` auf Systemebene hinzu, die auf den neuen Speicherort verweist. Dies können Sie entweder auf Systemebene durchführen oder einfach eine Batch-Datei erstellen, die die Variable vor dem Starten des Alephium-Jars festlegt. +4. Starten Sie den Alephium-Node neu + +Wenn Sie den Docker - Full Node verwenden, passen Sie einfach die Definitionen der eingebundenen Ordner in der Docker-Datei an, um auf das neue Verzeichnis zu zeigen, und starten Sie dann den Node neu. + +## Anpassen des Protokolls + +Es gibt mehrere Umgebungsvariablen, die für das Protokollieren verwendet werden: + +- `ALEPHIUM_LOG_LEVEL` ändert das Konsolen-Protokollniveau. +- `ALEPHIUM_ENABLE_DEBUG_LOGGING` ändert die Debug-Protokollierung. +- `ALEPHIUM_HOME` ändert den Hauptordner des Full Nodes, daher auch den Ordner der Protokolle. + +Im Folgenden finden sie ein Beispiel mit allen möglichen Protokolloptionen: + +``` +ALEPHIUM_HOM= ALEPHIUM_LOG_LEVEL= ALEPHIUM_ENABLE_DEBUG_LOGGING= java -jar alephium-x.x.x.jar +``` + +Es ist auch möglich, die [Protokoll-Konfigurationsdatei](https://github.com/alephium/alephium/blob/master/flow/src/main/resources/logback.xml) von Alephium zu überschreiben. + +``` +java -Dlogback.configurationFile=/path/to/config.xml alephium-x.x.x.jar +``` + +## Pruning (Beschneidung) + +Ein vollständig synchronisierter Alephium-Full-Node benötigt mehr als 80 GB Festplattenspeicher, um Blockchain-Daten zu speichern. Seit Version `2.6.1` unterstützt der Alephium-Full-Node das Pruning der Festplatte, was den Speicherbedarf erheblich reduzieren kann. + +Hier sind die Schritte des Prunings des Alephium Full Nodes: + +1. Stellen Sie sicher, dass der Alephium-Full-Node gestoppt ist. +2. Laden Sie `alephium-tools-2.6.1.jar` von https://github.com/alephium/alephium/releases/tag/v2.6.1 herunter. +3. Wenn Sie das Standard-Alephium-Verzeichnis geändert haben, setzen Sie die Umgebungsvariable `ALEPHIUM_HOME` +4. Führen Sie den folgenden Befehl aus: `java -cp alephium-tools-2.6.1.jar org.alephium.tools.PruneStorage` um mit dem Beschneiden zu beginnen. +5. Warten Sie, bis der Befehl abgeschlossen ist. Der Festplattenspeicher sollte auf etwa 20 GB reduziert sein. +6. Starten Sie den Alephium Full Node neu. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/full-node/getting-started.md new file mode 100644 index 00000000..af0b5824 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/full-node/getting-started.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 10 +title: Einstieg +sidebar_label: Einstieg +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Anforderungen + +Stellen Sie sicher, dass Java (11 oder 17 wird empfohlen) auf Ihrem Computer installiert ist: + +- Windows oder macOS: [https://adoptopenjdk.net/](https://adoptopenjdk.net/) +- Ubuntu: führen sie `sudo apt install default-jdk` in Ihrem Terminal auf + +## Anwendungsdatei herunterladen + +Laden Sie die Datei `alephium-x.x.x.jar` vom [Github-Release](https://github.com/alephium/alephium/releases/latest) herunter (klicken Sie nicht doppelt darauf, da sie auf diese Weise nicht gestartet werden kann). + +## Starte deinen Node (Knoten) + +1. Öffnen Sie die Suche und geben Sie im `Terminal` (für Mac und Ubuntu) oder der `Eingabeaufforderung` (für Windows) ein. +2. Geben Sie im Terminal-/Eingabeaufforderungsprogramm `cd Ihr-jar-File-Pfad` ein, um in das Verzeichnis zu wechseln, in dem die Datei **alephium-x.x.x.jar** gespeichert ist. +3. Geben Sie den folgenden Befehl ein und drücken Sie Enter, um den Full Node zu starten: + ```shell + java -jar alephium-x.x.x.jar + ``` + +🎉 _**Tada, Ihr Node ist aktiviert.**_ + +- Ihr Node beginnt, sich mit dem Netzwerk zu synchronisieren. Es kann beim ersten Mal eine Weile dauern. Ihr Node ist vollständig synchronisiert, wenn die Blockhöhe in den Terminalprotokollen mit derjenigen in den neuesten Blöcken des [Explorers] übereinstimmt. +- Wenn Sie das Terminal schließen, wird der Node ausgeschaltet. +- Alle Blockchain-Daten werden im Ordner `.alephium` unter Ihrem Benutzerverzeichnis [^1] gespeichert. + +### Swagger + +Wir verwenden OpenAPI, um mit dem Full Node zu interagieren. Sie können direkt die Swagger-Benutzeroberfläche öffnen unter: [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs). + +Alternativ können Sie jeden OpenAPI-Client verwenden, um die Datei +aus unserem Repository `openapi.json` zu importieren. ([Download](https://github.com/alephium/alephium/raw/master/api/src/main/resources/openapi.json)). + +### Mining + +Für ein Mining-Tutorial können Sie unserer Anleitung zum [Solo Mining Guide](mining/solo-mining-guide.md) oder [Pool Mining Guide](mining/pool-mining-guide.md) folgen. + +### Wallet + +Sie können die Desktop Wallet von hier [GitHub](https://github.com/alephium/desktop-wallet/releases/latest) herunterladen. + +Alternativ verfügt unsere Full Node über eine integrierte Wallet mit erweiterten Funktionen. Sie können unserem [Wallet Guide](wallet/node-wallet-guide.md) folgen, um zu lernen, wie Sie die Wallet verwenden können. + +[^1]: Der Home-Ordner hängt von Ihrem System ab: `C:\Users\` unter Windows, `/Users/` auf macOS, `/home/` unter Linux. + +[explorer]: https://explorer.alephium.org diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/loading-snapshot.md b/i18n/de/docusaurus-plugin-content-docs/current/full-node/loading-snapshot.md new file mode 100644 index 00000000..8078c484 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/full-node/loading-snapshot.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 35 +title: Laden aus dem Snapshot +sidebar_label: Laden aus dem Snapshot +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +# Full node + +Der allererste Start eines Full Nodes, wie im [Einstiegshandbuch](./getting-started) beschrieben, dauert einige Stunden, bis er vollständig mit den anderen Nodes im Netzwerk synchronisiert ist. Anders ausgedrückt, bis er eine Kopie der gesamten Blockchain heruntergeladen hat. + +Um diesen anfänglichen Synchronisierungsprozess zu beschleunigen, stehen Snapshots im +[dedizierten Alephium Archives Repository](https://archives.alephium.org) zur Verfügung. Ein automatisierter Prozess lädt Snapshots sowohl für das [Testnet](https://archives.alephium.org/#testnet/) als auch für das [Mainnet](https://archives.alephium.org/#mainnet/) hoch. + +## Einen Snapshot herunterladen + +Beim Vorbereiten des Full Node für seinen ersten Start, kurz bevor Sie ihn starten, können Sie den neuesten Snapshot herunterladen und (es handelt sich um eine `tar`-Datei) an der richtigen Stelle extrahieren. Der folgende Codeausschnitt führt dies sogar inline aus, d.h., ohne den benötigten Festplattenspeicherplatz für den Download und das Extrahieren des Snapshots zu verdoppeln: + +```shell +ALEPHIUM_HOME=~/.alephium +ALEPHIUM_NETWORK=mainnet +curl -L "$(curl -s https://archives.alephium.org/archives/$ALEPHIUM_NETWORK/full-node-data/_latest.txt)" | tar xf - -C "$ALEPHIUM_HOME/" +``` + +Eine spezielle Datei mit dem Namen `_latest.txt` wird regelmäßig aktualisiert und zeigt stets auf den aktuellsten verfügbaren Snapshot, um Ihnen die Nutzung zu erleichtern. + +## Die Verwendung eines vorgefertigten Skripts + +Die oben gegebene Anleitung funktioniert zwar, deckt jedoch nicht alle möglichen Fehlerfälle ab, die auftreten können und dazu führen können, dass die Datenbank des Full Node in einem inkonsistenten Zustand bleibt. Glücklicherweise hilft Ihnen ein einsatzbereites Skript bei dieser Aufgabe. + +```shell +ALEPHIUM_HOME=/tmp +ALEPHIUM_NETWORK=mainnet +curl -L https://github.com/touilleio/alephium-standalone/raw/main/snapshot-loader.sh | env ALEPHIUM_HOME=${ALEPHIUM_HOME} ALEPHIUM_NETWORK=${ALEPHIUM_NETWORK} sh +``` + +## Starten eines eigenständigen Containers + +Und schließlich, wenn Sie dieses Setup schnell ausprobieren möchten, erledigt ein OCI-Image, das einfach das offizielle `alephium/alephium`-Image erweitert, automatisch alle oben beschriebenen Schritte: `touilleio/alephium-standalone`. Sein [Quellcode](https://github.com/touilleio/alephium-standalone) enthält alle erforderlichen Details zur Verwendung. + +Ein kurzer Referenzbefehl zum Starten des eigenständigen Containers ist unten für die einfache Verwendung aufgeführt: + +``` +ALEPHIUM_HOME=/tmp +ALEPHIUM_NETWORK=mainnet +docker run -p 39973:39973 -p 127.0.0.1:12973:12973 \ + -v ${ALEPHIUM_HOME}:/alephium-home/.alephium \ + -e ALEPHIUM_NETWORK=${ALEPHIUM_NETWORK} touilleio/alephium-standalone:latest +``` + +# Explorer Datenbank + +Das [Alephium Archives Repository](https://archives.alephium.org) enthält zudem Explorer-Datenbanksnapshots. Beim ersten Start können Sie den Snapshot in die PostgreSQL-Datenbank des Explorer-Backends laden, indem Sie den folgenden Befehl verwenden: + +```shell +ALEPHIUM_NETWORK=mainnet +curl -L $(curl -L -s https://archives.alephium.org/archives/${ALEPHIUM_NETWORK}/explorer-db/_latest.txt) | gunzip -c | psql -U $pg_user -d $database +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/flashing.jpeg b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/flashing.jpeg new file mode 100644 index 00000000..56b899da Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/flashing.jpeg differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-api-key-auth0.png b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-api-key-auth0.png new file mode 100644 index 00000000..b707550e Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-api-key-auth0.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-api-key-auth1.png b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-api-key-auth1.png new file mode 100644 index 00000000..67a4a834 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-api-key-auth1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-synced-query.png b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-synced-query.png new file mode 100644 index 00000000..18b9a040 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/full-node-synced-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/pies.jpeg b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/pies.jpeg new file mode 100644 index 00000000..5a4d9a5a Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/full-node/media/pies.jpeg differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/full-node/raspberry-pi.md b/i18n/de/docusaurus-plugin-content-docs/current/full-node/raspberry-pi.md new file mode 100644 index 00000000..111c73f2 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/full-node/raspberry-pi.md @@ -0,0 +1,158 @@ +--- +sidebar_position: 30 +title: Full Node auf dem Raspberry Pi +sidebar_label: Full Node auf dem Raspberry Pi +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + + +In diesem Leitfaden werden wir lernen: + +- Wie man einen Raspberry Pi 4 installiert +- Wie man eine Docker-Instanz eines Alephium-Full-Nodes ausführt + +## Wie man einen Raspberry Pi 4 installiert + +Dieser erste Abschnitt wird meinen persönlichen Weg zur Installation von Ubuntu 20.04 Server auf einem Raspberry Pi 4 beschreiben. +Es erfordert einen Raspberry Pi 4 (offensichtlich), eine SD-Karte (mindestens 8 GB) und einen SD-Kartenleser, um die SD-Karte zu flashen. +Es wird mit Shell-Befehlen von macOS illustriert, aber du findest das Äquivalent in Windows. + +![Bereit machen für die harte Arbeit](media/flashing.jpeg) + +Zuerst werden wir die Installation von Ubuntu konfigurieren. Hierfür verwenden wir cloud-init, da es in Ubuntu 20.04 und höher integriert ist. Diese Konfiguration erstellt einen Benutzer (abweichend vom standardmäßigen `ubuntu`) und installiert einige Pakete. + +### Boot-Konfiguration einrichten + +Füge den unten stehenden Ausschnitt in eine Datei mit dem Namen `user-data.yml` ein und speichere sie. Diese erstellt einen Benutzer `alephium` mit dem Passwort `installfest2021`. +Du kannst den Inhalt dieser Datei anpassen, wenn du weist, was du tust. + +```yaml +#cloud-config + +hostname: alephium + +ssh_pwauth: true + +users: + - name: alephium + gecos: "alephium" + sudo: ALL=(ALL) NOPASSWD:ALL + shell: /bin/bash + groups: adm,sudo,docker + plain_text_passwd: installfest2021 + lock_passwd: false + chpasswd: { expire: false } +# ssh_authorized_keys: # Optional hier den SSH-Schlüssel hinzufügen, wenn Sie das Passwort nicht verwenden möchten. +# - ssh-ed25519 xxxxxxxxxxxxxxxxxx + +packages: + - apt-transport-https + - ca-certificates + - curl + - gnupg-agent + - software-properties-common + - git + - openssh-server + - docker.io + - docker-compose + +runcmd: + - systemctl start docker + - systemctl enable docker + +package_update: true +package_upgrade: true + +power_state: + mode: reboot +``` + +### Flashen der SD-Karte + +Nun werden wir die SD-Karte mit dieser Datei flashen. `user-data.yml`. + +Ich nutze dafür das Tool [Flash](https://github.com/hypriot/flash/), welches die schwierigste Arbeit für uns erledigt. + +```shell +curl -LO https://github.com/hypriot/flash/releases/download/2.7.2/flash +chmod +x flash + +./flash --userdata user-data.yml https://cdimage.ubuntu.com/releases/20.04/release/ubuntu-20.04.4-preinstalled-server-arm64+raspi.img.xz +``` + +Der oben genannte Befehl wird um eine Bestätigung bitten, dass `/dev/disk2` die SD-Karte und nicht deine Festplatte ist, und wird nach dem Passwort fragen, da das Flashen einer SD-Karte Administratorrechte erfordert. + +Sobald der oben genannte Befehl abgeschlossen ist, kannst du die SD-Karte in deinen Raspberry Pi einlegen und ihn einschalten. Es dauert einige Minuten, bis der erste Start vollständig ausgeführt ist, anschließend ist dein Raspberry Pi bereit zur Verwendung. Sobald der Knoten bereit ist, kannst du dich per SSH anmelden, indem du `alephium` als Benutzernamen und `installfest2021` als Passwort verwendest! + +```shell +ssh alephium@alephium +``` + +Wenn der Host `alephium` unbekannt sein sollte, musst du nach der IP-Adresse des Knotens suchen, höchstwahrscheinlich auf der Konfigurations-Seite/App deines Routers. + +Und das wars, dein Raspberry Pi läuft mit Docker unter Ubuntu 20.04 und ist bereit, einen vollständigen Alephium-Knoten auszuführen. + +🚀 + +![Raspberry pi 4](media/pies.jpeg) + +## Wie man eine dockerisierte Instanz eines vollständigen Alephium-Knotens ausführt: + +Diese zweite Sektion ist nicht spezifisch für einen Raspberry Pi, sondern kann auf jeden Server/VM/Computer mit SSH-Zugang eingerichtet werden. Wir werden die einfachste Version eines Alephium-Full-Node mit Docker ausführen und dann Schritt für Schritt vorgehen, um die Einrichtung bequemer zu gestalten. + +Als Voraussetzung für diesen Abschnitt müssen wir einen Server mit SSH-Zugriff haben, der genauer gesagt Ubuntu 20.04 oder höher ausführt. Der vorherige Abschnitt erklärt, wie das mit einem Raspberry Pi gemacht wird, aber eine AWS EC2-Instanz würde ebenfalls funktionieren. + +### Mit dem Server verbinden + +Das sollte ein einfacher Schritt mit dem `ssh` -Befehl sein. Führe folgendes aus: + +```shell +ssh alephium@alephium +``` + +### Docker und Docker-Compose installieren + +Lass uns schnell Docker und Docker Compose installieren, damit wir bereit sind, die Alephium-Full-Node auszuführen. + +Nach dem SSH-Zugriff führe die folgenden Befehle aus: + +```shell +sudo apt install -y docker.io docker-compose +``` + +Großartig, Docker sollte nun ausgeführt werden: + +```shell +docker ps +``` + +### Führe die Full Node aus + +Nun kannst du die Full Node mit einer einzigen Zeile wie folgt ausführen: + +```shell +docker run -it --rm -p 12973:12973 --name alephium alephium/alephium:latest +``` + +### Docker-compose + +Docker-Compose ist eine etwas bequemere Möglichkeit, einen Container auszuführen, insbesondere wenn der Befehl Volumes, mehr Ports, Umgebungsvariablen usw. enthält. + + +Hier ist die Servicedefinition, die du in einer `docker-compose.yml`-Datei platzieren und einfach `docker-compose up -d` aufrufen kannst, um deine Full Node von dieser Definition aus zu starten. + +```yaml +version: "3" +services: + broker: + image: "alephium/alephium:latest" + restart: unless-stopped + ports: + - 9973:9973/tcp + - 9973:9973/udp + - 10973:10973/tcp + - 12973:12973/tcp +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/glossary.md b/i18n/de/docusaurus-plugin-content-docs/current/glossary.md new file mode 100644 index 00000000..eadcbc17 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/glossary.md @@ -0,0 +1,259 @@ +--- +sidebar_position: 30 +sidebar_label: Glossar +slug: /glossar +title: Glossar +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Dies ist eine allgemeine Liste nützlicher Konzepte zur besseren Verständnis von Alephium im Besonderen und Blockchains. + +## A + +### Alephium + +Alephium ist die erste funktionsfähige L1-Blockchain, die erfolgreich das sharding-Prinzip implementiert und die Konzepte von PoW und UTXO skalierbar und verbessert umsetzt. Diese Blockchain vereint Dezentralisierung, Selbstbestimmung und Sicherheit mit herausragender Leistung, Zugänglichkeit und Energieeffizienz. Das Ergebnis ist ein entwicklerfreundliches Netzwerk, das speziell für die Optimierung von DeFi- und Smart-Vertragsanwendungen konzipiert wurde. + +Von seinem technischen Design bis zu seinen Schnittstellen wurde Alephium geschaffen, um den Herausforderungen der Zugänglichkeit, Skalierbarkeit und Sicherheit zu begegnen, denen dezentrale Anwendungen heute gegenüberstehen. + +## B + +### Blake 3 Algorithmus (Hash Funktion) +[Blake 3 Algorithmus](https://github.com/BLAKE3-team/BLAKE3) ist eine kryptografische Hash-Funktion. Eine Hash-Funktion ist eine mathematische Funktion, die eine Eingabesequenz beliebiger Länge entgegennimmt und sie in eine Ausgabesequenz fester Länge umwandelt. Die Ausgabesequenz fester Länge wird als Hash-Wert bezeichnet. + +Hashfunktionen haben viele Anwendungsfälle in einer Blockchain: im [Merkle Tree](#merkle-tree), im Proof-of-Work-Konsens, bei digitalen Signaturen und in der Blockchain selbst (da jeder Blockkopf(Block-Header) in einem Block in der Blockchain den Hash des vorherigen Blockkopfs enthält). Bitcoin verwendet beispielsweise den [SHA-256.](https://en.wikipedia.org/wiki/SHA-2) + +Alephium verwendet den Blake-3-Algorithmus als seine kryptografische Hash-Funktion für das Mining. + +### Block Reward (Blockbelohnung) + +Die Blockbelohnung ist ein wirtschaftlicher Anreiz für die Miner, ihre Aufgabe der Sicherung des Netzwerks zu erfüllen. + +Sie wird in der nativen Token der Blockchain gezahlt. In der Regel ist sie höher, wenn das Netzwerk klein und neu ist, und nimmt im Laufe der Zeit ab, wenn es reift. + +[Blockbelohnung GitHub Implementierung](https://github.com/alephium/alephium/blob/master/protocol/src/main/scala/org/alephium/protocol/mining/Emission.scala) + +### Blockgröße + + +Die Blockgröße ist die Datenbegrenzung, die jeder Block verarbeiten kann. + +Sie kann auf verschiedene Arten gemessen werden. In einigen Blockchains wird sie durch die tatsächlichen Datenmengen ausgedrückt, die der Block tragen kann (beispielsweise beträgt die Blockgröße bei Zcash 2 MB). In anderen Blockchains hängt die Blockgröße mit der berechneten Verarbeitungsgrenze zusammen, die das Netzwerk verbrauchen kann (üblicherweise in Gas ausgedrückt). Die Blockgrößen von Ethereum und Alephium werden auf diese Weise gemessen. + +### Blockzeit + +Die Blockzeit ist die Zeit, die benötigt wird, um die Transaktionen innerhalb eines Blocks zu berechnen und ihn an das Netzwerk zu senden. + +Transaktionen werden in einem Block gesammelt und von den Minern (oder Validatoren in PoS-Blockchains) überprüft. In der Regel wird die Blockzeit von der Mining-Schwierigkeit beeinflusst, da sie angepasst wird, um die Rechenkapazität (Hashrate) des Netzwerks über eine bestimmte Zeitperiode widerzuspiegeln. + +Das Alephium-Netzwerk hat eine Schwierigkeitsanpassung bei jedem Block und eine erwartete Blockzeit von **64 sekunden**. + +Additional resources: [Artikel zu Blockzeit and Blockgröße](https://medium.com/@alephium/block-time-and-block-size-16e37292444f) + +### Bridge + +Eine Bridge ist ein Protokoll, das separate Blockchains verbindet, um Interaktionen zwischen ihnen zu ermöglichen. Jede Blockchain hat normalerweise ihre eigenen technologischen Merkmale und verfügt nicht über eine native Möglichkeit zur Kommunikation mit anderen Protokollen. Die Bridge besteht daher aus einer Gruppe von Smart Contracts, die diese verschiedenen Ökosysteme miteinander verbinden. + +Eine Bridge kann spezialisierter sein und nur eine Art von Interaktion ermöglichen (wie zum Beispiel Token-Transfers) oder sie kann allgemeiner sein und jeglichen Datenaustausch zwischen den verbundenen Blockchains ermöglichen. + +## C + +## D + +## E + +## F + +## G + +### Gast Amount Spent (Gasbetrag ausgegeben) + +Gas Spent ist die Menge an Berechnungen, die der Miner verwendet, um die Transaktionen auszuführen. Je mehr Funktionen die Transaktion hat, desto komplexer ist ihre Ausführung, und desto mehr Gas wird ausgegeben. + +Derzeit gibt es als Spam-Schutz eine Mindestgrenze von 20.000 Gas für jede Transaktion auf Alephium, was bedeutet, dass die Transaktionsgebühr mindestens 0,002 ALPH betragen wird. + +Mit zunehmender Reife des Netzwerks wird dies gelockert, und der Markt wird den Preis für Transaktionsgebühren festlegen. + +### Gaspreis + +Dies ist der monetäre Wert des Gases. Gas wird als der Rechenaufwand definiert, um einen Befehl in einer Blockchain auszuführen. Der Gaspreis ist der monetäre Gegenwert, um die vom Miner durchgeführte Arbeit zu bezahlen. + +Der aktuell niedrigste mögliche Gaspreis auf Alephium beträgt 10^-7 ALPH oder 0,0000001 ALPH. + +### Genesis Block + +Ein Genesis-Block ist der Name des allerersten Blocks, der jemals in einer Blockchain gemined wurde. Da die Blöcke übereinander gestapelt werden, bildet der Genesis-Block das Fundament oder den Anfang der Blockchain. + +Er wird gelegentlich auch als Block 0 oder Block 1 bezeichnet. Wenn ein Block an die Blockchain übertragen wird, verweist er auf den vorherigen Block. Da es keinen vorherigen Block zum Verweisen gibt, sind Genesis-Blöcke in der Regel im Softwarecode fest codiert. + +Der Genesis-Block von Alephium wurde am 8. November 2021 gemined. + +## H + +### Hard Fork (Harte Gabel) + +Ein Hard Fork tritt auf, wenn ein bedeutendes Upgrade des Protokolls eines Netzwerks dazu führt, dass Knoten oder Benutzer, die die vorherige Version ausführen, nach dem Upgrade keine Transaktionen mehr senden oder validieren können. + +Da das Upgrade optional ist, entscheiden sich manchmal einige der Knoten oder Benutzer dagegen, es durchzuführen, wodurch ab diesem Zeitpunkt eine unterschiedliche Version der Blockchain entsteht. Das geschah zum Beispiel bei Ethereum und Ethereum Classic. + +## I + +## J + +## K + +## L + +## M + +### Merkle Tree (Merkle-Baum) + +Ein Merkle-Tree [ist eine Struktur](https://en.wikipedia.org/wiki/Merkle_tree), die in einer Blockchain verwendet wird, um Daten effizienter und sicherer zu komprimieren. +Die Blockchain packt die Transaktionen in Blöcken. Jeder Block hat einen Header, und dieser Header hat einen Hash. Dieser Hash wird im Merkle-Baum gespeichert. Der Hash aus dem Merkle-Baum wird verwendet, um zu überprüfen, dass ein Datensatz mit dem ursprünglichen Satz von Transaktionen identisch ist, ohne auf den Inhalt innerhalb des Blocks zugreifen zu müssen. Wenn dies visualisiert wird, ähnelt diese Struktur einem Baum und kann auch als "binärer Hash-Baum" bezeichnet werden. + +Zum Beispiel verwendet Alephium drei Merkle-Bäume pro Gruppe, um Assets-UTXOs, Vertragslogik und Vertragszustand zu speichern. + +### Maximal Extractble Value (MEV) + +Miner oder [Maximal Extractable Value (MEV)](https://ethereum.org/en/developers/docs/mev/) bezieht sich auf den Wert, der durch das Mining eines Blocks über die standardmäßige Blockbelohnung und Gasgebühren hinaus durch Ändern, Hinzufügen oder das Entfernen von Transaktionen in einem Block erzielt wird. + +Diese Differenz wird von Akteuren angeboten, die als "Sucher" bezeichnet werden und den Mempool analysieren, um Profitmöglichkeiten zu finden, indem sie Informationen zu einer bestimmten Transaktion ersetzen, wie beispielsweise den Sender oder Empfänger. Um die Wahrscheinlichkeit zu erhöhen, dass ihre Transaktion vom Miner ausgewählt wird, um Teil des nächsten produzierten Blocks zu sein, sind sie bereit, eine viel höhere Gasgebühr als die Durchschnittsgebühr zu zahlen und somit einen Teil des Gewinns abzugeben oder zu "teilen". + +### Mining Reward + +![](media/Block%20reward.png) + +Die Belohnung für neu generierte Blöcke in Alephium wird auch als Mining Reward (MR) bezeichnet. Nach der Verteilung werden die [Block Rewards](#block-reward) für 500 Minuten gesperrt. + +Die Mining-Belohnung ist durch zwei Kurven gebunden, die auf Hashrate und Zeitstempel basieren. Zu einem bestimmten Zeitpunkt und für eine gegebene Hashrate entspricht die Belohnung pro Block dem Minimum zwischen der zeitbasierten Belohnung und der hashrate-basierten Belohnung. + +Block Reward = min( zeitbasierte Belohnung, hashrate-basierte Belohnung ). + +Zusätzliche Ressourcen: [Alephium Block Rewards](https://medium.com/@alephium/alephium-block-rewards-72d9fb9fde33) + +### Multisig + +Multisig oder Multisignatur ist der Prozess, bei dem mehr als ein privater Schlüssel erforderlich ist, um eine Transaktion zu co-signieren, bevor sie an das Netzwerk übertragen wird. Es wird als zusätzlicher Sicherheitsschritt verwendet. + +In der Regel wird die Multisig-Konfiguration so konzipiert, dass eine bestimmte Transaktion nur dann genehmigt und versendet werden kann, wenn ein vordefiniertes Quorum von Unterzeichnern erreicht wird. Zum Beispiel erfordert eine Multisig mit einer 5-von-9-Konfiguration ein Quorum von 5 Unterzeichnern (aus neun potenziellen Mitunterzeichnern), um die Transaktion gemeinsam zu unterzeichnen, bevor sie gesendet werden kann. + +Alephium’s [Full Node Wallet](/wallet/node-wallet-guide) unterstützt Multisig Adressen + +## N + +## O + +## P + +### Proof of Less Work (or PoLW) + +Ähnlich wie der Proof-of-Work für Bitcoin oder der Proof-of-Stake für Ethereum (nach dem Merge) ist PoLW der Konsensalgorithmus von Alephium. Er optimiert den Energieverbrauch des Netzwerks, ohne dabei die Sicherheit und Dezentralisierung zu beeinträchtigen. Er wird aktiviert, wenn das Netzwerk eine kumulierte Hashrate von 1 Eh/s überschreitet. + +Danach internalisiert es teilweise die Kosten für das Minen eines neuen Blocks, indem es einen Coin-Burning-Mechanismus in den Blockvalidierungsprozess integriert, was dazu beiträgt, eine Begrenzung der insgesamt benötigten Rechenleistung zu fördern. Bei gleichen Netzwerkbedingungen würde Alephium nur ⅛ der Energie verbrauchen, die beim Bitcoin-Mining verbraucht wird. + +Zusätzliche Ressourcen: [TECH TALK #1 — Der ultimative Leitfaden zu Proof-of-Less-Work, dem Universum und allem anderen...](https://medium.com/@alephium/tech-talk-1-the-ultimate-guide-to-proof-of-less-work-the-universe-and-everything-ba70644ab301) + +## Q + +## R + +## S + +### Sharding + +Sharding ist eine Strategie des Datenbankmanagements, die große Datenbanken in kleinere, schnellere und leichter zu verwaltende Abschnitte aufteilt. + +Diese kleineren Teile werden als [“shards”](https://en.wikipedia.org/wiki/Shard_(database_architecture)) bezeichnet, was „ein kleiner Teil eines Ganzen“ bedeutet. Sharding wird verwendet, wenn die benötigte Rechenleistung für die Datenbank die Verarbeitungskapazität eines einzelnen Computers übersteigt. Sharding wird notwendig, wenn die Größe der Blockchain die Verarbeitungsleistung der virtuellen Maschine und des Netzwerks übersteigt. Sharding zerlegt die Hauptblockchain in separate Segmente, und die Knoten verifizieren nur einen Teil der Transaktionen, was eine parallele Transaktionsvalidierung ermöglicht. Dies erhöht die Netzwerkdurchsatzrate. + +Die Blockchain von Alephium ist geschardet, und der Blockflow-Algorithmus verwaltet dies. Derzeit haben wir vier Gruppen mit jeweils vier Shards. + +### Smart Contract + +Ein [Smart Contract (SC)](https://en.wikipedia.org/wiki/Smart_contract) ist ein Computerprogramm, das Transaktionen nach vordefinierten Regeln ausführt, ohne auf eine dritte Partei, zentrale Autorität oder externe Mechanismen angewiesen zu sein. Im Kontext der Blockchain wird ein Smart Contract entweder in der nativen Programmiersprache geschrieben oder dazu kompiliert (übersetzt) und läuft normalerweise auf der [virtuellen Maschine](VM) der Blockchain. + +Smart Contracts (SCs) auf einer Blockchain können beliebige [Zustände](#state) speichern und beliebige Transaktionen ausführen. Endbenutzer verwenden ebenfalls Transaktionen, um mit ihnen zu interagieren. Die Transaktionen von Smart Contracts können auch andere Smart Contracts aufrufen. Diese Transaktionen können zu einer Änderung des Zustands führen und Münzen von einem Smart Contract zu einem anderen oder von einem Konto zu einem anderen senden. + +In Alephium werden Smart Contracts in der Ralph-Sprache geschrieben und auf der Alphred Virtual Machine ausgeführt. + +### State (Zustand) + +Der Begriff "Zustand" ist ein [Informatikkonzept](https://en.wikipedia.org/wiki/State_(computer_science)), bei dem eine Maschine mehrere Zustände haben kann, aber zu jedem Zeitpunkt nur einen. + +Eine Blockchain wird als Zustandsmaschine betrachtet. Der Zustand beschreibt die aktuelle Situation des Systems, und die Transaktionen (Eingaben und Ausgaben) lösen Zustandsübergänge aus. Da die Transaktionen zu Blöcken gebündelt werden, um den Prozess effizienter zu gestalten, ist die Hinzufügung eines Blocks das, was den tatsächlichen Zustand der Blockchain ändert. + +Alephium verwendet das "stateful UTXO"-Modell, das im Vergleich zu anderen UTXO-Buchhaltungsmodellen von einem vollständig ausgestatteten Zustand profitiert. + +## T + +### Time to Finality (Zeit bis zur Endgültigkeit) + +Time to Finality ist die Zeitspanne zwischen dem Zeitpunkt, an dem eine Transaktion an das Netzwerk übermittelt wird, und dem Zeitpunkt, an dem sie als endgültig (und unveränderlich) betrachtet wird. Es gibt zwei Hauptkategorien der Endgültigkeit: probabilistische Endgültigkeit und deterministische Endgültigkeit + +Die meisten Blockchain-Systeme bieten eine probabilistische Transaktionsendgültigkeit. Das bedeutet, dass die Wahrscheinlichkeit, dass eine Transaktion gültig ist und nicht rückgängig gemacht werden kann, mit der Hinzufügung weiterer Blöcke in der Kette steigt, aber niemals absolut endgültig ist. Das Netzwerk stimmt zu, dass die Transaktion mit ausreichend Zeit und Blöcken als endgültig betrachtet wird. Dies ist beispielsweise bei Bitcoin der Fall, wo eine Transaktion nach 6 Blöcken als endgültig gilt. + +Andere Blockchains verwenden eine deterministische Transaktionsendgültigkeit (manchmal auch als absolute Endgültigkeit bezeichnet). Das bedeutet, dass die Transaktion als endgültig betrachtet wird, wenn sie zur Blockchain hinzugefügt wird. Fantom ist ein Beispiel dafür. + +Zusätzliche Ressource: [Artikel zur Time to Finality ](https://medium.com/@alephium/time-to-finality-17d64eeffd25) + +### Token + +Ein Token ist ein Eintrag im Register einer Blockchain, der einem Satz von Regeln folgt, die von einem Smart Contract kodiert wurden, der es ausgibt. Diese Definition unterscheidet es von einer Kryptowährung, da letztere das native Asset einer Blockchain wie BTC oder ETH ist, während Tokens auf einer bestehenden Blockchain mithilfe von Smart Contracts erstellt werden. + +Tokens können als fungibel oder nicht fungibel kategorisiert werden. Fungible Tokens sind identisch und können nahtlos miteinander ausgetauscht werden. Auf der anderen Seite sind nicht fungible Tokens (NFTs) einzigartig und nachweislich knapp, was bedeutet, dass ihre Historien bis auf individueller Ebene zurückverfolgt werden können. + +Tokens können auch nach ihrer beabsichtigten Funktion kategorisiert werden: Utility, Security oder Currency Tokens. Currency Tokens werden erstellt, um gehandelt zu werden, wie beispielsweise MakerDAO's DAI oder USDC. Utility Tokens konzentrieren sich auf praktische Verwendung und repräsentieren den Zugang zu einem bestimmten Produkt oder einer bestimmten Dienstleistung. Security Tokens sind eine digitale Darstellung eines zugrunde liegenden Vermögenswerts, wie zum Beispiel einer Aktie an einem Unternehmen, einem Stimmrecht in einem Unternehmen oder einer anderen zentralisierten Organisation oder einem greifbaren oder digitalen Wertgegenstand. + +### Transaction Fee (Transaktionsgebühr) + +![image](media/186886291-79745fc1-25dc-4307-a752-400ce1ff2d31.png) + +Wenn jemand in Alephium eine Transaktion durchführt, muss er den Minern einen Preis zahlen, um sie in einen Block aufzunehmen. + +Dieser Preis setzt sich aus zwei Elementen zusammen: dem [Gaspreis](#gas-price) in der nativen Token der Netzwerks und der [verwendeten Gasmenge](#gas-amount-spent) bei der Verarbeitung dieser Transaktion. Er kann durch folgende Gleichung definiert werden: + +Transaktionsgebühr = Gaspreis * Verwendete Gasmenge + +Zusätzliche Ressource: [Transaktionsgebühr GitHub Implementierung](https://github.com/alephium/alephium/blob/v1.4.2/protocol/src/main/scala/org/alephium/protocol/model/Transaction.scala#L230-L239) + +### Transactions pro Sekunde (TPS) + +Transactions Per Second (TPS) ist eine Kennzahl aus dem Umfeld von [Datenbanksystemen](https://en.wikipedia.org/wiki/Transactions_per_second) und gibt an, wie viele Transaktionen theoretisch in einer Sekunde in einem bestimmten System stattfinden können. + +Im Blockchain-Kontext wird es als Synonym für Geschwindigkeit verwendet: wie schnell eine Transaktion an das Netzwerk gesendet werden kann. Die folgende Gleichung berechnet es: + +TPS = (Blockgröße / Transaktionsgröße) / Blockzeit + +Zusätzliche Ressource:[Artikel Transactions Per Second ](https://medium.com/@alephium/transactions-per-second-tps-f13217a49e39) + +## U + +### UTXO + +[UTXO](https://en.wikipedia.org/wiki/Unspent_transaction_output) (Unspent Transaction Output) ist der Begriff für den Betrag einer bestimmten Währung, der nach einer Kryptowährungstransaktion ungenutzt bleibt. + +Auf einer UTXO-Kontomodell-Blockchain wird der nicht ausgegebene Teil einer Transaktion als Buchungsmethode verwendet. Ähnlich der doppelten Buchführung hat jede Transaktion einen Ein- und Ausgang. + +Verbesserte Versionen wurden darüber entwickelt, wie z.B. eUTXO, Cell System oder Alephium's sUTXO. + +## V + +### Virtuelle Maschine + +Eine virtuelle Maschine (VM) ist eine Softwareemulation eines physischen Computers, um Programme auszuführen und Apps bereitzustellen. + +Eine virtuelle Maschine führt ihr eigenes Betriebssystem und Funktionen aus. Jeder Knoten führt eine Kopie der VM aus, um die Programme (Smart Contracts) auszuführen und es ihnen zu ermöglichen, miteinander und mit der Blockchain selbst zu interagieren. + +Die virtuelle Maschine von Alephium wird Alphred genannt und weist viele sehr [interessante Eigenschaften](https://www.youtube.com/watch?v=VVYH9rBJAdA&list=PLqL60kqgLPBBrc64K-1Gs771FBTiLtYZE&index=29) auf. + + +## W + +## X + +## Y + +## Z + diff --git a/i18n/de/docusaurus-plugin-content-docs/current/integration/exchange.md b/i18n/de/docusaurus-plugin-content-docs/current/integration/exchange.md new file mode 100644 index 00000000..aa566bf1 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/integration/exchange.md @@ -0,0 +1,349 @@ +--- +sidebar_position: 40 +title: Börse (Exchange) +sidebar_label: Börse (Exchange) +--- + +Integration des Prototyps mit Alephiums SDK: https://github.com/alephium/alephium-web3/blob/master/test/exchange.test.ts + +Dieser Leitfaden erläutert die grundlegenden APIs und Informationen, die für die Integration von Alephium mit einer Kryptowährungsbörse erforderlich sind. + +## Einstieg + +### Lokales Entwicklungsnetzwerk + +Um mit Alephium zu integrieren, muss eine Börse einen Full Node betreiben. Zusätzlich kann das Explorer-Backend zu Debugging- und zusätzlichen Indexierungszwecken ausgeführt werden. + +Um ein lokales Entwicklungsnetzwerk mit Explorer-Unterstützung zu erstellen, folgen Sie den Anweisungen im [Alephium-Stack](https://github.com/alephium/alephium-stack#devnet) Repository. Sobald es gestartet ist, kann auf die Swagger UI für die API-Schnittstelle des Full Nodes und des Explorer-Backends zugegriffen werden. + +* Swagger UI des Full Nodes: [http://127.0.0.1:22973/docs](http://127.0.0.1:22973/docs) +* Swagger UI des Explorer-Backends: [http://127.0.0.1:9090/docs](http://127.0.0.1:9090/docs) +* Explorer-Frontend: [http://localhost:23000](http://localhost:23000) + +### APIs + +Um den Leitfaden kurz zu halten, werden relevante API-Anfragen im Dokument bereitgestellt, anstatt Swagger UI-Screenshots zu verwenden. + +Das [web3 SDK](https://github.com/alephium/alephium-web3#packages) enthält generierte TypeScript-APIs sowohl für den [Full Node](https://github.com/alephium/alephium-web3/blob/master/packages/web3/src/api/api-alephium.ts) als auch für das [Explorer-Backend](https://github.com/alephium/alephium-web3/blob/master/packages/web3/src/api/api-explorer.ts). + +### Test wallet + +:::caution +Die Node-Wallet dient dazu, die APIs des Full Nodes zu testen. Um Hot Wallets für Einzahlungen zu generieren, überprüfen Sie bitte [Wallet-Generierung](exchange#wallet-generation). +::: + +Lassen Sie uns die Test-Wallet wiederherstellen, indem wir die folgende API ausführen. Die Test-Wallet hat 1 Million ALPH für die Adresse `1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH`. + +```shell +curl -X 'PUT' \ + 'http://127.0.0.1:22973/wallets' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "password": "test", + "mnemonic": "vault alarm sad mass witness property virus style good flower rice alpha viable evidence run glare pretty scout evil judge enroll refuse another lava", + "walletName": "test" +}' + +# Response +# { +# "walletName": "test" +# } +``` + +Erhalten Sie den öffentlichen Schlüssel der Adresse durch folgende Abfrage: + +```shell +curl -X 'GET' \ + 'http://127.0.0.1:22973/wallets/test/addresses/1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH' \ + -H 'accept: application/json' + +# Response +# { +# "address": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH", +# "publicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0", +# "group": 0, +# "path": "m/44'/1234'/0'/0/0" +# } +``` + +## Transaktions-APIs + +### Eine Transaktion erstellen + +Lassen Sie uns eine Transaktion erstellen, um `1.23 ALPH` an die Adresse `1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3` zu senden. + +```shell +# `fromPublicKey` is the public key of the wallet address + +curl -X 'POST' \ + 'http://127.0.0.1:22973/transactions/build' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromPublicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0", + "destinations": [ + { + "address": "1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3", + "attoAlphAmount": "1230000000000000000" + } + ] +}' + +# Response: +# { +# "unsignedTx": "00040080004e20c1174876e8000137a444479fa782e8b88d4f95e28b3b2417e5bc30d33a5ae8486d4a8885b82b224259c1e6000381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b002c41111d67bb1bb000000a3cd757be03c7dac8d48bf79e2a7d6e735e018a9c054b99138c7b29738c437ec00000000000000000000c6d3c20ab5db74a5b8000000bee85f379545a2ed9f6cceb331288842f378cf0f04012ad4ac8824aae7d6f80a00000000000000000000", +# "gasAmount": 20000, +# "gasPrice": "100000000000", +# "txId": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617", +# "fromGroup": 0, +# "toGroup": 1 +# } +``` + +### Transaktion signieren + +Lassen Sie uns die Transaktions-ID signieren: + +```shell +curl -X 'POST' \ + 'http://127.0.0.1:22973/wallets/test/sign' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "data": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617" +}' + +# Response +# { +# "signature": "78a607ec26165b5a63d7e30a0c85657e8a0fe3b7efccdba78166e51b52c32c9020f921e0a29b6a436ec330c3b3eb2222ee851e718e3504b1a70d73ba45cd503c" +# } +``` + +### Eine Transaktion übermitteln + +Lassen Sie uns die Transaktion an das Netzwerk übermitteln: + +```shell +# `unsignedTx` is from the response of transaction building +# `signature` is from the response of transaction signing + +curl -X 'POST' \ + 'http://127.0.0.1:22973/transactions/submit' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "unsignedTx": "00040080004e20c1174876e8000137a444479fa782e8b88d4f95e28b3b2417e5bc30d33a5ae8486d4a8885b82b224259c1e6000381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b002c41111d67bb1bb000000a3cd757be03c7dac8d48bf79e2a7d6e735e018a9c054b99138c7b29738c437ec00000000000000000000c6d3c20ab5db74a5b8000000bee85f379545a2ed9f6cceb331288842f378cf0f04012ad4ac8824aae7d6f80a00000000000000000000", + "signature": "78a607ec26165b5a63d7e30a0c85657e8a0fe3b7efccdba78166e51b52c32c9020f921e0a29b6a436ec330c3b3eb2222ee851e718e3504b1a70d73ba45cd503c" +}' + +# Response +# { +# "txId": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617", +# "fromGroup": 0, +# "toGroup": 1 +# } +``` + +## Block APIs + +### Blockhash mit Transaktions-ID abrufen + +Um den Blockhash einer bestätigten Transaktion zu erhalten, können Sie die Full-Node-API verwenden: + +```shell +curl -X 'GET' \ + 'http://127.0.0.1:22973/transactions/status?txId=a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617' \ + -H 'accept: application/json' + +# Response +# { +# "type": "Confirmed", +# "blockHash": "1d616d33a7aadc3cf49f5db1cc484b22a642140673f66020c13dc7648b9382d1", +# "txIndex": 0, +# "chainConfirmations": 1, +# "fromGroupConfirmations": 1, +# "toGroupConfirmations": 0 +# } +``` + +### Block mit Blockhash abrufen + +```shell +curl -X 'GET' \ + 'http://127.0.0.1:22973/blockflow/blocks-with-events/ecbc7a3115eb0da1f82902db226b80950e861ef8cbb6623ed02fc42a6eeb69cb' \ + -H 'accept: application/json' + +# Response +# { +# "block": { +# "hash": "ecbc7a3115eb0da1f82902db226b80950e861ef8cbb6623ed02fc42a6eeb69cb", +# "timestamp": 1231006505000, +# "chainFrom": 2, +# "chainTo": 3, +# "height": 0, +# ... +# }, +# "events": [] +# } +``` + +### Abfrage von Blöcken + +In Alephium können Sie alle Blöcke von allen Ketten für einen bestimmten Zeitintervall abrufen, da es sich um eine sharded Blockchain handelt, bei der mehrere Ketten gleichzeitig auf unterschiedlichen Höhen arbeiten. + +```shell +curl -X 'GET' \ + 'http://127.0.0.1:22973/blockflow/blocks?fromTs=0&toTs=30' \ + -H 'accept: application/json' + +# Response: there are 16 chains, therefore 16 lists of block hashes +# { +# "blocks": [ +# [], +# ... +# [] +# ] +# } +``` + +Sie können Blöcke für jede Kette einzeln mit diesem Endpunkt abrufen: +```shell +curl -X 'GET' \ + 'http://127.0.0.1:22973/blockflow/chain-info?fromGroup=2&toGroup=3' \ + -H 'accept: application/json' + +# Response +# { +# "currentHeight": 0 +# } + +curl -X 'GET' \ + 'http://127.0.0.1:22973/blockflow/hashes?fromGroup=2&toGroup=3&height=0' \ + -H 'accept: application/json' + +# Response +# { +# "headers": [ +# "ecbc7a3115eb0da1f82902db226b80950e861ef8cbb6623ed02fc42a6eeb69cb" +# ] +# } +``` + +## UTXO Verwaltung + +### Warum UTXO-Verwaltung? + +In der Praxis neigen einige Miner dazu, Mining-Belohnungen direkt an Börsenadressen zu senden, was zu einer großen Anzahl von UTXOs mit geringem Wert in den Hot Wallets der Börse führt. Aufgrund der begrenzten Anzahl von Inputs, die in jede Transaktion aufgenommen werden können, können Auszahlungen fehlschlagen, wenn das Hot Wallet mit diesen kleinen UTXOs gefüllt ist. + +### Wie konsolidiert man UTXOs mit geringem Wert? + +Wenn Ihre Börse bereits ein geeignetes UTXO-Verwaltungssystem hat, sind Sie gut aufgestellt. Wenn nicht, gibt es eine einfache Lösung. Sie können den Sweep-Endpunkt verwenden, um die UTXOs mit geringem Wert einer bestimmten Adresse zu konsolidieren. Beachten Sie, dass diese Funktion nur ab Full Node `2.3.0` verfügbar ist. + +```shell +# `maxAttoAlphPerUTXO` refers to the maximum amount of ALPH in the UTXOs to be consolidated. + +curl -X 'POST' \ + 'http://127.0.0.1:22973/transactions/sweep-address/build' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromPublicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0", + "toAddress": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH", + "maxAttoAlphPerUTXO": "100 ALPH" +}' +``` + +### Wie man mit bestimmten UTXOs arbeitet? + +Um Transaktionen effizienter zu erstellen, wird einer Börse empfohlen, den Satz von UTXOs ihrer Hot Wallets zu speichern und dann spezifische UTXOs über die API bereitzustellen. + +```shell +curl -X 'POST' \ + 'http://127.0.0.1:22973/transactions/build' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromPublicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0", + "destinations": [ + { + "address": "1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3", + "attoAlphAmount": "230000000000000000" + } + ] + "utxos": [ + { + "hint": 714242201, + "key": "3bfdeea82a5702cdd98426546d9eeecd744cc540aaffc5ec8ea998dc105da46f" + } + ] +}' +``` + +`hint` und `key` für den UTXO werden aus der ersten Ausgabe der ersten von uns erstellten Transaktion abgerufen. `key` ist eindeutig und kann verwendet werden, um den UTXO zu indizieren. + +```shell +curl -X 'GET' \ + 'http://127.0.0.1:22973/transactions/details/a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617' \ + -H 'accept: application/json' + +# Response +# { +# "unsigned": { +# "txId": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617", +# ... +# "fixedOutputs": [ +# { +# "hint": 714242201, +# "key": "3bfdeea82a5702cdd98426546d9eeecd744cc540aaffc5ec8ea998dc105da46f", +# "attoAlphAmount": "1230000000000000000", +# "address": "1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3", +# ... +# }, +# { +# "hint": 933512263, +# "key": "087ee967733900cc7f7beada612ba514dd134ddffc2ad1b6ad8b6998915089c4", +# "attoAlphAmount": "999998768000000000000000", +# "address": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH", +# ... +# } +# ] +# }, +# ... +# } +``` + +## Mehr Informationen + +### Wallet-Generierung + +Um mehrere Adressen für Benutzer zu generieren, können Sie die [HD-Wallet im Web3 SDK](https://github.com/alephium/alephium-web3/blob/master/packages/web3-wallet/src/hd-wallet.ts#L112-L185) verwenden. + +### Sharding + +Alephium ist eine sharded Blockchain, und seine Adressen sind auf dem Mainnet in 4 Gruppen unterteilt. Man kann jedoch: +- ALPH an mehrere Adressen derselben Adressgruppe in einer einzigen Transaktion senden. Alle Zieladressen müssen derselben Gruppe angehören. +- ALPH von mehreren Adressen derselben Adressgruppe in einer einzigen Transaktion senden. Alle sendenden Adressen müssen derselben Gruppe angehören. +- ALPH von mehreren Adressen derselben Gruppe an mehrere Adressen einer anderen Gruppe senden. Alle sendenden Adressen müssen derselben Gruppe angehören, und alle Zieladressen müssen ebenfalls derselben Gruppe angehören. + +Um die Gruppe einer Adresse zu erhalten, können Sie auf die Web3 SDK-Funktion [groupOfAddress(address)](https://github.com/alephium/alephium-web3/blob/master/packages/web3/src/utils/utils.ts#L85-L103) verweisen. + +### Gasberechnung + +Die Transaktionsgebühren von Alephium werden durch die zugewiesene Gasmenge und den Gaspreis bestimmt. Pro Transaktion können maximal 625.000 Gas zugewiesen werden. +Der Standard-Gaspreis beträgt `1e11` AttoALPH pro Gas-Einheit. Bei einer einfachen Übertragungstransaktion kann die Gasmenge mit dem folgenden Pseudocode berechnet werden: + +```Typescript +txInputBaseGas = 2000 +txOutputBaseGas = 4500 +inputGas = txInputBaseGas * tx.inputs.length +outputGas = txOutputBaseGas * tx.outputs.length + +txBaseGas = 1000 +p2pkUnlockGas = 2060 // Currently there is only one signature + +txGas = inputGas + outputGas + txBaseGas + p2pkUnlockGas +minimalGas = 20000 + +gas = max(minimalGas, txGas) +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/media/186885966-b8d746fb-612b-433e-8f79-47e5a87ea375.png b/i18n/de/docusaurus-plugin-content-docs/current/media/186885966-b8d746fb-612b-433e-8f79-47e5a87ea375.png new file mode 100644 index 00000000..6fba7b72 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/media/186885966-b8d746fb-612b-433e-8f79-47e5a87ea375.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/media/186886291-79745fc1-25dc-4307-a752-400ce1ff2d31.png b/i18n/de/docusaurus-plugin-content-docs/current/media/186886291-79745fc1-25dc-4307-a752-400ce1ff2d31.png new file mode 100644 index 00000000..dda325ab Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/media/186886291-79745fc1-25dc-4307-a752-400ce1ff2d31.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/media/Block reward.png b/i18n/de/docusaurus-plugin-content-docs/current/media/Block reward.png new file mode 100644 index 00000000..4df44c90 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/media/Block reward.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/alephium-stratum.md b/i18n/de/docusaurus-plugin-content-docs/current/mining/alephium-stratum.md new file mode 100644 index 00000000..1aa6c005 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/mining/alephium-stratum.md @@ -0,0 +1,67 @@ +--- +sidebar_position: 40 +title: Alephium Stratum +sidebar_label: Alephium Stratum +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Der Vorschlag basiert auf: [https://eips.ethereum.org/EIPS/eip-1571](https://eips.ethereum.org/EIPS/eip-1571). +Nachrichten folgen der JSON-RPC-2.0-Spezifikation von EIP-1571. + +? - bedeutet, dass eine Eigenschaft optional ist + +``` +Methods: + Requests: + mining.hello + mining.subscribe + mining.authorize + mining.submit + mining.noop + connection.set_gzip + + Notifications + mining.set_extranonce + mining.set_target + mining.set_cleanjobs + mining.notify + +mining.hello +client { id: "0", method: "mining.hello", params: [, "AlephiumStratum/1.0.0"] } +server { id: "0", result: ["AlephiumStratum/1.0.0, , , , ] } + +optional connection.set_gzip +client { id: "1", method: "connection.set_gzip" } +server { id: "1", result: } + +mining.subscribe +client { id: "2", method: "mining.subscribe", params: } +server { id: "2", result: } + +mining.authorize +client { id: "3", method: "mining.authorize", params: [, ] } +server { id: "3", result: } + +mining.set_extranonce +server { method: "mining.set_extranonce", params: } + +mining.set_target +server { method: "mining.set_target", params: } + +mining.set_cleanjobs +server { method: "mining.set_cleanjobs", params: } + +mining.notify +server { method: "mining.notify", params: [, , ] } + +mining.submit +client { id: "4", method: "mining.submit", params: [, , ] } +server { id: "4", result: } + +mining.noop +client { id: "5", method: "mining.noop" } +server { id: "5", result: "1" } +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/integration.md b/i18n/de/docusaurus-plugin-content-docs/current/mining/integration.md new file mode 100644 index 00000000..7c028657 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/mining/integration.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 50 +title: Integration +sidebar_label: Integration +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Dieses Dokument soll es Mining-Pools und Minern erleichtern, Alephium zu integrieren. Es enthält hauptsächlich: + +* das Kommunikationsprotokoll zwischen dem Mining-Pool und dem Full Node +* wie der Miner den Blockhash basierend auf den Mining-Jobs berechnet + +Hinsichtlich der Implementierung des Kommunikationsprotokolls zwischen Mining-Pool und Minern können Sie sich auf das Stratum-Protokoll [hier](alephium-stratum.md) beziehen. Beachten Sie, dass Mining-Pools das Protokoll nicht genau befolgen. +In diesem Dokument werde ich den Code von [mining-pool](https://github.com/alephium/mining-pool) und [gpu-miner](https://github.com/alephium/gpu-miner) als Referenz verwenden. + + +## Mining Pool + +Der Mining-Pool muss sich mit dem Alephium Full Node verbinden, um Mining-Jobs zu erhalten, und der Standard-Mining-API-Server ist `localhost:10973`. + +Der Mining-Pool kommuniziert mit dem Full Node über ein binäres Protokoll, das Format der Nachricht sieht wie folgt aus: + +``` +MessageSize(4 bytes) + Message(1 byte MessageType + Payload) +``` + +### Mining-Jobs vom Full Node erhalten + +Jedes Mal, wenn der Full Node einen neuen Block empfängt, sendet er eine `Jobs` Nachricht an den Mining-Pool. Sie können auch das Zeitintervall in der [Mining-Konfiguration](https://github.com/alephium/alephium/blob/master/flow/src/main/resources/system_prod.conf.tmpl#L6) des Full Nodes festlegen, um `Jobs`-Nachrichten zu senden, wenn es keine neuen Blöcke gibt. + +Da es jetzt 16 Chains in Alephium gibt, wird es in jeder `Jobs`-Nachricht 16 Blockvorlagen geben. Und die Blockvorlage besteht aus den folgenden Feldern: + +* `fromGroup` und `toGroup`: der Chain-Index der Blockvorlage. +* `headerBlob`: die serialisierten binären Daten des [BlockHeader](https://github.com/alephium/alephium/blob/master/protocol/src/main/scala/org/alephium/protocol/model/BlockHeader.scala#L28), exklusive der ersten 24 Bytes (Nonce). +* `txsBlob`: die serialisierten binären Daten der Transaktionen. +* `targetBlob`: die serialisierten binären Daten des [Targets](https://github.com/alephium/alephium/blob/master/protocol/src/main/scala/org/alephium/protocol/model/Target.scala#L32). + +Sie können den bereitgestellten Code [hier](https://github.com/alephium/mining-pool/blob/master/lib/messages.js) verwenden, um mehr über das Format der `Jobs`-Nachricht und das Parsen der `Jobs`-Nachricht zu erfahren. + +Sobald der Mining-Pool die `Jobs` -Nachricht vom Full Node empfängt, kann er die Mining-Jobs basierend auf ihrer Hashrate an die Miner senden. Für jede Chain erfordert die Berechnung des Nonce nur die Felder `targetBlob` und `headerBlob`. Daher kann der Mining-Pool Bandbreite sparen, indem er das Feld `txsBlob` ausschließt, wenn er Mining-Jobs an die Miner sendet. Sie können den bereitgestellten Code [hier](https://github.com/alephium/mining-pool/blob/master/lib/blockTemplate.js#L51) verwenden. + +### Blöcke an den Full Node senden + +Sobald der Mining-Pool eine gültige `nonce` vom Miner erhält, kann er den Block an den Full Node senden, wobei der Block aus der `nonce`, `headerBlob` und `txsBlob` besteht. Sie können den bereitgestellten Code [hier](https://github.com/alephium/mining-pool/blob/master/lib/pool.js#L119) verwenden. + +Dann können Sie den bereitgestellten Code [hier](https://github.com/alephium/mining-pool/blob/master/lib/daemon.js#L49) verwenden, um eine gültige `SubmitBlock`-Nachricht zu konstruieren und diese Nachricht an den Full Node zu senden. + +Nachdem der Full Node den Block überprüft hat, sendet er eine `SubmitBlockResult` -Nachricht, um dem Mining-Pool mitzuteilen, ob der Block gültig ist. Sie können den bereitgestellten Code [hier](https://github.com/alephium/mining-pool/blob/master/lib/messages.js#L72) verwenden, um die `SubmitBlockResult`-Nachricht zu parsen. + +## Miner + +### Berechnung des Blockhash + +In Alephium beträgt die Größe der `nonce` 24 Bytes, und der Hash des Blocks lautet: `blake3(blake3(serialize(blockHeader))`. Wie zuvor erwähnt, ist `blockBlob` in jedem Job die serialisierten binären Daten von `BlockHeader` ohne dem Feld `nonce`. Daher muss der Miner beim Berechnen des Blockhash die `nonce` vor dem `headerBlob` voranstellen. Sie können den bereitgestellten Code [hier](https://github.com/alephium/gpu-miner/blob/master/src/worker.h#L135) und [hier](https://github.com/alephium/gpu-miner/blob/master/src/blake3/original-blake.hpp#L314) verwenden. + +### Überprüfen des Chain-Index + +Zusätzlich zur Überprüfung des Ziels muss der Miner auch den Chain-Index des Blocks überprüfen, da Alephium den Chain-Index in den Blockhash kodiert. Sie können den bereitgestellten Code [hier](https://github.com/alephium/gpu-miner/blob/master/src/blake3/original-blake.hpp#LL303C2-L303C2) verwenden, um zu überprüfen, ob der Chain-Index des Blockhash korrekt ist. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/full-node-synced-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/full-node-synced-query.png new file mode 100644 index 00000000..18b9a040 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/full-node-synced-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-balance-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-balance-query.png new file mode 100644 index 00000000..12480c8c Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-balance-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-change-active-address.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-change-active-address.png new file mode 100644 index 00000000..72ae20b0 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-change-active-address.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-create-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-create-query.png new file mode 100644 index 00000000..d9408eeb Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-create-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-create-response.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-create-response.png new file mode 100644 index 00000000..5e930555 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-create-response.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-list-addresses-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-list-addresses-query.png new file mode 100644 index 00000000..4f7648ee Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-list-addresses-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-list-addresses-response.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-list-addresses-response.png new file mode 100644 index 00000000..172f5c51 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-list-addresses-response.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-restore-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-restore-query.png new file mode 100644 index 00000000..e49a81e0 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-restore-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-sweep-all-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-sweep-all-query.png new file mode 100644 index 00000000..49b8b8ea Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-sweep-all-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-unlock-query.png b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-unlock-query.png new file mode 100644 index 00000000..92c689a5 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/mining/media/miner-wallet-unlock-query.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/miner-troubleshooting.md b/i18n/de/docusaurus-plugin-content-docs/current/mining/miner-troubleshooting.md new file mode 100644 index 00000000..6593049d --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/mining/miner-troubleshooting.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 30 +title: Fehlerbehebung +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +# Fehlerbehebung + +#### Warum kann ich nur 1 meiner 4 Miner-Adressen wiederherstellen ? + +Sie müssen beim Wiederherstellen Ihrer Miner-Adresse `isMiner = true` angeben. +Bitte werfen Sie einen Blick auf das Beispiel hier: [Restore-Miner-Wallet](solo-mining-guide.md#restore-your-miner-wallet) + +#### Wie verbinde ich meinen Miner mit meinem Full Node auf einem anderen Computer im gleichen Subnetz ? + +1. Fügen Sie das Folgende zu Ihrer `user.conf` hinzu und starten Sie Ihren Full Node neu. + +``` +alephium.mining.api-interface = "0.0.0.0" +``` + +2. Führen Sie Ihren Miner mit `-a IP` aus, wobei die IP die IP Ihres Full Nodes im Subnetz ist. + +#### Wie kann ich die Swagger UI meines VPS-gehosteten Full Nodes verwenden ? + +SSH-Portweiterleitung wird empfohlen: + +``` +ssh user@server -L 12973:127.0.0.1:12973 +``` + +#### Wie greife ich auf die Swagger UI meines Full Nodes auf einem anderen Computer im gleichen Subnetz zu ? + +1. Fügen Sie das Folgende zu Ihrer `user.conf` hinzu und starten Sie Ihren Full Node neu. + +``` +alephium.api.network-interface = "0.0.0.0" +``` + +2. Ändern Sie den `host` der Swagger UI auf die IP Ihres Full Nodes. + +#### Mein Miner (über run-miner.sh) kann keine Verbindung zu meinem Full Node auf einem anderen Computer herstellen. + +Das Skript `run-miner.sh` stellt standardmäßig eine Verbindung zu `127.0.0.1` her. Sie müssen `-a IP` zu `run-miner.sh` hinzufügen. + +#### Warum verwendet der Miner auf HiveOS eine große Menge an Speicher ? + +Sie sollten die `log to write in RAM` mit dem Befehl `logs-on` deaktivieren. + +#### Wie kann ich den Auto-Lock-Timeout für Wallets anpassen ? + +Sie können den Auto-Lock-Timeout des Wallets mit der folgenden Konfiguration ändern: + +``` +alephium.wallet.locking-timeout = 10 minutes +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/pool-mining-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/mining/pool-mining-guide.md new file mode 100644 index 00000000..629f0e6a --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/mining/pool-mining-guide.md @@ -0,0 +1,186 @@ +--- +sidebar_position: 20 +title: Pool Mining Leitfaden +sidebar_label: Pool Mining Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +# Pool Mining Leitfaden + +Sie finden eine vollständige Liste bekannter Mining-Pools [auf diesem Link](#community-pools). + +### Erstellen Sie Ihren eigenen Pool + +Wenn Sie Ihren eigenen Mining-Pool hosten möchten, schauen Sie sich [dieses Repo hier](https://github.com/alephium/mining-pool/) an. Wenn Sie einen Pool erstellen, können Sie gerne einen Pull Request senden, um Ihren Pool der [Liste](#community-pools) hinzuzufügen. + +### Beispiel-Node-Konfiguration für den Mining-Pool: + +> Dieser Abschnitt richtet sich an Pool-Betreiber, nicht an Miner. + +``` +// mehr Verbindungen für bessere Blockpropagation +alephium.network.external-address = ":9973" +alephium.network.max-outbound-connections-per-group = 48 +alephium.network.max-inbound-connections-per-group = 256 + +alephium.mining.miner-addresses = [4 miner addresses] + +// kommentieren Sie die folgenden 2 Zeilen aus, wenn Sie nicht aus dem externen Netzwerk auf die REST-API zugreifen +alephium.api.network-interface = "0.0.0.0" +alephium.api.api-key = "" +``` + +## Community Pools + +### ⚠️ Haftungsausschluss + +Dies ist eine nicht erschöpfende Liste von Mining-Pools, die von der Community betrieben werden. Diese Pools werden in keiner Weise von Alephium unterstützt, und Alephium kann nicht für Ihre Auswahl des Pool verantwortlich gemacht werden. Obwohl die hier aufgeführten Pools sich bisher wie erwartet verhalten haben, sollten Sie bedenken, dass die Auswahl eines Pools erfordert, dass Sie einige Recherchen zur Sicherheit, Reputation und allgemeinen Sicherheit des Pools durchführen. Ein guter Ausgangspunkt ist, [die Community im Discord zu fragen](https://alephium.org/discord) + +### Verwendung von Pools und wie Sie Unterstützung erhalten + +Wir freuen uns, dass diese Liste von Pools wächst und vielfältiger wird. Probieren Sie sie aus. Wenn ein Pool zu groß wird, sollten Sie in Betracht ziehen, zu einem anderen Pool zu wechseln, um die Dezentralisierung zu fördern. + +Alephium ist noch sehr neu, und es ist wichtig, dass Sie Updates im Auge behalten. Dies gilt auch für die Software, die zum Beitritt zu den Mining-Pools erforderlich ist. Beachten Sie, dass jeder Pool eine blühende Community mit Kanälen hat, die Ihre Supportanfragen und Fragen begrüßen. Daher ist es immer am besten, Ihre poolbezogenen Fragen in der entsprechenden Pool-Gruppe zu stellen. Sie finden möglicherweise auch Anleitungen in Ihrer eigenen Sprache in einer unserer [verfügbaren Community-Playlists hier](https://www.youtube.com/channel/UCIX9Eww2Kch7sc0E6gCmEdg/playlists). + +### Aktuell bekannte und aktive Pools + +Hier ist eine Liste von Mining-Pools in alphabetischer Reihenfolge. Wir ermutigen Sie, [einen Pull-Request zu senden](https://github.com/alephium/wiki/tree/master/docs/mining/pool-mining-guide.md) , um aufstrebende Pools zu dieser Wiki hinzuzufügen und/oder ihr Verschwinden sowie mögliches Fehlverhalten zu melden. + +Sie können auch [https://miningpoolstats.stream/alephium](https://miningpoolstats.stream/alephium) überprüfen. + +#### Alephium-pool (Community pool) + +- Webseite: https://alephium-pool.com/ +- Telegram: https://t.me/alephium_pool +- Discord: https://discord.gg/ZXYU2NGx + +#### ALPH.city + +- Webseite: https://alph.city/ +- Telegram: https://t.me/alphcity + +#### ALPH-pool.com + +- Webseite: https://alph-pool.com/ +- Telegram: https://t.me/ALPH_pool_chat + +#### Alph2Mine.com + +- Webseite: https://alph2mine.com/ +- Email: alph2mine@gmail.com + +#### Coinhunters Pool + +- Webseite: https://alph.coinhunters.space +- Telegram (EN): https://t.me/alph_coinhunters_en +- Telegram (RU): https://t.me/alph_gravitsapapool_ru + +#### e4pool ALPH Pool + +- Webseite: https://e4pool.com/alph +- Telegram: https://t.me/E4piko +- Support: https://t.me/e4pool_howto +- Forum: https://forum.e4pool.com/ + +#### Enigma Pool + +- Webseite: https://enigmapool.com/ +- Discord: https://discord.com/invite/enigmapool +- Calculator: https://enigmapool.com/tools/calculator + +#### Herominers Pool + +- Webseite: https://alephium.herominers.com/ +- Discord: https://discord.com/invite/gvWSs84 +- Telegram: https://t.me/HeroMinersPool + +#### Metapool (Community pool) + +- Webseite: https://www.metapool.tech +- Calculator: https://metapool.tech/dashboard#calculator +- Telegram: https://t.me/metapool1 +- Discord: https://discord.gg/5TTzMDzJ + +#### Okminer + +- Webseite (CN): https://okminer.com +- Calculator: https://okminer.com/tools +- Telegram (CN): https://t.me/okminer_CN +- Telegram (EN): https://t.me/okminer_support + +#### p1pool.com + +- Webseite: https://p1pool.com/ +- Telegram: https://t.me/p1pool_com +- Discord: https://discord.gg/U8dh97XHk8 +- Email: info@p1pool.com + +#### Soloblocks + +- Webseite: https://soloblocks.org/alph/ + +#### Solopool.org + +- Webseite: https://alph.solopool.org/ +- Telegram: https://t.me/solopool_org +- Twitter: https://twitter.com/solopool_org +- Email: support@solopool.org + +#### Wooly Pooly + +- Webseite: https://woolypooly.com/en/coin/alph +- Calculator: https://woolypooly.com/en/calc/what-to-mine-gpu +- Discord: https://woolypooly.com/discord +- Telegram: https://woolypooly.com/telegram + +⚠️ **Make sure you use the latest version of the mining software** + +### Alephium GPU-Miner + +- Download: [https://github.com/alephium/gpu-miner](https://github.com/alephium/gpu-miner) +- Support: [https://alephium.org/discord](https://alephium.org/discord) + +### bzMiner + +- Download: [https://www.bzminer.com/](https://www.bzminer.com/) +- Support: [https://discord.gg/NRty3PCVdB](https://discord.gg/NRty3PCVdB) + +### lolMiner + +- Download: [https://lolminer.site/download/](https://lolminer.site/download/) + +### T-Rex + +- Download: [https://trex-miner.com/](https://trex-miner.com/) + +### SRBMiner + +- Download: [https://www.srbminer.com/download.html](https://www.srbminer.com/download.html) + +## If you have HiveOS or RaveOS related questions, these resources will help you + +### Hive OS + +- Webseite: [https://hiveos.farm](https://hiveos.farm) +- Forum: [https://hiveon.com/forum/](https://hiveon.com/forum/) +- Telegram: [https://t.me/hiveoschat_en](https://t.me/hiveoschat_en) +- Discord: [https://discord.gg/CVZeZdn](https://discord.gg/CVZeZdn) + +### Rave OS + +- Mail support: support@raveos.com +- Webseite: [https://raveos.com/](https://raveos.com/) +- Telegram: [https://t.me/raveossupport](https://t.me/raveossupport) +- Discord: [https://discord.gg/Dcdadz2](https://discord.gg/Dcdadz2) + +### OKMiner Mobile OS + +- iOS: [https://apps.apple.com/ru/app/okminer-os/id1494087547](https://apps.apple.com/ru/app/okminer-os/id1494087547) +- Android: [https://downap.okminer.com/hashapk/okminer.apk](https://downap.okminer.com/hashapk/okminer.apk) +- Webseite (CN): https://okminer.com +- Kalkulator: https://okminer.com/tools +- Telegram (CN): https://t.me/okminer_CN +- Telegram (EN): https://t.me/okminer_support diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mining/solo-mining-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/mining/solo-mining-guide.md new file mode 100644 index 00000000..8de8b335 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/mining/solo-mining-guide.md @@ -0,0 +1,113 @@ +--- +sidebar_position: 10 +title: Solo-Mining-Leitfaden +sidebar_label: Solo-Mining-Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +# Solo-Mining-Leitfaden + +Sie müssen zunächst den Schritten im [Full Node Starter - Leitfaden](full-node/getting-started.md) folgen, um Ihren Node herunterzuladen, zu starten und Swagger [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs) zu verwenden. + +## Mining-Informationen + +- Insgesamt 4 Adressgruppen und 16 Ketten +- Die Zielblockzeit beträgt 64 Sekunden +- Jeden Tag werden durchschnittlich `24 * 60 * 60 / 64 * 16 = 21600` Blöcke abgebaut +- Die Blockbelohnungen betragen derzeit 3 ALPH +- Alle abgebauten Münzen sind für 500 Minuten gesperrt + +Weitere Informationen zu Mining-Belohnungen finden Sie in diesem Artikel [Block Rewards](https://medium.com/@alephium/alephium-block-rewards-72d9fb9fde33). + +Sie können die geschätzte Netzwerk-Hashrate aus dem Protokoll Ihres Full Node oder aus dem Grafana-Dashboard des Full Node erhalten, wenn Sie es mit [docker-compose](full-node/docker-guide.md) ausführen. + +## Miner wallet + +Zunächst müssen Sie eine dedizierte Wallet für das Mining erstellen. Im Gegensatz zu einer _traditionellen Wallet_, hat eine _Miner Wallet_ mehrere Adressen, die für jede Adressgruppe zum Sammeln von Mining-Belohnungen verwendet werden. + +#### Erstellen Sie Ihre Miner Wallet + +![miner-wallet-create-query](media/miner-wallet-create-query.png) + +Der Server gibt Ihnen die neue Wallet-Mnemonic zurück. Bitte sichern und speichern Sie es sicher. + +![miner-wallet-create-response](media/miner-wallet-create-response.png) + +#### Liste deine Miner-Adressen auf + +![miner-wallet-list-addresses-query](media/miner-wallet-list-addresses-query.png) + +Der Server gibt Ihnen 4 Adressen für den nächsten Schritt zurück: + +![miner-wallet-list-addresses-response](media/miner-wallet-list-addresses-response.png) + +## Konfigurieren Sie Miner-Adressen + +Nachdem Sie Ihre 4 Miner-Adressen erhalten haben, müssen Sie diese Ihrem Node zuweisen, damit Sie Belohnungen erhalten, wenn er mit dem Mining beginnt. Dies kann erreicht werden, indem Sie den folgenden Inhalt in die Datei `.alephium/user.conf` unter Ihrem Home-Verzeichnis hinzufügen[^1]: + + alephium.network.external-address = "x.x.x.x:9973" // Setzen Sie hier Ihre öffentliche IP-Adresse ein; andernfalls entfernen Sie diese Zeile. + alephium.mining.miner-addresses = [ + "1HiYeRbypJQK4nc6EFYWiRVdsdYukQKq8SvKQsfJ3wiR8", + "1HD3q1G7qVoeyNA4U6HbBhFvv1FLUWNGwNavPamScpVLa", + "1CQiD2RQ58ymszcgPEszRomyMZxEjH1Rtp4tB84JY2qgL", + "19vvD3QbfEYbJexk6yCtnDNpRrfr3xQv2Pzc6x265MRhD" + ] + +Starten Sie Ihren Knoten neu, um diese neuen Konfigurationen wirksam zu machen. Achten Sie darauf, Sie in derselben Reihenfolge hinzuzufügen, wie Sie vom Endpunkt zurückgegeben wurden, da Sie nach ihrer Gruppe sortiert sind. + +## Sicherheit + +Standardmäßig ist die API-Schnittstelle von Alephium an localhost gebunden, Ihre API-Endpunkte sind sicher. Wenn Sie jedoch `alephium.api.network-interface` konfiguriert haben, können Ihre Endpunkte möglicherweise dem öffentlichen Netzwerk ausgesetzt sein. Dies kann gefährlich sein, da jeder auf Ihre Miner-Wallet zugreifen könnte. Bitte erwägen Sie die Konfiguration eines API-Schlüssels gemäß dieser Anleitung: [API Key](full-node/full-node-more.md#api-key). + +Bitte erwägen Sie auch die Erstellung einer weiteren sicheren Wallet und überweisen Sie regelmäßig Ihre Mittel auf diese Wallet mit `sweep-all-addresses` Endpoint. + +## Starten Sie das Mining + +### Stellen Sie sicher, dass Ihr Full Node synchronisiert ist + +Sie können dies überprüfen, indem Sie diesen Endpunkt ausführen: + +![full-node-synced-query](media/full-node-synced-query.png) + +Wenn Sie in der Antwort `"synced": true` sehen, sind Sie bereit. + +### Nvidia GPU + +Bitte folgen Sie den Anweisungen auf [https://github.com/alephium/gpu-miner](https://github.com/alephium/gpu-miner#readme) um den GPU-Miner für Nvidia-GPUs auszuführen. + +Alternativ können Sie den GPU-Miner mit Docker ausführen, indem Sie den Anweisungen [https://github.com/alephium/alephium/tree/master/docker#gpu-miner-optional](https://github.com/alephium/alephium/tree/master/docker#gpu-miner-optional) folgen. + +### AMD GPU + +Bitte folgen Sie den Anweisungen auf [https://github.com/alephium/amd-miner](https://github.com/alephium/amd-miner#readme) um den GPU-Miner für AMD-GPUs auszuführen. Beachten Sie, dass die Leistung des AMD-Miners nicht mit dem Nvidia-Miner vergleichbar ist. + +Wenn Sie Fragen haben, können Sie sich gerne an die Entwickler auf [Discord](https://alephium.org/discord) wenden. + +## Weitere Informationen zur Miner Wallet + +Hier sind weitere Endpunkte, die für Miner nützlich sind. + +#### Ihr Guthaben abfragen + +![miner-wallet-balance-query](media/miner-wallet-balance-query.png) + +#### Ändern Sie Ihre aktive Adresse + +![miner-wallet-change-active-address](media/miner-wallet-change-active-address.png) + +#### Übertragen Sie alle Ihre Mittel auf die aktive Adresse zu einer anderen Adresse + +![miner-wallet-sweep-all-query](media/miner-wallet-sweep-all-query.png) + +#### Entsperren Sie Ihre Wallet + +![miner-wallet-unlock-query](media/miner-wallet-unlock-query.png) + +#### Wiederherstellen der Miner Wallet + +![miner-wallet-restore-query](media/miner-wallet-restore-query.png) + +[^1]: Das Home-Verzeichnis hängt von Ihrem System ab: `C:\Users\` in Windows, `/Users/` in macOS, `/home/` in Linux. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/misc/internationalization-and-localization.md b/i18n/de/docusaurus-plugin-content-docs/current/misc/internationalization-and-localization.md new file mode 100644 index 00000000..037bf58b --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/misc/internationalization-and-localization.md @@ -0,0 +1,64 @@ +--- +sidebar_position: 20 +title: Internationalisierung und Lokalisierung +sidebar_label: Internationalisierung und Lokalisierung +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +# Internationalisierung und Lokalisierung (i18n) + +## Discord + +Finde die folgenden Sprachen im [offiziellen Discord](https://alephium.org/discord) + +- AR 🌙العربية +- CN 🐼 中文 +- CZ 🏒czech-slovakia +- DE 🌭deutsch +- FR 🥖français +- RU 🐻русский +- SP 🌮español +- TR 🐺türkçe + +## Bekannte lokalisierte Community-getriebene Benutzergruppen + +### Telegram Gruppen + +Lokalisierte Gruppen (dies sind inoffizielle Gruppen, erstellt und moderiert von unabhängigen Dritten, auf die Alephium keinen Einfluss hat) + +Russisch 🇷🇺 - https://t.me/alephiumgroup_ru + +Spanisch 🇪🇦 - https://t.me/minerosAlephium + +Chinesisch 🇨🇳 - https://t.me/alephiumCN + +Deutsch (DACH) 🇩🇪 - https://t.me/alphgermanofficial + +Türkisch 🇹🇷 - https://t.me/AlephiumTurkey + +Holländisch 🇳🇱 - https://t.me/AlephiumgroupNL + +Portugisisch 🇵🇹 🇧🇷 - https://t.me/Alephium_pt + +Vietnamesisch 🇻🇳 - https://t.me/alephiumvn + +Indonesisch 🇮🇩 - https://t.me/AlephiumID + +Französisch FR - https://t.me/Alephiumfr + +Polnisch PL - https://t.me/alephiumPL + +Themen-Gruppen + +Mining https://t.me/alephium_mining + +Trading https://t.me/alephium_trading + +Bots + +Whales alert https://t.me/alphwhalesalert + +Insights https://t.me/alephiumin diff --git a/i18n/de/docusaurus-plugin-content-docs/current/misc/multisig-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/misc/multisig-guide.md new file mode 100644 index 00000000..c45dcccc --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/misc/multisig-guide.md @@ -0,0 +1,135 @@ +--- +sidebar_position: 30 +title: Multisig Leitfaden +sidebar_label: Multisig Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Alephium unterstützt `m-of-n` Multi-Signature-Adressen. + +Die entsprechenden Befehle für Multi-Sig finden Sie unter [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs) im Abschnitt `Multi-signature`. Stellen Sie sicher, dass ihr Full Node läuft, damit Sie auf die Swagger UI zugreifen können. + +## Erstellen einer Multi-Sig-Adresse + +1. Holen Sie alle öffentlichen Schlüssel der Konten für diese Multi-Sig. + + Der öffentliche Schlüssel kann mit der Wallet abgerufen werden, indem Sie folgenden Befehl aufrufen: + + ``` + GET /wallets/{wallet_name}/addresses/{address} + ``` + + Rückmeldung: + + ```json + { + "address": "{address}", + "publicKey": "d1b70d2226308b46da297486adb6b4f1a8c1842cb159ac5ec04f384fe2d6f5da28" + } + ``` + +2. Zum Beispiel, wenn Sie eine Multi-Sig-Adresse mit 3 Konten erstellen möchten, die 2 Signaturen zum Entsperren benötigt (2-of-3), können Sie folgendes tun: + + ``` + POST /multisig/address + { + "keys": [ + "d1b70d2226308b46da297486adb6b4f1a8c1842cb159ac5ec04f384fe2d6f5da28", + "8c1842cb159ac5ec04f384fe2d6f5da2d1b70d2226308b46da297486adb6b41a8f", + "e4a8c1842cb159ac5ec0b70d2226308b46da297486adb6b4f14f384fe2d6f5da31" + ], + "mrequired": 2 + } + ``` + + Rückmeldung: + + ```json + { + "address": "1AujpupFP4KWeZvqA7itsHY9cLJmx4qTzojVZrg8W9y9n" + } + ``` + + > ⚠️ WARNUNG: Stellen Sie sicher, dass Sie die Reihenfolge der öffentlichen Schlüssel beibehalten; Sie müssen später dieselbe Reihenfolge angeben. + + Gelder können jetzt an diese Adresse gesendet werden. + +3. Um die Gelder zu nutzen, müssen Sie eine Multi-Sig-Transaktion erstellen. + Übergeben Sie die öffentlichen Schlüssel, die die + Transaktion signieren werden, in unserem Beispiel 2. + Stellen Sie sicher, dass die Reihenfolge dieselbe ist wie bei der Adresserstellung: + + ``` + POST /multisig/build + { + "fromAddress": "1AujpupFP4KWeZvqA7itsHY9cLJmx4qTzojVZrg8W9y9n", + "fromPublicKeys": [ + "d1b70d2226308b46da297486adb6b4f1a8c1842cb159ac5ec04f384fe2d6f5da28", + "e4a8c1842cb159ac5ec0b70d2226308b46da297486adb6b4f14f384fe2d6f5da31" + ], + "destinations": [ + { + "address": "1jVZrg8W9y9AujpupFP4KWeZvqA7itsHY9cLJmTonx4zq", + "amount": "42 ALPH" + } + ] + } + ``` + + Rückmeldung: + + ```json + { + "unsignedTx": "0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13", + "txId": "798e9e137aec7c2d59d9655b4ffa640f301f628bf7c365083bb255f6aa5f89ef", + "fromGroup": 2, + "toGroup": 1 + } + ``` + +4. Sie können jetzt die `txId` an die Personen senden, die die Transaktion signieren müssen. + Jeder kann es mit seiner Wallet signieren: + + ``` + POST /wallets/{wallet_name}/sign + { + "data": "798e9e137aec7c2d59d9655b4ffa640f301f628bf7c365083bb255f6aa5f89ef" + } + ``` + + Rückmeldung: + + ```json + { + "signature": "9e1a35b2931bd04e6780d01c36e3e5337941aa80f173cfe4f4e249c44ab135272b834c1a639db9c89d673a8a30524042b0469672ca845458a5a0cf2cad53221b" + } + ``` + +5. Sammlen Sie die Signaturen, in unserem Beispiel 2 (weil `m=2`) , und senden Sie schließlich die Transaktion: + + > HINWEIS: Die Reihenfolge der Signaturen muss dieselbe wie die der öffentlichen Schlüssel sein. + + ``` + POST /multisig/submit + { + "unsignedTx": "0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13", + "signatures": [ + "9e1a35b2931bd04e6780d01c36e3e5337941aa80f173cfe4f4e249c44ab135272b834c1a639db9c89d673a8a30524042b0469672ca845458a5a0cf2cad53221b", + "ab135272b834c1a639db9c89d673a8a30524042b0469672ca845458a5a0cf2cad53221b9e1a35b2931bd04e6780d01c36e3e5337941aa80f173cfe4f4e249c44" + ] + } + + ``` + + Rückmeldung: + + ```json + { + "txId": "503bfb16230888af4924aa8f8250d7d348b862e267d75d3147f1998050b6da69", + "fromGroup": 2, + "toGroup": 1 + } + ``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/misc/on-dust-outputs-and-state-explosion.md.drop b/i18n/de/docusaurus-plugin-content-docs/current/misc/on-dust-outputs-and-state-explosion.md.drop new file mode 100644 index 00000000..f3a2d345 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/misc/on-dust-outputs-and-state-explosion.md.drop @@ -0,0 +1,18 @@ +--- +sidebar_position: 20 +title: On dust outputs and state explosion +--- + +This article follows a brainstorm between [Cheng](https://github.com/polarker) and [Tom](https://github.com/tshabs) + +Let’s consider mainly UTXO-based blockchain. The state of such kind of blockchains is mainly about the number of UTXOs. To ease the state explosion issue, we will need a proper design to invalidate UTXOs with small value. + +Let’s also assume that all the UTXOs are equally sized. Then the state explosion problem can be reduced to bound the number of UTXOs. As blockchain protocol applies the same validation rules to each UTXO, an upper bound on the number of UTXOs means a lower bound on the number of coins per UTXO (inflation and deflation are not considered as the rates of both are usually not so high ). Therefore, we come to the conclusion that a lower bound is necessary. + +However, it’s nearly impossible to find a fixed lower bound for the coin amount per UTXO. For example, for Bitcoin, 1mBTC might be a reasonable lower bound 10 years ago, but it cannot be used anymore nowadays. The second best is to find a dynamic lower bound that depends on the current state of the blockchain. Ideally, the lower bound would make attackers either impossible or cost high to inflate the state. When the market value of the blockchain is low, the cost to attack is low anyway, so the lower bound has to be high to make it impossible to create new utxos insanely. When the market value of the blockchain gets higher, the lower bound can be reduced. + +@Tom suggested designing such a lower bound based on averaged tx fee of the latest blocks. However, most of the blockchains would have “gas limit” as Ethereum. When the network is very congested, the tx fee would be equal to the gas limit always. In this case, the lower bound will not be dynamic enough in the long term. However, with a dynamic gas limit like EIP1559, it might perform well. + +@Cheng suggested designing the lower bound based on the hash rate of the blockchain. Theoretically, hash rate is a good index for energy consumption and block reward in fiat. In practice, when using a simple and efficient mining algorithm like Sha256, the cost per hash rate is pretty stable and predictable in the long run. The lower bound can be inversely proportional to (hash_rate / coinbase_reward) if follow this design. + +As noted by @Tom, there is an edge case that one UTXO might be above the lower bound when it’s created, but later might be invalid with a new lower bound. There are two ways to deal with it: 1) actively removing those invalid UTXOs, but this will probably make users angry and also make the system complicated; 2) just leave it there and users will still be able to use it as each tx can include multiple inputs. Note that this is not possible for Ethreum's native token, as there can be only one caller for each Eth tx. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/network/cpu-miner-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/network/cpu-miner-guide.md new file mode 100644 index 00000000..e8e97f03 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/network/cpu-miner-guide.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 30 +title: CPU Miner Leitfaden +sidebar_label: CPU Miner Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +:::info + +CPU-Mining ist nur für Testzwecke gedacht. Um das Testnet zu verwenden, besuchen Sie bitte [Testnet Leitfaden](network/testnet-guide.md). + +Für das Mining in der Produktion besuchen Sie bitte [Solo Mining Leitfaden](mining/solo-mining-guide.md) oder [Pool Mining Leitfaden](mining/pool-mining-guide.md). + +::: + +Sie müssen zuerst den Schritten im [Full-node Guide](full-node/getting-started.md) folgen, um Ihren Node herunterzuladen, zu konfigurieren, zu starten und Swagger (oder andere OpenAPI-Clients) zu verwenden. + +Bitte beachten Sie, dass die Standardadresse und der Port für die REST-API [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs) sind. + +## Mining starten + +Stellen Sie sicher, dass Ihr lokaler Node vollständig synchronisiert ist, bevor Sie mit dem Mining beginnen. Wir werden in unserem nächsten großen Release eine Validierung dafür hinzufügen. + +Sie können das Mining **starten**, indem Sie auf Ihrem lokalen Node einen POST auf `/miners/cpu-mining?action=start-mining` durchführen.. + +Der Server sollte einfach mit `true` antworten, um zu bestätigen, dass der Mining-Prozess jetzt gestartet ist. + +Bitte beachten Sie, dass Sie zuerst Ihre Miner-Adressen konfigurieren müssen, wie im Abschnitt [Eine neue Miner-Wallet erstellen](mining/solo-mining-guide.md#create-a-new-miner-wallet) des GPU-Miner-Guides erklärt. + +## Mining stoppen +Ebenso können Sie das Mining **stoppen** , indem Sie auf Ihrem lokalen Node einen POST auf `/miners/cpu-mining?action=stop-mining` durchführen.. + +## CPU Nutzung + +Sie können die Menge der CPU-Ressourcen für das Mining durch Verwendung der folgenden beiden Konfigurationen anpassen: + + akka.actor.mining-dispatcher.fork-join-executor.parallelism-min = 1 // the minimal number of threads for mining + akka.actor.mining-dispatcher.fork-join-executor.parallelism-max = 4 // the maximal number of threads for mining diff --git a/i18n/de/docusaurus-plugin-content-docs/current/network/devnet-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/network/devnet-guide.md new file mode 100644 index 00000000..07ec4174 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/network/devnet-guide.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 20 +title: Devnet Leitfaden +sidebar_label: Devnet Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Es ist entwicklerfreundlich, eine lokale Entwicklungsumgebung (Devnet) mit leerer Blockhistorie und einer beliebigen Menge an Münzen zu starten. + +Die Installation des Full Nodes für das Devnet erfolgt genauso wie für das Mainnet: [Full Node Starter Guide](full-node/getting-started.md) + +**Die `user.conf` muss vor dem Starten des Full Nodes modifiziert werden.**. + +Bitte beachten Sie, dass die Standardadresse und der Port für die REST-API [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs) sind. + +## Konfiguration + +In der Datei `$HOME/.alephium/user.conf` (`user.conf`, wenn Docker verwendet wird) müssen Sie Folgendes hinzufügen: + +``` +// In den meisten Fällen, ändern Sie die folgenden beiden Zeilen: +alephium.genesis.allocations = [{address = "", amount = 1000000000000000000000000, lock-duration = 0 seconds}] // 1 million token allocated for your address +alephium.consensus.num-zeros-at-least-in-hash = 0 + +alephium.network.network-id = 4 +alephium.discovery.bootstrap = [] +alephium.wallet.locking-timeout = 99999 minutes +alephium.mempool.auto-mine-for-dev = true + +// arbitrary mining addresses +alephium.mining.miner-addresses = [ +"1FsroWmeJPBhcPiUr37pWXdojRBe6jdey9uukEXk1TheA", +"1CQvSXsmM5BMFKguKDPpNUfw1idiut8UifLtT8748JdHc", +"193maApeJWrz9GFwWCfa982ccLARVE9Y1WgKSJaUs7UAx", +"16fZKYPCZJv2TP3FArA9FLUQceTS9U8xVnSjxFG9MBKyY" +] +``` + +Setzen Sie bitte Ihre eigenen Adressen für die Genesis-Zuweisungen ein. Sie können auch `num-zeros-at-least-in-hash` eduzieren, um das Mining zu beschleunigen. + +Weitere Konfigurationen finden Sie in `$HOME/.alephium/network-4/`, und Protokolle können in `$HOME/.alephium/logs/` gefunden werden. + +Wenn Sie `user.conf` ändern, ist es besser, `$HOME/.alephium/network-4/` u löschen, bevor Sie den Full Node neu starten. + +## Mining + +Devnet mit der Beispielkonfigurationsdatei kann automatisch neue Blöcke für alle neuen Transaktionen minen. Es ist nicht erforderlich, die CPU für das Mining zu verwenden. + +Wenn Sie das Devnet für Mining-Tests verwenden möchten, setzen Sie bitte eine relativ hohe Schwierigkeit wie folgt: + +``` +alephium.consensus.num-zeros-at-least-in-hash = 24 +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/network/testnet-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/network/testnet-guide.md new file mode 100644 index 00000000..4ad37d2b --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/network/testnet-guide.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 10 +title: Testnet Leitfaden +sidebar_label: Testnet Leitfaden +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Die Installation des Full Nodes für das Testnet erfolgt genauso wie für das Mainnet: [Full Node Starter Guide](full-node/getting-started.md) + +**Die `user.conf` muss vor dem Starten des Full Nodes modifiziert werden.**. + +Bitte beachten Sie, dass die Standardadresse und der Port für die REST-API [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs) sind. + +## Konfiguration + +In der Datei `$HOME/.alephium/user.conf` (`user.conf` , wenn Docker verwendet wird) müssen Sie Folgendes hinzufügen: + +``` +alephium.network.network-id = 1 +alephium.discovery.bootstrap = ["testnet-bootstrap0.alephium.org:9973","testnet-bootstrap1.alephium.org:9973"] +``` + +## Mining + +Im Testnet können Sie den [CPU Miner Leitfaden](cpu-miner-guide.md) verwenden, um einige ALPH zu erhalten. + +Fügen Sie Ihre Miner-Adressen in `$HOME/.alephium/user.conf` wie folgt hinzu: + +``` +alephium.mining.miner-addresses = [ +"1FsroWmeJPBhcPiUr37pWXdojRBe6jdey9uukEXk1TheA", +"1CQvSXsmM5BMFKguKDPpNUfw1idiut8UifLtT8748JdHc", +"193maApeJWrz9GFwWCfa982ccLARVE9Y1WgKSJaUs7UAx", +"16fZKYPCZJv2TP3FArA9FLUQceTS9U8xVnSjxFG9MBKyY" +] +``` + +:::info + +Sie können ganz einfach Mining-Adressen generieren, indem Sie die [Desktop Wallet](../wallet/desktop-wallet/configure-mining-wallet) installieren und eine Wallet mit 4 Adressen erstellen. Sie können dann die Adressen kopieren und in Ihre oben genannte `user.conf`-Datei einfügen. + +::: + +## Konfigurationsbeispiel: + +``` +alephium.api.network-interface = "0.0.0.0" +alephium.mining.api-interface = "0.0.0.0" +alephium.network.network-id = 1 +alephium.discovery.bootstrap = ["testnet-bootstrap0.alephium.org:9973","testnet-bootstrap1.alephium.org:9973"] +alephium.mining.miner-addresses = [ +"1FsroWmeJPBhcPiUr37pWXdojRBe6jdey9uukEXk1TheA", +"1CQvSXsmM5BMFKguKDPpNUfw1idiut8UifLtT8748JdHc", +"193maApeJWrz9GFwWCfa982ccLARVE9Y1WgKSJaUs7UAx", +"16fZKYPCZJv2TP3FArA9FLUQceTS9U8xVnSjxFG9MBKyY" +] +alephium.api.api-key-enabled = false +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/ralph/asset-permission-system.md b/i18n/de/docusaurus-plugin-content-docs/current/ralph/asset-permission-system.md new file mode 100644 index 00000000..c574e06f --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/ralph/asset-permission-system.md @@ -0,0 +1,197 @@ +--- +sidebar_position: 60 +title: Asset Permission System (APS) +sidebar_label: Asset permission system (APS) +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Das Asset Permission System (APS) ist eine der einzigartigen Funktionen von Ralph. Es legt den Fluss von Vermögenswerten auf Code-Ebene explizit fest und gibt Entwicklern und Benutzern von Smart Contracts die Gewissheit, dass alle Vermögensübertragungen wie beabsichtigt erfolgen. Zusammen mit dem UTXO-Modell bietet es auch eine einfachere und sicherere Benutzererfahrung, indem es Risiken bei der Token-Genehmigung in Systemen wie EVM eliminiert. + +Alephium verwendet das +[sUTXO](https://medium.com/@alephium/an-introduction-to-the-stateful-utxo-model-8de3b0f76749)-Modell, bei dem Vermögenswerte, einschließlich des nativen ALPH und anderer Token, durch UTXOs verwaltet werden, während Smart Contracts und ihre Zustände im Account-basierten Modell verwaltet werden. + +Dies hat einige Auswirkungen: + +1. Einfache Vermögensübertragungen zwischen Benutzern erfordern nur UTXOs, die sich in der Sicherheit bei der Verwaltung von Vermögenswerten bewährt haben. Hier sind keine Smart Contracts beteiligt. +2. Wenn Smart Contracts Vermögenswerte im Auftrag der Besitzer übertragen müssen, sind keine separaten Genehmigungstransaktionen erforderlich. Die Genehmigung ist im UTXO-Modell implizit: Wenn der Input, der einen bestimmten Token enthält, in der Transaktion autorisiert ist, ausgegeben zu werden, hat der Besitzer bereits seine Zustimmung zur Verwendung dieses Tokens im Kontext dieser Transaktion erteilt. Dies bedeutet, dass die Smart Contracts, die in derselben Transaktion aufgerufen werden, potenziell den Token übertragen können. + +Nun stellt sich die Frage: In der zweiten Situation, wie können wir sicherstellen, dass die in der Transaktion über das UTXO-Modell implizit genehmigten Vermögenswerte sicher von den Smart Contracts verarbeitet werden können? Die Antwort lautet: Ralphs Asset Permission System (APS). + +## Fluss von Vermögenswerten + +Um mit den Smart Contracts in Alephium zu interagieren, muss eine Transaktion ein `TxScript` ausführen. Im folgenden Beispiel für eine Transaktion gibt es zwei Inputs, einen fixen Output und ein `TxScript`: + +``` + ---------------- + | | + | | + 1 Token A | | 1 ALPH (fester Output) +================> | | ========================> + 6.1 ALPHs | | ??? (generierter Output) +================> | | ========================> + | | + | | + | | + ---------------- +``` + +Hier sind zwei Dinge zu beachten: + +1. Obwohl es nur einen festen Output gibt, werden für diese Transaktion mehrere Outputs generiert. Die generierten Outputs hängen vom Ergebnis der Ausführung des `TxScript` ab. +2. Die insgesamt verfügbaren Vermögenswerte für `TxScript` (einschließlich der von ihm aufgerufenen Smart Contracts) betragen `5.1` ALPHs und `1` Token A, da das `1` ALPH im festen Output abgezogen werden muss. + +Angenommen, das `TxScript` sieht ungefähr so aus: + +```rust +TxScript ListNFT( + tokenAId: ByteVec, + price: U256, + marketPlace: NFTMarketPlace +) { + let listingFee = marketPlace.getListingFee() + let minimalAlphInContract = 1 alph + let approvedAlphAmount = listingFee + minimalAlphInContract + + marketPlace.listNFT{callerAddress!() -> ALPH: approvedAlphAmount, tokenAId: 1}(tokenAId, price) +} +``` + +Wie Sie vielleicht vermutet haben, handelt es sich bei Token A um einen NFT-Token, und das obige `TxScript` hat zum Ziel, ihn über einen Marktplatz-Smart Contract zu listen. + +Die folgende Codezeile ist besonders interessant: + +```rust +marketPlace.listNFT{callerAddress!() -> ALPH: approvedAlphAmount, tokenAId: 1}(tokenAId, price) +``` + +Der Code innerhalb der geschweiften Klammern genehmigt explizit, dass +`approvedAlphAmount` ALPH und `1` Token A in der Funktion +`marketPlace.listNFT` ausgegeben werden dürfen, obwohl die Gesamtvermögenswerte für `TxScript` `5.1` und `1` für ALPH bzw. Token A betragen. + +Es könnten folgende Szenarien eintreten: + +1. Wenn sich herausstellt, dass `approvedAlphAmount` mehr als `5.1` ALPH beträgt, schlägt die Transaktion mit einem Fehler `NotEnoughBalance` fehl. +2. Wenn `approvedAlphAmount` weniger als `5.1` ALPH ist, sagen wir `1.1` ALPH, + dann beträgt die maximal mögliche Menge an Vermögenswerten, die `marketPlace.listNFT` verarbeiten kann, `1.1` ALPHs und `1` Token A. `marketPlace.listNFT` hat keinen Zugriff auf die restlichen `4` ALPHs. +3. Wenn `marketPlace.listNFT` nicht die gesamten genehmigten Vermögenswerte ausgegeben hat, werden die verbleibenden Vermögenswerte an ihren Besitzer zurückgegeben, wenn `marketPlace.listNFT` zurückkehrt. + +Schauen wir uns die Funktion `marketPlace.listNFT` etwas genauer an: + +```rust +Contract NFTMarketPlace( + nftListingTemplateId: ByteVec +) { + // Übriger Code wurde aus Gründen der Kürze ausgelassen. + + pub fn getListingFee() -> U256 { + return 0.1 ALPH + } + + @using(preapprovedAssets = true, assetsInContract = true, updateFields = false) + pub fn listNFT( + tokenId: ByteVec, + price: U256 + ) -> (Address) { + assert!(price > 0, ErrorCodes.NFTPriceIsZero) + + // Nur der Eigentümer kann das NFT auflisten. + let tokenOwner = callerAddress!() + + let (encodeImmutableFields, encodeMutableFields) = NFTListing.encodeFields!(tokenId, tokenOwner, selfAddress!(), commissionRate, price) + // Erstellen Sie den Listungsvertrag. + let nftListingContractId = copyCreateSubContract!{tokenOwner -> ALPH: 1 alph, tokenId: 1}( + tokenId, nftListingTemplateId, encodeImmutableFields, encodeMutableFields + ) + + // Erheben Sie die Listungsgebühr. + transferTokenToSelf!(tokenOwner, ALPH, listingFee) + + return contractIdToAddress!(nftListingContractId) + } +} +``` + +Das erste, was auffällt, ist die Annotation für die Methode `listNFT`: + +```rust +@using(preapprovedAssets = true, assetsInContract = true, updateFields = false) +``` + +`preapprovedAssets = true` teilt der VM mit, dass die Methode `listNFT` beabsichtigt, einige Vermögenswerte zu verwenden, und der Aufrufer beabsichtigt, einen Satz erforderlicher Vermögenswerte zu genehmigen, oder andernfalls wird ein Kompilierfehler gemeldet. Die Kompilierung schlägt auch fehl, wenn der Aufrufer versucht, Vermögenswerte für eine Methode zu genehmigen, bei der `preapprovedAssets = false` ist. + +`assetsInContract = true` gibt der VM an, dass die Methode `listNFT` +beabsichtigt, das Vermögen des Vertrags `NFTMarketPlace` zu aktualisieren. +Der Compiler stellt sicher, dass die Methode `listNFT` dies tatsächlich tut, +oder es wird ein Kompilierfehler gemeldet. In diesem Fall aktualisiert +`listNFT` das Vermögen des Vertrags `NFTMarketPlace` indem es die `listingFee` darauf überträgt: + +```rust +// Erheben Sie die Listungsgebühr +transferTokenToSelf!(tokenOwner, ALPH, listingFee) +``` + +Die Annotation `updateFields` liegt außerhalb des Rahmens dieser Dokumentation. + +Die Methode `marketPlace.listNFT` wird vom `TxScript` `ListNFT`, aufgerufen, +wie unten gezeigt: + +```rust +marketPlace.listNFT{callerAddress!() -> ALPH: approvedAlphAmount, tokenAId: 1}(tokenAId, price) +``` + +Wenn `marketPlace.listNFT` von der VM ausgeführt wird, ist sie berechtigt, `1.1` ALPH und `1` Token vom Aufrufer des Skripts auszugeben. Wenn `marketPlace.listNFT` wiederum andere Methoden aufruft, kann es auch einem Teil dieser genehmigten Vermögenswerte für diese Methode zustimmen. Beispielsweise haben wir in `marketPlace.listNFT` den folgenden Code, um eine NFT-Listung zu erstellen: + +```rust +let nftListingContractId = copyCreateSubContract!{tokenOwner -> ALPH: 1 alph, tokenId: 1}( + tokenId, nftListingTemplateId, encodeImmutableFields, encodeMutableFields +) +``` + +Wie wir sehen können, genehmigt die Methode `marketPlace.listNFT` `1` ALPH und `1` +Token A für die eingebaute Funktion `copyCreateSubContract!` aus ihrem eigenen Pool genehmigter Vermögenswerte (`1.1` ALPH and `1` Token A), bevor sie die `listingFee` dem Vertrag `NFTMarketPlace` selbst zusendet. Der Fluss von Vermögenswerten ist unten dargestellt: + +``` + Aufrufer des TxScript + (6.1 ALPH; 1 Token A) + || + || + || Vermögenswerte in den + || festen Outputs + || + || Genehmigungen Genehmigungen + \/ (1.1 ALPH; 1 TokenA) (1 ALPH; 1 TokenA) + (5.1 ALPH; 1 Token A) ========================> listNFT ========================> copyCreateSubContract! + || + || + || An sich selbst + || + \/ + (0.1 ALPH) +``` + +Wie wir uns vorstellen können, wenn wir einen größeren Baum von Methodenaufrufen haben, wird der genehmigte Betrag von der Wurzel des Baums bis zu den Blättern wie Wasser kaskadieren. Das Asset Permission System macht diesen Fluss des Vermögens über die Methodenaufrufe hinweg explizit und setzt Einschränkungen für jede der Methoden fest, welche Token und wie viel von ihnen ausgegeben werden können. + +Zurück zur Transaktion sollten die generierten Ausgänge nach der Ausführung des `TxScript` +ungefähr so aussehen: + +``` + ---------------- + | | + | | 1 ALPH (fester Output) + 1 Token A | | =========================================> +======================> | | 1 ALPH, 1 Token A (NFTListing contract) + 6.1 ALPHs | | =========================================> +======================> | | 0.1 ALPH (NFTMarketPlace contract) + | | =========================================> + | | 4 ALPH - gas (Ausgabe ändern) + | | =========================================> + | | + ---------------- +``` + +## Zusammenfassung + +Das Asset Permission System (APS) gibt den Fluss von Vermögenswerten in Smart Contracts vor. Die explizite Genehmigung der Vermögenswerte für jeden Methodenaufruf stellt sicher, dass die Methoden niemals mehr ausgeben können, als ihnen autorisiert wurde. Zusammen mit dem UTXO-Modell bietet es eine Vermögensverwaltungslösung, die einfacher, zuverlässiger und sicherer ist. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/ralph/built-in-functions.md b/i18n/de/docusaurus-plugin-content-docs/current/ralph/built-in-functions.md new file mode 100644 index 00000000..f808a76c --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/ralph/built-in-functions.md @@ -0,0 +1,1415 @@ +--- +sidebar_position: 20 +title: Built-in Functions +sidebar_label: Built-in Functions +--- + + + +Die Built-in Functions (integrierten Funktionen) sind in mehrere Kategorien unterteilt: +[Contract](#contract-functions), +[SubContract](#subcontract-functions), +[Asset](#asset-functions), +[Utils](#utils-functions), +[Chain](#chain-functions), +[Conversion](#conversion-functions), +[ByteVec](#bytevec-functions), +[Cryptography](#cryptography-functions). +Alle Built-in Functions haben das Suffix `!`. +Alle Byte-Codierungen verwenden die Byte-Reihenfolge Big Endian. + +## Contract Functions +--- +### createContract + +```Rust +fn createContract!(bytecode:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec) -> (ByteVec) +``` + +Erstellt einen neuen Vertrag ohne Token-Ausgabe. + +> @param **bytecode** *der Bytecode des zu erstellenden Vertrags* +> +> @param **encodedImmFields** *die codierten unveränderlichen Felder als ByteVec* +> +> @param **encodedMutFields** *die codierten veränderlichen Felder als ByteVec* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### createContractWithToken + +```Rust +fn createContractWithToken!(bytecode:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec, issueTokenAmount:U256, issueTo?:Address) -> (ByteVec) +``` + +Erstellt einen neuen Vertrag mit Token-Ausgabe. + +> @param **bytecode** *der Bytecode des zu erstellenden Vertrags* +> +> @param **encodedImmFields** *die codierten unveränderlichen Felder als ByteVec* +> +> @param **encodedMutFields** *die codierten veränderlichen Felder als ByteVec* +> +> @param **issueTokenAmount** *die Menge der auszugebenden Token* +> +> @param **issueTo** *(optional) eine festgelegte Adresse, um die ausgegebenen Token zu erhalten* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### copyCreateContract + +```Rust +fn copyCreateContract!(contractId:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec) -> (ByteVec) +``` + +Erstellt einen neuen Vertrag ohne Token-Ausgabe durch Kopieren des Codes eines anderen Vertrags. Dies kostet weniger Gas als createContract! + +> @param **contractId** *die ID des zu kopierenden Vertrags* +> +> @param **encodedImmFields** *die codierten unveränderlichen Felder als ByteVec* +> +> @param **encodedMutFields** *die codierten veränderlichen Felder als ByteVec* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### copyCreateContractWithToken + +```Rust +fn copyCreateContractWithToken!(contractId:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec, issueTokenAmount:U256, issueTo?:Address) -> (ByteVec) +``` + +Erstellt einen neuen Vertrag mit Token-Ausgabe durch Kopieren des Codes eines anderen Vertrags. Dies kostet weniger Gas als createContractWithToken!(...). + +> @param **contractId** *die ID des zu kopierenden Vertrags* +> +> @param **encodedImmFields** *die codierten unveränderlichen Felder als ByteVec* +> +> @param **encodedMutFields** *die codierten veränderlichen Felder als ByteVec* +> +> @param **issueTokenAmount** *die Menge der auszugebenden Token* +> +> @param **issueTo** *(optional) eine festgelegte Adresse zum Empfangen der ausgegebenen Token* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### selfAddress + +```Rust +fn selfAddress!() -> (Address) +``` + +Gibt die Adresse des Vertrags zurück. + +> @returns *die Adresse des Vertrags* + +--- + +### selfContractId + +```Rust +fn selfContractId!() -> (ByteVec) +``` + +Gibt die ID (ByteVec) des Vertrags zurück. + +> @returns *die ID (ByteVec) des Vertrags* + +--- + +### selfTokenId + +```Rust +fn selfTokenId!() -> (ByteVec) +``` + +Gibt die Token-ID (ByteVec) des Vertrags zurück. + +> @returns *die Token-ID (ByteVec) des Vertrags* + +--- + +### tokenId + +```Rust +fn tokenId!(contract:) -> (ByteVec) +``` + +Gibt die ID des Vertrags zurück. + +> @param **contract** *die Vertragsvariable* +> +> @returns *die ID des Vertrags* + +--- + +### contractId + +```Rust +fn contractId!(contract:) -> (ByteVec) +``` + +Gibt die ID des Vertrags zurück. + +> @param **contract** *die Vertragsvariable* +> +> @returns *die ID des Vertrags* + +--- + +### callerContractId + +```Rust +fn callerContractId!() -> (ByteVec) +``` + +Gibt die Vertrags-ID des Aufrufers zurück. + +> @returns *die Vertrags-ID des Aufrufers* + +--- + +### callerAddress + +```Rust +fn callerAddress!() -> (Address) +``` + +Gibt die Adresse des Aufrufers zurück. Wenn es in einem TxScript verwendet wird, gibt es die eindeutige Eingangsadresse zurück, wenn die Eingangsadressen identisch sind, sonst schlägt es fehl. + +> @returns *die Adresse des Aufrufers. Wenn sie in einem TxScript verwendet wird, gibt sie die eindeutige Eingangsadresse zurück, wenn die Eingangsadressen gleich sind, ansonsten schlägt sie fehl* + +--- + +### contractInitialStateHash + +```Rust +fn contractInitialStateHash!(contractId:ByteVec) -> (ByteVec) +``` + +Gibt den Hash des anfänglichen Zustands des Vertrags zurück. + +> @param **contractId** *die ID des Eingangsvertrags* +> +> @returns *den Hash des Anfangszustands des Vertrags* + +--- + +### contractCodeHash + +```Rust +fn contractCodeHash!(contractId:ByteVec) -> (ByteVec) +``` + +Gibt den Contract-Code-Hash des Vertrags zurück. +> @param **contractId** *die ID des Eingangsvertrags* +> +> @returns *der Contract-Code-Hash des Vertrags* + +--- + +### callerInitialStateHash + +```Rust +fn callerInitialStateHash!() -> (ByteVec) +``` + +Gibt den Hash des anfänglichen Zustands des Caller-Vertrags zurück. + +> @returns *den Hash des anfänglichen Zustands des Caller-Vertrags* + +--- + +### callerCodeHash + +```Rust +fn callerCodeHash!() -> (ByteVec) +``` + +Gibt den Contract-Code-Hash des Caller-Vertrags, also dem Aufrufer zurück. + +> @returns *den Contract-Code-Hash des Caller-Vertrags* + +--- + +### contractExists + +```Rust +fn contractExists!(contractId:ByteVec) -> (Bool) +``` + +Überprüft, ob der Vertrag mit der angegebenen ID existiert. + +> @param **contractId** *die ID des zu testenden Eingangsvertrags* +> +> @returns *true, wenn der Vertrag in der Kette existiert, andernfalls false* + +--- + +### destroySelf + +```Rust +fn destroySelf!(refundAddress:Address) -> () +``` + +Zerstört den Vertrag und überträgt das verbleibende Vermögen an eine festgelegte Adresse. + +> @param **refundAddress** *die Adresse, um die verbleibenden Vermögenswerte im Vertrag zu erhalten* +> +> @returns + +--- + +### migrate + +```Rust +fn migrate!(newBytecode:ByteVec) -> () +``` + +Migriert den Code des Vertrags. + +> @param **newBytecode** *der neue Bytecode für den Vertrag, zu dem migriert werden soll* +> +> @returns + +--- + +### migrateWithFields + +```Rust +fn migrateWithFields!(newBytecode:ByteVec, newEncodedImmFields:ByteVec, newEncodedMutFields:ByteVec) -> () +``` + +Migriert sowohl den Code als auch die Felder des Vertrags. + +> @param **newBytecode** *der Bytecode für den Vertrag, zu dem migriert werden soll* +> +> @param **newEncodedImmFields** *die als unveränderlich codierten Felder für den Vertrag, zu dem migriert werden soll* +> +> @param **newEncodedMutFields** *die als unveränderlich codierten Felder für den Vertrag, zu dem migriert werden soll* +> +> @returns + +--- + +### isCalledFromTxScript + +```Rust +fn isCalledFromTxScript!() -> (Bool) +``` + +Überprüft, ob die Funktion von einem TxScript aufgerufen wird. + +> @returns *true, wenn die Funktion von einem TxScript aufgerufen wird, andernfalls false* + +--- + +### selfContract + +```Rust +fn selfContract!() -> () +``` + +Gibt den eigenen Vertrag zurück. + +> @returns *Selbstvertrag* + +--- + +## SubContract Functions +--- +### createSubContract + +```Rust +fn createSubContract!(subContractPath:ByteVec, bytecode:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec) -> (ByteVec) +``` + +Erstellt einen neuen Untervertag ohne Token-Ausgabe. + +> @param **subContractPath** *der Pfad des zu erstellenden Unter-Vertrags* +> +> @param **bytecode** *der Bytecode des zu erstellenden Unter-Vertrags* +> +> @param **encodedImmFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @param **encodedMutFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### createSubContractWithToken + +```Rust +fn createSubContractWithToken!(subContractPath:ByteVec, bytecode:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec, issueTokenAmount:U256, issueTo?:Address) -> (ByteVec) +``` + +Erstellt einen neuen Untervertag mit Token-Ausgabe. + +> @param **subContractPath** *der Pfad des zu erstellenden Unter-Vertrags* +> +> @param **bytecode** *der Bytecode des zu erstellenden Unter-Vertrags* +> +> @param **encodedImmFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @param **encodedMutFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @param **issueTokenAmount** *die Menge der auszugebenden Token* +> +> @param **issueTo** *(optional) eine festgelegte Adresse zum Empfangen der ausgegebenen Token* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### copyCreateSubContract + +```Rust +fn copyCreateSubContract!(subContractPath:ByteVec, contractId:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec) -> (ByteVec) +``` + +Erstellt einen neuen Untervertag ohne Token-Ausgabe durch Kopieren des Codes eines anderen Vertrags. Dies kostet weniger Gas als createSubContract!(...). + +> @param **subContractPath** *der Pfad des zu erstellenden Unter-Vertrags* +> +> @param **contractId** *die ID des zu kopierenden Vertrags* +> +> @param **encodedImmFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @param **encodedMutFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### copyCreateSubContractWithToken + +```Rust +fn copyCreateSubContractWithToken!(subContractPath:ByteVec, contractId:ByteVec, encodedImmFields:ByteVec, encodedMutFields:ByteVec, issueTokenAmount:U256, issueTo?:Address) -> (ByteVec) +``` + +Erstellt einen neuen Untervertag mit Token-Ausgabe durch Kopieren des Codes eines anderen Vertrags. Dies kostet weniger Gas als createSubContractWithToken!(...). + +> @param **subContractPath** *der Pfad des zu erstellenden Unter-Vertrags* +> +> @param **contractId** *die ID des zu kopierenden Vertrags* +> +> @param **encodedImmFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @param **encodedMutFields** *die als unveränderlich codierten Felder als ByteVec* +> +> @param **issueTokenAmount** *die Menge der auszugebenden Token* +> +> @param **issueTo** *(optional) eine festgelegte Adresse zum Empfangen der ausgegebenen Token* +> +> @returns *die ID des erstellten Vertrags* + +--- + +### subContractId + +```Rust +fn subContractId!(subContractPath:ByteVec) -> (ByteVec) +``` + +Gibt die ID des Untervertags zurück. + +> @param **subContractPath** *der Pfad des SubContract* +> +> @returns *die ID des SubContract* + +--- + +### subContractIdOf + +```Rust +fn subContractIdOf!(contract:, subContractPath:ByteVec) -> (ByteVec) +``` + +Gibt die ID des Untervertags zurück. + +> @param **contract** *der übergeordnete Vertrag des SubContract* +> +> @param **subContractPath** *der Pfad des USubContract* +> +> @returns *die ID des SubContract* + +--- + +### subContractIdInParentGroup + +```Rust +fn subContractIdInParentGroup!(contract:, subContractPath:ByteVec) -> (ByteVec) +``` + +Gibt die ID des Untervertags zurück. + +> @param **contract** *der übergeordnete Vertrag des SubContract* +> +> @param **subContractPath** *der Pfad des SubContract* +> +> @returns *die ID des SubContract* + +--- + +## Asset Functions +--- +### approveToken + +```Rust +fn approveToken!(fromAddress:Address, tokenId:ByteVec, amount:U256) -> () +``` + +Genehmigt die Verwendung einer bestimmten Menge an Token von der angegebenen Adresse. + +> @param **fromAddress** *der übergeordnete Vertrag des SubContract* +> +> @param **tokenId** *das zu genehmigende Token* +> +> @param **amount** *die Menge der zu genehmigenden Token* +> +> @returns + +--- + +### tokenRemaining + +```Rust +fn tokenRemaining!(address:Address, tokenId:ByteVec) -> (U256) +``` + +Gibt die Menge der verbleibenden Tokenmenge in den Eingangsvermögen der Funktion zurück. + +> @param **address** *die Eingangsadresse* +> +> @param **tokenId** *die Token-ID* +> +> @returns *die Menge der verbleibenden Token in den Eingangsvermögen der Funktion* + +--- + +### transferToken + +```Rust +fn transferToken!(fromAddress:Address, toAddress:Address, tokenId:ByteVec, amount:U256) -> () +``` + +Überträgt Token aus dem Eingangsvermögen der Funktion. + +> @param **fromAddress** *die Adresse, von der Token transferiert werden sollen +> +> @param **toAddress** *die Adresse, zu der Token transferiert werden sollen* +> +> @param **tokenId** *das zu transferierende Token* +> +> @param **amount** *die Menge der zu transferierenden Token* +> +> @returns + +--- + +### transferTokenFromSelf + +```Rust +fn transferTokenFromSelf!(toAddress:Address, tokenId:ByteVec, amount:U256) -> () +``` + +Überträgt die Token des Vertrags aus dem Eingangsvermögen der Funktion. + +> @param **toAddress** *die Adresse, zu der Token transferiert werden sollen* +> +> @param **tokenId** *das zu transferierende Token* +> +> @param **amount** *die Menge der zu transferierenden Token* +> +> @returns + +--- + +### transferTokenToSelf + +```Rust +fn transferTokenToSelf!(fromAddress:Address, tokenId:ByteVec, amount:U256) -> () +``` + +Überträgt Token an den Vertrag aus dem Eingangsvermögen der Funktion. + +> @param **fromAddress** *die Adresse, von der Token transferiert werden sollen* +> +> @param **tokenId** *das zu transferierende Token* +> +> @param **amount** *die Menge der zu transferierenden Token* +> +> @returns + +--- + +### burnToken + +```Rust +fn burnToken!(address:Address, tokenId:ByteVec, amount:U256) -> () +``` + +Verbrennt Token aus dem Eingangsvermögen der Funktion. + +> @param **address** *die Adresse, von der Token verbrannt werden sollen* +> +> @param **tokenId** *das zu verbrennende Token* +> +> @param **amount** *die Menge der zu verbrennenden Token* +> +> @returns + +--- + +### lockApprovedAssets + +```Rust +fn lockApprovedAssets!(address:Address, timestamp:U256) -> () +``` + +Sperrt das aktuelle genehmigte Vermögen. + +> @param **address** *die Adresse, in der die Vermögen gesperrt werden sollen* +> +> @param **timestamp** *der Zeitstempel, bis zu dem die Vermögen gesperrt werden sollen* +> +> @returns + +--- + +## Utils Functions +--- +### assert + +```Rust +fn assert!(condition:Bool, errorCode:U256) -> () +``` + +Testet die Bedingung oder überprüft Invarianten. + +> @param **condition** *die zu überprüfende Bedingung* +> +> @param **errorCode** *der Fehlercode, der ausgeworfen wird, wenn die Überprüfung fehlschlägt* +> +> @returns + +--- + +### checkCaller + +```Rust +fn checkCaller!(condition:Bool, errorCode:U256) -> () +``` + +Überprüft Bedingungen des externen Aufrufers der Funktion. + +> @param **condition** *die zu überprüfende Bedingung* +> +> @param **errorCode** *der Fehlercode, der ausgeworfen wird, wenn die Überprüfung fehlschlägt* +> +> @returns + +--- + +### isAssetAddress + +```Rust +fn isAssetAddress!(address:Address) -> (Bool) +``` + +Gibt zurück, ob eine Adresse eine Vermögensadresse ist. + +> @param **address** *die zu testende Eingangsadresse* +> +> @returns *true, wenn die Adresse eine Vermögensadresse ist, andernfalls false* + +--- + +### isContractAddress + +```Rust +fn isContractAddress!(address:Address) -> (Bool) +``` + +Gibt zurück, ob eine Adresse eine Vertragsadresse ist. + +> @param **address** *die zu testende Eingangsadresse* +> +> @returns *true, wenn die Adresse eine Vertragsadresse ist, andernfalls false* + +--- + +### zeros + +```Rust +fn zeros!(n:U256) -> (ByteVec) +``` + +Gibt einen ByteVec von Nullen zurück. + +> @param **n** *die Anzahl der Nullen* +> +> @returns *ein ByteVec aus Nullen* + +--- + +### panic + +```Rust +fn panic!(errorCode?: U256) -> (Never) +``` + +Beendet die Anwendung sofort. + +> @param **errorCode** *(optional) der Fehlercode, der geworfen wird, wenn panic!(...) aufgerufen wird* +> +> @returns + +--- + +### mulModN + +```Rust +fn mulModN!(x:U256, y:U256, n:U256) -> (U256) +``` + +Berechnet **x * y % n**. + +> @param **x** *x* +> +> @param **y** *y* +> +> @param **n** *n* +> +> @returns *berechne x * y % n* + +--- + +### addModN + +```Rust +fn addModN!(x:U256, y:U256, n:U256) -> (U256) +``` + +Berechnet **(x + y) % n**. + +> @param **x** *x* +> +> @param **y** *y* +> +> @param **n** *n* +> +> @returns *berechne (x + y) % n* + +--- + +### u256Max + +```Rust +fn u256Max!() -> (U256) +``` + +Gibt den maximalen Wert von **U256** zurück. + +> @returns *der maximale Wert von U256* + +--- + +### i256Max + +```Rust +fn i256Max!() -> (I256) +``` + +Gibt den maximalen Wert von **I256** zurück. + +> @returns *der maximale Wert von I256* + +--- + +### i256Min + +```Rust +fn i256Min!() -> (I256) +``` + +Gibt den minimalen Wert von **I256** zurück. + +> @returns *der minimale Wert von I256* + +--- + +### nullContractAddress + +```Rust +fn nullContractAddress!() -> (Address) +``` + +Gibt die Null-Vertragsadresse mit der Vertrags-ID, die Nullen sind, zurück. + +> @returns *die Null-Vertragsadresse mit der Vertrags-ID als Nullen* + +--- + +## Chain Functions +--- +### networkId + +```Rust +fn networkId!() -> (ByteVec) +``` + +Gibt die Netzwerk-ID (ein einzelnes Byte) zurück. + +> @returns *die Netzwerk-ID (ein einzelnes Byte)* + +--- + +### blockTimeStamp + +```Rust +fn blockTimeStamp!() -> (U256) +``` + +Gibt den Block-Zeitstempel zurück. + +> @returns *der Zeitstempel des Blocks* + +--- + +### blockTarget + +```Rust +fn blockTarget!() -> (U256) +``` + +Gibt das Schwierigkeitsziel des Blocks zurück. + +> @returns *das Schwierigkeitsziel des Blocks* + +--- + +### txId + +```Rust +fn txId!() -> (ByteVec) +``` + +Gibt die aktuelle Transaktions-ID zurück. + +> @returns *die aktuelle Transaktions-ID* + +--- + +### txInputAddress + +```Rust +fn txInputAddress!(txInputIndex:U256) -> (Address) +``` + +Gibt die **n**-te Transaktionseingangsadresse zurück. + +> @param **txInputIndex** *der Index der Transaktionseingabe* +> +> @returns *die n-te Transaktionseingangsadresse* + +--- + +### txInputsSize + +```Rust +fn txInputsSize!() -> (U256) +``` + +Gibt die Anzahl der Transaktionseingänge zurück. + +> @returns *die Anzahl der Transaktionseingaben* + +--- + +### txGasPrice + +```Rust +fn txGasPrice!() -> (U256) +``` + +Gibt den aktuellen Gaspreis der Transaktion zurück. + +> @returns *der aktuelle Transaktions-Gaspreis* + +--- + +### txGasAmount + +```Rust +fn txGasAmount!() -> (U256) +``` + +Gibt die aktuelle Gasmenge der Transaktion zurück. + +> @returns *die aktuelle Transaktions-Gasmenge* + +--- + +### txGasFee + +```Rust +fn txGasFee!() -> (U256) +``` + +Gibt die aktuelle Transaktionsgebühr zurück. + +> @returns *die aktuelle Transaktions-Gebühr* + +--- + +### verifyAbsoluteLocktime + +```Rust +fn verifyAbsoluteLocktime!(lockUntil:U256) -> () +``` + +Überprüft, ob die absolute Sperrzeit vor dem Block-Zeitstempel liegt, andernfalls schlägt es fehl. + +> @param **lockUntil** *der Zeitstempel, bis zu dem die Sperre gültig ist* +> +> @returns + +--- + +### verifyRelativeLocktime + +```Rust +fn verifyRelativeLocktime!(txInputIndex:U256, lockDuration:U256) -> () +``` + +Überprüft, ob der Erstellungszeitstempel der Eingabe + Sperrdauer vor dem Block-Zeitstempel liegt, andernfalls schlägt es fehl. + +> @param **txInputIndex** *der Index der Transaktionseingabe* +> +> @param **lockDuration** *die Dauer, für die die Eingabe gesperrt ist* +> +> @returns + +--- + +### dustAmount + +```Rust +fn dustAmount!() -> (U256) +``` + +Gibt den Dust-Betrag einer UTXO zurück. + +> @returns *der Dust-Betrag eines UTXO* + +--- + +## Conversion Functions +--- +### toI256 + +```Rust +fn toI256!(from:U256) -> (I256) +``` + +Konvertiert **U256** in **I256**. + +> @param **from** *ein zu konvertierendes U256* +> +> @returns *ein I256* + +--- + +### toU256 + +```Rust +fn toU256!(from:I256) -> (U256) +``` + +Konvertiert **I256** in **U256**. + +> @param **from** *ein zu konvertierendes I256* +> +> @returns *ein U256* + +--- + +### toByteVec + +```Rust +fn toByteVec!(from:Bool|I256|U256|Address) -> (ByteVec) +``` + +Konvertiert **Bool/I256/U256/Adresse** in ByteVec + +> @param **from** *ein Bool|I256|U256|Adresse, das konvertiert werden soll* +> +> @returns *einen ByteVec* + +--- + +### contractIdToAddress + +```Rust +fn contractIdToAddress!(contractId:ByteVec) -> (Address) +``` + +Konvertiert die Vertrags-ID (ByteVec) in die Vertragsadresse (Adresse). + +> @param **contractId** *die Eingabe-Vertrags-ID* +> +> @returns *eine Vertragsadresse* + +--- + +### addressToContractId + +```Rust +fn addressToContractId!(contractAddress:Address) -> (ByteVec) +``` + +Konvertiert die Vertragsadresse (Adresse) in die Vertrags-ID (ByteVec). + +> @param **contractAddress** *die Eingabe-Vertragsadresse* +> +> @returns *eine Vertrags-ID* + +--- + +### byteVecToAddress + +```Rust +fn byteVecToAddress!(bytes:ByteVec) -> (Address) +``` + +Konvertiert ByteVec in Adresse. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine Adresse* + +--- + +### u256To1Byte + +```Rust +fn u256To1Byte!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in **1 Byte**. + +> @param **u256** *die U256-Eingabe* +> +> @returns *1 Byte* + +--- + +### u256To2Byte + +```Rust +fn u256To2Byte!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in **2 Big-Endian-Bytes**. + +> @param **u256** *die U256-Eingabe* +> +> @returns *2 Bytes* + +--- + +### u256To4Byte + +```Rust +fn u256To4Byte!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in **4 Big-Endian-Bytes**. + +> @param **u256** *die U256-Eingabe* +> +> @returns *4 Bytes* + +--- + +### u256To8Byte + +```Rust +fn u256To8Byte!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in **8 Byte im Big-Endian**-Format. + +> @param **u256** *die U256-Eingabe* +> +> @returns *8 Bytes* + +--- + +### u256To16Byte + +```Rust +fn u256To16Byte!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in **16 Big-Endian-Bytes**. + +> @param **u256** *die U256-Eingabe* +> +> @returns *16 Bytes* + +--- + +### u256To32Byte + +```Rust +fn u256To32Byte!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in **32 Big-Endian-Bytes**. + +> @param **u256** *die U256-Eingabe* +> +> @returns *32 Bytes* + +--- + +### u256ToString + +```Rust +fn u256ToString!(u256:U256) -> (ByteVec) +``` + +Konvertiert **U256** in Zeichenkette in ByteVec. + +> @param **u256** *die U256-Eingabe* +> +> @returns *die in den ByteVec umgewandelte Zeichenkette* + +--- + +### i256ToString + +```Rust +fn i256ToString!(i256:I256) -> (ByteVec) +``` + +Konvertiert **I256** in Zeichenkette in ByteVec. + +> @param **i256** *die U256-Eingabe* +> +> @returns *die in ByteVec umgewandelte Zeichenkette* + +--- + +### boolToString + +```Rust +fn boolToString!(bool:Bool) -> (ByteVec) +``` + +Konvertiert **Bool** in Zeichenkette in **ByteVec**. + +> @param **bool** *die Bool-Eingabe* +> +> @returns *die in ByteVec umgewandelte Zeichenkette* + +--- + +### u256From1Byte + +```Rust +fn u256From1Byte!(bytes:ByteVec) -> (U256) +``` + +Konvertiert **1 Byte** in **U256**. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine U256* + +--- + +### u256From2Byte + +```Rust +fn u256From2Byte!(bytes:ByteVec) -> (U256) +``` + +Konvertiert **2 Big-Endian-Bytes** in **U256**. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine U256* + +--- + +### u256From4Byte + +```Rust +fn u256From4Byte!(bytes:ByteVec) -> (U256) +``` + +Konvertiert **4 Big-Endian-Bytes** in **U256**. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine U256* + +--- + +### u256From8Byte + +```Rust +fn u256From8Byte!(bytes:ByteVec) -> (U256) +``` + +Konvertiert **8 Big-Endian-Bytes** in **U256**. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine U256* + +--- + +### u256From16Byte + +```Rust +fn u256From16Byte!(bytes:ByteVec) -> (U256) +``` + +Konvertiert **16 Big-Endian-Bytes** in **U256**. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine U256* + +--- + +### u256From32Byte + +```Rust +fn u256From32Byte!(bytes:ByteVec) -> (U256) +``` + +Konvertiert **32 Big-Endian-Bytes** in **U256**. + +> @param **bytes** *die ByteVec-Eingabe* +> +> @returns *eine U256* + +--- + +## ByteVec Functions +--- +### size + +```Rust +fn size!(bytes:ByteVec) -> (U256) +``` + +Gibt die Größe des **ByteVec** zurück. + +> @param **bytes** *ein ByteVec* +> +> @returns *die Größe des ByteVec* + +--- + +### byteVecSlice + +```Rust +fn byteVecSlice!(bytes:ByteVec, from:U256, until:U256) -> (ByteVec) +``` + +Wählt ein Intervall von **Bytes** aus. + +> @param **bytes** *ein ByteVec* +> +> @param **from** *der niedrigste Index, der von dem ByteVec einbezogen werden soll* +> +> @param **until** *der niedrigste Index, der von dem ByteVec ausgeschlossen werden soll* +> +> @returns *a ein ByteVec, der die Elemente ab Index oder höher enthält, bis (aber nicht einschließlich) Index, von diesem ByteVec erstreckt* + +--- + +### encodeToByteVec + +```Rust +fn encodeToByteVec!(...any) -> (ByteVec) +``` + +Kodiert Eingaben als **Big-Endian ByteVec**. + +> @param **any** *eine Sequenz von Eingabewerten* +> +> @returns *ein ByteVec, die die Eingaben kodiert* + +--- + +## Cryptography Functions +--- +### blake2b + +```Rust +fn blake2b!(data:ByteVec) -> (ByteVec) +``` + +Berechnet den **Blake2b-256-Hash** der Eingabe. + +> @param **data** *die zu hashenden Eingabedaten* +> +> @returns *das 32-bytes-Hashergebnis* + +--- + +### keccak256 + +```Rust +fn keccak256!(data:ByteVec) -> (ByteVec) +``` + +Berechnet den **Keccak256-Hash** der Eingabe. + +> @param **data** *die zu hashenden Eingabedaten* +> +> @returns *das Hashergebnis* + +--- + +### sha256 + +```Rust +fn sha256!(data:ByteVec) -> (ByteVec) +``` + +Berechnet den **Sha256-Hash** der Eingabe. + +> @param **data** *die zu hashenden Eingabedaten* +> +> @returns *das Hashergebnis* + +--- + +### sha3 + +```Rust +fn sha3!(data:ByteVec) -> (ByteVec) +``` + +Berechnet den **Sha3-Hash** der Eingabe. + +> @param **data** *die zu hashenden Eingabedaten* +> +> @returns *das Hashergebnis* + +--- + +### verifyTxSignature + +```Rust +fn verifyTxSignature!(publicKey:ByteVec) -> () +``` + +Überprüft die **Transaktions-SecP256K1-Signatur** eines öffentlichen Schlüssels. Die Signatur ist gegen die Transaktions-ID signiert. + +> @param **publicKey** *der öffentliche Schlüssel (33 Bytes) des Signierenden* +> +> @returns + +--- + +### getSegregatedSignature + +```Rust +fn getSegregatedSignature!() -> (ByteVec) +``` + +Die getrennte Signatur der Transaktion + +> @returns *die getrennte Signatur der Transaktion* + +--- + +### verifySecP256K1 + +```Rust +fn verifySecP256K1!(data:ByteVec, publicKey:ByteVec, signature:ByteVec) -> () +``` + +Überprüft die **SecP256K1-Signatur** der Eingabe und des öffentlichen Schlüssels. + +> @param **data** *die Daten (32 Bytes), die eigentlich signiert werden sollten* +> +> @param **publicKey** *der öffentliche Schlüssel (33 Bytes) des Signierenden* +> +> @param **signature** *der Signaturwert (64 Bytes)* +> +> @returns + +--- + +### verifyED25519 + +```Rust +fn verifyED25519!(data:ByteVec, publicKey:ByteVec, signature:ByteVec) -> () +``` + +Überprüft die **ED25519-Signatur** der Eingabe und des öffentlichen Schlüssels. + +> @param **data** *die Daten (32 Bytes), die eigentlich signiert werden sollten* +> +> @param **publicKey** *der öffentliche Schlüssel (32 Bytes) des Signierenden* +> +> @param **signature** *der Signaturwert (64 Bytes)* +> +> @returns + +--- + +### verifyBIP340Schnorr + +```Rust +fn verifyBIP340Schnorr!(data:ByteVec, publicKey:ByteVec, signature:ByteVec) -> () +``` + +Überprüft die **BIP340 Schnorr-Signatur** der Eingabe und des öffentlichen Schlüssels. + +> @param **data** *die Daten (32 Bytes), die eigentlich signiert werden sollten* +> +> @param **publicKey** *der öffentliche Schlüssel (32 Bytes) des Signierenden* +> +> @param **signature** *der Signaturwert (64 Bytes)* +> +> @returns + +--- + +### ethEcRecover + +```Rust +fn ethEcRecover!(data:ByteVec, signature:ByteVec) -> (ByteVec) +``` + +Stellt das ETH-Konto wieder her, das die Daten signiert hat. + +> @param **data** *die Daten, die eigentlich signiert werden sollten* +> +> @param **signature** *der Signaturwert* +> +> @returns *das ETH-Konto, das die Daten signiert hat* + +--- + diff --git a/i18n/de/docusaurus-plugin-content-docs/current/ralph/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/ralph/getting-started.md new file mode 100644 index 00000000..bb0e6903 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/ralph/getting-started.md @@ -0,0 +1,741 @@ +--- +sidebar_position: 10 +title: Einstieg +sidebar_label: Einstieg +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +## Einführung + +Ralph ist die Programmiersprache für Smart Contracts auf der Alephium-Blockchain und konzentriert sich auf drei Ziele: Sicherheit, Einfachheit und Effizienz. Dieses Tutorial bietet Tipps zum Schreiben von sauberen, idiomatischen und sicheren Ralph Smart Contracts. Wir folgen den folgenden Prinzipien bei der Gestaltung von Ralph: +1. Halten Sie die DSL (Domain Specific Language) für Smart Contracts so einfach wie möglich. +2. Es sollte eine – und vorzugsweise nur eine – offensichtliche Möglichkeit geben, es zu tun. +3. Integriere bewährte Praktiken von Anfang an. + +## Typen + +Ralph ist eine statisch typisierte Sprache, aber dank Typinferenz müssen Sie den Typ für lokale Variablen und Konstanten nicht angeben. +Alle Typen in Ralph sind Werttypen, das heißt, Sie werden immer kopiert, wenn Sie als Funktionsargumente verwendet oder zugewiesen werden. +Derzeit unterstützt Ralph nur die folgenden Datentypen: + +### Primitive Typen + +#### U256 + +```rust +// Der Typ von a bis d ist U256. +let a = 10 +let b = 10u +let c = 1_000_000_000 +let d = 1e18 +``` + +#### I256 + +```rust +// Der Typ von a bis d ist I256. +let a = -10 +let b = 10i +let c = -1_000_000_000 +let d = -1e18 +``` + +#### Bool + +```rust +// Der Typ von a und b ist Bool. +let a = false +let b = true +``` + +#### ByteVec + +```rust +// ByteVec-Literale müssen mit # beginnen, gefolgt von einer Hex-Zeichenfolge. +let a = #00112233 +// ByteVec-Konkatenation. +let b = #0011 ++ #2233 // `b` ist #00112233 +// Leeres ByteVec. +let c = # +``` + +#### Address + +```rust +// Adress-Literale müssen mit @ beginnen, gefolgt von einer gültigen Alephium-Adresse im Base58-Format. +let a = @1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH +``` + +### Festgrößen-Arrays + +Die Syntax für Festgrößen-Arrays ist von Rust beeinflusst. + +```rust +// Der Typ von a0 ist [U256; 4] +let a0 = [0, 1, 2, 3] + +// Der Typ von a1 ist [[U256, 2]; 2] +let a1 = [[0, 1], [2, 3]] + +// Der Typ von a2 ist [I256; 3] +let a2 = [0i; 3] + +// Der Typ von a3 ist [ByteVec; 4] +let a3 = [#00, #11, #22, #33] +``` + +### Mapping + +Ralph verwendet [subcontract](/ralph/getting-started#subcontract) anstelle einer datenbankähnlichen Datenstruktur, um eine funktionsähnliche Funktionalität bereitzustellen und das Problem des Zustandsaufblähens zu mildern. + +### Struktur + +Derzeit unterstützt Ralph keine benutzerdefinierten Datentypen, aber dies wird in Zukunft unterstützt werden. + +## Funktionen + +Funktionen sind die ausführbaren Einheiten des Codes. Sie können auch Funktionen innerhalb eines Vertrags definieren. + +### Function Signatures + +```rust +// Public Function, die von jedem aufgerufen werden kann. +pub fn foo() -> () + +// Private Function, die nur innerhalb des Vertrags aufgerufen werden kann. +fn foo() -> () + +// Funktion nimmt 1 Parameter entgegen und gibt keine Werte zurück. +fn foo(a: U256) -> () + +// Funktion nimmt 2 Parameter entgegen und gibt 1 Wert zurück. +fn foo(a: U256, b: Boolean) -> U256 + +// Funktion nimmt 2 Parameter entgegen und gibt mehrere Werte zurück. +fn foo(a: U256, b: Boolean) -> (U256, ByteVec, Address) +``` + +### Lokale Variablen + +Eine Funktion kann keine doppelten Variablendefinitionen haben, und der Variablenname in der Funktion darf nicht mit dem Namen des Vertragsfeldes übereinstimmen. + +```rust +fn foo() -> () { + // `a` ist unveränderlich und kann nicht neu zugewiesen werden. + let a = 10 + a = 9 // ERROR + + // `b` ist veränderlich und kann neu zugewiesen werden. + let mut b = 10 + b = 9 +} + +fn bar() -> (U256, Boolean) { + return 1, false +} + +fn baz() -> () { + // Sowohl a als auch b sind unveränderlich. + let (a, b) = bar() + // `c` ist unveränderlich, aber `d` ist veränderlich. + let (c, mut d) = bar() + // Ignoriere den ersten Rückgabewert der Funktion `bar`. + let (_, e) = bar() +} +``` + +### Kontroll-Strukturen + +#### Return statements + +```rust +fn foo() -> (U256, Boolean, ByteVec) { + return 1, false, #00 +} +``` + +#### If-else statements/expressions + +```rust +fn foo() -> ByteVec { + // If-Else-Anweisung. + if (a == 0) { + return #00 + } else if (a == 1) { + return #01 + } else { + return #02 + } +} + +fn foo() -> ByteVec { + return if (a == 0) #00 else if (a == 1) #01 else #02 +} +``` + +#### For loop + +```rust +// For Schleife +fn foo() -> () { + for (let mut index = 0; index <= 4; index = index + 1) { + bar(index) + } +} +``` + +#### While loop + +```rust +// While Schleife +fn foo() -> () { + let mut index = 0 + while (index <= 4) { + bar(index) + index += 1 + } +} +``` + +:::note +Anweisungen wie `break` und `continue` werden in `for` und `while`-Schleifen nicht unterstützt, da Sie in einigen Fällen als schlechte Praxis angesehen werden können. Es wird empfohlen, Sie durch ein vorzeitiges `return` oder eine [assert function](/ralph/built-in-functions#assert) zu ersetzen. +::: + +:::note +In Ralph hat jede Funktion nur einen Geltungsbereich (Scope), sodass es nicht möglich ist, doppelte Variablen im `while` oder `for` -Block zu definieren: + +```rust +let value = 0 +while (true) { + let value = 0 // ERROR, doppelte Variablendefinitionen. + // ... +} +``` +Dies ist eine bewusste Designentscheidung, da das Verdecken von Variablen im Allgemeinen keine gute Praxis ist. +::: + +### Fehlerbehandlung + +Ralph bietet zwei integrierte Assertionsfunktionen für die Fehlerbehandlung: [assert!](/ralph/built-in-functions#assert) und [panic!](/ralph/built-in-functions#panic). Ein Fehler bei der Assertion führt dazu, dass alle Änderungen am Weltzustand durch die Transaktion rückgängig gemacht werden und die Ausführung der Transaktion sofort gestoppt wird. + +```rust +enum ErrorCodes { + InvalidContractState = 0 +} + +fn foo(cond: Boolean) -> () { + // Es wird die Transaktion stoppen, wenn `cond` falsch ist. + // Der Alephium-Client gibt den Fehlercode zurück, wenn die Transaktion fehlschlägt. + assert!(cond, ErrorCodes.InvalidContractState) +} + +fn bar(cond: Boolean) -> U256 { + if (!cond) { + // Der Unterschied zwischen `panic!` und `asset!` besteht darin, dass der Rückgabetyp von `panic!` der Bottom-Typ ist. + panic!(ErrorCodes.InvalidContractState) + } + return 0 +} +``` + +### Funktionsaufrufe + +Funktionen des aktuellen Vertrags können direkt ('intern') oder rekursiv aufgerufen werden: + +```rust +Contract Foo() { + fn foo(v: U256) -> () { + if (v == 0) { + return + } + // Interner Funktionsaufruf. + bar() + // Rekursiver Funktionsaufruf. + foo(v - 1) + } + + fn bar() -> () { + // ... + } +} +``` + +Funktionen können auch extern mit der Notation `bar.func()` aufgerufen werden, wobei `bar` eine Vertragsinstanz und `func` eine Funktion von `bar`ist: + +```rust +Contract Bar() { + pub fn func() -> U256 { + // ... + } +} + +Contract Foo() { + pub fn foo() -> () { + // Instanziieren Sie den Vertrag aus der Vertrags-ID. + let bar = Bar(#15be9537456726c336a3cd1aa36074759c457f151ac253a500085920afe3838a) + // Externer Aufruf. + let a = bar.func() + // ... + } +} +``` + +### Eingebaute Funktionen + +Ralph bietet viele eingebaute Funktionen, auf die Sie [hier](/ralph/built-in-functions) verweisen können. + +### Annotationen + +Die Ralph-Funktion unterstützt auch Annotationen. Derzeit ist die einzige gültige Annotation die `@using`-Annotation, und benutzerdefinierte Annotationen werden in Zukunft unterstützt, wenn dies erforderlich ist. + +Die `@using`-Annotation hat vier optionale Felder: + +* `preapprovedAssets = true/false`: ob die Funktion Assets verwendet, für die der Benutzer zugestimmt hat. Der Standardwert ist `false` für Verträge und `true` für Skripte. +* `assetsInContract = true/false`: ob die Funktion Vertragsvermögen verwendet. Der Standardwert ist `false` für Verträge. +* `checkExternalCaller = true/false`: ob die Funktion den Aufrufer überprüft. Der Standardwert ist `true` für Verträge. +* `updateFields = true/false`: ob die Funktion Vertragsfelder ändert. Der Standardwert ist `false` für Verträge. + +#### Verwendung von vorab genehmigten Assets + +In Ralph muss der Aufrufer, wenn eine Funktion Vermögenswerte verwendet, die Vermögenswerte ausdrücklich genehmigen. Und alle Funktionen im Aufrufstapel müssen mit `@using(preapprovedAssets = true)`. + +```rust +Contract Foo() { + // Die Funktion `foo` verwendet genehmigte Vermögenswerte und überträgt 1 ALPH und 1 Token vom `caller` an den Vertrag. + @using(preapprovedAssets = true) + fn foo(caller: Address, tokenId: ByteVec) -> () { + transferAlphToSelf!(caller, 1 alph) + transferTokenToSelf!(caller, tokenId, 1) + } + + @using(preapprovedAssets = true) + fn bar(caller: Address, tokenId: ByteVec) -> () { + // Wir müssen Vermögenswerte ausdrücklich genehmigen, wenn wir die Funktion `foo` aufrufen. + foo{caller -> 1 alph, tokenId: 1}(caller, tokenId) + // ... + } +} +``` + +Für die Annotation `preapprovedAssets` überprüft der Compiler Folgendes: + +1. Wenn eine Funktion mit `preapprovedAssets = true` annotiert ist, aber nicht die Syntax mit geschweiften Klammern verwendet, gibt der Compiler einen Fehler aus. +2. Wenn ein Funktionsaufruf die Syntax mit geschweiften Klammern verwendet, die Funktion jedoch nicht mit `preapprovedAssets = true` annotiert ist, gibt der Compiler einen Fehler aus. + +#### Verwendung von Vertragsvermögen + +```rust +Contract Foo() { + // Die Funktion `foo` verwendet die Vermögenswerte des Vertrags und überträgt 1 Alph an den Aufrufer. + @using(assetsInContract = true) + fn foo(caller: Address) -> () { + transferAlphFromSelf!(caler, 1 alph) + } + + // Die Funktion `bar darf NICHT mit `@using(assetsInContract = true)` annotiert werden, + // da die Vertragsvermögenswerte nach der Verwendung entfernt werden. + fn bar(caller: Address) -> () { + // ... + foo(caller) + } +} +``` + +Für die Annotation `assetsInContract` überprüft der Compiler Folgendes: + +1. Wenn eine Funktion mit `assetsInContract = true` annotiert ist, aber keine Vertragsvermögen verwendet, gibt der Compiler einen Fehler aus. + +Weitere Informationen zur Berechtigung für Vermögenswerte finden Sie [hier](/ralph/asset-permission-system). + +#### Feldaktualisierungen + +Funktionen, die Felder aktualisieren, ändern die aktuellen Felder des Vertrags. Wenn eine Funktion die Vertragsfelder ändert, aber ohne die Annotation `@using(updateFields = true)` , gibt der Compiler eine Warnung aus. Wenn eine Funktion die Vertragsfelder nicht ändert, aber mit `@using(updateFields = true)` annotiert ist, gibt der Compiler ebenfalls eine Warnung aus. + +```rust +Contract Foo(a: U256, mut b: Boolean) { + // Die Funktion `f0` ändert nicht die Felder des Vertrags. + fn f0() -> U256 { + return a + } + + // Die Funktion `f1` ändert die Felder des Vertrags. + @using(updateFields = true) + fn f1() -> () { + b = false + } + + // Funktion `f2` ruft Funktion `f1` auf, selbst wenn Funktion `f1` die Felder des Vertrags ändert, + // muss Funktion `f2` dennoch nicht mit `@using(updateFields = true)` annotiert werden, + // weil Funktion `f2` die Vertragsfelder nicht direkt ändert. + fn f2() -> () { + f1() + } +} +``` + +#### Check External Caller + +In Smart Contracts müssen wir oft überprüfen, ob der Aufrufer der Vertragsfunktion autorisiert ist. Um Bugs durch nicht autorisierte Aufrufer zu vermeiden, gibt der Compiler Warnungen für alle öffentlichen Funktionen aus, die nicht nach externen Aufrufern überprüfen. Die Warnung kann mit der Annotation `@using(checkExternalCaller = false)` unterdrückt werden. + +Der Compiler überspringt die Überprüfung für einfache Ansichtsfunktionen. Eine einfache Ansichtsfunktion muss alle folgenden Bedingungen erfüllen: + +1. Sie kann die Vertragsfelder nicht ändern. +2. Sie kann keine Vermögenswerte verwenden. +3. Alle Aufrufe von Unterfunktionen müssen ebenfalls einfache Ansichtsfunktionen sein. + +Um den Aufrufer einer Funktion zu überprüfen, muss die integrierte Funktion [checkCaller!](/ralph/built-in-functions#checkcaller) verwendet werden. + +```rust +Contract Foo(barId: ByteVec, mut b: Boolean) { + enum ErrorCodes { + InvalidCaller = 0 + } + + // Wir müssen `@using(checkExternalCaller = true)` nicht hinzufügen, weil + // `checkExternalCaller` für öffentliche Funktionen standardmäßig auf true gesetzt ist. + pub fn f0() -> () { + // Die integrierte Funktion `checkCaller!` wird verwendet, um zu überprüfen, ob der Aufrufer gültig ist. + checkCaller!(callerContractId!() == barId, ErrorCodes.InvalidCaller) + b = !b + // ... + } + + // Der Compiler wird Warnungen für die Funktion `f1` melden. + pub fn f1() -> () { + b = !b + // ... + } + + // Funktion `f2` ist eine einfache View-Funktion, wir müssen `using(checkExternalCaller = false)` nicht hinzufügen + // `using(checkExternalCaller = false)` für einfache View-Funktionen. + pub fn f2() -> ByteVec { + return barId + } + + // Der Compiler wird KEINE Warnungen melden, weil wir den Aufrufer in Funktion `f4` überprüft haben. + pub fn f3() -> () { + f4(callerContractId!()) + // ... + } + + fn f4(callerContractId: ByteVec) -> () { + checkCaller!(callerContractId == barId, ErrorCodes.InvalidCaller) + // ... + } +} +``` + +Es gibt noch einen anderen Fall, in dem der Compiler Warnungen ausgeben wird, wenn ein Vertrag eine Funktion über eine Schnittstelle aufruft. Das liegt daran, dass wir nicht wissen, ob die Implementierung der Funktion den externen Aufrufer überprüfen muss: + +```rust +Interface Bar() { + pub fn bar() -> () +} + +Contract Foo() { + // Der Compiler wird Warnungen für die Funktion `Foo.foo` melden + pub fn foo(barId: ByteVec) -> () { + Bar(barId).bar() + } +} +``` + +## Contracts (Verträge) + +:::info +Jeder Alephium-Vertrag hat drei Formen der eindeutigen Identifikation: +1. **Address**: Jeder Vertrag hat eine eindeutige Adresse. +2. **Contract ID**: Jeder Vertrag hat eine eindeutige Vertrags-ID. +3. **Token ID**: Jeder Vertrag kann eine Token mit der gleichen ID wie seine eigene Vertrags-ID ausgeben. + + +In Ralph wird die Vertrags-ID häufiger verwendet. Vertrags-IDs können von/zu anderen Formen mit den integrierten Funktionen oder dem Web3 SDK von Ralph konvertiert werden. +::: + +Verträge in Ralph ähneln Klassen in objektorientierten Sprachen. Jeder Vertrag kann Deklarationen von Vertragsfeldern, Ereignissen, Konstanten, Enums und Funktionen enthalten. Alle diese Deklarationen müssen innerhalb eines Vertrags erfolgen. Darüber hinaus können Verträge von anderen Verträgen erben. + +```rust +// Dies ist ein Kommentar, und derzeit unterstützt Ralph nur Zeilenkommentare. +// Der Vertrag sollte im Upper-Camel-Case benannt werden. +// Vertragsfelder werden dauerhaft im Speicher des Vertrags gespeichert. +Contract MyToken(supply: U256, name: ByteVec) { + + // Ereignisse sollten im Upper-Camel-Case benannt werden. + // Ereignisse ermöglichen das Protokollieren von Aktivitäten auf der Blockchain. + // Anwendungen können diese Ereignisse über die REST-API eines Alephium-Clients abrufen. + event Transfer(to: Address, amount: U256) + + // Konstantenvariablen sollten im Upper-Camel-Case benannt werden. + const Version = 0 + + // Enums können verwendet werden, um eine begrenzte Menge von Konstantenwerten zu erstellen. + enum ErrorCodes { + // Enum-Konstanten sollten im Upper-Camel-Case benannt werden. + InvalidCaller = 0 + } + + // Funktionen, Parameter und lokale Variablen sollten im Lower-Camel-Case benannt werden. + pub fn transferTo(toAddress: Address) -> () { + let payloadId = #00 + // ... + } +} +``` + +### Felder + +Vertragsfelder werden dauerhaft im Vertragsspeicher gespeichert, und die Felder können vom Vertragscode geändert werden. Anwendungen können die Vertragsfelder über die REST-API eines Alephium-Clients abrufen. + +```rust +// Der Vertrag `Foo` hat zwei Felder: +// `a`: unveränderlich, kann nicht vom Vertragscode geändert werden +// `b`: veränderlich, kann vom Vertragscode geändert werden +Contract Foo(a: U256, mut b: Boolean) { + // ... +} + +// Vertragsfelder können auch andere Verträge sein. +// Der Vertrag `Foo` wird die Vertrags-ID von `Bar` im Vertragsspeicher von `Foo` speichern. +Contract Foo(bar: Bar) { + // ... +} + +Contract Bar() { + // ... +} +``` + +### Eingebaute Funktionen des Vertrags (Build-In Functions) + +Manchmal müssen wir einen Vertrag innerhalb eines Vertrags erstellen, und in solchen Fällen müssen wir die Vertragsfelder in `ByteVec` codieren. Ralph bietet eine integrierte Funktion namens `encodeFields` die verwendet werden kann, um die Vertragsfelder in `ByteVec` zu codieren. + +Der Parametertyp der Funktion `encodeFields` ist eine Liste der Typen der Vertragsfelder, angeordnet in der Reihenfolge ihrer Definitionen. Die Funktion gibt zwei `ByteVec`-Werte zurück, wobei der erste die codierten unveränderlichen Felder und der zweite die codierten veränderlichen Felder sind. + +Hier ist ein Beispiel: + +```rust +Contract Foo(a: U256, mut b: I256, c: ByteVec, mut d: Bool) { + // functions +} + +Contract Bar() { + @using(preapprovedAssets = true) + fn createFoo(caller: Address, fooBytecode: ByteVec, a: U256, b: I256, c: ByteVec, d: Bool) -> (ByteVec) { + let (encodedImmFields, encodedMutFields) = Foo.encodeFields!(a, b, c, d) + return createContract!{caller -> 1 alph}(fooBytecode, encodedImmFields, encodedMutFields) + } +} +``` + +### Ereignisse + +Ereignisse sind ausgelöste Signale, die von Verträgen ausgelöst werden können. Anwendungen können diese Ereignisse über die REST-API eines Alephium-Clients abhören. + +```rust +Contract Token() { + // Die Anzahl der Ereignisfelder darf nicht größer als 8 sein. + event Transfer(to: Address, amount: U256) + + @using(assetsInContract = true) + pub fn transfer(to: Address) -> () { + transferTokenFromSelf!(selfTokenId!(), to, 1) + // Ereignis auslösen + emit Transfer(to, 1) + } +} +``` + +### SubContract (Untervertrag) + +Alephiums virtuelle Maschine unterstützt Unterverträge. Unterverträge können als map-ähnliche Datenstruktur verwendet werden, sind jedoch weniger anfällig für das Problem des wachsenden Speicherplatzes. Ein Untervertrag kann von einem übergeordneten Vertrag mit einem eindeutigen Untervertragspfad erstellt werden. + +```rust +Contract Bar(value: U256) { + pub fn getValue() -> U256 { + return value + } +} + +Contract Foo(barTemplateId: ByteVec) { + event SubContractCreated(key: U256, contractId: ByteVec) + + @using(preapprovedAssets = true, checkExternalCaller = false) + pub fn set(caller: Address, key: U256, value: U256) -> () { + let path = u256To8Bytes!(key) + let (encodedImmFields, encodedMutFields) = Foo.encodeFields!(value) // Der Vertrag `Bar` hat nur ein Feld. + // Erstellen Sie einen Subvertrag aus dem angegebenen Schlüssel und Wert. + // Die Subvertrags-ID ist `blake2b(blake2b(selfContractId!() ++ path))`. + // Es schlägt fehl, wenn der Subvertrag bereits vorhanden ist. + let contractId = copyCreateSubContract!{caller -> 1 alph}( + u256To8Bytes!(path), + barTemplateId, + encodedImmFields, + encodedMutFields + ) + emit SubContractCreated(key, contractId) + } + + pub fn get(key: U256) -> U256 { + let path = u256To8Bytes(key) + // Holen Sie sich die `Subvertrags-ID` durch die subContractId!-Funktion. + let contractId = subContractId!(path) + return Bar(contractId).getValue() + } +} +``` + +### Erstellung eines Vertrags innerhalb eines Vertrags + +Ralph unterstützt die programmatische Erstellung von Verträgen innerhalb von Verträgen. Ralph stellt einige integrierte Funktionen zum Erstellen von Verträgen bereit. Weitere Informationen finden Sie [hier](/ralph/built-in-functions#contract-functions). + +Wenn Sie mehrere Instanzen eines Vertrags erstellen möchten, sollten Sie die integrierten Funktionen `copyCreateContract!` verwenden, was eine Menge On-Chain-Speicher und Transaktionsgasgebühren reduzieren wird. + +```rust +Contract Foo(a: ByteVec, b: Address, mut c: U256) { + // ... +} + +// Wir möchten mehrere Instanzen des Vertrags `Foo erstellen. +// Zuerst müssen wir einen Vorlagenvertrag von `Foo` bereitstellen, dessen Vertrags-ID fooTemplateId ist. +// Dann können wir `copyCreateContract!` verwenden, um mehrere Instanzen zu erstellen. +TxScript CreateFoo(fooTemplateId: ByteVec, a: ByteVec, b: Address, c: U256) { + let (encodedImmFields, encodedMutFields) = Foo.encodeFields!(a, b, c) + copyCreateContract!(fooTemplateId, encodedImmFields, encodedMutFields) +} +``` + +### Migration + +Alephium-Verträge können mit zwei Migrationsfunktionen aktualisiert werden: [migrate!](/ralph/built-in-functions#migrate) und [migrateWithFields!](/ralph/built-in-functions#migratewithfields). Hier sind drei typische Möglichkeiten, Sie zu verwenden: + +```Rust +fn upgrade(newCode: ByteVec) -> () { + checkOwner(...) + migrate!(newCode) +} + +fn upgrade(newCode: ByteVec, newImmFieldsEncoded: ByteVec, newMutFieldsEncoded: ByteVec) -> () { + checkOwner(...) + migrateWithFields!(newCode, newImmFieldsEncoded, newMutFieldsEncoded) +} + +fn upgrade(newCode: ByteVec) -> () { + checkOwner(...) + let (newImmFieldsEncoded, newMutFieldsEncoded) = ContractName.encodeFields!(newFields...) + migrateWithFields!(newCode, newImmFieldsEncoded, newMutFieldsEncoded) +} +``` + +## Vererbung + +Ralph unterstützt auch mehrere Vererbungen. Wenn ein Vertrag von anderen Verträgen erbt, wird nur ein einziger Vertrag auf der Blockchain erstellt, und der Code aller übergeordneten Verträge wird in den erstellten Vertrag kompiliert. + +```rust +Abstract Contract Foo(a: U256) { + pub fn foo() -> () { + // ... + } +} + +Abstract Contract Bar(b: ByteVec) { + pub fn bar() -> () { + // ... + } +} + +// Der Feldname des Kindvertrags muss mit dem Feldnamen der Elternverträge übereinstimmen. +Contract Baz(a: U256, b: ByteVec) extends Foo(a), Bar(b) { + pub fn baz() -> () { + foo() + bar() + } +} +``` + +:::note +In Ralph sind abstrakte Verträge nicht instanziierbar, was bedeutet, dass der folgende Code ungültig ist: + +```rust +let bazId = // Die Vertrags-ID von `Baz`. +Foo(bazId).foo() // ERROR +``` +::: + +## Schnittstelle + +Schnittstellen sind ähnlich wie abstrakte Verträge, unterliegen jedoch den folgenden Einschränkungen: + +* Sie können keine implementierten Funktionen haben. +* Sie können nicht von anderen Verträgen erben, sondern können von anderen Schnittstellen erben. +* Sie können keine Vertragsfelder deklarieren. +* Verträge können nur eine Schnittstelle implementieren. + +```rust +Interface Foo { + event E(a: U256) + + @using(assetsInContract = true) + pub fn foo() -> () +} + +Interface Bar extends Foo { + pub fn bar() -> U256 +} + +Contract Baz() implements Bar { + // Die Funktionssignatur muss mit der in der Schnittstelle deklarierten Funktionssignatur übereinstimmen. + @using(assetsInContract = true) + pub fn foo() -> () { + // Erbt das Ereignis von `Foo`. + emit E(0) + // ... + } + + pub fn bar() -> U256 { + // ... + } +} +``` + +Und Sie können einen Vertrag mit einer Schnittstelle instanziieren: + +```rust +let bazId = // Die Vertrags-ID von `Baz`. +Foo(bazId).foo() +let _ = Bar(bazId).bar() +``` + +:::note +Die Bereitstellung eines Vertrags erfordert die Hinterlegung einer bestimmten Menge an ALPH im Vertrag (derzeit 1 Alph), sodass die Erstellung einer großen Anzahl von Unterverträgen nicht praktikabel ist. +::: + +## TxScript + +Ein Transaktionsskript ist ein Codefragment, das zur Interaktion mit Verträgen auf der Blockchain dient. Transaktionsskripte können in der Regel die Eingangsvermögen von Transaktionen nutzen. Ein Skript ist einmalig und wird nur zusammen mit der Transaktion, die es enthält, ausgeführt. + +```rust +Contract Foo() { + pub fn foo(v: U256) -> () { + // ... + } +} + +// Das `preapprovedAssets` ist standardmäßig für `TxScript` auf true gesetzt. +// Wir setzen das `preapprovedAssets` auf false, weil das Skript keine Vermögenswerte benötigt. +@using(preapprovedAssets = false) +// `TxScript`-Felder ähneln eher Funktionsparametern, und diese +// Felder müssen jedes Mal angegeben werden, wenn das Skript ausgeführt wird. +TxScript Main(fooId: ByteVec) { + // Der Körper von TxScript besteht aus Anweisungen. + bar() + Foo(fooId).foo(0) + + // Sie können auch Funktionen in `TxScript` definieren. + fn bar() -> () { + // ... + } +} +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/ralph/language-reference.md.drop b/i18n/de/docusaurus-plugin-content-docs/current/ralph/language-reference.md.drop new file mode 100644 index 00000000..2ac10603 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/ralph/language-reference.md.drop @@ -0,0 +1,123 @@ +--- +sidebar_position: 10 +title: Ralph Language Reference +sidebar_label: Ralph language reference +--- + +:::caution +This page is WIP until our dApps stack is more stable 🚧. +::: + +A reference for the Ralph smart contract language. + +## Notation used in this document + +`` just means you replace it with the appropriately described text. For +example, `` means type a literal number value: 6, 7, 44, etc. + +`[thing]` means the text is optional unless otherwise specified (like array syntax). + +## Primitive types + +Ralph has a nice small core of primitives. + +| Type | Constructor | +| ---------------: | ------------------------------------------------------------------------------------------------------------- | +| **()** | None (a return statement with nothing) | +| **Bool** | false, true, <, >, >=, <=, ==, !=, &&, ||, ! | +| **I256** | -<number>, <number>i, +, -, \*, /, %, ⊕, ⊖, ⊗, <<, >>, >, ^, | | +| **U256** |  <number>, <number>u, +, -, \*, /, %, ⊕, ⊖, ⊗, <<, >>, >, ^, | | +| **Address** | `@
`, `nullAddress!()` | +| **ByteVec** | `#, ++` | +| **[type; size]** | `[]`, type example: `[Address; 6]` | + +You'll notice there is no `String` type. Instead the `ByteVec` type can be used +to hold onto textual data, or a `[U256; N]` array if you need to modify it. + +:::note +For numbers you can also use the following: + +- 1_000_000_000 +- 0.000_001 +- 1e18 +- 1e-18 +- 1_000e9 + +::: + +## Syntax + +Ralph as you'll soon learn is a simple language. So simple that it can be summed +up in this table below, which presents various mechanisms which are normally +available in programming languages. + +:::note +**Ralph does not use semi-colons!** It can be easy to accidentally add them due +to muscle memory. +::: + +| Token | Constructor | +| --------------: | ---------------------------------------------------------------------------------- | +| **Comment** | `//` | +| **Assignment** | `let [mut] = ...` | +| **Assignment** | ` = ` or `(, ) = funcMultipleRetVals()` | +| **Function** | `[pub] [payable] fn (arg: ) -> { return }` | +| **Conditional** | `if { } [else if { } else { ... }]` | +| **Iteration** | `while { }` | +| **Event** | `event (field1: , field2: , fieldN: , ...)` | +| **Event** | `emit (, , , ...)` | +| **Structure** | `interface { ... }` | +| **Structure** | `Contract ContractName([mut] fieldN: ) [extends ] { ... }` | +| **Structure** | `TxScript ([mut] fieldN: ) { ... }` | + +### Interfaces, Contracts, and TxScripts + +Below is a "code template" of the general structure of what smart contracts will +look like. They take on a class-like appearance, similar to JavaScript, C#, and +other OOP languages. + +``` +// To create an interface: +interface InterfaceName { + event TupleName(field1: U256, field2: U256) + pub fn foo() -> () +} + +// To create a contract: +Contract ContractName([mut] arg1: , [mut] arg2: , ...etc) implements InterfaceName { + [@using(preapprovedAssets = , assetsInContract = )] + [pub] fn functionName(arg1: , ...etc) -> () { + return + } + + fn foo() { + emit TupleName(1, 2) + } +} + +// To invoke the contract: +TxScript ScriptNameCanBeAnything { + // Note this signature. It must be just like this. + [pub] [payable] fn main() -> () { + contract = ContractName(#) + result = contract.functionName(arg) + anotherFunc() + } + + fn anotherFunc() -> () { + ... + } +} +``` + +`pub` means the function can be called outside the contract / script. + +`@using` is a function annotation. + +To understand `preapprovedAssets` and `assetsInContract` please go read about +the [Asset Permission System](/dapps/Asset-Permission-System]. + +:::note +You can call contract methods right after the contract constructor, i.e. +`ContractName(...).function()`. +::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/fungible-tokens.md b/i18n/de/docusaurus-plugin-content-docs/current/tokens/fungible-tokens.md new file mode 100644 index 00000000..306f5a04 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/tokens/fungible-tokens.md @@ -0,0 +1,136 @@ +--- +sidebar_position: 20 +title: Fungible Tokens +sidebar_label: Fungible Tokens +--- + +### +Fungible Token Standard + +In Alephium können neue Tokens ausgegeben werden, wenn neue Verträge +bereitgestellt werden. Die ID des neu ausgegebenen Tokens ist dieselbe +wie die ID des Contracts, der es ausgibt. Sie können sich an diese +[Anleitung](/dapps/build-dapp-from-scratch) wenden, um Details darüber +zu erfahren, wie Sie auf Alephium von Grund auf neue Tokens ausgeben können. + +Tokens sind in der Regel mit Informationen wie +`name`, `decimals`, `totalSupply` usw. verbunden. Das Ziel des Token-Standards +ist es, Einschränkungen für den Token-ausgebenden Contract festzulegen, damit es +für dApps und Wallets einfacher wird, Token-Typen zu erschließen und +Token-Informationen abzurufen. + +Die Standard [fungible-Token-Interface](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/fungible_token_interface.ral) definiert Methoden zum Abrufen des `name`, `symbol`, `decimals` sowie des +`totalSupply` des Tokens. Sie ist auch mit der `@std`-Annotation mit der ID `#0001` versehen: + +```rust +// Standard-Schnittstelle für fungible Tokens +@std(id = #0001) +Interface IFungibleToken { + pub fn getSymbol() -> ByteVec + pub fn getName() -> ByteVec + pub fn getDecimals() -> U256 + pub fn getTotalSupply() -> U256 +} + +// Ein `TokenFaucet-Vertrag`, der die Schnittstelle `IFungibleToken` implementiert +Contract TokenFaucet( + symbol: ByteVec, + name: ByteVec, + decimals: U256, + supply: U256 +) implements IFungibleToken { + pub fn getTotalSupply() -> U256 { + return supply + } + + pub fn getSymbol() -> ByteVec { + return symbol + } + + pub fn getName() -> ByteVec { + return name + } + + pub fn getDecimals() -> U256 { + return decimals + } +} +``` + +Sobald ein Token-Contract die +[IFungibleToken](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/fungible_token_interface.ral)-Schnittstelle implementiert, wie der oben gezeigte `TokenFaucet`-Contract, ermöglicht es dem SDK, +Informationen auf eine standardisierte Weise abzurufen: + +```typescript +// Verwenden Sie das SDK, um Methoden einzeln aufzurufen +const getDecimalResult = await tokenFaucet.methods.getDecimals() +const getTotalSupplyResult = await tokenFaucet.methods.getTotalSupply() +const getNameResult = await tokenFaucet.methods.getName() +console.log("TokenFaucet name, decimals, totalSupply", getNameResult.returns, getDecimalResult.returns, getTotalSupplyResult.returns) + +// Verwenden Sie das SDK, um alle mehreren Methoden gleichzeitig aufzurufen +const multicallResult = await tokenFaucet.multicall({ + getDecimals: {}, + getTotalSupply: {}, + getName: {}, +}) +console.log("TokenFaucet name, decimals, totalSupply", multicallResult.getName.returns, multicallResult.getDecimal.returns, multicallResult.getTotalSupply.returns) +``` + +Tatsächlich bietet das SDK eine kanonische Möglichkeit, alle Metadaten für ein fungibles Token abzurufen. + +```typescript +const metadata = await web3.getCurrentNodeProvider().fetchFungibleTokenMetaData(tokenFaucet.contractId) +console.log("TokenFaucet name, decimals, totalSupply", metadata.name, metadata.decimals, metadata.totalSupply) +``` + +[IFungibleToken](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/fungible_token_interface.ral) +ermöglicht es dem SDK auch, den Typ eines Tokens zu erraten, +damit dApps und Wallets diese entsprechend behandeln können: + +```typescript +// Token-Typ erraten +const tokenType = await web3.getCurrentNodeProvider().guessStdTokenType(tokenFaucet.contractId) +expect(tokenType).toEqual('fungible') + +// Token-Schnittstellen-ID erraten +const tokenInterfaceId = await web3.getCurrentNodeProvider().guessStdInterfaceId(tokenFaucet.contractId) +expect(tokenInterfaceId).toEqual('0001') +``` + +Für ein funktionierendes und vollständigeres Beispiel werfen Sie bitte +einen Blick auf das [NextJS-Template](https://github.com/alephium/nextjs-template)-Repository. + +### Wallet Unterstützung + +Sowohl die [Desktop Wallet](/wallet/desktop-wallet/overview) als auch +die [Extension Wallet](/wallet/extension-wallet/overview) unterstützen +fungible Tokens nativ. + +Nachfolgend ein Beispiel für die Anzeige und Übertragung des `PACA` Tokens mit der Extension-Wallet: + +Token Overview +     +Send Token +     +Sign Tx + +### Token-Liste + +Neben den grundlegenden Informationen wie `name`, `symbol` und +`decimals` usw., enthalten fungible Tokens in der Regel auch andere Metadaten +wie `description` und `logoURI` , damit dApps und Wallets Sie ordnungsgemäß +anzeigen können. + +Das Ziel der [Token-Liste](https://github.com/alephium/token-list) +ist es, eine Vertrauensquelle für die Token-ID und die Metadaten der +bekannten Tokens im Alephium-Ökosystem zu sein, damit Wallets und +dApps Benutzer vor nicht verifizierten Tokens warnen können. Hier sehen +Sie, wie die Erweiterungsbrieftasche ein Token vor und nachdem es zur +Token-Liste hinzugefügt wurde, anzeigt. + +Unverified +     +Verified + +Derzeit ist ein Pull Request erforderlich, um die Token-Metadaten zur Token-Liste hinzuzufügen. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/create-flow-page.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/create-flow-page.png new file mode 100644 index 00000000..4f903669 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/create-flow-page.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/flow-page.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/flow-page.png new file mode 100644 index 00000000..6cab942b Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/flow-page.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/ipfs-imagine-directory.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/ipfs-imagine-directory.png new file mode 100644 index 00000000..c1bd9755 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/ipfs-imagine-directory.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/marketplace-testnet.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/marketplace-testnet.png new file mode 100644 index 00000000..73a1ab70 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/marketplace-testnet.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/show-nft-collection-extension-wallet.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/show-nft-collection-extension-wallet.png new file mode 100644 index 00000000..057f23ba Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/show-nft-collection-extension-wallet.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-1.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-1.png new file mode 100644 index 00000000..38c07740 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-2.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-2.png new file mode 100644 index 00000000..ab914da7 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-3.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-3.png new file mode 100644 index 00000000..b8fe96ca Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-alphpaca-3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-nft-collection-extension-wallet.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-nft-collection-extension-wallet.png new file mode 100644 index 00000000..36b6c2fb Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/transfer-nft-collection-extension-wallet.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/unverified-nft-collection.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/unverified-nft-collection.png new file mode 100644 index 00000000..a1a131b4 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/unverified-nft-collection.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/unverified-token.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/unverified-token.png new file mode 100644 index 00000000..8819dc2f Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/unverified-token.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/verified-nft-collection.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/verified-nft-collection.png new file mode 100644 index 00000000..e0a99ca3 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/verified-nft-collection.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/verified-token.png b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/verified-token.png new file mode 100644 index 00000000..4ae77400 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/tokens/media/verified-token.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/non-fungible-tokens.md b/i18n/de/docusaurus-plugin-content-docs/current/tokens/non-fungible-tokens.md new file mode 100644 index 00000000..d353019c --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/tokens/non-fungible-tokens.md @@ -0,0 +1,255 @@ +--- +sidebar_position: 30 +title: Non-fungible Tokens (NFTs) +sidebar_label: Non-fungible Tokens +--- + +Non-fungible tokens (NFTs) auf Alephium weisen im Vergleich zu +NFTs auf anderen Blockchains mehrere einzigartige Merkmale auf: + +- Echte Eigentumsübertragung basierend auf dem UTXO-Modell: Wie andere Arten von Tokens auf Alephium werden NFTs sicher durch UTXOs verwaltet, die sich direkt im Besitz von Adressen befinden. Da UTXOs durch die privaten Schlüssel der Benutzer geschützt sind, bleiben die Vermögenswerte der Benutzer auch dann sicher, wenn es Fehler im NFT-Contract gibt. + +- Erstklassige Unterstützung für NFTs: Tokens sind native Vermögenswerte auf Alephium. Daher können die NFTs der Benutzer einfach von Wallets, Explorern und dApps gefunden und angezeigt werden, ohne auf Dienste von Drittanbietern angewiesen zu sein. + +- Höhere Sicherheit dank Alephiums VM und Vertragssprache: Alephiums Virtual Machine (VM) und seine Contract-Sprache eliminieren die Notwendigkeit für eine separate Genehmigungstransaktion während des NFT-Handels, was die damit verbundenen Risiken reduziert. Dies vereinfacht den Prozess des Schreibens sicherer NFT-Verträge für Entwickler mithilfe von Tools wie dem [Asset Permission System](/ralph/asset-permission-system). + +- Sub-Vertragsystem: In Alephium gibt es keine [Mapping](https://docs.soliditylang.org/en/v0.8.7/types.html#mapping-types)-Datenstruktur. Kollektionen werden mit einem übergeordneten Contracts (der Kollektion) und [Sub-Contracts](http://localhost:3000/ralph/built-in-functions#subcontract-functions) (den Einzelteilen) erstellt. Jeder Sub-Contract repräsentiert ein NFT in dieser Kollektion, und alle Metadaten sind damit verbunden. Dies ist eine native Funktion der Alephium-Blockchain, die es ermöglicht, dass Alephiums NFTs einzigartig (ein Token pro Sub-Contract) oder halb-fungibel sind, da derselbe Minting-Contract mehr als ein Token erstellen kann. + +- Effiziente Transaktionsbündelung: Mehrere NFTs und Benutzer können an einer einzigen Transaktion beteiligt sein. + +- Günstigere Transaktionsgebühren und höhere Durchsatzrate: NFT-Transaktionen profitieren von Alephiums Sharding-Algorithmus. + +- Knappheit von NFTs: Das Angebot an NFTs auf Alephium ist endlich, da jedes NFT die Bereitstellung seines eigenen individuellen Sub-Contracts erfordert, der wiederum eine Einzahlung von ALPH - derzeit auf 1 `ALPH`. festgelegt - erfordert. Diese einzigartige Struktur setzt von Natur aus eine Grenze für die Produktion von NFTs auf der Plattform und verstärkt die Knappheit von NFTs auf Alephium. + +### Non-fungible-Token Standard + +Sowohl NFT-Kollektionen als auch individuelle NFTs verfügen über Metadaten, wie z.B. `collectionUri`, `totalSupply` und `tokenUri`, usw. Die +[INFTCollection](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/nft_collection_interface.ral) +und [INFT](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/nft_interface.ral)-Schnittstellen standardisieren die Methoden zum Abrufen dieser Metadaten. + +```rust +// Standard-Schnittstelle für NFT-Kollektionen +@std(id = #0002) +Interface INFTCollection { + pub fn getCollectionUri() -> ByteVec + pub fn totalSupply() -> U256 + pub fn nftByIndex(index: U256) -> INFT + pub fn validateNFT(nftId: ByteVec, nftIndex: U256) -> () // Überprüft, ob das NFT Teil der Kollektion ist, andernfalls wirft es eine Ausnahme. +} + +// Standard-Schnittstelle für NFTs +@std(id = #0003) +Interface INFT { + pub fn getTokenUri() -> ByteVec + pub fn getCollectionIndex() -> (ByteVec, U256) // Gibt die Sammlungs-ID und den Index des NFT in der Kollektion zurück. +} +``` + +Sie sind auch mit den `@std`-Annotationen versehen, +um es dApps und Wallets zu erleichtern, ihre Contract-/Token-Typen zu inferieren. + +```typescript +// Erraten Sie den NFT-Token-Typ +const nftTokenType = await web3.getCurrentNodeProvider().guessStdTokenType(nft.contractId) +expect(nftTokenType).toEqual('non-fungible') + +// Überprüfen Sie, ob ein Vertrag eine NFT-Kollektion ist +const isNFTCollection = await web3.getCurrentNodeProvider().guessFollowsNFTCollectionStd(nftCollection.contractId) +console.log("Is NFT collection", isNFTCollection) +``` + +Für Contracts, die +[INFTCollection](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/nft_collection_interface.ral) +und +[INFT](https://github.com/alephium/alephium-web3/blob/master/packages/web3/std/nft_interface.ral), +implementieren, bietet das SDK eine kanonische Methode zum Abrufen ihrer jeweiligen Metadaten: + +```typescript +// Metadaten für NFT-Kollektion +const collectionMetadata = await web3.getCurrentNodeProvider().fetchNFTCollectionMetaData(nftCollection.contractId) +console.log("NFT Collection URI, totalSupply", collectionMetadata.collectionUri, collectionMetadata.totalSupply) + +// NFT-Metadaten +const nftMetadata = await web3.getCurrentNodeProvider().fetchNFTMetadata(nft.contractId) +console.log("NFT Token URI, collection address", nftMetadata.tokenUri, nftMetadata.collectionAddress) +``` + +Für NFT-Kollektionen ist eine der Metadaten `collectionUri`, die eine URI ist und auf ein JSON-Dokument mit dem folgenden Schema verweist: + +```typescript +interface NFTCollectionUriMetaData { + name: string // Name der NFT-Kollektion + description: string // Allgemeine Beschreibung der NFT-Kollektion + image: string // Eine URI zum Bild, das die NFT-Kollektion repräsentiert +} +``` + +Für individuelle NFTs ist eine der Metadaten `tokenUri`, die eine URI ist und auf ein JSON-Dokument mit dem folgenden Schema verweist: + +```typescript +interface NFTTokenUriMetaData { + name: string // Name des NFT + description?: string // Allgemeine Beschreibung des NFT + image: string // Eine URI zum Bild, das das NFT repräsentiert + attributes?: [ // Attribute des NFT + { + trait_type: string + value: string | number | boolean + } + ] +} +``` + +### AlephiumNFT Marktplatz + +Der [AlephiumNFT](https://github.com/alephium/alephium-nft) Marktplatz ist +ein Proof-of-Concept-NFT-Marktplatz, der die Fähigkeiten von NFTs auf Alephium +präsentiert. Hier können Sie NFT-Sammlungen erstellen, NFTs entdecken, prägen +und handeln. Sie können auch [Opensea Drop](https://docs.opensea.io/docs/drops-on-opensea)-style +öffentliche Verkaufskampagnen für Ihre NFT-Sammlungen starten. Diese Kampagnen werden auf +dem `AlephiumNFT`-Marktplatz als `Flows` bezeichnet. + +Die Erstellung eigener NFT-Sammlungen sollte recht einfach sein. +Folgen Sie diesem [Twitter thread](https://twitter.com/alephium/status/1674397159947649030) für weitere Details. +Wenn Sie einen `Flow` auf dem `AlephiumNFT` Marktplatz erstellen möchten, +kann Ihnen [@alephium/cli](https://www.npmjs.com/package/@alephium/cli) mit seinem +`nft` Unterbefehl dabei helfen. + +#### Flows erstellen + +Angenommen, Sie möchten einen öffentlichen Verkauf für Ihre NFT-Sammlung +starten, die `5` individuelle NFTs hat. Bevor Sie einen `Flow` dafür +erstellen, sollten Sie zunächst `5` Bilder bereithalten. Wenn nicht, bietet + `@alephium/cli` einen Befehl, mit dem Sie Bilder mithilfe von OpenAI's +[DALL.E](https://openai.com/research/dall-e)-Modellen generieren können: + +```bash +export OPENAI_API_KEY=xxxx-xxxx-xxxx-xxxx +npx @alephium/cli@latest nft generate-images-with-openai --number 5 -d /tmp/imagine "imagine all the people, living life in peace" +``` + +Das erstellt `5` Bilder mit der Aufforderung +`imagine all the people, living life in peace` und speichert +Sie unter dem Verzeichnis `/tmp/imagine`. Bitte überspringen +Sie diesen Schritt, wenn Sie bereits Bilder für Ihre Sammlung +entworfen haben. + +Angenommen, die Bilder sind unter dem Verzeichnis `/tmp/imagine` +bereit. Der nächste Schritt besteht darin, eine Metadatendatei im +YAML-Format für Ihre Sammlung zu erstellen. Hier ist ein Beispiel +für eine YAML-Datei namens `imagine.yaml`: + +```bash +> ls /tmp/imagine +0.jpg 1.jpg 2.jpg 3.jpg 4.jpg + +> cat imagine.yaml +0.jpg: # Dateiname des Bildes + attributes: # Attribute des NFT, optional + - color: blue # Wert der Attribute kann `number`, `boolean` oder `string` sein + - is_outdoor: true +1.jpg: + description: Imagine is too naive # Beschreibung des NFT, optional +2.jpg: + name: Imagine in Asia # Name des NFT, optional + attributes: + - color: blue + - is_outdoor: false +3.jpg: # Name wird automatisch generiert als #${index}, wenn nicht angegeben, z.B. #04 +4.jpg: +``` + +Wenn Sie mit den Bildern und Metadaten Ihrer Sammlung zufrieden sind, +führen Sie den folgenden Befehl aus, um die Bilder und Metadaten auf +IPFS hochzuladen: + +```bash +> export IPFS_INFURA_PROJECT_ID=xxxx-xxxx-xxxx-xxxx +> export IPFS_INFURA_PROJECT_SECRET=xxxx-xxxx-xxxx-xxxx +> npx @alephium/cli@latest nft upload-images-and-metadata-to-ipfs -m imagine.yaml -d /tmp/imagine -i imagine +NFTBaseUri: +https://ipfs.io/ipfs/QmaTXEGJQe5ZLg9TVEBJEpz3dwbzG9m7b6NWVogxnYgnbJ/ +``` + +Der `NFTBaseUri` verweist auf ein IPFS-Verzeichnis, in dem `5` Dokumente +benannt und basierend auf ihrer Reihenfolge in der Datei `imagine.yaml` gespeichert sind: + +IPFS Imagine Directory + +Jedes Dokument verweist auf die Metadaten eines NFT und kann anhand +seiner Indizes referenziert werden. Zum Beispiel verweist `https://ipfs.io/ipfs/QmaTXEGJQe5ZLg9TVEBJEpz3dwbzG9m7b6NWVogxnYgnbJ/2` +auf die Metadaten des 3. NFT: + +```bash +> curl https://ipfs.io/ipfs/QmaTXEGJQe5ZLg9TVEBJEpz3dwbzG9m7b6NWVogxnYgnbJ/2 | jq +{ + "name": "Imagine in Asia", + "image": "https://ipfs.io/ipfs/QmbLevU4kVnQCCoYt23mKhdowJ7TnNNT9dRyVw9AyQDJty/2.jpg", + "attributes": [ + { + "trait_type": "color", + "value": "blue" + }, + { + "trait_type": "is_outdoor", + "value": false + } + ] +} +``` + +Sie können mit dem folgenden Befehl überprüfen, ob ein `NFTBaseUri` gültig ist: + +```bash +> npx @alephium/cli@latest nft validate-enumerable-nft-base-uri --nftBaseUri https://ipfs.io/ipfs/QmbLevU4kVnQCCoYt23mKhdowJ7TnNNT9dRyVw9AyQDJty/ --maxSupply 5 +Token Metadataz: +[ + { + name: '#0', + .... + }, + .... +] +``` + +Nachdem `NFTBaseUri` erstellt wurde, sind wir bereit, den `Flow` auf dem `AlephiumNFT` Marktplatz +zu starten: + +Create FLow Page + +Wie oben dargestellt, können Sie das Bild der Sammlung, die maximale +Stapel-Mint-Größe, den Mint-Preis, den Namen und die Beschreibung der +Sammlung sowie den wichtigsten NFT-Basis-URI eingeben, den wir im letzten +Schritt erstellt haben. Nachdem Sie auf die Schaltfläche `Create NFT Collection` +geklickt und die Transaktion signiert haben, erstellen Sie erfolgreich Ihren ersten `Flow`, +teilen den Link und starten den öffentlichen Verkauf Ihrer NFT-Sammlung! + +FLow Page + +### Wallet Unterstützung + +Sowohl die [Desktop Wallet](/wallet/desktop-wallet/overview) als auch die [Extension +Wallet](/wallet/extension-wallet/overview) unterstützen nativ non-fungible Tokens. + +Nachfolgend ein Beispiel für die Anzeige und Übertragung eines NFT in der +`Imagine Collection` in der Extension Wallet: + +Show collection +     +Transfer NFT + +### Token-Liste + +Es ist nicht allzu schwierig, andere NFT-Sammlungen vorzutäuschen +und Benutzer zu betrügen. Die[Token-Liste](https://github.com/alephium/token-list) +ermöglicht es, bekannte NFT-Sammlungen im Alephium-Ökosystem zu whitelisten, +sodass dApps und Wallets die Benutzer vor nicht überprüften NFT-Sammlungen warnen +können. Hier sehen Sie, wie die Extension Wallet eine NFT-Sammlung vor und nachdem Sie +in die Token-Liste aufgenommen wurde, anzeigt. + +Unverified +     +Verified + +Aktuell ist ein Pull Request erforderlich, um die NFT-Sammlung zur Token-Liste hinzuzufügen. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/tokens/overview.md b/i18n/de/docusaurus-plugin-content-docs/current/tokens/overview.md new file mode 100644 index 00000000..30229f5b --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/tokens/overview.md @@ -0,0 +1,46 @@ +--- +sidebar_position: 10 +title: Übersicht +sidebar_label: Übersicht +--- + +Tokens sind in Alephium *First-class citizen*. Genau wie das native Token ALPH werden +alle Tokens auf Alephium von UTXOs verwaltet, die direkt von Adressen gehalten werden. + +Dieses Design hat einige Vorteile im Vergleich zu anderen Blockchains: + +- Token-Transfers zwischen Benutzern erfordern nur UTXOs, die sich in der Praxis in Bezug + auf ihre Sicherheit bei der Verwaltung von Vermögenswerten bewährt haben. +- Es ist einfacher für Wallets und DApps, die Tokens der Benutzer zu finden, + einschließlich sowohl fungibler als auch nicht fungibler Tokens. +- Wenn Smart Contracts Tokens übertragen müssen, sind keine zusätzlichen Genehmigungstransaktionen + erforderlich, da die Genehmigung im UTXO-Modell implizit ist. Alephium nutzt sein einzigartiges + [Asset Permission System](/ralph/asset-permission-system), + um sicherzustellen, dass Tokens von den Smart Contracts sicher behandelt werden. +- Der Token-Transfer ist sehr skalierbar, weil er die [Sharding](/glossary.md#sharding)-Architektur + von Alephium optimal nutzen kann. + +Um die Arbeit mit Tokens im Alephium-Ökosystem zu erleichtern: + +- [Token standards](https://github.com/alephium/alephium-web3/tree/master/packages/web3/std) + werden im SDK eingeführt, um standardisierte Schnittstellen für sowohl fungible als auch + nicht fungible Tokens zu definieren. +- Im SDK werden Utility-Funktionen definiert, um häufige Aufgaben für DApps + und Wallets beim Umgang mit Tokens zu erleichtern, wie z. B. das Erraten + von Token-Typen und das Extrahieren von Token-Metadaten. +- [Token list](https://github.com/alephium/token-list) wird verwendet, + um eine Vertrauensquelle für bekannte fungible Tokens und NFT-Sammlungen + herzustellen. +- Native Unterstützung sowohl für fungible als auch nicht fungible Tokens in Wallets + und im Explorer. +- Tools zur Unterstützung beim Start von NFT-Public-Sales im [Opensea-Drop](https://docs.opensea.io/docs/drops-on-opensea)-Stil, + genannt `Flow`. + +In der Seite [Fungible Tokens](/tokens/fungible-tokens) erfahren Sie mehr über +den fungiblen Token-Standard, wie man fungible Tokens ausgibt, wie man Token-Metadaten +abruft und wie man fungible Tokens in Wallets überträgt, usw. + +Auf der Seite [Non-fungible Tokens](/tokens/non-fungible-tokens) erfahren Sie mehr +über den nicht fungiblen Token-Standard, wie Sie Ihre eigenen NFT-Sammlungen erstellen +und Ihre erste NFT-Public-Sale-Kampagne namens +`Flows` im [NFT Marktplatz](https://testnet.nft.alephium.org/) starten können. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/Basic functions.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/Basic functions.md new file mode 100644 index 00000000..705bd3c3 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/Basic functions.md @@ -0,0 +1,99 @@ +--- +sidebar_position: 70 +title: Grundlegende Funktionen +sidebar_label: Grundlegende Funktionen +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + +# Grundlegende Funktionen + +## Wie man eine neue Adresse für eine bestimmte Gruppe in der Extension-Wallet erstellt + +Hier ist eine Anleitung, wie Sie eine Adresse für eine bestimmte Gruppe erstellen können. +Manchmal ist dies erforderlich, um mit DApps auf der Alephium-Blockchain zu interagieren. (Klicken Sie [hier](https://twitter.com/alephium/status/1681307477961482241) um mehr über Gruppen und [Sharding](https://medium.com/@alephium/an-introduction-to-blockflow-alephiums-sharding-algorithm-bbbf318c3402) in Alephium zu erfahren). + +1. Entsperren Sie Ihre Extension-Wallet. + +![Schritt01](https://github.com/alephium/docs/assets/88235023/efa34122-c996-4a5b-a1bc-a2c3d97b36bd) + +2. Klicken Sie auf den Wallet-Namen in der oberen linken Ecke. + +![Schritt02](https://github.com/alephium/docs/assets/88235023/8c169719-ebe5-4556-a967-ffae987bc4c3) + +3. Drücken Sie die Taste "+" in der oberen rechten Ecke. + +![Schritt03](https://github.com/alephium/docs/assets/88235023/a84a7019-d8b2-4045-9133-f10a115e3512) + +*4. Klicken Sie im Dropdown-Menü "Gruppe" und wählen Sie eine Gruppe Ihrer Wahl. + +![Schritt04](https://github.com/alephium/docs/assets/88235023/f3192c1e-9cf8-432b-9283-784c97ea3108) + +Optional können Sie Schnorr-Signaturen wählen, um diese zu verwenden (weitere Informationen zu dieser Funktion finden Sie [hier](https://twitter.com/alephium/status/1648310494661595137)). Wenn Sie fertig sind, klicken Sie auf "Neues Alephium-Konto erstellen". + +Sie können diesen Vorgang für jede Gruppe (0, 1, 2, 3) wiederholen, für die Sie eine Adresse wünschen. + +## Wie man eine neue Adresse für eine bestimmte Gruppe in der Desktop-Wallet erstellt + +Hier ist eine Anleitung, wie Sie eine Adresse für eine bestimmte Gruppe erstellen können. +Manchmal ist dies erforderlich, um mit DApps auf der Alephium-Blockchain zu interagieren. (Klicken Sie [hier](https://twitter.com/alephium/status/1681307477961482241), um mehr über Gruppen und [Sharding](https://medium.com/@alephium/an-introduction-to-blockflow-alephiums-sharding-algorithm-bbbf318c3402) in Alephium zu erfahren). + +1. Entsperren Sie Ihre Desktop-Wallet. + +![Schritt01](https://github.com/alephium/docs/assets/88235023/549cf7e5-472d-40f9-82c3-95d55d87bd73) + +2. Klicken Sie auf das Menü "Adressen & Kontakte". + +![Schritt02](https://github.com/alephium/docs/assets/88235023/fa500925-2282-4cbb-a4fe-8287f156fd05) + +3. Drücken Sie die blaue Schaltfläche "Neue Adresse". + +![Schritt03](https://github.com/alephium/docs/assets/88235023/57595a9a-1588-43ff-a7cc-8d57b08e108f) + +Wählen Sie im erscheinenden Menü einen Namen und eine Farbe für Ihre neue Adresse. + +Aktivieren Sie den Schalter "Erweiterte Optionen" und wählen Sie die Gruppe aus, für die Sie Ihre neue Adresse generieren möchten. + +Drücken Sie "Generieren". Sie können diesen Vorgang für jede Gruppe, für die Sie eine Adresse wünschen (0, 1, 2, 3), wiederholen oder die nächste Methode für die Stapeladressenerstellung verwenden. + +## Erstellen von Adressen für alle Gruppen gleichzeitig in der Desktop-Wallet + +1. Entsperren Sie Ihre Desktop-Wallet. + +![Schritt01](https://github.com/alephium/docs/assets/88235023/549cf7e5-472d-40f9-82c3-95d55d87bd73) + +2. Klicken Sie auf das Menü "Adressen & Kontakte". + +![Schritt02](https://github.com/alephium/docs/assets/88235023/fa500925-2282-4cbb-a4fe-8287f156fd05) + +3. Klicken Sie auf das "Schraubenschlüssel"-Symbol (erweiterte Operationen). + +![Schritt03](https://github.com/alephium/docs/assets/88235023/19999aec-b9dc-4b40-bb7b-3ee8dfab49cf) + +Wenn das Menü erscheint, klicken Sie auf die blaue Schaltfläche "Start" im Abschnitt "Generiere eine Adresse pro Gruppe". Wählen Sie im Popup einen Namen für die Brieftaschen aus. Klicken Sie dann auf die blaue Schaltfläche "Generieren". + +Jetzt haben Sie eine Adresse in jeder Gruppe. (Klicken Sie [hier](https://twitter.com/alephium/status/1681307477961482241) um mehr über Gruppen und [Sharding](https://medium.com/@alephium/an-introduction-to-blockflow-alephiums-sharding-algorithm-bbbf318c3402) in Alephium zu erfahren). + +## Anfordern von Testnet ALPH in der Erweiterungsbrieftasche + +1. Wechseln Sie von "Mainnet" zu "Testnet". + +![faucet001](https://github.com/alephium/docs/assets/88235023/2c83938e-d91a-4f64-9aa9-5ff275a77fd2) + +2. Klicken Sie auf "+Funds hinzufügen" und dann auf "12 $ALPH anfordern". + +![faucet002](https://github.com/alephium/docs/assets/88235023/85c4403d-1281-4005-b8dc-e1704b60c508) + +In etwa 1-2 Minuten sollten Sie 12 Testnetz $ALPH auf Ihrem Guthaben erhalten. + +# Anfordern von Testnet ALPH in der Desktop-Brieftasche + +1. Wechseln Sie von "Mainnet" zu "Testnet". + +![faucet01](https://github.com/alephium/docs/assets/88235023/b0c6dcc1-3e21-4dac-92fc-2f371ef9d513) + +2. Öffnen Sie "Einstellungen", wählen Sie "Entwicklertools", aktivieren Sie "Entwicklertools" und klicken Sie auf "Testnetz-Token empfangen". + +![faucet02](https://github.com/alephium/docs/assets/88235023/d8ba431b-f556-4734-afe3-faef821822c4) + +Sie erhalten in etwa 1-2 Minuten 12 Testnetz $ALPH! diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/_category_.json b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/_category_.json new file mode 100644 index 00000000..89d6c31f --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Desktop Wallet", + "position": 10 +} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/advanced-features.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/advanced-features.md new file mode 100644 index 00000000..6874ed0b --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/advanced-features.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 40 +title: Erweiterte Funktionen +sidebar_label: Erweiterte Funktionen +--- + +# Erweiterte Funktionen + +## 1. UTXO-Konsolidierung + +:::info + +Aufgrund der Natur von UTXO werden bei jeder Transaktion mehrere neue "Unspent Transaction Outputs" (UTXOs) erstellt, die jeweils verschiedene Beträge von ALPH enthalten. Wenn diese UTXOs nicht von Zeit zu Zeit konsolidiert werden, kann ein UTXO den Punkt erreichen, an dem es so genanntes "Dust (Staub)" wird. Das bedeutet, dass, wenn der Betrag in einem UTXO kleiner ist als die Kosten für GAS, um die enthaltenen ALPH zu senden, diese ALPH nicht mehr bewegt werden können. + +Um sicherzustellen, dass dies nicht passiert, ermöglicht es das Wallet, deine UTXOs mit einem Klick auf eine Schaltfläche einfach zu konsolidieren. + +::: + +Im Tab `Adressen` auf das Symbol `Erweiterte Operationen` klicken und `UTXOs konsolidieren` auswählen. + +UTXO consolidation + +UTXO consolidation + +Wähle die Adresse aus, von der aus du die UTXOs konsolidieren möchtest, und wähle die Zieladresse aus (es kann dieselbe Adresse sein). Klicke auf `Konsolidieren` und deine UTXOs werden konsolidiert. + +Landing page + +## 2. Passphrase (ERWEITERTES SICHERHEITSFEATURE) + +Eingeführt in Version 1.3.0 + +:::caution +Bitte lies die folgende Dokumentation und diesen [Artikel](https://medium.com/@alephium/bip39-passphrase-implementation-f87adecd6f59) bevor du dich entscheidest, diese Funktion zu verwenden. +::: + +### 1. Wichtige Erkenntnisse + +- Die Passphrase ist ein fortgeschrittenes Sicherheitsmerkmal, das ein zusätzliches von dir gewähltes Wort zu deiner vorhandenen Secret Recovery Phrase hinzufügt. +- Die Verwendung einer Passphrase führt dazu, dass ein vollständig neues Wallet erstellt wird, auf das nicht allein über die Secret Recovery Phrase zugegriffen werden kann. +- Das Desktop Wallet-Passwort unterscheidet sich von der Passphrase. Das Passwort wird nur auf deinem Computer verwendet, um die Secret Recovery Phrase zu verschlüsseln und zu speichern. Die Passphrase ist ein zusätzliches Wort zu dieser Secret Recovery Phrase und wird nicht im Wallet gespeichert. +- Neben der Erhöhung der Sicherheit gewährt die Passphrase dir plausible Abstreitbarkeit bei Zwangslage. +- **Wenn du dich entscheidest, eine Passphrase zu verwenden, ist es entscheidend, diese sicher an einem anderen physischen Ort als der Secret Recovery Phrase zu speichern und zu sichern. Du musst dich an deine Passphrase perfekt erinnern. Eine Änderung eines einzelnen Zeichens (selbst von Klein- zu Großbuchstaben) führt zur Generierung eines völlig neuen Wallets. ** + +Angenommen, du hast eine Wallet mit der Desktop Wallet-App erstellt, du hast eine Liste von 24 Wörtern, die als deine Secret Recovery Phrase bezeichnet werden. Diese Phrase kann verwendet werden, um deine Wallet wiederherzustellen und auf deine Mittel zuzugreifen. Wenn diese 24-Wort Secret Recovery Phrase gestohlen wird, kann der Angreifer deine Mittel stehlen. Um die Sicherheit der Benutzer unserer Desktop-Wallet zu erhöhen und den Verlust von Mitteln aufgrund des Diebstahls der 24-Wort Secret Recovery Phrase zu verhindern, haben wir die [BIP39 Passphrase](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed) Funktion implementiert. + +Die Passphrase ist ein zusätzliches optionales 25. Wort, das du selbst wählen kannst. Es kann aus beliebigen Klein-/Großbuchstaben, Zahlen und/oder Zeichen bestehen und so lang sein, wie du möchtest. + +### 2. Wie man eine Passphrase verwendet + +:::warning + +Es ist wichtig zu beachten, dass jede einzigartige Passphrase ein vollständig neues Wallet generieren und darauf zugreifen wird. Es ist entscheidend, die Passphrase sicher an einem anderen physischen Ort als der Secret Recovery Phrase zu speichern und zu sichern. **Du musst dich perfekt an deine Passphrase erinnern. Eine Änderung eines einzelnen Zeichens (selbst von Klein- zu Großbuchstaben) führt zur Generierung eines völlig neuen Wallets.** + +::: + +Um eine Passphrase zu verwenden, aktiviere einfach die Option `optionale Passphrase verwenden (Fortgeschritten)` und gib die optionale Passphrase deiner Wahl ein. + +Landing page + +### 3. Einschränkungen von Wallets mit Passphrase + +1. Du kannst (noch) keine farbigen Etiketten für deine generierten Adressen verwenden. +2. Alle zusätzlich generierten Adressen müssen nach jedem Login erneut generiert werden. + +Dies könnte sich in Zukunft ändern. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/configure-mining-wallet.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/configure-mining-wallet.md new file mode 100644 index 00000000..011e8a64 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/configure-mining-wallet.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 30 +title: Eine Mining Wallet konfigurieren +sidebar_label: Eine Mining Wallet konfigurieren +--- + +# Eine Mining Wallet konfigurieren + +Eine Mining-Wallet ist etwas anders und muss **eine Adresse pro Gruppe** haben. Derzeit verwendet Alephium 4 Gruppen, was bedeutet, dass 4 Adressen benötigt werden. Die Desktop-Wallet kann diese problemlos für dich generieren. + +Um dies zu tun, klappe einfach die `Erweiterten Einstellungen` im Begrüßungsbildschirm am Ende des Wallet-Erstellungsprozesses aus. + +Prompt to create a new wallet + +Alternativ kannst du nach dem Einloggen in deine Wallet manuell zusätzliche Adressen erstellen, indem du zum Tab `Adressen` gehst, auf das `Erweiterte Einstellungen`-Symbol klickst und `Eine Adresse pro Gruppe generieren` auswählst. + +Advanced management section diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/getting-started.md new file mode 100644 index 00000000..20d3e9e5 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/getting-started.md @@ -0,0 +1,83 @@ +--- +sidebar_position: 20 +title: Erste Schritte +sidebar_label: Erste Schritte +--- + +# Erste Schritte + +## 1. Installation + +1. Laden Sie die ausführbare Datei gemäß Ihrem Setup (macOS, Windows, Linux) von der [neuesten Veröffentlichung](https://github.com/alephium/desktop-wallet/releases/latest) herunter und doppelklicken Sie darauf, um die Anwendung zu installieren. +2. Um die Desktop-Wallet auf Linux und Windows zu starten, führe einfach einen Doppelklick auf das Anwendung-Symbol aus. Auf macOS musst du zum Anwendungsordner navigieren, mit der rechten Maustaste auf die Alephium-App klicken und dann _Open_ auswählen (doppelklicken funktioniert nicht, es sei denn, du erlaubst es in den Systemeinstellungen). + +## 2. Wallet erstellen + +:::info + +Standardmäßig ist die Wallet mit dem öffentlichen Alephium-Node verbunden. Wenn du deinen eigenen Node verwenden oder die Wallet offline erstellen möchtest, kannst du dies tun, indem du auf das Einstellungsrad oben rechts in der App klickst und den Node Host auf deinen localhost änderst oder ihn einfach leer lässt, um die Wallet offline zu erstellen. + +::: + +Desktop Wallet Landing page + +Prompt to create new wallet + +Prompt to chose a name and set a password + +1. Klicke auf `Erstelle/Importiere eine neue Wallet`, dann auf `Neue Wallet`. + +2. Wähle einen Wallet-Namen und vergib ein Passwort, um deine Wallet auf deinem Computer zu schützen. Dieses Passwort ersetzt nicht die 24-Wort Secret Recovery Phrase deiner Wallet. Es wird nur verwendet, um die neu erstellte Wallet zu sperren und zu entsperren. + Klicke auf `Continue`. + +Display of the 24 secret words + +Prompt to verify annotation of the 24 secret words was correct + +Landing page of a brand new wallet + +3. Im hervorgehobenen Feld siehst du nun 24 Wörter. Diese bilden die 24-Wort Secret Recovery Phrase deiner Wallet. Dies ist deine wichtigste Information, und du musst sie weise, sicher und sorgfältig aufbewahren. + +4. Du wirst nun aufgefordert, zu überprüfen, ob du die 24-Wort Secret Recovery Phrase richtig notiert hast. Klicke auf `Ready` und wähle die Wörter in der richtigen Reihenfolge aus. Wenn der Vorgang richtig durchgeführt wurde, werden die Wörter grün. Bei einem Fehler werden sie rot: Keine Sorge, du kannst die Wörter neu anordnen, bis du die Phrase richtig hast. + +5. Alles ist jetzt bereit! Herzlich willkommen in deiner neuen Wallet. + +## 3. ALPH versenden + +Landing page of Desktop Wallet + +Prompt to enter destination address and amount of transaction + +Prompt to enter destination address and amount of transaction + +1. Klicke einfach auf die Schaltfläche `Senden` im linken Menü. + +2. Gib die Menge an ALPH ein (z. B. 100) und die Empfängeradresse ein. + +3. (Optional) Du kannst eine Sperrzeit festlegen, indem du das entsprechende Kästchen ankreuzt. In diesem Fall wird das ALPH an die Empfängeradresse gesendet, ist jedoch bis zum von dir angegebenen Datum blockiert. Beachte, dass es nach Absenden der Transaktion nicht möglich ist, die Sperrzeit zu ändern. + +4. Klicke auf `Überprüfen` und überprüfe sorgfältig die Details deiner Transaktion. Sobald du auf `Senden` klickst, wird das ALPH an den Empfänger übertragen. + +:::info + +Die Transaktion kann sowohl im Tab `Übersicht` als auch im Tab `Adressen` eingesehen werden, wenn du auf die spezifische Adresse klickst + +::: + +## 4. Verwalten von Adressen: + +Alle vorhandenen Adressen werden in einer Liste im Tab `Adressen` angezeigt, mit Informationen wie Label, entsprechenden Guthaben, Gruppennummer usw. + +Address page + +Durch Klicken auf eine der `+ Neue Addresse`-Schaltflächen gelangst du zur Seite `Neue Adresse`, auf der du die neue Adresse erstellen und beschriften kannst. Standardmäßig werden Adressen in einer zufälligen Gruppe generiert. Du kannst manuell eine bestimmte Gruppe unter dem Abschnitt `Erweiterte Einstellungen` auswählen. + +Prompt to create a new address + +Durch Klicken auf eine bestimmte Adresse siehst du die Adressdetails einschließlich ihrer Transaktionshistorie. + +View of a singel address + +Über das Einstellungsrad oben in der Anwendung kannst du das Adresslabel bearbeiten, es als deine Standardadresse auswählen oder alle nicht gesperrten Mittel auf eine Adresse deiner Wahl übertragen. + +Prompt to configure address options diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af1.png new file mode 100644 index 00000000..bb2d8621 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af2.png new file mode 100644 index 00000000..793e2c46 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af3.png new file mode 100644 index 00000000..c88cd9e1 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af4.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af4.png new file mode 100644 index 00000000..3bd2a10c Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af4.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af5.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af5.png new file mode 100644 index 00000000..7dca96cf Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/af5.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs1.png new file mode 100644 index 00000000..1c41bcf9 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs10.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs10.png new file mode 100644 index 00000000..e6e29233 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs10.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs11.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs11.png new file mode 100644 index 00000000..391584ca Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs11.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs12.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs12.png new file mode 100644 index 00000000..bd69c409 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs12.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs13.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs13.png new file mode 100644 index 00000000..01adc960 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs13.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs2.png new file mode 100644 index 00000000..a16e8b23 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs3.png new file mode 100644 index 00000000..bab09449 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs4.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs4.png new file mode 100644 index 00000000..e99d6667 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs4.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs5.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs5.png new file mode 100644 index 00000000..d3a6e57a Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs5.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs6.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs6.png new file mode 100644 index 00000000..082c5316 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs6.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs7.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs7.png new file mode 100644 index 00000000..cd2f3448 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs7.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs8.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs8.png new file mode 100644 index 00000000..96e05985 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs8.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs9.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs9.png new file mode 100644 index 00000000..013f7ea9 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/gs9.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/mw1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/mw1.png new file mode 100644 index 00000000..f1ecf2b9 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/mw1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/mw2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/mw2.png new file mode 100644 index 00000000..6e2533a4 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/mw2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/overview1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/overview1.png new file mode 100644 index 00000000..313cdad6 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/overview1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/overview2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/overview2.png new file mode 100644 index 00000000..240263f1 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/media/overview2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/overview.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/overview.md new file mode 100644 index 00000000..361ff5bc --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/desktop-wallet/overview.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 10 +title: Übersicht +sidebar_label: Übersicht +--- + +# Übersicht + +Die Desktop-Wallet ist die benutzerfreundlichste Alephium-Wallet, die heute verfügbar ist. Sie ermöglicht es Benutzern, ihre Vermögenswerte auf der Alephium-Blockchain zu speichern und zu verwalten. + +Desktop Wallet in dark mode + +Desktop Wallet in light mode + +Auf der "Einstiegs"-Seite finden Sie die Installationsanleitung sowie einige gängige Anwendungsfälle für die Desktop-Wallet, wie das Verwalten von Konten, das Übertragen von Vermögenswerten, usw. Für weitere Informationen zu fortgeschrittenen Funktionen sollten Sie die dedizierten Seiten konsultieren. +Einige könnten die Desktop-Wallet als etwas weniger privat und sicher betrachten als die Node-Wallet, da Sie der Sicherheit der Anwendung vertrauen müssen und standardmäßig mit einem öffentlichen Knoten verbunden ist. Sie können jedoch die Wallet direkt aus unserem GitHub-Repository erstellen und einen lokalen Knoten verwenden oder sogar Ihre Wallet vollständig offline erstellen, um einige dieser Risiken zu mindern. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/_category_.json b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/_category_.json new file mode 100644 index 00000000..c8378aa0 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Extension Wallet", + "position": 20 +} diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/dapp.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/dapp.md new file mode 100644 index 00000000..77e60e05 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/dapp.md @@ -0,0 +1,117 @@ +--- +sidebar_position: 40 +title: Extension-Wallet für DApps +sidebar_label: Integration von DApps +--- + +Die Alephium Extension Wallet fügt ein globales Objekt +`window.alephiumProviders.alephium` in die dApps ein, mit +denen der Benutzer interagiert. dApps können dieses Objekt +verwenden, um den Benutzer zu authentifizieren, Benutzerkonten +anzufordern und mit der Alephium-Blockchain zu kommunizieren, +um beispielsweise das Benutzerkonto abzurufen, den Vertragsstatus +zu überprüfen und Transaktionen zu übermitteln. + +### Grundlegende Einrichtung + +Um das Objekt `window.alephiumProviders.alephium` zu erkennen, empfehlen wir die Verwendung des Pakets +[@alephium/get-extension-wallet](https://www.npmjs.com/package/@alephium/get-extension-wallet). +``` +npm install --save @alephium/get-extension-wallet +``` + +Der folgende Code zeigt, wie man sich mit dem Erweiterungswallet über reinen TypeScript verbindet: + +```ts +import { getDefaultAlephiumWallet } from "@alephium/get-extension-wallet" + +async function tryConnect() { + // Returns the `window.alephiumProviders.alephium` object after user selects + // the extension wallet. + const windowAlephium = await getDefaultAlephiumWallet() + // Authenticate user to the current dApp, return the selected account + const selectedAccount = await windowAlephium?.enable() + + if (windowAlephium && selectedAccount) { + // From here, you can execute various transactions: + // + // windowAlephium.signAndSubmitTransferTx(...) + // windowAlephium.signAndSubmitDeployContractTx(...) + // windowAlephium.signAndSubmitExecuteScriptTx(...) + // ... + } +} +``` + +Benutzer werden aufgefordert, sich mit der aktuellen dApp zu verbinden, wenn die Methode +`windowAlephium?.enable()` aufgerufen wird. + +Connect dApp + +Nachdem der Benutzer auf die Schaltfläche `Connect` geklickt hat, ist die dApp mit dem +Extension Wallet des Benutzers verbunden. + +### Web3 React + +Für mit React erstellte dApps bietet +[@alephium/web3-react](https://www.npmjs.com/package/@alephium/web3-react) +eine einfachere Möglichkeit zur Authentifizierung von dApps mit Wallets, +einschließlich der Extension Wallet. + +``` +npm install --save @alephium/web3-react +``` + +Ein minimales Beispiel sieht wie folgt aus: + +```typescript +const App = () => { + return ( + + /* Your App */ + + + ); +``` + +Dieser Code platziert eine Schaltfläche in Ihrer dApp mit dem integrierten `Retro`-Design. +Nachdem der Benutzer auf die Schaltfläche geklickt hat, wird ein Popup-Fenster angezeigt, +um den Benutzer zur Auswahl einer Wallet aufzufordern. + +Connect dApp Web3 React + +Wenn der Benutzer die `Extension Wallet` auswählt, wird er erneut aufgefordert, sich mit der +aktuellen dApp zu verbinden. Nachdem der Benutzer auf die Schaltfläche `Connect` geklickt +hat, ist die dApp mit der Extension Wallet des Benutzers verbunden. + +Bitte werfen sie einen Blick auf das +[NextJS-Template](https://github.com/alephium/nextjs-template) Repository +für ein funktionierendes und umfassenderes Beispiel. + +### Transaktionen signieren + +Das Objekt `windowAlephium` implementiert den +[InteractiveSignerProvider](https://github.com/alephium/alephium-web3/blob/master/packages/web3/src/signer/signer.ts#L80), + der die folgenden Methoden für die Signatur von Transaktionen bereitstellt: + +```ts +abstract signAndSubmitTransferTx(params: SignTransferTxParams): Promise +abstract signAndSubmitDeployContractTx(params: SignDeployContractTxParams): Promise +abstract signAndSubmitExecuteScriptTx(params: SignExecuteScriptTxParams): Promise +abstract signAndSubmitUnsignedTx(params: SignUnsignedTxParams): Promise +abstract signUnsignedTx(params: SignUnsignedTxParams): Promise +// The message will be prefixed with 'Alephium Signed Message: ' before signing +// so that the resulted signature cannot be reused for building transactions. +abstract signMessage(params: SignMessageParams): Promise +``` + +Wenn eine dieser Methoden ausgeführt wird, stellt das Erweiterungswallet die erforderlichen Informationen abhängig vom Typ der Transaktion bereit und fordert den Benutzer zur Signatur auf. + +Hier ein Beispiel für eine Transaktion zum Übertragen von Token: Der Benutzer überträgt + `2` `Token Faucet`-Token vom Konto `Gehalt` auf das Konto +`Sparen`. + +Transaction Signing Transfer + +Nachdem der Benutzer auf die Schaltfläche `Sign` (Signieren) geklickt hat, wird die Transaktion von der +Extension Wallet signiert und an die Alephium-Blockchain übermittelt. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/getting-started.md new file mode 100644 index 00000000..f0687ca9 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/getting-started.md @@ -0,0 +1,125 @@ +--- +sidebar_position: 20 +title: Erste Schritte +sidebar_label: Erste Schritte +--- + +### Installation + +Die Alephium Extension Wallet ist für beide Browser +[Chrome](https://chrome.google.com/webstore/detail/alephium-extension-wallet/gdokollfhmnbfckbobkdbakhilldkhcj) +und +[Firefox](https://addons.mozilla.org/en-US/firefox/addon/alephiumextensionwallet/) verfügbar. + +### Wallet erstellen + +Create wallet + +1. Klicken Sie auf das Alephium Extension Wallet-Symbol in Ihrem Browser. +2. Auf der Startseite klicken Sie auf die Schaltfläche `Neue Wallet`. +3. Geben Sie das Passwort ein, um Ihre Wallet zu schützen. +4. Fertig! Ihre Wallet ist erstellt. + +Ihre Wallet hat jetzt noch keine Vermögenswerte. Im nächsten Schritt übertragen wir etwas ALPH auf diese Wallet. + +### Vermögenswerte übertragen + +#### ALPH Token Faucet + +Für das `Devnet` und das `Testnet` verfügt die Extension-Wallet über einen integrierten `ALPH` Token-Faucet. +Sie können jeweils `1000` `ALPH` für das `Devnet` und `12` `ALPH` für das +`Testnet` erhalten. + +Receive Fund +     +Token Faucet +     +Token Received + +#### ALPH übertragen + +Sie können auch `ALPH` von einem anderen Konto auf Ihr Konto übertragen: + +Overview page +     +Transfer page +     +Review transfer + +Nachdem Sie die Transfertransaktion signiert haben, können Sie den Transaktionsstatus im Tab `Aktivität` überwachen. +Sobald die Transaktion bestätigt ist, wird der übertragene `ALPH`-Betrag auf dem Empfängerkonto angezeigt. + +Pending Tx +     +Confirmed Tx +     +ALPH Received + +Das war's! Sie haben erfolgreich einige `ALPH` übertragen. + +#### Token übertragen + +Der Prozess des Übertragens anderer fungibler Tokens ist im Wesentlichen der gleiche wie beim Übertragen +des `ALPH`-Tokens: + +Transfer Token 1 +     +Transfer Token 2 +     +Transfer Token 3 + +Bitte lesen Sie den Leitfaden zu [Fungiblen Tokens](/tokens/fungible-tokens) für weitere Informationen +zu fungiblen Tokens. + +### NFT-Unterstützung + +Die Alephium Extension-Wallet unterstützt auch die Anzeige und Übertragung von NFTs, wie unten gezeigt: + +Display Collections +     +Display Collection +     +Transfer NFT + +Bitte lesen Sie den Leitfaden zu [Non-fungible Tokens (NFTs)](/tokens/non-fungible-tokens) für weitere Informationen zu NFTs. + +### Konten verwalten + +Ein Konto in der Alephium Extension-Wallet repräsentiert einen digitalen Container, der aus einer öffentlichen Adresse und dem entsprechenden privaten Schlüssel besteht und es dem Benutzer ermöglicht, Vermögenswerte auf der Alephium-Blockchain zu empfangen, zu speichern und zu übertragen. + +Die Alephium Extension-Wallet ermöglicht es Benutzern, gleichzeitig mehrere Konten zu verwalten. +Zum Beispiel kann Alice ein Konto für `Gehalt`, ein Konto für `Sparen` und ein weiteres Konto für `Reise 2023` haben. + +#### Konto erstellen +Um ein zusätzliches Konto hinzuzufügen, befolgen Sie die unten stehenden Schritte: + +Overview +     +Account List +     +Add Account + +Es gibt einige Optionen, die wir vor dem Erstellen eines Kontos auswählen können: + +- `Group`: Die verfügbaren Optionen sind `0`, `1`, `2` oder `3`. Wenn `beliebig` ausgewählt wird, + wird die Gruppe, zu der das erstellte Konto gehört, zufällig sein. +- `Sign`: Die verfügbaren Optionen sind `Standard` und `Schnorr`. `Standard` + repräsentiert den Standard-Alephium-Signaturtyp, der z.B. zum Signieren von + Alephium-Transaktionen verwendet wird, während `Schnorr` den `BIP340` + Schnorr-Signaturtyp repräsentiert, welcher nützlich ist, wenn Sie mit Protokollen wie + [Nostr](https://nostr.com/) interagieren. +- `Account Type`: Die verfügbaren Optionen sind `Alephium Account` oder + `Ledger Account`. Weitere Details zur Ledger-Integration finden Sie im + [Ledger](/wallet/ledger)-Leitfaden. + +Nach Auswahl der gewünschten Optionen wird ein neues Konto erstellt und ist bereit zur Verwendung. + +#### Konto bearbeiten +Sie können auch den Namen eines vorhandenen Kontos bearbeiten, den privaten Schlüssel exportieren, +ein Konto löschen, usw. + +Account List +     +Edit Account +     +Export Private Key diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/connect-dapp-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/connect-dapp-2.png new file mode 100644 index 00000000..c647cc33 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/connect-dapp-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/connect-dapp.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/connect-dapp.png new file mode 100644 index 00000000..eb95a85a Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/connect-dapp.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/dapp-connections-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/dapp-connections-1.png new file mode 100644 index 00000000..e3d0b63f Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/dapp-connections-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/dapp-connections-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/dapp-connections-2.png new file mode 100644 index 00000000..1fd2a3fb Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/dapp-connections-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/display-nft-collection.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/display-nft-collection.png new file mode 100644 index 00000000..82976309 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/display-nft-collection.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/display-nft-collections.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/display-nft-collections.png new file mode 100644 index 00000000..3402c46f Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/display-nft-collections.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/execute-txscript.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/execute-txscript.png new file mode 100644 index 00000000..7451100b Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/execute-txscript.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/landing.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/landing.png new file mode 100644 index 00000000..8d528aaf Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/landing.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-1.png new file mode 100644 index 00000000..de82eaff Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-2.png new file mode 100644 index 00000000..5e29859e Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-3.png new file mode 100644 index 00000000..7f0379ae Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-4.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-4.png new file mode 100644 index 00000000..6c0f2daf Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-4.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-5.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-5.png new file mode 100644 index 00000000..5bf1dcce Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-5.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-6.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-6.png new file mode 100644 index 00000000..7f4cc6e8 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/manage-accounts-6.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/new-wallet-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/new-wallet-1.png new file mode 100644 index 00000000..acc5df3d Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/new-wallet-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/new-wallet-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/new-wallet-2.png new file mode 100644 index 00000000..16e5c710 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/new-wallet-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-1.png new file mode 100644 index 00000000..98a06533 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-2.png new file mode 100644 index 00000000..b8325662 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-3.png new file mode 100644 index 00000000..03b5dc4b Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/received-alph-3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-1.png new file mode 100644 index 00000000..d89f7f04 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-2.png new file mode 100644 index 00000000..faa95fb5 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-3.png new file mode 100644 index 00000000..684c5c4f Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/token-faucet-3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transaction-signing-transfer.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transaction-signing-transfer.png new file mode 100644 index 00000000..06ab2ff6 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transaction-signing-transfer.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-1.png new file mode 100644 index 00000000..64ae5e02 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-2.png new file mode 100644 index 00000000..302afe31 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-3.png new file mode 100644 index 00000000..39eea9f2 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alph-3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-1.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-1.png new file mode 100644 index 00000000..38c07740 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-1.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-2.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-2.png new file mode 100644 index 00000000..ab914da7 Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-2.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-3.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-3.png new file mode 100644 index 00000000..b8fe96ca Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-alphpaca-3.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-nft.png b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-nft.png new file mode 100644 index 00000000..becec0cc Binary files /dev/null and b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/media/transfer-nft.png differ diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/overview.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/overview.md new file mode 100644 index 00000000..2e1266d5 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/extension-wallet/overview.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 10 +title: Übersicht +sidebar_label: Übersicht +--- + +Die Alephium-Extension-Wallet unterstützt Benutzer dabei, +ihre Vermögenswerte wie das native Token `ALPH`, andere fungible Token +sowie NFTs auf der Alephium-Blockchain sicher zu speichern und zu verwalten. +Darüber hinaus ermöglicht sie DApps eine sichere Interaktion mit Wallets, +wodurch dApp-Benutzer Transaktionen direkt im Browser signieren und mit +Smart Contracts interagieren können usw. + +Execute Transction Script + +Auf der [Erste Schritte](/wallet/extension-wallet/getting-started)-Seite +finden Sie den Installationsleitfaden sowie einige gängige +Anwendungsszenarien für die Erweiterungsbrieftasche, wie z. B. das +Verwalten von Konten, das Übertragen von Token, das Anzeigen von NFTs +usw. Weitere Informationen zur Integration von DApps finden Sie auf der +[DApps Integration](/wallet/extension-wallet/dapp) - Seite. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/ledger.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/ledger.md new file mode 100644 index 00000000..212403e7 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/ledger.md @@ -0,0 +1,138 @@ +--- +sidebar_position: 50 +title: Ledger +sidebar_label: Ledger +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +![IMG_8932-2](https://github.com/alephium/alephium/assets/88235023/010e915e-0ecd-4f8f-808e-4223202eaecd) + +## Dies ist eine Anleitung zur Installation der Alephium-App auf Ihrem Ledger und zur Verwendung zum Signieren von Transaktionen + +🚨 *Wichtige Informationen: Die Alephium-App für Ledger-Geräte ist eine benutzerdefinierte/communitybasierte App, die von Alephium entwickelt wurde. Sie ist derzeit nicht in Ledger Live verfügbar. Sie erfordert, dass Sie andere Software auf Ihrem Computer herunterladen, und umfasst mehrere manuelle technische Schritte. Fahren Sie nur fort, wenn Sie sicher sind, dass Sie wissen, wie Sie diesen Vorgang durchführen!* + +🚨 *Da dies eine frühe Alpha-Version ist, ist es ratsam, einen neuen/frischen Ledger zu verwenden, auf dem keine anderen Münzen verwaltet werden.* + +🚨 *Die Ledger-App funktioniert derzeit nur mit der neuesten Version (v0.7.0) der Erweiterungsbrieftasche.* + +### Video Anleitung +Eine Anleitung im Videoformat finden Sie hier: https://www.youtube.com/watch?v=YBQy_siZh6w + +### Geschriebene Anleitung + +**1 — Laden Sie die neueste Wallet-Version von**: Chrome — [Extension Wallet](https://chrome.google.com/webstore/detail/alephium-extension-wallet/gdokollfhmnbfckbobkdbakhilldkhcj) / Firefox — [Extension Wallet](https://addons.mozilla.org/en-US/firefox/addon/alephiumextensionwallet/) + + +**2 — Installieren Sie die erforderliche Software** (wenn Sie bereits PIP & Python installiert haben, überspringen Sie Schritt 3) + +Sie benötigen Python und PIP auf Ihrem Computer, um die Alephium-App auf Ihrem Ledger zu erhalten: + +* Python ([how to for Windows](https://www.simplilearn.com/tutorials/python-tutorial/python-installation-on-windows#:~:text=To%20download%20Python%2C%20you%20need,then%20select%20the%20Windows%20option.), [how to for Mac](https://docs.python.org/3/using/mac.html), [how to for Linux](https://docs.python-guide.org/starting/install3/linux/)) +* PIP ([how to for Windows](https://www.dataquest.io/blog/install-pip-windows/), [how to for Mac](https://www.groovypost.com/howto/install-pip-on-a-mac/), [how to for Linux](https://docs.python-guide.org/starting/install3/linux/)) + + +**3 — Installieren Sie die Ledger Python-Bibliothek** + +![image](https://github.com/alephium/docs/assets/88235023/fade8c08-f3a1-41b2-b7e9-9a3cd638a683) + +Wir werden die Ledger Python-Bibliothek verwenden (Sie finden sie hier). Sie ist erforderlich, weil Sie eine benutzerdefinierte App auf Ihr Ledger-Gerät installieren. + +Um die Ledger Python-Bibliothek zu installieren, öffnen Sie einfach ein Terminalfenster und geben Sie Folgendes ein: + +**pip3 install — upgrade protobuf setuptools ecdsa** + +**pip3 install ledgerwallet** + +Dies führt alle Upgrades durch und installiert die Ledger Wallet Library, die für den nächsten Schritt benötigt wird. + +![Install Ledger App](https://github.com/alephium/docs/assets/88235023/f3f096e3-fb9b-4a8c-9a98-a060112b0f5f) + +**4 — Alephium Ledger App auf Ihren Computer herunterladen** + +Gehen Sie zum folgenden GitHub-Repository: https://github.com/alephium/ledger-alephium und laden Sie es herunter. + +🚨*Um das Repository herunterzuladen, klicken Sie auf die grüne Schaltfläche „Code“ und wählen Sie „Zip herunterladen“.* + +![image](https://github.com/alephium/docs/assets/88235023/f699b669-1b00-4b2e-9649-5cedd221e0cb) + +Laden Sie es herunter und entpacken Sie es in einen Ordner, auf den Sie einfachen Zugriff und alle Lese-/Schreibberechtigungen haben. + +**5 — Installieren Sie die Alephium-App auf Ihrem Ledger-Gerät** + +Ihr Ledger muss nun mit Ihrem Computer verbunden und entsperrt sein. + +Gehen Sie zum GitHub-Repository (https://github.com/alephium/ledger-alephium/tree/master) und scrollen Sie nach unten, um den Befehl zu finden, der auf Ihre Ledger-Version zutrifft: + +![image](https://github.com/alephium/docs/assets/88235023/6c5df18d-c59f-4ae4-ad8c-3e7bceb65014) + +Mit diesen Informationen gehen Sie zur Konsolen-Eingabeaufforderung und führen Sie den Befehl aus, um die Alephium-App zu installieren: + +🚨 *Wichtige Information: Sie müssen den Befehl im Ordner ausführen, in dem Sie die Dateien von GitHub heruntergeladen haben.* + +In diesem Beispiel wird der Ledger Nano S verwendet: + +![image](https://github.com/alephium/docs/assets/88235023/d92896ef-5f9b-43a6-8f53-ab56f38c1700) + +Nach Ausführung dieses Befehls müssen Sie die Installation der Alephium-App auf Ihrem Ledger-Gerät validieren. Durchlaufen Sie alle Genehmigungen und fügen Sie Ihre PIN hinzu, um die Installation zu validieren. + +Bei erfolgreicher Durchführung erscheint das Alephium-Symbol auf Ihrem Gerät. + +![image](https://github.com/alephium/docs/assets/88235023/7c41b2d3-ea5a-44ca-bd05-46338cf3274c) + +Nun sind Sie bereit, Ihren Ledger zum Signieren von Transaktionen auf Alephium zu verwenden! 🎉 + +**6 — Verwenden Sie Ihren Ledger mit der Extension Wallet** + +Gehen Sie zum Browser, in dem Sie die Extension Wallet installiert haben, und öffnen Sie sie. + +🚨 *Die Ledger-App funktioniert derzeit nur mit der neuesten Version (v0.7.0) der Extension Wallet. Wenn Sie diese nicht haben, können Sie diese von [hier](https://chrome.google.com/webstore/detail/alephium-extension-wallet/gdokollfhmnbfckbobkdbakhilldkhcj/related) (Chrome) oder [hier](https://addons.mozilla.org/en-US/firefox/addon/alephiumextensionwallet/) (Firefox) installieren .* + +Erstellen Sie eine neue Adresse in Ihrer Extension Wallet: Klicken Sie auf den aktuellen Adressnamen und dann auf das „+“-Symbol. Dadurch gelangen Sie zur Ledger Connection-Seite: + +* Schließen Sie Ihren Ledger an und entsperren Sie ihn. +* Öffnen Sie die Alephium-App (stellen Sie sicher, dass Sie alle Schritte validiert haben!). +* Wählen Sie Ihr Ledger-Gerät aus der Liste. +* Schließen Sie die Konfiguration ab. + +![Neue Wallet isntallieren](https://github.com/alephium/alephium/assets/88235023/5fa7e000-2f77-4b44-9dfa-13b784e05eba) + +**7 — Verwenden Sie den Ledger, um eine Transaktion zu senden!** + +Alle Schritte hier sind die üblichen, die wir bereits bei der Verwendung der Erweiterungsbrieftasche gesehen haben: + +* Klicken Sie auf die Schaltfläche „Senden“. + +![image](https://github.com/alephium/docs/assets/88235023/17eaf25a-5629-48cb-bee7-996513e9a7b4) + +* Wählen Sie den Token aus, den Sie senden möchten. + +![image](https://github.com/alephium/docs/assets/88235023/60a3ed3b-04f7-447a-9472-886147d2b5d4) + +* Wählen Sie die Empfängeradresse aus. + +![image](https://github.com/alephium/docs/assets/88235023/b6b7aae2-4c9e-4048-934e-95caa93bf577) + +* Überprüfen Sie die Transaktionsdetails und klicken Sie auf „Mit Ledger signieren“. + +![image](https://github.com/alephium/docs/assets/88235023/fde7b7c2-b864-468e-bb3f-66448fe8a4d2) + +* Signieren Sie die Transaktion auf Ihrem Ledger-Gerät und verfolgen Sie deren Abschluss im Abschnitt „Aktivität“: + +![image](https://github.com/alephium/docs/assets/88235023/efffc0de-01f8-48d7-a67c-ed1487c95483) + +** 8 — Verwenden Sie ihren Ledger, um mit dApps in Alephium zu interagieren** + +Jetzt, da Sie bereits eine Transaktion mit Ihrem Ledger signiert haben, ist es an der Zeit, es mit einer dApp zu verbinden. Dieser Prozess ist ebenfalls unkompliziert. + +Greifen Sie auf die [Alephium DEX auf dem Testnet](https://alephium.github.io/alephium-dex) zu. Klicken Sie oben rechts auf die Schaltfläche „Alephium verbinden“. Wählen Sie in der Aufforderung die Extension Wallet und das Ledger-Konto aus. + +![connect with dex](https://github.com/alephium/alephium/assets/88235023/f3e6cf9e-e632-4bc0-84a8-67f38d067311) + +Jetzt sind Sie mit der Alephium DEX verbunden. Führen Sie eine Swap-Transaktion durch und verwenden Sie Ihren Ledger, um sie zu signieren. Der Vorgang ist ähnlich wie bei einer Übertragung. + +![unnamed](https://github.com/alephium/alephium/assets/88235023/bb263f71-3801-4be3-86cd-d7a18b525e0a) + +Bei Fragen oder Anregungen kontaktieren Sie uns bitte über [Alephium’s Discord](http://alephium.org/discord), [Telegram](https://t.me/alephiumgroup), oder melden Sie sich auf [Twitter](https://twitter.com/alephium)! diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/node-wallet-guide.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/node-wallet-guide.md new file mode 100644 index 00000000..59c2af0c --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/node-wallet-guide.md @@ -0,0 +1,110 @@ +--- +sidebar_position: 40 +title: Node Wallet +sidebar_label: Node Wallet +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + +Die Wallet-API kann über unsere Swagger UI unter [http://127.0.0.1:12973/docs](http://127.0.0.1:12973/docs) oder durch Verwendung von `curl` aufgerufen werden. Stellen Sie sicher, dass Ihr Full Node ausgeführt wird, damit Sie auf die +Swagger UI zugreifen können. + +## Erstellen Sie eine neue Wallet + +Sie können eine neue Wallet erstellen, indem Sie eine POST-Anfrage mit den folgenden Daten an `/wallets` senden. + +```json +{ + "password": "123456", + "walletName": "foo" //optional (wallet-x) by default +} +``` + +Der Server muss erfolgreich antworten und Ihnen Ihre neue Wallet-Mnemonic geben. + +```json +{ + "walletName": "foo", + "mnemonic": "laptop tattoo torch range exclude fuel bike menu just churn then busy century select cactus across other merge vivid alarm asset genius mountain transfer" +} +``` + +Rufen Sie Ihre neue Wallet-Adresse mit `GET /wallets/{wallet_name}/addresses` ab. + +```json +{ + "activeAddress": "T1J2yrmQrNwuFW8z2W6xXFLtJoBCWEm7gLg9BuY8tzKjxw", + "addresses": ["T1J2yrmQrNwuFW8z2W6xXFLtJoBCWEm7gLg9BuY8tzKjxw"] +} +``` + +Wenn Sie bereits einmal eine Wallet erstellt haben, diese jedoch gelöscht wurde oder Sie Ihr Passwort vergessen haben, können Sie Ihre Wallet mit Ihrer `mnemonic` wiederherstellen, indem Sie: + +``` +PUT /wallets +{ + "password": "123456", + "mnemonic": "laptop tattoo torch range exclude fuel bike menu just churn then busy century select cactus across other merge vivid alarm asset genius mountain transfer", + "walletName": "foo" //optional +} +``` + +## Sperren/Entsperren + +Ihre Wallet wird automatisch nach einiger Zeit gesperrt. Sie müssen sie entsperren, wenn Sie sie verwenden möchten: + +``` +POST /wallets/{wallet_name}/unlock +{ + "password": "123456" +} +``` + +Sie können sie auch manuell sperren: + +``` +POST /wallets/{wallet_name}/lock +``` + +## Abfrage des Kontostands + +Sie können den aktuellen Kontostand mit `GET /wallets/{wallet_name}/balances` +überprüfen. + +```json +{ + "totalBalance": 0, + "balances": [ + { + "address": "T1J2yrmQrNwuFW8z2W6xXFLtJoBCWEm7gLg9BuY8tzKjxw", + "balance": 0 + } + ] +} +``` + +## Funds übertragen + +Sie können eine Transaktion von einer Wallet zu einer Adresse senden, indem Sie: + +``` +POST /wallets/{wallet_name}/transfer +{ + "destinations ": [{ + "address": "", + "amount ": "42 ALPH" + }] +} +``` + +Der Server muss erfolgreich mit der Transaktions-ID und den Gruppeninformationen antworten. + +```json +{ + "txId": "50318e5bfd56796690890f4a9c5aae2725629a15a71cad909bbf4a669c32c2f4", + "fromGroup": 0, + "toGroup": 3 +} +``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wallet/walletconnect.md b/i18n/de/docusaurus-plugin-content-docs/current/wallet/walletconnect.md new file mode 100644 index 00000000..dd075907 --- /dev/null +++ b/i18n/de/docusaurus-plugin-content-docs/current/wallet/walletconnect.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 40 +title: WalletConnect +sidebar_label: WalletConnect +--- + +import UntranslatedPageText from "@site/src/components/UntranslatedPageText"; + + + + +## *Kommt in kürze* \ No newline at end of file diff --git a/i18n/de/docusaurus-theme-classic/footer.json b/i18n/de/docusaurus-theme-classic/footer.json new file mode 100644 index 00000000..23545f5f --- /dev/null +++ b/i18n/de/docusaurus-theme-classic/footer.json @@ -0,0 +1,62 @@ +{ + "link.title.Community": { + "message": "Community", + "description": "The title of the footer links column with title=Community in the footer" + }, + "link.title.Resources": { + "message": "Resources", + "description": "The title of the footer links column with title=Resources in the footer" + }, + "link.title.More": { + "message": "More", + "description": "The title of the footer links column with title=More in the footer" + }, + "link.item.label.Discord": { + "message": "Discord", + "description": "The label of footer link with label=Discord linking to https://alephium.org/discord" + }, + "link.item.label.Telegram": { + "message": "Telegram", + "description": "The label of footer link with label=Telegram linking to https://t.me/alephiumgroup" + }, + "link.item.label.Reddit": { + "message": "Reddit", + "description": "The label of footer link with label=Reddit linking to https://www.reddit.com/r/alephium" + }, + "link.item.label.Twitter": { + "message": "Twitter", + "description": "The label of footer link with label=Twitter linking to https://twitter.com/alephium" + }, + "link.item.label.Explorer": { + "message": "Explorer", + "description": "The label of footer link with label=Explorer linking to https://explorer.alephium.org" + }, + "link.item.label.Get the wallet": { + "message": "Get the wallet", + "description": "The label of footer link with label=Get the wallet linking to https://github.com/alephium/desktop-wallet/releases/latest" + }, + "link.item.label.Tokenomics": { + "message": "Tokenomics", + "description": "The label of footer link with label=Tokenomics linking to https://medium.com/@alephium/tokenomics-of-alephium-61d59b51029c" + }, + "link.item.label.White papers": { + "message": "White papers", + "description": "The label of footer link with label=White papers linking to https://github.com/alephium/white-paper/" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/alephium" + }, + "link.item.label.Alephium Website": { + "message": "Alephium Website", + "description": "The label of footer link with label=Alephium Website linking to https://alephium.org" + }, + "link.item.label.Blog": { + "message": "Blog", + "description": "The label of footer link with label=Blog linking to https://medium.com/@alephium" + }, + "copyright": { + "message": "Some rights reserved 2024 Alephium. Built with Docusaurus.", + "description": "The footer copyright" + } +} diff --git a/i18n/de/docusaurus-theme-classic/navbar.json b/i18n/de/docusaurus-theme-classic/navbar.json new file mode 100644 index 00000000..ff3500af --- /dev/null +++ b/i18n/de/docusaurus-theme-classic/navbar.json @@ -0,0 +1,10 @@ +{ + "title": { + "message": "Alephium", + "description": "The title in the navbar" + }, + "item.label.GitHub": { + "message": "GitHub", + "description": "Navbar item with label GitHub" + } +}